ZGlmZiAtLWdpdCBhL0RveHlmaWxlIGIvRG94eWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkZThhOQotLS0gL2Rldi9udWxsCisrKyBiL0RveHlmaWxlCkBAIC0wLDAgKzEsMTE1NSBAQAorIyBEb3h5ZmlsZSAxLjMuOS4xCisKKyMgVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgc2V0dGluZ3MgdG8gYmUgdXNlZCBieSB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0CisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZAorIyBUaGUgZm9ybWF0IGlzOgorIyAgICAgICBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0KKyMgRm9yIGxpc3RzIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyAgICAgICBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKCIgIikKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIAorIyBieSBxdW90ZXMpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZSBwcm9qZWN0LgorCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gTGliVG9tQ3J5cHQKKworIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIAorIyBUaGlzIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yIAorIyBpZiBzb21lIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4KKworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IDEuMDUKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIAorIyBiYXNlIHBhdGggd2hlcmUgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgcHV0LiAKKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIAorIyB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZiBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCisKK09VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBkb2MvZG94eWdlbgorCisjIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgY3JlYXRlIAorIyA0MDk2IHN1Yi1kaXJlY3RvcmllcyAoaW4gMiBsZXZlbHMpIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIGVhY2ggb3V0cHV0IAorIyBmb3JtYXQgYW5kIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuIAorIyBFbmFibGluZyB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIAorIyBmaWxlcywgd2hlcmUgcHV0dGluZyBhbGwgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3b3VsZCBvdGhlcndpc2UgCisjIGNhdXNlIHBlcmZvcm1hbmNlIHByb2JsZW1zIGZvciB0aGUgZmlsZSBzeXN0ZW0uCisKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsIAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcyAKKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLiAKKyMgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgRW5nbGlzaCwgb3RoZXIgc3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6IAorIyBCcmF6aWxpYW4sIENhdGFsYW4sIENoaW5lc2UsIENoaW5lc2UtVHJhZGl0aW9uYWwsIENyb2F0aWFuLCBDemVjaCwgRGFuaXNoLCAKKyMgRHV0Y2gsIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCBHcmVlaywgSHVuZ2FyaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgCisjIEphcGFuZXNlLWVuIChKYXBhbmVzZSB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLCBLb3JlYW4sIEtvcmVhbi1lbiwgTm9yd2VnaWFuLCAKKyMgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwgU2VyYmlhbiwgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCAKKyMgU3dlZGlzaCwgYW5kIFVrcmFpbmlhbi4KKworT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBlbmNvZGluZyB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LiAKKyMgVGhlIGVuY29kaW5nIGlzIG5vdCBhbHdheXMgZGV0ZXJtaW5lZCBieSB0aGUgbGFuZ3VhZ2UgdGhhdCBpcyBjaG9zZW4sIAorIyBidXQgYWxzbyB3aGV0aGVyIG9yIG5vdCB0aGUgb3V0cHV0IGlzIG1lYW50IGZvciBXaW5kb3dzIG9yIG5vbi1XaW5kb3dzIHVzZXJzLiAKKyMgSW4gY2FzZSB0aGVyZSBpcyBhIGRpZmZlcmVuY2UsIHNldHRpbmcgdGhlIFVTRV9XSU5ET1dTX0VOQ09ESU5HIHRhZyB0byBZRVMgCisjIGZvcmNlcyB0aGUgV2luZG93cyBlbmNvZGluZyAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlIFdpbmRvd3MgYmluYXJ5KSwgCisjIHdoZXJlYXMgc2V0dGluZyB0aGUgdGFnIHRvIE5PIHVzZXMgYSBVbml4LXN0eWxlIGVuY29kaW5nICh0aGUgZGVmYXVsdCBmb3IgCisjIGFsbCBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBXaW5kb3dzKS4KKworVVNFX1dJTkRPV1NfRU5DT0RJTkcgICA9IE5PCisKKyMgSWYgdGhlIEJSSUVGX01FTUJFUl9ERVNDIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBpbmNsdWRlIGJyaWVmIG1lbWJlciBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIAorIyB0aGUgZmlsZSBhbmQgY2xhc3MgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhRG9jKS4gCisjIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisKK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKKworIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIHByZXBlbmQgCisjIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLiAKKyMgTm90ZTogaWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZSAKKyMgYnJpZWYgZGVzY3JpcHRpb25zIHdpbGwgYmUgY29tcGxldGVseSBzdXBwcmVzc2VkLgorCitSRVBFQVRfQlJJRUYgICAgICAgICAgID0gWUVTCisKKyMgVGhpcyB0YWcgaW1wbGVtZW50cyBhIHF1YXNpLWludGVsbGlnZW50IGJyaWVmIGRlc2NyaXB0aW9uIGFiYnJldmlhdG9yIAorIyB0aGF0IGlzIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZyAKKyMgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZCBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSAKKyMgc3RyaXBwZWQgZnJvbSB0aGUgdGV4dCBhbmQgdGhlIHJlc3VsdCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIAorIyBhcyB0aGUgYW5ub3RhdGVkIHRleHQuIE90aGVyd2lzZSwgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGlzIHVzZWQgYXMtaXMuIElmIGxlZnQgCisjIGJsYW5rLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoIiRuYW1lIiBpcyBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIAorIyBuYW1lIG9mIHRoZSBlbnRpdHkpOiAiVGhlICRuYW1lIGNsYXNzIiAiVGhlICRuYW1lIHdpZGdldCIgIlRoZSAkbmFtZSBmaWxlIiAKKyMgImlzIiAicHJvdmlkZXMiICJzcGVjaWZpZXMiICJjb250YWlucyIgInJlcHJlc2VudHMiICJhIiAiYW4iICJ0aGUiCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuIAorIyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZXRhaWxlZCBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBhIGJyaWVmIAorIyBkZXNjcmlwdGlvbi4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsIGluaGVyaXRlZCAKKyMgbWVtYmVycyBvZiBhIGNsYXNzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgY2xhc3MgYXMgaWYgdGhvc2UgbWVtYmVycyB3ZXJlIAorIyBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9ycyBvZiAKKyMgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKworSU5MSU5FX0lOSEVSSVRFRF9NRU1CICA9IE5PCisKKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsIAorIyBwYXRoIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldCAKKyMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIFNUUklQX0ZST01fUEFUSCB0YWcgCisjIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgdGhlIHBhdGguIFN0cmlwcGluZyBpcyAKKyMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YgCisjIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4gCisjIElmIGxlZnQgYmxhbmsgdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMgcnVuIGlzIHVzZWQgYXMgdGhlIAorIyBwYXRoIHRvIHN0cmlwLgorCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0gc3JjCisKKyMgVGhlIFNUUklQX0ZST01fSU5DX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHN0cmlwIGEgdXNlci1kZWZpbmVkIHBhcnQgb2YgCisjIHRoZSBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscyAKKyMgdGhlIHJlYWRlciB3aGljaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiAKKyMgSWYgbGVmdCBibGFuayBvbmx5IHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcyAKKyMgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZCBzcGVjaWZ5IHRoZSBpbmNsdWRlIHBhdGhzIHRoYXQgCisjIGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyIHVzaW5nIHRoZSAtSSBmbGFnLgorCitTVFJJUF9GUk9NX0lOQ19QQVRIICAgID0gc3JjL2hlYWRlcnMKKworIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgCisjIChidXQgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlzIHlvdXIgZmlsZSBzeXN0ZW1zIAorIyBkb2Vzbid0IHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisKK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gCisjIHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFEb2Mtc3R5bGUgCisjIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhRG9jIAorIyBjb21tZW50cyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgdGhlIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzIHJlcXVpcmluZyBhbiAKKyMgZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKKworIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBEb3h5Z2VuIAorIyB0cmVhdCBhIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8gCisjIGNvbW1lbnRzKSBhcyBhIGJyaWVmIGRlc2NyaXB0aW9uLiBUaGlzIHVzZWQgdG8gYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLiAKKyMgVGhlIG5ldyBkZWZhdWx0IGlzIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkIAorIyBkZXNjcmlwdGlvbi4gU2V0IHRoaXMgdGFnIHRvIFlFUyBpZiB5b3UgcHJlZmVyIHRoZSBvbGQgYmVoYXZpb3VyIGluc3RlYWQuCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBERVRBSUxTX0FUX1RPUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gCisjIHdpbGwgb3V0cHV0IHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBuZWFyIHRoZSB0b3AsIGxpa2UgSmF2YURvYy4KKyMgSWYgc2V0IHRvIE5PLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gYXBwZWFycyBhZnRlciB0aGUgbWVtYmVyIAorIyBkb2N1bWVudGF0aW9uLgorCitERVRBSUxTX0FUX1RPUCAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYW4gdW5kb2N1bWVudGVkIAorIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdCAKKyMgcmUtaW1wbGVtZW50cy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIG1lbWJlciBncm91cGluZyBpcyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUgRElTVFJJQlVURV9HUk9VUF9ET0MgCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QgCisjIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdCAKKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuIAorIyBEb3h5Z2VuIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gNAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdHMgCisjIGFzIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBBbiBhbGlhcyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiAKKyMgRm9yIGV4YW1wbGUgYWRkaW5nICJzaWRlZWZmZWN0PVxwYXIgU2lkZSBFZmZlY3RzOlxuIiB3aWxsIGFsbG93IHlvdSB0byAKKyMgcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdoaWNoIAorIyB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nICJTaWRlIEVmZmVjdHM6Ii4gCisjIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0IG5ld2xpbmVzLgorCitBTElBU0VTICAgICAgICAgICAgICAgID0gCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzIAorIyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLiAKKyMgRm9yIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCAKKyMgb2YgYWxsIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisKK09QVElNSVpFX09VVFBVVF9GT1JfQyAgPSBZRVMKKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgc291cmNlcyAKKyMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgSmF2YS4gCisjIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywgcXVhbGlmaWVkIHNjb3BlcyAKKyMgd2lsbCBsb29rIGRpZmZlcmVudCwgZXRjLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIFNVQkdST1VQSU5HIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mIAorIyB0aGUgc2FtZSB0eXBlIChmb3IgaW5zdGFuY2UgYSBncm91cCBvZiBwdWJsaWMgZnVuY3Rpb25zKSB0byBiZSBwdXQgYXMgYSAKKyMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gCisjIE5PIHRvIHByZXZlbnQgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nIAorIyB0aGUgXG5vc3ViZ3JvdXBpbmcgY29tbWFuZC4KKworU1VCR1JPVVBJTkcgICAgICAgICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluIAorIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4gCisjIFByaXZhdGUgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MgCisjIHRoZSBFWFRSQUNUX1BSSVZBVEUgYW5kIEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMKKworRVhUUkFDVF9BTEwgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzIAorIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUgCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0VYVFJBQ1RfU1RBVElDICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTIGNsYXNzZXMgKGFuZCBzdHJ1Y3RzKSAKKyMgZGVmaW5lZCBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiAKKyMgSWYgc2V0IHRvIE5PIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMKKworIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIFdoZW4gc2V0IHRvIFlFUyBsb2NhbCAKKyMgbWV0aG9kcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbiAKKyMgdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBvbmx5IG1ldGhvZHMgaW4gdGhlIGludGVyZmFjZSBhcmUgaW5jbHVkZWQuCisKK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBZRVMKKworIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwgCisjIHVuZG9jdW1lbnRlZCBtZW1iZXJzIG9mIGRvY3VtZW50ZWQgY2xhc3NlcywgZmlsZXMgb3IgbmFtZXNwYWNlcy4gCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgCisjIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGlzIGdlbmVyYXRlZC4gCisjIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKworSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsIAorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgCisjIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwgCisjIGZyaWVuZCAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIAorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgCisjIGRvY3VtZW50YXRpb24uCisKK0hJREVfRlJJRU5EX0NPTVBPVU5EUyAgPSBOTworCisjIElmIHRoZSBISURFX0lOX0JPRFlfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYW55IAorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZXNlIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSAKKyMgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgorCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8KKworIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uIAorIyB0aGF0IGlzIHR5cGVkIGFmdGVyIGEgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0IAorIyB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gdGhlIGRvY3VtZW50YXRpb24gd2lsbCBiZSBleGNsdWRlZC4gCisjIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKworSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIERveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlIAorIyBmaWxlIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUyB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28gCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIgCisjIGluIGNhc2UgYW5kIGlmIHlvdXIgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgY2FzZSBzZW5zaXRpdmUgZmlsZSBuYW1lcy4gV2luZG93cyAKKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisKK0NBU0VfU0VOU0VfTkFNRVMgICAgICAgPSBZRVMKKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuIAorIyB3aWxsIHNob3cgbWVtYmVycyB3aXRoIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlIAorIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKworSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbiAKKyMgd2lsbCBwdXQgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gCisjIG9mIHRoYXQgZmlsZS4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisjIElmIHRoZSBJTkxJTkVfSU5GTyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYSB0YWcgW2lubGluZV0gCisjIGlzIGluc2VydGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4KKworSU5MSU5FX0lORk8gICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX01FTUJFUl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBkb3h5Z2VuIAorIyB3aWxsIHNvcnQgdGhlIChkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIGFuZCBjbGFzcyBtZW1iZXJzIAorIyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIAorIyBkZWNsYXJhdGlvbiBvcmRlci4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgCisjIGJyaWVmIGRvY3VtZW50YXRpb24gb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5IAorIyBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gCisjIGRlY2xhcmF0aW9uIG9yZGVyLgorCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIAorIyBzb3J0ZWQgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWVzLCBpbmNsdWRpbmcgbmFtZXNwYWNlcy4gSWYgc2V0IHRvIAorIyBOTyAodGhlIGRlZmF1bHQpLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsIAorIyBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4gCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZSAKKyMgYWxwaGFiZXRpY2FsIGxpc3QuCisKK1NPUlRfQllfU0NPUEVfTkFNRSAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciAKKyMgZGlzYWJsZSAoTk8pIHRoZSB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8gCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgCisjIGRpc2FibGUgKE5PKSB0aGUgdGVzdCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0ZXN0IAorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgCisjIGRpc2FibGUgKE5PKSB0aGUgYnVnIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZyAKKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX0JVR0xJU1QgICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvciAKKyMgZGlzYWJsZSAoTk8pIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgCisjIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCAKKyMgZG9jdW1lbnRhdGlvbiBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiBzZWN0aW9ubmFtZSAuLi4gXGVuZGlmLgorCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0gCisKKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgCisjIHRoZSBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgZGVmaW5lIGNvbnNpc3RzIG9mIGZvciBpdCB0byBhcHBlYXIgaW4gCisjIHRoZSBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCAKKyMgaGVyZSBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LiAKKyMgVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGluaXRpYWxpemVyIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBkZWZpbmVzIGluIHRoZSAKKyMgZG9jdW1lbnRhdGlvbiBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgCisjIGNvbW1hbmQgaW4gdGhlIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCAKKyMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZSAKKyMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gd2FybmluZyBhbmQgcHJvZ3Jlc3MgbWVzc2FnZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgCisjIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlIAorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbi4gUG9zc2libGUgdmFsdWVzIGFyZSBZRVMgYW5kIE5PLiBJZiBsZWZ0IGJsYW5rIAorIyBOTyBpcyB1c2VkLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9VTkRPQ1VNRU5URUQgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgCisjIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZyB3aWxsIAorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorCitXQVJOX0lGX1VORE9DVU1FTlRFRCAgID0gWUVTCisKKyMgSWYgV0FSTl9JRl9ET0NfRVJST1IgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvciAKKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZSAKKyMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCAKKyMgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IAorIyBkb3h5Z2VuIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dCAKKyMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUgCisjIHdhcm5pbmcgb3JpZ2luYXRlZCBhbmQgdGhlIHdhcm5pbmcgdGV4dC4KKworV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCisKKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyAKKyMgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbiAKKyMgdG8gc3RkZXJyLgorCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhlIElOUFVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIAorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgIm15ZmlsZS5jcHAiIG9yIAorIyBkaXJlY3RvcmllcyBsaWtlICIvdXNyL3NyYy9teXByb2plY3QiLiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgCisjIHdpdGggc3BhY2VzLgorCitJTlBVVCAgICAgICAgICAgICAgICAgID0gc3JjCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZSAKKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwIAorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IAorIyBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6IAorIyAqLmMgKi5jYyAqLmN4eCAqLmNwcCAqLmMrKyAqLmphdmEgKi5paSAqLml4eCAqLmlwcCAqLmkrKyAqLmlubCAqLmggKi5oaCAqLmh4eCAqLmhwcCAKKyMgKi5oKysgKi5pZGwgKi5vZGwgKi5jcyAqLnBocCAqLnBocDMgKi5pbmMgKi5tICoubW0KKworRklMRV9QQVRURVJOUyAgICAgICAgICA9IAorCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcyAKKyMgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIAorIyBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuCisKK1JFQ1VSU0lWRSAgICAgICAgICAgICAgPSBZRVMKKworIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhIAorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKworRVhDTFVERSAgICAgICAgICAgICAgICA9IAorCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IgZGlyZWN0b3JpZXMgCisjIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZXN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgaW5wdXQuCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUgCisjIEVYQ0xVREVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgdG8gZXhjbHVkZSAKKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLgorCitFWENMVURFX1BBVFRFUk5TICAgICAgID0gCisKKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciAKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSAKKyMgdGhlIFxpbmNsdWRlIGNvbW1hbmQpLgorCitFWEFNUExFX1BBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBFWEFNUExFX1BBVEggdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUgCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcCAKKyMgYW5kICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCAKKyMgYmxhbmsgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZC4KKworRVhBTVBMRV9QQVRURVJOUyAgICAgICA9IAorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUgCisjIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZSAKKyMgY29tbWFuZHMgaXJyZXNwZWN0aXZlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUkVDVVJTSVZFIHRhZy4gCisjIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KKworIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciAKKyMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGltYWdlIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgCisjIHRoZSBcaW1hZ2UgY29tbWFuZCkuCisKK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkIAorIyBpbnZva2UgdG8gZmlsdGVyIGZvciBlYWNoIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCBpbnZva2UgdGhlIGZpbHRlciBwcm9ncmFtIAorIyBieSBleGVjdXRpbmcgKHZpYSBwb3BlbigpKSB0aGUgY29tbWFuZCA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxmaWx0ZXI+IAorIyBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4gCisjIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlciBwcm9ncmFtIHdyaXRlcyAKKyMgdG8gc3RhbmRhcmQgb3V0cHV0LiAgSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcgd2lsbCBiZSAKKyMgaWdub3JlZC4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9IAorCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4gCisjIGJhc2lzLiAgRG94eWdlbiB3aWxsIGNvbXBhcmUgdGhlIGZpbGUgbmFtZSB3aXRoIGVhY2ggcGF0dGVybiBhbmQgYXBwbHkgdGhlIAorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06IAorIyBwYXR0ZXJuPWZpbHRlciAobGlrZSAqLmNwcD1teV9jcHBfZmlsdGVyKS4gU2VlIElOUFVUX0ZJTFRFUiBmb3IgZnVydGhlciAKKyMgaW5mbyBvbiBob3cgZmlsdGVycyBhcmUgdXNlZC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIGVtcHR5LCBJTlBVVF9GSUxURVIgCisjIGlzIGFwcGxpZWQgdG8gYWxsIGZpbGVzLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0gCisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZyAKKyMgSU5QVVRfRklMVEVSKSB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB3aGVuIHByb2R1Y2luZyBzb3VyY2UgCisjIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgCisjIGJlIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLiAKKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSBhbHNvIAorIyBWRVJCQVRJTV9IRUFERVJTIGlzIHNldCB0byBOTy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUworCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5IAorIyBvZiBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZGlyZWN0bHkgaW4gdGhlIGRvY3VtZW50YXRpb24uCisKK0lOTElORV9TT1VSQ0VTICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgKHRoZSBkZWZhdWx0KSB3aWxsIGluc3RydWN0IAorIyBkb3h5Z2VuIHRvIGhpZGUgYW55IHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgCisjIGZyYWdtZW50cy4gTm9ybWFsIEMgYW5kIEMrKyBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IE5PCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSAKKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIAorIyBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRURfQllfUkVMQVRJT04gPSBZRVMKKworIyBJZiB0aGUgUkVGRVJFTkNFU19SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIAorIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQgZW50aXRpZXMgCisjIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBZRVMKKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbiAKKyMgd2lsbCBnZW5lcmF0ZSBhIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciAKKyMgd2hpY2ggYW4gaW5jbHVkZSBpcyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisKK1ZFUkJBVElNX0hFQURFUlMgICAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEFMUEhBQkVUSUNBTF9JTkRFWCB0YWcgaXMgc2V0IHRvIFlFUywgYW4gYWxwaGFiZXRpY2FsIGluZGV4IAorIyBvZiBhbGwgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCAKKyMgY29udGFpbnMgYSBsb3Qgb2YgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBJZiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGlzIGVuYWJsZWQgKHNlZSBBTFBIQUJFVElDQUxfSU5ERVgpIHRoZW4gCisjIHRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyAKKyMgaW4gd2hpY2ggdGhpcyBsaXN0IHdpbGwgYmUgc3BsaXQgKGNhbiBiZSBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzEuLjIwXSkKKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIAorIyBjbGFzc2VzIHdpbGwgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiAKKyMgVGhlIElHTk9SRV9QUkVGSVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgcHJlZml4ZXMgdGhhdCAKKyMgc2hvdWxkIGJlIGlnbm9yZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBIVE1MIG91dHB1dC4KKworR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUworCisjIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuIAorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIAorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGh0bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitIVE1MX09VVFBVVCAgICAgICAgICAgID0gaHRtbAorCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sLnBocCwuYXNwKS4gSWYgaXQgaXMgbGVmdCBibGFuayAKKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGZpbGVzIHdpdGggLmh0bWwgZXh0ZW5zaW9uLgorCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwKKworIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwZXJzb25hbCBIVE1MIGhlYWRlciBmb3IgCisjIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSAKKyMgc3RhbmRhcmQgaGVhZGVyLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gZG9jL2hlYWRlci5odG1sCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yIAorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgCisjIHN0YW5kYXJkIGZvb3Rlci4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9IGRvYy9mb290ZXIuaHRtbAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIAorIyBzdHlsZSBzaGVldCB0aGF0IGlzIHVzZWQgYnkgZWFjaCBIVE1MIHBhZ2UuIEl0IGNhbiBiZSB1c2VkIHRvIAorIyBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIEhUTUwgb3V0cHV0LiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiAKKyMgd2lsbCBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuIE5vdGUgdGhhdCBkb3h5Z2VuIHdpbGwgdHJ5IHRvIGNvcHkgCisjIHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnksIHNvIGRvbid0IHB1dCB5b3VyIG93biAKKyMgc3R5bGVzaGVldCBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGFzIHdlbGwsIG9yIGl0IHdpbGwgYmUgZXJhc2VkIQorCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0gCisKKyMgSWYgdGhlIEhUTUxfQUxJR05fTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgY2xhc3NlcywgCisjIGZpbGVzIG9yIG5hbWVzcGFjZXMgd2lsbCBiZSBhbGlnbmVkIGluIEhUTUwgdXNpbmcgdGFibGVzLiBJZiBzZXQgdG8gCisjIE5PIGEgYnVsbGV0IGxpc3Qgd2lsbCBiZSB1c2VkLgorCitIVE1MX0FMSUdOX01FTUJFUlMgICAgID0gWUVTCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIAorIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciB0b29scyBsaWtlIHRoZSAKKyMgTWljcm9zb2Z0IEhUTUwgaGVscCB3b3Jrc2hvcCB0byBnZW5lcmF0ZSBhIGNvbXByZXNzZWQgSFRNTCBoZWxwIGZpbGUgKC5jaG0pIAorIyBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0ZJTEUgdGFnIGNhbiAKKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyAuY2htIGZpbGUuIFlvdSAKKyMgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlIAorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCisKK0NITV9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBISENfTE9DQVRJT04gdGFnIGNhbiAKKyMgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZiAKKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biAKKyMgdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKworSEhDX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnIAorIyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgdGhhdCAKKyMgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEJJTkFSWV9UT0MgZmxhZyAKKyMgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKFlFUykgb3IgYSAKKyMgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzIChOTykgaW4gdGhlIC5jaG0gZmlsZS4KKworQklOQVJZX1RPQyAgICAgICAgICAgICA9IE5PCisKKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMgCisjIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworCisjIFRoZSBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4IGF0IAorIyB0b3Agb2YgZWFjaCBIVE1MIHBhZ2UuIFRoZSB2YWx1ZSBOTyAodGhlIGRlZmF1bHQpIGVuYWJsZXMgdGhlIGluZGV4IGFuZCAKKyMgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcyBpdC4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCisKKyMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgKHJhbmdlIFsxLi4yMF0pIAorIyB0aGF0IGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKworRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDEKKworIyBJZiB0aGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlCisjIGdlbmVyYXRlZCBjb250YWluaW5nIGEgdHJlZS1saWtlIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdCAKKyMgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIAorIyBKYXZhU2NyaXB0LCBESFRNTCwgQ1NTIGFuZCBmcmFtZXMgaXMgcmVxdWlyZWQgKGZvciBpbnN0YW5jZSBNb3ppbGxhIDEuMCssIAorIyBOZXRzY2FwZSA2LjArLCBJbnRlcm5ldCBleHBsb3JlciA1LjArLCBvciBLb25xdWVyb3IpLiBXaW5kb3dzIHVzZXJzIGFyZSAKKyMgcHJvYmFibHkgYmV0dGVyIG9mZiB1c2luZyB0aGUgSFRNTCBoZWxwIGZlYXR1cmUuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBZRVMKKworIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZSAKKyMgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlIAorIyBpcyBzaG93bi4KKworVFJFRVZJRVdfV0lEVEggICAgICAgICA9IDI1MAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBMYVRlWCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfTEFURVggdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgCisjIGdlbmVyYXRlIExhdGV4IG91dHB1dC4KKworR0VORVJBVEVfTEFURVggICAgICAgICA9IFlFUworCisjIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4gCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorCitMQVRFWF9PVVRQVVQgICAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZSAKKyMgaW52b2tlZC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBjb21tYW5kIG5hbWUuCisKK0xBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAorCisjIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0byAKKyMgZ2VuZXJhdGUgaW5kZXggZm9yIExhVGVYLiBJZiBsZWZ0IGJsYW5rIGBtYWtlaW5kZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgCisjIGRlZmF1bHQgY29tbWFuZCBuYW1lLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IAorIyBMYVRlWCBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIAorIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKworQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQgCisjIGJ5IHRoZSBwcmludGVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCwgYTR3aWRlLCBsZXR0ZXIsIGxlZ2FsIGFuZCAKKyMgZXhlY3V0aXZlLiBJZiBsZWZ0IGJsYW5rIGE0d2lkZSB3aWxsIGJlIHVzZWQuCisKK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUKKworIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIG5hbWVzIG9mIExhVGVYIAorIyBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IgCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBoZWFkZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyB1bnRpbCAKKyMgdGhlIGZpcnN0IGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgCisjIHN0YW5kYXJkIGhlYWRlci4gTm90aWNlOiBvbmx5IHVzZSB0aGlzIHRhZyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisKK0xBVEVYX0hFQURFUiAgICAgICAgICAgPSAKKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCAKKyMgaXMgcHJlcGFyZWQgZm9yIGNvbnZlcnNpb24gdG8gcGRmICh1c2luZyBwczJwZGYpLiBUaGUgcGRmIGZpbGUgd2lsbCAKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMgCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgcGRmIHZpZXdlci4KKworUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfUERGTEFURVggdGFnIGlzIHNldCB0byBZRVMsIHBkZmxhdGV4IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIAorIyBwbGFpbiBsYXRleCBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhIAorIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4KKworVVNFX1BERkxBVEVYICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxcYmF0Y2htb2RlLiAKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCAKKyMgcnVubmluZyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLiAKKyMgVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIyBJZiBMQVRFWF9ISURFX0lORElDRVMgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBub3QgCisjIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKSAKKyMgaW4gdGhlIG91dHB1dC4KKworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFJURiBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBSVEYgb3V0cHV0IAorIyBUaGUgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB2ZXJ5IHByZXR0eSB3aXRoIAorIyBvdGhlciBSVEYgcmVhZGVycyBvciBlZGl0b3JzLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4gCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgcnRmJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgorCisjIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgCisjIFJURiBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIAorIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKworQ09NUEFDVF9SVEYgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFJURl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUlRGIHRoYXQgaXMgZ2VuZXJhdGVkIAorIyB3aWxsIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwgCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiAKKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgV09SRCBvciBvdGhlciAKKyMgcHJvZ3JhbXMgd2hpY2ggc3VwcG9ydCB0aG9zZSBmaWVsZHMuIAorIyBOb3RlOiB3b3JkcGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKworUlRGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyAKKyMgY29uZmlnIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSAKKyMgcmVwbGFjZW1lbnRzLCBtaXNzaW5nIGRlZmluaXRpb25zIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZS4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuIAorIyBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzCisKK0dFTkVSQVRFX01BTiAgICAgICAgICAgPSBOTworCisjIFRoZSBNQU5fT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIG1hbiBwYWdlcyB3aWxsIGJlIHB1dC4gCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgbWFuJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgorCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0byAKKyMgdGhlIGdlbmVyYXRlZCBtYW4gcGFnZXMgKGRlZmF1bHQgaXMgdGhlIHN1YnJvdXRpbmUncyBzZWN0aW9uIC4zKQorCitNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCAKKyMgdGhlbiBpdCB3aWxsIGdlbmVyYXRlIG9uZSBhZGRpdGlvbmFsIG1hbiBmaWxlIGZvciBlYWNoIGVudGl0eSAKKyMgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbCBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcyAKKyMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kIAorIyB3b3VsZCBiZSB1bmFibGUgdG8gZmluZCB0aGUgY29ycmVjdCBwYWdlLiBUaGUgZGVmYXVsdCBpcyBOTy4KKworTUFOX0xJTktTICAgICAgICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCAKKyMgZ2VuZXJhdGUgYW4gWE1MIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIAorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgeG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBzY2hlbWEsIAorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUgCisjIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgorCitYTUxfU0NIRU1BICAgICAgICAgICAgID0gCisKKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIERURCwgCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZSAKKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisKK1hNTF9EVEQgICAgICAgICAgICAgICAgPSAKKworIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbCAKKyMgZHVtcCB0aGUgcHJvZ3JhbSBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcgCisjIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8gdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdCAKKyMgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFhNTCBvdXRwdXQuCisKK1hNTF9QUk9HUkFNTElTVElORyAgICAgPSBZRVMKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBBdXRvR2VuIERlZmluaXRpb25zIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9BVVRPR0VOX0RFRiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgCisjIGdlbmVyYXRlIGFuIEF1dG9HZW4gRGVmaW5pdGlvbnMgKHNlZSBhdXRvZ2VuLnNmLm5ldCkgZmlsZSAKKyMgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIAorIyBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhIFBlcmwgbW9kdWxlIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIAorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIAorIyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgCisjIG1vbWVudC4KKworR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIAorIyB0aGUgbmVjZXNzYXJ5IE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZSAKKyMgdG8gZ2VuZXJhdGUgUERGIGFuZCBEVkkgb3V0cHV0IGZyb20gdGhlIFBlcmwgbW9kdWxlIG91dHB1dC4KKworUEVSTE1PRF9MQVRFWCAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSAKKyMgbmljZWx5IGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiAgVGhpcyBpcyB1c2VmdWwgCisjIGlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIAorIyB0YWcgaXMgc2V0IHRvIE5PIHRoZSBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXIgCisjIGFuZCBQZXJsIHdpbGwgcGFyc2UgaXQganVzdCB0aGUgc2FtZS4KKworUEVSTE1PRF9QUkVUVFkgICAgICAgICA9IFlFUworCisjIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlIAorIyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLiAKKyMgVGhpcyBpcyB1c2VmdWwgc28gZGlmZmVyZW50IGRveHlydWxlcy5tYWtlIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSBzYW1lIAorIyBNYWtlZmlsZSBkb24ndCBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4KKworUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBwcmVwcm9jZXNzb3IgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgCisjIGV2YWx1YXRlIGFsbCBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIAorIyBmaWxlcy4KKworRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gCisjIG5hbWVzIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBjb25kaXRpb25hbCAKKyMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQgCisjIHdheSBieSBzZXR0aW5nIEVYUEFORF9PTkxZX1BSRURFRiB0byBZRVMuCisKK01BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgCisjIHRoZW4gdGhlIG1hY3JvIGV4cGFuc2lvbiBpcyBsaW1pdGVkIHRvIHRoZSBtYWNyb3Mgc3BlY2lmaWVkIHdpdGggdGhlIAorIyBQUkVERUZJTkVEIGFuZCBFWFBBTkRfQVNfUFJFREVGSU5FRCB0YWdzLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gTk8KKworIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlIGluY2x1ZGVzIGZpbGVzIAorIyBpbiB0aGUgSU5DTFVERV9QQVRIIChzZWUgYmVsb3cpIHdpbGwgYmUgc2VhcmNoIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisKK1NFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKKworIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQgCisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgCisjIHRoZSBwcmVwcm9jZXNzb3IuCisKK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPSBzcmMvaGVhZGVycworCisjIFlvdSBjYW4gdXNlIHRoZSBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUgCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIAorIyBiZSB1c2VkLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCAKKyMgYXJlIGRlZmluZWQgYmVmb3JlIHRoZSBwcmVwcm9jZXNzb3IgaXMgc3RhcnRlZCAoc2ltaWxhciB0byB0aGUgLUQgb3B0aW9uIG9mIAorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIAorIyBvciBuYW1lPWRlZmluaXRpb24gKG5vIHNwYWNlcykuIElmIHRoZSBkZWZpbml0aW9uIGFuZCB0aGUgPSBhcmUgCisjIG9taXR0ZWQgPTEgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyAKKyMgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvciAKKyMgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKworUFJFREVGSU5FRCAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gYW5kIEVYUEFORF9PTkxZX1BSRURFRiB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gCisjIHRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLiAKKyMgVGhlIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIAorIyBVc2UgdGhlIFBSRURFRklORUQgdGFnIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBtYWNybyBkZWZpbml0aW9uLgorCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0gCisKKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiAKKyMgZG94eWdlbidzIHByZXByb2Nlc3NvciB3aWxsIHJlbW92ZSBhbGwgZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgCisjIG9uIGEgbGluZSwgaGF2ZSBhbiBhbGwgdXBwZXJjYXNlIG5hbWUsIGFuZCBkbyBub3QgZW5kIHdpdGggYSBzZW1pY29sb24uIFN1Y2ggCisjIGZ1bmN0aW9uIG1hY3JvcyBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIGJvaWxlci1wbGF0ZSBjb2RlLCBhbmQgd2lsbCBjb25mdXNlIHRoZSAKKyMgcGFyc2VyIGlmIG5vdCByZW1vdmVkLgorCitTS0lQX0ZVTkNUSU9OX01BQ1JPUyAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcyAgIAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBUQUdGSUxFUyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWdmaWxlcy4gCisjIE9wdGlvbmFsbHkgYW4gaW5pdGlhbCBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiAKKyMgY2FuIGJlIGFkZGVkIGZvciBlYWNoIHRhZ2ZpbGUuIFRoZSBmb3JtYXQgb2YgYSB0YWcgZmlsZSB3aXRob3V0IAorIyB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6IAorIyAgIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uIAorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOiAKKyMgICBUQUdGSUxFUyA9IGZpbGUxPWxvYzEgImZpbGUyID0gbG9jMiIgLi4uIAorIyB3aGVyZSAibG9jMSIgYW5kICJsb2MyIiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgCisjIFVSTHMuIElmIGEgbG9jYXRpb24gaXMgcHJlc2VudCBmb3IgZWFjaCB0YWcsIHRoZSBpbnN0YWxsZG94IHRvb2wgCisjIGRvZXMgbm90IGhhdmUgdG8gYmUgcnVuIHRvIGNvcnJlY3QgdGhlIGxpbmtzLgorIyBOb3RlIHRoYXQgZWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZQorIyAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcGF0aCkKKyMgSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGRveHlnZW4gCisjIGlzIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIAorIyBhIHRhZyBmaWxlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGlucHV0IGZpbGVzIGl0IHJlYWRzLgorCitHRU5FUkFURV9UQUdGSUxFICAgICAgID0gCisKKyMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZCAKKyMgaW4gdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8gb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgCisjIHdpbGwgYmUgbGlzdGVkLgorCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQgCisjIGluIHRoZSBtb2R1bGVzIGluZGV4LiBJZiBzZXQgdG8gTk8sIG9ubHkgdGhlIGN1cnJlbnQgcHJvamVjdCdzIGdyb3VwcyB3aWxsIAorIyBiZSBsaXN0ZWQuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBUaGUgUEVSTF9QQVRIIHNob3VsZCBiZSB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgcGVybCBzY3JpcHQgCisjIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgYHdoaWNoIHBlcmwnKS4KKworUEVSTF9QQVRIICAgICAgICAgICAgICA9IC91c3IvYmluL3BlcmwKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgZG90IHRvb2wgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwgCisjIGdlbmVyYXRlIGEgaW5oZXJpdGFuY2UgZGlhZ3JhbSAoaW4gSFRNTCwgUlRGIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIAorIyBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8gTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0IHRoaXMgCisjIG9wdGlvbiBpcyBzdXBlcnNlZGVkIGJ5IHRoZSBIQVZFX0RPVCBvcHRpb24gYmVsb3cuIFRoaXMgaXMgb25seSBhIGZhbGxiYWNrLiBJdCBpcyAKKyMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUgcG93ZXJmdWwgZ3JhcGhzLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUgCisjIGluaGVyaXRhbmNlIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgCisjIG9yIGlzIG5vdCBhIGNsYXNzLgorCitISURFX1VORE9DX1JFTEFUSU9OUyAgID0gWUVTCisKKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzIAorIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbiAKKyMgdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudCBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiAKKyMgaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKKworSEFWRV9ET1QgICAgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDTEFTU19HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgCisjIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4gU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUgCisjIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGNsYXNzIHNob3dpbmcgdGhlIGRpcmVjdCBhbmQgCisjIGluZGlyZWN0IGltcGxlbWVudGF0aW9uIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQgCisjIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCisKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKKworIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZCAKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcgCisjIExhbmd1YWdlLgorCitVTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8KKworIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUgCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIgaW5zdGFuY2VzLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERV9HUkFQSCwgYW5kIEhBVkVfRE9UIAorIyB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCAKKyMgZmlsZSBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluY2x1ZGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIHdpdGggCisjIG90aGVyIGRvY3VtZW50ZWQgZmlsZXMuCisKK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERURfQllfR1JBUEgsIGFuZCAKKyMgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIAorIyBkb2N1bWVudGVkIGhlYWRlciBmaWxlIHNob3dpbmcgdGhlIGRvY3VtZW50ZWQgZmlsZXMgdGhhdCBkaXJlY3RseSBvciAKKyMgaW5kaXJlY3RseSBpbmNsdWRlIHRoaXMgZmlsZS4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhIGNhbGwgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4gCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uIAorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocyBmb3Igc2VsZWN0ZWQgCisjIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGdyYXBoIGNvbW1hbmQuCisKK0NBTExfR1JBUEggICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gCisjIHdpbGwgZ3JhcGhpY2FsIGhpZXJhcmNoeSBvZiBhbGwgY2xhc3NlcyBpbnN0ZWFkIG9mIGEgdGV4dHVhbCBvbmUuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcyAKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gUG9zc2libGUgdmFsdWVzIGFyZSBwbmcsIGpwZywgb3IgZ2lmCisjIElmIGxlZnQgYmxhbmsgcG5nIHdpbGwgYmUgdXNlZC4KKworRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZworCisjIFRoZSB0YWcgRE9UX1BBVEggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlIAorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIG9uIHRoZSBwYXRoLgorCitET1RfUEFUSCAgICAgICAgICAgICAgID0gCisKKyMgVGhlIERPVEZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0IAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSAKKyMgXGRvdGZpbGUgY29tbWFuZCkuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgTUFYX0RPVF9HUkFQSF9XSURUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgd2lkdGggCisjIChpbiBwaXhlbHMpIG9mIHRoZSBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gSWYgYSBncmFwaCBiZWNvbWVzIGxhcmdlciB0aGFuIAorIyB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHRydW5jYXRlIHRoZSBncmFwaCwgc28gdGhhdCBpdCBmaXRzIHdpdGhpbiAKKyMgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50LiBCZXdhcmUgdGhhdCBtb3N0IGJyb3dzZXJzIGNhbm5vdCBjb3BlIHdpdGggdmVyeSAKKyMgbGFyZ2UgaW1hZ2VzLgorCitNQVhfRE9UX0dSQVBIX1dJRFRIICAgID0gMTAyNAorCisjIFRoZSBNQVhfRE9UX0dSQVBIX0hFSUdIVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGFsbG93cyBoZWlnaHQgCisjIChpbiBwaXhlbHMpIG9mIHRoZSBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gSWYgYSBncmFwaCBiZWNvbWVzIGxhcmdlciB0aGFuIAorIyB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHRydW5jYXRlIHRoZSBncmFwaCwgc28gdGhhdCBpdCBmaXRzIHdpdGhpbiAKKyMgdGhlIHNwZWNpZmllZCBjb25zdHJhaW50LiBCZXdhcmUgdGhhdCBtb3N0IGJyb3dzZXJzIGNhbm5vdCBjb3BlIHdpdGggdmVyeSAKKyMgbGFyZ2UgaW1hZ2VzLgorCitNQVhfRE9UX0dSQVBIX0hFSUdIVCAgID0gMTAyNAorCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIAorIyBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUgCisjIGZyb20gdGhlIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzIHRoYXQgCisjIGxheSBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIAorIyAxIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UgY29kZSBiYXNlcy4gQWxzbyAKKyMgbm90ZSB0aGF0IGEgZ3JhcGggbWF5IGJlIGZ1cnRoZXIgdHJ1bmNhdGVkIGlmIHRoZSBncmFwaCdzIGltYWdlIGRpbWVuc2lvbnMgYXJlIAorIyBub3Qgc3VmZmljaWVudCB0byBmaXQgdGhlIGdyYXBoIChzZWUgTUFYX0RPVF9HUkFQSF9XSURUSCBhbmQgTUFYX0RPVF9HUkFQSF9IRUlHSFQpLiAKKyMgSWYgMCBpcyB1c2VkIGZvciB0aGUgZGVwdGggdmFsdWUgKHRoZSBkZWZhdWx0KSwgdGhlIGdyYXBoIGlzIG5vdCBkZXB0aC1jb25zdHJhaW5lZC4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIAorIyBhcnJvd3MgaW4gdGhlIGRvdCBnZW5lcmF0ZWQgZ3JhcGhzLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIAorIyByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSAKKyMgdGhlIHZhcmlvdXMgZ3JhcGhzLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbjo6YWRkaXRpb25zIHJlbGF0ZWQgdG8gdGhlIHNlYXJjaCBlbmdpbmUgICAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgU0VBUkNIRU5HSU5FIHRhZyBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgYSBzZWFyY2ggZW5naW5lIHNob3VsZCBiZSAKKyMgdXNlZC4gSWYgc2V0IHRvIE5PIHRoZSB2YWx1ZXMgb2YgYWxsIHRhZ3MgYmVsb3cgdGhpcyBvbmUgd2lsbCBiZSBpZ25vcmVkLgorCitTRUFSQ0hFTkdJTkUgICAgICAgICAgID0gTk8KZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCmluZGV4IDJlODNjZGEuLjVkNjc4YzUgMTAwNjQ0Ci0tLSBhL0xJQ0VOU0UKKysrIGIvTElDRU5TRQpAQCAtMSw5ICsxLDUgQEAKIExpYlRvbUNyeXB0IGlzIHB1YmxpYyBkb21haW4uICBBcyBzaG91bGQgYWxsIHF1YWxpdHkgc29mdHdhcmUgYmUuCiAKLUFsbCBvZiB0aGUgc29mdHdhcmUgd2FzIGVpdGhlciB3cml0dGVuIGJ5IG9yIGRvbmF0ZWQgdG8gVG9tIFN0IERlbmlzIGZvciB0aGUgcHVycG9zZXMKLW9mIHRoaXMgcHJvamVjdC4gIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyB0aGUgU0FGRVIuQyBzb3VyY2Ugd2hpY2ggaGFzIG5vIGtub3duCi1saWNlbnNlIHN0YXR1cyAoYXNzdW1lZCBjb3B5cmlnaHRlZCkgd2hpY2ggaXMgd2h5IFNBRkVSLEMgaXMgc2hpcHBlZCBhcyBkaXNhYmxlZC4KLQogVG9tIFN0IERlbmlzCiAKIApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4gYi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTlhYmJiCi0tLSAvZGV2L251bGwKKysrIGIvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSwyNTkgQEAKKyMgTUFLRUZJTEUgZm9yIGxpbnV4IEdDQworIworIyBUb20gU3QgRGVuaXMKKyMgTW9kaWZpZWQgYnkgQ2xheSBDdWx2ZXIKKworIyBUaGUgdmVyc2lvbgorVkVSU0lPTj0xLjAyCisKK1ZQQVRIPUBzcmNkaXJACitzcmNkaXI9QHNyY2RpckAKKworIyBDb21waWxlciBhbmQgTGlua2VyIE5hbWVzCisjQ0M9Z2NjCisjTEQ9bGQKKworIyBBcmNoaXZlciBbbWFrZXMgLmEgZmlsZXNdCisjQVI9YXIKKyNBUkZMQUdTPXIKKworIyBDb21waWxhdGlvbiBmbGFncy4gTm90ZSB0aGUgKz0gZG9lcyBub3Qgd3JpdGUgb3ZlciB0aGUgdXNlcidzIENGTEFHUyEKKyMgVGhlIHJlc3Qgb2YgdGhlIGZsYWdzIGNvbWUgZnJvbSB0aGUgcGFyZW50IERyb3BiZWFyIG1ha2VmaWxlCitDRkxBR1MgKz0gLWMgLUkkKHNyY2Rpcikvc3JjL2hlYWRlcnMvIC1JJChzcmNkaXIpLy4uLworCisjIGFkZGl0aW9uYWwgd2FybmluZ3MgKG5ld2VyIEdDQyAzLjQgYW5kIGhpZ2hlcikKKyNDRkxBR1MgKz0gLVdzeXN0ZW0taGVhZGVycyAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV2JhZC1mdW5jdGlvbi1jYXN0IC1XY2FzdC1hbGlnbiAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzIFwKKyMJCSAgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV3BvaW50ZXItYXJpdGggCisKKyMgb3B0aW1pemUgZm9yIFNQRUVECisjQ0ZMQUdTICs9IC1PMyAtZnVucm9sbC1sb29wcworCisjIGFkZCAtZm9taXQtZnJhbWUtcG9pbnRlci4gIGhpbmRlcnMgZGVidWdnaW5nIQorQ0ZMQUdTICs9IC1mb21pdC1mcmFtZS1wb2ludGVyCisKKyMgb3B0aW1pemUgZm9yIFNJWkUKKyNDRkxBR1MgKz0gLU9zIC1ETFRDX1NNQUxMX0NPREUKKworIyBvbGRlciBHQ0NzIGNhbid0IGhhbmRsZSB0aGUgInJvdGF0ZSB3aXRoIGltbWVkaWF0ZSIgUk9MYy9ST1JjL2V0YyBtYWNyb3MKKyMgZGVmaW5lIHRoaXMgdG8gaGVscAorI0NGTEFHUyArPSAtRExUQ19OT19ST0xDCisKKyMgY29tcGlsZSBmb3IgREVCVUdJTkcgKHJlcXVpcmVkIGZvciBjY21hbGxvYyBjaGVja2luZyEhISkKKyNDRkxBR1MgKz0gLWczIC1ETFRDX05PX0FTTQorCisjT3V0cHV0IGZpbGVuYW1lcyBmb3IgdmFyaW91cyB0YXJnZXRzLgorTElCTkFNRT1saWJ0b21jcnlwdC5hCitMSUJURVNUPXRlc3Rwcm9mL2xpYnRvbWNyeXB0X3Byb2YuYQorSEFTSD1oYXNoc3VtCitDUllQVD1lbmNyeXB0CitTTUFMTD1zbWFsbAorUFJPRj14ODZfcHJvZgorVFY9dHZfZ2VuCitNVUxUST1tdWx0aQorVElNSU5HPXRpbWluZworVEVTVD10ZXN0CisKKyNMSUJQQVRILVRoZSBkaXJlY3RvcnkgZm9yIGxpYnRvbWNyeXB0IHRvIGJlIGluc3RhbGxlZCB0by4KKyNJTkNQQVRILVRoZSBkaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgaGVhZGVyIGZpbGVzIGZvciBsaWJ0b21jcnlwdC4KKyNEQVRBUEFUSC1UaGUgZGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIHBkZiBkb2NzLgorREVTVERJUj0KK0xJQlBBVEg9L3Vzci9saWIKK0lOQ1BBVEg9L3Vzci9pbmNsdWRlCitEQVRBUEFUSD0vdXNyL3NoYXJlL2RvYy9saWJ0b21jcnlwdC9wZGYKKworI1dobyBkbyB3ZSBpbnN0YWxsIGFzPworVVNFUj1yb290CitHUk9VUD13aGVlbAorCisjTGlzdCBvZiBvYmplY3RzIHRvIGNvbXBpbGUuCisKKyNMZWF2ZSBNUEkgYnVpbHQtaW4gb3IgZm9yY2UgZGV2ZWxvcGVyIHRvIGxpbmsgYWdhaW5zdCBsaWJ0b21tYXRoPworI01QSU9CSkVDVD1zcmMvbWlzYy9tcGkvbXBpLm8KKyNEcm9wYmVhciB1c2VzIGxpYnRvbW1hdGgKK01QSU9CSkVDVD0KKworT0JKRUNUUz1zcmMvY2lwaGVycy9hZXMvYWVzX2VuYy5vICQoTVBJT0JKRUNUKSBzcmMvY2lwaGVycy9hZXMvYWVzLm8gXAorc3JjL2NpcGhlcnMvYmxvd2Zpc2gubyBzcmMvY2lwaGVycy9kZXMubyBcCitzcmMvY2lwaGVycy90d29maXNoL3R3b2Zpc2gubyBcCitzcmMvaGFzaGVzL2hlbHBlci9oYXNoX21lbW9yeS5vIHNyYy9oYXNoZXMvaGVscGVyL2hhc2hfbWVtb3J5X211bHRpLm8gXAorc3JjL2hhc2hlcy9tZDUubyBzcmMvaGFzaGVzL3NoYTEubyBzcmMvaGFzaGVzL3NoYTIvc2hhMjU2Lm8gXAorc3JjL2hhc2hlcy9zaGEyL3NoYTUxMi5vIHNyYy9oYXNoZXMvd2hpcmwvd2hpcmwubyBzcmMvbWFjL2htYWMvaG1hY19kb25lLm8gXAorc3JjL21hYy9obWFjL2htYWNfZmlsZS5vIHNyYy9tYWMvaG1hYy9obWFjX2luaXQubyBzcmMvbWFjL2htYWMvaG1hY19tZW1vcnkubyBcCitzcmMvbWFjL2htYWMvaG1hY19tZW1vcnlfbXVsdGkubyBzcmMvbWFjL2htYWMvaG1hY19wcm9jZXNzLm8gc3JjL21hYy9obWFjL2htYWNfdGVzdC5vIFwKK3NyYy9taXNjL2Jhc2U2NC9iYXNlNjRfZGVjb2RlLm8gXAorc3JjL21pc2MvYmFzZTY0L2Jhc2U2NF9lbmNvZGUubyBzcmMvbWlzYy9idXJuX3N0YWNrLm8gc3JjL21pc2MvY3J5cHQvY3J5cHQubyBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF9hcmdjaGsubyBzcmMvbWlzYy9jcnlwdC9jcnlwdF9jaXBoZXJfZGVzY3JpcHRvci5vIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X2NpcGhlcl9pc192YWxpZC5vIHNyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfY2lwaGVyLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXJfYW55Lm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXJfaWQubyBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2hhc2gubyBzcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2hhc2hfYW55Lm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9oYXNoX2lkLm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9wcm5nLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfaGFzaF9kZXNjcmlwdG9yLm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfaGFzaF9pc192YWxpZC5vIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X3BybmdfZGVzY3JpcHRvci5vIHNyYy9taXNjL2NyeXB0L2NyeXB0X3BybmdfaXNfdmFsaWQubyBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF9yZWdpc3Rlcl9jaXBoZXIubyBzcmMvbWlzYy9jcnlwdC9jcnlwdF9yZWdpc3Rlcl9oYXNoLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfcmVnaXN0ZXJfcHJuZy5vIHNyYy9taXNjL2NyeXB0L2NyeXB0X3VucmVnaXN0ZXJfY2lwaGVyLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfdW5yZWdpc3Rlcl9oYXNoLm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfdW5yZWdpc3Rlcl9wcm5nLm8gXAorc3JjL21pc2MvZXJyb3JfdG9fc3RyaW5nLm8gc3JjL21pc2MvbXBpL2lzX3ByaW1lLm8gc3JjL21pc2MvbXBpL21waV90b19sdGNfZXJyb3IubyBcCitzcmMvbWlzYy9tcGkvcmFuZF9wcmltZS5vIHNyYy9taXNjL3plcm9tZW0ubyBcCitzcmMvbW9kZXMvY2JjL2NiY19kZWNyeXB0Lm8gc3JjL21vZGVzL2NiYy9jYmNfZG9uZS5vIHNyYy9tb2Rlcy9jYmMvY2JjX2VuY3J5cHQubyBcCitzcmMvbW9kZXMvY2JjL2NiY19nZXRpdi5vIHNyYy9tb2Rlcy9jYmMvY2JjX3NldGl2Lm8gc3JjL21vZGVzL2NiYy9jYmNfc3RhcnQubyBcCitzcmMvbW9kZXMvY3RyL2N0cl9kZWNyeXB0Lm8gc3JjL21vZGVzL2N0ci9jdHJfZG9uZS5vIHNyYy9tb2Rlcy9jdHIvY3RyX2VuY3J5cHQubyBcCitzcmMvbW9kZXMvY3RyL2N0cl9nZXRpdi5vIHNyYy9tb2Rlcy9jdHIvY3RyX3NldGl2Lm8gc3JjL21vZGVzL2N0ci9jdHJfc3RhcnQubyBcCitzcmMvbW9kZXMvZWNiL2VjYl9kZWNyeXB0Lm8gc3JjL21vZGVzL2VjYi9lY2JfZG9uZS5vIHNyYy9tb2Rlcy9lY2IvZWNiX2VuY3J5cHQubyBcCitzcmMvbW9kZXMvb2ZiL29mYl9zdGFydC5vIHNyYy9way9hc24xL2Rlci9kZXJfZGVjb2RlX2ludGVnZXIubyBcCitzcmMvcHJuZ3Mvcm5nX2dldF9ieXRlcy5vIFwKK3NyYy9wcm5ncy9ybmdfbWFrZV9wcm5nLm8gc3JjL3BybmdzL3NvYmVyMTI4Lm8gc3JjL3BybmdzL3Nwcm5nLm8gc3JjL3BybmdzL3lhcnJvdy5vIAorCitIRUFERVJTPXNyYy9oZWFkZXJzL3RvbW1hdGhfc3VwZXJjbGFzcy5oIHNyYy9oZWFkZXJzL3RvbWNyeXB0X2NmZy5oIFwKK3NyYy9oZWFkZXJzL3RvbWNyeXB0X21hYy5oIHNyYy9oZWFkZXJzL3RvbWNyeXB0X21hY3Jvcy5oIFwKK3NyYy9oZWFkZXJzL3RvbWNyeXB0X2N1c3RvbS5oIHNyYy9oZWFkZXJzL3RvbWNyeXB0X2FyZ2Noay5oIFwKK3NyYy9oZWFkZXJzL3RvbWNyeXB0X2NpcGhlci5oIHNyYy9oZWFkZXJzL3RvbWNyeXB0X3BrLmggXAorc3JjL2hlYWRlcnMvdG9tbWF0aF9jbGFzcy5oIHNyYy9oZWFkZXJzL2x0Y190b21tYXRoLmggc3JjL2hlYWRlcnMvdG9tY3J5cHRfaGFzaC5oIFwKK3NyYy9oZWFkZXJzL3RvbWNyeXB0X21pc2MuaCBzcmMvaGVhZGVycy90b21jcnlwdC5oIHNyYy9oZWFkZXJzL3RvbWNyeXB0X3BrY3MuaCBcCitzcmMvaGVhZGVycy90b21jcnlwdF9wcm5nLmggdGVzdHByb2YvdG9tY3J5cHRfdGVzdC5oCisKK1RFU1RPQkpFQ1RTPWRlbW9zL3Rlc3QubworSEFTSE9CSkVDVFM9ZGVtb3MvaGFzaHN1bS5vCitDUllQVE9CSkVDVFM9ZGVtb3MvZW5jcnlwdC5vCitTTUFMTE9CSkVDVFM9ZGVtb3Mvc21hbGwubworVFZTPWRlbW9zL3R2X2dlbi5vCitNVUxUSVM9ZGVtb3MvbXVsdGkubworVElNSU5HUz1kZW1vcy90aW1pbmcubworVEVTVFM9ZGVtb3MvdGVzdC5vCisKKyNGaWxlcyBsZWZ0IG92ZXIgZnJvbSBtYWtpbmcgdGhlIGNyeXB0LnBkZi4KK0xFRlRPVkVSUz0qLmR2aSAqLmxvZyAqLmF1eCAqLnRvYyAqLmlkeCAqLmlsZyAqLmluZCAqLm91dAorCisjQ29tcHJlc3NlZCBmaWxlbmFtZXMKK0NPTVBSRVNTRUQ9Y3J5cHQtJChWRVJTSU9OKS50YXIuYnoyIGNyeXB0LSQoVkVSU0lPTikuemlwCisKKyNUaGUgZGVmYXVsdCBydWxlIGZvciBtYWtlIGJ1aWxkcyB0aGUgbGlidG9tY3J5cHQgbGlicmFyeS4KK2RlZmF1bHQ6bGlicmFyeQorCisjY2lwaGVycyBjb21lIGluIHR3byBmbGF2b3Vycy4uLiBlbmMrZGVjIGFuZCBlbmMgCitzcmMvY2lwaGVycy9hZXMvYWVzX2VuYy5vOiBzcmMvY2lwaGVycy9hZXMvYWVzLmMgc3JjL2NpcGhlcnMvYWVzL2Flc190YWIuYworCSQoQ0MpICQoQ0ZMQUdTKSAtREVOQ1JZUFRfT05MWSAtYyBzcmMvY2lwaGVycy9hZXMvYWVzLmMgLW8gc3JjL2NpcGhlcnMvYWVzL2Flc19lbmMubworCisjVGhlc2UgYXJlIHRoZSBydWxlcyB0byBtYWtlIGNlcnRhaW4gb2JqZWN0IGZpbGVzLgorc3JjL2NpcGhlcnMvYWVzL2Flcy5vOiBzcmMvY2lwaGVycy9hZXMvYWVzLmMgc3JjL2NpcGhlcnMvYWVzL2Flc190YWIuYworc3JjL2NpcGhlcnMvdHdvZmlzaC90d29maXNoLm86IHNyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaC5jIHNyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaF90YWIuYworc3JjL2hhc2hlcy93aGlybC93aGlybC5vOiBzcmMvaGFzaGVzL3doaXJsL3doaXJsLmMgc3JjL2hhc2hlcy93aGlybC93aGlybHRhYi5jCitzcmMvcGsvZWNjL2VjYy5vOiBzcmMvcGsvZWNjL2VjYy5jIHNyYy9way9lY2MvZWNjX3N5cy5jCitzcmMvcGsvZGgvZGgubzogc3JjL3BrL2RoL2RoLmMgc3JjL3BrL2RoL2RoX3N5cy5jCitzcmMvaGFzaGVzL3NoYTIvc2hhNTEyLm86IHNyYy9oYXNoZXMvc2hhMi9zaGE1MTIuYyBzcmMvaGFzaGVzL3NoYTIvc2hhMzg0LmMKK3NyYy9oYXNoZXMvc2hhMi9zaGEyNTYubzogc3JjL2hhc2hlcy9zaGEyL3NoYTI1Ni5jIHNyYy9oYXNoZXMvc2hhMi9zaGEyMjQuYworCisjVGhpcyBydWxlIG1ha2VzIHRoZSBsaWJ0b21jcnlwdCBsaWJyYXJ5LgorI2xpYnJhcnk6ICQoTElCVEVTVCkgJChMSUJOQU1FKQorIyBEcm9wYmVhciBkb2Vzbid0IHdhbnQgdGVzdCBwcm9ncmFtcywgc2luY2UgaXQgcmVsaWVzIG9uIHlhcnJvdyBldGMuCitsaWJyYXJ5OiAkKExJQk5BTUUpCisKKyQoTElCVEVTVCk6IAorCWNkIHRlc3Rwcm9mIDsgQ0ZMQUdTPSIkKENGTEFHUykiIG1ha2UgCisKKyQoTElCTkFNRSk6ICQoT0JKRUNUUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoT0JKRUNUUykgCisJJChSQU5MSUIpICQoTElCTkFNRSkKKworI1RoaXMgcnVsZSBtYWtlcyB0aGUgaGFzaCBwcm9ncmFtIGluY2x1ZGVkIHdpdGggbGlidG9tY3J5cHQKK2hhc2hzdW06IGxpYnJhcnkgJChIQVNIT0JKRUNUUykKKwkkKENDKSAkKEhBU0hPQkpFQ1RTKSAkKExJQk5BTUUpIC1vICQoSEFTSCkgJChXQVJOKQorCisjbWFrZXMgdGhlIGNyeXB0IHByb2dyYW0KK2NyeXB0OiBsaWJyYXJ5ICQoQ1JZUFRPQkpFQ1RTKQorCSQoQ0MpICQoQ1JZUFRPQkpFQ1RTKSAkKExJQk5BTUUpIC1vICQoQ1JZUFQpICQoV0FSTikKKworI21ha2VzIHRoZSBzbWFsbCBwcm9ncmFtCitzbWFsbDogbGlicmFyeSAkKFNNQUxMT0JKRUNUUykKKwkkKENDKSAkKFNNQUxMT0JKRUNUUykgJChMSUJOQU1FKSAtbyAkKFNNQUxMKSAkKFdBUk4pCisJCit0dl9nZW46IGxpYnJhcnkgJChUVlMpCisJJChDQykgJChUVlMpICQoTElCTkFNRSkgJChFWFRSQUxJQlMpIC1vICQoVFYpCisKK211bHRpOiBsaWJyYXJ5ICQoTVVMVElTKQorCSQoQ0MpICQoTVVMVElTKSAkKExJQk5BTUUpIC1vICQoTVVMVEkpCisKK3RpbWluZzogbGlicmFyeSAkKFRJTUlOR1MpCisJJChDQykgJChUSU1JTkdTKSAkKExJQlRFU1QpICQoTElCTkFNRSkgLW8gJChUSU1JTkcpCisKK3Rlc3Q6IGxpYnJhcnkgJChURVNUUykKKwkkKENDKSAkKFRFU1RTKSAkKExJQlRFU1QpICQoTElCTkFNRSkgLW8gJChURVNUKQorCisKKyNUaGlzIHJ1bGUgaW5zdGFsbHMgdGhlIGxpYnJhcnkgYW5kIHRoZSBoZWFkZXIgZmlsZXMuIFRoaXMgbXVzdCBiZSBydW4KKyNhcyByb290IGluIG9yZGVyIHRvIGhhdmUgYSBoaWdoIGVub3VnaCBwZXJtaXNzaW9uIHRvIHdyaXRlIHRvIHRoZSBjb3JyZWN0CisjZGlyZWN0b3JpZXMgYW5kIHRvIHNldCB0aGUgb3duZXIgYW5kIGdyb3VwIHRvIHJvb3QuCitpbnN0YWxsOiBsaWJyYXJ5IGRvY3MKKwlpbnN0YWxsIC1kIC1nICQoR1JPVVApIC1vICQoVVNFUikgJChERVNURElSKSQoTElCUEFUSCkKKwlpbnN0YWxsIC1kIC1nICQoR1JPVVApIC1vICQoVVNFUikgJChERVNURElSKSQoSU5DUEFUSCkKKwlpbnN0YWxsIC1kIC1nICQoR1JPVVApIC1vICQoVVNFUikgJChERVNURElSKSQoREFUQVBBVEgpCisJaW5zdGFsbCAtZyAkKEdST1VQKSAtbyAkKFVTRVIpICQoTElCTkFNRSkgJChERVNURElSKSQoTElCUEFUSCkKKwlpbnN0YWxsIC1nICQoR1JPVVApIC1vICQoVVNFUikgJChIRUFERVJTKSAkKERFU1RESVIpJChJTkNQQVRIKQorCWluc3RhbGwgLWcgJChHUk9VUCkgLW8gJChVU0VSKSBkb2MvY3J5cHQucGRmICQoREVTVERJUikkKERBVEFQQVRIKQorCitpbnN0YWxsX2xpYjogbGlicmFyeQorCWluc3RhbGwgLWQgLWcgJChHUk9VUCkgLW8gJChVU0VSKSAkKERFU1RESVIpJChMSUJQQVRIKQorCWluc3RhbGwgLWQgLWcgJChHUk9VUCkgLW8gJChVU0VSKSAkKERFU1RESVIpJChJTkNQQVRIKQorCWluc3RhbGwgLWcgJChHUk9VUCkgLW8gJChVU0VSKSAkKExJQk5BTUUpICQoREVTVERJUikkKExJQlBBVEgpCisJaW5zdGFsbCAtZyAkKEdST1VQKSAtbyAkKFVTRVIpICQoSEVBREVSUykgJChERVNURElSKSQoSU5DUEFUSCkKKworI1RoaXMgcnVsZSBjbGVhbnMgdGhlIHNvdXJjZSB0cmVlIG9mIGFsbCBjb21waWxlZCBjb2RlLCBub3QgaW5jbHVkaW5nIHRoZSBwZGYKKyNkb2N1bWVudGF0aW9uLgorY2xlYW46CisJcm0gLWYgYGZpbmQgLiAtdHlwZSBmIHwgZ3JlcCAiWy5dbyIgfCB4YXJnc2AKKwlybSAtZiBgZmluZCAuIC10eXBlIGYgfCBncmVwICJbLl1sbyIgIHwgeGFyZ3NgCisJcm0gLWYgYGZpbmQgLiAtdHlwZSBmIHwgZ3JlcCAiWy5dYSIgfCB4YXJnc2AKKwlybSAtZiBgZmluZCAuIC10eXBlIGYgfCBncmVwICJbLl1sYSIgIHwgeGFyZ3NgCisJcm0gLWYgYGZpbmQgLiAtdHlwZSBmIHwgZ3JlcCAiWy5db2JqIiB8IHhhcmdzYAorCXJtIC1mIGBmaW5kIC4gLXR5cGUgZiB8IGdyZXAgIlsuXWxpYiIgfCB4YXJnc2AKKwlybSAtZiBgZmluZCAuIC10eXBlIGYgfCBncmVwICJbLl1leGUiIHwgeGFyZ3NgCisJcm0gLWYgYGZpbmQgLiAtdHlwZSBmIHwgZ3JlcCAiWy5dZ2NkYSIgfCB4YXJnc2AKKwlybSAtZiBgZmluZCAuIC10eXBlIGYgfCBncmVwICJbLl1nY25vIiB8IHhhcmdzYAorCXJtIC1mIGBmaW5kIC4gLXR5cGUgZiB8IGdyZXAgIlsuXWlsIiB8IHhhcmdzYAorCXJtIC1mIGBmaW5kIC4gLXR5cGUgZiB8IGdyZXAgIlsuXWR5biIgfCB4YXJnc2AKKwlybSAtZiBgZmluZCAuIC10eXBlIGYgfCBncmVwICJbLl1kcGkiIHwgeGFyZ3NgCisJcm0gLXJmIGBmaW5kIC4gLXR5cGUgZCB8IGdyZXAgIlsuXWxpYnMiIHwgeGFyZ3NgCisJcm0gLWYgY3J5cHQuYXV4ICBjcnlwdC5kdmkgIGNyeXB0LmlkeCAgY3J5cHQuaWxnICBjcnlwdC5pbmQgIGNyeXB0LmxvZyBjcnlwdC50b2MKKwlybSAtZiAkKFRWKSAkKFBST0YpICQoU01BTEwpICQoQ1JZUFQpICQoSEFTSFNVTSkgJChNVUxUSSkgJChUSU1JTkcpICQoVEVTVCkKKwlybSAtcmYgZG9jL2RveHlnZW4KKwlybSAtZiBkb2MvKi5wZGYKKworI2J1aWxkIHRoZSBkb3h5IGZpbGVzIChyZXF1aXJlcyBEb3h5Z2VuLCB0ZXRleCBhbmQgcGF0aWVuY2UpCitkb3h5OgorCWRveHlnZW4KKwljZCBkb2MvZG94eWdlbi9sYXRleCA7IG1ha2UgOyBtdiAtZiByZWZtYW4ucGRmIC4uLy4uLy4KKwllY2hvIFRoZSBodWdlIGRveHlnZW4gUERGIHNob3VsZCBiZSBhdmFpbGFibGUgYXMgZG9jL3JlZm1hbi5wZGYKKwkKKyNUaGlzIGJ1aWxkcyB0aGUgY3J5cHQucGRmIGZpbGUuIE5vdGUgdGhhdCB0aGUgcm0gLWYgKi5wZGYgaGFzIGJlZW4gcmVtb3ZlZAorI2Zyb20gdGhlIGNsZWFuIGNvbW1hbmQhIFRoaXMgaXMgYmVjYXVzZSBtb3N0IHBlb3BsZSB3b3VsZCBsaWtlIHRvIGtlZXAgdGhlCisjbmljZSBwcmUtY29tcGlsZWQgY3J5cHQucGRmIHRoYXQgY29tZXMgd2l0aCBsaWJ0b21jcnlwdCEgV2Ugb25seSBuZWVkIHRvCisjZGVsZXRlIGl0IGlmIHdlIGFyZSByZWJ1aWxkaW5nIGl0LgorZG9jczogY3J5cHQudGV4CisJcm0gLWYgZG9jL2NyeXB0LnBkZiAkKExFRlRPVkVSUykKKwllY2hvICJoZWxsbyIgPiBjcnlwdC5pbmQKKwlsYXRleCBjcnlwdCA+IC9kZXYvbnVsbAorCWxhdGV4IGNyeXB0ID4gL2Rldi9udWxsCisJbWFrZWluZGV4IGNyeXB0LmlkeCA+IC9kZXYvbnVsbAorCWxhdGV4IGNyeXB0ID4gL2Rldi9udWxsCisJZHZpcGRmIGNyeXB0CisJbXYgLWl2ZiBjcnlwdC5wZGYgZG9jL2NyeXB0LnBkZgorCXJtIC1mICQoTEVGVE9WRVJTKQorCitkb2Nkdmk6IGNyeXB0LnRleAorCWVjaG8gaGVsbG8gPiBjcnlwdC5pbmQKKwlsYXRleCBjcnlwdCA+IC9kZXYvbnVsbAorCWxhdGV4IGNyeXB0ID4gL2Rldi9udWxsCisJbWFrZWluZGV4IGNyeXB0LmlkeAorCWxhdGV4IGNyeXB0ID4gL2Rldi9udWxsCisKKyN6aXB1cCB0aGUgcHJvamVjdCAodGFrZSB0aGF0ISkKK25vX29vcHM6IGNsZWFuCisJY2QgLi4gOyBjdnMgY29tbWl0IAorCit6aXB1cDogbm9fb29wcyBkb2NzCisJY2QgLi4gOyBybSAtcmYgY3J5cHQqIGxpYnRvbWNyeXB0LSQoVkVSU0lPTikgOyBta2RpciBsaWJ0b21jcnlwdC0kKFZFUlNJT04pIDsgXAorCWNwIC1SIC4vbGlidG9tY3J5cHQvKiAuL2xpYnRvbWNyeXB0LSQoVkVSU0lPTikvIDsgXAorCWNkIGxpYnRvbWNyeXB0LSQoVkVSU0lPTikgOyBybSAtcmYgYGZpbmQgLiAtdHlwZSBkIHwgZ3JlcCBDVlMgfCB4YXJnc2AgOyBjZCAuLiA7IFwKKwl0YXIgLWNqdmYgY3J5cHQtJChWRVJTSU9OKS50YXIuYnoyIGxpYnRvbWNyeXB0LSQoVkVSU0lPTikgOyBcCisJemlwIC05ciBjcnlwdC0kKFZFUlNJT04pLnppcCBsaWJ0b21jcnlwdC0kKFZFUlNJT04pIDsgXAorCWdwZyAtYiAtYSBjcnlwdC0kKFZFUlNJT04pLnRhci5iejIgOyBncGcgLWIgLWEgY3J5cHQtJChWRVJTSU9OKS56aXAgOyBcCisJbXYgLWZ2IGNyeXB0KiB+IDsgcm0gLXJmIGxpYnRvbWNyeXB0LSQoVkVSU0lPTikKZGlmZiAtLWdpdCBhL1BMQU4gYi9QTEFOCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWViYzFhLi4wMDAwMDAwCi0tLSBhL1BMQU4KKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1UaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbWFya2VkIGZvciByZW1vdmFsIGFuZC9vciBiZWhhdmlvdXJhbCBjaGFuZ2UgYnkgdjEuMDAgb2YgTGliVG9tQ3J5cHQKLQotMS4gIFJTQSBTdXBwb3J0Ci0KLSAgICAgIHJzYV9wYWQsIHJzYV9zaWducGFkLCByc2FfZGVwYWQsIHJzYV9zaWduZGVwYWQsIHJzYV9pbXBvcnQsIHJzYV9leHBvcnQKLQotVGhleSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggUEtDUyAjMSBjb21wbGlhbnQgT0FFUC9QU1MgcGFkZGluZyBmdW5jdGlvbiBhcyBlYXJseSBhcyB2MC45NgotCi0yLiAgRFNBIFN1cHBvcnQKLQotICAgICAgZHNhX2ltcG9ydCwgZHNhX2V4cG9ydAotCi1XaWxsIGJlIHJlcGxhY2VkIHdpdGggc3VpdGFibGUgRFNTIFt3aGF0IGlzIHRoZSBzdGFuZGFyZD9dIGNvbXBsaWFudCBmb3JtYXRzLiAgUGxhbm5lZCBmb3IgdjAuOTYKLQotMy4gIEtleSBSaW5nIFN1cHBvcnQKLSAgCi0gICAgICAoYWxsKQotCi1UaGUgZW50aXJlIEFQSSB3aWxsIGJlIGRyb3BwZWQgYXMgZWFybHkgYXMgdjAuOTYuICBJdCB3YXMganVzdCBhbiBleHBlcmltZW50IGFuZCBub2JvZHkgdXNlcyBpdCBhbnl3YXlzLgotCi00LiAgVGVzdCBIYXJuZXNzCi0gCi0gICAgICBkZW1vcy90ZXN0LmMKLQotVGhlIHRlc3QgaGFybmVzcyBpcyB3ZWxsIG92ZXJkdWUgZm9yIGEgbWFrZW92ZXIuICBQbGFubmVkIGZvciBhcyBlYXJseSBhcyB2MC45NwotCi0KLVB1dCB0aGluZ3MgaW4gb3JkZXIuLi4KLQotdjAuOTYgIC0tIHJlbW92ZWQga2V5cmluZy5jIGFuZCBnZi5jCi0gICAgICAgLS0gcmVtb3ZlZCBMVEMgUlNBIHBhZGRpbmcKLSAgICAgICAtLSBEU1Mgc3VwcG9ydCBbd2hhdGV2ZXIgdGhpcyBlbnRhaWxzXQotICAgICAgIC0tIEJ1ZyBmaXhlcy91cGRhdGVzIHRvIHRoZSBQS0NTL0RTUyBzdXBwb3J0LCBzaG91bGQgYmUgc3RhYmxlIGluIHRoaXMgcmVsZWFzZQotCi12MC45NyAgLS0gUmUtd3JpdHRlbiB0ZXN0IGhhcm5lc3MKLSAgICAgICAtLSBNb3JlIGRlbW9zIGluIHRoZSBtYW51YWwgYW5kIGRlbW9zLyBkaXJlY3RvcnkKLQotLi4uIGZ1dHVyZT8/PwpkaWZmIC0tZ2l0IGEvVE9ETyBiL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmMDY2NQotLS0gL2Rldi9udWxsCisrKyBiL1RPRE8KQEAgLTAsMCArMSwxMCBAQAorRm9yIDEuMDYKKworMS4gZXhwb3J0IEVDQyBmdW5jdGlvbnMgZ2xvYmFsbHkgW2UuZy4gbXVsbW9kIGFuZCB0aGUgc2V0c10KKyAgIC0gZ29hbCBpcyB0dl9nZW4gbW9kdWxlIGFuZCB0ZXN0IHZlY3RvcnMKKzIuIEFTTi4xIFNFVCBhbmQgVDYxU3RyaW5nCiszLiBwaGFzZSBvdXQgREggY29kZSBbUlNBL0VDQy9EU0EgaXMgZW5vdWdoXQorNC4gU29tZSBBU04uMSBkZW1vIHByb2dyYW1zIFtmb3Igbm93IHJlYWQgdGhlIHNvdXJjZSBjb2RlIV0KKzUuIFN0YXJ0IHdvcmtpbmcgdG93YXJkcyBtYWtpbmcgdGhlIGJpZ251bSBjb2RlIHBsdWdhYmxlCis2LiBMb29rIGludG8gb3RoZXIgRUNDIHBvaW50IG11bHMgYW5kIGNvbnNpZGVyIGEgInByZWNvbXAiIGludGVyZmFjZSAKKzcuIEFkZCBPSUQgZm9yIGNpcGhlcnMgYW5kIFBSTkdzIHRvIHRoZWlyIGRlc2NyaXB0b3JzCmRpZmYgLS1naXQgYS9hbXBpLmMgYi9hbXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMDE1Y2EuLjAwMDAwMDAKLS0tIGEvYW1waS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogQ29kZSBzdWJtaXR0ZWQgYnkgU3ZhbnRlIFNlbGVib3JnLCBjbGVhbmVkIHVwIGJ5IFRvbSBTdCBEZW5pcyAqLwotCi0jaW5jbHVkZSAibXljcnlwdC5oIgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaWZkZWYgTVBJCi0KLW1wX2VyciBtcF9pbml0X211bHRpKG1wX2ludCAqbXAsIC4uLikgCi17Ci0gICAgbXBfZXJyIHJlcyA9IE1QX09LQVk7ICAgICAgLyogQXNzdW1lIG9rIHVudGlsIHByb3ZlbiBvdGhlcndpc2UgKi8KLSAgICBpbnQgbiA9IDA7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygb2sgaW5pdHMgKi8KLSAgICBtcF9pbnQqIGN1cl9hcmcgPSBtcDsKLSAgICB2YV9saXN0IGFyZ3M7Ci0KLSAgICB2YV9zdGFydChhcmdzLCBtcCk7ICAgICAgICAvKiBpbml0IGFyZ3MgdG8gbmV4dCBhcmd1bWVudCBmcm9tIGNhbGxlciAqLwotICAgIHdoaWxlIChjdXJfYXJnICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKG1wX2luaXQoY3VyX2FyZykgIT0gTVBfT0tBWSkgewotICAgICAgICAgICAgLyogT29wcyAtIGVycm9yISBCYWNrLXRyYWNrIGFuZCBtcF9jbGVhciB3aGF0IHdlIGFscmVhZHkKLSAgICAgICAgICAgICAgIHN1Y2NlZWRlZCBpbiBpbml0LWluZywgdGhlbiByZXR1cm4gZXJyb3IuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgdmFfbGlzdCBjbGVhbl9hcmdzOwotICAgICAgICAgICAgY3VyX2FyZyA9IG1wOwotICAgICAgICAgICAgdmFfc3RhcnQoY2xlYW5fYXJncywgbXApOwotICAgICAgICAgICAgd2hpbGUgKG4tLSkgewotICAgICAgICAgICAgICAgIG1wX2NsZWFyKGN1cl9hcmcpOwotICAgICAgICAgICAgICAgIGN1cl9hcmcgPSB2YV9hcmcoY2xlYW5fYXJncywgbXBfaW50Kik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YV9lbmQoY2xlYW5fYXJncyk7Ci0gICAgICAgICAgICByZXMgPSBNUF9NRU07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBuKys7Ci0gICAgICAgIGN1cl9hcmcgPSB2YV9hcmcoYXJncywgbXBfaW50Kik7Ci0gICAgfQotICAgIHZhX2VuZChhcmdzKTsKLSAgICByZXR1cm4gcmVzOyAgICAgICAgICAgICAgICAvKiBBc3N1bWVkIG9rLCBpZiBlcnJvciBmbGFnZ2VkIGFib3ZlLiAqLwotfQotCi0vKgotICAgIENsZWFyIGFsbCBhcmd1bWVudHMgZ2l2ZW4sIGVuZGVkIGJ5IGEgTlVMTCBtYXJrZXIuCi0qLwotdm9pZCBtcF9jbGVhcl9tdWx0aShtcF9pbnQgKm1wLCAuLi4pIAotewotICAgIG1wX2ludCogbmV4dF9tcCA9IG1wOwotICAgIHZhX2xpc3QgYXJnczsKLSAgICB2YV9zdGFydChhcmdzLCBtcCk7Ci0gICAgd2hpbGUgKG5leHRfbXAgIT0gTlVMTCkgewotICAgICAgICBtcF9jbGVhcihuZXh0X21wKTsKLSAgICAgICAgbmV4dF9tcCA9IHZhX2FyZyhhcmdzLCBtcF9pbnQqKTsKLSAgICB9Ci0gICAgdmFfZW5kKGFyZ3MpOwotfQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXV0aG9ycyBiL2F1dGhvcnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNGVhNmIuLjAwMDAwMDAKLS0tIGEvYXV0aG9ycworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLVRoaXMgaXMgYSBsaXN0IG9mIHBlb3BsZSB3aG8gaGF2ZSBjb250cmlidXRlZCBbZGlyZWN0bHkgb3IgaW5kaXJlY3RseV0gdG8gdGhlIHByb2plY3QKLVtpbiBubyBwYXJ0Y3VsYXIgb3JkZXJdLiAgSWYgeW91IGhhdmUgaGVscGVkIGFuZCB5b3VyIG5hbWUgaXMgbm90IGhlcmUgZW1haWwgbWUgYXQKLXRvbXN0ZGVuaXNAeWFob28uY29tLgotCi0KLTEpIFJpY2hhcmQudmFuLmRlLkxhYXJzY2hvdEBpY3QubmwKLQotICAgR2F2ZSBoZWxwIHBvcnRpbmcgdGhlIGxpYiB0byBNU1ZDIHBhcnRpY3VsYXJseSBwb2ludGVkIG91dCB2YXJpb3VzIHdhcm5pbmdzIGFuZCBlcnJvcnMuCi0KLTIpIFJpY2hhcmQgSGVhdGhmaWVsZAotCi0gICBHYXZlIGEgbG90IG9mIGhlbHAgY29uY2VybmluZyB2YWxpZCBDIHBvcnRhYmxlIGNvZGUuICAKLQotMykgQWpheSBLLiBBZ3Jhd2FsCi0KLSAgIEhlbHBlZCBwb3J0IHRoZSBsaWJyYXJ5IHRvIE1TVkMgYW5kIHNwb3R0ZWQgYSBmZXcgYnVncyBhbmQgZXJyb3JzLgotCi00KSBCcmlhbiBHbGFkbWFuCi0KLSAgIFdyb3RlIHRoZSBBRVMgYW5kIFNlcnBlbnQgY29kZSB1c2VkLiAgRm91bmQgYSBidWcgaW4gdGhlIGhhc2ggY29kZSBmb3IgY2VydGFpbiB0eXBlcyBvZiBpbnB1dHMuCi0KLTUpIFN2YW50ZSBTZWxlYm9yZwotCi0gICBTdWJtaXR0ZWQgdGhlICJhbXBpLmMiIGNvZGUgYXMgd2VsbCBhcyBtYW55IHN1Z2dlc3Rpb25zIG9uIGltcHJvdmluZyB0aGUgcmVhZGFiaWxpdHkgb2YgdGhlIHNvdXJjZSBjb2RlLgotCi02KSBDbGF5IEN1bHZlcgotCi0gICBTdWJtaXR0ZWQgYSBmaXggZm9yICJyc2EuYyIgd2hpY2ggY2xlYW5lZCB1cCBzb21lIGNvZGUuICBTdWJtaXRlZCBzb21lIG90aGVyIGZpeGVzIHRvby4gIDotKQotICAgQ2xheSBoYXMgaGVscGVkIGZpbmQgYnVncyBpbiB2YXJpb3VzIHBpZWNlcyBvZiBjb2RlIGluY2x1ZGluZyB0aGUgcmVnaXN0cnkgZnVuY3Rpb25zLCBiYXNlNjQgcm91dGluZXMgCi0gICBhbmQgdGhlIG1ha2UgcHJvY2Vzcy4gIEhlIGlzIGFsc28gbm93IHRoZSBwcmltYXJ5IGF1dGhvciBvZiB0aGUgbGlidG9tY3J5cHQgcmVmZXJlbmNlIG1hbnVhbCBhbmQgaGFzIHBsYW4KLSAgIGF0IG1ha2luZyBhIEhUTUwgdmVyc2lvbi4KLQotNykgSmFzb24gS2xhcHN0ZQotCi0gICBTdWJtaXR0ZWQgZml4ZXMgdG8gdGhlIHlhcnJvdywgaGFzaCwgbWFrZSBwcm9jZXNzIGFuZCB0ZXN0IGNvZGUgYXMgd2VsbCBhcyBvdGhlciBzdWJ0bGUgYnVnIGZpeGVzLiAgVGhlIAoteWFycm93IGNvZGUgY2FuIG5vdyBkZWZhdWx0IHRvIGFueSBjaXBoZXIvaGFzaCB0aGF0IGlzIGxlZnQgYWZ0ZXIgeW91IHJlbW92ZSB0aGVtIGZyb20gYSBidWlsZC4KLQotOCkgRG9iZXMgVmFuZGVybWVlciA8ZG9iZXNAc21hcnR0LmNvbT4KLQotICAgU3VibWl0dGVkIEhNQUMgY29kZSB0aGF0IHdvcmtlZCBmbGF3bGVzc2x5IG91dCBvZiB0aGUgYm94Li4uIGdvb2Qgam9iISAgQWxzbyBzdWJtaXR0ZWQgYSBNRDQgcm91dGluZS4KLSAgIFN1Ym1pdHRlZCBzb21lIG1vZGlmaWVkIERFUyBjb2RlIHRoYXQgd2FzIG1lcmdlZCBpbnRvIHRoZSBjb2RlIGJhc2UgW3VzaW5nIHRoZSBsaWJ0b21jcnlwdCBBUEldCi0KLTkpIFdheW5lIFNjb3R0ICh3c2NvdHRAYml0bW92ZXIuY29tKQotICAKLSAgIFN1Ym1pdHRlZCBiYXNlNjQgdGhhdCBjb21wbGllcyB3aXRoIHRoZSBSRkMgc3RhbmRhcmRzLiAgU3VibWl0dGVkIHNvbWUgaWRlYXMgdG8gaW1wcm92ZSB0aGUgUlNBIGtleSBnZW5lcmF0aW9uCi0gICBhcyB3ZWxsLgotICAgCi0xMCkgU2t5IFNjaHVseiAoc2t5QG9nbi5jb20pCi0KLSAgIEhhcyBzdWJtaXR0ZWQgYSBzZXQgb2YgaWRlYXMgdG8gaW1wcm92ZSB0aGUgbGlicmFyeSBhbmQgbWFrZSBpdCBtb3JlIGF0dHJhY3RpdmUgZm9yIHByb2Zlc3Npb25hbCB1c2Vycy4KLSAgIAotMTEpIE1pa2UgRnJ5c2luZ2VyIAotCi0gICBUb2dldGhlciB3aXRoIENsYXkgY2FtZSB1cCB3aXRoIGEgbW9yZSAidW5peCBmcmllbmRseSIgbWFrZWZpbGUuICBNaWtlIEZyeXNpbmdlciBoYXMgYmVlbiBrZWVwaW5nIGNvcGllcyBvZiAKLSAgIHRoZSBsaWJyYXJ5IGZvciB0aGUgR2VudG9vIGxpbnV4IGRpc3RyaWJ1dGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iYXNlNjQuYyBiL2Jhc2U2NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQyMWZlLi4wMDAwMDAwCi0tLSBhL2Jhc2U2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotLyogY29tcGxpYW50IGJhc2U2NCBjb2RlIGRvbmF0ZWQgYnkgV2F5bmUgU2NvdHQgKHdzY290dEBiaXRtb3Zlci5jb20pICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgQkFTRTY0Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb2RlcyA9IAotIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtYXBbMjU2XSA9IHsKLTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0yNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgIDYyLCAyNTUsIDI1NSwgMjU1LCAgNjMsCi0gNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsIDI1NSwgMjU1LAotMjU1LCAyNTQsIDI1NSwgMjU1LCAyNTUsICAgMCwgICAxLCAgIDIsICAgMywgICA0LCAgIDUsICAgNiwKLSAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTgsCi0gMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotMjU1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwKLSAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsCi0gNDksICA1MCwgIDUxLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0yNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0yNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLTI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0yNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLTI1NSwgMjU1LCAyNTUsIDI1NSB9OwotCi1pbnQgYmFzZTY0X2VuY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgbGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQotewotICAgdW5zaWduZWQgbG9uZyBpLCBsZW4yLCBsZXZlbjsKLSAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0KLSAgIF9BUkdDSEsoaW4gICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLQotICAgLyogdmFsaWQgb3V0cHV0IHNpemUgPyAqLwotICAgbGVuMiA9IDQgKiAoKGxlbiArIDIpIC8gMyk7Ci0gICBpZiAoKm91dGxlbiA8IGxlbjIgKyAxKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgfQotICAgcCA9IG91dDsKLSAgIGxldmVuID0gMyoobGVuIC8gMyk7Ci0gICBmb3IgKGkgPSAwOyBpIDwgbGV2ZW47IGkgKz0gMykgewotICAgICAgICpwKysgPSBjb2Rlc1soaW5bMF0gPj4gMikgJiAweDNGXTsKLSAgICAgICAqcCsrID0gY29kZXNbKCgoaW5bMF0gJiAzKSA8PCA0KSArIChpblsxXSA+PiA0KSkgJiAweDNGXTsKLSAgICAgICAqcCsrID0gY29kZXNbKCgoaW5bMV0gJiAweGYpIDw8IDIpICsgKGluWzJdID4+IDYpKSAmIDB4M0ZdOwotICAgICAgICpwKysgPSBjb2Rlc1tpblsyXSAmIDB4M0ZdOwotICAgICAgIGluICs9IDM7Ci0gICB9Ci0gICAvKiBQYWQgaXQgaWYgbmVjZXNzYXJ5Li4uICAqLwotICAgaWYgKGkgPCBsZW4pIHsKLSAgICAgICB1bnNpZ25lZCBhID0gaW5bMF07Ci0gICAgICAgdW5zaWduZWQgYiA9IChpKzEgPCBsZW4pID8gaW5bMV0gOiAwOwotCi0gICAgICAgKnArKyA9IGNvZGVzWyhhID4+IDIpICYgMHgzRl07Ci0gICAgICAgKnArKyA9IGNvZGVzWygoKGEgJiAzKSA8PCA0KSArIChiID4+IDQpKSAmIDB4M0ZdOwotICAgICAgICpwKysgPSAoaSsxIDwgbGVuKSA/IGNvZGVzWygoKGIgJiAweGYpIDw8IDIpKSAmIDB4M0ZdIDogJz0nOwotICAgICAgICpwKysgPSAnPSc7Ci0gICB9Ci0KLSAgIC8qIGFwcGVuZCBhIE5VTEwgYnl0ZSAqLwotICAgKnAgPSAnXDAnOwotCi0gICAvKiByZXR1cm4gb2sgKi8KLSAgICpvdXRsZW4gPSBwIC0gb3V0OwotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi1pbnQgYmFzZTY0X2RlY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgbGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQotewotICAgdW5zaWduZWQgbG9uZyB0LCB4LCB5LCB6OwotICAgdW5zaWduZWQgY2hhciBjOwotICAgaW50ICAgICAgICAgICBnOwotCi0gICBfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0ICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7Ci0KLSAgIGcgPSAzOwotICAgZm9yICh4ID0geSA9IHogPSB0ID0gMDsgeCA8IGxlbjsgeCsrKSB7Ci0gICAgICAgYyA9IG1hcFtpblt4XSYweEZGXTsKLSAgICAgICBpZiAoYyA9PSAyNTUpIGNvbnRpbnVlOwotICAgICAgIGlmIChjID09IDI1NCkgeyBjID0gMDsgZy0tOyB9Ci0gICAgICAgdCA9ICh0PDw2KXxjOwotICAgICAgIGlmICgrK3kgPT0gNCkgewotICAgICAgICAgIGlmICh6ICsgZyA+ICpvdXRsZW4pIHsgCi0gICAgICAgICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsgCi0gICAgICAgICAgfQotICAgICAgICAgIG91dFt6KytdID0gKHVuc2lnbmVkIGNoYXIpKCh0Pj4xNikmMjU1KTsKLSAgICAgICAgICBpZiAoZyA+IDEpIG91dFt6KytdID0gKHVuc2lnbmVkIGNoYXIpKCh0Pj44KSYyNTUpOwotICAgICAgICAgIGlmIChnID4gMikgb3V0W3orK10gPSAodW5zaWduZWQgY2hhcikodCYyNTUpOwotICAgICAgICAgIHkgPSB0ID0gMDsKLSAgICAgICB9Ci0gICB9Ci0gICBpZiAoeSAhPSAwKSB7Ci0gICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgfQotICAgKm91dGxlbiA9IHo7Ci0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9iYXNlNjRfZW5jb2RlLmMgYi9iYXNlNjRfZW5jb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjJiY2MuLjAwMDAwMDAKLS0tIGEvYmFzZTY0X2VuY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0vKiBjb21wbGlhbnQgYmFzZTY0IGNvZGUgZG9uYXRlZCBieSBXYXluZSBTY290dCAod3Njb3R0QGJpdG1vdmVyLmNvbSkgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBCQVNFNjQKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvZGVzID0gCi0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7Ci0KLWludCBiYXNlNjRfZW5jb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBsZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0gICB1bnNpZ25lZCBsb25nIGksIGxlbjIsIGxldmVuOwotICAgdW5zaWduZWQgY2hhciAqcDsKLQotICAgX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotCi0gICAvKiB2YWxpZCBvdXRwdXQgc2l6ZSA/ICovCi0gICBsZW4yID0gNCAqICgobGVuICsgMikgLyAzKTsKLSAgIGlmICgqb3V0bGVuIDwgbGVuMiArIDEpIHsKLSAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gICB9Ci0gICBwID0gb3V0OwotICAgbGV2ZW4gPSAzKihsZW4gLyAzKTsKLSAgIGZvciAoaSA9IDA7IGkgPCBsZXZlbjsgaSArPSAzKSB7Ci0gICAgICAgKnArKyA9IGNvZGVzWyhpblswXSA+PiAyKSAmIDB4M0ZdOwotICAgICAgICpwKysgPSBjb2Rlc1soKChpblswXSAmIDMpIDw8IDQpICsgKGluWzFdID4+IDQpKSAmIDB4M0ZdOwotICAgICAgICpwKysgPSBjb2Rlc1soKChpblsxXSAmIDB4ZikgPDwgMikgKyAoaW5bMl0gPj4gNikpICYgMHgzRl07Ci0gICAgICAgKnArKyA9IGNvZGVzW2luWzJdICYgMHgzRl07Ci0gICAgICAgaW4gKz0gMzsKLSAgIH0KLSAgIC8qIFBhZCBpdCBpZiBuZWNlc3NhcnkuLi4gICovCi0gICBpZiAoaSA8IGxlbikgewotICAgICAgIHVuc2lnbmVkIGEgPSBpblswXTsKLSAgICAgICB1bnNpZ25lZCBiID0gKGkrMSA8IGxlbikgPyBpblsxXSA6IDA7Ci0KLSAgICAgICAqcCsrID0gY29kZXNbKGEgPj4gMikgJiAweDNGXTsKLSAgICAgICAqcCsrID0gY29kZXNbKCgoYSAmIDMpIDw8IDQpICsgKGIgPj4gNCkpICYgMHgzRl07Ci0gICAgICAgKnArKyA9IChpKzEgPCBsZW4pID8gY29kZXNbKCgoYiAmIDB4ZikgPDwgMikpICYgMHgzRl0gOiAnPSc7Ci0gICAgICAgKnArKyA9ICc9JzsKLSAgIH0KLQotICAgLyogYXBwZW5kIGEgTlVMTCBieXRlICovCi0gICAqcCA9ICdcMCc7Ci0KLSAgIC8qIHJldHVybiBvayAqLwotICAgKm91dGxlbiA9IHAgLSBvdXQ7Ci0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9idWlsZC5zaCBiL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMThhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC5zaApAQCAtMCwwICsxLDIwIEBACisjIS9iaW4vYmFzaAorZWNobyAiJDEgKCQyLCAkMykuLi4iCittYWtlIGNsZWFuIDE+L2Rldi9udWxsIDI+L2Rldi9udWxsCitlY2hvIC1uICJidWlsZGluZy4uLiIKK0NGTEFHUz0iJDIgJENGTEFHUyIgbWFrZSAtajMgLWYgJDMgdGVzdCB0dl9nZW4gMT5nY2NfMS50eHQgMj5nY2NfMi50eHQgfHwgKGVjaG8gImJ1aWxkICQxIGZhaWxlZCBzZWUgZ2NjXzIudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uIiAmJiBjYXQgZ2NjXzIudHh0ICYmIGV4aXQgMSkKK2VjaG8gLW4gInRlc3RpbmcuLi4iCitpZiBbIC1hIHRlc3QgXSAmJiBbIC1mIHRlc3QgXSAmJiBbIC14IHRlc3QgXTsgdGhlbgorICAgKCguL3Rlc3QgPnRlc3Rfc3RkLnR4dCAyPnRlc3RfZXJyLnR4dCAmJiAuL3R2X2dlbiA+IHR2LnR4dCkgJiYgZWNobyAiJDEgdGVzdCBwYXNzZWQuIiAmJiBlY2hvICJ5IiA+IHRlc3Rvay50eHQpIHx8IChlY2hvICIkMSB0ZXN0IGZhaWxlZCIgJiYgY2F0IHRlc3RfZXJyLnR4dCAmJiBleGl0IDEpCisgICBpZiBmaW5kICpfdHYudHh0IC10eXBlIGYgMT4vZGV2L251bGwgMj4vZGV2L251bGwgOyB0aGVuCisgICAgICBmb3IgZiBpbiAqX3R2LnR4dDsgZG8gaWYgKGRpZmYgJGYgbm90ZXMvJGYpIHRoZW4gdHJ1ZTsgZWxzZSAoZWNobyAidHZfZ2VuICRmIGZhaWxlZCIgJiYgcm0gLWYgdGVzdG9rLnR4dCAmJiBleGl0IDEpOyBmaTsgZG9uZQorICAgZmkKK2ZpCitpZiBbIC1hIHRlc3Rvay50eHQgXSAmJiBbIC1mIHRlc3Rvay50eHQgXTsgdGhlbgorICAgZXhpdCAwCitmaQorZXhpdCAxCisKKyMgJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvYnVpbGQuc2gsdiAkICAgCisjICRSZXZpc2lvbjogMS41ICQgICAKKyMgJERhdGU6IDIwMDUvMDYvMjcgMTM6MDQ6MDUgJCAKZGlmZiAtLWdpdCBhL2J1cm5fc3RhY2suYyBiL2J1cm5fc3RhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiMTM5MS4uMDAwMDAwMAotLS0gYS9idXJuX3N0YWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLXZvaWQgYnVybl9zdGFjayh1bnNpZ25lZCBsb25nIGxlbikKLXsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzMyXTsKLSAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0gICBpZiAobGVuID4gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGJ1ZikpCi0gICAgICBidXJuX3N0YWNrKGxlbiAtIHNpemVvZihidWYpKTsKLX0KLQotCmRpZmYgLS1naXQgYS9jYmNfZGVjcnlwdC5jIGIvY2JjX2RlY3J5cHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0OTU4YS4uMDAwMDAwMAotLS0gYS9jYmNfZGVjcnlwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgQ0JDCi0KLWludCBjYmNfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19DQkMgKmNiYykKLXsKLSAgIGludCB4LCBlcnI7Ci0gICB1bnNpZ25lZCBjaGFyIHRtcFtNQVhCTE9DS1NJWkVdLCB0bXAyW01BWEJMT0NLU0laRV07Ci0KLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgX0FSR0NISyhjYmMgIT0gTlVMTCk7Ci0KLSAgIC8qIGRlY3J5cHQgdGhlIGJsb2NrIGZyb20gY3QgaW50byB0bXAgKi8KLSAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNiYy0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICByZXR1cm4gZXJyOwotICAgfQotICAgX0FSR0NISyhjaXBoZXJfZGVzY3JpcHRvcltjYmMtPmNpcGhlcl0uZWNiX2RlY3J5cHQgIT0gTlVMTCk7Ci0gICAgICAKLSAgIC8qIGlzIGJsb2NrbGVuIHZhbGlkPyAqLwotICAgaWYgKGNiYy0+YmxvY2tsZW4gPCAwIHx8IGNiYy0+YmxvY2tsZW4gPiAoaW50KXNpemVvZihjYmMtPklWKSkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOwotICAgfSAKLQotICAgLyogZGVjcnlwdCBhbmQgeG9yIElWIGFnYWluc3QgdGhlIHBsYWludGV4dCBvZiB0aGUgcHJldmlvdXMgc3RlcCAqLwotICAgY2lwaGVyX2Rlc2NyaXB0b3JbY2JjLT5jaXBoZXJdLmVjYl9kZWNyeXB0KGN0LCB0bXAsICZjYmMtPmtleSk7Ci0gICBmb3IgKHggPSAwOyB4IDwgY2JjLT5ibG9ja2xlbjsgeCsrKSB7IAotICAgICAgIC8qIGNvcHkgQ1QgaW4gY2FzZSBjdCA9PSBwdCAqLwotICAgICAgIHRtcDJbeF0gPSBjdFt4XTsgCi0KLSAgICAgICAvKiBhY3R1YWxseSBkZWNyeXB0IHRoZSBieXRlICovCi0gICAgICAgcHRbeF0gPSB0bXBbeF0gXiBjYmMtPklWW3hdOyAKLSAgIH0KLQotICAgLyogcmVwbGFjZSBJViB3aXRoIHRoaXMgY3VycmVudCBjaXBoZXJ0ZXh0ICovIAotICAgZm9yICh4ID0gMDsgeCA8IGNiYy0+YmxvY2tsZW47IHgrKykgewotICAgICAgIGNiYy0+SVZbeF0gPSB0bXAyW3hdOwotICAgfQotICAgI2lmZGVmIENMRUFOX1NUQUNLCi0gICAgICB6ZXJvbWVtKHRtcCwgc2l6ZW9mKHRtcCkpOwotICAgICAgemVyb21lbSh0bXAyLCBzaXplb2YodG1wMikpOwotICAgI2VuZGlmCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9jYmNfZW5jcnlwdC5jIGIvY2JjX2VuY3J5cHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiNWI1Yi4uMDAwMDAwMAotLS0gYS9jYmNfZW5jcnlwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgQ0JDCi0KLWludCBjYmNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19DQkMgKmNiYykKLXsKLSAgIGludCB4LCBlcnI7Ci0gICB1bnNpZ25lZCBjaGFyIHRtcFtNQVhCTE9DS1NJWkVdOwotCi0gICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY2JjICE9IE5VTEwpOwotCi0gICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChjYmMtPmNpcGhlcikpICE9IENSWVBUX09LKSB7Ci0gICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIAotICAgLyogaXMgYmxvY2tsZW4gdmFsaWQ/ICovCi0gICBpZiAoY2JjLT5ibG9ja2xlbiA8IDAgfHwgY2JjLT5ibG9ja2xlbiA+IChpbnQpc2l6ZW9mKGNiYy0+SVYpKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9ICAgIAotCi0gICAvKiB4b3IgSVYgYWdhaW5zdCBwbGFpbnRleHQgKi8KLSAgIGZvciAoeCA9IDA7IHggPCBjYmMtPmJsb2NrbGVuOyB4KyspIHsKLSAgICAgICB0bXBbeF0gPSBwdFt4XSBeIGNiYy0+SVZbeF07Ci0gICB9Ci0KLSAgIC8qIGVuY3J5cHQgKi8KLSAgIGNpcGhlcl9kZXNjcmlwdG9yW2NiYy0+Y2lwaGVyXS5lY2JfZW5jcnlwdCh0bXAsIGN0LCAmY2JjLT5rZXkpOwotCi0gICAvKiBzdG9yZSBJViBbY2lwaGVydGV4dF0gZm9yIGEgZnV0dXJlIGJsb2NrICovCi0gICBmb3IgKHggPSAwOyB4IDwgY2JjLT5ibG9ja2xlbjsgeCsrKSB7Ci0gICAgICAgY2JjLT5JVlt4XSA9IGN0W3hdOwotICAgfQotCi0gICAjaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgICAgIHplcm9tZW0odG1wLCBzaXplb2YodG1wKSk7Ci0gICAjZW5kaWYKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jYmNfZ2V0aXYuYyBiL2NiY19nZXRpdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDQzNzM2Li4wMDAwMDAwCi0tLSBhL2NiY19nZXRpdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBDQkMKLQotaW50IGNiY19nZXRpdih1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyAqbGVuLCBzeW1tZXRyaWNfQ0JDICpjYmMpCi17Ci0gICBfQVJHQ0hLKElWICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsobGVuICE9IE5VTEwpOwotICAgX0FSR0NISyhjYmMgIT0gTlVMTCk7Ci0gICBpZiAoKHVuc2lnbmVkIGxvbmcpY2JjLT5ibG9ja2xlbiA+ICpsZW4pIHsKLSAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gICB9Ci0gICBtZW1jcHkoSVYsIGNiYy0+SVYsIGNiYy0+YmxvY2tsZW4pOwotICAgKmxlbiA9IGNiYy0+YmxvY2tsZW47Ci0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jYmNfc2V0aXYuYyBiL2NiY19zZXRpdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWUxMjI5Li4wMDAwMDAwCi0tLSBhL2NiY19zZXRpdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBDQkMKLQotaW50IGNiY19zZXRpdihjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DQkMgKmNiYykKLXsKLSAgIF9BUkdDSEsoSVYgICE9IE5VTEwpOwotICAgX0FSR0NISyhjYmMgIT0gTlVMTCk7Ci0gICBpZiAobGVuICE9ICh1bnNpZ25lZCBsb25nKWNiYy0+YmxvY2tsZW4pIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKLSAgIH0KLSAgIG1lbWNweShjYmMtPklWLCBJViwgbGVuKTsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIAotCmRpZmYgLS1naXQgYS9jYmNfc3RhcnQuYyBiL2NiY19zdGFydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQ1ZmI2Li4wMDAwMDAwCi0tLSBhL2NiY19zdGFydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgQ0JDCi0KLWludCBjYmNfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgCi0gICAgICAgICAgICAgIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfQ0JDICpjYmMpCi17Ci0gICBpbnQgeCwgZXJyOwotIAotICAgX0FSR0NISyhJViAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOwotICAgX0FSR0NISyhjYmMgIT0gTlVMTCk7Ci0KLSAgIC8qIGJhZCBwYXJhbT8gKi8KLSAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNpcGhlcikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBzZXR1cCBjaXBoZXIgKi8KLSAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5zZXR1cChrZXksIGtleWxlbiwgbnVtX3JvdW5kcywgJmNiYy0+a2V5KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIGNvcHkgSVYgKi8KLSAgIGNiYy0+YmxvY2tsZW4gPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmJsb2NrX2xlbmd0aDsKLSAgIGNiYy0+Y2lwaGVyICAgPSBjaXBoZXI7Ci0gICBmb3IgKHggPSAwOyB4IDwgY2JjLT5ibG9ja2xlbjsgeCsrKSB7Ci0gICAgICAgY2JjLT5JVlt4XSA9IElWW3hdOwotICAgfQotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NmYl9nZXRpdi5jIGIvY2ZiX2dldGl2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDg2NmYuLjAwMDAwMDAKLS0tIGEvY2ZiX2dldGl2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIENGQgotCi1pbnQgY2ZiX2dldGl2KHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nICpsZW4sIHN5bW1ldHJpY19DRkIgKmNmYikKLXsKLSAgIF9BUkdDSEsoSVYgICE9IE5VTEwpOwotICAgX0FSR0NISyhsZW4gIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGNmYiAhPSBOVUxMKTsKLSAgIGlmICgodW5zaWduZWQgbG9uZyljZmItPmJsb2NrbGVuID4gKmxlbikgewotICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgIH0KLSAgIG1lbWNweShJViwgY2ZiLT5JViwgY2ZiLT5ibG9ja2xlbik7Ci0gICAqbGVuID0gY2ZiLT5ibG9ja2xlbjsKLQotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NmYl9zZXRpdi5jIGIvY2ZiX3NldGl2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYmJlNTkuLjAwMDAwMDAKLS0tIGEvY2ZiX3NldGl2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIENGQgotCi1pbnQgY2ZiX3NldGl2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0NGQiAqY2ZiKQotewotICAgaW50IGVycjsKLSAgIAotICAgX0FSR0NISyhJViAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGNmYiAhPSBOVUxMKTsKLQotICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2ZiLT5jaXBoZXIpKSAhPSBDUllQVF9PSykgewotICAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICAKLSAgIGlmIChsZW4gIT0gKHVuc2lnbmVkIGxvbmcpY2ZiLT5ibG9ja2xlbikgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOwotICAgfQotICAgICAgCi0gICAvKiBmb3JjZSBuZXh0IGJsb2NrICovCi0gICBjZmItPnBhZGxlbiA9IDA7Ci0gICBjaXBoZXJfZGVzY3JpcHRvcltjZmItPmNpcGhlcl0uZWNiX2VuY3J5cHQoSVYsIGNmYi0+SVYsICZjZmItPmtleSk7Ci0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIAotCmRpZmYgLS1naXQgYS9jZmJfc3RhcnQuYyBiL2NmYl9zdGFydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDcxNDEyLi4wMDAwMDAwCi0tLSBhL2NmYl9zdGFydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgQ0ZCCi0KLWludCBjZmJfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgCi0gICAgICAgICAgICAgIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfQ0ZCICpjZmIpCi17Ci0gICBpbnQgeCwgZXJyOwotCi0gICBfQVJHQ0hLKElWICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGNmYiAhPSBOVUxMKTsKLQotICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICAKLQotICAgLyogY29weSBkYXRhICovCi0gICBjZmItPmNpcGhlciA9IGNpcGhlcjsKLSAgIGNmYi0+YmxvY2tsZW4gPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmJsb2NrX2xlbmd0aDsKLSAgIGZvciAoeCA9IDA7IHggPCBjZmItPmJsb2NrbGVuOyB4KyspCi0gICAgICAgY2ZiLT5JVlt4XSA9IElWW3hdOwotCi0gICAvKiBpbml0IHRoZSBjaXBoZXIgKi8KLSAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5zZXR1cChrZXksIGtleWxlbiwgbnVtX3JvdW5kcywgJmNmYi0+a2V5KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIGVuY3J5cHQgdGhlIElWICovCi0gICBjaXBoZXJfZGVzY3JpcHRvcltjZmItPmNpcGhlcl0uZWNiX2VuY3J5cHQoY2ZiLT5JViwgY2ZiLT5JViwgJmNmYi0+a2V5KTsKLSAgIGNmYi0+cGFkbGVuID0gMDsKLQotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NoYW5nZXMgYi9jaGFuZ2VzCmluZGV4IDg3M2VjYTkuLjY1Y2NkMTYgMTAwNjQ0Ci0tLSBhL2NoYW5nZXMKKysrIGIvY2hhbmdlcwpAQCAtMSwxMCArMSwzNDkgQEAKK0p1bmUgMjd0aCwgMjAwNQordjEuMDUKKyAgICAgIC0tIEFkZGVkIFRlY2hub3RlICM2IHdoaWNoIGNvdmVycyB0aGUgY3VycmVudCBQSyBjb21wbGlhbmNlLiAgCisgICAgICAtLSBGaXhlZCBidWZmZXIgb3ZlcmZsb3cgaW4gT0FFUCBkZWNvZGVyCisgICAgICAtLSBBZGRlZCBDSE9JQ0UgdG8gdGhlIGxpc3Qgb2YgQVNOLjEgdHlwZXMKKyAgICAgIC0tIEFkZGVkIFVUQ1RJTUUgdG8gdGhlIGxpc3Qgb2YgQVNOLjEgdHlwZXMKKyAgICAgIC0tIEFkZGVkIE1VVEVYIGxvY2tzIGFyb3VuZCBkZXNjcmlwdG9yIHRhYmxlIGZ1bmN0aW9ucyBbYnV0IG5vdCBvbiB0aGUgZnVuY3Rpb25zIHRoYXQgYXJlIGRlcGVuZGVudCBvbiB0aGVtXQorICAgICAgICAgQWxsIGZ1bmN0aW9ucyBjYWxsICpfaXNfdmFsaWQoKSBiZWZvcmUgdXNpbmcgYSBkZXNjcmlwdG9yIGluZGV4IHdoaWNoIG1lYW5zIHRoZSByZXNwZWN0aXZlIHRhYmxlIG11c3QgYmUgdW5sb2NrZWQgYmVmb3JlIAorICAgICAgICAgaXQgY2FuIGJlIGFjY2Vzc2VkLiAgSG93ZXZlciwgZHVyaW5nIHRoZSBvcGVyYXRpb24gW2UuZy4gQ0NNXSBpZiB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBhbHRlcmVkIHRoZSByZXN1bHRzIHdpbGwgYmUgCisgICAgICAgICB1bmRlZmluZWQuICAKKyAgICAgIC0tIE1pbm9yIHVwZGF0ZXMgdG8gdGhlIG1hbnVhbCB0byByZWZsZWN0IHJlY2VudCBjaGFuZ2VzCisgICAgICAtLSBBZGRlZCBhIGNhdGNoIHRvIGZvciBhbiBlcnJvciB0aGF0IHNob3VsZCBuZXZlciBjb21lIHVwIGluIHJzYV9leHB0bW9kKCkuICBKdXN0IGJlaW5nIHRob3JvdWdoLgorCitKdW5lIDE1dGgsIDIwMDUKK3YxLjA0CisgICAgICAtLSBGaXhlZCBvZmYgYnkgb25lIFtiaXRdIGVycm9yIGluIGRzYV9tYWtlX2tleSgpIGl0IHdhcyB0b28gaGlnaCBieSBvbmUgYml0IFtub3QgYSBzZWN1cml0eSBwcm9ibGVtIGp1c3QgaW5jb25zaXN0ZW50XQorICAgICAgLS0gRUNDLTIyNCBjdXJ2ZSB3YXMgd3JvbmcgW2l0IHdhcyBhbiBvayBjdXJ2ZSBqdXN0IG5vdCBOSVNULCBzbyBubyBzZWN1cml0eSBmbGF3IGp1c3QgaW50ZXJvcGVyYWJpbGl0eV0uCisgICAgICAtLSBSZW1vdmVkIHBvaW50IGNvbXByZXNzaW9uIHNpbmNlIGl0IHNsb3dzIGRvd24gRUNDIG9wcyB0byBzYXZlIGEgbWVhc2x5IGNvdXBsZSBieXRlcy4KKyAgICAgICAgIFRoaXMgbWFrZXMgdGhlIGVjYyBleHBvcnQgZm9ybWF0IGluY29tcGF0aWJsZSB3aXRoIDEuMDMgW2l0IHNob3VsZG4ndCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZV0KKyAgICAgIC0tIFJlbW92ZWQgRUNDLTE2MCBmcm9tIHRpbWluZyBhbmQgYWRkZWQgdGhlIG90aGVyIGN1cnZlcworCitKdW5lIDl0aCwgMjAwNQordjEuMDMKKyAgICAgIC0tIFVzZXJzIG1heSB3YW50IHRvIG5vdGUgdGhhdCBvbiBhIFA0L0dDQzMuNCBwbGF0Zm9ybSAiLWZuby1yZWdtb3ZlIiBncmVhdGx5IGFjY2VsZXJhdGVzIHRoZSBjaXBoZXJzL2hhc2hlcy4KKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAtLSBNYWRlIGl0IGluc3RhbGwgdGhlIHRlc3RpbmcgbGlicmFyeSBpbiB0aGUgaWNjL3N0YXRpYyBtYWtlZmlsZXMKKyAgICAgIC0tIEZvdW5kIGJ1ZyBpbiBjY21fbWVtb3J5LmMgd2hpY2ggd291bGQgZmFpbCB0byBjb21waWxlIHdoZW4gTFRDX0NMRUFOX1NUQUNLIHdhcyBlbmFibGVkCisgICAgICAtLSBTaW1vbiBKb2huc29uIHByb3Bvc2VkIEkgZG8gYSBmdWxseSBhdXRvbWF0ZWQgdGVzdCBzdWl0ZS4gIEhlbmNlICJ0ZXN0bWUuc2giIHdhcyBib3JuCisgICAgICAtLSBBZGRlZCBMVENfTk9fVEVTVCB3aGljaCBmb3JjZXMgdGVzdCB2ZWN0b3JzIG9mZiAocmVnYXJkbGVzcyBvZiB3aGF0IHRvbWNyeXB0X2N1c3RvbS5oIGhhcykKKyAgICAgIC0tIEFkZGVkIExUQ19OT19UQUJMRVMgd2hpY2ggZGlzYWJsZXMgbGFyZ2UgdGFibGVzICh3aGVyZSBwb3NzaWJsZSwgcmVnYXJkbGVzcyBvZiB3aGF0IHRvbWNyeXB0X2N1c3RvbS5oIGhhcykKKyAgICAgIC0tIE5ldyB0ZXN0IHNjcmlwdCBmb3VuZCBhIGJ1ZyBpbiB0d29maXNoLmMgd2hlbiBUQUJMRVMgd2FzIGRpc2FibGVkLiAgWWVhaCB0ZXN0aW5nIQorICAgICAgLS0gQWRkZWQgYSBMVENfRkFTVCBzcGVjaWZpYyB0ZXN0IHRvIHRoZSB0ZXN0aW5nIHNvZnR3YXJlLgorICAgICAgLS0gVXBkYXRlZCB0ZXN0IGRyaXZlciB0byBhY3R1YWxseSBoYWx0IG9uIGVycm9ycyBhbmQganVzdCBwcmludCB0aGVtIG91dCAodXNlZnVsIGZvciBzYXkuLi4gYXV0b21hdGVkIHRlc3RpbmcuLi4pCisgICAgICAtLSBBZGRlZCBib3VuZHMgY2hlY2tpbmcgdG8gUGVsaWNhbiBNQUMKKyAgICAgIC0tIEFkZGVkIEJJVCBhbmQgT0NURVQgU1RSSU5HIHRvIHRoZSBBU04uMSBzaWRlIG9mIHRoaW5ncy4gIAorICAgICAgLS0gUGVra2EgUmlpa29uZW4gcG9pbnRlZCBvdXQgdGhhdCBteSBjdHJfc3RhcnQoKSBmdW5jdGlvbiBzaG91bGQgYWNjZXB0IHRoZSBjb3VudGVyIG1vZGUuIAorICAgICAgLS0gQ2xlYW5lZCB1cCB3YXJuaW5ncyBpbiB0ZXN0cHJvZgorICAgICAgLS0gUmVtb3ZlZCByZWR1bmRhbnQgbXUgYW5kIHBvaW50IG1hcHBpbmcgaW4gZWNjX3ZlcmlmeV9oYXNoKCkgc28gaXQgc2hvdWxkIGJlIGEgYml0IGZhc3RlciBub3cKKyAgICAgIC0tIFBla2thIHBvaW50ZWQgb3V0IHRoYXQgdGhlIEFFUyBrZXkgc3RydWN0dXJlIHdhcyB1c2luZyAzMiBieXRlcyBtb3JlIHRoYW4gaXQgb3VnaHQgdG8uCisgICAgICAtLSBBZGRlZCBxdWljayBkZWZpbmVzIHRvIHJlbW92ZSBlbnRpcmUgY2xhc3NlcyBvZiBhbGdvcml0aG1zLiAgVGhpcyBtYWtlcyBpdCBlYXNpZXIgaWYgeW91IHdhbnQgdG8gYnVpbGQgd2l0aCBqdXN0IAorICAgICAgICAgb25lIGFsZ29yaXRobSAoc2F5IEFFUyBvciBTSEEtMjU2KS4gIERlZmluZXMgYXJlIExUQ19OT19DSVBIRVJTLCBMVENfTk9fTU9ERVMsIExUQ19OT19IQVNIRVMsIExUQ19OT19NQUNTLAorICAgICAgICAgTFRDX05PX1BSTkdTLCBMVENfTk9fUEssIExUQ19OT19QS0NTCisgICAgICAtLSBBcyBwYXJ0IG9mIHRoZSBtb3ZlIGZvciBFQ0MgdG8gWDkuNjIgSSd2ZSBjaGFuZ2VkIHRoZSBzaWduYXR1cmUgYWxnb3JpdGhtIHRvIEVDIERTQS4gIE5vIEFQSSBjaGFuZ2VzLgorICAgICAgLS0gUGVra2EgaGVscGVkIG1lIGNsZWFuIHVwIHRoZSBQS0NTICMxIHYyLjEgW09BRVAvUFNTXSBjb2RlCisgICAgICAtLSBXcm90ZSBuZXcgREVSIFNFUVVFTkNFIGNvZGVyL2RlY29kZXIKKyAgICAgIC0tIFJTQSwgRFNBIGFuZCBFQ0RTQSBub3cgdXNlIHRoZSBERVIgU0VRVUVOQ0UgY29kZSAoc2F2ZXMgYSBsb3Qgb2YgY29kZSEpCisgICAgICAtLSBEU0Egb3V0cHV0IGlzIG5vdyBhIERFUiBTRVFVRU5DRSAoc28gbm90IGNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyByZWxlYXNlcykuICAKKyAgICAgIC0tIEFkZGVkIFRlY2hub3RlICM1IHdoaWNoIHNob3dzIGhvdyB0byBidWlsZCBMVEMgb24gYW4gQU1ENjQgdG8gaGF2ZSBhIHZhcmlldHkgb2YgYWxnb3JpdGhtcyBpbiBvbmx5IH44MEtCIG9mIGNvZGUuCisgICAgICAtLSBDaGFuZ2VkIHRlbXAgdmFyaWFibGUgaW4gTE9BRC9TVE9SRSBtYWNyb3MgdG8gInVsb25nMzIiIGZvciAzMi1iaXQgb3BzLiAgTWFrZXMgaXQgc2FmZXIgb24gQmlnIGVuZGlhbiBwbGF0Zm9ybXMKKyAgICAgIC0tIEFkZGVkIElOU1RBTExfR1JPVVAgYW5kIElOU1RBTExfVVNFUiB3aGljaCB5b3UgY2FuIHNwZWNpZnkgb24gdGhlIGJ1aWxkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IFVTRVIvR1JPVVAgdGhlIGxpYnJhcnkgCisgICAgICAgICBpcyB0byBiZSBpbnN0YWxsZWQgYXMKKyAgICAgIC0tIFJlbW92ZWQgInRlc3Rwcm9mIiBmcm9tIHRoZSBkZWZhdWx0IGJ1aWxkLiAgCisgICAgICAtLSBBZGRlZCBJQTUsIE5VTEwgYW5kIE9iamVjdCBJZGVudGlmaWVyIHRvIHRoZSBsaXN0IG9mIEFTTi4xIERFUiBzdXBwb3J0ZWQgdHlwZXMKKyAgICAgIC0tIFRoZSAibm9fb29wcyIgdGFyZ2V0IChwYXJ0IG9mIHppcHVwKSBub3cgc2NhbnMgZm9yIG5vbi1jdnMgZmlsZXMuICBUaGlzIGhlbHBzIHByZXZlbnQgdGVtcC9zY3JhdGNoIGZpbGVzIGZyb20gYXBwZWFyaW5nIGluIHJlbGVhc2VzIDstKQorICAgICAgLS0gQWRkZWQgREVScyBmb3IgbWlzc2luZyBoYXNoZXMsIGJ1dCBqdXN0IHRoZSBPSUQgbm90IHRoZSBQS0NTICMxIHYxLjUgYWRkaXRpb25zLiAKKyAgICAgIC0tIFJlbW92ZWQgUEtDUyAjMSB2MS41IGZyb20gdGhlIHRyZWUgc2luY2UgaXQncyB0YWtpbmcgdXAgc3BhY2UgYW5kIHlvdSBvdWdodCB0byB1c2UgdjIuMSBhbnl3YXlzCisgICAgICAtLSBLZXZpbiBLZW5ueSBwb2ludGVkIG91dCBhIGZldyBzdHJheSAvLyBjb21tZW50cworICAgICAgLS0gSU5URUdFUiBjb2RlIHByb3Blcmx5IHN1cHBvcnRzIG5lZ2F0aXZlcyBhbmQgemVybyBwYWRkaW5nIFtQZWtrYSFdCisgICAgICAtLSBTb3J0ZWQgYXNuMS9kZXIvIGRpcmVjdG9yeSAuLi4gbGVzcyBvZiBhIG1lc3Mgbm93IDstKQorICAgICAgLS0gQWRkZWQgUFJJTlRBQkxFIFNUUklORyB0eXBlCisgICAgICAtLSBSZW1vdmVkIEVDQy0xNjAgYXMgaXQgd2Fzbid0IGEgc3RhbmRhcmQgY3VydmUKKyAgICAgIC0tIE1hZGUgZWNjX3NoYXJlZF9zZWNyZXQoKSBBTlNJIFg5LjYzIGNvbXBsaWFudAorICAgICAgLS0gQ2hhbmdlZCAicHJpbnRmIiB0byAiZnByaW50ZihzdGRlcnIsICIgaW4gdGhlIHRlc3RiZW5jaC4uLiA7LSkKKyAgICAgIC0tIE9wdGltaXplZCB0aGUgR0NNIHRhYmxlIGNyZWF0aW9uLiAgT24gMUtCIHBhY2tldHMgW3dpdGgga2V5IHN3aXRjaGluZ10gdGhlIG5ldyBHQ00gaXMgMTIuN3ggZmFzdGVyIHRoYW4gYmVmb3JlLgorICAgICAgLS0gQ2hhbmdlZCBPSUQgcmVwcmVzZW50YXRpb24gZm9yIGhhc2hlcyB0byBiZSBqdXN0IGEgbGlzdCBvZiB1bnNpZ25lZCBsb25ncyAoc28geW91IGNhbiBjb21wYXJlIGFnYWluc3QgdGhlbSBuaWNlbHkgYWZ0ZXIgZGVjb2RpbmcgYSBzZXF1ZW5jZSkKKyAgICAgIC0tIEVDQyBjb2RlIG5vdyB1c2VzIE1vbnRnb21lcnkgcmVkdWN0aW9uIC4uLiBpdCdzIGV2ZW4gZmFzdGVyIFtFQ0MtMjU2IG1ha2Uga2V5IGRvd24gZnJvbSAzNy40TSB0byA0LjZNIGN5Y2xlcyBvbiBhbiBBdGhsb242NF0KKyAgICAgIC0tIEFkZGVkIFNIT1JUX0lOVEVHRVIgc28gdXNlcnMgY2FuIGVhc2lseSBzdG9yZSBERVIgZW5jb2RlZCBJTlRFR0VSIHR5cGVzIHdpdGhvdXQgdXNpbmcgdGhlIGJpZ251bSBtYXRoIGxpYnJhcnkKKyAgICAgIC0tIEZpeGVkIE9NQUMgY29kZSBzbyB0aGF0IHdpdGggTFRDX0ZBU1QgaXQgZG9lc24ndCByZXF1aXJlIHRoYXQgTFRDX0ZBU1RfVFlQRSBkaXZpZGVzIDE2IFtpdCBoYXMgdG8gZGl2aWRlIHRoZSBibG9jayBzaXplIGluc3RlYWRdCisgICAgICAtLSBFQ0Mga2V5IGV4cG9ydCBpcyBub3cgYSBzaW1wbGUgW2FuZCBkb2N1bWVudGVkXSBTRVFVRU5DRSwgdGhlICJlbmNyeXB0X2tleSIgYWxzbyB1c2VzIGEgbmV3IFNFUVVFTkNFIGZvcm1hdC4KKyAgICAgIC0tIFRoYW5rcyBnb2VzIHRvIHRoZSBmb2xsb3dpbmcgdGVzdGVycworICAgICAgICAgICAgTWljaGFlbCBCcm93biAgICAgICAgICAgICAtIFNvbGFyaXMgMTAvdVNQQVJDSUkKKyAgICAgICAgICAgIFJpY2hhcmQgT3V0ZXJicmlkZ2UgICAgICAgLSBNYWNPUworICAgICAgICAgICAgTWFydGluIENhcnBlbnRlciAgICAgICAgICAtIFNvbGFyaXMgOC91U1BBUkNJSSBbVGhhbmtzIGZvciBjbGVhbmluZyB1cCB0aGUgc2NyaXB0c10KKyAgICAgICAgICAgIEdyZWcgUm9zZSAgICAgICAgICAgICAgICAgLSAgLi4uIFN1bk9TIDUuOC9TUEFSQyBbLi4uIHdoYXQncyB3aXRoIHRoZSBTUEFSQ1M/XQorICAgICAgICAgICAgTWF0dCBKb2huc3RvbiAgICAgICAgICAgICAtIE1hY09TIFggIFtUaGFua3MgZm9yIHBvaW50aW5nIG91dCBHQ0MgNCBwcm9ibGVtcyB3aXRoIC1Pc10KKworQXByaWwgMTl0aCwgMjAwNQordjEuMDIKKyAgICAgIC0tIEFkZGVkIExUQ19URVNUIHN1cHBvcnQgdG8gZ2NtX3Rlc3QoKQorICAgICAgLS0gInB0L2N0IiBjYW4gbm93IGJlIE5VTEwgaW4gZ2NtX3Byb2Nlc3MoKSBpZiB5b3UgYXJlIHByb2Nlc3NpbmcgemVybyBieXRlcworICAgICAgLS0gT3B0aW1pemVkIEdDTSBieSByZW1vdmluZyB0aGUgImRvdWJsZSBjb3B5IiBoYW5kbGluZyBvZiB0aGUgcGxhaW50ZXh0L2FhZAorICAgICAgLS0gUmljaGFyZCBPdXRlcmJyaWRnZSBwb2ludGVkIG91dCB0aGF0IHg4Nl9wcm9mIHdvbid0IGJ1aWxkIG9uIE1BQ09TIGFuZCB0aGF0IHRoZSBtYW51YWwgCisgICAgICAgICBlcnJvbmVvdXNseSByZWZlcnMgdG8gIm15Y3J5cHQiIGFsbCBvdmVyIHRoZSBwbGFjZS4gIEZpeGVkLgorCitBcHJpbCAxN3RoLCAyMDA1Cit2MS4wMQorICAgICAgICoqIFNlY3VyZSBTY2llbmNlIENvcnBvcmF0aW9uIGhhcyBzdXBwb3J0ZWQgdGhpcyByZWxlYXNlIGN5Y2xlIGJ5IHNwb25zb3JpbmcgdGhlIGRldmVsb3BtZW50IHRpbWUgdGFrZW4uICBUaGVpciAKKyAgICAgICAgICBjb250aW51aW5nIHN1cHBvcnQgb2YgdGhpcyBwcm9qZWN0IGhhcyBoZWxwZWQgbWUgbWFpbnRhaW4gYSBzdGVhZHkgcGFjZSBpbiBvcmRlciB0byBrZWVwIExpYlRvbUNyeXB0IHVwIHRvIGRhdGUsCisgICAgICAgICAgc3RhYmxlIGFuZCBtb3JlIGVmZmljaWVudC4KKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIC0tIFVwZGF0ZWQgYmFzZTY0X2RlY29kZS5jIHNvIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMyAnPScgc2lnbnMgaXQgd291bGQgc3RvcCBwYXJzaW5nCisgICAgICAgLS0gTWVyZ2VkIGluIGxhdGVzdCBtcGkgdGhhdCBmaXhlZCBhIGZldyBidWdzIGhlcmUgYW5kIHRoZXJlCisgICAgICAgLS0gVXBkYXRlZCBPQUVQIGVuY29kZXIvZGVjb2RlciB0byBjYXRjaCB3aGVuIHRoZSBoYXNoIG91dHB1dCBpcyB0b28gbGFyZ2UKKyAgICAgICAgICBDbGVhbmVkIHVwIFBTUyBjb2RlIHRvbworICAgICAgIC0tIEFuZHkgQm9udG9mdCBmaXhlZCBhIGJ1ZyBpbiBteSBkZW1vcy90ZXN0cy9tYWtlZmlsZS5tc3ZjIC4uLiBzZWVtcyAiZHNhX3Rlc3QuYyIgaXNuJ3QgYW4gb2JqZWN0CisgICAgICAgICAgYWZ0ZXJhbGwuICBUaGFua3MuCisgICAgICAgLS0gTWFkZSBpbnZhbGlkIEVDQyBrZXkgc2l6ZXMgKGNvbmZpZ3VyYXRpb24pIG5vdCBoYXJkIGZhdWx0IHRoZSBwcm9ncmFtIChpdCByZXR1cm5zIGFuIGVycm9yIGNvZGUgbm93KQorICAgICAgIC0tIFNBRkVSIGhhcyBiZWVuIHJlLWVuYWJsZWQgYWZ0ZXIgSSB3YXMgcG9pbnRlZCB0byBodHRwOi8vd3d3LmNpcGhlcnNieXJpdHRlci5jb20vTkVXUzIvOTUwMzIzMDEuSFRNCisgICAgICAgICAgW01hcmsgS290aWFob10KKyAgICAgICAtLSBBZGRlZCBDQ00gbW9kZSB0byB0aGUgZW5jYXV0aCBsaXN0IChub3cgaGFzIEVBWCwgT0NCIGFuZCBDQ00sIGMnZXN0IHVuIHRyZW8gbWFnbmlmaXF1ZSEpCisgICAgICAgLS0gQWRkZWQgbWlzc2luZyBBU04uMSBoZWFkZXIgdG8gdGhlIFJTQSBrZXlzIC4uLiBvb3BzLi4uIG5vdyB0aGUgcnNhX2V4cG9ydC9pbXBvcnQgYXJlIEZVTExZIGNvbXBhdGlibGUKKyAgICAgICAgICB3aXRoIG90aGVyIGxpYnMgbGlrZSBPcGVuU1NMIChjb21tZW50OiAgVGVzdCB2ZWN0b3JzIHdvdWxkIGdvIGEgbG9uZyB3YXkgUlNBLi4uKQorICAgICAgIC0tIE1hbnVhbGx5IG1lcmdlZCBpbiBmaXggdG8gdGhlIHByaW1lX3JhbmRvbV9leCgpIExUTSBmdW5jdGlvbiB0aGF0IGVuc3VyZXMgdGhlIDJuZCBNU0IgaXMgc2V0IHByb3Blcmx5LiAgTm93CisgICAgICAgICAgV2hlbiB5b3Ugc2F5ICJJIHdhbnQgYSAxMDI0LzggYnl0ZSBSU0Ega2V5IiB0aGUgTVNCIGJpdCBvZiB0aGUgbW9kdWx1cyBpcyBzZXQgYXMgZXhwZWN0ZWQuICBOb3RlIEkgZ2VuZXJhbGx5IAorICAgICAgICAgIGRvbid0IHZpZXcgdGhpcyBhcyBhICJodWdlIGlzc3VlIiBidXQgaXQncyBqdXN0IG9uZSBsZXNzIG5pdCB0byB3b3JyeSBhYm91dC4gW0JyeWFuIEtsaXNjaF0KKyAgICAgICAtLSBBIG5ldyBDVlMgaGFzIGJlZW4gc2V0dXAgb24gbXkgQXRobG9uNjQgYm94Li4uIGlmIHlvdSB3YW50IGRldmVsb3BlciBhY2Nlc3Mgc2VuZCBtZSBhbiBlbWFpbCAoYW5kIGF0IHRoaXMgcG9pbnQgdGhlIGVtYWlsIHdvdWxkIGhhdmUgdG8gYmUgYXdlc29tZSkuCisgICAgICAgLS0gVXBkYXRlZCBBUEkgZm9yIEVDQiBhbmQgQ0JDIHNoZWxsIGNvZGUuICBOb3cgY2FuIHByb2Nlc3MgTiB3aG9sZSBibG9ja3MgaW4gb25lIGNhbGwgKGxpa2UgJERFSVRZIGludGVuZGVkKQorICAgICAgIC0tIEludHJvZHVjZWQgYSBuZXcgImhhcmR3YXJlIGFjY2VsIiBmcmFtZXdvcmsgdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVlZCB1cCBjaXBoZXIgRUNCLCBDQkMgYW5kIENUUiBtb2RlCisgICAgICAgICAgY2FsbHMuICBMYXRlciBvbiBkZXBlbmRlbnQgY29kZSAoZS5nLiBPTUFDLCBDQ00pIHdpbGwgYmUgcmUtd3JpdHRlbiB0byB1c2UgdGhlIGdlbmVyaWMgY2JjL2N0ciBmdW5jdGlvbnMuICBCdXQgbm93CisgICAgICAgICAgaWYgeW91IFtzYXldIGNhbGwgY3RyX2VuY3J5cHQoKSB3aXRoIGEgY2lwaGVyIGRlc2NyaXB0b3IgdGhhdCBoYXMgaGFyZHdhcmUgQ1RSIGl0IHdpbGwgYXV0b21hdGljYWxseQorICAgICAgICAgIGJlIHVzZWQgKGUuZy4gbm8gY29kZSByZXdyaXRlcykKKyAgICAgICAtLSBOb3cgc2hpcHMgd2l0aCAyMCUgbW9yZSBsb3ZlLgorICAgICAgIC0tIHg4Nl9wcm9mIG5vdyB1c2VzIEVDQiBzaGVsbCBjb2RlIChoaW50OiBhY2NlbGVyYXRvcnMpIGFuZCBvdXRwdXRzIGN5Y2xlcyBwZXIgQkxPQ0sgbm90IGJ5dGUuICBUaGlzIHdpbGwgbWFrZSBpdCBhIGJpdCAKKyAgICAgICAgICBlYXNpZXIgdG8gY29tcGFyZSBoYXJkd2FyZSB2cy4gc29mdHdhcmUgY2lwaGVyIGltcGxlbWVudGF0aW9ucy4gIEl0IGFsc28gZW1pdHMgdGltaW5ncyBmb3IgQ0JDIGFuZCBDVFIgbW9kZXMKKyAgICAgICAtLSBbUGV0ZXIgTGFEb3ddIGZpeGVkIGEgdHlwbyB3LnIudC4gWFJFQUxMT0MgbWFjcm8gKHNwZWxsaW5nIGNvdW50cyBraWRzISkKKyAgICAgICAtLSBGaXhlZCBidWcgd2l0aCBfX3g4Nl82NF9fIHdoZXJlIFJPTDY0L1JPUjY0IHdpdGggTFRDX05PX1JPTEMgd291bGQgYmUgdGhlIDMyLWJpdCB2ZXJzaW9ucyBpbnN0ZWFkLi4uCisgICAgICAgLS0gU2hpcHBpbmcgd2l0aCBwcmVsaW1pbmFyeSBHQ00gY29kZSAoZGlzYWJsZWQpLiAgSXQncyBidWdneSAoc3RhY2sgb3ZlcmZsb3cgaGlkZGVuIHNvbWV3aGVyZSkuICBJZiBhbnlvbmUgY2FuIHNwb3QgaXQgbGV0IG1lIGtub3cuCisgICAgICAgLS0gQWRkZWQgUGVsaWNhbiBNQUMgW2l0J3MgYW4gQUVTIGJhc2VkIGZhc3QgTUFDXSB0byB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgTUFDcworICAgICAgIC0tIEFkZGVkIExUQ19GQVNUIFthbmQgeW91IGNhbiBkaXNhYmxlIGJ5IGRlZmluaW5nIExUQ19OT19GQVNUXSBzbyB0aGF0IENCQyBhbmQgQ1RSIG1vZGUgWE9SIHdob2xlIHdvcmRzIFtlLmcuIDMyIG9yIDY0IGJpdHNdIGF0IGEgdGltZQorICAgICAgICAgIGluc3RlYWQgb2Ygb25lIGJ5dGUuICBPbiBteSBBTUQ2NCB0aGlzIHJlZHVjZWQgdGhlIG92ZXJoZWFkIGZvciBBRVMtMTI4LUNCQyBmcm9tIDQuNTYgY3ljbGVzL2J5dGUgdG8gYXJvdW5kIDEgY3ljbGUvYnl0ZS4gIFRoaXMgcmVxdWlyZXMKKyAgICAgICAgICB0aGF0IHlvdSBlaXRoZXIgYWxsb3cgdW5hbGlnbmVkIHJlYWQvd3JpdGVzIFtlLmcuIHg4Nl8zMi94ODZfNjRdIG9yIGFsaWduIGFsbCB5b3VyIGRhdGEuICBJdCB3b24ndCBnbyBvdXQgb2YgaXQncyB3YXkgdG8gZW5zdXJlIAorICAgICAgICAgIGFsaWduZWQgYWNjZXNzLiAgT25seSBlbmFibGVkIGZvciB4ODZfKiBwbGF0Zm9ybXMgYnkgZGVmYXVsdCBzaW5jZSB0aGV5IGFsbG93IHVuYWxpZ25lZCByZWFkL3dyaXRlcy4KKyAgICAgICAtLSBBZGRlZCBMVENfRkFTVCBzdXBwb3J0IHRvIFBNQUMgKGRyb3BzIHRoZSBjeWNsZS9ieXRlIGJ5IGFib3V0IDkgY3ljbGVzIG9uIG15IEFNRDY0KSBbbm90ZTogSSBsYXRlciByZXdyb3RlIHRoaXMgcHJpb3IgdG8gcmVsZWFzZV0KKyAgICAgICAtLSBVcGRhdGVkICJwcm9maWxlZCIgdGFyZ2V0IHRvIHdvcmsgd2l0aCB0aGUgbmV3IGRpcmVjdG9yeSBsYXlvdXQKKyAgICAgICAtLSBBZGRlZCBbZGVtbyBvbmx5XSBvcHRpbWl6ZWQgUkM1LUNUUiBjb2RlIHRvIHg4Nl9wcm9mIGRlbW8gdG8gc2hvdyBvZmYgaG93IHRvIG1ha2UgYW4gYWNjZWxlcmF0b3IKKyAgICAgICAgICBbVGhpcyBoYXMgYmVlbiByZW1vdmVkIHByaW9yIHRvIHJlbGVhc2UuLi4gSXQgbWF5IHJlLWFwcGVhciBsYXRlcl0KKyAgICAgICAtLSBBZGRlZCBDQ00gYWNlbGVyYXRvciBjYWxsYmFja3MgdG8gdGhlIGxpc3QgW25vdyBzdXBwb3J0cyBFQ0IsIENUUiwgQ0JDIGFuZCBub3cgQ0NNXS4KKyAgICAgICAtLSBBZGRlZCBjaGFwdGVyIHRvIG1hbnVhbCBhYm91dCBhY2NlbGVyYXRvcnMgKHlvdSBrbm93IHlvdSB3YW50IGl0KQorICAgICAgIC0tIEFkZGVkICJic3dhcCIgb3B0aW1pemF0aW9ucyB0byB4ODYgTE9BRC9TVE9SRSB3aXRoIGJpZyBlbmRpYW4uICBDYW4gYmUgZGlzYWJsZWQgYnkgZGVmaW5pbmcgTFRDX05PX0JTV0FQCisgICAgICAgLS0gTFRDX05PX0FTTSBpcyBub3cgdGhlIG9mZmljaWFsICJkaXNhYmxlIGFsbCBub24tcG9ydGFibGUgc3R1ZmYiIG1hY3JvLiAgV2hlbiBkZWZpbmVkIGl0IHdpbGwgbWFrZSB0aGUgY29kZSBlbmRpYW4tbmV1dHJhbCwKKyAgICAgICAgICBkaXNhYmxlIGFueSBmb3JtIG9mIEFTTSBhbmQgZGlzYWJsZSBMVENfRkFTVCBsb2FkL3N0b3Jlcy4gIEVzc2VudGlhbGx5IGJ1aWxkIHRoZSBsaWJyYXJ5IHdpdGggdGhpcyBkZWZpbmVkIGlmIHlvdSdyZSBoYXZpbmcKKyAgICAgICAgICB0cm91YmxlIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5IChvbGQgR0NDcyBmb3IgaW5zdGFuY2UgZGlzbGlrZSB0aGUgUk9MYyBtYWNybykKKyAgICAgICAtLSBBZGRlZCB0b21jcnlwdF9tYWMuaCBhbmQgbW92ZWQgTUFDL2VuY01BQyBmdW5jdGlvbnMgZnJvbSB0b21jcnlwdF9oYXNoLmggaW50byBpdAorICAgICAgIC0tIEFkZGVkICJkb25lIiBmdW5jdGlvbiB0byBjaXBoZXJzIGFuZCB0aGUgZml2ZSBjaGFpbmluZyBtb2RlcyBbYW5kIHRoaW5ncyBsaWtlIG9tYWMvcG1hYy9ldGNdCisgICAgICAgLS0gQ2hhbmdlZCBpbnN0YWxsIGdyb3VwIHRvICJ3aGVlbCIgZnJvbSAicm9vdCIuCisgICAgICAgLS0gUmVwbGFjZWQgLy8gY29tbWVudHMgd2l0aCAvKiovIHNvIGl0IHdpbGwgYnVpbGQgb24gb2xkZXIgVU5JWC1saWtlIHBsYXRmb3JtcworICAgICAgIC0tIHg4Nl9wcm9mIGJ1aWxkcyBhbmQgcnVucyB3aXRoIEludGVsQ0MgZmluZSBub3cgCisgICAgICAgLS0gQWRkZWQgInN0ZXN0IiBidWlsZCB0byBpbnRlbCBDQyB0byB0ZXN0IHN0YXRpYyBsaW5rZWQgZnJvbSB3aXRoaW4gdGhlIGRpciAoc28geW91IGRvbid0IGhhdmUgdG8gaW5zdGFsbCB0byB0ZXN0KQorICAgICAgIC0tIE1vdmVkIHRlc3RpbmcvYmVuY2htYXJrIGludG8gdGVzdHByb2YgZGlyZWN0b3J5IGFuZCBidWlsZCBpdCBhcyBwYXJ0IG9mIHRoZSBidWlsZC4gIE5vdyB5b3UgY2FuIGxpbmsgYWdhaW5zdCBsaWJ0b21jcnlwdF9wcm9mLmEgdG8gZ2V0IAorICAgICAgICAgIHRlc3RpbmcgaW5mbyAoaGludDogaGFyZHdhcmUgZGV2ZWxvcGVycyA7LSkgKQorICAgICAgIC0tIEFkZGVkIENDTSB0byB0dl9nZW4gCisgICAgICAgLS0gQWRkZWQgZGVtb3MgdG8gTVNWQyBtYWtlZmlsZQorICAgICAgIC0tIFJlbW92ZWQgLWZ1bnJvbGwtYWxsLWxvb3BzIGZyb20gR0NDIG1ha2VmaWxlIGFuZCByZXBsYWNlZCB3aXRoIC1mdW5yb2xsLWxvb3BzIHdoaWNoIGlzIGEgYml0IG1vcmUgc2FuZSAoUDQgYWluJ3QgZ290IG11Y2ggY2FjaGUgZm9yIHRoZSBJREFUQSkKKyAgICAgICAtLSBGaXhlZCBHQ00gcHJpb3IgdG8gcmVsZWFzZSBhbmQgcmUtZW5hYmxlZCBpdC4gIEl0IGhhcyBub3QgYmVlbiBvcHRpbWl6ZWQgYnV0IGl0IGRvZXMgY29uZm9ybSB3aGVuIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucy4KKyAgICAgICAtLSBJJ3ZlIHNpbmNlIG9wdGltaXplZCBHQ00gYW5kIENDTS4gIFRoZXkncmUgY2xvc2UgaW4gc3BlZWQgYnV0IEdDTSBpcyBtb3JlIGZsZXhpYmxlIGltaG8gKHRob3VnaCBFQVggaXMgbW9yZSBmbGV4aWJsZSB0aGFuIGJvdGgpCisgICAgICAgLS0gRm9yIGtpY2tzIEkgb3B0aW1pemVkIHRoZSBFQ0MgY29kZSB0byB1c2UgcHJvamVjdGl2ZSBwb2ludHMuICBHZXRzIGJldHdlZW4gMy4yMXggKFByZXNjb3R0IFA0KSB0byA0LjUzeCAoQU1ENjQpIHRpbWVzIGZhc3RlciB0aGFuIGJlZm9yZSBhdCAxNjAtYml0IGtleXMgYW5kIHRoZQorICAgICAgICAgIHNwZWVkdXAgZ3Jvd3MgYXMgdGhlIGtleXNpemUgZ3Jvd3MuICBCYXNpY2FsbHkgcmVtb3ZpbmcgbW9zdCBwcmFjdGljYWwgcmVhc29ucyB0byAibm90IHVzZSB0aGUgRUNDIGNvZGUiLiAgRW5qb3kuCisgICAgICAgLS0gQWRkZWQgTFRDX0ZBU1Qgc3VwcG9ydCB0byBPTUFDL1BNQUMgYW5kIGRvdWJsZWQgaXQncyBzcGVlZCBvbiBteSBhbWQ2NCBbZmFzdGVyIG9uIHRoZSBQNCB0b28gSSBndWVzc10KKyAgICAgICAtLSBBZGRlZCBHQ00gdG8gdHZfZ2VuCisgICAgICAgLS0gUmVtb3ZlZCAibWFrZWZpbGUuY3lnd2luX2RsbCIgYXMgaXQncyBub3QgcmVhbGx5IHVzZWQgYnkgYW55b25lIGFuZCBub3Qgd29ydGggdGhlIGVmZm9ydCAoaGVsbCBJIGhhcmRseSBtYWludGFpbiB0aGUgTVNWQyBtYWtlZmlsZXMgLi4uKQorICAgICAgIC0tIFVwZGF0ZWQgYSBmZXcgZmlsZXMgaW4gdGhlICJtaXNjIiBkaXJlY3RvcnkgdG8gaGF2ZSBjb3JyZWN0IEBmaWxlIGNvbW1lbnRzIGZvciBkb3h5Z2VuCisgICAgICAgLS0gUmVtb3ZlZCAicHJvZmlsZSIgdGFyZ2V0IHNpbmNlIGl0IHdhcyBzbG93ZXIgYW55d2F5cyAoZ28gZmlndXJlLi4uKQorCitEZWNlbWJlciAzMXN0LCAyMDA0Cit2MS4wMCAgCisgICAgICAgLS0gQWRkZWQgInIscyA9PSAwIiBjaGVjayB0byBkc2FfdmVyaWZ5X2hhc2goKQorICAgICAgIC0tIEFkZGVkICJtdWx0aSBibG9jayIgaGVscGVycyBmb3IgaGFzaCwgaG1hYywgcG1hYyBhbmQgb21hYyByb3V0aW5lcyBzbyB5b3UgY2FuIHByb2Nlc3MgbXVsdGlwbGUgbm9uLWFkamFjZW50CisgICAgICAgICAgYmxvY2tzIG9mIGRhdGEgd2l0aCBvbmUgY2FsbCAoYWRkZWQgZGVtb3MvbXVsdGkuYyB0byBtYWtlIHN1cmUgdGhleSB3b3JrKQorICAgICAgICAgIC0tIE5vdGUgdGhlc2UgYXJlIG5vdCBkb2N1bWVudGVkIGJ1dCB0aGV5IGRvIGhhdmUgZG94eWdlbiBjb21tZW50cyBpbnNpZGUgdGhlbQorICAgICAgICAgIC0tIEFsc28gSSBkb24ndCB1c2UgdGhlbSBpbiBvdGhlciBmdW5jdGlvbnMgKGxpa2UgcGtjc181XzIoKSkgYmVjYXVzZSBJIGRpZG4ndCBoYXZlIHRoZSB0aW1lLiAgSm9iIGZvciB0aGUgbmV3IExUQyBtYWludGFpbmVyIDstKQorICAgICAgIC0tIEFkZGVkIHR3ZWFrZWQgQW51YmlzIHRlc3QgdmVjdG9ycyBhbmQgbWFkZSBpdCBkZWZhdWx0ICh1bmRlZmluZWQgQU5VQklTX1RXRUFLIHRvIGdldCBvcmlnaW5hbCBBbnViaXMpCisgICAgICAgLS0gTWVyZ2VkIGluIGZpeCBmb3IgbXBfcHJpbWVfcmFuZG9tX2V4KCkgdG8gZGVhbCB3aXRoIE1TQiBhbmQgTFNCICJidWdzIgorICAgICAgIC0tIFJlbW92ZWQgdGltX2V4cHRtb2QoKSBjb21wbGV0ZWx5LCB1cGRhdGVkIHNldmVyYWwgUlNBIGZ1bmN0aW9ucyAobm90YWJseSB2MTUgYW5kIHRoZSBkZWNyeXB0L3ZlcmlmeSkgc28gdGhleSAKKyAgICAgICAgICBkb24ndCByZXF1aXJlIGEgcHJuZyBub3cKKyAgICAgICAtLSBUaGlzIHJlbGVhc2UgYnJvdWdodCB0byB5b3UgYnkgdGhlIGZpbmUgdHVuZXMgb2YgTWFjeSBHcmF5LiAgV2UgbWlzcyB5b3UuCisKK0RlY2VtYmVyIDIzcmQsIDIwMDQKK3YxLjAwcmMxCisgICAgICAgLS0gUmVuYW1lZCAibXljcnlwdF8qIiB0byAidG9tY3J5cHRfKiIgdG8gYmUgbW9yZSBzcGVjaWZpYyBhbmQgcHJvZmVzc2lvbmFsCisgICAgICAgICAgTm93IGp1c3QgaW5jbHVkZSAidG9tY3J5cHQuaCIgaW5zdGVhZCBvZiAibXljcnlwdC5oIiB0byBnZXQgTFRDIDstKQorICAgICAgIC0tIENsZWFuZWQgdXAgbWFrZWZpbGVzIHRvIGVuc3VyZSBhbGwgaGVhZGVycyBhcmUgY29ycmVjdGx5IGluc3RhbGxlZAorICAgICAgIC0tIEFkZGVkICJyb3RhdGUgYnkgY29uc3RhbnQiIG1hY3JvcyBmb3IgcG9ydGFibGUsIHg4Ni0zMiBhbmQgeDg2LTY0CisgICAgICAgICAgWW91IGNhbiBkaXNhYmxlIHRoaXMgbmV3IGNvZGUgd2l0aCBMVENfTk9fUk9MQyB3aGljaCBpcyB1c2VmdWwgZm9yIG9sZGVyIEdDQ3MKKyAgICAgICAtLSBDbGVhbmVkIHVwIGRldGVjdGlvbiBvZiB4ODYtNjQgc28gaXQgd29ya3MgZm9yIFJPTC9ST1IgbWFjcm9zCisgICAgICAgLS0gRml4ZWQgcnNhX2ltcG9ydCgpIHNvIHRoYXQgaXQgd291bGQgZGV0ZWN0IG11bHRpLXByaW1lIFJTQSBrZXlzIGFuZCBlcnJvciBhcHByb3ByaWF0ZWx5CisgICAgICAgLS0gU29ydGVkIHRoZSBzb3VyY2UgZmlsZXMgYnkgY2F0ZWdvcnkgYW5kIHVwZGF0ZWQgdGhlIG1ha2VmaWxlcyBhcHByb3ByaWF0ZWx5CisgICAgICAgLS0gQWRkZWQgTFRDX0RFUiBkZWZpbmUgc28geW91IGNhbiB0cmltIG91dCBERVIgY29kZSBpZiBub3QgcmVxdWlyZWQKKyAgICAgICAtLSBGaXhlZCB1cCBSU0EncyBkZWNyeXB0IGZ1bmN0aW9ucyBjaGFuZ2luZyAicmVzIiB0byAic3RhdCIgdG8gYmUgbW9yZSBpbiBzeW5jCisgICAgICAgICAgd2l0aCB0aGUgc2lnbmF0dXJlIHZhcmlhYmxlcyBub21lbmNsYXR1cmUuIChubyBjb2RlIGNoYW5nZSBqdXN0IHJlbmFtZWQgdGhlIGFyZ3VtZW50cykKKyAgICAgICAtLSBSZW1vdmVkIGFsbCBsYWJlbHMgc3RhcnRpbmcgd2l0aCBfXyBhbmQgcmVwbGFjZWQgd2l0aCBMQkxfIHRvIGF2b2lkIG5hbWVzcGFjZSBjb25mbGljdHMgKFJhbmR5IEhvd2FyZCkKKyAgICAgICAtLSBNZXJnZWQgaW4gTFRNIGZpeCB0byBtcF9wcmltZV9yYW5kb21fZXgoKSB3aGljaCB6YXAnZWQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBpZiB0aGUgYml0IHNpemUKKyAgICAgICAgICByZXF1ZXN0ZWQgd2FzIGEgbXVsdGlwbGUgb2YgZWlnaHQuCisgICAgICAgLS0gTWFkZSBSU0FfVElNSU5HIG9mZiBieSBkZWZhdWx0IGFzIGl0J3Mgbm90IHRlcnJpYmx5IHVzZWZ1bCBbYW5kIGxpa2VseSB0byBiZSBkZXByZWNhdGVkXQorICAgICAgIC0tIFJlbmFtZWQgU01BTExfQ09ERSwgQ0xFQU5fU1RBQ0sgYW5kIE5PX0ZJTEUgdG8gaGF2ZSBhIExUQ18gcHJlZml4IHRvIGF2b2lkIG5hbWVzcGFjZSBjb2xsaXNpb25zCisgICAgICAgICAgd2l0aCBvdGhlciBwcm9ncmFtcy4gIGUuZy4gU01BTExfQ09ERSA9PiBMVENfU01BTExfQ09ERQorICAgICAgIC0tIFplZCBTaGF3IHBvaW50ZWQgb3V0IHRoYXQgb24gY2VydGFpbiBzeXN0ZW1zIGluc3RhbGxpbmcgbGlicyBhcyAicm9vdCIgaXNuJ3QgcG9zc2libGUgYXMgdGhlIHN1cGVyLXVzZXIKKyAgICAgICAgICBpcyBub3Qgcm9vdC4gIE5vdyB0aGUgbWFrZWZpbGVzIGFsbG93IHRoaXMgdG8gYmUgY2hhbmdlZCBlYXNpbHkuCisgICAgICAgLS0gUmVuYW1lZCAic3RydWN0IF8qX2Rlc2NyaXB0b3IiIHRvICJzdHJ1Y3QgbHRjXypfZGVzY3JpcHRvciIgdG8gYXZvaWQgdXNpbmcgYSBsZWFkaW5nIF8KKyAgICAgICAgICBBbHNvIHJlbmFtZWQgX0FSR0NISyB0byBMVENfQVJHQ0hLCisgICAgICAgLS0gWmVkIFNoYXcgcG9pbnRlZCBvdXQgdGhhdCBJIHN0aWxsIGRlZmluZWQgdGhlIHBybmcgc3RydWN0cyBpbiB0b21jcnlwdF9wcm5nLmggZXZlbiBpZiB0aGV5IAorICAgICAgICAgIHdlcmVuJ3QgZGVmaW5lZC4gIFRoaXMgbWFkZSB1bmRlZidpbmcgRk9SVFVOQSBicmVhayB0aGUgYnVpbGQuCisgICAgICAgLS0gQWRkZWQgTFRDX05PX0FTTSB0byBkaXNhYmxlIGlubGluZSBhc20gbWFjcm9zIFtST0wvUk9SL2V0Y10KKyAgICAgICAtLSBDaGFuZ2VkIFJTQSBkZWNyeXB0IGZ1bmN0aW9ucyB0byBjaGFuZ2UgdGhlIG91dHB1dCBsZW5ndGggdmFyaWFibGUgbmFtZSBmcm9tICJrZXlsZW4iIHRvICJvdXRsZW4iIHRvIG1ha2UgCisgICAgICAgICAgaXQgbW9yZSBjb25zaXN0ZW50LgorICAgICAgIC0tIEFkZGVkIHRoZSA2NC1iaXQgS2hhemFkIGJsb2NrIGNpcGhlciBbTkVTU0lFXQorICAgICAgIC0tIEFkZGVkIHRoZSAxMjgtYml0IEFudWJpcyBibG9jayBjaXBoZXIgW3dpdGgga2V5IHN1cHBvcnQgZm9yIDEyOC4uLjMyMCBiaXQga2V5c10gW05FU1NJRV0KKyAgICAgICAtLSBDaGFuZ2VzIHRvIHNldmVyYWwgTUFDIGZ1bmN0aW9ucyB0byByZW5hbWUgaW5wdXQgYXJndW1lbnRzIHRvIG1vcmUgc2Vuc2libGUgbmFtZXMKKyAgICAgICAtLSBSZW1vdmVkIEZBU1RfUEsgc3VwcG9ydCBmcm9tIGRoX3N5cy5jCisgICAgICAgLS0gRGVjbGFyZWQgZGVza2V5KCkgZnJvbSBkZXMuYyBhcyBzdGF0aWMgaW5zdGVhZCBvZiBhIGdsb2JhbAorICAgICAgIC0tIEFkZGVkIHByZXR0eSBtdWNoIGFsbCBwcmFjdGljYWwgR0NDIHdhcm5pbmcgdGVzdHMgdG8gdGhlIEdDQyBbcmVsYXRlZF0gbWFrZWZpbGVzLiAgVGhlc2UgYWRkaXRpb25hbAorICAgICAgICAgIHdhcm5pbmdzIGNhbiBlYXNpbHkgYmUgZGlzYWJsZWQgZm9yIHRob3NlIHdpdGggb2xkZXIgY29waWVzIG9mIEdDQyBbb3IgZXZlbiBub24gR05VIGNjJ3NdCisgICAgICAgLS0gQWRkZWQgZG94eWdlbiBAIHRhZ3MgdG8gdGhlIGNvZGUuLi4gIHBoZXcgdGhhdCB3YXMgYSBoZWxsIG9mIGEgbG90IG9mIFtyZXBldGl0aXZlXSB3b3JrCisgICAgICAgLS0gQWxzbyBhZGRlZCBwcmUtY29uZmlndXJlZCBEb3h5Z2VuIHNjcmlwdC4KKyAgICAgICAtLSBDbGVhbmVkIHVwIHF1aXRlIGEgZmV3IGZ1bmN0aW9ucyBbY2lwaGVycywgcGssIGV0Y10gdG8gbWFrZSB0aGUgcGFyYW1ldGVycyBuYW1pbmcgc3R5bGUgY29uc2lzdGVudAorICAgICAgICAgIEUuZy4gY2lwaGVycyBrZXlzIGFyZSBjYWxsZWQgInNrZXkiIGNvbnNpc3RlbnRseSBub3cuICBUaGUgaW5wdXQgdG8gUEsgZW5jcnlwdGlvbiBpcyBjYWxsZWQgImluIiwgZXRjLgorICAgICAgICAgIFRoZXNlIGNoYW5nZXMgcmVxdWlyZSBubyBjb2RlIGNoYW5nZXMgb24gdGhlIGJlaGFsZiBvZiBkZXZlbG9wZXJzIGZvcnR1bmF0ZWx5CisgICAgICAgLS0gU3RhcnRlZCBhIFNBRkVSKyBvcHRpbWl6ZXIgW2RvZXMgZW5jcnlwdCBvbmx5XSB3aGljaCBzaGF2ZXMgYSBnb29kIDMwIG9yIHNvIGN5Y2xlcy9ieXRlIG9uIG15IEFNRDY0CisgICAgICAgICAgYXQgYW4gZXhwZW5zZSBvZiBodWdlIGNvZGUuICBJdCdzIGluIG5vdGVzL2V0Yy9zYWZlcnBfb3B0aW1pemVyLmMKKyAgICAgICAtLSBEU0Egc2lnbi92ZXJpZnkgbm93IHVzZXMgREVSIGVuY29kZWQgb3V0cHV0L2lucHV0cyBhbmQgbm8gTFRDIHN0eWxlIGhlYWRlcnMuICAKKyAgICAgICAtLSBNYXR0IEpvaG5zdG9uIGZvdW5kIGEgbWlzc2luZyBzZW1pLWNvbG9uIGluIG1wX2V4cHRtb2QoKS4gIEZpeCBoYXMgYmVlbiBtZXJnZWQgaW4uICAKKworT2N0b2JlciAyOXRoLCAyMDA0Cit2MC45OSAgLS0gTWVyZ2VkIGluIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBMVE0gd2hpY2ggaW5jbHVkZXMgYWxsIG9mIHRoZSByZWNlbnQgYnVnIGZpeGVzCisgICAgICAgLS0gRGVwcmVjYXRlZCBMVE1TU0UgYW5kIHJlbW92ZWQgaXQgKHRvIGJlIHJlcGxhY2VkIHdpdGggVEZNIGxhdGVyIG9uKQorICAgICAgIC0tIFN0ZWZhbiBBcmVudHogcG9pbnRlZCBvdXQgdGhhdCBtcF9zX3JtYXAgc2hvdWxkIGJlIGV4dGVybgorICAgICAgIC0tIEtyaXN0aWFuIEdq+HN0ZWVuIHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgYXJlIHR5cG9zIGluIHRoZSAKKyAgICAgICAgICAidGVzdCIgbWFrZWZpbGUgYW5kIG1pbm9yIGlzc3VlcyBpbiBZYXJyb3cgYW5kIFNvYmVyIFtqdXN0IGNvc21ldGljcyByZWFsbHldCisgICAgICAgLS0gTWF0dGhldyBQLiBDYXNoZG9sbGFyIHBvaW50ZWQgb3V0IHRoYXQgImV4cG9ydCIgaXMgYSBDKysga2V5d29yZCAKKyAgICAgICAgICBzbyBjaGFuZ2VkIHRoZSBQUk5HIGFwaSB0byB1c2UgInBleHBvcnQiIGFuZCAicGltcG9ydCIKKyAgICAgICAtLSBVcGRhdGVkICJoYXNoc3VtIiBkZW1vIHNvIGl0IGJ1aWxkcyA7LSkKKyAgICAgICAtLSBBZGRlZCBhdXRvbWF0aWMgc3VwcG9ydCBmb3IgeDg2LTY0ICh3aWxsIGNvbmZpZ3VyZSBmb3IgNjQtYml0IGxpdHRsZSBlbmRpYW4gYXV0b21hZ2ljYWxseSkKKyAgICAgICAtLSBaaGkgQ2hlbiBwb2ludGVkIG91dCBhIGJ1ZyBpbiByc2FfZXhwdG1vZCB3aGljaCB3b3VsZCBsZWFrIG1lbW9yeSBvbiBlcnJvci4gCisgICAgICAgLS0gTWFkZSBoYXNoIGZ1bmN0aW9ucyAiaW5pdCIgcmV0dXJuIGFuIGludC4gIHNsaWdodCBjaGFuZ2UgdG8gQVBJIDstKAorICAgICAgIC0tIEFkZGVkICJDSEMiIG1vZGUgd2hpY2ggdHVybnMgYW55IGNpcGhlciBpbnRvIGEgaGFzaCB0aGUgb3RoZXIgTFRDIGZ1bmN0aW9ucyBjYW4gdXNlCisgICAgICAgLS0gQWRkZWQgQ0hDIG1vZGUgc3R1ZmYgdG8gZGVtb3Mgc3VjaCBhcyB0dl9nZW4gYW5kIGhhc2hzdW0KKyAgICAgICAtLSBBZGRlZCAibWFrZWZpbGUuc2hhcmVkIiB3aGljaCBidWlsZHMgYW5kIGluc3RhbGxzIHNoYXJlZC9zdGF0aWMgb2JqZWN0IGNvcGllcworICAgICAgICAgIG9mIHRoZSBsaWJyYXJ5LgorICAgICAgIC0tIEFkZGVkIERFUiBmb3IgYmlnbnVtIHN1cHBvcnQgCisgICAgICAgLS0gUlNBIGlzIG5vdyBmdWxseSBqb3kuICByc2FfZXhwb3J0L3JzYV9pbXBvcnQgdXNlIFBLQ1MgIzEgZW5jb2RpbmdzIGFuZCBzaG91bGQgYmUgCisgICAgICAgICAgY29tcGF0aWJsZSB3aXRoIG90aGVyIGNyeXB0byBsaWJzIHRoYXQgdXNlIHRoZSBmb3JtYXQuCisgICAgICAgLS0gQWRkZWQgc3VwcG9ydCBmb3IgeDg2LTY0IGZvciB0aGUgUk9ML1JPUiBtYWNyb3MgCisgICAgICAgLS0gQ2hhbmdlZCB0aGUgRExMIGFuZCBTTyBtYWtlZmlsZXMgdG8gb3B0aW1pemUgZm9yIHNwZWVkLCBjb21tZW50ZWQgU01BTExfQ09ERSBpbgorICAgICAgICAgIG15Y3J5cHRfY3VzdG9tLmggYW5kIGFkZGVkIC1EU01BTExfQ09ERSB0byB0aGUgZGVmYXVsdCBtYWtlZmlsZQorICAgICAgIC0tIFVwZGF0ZWQgcHJpbWFsaXR5IHRlc3RpbmcgY29kZSBzbyBpdCBkb2VzIGEgbWluaW11bSBvZiA1IHRlc3RzIFtvZiBNaWxsZXItUmFiaW5dCisgICAgICAgICAgKEFGQUlLIG5vdCBhIHNlY3VyaXR5IGZpeCwganVzdCB3YXJtIGZ1enppZXMpCisgICAgICAgLS0gTWlub3IgdXBkYXRlcyB0byB0aGUgT01BQyBjb2RlIChhZGRpdGlvbmFsIF9fQVJHQ0hLIGFuZCByZW1vdmVkIHByaW50ZiBmcm9tIG9tYWNfdGVzdC4uLiBvb3BzISkKKyAgICAgICAtLSBVcGRhdGUgYnVpbGQgYW5kIGNvbmZpZ3VyYXRpb24gaW5mbyB3aGljaCB3YXMgcmVhbGx5IHJlYWxseSByZWFsbHkgb3V0IG9mIGRhdGUuICAoQ2hhcHRlciAxNCkKKyAgICAgICArKyBNaW5vciB1cGRhdGUsIHN3aXRjaCBSU0EgdG8gdXNlIHRoZSBQS0NTIHN0eWxlIENSVAorCitBdWd1c3QgNnRoLCAyMDA0Cit2MC45OCAgLS0gVXBkYXRlIHRvIGhtYWNfaW5pdCB0byBmcmVlIGFsbCBhbGxvY2F0ZWQgbWVtb3J5IG9uIGVycm9yCisgICAgICAgLS0gVXBkYXRlIHRvIFBSTkcgQVBJIHRvIGZpeCBpbXBvcnQvZXhwb3J0IGZ1bmN0aW9ucyBvZiBGb3J0dW5hIGFuZCBZYXJyb3cKKyAgICAgICAtLSBBZGRlZCB0ZXN0IGZ1bmN0aW9ucyB0byBQUk5HIGFwaSwgUkM0IG5vdyBjb25mb3JtcyA7LSkgW3dhcyBhIG1pbm9yIGlzc3VlXQorICAgICAgIC0tIEFkZGVkIHRoZSBTT0JFUi0xMjggUFJORyBiYXNlZCBvZmYgb2YgY29kZSBkb25hdGVkIGJ5IEdyZWcgUm9zZS4KKyAgICAgICAtLSBBZGRlZCBUZWNoIE5vdGUgIzQgW25vdGVzL3RlY2gwMDA0LnR4dF0gCisgICAgICAgLS0gQ2hhbmdlZCBSQzQgYmFjayBbZHVlIHRvIHJlcXVlc3RdLiAgSXQgd2lsbCBub3cgWE9SIHRoZSBvdXRwdXQgc28geW91IGNhbiB1c2UgaXQgbGlrZSAKKyAgICAgICAgICBhIHN0cmVhbSBjaXBoZXIgZWFzaWx5LgorICAgICAgIC0tIFVwZGF0ZSBGb3J0dW5hJ3MgZXhwb3J0KCkgdG8gZW1pdCBhIGhhc2ggb2YgZWFjaCBwb29sLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBhY2N1bXVsYXRlZCAKKyAgICAgICAgICBlbnRyb3B5IHRoYXQgd2FzIHNwcmVhZCBvdmVyIGFsbCB0aGUgcG9vbHMgaXNuJ3QgZW50aXJlbHkgbG9zdCB3aGVuIHlvdSBleHBvcnQvaW1wb3J0LgorICAgICAgIC0tIFpoaSBDaGVuIHN1Z2dlc3RlZCBhIGNvbW1lbnQgZm9yIHJzYV9lbmNyeXB0X2tleSgpIHRvIGxldCB1c2VycyBrbm93IFtlYXNpbHldIHRoYXQgaXQgd2FzCisgICAgICAgICAgUEtDUyAjMSB2Mi4wIHBhZGRpbmcuICAodXBkYXRlZCBvdGhlciByc2FfKiBmdW5jdGlvbnMpCisgICAgICAgLS0gQ2xlYW5lZCB1cCBOb2VrZW9uIHRvIHJlbW92ZSB1bnJvbGxpbmcgW3dhc24ndCByZXF1aXJlZCwgd2FzIG1lc3N5IGFuZCBhY3R1YWxseSBzbG93ZXIgd2l0aCBHQ0MvSUNDXQorICAgICAgIC0tIFVwZGF0ZWQgUkM0IHNvIHRoYXQgd2hlbiB5b3UgZmVlZCBpdCA+MjU2IGJ5dGVzIG9mIGVudHJvcHkgaXQgcXVpZXRseSBpZ25vcmVzIGFkZGl0aW9uYWwKKyAgICAgICAgICBieXRlcy4gIEFsc28gcmVtb3ZlZCB0aGUgJSBmcm9tIHRoZSBrZXkgc2V0dXAgdG8gc3BlZWQgaXQgdXAgYSBiaXQuCisgICAgICAgLS0gQWRkZWQgY2lwaGVyL2hhc2gvcHJuZyB0ZXN0cyB0byB4ODZfcHJvZiB0byBoZWxwIGNhdGNoIGJ1Z3Mgd2hpbGUgdGVzdGluZworICAgICAgIC0tIE1hZGUgdGhlIFBSTkcgImRvbmUiIHJldHVybiBpbnQsIGZpeGVkIHNwcm5nX2RvbmUgdG8gbm90IHJlcXVpcmUgcHJuZyogdG8gYmUgbm9uLW51bGwKKyAgICAgICAtLSBTcHJ1Y2VkIHVwIG15Y3J5cHRfY3VzdG9tLmggdG8gdHJhcCBtb3JlIGVycm9ycyBhbmQgYWxzbyBoZWxwIHByZXZlbnQgTFRNU1NFIGZyb20gYmVpbmcgZGVmaW5lZAorICAgICAgICAgIG9uIG5vbi1pMzg2IHBsYXRmb3JtcyBieSBhY2NpZGVudC4KKyAgICAgICAtLSBBZGRlZCBSU0EvRUNDL0RIIHNwZWVkIHRlc3RzIHRvIHg4Nl9wcm9mIGFuZCBjbGVhbmVkIGl0IHVwIHRvIGJ1aWxkIHdpdGggemVybyB3YXJuaW5ncworICAgICAgIC0tIENoYW5nZWQgRm9ydHVuYSB0byBjb3VudCBvbmx5IGVudHJvcHkgW25vdCB0aGUgMiBieXRlIGhlYWRlcl0gYWRkZWQgdG8gcG9vbFswXSBpbnRvIHRoZSAKKyAgICAgICAgICByZXNlZWQgbWVjaGFuaXNtLiAgCisgICAgICAgLS0gQWRkZWQgImV4cG9ydF9zaXplIiBtZW1iZXIgdG8gcHJuZ19kZXNjcmlwdG9yIHRhYmxlcyBzbyB5b3UgY2FuIGtub3cgaW4gYWR2YW5jZSB0aGUgc2l6ZSBvZiAKKyAgICAgICAgICB0aGUgZXhwb3J0ZWQgc3RhdGUgZm9yIGFueSBnaXZlbiBQUk5HLiAgCisgICAgICAgLS0gUG9ydGVkIG92ZXIgcGF0Y2ggb24gTFRNIDAuMzAgW25vdCByZWFkeSB0byByZWxlYXNlIExUTSAwLjMxXSB0aGF0IGZpeGVzIGJ1ZyBpbiBtcF9tdWwoKS9tcF9kaXYoKQorICAgICAgICAgIHRoYXQgdXNlZCB0byByZXN1bHQgaW4gbmVnYXRpdmUgemVyb2VzIHdoZW4geW91IG11bHRpcGxpZWQgemVybyBieSBhIG5lZ2F0aXZlIGludGVnZXIuICAKKyAgICAgICAgICAocGF0Y2ggZHVlIHRvICJXb2xmZ2FuZyBFaHJoYXJkdCIgPFdvbGZnYW5nLkVocmhhcmR0QG11bmljaC5uZXRzdXJmLmRlPikKKyAgICAgICAtLSBGaXhlZCByc2FfKmRlY3J5cHRfa2V5KCkgYW5kIHJzYV8qdmVyaWZ5X2hhc2goKSB0byBkZWZhdWx0IHRvIGludmFsaWQgInN0YXQiIG9yICJyZXMiLiAgVGhpcyB3YXkKKyAgICAgICAgICBpZiBhbnkgb2YgdGhlIGhpZ2hlciBsZXZlbCBmdW5jdGlvbnMgZmFpbCBbYmVmb3JlIHlvdSBnZXQgdG8gdGhlIHBhZGRpbmddIHRoZSByZXN1bHQgd2lsbCBiZSBpbgorICAgICAgICAgIGEga25vd24gc3RhdGVdLiAgQXBwbGllZCB0byBib3RoIHYyIGFuZCB2MS41IHBhZGRpbmcgaGVscGVycy4KKyAgICAgICAtLSBBZGRlZCBNQUNzIHRvIHg4Nl9wcm9mCisgICAgICAgLS0gRml4ZWQgdXAgIndhcm5pbmdzIiBpbiB4ODZfcHJvZiBhbmQgdHZfZ2VuCisgICAgICAgLS0gQWRkZWQgYSAicHJvZmlsZWQiIHRhcmdldCBiYWNrIFtmb3IgR0NDIDMuNCBhbmQgSUNDIHY4XS4gIERvZXNuJ3Qgc2VlbSB0byBoZWxwIGJ1dCBtaWdodCBiZSB3b3J0aAorICAgICAgICAgIHRpbmtlcmluZyB3aXRoLgorICAgICAgIC0tIEJlZWZlZCB1cCBsb2FkL3N0b3JlIHRlc3QgaW4gZGVtb3MvdGVzdAorCisgICAgICAgKysgTmV3IG5vdGUsIGluIG9yZGVyIHRvIHVzZSB0aGUgb3B0aW1pemVkIExPQUQvU1RPUkUgbWFjcm9zIHlvdXIgcGxhdGZvcm0KKyAgICAgICAgICBtdXN0IHN1cHBvcnQgdW5hbGlnbmVkIDMyLzY0IGJpdCBsb2FkL3N0b3Jlcy4gIFRoZSB4ODZzIHN1cHBvcnQgdGhpcworICAgICAgICAgIGJ1dCBzb21lIFtBUk0gZm9yIGluc3RhbmNlXSBkbyBub3QuICBJZiB5b3VyIHBsYXRmb3JtIGNhbm5vdCBwZXJmb3JtCisgICAgICAgICAgdW5hbGlnbmVkIG9wZXJhdGlvbnMgeW91IG11c3QgdXNlIHRoZSBlbmRpYW4gbmV1dHJhbCBjb2RlIHdoaWNoIGlzIHNhZmUgZm9yIAorICAgICAgICAgIGFueSBzb3J0IG9mIHBsYXRmb3JtLgorCitKdWx5IDIzcmQsIDIwMDQKK3YwLjk3YiAtLSBBZGRlZCBQS0NTICMxIHYxLjUgUlNBIGVuY3J5cHQvc2lnbiBoZWxwZXJzIChsaWtlIHJzYV9zaWduX2hhc2gsIGV0Yy4uLikKKyAgICAgICAtLSBBZGRlZCBtaXNzaW5nIHBybmcgY2hlY2sgdG8gcnNhX2RlY3J5cHRfa2V5KCkgW25vdCBjcml0aWNhbCBhcyBJIGRvbid0IHVzZSAKKyAgICAgICAgICBkZXNjcmlwdG9ycyBkaXJlY3RseSBpbiB0aGF0IGZ1bmN0aW9uXQorICAgICAgIC0tIE1lcmdlZCBpbiBMVE0tU1NFLCBkZWZpbmUgTFRNU1NFIGJlZm9yZSB5b3UgYnVpbGQgYW5kIHlvdSB3aWxsIGdldCBTU0UyIG9wdGltaXplZCBtYXRoIDstKQorICAgICAgICAgIChyb3VnaGx5IDN4IGZhc3RlciBvbiBhIFA0IE5vcnRod29vZCkuICBCeSBkZWZhdWx0IGl0IHdpbGwgY29tcGlsZSBhcyBJU08gQyBwb3J0YWJsZQorICAgICAgICAgIGNvZGUgKHdoZW4gTFRNU1NFIGlzIHVuZGVmaW5lZCkuCisgICAgICAgLS0gRml4ZWQgYnVnIGluIGx0Y190b21tYXRoLmggd2hlcmUgSSBoYWQgdGhlIGthcmEvdG9vbSBjdXRvZmZzIG5vdCBtYXJrZWQgYXMgYGBleHRlcm4nJworICAgICAgICAgIFRoYW5rcyB0byAiU3RlZmFuIEFyZW50eiIgPHN0ZWZhbiBhdCBvcmdhbmljbmV0d29yay5uZXQ+CisgICAgICAgLS0gU3RldmVuIERha2UgPHNjZEBicm9rZWQub3JnPiBhbmQgUmljaGFyZCBBbWFja2VyIDxyYW1hY2tlckB5YWhvby5jb20+IHN1Ym1pdHRlZCBwYXRjaGVzIHRvIAorICAgICAgICAgIGZpeCBwa2NzXzVfMigpLiAgSXQgbm93IG1hdGNoZXMgdGhlIG91dHB1dCBvZiBhbm90aGVyIGNyeXB0byBsaWJyYXJ5LiAgV2hvb3BzLi4uIGhlaGVoZQorICAgICAgIC0tIFVwZGF0ZWQgUFJORyBhcGkuICBBZGRlZCBGb3J0dW5hIFBSTkcgdG8gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIFBSTkdzCisgICAgICAgLS0gRml4ZWQgdXAgdGhlIGRlc2NyaXB0b3IgdGFibGVzIHNpbmNlIGdsb2JhbHMgYXJlIGF1dG9tYXRpY2FsbHkgemVybydlZCBvbiBzdGFydHVwLgorICAgICAgIC0tIENoYW5nZWQgUkM0IHRvIHN0b3JlIGl0J3Mgb3V0cHV0LiAgSWYgeW91IHdhbnQgdG8gZW5jcnlwdCB3aXRoIFJDNAorICAgICAgICAgIHlvdSdsbCBoYXZlIHRvIGRvIHRoZSBYT1IgeW91cnNlbGYuCisgICAgICAgLS0gRml4ZWQgYnVmZmVyIG92ZXJmbG93cy9vdmVycnVucyBpbiB0aGUgSE1BQyBjb2RlLiAgCisKKyAgICAgICArKyBBUEkgY2hhbmdlIGZvciB0aGUgUFJOR3MgdGhlcmUgbm93IGlzIGEgZG9uZSgpIGZ1bmN0aW9uIHBlciBQUk5HLiAgWW91CisgICAgICAgICAgc2hvdWxkIGNhbGwgaXQgd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBhIHBybmcgc3RhdGUuICBTbyBmYXIgaXQncworICAgICAgICAgIG5vdCBhYnNvbHV0ZWx5IHJlcXVpcmVkICh3b24ndCBjYXVzZSBwcm9ibGVtcykgYnV0IGlzIGEgZ29vZCBpZGVhIHRvCisgICAgICAgICAgc3RhcnQuICAKKworCitKdW5lIDIzcmQsIDIwMDQKK3YwLjk3YSArKyBGaXhlZCBzZXZlcmFsIHBvdGVudGlhbGx5IGNyaXBwbGluZyBidWdzLi4uIFtyZWFkIG9uXQorICAgICAgIC0tIEZpeGVkIGJ1ZyBpbiBPQUVQIGRlY29kZXIgdGhhdCB3b3VsZCBpbmNvcnJlY3RseSByZXBvcnQgCisgICAgICAgICAgYnVmZmVyIG92ZXJmbG93cy4gW1poaSBDaGVuXQorICAgICAgIC0tIEZpeGVkIGhlYWRlcnMgd2hpY2ggaGFkIHZhcmlvdXMgQysrIG1pc3NpbmcgW2V4dGVybiAiQyJdJ3MKKyAgICAgICAtLSBBZGRlZCAiZXh0ZXJuIiB0byBzaGEzODRfZGVzYyBkZXNjcmlwdG9yIHdoaWNoIEkgcmVtb3ZlZCBieSBtaXN0YWtlCisgICAgICAgLS0gRml4ZWQgYnVncyBpbiBFTkRJQU5fQklHIG1hY3JvcyB1c2luZyB0aGUgd3JvbmcgYnl0ZSBvcmRlciBbTWF0dCBKb2huc3Rvbl0KKyAgICAgICAtLSBVcGRhdGVkIHRpZ2VyLmMgYW5kIGRlcy5jIHRvIG5vdCBzaGFkb3cgInJvdW5kIiB3aGljaCBpcyBpbnRyaW5zaWMgb24KKyAgICAgICAgICBzb21lIEMgY29tcGlsZXJzLgorICAgICAgIC0tIFVwZGF0ZWQgZGVtb3MvdGVzdC9yc2FfdGVzdC5jIHRvIHRlc3QgdGhlIFJTQSBmdW5jdGlvbmFsaXR5IGJldHRlcgorICAgICAgICsrIFRoaXMgdXBkYXRlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIEdDQyBbdjMuMy4zXSwgSUNDIFt2OF0gYW5kIE1TVkMgW3Y2K1NQNl0gCisgICAgICAgICAgYWxsIG9uIGEgeDg2IFA0ICBbR0NDL0lDQyB0ZXN0ZWQgaW4gR2VudG9vIExpbnV4LCBNU1ZDIGluIFdpblhQXQorICAgICAgICsrIE91dGNvbWU6IFRoZSBidWcgWmhpIENoZW4gcG9pbnRlZCBvdXQgaGFzIGJlZW4gZml4ZWQuICBTbyBoYXZlIHRoZSBidWdzCisgICAgICAgICAgdGhhdCBNYXR0IEpvaG5zdG9uIGZvdW5kLiAgCisKK0p1bmUgMTl0aCwgMjAwNAordjAuOTcgIC0tIFJlbW92ZWQgc3B1cmlvdXMgdW51c2VkIGZpbGVzIFthcnJnIV0KKyAgICAgICAtLSBQYXRjaGVkIGJ1ZmZlciBvdmVyZmxvdyBpbiB0aW1fZXhwdG1vZCgpCisgICAgICAgLS0gRml4ZWQgYnVmZmVyIG92ZXJydW4gYnVnIGluIHBrY3NfMV92MTVfZXNfZGVjb2RlKCkKKyAgICAgICAtLSBSZWR1Y2VkIHN0YWNrIHVzYWdlIGluIFBLQ1MgIzEgdjIuMCBwYWRkaW5nIGZ1bmN0aW9ucyAoYnkgc2V2ZXJhbCBLQnMpCisgICAgICAgLS0gUmVtb3ZlZCB1c2VsZXNzIGV4dGVybidzIHRoYXQgd2VyZSBhbiBhcnRpZmFjdCBmcm9tIHRoZSBwcm9qZWN0IHN0YXJ0Li4uIDstKQorICAgICAgIC0tIFJlcGxhY2VkIG1lbWNweS9tZW1zZXQgd2l0aCBYTUVNQ1BZIGFuZCBYTUVNU0VUIGZvciBncmVhdGVyIGZsZXhpYmlsaXR5CisgICAgICAgLS0gZml4ZWQgYnVncyBpbiBobWFjX2RvbmUoKS9obWFjX2luaXQoKS9bdmFyaW91cyBvdGhlcnMoKV0gd2hlcmUgSSBkaWRuJ3QgdHJhcCBlcnJvcnMgCisgICAgICAgLS0gUmVkdWNlZCBzdGFjayB1c2FnZSBpbiBPTUFDL1BNQUMvSE1BQy9FQVgvT0NCL1BLQ1MjNSBieSBtYWxsb2NpbmcgYW55IHNpZ25pZmljYW50IHNpemVkCisgICAgICAgICAgYXJyYXlzIChlLmcuID4gMTAwIGJ5dGVzIG9yIHNvKS4gIE9ubHkgaW4gbm9uLWNyaXRpY2FsIGZ1bmN0aW9ucyAoZS5nLiBlYXhfaW5pdCgpKQorICAgICAgIC0tICJaaGkgQ2hlbiIgPHpoaUBtYXNzaXZlaW5jb3Jwb3JhdGVkLmNvbT4gcG9pbnRlZCBvdXQgdGhhdCByc2FfZGVjcnlwdF9rZXkoKSByZXF1aXJlcworICAgICAgICAgIGFuIGluY29ycmVjdCBvdXRwdXQgc2l6ZSAodG9vIGxhcmdlKS4gIEZpeGVkLgorICAgICAgIC0tIEFkZGVkIGEgInByZXR0eSIgdGFyZ2V0IHRvIHRoZSBHQ0MgbWFrZWZpbGUuICBSZXF1aXJlcyBQRVJMLiAgSXQgaXMgTkVBVCEKKyAgICAgICAtLSBNaW5vciB1cGRhdGVzIHRvIGNoMSBvZiB0aGUgbWFudWFsLgorICAgICAgIC0tIENsZWFuZWQgdXAgdGhlIGluZGVudGF0aW9uIGFuZCBhZGRlZCBjb21tZW50cyB0byByc2FfbWFrZV9rZXkoKSwgcnNhX2V4cHRtb2QoKSBhbmQgCisgICAgICAgICAgcnNhX3ZlcmlmeV9oYXNoKCkKKyAgICAgICAtLSBVcGRhdGVkIG1ha2VmaWxlLmljYyBzbyB0aGUgImluc3RhbGwiIHRhcmdldCB3b3VsZCB3b3JrIDstKQorICAgICAgIC0tIFJlbW92ZWQgZGVtb3MvdGVzdC5jIFtkZXByZWNhdGVkIGZyb20gZGVtb3MvdGVzdC90ZXN0LmNdCisgICAgICAgLS0gQ2hhbmdlZCBNQVhCTE9DS1NJWkUgZnJvbSAxMjggdG8gNjQgdG8gcmVmbGVjdCB0aGUgdHJ1ZSBzaXplLi4uCisKIE1heSAzMHRoLCAyMDA0CiB2MC45NiAgLS0gUmVtb3ZlZCBHRiBhbmQgS2V5cmluZyBjb2RlCiAgICAgICAgLS0gRXh0ZW5kZWQgT0FFUCBkZWNvZGVyIHRvIGRpc3Rpbmd1aXNoIGJldHRlciBbYW5kIHVzZSBhIG1vcmUgdW5pZm9ybSBBUEldCiAgICAgICAgLS0gQ2hhbmdlZCBQU1MvT0FFUCBBUEkgc2xpZ2h0bHkgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgUEsgZnVuY3Rpb25zIChvcmRlciBvZiBhcmd1bWVudHMpCiAgICAgICAgLS0gcnNhX2V4cHRtb2QoKSBub3cgcGFkcyB3aXRoIGxlYWRpbmcgemVyb2VzIGFzIHBlciBJMk9TUC4KICAgICAgICAtLSBhZGRlZCBlcnJvciBjaGVja2luZyB0byB5YXJyb3cgY29kZQotICAgICAgIC0tIE1pa2UgRnJ5c2luZ2VyIHBvaW50ZWQgb3V0IHRoYXQgdG9tbWF0aC5oIGZyb20gdGhpcyBkaXN0cm8gd2lsbCBvdmVyd3JpdGUgdG9tbWF0aC5oCisgICAgICAgLS0gIHBvaW50ZWQgb3V0IHRoYXQgdG9tbWF0aC5oIGZyb20gdGhpcyBkaXN0cm8gd2lsbCBvdmVyd3JpdGUgdG9tbWF0aC5oCiAgICAgICAgICAgZnJvbSBsaWJ0b21tYXRoLiAgSSBjaGFuZ2VkIHRoaXMgdG8gbHRjX3RvbW1hdGguaCB0byBhdm9pZCBhbnkgc3VjaCBwcm9ibGVtcy4KICAgICAgICAtLSBGaXhlZCBidWcgaW4gUFNTIGVuY29kZXIvZGVjb2RlciB0aGF0IGRpZG4ndCBoYW5kbGUgdGhlIE1TQiBwcm9wZXJseQogICAgICAgIC0tIHJlZmFjdG9yZWQgQUVTLCBub3cgc3BvcnRzIGFuICJlbmNyeXB0IG9ubHkiIGRlc2NyaXB0b3Igd2hpY2ggdXNlcyBoYWxmIGFzIG11Y2ggY29kZSBzcGFjZS4KQEAgLTk4MCwzICsxMzE5LDggQEAKICAgICAgICAtLSBBZGRlZCBtb3JlIHRvIHRoZSBtYW51YWwuCiAKIHYwLjAxICAtLSBXZSB3aWxsIGNhbGwgdGhpcyB0aGUgZmlyc3QgdmVyc2lvbi4KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvY2hhbmdlcyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xMDYgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMjcgMTI6Mzc6MDYgJCAqLworCmRpZmYgLS1naXQgYS9jcnlwdC50ZXggYi9jcnlwdC50ZXgKaW5kZXggYjk5MTcyMS4uY2YxYzM3ZSAxMDA2NDQKLS0tIGEvY3J5cHQudGV4CisrKyBiL2NyeXB0LnRleApAQCAtMSw0ICsxLDQgQEAKLVxkb2N1bWVudGNsYXNzW2I1cGFwZXJde2Jvb2t9CitcZG9jdW1lbnRjbGFzc1thNHBhcGVyXXtib29rfQogXHVzZXBhY2thZ2V7aHlwZXJyZWZ9CiBcdXNlcGFja2FnZXttYWtlaWR4fQogXHVzZXBhY2thZ2V7YW1zc3ltYn0KQEAgLTQ3LDIyICs0NywxNyBAQAogXGRlZlxnYXB7XHZzcGFjZXswLjVleH19CiBcbWFrZWluZGV4CiBcYmVnaW57ZG9jdW1lbnR9Ci1cdGl0bGV7QSBUaW55IENyeXB0byBMaWJyYXJ5LCBcXCBMaWJUb21DcnlwdCBcXCBWZXJzaW9uIDAuOTZ9CitcdGl0bGV7TGliVG9tQ3J5cHQgXFwgVmVyc2lvbiAxLjA1fQogXGF1dGhvcntUb20gU3QgRGVuaXMgXFwKIFxcCi10b21zdGRlbmlzQGlhaHUuY2EgXFwKLWh0dHA6Ly9saWJ0b21jcnlwdC5vcmcgXFwgXFwKLVBob25lOiAxLTYxMy04MzYtMzE2MFxcCi0xMTEgQmFubmluZyBSZCBcXAotS2FuYXRhLCBPbnRhcmlvIFxcCi1LMkwgMUMzIFxcCi1DYW5hZGEKK3RvbXN0ZGVuaXNAZ21haWwuY29tIFxcCitodHRwOi8vbGlidG9tY3J5cHQub3JnCiB9CiBcbWFrZXRpdGxlCiBUaGlzIHRleHQgYW5kIHNvdXJjZSBjb2RlIGxpYnJhcnkgYXJlIGJvdGggaGVyZWJ5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4gIFRoaXMgYm9vayBoYXMgYmVlbiAKLWZvcm1hdHRlZCBmb3IgQjUgWzE3NngyNTBdIHBhcGVyIHVzaW5nIHRoZSBcTGFUZVh7fSB7XGVtIGJvb2t9IG1hY3JvIHBhY2thZ2UuCitmb3JtYXR0ZWQgZm9yIEE0IHBhcGVyIHVzaW5nIHRoZSBcTGFUZVh7fSB7XGVtIGJvb2t9IG1hY3JvIHBhY2thZ2UuCiAKLVx2c3BhY2V7MTBjbX0KK1x2c3BhY2V7MTVjbX0KIAogXGJlZ2lue2ZsdXNocmlnaHR9T3BlbiBTb3VyY2UuICBPcGVuIEFjYWRlbWlhLiAgT3BlbiBNaW5kcy4KIApAQCAtNzAsNjIgKzY1LDM2IEBACiAKIFRvbSBTdCBEZW5pcywKIAotT250YXJpbywgQ2FuYWRhCitQaG9uZTogMS02MTMtODM2LTMxNjAKKworMTExIEJhbm5pbmcgUmQgCisKK0thbmF0YSwgT250YXJpbyAKKworSzJMIDFDMyAKKworQ2FuYWRhCiBcZW5ke2ZsdXNocmlnaHR9CiBcbmV3cGFnZQogXHRhYmxlb2Zjb250ZW50cwogXGNoYXB0ZXJ7SW50cm9kdWN0aW9ufQogXHNlY3Rpb257V2hhdCBpcyB0aGUgTGliVG9tQ3J5cHQ/fQotTGliVG9tQ3J5cHQgaXMgYSBwb3J0YWJsZSBBTlNJIEMgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IHRoYXQgc3VwcG9ydHMgc3ltbWV0cmljIGNpcGhlcnMsIG9uZS13YXkgaGFzaGVzLCAKLXBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMsIHB1YmxpYyBrZXkgY3J5cHRvZ3JhcGh5ICh2aWEgUlNBLERIIG9yIEVDQy9ESCkgYW5kIGEgcGxldGhvcmEgb2Ygc3VwcG9ydCAKLXJvdXRpbmVzLiAgSXQgaXMgZGVzaWduZWQgdG8gY29tcGlsZSBvdXQgb2YgdGhlIGJveCB3aXRoIHRoZSBHTlUgQyBDb21waWxlciAoR0NDKSB2ZXJzaW9uIDIuOTUuMyAoYW5kIGhpZ2hlcikgCi1hbmQgd2l0aCBNU1ZDIHZlcnNpb24gNiBpbiB3aW4zMi4KK0xpYlRvbUNyeXB0IGlzIGEgcG9ydGFibGUgSVNPIEMgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IHRoYXQgaXMgbWVhbnQgdG8gYmUgYSB0b29sc2V0IGZvciBjcnlwdG9ncmFwaGVycyB3aG8gYXJlIAorZGVzaWduaW5nIGEgY3J5cHRvc3lzdGVtLiAgSXQgc3VwcG9ydHMgc3ltbWV0cmljIGNpcGhlcnMsIG9uZS13YXkgaGFzaGVzLCBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzLCAKK3B1YmxpYyBrZXkgY3J5cHRvZ3JhcGh5ICh2aWEgUEtDUyBcIzEgUlNBLCBESCBvciBFQ0NESCkgYW5kIGEgcGxldGhvcmEgb2Ygc3VwcG9ydCAKK3JvdXRpbmVzLiAgCiAKLVRoZSBsaWJyYXJ5IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQgb24gcXVpdGUgYSBmZXcgb3RoZXIgcGxhdGZvcm1zIHJhbmdpbmcgZnJvbSB0aGUgQVJNN1RETUkgaW4gYSAKLUdhbWVib3kgQWR2YW5jZWQgdG8gdmFyaW91cyBQb3dlclBDIHByb2Nlc3NvcnMgYW5kIGV2ZW4gdGhlIE1JUFMgcHJvY2Vzc29yIGluIHRoZSBQbGF5U3RhdGlvbiAyLiAgU3VmZmljZSBpdAotdG8gc2F5IHRoZSBjb2RlIGlzIHBvcnRhYmxlLgotCi1UaGUgbGlicmFyeSBpcyBkZXNpZ25lZCBzbyBuZXcgY2lwaGVycy9oYXNoZXMvUFJOR3MgY2FuIGJlIGFkZGVkIGF0IHJ1bnRpbWUgYW5kIHRoZSBleGlzdGluZyBBUEkgKGFuZCBoZWxwZXIgQVBJIGZ1bmN0aW9ucykgd2lsbCAKLWJlIGFibGUgdG8gdXNlIHRoZSBuZXcgZGVzaWducyBhdXRvbWF0aWNhbGx5LiAgVGhlcmUgZXhpc3Qgc2VsZi1jaGVjayBmdW5jdGlvbnMgZm9yIGVhY2ggY2lwaGVyIGFuZCBoYXNoIHRvIGVuc3VyZSB0aGF0Ci10aGV5IGNvbXBpbGUgYW5kIGV4ZWN1dGUgdG8gdGhlIHB1Ymxpc2hlZCBkZXNpZ24gc3BlY2lmaWNhdGlvbnMuICBUaGUgbGlicmFyeSBhbHNvIHBlcmZvcm1zIGV4dGVuc2l2ZSBwYXJhbWV0ZXIgZXJyb3IgY2hlY2tpbmcKLWFuZCB3aWxsIGdpdmUgdmVyYm9zZSBlcnJvciBtZXNzYWdlcyB3aGVuIHBvc3NpYmxlLgotCi1Fc3NlbnRpYWxseSB0aGUgbGlicmFyeSBzYXZlcyB0aGUgdGltZSBvZiBoYXZpbmcgdG8gaW1wbGVtZW50IHRoZSBjaXBoZXJzLCBoYXNoZXMsIHBybmdzIHlvdXJzZWxmLiAgVHlwaWNhbGx5IGltcGxlbWVudGluZwotdXNlZnVsIGNyeXB0b2dyYXBoeSBpcyBhbiBlcnJvciBwcm9uZSBidXNpbmVzcyB3aGljaCBtZWFucyBhbnl0aGluZyB0aGF0IGNhbiBzYXZlIGNvbnNpZGVyYWJsZSB0aW1lIGFuZCBlZmZvcnQgaXMgYSBnb29kCi10aGluZy4KK1RoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBzdWNoIHRoYXQgbmV3IGNpcGhlcnMvaGFzaGVzL1BSTkdzIGNhbiBiZSBhZGRlZCBhdCBydW50aW1lIGFuZCB0aGUgZXhpc3RpbmcgQVBJIAorKGFuZCBoZWxwZXIgQVBJIGZ1bmN0aW9ucykgYXJlIGFibGUgdG8gdXNlIHRoZSBuZXcgZGVzaWducyBhdXRvbWF0aWNhbGx5LiAgVGhlcmUgZXhpc3RzIHNlbGYtY2hlY2sgZnVuY3Rpb25zIGZvciBlYWNoIAorYmxvY2sgY2lwaGVyIGFuZCBoYXNoIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IHRoZXkgY29tcGlsZSBhbmQgZXhlY3V0ZSB0byB0aGUgcHVibGlzaGVkIGRlc2lnbiBzcGVjaWZpY2F0aW9ucy4gIFRoZSBsaWJyYXJ5IAorYWxzbyBwZXJmb3JtcyBleHRlbnNpdmUgcGFyYW1ldGVyIGVycm9yIGNoZWNraW5nIHRvIHByZXZlbnQgYW55IG51bWJlciBvZiBydW50aW1lIGV4cGxvaXRzIG9yIGVycm9ycy4KIAogXHN1YnNlY3Rpb257V2hhdCB0aGUgbGlicmFyeSBJUyBmb3I/fQogCi1UaGUgbGlicmFyeSB0eXBpY2FsbHkgc2VydmVzIGFzIGEgYmFzaXMgZm9yIG90aGVyIHByb3RvY29scyBhbmQgbWVzc2FnZSBmb3JtYXRzLiAgRm9yIGV4YW1wbGUsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byAKLXRha2UgdGhlIFJTQSByb3V0aW5lcyBvdXQgb2YgdGhpcyBsaWJyYXJ5LCBhcHBseSB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZSBwYWRkaW5nIGFuZCBnZXQgUEtDUyBjb21wbGlhbnQgUlNBIHJvdXRpbmVzLiAgCi1TaW1pbGFybHkgU1NMIHByb3RvY29scyBjb3VsZCBiZSBmb3JtZWQgb24gdG9wICBvZiB0aGUgbG93LWxldmVsIHN5bW1ldHJpYyBjaXBoZXIgZnVuY3Rpb25zLiAgVGhlIGdvYWwgb2YgdGhpcyBwYWNrYWdlIGlzIAotdG8gcHJvdmlkZSB0aGVzZSBsb3cgbGV2ZWwgY29yZSBmdW5jdGlvbnMgaW4gYSByb2J1c3QgYW5kIGVhc3kgdG8gdXNlIGZhc2hpb24uCi0KLVRoZSBsaWJyYXJ5IGFsc28gc2VydmVzIHdlbGwgYXMgYSB0b29sa2l0IGZvciBhcHBsaWNhdGlvbnMgd2hlcmUgdGhleSBkb24ndCBuZWVkIHRvIGJlIE9wZW5QR1AsIFBLQ1MsIGV0Yy4gY29tcGxpYW50LgotSW5jbHVkZWQgYXJlIGZ1bGx5IG9wZXJhdGlvbmFsIHB1YmxpYyBrZXkgcm91dGluZXMgZm9yIGVuY3J5cHRpb24sIGRlY3J5cHRpb24sIHNpZ25hdHVyZSBnZW5lcmF0aW9uIGFuZCB2ZXJpZmljYXRpb24uICAKLVRoZXNlIHJvdXRpbmVzIGFyZSBmdWxseSBwb3J0YWJsZSBidXQgYXJlIG5vdCBjb25mb3JtYW50IHRvIGFueSBrbm93biBzZXQgb2Ygc3RhbmRhcmRzXGZvb3Rub3Rle1dpdGggdGhlIGV4Y2VwdGlvbiBvZiAKLXRoZSBSU0EgY29kZSB3aGljaCBpcyBiYXNlZCBvbiB0aGUgUEtDUyBcIzEgc3RhbmRhcmRzLn0uICBUaGV5IGFyZSBhbGwgYmFzZWQgb24gZXN0YWJsaXNoZWQKLW51bWJlciB0aGVvcnkgYW5kIGNyeXB0b2dyYXBoeS4gIAotCi1cc3Vic2VjdGlvbntXaGF0IHRoZSBsaWJyYXJ5IElTIE5PVCBmb3I/fQotCi1UaGUgbGlicmFyeSBpcyBub3QgZGVzaWduZWQgdG8gYmUgaW4gYW55d2F5IGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTU0wgb3IgT3BlblBHUCBzdGFuZGFyZHMuICBUaGUgbGlicmFyeSAKLWlzIG5vdCBkZXNpZ25lZCB0byBiZSBjb21wbGlhbnQgd2l0aCBhbnkga25vd24gZm9ybSBvZiBBUEkgb3IgcHJvZ3JhbW1pbmcgaGllcmFyY2h5LiAgSXQgaXMgbm90IGEgcG9ydCBvZiBhbnkgb3RoZXIgCi1saWJyYXJ5IGFuZCBpdCBpcyBub3QgcGxhdGZvcm0gc3BlY2lmaWMgKGxpa2UgdGhlIE1TIENTUCkuICBTbyBpZiB5b3UncmUgbG9va2luZyB0byBkcm9wIGluIHNvbWUgYnV6endvcmQgCi1jb21wbGlhbnQgY3J5cHRvIGxpYnJhcnkgdGhpcyBpcyBub3QgZm9yIHlvdS4gIFRoZSBsaWJyYXJ5IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHRvIHByb3ZpZGUgYmFzaWMgZnVuY3Rpb25zIGFzIAotd2VsbCBhcyBub24tc3RhbmRhcmQgaGlnaGVyIGxldmVsIGZ1bmN0aW9ucy4gIAotCi1UaGlzIGlzIG5vdCB0byBzYXkgdGhhdCB0aGUgbGlicmFyeSBpcyBhIGBgaG9tZWJyZXcnJyBwcm9qZWN0LiAgQWxsIG9mIHRoZSBzeW1tZXRyaWMgY2lwaGVycyBhbmQgb25lLXdheSBoYXNoIGZ1bmN0aW9ucwotY29uZm9ybSB0byBwdWJsaXNoZWQgdGVzdCB2ZWN0b3JzLiAgVGhlIHB1YmxpYyBrZXkgZnVuY3Rpb25zIGFyZSBkZXJpdmVkIGZyb20gcHVibGljbHkgYXZhaWxhYmxlIG1hdGVyaWFsIGFuZCB0aGUgbWFqb3JpdHkKLW9mIHRoZSBjb2RlIGhhcyBiZWVuIHJldmlld2VkIGJ5IGEgZ3Jvd2luZyBjb21tdW5pdHkgb2YgZGV2ZWxvcGVycy4KLQotXHN1YnN1YnNlY3Rpb257V2h5IG5vdD99Ci1Zb3UgbWF5IGJlIGFza2luZyB3aHkgSSBkaWRuJ3QgY2hvb3NlIHRvIGdvIGFsbCBvdXQgYW5kIHN1cHBvcnQgc3RhbmRhcmRzIGxpa2UgUDEzNjMsIFBLQ1MgYW5kIHRoZSB3aG9sZSBsb3QuICBUaGUgcmVhc29uCi1pcyBxdWl0ZSBzaW1wbGUgdG9vIG11Y2ggbW9uZXkgZ2V0cyBpbiB0aGUgd2F5LiAgV2hlbiBJIHRyaWVkIHRvIGFjY2VzcyB0aGUgUDEzNjMgZHJhZnQgZG9jdW1lbnRzIGFuZCB3YXMgZGVuaWVkIChpdCAKLXJlcXVpcmVzIGEgcGFzc3dvcmQpIEkgcmVhbGl6ZWQgdGhhdCB0aGV5J3JlIGp1c3QgYSBidXNpbmVzcyBhbnl3YXlzLiAgU2VlIHdoYXQgaGFwcGVucyBpcyBhIGNvbXBhbnkgd2lsbCBzaXQgZG93biBhbmQKLWludmVudCBhIGBgc3RhbmRhcmQnJy4gIFRoZW4gdGhleSB0cnkgdG8gc2VsbCBpdCB0byBhcyBtYW55IHBlb3BsZSBhcyB0aGV5IGNhbi4gIEFsbCBvZiBhIHN1ZGRlbiB0aGlzIGBgc3RhbmRhcmQnJyBpcyAKLWV2ZXJ5d2hlcmUuICBUaGVuIHRoZSBzdGFuZGFyZCBpcyB1cGRhdGVkIGV2ZXJ5IHNvIG9mdGVuIHRvIGtlZXAgcGVvcGxlIGRlcGVuZGVudC4gIFRoZW4geW91IGJlY29tZSBSU0EuICBJZiBwZW9wbGUgYXJlIAotc3VwcG9zZWQgdG8gc3VwcG9ydCB0aGVzZSBzdGFuZGFyZHMgdGhleSBoYWQgYmV0dGVyIG1ha2UgdGhlbSBtb3JlIGFjY2Vzc2libGUuCitUaGUgbGlicmFyeSBzZXJ2ZXMgYXMgYSB0b29sa2l0IGZvciBkZXZlbG9wZXJzIHdobyBoYXZlIHRvIHNvbHZlIGNyeXB0b2dyYXBoaWMgcHJvYmxlbXMuICBPdXQgb2YgdGhlIGJveCBMaWJUb21DcnlwdAorZG9lcyBub3QgcHJvY2VzcyBTU0wgb3IgT3BlblBHUCBtZXNzYWdlcywgaXQgZG9lc24ndCByZWFkIHguNTkxIGNlcnRpZmljYXRlcyBvciB3cml0ZSBQRU0gZW5jb2RlZCBkYXRhLiAgSXQgZG9lcywgaG93ZXZlciwKK3Byb3ZpZGUgYWxsIG9mIHRoZSB0b29scyByZXF1aXJlZCB0byBidWlsZCBzdWNoIGZ1bmN0aW9uYWxpdHkuICBMaWJUb21DcnlwdCB3YXMgZGVzaWduZWQgdG8gYmUgYSBmbGV4aWJsZSBsaWJyYXJ5IHRoYXQgCit3YXMgbm90IHRpZWQgdG8gYW55IHBhcnRpY3VsYXIgY3J5cHRvZ3JhcGhpYyBwcm9ibGVtLiAgCiAKIFxzZWN0aW9ue1doeSBkaWQgSSB3cml0ZSBpdD99CiBZb3UgbWF5IGJlIHdvbmRlcmluZywgYGBUb20sIHdoeSBkaWQgeW91IHdyaXRlIGEgY3J5cHRvIGxpYnJhcnkuICBJIGFscmVhZHkgaGF2ZSBvbmUuJycuICBXZWxsIHRoZSByZWFzb24gZmFsbHMgaW50bwpAQCAtMTQwLDI0ICsxMDksMzUgQEAKIAogV2l0aCB0aGlzIGxpYnJhcnkgYWxsIGNvcmUgZnVuY3Rpb25zIChjaXBoZXJzLCBoYXNoZXMsIHBybmdzKSBoYXZlIHRoZSB7XGJmIGV4YWN0fSBzYW1lIHByb3RvdHlwZSBkZWZpbml0aW9uLiAgVGhleSBhbGwgbG9hZAogYW5kIHN0b3JlIGRhdGEgaW4gYSBmb3JtYXQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYXRmb3JtLiAgVGhpcyBtZWFucyBpZiB5b3UgZW5jcnlwdCB3aXRoIEJsb3dmaXNoIG9uIGEgUFBDIGl0IHNob3VsZCBkZWNyeXB0Ci1vbiBhbiB4ODYgd2l0aCB6ZXJvIHByb2JsZW1zLiAgVGhlIGNvbnNpc3RlbnQgQVBJIGFsc28gbWVhbnMgdGhhdCBpZiB5b3UgbGVhcm4gaG93IHRvIHVzZSBibG93ZmlzaCB3aXRoIG15IGxpYnJhcnkgeW91IAorb24gYW4geDg2IHdpdGggemVybyBwcm9ibGVtcy4gIFRoZSBjb25zaXN0ZW50IEFQSSBhbHNvIG1lYW5zIHRoYXQgaWYgeW91IGxlYXJuIGhvdyB0byB1c2UgQmxvd2Zpc2ggd2l0aCBteSBsaWJyYXJ5IHlvdSAKIGtub3cgaG93IHRvIHVzZSBTYWZlcisgb3IgUkM2IG9yIFNlcnBlbnQgb3IgLi4uIGFzIHdlbGwuICBXaXRoIGFsbCBvZiB0aGUgY29yZSBmdW5jdGlvbnMgdGhlcmUgYXJlIGNlbnRyYWwgZGVzY3JpcHRvciB0YWJsZXMgCiB0aGF0IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwcm9ncmFtIGF1dG9tYXRpY2FsbHkgcGljayBiZXR3ZWVuIGNpcGhlcnMsIGhhc2hlcyBhbmQgUFJOR3MgYXQgcnVudGltZS4gIFRoYXQgbWVhbnMgeW91ciAKIGFwcGxpY2F0aW9uIGNhbiBzdXBwb3J0IGFsbCBjaXBoZXJzL2hhc2hlcy9wcm5ncyB3aXRob3V0IGNoYW5naW5nIHRoZSBzb3VyY2UgY29kZS4KIAorTm90IG9ubHkgZGlkIEkgc3RyaXZlIHRvIG1ha2UgYSBjb25zaXN0ZW50IGFuZCBzaW1wbGUgQVBJIHRvIHdvcmsgd2l0aCBidXQgSSBhbHNvIHN0cml2ZWQgdG8gbWFrZSB0aGUgbGlicmFyeQorY29uZmlndXJhYmxlIGluIHRlcm1zIG9mIGl0cyBidWlsZCBvcHRpb25zLiAgT3V0IG9mIHRoZSBib3ggdGhlIGxpYnJhcnkgd2lsbCBidWlsZCB3aXRoIGFueSBtb2Rlcm4gdmVyc2lvbiBvZiBHQ0MKK3dpdGhvdXQgaGF2aW5nIHRvIHVzZSBjb25maWd1cmUgc2NyaXB0cy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgbGlicmFyeSB3aWxsIHdvcmsgd2l0aCBwbGF0Zm9ybXMgd2hlcmUgZGV2ZWxvcG1lbnQKK3Rvb2xzIG1heSBiZSBsaW1pdGVkIChlLmcuIG5vIGF1dG9jb25mKS4KKworT24gdG9wIG9mIG1ha2luZyB0aGUgYnVpbGQgc2ltcGxlIGFuZCB0aGUgQVBJIGFwcHJvYWNoYWJsZSBJJ3ZlIGFsc28gc3RyaXZlZCBmb3IgYSByZWFzb25hYmx5IGhpZ2ggbGV2ZWwgb2YKK3JvYnVzdG5lc3MgYW5kIGVmZmljaWVuY3kuICBMaWJUb21DcnlwdCB0cmFwcyBhbmQgcmV0dXJucyBhIHNlcmllcyBvZiBlcnJvcnMgcmFuZ2luZyBmcm9tIGludmFsaWQKK2FyZ3VtZW50cyB0byBidWZmZXIgb3ZlcmZsb3dzL292ZXJydW5zLiAgSXQgaXMgbW9zdGx5IHRocmVhZCBzYWZlIGFuZCBoYXMgYmVlbiBjbG9ja2VkIG9uIHZhcmlvdXMgcGxhdGZvcm1zCit3aXRoIGBgY3ljbGVzIHBlciBieXRlJycgdGltaW5ncyB0aGF0IGFyZSBjb21wYXJhYmxlIChhbmQgb2Z0ZW4gZmF2b3VyYWJsZSkgdG8gb3RoZXIgbGlicmFyaWVzIHN1Y2ggYXMgT3BlblNTTCBhbmQKK0NyeXB0bysrLgorCiBcc3Vic2VjdGlvbntNb2R1bGFyfQotVGhlIExpYlRvbUNyeXB0IHBhY2thZ2UgaGFzIGFsc28gYmVlbiB3cml0dGVuIHRvIGJlIHZlcnkgbW9kdWxhci4gIFRoZSBibG9jayBjaXBoZXJzLCBvbmUtd2F5IGhhc2hlcyBhbmQKLXBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgKFBSTkcpIGFyZSBhbGwgdXNlZCB3aXRoaW4gdGhlIEFQSSB0aHJvdWdoIGBgZGVzY3JpcHRvcicnIHRhYmxlcyB3aGljaCAKK1RoZSBMaWJUb21DcnlwdCBwYWNrYWdlIGhhcyBhbHNvIGJlZW4gd3JpdHRlbiB0byBiZSB2ZXJ5IG1vZHVsYXIuICBUaGUgYmxvY2sgY2lwaGVycywgb25lLS13YXkgaGFzaGVzIGFuZAorcHNldWRvLS1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgKFBSTkcpIGFyZSBhbGwgdXNlZCB3aXRoaW4gdGhlIEFQSSB0aHJvdWdoIGBgZGVzY3JpcHRvcicnIHRhYmxlcyB3aGljaCAKIGFyZSBlc3NlbnRpYWxseSBzdHJ1Y3R1cmVzIHdpdGggcG9pbnRlcnMgdG8gZnVuY3Rpb25zLiAgV2hpbGUgeW91IGNhbiBzdGlsbCBjYWxsIHBhcnRpY3VsYXIgZnVuY3Rpb25zCiBkaXJlY3RseSAoXHRleHRpdHtlLmcuIHNoYTI1NlxfcHJvY2VzcygpfSkgdGhpcyBkZXNjcmlwdG9yIGludGVyZmFjZSBhbGxvd3MgdGhlIGRldmVsb3BlciB0byBjdXN0b21pemUgdGhlaXIKIHVzYWdlIG9mIHRoZSBsaWJyYXJ5LgogCiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgYSBoYXJkd2FyZSBwbGF0Zm9ybSB3aXRoIGEgc3BlY2lhbGl6ZWQgUk5HIGRldmljZS4gIE9idmlvdXNseSBvbmUgd291bGQgbGlrZSB0byB0YXAKLXRoYXQgZm9yIHRoZSBQUk5HIG5lZWRzIHdpdGhpbiB0aGUgbGlicmFyeSAoXHRleHRpdHtlLmcuIG1ha2luZyBhIFJTQSBrZXl9KS4gIEFsbCB0aGUgZGV2ZWxvcGVyIGhhcyB0b2RvCit0aGF0IGZvciB0aGUgUFJORyBuZWVkcyB3aXRoaW4gdGhlIGxpYnJhcnkgKFx0ZXh0aXR7ZS5nLiBtYWtpbmcgYSBSU0Ega2V5fSkuICBBbGwgdGhlIGRldmVsb3BlciBoYXMgdG8gZG8KIGlzIHdyaXRlIGEgZGVzY3JpcHRvciBhbmQgdGhlIGZldyBzdXBwb3J0IHJvdXRpbmVzIHJlcXVpcmVkIGZvciB0aGUgZGV2aWNlLiAgQWZ0ZXIgdGhhdCB0aGUgcmVzdCBvZiB0aGUgCi1BUEkgY2FuIG1ha2UgdXNlIG9mIGl0IHdpdGhvdXQgY2hhbmdlLiAgU2ltaWxpYXJseSBpbWFnaW5lIGEgZmV3IHllYXJzIGRvd24gdGhlIHJvYWQgd2hlbiBBRVMyIChcdGV4dGl0e29yIHdoYXRldmVyIHRoZXkgY2FsbCBpdH0pIGlzCi1pbnZlbnRlZC4gIEl0IGNhbiBiZSBhZGRlZCB0byB0aGUgbGlicmFyeSBhbmQgdXNlZCB3aXRoaW4gYXBwbGljYXRpb25zIHdpdGggemVybyBtb2RpZmljYXRpb25zIHRvIHRoZQotZW5kIGFwcGxpY2F0aW9ucyBwcm92aWRlZCB0aGV5IGFyZSB3cml0dGVuIHByb3Blcmx5LgorQVBJIGNhbiBtYWtlIHVzZSBvZiBpdCB3aXRob3V0IGNoYW5nZS4gIFNpbWlsaWFybHkgaW1hZ2luZSBhIGZldyB5ZWFycyBkb3duIHRoZSByb2FkIHdoZW4gQUVTMiAKKyhcdGV4dGl0e29yIHdoYXRldmVyIHRoZXkgY2FsbCBpdH0pIGhhcyBiZWVuIGludmVudGVkLiAgSXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaWJyYXJ5IGFuZCB1c2VkIHdpdGhpbiBhcHBsaWNhdGlvbnMgCit3aXRoIHplcm8gbW9kaWZpY2F0aW9ucyB0byB0aGUgZW5kIGFwcGxpY2F0aW9ucyBwcm92aWRlZCB0aGV5IGFyZSB3cml0dGVuIHByb3Blcmx5LgogCiBUaGlzIGZsZXhpYmlsaXR5IHdpdGhpbiB0aGUgbGlicmFyeSBtZWFucyBpdCBjYW4gYmUgdXNlZCB3aXRoIGFueSBjb21iaW5hdGlvbiBvZiBwcmltaXRpdmUgYWxnb3JpdGhtcyBhbmQgCiB1bmxpa2UgbGlicmFyaWVzIGxpa2UgT3BlblNTTCBpcyBub3QgdGllZCB0byBkaXJlY3Qgcm91dGluZXMuICBGb3IgaW5zdGFuY2UsIGluIE9wZW5TU0wgdGhlcmUgYXJlIENCQyBibG9jawpAQCAtMTY3LDcgKzE0Nyw2IEBACiB0aGUga2V5IHNldHVwLCBFQ0IgZGVjcnlwdCBhbmQgZW5jcnlwdCBhbmQgdGVzdCB2ZWN0b3Igcm91dGluZXMuICBBZnRlciB0aGF0IGFsbCBmaXZlIGNoYWluaW5nIG1vZGUgcm91dGluZXMKIGNhbiBtYWtlIHVzZSBvZiB0aGUgY2lwaGVyIHJpZ2h0IGF3YXkuCiAKLQogXHNlY3Rpb257TGljZW5zZX0KIAogQWxsIG9mIHRoZSBzb3VyY2UgY29kZSBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcgZmlsZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gYnkgdGhlIGF1dGhvciBvciBkb25hdGVkIHRvIHRoZSBwcm9qZWN0CkBAIC0xNzUsMTQgKzE1NCwxMiBAQAogCiBcYmVnaW57ZW51bWVyYXRlfQogICAgXGl0ZW0gcmMyLmMKLSAgIFxpdGVtIHNhZmVyLmMKIFxlbmR7ZW51bWVyYXRlfQogCi1gbXBpLmMnJyB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pY2hhZWwgRnJvbWJlcmdlciAoc3RpbmdAbGluZ3Vpc3QuZGFydG1vdXRoLmVkdSkgYnV0IGhhcyBzaW5jZSBiZWVuIHJlcGxhY2VkIHdpdGggbXkgTGliVG9tTWF0aAotbGlicmFyeS4KK2BtcGkuYycnIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTWljaGFlbCBGcm9tYmVyZ2VyIChzdGluZ0BsaW5ndWlzdC5kYXJ0bW91dGguZWR1KSBidXQgaGFzIHNpbmNlIGJlZW4gcmVwbGFjZWQgd2l0aCAKK215IExpYlRvbU1hdGggbGlicmFyeSB3aGljaCBpcyBwdWJsaWMgZG9tYWluLgogCi1gYHJjMi5jJycgaXMgYmFzZWQgb24gcHVibGljbHkgYXZhaWxhYmxlIGNvZGUgdGhhdCBpcyBub3QgYXR0cmlidXRlZCB0byBhIHBlcnNvbiBmcm9tIHRoZSBnaXZlbiBzb3VyY2UuICBgYHNhZmVyLmMnJwotd2FzIHdyaXR0ZW4gYnkgUmljaGFyZCBEZSBNb2xpbmVyIChkZW1vbGluZXJAaXNpLmVlLmV0aHouY2gpIGFuZCBpcyBwdWJsaWMgZG9tYWluLgorYGByYzIuYycnIGlzIGJhc2VkIG9uIHB1YmxpY2x5IGF2YWlsYWJsZSBjb2RlIHRoYXQgaXMgbm90IGF0dHJpYnV0ZWQgdG8gYSBwZXJzb24gZnJvbSB0aGUgZ2l2ZW4gc291cmNlLiAgCiAKIFRoZSBwcm9qZWN0IGlzIGhlcmVieSByZWxlYXNlZCBhcyBwdWJsaWMgZG9tYWluLgogCkBAIC0xOTAsMzMgKzE2NywxNSBAQAogCiBUaGUgYXV0aG9yIChUb20gU3QgRGVuaXMpIGlzIG5vdCBhIHBhdGVudCBsYXd5ZXIgc28gdGhpcyBzZWN0aW9uIGlzIG5vdCB0byBiZSB0cmVhdGVkIGFzIGxlZ2FsIGFkdmljZS4gIFRvIHRoZSBiZXN0CiBvZiB0aGUgYXV0aG9ycyBrbm93bGVkZ2UgdGhlIG9ubHkgcGF0ZW50IHJlbGF0ZWQgaXNzdWVzIHdpdGhpbiB0aGUgbGlicmFyeSBhcmUgdGhlIFJDNSBhbmQgUkM2IHN5bW1ldHJpYyBibG9jayBjaXBoZXJzLiAgCi1UaGV5IGNhbiBiZSByZW1vdmVkIGZyb20gYSBidWlsZCBieSBzaW1wbHkgY29tbWVudGluZyBvdXQgdGhlIHR3byBhcHByb3ByaWF0ZSBsaW5lcyBpbiB0aGUgbWFrZWZpbGUgc2NyaXB0LiAgVGhlIHJlc3QKK1RoZXkgY2FuIGJlIHJlbW92ZWQgZnJvbSBhIGJ1aWxkIGJ5IHNpbXBseSBjb21tZW50aW5nIG91dCB0aGUgdHdvIGFwcHJvcHJpYXRlIGxpbmVzIGluIGBgdG9tY3J5cHRcX2N1c3RvbS5oJycuICBUaGUgcmVzdAogb2YgdGhlIGNpcGhlcnMgYW5kIGhhc2hlcyBhcmUgcGF0ZW50IGZyZWUgb3IgdW5kZXIgcGF0ZW50cyB0aGF0IGhhdmUgc2luY2UgZXhwaXJlZC4KIAogVGhlIFJDMiBhbmQgUkM0IHN5bW1ldHJpYyBjaXBoZXJzIGFyZSBub3QgdW5kZXIgcGF0ZW50cyBidXQgYXJlIHVuZGVyIHRyYWRlbWFyayByZWd1bGF0aW9ucy4gIFRoaXMgbWVhbnMgeW91IGNhbiB1c2UgCiB0aGUgY2lwaGVycyB5b3UganVzdCBjYW4ndCBhZHZlcnRpc2UgdGhhdCB5b3UgYXJlIGRvaW5nIHNvLiAgCiAKLVxzZWN0aW9ue0J1aWxkaW5nIHRoZSBsaWJyYXJ5fQotCi1UbyBidWlsZCB0aGUgbGlicmFyeSBvbiBhIEdDQyBlcXVpcHBlZCBwbGF0Zm9ybSBzaW1wbHkgdHlwZSBgYG1ha2UnJyBhdCB5b3VyIGNvbW1hbmQgcHJvbXB0LiAgSXQgd2lsbCBidWlsZCB0aGUgbGlicmFyeQotZmlsZSBgYGxpYnRvbWNyeXB0LmEnJy4gIAotCi1UbyBpbnN0YWxsIHRoZSBsaWJyYXJ5IGNvcHkgYWxsIG9mIHRoZSBgYC5oJycgZmlsZXMgaW50byB5b3VyIGBgXCNpbmNsdWRlJycgcGF0aCBhbmQgdGhlIHNpbmdsZSBsaWJ0b21jcnlwdC5hIGZpbGUgaW50byAKLXlvdXIgbGlicmFyeSBwYXRoLgotCi1XaXRoIE1TVkMgeW91IGNhbiBidWlsZCB0aGUgbGlicmFyeSB3aXRoIGBgbm1ha2UgLWYgbWFrZWZpbGUubXN2YycnLiAgVGhpcyB3aWxsIHByb2R1Y2UgYSBgYHRvbWNyeXB0LmxpYicnIGZpbGUgd2hpY2gKLWlzIHRoZSBjb3JlIGxpYnJhcnkuICBDb3B5IHRoZSBoZWFkZXIgZmlsZXMgaW50byB5b3VyIE1TVkMgaW5jbHVkZSBwYXRoIGFuZCB0aGUgbGlicmFyeSBpbiB0aGUgbGliIHBhdGggKHR5cGljYWxseQotdW5kZXIgd2hlcmUgVkM5OCBpcyBpbnN0YWxsZWQpLgotCi1cc2VjdGlvbntCdWlsZGluZyBhZ2FpbnN0IHRoZSBsaWJyYXJ5fQotCi1JbiB0aGUgcmVjZW50IHZlcnNpb25zIHRoZSBidWlsZCBzdGVwcyBoYXZlIGNoYW5nZWQuICBUaGUgYnVpbGQgb3B0aW9ucyBhcmUgbm93IHN0b3JlZCBpbiBgYG15Y3J5cHRcX2N1c3RvbS5oJycgYW5kCi1ubyBsb25nZXIgaW4gdGhlIG1ha2VmaWxlLiAgSWYgeW91IGNoYW5nZSBhIGJ1aWxkIG9wdGlvbiBpbiB0aGF0IGZpbGUgeW91IG11c3QgcmUtYnVpbGQgdGhlIGxpYnJhcnkgZnJvbSBjbGVhbiB0bwotZW5zdXJlIHRoZSBidWlsZCBpcyBpbnRhY3QuICBUaGUgcGVybCBzY3JpcHQgYGBjb25maWcucGwnJyB3aWxsIGhlbHAgc2V0dXAgdGhlIGN1c3RvbSBoZWFkZXIgYW5kIGEgY3VzdG9tIG1ha2VmaWxlCi1pZiB5b3Ugd2FudCBvbmUgKHRoZSBwcm92aWRlZCBgYG1ha2VmaWxlJycgd2lsbCB3b3JrIHdpdGggY3VzdG9tIGNvbmZpZ3MpLgotCiBcc2VjdGlvbntUaGFua3N9Ci1JIHdvdWxkIGxpa2UgdG8gZ2l2ZSB0aGFua3MgdG8gdGhlIGZvbGxvd2luZyBwZW9wbGUgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpIGZvciBoZWxwaW5nIG1lIGRldmVsb3AgdGhpcyBwcm9qZWN0OgorSSB3b3VsZCBsaWtlIHRvIGdpdmUgdGhhbmtzIHRvIHRoZSBmb2xsb3dpbmcgcGVvcGxlIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKSBmb3IgaGVscGluZyBtZSBkZXZlbG9wIHRoaXMgcHJvamVjdCBmcm9tCitlYXJseSBvbjoKIFxiZWdpbntlbnVtZXJhdGV9CiAgICBcaXRlbSBSaWNoYXJkIHZhbiBkZSBMYWFyc2Nob3QKICAgIFxpdGVtIFJpY2hhcmQgSGVhdGhmaWVsZApAQCAtMjMzLDYgKzE5Miw5IEBACiAgICBcaXRlbSBDaHJpc3RvcGhlciBJbWVzCiBcZW5ke2VudW1lcmF0ZX0KIAorVGhlcmUgaGF2ZSBiZWVuIHF1aXRlIGEgZmV3IG90aGVyIHBlb3BsZSBhcyB3ZWxsLiAgUGxlYXNlIGNoZWNrIHRoZSBjaGFuZ2UgbG9nIHRvIHNlZSB3aG8gZWxzZSBoYXMgY29udHJpYnV0ZWQgZnJvbQordGltZSB0byB0aW1lLgorCiBcY2hhcHRlcntUaGUgQXBwbGljYXRpb24gUHJvZ3JhbW1pbmcgSW50ZXJmYWNlIChBUEkpfQogXHNlY3Rpb257SW50cm9kdWN0aW9ufQogXGluZGV4e0NSWVBUXF9FUlJPUn0gXGluZGV4e0NSWVBUXF9PS30KQEAgLTI2NiwyNCArMjI4LDIzIEBACiByZWxhdGVkIGlzc3VlIGlzIGlmIHlvdSB1c2UgdGhlIHNhbWUgc3ltbWV0cmljIGNpcGhlciwgaGFzaCBvciBwdWJsaWMga2V5IHN0YXRlIGRhdGEgaW4gbXVsdGlwbGUgdGhyZWFkcy4gIE5vcm1hbGx5CiB0aGF0IGlzIG5vdCBhbiBpc3N1ZS4KIAotVG8gaW5jbHVkZSB0aGUgcHJvdG90eXBlcyBmb3IgYGBMaWJUb21DcnlwdC5hJycgaW50byB5b3VyIG93biBwcm9ncmFtIHNpbXBseSBpbmNsdWRlIGBgbXljcnlwdC5oJycgbGlrZSBzbzoKK1RvIGluY2x1ZGUgdGhlIHByb3RvdHlwZXMgZm9yIGBgTGliVG9tQ3J5cHQuYScnIGludG8geW91ciBvd24gcHJvZ3JhbSBzaW1wbHkgaW5jbHVkZSBgYHRvbWNyeXB0LmgnJyBsaWtlIHNvOgogXGJlZ2lue3ZlcmJhdGltfQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogaW50IG1haW4odm9pZCkgewogICAgIHJldHVybiAwOwogfQogXGVuZHt2ZXJiYXRpbX0KIAotVGhlIGhlYWRlciBmaWxlIGBgbXljcnlwdC5oJycgYWxzbyBpbmNsdWRlcyBgYHN0ZGlvLmgnJywgYGBzdHJpbmcuaCcnLCBgYHN0ZGxpYi5oJycsIGBgdGltZS5oJycsIGBgY3R5cGUuaCcnIGFuZCBgYG1waS5oJycKLSh0aGUgYmlnbnVtIGxpYnJhcnkgcm91dGluZXMpLgorVGhlIGhlYWRlciBmaWxlIGBgdG9tY3J5cHQuaCcnIGFsc28gaW5jbHVkZXMgYGBzdGRpby5oJycsIGBgc3RyaW5nLmgnJywgYGBzdGRsaWIuaCcnLCBgYHRpbWUuaCcnLCBgYGN0eXBlLmgnJyBhbmQgCitgYGx0Y1xfdG9tbWF0aC5oJycgKHRoZSBiaWdudW0gbGlicmFyeSByb3V0aW5lcykuCiAKIFxzZWN0aW9ue01hY3Jvc30KIAogVGhlcmUgYXJlIGEgZmV3IGhlbHBlciBtYWNyb3MgdG8gbWFrZSB0aGUgY29kaW5nIHByb2Nlc3MgYSBiaXQgZWFzaWVyLiAgVGhlIGZpcnN0IHNldCBhcmUgcmVsYXRlZCB0byBsb2FkaW5nIGFuZCBzdG9yaW5nCiAzMi82NC1iaXQgd29yZHMgaW4gbGl0dGxlL2JpZyBlbmRpYW4gZm9ybWF0LiAgVGhlIG1hY3JvcyBhcmU6CiAKLVxpbmRleHtTVE9SRTMyTH0gXGluZGV4e1NUT1JFNjRMfSBcaW5kZXh7TE9BRDMyTH0gXGluZGV4e0xPQUQ2NEx9Ci1caW5kZXh7U1RPUkUzMkh9IFxpbmRleHtTVE9SRTY0SH0gXGluZGV4e0xPQUQzMkh9IFxpbmRleHtMT0FENjRIfSBcaW5kZXh7QlNXQVB9CitcaW5kZXh7U1RPUkUzMkx9IFxpbmRleHtTVE9SRTY0TH0gXGluZGV4e0xPQUQzMkx9IFxpbmRleHtMT0FENjRMfSBcaW5kZXh7U1RPUkUzMkh9IFxpbmRleHtTVE9SRTY0SH0gXGluZGV4e0xPQUQzMkh9IFxpbmRleHtMT0FENjRIfSBcaW5kZXh7QlNXQVB9CiBcYmVnaW57c21hbGx9CiBcYmVnaW57Y2VudGVyfQogXGJlZ2lue3RhYnVsYXJ9e3xjfGN8Y3x9CkBAIC0yOTUsMTggKzI1NiwyNSBAQAogICAgICBcaGxpbmUgU1RPUkU2NEgoeCwgeSkgJiB7XGJmIHVuc2lnbmVkIGxvbmcgbG9uZ30geCwge1xiZiB1bnNpZ25lZCBjaGFyfSAqeSAmICR4IFx0byB5WzcgXGxkb3RzIDBdJCBcXAogICAgICBcaGxpbmUgTE9BRDMySCh4LCB5KSAmIHtcYmYgdW5zaWduZWQgbG9uZ30geCwge1xiZiB1bnNpZ25lZCBjaGFyfSAqeSAmICR5WzMgXGxkb3RzIDBdIFx0byB4JCBcXAogICAgICBcaGxpbmUgTE9BRDY0SCh4LCB5KSAmIHtcYmYgdW5zaWduZWQgbG9uZyBsb25nfSB4LCB7XGJmIHVuc2lnbmVkIGNoYXJ9ICp5ICYgJHlbNyBcbGRvdHMgMF0gXHRvIHgkIFxcCi0gICAgIFxobGluZSBCU1dBUCh4KSAmIHtcYmYgdW5zaWduZWQgbG9uZ30geCAmIFN3YXBzIHRoZSBieXRlIG9yZGVyIG9mIHguIFxcCisgICAgIFxobGluZSBCU1dBUCh4KSAmIHtcYmYgdW5zaWduZWQgbG9uZ30geCAmIFN3YXBzIGJ5dGUgb3JkZXIgKDMyLS1iaXRzIG9ubHkpIFxcCiAgICAgIFxobGluZQogXGVuZHt0YWJ1bGFyfQogXGVuZHtjZW50ZXJ9CiBcZW5ke3NtYWxsfQogCi1UaGVyZSBhcmUgMzItYml0IGN5Y2xpYyByb3RhdGlvbnMgYXMgd2VsbDoKLVxpbmRleHtST0x9IFxpbmRleHtST1J9CitUaGVyZSBhcmUgMzIgYW5kIDY0LWJpdCBjeWNsaWMgcm90YXRpb25zIGFzIHdlbGw6CitcaW5kZXh7Uk9MfSBcaW5kZXh7Uk9SfSBcaW5kZXh7Uk9MNjR9IFxpbmRleHtST1I2NH0gXGluZGV4e1JPTGN9IFxpbmRleHtST1JjfSBcaW5kZXh7Uk9MNjRjfSBcaW5kZXh7Uk9SNjRjfSAKIFxiZWdpbntjZW50ZXJ9CiBcYmVnaW57dGFidWxhcn17fGN8Y3xjfH0KLSAgICAgXGhsaW5lIFJPTCh4LCB5KSAmIHtcYmYgdW5zaWduZWQgbG9uZ30geCwge1xiZiB1bnNpZ25lZCBsb25nfSB5ICYgJHggPDwgeSQgXFwKLSAgICAgXGhsaW5lIFJPUih4LCB5KSAmIHtcYmYgdW5zaWduZWQgbG9uZ30geCwge1xiZiB1bnNpZ25lZCBsb25nfSB5ICYgJHggPj4geSQgXFwKKyAgICAgXGhsaW5lIFJPTCh4LCB5KSAmIHtcYmYgdW5zaWduZWQgbG9uZ30geCwge1xiZiB1bnNpZ25lZCBsb25nfSB5ICYgJHggPDwgeSwgMCBcbGUgeSBcbGUgMzEkIFxcCisgICAgIFxobGluZSBST0xjKHgsIHkpICYge1xiZiB1bnNpZ25lZCBsb25nfSB4LCB7XGJmIGNvbnN0IHVuc2lnbmVkIGxvbmd9IHkgJiAkeCA8PCB5LCAwIFxsZSB5IFxsZSAzMSQgXFwKKyAgICAgXGhsaW5lIFJPUih4LCB5KSAmIHtcYmYgdW5zaWduZWQgbG9uZ30geCwge1xiZiB1bnNpZ25lZCBsb25nfSB5ICYgJHggPj4geSwgMCBcbGUgeSBcbGUgMzEkIFxcCisgICAgIFxobGluZSBST1JjKHgsIHkpICYge1xiZiB1bnNpZ25lZCBsb25nfSB4LCB7XGJmIGNvbnN0IHVuc2lnbmVkIGxvbmd9IHkgJiAkeCA+PiB5LCAwIFxsZSB5IFxsZSAzMSQgXFwKKyAgICAgXGhsaW5lICYmIFxcCisgICAgIFxobGluZSBST0w2NCh4LCB5KSAmIHtcYmYgdW5zaWduZWQgbG9uZ30geCwge1xiZiB1bnNpZ25lZCBsb25nfSB5ICYgJHggPDwgeSwgMCBcbGUgeSBcbGUgNjMkIFxcCisgICAgIFxobGluZSBST0w2NGMoeCwgeSkgJiB7XGJmIHVuc2lnbmVkIGxvbmd9IHgsIHtcYmYgY29uc3QgdW5zaWduZWQgbG9uZ30geSAmICR4IDw8IHksIDAgXGxlIHkgXGxlIDYzJCBcXAorICAgICBcaGxpbmUgUk9SNjQoeCwgeSkgJiB7XGJmIHVuc2lnbmVkIGxvbmd9IHgsIHtcYmYgdW5zaWduZWQgbG9uZ30geSAmICR4ID4+IHksIDAgXGxlIHkgXGxlIDYzJCBcXAorICAgICBcaGxpbmUgUk9SNjRjKHgsIHkpICYge1xiZiB1bnNpZ25lZCBsb25nfSB4LCB7XGJmIGNvbnN0IHVuc2lnbmVkIGxvbmd9IHkgJiAkeCA+PiB5LCAwIFxsZSB5IFxsZSA2MyQgXFwKICAgICAgXGhsaW5lCiBcZW5ke3RhYnVsYXJ9CiBcZW5ke2NlbnRlcn0KQEAgLTMxNywxNCArMjg1LDE0IEBACiB0aGUgb3V0cHV0IHdpbGwgYmUgc3RvcmVkLiAgRm9yIGV4YW1wbGU6CiBcYmVnaW57c21hbGx9CiBcYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSA8bXljcnlwdC5oPgorI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CiBpbnQgbWFpbih2b2lkKSB7CiAgICAgcnNhX2tleSBrZXk7CiAgICAgdW5zaWduZWQgY2hhciBidWZmZXJbMTAyNF07CiAgICAgdW5zaWduZWQgbG9uZyB4OwogICAgIGludCBlcnI7CiAKLSAgICAvKiAuLi4gTWFrZSB1cCB0aGUgUlNBIGtleSBzb21laG93ICovCisgICAgLyogLi4uIE1ha2UgdXAgdGhlIFJTQSBrZXkgc29tZWhvdyAuLi4gKi8KIAogICAgIC8qIGxldHMgZXhwb3J0IHRoZSBrZXksIHNldCB4IHRvIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyICovCiAgICAgeCA9IHNpemVvZihidWZmZXIpOwpAQCAtMzQyLDEzICszMTAsMTcgQEAKIH0KIFxlbmR7dmVyYmF0aW19CiBcZW5ke3NtYWxsfQotSW4gdGhlIGFib3ZlIGV4YW1wbGUgaWYgdGhlIHNpemUgb2YgdGhlIFJTQSBwdWJsaWMga2V5IHdhcyBtb3JlIHRoYW4gMTAyNCBieXRlcyB0aGlzIGZ1bmN0aW9uIHdvdWxkIG5vdCBzdG9yZSBhbnl0aGluZyBpbgotZWl0aGVyIGBgYnVmZmVyJycgb3IgYGB4JycgYW5kIHNpbXBseSByZXR1cm4gYW4gZXJyb3IgY29kZS4gIElmIHRoZSBmdW5jdGlvbiBzdWNlZWRzIGl0IHN0b3JlcyB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQKLWJhY2sgaW50byBgYHgnJyBzbyB0aGF0IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIHdpbGwga25vdyBob3cgbWFueSBieXRlcyB1c2VkLgorSW4gdGhlIGFib3ZlIGV4YW1wbGUgaWYgdGhlIHNpemUgb2YgdGhlIFJTQSBwdWJsaWMga2V5IHdhcyBtb3JlIHRoYW4gMTAyNCBieXRlcyB0aGlzIGZ1bmN0aW9uIHdvdWxkIHJldHVybiBhbiBlcnJvciBjb2RlCitpbmRpY2F0aW5nIGEgYnVmZmVyIG92ZXJmbG93IHdvdWxkIGhhdmUgb2NjdXJyZWQuICBJZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMgaXQgc3RvcmVzIHRoZSBsZW5ndGggb2YgdGhlIG91dHB1dAorYmFjayBpbnRvIGBgeCcnIHNvIHRoYXQgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gd2lsbCBrbm93IGhvdyBtYW55IGJ5dGVzIHdlcmUgdXNlZC4KIAogXHNlY3Rpb257RnVuY3Rpb25zIHRoYXQgbmVlZCBhIFBSTkd9Ci1DZXJ0YWluIGZ1bmN0aW9ucyBzdWNoIGFzIGBgcnNhXF9tYWtlXF9rZXkoKScnIHJlcXVpcmUgYSBQUk5HLiAgVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBzZXR1cCB0aGUgUFJORyB0aGVtc2VsdmVzIHNvIGl0IGlzIAotdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIFBSTkcgYmVmb3JlIGNhbGxpbmcgdGhlbS4KK1xpbmRleHtQc2V1ZG8gUmFuZG9tIE51bWJlciBHZW5lcmF0b3J9IFxpbmRleHtQUk5HfQorQ2VydGFpbiBmdW5jdGlvbnMgc3VjaCBhcyBgYHJzYVxfbWFrZVxfa2V5KCknJyByZXF1aXJlIGEgUHNldWRvIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIChQUk5HKS4gIFRoZXNlIGZ1bmN0aW9ucyBkbyBub3Qgc2V0dXAgCit0aGUgUFJORyB0aGVtc2VsdmVzIHNvIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBQUk5HIGJlZm9yZSBjYWxsaW5nIHRoZW0uCisKK0NlcnRhaW4gUFJORyBhbGdvcml0aG1zIGRvIG5vdCByZXF1aXJlIGEgYGBwcm5nXF9zdGF0ZScnIGFyZ3VtZW50IChzcHJuZyBmb3IgZXhhbXBsZSkuICBUaGUgYGBwcm5nXF9zdGF0ZScnIGFyZ3VtZW50CittYXkgYmUgcGFzc2VkIGFzIFx0ZXh0YmZ7TlVMTH0gaW4gc3VjaCBzaXR1YXRpb25zLgogCiBcc2VjdGlvbntGdW5jdGlvbnMgdGhhdCB1c2UgQXJyYXlzIG9mIE9jdGV0c30KIE1vc3QgZnVuY3Rpb25zIHJlcXVpcmUgaW5wdXRzIHRoYXQgYXJlIGFycmF5cyBvZiB0aGUgZGF0YSB0eXBlIGBgdW5zaWduZWQgY2hhcicnLiAgV2hldGhlciBpdCBpcyBhIHN5bW1ldHJpYyBrZXksIElWCkBAIC0zNjMsMTQgKzMzNSwxNiBAQAogXGNoYXB0ZXJ7U3ltbWV0cmljIEJsb2NrIENpcGhlcnN9CiBcc2VjdGlvbntDb3JlIEZ1bmN0aW9uc30KIAotTGlidG9tY3J5cHQgcHJvdmlkZXMgc2V2ZXJhbCBibG9jayBjaXBoZXJzIGFsbCBpbiBhIHBsYWluIHZhbmlsbGEgRUNCIGJsb2NrIG1vZGUuICBJdHMgaW1wb3J0YW50IHRvIGZpcnN0IG5vdGUgdGhhdCB5b3UgCitMaWJUb21DcnlwdCBwcm92aWRlcyBzZXZlcmFsIGJsb2NrIGNpcGhlcnMgd2l0aCBhbiBFQ0IgYmxvY2sgbW9kZSBpbnRlcmZhY2UuICBJdCdzIGltcG9ydGFudCB0byBmaXJzdCBub3RlIHRoYXQgeW91IAogc2hvdWxkIG5ldmVyIHVzZSB0aGUgRUNCIG1vZGVzIGRpcmVjdGx5IHRvIGVuY3J5cHQgZGF0YS4gIEluc3RlYWQgeW91IHNob3VsZCB1c2UgdGhlIEVDQiBmdW5jdGlvbnMgdG8gbWFrZSBhIGNoYWluaW5nIG1vZGUKIG9yIHVzZSBvbmUgb2YgdGhlIHByb3ZpZGVkIGNoYWluaW5nIG1vZGVzLiAgQWxsIG9mIHRoZSBjaXBoZXJzIGFyZSB3cml0dGVuIGFzIEVDQiBpbnRlcmZhY2VzIHNpbmNlIGl0IGFsbG93cyB0aGUgcmVzdCBvZgogdGhlIEFQSSB0byBncm93IGluIGEgbW9kdWxhciBmYXNoaW9uLgogCitcc3Vic2VjdGlvbntLZXkgU2NoZWR1bGluZ30KIEFsbCBjaXBoZXJzIHN0b3JlIHRoZWlyIHNjaGVkdWxlZCBrZXlzIGluIGEgc2luZ2xlIGRhdGEgdHlwZSBjYWxsZWQgYGBzeW1tZXRyaWNcX2tleScnLiAgVGhpcyBhbGxvd3MgYWxsIGNpcGhlcnMgdG8gCi1oYXZlIHRoZSBzYW1lIHByb3RvdHlwZSBhbmQgc3RvcmUgdGhlaXIga2V5cyBhcyAgbmF0dXJhbGx5IGFzIHBvc3NpYmxlLiAgQWxsIGNpcGhlcnMgcHJvdmlkZSBmaXZlIHZpc2libGUgZnVuY3Rpb25zIHdoaWNoCi1hcmUgKGdpdmVuIHRoYXQgWFhYIGlzIHRoZSBuYW1lIG9mIHRoZSBjaXBoZXIpOgoraGF2ZSB0aGUgc2FtZSBwcm90b3R5cGUgYW5kIHN0b3JlIHRoZWlyIGtleXMgYXMgbmF0dXJhbGx5IGFzIHBvc3NpYmxlLiAgVGhpcyBhbHNvIHJlbW92ZXMgdGhlIG5lZWQgZm9yIGR5bmFtaWMgbWVtb3J5CithbGxvY2F0aW9uIGFuZCBhbGxvd3MgeW91IHRvIGFsbG9jYXRlIGEgZml4ZWQgc2l6ZWQgYnVmZmVyIGZvciBzdG9yaW5nIHNjaGVkdWxlZCBrZXlzLiAgQWxsIGNpcGhlcnMgcHJvdmlkZSBmaXZlIHZpc2libGUgCitmdW5jdGlvbnMgd2hpY2ggYXJlIChnaXZlbiB0aGF0IFhYWCBpcyB0aGUgbmFtZSBvZiB0aGUgY2lwaGVyKToKIFxpbmRleHtDaXBoZXIgU2V0dXB9CiBcYmVnaW57dmVyYmF0aW19CiBpbnQgWFhYX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IHJvdW5kcywKQEAgLTM4MCwxMiArMzU0LDEzIEBACiBUaGUgWFhYXF9zZXR1cCgpIHJvdXRpbmUgd2lsbCBzZXR1cCB0aGUgY2lwaGVyIHRvIGJlIHVzZWQgd2l0aCBhIGdpdmVuIG51bWJlciBvZiByb3VuZHMgYW5kIGEgZ2l2ZW4ga2V5IGxlbmd0aCAoaW4gYnl0ZXMpLgogVGhlIG51bWJlciBvZiByb3VuZHMgY2FuIGJlIHNldCB0byB6ZXJvIHRvIHVzZSB0aGUgZGVmYXVsdCwgd2hpY2ggaXMgZ2VuZXJhbGx5IGEgZ29vZCBpZGVhLgogCi1JZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBzdWNjZXNzZnVsbHkgdGhlIHZhcmlhYmxlIGBgc2tleScnIHdpbGwgaGF2ZSBhIHNjaGVkdWxlZCBrZXkgc3RvcmVkIGluIGl0LiAgSXRzIGltcG9ydGFudCB0byBub3RlCi10aGF0IHlvdSBzaG91bGQgb25seSB1c2VkIHRoaXMgc2NoZWR1bGVkIGtleSB3aXRoIHRoZSBpbnRlbmRlZCBjaXBoZXIuICBGb3IgZXhhbXBsZSwgaWYgeW91IGNhbGwgCi1gYGJsb3dmaXNoXF9zZXR1cCgpJycgZG8gbm90IHBhc3MgdGhlIHNjaGVkdWxlZCBrZXkgb250byBgYHJjNVxfZWNiXF9lbmNyeXB0KCknJy4gIEFsbCBzZXR1cCBmdW5jdGlvbnMgZG8gbm90IGFsbG9jYXRlIAotbWVtb3J5IG9mZiB0aGUgaGVhcCBzbyB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIGEga2V5IHlvdSBjYW4gc2ltcGx5IGRpc2NhcmQgaXQgKGUuZy4gdGhleSBjYW4gYmUgb24gdGhlIHN0YWNrKS4KK0lmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3NmdWxseSB0aGUgdmFyaWFibGUgYGBza2V5Jycgd2lsbCBoYXZlIGEgc2NoZWR1bGVkIGtleSBzdG9yZWQgaW4gaXQuICBJdCdzIGltcG9ydGFudCB0byBub3RlCit0aGF0IHlvdSBzaG91bGQgb25seSB1c2VkIHRoaXMgc2NoZWR1bGVkIGtleSB3aXRoIHRoZSBpbnRlbmRlZCBjaXBoZXIuICBGb3IgZXhhbXBsZSwgaWYgeW91IGNhbGwgYGBibG93ZmlzaFxfc2V0dXAoKScnIGRvIG5vdCAKK3Bhc3MgdGhlIHNjaGVkdWxlZCBrZXkgb250byBgYHJjNVxfZWNiXF9lbmNyeXB0KCknJy4gIEFsbCBzZXR1cCBmdW5jdGlvbnMgZG8gbm90IGFsbG9jYXRlIG1lbW9yeSBvZmYgdGhlIGhlYXAgc28gd2hlbiB5b3UgYXJlIAorZG9uZSB3aXRoIGEga2V5IHlvdSBjYW4gc2ltcGx5IGRpc2NhcmQgaXQgKGUuZy4gdGhleSBjYW4gYmUgb24gdGhlIHN0YWNrKS4KIAotVG8gZW5jcnlwdCBvciBkZWNyeXB0IGEgYmxvY2sgaW4gRUNCIG1vZGUgdGhlcmUgYXJlIHRoZXNlIHR3byBmdW5jdGlvbnM6Citcc3Vic2VjdGlvbntFQ0IgRW5jcnlwdGlvbiBhbmQgRGVjcnlwdGlvbn0KK1RvIGVuY3J5cHQgb3IgZGVjcnlwdCBhIGJsb2NrIGluIEVDQiBtb2RlIHRoZXJlIGFyZSB0aGVzZSB0d28gZnVuY3Rpb24gY2xhc3NlcwogXGluZGV4e0NpcGhlciBFbmNyeXB0fSBcaW5kZXh7Q2lwaGVyIERlY3J5cHR9CiBcYmVnaW57dmVyYmF0aW19CiB2b2lkIFhYWF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsCkBAIC0zOTYsMTMgKzM3MSwyMCBAQAogXGVuZHt2ZXJiYXRpbX0KIFRoZXNlIHR3byBmdW5jdGlvbnMgd2lsbCBlbmNyeXB0IG9yIGRlY3J5cHQgKHJlc3BlY3RpdmVseSkgYSBzaW5nbGUgYmxvY2sgb2YgdGV4dFxmb290bm90ZXtUaGUgc2l6ZSBvZiB3aGljaCBkZXBlbmRzIG9uCiB3aGljaCBjaXBoZXIgeW91IGFyZSB1c2luZy59IGFuZCBzdG9yZSB0aGUgcmVzdWx0IHdoZXJlIHlvdSB3YW50IGl0LiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgYXJlIAotdGhlIHNhbWUgYnVmZmVyLiAgRm9yIHRoZSBlbmNyeXB0IGZ1bmN0aW9uIGBgcHQnJ1xmb290bm90ZXtwdCBzdGFuZHMgZm9yIHBsYWludGV4dC59IGlzIHRoZSBpbnB1dCBhbmQgYGBjdCcnIGlzIHRoZSBvdXRwdXQuCi1Gb3IgdGhlIGRlY3J5cHRpb24gZnVuY3Rpb24gaXRzIHRoZSBvcHBvc2l0ZS4gIFRvIHRlc3QgYSBwYXJ0aWN1bGFyIGNpcGhlciBhZ2FpbnN0IHRlc3QgdmVjdG9yc1xmb290bm90ZXtBcyBwdWJsaXNoZWQgaW4gdGhlaXIgZGVzaWduIHBhcGVycy59IGNhbGw6IFxpbmRleHtDaXBoZXIgVGVzdGluZ30KK3RoZSBzYW1lIGJ1ZmZlci4gIEZvciB0aGUgZW5jcnlwdCBmdW5jdGlvbiBgYHB0JydcZm9vdG5vdGV7cHQgc3RhbmRzIGZvciBwbGFpbnRleHQufSBpcyB0aGUgaW5wdXQgYW5kIAorYGBjdCcnXGZvb3Rub3Rle2N0IHN0YW5kcyBmb3IgY2lwaGVydGV4dC59IGlzIHRoZSBvdXRwdXQuICBGb3IgdGhlIGRlY3J5cHRpb24gZnVuY3Rpb24gaXQncyB0aGUgb3Bwb3NpdGUuICBUbyB0ZXN0IGEgcGFydGljdWxhciAKK2NpcGhlciBhZ2FpbnN0IHRlc3QgdmVjdG9yc1xmb290bm90ZXtBcyBwdWJsaXNoZWQgaW4gdGhlaXIgZGVzaWduIHBhcGVycy59IGNhbGwgdGhlIHNlbGYtdGVzdCBmdW5jdGlvbgorIAorXHN1YnNlY3Rpb257U2VsZi0tVGVzdGluZ30KK1xpbmRleHtDaXBoZXIgVGVzdGluZ30KIFxiZWdpbnt2ZXJiYXRpbX0KIGludCBYWFhfdGVzdCh2b2lkKTsKIFxlbmR7dmVyYmF0aW19CiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHtcYmYgQ1JZUFRcX09LfSBpZiB0aGUgY2lwaGVyIG1hdGNoZXMgdGhlIHRlc3QgdmVjdG9ycyBmcm9tIHRoZSBkZXNpZ24gcHVibGljYXRpb24gaXQgaXMgCi1iYXNlZCB1cG9uLiAgRmluYWxseSBmb3IgZWFjaCBjaXBoZXIgdGhlcmUgaXMgYSBmdW5jdGlvbiB3aGljaCB3aWxsIGhlbHAgZmluZCBhIGRlc2lyZWQga2V5IHNpemU6CitiYXNlZCB1cG9uLiAgCisKK1xzdWJzZWN0aW9ue0tleSBTaXppbmd9CitGb3IgZWFjaCBjaXBoZXIgdGhlcmUgaXMgYSBmdW5jdGlvbiB3aGljaCB3aWxsIGhlbHAgZmluZCBhIGRlc2lyZWQga2V5IHNpemU6CiBcYmVnaW57dmVyYmF0aW19CiBpbnQgWFhYX2tleXNpemUoaW50ICprZXlzaXplKTsKIFxlbmR7dmVyYmF0aW19CkBAIC00MTAsNyArMzkyLDcgQEAKIHJldHVybiB7XGJmIENSWVBUXF9PS30gaWYgdGhlIGtleSBzaXplIHNwZWNpZmllZCBpcyBhY2NlcHRhYmxlLiAgRm9yIGV4YW1wbGU6CiBcYmVnaW57c21hbGx9CiBcYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSA8bXljcnlwdC5oPgorI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CiBpbnQgbWFpbih2b2lkKQogewogICAgaW50IGtleXNpemUsIGVycjsKQEAgLTQyNiwxMiArNDA4LDIzIEBACiB9CiBcZW5ke3ZlcmJhdGltfQogXGVuZHtzbWFsbH0KLVRoaXMgc2hvdWxkIGluZGljYXRlIGEga2V5c2l6ZSBvZiBzaXh0ZWVuIGJ5dGVzIGlzIHN1Z2dlc3RlZC4gIEFuIGV4YW1wbGUgc25pcHBldCB0aGF0IGVuY29kZXMgYSBibG9jayB3aXRoIAotQmxvd2Zpc2ggaW4gRUNCIG1vZGUgaXMgYmVsb3cuCitUaGlzIHNob3VsZCBpbmRpY2F0ZSBhIGtleXNpemUgb2Ygc2l4dGVlbiBieXRlcyBpcyBzdWdnZXN0ZWQuICAKKworXHN1YnNlY3Rpb257Q2lwaGVyIFRlcm1pbmF0aW9ufQorV2hlbiB5b3UgYXJlIGZpbmlzaGVkIHdpdGggYSBjaXBoZXIgeW91IGNhbiBkZS0taW5pdGlhbGl6ZSBpdCB3aXRoIHRoZSBkb25lIGZ1bmN0aW9uLgorXGJlZ2lue3ZlcmJhdGltfQordm9pZCBYWFhfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KTsKK1xlbmR7dmVyYmF0aW19CitGb3IgdGhlIHNvZnR3YXJlIGJhc2VkIGNpcGhlcnMgd2l0aGluIExpYlRvbUNyeXB0IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZG8gYW55dGhpbmcuICBIb3dldmVyLCB1c2VyIHN1cHBsaWVkCitjaXBoZXIgZGVzY3JpcHRvcnMgbWF5IHJlcXVpcmUgY2FsbHMgdG8gaXQgZm9yIHJlc291cmNlIG1hbmFnZW1lbnQuICBUbyBiZSBjb21wbGlhbnQgYWxsIGZ1bmN0aW9ucyB3aGljaCBjYWxsIGEgY2lwaGVyCitzZXR1cCBmdW5jdGlvbiBtdXN0IGFsc28gY2FsbCB0aGUgcmVzcGVjdGl2ZSBjaXBoZXIgZG9uZSBmdW5jdGlvbiB3aGVuIGZpbmlzaGVkLgorCitcc3Vic2VjdGlvbntTaW1wbGUgRW5jcnlwdGlvbiBEZW1vbnN0cmF0aW9ufQorQW4gZXhhbXBsZSBzbmlwcGV0IHRoYXQgZW5jb2RlcyBhIGJsb2NrIHdpdGggQmxvd2Zpc2ggaW4gRUNCIG1vZGUgaXMgYmVsb3cuCiAKIFxiZWdpbntzbWFsbH0KIFxiZWdpbnt2ZXJiYXRpbX0KLSNpbmNsdWRlIDxteWNyeXB0Lmg+CisjaW5jbHVkZSA8dG9tY3J5cHQuaD4KIGludCBtYWluKHZvaWQpCiB7IAogICAgdW5zaWduZWQgY2hhciBwdFs4XSwgY3RbOF0sIGtleVs4XTsKQEAgLTQ1NSwxMiArNDQ4LDE5IEBACiAgICBibG93ZmlzaF9lY2JfZW5jcnlwdChwdCwgICAgICAgICAgICAgLyogZW5jcnlwdCB0aGlzIDgtYnl0ZSBhcnJheSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgY3QsICAgICAgICAgICAgIC8qIHN0b3JlIGVuY3J5cHRlZCBkYXRhIGhlcmUgKi8gCiAgICAgICAgICAgICAgICAgICAgICAgICAmc2tleSk7ICAgICAgICAgLyogb3VyIHByZXZpb3VzbHkgc2NoZWR1bGVkIGtleSAqLworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAvKiBub3cgY3QgaG9sZHMgdGhlIGVuY3J5cHRlZCB2ZXJzaW9uIG9mIHB0ICovICAgICAgICAgICAgICAgICAgICAgICAgCiAKICAgIC8qIGRlY3J5cHQgdGhlIGJsb2NrICovCiAgICBibG93ZmlzaF9lY2JfZGVjcnlwdChjdCwgICAgICAgICAgICAgLyogZGVjcnlwdCB0aGlzIDgtYnl0ZSBhcnJheSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgcHQsICAgICAgICAgICAgIC8qIHN0b3JlIGRlY3J5cHRlZCBkYXRhIGhlcmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICZza2V5KTsgICAgICAgICAvKiBvdXIgcHJldmlvdXNseSBzY2hlZHVsZWQga2V5ICovCiAKKyAgIC8qIG5vdyB3ZSBoYXZlIGRlY3J5cHRlZCBjdCB0byB0aGUgb3JpZ2luYWwgcGxhaW50ZXh0IGluIHB0ICovICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgIC8qIFRlcm1pbmF0ZSB0aGUgY2lwaGVyIGNvbnRleHQgKi8KKyAgIGJsb3dmaXNoX2RvbmUoJnNrZXkpOworCiAgICByZXR1cm4gMDsKIH0KIFxlbmR7dmVyYmF0aW19CkBAIC00NzAsNyArNDcwLDcgQEAKIFxpbmRleHtTeW1tZXRyaWMgS2V5c30KIEFzIGEgZ2VuZXJhbCBydWxlIG9mIHRodW1iIGRvIG5vdCB1c2Ugc3ltbWV0cmljIGtleXMgdW5kZXIgODAgYml0cyBpZiB5b3UgY2FuLiAgT25seSBhIGZldyBvZiB0aGUgY2lwaGVycyBzdXBwb3J0IHNtYWxsZXIKIGtleXMgKG1haW5seSBmb3IgdGVzdCB2ZWN0b3JzIGFueXdheXMpLiAgSWRlYWxseSB5b3VyIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBtYWtpbmcgYXQgbGVhc3QgMjU2IGJpdCBrZXlzLiAgVGhpcyBpcyBub3QKLWJlY2F1c2UgeW91J3JlIHN1cHBvc2VkIHRvIGJlIHBhcmFub2lkLiAgSXRzIGJlY2F1c2UgaWYgeW91ciBQUk5HIGhhcyBhIGJpYXMgb2YgYW55IHNvcnQgdGhlIG1vcmUgYml0cyB0aGUgYmV0dGVyLiAgRm9yCitiZWNhdXNlIHlvdSdyZSBzdXBwb3NlZCB0byBiZSBwYXJhbm9pZC4gIEl0J3MgYmVjYXVzZSBpZiB5b3VyIFBSTkcgaGFzIGEgYmlhcyBvZiBhbnkgc29ydCB0aGUgbW9yZSBiaXRzIHRoZSBiZXR0ZXIuICBGb3IKIGV4YW1wbGUsIGlmIHlvdSBoYXZlICRcbWJveHtQcn1cbGVmdFtYID0gMVxyaWdodF0gPSB7MSBcb3ZlciAyfSBccG0gXGdhbW1hJCB3aGVyZSAkXHZlcnQgXGdhbW1hIFx2ZXJ0ID4gMCQgdGhlbiB0aGUKIHRvdGFsIGFtb3VudCBvZiBlbnRyb3B5IGluIE4gYml0cyBpcyAkTiBcY2RvdCAtbG9nXzJcbGVmdCAoezEgXG92ZXIgMn0gKyBcdmVydCBcZ2FtbWEgXHZlcnQgXHJpZ2h0KSQuICBTbyBpZiAkXGdhbW1hJAogd2VyZSAkMC4yNSQgKGEgc2V2ZXJlIGJpYXMpIGEgMjU2LWJpdCBzdHJpbmcgd291bGQgaGF2ZSBhYm91dCAxMDYgYml0cyBvZiBlbnRyb3B5IHdoZXJlYXMgYSAxMjgtYml0IHN0cmluZyB3b3VsZCBoYXZlCkBAIC00NzgsMzEgKzQ3OCw2NCBAQAogCiBUaGUgbnVtYmVyIG9mIHJvdW5kcyBvZiBtb3N0IGNpcGhlcnMgaXMgbm90IGFuIG9wdGlvbiB5b3UgY2FuIGNoYW5nZS4gIE9ubHkgUkM1IGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBudW1iZXIgb2YKIHJvdW5kcy4gIEJ5IHBhc3NpbmcgemVybyBhcyB0aGUgbnVtYmVyIG9mIHJvdW5kcyBhbGwgY2lwaGVycyB3aWxsIHVzZSB0aGVpciBkZWZhdWx0IG51bWJlciBvZiByb3VuZHMuICBHZW5lcmFsbHkgdGhlCi1jaXBoZXJzIGFyZSBjb25maWd1cmVkIHN1Y2ggdGhhdCB0aGUgZGVmYXVsdCBudW1iZXIgb2Ygcm91bmRzIHByb3ZpZGUgYWRlcXVhdGUgc2VjdXJpdHkgZm9yIHRoZSBnaXZlbiBibG9jayBzaXplLgorY2lwaGVycyBhcmUgY29uZmlndXJlZCBzdWNoIHRoYXQgdGhlIGRlZmF1bHQgbnVtYmVyIG9mIHJvdW5kcyBwcm92aWRlIGFkZXF1YXRlIHNlY3VyaXR5IGZvciB0aGUgZ2l2ZW4gYmxvY2sgYW5kIGtleSAKK3NpemUuCiAKIFxzZWN0aW9ue1RoZSBDaXBoZXIgRGVzY3JpcHRvcnN9CiBcaW5kZXh7Q2lwaGVyIERlc2NyaXB0b3J9CiBUbyBmYWNpbGl0YXRlIGF1dG9tYXRpYyByb3V0aW5lcyBhbiBhcnJheSBvZiBjaXBoZXIgZGVzY3JpcHRvcnMgaXMgcHJvdmlkZWQgaW4gdGhlIGFycmF5IGBgY2lwaGVyXF9kZXNjcmlwdG9yJycuICBBbiBlbGVtZW50CiBvZiB0aGlzIGFycmF5IGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKIAorXGJlZ2lue3NtYWxsfQogXGJlZ2lue3ZlcmJhdGltfQogc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciB7CiAgICBjaGFyICpuYW1lOwotICAgdW5zaWduZWQgbG9uZyBtaW5fa2V5X2xlbmd0aCwgbWF4X2tleV9sZW5ndGgsIAotICAgICAgICAgICAgICAgICBibG9ja19sZW5ndGgsIGRlZmF1bHRfcm91bmRzOwotICAgaW50ICAoKnNldHVwKSAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW5ndGgsIAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Ci0gICB2b2lkICgqZWNiX2VuY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHN5bW1ldHJpY19rZXkgKmtleSk7Ci0gICB2b2lkICgqZWNiX2RlY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3ltbWV0cmljX2tleSAqa2V5KTsKLSAgIGludCAgKCp0ZXN0KSAgICAgICAodm9pZCk7Ci0gICBpbnQgICgqa2V5c2l6ZSkgICAgKGludCAqZGVzaXJlZF9rZXlzaXplKTsKKyAgIHVuc2lnbmVkIGNoYXIgSUQ7CisgICBpbnQgIG1pbl9rZXlfbGVuZ3RoLCAKKyAgICAgICAgbWF4X2tleV9sZW5ndGgsIAorICAgICAgICBibG9ja19sZW5ndGgsIAorICAgICAgICBkZWZhdWx0X3JvdW5kczsKKyAgIGludCAgKCpzZXR1cCkoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7CisgICB2b2lkICgqZWNiX2VuY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSk7CisgICB2b2lkICgqZWNiX2RlY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSk7CisgICBpbnQgKCp0ZXN0KSh2b2lkKTsKKyAgIHZvaWQgKCpkb25lKShzeW1tZXRyaWNfa2V5ICpza2V5KTsgICAgICAKKyAgIGludCAgKCprZXlzaXplKShpbnQgKmtleXNpemUpOworCisgICB2b2lkICgqYWNjZWxfZWNiX2VuY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJsb2Nrcywgc3ltbWV0cmljX2tleSAqc2tleSk7CisgICB2b2lkICgqYWNjZWxfZWNiX2RlY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJsb2Nrcywgc3ltbWV0cmljX2tleSAqc2tleSk7CisgICB2b2lkICgqYWNjZWxfY2JjX2VuY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJsb2NrcywgdW5zaWduZWQgY2hhciAqSVYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKyAgIHZvaWQgKCphY2NlbF9jYmNfZGVjcnlwdCkoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzLCB1bnNpZ25lZCBjaGFyICpJViwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW1ldHJpY19rZXkgKnNrZXkpOworICAgdm9pZCAoKmFjY2VsX2N0cl9lbmNyeXB0KShjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBibG9ja3MsIHVuc2lnbmVkIGNoYXIgKklWLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsIHN5bW1ldHJpY19rZXkgKnNrZXkpOworICAgdm9pZCAoKmFjY2VsX2NjbV9tZW1vcnkpKAorICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbm9uY2UsICB1bnNpZ25lZCBsb25nIG5vbmNlbGVuLAorICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBoZWFkZXJsZW4sCisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsICAgICB1bnNpZ25lZCBsb25nIHB0bGVuLAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhZywgICAgdW5zaWduZWQgbG9uZyAqdGFnbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGRpcmVjdGlvbik7CisKIH07CiBcZW5ke3ZlcmJhdGltfQorXGVuZHtzbWFsbH0KIAotV2hlcmUgYGBuYW1lJycgaXMgdGhlIGxvd2VyIGNhc2UgQVNDSUkgdmVyc2lvbiBvZiB0aGUgbmFtZS4gIFRoZSBmaWVsZHMgYGBtaW5cX2tleVxfbGVuZ3RoJycsIGBgbWF4XF9rZXlcX2xlbmd0aCcnIGFuZAotYGBibG9ja1xfbGVuZ3RoJycgYXJlIGFsbCB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5vdCBiaXRzLiAgQXMgYSBnb29kIHJ1bGUgb2YgdGh1bWIgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBjaXBoZXIgc3VwcG9ydHMKK1doZXJlIGBgbmFtZScnIGlzIHRoZSBsb3dlciBjYXNlIEFTQ0lJIHZlcnNpb24gb2YgdGhlIG5hbWUuICBUaGUgZmllbGRzIGBgbWluXF9rZXlcX2xlbmd0aCcnIGFuZCBgYG1heFxfa2V5XF9sZW5ndGgnJyAKK2FyZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBrZXkgc2l6ZXMgaW4gYnl0ZXMuICBUaGUgYGBibG9ja1xfbGVuZ3RoJycgbWVtYmVyIGlzIHRoZSBibG9jayBzaXplIG9mIHRoZSBjaXBoZXIKK2luIGJ5dGVzLiAgQXMgYSBnb29kIHJ1bGUgb2YgdGh1bWIgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBjaXBoZXIgc3VwcG9ydHMKIHRoZSBtaW4gYW5kIG1heCBrZXkgbGVuZ3RocyBidXQgbm90IGFsd2F5cyBldmVyeXRoaW5nIGluIGJldHdlZW4uICBUaGUgYGBkZWZhdWx0XF9yb3VuZHMnJyBmaWVsZCBpcyB0aGUgZGVmYXVsdCBudW1iZXIKIG9mIHJvdW5kcyB0aGF0IHdpbGwgYmUgdXNlZC4KIApAQCAtNTIyLDEwICs1NTUsNiBAQAogICAgICBcaGxpbmUgUkM1LTMyLzEyL2IgJiByYzVcX2Rlc2MgJiA4ICYgOCAkXGxkb3RzJCAxMjggJiAxMiAkXGxkb3RzJCAyNCBcXAogICAgICBcaGxpbmUgUkM2LTMyLzIwL2IgJiByYzZcX2Rlc2MgJiAxNiAmIDggJFxsZG90cyQgMTI4ICYgMjAgXFwKICAgICAgXGhsaW5lIFNBRkVSKyAmIHNhZmVycFxfZGVzYyAmMTYgJiAxNiwgMjQsIDMyICYgOCwgMTIsIDE2IFxcCi0gICAgIFxobGluZSBTYWZlciBLNjQgICAmIHNhZmVyXF9rNjRcX2Rlc2MgJiA4ICYgOCAmIDYgJFxsZG90cyQgMTMgXFwKLSAgICAgXGhsaW5lIFNhZmVyIFNLNjQgICYgc2FmZXJcX3NrNjRcX2Rlc2MgJiA4ICYgOCAmIDYgJFxsZG90cyQgMTMgXFwKLSAgICAgXGhsaW5lIFNhZmVyIEsxMjggICYgc2FmZXJcX2sxMjhcX2Rlc2MgJiA4ICYgMTYgJiA2ICRcbGRvdHMkIDEzIFxcCi0gICAgIFxobGluZSBTYWZlciBTSzEyOCAmIHNhZmVyXF9zazEyOFxfZGVzYyAmIDggJiAxNiAmIDYgJFxsZG90cyQgMTMgXFwKICAgICAgXGhsaW5lIEFFUyAmIGFlc1xfZGVzYyAmIDE2ICYgMTYsIDI0LCAzMiAmIDEwLCAxMiwgMTQgXFwKICAgICAgICAgICAgICAgICAmIGFlc1xfZW5jXF9kZXNjICYgMTYgJiAxNiwgMjQsIDMyICYgMTAsIDEyLCAxNCBcXAogICAgICBcaGxpbmUgVHdvZmlzaCAmIHR3b2Zpc2hcX2Rlc2MgJiAxNiAmIDE2LCAyNCwgMzIgJiAxNiBcXApAQCAtNTM0LDYgKzU2Myw4IEBACiAgICAgIFxobGluZSBDQVNUNSAoQ0FTVC0xMjgpICYgY2FzdDVcX2Rlc2MgJiA4ICYgNSAkXGxkb3RzJCAxNiAmIDEyLCAxNiBcXAogICAgICBcaGxpbmUgTm9la2VvbiAmIG5vZWtlb25cX2Rlc2MgJiAxNiAmIDE2ICYgMTYgXFwKICAgICAgXGhsaW5lIFNraXBqYWNrICYgc2tpcGphY2tcX2Rlc2MgJiA4ICYgMTAgJiAzMiBcXAorICAgICBcaGxpbmUgQW51YmlzICYgYW51YmlzXF9kZXNjICYgMTYgJiAxNiAkXGxkb3RzJCA0MCAmIDEyICRcbGRvdHMkIDE4IFxcCisgICAgIFxobGluZSBLaGF6YWQgJiBraGF6YWRcX2Rlc2MgJiA4ICYgMTYgJiA4IFxcCiAgICAgIFxobGluZQogXGVuZHt0YWJ1bGFyfQogXGVuZHtjZW50ZXJ9CkBAIC01NTYsMTggKzU4NywxMyBAQAogUmlqbmRhZWwgYXMgaXQgbWFrZXMgdGhlIG1vc3Qgc2Vuc2UgZm9yIHRoaXMgY2lwaGVyLgogCiBcaXRlbQotRm9yIHRoZSA2NC1iaXQgU0FGRVIgZmFtbGl5IG9mIGNpcGhlcnMgKGUuZyBLNjQsIFNLNjQsIEsxMjgsIFNLMTI4KSB0aGUgZWNiXF9lbmNyeXB0KCkgYW5kIGVjYlxfZGVjcnlwdCgpCi1mdW5jdGlvbnMgYXJlIHRoZSBzYW1lLiAgU28gaWYgeW91IHdhbnQgdG8gdXNlIHRob3NlIGZ1bmN0aW9ucyBkaXJlY3RseSBqdXN0IGNhbGwgc2FmZXJcX2VjYlxfZW5jcnlwdCgpCi1vciBzYWZlclxfZWNiXF9kZWNyeXB0KCkgcmVzcGVjdGl2ZWx5LgotCi1caXRlbQogTm90ZSB0aGF0IGZvciBgYERFUycnIGFuZCBgYDNERVMnJyB0aGV5IHVzZSA4IGFuZCAyNCBieXRlIGtleXMgYnV0IG9ubHkgNyBhbmQgMjEgW3Jlc3BlY3RpdmVseV0gYnl0ZXMgb2YgdGhlIGtleXMgYXJlIGluCiBmYWN0IHVzZWQgZm9yIHRoZSBwdXJwb3NlcyBvZiBlbmNyeXB0aW9uLiAgTXkgc3VnZ2VzdGlvbiBpcyBqdXN0IHRvIHVzZSByYW5kb20gOC8yNCBieXRlIGtleXMgaW5zdGVhZCBvZiB0cnlpbmcgdG8gbWFrZSBhIDgvMjQKIGJ5dGUgc3RyaW5nIGZyb20gdGhlIHJlYWwgNy8yMSBieXRlIGtleS4KIAogXGl0ZW0KIE5vdGUgdGhhdCBgYFR3b2Zpc2gnJyBoYXMgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCB0YWtlIHBsYWNlIGF0IGJ1aWxkIHRpbWUuICBUaGVzZSBvcHRpb25zIGFyZSBmb3VuZCBpbgotdGhlIGZpbGUgYGBteWNyeXB0XF9jZmcuaCcnLiAgVGhlIGZpcnN0IG9wdGlvbiBpcyBgYFRXT0ZJU0hcX1NNQUxMJycgd2hpY2ggd2hlbiBkZWZpbmVkIHdpbGwgZm9yY2UgdGhlIFR3b2Zpc2ggY29kZQordGhlIGZpbGUgYGB0b21jcnlwdFxfY2ZnLmgnJy4gIFRoZSBmaXJzdCBvcHRpb24gaXMgYGBUV09GSVNIXF9TTUFMTCcnIHdoaWNoIHdoZW4gZGVmaW5lZCB3aWxsIGZvcmNlIHRoZSBUd29maXNoIGNvZGUKIHRvIG5vdCBwcmUtY29tcHV0ZSB0aGUgVHdvZmlzaCBgYCRnKFgpJCcnIGZ1bmN0aW9uIGFzIGEgc2V0IG9mIGZvdXIgJDggXHRpbWVzIDMyJCBzLWJveGVzLiAgVGhpcyBtZWFucyB0aGF0IGEgc2NoZWR1bGVkCiBrZXkgd2lsbCByZXF1aXJlIGxlc3MgcmFtIGJ1dCB0aGUgcmVzdWx0aW5nIGNpcGhlciB3aWxsIGJlIHNsb3dlci4gIFRoZSBzZWNvbmQgb3B0aW9uIGlzIGBgVFdPRklTSFxfVEFCTEVTJycgd2hpY2ggd2hlbgogZGVmaW5lZCB3aWxsIGZvcmNlIHRoZSBUd29maXNoIGNvZGUgdG8gdXNlIHByZS1jb21wdXRlZCB0YWJsZXMgZm9yIHRoZSB0d28gcy1ib3hlcyAkcV8wLCBxXzEkIGFzIHdlbGwgYXMgdGhlIG11bHRpcGxpY2F0aW9uCkBAIC01ODEsOSArNjA3LDkgQEAKIFxiZWdpbnt0YWJ1bGFyfXt8bHxsfGx8fQogXGhsaW5lIFRXT0ZJU0hcX1NNQUxMICYgVFdPRklTSFxfVEFCTEVTICYgU3BlZWQgYW5kIE1lbW9yeSAocGVyIGtleSkgXFwKIFxobGluZSB1bmRlZmluZWQgJiB1bmRlZmluZWQgJiBWZXJ5IGZhc3QsIDQuMktCIG9mIHJhbS4gXFwKLVxobGluZSB1bmRlZmluZWQgJiBkZWZpbmVkICYgQXMgYWJvdmUsIGZhc3RlciBrZXlzZXR1cCwgbGFyZ2VyIGNvZGUgKDFLQiBtb3JlKS4gXFwKK1xobGluZSB1bmRlZmluZWQgJiBkZWZpbmVkICYgRmFzdGVyIGtleXNldHVwLCBsYXJnZXIgY29kZS4gXFwKIFxobGluZSBkZWZpbmVkICYgdW5kZWZpbmVkICYgVmVyeSBzbG93LCAwLjJLQiBvZiByYW0uIFxcCi1caGxpbmUgZGVmaW5lZCAmIGRlZmluZWQgJiBTb21ld2hhdCBmYXN0ZXIsIDAuMktCIG9mIHJhbSwgbGFyZ2VyIGNvZGUuIFxcCitcaGxpbmUgZGVmaW5lZCAmIGRlZmluZWQgJiBGYXN0ZXIsIDAuMktCIG9mIHJhbSwgbGFyZ2VyIGNvZGUuIFxcCiBcaGxpbmUKIFxlbmR7dGFidWxhcn0KIFxlbmR7Y2VudGVyfQpAQCAtNjAxLDcgKzYyNyw3IEBACiB0aGUgbG9jYXRpb24gaW4gdGhlIGFycmF5IHdoZXJlIHRoZSBjaXBoZXIgd2FzIGZvdW5kLiAgRm9yIGV4YW1wbGUsIHRvIGluZGlyZWN0bHkgc2V0dXAgQmxvd2Zpc2ggeW91IGNhbiBhbHNvIHVzZToKIFxiZWdpbntzbWFsbH0KIFxiZWdpbnt2ZXJiYXRpbX0KLSNpbmNsdWRlIDxteWNyeXB0Lmg+CisjaW5jbHVkZSA8dG9tY3J5cHQuaD4KIGludCBtYWluKHZvaWQpCiB7CiAgICB1bnNpZ25lZCBjaGFyIGtleVs4XTsKQEAgLTYxNSw3ICs2NDEsOCBAQAogICAgfQogCiAgICAvKiBnZW5lcmljIGNhbGwgdG8gZnVuY3Rpb24gKGFzc3VtaW5nIHRoZSBrZXkgaW4ga2V5W10gd2FzIGFscmVhZHkgc2V0dXApICovCi0gICBpZiAoKGVyciA9IGNpcGhlcl9kZXNjcmlwdG9yW2ZpbmRfY2lwaGVyKCJibG93ZmlzaCIpXS5zZXR1cChrZXksIDgsIDAsICZza2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbZmluZF9jaXBoZXIoImJsb3dmaXNoIildLnNldHVwKGtleSwgOCwgMCwgJnNrZXkpKSAhPSAKKyAgICAgICBDUllQVF9PSykgewogICAgICAgcHJpbnRmKCJFcnJvciBzZXR0aW5nIHVwIEJsb3dmaXNoOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOwogICAgICAgcmV0dXJuIC0xOwogICAgfQpAQCAtNjQxLDcgKzY2OCw3IEBACiBXaGljaCByZXR1cm5zIHtcYmYgQ1JZUFRcX09LfSBpZiBpdCByZW1vdmVzIGl0IG90aGVyd2lzZSBpdCByZXR1cm5zIHtcYmYgQ1JZUFRcX0VSUk9SfS4gIENvbnNpZGVyOgogXGJlZ2lue3NtYWxsfQogXGJlZ2lue3ZlcmJhdGltfQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogaW50IG1haW4odm9pZCkKIHsKICAgIGludCBlcnI7CkBAIC03MzksMTggKzc2NiwyNCBAQAogVGhlIEVDQiBhbmQgQ0JDIG1vZGVzIHByb2Nlc3MgYmxvY2tzIG9mIHRoZSBzYW1lIHNpemUgYXMgdGhlIGNpcGhlciBhdCBhIHRpbWUuICBUaGVyZWZvcmUgdGhleSBhcmUgbGVzcyBmbGV4aWJsZSB0aGFuIHRoZQogb3RoZXIgbW9kZXMuCiAKLVxzdWJzZWN0aW9ue0ltcGxlbWVudGF0aW9ufQorXHN1YnNlY3Rpb257SW5pdGlhbGl6YXRpb259CiBcaW5kZXh7Q0JDIE1vZGV9IFxpbmRleHtDVFIgTW9kZX0KIFxpbmRleHtPRkIgTW9kZX0gXGluZGV4e0NGQiBNb2RlfQogVGhlIGxpYnJhcnkgcHJvdmlkZXMgc2ltcGxlIHN1cHBvcnQgcm91dGluZXMgZm9yIGhhbmRsaW5nIENCQywgQ1RSLCBDRkIsIE9GQiBhbmQgRUNCIGVuY29kZWQgbWVzc2FnZXMuICBBc3N1bWluZyB0aGUgbW9kZSAKIHlvdSB3YW50IGlzIFhYWCB0aGVyZSBpcyBhIHN0cnVjdHVyZSBjYWxsZWQgYGBzeW1tZXRyaWNcX1hYWCcnIHRoYXQgd2lsbCBjb250YWluIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0bwotdXNlIHRoYXQgbW9kZS4gIFRoZXkgaGF2ZSBpZGVudGljYWwgc2V0dXAgcm91dGluZXMgKGV4Y2VwdCBFQ0IgbW9kZSBmb3Igb2J2aW91cyByZWFzb25zKToKK3VzZSB0aGF0IG1vZGUuICBUaGV5IGhhdmUgaWRlbnRpY2FsIHNldHVwIHJvdXRpbmVzIChleGNlcHQgQ1RSIGFuZCBFQ0IgbW9kZSk6CiBcaW5kZXh7ZWNiXF9zdGFydCgpfSBcaW5kZXh7Y2ZiXF9zdGFydCgpfSBcaW5kZXh7Y2JjXF9zdGFydCgpfSBcaW5kZXh7b2ZiXF9zdGFydCgpfSBcaW5kZXh7Y3RyXF9zdGFydCgpfQogXGJlZ2lue3ZlcmJhdGltfQogaW50IFhYWF9zdGFydChpbnQgY2lwaGVyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgCiAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgCiAgICAgICAgICAgICAgIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfWFhYICpYWFgpOwogCitpbnQgY3RyX3N0YXJ0KCAgICAgICAgICAgICAgIGludCAgIGNpcGhlciwKKyAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsCisgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgICAgaW50IGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBudW1fcm91bmRzLCBpbnQgY3RyX21vZGUsCisgICAgICAgICAgICAgICAgICAgc3ltbWV0cmljX0NUUiAqY3RyKTsKKwogaW50IGVjYl9zdGFydChpbnQgY2lwaGVyLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIAogICAgICAgICAgICAgICBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX0VDQiAqZWNiKTsKIFxlbmR7dmVyYmF0aW19CkBAIC03NjIsMzAgKzc5NSwzNyBAQAogcGFyYW1ldGVycyBgYGtleScnLCBgYGtleWxlbicnIGFuZCBgYG51bVxfcm91bmRzJycgYXJlIHRoZSBzYW1lIGFzIGluIHRoZSBYWFhcX3NldHVwKCkgZnVuY3Rpb24gY2FsbC4gIFRoZSBmaW5hbCBwYXJhbWV0ZXIgCiBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB5b3Ugd2FudCB0byBob2xkIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG1vZGUgb2Ygb3BlcmF0aW9uLgogCi1Cb3RoIHJvdXRpbmVzIHJldHVybiB7XGJmIENSWVBUXF9PS30gaWYgdGhlIGNpcGhlciBpbml0aWFsaXplZCBjb3JyZWN0bHksIG90aGVyd2lzZSB0aGV5IHJldHVybiBhbiBlcnJvciBjb2RlLiAgVG8gCi1hY3R1YWxseSBlbmNyeXB0IG9yIGRlY3J5cHQgdGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgcHJvdmlkZWQ6CisKK0luIHRoZSBjYXNlIG9mIENUUiBtb2RlIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyIGBgY3RyXF9tb2RlJycgd2hpY2ggc3BlY2lmaWVzIHRoZSBtb2RlIHRoYXQgdGhlIGNvdW50ZXIgaXMgdG8gYmUgdXNlZCBpbi4KK0lmIFx0ZXh0YmZ7Q1RSXF9DT1VOVEVSXF9MSVRUTEVcX0VORElBTn0gd2FzIHNwZWNpZmllZCB0aGVuIHRoZSBjb3VudGVyIHdpbGwgYmUgdHJlYXRlZCBhcyBhIGxpdHRsZSBlbmRpYW4gdmFsdWUuICBPdGhlcndpc2UsIGlmIAorXHRleHRiZntDVFJcX0NPVU5URVJcX0JJR1xfRU5ESUFOfSB3YXMgc3BlY2lmaWVkIHRoZSBjb3VudGVyIHdpbGwgYmUgdHJlYXRlZCBhcyBhIGJpZyBlbmRpYW4gdmFsdWUuCisKK1RoZSByb3V0aW5lcyByZXR1cm4ge1xiZiBDUllQVFxfT0t9IGlmIHRoZSBjaXBoZXIgaW5pdGlhbGl6ZWQgY29ycmVjdGx5LCBvdGhlcndpc2UgdGhleSByZXR1cm4gYW4gZXJyb3IgY29kZS4gIAorCitcc3Vic2VjdGlvbntFbmNyeXB0aW9uIGFuZCBEZWNyeXB0aW9ufQorVG8gYWN0dWFsbHkgZW5jcnlwdCBvciBkZWNyeXB0IHRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHByb3ZpZGVkOgogXGluZGV4e2VjYlxfZW5jcnlwdCgpfSBcaW5kZXh7ZWNiXF9kZWNyeXB0KCl9IFxpbmRleHtjZmJcX2VuY3J5cHQoKX0gXGluZGV4e2NmYlxfZGVjcnlwdCgpfSAKIFxpbmRleHtjYmNcX2VuY3J5cHQoKX0gXGluZGV4e2NiY1xfZGVjcnlwdCgpfSBcaW5kZXh7b2ZiXF9lbmNyeXB0KCl9IFxpbmRleHtvZmJcX2RlY3J5cHQoKX0gXGluZGV4e2N0clxfZW5jcnlwdCgpfSBcaW5kZXh7Y3RyXF9kZWNyeXB0KCl9CiBcYmVnaW57dmVyYmF0aW19CiBpbnQgWFhYX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCAKLSAgICAgICAgICAgICAgICBzeW1tZXRyaWNfWFhYICpYWFgpOwotaW50IFhYWF9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwKLSAgICAgICAgICAgICAgICBzeW1tZXRyaWNfWFhYICpYWFgpOwotCi1pbnQgWVlZX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCAKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX1lZWSAqWVlZKTsKLWludCBZWVlfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIAoraW50IFhYWF9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19ZWVkgKllZWSk7CiBcZW5ke3ZlcmJhdGltfQotV2hlcmUgYGBYWFgnJyBpcyBvbmUgb2YgKGVjYiwgY2JjKSBhbmQgYGBZWVknJyBpcyBvbmUgb2YgKGN0ciwgb2ZiLCBjZmIpLiAgSW4gdGhlIENUUiwgT0ZCIGFuZCBDRkIgY2FzZXMgYGBsZW4nJyBpcyB0aGUKLXNpemUgb2YgdGhlIGJ1ZmZlciAoYXMgbnVtYmVyIG9mIGNoYXJzKSB0byBlbmNyeXB0IG9yIGRlY3J5cHQuICBUaGUgQ1RSLCBPRkIgYW5kIENGQiBtb2RlcyBhcmUgb3JkZXIgc2Vuc2l0aXZlIGJ1dCBub3QKK1doZXJlIGBgWFhYJycgaXMgb25lIG9mICRcbGJyYWNlIGVjYiwgY2JjLCBjdHIsIGNmYiwgb2ZiIFxyYnJhY2UkLiAgCisKK0luIGFsbCBjYXNlcyBgYGxlbicnIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKGFzIG51bWJlciBvZiBvY3RldHMpIHRvIGVuY3J5cHQgb3IgZGVjcnlwdC4gIFRoZSBDVFIsIE9GQiBhbmQgQ0ZCIG1vZGVzIGFyZSBvcmRlciBzZW5zaXRpdmUgYnV0IG5vdAogY2h1bmsgc2Vuc2l0aXZlLiAgVGhhdCBpcyB5b3UgY2FuIGVuY3J5cHQgYGBBQkNERUYnJyBpbiB0aHJlZSBjYWxscyBsaWtlIGBgQUInJywgYGBDRCcnLCBgYEVGJycgb3IgdHdvIGxpa2UgYGBBQkNERScnIGFuZCBgYEYnJwogYW5kIGVuZCB1cCB3aXRoIHRoZSBzYW1lIGNpcGhlcnRleHQuICBIb3dldmVyLCBlbmNyeXB0aW5nIGBgQUJDJycgYW5kIGBgREFCQycnIHdpbGwgcmVzdWx0IGluIGRpZmZlcmVudCBjaXBoZXJ0ZXh0cy4gIEFsbAogZml2ZSBvZiB0aGUgbW9kZXMgd2lsbCByZXR1cm4ge1xiZiBDUllQVFxfT0t9IG9uIHN1Y2Nlc3MgZnJvbSB0aGUgZW5jcnlwdCBvciBkZWNyeXB0IGZ1bmN0aW9ucy4KIAorSW4gdGhlIEVDQiBhbmQgQ0JDIGNhc2VzIGBgbGVuJycgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBjaXBoZXJzIGJsb2NrIHNpemUuICBJbiB0aGUgQ0JDIGNhc2UgeW91IG11c3QgbWFudWFsbHkgcGFkIHRoZSBlbmQgb2YgeW91ciBtZXNzYWdlIChlaXRoZXIgd2l0aAoremVyb2VzIG9yIHdpdGggd2hhdGV2ZXIgeW91ciBwcm90b2NvbCByZXF1aXJlcykuCisKIFRvIGRlY3J5cHQgaW4gZWl0aGVyIG1vZGUgeW91IHNpbXBseSBwZXJmb3JtIHRoZSBzZXR1cCBsaWtlIGJlZm9yZSAocmVjYWxsIHlvdSBoYXZlIHRvIGZldGNoIHRoZSBJViB2YWx1ZSB5b3UgdXNlZCkKIGFuZCB1c2UgdGhlIGRlY3J5cHQgcm91dGluZSBvbiBhbGwgb2YgdGhlIGJsb2Nrcy4KIAorXHN1YnNlY3Rpb257SVYgTWFuaXB1bGF0aW9ufQogVG8gY2hhbmdlIG9yIHJlYWQgdGhlIElWIG9mIGEgcHJldmlvdXNseSBpbml0aWFsaXplZCBjaGFpbmluZyBtb2RlIHVzZSB0aGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMuCiAKIFxpbmRleHtjYmNcX3NldGl2KCl9IFxpbmRleHtjYmNcX2dldGl2KCl9IFxpbmRleHtvZmJcX3NldGl2KCl9IFxpbmRleHtvZmJcX2dldGl2KCl9IFxpbmRleHtjZmJcX3NldGl2KCl9IFxpbmRleHtjZmJcX2dldGl2KCl9CkBAIC03OTUsMTYgKzgzNSwyOCBAQAogaW50IFhYWF9zZXRpdihjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19YWFggKlhYWCk7CiBcZW5ke3ZlcmJhdGltfQogCi1UaGUgWFhYXF9nZXRpdiBmdW5jdGlvbiB3aWxsIHJlYWQgdGhlIElWIG91dCBvZiB0aGUgY2hhaW5pbmcgbW9kZSBhbmQgc3RvcmUgaXQgaW50byBgYElWJycgYWxvbmcgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZSBJViAKK1RoZSBYWFhcX2dldGl2KCkgZnVuY3Rpb25zIHdpbGwgcmVhZCB0aGUgSVYgb3V0IG9mIHRoZSBjaGFpbmluZyBtb2RlIGFuZCBzdG9yZSBpdCBpbnRvIGBgSVYnJyBhbG9uZyB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIElWIAogc3RvcmVkIGluIGBgbGVuJycuICBUaGUgWFhYXF9zZXRpdiB3aWxsIGluaXRpYWxpemUgdGhlIGNoYWluaW5nIG1vZGUgc3RhdGUgYXMgaWYgdGhlIG9yaWdpbmFsIElWIHdlcmUgdGhlIG5ldyBJViBzcGVjaWZpZWQuICBUaGUgbGVuZ3RoCiBvZiB0aGUgSVYgcGFzc2VkIGluIG11c3QgYmUgdGhlIHNpemUgb2YgdGhlIGNpcGhlcnMgYmxvY2sgc2l6ZS4KIAotVGhlIFhYWFxfc2V0aXYgZnVuY3Rpb25zIGFyZSBoYW5keSBpZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIElWIHdpdGhvdXQgcmUtLWtleWluZyB0aGUgY2lwaGVyLiAgCitUaGUgWFhYXF9zZXRpdigpIGZ1bmN0aW9ucyBhcmUgaGFuZHkgaWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoZSBJViB3aXRob3V0IHJlLS1rZXlpbmcgdGhlIGNpcGhlci4gIAorCitcc3Vic2VjdGlvbntTdHJlYW0gVGVybWluYXRpb259CitUbyB0ZXJtaW5hdGUgYW4gb3BlbiBzdHJlYW0gY2FsbCB0aGUgZG9uZSBmdW5jdGlvbi4KKworXGluZGV4e2VjYlxfZG9uZSgpfSBcaW5kZXh7Y2JjXF9kb25lKCl9XGluZGV4e2NmYlxfZG9uZSgpfVxpbmRleHtvZmJcX2RvbmUoKX0gXGluZGV4e2N0clxfZG9uZSgpfQorXGJlZ2lue3ZlcmJhdGltfQoraW50IFhYWF9kb25lKHN5bW1ldHJpY19YWFggKlhYWCk7CitcZW5ke3ZlcmJhdGltfQorCitUaGlzIHdpbGwgdGVybWluYXRlIHRoZSBzdHJlYW0gKGJ5IHRlcm1pbmF0aW5nIHRoZSBjaXBoZXIpIGFuZCByZXR1cm4gXHRleHRiZntDUllQVFxfT0t9IGlmIHN1Y2Nlc3NmdWwuCisKK1xzdWJzZWN0aW9ue0V4YW1wbGVzfQogCiBcbmV3cGFnZQogXGJlZ2lue3NtYWxsfQogXGJlZ2lue3ZlcmJhdGltfQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogaW50IG1haW4odm9pZCkKIHsKICAgIHVuc2lnbmVkIGNoYXIga2V5WzE2XSwgSVZbMTZdLCBidWZmZXJbNTEyXTsKQEAgLTgyMCwxMiArODcyLDE0IEBACiAgICAvKiBzb21laG93IGZpbGwgb3V0IGtleSBhbmQgSVYgKi8KIAogICAgLyogc3RhcnQgdXAgQ1RSIG1vZGUgKi8KLSAgIGlmICgoZXJyID0gY3RyX3N0YXJ0KGZpbmRfY2lwaGVyKCJ0d29maXNoIiksIC8qIGluZGV4IG9mIGRlc2lyZWQgY2lwaGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWLCAvKiB0aGUgaW5pdGlhbCB2ZWN0b3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIC8qIHRoZSBzZWNyZXQga2V5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAvKiBsZW5ndGggb2Ygc2VjcmV0IGtleSAoMTYgYnl0ZXMsIDEyOCBiaXRzKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogMCA9PSBkZWZhdWx0ICMgb2Ygcm91bmRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHIpICAvKiB3aGVyZSB0byBzdG9yZSBpbml0aWFsaXplZCBDVFIgc3RhdGUgKi8KKyAgIGlmICgoZXJyID0gY3RyX3N0YXJ0KAorICAgICAgICBmaW5kX2NpcGhlcigidHdvZmlzaCIpLCAvKiBpbmRleCBvZiBkZXNpcmVkIGNpcGhlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWLCAvKiB0aGUgaW5pdGlhbCB2ZWN0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwgLyogdGhlIHNlY3JldCBrZXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgLyogbGVuZ3RoIG9mIHNlY3JldCBrZXkgKDE2IGJ5dGVzLCAxMjggYml0cykgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogMCA9PSBkZWZhdWx0ICMgb2Ygcm91bmRzICovCisgICAgIENUUl9DT1VOVEVSX0xJVFRMRV9FTkRJQU4sIC8qIExpdHRsZSBlbmRpYW4gY291bnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICZjdHIpICAvKiB3aGVyZSB0byBzdG9yZSBpbml0aWFsaXplZCBDVFIgc3RhdGUgKi8KICAgICAgICkgIT0gQ1JZUFRfT0spIHsKICAgICAgIHByaW50ZigiY3RyX3N0YXJ0IGVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOwogICAgICAgcmV0dXJuIC0xOwpAQCAtODYxLDYgKzkxNSwxMiBAQAogICAgICAgcmV0dXJuIC0xOwogICAgfQogCisgICAvKiB0ZXJtaW5hdGUgdGhlIHN0cmVhbSAqLworICAgaWYgKChlcnIgPSBjdHJfZG9uZSgmY3RyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHByaW50ZigiY3RyX2RvbmUgZXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgICByZXR1cm4gLTE7CisgICB9CisKICAgIC8qIGNsZWFyIHVwIGFuZCByZXR1cm4gKi8KICAgIHplcm9tZW0oa2V5LCBzaXplb2Yoa2V5KSk7CiAgICB6ZXJvbWVtKCZjdHIsIHNpemVvZihjdHIpKTsKQEAgLTk1Myw3ICsxMDEzLDcgQEAKIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgQUVTIChvciBSaWpuZGFlbCkgYmxvY2sgY2lwaGVyIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY2lwaGVyXF9kZXNjcmlwdG9yIHRhYmxlIGZpcnN0LgogCiBcYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSA8bXljcnlwdC5oPgorI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CiBpbnQgbWFpbih2b2lkKQogewogICAgaW50ICAgICAgICAgICBlcnI7CkBAIC0xMDY2LDYgKzExMjYsOCBAQAogYm90aCBmdW5jdGlvbnMgZ2l2ZW4gYSBzaW5nbGUgYGBvY2InJyBzdGF0ZS4gIEZvciBiaS1kaXJlY3Rpb25hbCBjb21tdW5pY2F0aW9uIHlvdSB3aWxsIGhhdmUgdG8gaW5pdGlhbGl6ZSB0d28gYGBvY2InJwogc3RhdGVzICh3aXRoIGRpZmZlcmVudCBub25jZXMpLiAgQWxzbyBgYHB0JycgYW5kIGBgY3QnJyBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgbG9jYXRpb24gaW4gbWVtb3J5LgogCitcc3Vic3Vic2VjdGlvbntTdGF0ZSBUZXJtaW5hdGlvbn0KKwogV2hlbiB5b3UgYXJlIGZpbmlzaGVkIGVuY3J5cHRpbmcgdGhlIG1lc3NhZ2UgeW91IGNhbGwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSB0YWcuCiAKIFxpbmRleHtvY2JcX2RvbmVcX2VuY3J5cHQoKX0KQEAgLTEwOTksNiArMTE2MSw3IEBACiBgYHJlcycnIGlzIHNldCB0byB6ZXJvLiAgSWYgYWxsIGBgdGFnbGVuJycgYnl0ZXMgb2YgYGB0YWcnJyBjYW4gYmUgdmVyaWZpZWQgdGhlbiBgYHJlcycnIGlzIHNldCB0byBvbmUgKGF1dGhlbnRpY2F0ZWQKIG1lc3NhZ2UpLgogCitcc3Vic3Vic2VjdGlvbntQYWNrZXQgRnVuY3Rpb25zfQogVG8gbWFrZSBsaWZlIHNpbXBsZXIgdGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBmb3IgbWVtb3J5IGJvdW5kIE9DQi4KIAogXGluZGV4e29jYlxfZW5jcnlwdFxfYXV0aGVudGljYXRlXF9tZW1vcnkoKX0KQEAgLTExMjgsNiArMTE5MSwyNDAgQEAKIFNpbWlsYXJseSB0aGlzIHdpbGwgT0NCIGRlY3J5cHQgYW5kIGNvbXBhcmUgdGhlIGludGVybmFsbHkgY29tcHV0ZWQgdGFnIGFnYWluc3QgdGhlIHRhZyBwcm92aWRlZC4gYGByZXMnJyBpcyBzZXQgCiBhcHByb3ByaWF0ZWx5LgogCitcc3Vic2VjdGlvbntDQ00gTW9kZX0KK0NDTSBpcyBhIE5JU1QgcHJvcG9zYWwgZm9yIEVuY3J5cHQrQXV0aGVudGljYXRlIHRoYXQgaXMgY2VudGVyZWQgYXJvdW5kIHVzaW5nIEFFUyAob3IgYW55IDE2LS1ieXRlIGNpcGhlcikgYXMgYSBwcmltaXRpdmUuICBVbmxpa2UgRUFYIGFuZCBPQ0IgbW9kZQoraXQgaXMgb25seSBtZWFudCBmb3IgYGBwYWNrZXQnJyBtb2RlIHdoZXJlIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGlzIGtub3duIGluIGFkdmFuY2UuICBTaW5jZSBpdCBpcyBhIHBhY2tldCBtb2RlIGZ1bmN0aW9uIENDTSBvbmx5IGhhcyBvbmUgCitmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIHRoZSBwcm90b2NvbC4KKworXGluZGV4e2NjbVxfbWVtb3J5KCl9CitcYmVnaW57dmVyYmF0aW19CitpbnQgY2NtX21lbW9yeShpbnQgY2lwaGVyLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbm9uY2UsICB1bnNpZ25lZCBsb25nIG5vbmNlbGVuLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBoZWFkZXJsZW4sCisgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsICAgICB1bnNpZ25lZCBsb25nIHB0bGVuLAorICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LAorICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhZywgICAgdW5zaWduZWQgbG9uZyAqdGFnbGVuLAorICAgICAgICAgICAgICAgICAgICBpbnQgIGRpcmVjdGlvbik7CitcZW5ke3ZlcmJhdGltfQorCitUaGlzIHBlcmZvcm1zIHRoZSBgYENDTScnIG9wZXJhdGlvbiBvbiB0aGUgZGF0YS4gIFRoZSBgYGNpcGhlcicnIHZhcmlhYmxlIGluZGljYXRlcyB3aGljaCBjaXBoZXIgaW4gdGhlIGRlc2NyaXB0b3IgdGFibGUgdG8gdXNlLiAgSXQgbXVzdCBoYXZlIGEgCisxNi0tYnl0ZSBibG9jayBzaXplIGZvciBDQ00uICBUaGUga2V5IGlzIGBga2V5Jycgd2l0aCBhIGxlbmd0aCBvZiBgYGtleWxlbicnIG9jdGV0cy4gIFRoZSBub25jZSBvciBzYWx0IGlzIGBgbm9uY2UnJyBvZgorbGVuZ3RoIGBgbm9uY2VsZW4nJyBvY3RldHMuICBUaGUgaGVhZGVyIGlzIG1ldGEtLWRhdGEgeW91IHdhbnQgdG8gc2VuZCB3aXRoIHRoZSBtZXNzYWdlIGJ1dCBub3QgaGF2ZSBlbmNyeXB0ZWQsIGl0IGlzIHN0b3JlZCBpbiBgYGhlYWRlcicnCitvZiBsZW5ndGggYGBoZWFkZXJsZW4nJyBvY3RldHMuICBUaGUgaGVhZGVyIGNhbiBiZSB6ZXJvIG9jdGV0cyBsb25nIChpZiAkaGVhZGVybGVuID0gMCQgdGhlbiB5b3UgY2FuIHBhc3MgYGBoZWFkZXInJyBhcyBcdGV4dGJme05VTEx9KS4gIAorCitUaGUgcGxhaW50ZXh0IGlzIHN0b3JlZCBpbiBgYHB0JycgYW5kIHRoZSBjaXBoZXJ0ZXh0IGluIGBgY3QnJy4gIFRoZSBsZW5ndGggb2YgYm90aCBhcmUgZXhwZWN0ZWQgdG8gYmUgZXF1YWwgYW5kIGlzIHBhc3NlZCBpbiBhcyBgYHB0bGVuJycuICBJdCBpcworYWxsb3dhYmxlIHRoYXQgJHB0ID0gY3QkLiAgVGhlIGBgZGlyZWN0aW9uJycgdmFyaWFibGUgaW5kaWNhdGVzIHdoZXRoZXIgZW5jcnlwdGlvbiAoZGlyZWN0aW9uICQ9JCBcdGV4dGJme0NDTVxfRU5DUllQVH0pIG9yIAorZGVjcnlwdGlvbiAoZGlyZWN0aW9uICQ9JCBcdGV4dGJme0NDTVxfREVDUllQVH0pIGlzIHRvIGJlIHBlcmZvcm1lZC4KKworQXMgaW1wbGVtZW50ZWQgdGhpcyBjb3B5IG9mIENDTSBjYW5ub3QgaGFuZGxlIGEgaGVhZGVyIG9yIHBsYWludGV4dCBsb25nZXIgdGhhbiAkMl57MzJ9IC0gMSQgb2N0ZXRzIGxvbmcuICAKKworWW91IGNhbiB0ZXN0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBDQ00gd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uLgorCitcaW5kZXh7Y2NtXF90ZXN0KCl9CitcYmVnaW57dmVyYmF0aW19CitpbnQgY2NtX3Rlc3Qodm9pZCk7CitcZW5ke3ZlcmJhdGltfQorCitUaGlzIHdpbGwgcmV0dXJuIFx0ZXh0YmZ7Q1JZUFRcX09LfSBpZiB0aGUgQ0NNIHJvdXRpbmUgcGFzc2VzIGtub3duIHRlc3QgdmVjdG9ycy4KKworXHN1YnNlY3Rpb257R0NNIE1vZGV9CitHYWxvaXMgY291bnRlciBtb2RlIGlzIGFuIElFRUUgcHJvcG9zYWwgZm9yIGF1dGhlbnRpY2F0ZWQgZW5jcnlwdGlvbi4gIExpa2UgRUFYIGFuZCBPQ0IgaXQgY2FuIGJlIHVzZWQgaW4gYSBzdHJlYW1pbmcgY2FwYWNpdHkgaG93ZXZlciwgdW5saWtlIEVBWCBpdCBjYW5ub3QKK2FjY2VwdCBgYGFkZGl0aW9uYWwgYXV0aGVudGljYXRpb24gZGF0YScnIChtZXRhLS1kYXRhKSBhZnRlciBwbGFpbnRleHQgaGFzIGJlZW4gcHJvY2Vzc2VkLiAgVGhpcyBtb2RlIGFsc28gb25seSB3b3JrcyB3aXRoIGJsb2NrIGNpcGhlcnMgd2l0aCBhIHNpeHRlZW4KK2J5dGUgYmxvY2suCisKK0EgR0NNIHN0cmVhbSBpcyBtZWFudCB0byBiZSBwcm9jZXNzZWQgaW4gdGhyZWUgbW9kZXMgZWFjaCBvbmUgc2VxdWVudGlhbCBzZXJpYWwuICBGaXJzdCB0aGUgaW5pdGlhbCB2ZWN0b3IgKHBlciBzZXNzaW9uKSBkYXRhIGlzIHByb2Nlc3NlZC4gIFRoaXMgc2hvdWxkIGJlIAordW5pcXVlIHRvIGV2ZXJ5IHNlc3Npb24uICBOZXh0IHRoZSB0aGUgb3B0aW9uYWwgYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBkYXRhIGlzIHByb2Nlc3NlZCBhbmQgZmluYWxseSB0aGUgcGxhaW50ZXh0LiAgCisKK1xzdWJzdWJzZWN0aW9ue0luaXRpYWxpemF0aW9ufQorVG8gaW5pdGlhbGl6ZSB0aGUgR0NNIGNvbnRleHQgd2l0aCBhIHNlY3JldCBrZXkgY2FsbCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uLgorCitcaW5kZXh7Z2NtXF9pbml0KCl9CitcYmVnaW57dmVyYmF0aW19CitpbnQgZ2NtX2luaXQoZ2NtX3N0YXRlICpnY20sIGludCBjaXBoZXIsCisgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuKTsKK1xlbmR7dmVyYmF0aW19CitUaGlzIGluaXRpYWxpemVzIHRoZSBHQ00gc3RhdGUgYGBnY20nJyBmb3IgdGhlIGdpdmVuIGNpcGhlciBpbmRleGVkIGJ5IGBgY2lwaGVyJycgd2l0aCBhIHNlY3JldCBrZXkgYGBrZXknJyBvZiBsZW5ndGggYGBrZXlsZW4nJyBvY3RldHMuICBUaGUgY2lwaGVyIGNob3NlbgorbXVzdCBoYXZlIGEgMTYtLWJ5dGUgYmxvY2sgc2l6ZSAoZS5nLiBBRVMpLiAgCisKK1xzdWJzdWJzZWN0aW9ue0luaXRpYWwgVmVjdG9yfQorQWZ0ZXIgdGhlIHN0YXRlIGhhcyBiZWVuIGluaXRpYWxpemVkIChvciByZXNldCkgdGhlIG5leHQgc3RlcCBpcyB0byBhZGQgdGhlIHNlc3Npb24gKG9yIHBhY2tldCkgaW5pdGlhbCB2ZWN0b3IuICBJdCBzaG91bGQgYmUgdW5pcXVlIHBlciBwYWNrZXQgZW5jcnlwdGVkLgorCitcaW5kZXh7Z2NtXF9hZGRcX2l2KCl9CitcYmVnaW57dmVyYmF0aW19CitpbnQgZ2NtX2FkZF9pdihnY21fc3RhdGUgKmdjbSwgCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgICAgIHVuc2lnbmVkIGxvbmcgSVZsZW4pOworXGVuZHt2ZXJiYXRpbX0KKworVGhpcyBhZGRzIHRoZSBpbml0aWFsIHZlY3RvciBvY3RldHMgZnJvbSBgYElWJycgb2YgbGVuZ3RoIGBgSVZsZW4nJyB0byB0aGUgR0NNIHN0YXRlIGBgZ2NtJycuICBZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBhcyBtYW55IHRpbWVzIGFzIHJlcXVpcmVkCit0byBwcm9jZXNzIHRoZSBlbnRpcmUgSVYuICAKKworTm90ZSB0aGF0IHRoZSBHQ00gcHJvdG9jb2xzIHByb3ZpZGVzIGEgYGBzaG9ydGN1dCcnIGZvciAxMi0tYnl0ZSBJVnMgd2hlcmUgbm8gcHJlcHJvY2Vzc2luZyBpcyB0byBiZSBkb25lLiAgSWYgeW91IHdhbnQgdG8gbWluaW1pemUgcGVyIHBhY2tldCBsYXRlbmN5IGl0J3MgaWRlYWwKK3RvIG9ubHkgdXNlIDEyLS1ieXRlIElWcy4gIFlvdSBjYW4ganVzdCBpbmNyZW1lbnQgaXQgbGlrZSBhIGNvdW50ZXIgZm9yIGVhY2ggcGFja2V0IGFuZCB0aGUgQ1RSIFtwcml2YWN5XSB3aWxsIGJlIGVuc3VyZWQuCisKK1xzdWJzdWJzZWN0aW9ue0FkZGl0aW9uYWwgQXV0aGVudGljYXRpb24gRGF0YX0KK0FmdGVyIHRoZSBlbnRpcmUgSVYgaGFzIGJlZW4gcHJvY2Vzc2VkIHRoZSBhZGRpdGlvbmFsIGF1dGhlbnRpY2F0aW9uIGRhdGEgY2FuIGJlIHByb2Nlc3NlZC4gIFVubGlrZSB0aGUgSVYgYSBwYWNrZXQvc2Vzc2lvbiBkb2VzIG5vdCByZXF1aXJlIGFkZGl0aW9uYWwKK2F1dGhlbnRpY2F0aW9uIGRhdGEgKEFBRCkgZm9yIHNlY3VyaXR5LiAgVGhlIEFBRCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIHNpZGUtLWNoYW5uZWwgZGF0YSB5b3Ugd2FudCB0byBiZSBhdXRoZW50aWNhdGVkIHdpdGggdGhlIHBhY2tldC4gIE5vdGUgdGhhdCBvbmNlCit5b3UgYmVnaW4gYWRkaW5nIEFBRCB0byB0aGUgR0NNIHN0YXRlIHlvdSBjYW5ub3QgcmV0dXJuIHRvIGFkZGluZyBJViBkYXRhIHVudGlsIHRoZSBzdGF0ZSBpcyByZXNldC4KKworXGluZGV4e2djbVxfYWRkXF9hYWQoKX0KK1xiZWdpbnt2ZXJiYXRpbX0KK2ludCBnY21fYWRkX2FhZChnY21fc3RhdGUgKmdjbSwgCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGF0YSwgICAgIHVuc2lnbmVkIGxvbmcgYWRhdGFsZW4pOworXGVuZHt2ZXJiYXRpbX0KK1RoaXMgYWRkcyB0aGUgYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBkYXRhIGBgYWRhdGEnJyBvZiBsZW5ndGggYGBhZGF0YWxlbicnIHRvIHRoZSBHQ00gc3RhdGUgYGBnY20nJy4KKworXHN1YnN1YnNlY3Rpb257UGxhaW50ZXh0IFByb2Nlc3Npbmd9CitBZnRlciB0aGUgQUFEIGhhcyBiZWVuIHByb2Nlc3NlZCB0aGUgcGxhaW50ZXh0IChvciBjaXBoZXJ0ZXh0IGRlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uKSBjYW4gYmUgcHJvY2Vzc2VkLiAgCisKK1xpbmRleHtnY21cX3Byb2Nlc3MoKX0KK1xiZWdpbnt2ZXJiYXRpbX0KK2ludCBnY21fcHJvY2VzcyhnY21fc3RhdGUgKmdjbSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0LCAgICAgdW5zaWduZWQgbG9uZyBwdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbik7CitcZW5ke3ZlcmJhdGltfQorVGhpcyBwcm9jZXNzZXMgbWVzc2FnZSBkYXRhIHdoZXJlIGBgcHQnJyBpcyB0aGUgcGxhaW50ZXh0IGFuZCBgYGN0JycgaXMgdGhlIGNpcGhlcnRleHQuICBUaGUgbGVuZ3RoIG9mIGJvdGggYXJlIGVxdWFsIGFuZCBzdG9yZWQgaW4gYGBwdGxlbicnLiAgRGVwZW5kaW5nIG9uIHRoZSAKK21vZGUgYGBwdCcnIGlzIHRoZSBpbnB1dCBhbmQgYGBjdCcnIGlzIHRoZSBvdXRwdXQgKG9yIHZpY2UgdmVyc2EpLiAgV2hlbiBgYGRpcmVjdGlvbicnIGVxdWFscyBcdGV4dGJme0dDTVxfRU5DUllQVH0gdGhlIHBsYWludGV4dCBpcyByZWFkLCBlbmNyeXB0ZWQgYW5kIHN0b3JlZAoraW4gdGhlIGNpcGhlcnRleHQgYnVmZmVyLiAgV2hlbiBgYGRpcmVjdGlvbicnIGVxdWFscyBcdGV4dGJme0dDTVxfREVDUllQVH0gdGhlIG9wcG9zaXRlIG9jY3Vycy4KKworXHN1YnN1YnNlY3Rpb257U3RhdGUgVGVybWluYXRpb259CitUbyB0ZXJtaW5hdGUgYSBHQ00gc3RhdGUgYW5kIHJldHJpZXZlIHRoZSBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIHRhZyBjYWxsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24uCisKK1xpbmRleHtnY21cX2RvbmUoKX0KK1xiZWdpbnt2ZXJiYXRpbX0KK2ludCBnY21fZG9uZShnY21fc3RhdGUgKmdjbSwgCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWcsICAgIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbik7CitcZW5ke3ZlcmJhdGltfQorVGhpcyB0ZXJtaW5hdGVzIHRoZSBHQ00gc3RhdGUgYGBnY20nJyBhbmQgc3RvcmVzIHRoZSB0YWcgaW4gYGB0YWcnJyBvZiBsZW5ndGggYGB0YWdsZW4nJyBvY3RldHMuCisKK1xzdWJzdWJzZWN0aW9ue1N0YXRlIFJlc2V0fQorVGhlIGNhbGwgdG8gZ2NtXF9pbml0KCkgd2lsbCBwZXJmb3JtIGNvbnNpZGVyYWJsZSBwcmUtLWNvbXB1dGF0aW9uICh3aGVuIFx0ZXh0YmZ7R0NNXF9UQUJMRVN9IGlzIGRlZmluZWQpIGFuZCBpZiB5b3UncmUgZ29pbmcgdG8gYmUgZGVhbGluZyB3aXRoIGEgbG90IG9mIHBhY2tldHMKK2l0IGlzIHZlcnkgY29zdGx5IHRvIGhhdmUgdG8gY2FsbCBpdCByZXBlYXRlZGx5LiAgVG8gYWlkIGluIHRoaXMgZW5kZWF2b3VyIHRoZSByZXNldCBmdW5jdGlvbiBoYXMgYmVlbiBwcm92aWRlZC4KKworXGluZGV4e2djbVxfcmVzZXQoKX0KK1xiZWdpbnt2ZXJiYXRpbX0KK2ludCBnY21fcmVzZXQoZ2NtX3N0YXRlICpnY20pOworXGVuZHt2ZXJiYXRpbX0KKworVGhpcyB3aWxsIHJlc2V0IHRoZSBHQ00gc3RhdGUgYGBnY20nJyB0byB0aGUgc3RhdGUgdGhhdCBnY21cX2luaXQoKSBsZWZ0IGl0LiAgVGhlIHVzZXIgd291bGQgdGhlbiBjYWxsIGdjbVxfYWRkXF9pdigpLCBnY21cX2FkZFxfYWFkKCksIGV0Yy4KKworXHN1YnN1YnNlY3Rpb257T25lLS1TaG90IFBhY2tldH0KK1RvIHByb2Nlc3MgYSBzaW5nbGUgcGFja2V0IHVuZGVyIGFueSBnaXZlbiBrZXkgdGhlIGZvbGxvd2luZyBoZWxwZXIgZnVuY3Rpb24gY2FuIGJlIHVzZWQuCisKK1xpbmRleHtnY21cX21lbW9yeSgpfQorXGJlZ2lue3ZlcmJhdGltfQoraW50IGdjbV9tZW1vcnkoICAgICAgaW50ICAgICAgICAgICBjaXBoZXIsCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksICAgIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsICAgICB1bnNpZ25lZCBsb25nIElWbGVuLAorICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRhdGEsICB1bnNpZ25lZCBsb25nIGFkYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsICAgICB1bnNpZ25lZCBsb25nIHB0bGVuLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsIAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnLCAgICB1bnNpZ25lZCBsb25nICp0YWdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbik7CitcZW5ke3ZlcmJhdGltfQorCitUaGlzIHdpbGwgaW5pdGlhbGl6ZSB0aGUgR0NNIHN0YXRlIHdpdGggdGhlIGdpdmVuIGtleSwgSVYgYW5kIEFBRCB2YWx1ZSB0aGVuIHByb2NlZWQgdG8gZW5jcnlwdCBvciBkZWNyeXB0IHRoZSBtZXNzYWdlIHRleHQgYW5kIHN0b3JlIHRoZSBmaW5hbAorbWVzc2FnZSB0YWcuICBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdmFyaWFibGVzIGlzIHRoZSBzYW1lIGFzIGl0IGlzIGZvciBhbGwgdGhlIG1hbnVhbCBmdW5jdGlvbnMuCisKK0lmIHlvdSBhcmUgcHJvY2Vzc2luZyBtYW55IHBhY2tldHMgdW5kZXIgdGhlIHNhbWUga2V5IHlvdSBzaG91bGRuJ3QgdXNlIHRoaXMgZnVuY3Rpb24gYXMgaXQgaW52b2tlcyB0aGUgcHJlLS1jb21wdXRhdGlvbiB3aXRoIGVhY2ggY2FsbC4KKworXHN1YnN1YnNlY3Rpb257RXhhbXBsZSBVc2FnZX0KK1RoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSB1c2FnZSBvZiBob3cgdG8gdXNlIEdDTSBvdmVyIG11bHRpcGxlIHBhY2tldHMgd2l0aCBhIHNoYXJlZCBzZWNyZXQga2V5LgorCitcYmVnaW57c21hbGx9CitcYmVnaW57dmVyYmF0aW19CisjaW5jbHVkZSA8dG9tY3J5cHQuaD4KKworaW50IHNlbmRfcGFja2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCAgdW5zaWduZWQgbG9uZyBwdGxlbiwKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppdiwgIHVuc2lnbmVkIGxvbmcgaXZsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWFkLCB1bnNpZ25lZCBsb25nIGFhZGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBnY21fc3RhdGUgICAgICpnY20pCit7CisgICBpbnQgICAgICAgICAgIGVycjsKKyAgIHVuc2lnbmVkIGxvbmcgdGFnbGVuOworICAgdW5zaWduZWQgY2hhciB0YWdbMTZdOworCisgICAvKiByZXNldCB0aGUgc3RhdGUgKi8KKyAgIGlmICgoZXJyID0gZ2NtX3Jlc2V0KGdjbSkpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorIAorICAgLyogQWRkIHRoZSBJViAqLworICAgaWYgKChlcnIgPSBnY21fYWRkX2l2KGdjbSwgaXYsIGl2bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIC8qIEFkZCB0aGUgQUFEIChub3RlOiBhYWQgY2FuIGJlIE5VTEwgaWYgYWFkbGVuID09IDApICovCisgICBpZiAoKGVyciA9IGdjbV9hZGRfYWFkKGdjbSwgYWFkLCBhYWRsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogcHJvY2VzcyB0aGUgcGxhaW50ZXh0ICovCisgICBpZiAoKGVyciA9IGdjbV9wcm9jZXNzKGdjbSwgcHQsIHB0bGVuLCBwdCwgR0NNX0VOQ1JZUFQpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogRmluaXNoIHVwIGFuZCBnZXQgdGhlIE1BQyB0YWcgKi8KKyAgIHRhZ2xlbiA9IHNpemVvZih0YWcpOworICAgaWYgKChlcnIgPSBnY21fZG9uZShnY20sIHRhZywgJnRhZ2xlbikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICAvKiAuLi4gc2VuZCBhIGhlYWRlciBkZXNjcmliaW5nIHRoZSBsZW5ndGhzIC4uLiAqLworCisgICAvKiBkZXBlbmRpbmcgb24gdGhlIHByb3RvY29sIGFuZCBob3cgSVYgaXMgZ2VuZXJhdGVkIHlvdSBtYXkgaGF2ZSB0byBzZW5kIGl0IHRvby4uLiAqLworICAgc2VuZChzb2NrZXQsIGl2LCBpdmxlbiwgMCk7CisKKyAgIC8qIHNlbmQgdGhlIGFhZCAqLworICAgc2VuZChzb2NrZXQsIGFhZCwgYWFkbGVuLCAwKTsKKworICAgLyogc2VuZCB0aGUgY2lwaGVydGV4dCAqLworICAgc2VuZChzb2NrZXQsIHB0LCBwdGxlbiwgMCk7CisKKyAgIC8qIHNlbmQgdGhlIHRhZyAqLworICAgc2VuZChzb2NrZXQsIHRhZywgdGFnbGVuLCAwKTsKKworICAgcmV0dXJuIENSWVBUX09LOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgZ2NtX3N0YXRlICAgICBnY207CisgICB1bnNpZ25lZCBjaGFyIGtleVsxNl0sIElWWzEyXSwgcHRbUEFDS0VUX1NJWkVdOworICAgaW50ICAgICAgICAgICBlcnIsIHg7CisgICB1bnNpZ25lZCBsb25nIHB0bGVuOyAKKyAKKyAgIC8qIHNvbWVob3cgZmlsbCBrZXkvSVYgd2l0aCByYW5kb20gdmFsdWVzICovCisgICAKKyAgIC8qIHJlZ2lzdGVyIEFFUyAqLworICAgcmVnaXN0ZXJfY2lwaGVyKCZhZXNfZGVzYyk7CisKKyAgIC8qIGluaXQgdGhlIEdDTSBzdGF0ZSAqLworICAgaWYgKChlcnIgPSBnY21faW5pdCgmZ2NtLCBmaW5kX2NpcGhlcigiYWVzIiksIGtleSwgMTYpKSAhPSBDUllQVF9PSykgeworICAgICAgd2hpbmVfYW5kX3BvdXQoZXJyKTsKKyAgIH0KKworICAgLyogaGFuZGxlIHVzIHNvbWUgcGFja2V0cyAqLworICAgZm9yICg7OykgeworICAgICAgIHB0bGVuID0gbWFrZV9wYWNrZXRfd2Vfd2FudF90b19zZW5kKHB0KTsKKworICAgICAgIC8qIHVzZSBJViBhcyBjb3VudGVyICgxMiBieXRlIGNvdW50ZXIpICovCisgICAgICAgZm9yICh4ID0gMTE7IHggPj0gMDsgeC0tKSB7CisgICAgICAgICAgIGlmICgrK0lWW3hdKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgfQorCisgICAgICAgaWYgKChlcnIgPSBzZW5kX3BhY2tldChwdCwgcHRsZW4sIGl2LCAxMiwgTlVMTCwgMCwgJmdjbSkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgIHdoaW5lX2FuZF9wb3V0KGVycik7CisgICAgICAgfQorICAgfQorICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KK1xlbmR7dmVyYmF0aW19CitcZW5ke3NtYWxsfQorCiBcY2hhcHRlcntPbmUtV2F5IENyeXB0b2dyYXBoaWMgSGFzaCBGdW5jdGlvbnN9CiBcc2VjdGlvbntDb3JlIEZ1bmN0aW9uc30KIApAQCAtMTE0MSw3ICsxNDM4LDcgQEAKIFRoaXMgc2ltcGx5IHNldHMgdXAgdGhlIGhhc2ggdG8gdGhlIGRlZmF1bHQgc3RhdGUgZ292ZXJuZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zIG9mIHRoZSBoYXNoLiAgVG8gYWRkIGRhdGEgdG8gdGhlIAogbWVzc2FnZSBiZWluZyBoYXNoZWQgY2FsbDoKIFxiZWdpbnt2ZXJiYXRpbX0KLWludCBYWFhfcHJvY2VzcyhoYXNoX3N0YXRlICptZCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgbGVuKTsKK2ludCBYWFhfcHJvY2VzcyhoYXNoX3N0YXRlICptZCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4pOwogXGVuZHt2ZXJiYXRpbX0KIAogRXNzZW50aWFsbHkgYWxsIGhhc2ggbWVzc2FnZXMgYXJlIHZpcnR1YWxseSBpbmZpbml0ZWx5XGZvb3Rub3Rle01vc3QgaGFzaGVzIGFyZSBsaW1pdGVkIHRvICQyXns2NH0kIGJpdHMgb3IgMiwzMDUsODQzLDAwOSwyMTMsNjkzLDk1MiBieXRlcy59IGxvbmcgbWVzc2FnZSB3aGljaCAKQEAgLTExNzYsNyArMTQ3Myw3IEBACiBleGFtcGxlIHNuaXBwZXQgdGhhdCBoYXNoZXMgYSBtZXNzYWdlIHdpdGggbWQ1IGlzIGdpdmVuIGJlbG93LgogXGJlZ2lue3NtYWxsfQogXGJlZ2lue3ZlcmJhdGltfQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogaW50IG1haW4odm9pZCkKIHsKICAgICBoYXNoX3N0YXRlIG1kOwpAQCAtMTIwNCw5ICsxNTAxLDEwIEBACiAgICAgY2hhciAqbmFtZTsKICAgICB1bnNpZ25lZCBsb25nIGhhc2hzaXplOyAgICAvKiBkaWdlc3Qgb3V0cHV0IHNpemUgaW4gYnl0ZXMgICovCiAgICAgdW5zaWduZWQgbG9uZyBibG9ja3NpemU7ICAgLyogdGhlIGJsb2NrIHNpemUgdGhlIGhhc2ggdXNlcyAqLwotICAgIHZvaWQgKCppbml0KSAgIChoYXNoX3N0YXRlICopOwotICAgIGludCAgKCpwcm9jZXNzKShoYXNoX3N0YXRlICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZyk7Ci0gICAgaW50ICAoKmRvbmUpICAgKGhhc2hfc3RhdGUgKiwgdW5zaWduZWQgY2hhciAqKTsKKyAgICB2b2lkICgqaW5pdCkgICAoaGFzaF9zdGF0ZSAqaGFzaCk7CisgICAgaW50ICAoKnByb2Nlc3MpKGhhc2hfc3RhdGUgKmhhc2gsIAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CisgICAgaW50ICAoKmRvbmUpICAgKGhhc2hfc3RhdGUgKmhhc2gsIHVuc2lnbmVkIGNoYXIgKm91dCk7CiAgICAgaW50ICAoKnRlc3QpICAgKHZvaWQpOwogfTsKIFxlbmR7dmVyYmF0aW19CkBAIC0xMjE5LDcgKzE1MTcsNyBAQAogWW91IGNhbiB1c2UgdGhlIHRhYmxlIHRvIGluZGlyZWN0bHkgY2FsbCBhIGhhc2ggZnVuY3Rpb24gdGhhdCBpcyBjaG9zZW4gYXQgcnVudGltZS4gIEZvciBleGFtcGxlOgogXGJlZ2lue3NtYWxsfQogXGJlZ2lue3ZlcmJhdGltfQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogaW50IG1haW4odm9pZCkKIHsKICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzEwMF0sIGhhc2hbTUFYQkxPQ0tTSVpFXTsKQEAgLTEyNjcsMjkgKzE1NjUsMjcgQEAKIFRoZXJlIGFyZSB0aHJlZSBoZWxwZXIgZnVuY3Rpb25zIGFzIHdlbGw6CiBcaW5kZXh7aGFzaFxfbWVtb3J5KCl9IFxpbmRleHtoYXNoXF9maWxlKCl9CiBcYmVnaW57dmVyYmF0aW19Ci1pbnQgaGFzaF9tZW1vcnkoaW50IGhhc2gsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK2ludCBoYXNoX21lbW9yeShpbnQgaGFzaCwgCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgdW5zaWduZWQgbG9uZyBpbmxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKIAogaW50IGhhc2hfZmlsZShpbnQgaGFzaCwgY29uc3QgY2hhciAqZm5hbWUsIAotICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsCi0gICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CisgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKIAogaW50IGhhc2hfZmlsZWhhbmRsZShpbnQgaGFzaCwgRklMRSAqaW4sIAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKIFxlbmR7dmVyYmF0aW19CiAKIFRoZSBgYGhhc2gnJyBwYXJhbWV0ZXIgaXMgdGhlIGxvY2F0aW9uIGluIHRoZSBkZXNjcmlwdG9yIHRhYmxlIG9mIHRoZSBoYXNoIChcdGV4dGl0e2UuZy4gdGhlIHJldHVybiBvZiBmaW5kXF9oYXNoKCl9KS4gIAotVGhlIGBgKm91dGxlbicnIHZhcmlhYmxlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgb3V0cHV0IHNpemUuICBZb3UKLW11c3Qgc2V0IGl0IHRvIHRoZSBzaXplIG9mIHlvdXIgb3V0cHV0IGJ1ZmZlciBiZWZvcmUgY2FsbGluZyB0aGUgZnVuY3Rpb25zLiAgV2hlbiB0aGV5IGNvbXBsZXRlIHN1Y2Nlc2Z1bGx5IHRoZXkgc3RvcmUKLXRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgZGlnZXN0IGJhY2sgaW4gaXQuICBUaGUgZnVuY3Rpb25zIGFyZSBvdGhlcndpc2Ugc3RyYWlnaHRmb3J3YXJkLiAgVGhlIGBgaGFzaFxfZmlsZWhhbmRsZScnIAotZnVuY3Rpb24gYXNzdW1lcyB0aGF0IGBgaW4nJyBpcyBhbiBmaWxlIGhhbmRsZSBvcGVuZWQgaW4gYmluYXJ5IG1vZGUuICBJdCB3aWxsIGhhc2ggdG8gdGhlIGVuZCBvZiBmaWxlIGFuZCBub3QgcmVzZXQKLXRoZSBmaWxlIHBvc2l0aW9uIHdoZW4gZmluaXNoZWQuCitUaGUgYGAqb3V0bGVuJycgdmFyaWFibGUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBvdXRwdXQgc2l6ZS4gIFlvdSBtdXN0IHNldCBpdCB0byB0aGUgc2l6ZSBvZiB5b3VyIG91dHB1dCBidWZmZXIgYmVmb3JlIAorY2FsbGluZyB0aGUgZnVuY3Rpb25zLiAgV2hlbiB0aGV5IGNvbXBsZXRlIHN1Y2Nlc2Z1bGx5IHRoZXkgc3RvcmUgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBkaWdlc3QgYmFjayBpbiBpdC4gIFRoZSBmdW5jdGlvbnMgCithcmUgb3RoZXJ3aXNlIHN0cmFpZ2h0Zm9yd2FyZC4gIFRoZSBgYGhhc2hcX2ZpbGVoYW5kbGUnJyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYGBpbicnIGlzIGFuIGZpbGUgaGFuZGxlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZS4gIAorSXQgd2lsbCBoYXNoIHRvIHRoZSBlbmQgb2YgZmlsZSBhbmQgbm90IHJlc2V0IHRoZSBmaWxlIHBvc2l0aW9uIHdoZW4gZmluaXNoZWQuCiAKIFRvIHBlcmZvcm0gdGhlIGFib3ZlIGhhc2ggd2l0aCBtZDUgdGhlIGZvbGxvd2luZyBjb2RlIGNvdWxkIGJlIHVzZWQ6CiBcYmVnaW57c21hbGx9CiBcYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSA8bXljcnlwdC5oPgorI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CiBpbnQgbWFpbih2b2lkKQogewogICAgaW50IGlkeCwgZXJyOwpAQCAtMTM0NSw3ICsxNjQxLDYwIEBACiBpbnQgdW5yZWdpc3Rlcl9oYXNoKGNvbnN0IHN0cnVjdCBfaGFzaF9kZXNjcmlwdG9yICpoYXNoKTsKIFxlbmR7dmVyYmF0aW19CiAKLVxzdWJzZWN0aW9ue05vdGljZX0KK1xzZWN0aW9ue0NpcGhlciBIYXNoIENvbnN0cnVjdGlvbn0KK1xpbmRleHtDaXBoZXIgSGFzaCBDb25zdHJ1Y3Rpb259CitBbiBhZGRpdGlvbiB0byB0aGUgc3VpdGUgb2YgaGFzaCBmdW5jdGlvbnMgaXMgdGhlIGBgQ2lwaGVyIEhhc2ggQ29uc3RydWN0aW9uJycgb3IgYGBDSEMnJyBtb2RlLiAgSW4gdGhpcyBtb2RlCithcHBsaWNhYmxlIGJsb2NrIGNpcGhlcnMgKHN1Y2ggYXMgQUVTKSBjYW4gYmUgdHVybmVkIGludG8gaGFzaCBmdW5jdGlvbnMgdGhhdCBvdGhlciBMVEMgZnVuY3Rpb25zIGNhbiB1c2UuICBJbiAKK3BhcnRpY3VsYXIgdGhpcyBhbGxvd3MgYSBjcnlwdG9zeXN0ZW0gdG8gYmUgZGVzaWduZWQgdXNpbmcgdmVyeSBmZXcgbW92aW5nIHBhcnRzLgorCitJbiBvcmRlciB0byB1c2UgdGhlIENIQyBzeXN0ZW0gdGhlIGRldmVsb3BlciB3aWxsIGhhdmUgdG8gdGFrZSBhIGZldyBleHRyYSBzdGVwcy4gIEZpcnN0IHRoZSBgYGNoY1xfZGVzYycnIGhhc2gKK2Rlc2NyaXB0b3IgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJcX2hhc2goKS4gIEF0IHRoaXMgcG9pbnQgdGhlIENIQyBoYXNoIGNhbm5vdCBiZSB1c2VkIHRvIGhhc2gKK2RhdGEuICBXaGlsZSBpdCBpcyBpbiB0aGUgaGFzaCBzeXN0ZW0geW91IHN0aWxsIGhhdmUgdG8gdGVsbCB0aGUgQ0hDIGNvZGUgd2hpY2ggY2lwaGVyIHRvIHVzZS4gIFRoaXMgaXMgYWNjb21wbGlzaGVkCit2aWEgdGhlIGNoY1xfcmVnaXN0ZXIoKSBmdW5jdGlvbi4KKworXGluZGV4e2NoY1xfcmVnaXN0ZXIoKX0KK1xiZWdpbnt2ZXJiYXRpbX0KK2ludCBjaGNfcmVnaXN0ZXIoaW50IGNpcGhlcik7CitcZW5ke3ZlcmJhdGltfQorCitBIGNpcGhlciBoYXMgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIENIQyAoYW5kIGFsc28gaW4gdGhlIGNpcGhlciBkZXNjcmlwdG9yIHRhYmxlcyB3aXRoIAorcmVnaXN0ZXJcX2NpcGhlcigpKS4gIFRoZSBjaGNcX3JlZ2lzdGVyKCkgZnVuY3Rpb24gd2lsbCBiaW5kIGEgY2lwaGVyIHRvIHRoZSBDSEMgc3lzdGVtLiAgT25seSBvbmUgY2lwaGVyIGNhbiAKK2JlIGJvdW5kIHRvIHRoZSBDSEMgaGFzaCBhdCBhIHRpbWUuICBUaGVyZSBhcmUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgZm9yIHRoZSBzeXN0ZW0gdG8gd29yay4KKworXGJlZ2lue2VudW1lcmF0ZX0KKyAgIFxpdGVtIFRoZSBjaXBoZXIgbXVzdCBoYXZlIGEgYmxvY2sgc2l6ZSBncmVhdGVyIHRoYW4gNjQtLWJpdHMuICAKKyAgIFxpdGVtIFRoZSBjaXBoZXIgbXVzdCBhbGxvdyBhbiBpbnB1dCBrZXkgdGhlIHNpemUgb2YgdGhlIGJsb2NrIHNpemUuCitcZW5ke2VudW1lcmF0ZX0KKworRXhhbXBsZSBvZiB1c2luZyBDSEMgd2l0aCB0aGUgQUVTIGJsb2NrIGNpcGhlci4KKworXGJlZ2lue3ZlcmJhdGltfQorI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CitpbnQgbWFpbih2b2lkKQoreworICAgaW50IGVycjsgCisKKyAgIC8qIHJlZ2lzdGVyIGNpcGhlciBhbmQgaGFzaCAqLworICAgaWYgKHJlZ2lzdGVyX2NpcGhlcigmYWVzX2VuY19kZXNjKSA9PSAtMSkgeworICAgICAgcHJpbnRmKCJDb3VsZCBub3QgcmVnaXN0ZXIgY2lwaGVyXG4iKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisgICBpZiAocmVnaXN0ZXJfaGFzaCgmY2hjX2Rlc2MpID09IC0xKSB7CisgICAgICBwcmludGYoIkNvdWxkIG5vdCByZWdpc3RlciBoYXNoXG4iKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIHN0YXJ0IGNoYyB3aXRoIEFFUyAqLworICAgaWYgKChlcnIgPSBjaGNfcmVnaXN0ZXIoZmluZF9jaXBoZXIoImFlcyIpKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHByaW50ZigiRXJyb3IgYmluZGluZyBBRVMgdG8gQ0hDOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgfQorCisgICAvKiBub3cgeW91IGNhbiB1c2UgY2hjX2hhc2ggaW4gYW55IExUQyBmdW5jdGlvbiBbYXNpZGUgZnJvbSBwa2NzLi4uXSAqLworICAgLyogLi4uICovCitcZW5ke3ZlcmJhdGltfQorCisKK1xzZWN0aW9ue05vdGljZX0KIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBcdGV4dGJme25vdH0gdXNlIHRoZSBNRDQgb3IgTUQ1IGhhc2hlcyBmb3IgdGhlIHB1cnBvc2VzIG9mIGRpZ2l0YWwgc2lnbmF0dXJlcyBvciBhdXRoZW50aWNhdGlvbiBjb2Rlcy4gIAogVGhlc2UgaGFzaGVzIGFyZSBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzIGFuZCB0aGV5IHN0aWxsIGNhbiBiZSB1c2VkIGZvciB0aGUgcHVycG9zZXMgb2YgcGFzc3dvcmQgaGFzaGluZyBvciBvbmUtd2F5IGFjY3VtdWxhdG9ycwogKGUuZy4gWWFycm93KS4KQEAgLTEzNzMsMTggKzE3MjIsMTggQEAKIGxlbmd0aCAoaW4gb2N0ZXRzKSBvZiB0aGUga2V5IHlvdSB3YW50IHRvIHVzZSB0byBhdXRoZW50aWNhdGUgdGhlIG1lc3NhZ2UuICBUbyBzZW5kIG9jdGV0cyBvZiBhIG1lc3NhZ2UgdGhyb3VnaCB0aGUgSE1BQyBzeXN0ZW0geW91IG11c3QgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CiBcaW5kZXh7aG1hY1xfcHJvY2VzcygpfQogXGJlZ2lue3ZlcmJhdGltfQotaW50IGhtYWNfcHJvY2VzcyhobWFjX3N0YXRlICpobWFjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxlbik7CitpbnQgaG1hY19wcm9jZXNzKGhtYWNfc3RhdGUgKmhtYWMsIAorICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CiBcZW5ke3ZlcmJhdGltfQogYGBobWFjJycgaXMgdGhlIEhNQUMgc3RhdGUgeW91IGFyZSB3b3JraW5nIHdpdGguIGBgYnVmJycgaXMgdGhlIGFycmF5IG9mIG9jdGV0cyB0byBzZW5kIGludG8gdGhlIEhNQUMgcHJvY2Vzcy4gIGBgbGVuJycgaXMgdGhlCiBudW1iZXIgb2Ygb2N0ZXRzIHRvIHByb2Nlc3MuICBMaWtlIHRoZSBoYXNoIHByb2Nlc3Mgcm91dGluZXMgeW91IGNhbiBzZW5kIHRoZSBkYXRhIGluIGFyYml0cmFybHkgc2l6ZWQgY2h1bmtzLiBXaGVuIHlvdSAKIGFyZSBmaW5pc2hlZCB3aXRoIHRoZSBITUFDIHByb2Nlc3MgeW91IG11c3QgY2FsbCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIHRvIGdldCB0aGUgSE1BQyBjb2RlOgogXGluZGV4e2htYWNcX2RvbmUoKX0KIFxiZWdpbnt2ZXJiYXRpbX0KLWludCBobWFjX2RvbmUoaG1hY19zdGF0ZSAqaG1hYywgdW5zaWduZWQgY2hhciAqaGFzaE91dCwKLSAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK2ludCBobWFjX2RvbmUoaG1hY19zdGF0ZSAqaG1hYywgCisgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKIFxlbmR7dmVyYmF0aW19Ci1gYGhtYWMnJyBpcyB0aGUgSE1BQyBzdGF0ZSB5b3UgYXJlIHdvcmtpbmcgd2l0aC4gIGBgaGFzaE91dCcnIGlzIHRoZSBhcnJheSBvZiBvY3RldHMgd2hlcmUgdGhlIEhNQUMgY29kZSBzaG91bGQgYmUgc3RvcmVkLiAgWW91IG11c3QKK2BgaG1hYycnIGlzIHRoZSBITUFDIHN0YXRlIHlvdSBhcmUgd29ya2luZyB3aXRoLiAgYGBvdXQnJyBpcyB0aGUgYXJyYXkgb2Ygb2N0ZXRzIHdoZXJlIHRoZSBITUFDIGNvZGUgc2hvdWxkIGJlIHN0b3JlZC4gIFlvdSBtdXN0CiBzZXQgYGBvdXRsZW4nJyB0byB0aGUgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICBJdCBpcyB1cGRhdGVkIHdpdGggdGhlIGxlbmd0aCBvZiB0aGUgSE1BQyBjb2RlCiBwcm9kdWNlZCAoZGVwZW5kaW5nIG9uIHdoaWNoIGhhc2ggd2FzIHBpY2tlZCkuICBJZiBgYG91dGxlbicnIGlzIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBkaWdlc3QgKGFuZCB1bHRpbWF0ZWx5CiB0aGUgSE1BQyBjb2RlKSB0aGVuIHRoZSBITUFDIGNvZGUgaXMgdHJ1bmNhdGVkIGFzIHBlciBGSVBTLTE5OCBzcGVjaWZpY2F0aW9ucyAoZS5nLiB0YWtlIHRoZSBmaXJzdCBgYG91dGxlbicnIGJ5dGVzKS4KQEAgLTEzOTUsMjIgKzE3NDQsMjMgQEAKIAogXGluZGV4e2htYWNcX21lbW9yeSgpfQogXGJlZ2lue3ZlcmJhdGltfQotaW50IGhtYWNfbWVtb3J5KGludCBoYXNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAotICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbGVuLCAKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGxvbmcgKmRzdGxlbik7CitpbnQgaG1hY19tZW1vcnkoaW50IGhhc2gsIAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyAga2V5bGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyAgaW5sZW4sIAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKIFxlbmR7dmVyYmF0aW19Ci1UaGlzIHdpbGwgcHJvZHVjZSBhbiBITUFDIGNvZGUgZm9yIHRoZSBhcnJheSBvZiBvY3RldHMgaW4gYGBkYXRhJycgb2YgbGVuZ3RoIGBgbGVuJycuICBUaGUgaW5kZXggaW50byB0aGUgaGFzaCBkZXNjcmlwdG9yIAorVGhpcyB3aWxsIHByb2R1Y2UgYW4gSE1BQyBjb2RlIGZvciB0aGUgYXJyYXkgb2Ygb2N0ZXRzIGluIGBgaW4nJyBvZiBsZW5ndGggYGBpbmxlbicnLiAgVGhlIGluZGV4IGludG8gdGhlIGhhc2ggZGVzY3JpcHRvciAKIHRhYmxlIG11c3QgYmUgcHJvdmlkZWQgaW4gYGBoYXNoJycuICBJdCB1c2VzIHRoZSBrZXkgZnJvbSBgYGtleScnIHdpdGggYSBrZXkgbGVuZ3RoIG9mIGBga2V5bGVuJycuICAKLVRoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoZSBhcnJheSBvZiBvY3RldHMgYGBkc3QnJyBhbmQgdGhlIGxlbmd0aCBpbiBgYGRzdGxlbicnLiAgVGhlIHZhbHVlIG9mIGBgZHN0bGVuJycgbXVzdCBiZSBzZXQKK1RoZSByZXN1bHQgaXMgc3RvcmVkIGluIHRoZSBhcnJheSBvZiBvY3RldHMgYGBvdXQnJyBhbmQgdGhlIGxlbmd0aCBpbiBgYG91dGxlbicnLiAgVGhlIHZhbHVlIG9mIGBgb3V0bGVuJycgbXVzdCBiZSBzZXQKIHRvIHRoZSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gIFNpbWlsYXJseSBmb3IgZmlsZXMgdGhlcmUgaXMgdGhlICBmb2xsb3dpbmcgZnVuY3Rpb246CiBcaW5kZXh7aG1hY1xfZmlsZSgpfQogXGJlZ2lue3ZlcmJhdGltfQotaW50IGhtYWNfZmlsZShpbnQgaGFzaCwgY29uc3QgY2hhciAqZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKLSAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sIAotICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGxvbmcgKmRzdGxlbik7CitpbnQgaG1hY19maWxlKGludCBoYXNoLCBjb25zdCBjaGFyICpmbmFtZSwgCisgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyAga2V5bGVuLCAKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwogXGVuZHt2ZXJiYXRpbX0KIGBgaGFzaCcnIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBoYXNoIGRlc2NyaXB0b3IgdGFibGUgb2YgdGhlIGhhc2ggeW91IHdhbnQgdG8gdXNlLiAgYGBmbmFtZScnIGlzIHRoZSBmaWxlbmFtZSB0byBwcm9jZXNzLiAgCi1gYGtleScnIGlzIHRoZSBhcnJheSBvZiBvY3RldHMgdG8gdXNlIGFzIHRoZSBrZXkgb2YgbGVuZ3RoIGBga2V5bGVuJycuICBgYGRzdCcnIGlzIHRoZSBhcnJheSBvZiBvY3RldHMgd2hlcmUgdGhlIAorYGBrZXknJyBpcyB0aGUgYXJyYXkgb2Ygb2N0ZXRzIHRvIHVzZSBhcyB0aGUga2V5IG9mIGxlbmd0aCBgYGtleWxlbicnLiAgYGBvdXQnJyBpcyB0aGUgYXJyYXkgb2Ygb2N0ZXRzIHdoZXJlIHRoZSAKIHJlc3VsdCBzaG91bGQgYmUgc3RvcmVkLgogCiBUbyB0ZXN0IGlmIHRoZSBITUFDIGNvZGUgaXMgd29ya2luZyB0aGVyZSBpcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgpAQCAtMTQyMyw3ICsxNzczLDcgQEAKIAogXGJlZ2lue3NtYWxsfQogXGJlZ2lue3ZlcmJhdGltfQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogaW50IG1haW4odm9pZCkKIHsKICAgIGludCBpZHgsIGVycjsKQEAgLTE0ODcsOSArMTgzNyw5IEBACiBcaW5kZXh7b21hY1xfcHJvY2VzcygpfQogXGJlZ2lue3ZlcmJhdGltfQogaW50IG9tYWNfcHJvY2VzcyhvbWFjX3N0YXRlICpzdGF0ZSwgCi0gICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pOworICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CiBcZW5ke3ZlcmJhdGltfQotVGhpcyB3aWxsIHNlbmQgYGBsZW4nJyBieXRlcyBmcm9tIGBgYnVmJycgdGhyb3VnaCB0aGUgYWN0aXZlIE9NQUMgc3RhdGUgYGBzdGF0ZScnLiAgUmV0dXJucyBcdGV4dGJme0NSWVBUXF9PS30gaWYgdGhlIAorVGhpcyB3aWxsIHNlbmQgYGBpbmxlbicnIGJ5dGVzIGZyb20gYGBpbicnIHRocm91Z2ggdGhlIGFjdGl2ZSBPTUFDIHN0YXRlIGBgc3RhdGUnJy4gIFJldHVybnMgXHRleHRiZntDUllQVFxfT0t9IGlmIHRoZSAKIGZ1bmN0aW9uIHN1Y2NlZWRzLiAgVGhlIGZ1bmN0aW9uIGlzIG5vdCBzZW5zaXRpdmUgdG8gdGhlIGdyYW51bGFyaXR5IG9mIHRoZSBkYXRhLiAgRm9yIGV4YW1wbGUsCiAKIFxiZWdpbnt2ZXJiYXRpbX0KQEAgLTE1MjMsMTAgKzE4NzMsMTAgQEAKIFxiZWdpbnt2ZXJiYXRpbX0KIGludCBvbWFjX21lbW9yeShpbnQgY2lwaGVyLCAKICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAotICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZywgdW5zaWduZWQgbG9uZyBtc2dsZW4sCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CiBcZW5ke3ZlcmJhdGltfQotVGhpcyB3aWxsIGNvbXB1dGUgdGhlIE9NQUMgb2YgYGBtc2dsZW4nJyBieXRlcyBvZiBgYG1zZycnIHVzaW5nIHRoZSBrZXkgYGBrZXknJyBvZiBsZW5ndGggYGBrZXlsZW4nJyBieXRlcyBhbmQgdGhlIGNpcGhlcgorVGhpcyB3aWxsIGNvbXB1dGUgdGhlIE9NQUMgb2YgYGBpbmxlbicnIGJ5dGVzIG9mIGBgaW4nJyB1c2luZyB0aGUga2V5IGBga2V5Jycgb2YgbGVuZ3RoIGBga2V5bGVuJycgYnl0ZXMgYW5kIHRoZSBjaXBoZXIKIHNwZWNpZmllZCBieSB0aGUgYGBjaXBoZXInJyd0aCBlbnRyeSBpbiB0aGUgY2lwaGVyXF9kZXNjcmlwdG9yIHRhYmxlLiAgSXQgd2lsbCBzdG9yZSB0aGUgTUFDIGluIGBgb3V0Jycgd2l0aCB0aGUgc2FtZQogcnVsZXMgYXMgb21hY1xfZG9uZS4KIApAQCAtMTUzNiw3ICsxODg2LDcgQEAKIGludCBvbWFjX2ZpbGUoaW50IGNpcGhlciwgCiAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAKLSAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CiBcZW5ke3ZlcmJhdGltfQogCiBXaGljaCB3aWxsIE9NQUMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgYGBmaWxlbmFtZScnIHVzaW5nIHRoZSBrZXkgYGBrZXknJyBvZiBsZW5ndGggYGBrZXlsZW4nJyBieXRlcwpAQCAtMTU1Myw3ICsxOTAzLDcgQEAKIAogXGJlZ2lue3NtYWxsfQogXGJlZ2lue3ZlcmJhdGltfQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogaW50IG1haW4odm9pZCkKIHsKICAgIGludCBpZHgsIGVycjsKQEAgLTE2MTgsOSArMTk2OCw5IEBACiBcaW5kZXh7cG1hY1xfcHJvY2VzcygpfQogXGJlZ2lue3ZlcmJhdGltfQogaW50IHBtYWNfcHJvY2VzcyhwbWFjX3N0YXRlICpzdGF0ZSwgCi0gICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pOworICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CiBcZW5ke3ZlcmJhdGltfQotVGhpcyB3aWxsIHByb2Nlc3MgYGBsZW4nJyBieXRlcyBvZiBgYGJ1ZicnIGluIHRoZSBnaXZlbiBgYHN0YXRlJycuICBUaGUgZnVuY3Rpb24gaXMgbm90IHNlbnNpdGl2ZSB0byB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlCitUaGlzIHdpbGwgcHJvY2VzcyBgYGlubGVuJycgYnl0ZXMgb2YgYGBpbicnIGluIHRoZSBnaXZlbiBgYHN0YXRlJycuICBUaGUgZnVuY3Rpb24gaXMgbm90IHNlbnNpdGl2ZSB0byB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlCiBkYXRhLiAgRm9yIGV4YW1wbGUsCiAKIFxiZWdpbnt2ZXJiYXRpbX0KQEAgLTE2NTAsOSArMjAwMCw5IEBACiBcaW5kZXh7cG1hY1xfbWVtb3J5KCl9CiBcYmVnaW57dmVyYmF0aW19CiBpbnQgcG1hY19tZW1vcnkoaW50IGNpcGhlciwgCi0gICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgbXNnbGVuLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcgIGtleWxlbiwKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKIFxlbmR7dmVyYmF0aW19CiBUaGlzIHdpbGwgY29tcHV0ZSB0aGUgUE1BQyBvZiBgYG1zZ2xlbicnIGJ5dGVzIG9mIGBgbXNnJycgdXNpbmcgdGhlIGtleSBgYGtleScnIG9mIGxlbmd0aCBgYGtleWxlbicnIGJ5dGVzIGFuZCB0aGUgY2lwaGVyCiBzcGVjaWZpZWQgYnkgdGhlIGBgY2lwaGVyJycndGggZW50cnkgaW4gdGhlIGNpcGhlclxfZGVzY3JpcHRvciB0YWJsZS4gIEl0IHdpbGwgc3RvcmUgdGhlIE1BQyBpbiBgYG91dCcnIHdpdGggdGhlIHNhbWUKQEAgLTE2NzIsNDMgKzIwMjIsMTczIEBACiB0aGUgc2FtZSBydWxlcyBhcyBvbWFjXF9kb25lLgogCiBUbyB0ZXN0IGlmIHRoZSBQTUFDIGNvZGUgaXMgd29ya2luZyB0aGVyZSBpcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgorXGluZGV4e3BtYWNcX3Rlc3QoKX0KIFxiZWdpbnt2ZXJiYXRpbX0KIGludCBwbWFjX3Rlc3Qodm9pZCk7CiBcZW5ke3ZlcmJhdGltfQogV2hpY2ggcmV0dXJucyB7XGJmIENSWVBUXF9PS30gaWYgdGhlIGNvZGUgcGFzc2VzIG90aGVyd2lzZSBpdCByZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAKK1xzZWN0aW9ue1BlbGljYW4gTUFDfQorUGVsaWNhbiBNQUMgaXMgYSBuZXcgKGV4cGVyaW1lbnRhbCkgTUFDIGJ5IHRoZSBBRVMgdGVhbSB0aGF0IHVzZXMgZm91ciByb3VuZHMgb2YgQUVTIGFzIGEgYGBtaXhpbmcgZnVuY3Rpb24nJy4gIEl0IGFjaGlldmVzIGEgdmVyeSBoaWdoIAorcmF0ZSBvZiBwcm9jZXNzaW5nIGFuZCBpcyBwb3RlbnRpYWxseSB2ZXJ5IHNlY3VyZS4gIEl0IHJlcXVpcmVzIEFFUyB0byBiZSBlbmFibGVkIHRvIGZ1bmN0aW9uLiAgWW91IGRvIG5vdCBoYXZlIHRvIHJlZ2lzdGVyXF9jaXBoZXIoKSBBRVMgZmlyc3QgdGhvdWdoCithcyBpdCBjYWxscyBBRVMgZGlyZWN0bHkuCisKK1xpbmRleHtwZWxpY2FuXF9pbml0KCl9CitcYmVnaW57dmVyYmF0aW19CitpbnQgcGVsaWNhbl9pbml0KHBlbGljYW5fc3RhdGUgKnBlbG1hYywgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbik7CitcZW5ke3ZlcmJhdGltfQorVGhpcyB3aWxsIGluaXRpYWxpemUgdGhlIFBlbGljYW4gc3RhdGUgd2l0aCB0aGUgZ2l2ZW4gQUVTIGtleS4gIE9uY2UgdGhpcyBoYXMgYmVlbiBkb25lIHlvdSBjYW4gYmVnaW4gcHJvY2Vzc2luZyBkYXRhLgorCitcaW5kZXh7cGVsaWNhblxfcHJvY2VzcygpfQorXGJlZ2lue3ZlcmJhdGltfQoraW50IHBlbGljYW5fcHJvY2VzcyhwZWxpY2FuX3N0YXRlICpwZWxtYWMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKTsKK1xlbmR7dmVyYmF0aW19CitUaGlzIHdpbGwgcHJvY2VzcyBgYGlubGVuJycgYnl0ZXMgb2YgYGBpbicnIHRocm91Z2ggdGhlIFBlbGljYW4gTUFDLiAgSXQncyBiZXN0IHRoYXQgeW91IHBhc3MgaW4gbXVsdGlwbGVzIG9mIDE2IGJ5dGVzIGFzIGl0IG1ha2VzIHRoZQorcm91dGluZSBtb3JlIGVmZmljaWVudCBidXQgeW91IG1heSBwYXNzIGluIGFueSBsZW5ndGggb2YgdGV4dC4gIFlvdSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGFzIG1hbnkgdGltZXMgYXMgcmVxdWlyZWQgdG8gcHJvY2VzcworYW4gZW50aXJlIG1lc3NhZ2UuCisKK1xpbmRleHtwZWxpY2FuXF9kb25lKCl9CitcYmVnaW57dmVyYmF0aW19CitpbnQgcGVsaWNhbl9kb25lKHBlbGljYW5fc3RhdGUgKnBlbG1hYywgdW5zaWduZWQgY2hhciAqb3V0KTsKK1xlbmR7dmVyYmF0aW19CitUaGlzIHRlcm1pbmF0ZXMgYSBQZWxpY2FuIE1BQyBhbmQgd3JpdGVzIHRoZSAxNi0tb2N0ZXQgdGFnIHRvIGBgb3V0JycuCisKK1xzdWJzZWN0aW9ue0V4YW1wbGV9CisKK1xiZWdpbnt2ZXJiYXRpbX0KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgoraW50IG1haW4odm9pZCkKK3sKKyAgIHBlbGljYW5fc3RhdGUgcGVsc3RhdGU7CisgICB1bnNpZ25lZCBjaGFyIGtleVszMl0sIHRhZ1sxNl07CisgICBpbnQgICAgICAgICAgIGVycjsKKworICAgLyogc29tZWhvdyBpbml0aWFsaXplIGEga2V5ICovCisKKyAgIC8qIGluaXRpYWxpemUgcGVsaWNhbiBtYWMgKi8KKyAgIGlmICgoZXJyID0gcGVsaWNhbl9pbml0KCZwZWxzdGF0ZSwgICAgICAgICAgLyogdGhlIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksICAgICAgICAgICAgICAgIC8qIHVzZXIga2V5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgIC8qIGtleSBsZW5ndGggaW4gb2N0ZXRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICkpICE9IENSWVBUX09LKSB7CisgICAgICBwcmludGYoIkVycm9yIGluaXRpYWxpemluZyBQZWxpY2FuOiAlcyIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisKKyAgIC8qIE1BQyBzb21lIGRhdGEgKi8KKyAgIGlmICgoZXJyID0gcGVsaWNhbl9wcm9jZXNzKCZwZWxzdGF0ZSwgICAgICAgLyogdGhlIHN0YXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVsbG8gd29ybGQiLCAgIC8qIGRhdGEgdG8gbWFjICovICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpICE9IENSWVBUX09LKSB7CisgICAgICBwcmludGYoIkVycm9yIHByb2Nlc3NpbmcgUGVsaWNhbjogJXMiLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgfQorCisgICAvKiBUZXJtaW5hdGUgdGhlIE1BQyAqLworICAgaWYgKChlcnIgPSBwZWxpY2FuX2RvbmUoJnBlbHN0YXRlLCAgICAgICAvKiB0aGUgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyAgICAgICAgICAgICAgLyogd2hlcmUgdG8gc3RvcmUgdGhlIHRhZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHByaW50ZigiRXJyb3IgdGVybWluYXRpbmcgUGVsaWNhbjogJXMiLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgfQorCisgICAvKiB0YWdbMC4uMTVdIGhhcyB0aGUgTUFDIG91dHB1dCBub3cgKi8KKworICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KK1xlbmR7dmVyYmF0aW19CisKIAogXGNoYXB0ZXJ7UHNldWRvLVJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yc30KIFxzZWN0aW9ue0NvcmUgRnVuY3Rpb25zfQotCiBUaGUgbGlicmFyeSBwcm92aWRlcyBhbiBhcnJheSBvZiBjb3JlIGZ1bmN0aW9ucyBmb3IgUHNldWRvLVJhbmRvbSBOdW1iZXIgR2VuZXJhdG9ycyAoUFJOR3MpIGFzIHdlbGwuICBBIGNyeXB0b2dyYXBoaWMgUFJORyBpcwogdXNlZCB0byBleHBhbmQgYSBzaG9ydGVyIGJpdCBzdHJpbmcgaW50byBhIGxvbmdlciBiaXQgc3RyaW5nLiAgUFJOR3MgYXJlIHVzZWQgd2hlcmV2ZXIgcmFuZG9tIGRhdGEgaXMgcmVxdWlyZWQgc3VjaCBhcyBQdWJsaWMgS2V5IChQSykKIGtleSBnZW5lcmF0aW9uLiAgVGhlcmUgaXMgYSB1bml2ZXJzYWwgc3RydWN0dXJlIGNhbGxlZCBgYHBybmdcX3N0YXRlJycuICBUbyBpbml0aWFsaXplIGEgUFJORyBjYWxsOgorXGluZGV4e1BSTkcgc3RhcnR9CiBcYmVnaW57dmVyYmF0aW19CiBpbnQgWFhYX3N0YXJ0KHBybmdfc3RhdGUgKnBybmcpOwogXGVuZHt2ZXJiYXRpbX0KIAotVGhpcyB3aWxsIHNldHVwIHRoZSBQUk5HIGZvciBmdXR1cmUgdXNlIGFuZCBub3Qgc2VlZCBpdC4gIEluIG9yZGVyIAotZm9yIHRoZSBQUk5HIHRvIGJlIGNyeXB0b2dyYXBoaWNhbGx5IHVzZWZ1bCB5b3UgbXVzdCBnaXZlIGl0IGVudHJvcHkuICBJZGVhbGx5IHlvdSdkIGhhdmUgc29tZSBPUyBsZXZlbCBzb3VyY2UgdG8gdGFwIAotbGlrZSBpbiBVTklYIChzZWUgc2VjdGlvbiA1LjMpLiAgVG8gYWRkIGVudHJvcHkgdG8gdGhlIFBSTkcgY2FsbDoKK1RoaXMgd2lsbCBzZXR1cCB0aGUgUFJORyBmb3IgZnV0dXJlIHVzZSBhbmQgbm90IHNlZWQgaXQuICBJbiBvcmRlciBmb3IgdGhlIFBSTkcgdG8gYmUgY3J5cHRvZ3JhcGhpY2FsbHkgdXNlZnVsIHlvdSBtdXN0IGdpdmUgaXQgCitlbnRyb3B5LiAgSWRlYWxseSB5b3UnZCBoYXZlIHNvbWUgT1MgbGV2ZWwgc291cmNlIHRvIHRhcCBsaWtlIGluIFVOSVguICBUbyBhZGQgZW50cm9weSB0byB0aGUgUFJORyBjYWxsOgorXGluZGV4e1BSTkcgYWRkXF9lbnRyb3B5fQogXGJlZ2lue3ZlcmJhdGltfQotaW50IFhYWF9hZGRfZW50cm9weShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBsZW4sIAoraW50IFhYWF9hZGRfZW50cm9weShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgCiAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcpOwogXGVuZHt2ZXJiYXRpbX0KIAogV2hpY2ggcmV0dXJucyB7XGJmIENSWVBUT1xfT0t9IGlmIHRoZSBlbnRyb3B5IHdhcyBhY2NlcHRlZC4gIE9uY2UgeW91IHRoaW5rIHlvdSBoYXZlIGVub3VnaCBlbnRyb3B5IHlvdSBjYWxsIGFub3RoZXIKIGZ1bmN0aW9uIHRvIHB1dCB0aGUgZW50cm9weSBpbnRvIGFjdGlvbi4KK1xpbmRleHtQUk5HIHJlYWR5fQogXGJlZ2lue3ZlcmJhdGltfQogaW50IFhYWF9yZWFkeShwcm5nX3N0YXRlICpwcm5nKTsKIFxlbmR7dmVyYmF0aW19CiAKIFdoaWNoIHJldHVybnMge1xiZiBDUllQVE9cX09LfSBpZiBpdCBpcyByZWFkeS4gIEZpbmFsbHkgdG8gYWN0dWFsbHkgcmVhZCBieXRlcyBjYWxsOgorXGluZGV4e1BSTkcgcmVhZH0KIFxiZWdpbnt2ZXJiYXRpbX0KLXVuc2lnbmVkIGxvbmcgWFhYX3JlYWQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nIGxlbiwKK3Vuc2lnbmVkIGxvbmcgWFhYX3JlYWQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nIG91dGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAqcHJuZyk7CiBcZW5ke3ZlcmJhdGltfQogCi1XaGljaCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIHRoZSBQUk5HLgorV2hpY2ggcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSB0aGUgUFJORy4gIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIGEgUFJORyBzdGF0ZSB5b3UgY2FsbAordGhlIGZvbGxvd2luZy4KKworXGluZGV4e1BSTkcgZG9uZX0KK1xiZWdpbnt2ZXJiYXRpbX0KK3ZvaWQgWFhYX2RvbmUocHJuZ19zdGF0ZSAqcHJuZyk7CitcZW5ke3ZlcmJhdGltfQorCitUaGlzIHdpbGwgdGVybWluYXRlIGEgUFJORyBzdGF0ZSBhbmQgZnJlZSBhbnkgbWVtb3J5IChpZiBhbnkpIGFsbG9jYXRlZC4gIFRvIGV4cG9ydCBhIFBSTkcgc3RhdGUKK3NvIHRoYXQgeW91IGNhbiBsYXRlciByZXN1bWUgdGhlIFBSTkcgY2FsbCB0aGUgZm9sbG93aW5nLgorCitcaW5kZXh7UFJORyBleHBvcnR9CitcYmVnaW57dmVyYmF0aW19CitpbnQgWFhYX2V4cG9ydCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgCisgICAgICAgICAgICAgICBwcm5nX3N0YXRlICAgICpwcm5nKTsKK1xlbmR7dmVyYmF0aW19CisKK1RoaXMgd2lsbCB3cml0ZSBhIGBgUFJORyBzdGF0ZScnIHRvIHRoZSBidWZmZXIgYGBvdXQnJyBvZiBsZW5ndGggYGBvdXRsZW4nJyBieXRlcy4gIFRoZSBpZGVhIG9mIAordGhlIGV4cG9ydCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIGEgYGBzZWVkIGZpbGUnJy4gIFRoYXQgaXMsIHdoZW4gdGhlIHByb2dyYW0gc3RhcnRzIHVwIHRoZXJlIHdpbGwgbm90IGxpa2VseQorYmUgdGhhdCBtdWNoIGVudHJvcHkgYXZhaWxhYmxlLiAgIFRvIGltcG9ydCBhIHN0YXRlIHRvIHNlZWQgYSBQUk5HIGNhbGwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbi4KKworXGluZGV4e1BSTkcgaW1wb3J0fQorXGJlZ2lue3ZlcmJhdGltfQoraW50IFhYWF9pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIAorICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAgICAgKnBybmcpOworXGVuZHt2ZXJiYXRpbX0KKworVGhpcyB3aWxsIGNhbGwgdGhlIHN0YXJ0IGFuZCBhZGRcX2VudHJvcHkgZnVuY3Rpb25zIG9mIHRoZSBnaXZlbiBQUk5HLiAgSXQgd2lsbCB1c2UgdGhlIHN0YXRlIGluCitgYGluJycgb2YgbGVuZ3RoIGBgaW5sZW4nJyBhcyB0aGUgaW5pdGlhbCBzZWVkLiAgWW91IG11c3QgcGFzcyB0aGUgc2FtZSBzZWVkIGxlbmd0aCBhcyB3YXMgZXhwb3J0ZWQKK2J5IHRoZSBjb3JyZXNwb25kaW5nIGV4cG9ydCBmdW5jdGlvbi4KKworTm90ZSB0aGF0IGltcG9ydGluZyBhIHN0YXRlIHdpbGwgbm90IGBgcmVzdW1lJycgdGhlIFBSTkcgZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi4gIFRoYXQgaXMsIGlmIHlvdSBleHBvcnQKK2Egc3RhdGUsIGVtaXQgKHNheSkgOCBieXRlcyBhbmQgdGhlbiBpbXBvcnQgdGhlIHByZXZpb3VzbHkgZXhwb3J0ZWQgc3RhdGUgdGhlIG5leHQgOCBieXRlcyB3aWxsIG5vdCAKK3NwZWNpZmljYWxseSBlcXVhbCB0aGUgOCBieXRlcyB5b3UgZ2VuZXJhdGVkIHByZXZpb3VzbHkuCisKK1doZW4gYSBwcm9ncmFtIGlzIGZpcnN0IGV4ZWN1dGVkIHRoZSBub3JtYWwgY291cnNlIG9mIG9wZXJhdGlvbiBpcyAKKworXGJlZ2lue2VudW1lcmF0ZX0KKyAgIFxpdGVtIEdhdGhlciBlbnRyb3B5IGZyb20geW91ciBzb3VyY2VzIGZvciBhIGdpdmVuIHBlcmlvZCBvZiB0aW1lIG9yIG51bWJlciBvZiBldmVudHMuCisgICBcaXRlbSBTdGFydCwgdXNlIHlvdXIgZW50cm9weSB2aWEgYWRkXF9lbnRyb3B5IGFuZCByZWFkeSB0aGUgUFJORyB5b3Vyc2VsZi4KK1xlbmR7ZW51bWVyYXRlfQorCitXaGVuIHlvdXIgcHJvZ3JhbSBpcyBmaW5pc2hlZCB5b3Ugc2ltcGx5IGNhbGwgdGhlIGV4cG9ydCBmdW5jdGlvbiBhbmQgc2F2ZSB0aGUgc3RhdGUgdG8gYSBtZWRpdW0gKGRpc2ssCitmbGFzaCBtZW1vcnksIGV0YykuICBUaGUgbmV4dCB0aW1lIHlvdXIgYXBwbGljYXRpb24gc3RhcnRzIHVwIHlvdSBjYW4gZGV0ZWN0IHRoZSBzdGF0ZSwgZmVlZCBpdCB0byB0aGUgCitpbXBvcnQgZnVuY3Rpb24gYW5kIGdvIG9uIHlvdXIgd2F5LiAgSXQgaXMgaWRlYWwgdGhhdCAoYXMgc29vbiBhcyBwb3NzaWJsZSkgYWZ0ZXIgc3RhcnR1cCB5b3UgZXhwb3J0IGEKK2ZyZXNoIHN0YXRlLiAgVGhpcyBoZWxwcyBpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9ncmFtIGFib3J0cyBvciB0aGUgbWFjaGluZSBpcyBwb3dlcmVkIGRvd24gd2l0aG91dAorYmVpbmcgZ2l2ZW4gYSBjaGFuY2UgdG8gZXhpdCBwcm9wZXJseS4gIAorCitOb3RlIHRoYXQgZXZlbiBpZiB5b3UgaGF2ZSBhIHN0YXRlIHRvIGltcG9ydCBpdCBpcyBpbXBvcnRhbnQgdG8gYWRkIG5ldyBlbnRyb3B5IHRvIHRoZSBzdGF0ZS4gIEhvd2V2ZXIsCit0aGVyZSBpcyBsZXNzIHByZXNzdXJlIHRvIGRvIHNvLiAgCisKK1RvIHRlc3QgYSBQUk5HIGZvciBvcGVyYXRpb25hbCBjb25mb3JtaXR5IGNhbGwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMuCisKK1xpbmRleHtQUk5HIHRlc3R9CitcYmVnaW57dmVyYmF0aW19CitpbnQgWFhYX3Rlc3Qodm9pZCk7CitcZW5ke3ZlcmJhdGltfQorCitUaGlzIHdpbGwgcmV0dXJuIFx0ZXh0YmZ7Q1JZUFRcX09LfSBpZiBQUk5HIGlzIG9wZXJhdGluZyBwcm9wZXJseS4KIAogXHN1YnNlY3Rpb257UmVtYXJrc30KIApAQCAtMTcxOSwxMSArMjE5OSwxMSBAQAogCiBcc3Vic2VjdGlvbntFeGFtcGxlfQogCi1CZWxvdyBpcyBhIHNpbXBsZSBzbmlwcGV0IHRvIHJlYWQgMTAgYnl0ZXMgZnJvbSB5YXJyb3cuICBJdHMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGlzIHNuaXBwZXQgaXMge1xiZiBOT1R9IHNlY3VyZSBzaW5jZQotdGhlIGVudHJvcHkgYWRkZWQgaXMgbm90IHJhbmRvbS4KK0JlbG93IGlzIGEgc2ltcGxlIHNuaXBwZXQgdG8gcmVhZCAxMCBieXRlcyBmcm9tIHlhcnJvdy4gIEl0cyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoaXMgc25pcHBldCBpcyAKK3tcYmYgTk9UfSBzZWN1cmUgc2luY2UgdGhlIGVudHJvcHkgYWRkZWQgaXMgbm90IHJhbmRvbS4KIAogXGJlZ2lue3ZlcmJhdGltfQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogaW50IG1haW4odm9pZCkKIHsKICAgIHBybmdfc3RhdGUgcHJuZzsKQEAgLTE3NTMsMTAgKzIyMzMsMTUgQEAKIFxiZWdpbnt2ZXJiYXRpbX0KIHN0cnVjdCBfcHJuZ19kZXNjcmlwdG9yIHsKICAgICBjaGFyICpuYW1lOworICAgIGludCAgZXhwb3J0X3NpemU7ICAgIC8qIHNpemUgaW4gYnl0ZXMgb2YgZXhwb3J0ZWQgc3RhdGUgKi8KICAgICBpbnQgKCpzdGFydCkgICAgICAocHJuZ19zdGF0ZSAqKTsKICAgICBpbnQgKCphZGRfZW50cm9weSkoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBwcm5nX3N0YXRlICopOwogICAgIGludCAoKnJlYWR5KSAgICAgIChwcm5nX3N0YXRlICopOwogICAgIHVuc2lnbmVkIGxvbmcgKCpyZWFkKSh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcgbGVuLCBwcm5nX3N0YXRlICopOworICAgIHZvaWQgKCpkb25lKShwcm5nX3N0YXRlICopOworICAgIGludCAoKmV4cG9ydCkodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nICosIHBybmdfc3RhdGUgKik7CisgICAgaW50ICgqaW1wb3J0KShjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIHBybmdfc3RhdGUgKik7CisgICAgaW50ICgqdGVzdCkodm9pZCk7CiB9OwogXGVuZHt2ZXJiYXRpbX0KIApAQCAtMTc3MCwxOSArMjI1NSw4NSBAQAogaW50IHVucmVnaXN0ZXJfcHJuZyhjb25zdCBzdHJ1Y3QgX3BybmdfZGVzY3JpcHRvciAqcHJuZyk7CiBcZW5ke3ZlcmJhdGltfQogCi1cc3Vic3Vic2VjdGlvbntQUk5HcyBQcm92aWRlZH0KLUN1cnJlbnRseSBZYXJyb3cgKHlhcnJvd1xfZGVzYyksIFJDNCAocmM0XF9kZXNjKSBhbmQgdGhlIHNlY3VyZSBSTkcgKHNwcm5nXF9kZXNjKSBhcmUgcHJvdmlkZWQgYXMgUFJOR3Mgd2l0aGluIHRoZSAKLWxpYnJhcnkuICAKK1xzdWJzZWN0aW9ue1BSTkdzIFByb3ZpZGVkfQorXGJlZ2lue2ZpZ3VyZX1baGVyZV0KK1xiZWdpbntjZW50ZXJ9CitcYmVnaW57c21hbGx9CitcYmVnaW57dGFidWxhcn17fGN8Y3xsfH0KK1xobGluZSBcdGV4dGJme05hbWV9ICYgXHRleHRiZntEZXNjcmlwdG9yfSAmIFx0ZXh0YmZ7VXNhZ2V9IFxcCitcaGxpbmUgWWFycm93ICYgeWFycm93XF9kZXNjICYgRmFzdCBzaG9ydC10ZXJtIFBSTkcgXFwKK1xobGluZSBGb3J0dW5hICYgZm9ydHVuYVxfZGVzYyAmIEZhc3QgbG9uZy10ZXJtIFBSTkcgKHJlY29tbWVuZGVkKSBcXAorXGhsaW5lIFJDNCAmIHJjNFxfZGVzYyAmIFN0cmVhbSBDaXBoZXIgXFwKK1xobGluZSBTT0JFUi0xMjggJiBzb2JlcjEyOFxfZGVzYyAmIFN0cmVhbSBDaXBoZXIgKGFsc28gdmVyeSBmYXN0IFBSTkcpIFxcCitcaGxpbmUKK1xlbmR7dGFidWxhcn0KK1xlbmR7c21hbGx9CitcZW5ke2NlbnRlcn0KK1xjYXB0aW9ue0xpc3Qgb2YgUHJvdmlkZWQgUFJOR3N9CitcZW5ke2ZpZ3VyZX0KIAotUkM0IGlzIHByb3ZpZGVkIHdpdGggYSBQUk5HIGludGVyZmFjZSBiZWNhdXNlIGl0IGlzIGEgc3RyZWFtIGNpcGhlciBhbmQgbm90IHdlbGwgc3VpdGVkIGZvciB0aGUgc3ltbWV0cmljIGJsb2NrIGNpcGhlcgotaW50ZXJmYWNlLiAgWW91IHByb3ZpZGUgdGhlIGtleSBmb3IgUkM0IHZpYSB0aGUgcmM0XF9hZGRcX2VudHJvcHkoKSBmdW5jdGlvbi4gIEJ5IGNhbGxpbmcgcmM0XF9yZWFkeSgpIHRoZSBrZXkgd2lsbCBiZSB1c2VkCi10byBzZXR1cCB0aGUgUkM0IHN0YXRlIGZvciBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24uICBUaGUgcmM0XF9yZWFkKCkgZnVuY3Rpb24gaGFzIGJlZW4gbW9kaWZpZWQgZnJvbSBSQzQgc2luY2UgaXQgd2lsbCAKLVhPUiB0aGUgb3V0cHV0IG9mIHRoZSBSQzQga2V5c3RyZWFtIGdlbmVyYXRvciBhZ2FpbnN0IHRoZSBpbnB1dCBidWZmZXIgeW91IHByb3ZpZGUuICBUaGUgZm9sbG93aW5nIHNuaXBwZXQgd2lsbCBkZW1vbnN0cmF0ZQotaG93IHRvIGVuY3J5cHQgYSBidWZmZXIgd2l0aCBSQzQ6Citcc3Vic3Vic2VjdGlvbntZYXJyb3d9CitZYXJyb3cgaXMgZmFzdCBQUk5HIG1lYW50IHRvIGNvbGxlY3QgYW4gdW5zcGVjaWZpZWQgYW1vdW50IG9mIGVudHJvcHkgZnJvbSBzb3VyY2VzIAorKGtleWJvYXJkLCBtb3VzZSwgaW50ZXJydXB0cywgZXRjKSBhbmQgcHJvZHVjZSBhbiB1bmJvdW5kZWQgc3RyaW5nIG9mIHJhbmRvbSBieXRlcy4gIAogCitcdGV4dGl0e05vdGU6fSBUaGlzIFBSTkcgaXMgc3RpbGwgc2VjdXJlIGZvciBtb3N0IHRhc2tpbmdzIGJ1dCBpcyBubyBsb25nZXIgcmVjb21tZW5kZWQuICBVc2Vycworc2hvdWxkIHVzZSBGb3J0dW5hIGluc3RlYWQuCisKK1xzdWJzdWJzZWN0aW9ue0ZvcnR1bmF9CisKK0ZvcnR1bmEgaXMgYSBmYXN0IGF0dGFjayB0b2xlcmFudCBhbmQgbW9yZSB0aG9yb3VnaGx5IGRlc2lnbmVkIFBSTkcgc3VpdGFibGUgZm9yIGxvbmcgdGVybQordXNhZ2UuICBJdCBpcyBmYXN0ZXIgdGhhbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBZYXJyb3dcZm9vdG5vdGV7WWFycm93IGhhcyBiZWVuIGltcGxlbWVudGVkCit0byB3b3JrIHdpdGggbW9zdCBjaXBoZXIgYW5kIGhhc2ggY29tYm9zIGJhc2VkIG9uIHdoaWNoIHlvdSBoYXZlIGNob3NlbiB0byBidWlsZCBpbnRvIHRoZSBsaWJyYXJ5Ln0gd2hpbGUKK3Byb3ZpZGluZyBtb3JlIHNlY3VyaXR5LiAgCisKK0ZvcnR1bmEgaXMgc2xpZ2h0bHkgbGVzcyBmbGV4aWJsZSB0aGFuIFlhcnJvdyBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBvbmx5IHdvcmtzIHdpdGggdGhlIEFFUyBibG9jayBjaXBoZXIgCithbmQgU0hBLS0yNTYgaGFzaCBmdW5jdGlvbi4gIFRlY2huaWNhbGx5IEZvcnR1bmEgd2lsbCB3b3JrIHdpdGggYW55IGJsb2NrIGNpcGhlciB0aGF0IGFjY2VwdHMgYSAyNTYtLWJpdAora2V5IGFuZCBhbnkgaGFzaCB0aGF0IHByb2R1Y2VzIGF0IGxlYXN0IGEgMjU2LS1iaXQgb3V0cHV0LiAgSG93ZXZlciwgdG8gbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gc2ltcGxlcgoraXQgaGFzIGJlZW4gZml4ZWQgdG8gdGhvc2UgY2hvaWNlcy4KKworRm9ydHVuYSBpcyBtb3JlIHNlY3VyZSB0aGFuIFlhcnJvdyBpbiB0aGUgc2Vuc2UgdGhhdCBhdHRhY2tlcnMgd2hvIGxlYXJuIHBhcnRzIG9mIHRoZSBlbnRyb3B5IGJlaW5nIAorYWRkZWQgdG8gdGhlIFBSTkcgbGVhcm4gZmFyIGxlc3MgYWJvdXQgdGhlIHN0YXRlIHRoYW4gdGhhdCBvZiBZYXJyb3cuICBXaXRob3V0IGdldHRpbmcgaW50byB0byBtYW55CitkZXRhaWxzIEZvcnR1bmEgaGFzIHRoZSBhYmlsaXR5IHRvIHJlY292ZXIgZnJvbSBzdGF0ZSBkZXRlcm1pbmF0aW9uIGF0dGFja3Mgd2hlcmUgdGhlIGF0dGFja2VyIHN0YXJ0cwordG8gbGVhcm4gaW5mb3JtYXRpb24gZnJvbSB0aGUgUFJOR3Mgb3V0cHV0IGFib3V0IHRoZSBpbnRlcm5hbCBzdGF0ZS4gIFlhcnJvdyBvbiB0aGUgb3RoZXIgaGFuZCBjYW5ub3QgCityZWNvdmVyIGZyb20gdGhhdCBwcm9ibGVtIHVudGlsIG5ldyBlbnRyb3B5IGlzIGFkZGVkIHRvIHRoZSBwb29sIGFuZCBwdXQgdG8gdXNlIHRocm91Z2ggdGhlIHJlYWR5KCkgZnVuY3Rpb24uCisKK1xzdWJzdWJzZWN0aW9ue1JDNH0KKworUkM0IGlzIGFuIG9sZCBzdHJlYW0gY2lwaGVyIHRoYXQgY2FuIGFsc28gZG91YmxlIGR1dHkgYXMgYSBQUk5HIGluIGEgcGluY2guICBZb3UgYGBrZXknJyBpdCBieQorY2FsbGluZyBhZGRcX2VudHJvcHkoKSBhbmQgc2V0dXAgdGhlIGtleSBieSBjYWxsaW5nIHJlYWR5KCkuICBZb3UgY2FuIG9ubHkgYWRkIHVwdG8gMjU2IGJ5dGVzIHZpYQorYWRkXF9lbnRyb3B5KCkuICAKKworV2hlbiB5b3UgcmVhZCBmcm9tIFJDNCB0aGUgb3V0cHV0IG9mIHRoZSBSQzQgYWxnb3JpdGhtIGlzIFhPUidkIGFnYWluc3QgeW91ciBidWZmZXIgeW91IHByb3ZpZGUuICBJbiB0aGlzCittYW5uZXIgeW91IGNhbiB1c2UgcmM0XF9yZWFkKCkgYXMgYW4gZW5jcnlwdCAoYW5kIGRlY3J5cHQpIGZ1bmN0aW9uLiAgCisKK1lvdSByZWFsbHkgc2hvdWxkbid0IHVzZSBSQzQgYW55bW9yZS4gIFRoaXMgaXNuJ3QgYmVjYXVzZSBSQzQgaXMgd2VhayAodGhvdWdoIGJpYXNlcyBhcmUga25vd24gdG8gZXhpc3QpIGp1c3QKK3NpbXBseSB0aGF0IGZhc3RlciBhbHRlcm5hdGl2ZXMgZXhpc3QuCisKK1xzdWJzdWJzZWN0aW9ue1NPQkVSLTEyOH0KKworU09CRVItMTI4IGlzIGEgc3RyZWFtIGNpcGhlciBkZXNpZ25lZCBieSB0aGUgUVVBTENPTU0gQXVzdHJhbGlhIHRlYW0uICBMaWtlIFJDNCB5b3UgYGBrZXknJyBpdCBieSAKK2NhbGxpbmcgYWRkXF9lbnRyb3B5KCkuICBUaGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgcmVhZHkoKSBmb3IgdGhpcyBQUk5HIGFzIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nLiAgCisKK05vdGUgdGhhdCB0aGlzIGNpcGhlciBoYXMgc2V2ZXJhbCBvZGRpdGllcyBhYm91dCBob3cgaXQgb3BlcmF0ZXMuICBUaGUgZmlyc3QgdGltZSB5b3UgY2FsbCAKK2FkZFxfZW50cm9weSgpIHRoYXQgc2V0cyB0aGUgY2lwaGVyJ3Mga2V5LiAgRXZlcnkgb3RoZXIgdGltZSB5b3UgY2FsbCB0aGUgc2FtZSBmdW5jdGlvbiBpdCBzZXRzCit0aGUgY2lwaGVyJ3MgSVYgdmFyaWFibGUuICBUaGUgSVYgbWVjaGFuaXNtIGFsbG93cyB5b3UgdG8gZW5jcnlwdCBzZXZlcmFsIG1lc3NhZ2VzIHdpdGggdGhlIHNhbWUKK2tleSBhbmQgbm90IHJlLS11c2UgdGhlIHNhbWUga2V5IG1hdGVyaWFsLgorCitVbmxpa2UgWWFycm93IGFuZCBGb3J0dW5hIGFsbCBvZiB0aGUgZW50cm9weSAoYW5kIGhlbmNlIHNlY3VyaXR5KSBvZiB0aGlzIGFsZ29yaXRobSByZXN0cyBpbiB0aGUgZGF0YQoreW91IHBhc3MgaXQgb24gdGhlIGZpcnN0IGNhbGwgdG8gYWRkXF9lbnRyb3B5KCkuICBBbGwgYnVmZmVycyBzZW50IHRvIGFkZFxfZW50cm9weSgpIG11c3QgaGF2ZSBhIGxlbmd0aAordGhhdCBpcyBhIG11bHRpcGxlIG9mIGZvdXIgYnl0ZXMuCisKK0xpa2UgUkM0IHRoZSBvdXRwdXQgb2YgU09CRVItLTEyOCBpcyBYT1InZWQgYWdhaW5zdCB0aGUgYnVmZmVyIHlvdSBwcm92aWRlIGl0LiAgSW4gdGhpcyBtYW5uZXIgeW91IGNhbiB1c2UKK3NvYmVyMTI4XF9yZWFkKCkgYXMgYW4gZW5jcnlwdCAoYW5kIGRlY3J5cHQpIGZ1bmN0aW9uLgorCitTaW5jZSBTT0JFUi0xMjggaGFzIGEgZml4ZWQga2V5aW5nIHNjaGVtZSBhbmQgaXMgdmVyeSBmYXN0IChmYXN0ZXIgdGhhbiBSQzQpIHRoZSBpZGVhbCB1c2FnZSBvZiBTT0JFUi0xMjggaXMgdG8gCitrZXkgaXQgZnJvbSB0aGUgb3V0cHV0IG9mIEZvcnR1bmEgKG9yIFlhcnJvdykgYW5kIHVzZSBpdCB0byBlbmNyeXB0IG1lc3NhZ2VzLiAgSXQgaXMgYWxzbyBpZGVhbCBmb3IKK3NpbXVsYXRpb25zIHdoaWNoIG5lZWQgYSBoaWdoIHF1YWxpdHkgKGFuZCBmYXN0KSBzdHJlYW0gb2YgYnl0ZXMuICAKKworXHN1YnN1YnNlY3Rpb257RXhhbXBsZSBVc2FnZX0KIFxiZWdpbntzbWFsbH0KIFxiZWdpbnt2ZXJiYXRpbX0KLSNpbmNsdWRlIDxteWNyeXB0Lmg+CisjaW5jbHVkZSA8dG9tY3J5cHQuaD4KIGludCBtYWluKHZvaWQpCiB7CiAgICBwcm5nX3N0YXRlIHBybmc7CkBAIC0xODUwLDcgKzI0MDEsNyBAQAogCiBcYmVnaW57c21hbGx9CiBcYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSA8bXljcnlwdC5oPgorI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CiBpbnQgbWFpbih2b2lkKQogewogICAgZWNjX2tleSBteWtleTsKQEAgLTE4ODcsNyArMjQzOCw3IEBACiAKIFxiZWdpbntzbWFsbH0KIFxiZWdpbnt2ZXJiYXRpbX0KLSNpbmNsdWRlIDxteWNyeXB0Lmg+CisjaW5jbHVkZSA8dG9tY3J5cHQuaD4KIGludCBtYWluKHZvaWQpCiB7CiAgICBlY2Nfa2V5IG15a2V5OwpAQCAtMTkwOSwxMiArMjQ2MCwxNCBAQAogXGVuZHt2ZXJiYXRpbX0KIFxlbmR7c21hbGx9CiAKKworCiBcY2hhcHRlcntSU0EgUHVibGljIEtleSBDcnlwdG9ncmFwaHl9CiAKIFxzZWN0aW9ue0ludHJvZHVjdGlvbn0KIFJTQSB3cm90ZSB0aGUgUEtDUyBcIzEgc3BlY2lmaWNhdGlvbnMgd2hpY2ggZGV0YWlsIFJTQSBQdWJsaWMgS2V5IENyeXB0b2dyYXBoeS4gIEluIHRoZSBzcGVjaWZpY2F0aW9ucyBhcmUKLXBhZGRpbmcgYWxnb3JpdGhtcyBmb3IgZW5jcnlwdGlvbiBhbmQgc2lnbmF0dXJlcy4gIFRoZSBzdGFuZGFyZCBpbmNsdWRlcyBgYHYxLjUnJyBhbmQgYGB2Mi4wJycgYWxnb3JpdGhtcy4KLVRvIHNpbXBsaWZ5IG1hdHRlcnMgYSBsaXR0bGUgdGhlIHYyLjAgZW5jcnlwdGlvbiBhbmQgc2lnbmF0dXJlIHBhZGRpbmcgYWxnb3JpdGhtcyBhcmUgY2FsbGVkIE9BRVAgYW5kIFBTUyAKK3BhZGRpbmcgYWxnb3JpdGhtcyBmb3IgZW5jcnlwdGlvbiBhbmQgc2lnbmF0dXJlcy4gIFRoZSBzdGFuZGFyZCBpbmNsdWRlcyB0aGUgYGB2Mi4xJycgYWxnb3JpdGhtcy4KK1RvIHNpbXBsaWZ5IG1hdHRlcnMgYSBsaXR0bGUgdGhlIHYyLjEgZW5jcnlwdGlvbiBhbmQgc2lnbmF0dXJlIHBhZGRpbmcgYWxnb3JpdGhtcyBhcmUgY2FsbGVkIE9BRVAgYW5kIFBTUyAKIHJlc3BlY3RpdmVseS4gIAogCiBcc2VjdGlvbntQS0NTIFwjMSBFbmNyeXB0aW9ufQpAQCAtMTk3MCwzMyArMjUyMyw2IEBACiAkMSQgaW4gYGByZXMnJy4gIElmIHRoZSBwYWNrZXQgaXMgaW52YWxpZCBpdCBzdG9yZXMgJDAkIGluIGBgcmVzJycgYW5kIGlmIHRoZSBmdW5jdGlvbiBmYWlscyBmb3IgYW5vdGhlciByZWFzb24KIGl0IHJldHVybnMgYW4gZXJyb3IgY29kZS4gIAogCi1cc3Vic2VjdGlvbntQS0NTIFwjMSB2MS41IEVuY29kaW5nfQotCi1caW5kZXh7cGtjc1xfMVxfdjE1XF9lc1xfZW5jb2RlKCl9Ci1cYmVnaW57dmVyYmF0aW19Ci1pbnQgcGtjc18xX3YxNV9lc19lbmNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqbXNnLCAgICB1bnNpZ25lZCBsb25nIG1zZ2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBtb2R1bHVzX2JpdGxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAgICAqcHJuZywgICBpbnQgICAgICAgICAgIHBybmdfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKLVxlbmR7dmVyYmF0aW19Ci0KLVRoaXMgd2lsbCBQS0NTIHYxLjUgZW5jb2RlIHRoZSBkYXRhIGluIGBgbXNnJycgb2YgbGVuZ3RoIGBgbXNnbGVuJycuICBQYXNzIHRoZSBsZW5ndGggKGluIGJpdHMpIG9mIHlvdXIKLVJTQSBtb2R1bHVzIGluIGBgbW9kdWx1c1xfYml0bGVuJycuICBUaGUgZW5jb2RlZCBkYXRhIHdpbGwgYmUgc3RvcmVkIGluIGBgb3V0Jycgb2YgbGVuZ3RoIGBgb3V0bGVuJycuCi0KLVxzdWJzZWN0aW9ue1BLQ1MgXCMxIHYxLjUgRGVjb2Rpbmd9Ci1caW5kZXh7cGtjc1xfMVxfdjE1XF9lc1xfZGVjb2RlKCl9Ci1cYmVnaW57dmVyYmF0aW19Ci1pbnQgcGtjc18xX3YxNV9lc19kZWNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqbXNnLCAgdW5zaWduZWQgbG9uZyBtc2dsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBtb2R1bHVzX2JpdGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nIG91dGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICpyZXMpOwotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyB3aWxsIFBLQ1MgdjEuNSBkZWNvZGUgdGhlIG1lc3NhZ2UgaW4gYGBtc2cnJyBvZiBsZW5ndGggYGBtc2dsZW4nJy4gIEl0IHdpbGwgc3RvcmUgdGhlIG91dHB1dCBpbiBgYG91dCcnLiBOb3RlCi10aGF0IHRoZSBsZW5ndGggb2YgdGhlIG91dHB1dCBgYG91dGxlbicnIGlzIGEgY29uc3RhbnQuICBUaGlzIGRlY29kZXIgY2Fubm90IGRldGVybWluZSB0aGUgb3JpZ2luYWwgbWVzc2FnZSAKLWxlbmd0aC4gIElmIHRoZSBkYXRhIGluIGBgbXNnJycgaXMgYSB2YWxpZCBwYWNrZXQgdGhlbiBhICQxJCBpcyBzdG9yZWQgaW4gYGByZXMnJywgb3RoZXJ3aXNlIGEgJDAkIGlzIAotc3RvcmVkLgotCiBcc2VjdGlvbntQS0NTIFwjMSBEaWdpdGFsIFNpZ25hdHVyZXN9CiAKIFxzdWJzZWN0aW9ue1BTUyBFbmNvZGluZ30KQEAgLTIwMzgsMzQgKzI1NjQsNiBAQAogCiBJdCdzIGltcG9ydGFudCB0byB1c2UgdGhlIHNhbWUgYGBzYWx0bGVuJycgYW5kIGhhc2ggZm9yIGJvdGggZW5jb2RpbmcgYW5kIGRlY29kaW5nIGFzIG90aGVyd2lzZSB0aGUgcHJvY2VkdXJlIHdpbGwgbm90IHdvcmsuCiAKLVxzdWJzZWN0aW9ue1BLQ1MgXCMxIHYxLjUgRW5jb2Rpbmd9Ci0KLVxpbmRleHtwa2NzXF8xXF92MTVcX3NhXF9lbmNvZGUoKX0KLVxiZWdpbnt2ZXJiYXRpbX0KLWludCBwa2NzXzFfdjE1X3NhX2VuY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICptc2doYXNoLCAgdW5zaWduZWQgbG9uZyBtc2doYXNobGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhhc2hfaWR4LCB1bnNpZ25lZCBsb25nIG1vZHVsdXNfYml0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwotXGVuZHt2ZXJiYXRpbX0KLQotVGhpcyB3aWxsIFBLQ1MgXCMxIHYxLjUgc2lnbmF0dXJlIGVuY29kZSB0aGUgbWVzc2FnZSBoYXNoIGBgbXNnaGFzaCcnICBvZiBsZW5ndGggYGBtc2doYXNobGVuJycuICBZb3UgaGF2ZQotdG8gdGVsbCB0aGlzIHJvdXRpbmUgd2hpY2ggaGFzaCBwcm9kdWNlZCB0aGUgbWVzc2FnZSBoYXNoIGluIGBgaGFzaFxfaWR4JycuICBUaGUgZW5jb2RlZCBoYXNoIGlzIHN0b3JlZAotaW4gYGBvdXQnJyBvZiBsZW5ndGggYGBvdXRsZW4nJy4KLQotXHN1YnNlY3Rpb257UEtDUyBcIzEgdjEuNSBEZWNvZGluZ30KLQotXGluZGV4e3BrY3NcXzFcX3YxNVxfc2FcX2RlY29kZSgpfQotXGJlZ2lue3ZlcmJhdGltfQotaW50IHBrY3NfMV92MTVfc2FfZGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZ2hhc2gsIHVuc2lnbmVkIGxvbmcgbXNnaGFzaGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsICAgICB1bnNpZ25lZCBsb25nIHNpZ2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGhhc2hfaWR4LCB1bnNpZ25lZCBsb25nIG1vZHVsdXNfYml0bGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgKnJlcyk7Ci1cZW5ke3ZlcmJhdGltfQotCi1UaGlzIHdpbGwgUEtDUyBcIzEgdjEuNSBzaWduYXR1cmUgZGVjb2RlIHRoZSBkYXRhIGluIGBgc2lnJycgb2YgbGVuZ3RoIGBgc2lnbGVuJycgYW5kIGNvbXBhcmUgdGhlIGV4dHJhY3RlZAotaGFzaCBhZ2FpbnN0IGBgbXNnaGFzaCcnIG9mIGxlbmd0aCBgYG1zZ2hhc2hsZW4nJy4gIFlvdSBoYXZlIHRvIHRlbGwgdGhpcyByb3V0aW5lIHdoaWNoIGhhc2ggcHJvZHVjZWQgdGhlCi1tZXNzYWdlIGRpZ2VzdCBpbiBgYGhhc2hcX2lkeCcnLiAgSWYgdGhlIHBhY2tldCBpcyB2YWxpZCBhbmQgdGhlIGhhc2hlcyBtYXRjaCBgYHJlcycnIGlzIHNldCB0byAkMSQuICBPdGhlcndpc2UsCi1pdCBpcyBzZXQgdG8gJDAkLgotCiBcc2VjdGlvbntSU0EgT3BlcmF0aW9uc30KIFxzdWJzZWN0aW9ue0JhY2tncm91bmR9CiAKQEAgLTIxMTYsMTAgKzI2MTQsMTEgQEAKIGBgcnNhXF9mcmVlKCknJyAoc2VlIGJlbG93KSB3aGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGUga2V5LiAgSWYgYGByc2FcX21ha2VcX2tleSgpJycgZmFpbHMgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IAogZnJlZSB0aGUgcmFtIGFsbG9jYXRlZCBpdHNlbGYuCiAKLVRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBSU0Ega2V5cy4gIFRoZSB0eXBlcyBhcmUge1xiZiBQS1xfUFJJVkFURVxfT1BUSU1JWkVEfSwge1xiZiBQS1xfUFJJVkFURX0gYW5kIHtcYmYgUEtcX1BVQkxJQ30uICBUaGUgZmlyc3QKLXR3byBhcmUgcHJpdmF0ZSBrZXlzIHdoZXJlIHRoZSBgYG9wdGltaXplZCcnIHR5cGUgdXNlcyB0aGUgQ2hpbmVzZSBSZW1haW5kZXIgVGhlb3JlbSB0byBzcGVlZCB1cCBkZWNyeXB0aW9uL3NpZ25hdHVyZXMuICBCeSAKLWRlZmF1bHQgYWxsIG5ldyBrZXlzIGFyZSBvZiB0aGUgYGBvcHRpbWl6ZWQnJyB0eXBlLiAgVGhlIG5vbi1vcHRpbWl6ZWQgcHJpdmF0ZSB0eXBlIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotYXMgd2VsbCBhcyB0byBzYXZlIHNwYWNlIHNpbmNlIHRoZSBvcHRpbWl6ZWQga2V5IHJlcXVpcmVzIGFib3V0IGZvdXIgdGltZXMgYXMgbXVjaCBtZW1vcnkuCitcaW5kZXh7UEtcX1BSSVZBVEV9IFxpbmRleHtQS1xfUFVCTElDfQorVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBSU0Ega2V5cy4gIFRoZSB0eXBlcyBhcmUge1xiZiBQS1xfUFJJVkFURX0gYW5kIHtcYmYgUEtcX1BVQkxJQ30uICBUaGUgZmlyc3QgdHlwZSBpcyBhIHByaXZhdGUgCitSU0Ega2V5IHdoaWNoIGluY2x1ZGVzIHRoZSBDUlQgcGFyYW1ldGVyc1xmb290bm90ZXtBcyBvZiB2MC45OSB0aGUgUEtcX1BSSVZBVEVcX09QVElNSVpFRCB0eXBlIGhhcyBiZWVuIGRlcHJlY2F0ZWQKK2FuZCBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgUEtcX1BSSVZBVEUgdHlwZS59IGluIHRoZSBmb3JtIG9mIGEgUlNBUHJpdmF0ZUtleS4gIFRoZSBzZWNvbmQgdHlwZSBpcyBhIHB1YmxpYyBSU0Ega2V5Cit3aGljaCBvbmx5IGluY2x1ZGVzIHRoZSBtb2R1bHVzIGFuZCBwdWJsaWMgZXhwb25lbnQuICBJdCB0YWtlcyB0aGUgZm9ybSBvZiBhIFJTQVB1YmxpY0tleS4KIAogXHN1YnNlY3Rpb257UlNBIEV4cG9uZW50aWF0aW9ufQogCkBAIC0yMTI3LDggKzI2MjYsOCBAQAogXGluZGV4e3JzYVxfZXhwdG1vZCgpfQogXGJlZ2lue3ZlcmJhdGltfQogaW50IHJzYV9leHB0bW9kKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBpbnQgd2hpY2gsCi0gICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAgICAqcHJuZywgaW50ICAgICAgICAgICBwcm5nX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpvdXRsZW4sIAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aGljaCwgcHJuZ19zdGF0ZSAqcHJuZywgaW50IHBybmdfaWR4LAogICAgICAgICAgICAgICAgICAgICAgIHJzYV9rZXkgKmtleSk7CiBcZW5ke3ZlcmJhdGltfQogVGhpcyBsb2FkcyB0aGUgYmlnbnVtIGZyb20gYGBpbicnIGFzIGEgYmlnIGVuZGlhbiB3b3JkIGluIHRoZSBmb3JtYXQgUEtDUyBzcGVjaWZpZXMsIHJhaXNlcyBpdCB0byBlaXRoZXIgYGBlJycgb3IgYGBkJycgYW5kIHN0b3JlcyB0aGUgcmVzdWx0CkBAIC0yMTQ0LDI5ICsyNjQzLDI4IEBACiAKIFxpbmRleHtyc2FcX2VuY3J5cHRcX2tleSgpfQogXGJlZ2lue3ZlcmJhdGltfQotaW50IHJzYV9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbmtleSwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dGtleSwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLAoraW50IHJzYV9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLAogICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpscGFyYW0sIHVuc2lnbmVkIGxvbmcgbHBhcmFtbGVuLAogICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgcHJuZ19pZHgsIGludCBoYXNoX2lkeCwgcnNhX2tleSAqa2V5KTsKIFxlbmR7dmVyYmF0aW19Ci1UaGlzIGZ1bmN0aW9uIHdpbGwgT0FFUCBwYWQgYGBpbmtleScnIG9mIGxlbmd0aCBpbmxlbiBieXRlcyB0aGVuIFJTQSBlbmNyeXB0IGl0IGFuZCBzdG9yZSB0aGUgY2lwaGVydGV4dAotaW4gYGBvdXRrZXknJyBvZiBsZW5ndGggYGBvdXRsZW4nJy4gIFRoZSBgYGxwYXJhbScnIGFuZCBgYGxwYXJhbWxlbicnIGFyZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSB3b3VsZCBwYXNzCitUaGlzIGZ1bmN0aW9uIHdpbGwgT0FFUCBwYWQgYGBpbicnIG9mIGxlbmd0aCBpbmxlbiBieXRlcyB0aGVuIFJTQSBlbmNyeXB0IGl0IGFuZCBzdG9yZSB0aGUgY2lwaGVydGV4dAoraW4gYGBvdXQnJyBvZiBsZW5ndGggYGBvdXRsZW4nJy4gIFRoZSBgYGxwYXJhbScnIGFuZCBgYGxwYXJhbWxlbicnIGFyZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSB3b3VsZCBwYXNzCiB0byBwa2NzXF8xXF9vYWVwXF9lbmNvZGUoKS4KIAogXGluZGV4e3JzYVxfZGVjcnlwdFxfa2V5KCl9CiBcYmVnaW57dmVyYmF0aW19Ci1pbnQgcnNhX2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgICAgdW5zaWduZWQgbG9uZyBpbmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0a2V5LCB1bnNpZ25lZCBsb25nICprZXlsZW4sIAoraW50IHJzYV9kZWNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCAKICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbHBhcmFtLCB1bnNpZ25lZCBsb25nIGxwYXJhbWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAgICAqcHJuZywgICBpbnQgICAgICAgICAgIHBybmdfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBoYXNoX2lkeCwgaW50ICpyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhhc2hfaWR4LCBpbnQgKnN0YXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzYV9rZXkgICAgICAgKmtleSk7CiBcZW5ke3ZlcmJhdGltfQogVGhpcyBmdW5jdGlvbiB3aWxsIFJTQSBkZWNyeXB0IGBgaW4nJyBvZiBsZW5ndGggYGBpbmxlbicnIHRoZW4gT0FFUCBkZXBhZCB0aGUgcmVzdWx0aW5nIGRhdGEgYW5kIHN0b3JlIGl0IGluCi1gYG91dGtleScnIG9mIGxlbmd0aCBgYG91dGxlbicnLiAgVGhlIGBgbHBhcmFtJycgYW5kIGBgbHBhcmFtbGVuJycgYXJlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHdvdWxkIHBhc3MKK2Bgb3V0Jycgb2YgbGVuZ3RoIGBgb3V0bGVuJycuICBUaGUgYGBscGFyYW0nJyBhbmQgYGBscGFyYW1sZW4nJyBhcmUgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugd291bGQgcGFzcwogdG8gcGtjc1xfMVxfb2FlcFxfZGVjb2RlKCkuCiAKLUlmIHRoZSBSU0EgZGVjcnlwdGVkIGRhdGEgaXNuJ3QgYSB2YWxpZCBPQUVQIHBhY2tldCB0aGVuIGBgcmVzJycgaXMgc2V0IHRvICQwJC4gIE90aGVyd2lzZSwgaXQgaXMgc2V0IHRvICQxJC4KK0lmIHRoZSBSU0EgZGVjcnlwdGVkIGRhdGEgaXNuJ3QgYSB2YWxpZCBPQUVQIHBhY2tldCB0aGVuIGBgc3RhdCcnIGlzIHNldCB0byAkMCQuICBPdGhlcndpc2UsIGl0IGlzIHNldCB0byAkMSQuCiAKIFxzdWJzZWN0aW9ue1JTQSBIYXNoIFNpZ25hdHVyZXN9CiBTaW1pbGFyIHRvIFJTQSBrZXkgZW5jcnlwdGlvbiBSU0EgaXMgYWxzbyB1c2VkIHRvIGBgZGlnaXRhbGx5IHNpZ24nJyBtZXNzYWdlIGRpZ2VzdHMgKGhhc2hlcykuICBUbyBmYWNpbGl0YXRlIHRoaXMKQEAgLTIxNzQsMjIgKzI2NzIsMjEgQEAKIAogXGluZGV4e3JzYVxfc2lnblxfaGFzaCgpfQogXGJlZ2lue3ZlcmJhdGltfQotaW50IHJzYV9zaWduX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqbXNnaGFzaCwgIHVuc2lnbmVkIGxvbmcgIG1zZ2hhc2hsZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2lnLCAgICAgIHVuc2lnbmVkIGxvbmcgKnNpZ2xlbiwgCitpbnQgcnNhX3NpZ25faGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICB1bnNpZ25lZCBsb25nICBpbmxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpvdXRsZW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAgICAqcHJuZywgICAgIGludCAgICAgICAgICAgIHBybmdfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaGFzaF9pZHgsIHVuc2lnbmVkIGxvbmcgIHNhbHRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICByc2Ffa2V5ICprZXkpOwogXGVuZHt2ZXJiYXRpbX0KIAotVGhpcyB3aWxsIFBTUyBlbmNvZGUgdGhlIG1lc3NhZ2UgaGFzaCBgYG1zZ2hhc2gnJyBvZiBsZW5ndGggYGBtc2doYXNobGVuJycuICBOZXh0IHRoZSBQU1MgZW5jb2RlZCBtZXNzYWdlIGlzCi1SU0EgYGBzaWduZWQnJyBhbmQgdGhlIG91dHB1dCBpcyBzdG9yZWQgaW4gYGBzaWcnJyBvZiBsZW5ndGggYGBzaWdsZW4nJy4gIAorVGhpcyB3aWxsIFBTUyBlbmNvZGUgdGhlIG1lc3NhZ2UgaGFzaCBgYGluJycgb2YgbGVuZ3RoIGBgaW5sZW4nJy4gIE5leHQgdGhlIFBTUyBlbmNvZGVkIG1lc3NhZ2Ugd2lsbCBiZSBSU0EgYGBzaWduZWQnJyBhbmQgCit0aGUgb3V0cHV0IGlzIHN0b3JlZCBpbiBgYG91dCcnIG9mIGxlbmd0aCBgYG91dGxlbicnLiAgCiAKIAogXGluZGV4e3JzYVxfdmVyaWZ5XF9oYXNoKCl9CiBcYmVnaW57dmVyYmF0aW19CiBpbnQgcnNhX3ZlcmlmeV9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgICAgICB1bnNpZ25lZCBsb25nIHNpZ2xlbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbXNnaGFzaCwgIHVuc2lnbmVkIGxvbmcgbXNnaGFzaGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAgICAqcHJuZywgICAgIGludCAgICAgICAgICAgcHJuZ19pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhhc2hfaWR4LCB1bnNpZ25lZCBsb25nIHNhbHRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgKnN0YXQsICAgICByc2Ffa2V5ICAgICAgKmtleSk7CiBcZW5ke3ZlcmJhdGltfQpAQCAtMjIwMiw3ICsyNjk5LDcgQEAKIHRvICQxJC4KIAogXGJlZ2lue3ZlcmJhdGltfQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogaW50IG1haW4odm9pZCkKIHsKICAgIGludCAgICAgICAgICAgZXJyLCBoYXNoX2lkeCwgcHJuZ19pZHgsIHJlczsKQEAgLTIyNTksOCArMjc1Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbDIsIC8qIHBsYWludGV4dCBsZW5ndGggKi8KICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0QXBwIiwgLyogbHBhcmFtIGZvciB0aGlzIHByb2dyYW0gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgLyogbHBhcmFtIGlzIDcgYnl0ZXMgbG9uZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKiBQUk5HIHN0YXRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19pZHgsIC8qIHBybmcgaWR4ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9pZHgsIC8qIGhhc2ggaWR4ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXMsIC8qIHZhbGlkaXR5IG9mIGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSkgLyogb3VyIFJTQSBrZXkgKi8gCkBAIC0yMjcyLDc5ICsyNzY3LDYgQEAKIH0KIFxlbmR7dmVyYmF0aW19CiAKLVxjaGFwdGVye1Bhc3N3b3JkIEJhc2VkIENyeXB0b2dyYXBoeX0KLVxzZWN0aW9ue1BLQ1MgXCM1fQotSW4gb3JkZXIgdG8gc2VjdXJlbHkgaGFuZGxlIHVzZXIgcGFzc3dvcmRzIGZvciB0aGUgcHVycG9zZXMgb2YgY3JlYXRpbmcgc2Vzc2lvbiBrZXlzIGFuZCBjaGFpbmluZyBJVnMgdGhlIFBLQ1MgXCM1IHdhcyBkcmFmdGVkLiAgIFBLQ1MgXCM1Ci1pcyBtYWRlIHVwIG9mIHR3byBhbGdvcml0aG1zLCBBbGdvcml0aG0gT25lIGFuZCBBbGdvcml0aG0gVHdvLiAgQWxnb3JpdGhtIE9uZSBpcyB0aGUgb2xkZXIgZmFpcmx5IGxpbWl0ZWQgYWxnb3JpdGhtIHdoaWNoIGhhcyBiZWVuIGltcGxlbWVudGVkCi1mb3IgY29tcGxldGVuZXNzLiAgQWxnb3JpdGhtIFR3byBpcyBhIGJpdCBtb3JlIG1vZGVybiBhbmQgbW9yZSBmbGV4aWJsZSB0byB3b3JrIHdpdGguCi0KLVxzZWN0aW9ue0FsZ29yaXRobSBPbmV9Ci1BbGdvcml0aG0gT25lIGFjY2VwdHMgYXMgaW5wdXQgYSBwYXNzd29yZCwgYW4gOC0tYnl0ZSBzYWx0IGFuZCBhbiBpdGVyYXRpb24gY291bnRlci4gIFRoZSBpdGVyYXRpb24gY291bnRlciBpcyBtZWFudCB0byBhY3QgYXMgZGVsYXkgZm9yCi1wZW9wbGUgdHJ5aW5nIHRvIGJydXRlIGZvcmNlIGd1ZXNzIHRoZSBwYXNzd29yZC4gIFRoZSBoaWdoZXIgdGhlIGl0ZXJhdGlvbiBjb3VudGVyIHRoZSBsb25nZXIgdGhlIGRlbGF5LiAgVGhpcyBhbGdvcml0aG0gYWxzbyByZXF1aXJlcyBhIGhhc2ggCi1hbGdvcml0aG0gYW5kIHByb2R1Y2VzIGFuIG91dHB1dCBubyBsb25nZXIgdGhhbiB0aGUgb3V0cHV0IG9mIHRoZSBoYXNoLiAgCi0KLVxpbmRleHtwa2NzXF81XF9hbGcxKCl9Ci1cYmVnaW57YWxsdHR9Ci1pbnQgcGtjc181X2FsZzEoY29uc3QgdW5zaWduZWQgY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGxvbmcgcGFzc3dvcmRfbGVuLCAKLSAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LCAKLSAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uX2NvdW50LCAgaW50IGhhc2hfaWR4LAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi1cZW5ke2FsbHR0fQotV2hlcmUgYGBwYXNzd29yZCcnIGlzIHRoZSB1c2VycyBwYXNzd29yZC4gIFNpbmNlIHRoZSBhbGdvcml0aG0gYWxsb3dzIGJpbmFyeSBwYXNzd29yZHMgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBsZW5ndGggaW4gYGBwYXNzd29yZFxfbGVuJycuICAKLVRoZSBgYHNhbHQnJyBpcyBhIGZpeGVkIHNpemUgOC0tYnl0ZSBhcnJheSB3aGljaCBzaG91bGQgYmUgcmFuZG9tIGZvciBlYWNoIHVzZXIgYW5kIHNlc3Npb24uICBUaGUgYGBpdGVyYXRpb25cX2NvdW50JycgaXMgdGhlIGRlbGF5IGRlc2lyZWQKLW9uIHRoZSBwYXNzd29yZC4gIFRoZSBgYGhhc2hcX2lkeCcnIGlzIHRoZSBpbmRleCBvZiB0aGUgaGFzaCB5b3Ugd2lzaCB0byB1c2UgaW4gdGhlIGRlc2NyaXB0b3IgdGFibGUuICAKLQotVGhlIG91dHB1dCBvZiBsZW5ndGggdXB0byBgYG91dGxlbicnIGlzIHN0b3JlZCBpbiBgYG91dCcnLiAgSWYgYGBvdXRsZW4nJyBpcyBpbml0aWFsbHkgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGhhc2ggZnVuY3Rpb25zIG91dHB1dAotaXQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgc3RvcmVkLiAgSWYgaXQgaXMgc21hbGxlciB0aGFuIG5vdCBhbGwgb2YgdGhlIGhhc2ggb3V0cHV0IGlzIHN0b3JlZCBpbiBgYG91dCcnLgotCi1cc2VjdGlvbntBbGdvcml0aG0gVHdvfQotCi1BbGdvcml0aG0gVHdvIGlzIHRoZSByZWNvbW1lbmRlZCBhbGdvcml0aG0gZm9yIHRoaXMgdGFzay4gIEl0IGFsbG93cyB2YXJpYWJsZSBsZW5ndGggc2FsdHMgYW5kIGNhbiBwcm9kdWNlIG91dHB1dHMgbGFyZ2VyIHRoYW4gdGhlIAotaGFzaCBmdW5jdGlvbnMgb3V0cHV0LiAgQXMgc3VjaCBpdCBjYW4gZWFzaWx5IGJlIHVzZWQgdG8gZGVyaXZlIHNlc3Npb24ga2V5cyBmb3IgY2lwaGVycyBhbmQgTUFDcyBhcyB3ZWxsIGluaXRpYWwgdmVjdG9ycyBhcyByZXF1aXJlZAotZnJvbSBhIHNpbmdsZSBwYXNzd29yZCBhbmQgaW52b2thdGlvbiBvZiB0aGlzIGFsZ29yaXRobS4KLQotXGluZGV4e3BrY3NcXzVcX2FsZzIoKX0KLVxiZWdpbnthbGx0dH0KLWludCBwa2NzXzVfYWxnMihjb25zdCB1bnNpZ25lZCBjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgbG9uZyBwYXNzd29yZF9sZW4sIAotICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsICAgICB1bnNpZ25lZCBsb25nIHNhbHRfbGVuLAotICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb25fY291bnQsICAgICAgICAgICBpbnQgaGFzaF9pZHgsCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKLVxlbmR7YWxsdHR9Ci1XaGVyZSBgYHBhc3N3b3JkJycgaXMgdGhlIHVzZXJzIHBhc3N3b3JkLiAgU2luY2UgdGhlIGFsZ29yaXRobSBhbGxvd3MgYmluYXJ5IHBhc3N3b3JkcyB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIGxlbmd0aCBpbiBgYHBhc3N3b3JkXF9sZW4nJy4gIAotVGhlIGBgc2FsdCcnIGlzIGFuIGFycmF5IG9mIHNpemUgYGBzYWx0XF9sZW4nJy4gIEl0IHNob3VsZCBiZSByYW5kb20gZm9yIGVhY2ggdXNlciBhbmQgc2Vzc2lvbi4gIFRoZSBgYGl0ZXJhdGlvblxfY291bnQnJyBpcyB0aGUgZGVsYXkgZGVzaXJlZAotb24gdGhlIHBhc3N3b3JkLiAgVGhlIGBgaGFzaFxfaWR4JycgaXMgdGhlIGluZGV4IG9mIHRoZSBoYXNoIHlvdSB3aXNoIHRvIHVzZSBpbiB0aGUgZGVzY3JpcHRvciB0YWJsZS4gICBUaGUgb3V0cHV0IG9mIGxlbmd0aCB1cHRvIAotYGBvdXRsZW4nJyBpcyBzdG9yZWQgaW4gYGBvdXQnJy4KLQotXGJlZ2lue2FsbHR0fQotLyogZGVtbyB0byBzaG93IGhvdyB0byBtYWtlIHNlc3Npb24gc3RhdGUgbWF0ZXJpYWwgZnJvbSBhIHBhc3N3b3JkICovCi0jaW5jbHVkZSA8bXljcnlwdC5oPgotaW50IG1haW4odm9pZCkKLVx7Ci0gICAgdW5zaWduZWQgY2hhciBwYXNzd29yZFsxMDBdLCBzYWx0WzEwMF0sCi0gICAgICAgICAgICAgICAgICBjaXBoZXJfa2V5WzE2XSwgY2lwaGVyX2l2WzE2XSwKLSAgICAgICAgICAgICAgICAgIG1hY19rZXlbMTZdLCBvdXRidWZbNDhdOwotICAgIGludCAgICAgICAgICAgZXJyLCBoYXNoX2lkeDsKLSAgICB1bnNpZ25lZCBsb25nIG91dGxlbiwgcGFzc3dvcmRfbGVuLCBzYWx0X2xlbjsKLQotICAgIC8qIHJlZ2lzdGVyIGhhc2ggYW5kIGdldCBpdCdzIGlkeCAuLi4uICovCi0KLSAgICAvKiBnZXQgdXNlcnMgcGFzc3dvcmQgYW5kIG1ha2UgdXAgYSBzYWx0IC4uLiAqLwotCi0gICAgLyogY3JlYXRlIHRoZSBtYXRlcmlhbCAoMTAwIGl0ZXJhdGlvbnMgaW4gYWxnb3JpdGhtKSAqLwotICAgIG91dGxlbiA9IHNpemVvZihvdXRidWYpOwotICAgIGlmICgoZXJyID0gcGtjc181X2FsZzIocGFzc3dvcmQsIHBhc3N3b3JkX2xlbiwgc2FsdCwgc2FsdF9sZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCBoYXNoX2lkeCwgb3V0YnVmLCAmb3V0bGVuKSkgIT0gQ1JZUFRfT0spIFx7Ci0gICAgICAgLyogZXJyb3IgaGFuZGxlICovCi0gICAgXH0KLQotICAgIC8qIG5vdyBleHRyYWN0IGl0ICovCi0gICAgbWVtY3B5KGNpcGhlcl9rZXksIG91dGJ1ZiwgMTYpOwotICAgIG1lbWNweShjaXBoZXJfaXYsICBvdXRidWYrMTYsIDE2KTsKLSAgICBtZW1jcHkobWFjX2tleSwgICAgb3V0YnVmKzMyLCAxNik7Ci0KLSAgICAvKiB1c2UgbWF0ZXJpYWwgKHJlY2FsbCB0byBzdG9yZSB0aGUgc2FsdCBpbiB0aGUgb3V0cHV0KSAqLwotXH0KLVxlbmR7YWxsdHR9CiAKIFxjaGFwdGVye0RpZmZpZS1IZWxsbWFuIEtleSBFeGNoYW5nZX0KIApAQCAtMjUzOSwxNiArMjk2MSwxNiBAQAogYWxnb3JpdGhtcy4gIAogXGluZGV4e2RoXF9lbmNyeXB0XF9rZXkoKX0gXGluZGV4e2RoXF9kZWNyeXB0XF9rZXkoKX0KIFxiZWdpbnt2ZXJiYXRpbX0KLWludCBkaF9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sCitpbnQgZGhfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgdW5zaWduZWQgbG9uZyAgaW5sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgdW5zaWduZWQgbG9uZyAqbGVuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGludCBoYXNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkaF9rZXkgKmtleSk7CiAKLWludCBkaF9kZWNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRrZXksIHVuc2lnbmVkIGxvbmcgKmtleWxlbiwgCitpbnQgZGhfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nICBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGhfa2V5ICprZXkpOwogXGVuZHt2ZXJiYXRpbX0KLVdoZXJlIGBgaW5rZXknJyBpcyBhbiBpbnB1dCBzeW1tZXRyaWMga2V5IG9mIG5vIG1vcmUgdGhhbiAzMiBieXRlcy4gIEVzc2VudGlhbGx5IHRoZXNlIHJvdXRpbmVzIGNyZWF0ZWQgYSByYW5kb20gcHVibGljIGtleQorV2hlcmUgYGBpbicnIGlzIGFuIGlucHV0IHN5bW1ldHJpYyBrZXkgb2Ygbm8gbW9yZSB0aGFuIDMyIGJ5dGVzLiAgRXNzZW50aWFsbHkgdGhlc2Ugcm91dGluZXMgY3JlYXRlZCBhIHJhbmRvbSBwdWJsaWMga2V5CiBhbmQgZmluZCB0aGUgaGFzaCBvZiB0aGUgc2hhcmVkIHNlY3JldC4gIFRoZSBtZXNzYWdlIGRpZ2VzdCBpcyB0aGFuIFhPUidlZCBhZ2FpbnN0IHRoZSBzeW1tZXRyaWMga2V5LiAgQWxsIG9mIHRoZSAKIHJlcXVpcmVkIGRhdGEgaXMgcGxhY2VkIGluIGBgb3V0JycgYnkgYGBkaFxfZW5jcnlwdFxfa2V5KCknJy4gICBUaGUgaGFzaCBtdXN0IHByb2R1Y2UgYSBtZXNzYWdlIGRpZ2VzdCBhdCBsZWFzdCBhcyBsYXJnZQogYXMgdGhlIHN5bW1ldHJpYyBrZXkgeW91IGFyZSB0cnlpbmcgdG8gc2hhcmUuCkBAIC0yNTkzLDYgKzMwMTUsMzMgQEAKIHJhbmdlIGluIG9yZGVyIGZyb20gJFxhcHByb3ggMl57MTkyfSQgcG9pbnRzIHRvICRcYXBwcm94IDJeezUyMX0kLiAgQWNjb3JkaW5nIHRvIHRoZSBzb3VyY2UgZG9jdW1lbnQgYW55IGtleSBzaXplIGdyZWF0ZXIKIHRoYW4gb3IgZXF1YWwgdG8gMjU2LWJpdHMgaXMgc3VmZmljaWVudCBmb3IgbG9uZyB0ZXJtIHNlY3VyaXR5LiAgCiAKK1xzZWN0aW9ue0tleSBGb3JtYXR9CitMaWJUb21DcnlwdCB1c2VzIGl0J3Mgb3duIGZvcm1hdCBmb3IgRUNDIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXlzLiAgV2hpbGUgQU5TSSBYOS42MiBwYXJ0aWFsbHkgc3BlY2lmaWVzIGtleSBmb3JtYXRzIChpdCBjb3ZlcnMgcHVibGljIGtleXMpIGl0IGRvZXMgaXQgaW4gYSBsZXNzCit0aGFuIGlkZWFsbHkgc2ltcGxlIG1hbm5lci4gIEluIHRoZSBjYXNlIG9mIExpYlRvbUNyeXB0IGl0IGlzIG1lYW50IFx0ZXh0YmZ7c29sZWx5fSBmb3IgTklTVCAkR0YocCkkIGN1cnZlcy4gIFRoZSBmb3JtYXQgb2YgdGhlIGtleXMgaXMgYXMgZm9sbG93czoKKworXGJlZ2lue3NtYWxsfQorXGJlZ2lue3ZlcmJhdGltfQorRUNDUHVibGljS2V5IDo6PSBTRVFVRU5DRSB7CisgICAgZmxhZ3MgICAgICAgQklUIFNUUklORygxKSwgLS0gcHVibGljL3ByaXZhdGUgZmxhZyAoYWx3YXlzIHplcm8pLCAKKyAgICBrZXlTaXplICAgICBJTlRFR0VSLCAgICAgICAtLSBDdXJ2ZSBzaXplIChpbiBiaXRzKSBkaXZpZGVkIGJ5IGVpZ2h0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFuZCByb3VuZGVkIGRvd24sIGUuZy4gNTIxID0+IDY1CisgICAgcHVia2V5LnggICAgSU5URUdFUiwgICAgICAgLS0gVGhlIFggY28tb3JkaW5hdGUgb2YgdGhlIHB1YmxpYyBrZXkgcG9pbnQKKyAgICBwdWJrZXkueSAgICBJTlRFR0VSLCAgICAgICAtLSBUaGUgWSBjby1vcmRpbmF0ZSBvZiB0aGUgcHVibGljIGtleSBwb2ludAorfQorCitFQ0NQcml2YXRlS2V5IDo6PSBTRVFVRU5DRSB7CisgICAgZmxhZ3MgICAgICAgQklUIFNUUklORygxKSwgLS0gcHVibGljL3ByaXZhdGUgZmxhZyAoYWx3YXlzIG9uZSksIAorICAgIGtleVNpemUgICAgIElOVEVHRVIsICAgICAgIC0tIEN1cnZlIHNpemUgKGluIGJpdHMpIGRpdmlkZWQgYnkgZWlnaHQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYW5kIHJvdW5kZWQgZG93biwgZS5nLiA1MjEgPT4gNjUKKyAgICBwdWJrZXkueCAgICBJTlRFR0VSLCAgICAgICAtLSBUaGUgWCBjby1vcmRpbmF0ZSBvZiB0aGUgcHVibGljIGtleSBwb2ludAorICAgIHB1YmtleS55ICAgIElOVEVHRVIsICAgICAgIC0tIFRoZSBZIGNvLW9yZGluYXRlIG9mIHRoZSBwdWJsaWMga2V5IHBvaW50CisgICAgc2VjcmV0LmsgICAgSU5URUdFUiwgICAgICAgLS0gVGhlIHNlY3JldCBrZXkgc2NhbGFyCit9CitcZW5ke3ZlcmJhdGltfQorXGVuZHtzbWFsbH0KKworVGhlIGZpcnN0IGZsYWdzIGJpdCBkZW5vdGVzIHdoZXRoZXIgdGhlIGtleSBpcyBwdWJsaWMgKHplcm8pIG9yIHByaXZhdGUgKG9uZSkuICAKKwogXHNlY3Rpb257Q29yZSBGdW5jdGlvbnN9CiAKIExpa2UgdGhlIERIIHJvdXRpbmVzIHRoZXJlIGlzIGEga2V5IHN0cnVjdHVyZSBgYGVjY1xfa2V5JycgdXNlZCBieSB0aGUgZnVuY3Rpb25zLiAgVGhlcmUgaXMgYSBmdW5jdGlvbiB0byBtYWtlIGEga2V5OgpAQCAtMjYwMiw4ICszMDUxLDggQEAKICAgICAgICAgICAgICAgICAgaW50IGtleXNpemUsIGVjY19rZXkgKmtleSk7CiBcZW5ke3ZlcmJhdGltfQogCi1UaGUgYGBrZXlzaXplJycgaXMgdGhlIHNpemUgb2YgdGhlIG1vZHVsdXMgaW4gYnl0ZXMgZGVzaXJlZC4gIEN1cnJlbnRseSBkaXJlY3RseSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSAyMCwgMjQsIDI4LCAzMiwgNDggYW5kIDY1IGJ5dGVzIHdoaWNoCi1jb3JyZXNwb25kIHRvIGtleSBzaXplcyBvZiAxNjAsIDE5MiwgMjI0LCAyNTYsIDM4NCBhbmQgNTIxIGJpdHMgcmVzcGVjdGl2ZWx5LiAgSWYgeW91IHBhc3MgYSBrZXkgc2l6ZSB0aGF0IGlzIGJldHdlZW4gYW55IGtleSBzaXplCitUaGUgYGBrZXlzaXplJycgaXMgdGhlIHNpemUgb2YgdGhlIG1vZHVsdXMgaW4gYnl0ZXMgZGVzaXJlZC4gIEN1cnJlbnRseSBkaXJlY3RseSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSAyNCwgMjgsIDMyLCA0OCBhbmQgNjUgYnl0ZXMgd2hpY2gKK2NvcnJlc3BvbmQgdG8ga2V5IHNpemVzIG9mIDE5MiwgMjI0LCAyNTYsIDM4NCBhbmQgNTIxIGJpdHMgcmVzcGVjdGl2ZWx5LiAgSWYgeW91IHBhc3MgYSBrZXkgc2l6ZSB0aGF0IGlzIGJldHdlZW4gYW55IGtleSBzaXplCiBpdCB3aWxsIHJvdW5kIHRoZSBrZXlzaXplIHVwIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBvbmUuICBUaGUgcmVzdCBvZiB0aGUgcGFyYW1ldGVycyB3b3JrIGxpa2UgdGhleSBkbyBpbiB0aGUgYGBkaFxfbWFrZVxfa2V5KCknJyBmdW5jdGlvbi4gIAogVG8gZnJlZSB0aGUgcmFtIGFsbG9jYXRlZCBieSBhIGtleSBjYWxsOgogXGluZGV4e2VjY1xfZnJlZSgpfQpAQCAtMjY1MiwyMSArMzEwMSwzMyBAQAogCiBcaW5kZXh7ZWNjXF9lbmNyeXB0XF9rZXkoKX0gXGluZGV4e2VjY1xfZGVjcnlwdFxfa2V5KCl9CiBcYmVnaW57dmVyYmF0aW19Ci1pbnQgZWNjX2VuY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlua2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgdW5zaWduZWQgbG9uZyAqbGVuLCAKK2ludCBlY2NfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgdW5zaWduZWQgbG9uZyAgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgaW50IGhhc2gsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBlY2Nfa2V5ICprZXkpOwogCi1pbnQgZWNjX2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRrZXksIHVuc2lnbmVkIGxvbmcgKmtleWxlbiwgCitpbnQgZWNjX2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyAgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNjX2tleSAqa2V5KTsKIFxlbmR7dmVyYmF0aW19CiAKLVdoZXJlIGBgaW5rZXknJyBpcyBhbiBpbnB1dCBzeW1tZXRyaWMga2V5IG9mIG5vIG1vcmUgdGhhbiAzMiBieXRlcy4gIEVzc2VudGlhbGx5IHRoZXNlIHJvdXRpbmVzIGNyZWF0ZWQgYSByYW5kb20gcHVibGljIGtleQorV2hlcmUgYGBpbicnIGlzIGFuIGlucHV0IHN5bW1ldHJpYyBrZXkgb2Ygbm8gbW9yZSB0aGFuIDY0IGJ5dGVzLiAgRXNzZW50aWFsbHkgdGhlc2Ugcm91dGluZXMgY3JlYXRlZCBhIHJhbmRvbSBwdWJsaWMga2V5CiBhbmQgZmluZCB0aGUgaGFzaCBvZiB0aGUgc2hhcmVkIHNlY3JldC4gIFRoZSBtZXNzYWdlIGRpZ2VzdCBpcyB0aGFuIFhPUidlZCBhZ2FpbnN0IHRoZSBzeW1tZXRyaWMga2V5LiAgQWxsIG9mIHRoZSByZXF1aXJlZAogZGF0YSBpcyBwbGFjZWQgaW4gYGBvdXQnJyBieSBgYGVjY1xfZW5jcnlwdFxfa2V5KCknJy4gICBUaGUgaGFzaCBjaG9zZW4gbXVzdCBwcm9kdWNlIGEgbWVzc2FnZSBkaWdlc3QgYXQgbGVhc3QgYXMgbGFyZ2UKIGFzIHRoZSBzeW1tZXRyaWMga2V5IHlvdSBhcmUgdHJ5aW5nIHRvIHNoYXJlLgogCitcc3Vic2VjdGlvbntFbmNyeXB0IFBhY2tldCBGb3JtYXR9CisKK1RoZSBwYWNrZXQgZm9ybWF0IGZvciB0aGUgZW5jcnlwdGVkIGtleXMgaXMgdGhlIGZvbGxvd2luZyBBU04uMSBTRVFVRU5DRToKKworXGJlZ2lue3ZlcmJhdGltfQorRUNDRW5jcnlwdCA6Oj0gU0VRVUVOQ0UgeworICAgaGFzaElEICAgICAgICBPQkpFQ1QgSURFTlRJRklFUiwgLS0gT0lEIG9mIGhhc2ggdXNlZAorICAgcHVia2V5ICAgICAgICBPQ1RFVCBTVFJJTkcgICAgICwgLS0gRW5jYXBzdWxhdGVkIEVDQ1B1YmxpY0tleSAoc2VlIGFib3ZlKQorICAgc2tleSAgICAgICAgICBPQ1RFVCBTVFJJTkcgICAgICAgLS0geG9yIG9mIHBsYWludGV4dCBhbmQgImhhc2ggb2Ygc2hhcmVkIHNlY3JldCIKK30KK1xlbmR7dmVyYmF0aW19CisKIFRoZXJlIGFyZSBhbHNvIGZ1bmN0aW9ucyB0byBzaWduIGFuZCB2ZXJpZnkgdGhlIGhhc2ggb2YgYSBtZXNzYWdlLgogXGluZGV4e2VjY1xfc2lnblxfaGFzaCgpfSBcaW5kZXh7ZWNjXF92ZXJpZnlcX2hhc2goKX0KIFxiZWdpbnt2ZXJiYXRpbX0KQEAgLTI2ODMsMTIgKzMxNDQsMTQgQEAKIFRoZSBgYGVjY1xfdmVyaWZ5XF9oYXNoJycgZnVuY3Rpb24gdmVyaWZpZXMgdGhlIEVDQyBzaWduYXR1cmUgaW4gYGBzaWcnJyBhZ2FpbnN0IHRoZSBoYXNoIGluIGBgaGFzaCcnLiAgSXQgc2V0cyBgYHN0YXQnJwogdG8gbm9uLXplcm8gaWYgdGhlIHNpZ25hdHVyZSBwYXNzZXMgb3IgemVybyBpZiBpdCBmYWlscy4KIAorXHN1YnNlY3Rpb257U2lnbmF0dXJlIEZvcm1hdH0KK1RoZSBzaWduYXR1cmUgY29kZSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBYOS42MiBFQy1EU0EgYW5kIHRoZSBvdXRwdXQgaXMgY29tZm9ybWFudCBmb3IgR0YocCkgY3VydmVzLgogCiBcc2VjdGlvbntFQ0MgS2V5c2l6ZXN9CiBXaXRoIEVDQyBpZiB5b3UgdHJ5IGFuZCBzaWduIGEgaGFzaCB0aGF0IGlzIGJpZ2dlciB0aGFuIHlvdXIgRUNDIGtleSB5b3UgY2FuIHJ1biBpbnRvIHByb2JsZW1zLiAgVGhlIG1hdGggd2lsbCBzdGlsbCB3b3JrCiBhbmQgaW4gZWZmZWN0IHRoZSBzaWduYXR1cmUgd2lsbCBzdGlsbCB3b3JrLiAgV2l0aCBFQ0Mga2V5cyB0aGUgc3RyZW5ndGggb2YgdGhlIHNpZ25hdHVyZSBpcyBsaW1pdGVkIGJ5IHRoZSBzaXplIG9mCi10aGUgaGFzaCBvciB0aGUgc2l6ZSBvZiB0aGV5IGtleSwgd2hpY2hldmVyIGlzIHNtYWxsZXIuICBGb3IgZXhhbXBsZSwgaWYgeW91IHNpZ24gd2l0aCBTSEEyNTYgYW5kIGEgRUNDLTE2MCBrZXkgaW4gZWZmZWN0Ci15b3UgaGF2ZSAxNjAtYml0cyBvZiBzZWN1cml0eSAoZS5nLiBhcyBpZiB5b3Ugc2lnbmVkIHdpdGggU0hBLTEpLiAgCit0aGUgaGFzaCBvciB0aGUgc2l6ZSBvZiB0aGV5IGtleSwgd2hpY2hldmVyIGlzIHNtYWxsZXIuICBGb3IgZXhhbXBsZSwgaWYgeW91IHNpZ24gd2l0aCBTSEEyNTYgYW5kIGFuIEVDQy0xOTIga2V5IGluIGVmZmVjdAoreW91IGhhdmUgMTkyLWJpdHMgb2Ygc2VjdXJpdHkuICAKIAogVGhlIGxpYnJhcnkgd2lsbCBub3Qgd2FybiB5b3UgaWYgeW91IG1ha2UgdGhpcyBtaXN0YWtlIHNvIGl0IGlzIGltcG9ydGFudCB0byBjaGVjayB5b3Vyc2VsZiBiZWZvcmUgdXNpbmcgdGhlIAogc2lnbmF0dXJlcy4KQEAgLTI3MDMsNiArMzE2NiwzOCBAQAogVGhlIEFQSSBmb3IgdGhlIERTQSBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgb3RoZXIgUEsgYWxnb3JpdGhtcy4gIEV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBEU0Egbm8gZW5jcnlwdGlvbiBvcgogZGVjcnlwdGlvbiByb3V0aW5lcyBhcmUgcHJvdmlkZWQuICAKIAorXHNlY3Rpb257S2V5IEZvcm1hdH0KK1NpbmNlIG5vIHVzZWZ1bCBwdWJsaWMgc3RhbmRhcmQgZm9yIERTQSBrZXkgc3RvcmFnZSB3YXMgcHJlc2VudGVkIHRvIG1lIGR1cmluZyB0aGUgY291cnNlIG9mIHRoaXMgZGV2ZWxvcG1lbnQgSSBtYWRlIG15IG93biBBU04uMSBTRVFVRU5DRSB3aGljaCBJIGRvY3VtZW50Citub3cgc28gdGhhdCBvdGhlcnMgY2FuIGludGVyb3BlcmF0ZSB3aXRoIHRoaXMgbGlicmFyeS4KKworXGJlZ2lue3ZlcmJhdGltfQorRFNBUHVibGljS2V5IDo6PSBTRVFVRU5DRSB7CisgICAgcHVibGljRmxhZ3MgICAgQklUIFNUUklORygxKSwgLS0gbXVzdCBiZSAwCisgICAgZyAgICAgICAgICAgICAgSU5URUdFUiAgICAgICwgLS0gYmFzZSBnZW5lcmF0b3IsIGNoZWNrIHRoYXQgZ15xIG1vZCBwID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBhbmQgdGhhdCAxIDwgZyA8IHAgLSAxCisgICAgcCAgICAgICAgICAgICAgSU5URUdFUiAgICAgICwgLS0gcHJpbWUgbW9kdWx1cyAKKyAgICBxICAgICAgICAgICAgICBJTlRFR0VSICAgICAgLCAtLSBvcmRlciBvZiBzdWItZ3JvdXAgKG11c3QgYmUgcHJpbWUpCisgICAgeSAgICAgICAgICAgICAgSU5URUdFUiAgICAgICwgLS0gcHVibGljIGtleSwgc3BlY2lmaWNhbGx5LCBnXnggbW9kIHAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGNoZWNrIHRoYXQgeV5xIG1vZCBwID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBhbmQgdGhhdCAxIDwgeSA8IHAgLSAxCit9CisKK0RTQVByaXZhdGVLZXkgOjo9IFNFUVVFTkNFIHsKKyAgICBwdWJsaWNGbGFncyAgICBCSVQgU1RSSU5HKDEpLCAtLSBtdXN0IGJlIDEKKyAgICBnICAgICAgICAgICAgICBJTlRFR0VSICAgICAgLCAtLSBiYXNlIGdlbmVyYXRvciwgY2hlY2sgdGhhdCBnXnEgbW9kIHAgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFuZCB0aGF0IDEgPCBnIDwgcCAtIDEKKyAgICBwICAgICAgICAgICAgICBJTlRFR0VSICAgICAgLCAtLSBwcmltZSBtb2R1bHVzIAorICAgIHEgICAgICAgICAgICAgIElOVEVHRVIgICAgICAsIC0tIG9yZGVyIG9mIHN1Yi1ncm91cCAobXVzdCBiZSBwcmltZSkKKyAgICB5ICAgICAgICAgICAgICBJTlRFR0VSICAgICAgLCAtLSBwdWJsaWMga2V5LCBzcGVjaWZpY2FsbHksIGdeeCBtb2QgcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY2hlY2sgdGhhdCB5XnEgbW9kIHAgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFuZCB0aGF0IDEgPCB5IDwgcCAtIDEKKyAgICB4ICAgICAgICAgICAgICBJTlRFR0VSICAgICAgICAtLSBwcml2YXRlIGtleQorfQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGxlYWRpbmcgQklUIFNUUklORyBoYXMgYSBzaW5nbGUgYml0IGluIGl0IHdoaWNoIGlzIHplcm8gZm9yIHB1YmxpYyBrZXlzIGFuZCBvbmUgZm9yIHByaXZhdGUga2V5cy4gIFRoaXMgbWFrZXMgdGhlIHN0cnVjdHVyZSB1bmlxdWVseSBkZWNvZGFibGUgYW5kIGVhc3kKK3RvIHdvcmsgd2l0aC4KKwogXHNlY3Rpb257S2V5IEdlbmVyYXRpb259CiBUbyBtYWtlIGEgRFNBIGtleSB5b3UgbXVzdCBjYWxsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24KIFxiZWdpbnt2ZXJiYXRpbX0KQEAgLTI3NzQsOCArMzI2OSw2IEBACiBUaGlzIHdpbGwgdGVzdCBgYGtleScnIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIGBgc3RhdCcnLiAgSWYgdGhlIHJlc3VsdCBpcyAkc3RhdCA9IDAkIHRoZSBEU0Ega2V5IGZhaWxlZCBvbmUgb2YgdGhlIHRlc3RzCiBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGF0IGFsbC4gIElmIHRoZSByZXN1bHQgaXMgJHN0YXQgPSAxJCB0aGUgRFNBIGtleSBpcyB2YWxpZCAoYXMgZmFyIGFzIHZhbGlkIG1hdGhlbWF0aWNzIGFyZSBjb25jZXJuZWQpLgogCi0KLQogXHNlY3Rpb257U2lnbmF0dXJlc30KIFRvIGdlbmVyYXRlIGEgRFNBIHNpZ25hdHVyZSBjYWxsIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24KIApAQCAtMjgyNSw2ICszMzE4LDQyNCBAQAogVGhpcyB3aWxsIGltcG9ydCB0aGUgRFNBIGtleSBmcm9tIHRoZSBidWZmZXIgYGBpbicnIG9mIGxlbmd0aCBgYGlubGVuJycgdG8gdGhlIGBga2V5JycuICBJZiB0aGUgcHJvY2VzcyBmYWlscyB0aGUgZnVuY3Rpb24KIHdpbGwgYXV0b21hdGljYWxseSBmcmVlIGFsbCBvZiB0aGUgaGVhcCBhbGxvY2F0ZWQgaW4gdGhlIHByb2Nlc3MgKHlvdSBkb24ndCBoYXZlIHRvIGNhbGwgZHNhXF9mcmVlKCkpLiAgCiAKK1xjaGFwdGVye1N0YW5kYXJkcyBTdXBwb3J0fQorXHNlY3Rpb257QVNOLjEgRm9ybWF0c30KK0xpYlRvbUNyeXB0IHN1cHBvcnRzIGEgdmFyaWV0eSBvZiBBU04uMSBkYXRhIHR5cGVzIGVuY29kZWQgd2l0aCB0aGUgRGlzdGluZ3Vpc2hlZCBFbmNvZGluZyBSdWxlcyAoREVSKSBzdWl0YWJsZSBmb3IgdmFyaW91cyBjcnlwdG9ncmFwaGljIHByb3RvY29scy4gIFRoZSBkYXRhIHR5cGVzCithcmUgYWxsIHByb3ZpZGVkIHdpdGggdGhyZWUgYmFzaWMgZnVuY3Rpb25zIHdpdGggXHRleHRpdHtzaW1pbGFyfSBwcm90b3R5cGVzLiAgT25lIGZ1bmN0aW9uIGhhcyBiZWVuIGRlZGljYXRlZCB0byBjYWxjdWxhdGUgdGhlIGxlbmd0aCBpbiBvY3RldHMgb2YgYSBnaXZlbgorZm9ybWF0IGFuZCB0d28gZnVuY3Rpb25zIGhhdmUgYmVlbiBkZWRpY2F0ZWQgdG8gZW5jb2RpbmcgYW5kIGRlY29kaW5nIHRoZSBmb3JtYXQuICAKKworT24gdG9wIG9mIHRoZSBiYXNpYyBkYXRhIHR5cGVzIGFyZSB0aGUgU0VRVUVOQ0UgYW5kXGZvb3Rub3Rle1BsYW5uZWQgZm9yIExUQyAxLjA2fSBTRVQgZGF0YSB0eXBlcyB3aGljaCBhcmUgY29sbGVjdGlvbnMgb2Ygb3RoZXIgQVNOLjEgdHlwZXMuICBUaGV5IGFyZSBwcm92aWRlZCAKK2luIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUgb3RoZXIgZGF0YSB0eXBlcyBleGNlcHQgdGhleSB1c2UgbGlzdCBvZiBvYmplY3RzIGtub3duIGFzIHRoZSBcdGV4dGJme2x0Y1xfYXNuMVxfbGlzdH0gc3RydWN0dXJlLiAgSXQgaXMgZGVmaW5lZCBhcyAKKworXGluZGV4e2x0Y1xfYXNuMVxfbGlzdCBzdHJ1Y3R1cmV9CitcYmVnaW57dmVyYmF0aW19Cit0eXBlZGVmIHN0cnVjdCB7CisgICBpbnQgICAgICAgICAgIHR5cGU7CisgICB2b2lkICAgICAgICAgKmRhdGE7CisgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICBpbnQgICAgICAgICAgIHVzZWQ7Cit9IGx0Y19hc24xX2xpc3Q7CitcZW5ke3ZlcmJhdGltfQorCitUaGUgYGB0eXBlJycgZmllbGQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgQVNOLjEgZmllbGQgZGVmaW5pdGlvbnMuICBUaGUgYGBkYXRhJycgcG9pbnRlciBpcyBhIHZvaWQgcG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBlbmNvZGVkIChvciB0aGUgZGVzdGluYXRpb24pIGFuZCB0aGUgCitgYHNpemUnJyBmaWVsZCBpcyBzcGVjaWZpYyB0byB3aGF0IHlvdSBhcmUgZW5jb2RpbmcgKGUuZy4gbnVtYmVyIG9mIGJpdHMgaW4gdGhlIEJJVCBTVFJJTkcgZGF0YSB0eXBlKS4gIFRoZSBgYHVzZWQnJyBmaWVsZCBpcyBwcmltYXJpbHkgZm9yIHRoZSBDSE9JQ0UgZGVjb2RlcgorYW5kIHJlZmxlY3RzIGlmIHRoZSBwYXJ0aWN1bGFyIG1lbWJlciBvZiBhIGxpc3Qgd2FzIHRoZSBkZWNvZGVkIGRhdGEgdHlwZS4gIFRvIGhlbHAgYnVpbGQgdGhlIGxpc3RzIGluIGFuIG9yZGVybHkgZmFzaGlvbiB0aGUgbWFjcm8KK2BgTFRDXF9TRVRcX0FTTjEobGlzdCwgaW5kZXgsIFR5cGUsIERhdGEsIFNpemUpJycgaGFzIGJlZW4gcHJvdmlkZWQuCisKK0l0IHdpbGwgYXNzaWduIHRvIHRoZSBgYGluZGV4Jyd0aCBwb3NpdGlvbiBpbiB0aGUgYGBsaXN0JycgdGhlIHRyaXBwbGV0IChUeXBlLCBEYXRhLCBTaXplKS4gIEFuIGV4YW1wbGUgdXNhZ2Ugd291bGQgYmU6CisKK1xiZWdpbntzbWFsbH0KK1xiZWdpbnt2ZXJiYXRpbX0KKy4uLgorbHRjX2FzbjFfbGlzdCAgIHNlcXVlbmNlWzNdOwordW5zaWduZWQgbG9uZyAgIHRocmVlPTM7CisKK0xUQ19TRVRfQVNOMShzZXF1ZW5jZSwgMCwgTFRDX0FTTjFfSUE1X1NUUklORywgICAgImhlbGxvIiwgNSk7CitMVENfU0VUX0FTTjEoc2VxdWVuY2UsIDEsIExUQ19BU04xX1NIT1JUX0lOVEVHRVIsICZ0aHJlZSwgIDEpOworTFRDX1NFVF9BU04xKHNlcXVlbmNlLCAyLCBMVENfQVNOMV9OVUxMLCAgICAgICAgICAgTlVMTCwgICAwKTsKK1xlbmR7dmVyYmF0aW19CitcZW5ke3NtYWxsfQorCitUaGUgbWFjcm8gaXMgcmVsYXRpdmVseSBzYWZlIHdpdGggcmVzcGVjdCB0byBtb2RpZnlpbmcgdmFyaWFibGVzLCBmb3IgaW5zdGFuY2UgdGhlIGZvbGxvd2luZyBjb2RlIGlzIGVxdWl2YWxlbnQuCisKK1xiZWdpbntzbWFsbH0KK1xiZWdpbnt2ZXJiYXRpbX0KKy4uLgorbHRjX2FzbjFfbGlzdCAgIHNlcXVlbmNlWzNdOwordW5zaWduZWQgbG9uZyAgIHRocmVlPTM7CitpbnQgICAgICAgICAgICAgeD0wOworTFRDX1NFVF9BU04xKHNlcXVlbmNlLCB4KyssIExUQ19BU04xX0lBNV9TVFJJTkcsICAgICJoZWxsbyIsIDUpOworTFRDX1NFVF9BU04xKHNlcXVlbmNlLCB4KyssIExUQ19BU04xX1NIT1JUX0lOVEVHRVIsICZ0aHJlZSwgIDEpOworTFRDX1NFVF9BU04xKHNlcXVlbmNlLCB4KyssIExUQ19BU04xX05VTEwsICAgICAgICAgICBOVUxMLCAgIDApOworXGVuZHt2ZXJiYXRpbX0KK1xlbmR7c21hbGx9CisKK1xiZWdpbntmaWd1cmV9W2hlcmVdCitcYmVnaW57Y2VudGVyfQorXGJlZ2lue3NtYWxsfQorXGJlZ2lue3RhYnVsYXJ9e3xsfGx8fQorXGhsaW5lIFx0ZXh0YmZ7RGVmaW5pdGlvbn0gICAgICAgICAgICYgXHRleHRiZntBU04uMSBUeXBlfSBcXAorXGhsaW5lIExUQ1xfQVNOMVxfRU9MICAgICAgICAgICAgICAgICYgRW5kIG9mIGEgQVNOLjEgbGlzdCBzdHJ1Y3R1cmUuIFxcCitcaGxpbmUgTFRDXF9BU04xXF9JTlRFR0VSICAgICAgICAgICAgJiBJTlRFR0VSICh1c2VzIG1wXF9pbnQpIFxcCitcaGxpbmUgTFRDXF9BU04xXF9TSE9SVFxfSU5URUdFUiAgICAgJiBJTlRFR0VSICgzMi0tYml0IHVzaW5nIHVuc2lnbmVkIGxvbmcpIFxcCitcaGxpbmUgTFRDXF9BU04xXF9CSVRcX1NUUklORyAgICAgICAgJiBCSVQgU1RSSU5HIChvbmUgYml0IHBlciBjaGFyKSBcXAorXGhsaW5lIExUQ1xfQVNOMVxfT0NURVRcX1NUUklORyAgICAgICYgT0NURVQgU1RSSU5HIChvbmUgb2N0ZXQgcGVyIGNoYXIpIFxcCitcaGxpbmUgTFRDXF9BU04xXF9OVUxMICAgICAgICAgICAgICAgJiBOVUxMIFxcCitcaGxpbmUgTFRDXF9BU04xXF9PQkpFQ1RcX0lERU5USUZJRVIgJiBPQkpFQ1QgSURFTlRJRklFUiAod29yZHMgYXJlIGluIHVuc2lnbmVkIGxvbmcpIFxcCitcaGxpbmUgTFRDXF9BU04xXF9JQTVcX1NUUklORyAgICAgICAgJiBJQTUgU1RSSU5HIChvbmUgb2N0ZXQgcGVyIGNoYXIpIFxcCitcaGxpbmUgTFRDXF9BU04xXF9QUklOVEFCTEVcX1NUUklORyAgJiBQUklOVEFCTEUgU1RJUk5HIChvbmUgb2N0ZXQgcGVyIGNoYXIpIFxcCitcaGxpbmUgTFRDXF9BU04xXF9VVENUSU1FICAgICAgICAgICAgJiBVVENUSU1FIChzZWUgbHRjXF91dGN0aW1lIHN0cnVjdHVyZSkgXFwKK1xobGluZSBMVENcX0FTTjFcX1NFUVVFTkNFICAgICAgICAgICAmIFNFUVVFTkNFIE9GIFxcCitcaGxpbmUgTFRDXF9BU04xXF9DSE9JQ0UgICAgICAgICAgICAgJiBDSE9JQ0UgXFwKK1xobGluZQorXGVuZHt0YWJ1bGFyfQorXGNhcHRpb257TGlzdCBvZiBBU04uMSBTdXBwb3J0ZWQgVHlwZXN9CitcZW5ke3NtYWxsfQorXGVuZHtjZW50ZXJ9CitcZW5ke2ZpZ3VyZX0KKworXHN1YnNlY3Rpb257U0VRVUVOQ0UgVHlwZX0KK1RoZSBTRVFVRU5DRSBkYXRhIHR5cGUgaXMgYSBjb2xsZWN0aW9uIG9mIG90aGVyIEFTTi4xIGRhdGEgdHlwZXMgZW5jYXBzdWxhdGVkIHdpdGggYSBzbWFsbCBoZWFkZXIgd2hpY2ggaXMgYSB1c2VmdWwgd2F5IG9mIHNlbmRpbmcgbXVsdGlwbGUgZGF0YSB0eXBlcyBpbiBvbmUgcGFja2V0LgorCitcc3Vic3Vic2VjdGlvbntTRVVRTkVDRSBFbmNvZGluZ30KK1RvIGVuY29kZSBhIHNlcXVlbmNlIGEgXHRleHRiZntsdGNcX2FzbjFcX2xpc3R9IGFycmF5IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgbWVtYmVycyBvZiB0aGUgc2VxdWVuY2UgYW5kIHRoZWlyIHJlc3BlY3RpdmUgcG9pbnRlcnMuICBUaGUgZW5jb2RpbmcgaXMgcGVyZm9ybWVkCit3aXRoIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24uCisKK1xpbmRleHtkZXJcX2VuY29kZVxfc2VxdWVuY2UoKX0KK1xiZWdpbnt2ZXJiYXRpbX0KK2ludCBkZXJfZW5jb2RlX3NlcXVlbmNlKGx0Y19hc24xX2xpc3QgKmxpc3QsIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworXGVuZHt2ZXJiYXRpbX0KK1RoaXMgZW5jb2RlcyBhIHNlcXVlbmNlIG9mIGl0ZW1zIHBvaW50ZWQgdG8gYnkgYGBsaXN0Jycgd2hlcmUgdGhlIGxpc3QgaGFzIGBgaW5sZW4nJyBpdGVtcyBpbiBpdC4gIFRoZSBTRVFVRU5DRSB3aWxsIGJlIGVuY29kZWQgdG8gYGBvdXQnJyBhbmQgb2YgbGVuZ3RoIGBgb3V0bGVuJycuICBUaGUKK2Z1bmN0aW9uIHdpbGwgdGVybWluYXRlIHdoZW4gaXQgcmVhZHMgYWxsIHRoZSBpdGVtcyBvdXQgb2YgdGhlIGxpc3QgKHVwdG8gYGBpbmxlbicnKSBvciBpdCBlbmNvdW50ZXJzIGFuIGl0ZW0gaW4gdGhlIGxpc3Qgd2l0aCBhIHR5cGUgb2YgXHRleHRiZntMVENcX0FTTjFcX0VPTH0uCisKK1RoZSBgYGRhdGEnJyBwb2ludGVyIGluIHRoZSBsaXN0IHdvdWxkIGJlIHRoZSBzYW1lIHBvaW50ZXIgeW91IHdvdWxkIHBhc3MgdG8gdGhlIHJlc3BlY3RpdmUgQVNOLjEgZW5jb2RlciAoZS5nLiBkZXJcX2VuY29kZVxfYml0XF9zdHJpbmcoKSkgYW5kIGl0IGlzIHNpbXBseSBwYXNzZWQgb24KK3ZlcmJhdGltIHRvIHRoZSBkZXBlbmRlbnQgZW5jb2Rlci4gIFRoZSBsaXN0IGNhbiBjb250YWluIG90aGVyIFNFUVVFTkNFIG9yIFNFVCB0eXBlcyB3aGljaCBlbmFibGVzIHlvdSB0byBoYXZlIG5lc3RlZCBTRVFVRU5DRSBhbmQgU0VUIGRlZmluaXRpb25zLiAgSW4gdGhlc2UgY2FzZXMKK3RoZSBgYGRhdGEnJyBwb2ludGVyIGlzIHNpbXBseSBhIHBvaW50ZXIgdG8gYW5vdGhlciBcdGV4dGJme2x0Y1xfYXNuMVxfbGlzdH0uCisKK1xzdWJzdWJzZWN0aW9ue1NFUVVFTkNFIERlY29kaW5nfQorCitcaW5kZXh7ZGVyXF9kZWNvZGVcX3NlcXVlbmNlKCl9CisKK0RlY29kaW5nIGEgU0VRVUVOQ0UgaXMgc2ltaWxhciB0byBlbmNvZGluZy4gIFlvdSBzZXQgdXAgYW4gYXJyYXkgb2YgXHRleHRiZntsdGNcX2FzbjFcX2xpc3R9IHdoZXJlIGluIHRoaXMgY2FzZSB0aGUgYGBzaXplJycgbWVtYmVyIGlzIHRoZSBtYXhpbXVtIHNpemUgCisoaW4gY2VydGFpbiBjYXNlcykuICBGb3IgdHlwZXMgc3VjaCBhcyBJQTUgU1RSSU5HLCBCSVQgU1RSSU5HLCBPQ1RFVCBTVFJJTkcgKGV0YykgdGhlIGBgc2l6ZScnIGZpZWxkIGlzIHVwZGF0ZWQgYWZ0ZXIgc3VjY2Vzc2Z1bCBkZWNvZGluZyB0byByZWZsZWN0IGhvdyBtYW55Cit1bml0cyBvZiB0aGUgcmVzcGVjdGl2ZSB0eXBlIGhhcyBiZWVuIGxvYWRlZC4gIAorCitcYmVnaW57dmVyYmF0aW19CitpbnQgZGVyX2RlY29kZV9zZXF1ZW5jZShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICB1bnNpZ25lZCBsb25nICBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0Y19hc24xX2xpc3QgKmxpc3QsIHVuc2lnbmVkIGxvbmcgIG91dGxlbik7CitcZW5ke3ZlcmJhdGltfQorCitUaGlzIHdpbGwgZGVjb2RlIHVwdG8gYGBvdXRsZW4nJyBpdGVtcyBmcm9tIHRoZSBpbnB1dCBidWZmZXIgYGBpbicnIG9mIGxlbmd0aCBgYGlubGVuJycgb2N0ZXRzLiAgVGhlIGZ1bmN0aW9uIHdpbGwgc3RvcCAoZ3JhY2VmdWxseSkgd2hlbiBpdCBydW5zIG91dCBvZiBpdGVtcyB0byBkZWNvZGUuCitJdCB3aWxsIGZhaWwgKGZvciBhbW9uZyBvdGhlciByZWFzb25zKSB3aGVuIGl0IHJ1bnMgb3V0IG9mIGlucHV0IGJ5dGVzIHRvIHJlYWQsIGEgZGF0YSB0eXBlIGlzIGludmFsaWQgb3IgYSBoZWFwIGZhaWx1cmUgb2NjdXJlZC4KKworRm9yIHRoZSBmb2xsb3dpbmcgdHlwZXMgdGhlIGBgc2l6ZScnIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBudW1iZXIgb2YgdW5pdHMgcmVhZCBvZiB0aGUgZ2l2ZW4gdHlwZS4KK1xiZWdpbntlbnVtZXJhdGV9CisgICBcaXRlbSBCSVQgU1RSSU5HCisgICBcaXRlbSBPQ1RFVCBTVFJJTkcKKyAgIFxpdGVtIE9CSkVDVCBJREVOVElGSUVSCisgICBcaXRlbSBJQTUgU1RSSU5HCisgICBcaXRlbSBQUklOVEFCTEUgU1RSSU5HCitcZW5ke2VudW1lcmF0ZX0KKworXHN1YnN1YnNlY3Rpb257U0VRVUVOQ0UgTGVuZ3RofQorCitUaGUgbGVuZ3RoIG9mIGEgU0VRVUVOQ0UgY2FuIGJlIGRldGVybWluZWQgd2l0aCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uLgorCitcaW5kZXh7ZGVyXF9sZW5ndGhcX3NlcXVlbmNlKCl9CitcYmVnaW57dmVyYmF0aW19CitpbnQgZGVyX2xlbmd0aF9zZXF1ZW5jZShsdGNfYXNuMV9saXN0ICpsaXN0LCB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK1xlbmR7dmVyYmF0aW19CisKK1RoaXMgd2lsbCBnZXQgdGhlIGVuY29kaW5nIHNpemUgZm9yIHRoZSBnaXZlbiBgYGxpc3QnJyBvZiBsZW5ndGggYGBpbmxlbicnIGFuZCBzdG9yZSBpdCBpbiBgYG91dGxlbicnLiAgCisKK1xzdWJzdWJzZWN0aW9ue1NFUVVFTkNFIE11bHRpcGxlIEFyZ3VtZW50IExpc3RzfQorCitGb3Igc21hbGwgb3Igc2ltcGxlIHNlcXVlbmNlcyBhbiBlbmNvZGluZyBvciBkZWNvZGluZyBjYW4gYmUgcGVyZm9ybWVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucy4KKworXGluZGV4e2RlclxfZW5jb2RlXF9zZXF1ZW5jZVxfbXVsdGkoKX0KK1xpbmRleHtkZXJcX2RlY29kZVxfc2VxdWVuY2VcX211bHRpKCl9CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ludCBkZXJfZW5jb2RlX3NlcXVlbmNlX211bHRpKHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCAuLi4pOworaW50IGRlcl9kZWNvZGVfc2VxdWVuY2VfbXVsdGkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIC4uLik7CitcZW5ke3ZlcmJhdGltfQorCitUaGVzZSBlaXRoZXIgZW5jb2RlIG9yIGRlY29kZSAocmVzcGVjdGl2ZWx5KSBhIFNFUVVFTkNFIGRhdGEgdHlwZSB3aGVyZSB0aGUgaXRlbXMgaW4gdGhlIHNlcXVlbmNlIGFyZSBzcGVjaWZpZWQgYWZ0ZXIgdGhlIGxlbmd0aCBwYXJhbWV0ZXIuCisKK1RoZSBsaXN0IG9mIGl0ZW1zIGFyZSBzcGVjaWZpZWQgYXMgYSB0cmlwbGUgb2YgdGhlIGZvcm0gYGAodHlwZSwgc2l6ZSwgZGF0YSknJyAgd2hlcmUgYGB0eXBlJycgaXMgYW4gXHRleHRiZntpbnR9LCBgYHNpemUnJyBpcyBhIFx0ZXh0YmZ7dW5zaWduZWQgbG9uZ30KK2FuZCBgYGRhdGEnJyBpcyBcdGV4dGJme3ZvaWR9IHBvaW50ZXIuICBUaGUgbGlzdCBvZiBpdGVtcyBtdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhbiBpdGVtIHdpdGggdGhlIHR5cGUgXHRleHRiZntMVENcX0FTTjFcX0VPTH0uCisKK0l0J3MgaWRlYWwgdGhhdCB5b3UgY2FzdCB0aGUgYGBzaXplJycgdmFsdWVzIHRvIHVuc2lnbmVkIGxvbmcgdG8gZW5zdXJlIHRoYXQgdGhlIHByb3BlciBkYXRhIHR5cGUgaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4gIENvbnN0YW50cyBzdWNoIGFzIGBgMScnIHdpdGhvdXQKK2EgY2FzdCBvciBwcm90b3R5cGUgYXJlIG9mIHR5cGUgXHRleHRiZntpbnR9IGJ5IGRlZmF1bHQuICBBcHBlbmRpbmcgXHRleHRpdHtVTH0gb3IgcHJlcGVuZGluZyBcdGV4dGl0eyh1bnNpZ25lZCBsb25nKX0gaXMgZW5vdWdoIHRvIGNhc3QgaXQgdG8gdGhlIGNvcnJlY3QgdHlwZS4KKworXHN1YnNlY3Rpb257QVNOLjEgSU5URUdFUn0KKworVG8gZW5jb2RlIG9yIGRlY29kZSBJTlRFR0VSIGRhdGEgdHlwZXMgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zLgorCitcaW5kZXh7ZGVyXF9lbmNvZGVcX2ludGVnZXIoKX0KK1xpbmRleHtkZXJcX2RlY29kZVxfaW50ZWdlcigpfQorXGluZGV4e2RlclxfbGVuZ3RoXF9pbnRlZ2VyKCl9CitcYmVnaW57dmVyYmF0aW19CitpbnQgZGVyX2VuY29kZV9pbnRlZ2VyKG1wX2ludCAqbnVtLCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitpbnQgZGVyX2RlY29kZV9pbnRlZ2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBtcF9pbnQgKm51bSk7CitpbnQgZGVyX2xlbmd0aF9pbnRlZ2VyKG1wX2ludCAqbnVtLCB1bnNpZ25lZCBsb25nICpsZW4pOworXGVuZHt2ZXJiYXRpbX0KKworVGhlc2Ugd2lsbCBlbmNvZGUgb3IgZGVjb2RlIGEgc2lnbmVkIElOVEVHRVIgZGF0YSB0eXBlIHVzaW5nIHRoZSBgYG1wXF9pbnQnJyBkYXRhIHR5cGUgdG8gc3RvcmUgdGhlIGxhcmdlIElOVEVHRVIuICBUbyBlbmNvZGUgc21hbGxlciB2YWx1ZXMgd2l0aG91dCBhbGxvY2F0aW5nCithbiBtcFxfaW50IHRvIHN0b3JlIHRoZSB2YWx1ZSB0aGUgYGBzaG9ydCcnIElOVEVHRVIgZnVuY3Rpb25zIHdlcmUgbWFkZSBhdmFpbGFibGUuCisKK1xpbmRleHtkZXJcX2VuY29kZVxfc2hvcnRcX2ludGVnZXIoKX0KK1xpbmRleHtkZXJcX2RlY29kZVxfc2hvcnRcX2ludGVnZXIoKX0KK1xpbmRleHtkZXJcX2xlbmd0aFxfc2hvcnRcX2ludGVnZXIoKX0KK1xiZWdpbnt2ZXJiYXRpbX0KK2ludCBkZXJfZW5jb2RlX3Nob3J0X2ludGVnZXIodW5zaWduZWQgbG9uZyAgbnVtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZGVyX2RlY29kZV9zaG9ydF9pbnRlZ2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKm51bSk7CisKK2ludCBkZXJfbGVuZ3RoX3Nob3J0X2ludGVnZXIodW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitcZW5ke3ZlcmJhdGltfQorCitUaGVzZSB3aWxsIGVuY29kZSBvciBkZWNvZGUgYW4gdW5zaWduZWQgXHRleHRiZnt1bnNpZ25lZCBsb25nfSB0eXBlIChvbmx5IHJlYWRzIHVwdG8gMzItLWJpdHMpLiAgRm9yIHZhbHVlcyBpbiB0aGUgcmFuZ2UgJDAgXGRvdHMgMl57MzJ9IC0gMSQgdGhlIGludGVnZXIgCithbmQgc2hvcnQgaW50ZWdlciBmdW5jdGlvbnMgY2FuIGVuY29kZSBhbmQgZGVjb2RlIGVhY2ggb3RoZXJzIG91dHB1dHMuICAKKworXHN1YnNlY3Rpb257QVNOLjEgQklUIFNUUklOR30KKworXGluZGV4e2RlclxfZW5jb2RlXF9iaXRcX3N0cmluZygpfQorXGluZGV4e2RlclxfZGVjb2RlXF9iaXRcX3N0cmluZygpfQorXGluZGV4e2RlclxfbGVuZ3RoXF9iaXRcX3N0cmluZygpfQorXGJlZ2lue3ZlcmJhdGltfQoraW50IGRlcl9lbmNvZGVfYml0X3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZGVyX2RlY29kZV9iaXRfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CisKK2ludCBkZXJfbGVuZ3RoX2JpdF9zdHJpbmcodW5zaWduZWQgbG9uZyBuYml0cywgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK1xlbmR7dmVyYmF0aW19CisKK1RoZXNlIHdpbGwgZW5jb2RlIG9yIGRlY29kZSBhIEJJVCBTVFJJTkcgZGF0YSB0eXBlLiAgVGhlIGJpdHMgYXJlIHBhc3NlZCBpbiAob3IgcmVhZCBvdXQpIHVzaW5nIG9uZSBcdGV4dGJme2NoYXJ9IHBlciBiaXQuICBBIG5vbi0temVybyB2YWx1ZSB3aWxsIGJlIGludGVycHJldHRlZAorYXMgYSBvbmUgYml0IGFuZCBhIHplcm8gdmFsdWUgYSB6ZXJvIGJpdC4KKworXHN1YnNlY3Rpb257QVNOLjEgT0NURVQgU1RSSU5HfQorCitcaW5kZXh7ZGVyXF9lbmNvZGVcX29jdGV0XF9zdHJpbmcoKX0KK1xpbmRleHtkZXJcX2RlY29kZVxfb2N0ZXRcX3N0cmluZygpfQorXGluZGV4e2RlclxfbGVuZ3RoXF9vY3RldFxfc3RyaW5nKCl9CitcYmVnaW57dmVyYmF0aW19CitpbnQgZGVyX2VuY29kZV9vY3RldF9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZGVyX2RlY29kZV9vY3RldF9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZGVyX2xlbmd0aF9vY3RldF9zdHJpbmcodW5zaWduZWQgbG9uZyBub2N0ZXRzLCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworXGVuZHt2ZXJiYXRpbX0KKworVGhlc2Ugd2lsbCBlbmNvZGUgb3IgZGVjb2RlIGFuIE9DVEVUIFNUUklORyBkYXRhIHR5cGUuICBUaGUgb2N0ZXRzIGFyZSBzdG9yZWQgdXNpbmcgb25lIFx0ZXh0YmZ7Y2hhcn0gZWFjaC4gIAorCitcc3Vic2VjdGlvbntBU04uMSBPQkpFQ1QgSURFTlRJRklFUn0KKworXGluZGV4e2RlclxfZW5jb2RlXF9vYmplY3RcX2lkZW50aWZpZXIoKX0KK1xpbmRleHtkZXJcX2RlY29kZVxfb2JqZWN0XF9pZGVudGlmaWVyKCl9CitcaW5kZXh7ZGVyXF9sZW5ndGhcX29iamVjdFxfaWRlbnRpZmllcigpfQorXGJlZ2lue3ZlcmJhdGltfQoraW50IGRlcl9lbmNvZGVfb2JqZWN0X2lkZW50aWZpZXIodW5zaWduZWQgbG9uZyAqd29yZHMsIHVuc2lnbmVkIGxvbmcgIG53b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZGVyX2RlY29kZV9vYmplY3RfaWRlbnRpZmllcihjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICAgdW5zaWduZWQgbG9uZyAgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICp3b3JkcywgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKKworaW50IGRlcl9sZW5ndGhfb2JqZWN0X2lkZW50aWZpZXIodW5zaWduZWQgbG9uZyAqd29yZHMsIHVuc2lnbmVkIGxvbmcgbndvcmRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitcZW5ke3ZlcmJhdGltfQorCitUaGVzZSB3aWxsIGVuY29kZSBvciBkZWNvZGUgYW4gT0JKRUNUIElERU5USUZJRVIgb2JqZWN0LiAgVGhlIHdvcmRzIG9mIHRoZSBPSUQgYXJlIHN0b3JlZCBpbiBpbmRpdmlkdWFsIFx0ZXh0YmZ7dW5zaWduZWQgbG9uZ30gZWxlbWVudHMgYW5kIG11c3QgYmUgaW4gdGhlIHJhbmdlCiskMCBcbGRvdHMgMl57MzJ9IC0gMSQuICAKKworXHN1YnNlY3Rpb257QVNOLjEgSUE1IFNUUklOR30KKworXGluZGV4e2RlclxfZW5jb2RlXF9pYTVcX3N0cmluZygpfQorXGluZGV4e2RlclxfZGVjb2RlXF9pYTVcX3N0cmluZygpfQorXGluZGV4e2RlclxfbGVuZ3RoXF9pYTVcX3N0cmluZygpfQorXGJlZ2lue3ZlcmJhdGltfQoraW50IGRlcl9lbmNvZGVfaWE1X3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZGVyX2RlY29kZV9pYTVfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CisKK2ludCBkZXJfbGVuZ3RoX2lhNV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqb2N0ZXRzLCB1bnNpZ25lZCBsb25nIG5vY3RldHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworXGVuZHt2ZXJiYXRpbX0KKworVGhlc2Ugd2lsbCBlbmNvZGUgb3IgZGVjb2RlIGFuIElBNSBTVFJJTkcuICBUaGUgY2hhcmFjdGVycyBhcmUgcmVhZCBvciBzdG9yZWQgaW4gaW5kaXZpZHVhbCBcdGV4dGJme2NoYXJ9IGVsZW1lbnRzLiAgVGhpcyBmdW5jdGlvbnMgcGVyZm9ybXMgaW50ZXJuYWwgY2hhcmFjdGVyCit0byBudW1lcmljYWwgY29udmVyc2lvbnMgYmFzZWQgb24gdGhlIGNvbnZlbnRpb25zIG9mIHRoZSBjb21waWxlciBiZWluZyB1c2VkLiAgRm9yIGluc3RhbmNlLCBvbiBhbiB4ODZcXzMyIG1hY2hpbmUgJ0EnID09IDY1IGJ1dCB0aGUgc2FtZSBtYXkgbm90IGJlIHRydWUgb24gCitzYXkgYSBTUEFSQyBtYWNoaW5lLiAgSW50ZXJuYWxseSB0aGVzZSBmdW5jdGlvbnMgaGF2ZSBhIHRhYmxlIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgdGhlaXIgbnVtZXJpY2FsIEFTQ0lJIHZhbHVlcy4gIFRoaXMgcHJvdmlkZXMgYSBzdGFibGUgY29udmVyc2lvbiBwcm92aWRlZAordGhhdCB0aGUgYnVpbGQgcGxhdGZvcm0gaG9ub3VycyB0aGUgcnVudGltZSBwbGF0Zm9ybXMgY2hhcmFjdGVyIGNvbnZlbnRpb25zLgorCitJZiB5b3UncmUgd29ycmllZCB0cnkgYnVpbGRpbmcgdGhlIHRlc3Qgc3VpdGUgYW5kIHJ1bm5pbmcgaXQuICBJdCBoYXMgaGFyZCBjb2RlZCB0ZXN0IHZlY3RvcnMgdG8gZW5zdXJlIGl0IGlzIG9wZXJhdGluZyBwcm9wZXJseS4gCisKK1xzdWJzZWN0aW9ue0FTTi4xIFBSSU5UQUJMRSBTVFJJTkd9CisKK1xpbmRleHtkZXJcX2VuY29kZVxfcHJpbnRhYmxlXF9zdHJpbmcoKX0KK1xpbmRleHtkZXJcX2RlY29kZVxfcHJpbnRhYmxlXF9zdHJpbmcoKX0KK1xpbmRleHtkZXJcX2xlbmd0aFxfcHJpbnRhYmxlXF9zdHJpbmcoKX0KK1xiZWdpbnt2ZXJiYXRpbX0KK2ludCBkZXJfZW5jb2RlX3ByaW50YWJsZV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKKworaW50IGRlcl9kZWNvZGVfcHJpbnRhYmxlX3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZGVyX2xlbmd0aF9wcmludGFibGVfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9jdGV0cywgdW5zaWduZWQgbG9uZyBub2N0ZXRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK1xlbmR7dmVyYmF0aW19CisKK1RoZXNlIHdpbGwgZW5jb2RlIG9yIGRlY29kZSBhbiBQUklOVEFCTEUgU1RSSU5HLiAgVGhlIGNoYXJhY3RlcnMgYXJlIHJlYWQgb3Igc3RvcmVkIGluIGluZGl2aWR1YWwgXHRleHRiZntjaGFyfSBlbGVtZW50cy4gIFRoaXMgZnVuY3Rpb25zIHBlcmZvcm1zIGludGVybmFsIGNoYXJhY3RlcgordG8gbnVtZXJpY2FsIGNvbnZlcnNpb25zIGJhc2VkIG9uIHRoZSBjb252ZW50aW9ucyBvZiB0aGUgY29tcGlsZXIgYmVpbmcgdXNlZC4gIEZvciBpbnN0YW5jZSwgb24gYW4geDg2XF8zMiBtYWNoaW5lICdBJyA9PSA2NSBidXQgdGhlIHNhbWUgbWF5IG5vdCBiZSB0cnVlIG9uIAorc2F5IGEgU1BBUkMgbWFjaGluZS4gIEludGVybmFsbHkgdGhlc2UgZnVuY3Rpb25zIGhhdmUgYSB0YWJsZSBvZiBsaXRlcmFsIGNoYXJhY3RlcnMgYW5kIHRoZWlyIG51bWVyaWNhbCBBU0NJSSB2YWx1ZXMuICBUaGlzIHByb3ZpZGVzIGEgc3RhYmxlIGNvbnZlcnNpb24gcHJvdmlkZWQKK3RoYXQgdGhlIGJ1aWxkIHBsYXRmb3JtIGhvbm91cnMgdGhlIHJ1bnRpbWUgcGxhdGZvcm1zIGNoYXJhY3RlciBjb252ZW50aW9ucy4KKworSWYgeW91J3JlIHdvcnJpZWQgdHJ5IGJ1aWxkaW5nIHRoZSB0ZXN0IHN1aXRlIGFuZCBydW5uaW5nIGl0LiAgSXQgaGFzIGhhcmQgY29kZWQgdGVzdCB2ZWN0b3JzIHRvIGVuc3VyZSBpdCBpcyBvcGVyYXRpbmcgcHJvcGVybHkuIAorCitcc3Vic2VjdGlvbntBU04uMSBVVENUSU1FfQorCitUaGUgVVRDVElNRSB0eXBlIGlzIHRvIHN0b3JlIGEgZGF0ZSBhbmQgdGltZSBpbiBBU04uMSBmb3JtYXQuICBJdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIHRvIG9yZ2FuaXplIHRoZSB0aW1lLgorCitcYmVnaW57dmVyYmF0aW19Cit0eXBlZGVmIHN0cnVjdCB7CisgICB1bnNpZ25lZCBZWSwgLyogeWVhciAgICAwMC0tOTkgKi8KKyAgICAgICAgICAgIE1NLCAvKiBtb250aCAgIDAxLS0xMiAqLworICAgICAgICAgICAgREQsIC8qIGRheSAgICAgMDEtLTMxICovCisgICAgICAgICAgICBoaCwgLyogaG91ciAgICAwMC0tMjMgKi8KKyAgICAgICAgICAgIG1tLCAvKiBtaW51dGUgIDAwLS01OSAqLworICAgICAgICAgICAgc3MsIC8qIHNlY29uZCAgMDAtLTU5ICovCisgICAgICAgICAgICBvZmZfZGlyLCAvKiB0aW1lem9uZSBvZmZzZXQgZGlyZWN0aW9uIDAgPT0gKywgMSA9PSAtICovCisgICAgICAgICAgICBvZmZfaGgsIC8qIHRpbWV6b25lIG9mZnNldCBob3VycyAqLworICAgICAgICAgICAgb2ZmX21tOyAvKiB0aW1lem9uZSBvZmZzZXQgbWludXRlcyAqLworfSBsdGNfdXRjdGltZTsKK1xlbmR7dmVyYmF0aW19CisKK1RoZSB0aW1lIGNhbiBiZSBvZmZzZXQgcGx1cyBvciBtaW51cyBhIHNldCBhbW91bnQgb2YgaG91cnMgKG9mZlxfaGgpIGFuZCBtaW51dGVzIChvZmZcX21tKS4gIFdoZW4gYGBvZmZcX2RpcicnIGlzIHplcm8gdGhlIHRpbWUgd2lsbCBiZSBhZGRlZCBvdGhlcndpc2UgaXQgCit3aWxsIGJlIHN1YnRyYWN0ZWQuICAKKworRm9yIGluc3RhbmNlLCB0aGUgYXJyYXkgJFxsYnJhY2UgNSwgNiwgMjAsIDIyLCA0LCAwMCwgMCwgNSwgMCBccmJyYWNlJCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHRpbWUgb2YgMjAwNSwgSnVuZSAyMHRoLCAyMjowNDowMCB3aXRoIGEgdGltZSBvZmZzZXQgb2YgKzA1aDAwLiAgCisKK1xpbmRleHtkZXJcX2VuY29kZVxfdXRjdGltZSgpfQorXGluZGV4e2RlclxfZGVjb2RlXF91dGN0aW1lKCl9CitcaW5kZXh7ZGVyXF9sZW5ndGhcX3V0Y3RpbWUoKX0KK1xiZWdpbnt2ZXJiYXRpbX0KK2ludCBkZXJfZW5jb2RlX3V0Y3RpbWUobHRjX3V0Y3RpbWUgKnV0Y3RpbWUsIAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKKworaW50IGRlcl9kZWNvZGVfdXRjdGltZShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyAqaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0Y191dGN0aW1lICAgKm91dCk7CisKK2ludCBkZXJfbGVuZ3RoX3V0Y3RpbWUobHRjX3V0Y3RpbWUgKnV0Y3RpbWUsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitcZW5ke3ZlcmJhdGltfQorCitUaGUgZW5jb2RlciB3aWxsIHN0b3JlIHRpbWUgaW4gb25lIG9mIHRoZSB0d28gQVNOLjEgZm9ybWF0cywgZWl0aGVyIGBgWVlNTUREaGhtbXNzWicnIG9yIGBgWVlNTUREaGhtbXNzJFxwbSRoaG1tJycgYW5kIHBlcmZvcm0gbWluaW1hbCBlcnJvciBjaGVja2luZyBvbiB0aGUgCitpbnB1dC4gIFRoZSBkZWNvZGVyIHdpbGwgcmVhZCBhbGwgdmFsaWQgQVNOLjEgZm9ybWF0cyBhbmQgcGVyZm9ybSByYW5nZSBjaGVja2luZyBvbiB0aGUgdmFsdWVzIChub3QgY29tcGxldGUgYnV0IHJhdGlvbmFsKSB1c2VmdWwgZm9yIGNhdGNoaW5nIHBhY2tldCBlcnJvcnMuCisKK0l0IGlzIHN1Z2dlc3RlZCB0aGF0IGRlY29kZWQgZGF0YSBiZSBmdXJ0aGVyIHNjcnV0aW5pemVkIChlLmcuIGRheXMgb2YgbW9udGggaW4gcGFydGljdWxhcikuCisKK1xzdWJzZWN0aW9ue0FTTi4xIENIT0lDRX0KKworVGhlIENIT0lDRSBBU04uMSB0eXBlIHJlcHJlc2VudHMgYSB1bmlvbiBvZiBBU04uMSB0eXBlcyBhbGwgb2Ygd2hpY2ggYXJlIHN0b3JlZCBpbiBhIGBgbHRjXF9hc24xXF9saXN0JycuICBUaGVyZSBpcyBubyBlbmNvZGVyIGZvciB0aGUgQ0hPSUNFIHR5cGUsIG9ubHkgYSAKK2RlY29kZXIuICBUaGUgZGVjb2RlciB3aWxsIHNjYW4gdGhyb3VnaCB0aGUgcHJvdmlkZWQgbGlzdCBhdHRlbXB0aW5nIHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUgZGVjb2RlciBvbiB0aGUgaW5wdXQgcGFja2V0LiAgVGhlIGxpc3QgY2FuIGNvbnRhaW4gYW55IEFTTi4xIGRhdGEKK3R5cGVcZm9vdG5vdGV7RXhjZXB0IGl0IGNhbm5vdCBoYXZlIExUQ1xfQVNOMVxfSU5URUdFUiBhbmQgTFRDXF9BU04xXF9TSE9SVFxfSU5URUdFUiBzaW11bHRhbmVvdXNseS59IGV4Y2VwdCBmb3Igb3RoZXIgQ0hPSUNFIHR5cGVzLiAgCisKK1RoZXJlIGlzIG5vIGVuY29kZXIgZm9yIHRoZSBDSE9JQ0UgdHlwZSBhcyB0aGUgYWN0dWFsIERFUiBlbmNvZGluZyBpcyB0aGUgZW5jb2Rpbmcgb2YgdGhlIGNob3NlbiB0eXBlLiAgCisKK1xpbmRleHtkZXJcX2RlY29kZVxfY2hvaWNlKCl9CitcYmVnaW57dmVyYmF0aW19CitpbnQgZGVyX2RlY29kZV9jaG9pY2UoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgdW5zaWduZWQgbG9uZyAqaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHRjX2FzbjFfbGlzdCAqbGlzdCwgdW5zaWduZWQgbG9uZyAgb3V0bGVuKTsKK1xlbmR7dmVyYmF0aW19CisKK1RoaXMgd2lsbCBkZWNvZGUgdGhlIGlucHV0IGluIHRoZSBgYGluJycgZmllbGQgb2YgbGVuZ3RoIGBgaW5sZW4nJy4gIEl0IHVzZXMgdGhlIHByb3ZpZGVkIEFTTi4xIGxpc3Qgc3BlY2lmaWVkIGluIHRoZSBgYGxpc3QnJyBmaWVsZCB3aGljaCBoYXMgYGBvdXRsZW4nJyBlbGVtZW50cy4gIAorVGhlIGBgaW5sZW4nJyBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZSBkZWNvZGVkIGRhdGEgdHlwZSBhcyB3ZWxsIGFzIHRoZSByZXNwZWN0aXZlIGVudHJ5IGluIHRoZSBgYGxpc3QnJyBmaWVsZCB3aWxsIGhhdmUgdGhlIGBgdXNlZCcnIGZsYWcgCitzZXQgdG8gbm9uLS16ZXJvIHRvIHJlZmxlY3QgaXQgd2FzIHRoZSBkYXRhIHR5cGUgZGVjb2RlZC4KKworXHNlY3Rpb257UGFzc3dvcmQgQmFzZWQgQ3J5cHRvZ3JhcGh5fQorXHN1YnNlY3Rpb257UEtDUyBcIzV9CitcaW5kZXh7UEtDUyBcIzV9CitJbiBvcmRlciB0byBzZWN1cmVseSBoYW5kbGUgdXNlciBwYXNzd29yZHMgZm9yIHRoZSBwdXJwb3NlcyBvZiBjcmVhdGluZyBzZXNzaW9uIGtleXMgYW5kIGNoYWluaW5nIElWcyB0aGUgUEtDUyBcIzUgd2FzIGRyYWZ0ZWQuICAgUEtDUyBcIzUKK2lzIG1hZGUgdXAgb2YgdHdvIGFsZ29yaXRobXMsIEFsZ29yaXRobSBPbmUgYW5kIEFsZ29yaXRobSBUd28uICBBbGdvcml0aG0gT25lIGlzIHRoZSBvbGRlciBmYWlybHkgbGltaXRlZCBhbGdvcml0aG0gd2hpY2ggaGFzIGJlZW4gaW1wbGVtZW50ZWQKK2ZvciBjb21wbGV0ZW5lc3MuICBBbGdvcml0aG0gVHdvIGlzIGEgYml0IG1vcmUgbW9kZXJuIGFuZCBtb3JlIGZsZXhpYmxlIHRvIHdvcmsgd2l0aC4KKworXHN1YnNlY3Rpb257QWxnb3JpdGhtIE9uZX0KK0FsZ29yaXRobSBPbmUgYWNjZXB0cyBhcyBpbnB1dCBhIHBhc3N3b3JkLCBhbiA4LS1ieXRlIHNhbHQgYW5kIGFuIGl0ZXJhdGlvbiBjb3VudGVyLiAgVGhlIGl0ZXJhdGlvbiBjb3VudGVyIGlzIG1lYW50IHRvIGFjdCBhcyBkZWxheSBmb3IKK3Blb3BsZSB0cnlpbmcgdG8gYnJ1dGUgZm9yY2UgZ3Vlc3MgdGhlIHBhc3N3b3JkLiAgVGhlIGhpZ2hlciB0aGUgaXRlcmF0aW9uIGNvdW50ZXIgdGhlIGxvbmdlciB0aGUgZGVsYXkuICBUaGlzIGFsZ29yaXRobSBhbHNvIHJlcXVpcmVzIGEgaGFzaCAKK2FsZ29yaXRobSBhbmQgcHJvZHVjZXMgYW4gb3V0cHV0IG5vIGxvbmdlciB0aGFuIHRoZSBvdXRwdXQgb2YgdGhlIGhhc2guICAKKworXGluZGV4e3BrY3NcXzVcX2FsZzEoKX0KK1xiZWdpbnthbGx0dH0KK2ludCBwa2NzXzVfYWxnMShjb25zdCB1bnNpZ25lZCBjaGFyICpwYXNzd29yZCwgdW5zaWduZWQgbG9uZyBwYXNzd29yZF9sZW4sIAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIAorICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb25fY291bnQsICBpbnQgaGFzaF9pZHgsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK1xlbmR7YWxsdHR9CitXaGVyZSBgYHBhc3N3b3JkJycgaXMgdGhlIHVzZXJzIHBhc3N3b3JkLiAgU2luY2UgdGhlIGFsZ29yaXRobSBhbGxvd3MgYmluYXJ5IHBhc3N3b3JkcyB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIGxlbmd0aCBpbiBgYHBhc3N3b3JkXF9sZW4nJy4gIAorVGhlIGBgc2FsdCcnIGlzIGEgZml4ZWQgc2l6ZSA4LS1ieXRlIGFycmF5IHdoaWNoIHNob3VsZCBiZSByYW5kb20gZm9yIGVhY2ggdXNlciBhbmQgc2Vzc2lvbi4gIFRoZSBgYGl0ZXJhdGlvblxfY291bnQnJyBpcyB0aGUgZGVsYXkgZGVzaXJlZAorb24gdGhlIHBhc3N3b3JkLiAgVGhlIGBgaGFzaFxfaWR4JycgaXMgdGhlIGluZGV4IG9mIHRoZSBoYXNoIHlvdSB3aXNoIHRvIHVzZSBpbiB0aGUgZGVzY3JpcHRvciB0YWJsZS4gIAorCitUaGUgb3V0cHV0IG9mIGxlbmd0aCB1cHRvIGBgb3V0bGVuJycgaXMgc3RvcmVkIGluIGBgb3V0JycuICBJZiBgYG91dGxlbicnIGlzIGluaXRpYWxseSBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgaGFzaCBmdW5jdGlvbnMgb3V0cHV0CitpdCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBieXRlcyBzdG9yZWQuICBJZiBpdCBpcyBzbWFsbGVyIHRoYW4gbm90IGFsbCBvZiB0aGUgaGFzaCBvdXRwdXQgaXMgc3RvcmVkIGluIGBgb3V0JycuCisKK1xzdWJzZWN0aW9ue0FsZ29yaXRobSBUd299CisKK0FsZ29yaXRobSBUd28gaXMgdGhlIHJlY29tbWVuZGVkIGFsZ29yaXRobSBmb3IgdGhpcyB0YXNrLiAgSXQgYWxsb3dzIHZhcmlhYmxlIGxlbmd0aCBzYWx0cyBhbmQgY2FuIHByb2R1Y2Ugb3V0cHV0cyBsYXJnZXIgdGhhbiB0aGUgCitoYXNoIGZ1bmN0aW9ucyBvdXRwdXQuICBBcyBzdWNoIGl0IGNhbiBlYXNpbHkgYmUgdXNlZCB0byBkZXJpdmUgc2Vzc2lvbiBrZXlzIGZvciBjaXBoZXJzIGFuZCBNQUNzIGFzIHdlbGwgaW5pdGlhbCB2ZWN0b3JzIGFzIHJlcXVpcmVkCitmcm9tIGEgc2luZ2xlIHBhc3N3b3JkIGFuZCBpbnZva2F0aW9uIG9mIHRoaXMgYWxnb3JpdGhtLgorCitcaW5kZXh7cGtjc1xfNVxfYWxnMigpfQorXGJlZ2lue2FsbHR0fQoraW50IHBrY3NfNV9hbGcyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBsb25nIHBhc3N3b3JkX2xlbiwgCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwgICAgIHVuc2lnbmVkIGxvbmcgc2FsdF9sZW4sCisgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbl9jb3VudCwgICAgICAgICAgIGludCBoYXNoX2lkeCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQorXGVuZHthbGx0dH0KK1doZXJlIGBgcGFzc3dvcmQnJyBpcyB0aGUgdXNlcnMgcGFzc3dvcmQuICBTaW5jZSB0aGUgYWxnb3JpdGhtIGFsbG93cyBiaW5hcnkgcGFzc3dvcmRzIHlvdSBtdXN0IGFsc28gc3BlY2lmeSB0aGUgbGVuZ3RoIGluIGBgcGFzc3dvcmRcX2xlbicnLiAgCitUaGUgYGBzYWx0JycgaXMgYW4gYXJyYXkgb2Ygc2l6ZSBgYHNhbHRcX2xlbicnLiAgSXQgc2hvdWxkIGJlIHJhbmRvbSBmb3IgZWFjaCB1c2VyIGFuZCBzZXNzaW9uLiAgVGhlIGBgaXRlcmF0aW9uXF9jb3VudCcnIGlzIHRoZSBkZWxheSBkZXNpcmVkCitvbiB0aGUgcGFzc3dvcmQuICBUaGUgYGBoYXNoXF9pZHgnJyBpcyB0aGUgaW5kZXggb2YgdGhlIGhhc2ggeW91IHdpc2ggdG8gdXNlIGluIHRoZSBkZXNjcmlwdG9yIHRhYmxlLiAgIFRoZSBvdXRwdXQgb2YgbGVuZ3RoIHVwdG8gCitgYG91dGxlbicnIGlzIHN0b3JlZCBpbiBgYG91dCcnLgorCitcYmVnaW57YWxsdHR9CisvKiBkZW1vIHRvIHNob3cgaG93IHRvIG1ha2Ugc2Vzc2lvbiBzdGF0ZSBtYXRlcmlhbCBmcm9tIGEgcGFzc3dvcmQgKi8KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgoraW50IG1haW4odm9pZCkKK1x7CisgICAgdW5zaWduZWQgY2hhciBwYXNzd29yZFsxMDBdLCBzYWx0WzEwMF0sCisgICAgICAgICAgICAgICAgICBjaXBoZXJfa2V5WzE2XSwgY2lwaGVyX2l2WzE2XSwKKyAgICAgICAgICAgICAgICAgIG1hY19rZXlbMTZdLCBvdXRidWZbNDhdOworICAgIGludCAgICAgICAgICAgZXJyLCBoYXNoX2lkeDsKKyAgICB1bnNpZ25lZCBsb25nIG91dGxlbiwgcGFzc3dvcmRfbGVuLCBzYWx0X2xlbjsKKworICAgIC8qIHJlZ2lzdGVyIGhhc2ggYW5kIGdldCBpdCdzIGlkeCAuLi4uICovCisKKyAgICAvKiBnZXQgdXNlcnMgcGFzc3dvcmQgYW5kIG1ha2UgdXAgYSBzYWx0IC4uLiAqLworCisgICAgLyogY3JlYXRlIHRoZSBtYXRlcmlhbCAoMTAwIGl0ZXJhdGlvbnMgaW4gYWxnb3JpdGhtKSAqLworICAgIG91dGxlbiA9IHNpemVvZihvdXRidWYpOworICAgIGlmICgoZXJyID0gcGtjc181X2FsZzIocGFzc3dvcmQsIHBhc3N3b3JkX2xlbiwgc2FsdCwgc2FsdF9sZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCBoYXNoX2lkeCwgb3V0YnVmLCAmb3V0bGVuKSkgIT0gQ1JZUFRfT0spIFx7CisgICAgICAgLyogZXJyb3IgaGFuZGxlICovCisgICAgXH0KKworICAgIC8qIG5vdyBleHRyYWN0IGl0ICovCisgICAgbWVtY3B5KGNpcGhlcl9rZXksIG91dGJ1ZiwgMTYpOworICAgIG1lbWNweShjaXBoZXJfaXYsICBvdXRidWYrMTYsIDE2KTsKKyAgICBtZW1jcHkobWFjX2tleSwgICAgb3V0YnVmKzMyLCAxNik7CisKKyAgICAvKiB1c2UgbWF0ZXJpYWwgKHJlY2FsbCB0byBzdG9yZSB0aGUgc2FsdCBpbiB0aGUgb3V0cHV0KSAqLworXH0KK1xlbmR7YWxsdHR9CisKIFxjaGFwdGVye01pc2NlbGxhbmVvdXN9CiBcc2VjdGlvbntCYXNlNjQgRW5jb2RpbmcgYW5kIERlY29kaW5nfQogVGhlIGxpYnJhcnkgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGVuY29kZSBhbmQgZGVjb2RlIGEgUkZDMTUyMSBiYXNlNjQgY29kaW5nIHNjaGVtZS4gIFRoaXMgbWVhbnMgdGhhdCBpdCBjYW4gZGVjb2RlIHdoYXQgaXQgCkBAIC0yODYzLDcgKzM3NzQsNyBAQAogQXQgdGhlIGhlYXJ0IG9mIGFsbCB0aGUgZnVuY3Rpb25zIGlzIHRoZSBkYXRhIHR5cGUgYGBtcFxfaW50JycgKGRlZmluZWQgaW4gdG9tbWF0aC5oKS4gIFRoaXMgZGF0YSB0eXBlIGlzIHdoYXQgCiB3aWxsIGhvbGQgYWxsIGxhcmdlIGludGVnZXJzLiAgSW4gb3JkZXIgdG8gdXNlIGFuIG1wXF9pbnQgb25lIG11c3QgaW5pdGlhbGl6ZSBpdCBmaXJzdCwgZm9yIGV4YW1wbGU6CiBcYmVnaW57dmVyYmF0aW19Ci0jaW5jbHVkZSA8bXljcnlwdC5oPiAvKiBteWNyeXB0LmggaW5jbHVkZXMgbXBpLmggYXV0b21hdGljYWxseSAqLworI2luY2x1ZGUgPHRvbWNyeXB0Lmg+IC8qIHRvbWNyeXB0LmggaW5jbHVkZXMgbXBpLmggYXV0b21hdGljYWxseSAqLwogaW50IG1haW4odm9pZCkKIHsgCiAgICBtcF9pbnQgYmlnbnVtOwpAQCAtMzAyMiw3ICszOTMzLDYgQEAKIFxiZWdpbntjZW50ZXJ9CiBcYmVnaW57dGFidWxhcn17fGN8Y3x9CiAgICAgXGhsaW5lIEVDQyBLZXkgU2l6ZSAoYml0cykgJiBXb3JrIEZhY3RvciAoJGxvZ18yJCkgXFwKLSAgICBcaGxpbmUgMTYwICYgODAgIFxcCiAgICAgXGhsaW5lIDE5MiAmIDk2ICBcXAogICAgIFxobGluZSAyMjQgJiAxMTIgXFwKICAgICBcaGxpbmUgMjU2ICYgMTI4IFxcCkBAIC0zMDU4LDE4ICszOTY4LDY3IEBACiBpcyBtb2R1bGFyIGVub3VnaCBwdXR0aW5nIHRoZSBsb2NrcyBpbiB0aGUgcmlnaHQgcGxhY2Ugc2hvdWxkIG5vdCBibG9hdCB0aGUgY29kZSBzaWduaWZpY2FudGx5IGFuZCB3aWxsIHNvbHZlIGFsbCB0aHJlYWQKIHNhZmV0eSBpc3N1ZXMgd2l0aGluIHRoZSBsaWJyYXJ5LgogCi1cY2hhcHRlcntDb25maWd1cmluZyB0aGUgTGlicmFyeX0KK1xjaGFwdGVye0NvbmZpZ3VyaW5nIGFuZCBCdWlsZGluZyB0aGUgTGlicmFyeX0KIFxzZWN0aW9ue0ludHJvZHVjdGlvbn0KIFRoZSBsaWJyYXJ5IGlzIGZhaXJseSBmbGV4aWJsZSBhYm91dCBob3cgaXQgY2FuIGJlIGJ1aWx0LCB1c2VkIGFuZCBnZW5lcmFsbHkgZGlzdHJpYnV0ZWQuICBBZGRpdGlvbnMgYXJlIGJlaW5nIG1hZGUgd2l0aAotZWFjaCBuZXcgcmVsZWFzZSB0aGF0IHdpbGwgbWFrZSB0aGUgbGlicmFyeSBldmVuIG1vcmUgZmxleGlibGUuICBNb3N0IG9wdGlvbnMgYXJlIHBsYWNlZCBpbiB0aGUgbWFrZWZpbGUgYW5kIG90aGVycwotYXJlIGluIGBgbXljcnlwdFxfY2ZnLmgnJy4gIEFsbCBhcmUgdXNlZCB3aGVuIHRoZSBsaWJyYXJ5IGlzIGJ1aWx0IGZyb20gc2NyYXRjaC4KK2VhY2ggbmV3IHJlbGVhc2UgdGhhdCB3aWxsIG1ha2UgdGhlIGxpYnJhcnkgZXZlbiBtb3JlIGZsZXhpYmxlLiAgRWFjaCBvZiB0aGUgY2xhc3NlcyBvZiBmdW5jdGlvbnMgY2FuIGJlIGRpc2FibGVkIGR1cmluZwordGhlIGJ1aWxkIHByb2Nlc3MgdG8gbWFrZSBhIHNtYWxsZXIgbGlicmFyeS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3Igc2hhcmVkIGxpYnJhcmllcy4KIAotRm9yIEdDQyBwbGF0Zm9ybXMgdGhlIGZpbGUgYGBtYWtlZmlsZScnIGlzIHRoZSBtYWtlZmlsZSB0byBiZSB1c2VkLiAgT24gTVNWQyBwbGF0Zm9ybXMgYGBtYWtlZmlsZS52YycnIGFuZCBvbiBQUzIgcGxhdGZvcm1zCi1gYG1ha2VmaWxlLnBzMicnLgorXHNlY3Rpb257QnVpbGRpbmcgYSBTdGF0aWMgTGlicmFyeX0KK1RoZSBsaWJyYXJ5IGNhbiBiZSBidWlsdCBhcyBhIHN0YXRpYyBsaWJyYXJ5IHdoaWNoIGlzIGdlbmVyYWxseSB0aGUgc2ltcGxlc3QgYW5kIG1vc3QgcG9ydGFibGUgbWV0aG9kIG9mIAorYnVpbGRpbmcgdGhlIGxpYnJhcnkuICBXaXRoIGEgQ0Mgb3IgR0NDIGVxdWlwcGVkIHBsYXRmb3JtIHlvdSBjYW4gaXNzdWUgdGhlIGZvbGxvd2luZwogCi1cc2VjdGlvbntteWNyeXB0XF9jZmcuaH0KLVRoZSBmaWxlIGBgbXljcnlwdFxfY2ZnLmgnJyBpcyB3aGF0IGxldHMgeW91IGNvbnRyb2wgd2hhdCBmdW5jdGlvbmFsaXR5IHlvdSB3YW50IHRvIHJlbW92ZSBmcm9tIHRoZSBsaWJyYXJ5LiAgQnkgZGVmYXVsdCwKLWV2ZXJ5dGhpbmcgdGhlIGxpYnJhcnkgaGFzIHRvIG9mZmVyIGl0IGJ1aWx0LiAgCitcYmVnaW57YWxsdHR9CittYWtlIGluc3RhbGxfbGliCitcZW5ke2FsbHR0fQorCitXaGljaCB3aWxsIGJ1aWxkIHRoZSBsaWJyYXJ5IGFuZCBpbnN0YWxsIGl0IGluIC91c3IvbGliIChhcyB3ZWxsIGFzIHRoZSBoZWFkZXJzIGluIC91c3IvaW5jbHVkZSkuICBUaGUgZGVzdGluYXRpb24KK2RpcmVjdG9yeSBvZiB0aGUgbGlicmFyeSBhbmQgaGVhZGVycyBjYW4gYmUgY2hhbmdlZCBieSBlZGl0aW5nIGBgbWFrZWZpbGUnJy4gIFRoZSB2YXJpYWJsZSBMSUJOQU1FIGNvbnRyb2xzCit3aGVyZSB0aGUgbGlicmFyeSBpcyB0byBiZSBpbnN0YWxsZWQgYW5kIElOQ05BTUUgY29udHJvbHMgd2hlcmUgdGhlIGhlYWRlcnMgYXJlIHRvIGJlIGluc3RhbGxlZC4gIEEgZGV2ZWxvcGVyIGNhbiAKK3RoZW4gdXNlIHRoZSBsaWJyYXJ5IGJ5IGluY2x1ZGluZyBgYHRvbWNyeXB0LmgnJyBpbiB0aGVpciBwcm9ncmFtIGFuZCBsaW5raW5nIGFnYWluc3QgYGBsaWJ0b21jcnlwdC5hJycuCisKK0Egc3RhdGljIGxpYnJhcnkgY2FuIGFsc28gYmUgYnVpbHQgd2l0aCB0aGUgSW50ZWwgQyBDb21waWxlciAgKElDQykgYnkgaXNzdWluZyB0aGUgZm9sbG93aW5nCisKK1xiZWdpbnthbGx0dH0KK21ha2UgLWYgbWFrZWZpbGUuaWNjIGluc3RhbGwKK1xlbmR7YWxsdHR9CisKK1RoaXMgd2lsbCBhbHNvIGJ1aWxkIGBgbGlidG9tY3J5cHQuYScnIGV4Y2VwdCB0aGF0IGl0IHdpbGwgdXNlIElDQy4gIEFkZGl0aW9uYWxseSBNaWNyb3NvZnQncyBWaXN1YWwgQyA2LjAwIGNhbiBiZSB1c2VkCitieSBpc3N1aW5nCisKK1xiZWdpbnthbGx0dH0KK25tYWtlIC1mIG1ha2VmaWxlLm1zdmMKK1xlbmR7YWxsdHR9CisKK1lvdSB3aWxsIGhhdmUgdG8gbWFudWFsbHkgY29weSBgYHRvbWNyeXB0LmxpYicnIGFuZCB0aGUgaGVhZGVycyB0byB5b3VyIE1TVkMgbGliL2luYyBkaXJlY3Rvcmllcy4KKworXHN1YnNlY3Rpb257TVBJIENvbnRyb2x9CitJZiB5b3UgYWxyZWFkeSBoYXZlIExpYlRvbU1hdGggaW5zdGFsbGVkIHlvdSBjYW4gc2FmZWx5IHJlbW92ZSBpdCBmcm9tIHRoZSBidWlsZC4gIEJ5IGNvbW1lbnRpbmcgdGhlIGxpbmUKK2luIHRoZSBhcHByb3ByaWF0ZSBtYWtlZmlsZSB3aGljaCBzdGFydHMgd2l0aCAKKworXGJlZ2lue2FsbHR0fQorTVBJT0JKRUNUPW1waQorXGVuZHthbGx0dH0KKworU2ltcGx5IHBsYWNlIGEgXCMgYXQgdGhlIHN0YXJ0IGFuZCByZS1idWlsZCB0aGUgbGlicmFyeS4gIFRvIHByb3Blcmx5IGxpbmsgYXBwbGljYXRpb25zIHlvdSB3aWxsIGhhdmUgdG8gYWxzbworbGluayBpbiBMaWJUb21NYXRoLiAgUmVtb3ZpbmcgTVBJIGhhcyB0aGUgYmVuZWZpdCBvZiBjdXR0aW5nIGRvd24gdGhlIGxpYnJhcnkgc2l6ZSBhcyB3ZWxsIHBvdGVudGlhbGx5IGhhdmUgYWNjZXNzCit0byB0aGUgbGF0ZXN0IG1waS4KKworXHNlY3Rpb257QnVpbGRpbmcgYSBTaGFyZWQgTGlicmFyeX0KK0xpYlRvbUNyeXB0IGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgc2hhcmVkIGxpYnJhcnkgKC5zbywgLmRsbCwgZXRjLi4uKS4gIFdpdGggbm9uLVdpbmRvd3MgcGxhdGZvcm1zIHRoZSBhc3N1bXB0aW9uCitvZiB0aGUgcHJlc2VuY2Ugb2YgZ2NjIGFuZCBgYGxpYnRvb2wnJyBoYXMgYmVlbiBtYWRlLiAgVGhlc2UgYXJlIGZhaXJseSBjb21tb24gb24gVW5peC9MaW51eC9CU0QgcGxhdGZvcm1zLiAgVG8KK2J1aWxkIGEgLnNvIHNoYXJlZCBsaWJyYXJ5IGlzc3VlIAorCitcYmVnaW57YWxsdHR9CittYWtlIC1mIG1ha2VmaWxlLnNoYXJlZAorXGVuZHthbGx0dH0KK1RoaXMgd2lsbCB1c2UgbGlidG9vbCBhbmQgZ2NjIHRvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkgYGBsaWJ0b21jcnlwdC5sYScnIGFzIHdlbGwgYXMgYSBzdGF0aWMgbGlicmFyeSBgYGxpYnRvbWNyeXB0LmEnJworYW5kIGluc3RhbGwgdGhlbSBpbnRvIC91c3IvbGliIChhbmQgdGhlIGhlYWRlcnMgaW50byAvdXNyL2luY2x1ZGUpLiAgVG8gbGluayB5b3VyIGFwcGxpY2F0aW9uIHlvdSBzaG91bGQgdXNlIHRoZSAKK2xpYnRvb2wgcHJvZ3JhbSBpbiBgYC0tbW9kZT1saW5rJycuCisKK1xzZWN0aW9ue3RvbWNyeXB0XF9jZmcuaH0KK1RoZSBmaWxlIGBgdG9tY3J5cHRcX2NmZy5oJycgaXMgd2hhdCBsZXRzIHlvdSBjb250cm9sIHZhcmlvdXMgaGlnaCBsZXZlbCBtYWNyb3Mgd2hpY2ggY29udHJvbCB0aGUgYmVoYXZpb3VyIAorb2YgdGhlIGxpYnJhcnkuIAogCiBcc3Vic3Vic2VjdGlvbntBUkdUWVBFfQogVGhpcyBsZXRzIHlvdSBjb250cm9sIGhvdyB0aGUgXF9BUkdDSEsgbWFjcm8gd2lsbCBiZWhhdmUuICBUaGUgbWFjcm8gaXMgdXNlZCB0byBjaGVjayBwb2ludGVycyBpbnNpZGUgdGhlIGZ1bmN0aW9ucyBhZ2FpbnN0CkBAIC0zMDgyLDM3ICs0MDQxLDQzIEBACiBUaGVyZSBhcmUgZml2ZSBtYWNyb3MgcmVsYXRlZCB0byBlbmRpYW5lc3MgaXNzdWVzLiAgRm9yIGxpdHRsZSBlbmRpYW4gcGxhdGZvcm1zIGRlZmluZSwgRU5ESUFOXF9MSVRUTEUuICBGb3IgYmlnIGVuZGlhbgogcGxhdGZvcm1zIGRlZmluZSBFTkRJQU5cX0JJRy4gIFNpbWlsYXJseSB3aGVuIHRoZSBkZWZhdWx0IHdvcmQgc2l6ZSBvZiBhbiBgYHVuc2lnbmVkIGxvbmcnJyBpcyAzMi1iaXRzIGRlZmluZSBFTkRJQU5cXzMyQklUV09SRAogb3IgZGVmaW5lIEVORElBTlxfNjRCSVRXT1JEIHdoZW4gaXRzIDY0LWJpdHMuICBJZiB5b3UgZG8gbm90IGRlZmluZSBhbnkgb2YgdGhlbSB0aGUgbGlicmFyeSB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIEVORElBTlxfTkVVVFJBTAotd2hpY2ggd2lsbCB3b3JrIG9uIGFsbCBwbGF0Zm9ybXMuICBDdXJyZW50bHkgdGhlIHN5c3RlbSB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IEdDQyBvciBNU1ZDIG9uIGEgd2luZG93cyBwbGF0Zm9ybSBhcyB3ZWxsCi1hcyBHQ0Mgb24gYSBQUzIgcGxhdGZvcm0uCit3aGljaCB3aWxsIHdvcmsgb24gYWxsIHBsYXRmb3Jtcy4KKworQ3VycmVudGx5IExpYlRvbUNyeXB0IHdpbGwgZGV0ZWN0IHg4Ni0zMiBhbmQgeDg2LTY0IHJ1bm5pbmcgR0NDIGFzIHdlbGwgYXMgeDg2LTMyIHJ1bm5pbmcgTVNWQy4gIAogCiBcc2VjdGlvbntUaGUgQ29uZmlndXJlIFNjcmlwdH0KLVRoZXJlIGFyZSBhbHNvIG9wdGlvbnMgeW91IGNhbiBzcGVjaWZ5IGZyb20gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgb3IgYGBteWNyeXB0XF9jb25maWcuaCcnLiAgCitUaGVyZSBhcmUgYWxzbyBvcHRpb25zIHlvdSBjYW4gc3BlY2lmeSBmcm9tIHRoZSBjb25maWd1cmUgc2NyaXB0IG9yIGBgdG9tY3J5cHRcX2N1c3RvbS5oJycuICAKIAotXHN1YnN1YnNlY3Rpb257WCBtZW1vcnkgcm91dGluZXN9Ci1UaGUgbWFrZWZpbGVzIG11c3QgZGVmaW5lIHRocmVlIG1hY3JvcyBkZW5vdGVkIGFzIFhNQUxMT0MsIFhDQUxMT0MgYW5kIFhGUkVFIHdoaWNoIHJlc29sdmUgdG8gdGhlIG5hbWUgb2YgdGhlIHJlc3BlY3RpdmUKLWZ1bmN0aW9ucy4gIFRoaXMgbGV0cyB5b3Ugc3Vic3RpdHV0ZSBpbiB5b3VyIG93biBtZW1vcnkgcm91dGluZXMuICBJZiB5b3Ugc3Vic3RpdHV0ZSBpbiB5b3VyIG93biBmdW5jdGlvbnMgdGhleSBtdXN0IGJlaGF2ZQotbGlrZSB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiB3aGF0IHRoZXkgZXhwZWN0IGFzIGlucHV0IGFuZCBvdXRwdXQuICBCeSBkZWZhdWx0IHRoZSBsaWJyYXJ5IHVzZXMgdGhlCi1zdGFuZGFyZCBDIHJvdXRpbmVzLgorXHN1YnNlY3Rpb257WCBtZW1vcnkgcm91dGluZXN9CitBdCB0aGUgdG9wIG9mIHRvbWNyeXB0XF9jdXN0b20uaCBhcmUgZm91ciBtYWNyb3MgZGVub3RlZCBhcyBYTUFMTE9DLCBYQ0FMTE9DLCBYUkVBTExPQyBhbmQgWEZSRUUgd2hpY2ggcmVzb2x2ZSB0byAKK3RoZSBuYW1lIG9mIHRoZSByZXNwZWN0aXZlIGZ1bmN0aW9ucy4gIFRoaXMgbGV0cyB5b3Ugc3Vic3RpdHV0ZSBpbiB5b3VyIG93biBtZW1vcnkgcm91dGluZXMuICBJZiB5b3Ugc3Vic3RpdHV0ZSBpbiAKK3lvdXIgb3duIGZ1bmN0aW9ucyB0aGV5IG11c3QgYmVoYXZlIGxpa2UgdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbnMgaW4gdGVybXMgb2Ygd2hhdCB0aGV5IGV4cGVjdCBhcyBpbnB1dCBhbmQgCitvdXRwdXQuICBCeSBkZWZhdWx0IHRoZSBsaWJyYXJ5IHVzZXMgdGhlIHN0YW5kYXJkIEMgcm91dGluZXMuCiAKLVxzdWJzdWJzZWN0aW9ue1ggY2xvY2sgcm91dGluZXN9Citcc3Vic2VjdGlvbntYIGNsb2NrIHJvdXRpbmVzfQogVGhlIHJuZ1xfZ2V0XF9ieXRlcygpIGZ1bmN0aW9uIGNhbiBjYWxsIGEgZnVuY3Rpb24gdGhhdCByZXF1aXJlcyB0aGUgY2xvY2soKSBmdW5jdGlvbi4gIFRoZXNlIG1hY3JvcyBsZXQgeW91IG92ZXJyaWRlCiB0aGUgZGVmYXVsdCBjbG9jaygpIHVzZWQgd2l0aCBhIHJlcGxhY2VtZW50LiAgQnkgZGVmYXVsdCB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGNsb2NrKCkgZnVuY3Rpb24gaXMgdXNlZC4KIAotXHN1YnN1YnNlY3Rpb257Tk9cX0ZJTEV9Citcc3Vic2VjdGlvbntOT1xfRklMRX0KIER1cmluZyB0aGUgYnVpbGQgaWYgTk9cX0ZJTEUgaXMgZGVmaW5lZCB0aGVuIGFueSBmdW5jdGlvbiBpbiB0aGUgbGlicmFyeSB0aGF0IHVzZXMgZmlsZSBJL08gd2lsbCBub3QgY2FsbCB0aGUgZmlsZSBJL08gCi1mdW5jdGlvbnMgYW5kIGluc3RlYWQgc2ltcGx5IHJldHVybiBDUllQVFxfRVJST1IuICBUaGlzIHNob3VsZCBoZWxwIHJlc29sdmUgYW55IGxpbmtlciBlcnJvcnMgc3RlbW1pbmcgZnJvbSBhIGxhY2sgb2YKK2Z1bmN0aW9ucyBhbmQgaW5zdGVhZCBzaW1wbHkgcmV0dXJuIENSWVBUXF9OT1AuICBUaGlzIHNob3VsZCBoZWxwIHJlc29sdmUgYW55IGxpbmtlciBlcnJvcnMgc3RlbW1pbmcgZnJvbSBhIGxhY2sgb2YKIGZpbGUgSS9PIG9uIGVtYmVkZGVkIHBsYXRmb3Jtcy4KIAotXHN1YnN1YnNlY3Rpb257Q0xFQU5cX1NUQUNLfQotV2hlbiB0aGlzIGZ1bmN0aW9ucyBpcyBkZWZpbmVkIHRoZSBmdW5jdGlvbnMgdGhhdCBzdG9yZSBrZXkgbWF0ZXJpYWwgb24gdGhlIHN0YWNrIHdpbGwgY2xlYW4gdXAgYWZ0ZXJ3YXJkcy4gIEFzc3VtZXMgdGhhdAoteW91IGhhdmUgbm8gbWVtb3J5IHBhZ2luZyB3aXRoIHRoZSBzdGFjay4KK1xzdWJzZWN0aW9ue0NMRUFOXF9TVEFDS30KK1doZW4gdGhpcyBmdW5jdGlvbnMgaXMgZGVmaW5lZCB0aGUgZnVuY3Rpb25zIHRoYXQgc3RvcmUga2V5IG1hdGVyaWFsIG9uIHRoZSBzdGFjayB3aWxsIGNsZWFuIHVwIGFmdGVyd2FyZHMuICAKK0Fzc3VtZXMgdGhhdCB5b3UgaGF2ZSBubyBtZW1vcnkgcGFnaW5nIHdpdGggdGhlIHN0YWNrLgogCi1cc3Vic3Vic2VjdGlvbntTeW1tZXRyaWMgQ2lwaGVycywgT25lLXdheSBIYXNoZXMsIFBSTkdTIGFuZCBQdWJsaWMgS2V5IEZ1bmN0aW9uc30KLVRoZXJlIGFyZSBhIHBsZXRob3JhIG9mIG1hY3JvcyBmb3IgdGhlIGNpcGhlcnMsIGhhc2hlcywgUFJOR3MgYW5kIHB1YmxpYyBrZXkgZnVuY3Rpb25zIHdoaWNoIGFyZSBmYWlybHkgc2VsZi1leHBsYW5hdG9yeS4gIAotV2hlbiB0aGV5IGFyZSBkZWZpbmVkIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGluY2x1ZGVkIG90aGVyd2lzZSBpdCBpcyBub3QuICBUaGVyZSBhcmUgc29tZSBkZXBlbmRlbmN5IGlzc3VlcyB3aGljaCBhcmUKLW5vdGVkIGluIHRoZSBmaWxlLiAgRm9yIGluc3RhbmNlLCBZYXJyb3cgcmVxdWlyZXMgQ1RSIGNoYWluaW5nIG1vZGUsIGEgYmxvY2sgY2lwaGVyIGFuZCBhIGhhc2ggZnVuY3Rpb24uCitcc3Vic2VjdGlvbntMVENcX1RFU1R9CitXaGVuIHRoaXMgaGFzIGJlZW4gZGVmaW5lZCB0aGUgdmFyaW91cyBzZWxmLS10ZXN0IGZ1bmN0aW9ucyAoZm9yIGNpcGhlcnMsIGhhc2hlcywgcHJuZ3MsIGV0YykgYXJlIGluY2x1ZGVkIGluIHRoZSBidWlsZC4KK1doZW4gdGhpcyBoYXMgYmVlbiB1bmRlZmluZWQgdGhlIHRlc3RzIGFyZSByZW1vdmVkIGFuZCBpZiBjYWxsZWQgd2lsbCByZXR1cm4gQ1JZUFRcX05PUC4KIAotXHN1YnN1YnNlY3Rpb257VFdPRklTSFxfU01BTEwgYW5kIFRXT0ZJU0hcX1RBQkxFU30KK1xzdWJzZWN0aW9ue1N5bW1ldHJpYyBDaXBoZXJzLCBPbmUtd2F5IEhhc2hlcywgUFJOR1MgYW5kIFB1YmxpYyBLZXkgRnVuY3Rpb25zfQorVGhlcmUgYXJlIGEgcGxldGhvcmEgb2YgbWFjcm9zIGZvciB0aGUgY2lwaGVycywgaGFzaGVzLCBQUk5HcyBhbmQgcHVibGljIGtleSBmdW5jdGlvbnMgd2hpY2ggYXJlIGZhaXJseSAKK3NlbGYtZXhwbGFuYXRvcnkuICBXaGVuIHRoZXkgYXJlIGRlZmluZWQgdGhlIGZ1bmN0aW9uYWxpdHkgaXMgaW5jbHVkZWQgb3RoZXJ3aXNlIGl0IGlzIG5vdC4gIFRoZXJlIGFyZSBzb21lIAorZGVwZW5kZW5jeSBpc3N1ZXMgd2hpY2ggYXJlIG5vdGVkIGluIHRoZSBmaWxlLiAgRm9yIGluc3RhbmNlLCBZYXJyb3cgcmVxdWlyZXMgQ1RSIGNoYWluaW5nIG1vZGUsIGEgYmxvY2sgCitjaXBoZXIgYW5kIGEgaGFzaCBmdW5jdGlvbi4KKworXHN1YnNlY3Rpb257VFdPRklTSFxfU01BTEwgYW5kIFRXT0ZJU0hcX1RBQkxFU30KIFR3b2Zpc2ggaXMgYSAxMjgtYml0IHN5bW1ldHJpYyBibG9jayBjaXBoZXIgdGhhdCBpcyBwcm92aWRlZCB3aXRoaW4gdGhlIGxpYnJhcnkuICBUaGUgY2lwaGVyIGl0c2VsZiBpcyBmbGV4aWJsZSBlbm91Z2gKIHRvIGFsbG93IHNvbWUgdHJhZGVvZmZzIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4gIFdoZW4gVFdPRklTSFxfU01BTEwgaXMgZGVmaW5lZCB0aGUgc2NoZWR1bGVkIHN5bW1ldHJpYyBrZXkgZm9yIFR3b2Zpc2ggCiByZXF1aXJlcyBvbmx5IDIwMCBieXRlcyBvZiBtZW1vcnkuICBUaGlzIGlzIGFjaGlldmVkIGJ5IG5vdCBwcmUtY29tcHV0aW5nIHRoZSBzdWJzdGl0dXRpb24gYm94ZXMuICBIYXZpbmcgdGhpcyAKQEAgLTMxMjQsMTAgKzQwODksNDc1IEBACiB3aWxsIGluY3JlYXNlIGJ5IGFwcHJveGltYXRlbHkgNTAwIGJ5dGVzLiAgSWYgdGhpcyBpcyBkZWZpbmVkIGJ1dCBUV09GSVNIXF9TTUFMTCBpcyBub3QgdGhlIGNpcGhlciB3aWxsIHN0aWxsIHdvcmsgYnV0CiBpdCB3aWxsIG5vdCBzcGVlZCB1cCB0aGUgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uIGZ1bmN0aW9ucy4KIAotXHN1YnN1YnNlY3Rpb257U01BTExcX0NPREV9Citcc3Vic2VjdGlvbntHQ01cX1RBQkxFU30KK1doZW4gZGVmaW5lZCBHQ00gd2lsbCB1c2UgYSA2NEtCIHRhYmxlIChwZXIgR0NNIHN0YXRlKSB3aGljaCB3aWxsIGdyZWF0bHkgc3BlZWQgdXAgdGhlIHBlci0tcGFja2V0IGxhdGVuY3kuICAKK0l0IGFsc28gaW5jcmVhc2VzIHRoZSBpbml0aWFsaXphdGlvbiB0aW1lIGFuZCBpc24ndCBzdWl0YWJsZSB3aGVuIHlvdSBhcmUgZ29pbmcgdG8gdXNlIGEga2V5IGEgZmV3IHRpbWVzIG9ubHkuICAKKworXHN1YnNlY3Rpb257U01BTExcX0NPREV9CiBXaGVuIHRoaXMgaXMgZGVmaW5lZCBzb21lIG9mIHRoZSBjb2RlIHN1Y2ggYXMgdGhlIFJpam5kYWVsIGFuZCBTQUZFUisgY2lwaGVycyBhcmUgcmVwbGFjZWQgd2l0aCBzbWFsbGVyIGNvZGUgdmFyaWFudHMuCiBUaGVzZSB2YXJpYW50cyBhcmUgc2xvd2VyIGJ1dCBjYW4gc2F2ZSBxdWl0ZSBhIGJpdCBvZiBjb2RlIHNwYWNlLgogCitcc3Vic2VjdGlvbntMVENcX0ZBU1R9CitUaGlzIG1vZGUgKGF1dG9kZXRlY3RlZCB3aXRoIHg4NlxfMzIseDg2XF82NCBwbGF0Zm9ybXMgd2l0aCBHQ0Mgb3IgTVNWQykgY29uZmlndXJlcyB2YXJpb3VzIHJvdXRpbmVzIHN1Y2ggYXMgY3RyXF9lbmNyeXB0KCkgb3IgCitjYmNcX2VuY3J5cHQoKSB0aGF0IGl0IGNhbiBzYWZlbHkgWE9SIG11bHRpcGxlIG9jdGV0cyBpbiBvbmUgc3RlcCBieSB1c2luZyBhIGxhcmdlciBkYXRhIHR5cGUuICBUaGlzIGhhcyB0aGUgYmVuZWZpdCBvZiAKK2N1dHRpbmcgZG93biB0aGUgb3ZlcmhlYWQgb2YgdGhlIHJlc3BlY3RpdmUgZnVuY3Rpb25zLiAgCisKK1RoaXMgbW9kZSBkb2VzIGhhdmUgb25lIGRvd25zaWRlLiAgSXQgY2FuIGNhdXNlIHVuYWxpZ25lZCByZWFkcyBmcm9tIG1lbW9yeSBpZiB5b3UgYXJlIG5vdCBjYXJlZnVsIHdpdGggdGhlIGZ1bmN0aW9ucy4gIFRoaXMgaXMgd2h5CitpdCBoYXMgYmVlbiBlbmFibGVkIGJ5IGRlZmF1bHQgb25seSBmb3IgdGhlIHg4NiBjbGFzcyBvZiBwcm9jZXNzb3JzIHdoZXJlIHVuYWxpZ25lZCBhY2Nlc3NlcyBhcmUgYWxsb3dlZC4gIFRlY2huaWNhbGx5IExUQ1xfRkFTVAoraXMgbm90IGBgcG9ydGFibGUnJyBzaW5jZSB1bmFsaWduZWQgYWNjZXNzZXMgYXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBJU08gQyBzcGVjaWZpY2F0aW9ucy4KKworSW4gcHJhY3RpY2UgaG93ZXZlciwgeW91IGNhbiB1c2UgaXQgb24gcHJldHR5IG11Y2ggYW55IHBsYXRmb3JtIChldmVuIE1JUFMpIHdpdGggY2FyZS4KKworQnkgZGVzaWduIHRoZSBgYGZhc3QnJyBtb2RlIGZ1bmN0aW9ucyB3b24ndCBnZXQgdW5hbGlnbmVkIG9uIHRoZWlyIG93bi4gIEZvciBpbnN0YW5jZSwgaWYgeW91IGNhbGwgY3RyXF9lbmNyeXB0KCkgcmlnaHQgYWZ0ZXIgY2FsbGluZworY3RyXF9zdGFydCgpIGFuZCBhbGwgdGhlIGlucHV0cyB5b3UgZ2F2ZSBhcmUgYWxpZ25lZCB0aGFuIGN0clxfZW5jcnlwdCgpIHdpbGwgcGVyZm9ybSBhbGlnbmVkIG1lbW9yeSBvcGVyYXRpb25zIG9ubHkuICBIb3dldmVyLCBpZiB5b3UgCitjYWxsIGN0clxfZW5jcnlwdCgpIHdpdGggYW4gb2RkIGFtb3VudCBvZiBwbGFpbnRleHQgdGhlbiBjYWxsIGl0IGFnYWluIHRoZSBDVFIgcGFkICh0aGUgSVYpIHdpbGwgYmUgcGFydGlhbGx5IHVzZWQuICBUaGlzIHdpbGwKK2NhdXNlIHRoZSBjdHIgcm91dGluZSB0byBmaXJzdCB1c2UgdXAgdGhlIHJlbWFpbmluZyBwYWQgYnl0ZXMuICBUaGVuIGlmIHRoZXJlIGFyZSBlbm91Z2ggcGxhaW50ZXh0IGJ5dGVzIGxlZnQgaXQgd2lsbCB1c2UgCit3aG9sZSB3b3JkIFhPUiBvcGVyYXRpb25zLiAgVGhlc2Ugb3BlcmF0aW9ucyB3aWxsIGJlIHVuYWxpZ25lZC4KKworVGhlIHNpbXBsZXN0IHByZWNhdXRpb24gaXMgdG8gbWFrZSBzdXJlIHlvdSBwcm9jZXNzIGFsbCBkYXRhIGluIHBvd2VyIG9mIHR3byBibG9ja3MgYW5kIGhhbmRsZSBgYHJlbWFpbmRlcicnIGF0IHRoZSBlbmQuICBlLmcuIElmIHlvdSBhcmUgCitDVFInaW5nIGEgbG9uZyBzdHJlYW0gcHJvY2VzcyBpdCBpbiBibG9ja3Mgb2YgKHNheSkgZm91ciBraWxvYnl0ZXMgYW5kIGhhbmRsZSBhbnkgcmVtYWluaW5nIGluY29tcGxldGUgYmxvY2tzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIAorCitJZiB5b3UgZG8gcGxhbiBvbiB1c2luZyB0aGUgYGBMVENcX0ZBU1QnJyBtb2RlIHlvdSBoYXZlIHRvIGFsc28gZGVmaW5lIGEgYGBMVENcX0ZBU1RcX1RZUEUnJyBtYWNybyB3aGljaCByZXNvbHZlcyB0byBhbiBvcHRpbWFsIHNpemVkCitkYXRhIHR5cGUgeW91IGNhbiBwZXJmb3JtIGludGVnZXIgb3BlcmF0aW9ucyB3aXRoLiAgSWRlYWxseSBpdCBzaG91bGQgYmUgZm91ciBvciBlaWdodCBieXRlcyBzaW5jZSBpdCBtdXN0IHByb3Blcmx5IGRpdmlkZSB0aGUgc2l6ZSAKK29mIHlvdXIgYmxvY2sgY2lwaGVyIChlLmcuIDE2IGJ5dGVzIGZvciBBRVMpLiAgVGhpcyBtZWFucyBzYWRseSBpZiB5b3UncmUgb24gYSBwbGF0Zm9ybSB3aXRoIDU3LS1iaXQgd29yZHMgKG9yIHNvbWV0aGluZykgeW91IGNhbid0IAordXNlIHRoaXMgbW9kZS4gIFNvIHNhZC4KKworXHN1YnNlY3Rpb257TFRDXF9QVEhSRUFEfQorV2hlbiB0aGlzIGlzIGFjdGl2YXRlZCBhbGwgb2YgdGhlIGRlc2NyaXB0b3IgdGFibGUgZnVuY3Rpb25zIHdpbGwgdXNlIHB0aHJlYWQgbG9ja2luZyB0byBlbnN1cmUgdGhyZWFkIHNhZmUgdXBkYXRlcyB0byB0aGUgdGFibGVzLiAgTm90ZSB0aGF0IAoraXQgZG9lc24ndCBwcmV2ZW50IGEgdGhyZWFkIHRoYXQgaXMgcGFzc2l2ZWx5IHVzaW5nIGEgdGFibGUgZnJvbSBiZWluZyBtZXNzZWQgdXAgYnkgYW5vdGhlciB0aHJlYWQgdGhhdCB1cGRhdGVzIHRoZSB0YWJsZS4KKworR2VuZXJhbGx5IHRoZSBydWxlIG9mIHRodW1iIGlzIHRvIHNldHVwIHRoZSB0YWJsZXMgb25jZSBhdCBzdGFydHVwIGFuZCB0aGVuIGxlYXZlIHRoZW0gYmUuICBUaGlzIGFkZGVkIGJ1aWxkIGZsYWcgc2ltcGx5IG1ha2VzIHVwZGF0aW5nCit0aGUgdGFibGVzIHNhZmVyLgorCitcc2VjdGlvbntNUEkgVHdlYWtzfQorXHN1YnNlY3Rpb257UlNBIE9ubHkgVHdlYWt9CitJZiB5b3UgcGxhbiBvbiBvbmx5IHVzaW5nIFJTQSB3aXRoIG1vZHVsaSBpbiB0aGUgcmFuZ2Ugb2YgMTAyNCB0byAyNTYwIGJpdHMgeW91IGNhbiBlbmFibGUgYSBzZXJpZXMgb2YgdHdlYWtzCit0byByZWR1Y2UgdGhlIGxpYnJhcnkgc2l6ZS4gIEZvbGxvdyB0aGVzZSBzdGVwcworCitcYmVnaW57ZW51bWVyYXRlfQorICAgXGl0ZW0gVW5kZWZpbmUgTURTQSwgTUVDQyBhbmQgTURIIGZyb20gdG9tY3J5cHRcX2N1c3RvbS5oCisgICBcaXRlbSBVbmRlZmluZSBMVE1cX0FMTCAgZnJvbSB0b21tYXRoXF9zdXBlcmNsYXNzLmgKKyAgIFxpdGVtIERlZmluZSBTQ1xfUlNBXF8xIGZyb20gdG9tbWF0aFxfc3VwZXJjbGFzcy5oCisgICBcaXRlbSBSZWJ1aWxkIHRoZSBsaWJyYXJ5LgorXGVuZHtlbnVtZXJhdGV9CisKK1xjaGFwdGVye09wdGltaXphdGlvbnN9Citcc2VjdGlvbntJbnRyb2R1Y3Rpb259CitUaGUgZW50aXJlIEFQSSB3YXMgZGVzaWduZWQgd2l0aCBwbHVnIGFuZCBwbGF5IGluIG1pbmQgYXQgdGhlIGxvdyBsZXZlbC4gIFRoYXQgaXMgeW91IGNhbiBzd2FwIG91dCBhbnkgY2lwaGVyLCBoYXNoIG9yIFBSTkcgYW5kIGRlcGVuZGVudCBBUEkgd2lsbCBub3QgcmVxdWlyZQordXBkYXRpbmcuICBUaGlzIGhhcyB0aGUgbmljZSBiZW5lZml0IHRoYXQgSSBjYW4gYWRkIGNpcGhlcnMgbm90IGhhdmUgdG8gcmUtLXdyaXRlIGxhcmdlIHBvcnRpb25zIG9mIHRoZSBBUEkuICBGb3IgdGhlIG1vc3QgcGFydCBMaWJUb21DcnlwdCBoYXMgYWxzbyBiZWVuIHdyaXR0ZW4KK3RvIGJlIGhpZ2hseSBwb3J0YWJsZSBhbmQgZWFzeSB0byBidWlsZCBvdXQgb2YgdGhlIGJveCBvbiBwcmV0dHkgbXVjaCBhbnkgcGxhdGZvcm0uICBBcyBzdWNoIHRoZXJlIGFyZSBubyBhc3NlbWJsZXIgaW5saW5lcyB0aHJvdWdob3V0IHRoZSBjb2RlLCBJIG1ha2Ugbm8gYXNzdW1wdGlvbnMKK2Fib3V0IHRoZSBwbGF0Zm9ybSwgZXRjLi4uCisKK1RoYXQgd29ya3Mgd2VsbCBmb3IgbW9zdCBjYXNlcyBidXQgdGhlcmUgYXJlIHRpbWVzIHdoZXJlIHRpbWUgaXMgb2YgdGhlIGVzc2VuY2UuICBUaGlzIEFQSSBhbHNvIGFsbG93cyBvcHRpbWl6ZWQgcm91dGluZXMgdG8gYmUgZHJvcHBlZCBpbi0tcGxhY2Ugb2YgdGhlIGV4aXN0aW5nCitwb3J0YWJsZSByb3V0aW5lcy4gIEZvciBpbnN0YW5jZSwgaGFuZCBvcHRpbWl6ZWQgYXNzZW1ibGVyIHZlcnNpb25zIG9mIEFFUyBjb3VsZCBiZSBwcm92aWRlZCBhbmQgYW55IGV4aXN0aW5nIGZ1bmN0aW9uIHRoYXQgdXNlcyB0aGUgY2lwaGVyIGNvdWxkIGF1dG9tYXRpY2FsbHkgdXNlCit0aGUgb3B0aW1pemVkIGNvZGUgd2l0aG91dCByZS0td3JpdGluZy4gIFRoaXMgYWxzbyBwYXZlcyB0aGUgd2F5IGZvciBoYXJkd2FyZSBkcml2ZXJzIHRoYXQgY2FuIGFjY2VzcyBoYXJkd2FyZSBhY2NlbGVyYXRlZCBjcnlwdG9ncmFwaGljIGRldmljZXMuCisKK0F0IHRoZSBoZWFydCBvZiB0aGlzIGZsZXhpYmlsaXR5IGlzIHRoZSBgYGRlc2NyaXB0b3InJyBzeXN0ZW0uICBBIGRlc2NyaXB0b3IgaXMgZXNzZW50aWFsbHkganVzdCBhIEMgYGBzdHJ1Y3QnJyB3aGljaCBkZXNjcmliZXMgdGhlIGFsZ29yaXRobSBhbmQgcHJvdmlkZXMgcG9pbnRlcnMKK3RvIGZ1bmN0aW9ucyB0aGF0IGRvIHRoZSB3b3JrLiAgRm9yIGEgZ2l2ZW4gY2xhc3Mgb2Ygb3BlcmF0aW9uIChlLmcuIGNpcGhlciwgaGFzaCwgcHJuZykgdGhlIGZ1bmN0aW9ucyBoYXZlIGlkZW50aWNhbCBwcm90b3R5cGVzIHdoaWNoIG1ha2VzIGRldmVsb3BtZW50IHNpbXBsZS4gIEluIG1vc3QKK2RlcGVuZGVudCByb3V0aW5lcyBhbGwgYSBkZXZlbG9wZXIgaGFzIHRvIGRvIGlzIHJlZ2lzdGVyXF9YWFgoKSB0aGUgZGVzY3JpcHRvciBhbmQgdGhleSdyZSBzZXQuCisKK1xzZWN0aW9ue0NpcGhlcnN9CitUaGUgY2lwaGVycyBpbiBMaWJUb21DcnlwdCBhcmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgbHRjXF9jaXBoZXJcX2Rlc2NyaXB0b3Igc3RydWN0dXJlLgorCitcYmVnaW57c21hbGx9CitcYmVnaW57dmVyYmF0aW19CitzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHsKKyAgIC8qKiBuYW1lIG9mIGNpcGhlciAqLworICAgY2hhciAqbmFtZTsKKyAgIC8qKiBpbnRlcm5hbCBJRCAqLworICAgdW5zaWduZWQgY2hhciBJRDsKKyAgIC8qKiBtaW4ga2V5c2l6ZSAob2N0ZXRzKSAqLworICAgaW50ICBtaW5fa2V5X2xlbmd0aCwgCisgICAvKiogbWF4IGtleXNpemUgKG9jdGV0cykgKi8KKyAgICAgICAgbWF4X2tleV9sZW5ndGgsIAorICAgLyoqIGJsb2NrIHNpemUgKG9jdGV0cykgKi8KKyAgICAgICAgYmxvY2tfbGVuZ3RoLCAKKyAgIC8qKiBkZWZhdWx0IG51bWJlciBvZiByb3VuZHMgKi8KKyAgICAgICAgZGVmYXVsdF9yb3VuZHM7CisgICAvKiogU2V0dXAgdGhlIGNpcGhlciAKKyAgICAgIEBwYXJhbSBrZXkgICAgICAgICBUaGUgaW5wdXQgc3ltbWV0cmljIGtleQorICAgICAgQHBhcmFtIGtleWxlbiAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGtleSAob2N0ZXRzKQorICAgICAgQHBhcmFtIG51bV9yb3VuZHMgIFRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHJvdW5kcyAoMD09ZGVmYXVsdCkKKyAgICAgIEBwYXJhbSBza2V5ICAgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIHNjaGVkdWxlZCBrZXkKKyAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICAgKi8KKyAgIGludCAgKCpzZXR1cCkoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCAKKyAgICAgICAgICAgICAgICAgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOworICAgLyoqIEVuY3J5cHQgYSBibG9jaworICAgICAgQHBhcmFtIHB0ICAgICAgVGhlIHBsYWludGV4dAorICAgICAgQHBhcmFtIGN0ICAgICAgW291dF0gVGhlIGNpcGhlcnRleHQKKyAgICAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5CisgICAqLworICAgdm9pZCAoKmVjYl9lbmNyeXB0KShjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKyAgIC8qKiBEZWNyeXB0IGEgYmxvY2sKKyAgICAgIEBwYXJhbSBjdCAgICAgIFRoZSBjaXBoZXJ0ZXh0CisgICAgICBAcGFyYW0gcHQgICAgICBbb3V0XSBUaGUgcGxhaW50ZXh0CisgICAgICBAcGFyYW0gc2tleSAgICBUaGUgc2NoZWR1bGVkIGtleQorICAgKi8KKyAgIHZvaWQgKCplY2JfZGVjcnlwdCkoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSk7CisgICAvKiogVGVzdCB0aGUgYmxvY2sgY2lwaGVyCisgICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0aW5nIGhhcyBiZWVuIGRpc2FibGVkCisgICAqLworICAgaW50ICgqdGVzdCkodm9pZCk7CisgICAvKiogRGV0ZXJtaW5lIGEga2V5IHNpemUKKyAgICAgICBAcGFyYW0ga2V5c2l6ZSAgICBbaW4vb3V0XSBUaGUgc2l6ZSBvZiB0aGUga2V5IGRlc2lyZWQgYW5kIHRoZSBzdWdnZXN0ZWQgc2l6ZQorICAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICAgKi8KKyAgIGludCAgKCprZXlzaXplKShpbnQgKmtleXNpemUpOworCisvKiogQWNjZWxlcmF0b3JzICoqLworICAgLyoqIEFjY2VsZXJhdGVkIEVDQiBlbmNyeXB0aW9uIAorICAgICAgIEBwYXJhbSBwdCAgICAgIFBsYWludGV4dAorICAgICAgIEBwYXJhbSBjdCAgICAgIENpcGhlcnRleHQKKyAgICAgICBAcGFyYW0gYmxvY2tzICBUaGUgbnVtYmVyIG9mIGNvbXBsZXRlIGJsb2NrcyB0byBwcm9jZXNzCisgICAgICAgQHBhcmFtIHNrZXkgICAgVGhlIHNjaGVkdWxlZCBrZXkgY29udGV4dAorICAgKi8KKyAgIHZvaWQgKCphY2NlbF9lY2JfZW5jcnlwdCkoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgbG9uZyBibG9ja3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKworICAgLyoqIEFjY2VsZXJhdGVkIEVDQiBkZWNyeXB0aW9uIAorICAgICAgIEBwYXJhbSBwdCAgICAgIFBsYWludGV4dAorICAgICAgIEBwYXJhbSBjdCAgICAgIENpcGhlcnRleHQKKyAgICAgICBAcGFyYW0gYmxvY2tzICBUaGUgbnVtYmVyIG9mIGNvbXBsZXRlIGJsb2NrcyB0byBwcm9jZXNzCisgICAgICAgQHBhcmFtIHNrZXkgICAgVGhlIHNjaGVkdWxlZCBrZXkgY29udGV4dAorICAgKi8KKyAgIHZvaWQgKCphY2NlbF9lY2JfZGVjcnlwdCkoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgbG9uZyBibG9ja3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKworICAgLyoqIEFjY2VsZXJhdGVkIENCQyBlbmNyeXB0aW9uIAorICAgICAgIEBwYXJhbSBwdCAgICAgIFBsYWludGV4dAorICAgICAgIEBwYXJhbSBjdCAgICAgIENpcGhlcnRleHQKKyAgICAgICBAcGFyYW0gYmxvY2tzICBUaGUgbnVtYmVyIG9mIGNvbXBsZXRlIGJsb2NrcyB0byBwcm9jZXNzCisgICAgICAgQHBhcmFtIElWICAgICAgVGhlIGluaXRpYWwgdmFsdWUgKGlucHV0L291dHB1dCkKKyAgICAgICBAcGFyYW0gc2tleSAgICBUaGUgc2NoZWR1bGVkIGtleSBjb250ZXh0CisgICAqLworICAgdm9pZCAoKmFjY2VsX2NiY19lbmNyeXB0KShjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBsb25nIGJsb2NrcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKklWLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKworICAgLyoqIEFjY2VsZXJhdGVkIENCQyBkZWNyeXB0aW9uIAorICAgICAgIEBwYXJhbSBwdCAgICAgIFBsYWludGV4dAorICAgICAgIEBwYXJhbSBjdCAgICAgIENpcGhlcnRleHQKKyAgICAgICBAcGFyYW0gYmxvY2tzICBUaGUgbnVtYmVyIG9mIGNvbXBsZXRlIGJsb2NrcyB0byBwcm9jZXNzCisgICAgICAgQHBhcmFtIElWICAgICAgVGhlIGluaXRpYWwgdmFsdWUgKGlucHV0L291dHB1dCkKKyAgICAgICBAcGFyYW0gc2tleSAgICBUaGUgc2NoZWR1bGVkIGtleSBjb250ZXh0CisgICAqLworICAgdm9pZCAoKmFjY2VsX2NiY19kZWNyeXB0KShjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBsb25nIGJsb2NrcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKklWLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKworICAgLyoqIEFjY2VsZXJhdGVkIENUUiBlbmNyeXB0aW9uIAorICAgICAgIEBwYXJhbSBwdCAgICAgIFBsYWludGV4dAorICAgICAgIEBwYXJhbSBjdCAgICAgIENpcGhlcnRleHQKKyAgICAgICBAcGFyYW0gYmxvY2tzICBUaGUgbnVtYmVyIG9mIGNvbXBsZXRlIGJsb2NrcyB0byBwcm9jZXNzCisgICAgICAgQHBhcmFtIElWICAgICAgVGhlIGluaXRpYWwgdmFsdWUgKGlucHV0L291dHB1dCkKKyAgICAgICBAcGFyYW0gbW9kZSAgICBsaXR0bGUgb3IgYmlnIGVuZGlhbiBjb3VudGVyIChtb2RlPTAgb3IgbW9kZT0xKQorICAgICAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5IGNvbnRleHQKKyAgICovCisgICB2b2lkICgqYWNjZWxfY3RyX2VuY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGxvbmcgYmxvY2tzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqSVYsIGludCBtb2RlLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKworICAgLyoqIEFjY2VsZXJhdGVkIENDTSBwYWNrZXQgKG9uZS1zaG90KQorICAgICAgIEBwYXJhbSBrZXkgICAgICAgIFRoZSBzZWNyZXQga2V5IHRvIHVzZQorICAgICAgIEBwYXJhbSBrZXlsZW4gICAgIFRoZSBsZW5ndGggb2YgdGhlIHNlY3JldCBrZXkgKG9jdGV0cykKKyAgICAgICBAcGFyYW0gbm9uY2UgICAgICBUaGUgc2Vzc2lvbiBub25jZSBbdXNlIG9uY2VdCisgICAgICAgQHBhcmFtIG5vbmNlbGVuICAgVGhlIGxlbmd0aCBvZiB0aGUgbm9uY2UKKyAgICAgICBAcGFyYW0gaGVhZGVyICAgICBUaGUgaGVhZGVyIGZvciB0aGUgc2Vzc2lvbgorICAgICAgIEBwYXJhbSBoZWFkZXJsZW4gIFRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciAob2N0ZXRzKQorICAgICAgIEBwYXJhbSBwdCAgICAgICAgIFtvdXRdIFRoZSBwbGFpbnRleHQKKyAgICAgICBAcGFyYW0gcHRsZW4gICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgKG9jdGV0cykKKyAgICAgICBAcGFyYW0gY3QgICAgICAgICBbb3V0XSBUaGUgY2lwaGVydGV4dAorICAgICAgIEBwYXJhbSB0YWcgICAgICAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiB0YWcKKyAgICAgICBAcGFyYW0gdGFnbGVuICAgICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcKKyAgICAgICBAcGFyYW0gZGlyZWN0aW9uICBFbmNyeXB0IG9yIERlY3J5cHQgZGlyZWN0aW9uICgwIG9yIDEpCisgICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgICAqLworICAgdm9pZCAoKmFjY2VsX2NjbV9tZW1vcnkpKAorICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbm9uY2UsICB1bnNpZ25lZCBsb25nIG5vbmNlbGVuLAorICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBoZWFkZXJsZW4sCisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsICAgICB1bnNpZ25lZCBsb25nIHB0bGVuLAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhZywgICAgdW5zaWduZWQgbG9uZyAqdGFnbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGRpcmVjdGlvbik7CisKKyAgIC8qKiBBY2NlbGVyYXRlZCBHQ00gcGFja2V0IChvbmUgc2hvdCkKKyAgICAgICBAcGFyYW0ga2V5ICAgICAgICAgICAgICAgVGhlIHNlY3JldCBrZXkKKyAgICAgICBAcGFyYW0ga2V5bGVuICAgICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2VjcmV0IGtleQorICAgICAgIEBwYXJhbSBJViAgICAgICAgICAgICAgICBUaGUgaW5pdGlhbCB2ZWN0b3IgCisgICAgICAgQHBhcmFtIElWbGVuICAgICAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgdmVjdG9yCisgICAgICAgQHBhcmFtIGFkYXRhICAgICAgICAgICAgIFRoZSBhZGRpdGlvbmFsIGF1dGhlbnRpY2F0aW9uIGRhdGEgKGhlYWRlcikKKyAgICAgICBAcGFyYW0gYWRhdGFsZW4gICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgYWRhdGEKKyAgICAgICBAcGFyYW0gcHQgICAgICAgICAgICAgICAgVGhlIHBsYWludGV4dAorICAgICAgIEBwYXJhbSBwdGxlbiAgICAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgKGNpcGhlcnRleHQgbGVuZ3RoIGlzIHRoZSBzYW1lKQorICAgICAgIEBwYXJhbSBjdCAgICAgICAgICAgICAgICBUaGUgY2lwaGVydGV4dAorICAgICAgIEBwYXJhbSB0YWcgICAgICAgICAgICAgICBbb3V0XSBUaGUgTUFDIHRhZworICAgICAgIEBwYXJhbSB0YWdsZW4gICAgICAgICAgICBbaW4vb3V0XSBUaGUgTUFDIHRhZyBsZW5ndGgKKyAgICAgICBAcGFyYW0gZGlyZWN0aW9uICAgICAgICAgRW5jcnlwdCBvciBEZWNyeXB0IG1vZGUgKEdDTV9FTkNSWVBUIG9yIEdDTV9ERUNSWVBUKQorICAgKi8KKyAgIHZvaWQgKCphY2NlbF9nY21fbWVtb3J5KSgKKyAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksICAgIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKklWLCAgICAgdW5zaWduZWQgbG9uZyBJVmxlbiwKKyAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGF0YSwgIHVuc2lnbmVkIGxvbmcgYWRhdGFsZW4sCisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsICAgICB1bnNpZ25lZCBsb25nIHB0bGVuLAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LCAKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWcsICAgIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbik7CisKK307CitcZW5ke3ZlcmJhdGltfQorXGVuZHtzbWFsbH0KKworXHN1YnNlY3Rpb257TmFtZX0KK1RoZSBgYG5hbWUnJyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBjaXBoZXIuICBUaGlzIGlzIHdoYXQgYSBkZXZlbG9wZXIgd291bGQgcGFzcyB0byBmaW5kXF9jaXBoZXIoKSB0byBmaW5kIHRoZSBjaXBoZXIgaW4gdGhlIGRlc2NyaXB0b3IKK3RhYmxlcy4KKworXHN1YnNlY3Rpb257SW50ZXJuYWwgSUR9CitUaGlzIGlzIGEgc2luZ2xlIGJ5dGUgSW50ZXJuYWwgSUQgeW91IGNhbiB1c2UgdG8gZGlzdGluZ2lzaCBjaXBoZXJzIGZyb20gZWFjaCBvdGhlci4KKworXHN1YnNlY3Rpb257S2V5IExlbmd0aHN9CitUaGUgbWluaW11bSBrZXkgbGVuZ3RoIGlzIGBgbWluXF9rZXlcX2xlbmd0aCcnIGFuZCBpcyBtZWFzdXJlZCBpbiBvY3RldHMuICBTaW1pbGFybHkgdGhlIG1heGltdW0ga2V5IGxlbmd0aCBpcyBgYG1heFxfa2V5XF9sZW5ndGgnJy4gIFRoZXkgY2FuIGJlIGVxdWFsCithbmQgYm90aCBtdXN0IHZhbGlkIGtleSBzaXplcyBmb3IgdGhlIGNpcGhlci4gIFZhbHVlcyBpbiBiZXR3ZWVuIGFyZSBub3QgYXNzdW1lZCB0byBiZSB2YWxpZCB0aG91Z2ggdGhleSBtYXkgYmUuCisKK1xzdWJzZWN0aW9ue0Jsb2NrIExlbmd0aH0KK1RoZSBzaXplIG9mIHRoZSBjaXBoZXJzIHBsYWludGV4dCBvciBjaXBoZXJ0ZXh0IGlzIGBgYmxvY2tcX2xlbmd0aCcnIGFuZCBpcyBtZWFzdXJlZCBpbiBvY3RldHMuCisKK1xzdWJzZWN0aW9ue1JvdW5kc30KK1NvbWUgY2lwaGVycyBhbGxvdyBkaWZmZXJlbnQgbnVtYmVyIG9mIHJvdW5kcyB0byBiZSB1c2VkLiAgVXN1YWxseSB5b3UganVzdCB1c2UgdGhlIGRlZmF1bHQuICBUaGUgZGVmYXVsdCByb3VuZCBjb3VudCBpcyBgYGRlZmF1bHRcX3JvdW5kcycnLgorCitcc3Vic2VjdGlvbntTZXR1cH0KK1RvIGluaXRpYWxpemUgYSBjaXBoZXIgKGZvciBFQ0IgbW9kZSkgdGhlIGZ1bmN0aW9uIHNldHVwKCkgd2FzIHByb3ZpZGVkLiAgSXQgYWNjZXB0cyBhbiBhcnJheSBvZiBrZXkgb2N0ZXRzIGBga2V5Jycgb2YgbGVuZ3RoIGBga2V5bGVuJycgb2N0ZXRzLiAgVGhlIHVzZXIKK2NhbiBzcGVjaWZ5IHRoZSBudW1iZXIgb2Ygcm91bmRzIHRoZXkgd2FudCB0aHJvdWdoIGBgbnVtXF9yb3VuZHMnJyB3aGVyZSAkbnVtXF9yb3VuZHMgPSAwJCBtZWFucyB1c2UgdGhlIGRlZmF1bHQuICBUaGUgZGVzdGluYXRpb24gb2YgYSBzY2hlZHVsZWQga2V5IGlzIHN0b3JlZAoraW4gYGBza2V5JycuCisKK0luc2lkZSB0aGUgYGBzeW1tZXRyaWNcX2tleScnIHVuaW9uIHRoZXJlIGlzIGEgYGB2b2lkICpkYXRhJycgd2hpY2ggeW91IGNhbiB1c2UgdG8gYWxsb2NhdGUgZGF0YSBpZiB5b3UgbmVlZCBhIGRhdGEgc3RydWN0dXJlIHRoYXQgZG9lc24ndCBmaXQgd2l0aCB0aGUgZXhpc3RpbmcKK29uZXMgcHJvdmlkZWQuICBKdXN0IG1ha2Ugc3VyZSBpbiB5b3VyIGBgZG9uZSgpJycgZnVuY3Rpb24gdGhhdCB5b3UgZnJlZSB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKworXHN1YnNlY3Rpb257U2luZ2xlIGJsb2NrIEVDQn0KK1RvIHByb2Nlc3MgYSBzaW5nbGUgYmxvY2sgaW4gRUNCIG1vZGUgdGhlIGVjYlxfZW5jcnlwdCgpIGFuZCBlY2JcX2RlY3J5cHQoKSBmdW5jdGlvbnMgd2VyZSBwcm92aWRlZC4gIFRoZSBwbGFpbnRleHQgYW5kIGNpcGhlcnRleHQgYnVmZmVycyBhcmUgYWxsb3dlZCB0byBvdmVybGFwIHNvIHlvdSAKK211c3QgbWFrZSBzdXJlIHlvdSBkbyBub3Qgb3ZlcndyaXRlIHRoZSBvdXRwdXQgYmVmb3JlIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGUgaW5wdXQuCisKK1xzdWJzZWN0aW9ue1Rlc3Rpbmd9CitUaGUgdGVzdCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VsZi0tdGVzdCB0aGUgYGBkZXZpY2UnJy4gIEl0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBcdGV4dGJme0NSWVBUXF9PS30gaWYgYWxsIGlzIHdvcmtpbmcgcHJvcGVybHkuCisKK1xzdWJzZWN0aW9ue0tleSBTaXppbmd9CitPY2Nhc2lvbmFsbHkgYSBmdW5jdGlvbiB3aWxsIHdhbnQgdG8gZmluZCBhIHN1aXRhYmxlIGtleSBzaXplIHRvIHVzZSBzaW5jZSB0aGUgaW5wdXQgaXMgb2RkbHkgc2l6ZWQuICBUaGUga2V5c2l6ZSgpIGZ1bmN0aW9uIGlzIGZvciB0aGlzIGNhc2UuICBJdCBhY2NlcHRzIGEgCitwb2ludGVyIHRvIGFuIGludGVnZXIgd2hpY2ggcmVwcmVzZW50cyB0aGUgZGVzaXJlZCBzaXplLiAgVGhlIGZ1bmN0aW9uIHRoZW4gaGFzIHRvIG1hdGNoIGl0IHRvIHRoZSBleGFjdCBvciBhIGxvd2VyIGtleSBzaXplIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSBjaXBoZXIuICBGb3IKK2V4YW1wbGUsIGlmIHRoZSBpbnB1dCBpcyAkMjUkIGFuZCAkMjQkIGlzIHZhbGlkIHRoZW4gaXQgc3RvcmVzICQyNCQgYmFjayBpbiB0aGUgcG9pbnRlZCB0byBpbnRlZ2VyLiAgSXQgbXVzdCBub3Qgcm91bmQgdXAgYW5kIG11c3QgcmV0dXJuIGFuIGVycm9yIGlmIHRoZSBrZXlzaXplCisgY2Fubm90IGJlIG1hcHBlZCB0byBhIHZhbGlkIGtleSBzaXplIGZvciB0aGUgY2lwaGVyLgorCitcc3Vic2VjdGlvbntBY2NlbGVyYXRpb259CitUaGUgbmV4dCBzZXQgb2YgZnVuY3Rpb25zIGNvdmVyIHRoZSBhY2NlbGVyYXRlZCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBjaXBoZXIgZGVzY3JpcHRvci4gIEFueSBjb21iaW5hdGlvbiBvZiB0aGVzZSBmdW5jdGlvbnMgbWF5IGJlIHNldCB0byBcdGV4dGJme05VTEx9IHRvIGluZGljYXRlCitpdCBpcyBub3Qgc3VwcG9ydGVkLiAgSW4gdGhvc2UgY2FzZXMgdGhlIHNvZnR3YXJlIGZhbGxiYWNrcyBhcmUgdXNlZCAodXNpbmcgdGhlIHNpbmdsZSBFQ0IgYmxvY2sgcm91dGluZXMpLgorCitcc3Vic3Vic2VjdGlvbntBY2NlbGVyYXRlZCBFQ0J9CitUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSBtZWFudCBmb3IgY2FzZXMgd2hlcmUgYSB1c2VyIHdhbnRzIHRvIGVuY3J5cHQgKGluIEVDQiBtb2RlIG5vIGxlc3MpIGFuIGFycmF5IG9mIGJsb2Nrcy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYWNjZXNzZWQKK3Rocm91Z2ggdGhlIGFjY2VsXF9lY2JcX2VuY3J5cHQgYW5kIGFjY2VsXF9lY2JcX2RlY3J5cHQgcG9pbnRlcnMuICBUaGUgYGBibG9ja3MnJyBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlIGJsb2NrcyB0byBwcm9jZXNzLgorCitcc3Vic3Vic2VjdGlvbntBY2NlbGVyYXRlZCBDQkN9IAorVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgbWVhbnQgZm9yIGFjY2VsZXJhdGVkIENCQyBlbmNyeXB0aW9uLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBhY2NlbFxfY2JjXF9lbmNyeXB0IGFuZCBhY2NlbFxfY2JjXF9kZWNyeXB0IHBvaW50ZXJzLgorVGhlIGBgYmxvY2tzJycgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBjb21wbGV0ZSBibG9ja3MgdG8gcHJvY2Vzcy4gIFRoZSBgYElWJycgaXMgdGhlIENCQyBpbml0aWFsIHZlY3Rvci4gIEl0IGlzIGFuIGlucHV0IHVwb24gY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFuZCBtdXN0IGJlCit1cGRhdGVkIGJ5IHRoZSBmdW5jdGlvbiBiZWZvcmUgcmV0dXJuaW5nLiAgCisKK1xzdWJzdWJzZWN0aW9ue0FjY2VsZXJhdGVkIENUUn0KK1RoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIGFjY2VsZXJhdGVkIENUUiBlbmNyeXB0aW9uLiAgSXQgaXMgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBhY2NlbFxfY3RyXF9lbmNyeXB0IHBvaW50ZXIuCitUaGUgYGBibG9ja3MnJyB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlIGJsb2NrcyB0byBwcm9jZXNzLiAgVGhlIGBgSVYnJyBpcyB0aGUgQ1RSIGNvdW50ZXIgdmVjdG9yLiAgSXQgaXMgYW4gaW5wdXQgdXBvbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gYW5kIG11c3QgYmUKK3VwZGF0ZWQgYnkgdGhlIGZ1bmN0aW9uIGJlZm9yZSByZXR1cm5pbmcuICBUaGUgYGBtb2RlJycgdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvdW50ZXIgaXMgYmlnIChtb2RlID0gQ1RSXF9DT1VOVEVSXF9CSUdcX0VORElBTikgb3IgCitsaXR0bGUgKG1vZGUgPSBDVFJcX0NPVU5URVJcX0xJVFRMRVxfRU5ESUFOKSBlbmRpYW4uCisKK1RoaXMgZnVuY3Rpb24gKGFuZCB0aGUgd2F5IGl0J3MgY2FsbGVkKSBkaWZmZXJzIGZyb20gdGhlIG90aGVyIHR3byBzaW5jZSBjdHJcX2VuY3J5cHQoKSBhbGxvd3MgYW55IHNpemUgaW5wdXQgcGxhaW50ZXh0LiAgVGhlIGFjY2VsZXJhdG9yIHdpbGwgb25seSBiZQorY2FsbGVkIGlmIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0LgorCitcYmVnaW57ZW51bWVyYXRlfQorICAgXGl0ZW0gVGhlIGFjY2VsZXJhdG9yIGlzIHByZXNlbnQKKyAgIFxpdGVtIFRoZSBDVFIgcGFkIGlzIGVtcHR5CisgICBcaXRlbSBUaGUgcmVtYWluaW5nIGxlbmd0aCBvZiB0aGUgaW5wdXQgdG8gcHJvY2VzcyBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGJsb2NrIHNpemUuCitcZW5ke2VudW1lcmF0ZX0KKworVGhlIGBgQ1RSIHBhZCcnIGlzIGVtcHR5IHdoZW4gYSBtdWx0aXBsZSAoaW5jbHVkaW5nIHplcm8pIGJsb2NrcyBvZiB0ZXh0IGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGF0IGlzLCBpZiB5b3UgcGFzcyBpbiBzZXZlbiBieXRlcyB0byBBRVMtLUNUUiBtb2RlIHlvdSB3b3VsZCBoYXZlIHRvIAorcGFzcyBpbiBhIG1pbmltdW0gb2YgbmluZSBleHRyYSBieXRlcyBiZWZvcmUgdGhlIGFjY2VsZXJhdG9yIGNvdWxkIGJlIGNhbGxlZC4gIFRoZSBDVFIgYWNjZWxlcmF0b3IgbXVzdCBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgKGFuZCBzdG9yZSBpdCBiYWNrIGludG8gdGhlIAorYnVmZmVyIHByb3ZpZGVkKSBiZWZvcmUgZW5jcnlwdGluZyBpdCB0byBjcmVhdGUgdGhlIHBhZC4gIAorCitUaGUgYWNjZWxlcmF0b3Igd2lsbCBvbmx5IGJlIHVzZWQgdG8gZW5jcnlwdCB3aG9sZSBibG9ja3MuICBQYXJ0aWFsIGJsb2NrcyBhcmUgYWx3YXlzIGhhbmRsZWQgaW4gc29mdHdhcmUuCisKK1xzdWJzdWJzZWN0aW9ue0FjY2VsZXJhdGVkIENDTX0KK1RoaXMgZnVuY3Rpb24gaXMgbWVhbnQgZm9yIGFjY2VsZXJhdGVkIENDTSBlbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24uICBJdCBwcm9jZXNzZXMgdGhlIGVudGlyZSBwYWNrZXQgaW4gb25lIGNhbGwuICBOb3RlIHRoYXQgdGhlIHNldHVwKCkgZnVuY3Rpb24gd2lsbCBub3QKK2JlIGNhbGxlZCBwcmlvciB0byB0aGlzLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZSBzY2hlZHVsaW5nIHRoZSBrZXkgcHJvdmlkZWQgb24gaXRzIG93bi4KKworXHN1YnN1YnNlY3Rpb257QWNjZWxlcmF0ZWQgR0NNfQorVGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgYWNjZWxlcmF0ZWQgR0NNIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbi4gIEl0IHByb2Nlc3NlcyB0aGUgZW50aXJlIHBhY2tldCBpbiBvbmUgY2FsbC4gIE5vdGUgdGhhdCB0aGUgc2V0dXAoKSBmdW5jdGlvbiB3aWxsIG5vdAorYmUgY2FsbGVkIHByaW9yIHRvIHRoaXMuICBUaGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlIHNjaGVkdWxpbmcgdGhlIGtleSBwcm92aWRlZCBvbiBpdHMgb3duLgorCitcc2VjdGlvbntPbmUtLVdheSBIYXNoZXN9CitUaGUgaGFzaCBmdW5jdGlvbnMgYXJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGx0Y1xfaGFzaFxfZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisKK1xiZWdpbntzbWFsbH0KK1xiZWdpbnt2ZXJiYXRpbX0KK3N0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yIHsKKyAgICAvKiogbmFtZSBvZiBoYXNoICovCisgICAgY2hhciAqbmFtZTsKKyAgICAvKiogaW50ZXJuYWwgSUQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIElEOworICAgIC8qKiBTaXplIG9mIGRpZ2VzdCBpbiBvY3RldHMgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhhc2hzaXplOworICAgIC8qKiBJbnB1dCBibG9jayBzaXplIGluIG9jdGV0cyAqLworICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplOworICAgIC8qKiBBU04uMSBPSUQgKi8KKyAgICB1bnNpZ25lZCBsb25nIE9JRFsxNl07CisgICAgLyoqIExlbmd0aCBvZiBERVIgZW5jb2RpbmcgKi8KKyAgICB1bnNpZ25lZCBsb25nIE9JRGxlbjsKKyAgICAvKiogSW5pdCBhIGhhc2ggc3RhdGUKKyAgICAgIEBwYXJhbSBoYXNoICAgVGhlIGhhc2ggdG8gaW5pdGlhbGl6ZQorICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgICAgKi8KKyAgICBpbnQgKCppbml0KShoYXNoX3N0YXRlICpoYXNoKTsKKyAgICAvKiogUHJvY2VzcyBhIGJsb2NrIG9mIGRhdGEgCisgICAgICBAcGFyYW0gaGFzaCAgIFRoZSBoYXNoIHN0YXRlCisgICAgICBAcGFyYW0gaW4gICAgIFRoZSBkYXRhIHRvIGhhc2gKKyAgICAgIEBwYXJhbSBpbmxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAob2N0ZXRzKQorICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgICAgKi8KKyAgICBpbnQgKCpwcm9jZXNzKShoYXNoX3N0YXRlICpoYXNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CisgICAgLyoqIFByb2R1Y2UgdGhlIGRpZ2VzdCBhbmQgc3RvcmUgaXQKKyAgICAgIEBwYXJhbSBoYXNoICAgVGhlIGhhc2ggc3RhdGUKKyAgICAgIEBwYXJhbSBvdXQgICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBkaWdlc3QKKyAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICAgICovCisgICAgaW50ICgqZG9uZSkoaGFzaF9zdGF0ZSAqaGFzaCwgdW5zaWduZWQgY2hhciAqb3V0KTsKKyAgICAvKiogU2VsZi10ZXN0CisgICAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3RzIGhhdmUgYmVlbiBkaXNhYmxlZAorICAgICovCisgICAgaW50ICgqdGVzdCkodm9pZCk7Cit9OworXGVuZHt2ZXJiYXRpbX0KK1xlbmR7c21hbGx9CisKK1xzdWJzZWN0aW9ue05hbWV9CitUaGlzIGlzIHRoZSBuYW1lIHRoZSBoYXNoIGlzIGtub3duIGJ5IGFuZCB3aGF0IGZpbmRcX2hhc2goKSB3aWxsIGxvb2sgZm9yLgorCitcc3Vic2VjdGlvbntJbnRlcm5hbCBJRH0KK1RoaXMgaXMgdGhlIGludGVybmFsIElEIGJ5dGUgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGUgaGFzaCBmcm9tIG90aGVyIGhhc2hlcy4KKworXHN1YnNlY3Rpb257RGlnZXN0IFNpemV9CitUaGUgYGBoYXNoc2l6ZScnIHZhcmlhYmxlIGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgaW4gb2N0ZXRzLgorCitcc3Vic2VjdGlvbntCbG9jayBTaXplfQorVGhlIGBibG9ja3NpemUnJyB2YXJpYWJsZSBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiBpbnB1dCAoaW4gb2N0ZXRzKSB0aGF0IHRoZSBoYXNoIHByb2Nlc3NlcyBpbiBhIGdpdmVuCitpbnZva2F0aW9uLgorCitcc3Vic2VjdGlvbntPSUQgSWRlbnRpZmllcn0KK1RoaXMgaXMgdGhlIHVuaXZlcnNhbCBBU04uMSBPYmplY3QgSWRlbnRpZmllciBmb3IgdGhlIGhhc2guCisKK1xzdWJzZWN0aW9ue0luaXRpYWxpemF0aW9ufQorVGhlIGluaXQgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGhhc2ggYW5kIHByZXBhcmVzIGl0IHRvIHByb2Nlc3MgbWVzc2FnZSBieXRlcy4KKworXHN1YnNlY3Rpb257UHJvY2Vzc30KK1RoaXMgcHJvY2Vzc2VzIG1lc3NhZ2UgYnl0ZXMuICBUaGUgYWxnb3JpdGhtIG11c3QgYWNjZXB0IGFueSBsZW5ndGggb2YgaW5wdXQgdGhhdCB0aGUgaGFzaCB3b3VsZCBhbGxvdy4gIFRoZSBpbnB1dCBpcyBub3QKK2d1YXJhbnRlZWQgdG8gYmUgYSBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZSBpbiBsZW5ndGguCisKK1xzdWJzZWN0aW9ue0RvbmV9CitUaGUgZG9uZSBmdW5jdGlvbiB0ZXJtaW5hdGVzIHRoZSBoYXNoIGFuZCByZXR1cm5zIHRoZSBtZXNzYWdlIGRpZ2VzdC4KKworXHN1YnNlY3Rpb257QWNjZWxlcmF0aW9ufQorQSBjb21wYXRpYmxlIGFjY2VsZXJhdG9yIG11c3QgYWxsb3cgcHJvY2Vzc2luZyBkYXRhIGluIGFueSBncmFudWxhcml0eSB3aGljaCBtYXkgcmVxdWlyZSBpbnRlcm5hbCBwYWRkaW5nIG9uIHRoZSBkcml2ZXIgc2lkZS4gIAorCitcc2VjdGlvbntQc2V1ZG8tLVJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yc30KK1RoZSBwc2V1ZG8tLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBsdGNcX3BybmdcX2Rlc2NyaXB0b3Igc3RydWN0dXJlLgorCitcYmVnaW57c21hbGx9CitcYmVnaW57dmVyYmF0aW19CitzdHJ1Y3QgbHRjX3BybmdfZGVzY3JpcHRvciB7CisgICAgLyoqIE5hbWUgb2YgdGhlIFBSTkcgKi8KKyAgICBjaGFyICpuYW1lOworICAgIC8qKiBzaXplIGluIGJ5dGVzIG9mIGV4cG9ydGVkIHN0YXRlICovCisgICAgaW50ICBleHBvcnRfc2l6ZTsKKyAgICAvKiogU3RhcnQgYSBQUk5HIHN0YXRlCisgICAgICAgIEBwYXJhbSBwcm5nICAgW291dF0gVGhlIHN0YXRlIHRvIGluaXRpYWxpemUKKyAgICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgICAgKi8KKyAgICBpbnQgKCpzdGFydCkocHJuZ19zdGF0ZSAqcHJuZyk7CisgICAgLyoqIEFkZCBlbnRyb3B5IHRvIHRoZSBQUk5HCisgICAgICAgIEBwYXJhbSBpbiAgICAgICAgIFRoZSBlbnRyb3B5CisgICAgICAgIEBwYXJhbSBpbmxlbiAgICAgIExlbmd0aCBvZiB0aGUgZW50cm9weSAob2N0ZXRzKVwKKyAgICAgICAgQHBhcmFtIHBybmcgICAgICAgVGhlIFBSTkcgc3RhdGUKKyAgICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgICAgKi8KKyAgICBpbnQgKCphZGRfZW50cm9weSkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBybmdfc3RhdGUgKnBybmcpOworICAgIC8qKiBSZWFkeSBhIFBSTkcgc3RhdGUgdG8gcmVhZCBmcm9tCisgICAgICAgIEBwYXJhbSBwcm5nICAgICAgIFRoZSBQUk5HIHN0YXRlIHRvIHJlYWR5CisgICAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICAgICovCisgICAgaW50ICgqcmVhZHkpKHBybmdfc3RhdGUgKnBybmcpOworICAgIC8qKiBSZWFkIGZyb20gdGhlIFBSTkcKKyAgICAgICAgQHBhcmFtIG91dCAgICAgW291dF0gV2hlcmUgdG8gc3RvcmUgdGhlIGRhdGEKKyAgICAgICAgQHBhcmFtIG91dGxlbiAgTGVuZ3RoIG9mIGRhdGEgZGVzaXJlZCAob2N0ZXRzKQorICAgICAgICBAcGFyYW0gcHJuZyAgICBUaGUgUFJORyBzdGF0ZSB0byByZWFkIGZyb20KKyAgICAgICAgQHJldHVybiBOdW1iZXIgb2Ygb2N0ZXRzIHJlYWQKKyAgICAqLworICAgIHVuc2lnbmVkIGxvbmcgKCpyZWFkKSh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgb3V0bGVuLCBwcm5nX3N0YXRlICpwcm5nKTsKKyAgICAvKiogVGVybWluYXRlIGEgUFJORyBzdGF0ZQorICAgICAgICBAcGFyYW0gcHJuZyAgIFRoZSBQUk5HIHN0YXRlIHRvIHRlcm1pbmF0ZQorICAgICAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAgICAqLworICAgIGludCAoKmRvbmUpKHBybmdfc3RhdGUgKnBybmcpOworICAgIC8qKiBFeHBvcnQgYSBQUk5HIHN0YXRlICAKKyAgICAgICAgQHBhcmFtIG91dCAgICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgc3RhdGUKKyAgICAgICAgQHBhcmFtIG91dGxlbiAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgUFJORyBzdGF0ZQorICAgICAgICBAcGFyYW0gcHJuZyAgICBUaGUgUFJORyB0byBleHBvcnQKKyAgICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgICAgKi8KKyAgICBpbnQgKCpwZXhwb3J0KSh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7CisgICAgLyoqIEltcG9ydCBhIFBSTkcgc3RhdGUKKyAgICAgICAgQHBhcmFtIGluICAgICAgVGhlIGRhdGEgdG8gaW1wb3J0CisgICAgICAgIEBwYXJhbSBpbmxlbiAgIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gaW1wb3J0IChvY3RldHMpCisgICAgICAgIEBwYXJhbSBwcm5nICAgIFRoZSBQUk5HIHRvIGluaXRpYWxpemUvaW1wb3J0CisgICAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICAgICovCisgICAgaW50ICgqcGltcG9ydCkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBybmdfc3RhdGUgKnBybmcpOworICAgIC8qKiBTZWxmLXRlc3QgdGhlIFBSTkcKKyAgICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0aW5nIGhhcyBiZWVuIGRpc2FibGVkCisgICAgKi8KKyAgICBpbnQgKCp0ZXN0KSh2b2lkKTsKK307CitcZW5ke3ZlcmJhdGltfQorXGVuZHtzbWFsbH0KKworXHN1YnNlY3Rpb257TmFtZX0KK1RoZSBuYW1lIGJ5IHdoaWNoIGZpbmRcX3BybmcoKSB3aWxsIGZpbmQgdGhlIFBSTkcuCisKK1xzdWJzZWN0aW9ue0V4cG9ydCBTaXplfQorV2hlbiBhbiBQUk5HIHN0YXRlIGlzIHRvIGJlIGV4cG9ydGVkIGZvciBmdXR1cmUgdXNlIHlvdSBzcGVjaWZ5IHRoZSBzcGFjZSByZXF1aXJlZCBpbiB0aGlzIHZhcmlhYmxlLgorCitcc3Vic2VjdGlvbntTdGFydH0KK0luaXRpYWxpemUgdGhlIFBSTkcgYW5kIG1ha2UgaXQgcmVhZHkgdG8gYWNjZXB0IGVudHJvcHkuCisKK1xzdWJzZWN0aW9ue0VudHJvcHkgQWRkaXRpb259CitBZGQgZW50cm9weSB0byB0aGUgUFJORyBzdGF0ZS4gIFRoZSBleGFjdCBiZWhhdmlvdXIgb2YgdGhpcyBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSBwYXJ0aWN1bGFycyBvZiB0aGUgUFJORy4KKworXHN1YnNlY3Rpb257UmVhZHl9CitUaGlzIGZ1bmN0aW9uIG1ha2VzIHRoZSBQUk5HIHJlYWR5IHRvIHJlYWQgZnJvbSBieSBwcm9jZXNzaW5nIHRoZSBlbnRyb3B5IGFkZGVkLiAgVGhlIGJlaGF2aW91ciBvZiB0aGlzIGZ1bmN0aW9uIGRlcGVuZHMKK29uIHRoZSBzcGVjaWZpYyBQUk5HIHVzZWQuCisKK1xzdWJzZWN0aW9ue1JlYWR9CitSZWFkIGZyb20gdGhlIFBSTkcgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gZmlsbCB0aGUgYnVmZmVyIGJ1dCBpdCBpcyBiZXN0IAoraWYgaXQgZG9lcyBhcyBtYW55IHByb3RvY29scyBkbyBub3QgcmV0cnkgcmVhZHMgYW5kIHdpbGwgZmFpbCBvbiB0aGUgZmlyc3QgdHJ5LgorCitcc3Vic2VjdGlvbntEb25lfQorVGVybWluYXRlIGEgUFJORyBzdGF0ZS4gIFRoZSBiZWhhdmlvdXIgb2YgdGhpcyBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSBwYXJ0aWN1bGFyIFBSTkcgdXNlZC4KKworXHN1YnNlY3Rpb257RXhwb3J0aW5nIGFuZCBJbXBvcnRpbmd9CitBbiBleHBvcnRlZCBQUk5HIHN0YXRlIGlzIGRhdGEgdGhhdCB0aGUgUFJORyBjYW4gbGF0ZXIgaW1wb3J0IHRvIHJlc3VtZSBhY3Rpdml0eS4gIFRoZXkncmUgbm90IG1lYW50IHRvIHJlc3VtZSBgYHRoZSBzYW1lIHNlc3Npb24nJworYnV0IHNob3VsZCBhdCBsZWFzdCBtYWludGFpbiB0aGUgc2FtZSBsZXZlbCBvZiBzdGF0ZSBlbnRyb3B5LgorCiBcaW5wdXR7Y3J5cHQuaW5kfQogCiBcZW5ke2RvY3VtZW50fQorCislICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L2NyeXB0LnRleCx2ICQgICAKKyUgJFJldmlzaW9uOiAxLjM5ICQgICAKKyUgJERhdGU6IDIwMDUvMDYvMjcgMTM6MDg6MjggJCAKZGlmZiAtLWdpdCBhL2NyeXB0X2FyZ2Noay5jIGIvY3J5cHRfYXJnY2hrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYjczYTAuLjAwMDAwMDAKLS0tIGEvY3J5cHRfYXJnY2hrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpZiAoQVJHVFlQRSA9PSAwKQotdm9pZCBjcnlwdF9hcmdjaGsoY2hhciAqdiwgY2hhciAqcywgaW50IGQpCi17Ci0gZnByaW50ZihzdGRlcnIsICJfQVJHQ0hLICclcycgZmFpbHVyZSBvbiBsaW5lICVkIG9mIGZpbGUgJXNcbiIsCi0gICAgICAgICB2LCBkLCBzKTsKLSAodm9pZClyYWlzZShTSUdBQlJUKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY3J5cHRfY2lwaGVyX2Rlc2NyaXB0b3IuYyBiL2NyeXB0X2NpcGhlcl9kZXNjcmlwdG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMDNlYTAuLjAwMDAwMDAKLS0tIGEvY3J5cHRfY2lwaGVyX2Rlc2NyaXB0b3IuYworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciBjaXBoZXJfZGVzY3JpcHRvcltUQUJfU0laRV0gPSB7Ci17IE5VTEwsIDAsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSwKLXsgTlVMTCwgMCwgMCwgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9LAoteyBOVUxMLCAwLCAwLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0sCi17IE5VTEwsIDAsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9OwotCmRpZmYgLS1naXQgYS9jcnlwdF9jaXBoZXJfaXNfdmFsaWQuYyBiL2NyeXB0X2NpcGhlcl9pc192YWxpZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjBjNDQ4Li4wMDAwMDAwCi0tLSBhL2NyeXB0X2NpcGhlcl9pc192YWxpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi1pbnQgY2lwaGVyX2lzX3ZhbGlkKGludCBpZHgpCi17Ci0gICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gVEFCX1NJWkUgfHwgY2lwaGVyX2Rlc2NyaXB0b3JbaWR4XS5uYW1lID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0NJUEhFUjsKLSAgIH0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KZGlmZiAtLWdpdCBhL2NyeXB0X2ZpbmRfY2lwaGVyLmMgYi9jcnlwdF9maW5kX2NpcGhlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE4OGM3Li4wMDAwMDAwCi0tLSBhL2NyeXB0X2ZpbmRfY2lwaGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLWludCBmaW5kX2NpcGhlcihjb25zdCBjaGFyICpuYW1lKQotewotICAgaW50IHg7Ci0gICBfQVJHQ0hLKG5hbWUgIT0gTlVMTCk7Ci0gICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgewotICAgICAgIGlmIChjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEwgJiYgIXN0cmNtcChjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lLCBuYW1lKSkgewotICAgICAgICAgIHJldHVybiB4OwotICAgICAgIH0KLSAgIH0KLSAgIHJldHVybiAtMTsKLX0KLQpkaWZmIC0tZ2l0IGEvY3J5cHRfZmluZF9jaXBoZXJfYW55LmMgYi9jcnlwdF9maW5kX2NpcGhlcl9hbnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjMzNiZS4uMDAwMDAwMAotLS0gYS9jcnlwdF9maW5kX2NpcGhlcl9hbnkuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotLyogaWRlYSBmcm9tIFdheW5lIFNjb3R0ICovCi1pbnQgZmluZF9jaXBoZXJfYW55KGNvbnN0IGNoYXIgKm5hbWUsIGludCBibG9ja2xlbiwgaW50IGtleWxlbikKLXsKLSAgIGludCB4OwotCi0gICBfQVJHQ0hLKG5hbWUgIT0gTlVMTCk7Ci0KLSAgIHggPSBmaW5kX2NpcGhlcihuYW1lKTsKLSAgIGlmICh4ICE9IC0xKSByZXR1cm4geDsKLQotICAgZm9yICh4ID0gMDsgeCA8IFRBQl9TSVpFOyB4KyspIHsKLSAgICAgICBpZiAoY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgfQotICAgICAgIGlmIChibG9ja2xlbiA8PSAoaW50KWNpcGhlcl9kZXNjcmlwdG9yW3hdLmJsb2NrX2xlbmd0aCAmJiBrZXlsZW4gPD0gKGludCljaXBoZXJfZGVzY3JpcHRvclt4XS5tYXhfa2V5X2xlbmd0aCkgewotICAgICAgICAgIHJldHVybiB4OwotICAgICAgIH0KLSAgIH0KLSAgIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2NyeXB0X2ZpbmRfY2lwaGVyX2lkLmMgYi9jcnlwdF9maW5kX2NpcGhlcl9pZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWIxOWQ1Li4wMDAwMDAwCi0tLSBhL2NyeXB0X2ZpbmRfY2lwaGVyX2lkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLWludCBmaW5kX2NpcGhlcl9pZCh1bnNpZ25lZCBjaGFyIElEKQotewotICAgaW50IHg7Ci0gICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgewotICAgICAgIGlmIChjaXBoZXJfZGVzY3JpcHRvclt4XS5JRCA9PSBJRCkgewotICAgICAgICAgIHJldHVybiAoY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSA9PSBOVUxMKSA/IC0xIDogeDsKLSAgICAgICB9Ci0gICB9Ci0gICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9jcnlwdF9maW5kX2hhc2guYyBiL2NyeXB0X2ZpbmRfaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDIyMjMzLi4wMDAwMDAwCi0tLSBhL2NyeXB0X2ZpbmRfaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi1pbnQgZmluZF9oYXNoKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICBpbnQgeDsKLSAgIF9BUkdDSEsobmFtZSAhPSBOVUxMKTsKLSAgIGZvciAoeCA9IDA7IHggPCBUQUJfU0laRTsgeCsrKSB7Ci0gICAgICAgaWYgKGhhc2hfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEwgJiYgc3RyY21wKGhhc2hfZGVzY3JpcHRvclt4XS5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgfQotICAgfQotICAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvY3J5cHRfZmluZF9oYXNoX2FueS5jIGIvY3J5cHRfZmluZF9oYXNoX2FueS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjM1MjUyLi4wMDAwMDAwCi0tLSBhL2NyeXB0X2ZpbmRfaGFzaF9hbnkuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotLyogcmV0dXJuIGZpcnN0IGhhc2ggd2l0aCBhdCBsZWFzdCBbYW1vdW50IG92ZXJdIGRpZ2VzdGxlbiBieXRlcyBvZiBvdXRwdXQgKi8KLWludCBmaW5kX2hhc2hfYW55KGNvbnN0IGNoYXIgKm5hbWUsIGludCBkaWdlc3RsZW4pCi17Ci0gICBpbnQgeCwgeSwgejsKLSAgIF9BUkdDSEsobmFtZSAhPSBOVUxMKTsKLQotICAgeCA9IGZpbmRfaGFzaChuYW1lKTsKLSAgIGlmICh4ICE9IC0xKSByZXR1cm4geDsKLQotICAgeSA9IE1BWEJMT0NLU0laRSsxOwotICAgeiA9IC0xOwotICAgZm9yICh4ID0gMDsgeCA8IFRBQl9TSVpFOyB4KyspIHsKLSAgICAgICBpZiAoaGFzaF9kZXNjcmlwdG9yW3hdLm5hbWUgPT0gTlVMTCkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgIH0KLSAgICAgICBpZiAoKGludCloYXNoX2Rlc2NyaXB0b3JbeF0uaGFzaHNpemUgPj0gZGlnZXN0bGVuICYmIChpbnQpaGFzaF9kZXNjcmlwdG9yW3hdLmhhc2hzaXplIDwgeSkgewotICAgICAgICAgIHogPSB4OwotICAgICAgICAgIHkgPSBoYXNoX2Rlc2NyaXB0b3JbeF0uaGFzaHNpemU7Ci0gICAgICAgfQotICAgfQotICAgcmV0dXJuIHo7Ci19CmRpZmYgLS1naXQgYS9jcnlwdF9maW5kX2hhc2hfaWQuYyBiL2NyeXB0X2ZpbmRfaGFzaF9pZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjA0YWVhLi4wMDAwMDAwCi0tLSBhL2NyeXB0X2ZpbmRfaGFzaF9pZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi1pbnQgZmluZF9oYXNoX2lkKHVuc2lnbmVkIGNoYXIgSUQpCi17Ci0gICBpbnQgeDsKLSAgIGZvciAoeCA9IDA7IHggPCBUQUJfU0laRTsgeCsrKSB7Ci0gICAgICAgaWYgKGhhc2hfZGVzY3JpcHRvclt4XS5JRCA9PSBJRCkgewotICAgICAgICAgIHJldHVybiAoaGFzaF9kZXNjcmlwdG9yW3hdLm5hbWUgPT0gTlVMTCkgPyAtMSA6IHg7Ci0gICAgICAgfQotICAgfQotICAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvY3J5cHRfZmluZF9wcm5nLmMgYi9jcnlwdF9maW5kX3BybmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjNGU0NS4uMDAwMDAwMAotLS0gYS9jcnlwdF9maW5kX3BybmcuYworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotaW50IGZpbmRfcHJuZyhjb25zdCBjaGFyICpuYW1lKQotewotICAgaW50IHg7Ci0gICBfQVJHQ0hLKG5hbWUgIT0gTlVMTCk7Ci0gICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgewotICAgICAgIGlmICgocHJuZ19kZXNjcmlwdG9yW3hdLm5hbWUgIT0gTlVMTCkgJiYgc3RyY21wKHBybmdfZGVzY3JpcHRvclt4XS5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgfQotICAgfQotICAgcmV0dXJuIC0xOwotfQotCmRpZmYgLS1naXQgYS9jcnlwdF9oYXNoX2Rlc2NyaXB0b3IuYyBiL2NyeXB0X2hhc2hfZGVzY3JpcHRvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTdkZTM4Li4wMDAwMDAwCi0tLSBhL2NyeXB0X2hhc2hfZGVzY3JpcHRvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi1zdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvciBoYXNoX2Rlc2NyaXB0b3JbVEFCX1NJWkVdID0gewoteyBOVUxMLCAwLCAwLCAwLCB7IDB4MDAgfSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9LAoteyBOVUxMLCAwLCAwLCAwLCB7IDB4MDAgfSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9LAoteyBOVUxMLCAwLCAwLCAwLCB7IDB4MDAgfSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9LAoteyBOVUxMLCAwLCAwLCAwLCB7IDB4MDAgfSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9IH07CmRpZmYgLS1naXQgYS9jcnlwdF9oYXNoX2lzX3ZhbGlkLmMgYi9jcnlwdF9oYXNoX2lzX3ZhbGlkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjRlNTkuLjAwMDAwMDAKLS0tIGEvY3J5cHRfaGFzaF9pc192YWxpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi1pbnQgaGFzaF9pc192YWxpZChpbnQgaWR4KQotewotICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IFRBQl9TSVpFIHx8IGhhc2hfZGVzY3JpcHRvcltpZHhdLm5hbWUgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfSEFTSDsKLSAgIH0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KZGlmZiAtLWdpdCBhL2NyeXB0X3BybmdfZGVzY3JpcHRvci5jIGIvY3J5cHRfcHJuZ19kZXNjcmlwdG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjNlYWQuLjAwMDAwMDAKLS0tIGEvY3J5cHRfcHJuZ19kZXNjcmlwdG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLXN0cnVjdCBfcHJuZ19kZXNjcmlwdG9yIHBybmdfZGVzY3JpcHRvcltUQUJfU0laRV0gPSB7Ci17IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSwKLXsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9LAoteyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0sCi17IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9OwotCmRpZmYgLS1naXQgYS9jcnlwdF9wcm5nX2lzX3ZhbGlkLmMgYi9jcnlwdF9wcm5nX2lzX3ZhbGlkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjZiYzIuLjAwMDAwMDAKLS0tIGEvY3J5cHRfcHJuZ19pc192YWxpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi1pbnQgcHJuZ19pc192YWxpZChpbnQgaWR4KQotewotICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IFRBQl9TSVpFIHx8IHBybmdfZGVzY3JpcHRvcltpZHhdLm5hbWUgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUFJORzsKLSAgIH0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KZGlmZiAtLWdpdCBhL2NyeXB0X3JlZ2lzdGVyX2NpcGhlci5jIGIvY3J5cHRfcmVnaXN0ZXJfY2lwaGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjBkY2IuLjAwMDAwMDAKLS0tIGEvY3J5cHRfcmVnaXN0ZXJfY2lwaGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLWludCByZWdpc3Rlcl9jaXBoZXIoY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciAqY2lwaGVyKQotewotICAgaW50IHg7Ci0KLSAgIF9BUkdDSEsoY2lwaGVyICE9IE5VTEwpOwotCi0gICAvKiBpcyBpdCBhbHJlYWR5IHJlZ2lzdGVyZWQ/ICovCi0gICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgewotICAgICAgIGlmIChjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEwgJiYgY2lwaGVyX2Rlc2NyaXB0b3JbeF0uSUQgPT0gY2lwaGVyLT5JRCkgewotICAgICAgICAgIHJldHVybiB4OwotICAgICAgIH0KLSAgIH0KLQotICAgLyogZmluZCBhIGJsYW5rIHNwb3QgKi8KLSAgIGZvciAoeCA9IDA7IHggPCBUQUJfU0laRTsgeCsrKSB7Ci0gICAgICAgaWYgKGNpcGhlcl9kZXNjcmlwdG9yW3hdLm5hbWUgPT0gTlVMTCkgewotICAgICAgICAgIG1lbWNweSgmY2lwaGVyX2Rlc2NyaXB0b3JbeF0sIGNpcGhlciwgc2l6ZW9mKHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IpKTsKLSAgICAgICAgICByZXR1cm4geDsKLSAgICAgICB9Ci0gICB9Ci0KLSAgIC8qIG5vIHNwb3QgKi8KLSAgIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2NyeXB0X3JlZ2lzdGVyX2hhc2guYyBiL2NyeXB0X3JlZ2lzdGVyX2hhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwMzY5My4uMDAwMDAwMAotLS0gYS9jcnlwdF9yZWdpc3Rlcl9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLWludCByZWdpc3Rlcl9oYXNoKGNvbnN0IHN0cnVjdCBfaGFzaF9kZXNjcmlwdG9yICpoYXNoKQotewotICAgaW50IHg7Ci0KLSAgIF9BUkdDSEsoaGFzaCAhPSBOVUxMKTsKLQotICAgLyogaXMgaXQgYWxyZWFkeSByZWdpc3RlcmVkPyAqLwotICAgZm9yICh4ID0gMDsgeCA8IFRBQl9TSVpFOyB4KyspIHsKLSAgICAgICBpZiAobWVtY21wKCZoYXNoX2Rlc2NyaXB0b3JbeF0sIGhhc2gsIHNpemVvZihzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvcikpID09IDApIHsKLSAgICAgICAgICByZXR1cm4geDsKLSAgICAgICB9Ci0gICB9Ci0KLSAgIC8qIGZpbmQgYSBibGFuayBzcG90ICovCi0gICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgewotICAgICAgIGlmIChoYXNoX2Rlc2NyaXB0b3JbeF0ubmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgbWVtY3B5KCZoYXNoX2Rlc2NyaXB0b3JbeF0sIGhhc2gsIHNpemVvZihzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvcikpOwotICAgICAgICAgIHJldHVybiB4OwotICAgICAgIH0KLSAgIH0KLQotICAgLyogbm8gc3BvdCAqLwotICAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvY3J5cHRfcmVnaXN0ZXJfcHJuZy5jIGIvY3J5cHRfcmVnaXN0ZXJfcHJuZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjE0YTMzLi4wMDAwMDAwCi0tLSBhL2NyeXB0X3JlZ2lzdGVyX3BybmcuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotaW50IHJlZ2lzdGVyX3BybmcoY29uc3Qgc3RydWN0IF9wcm5nX2Rlc2NyaXB0b3IgKnBybmcpCi17Ci0gICBpbnQgeDsKLQotICAgX0FSR0NISyhwcm5nICE9IE5VTEwpOwotCi0gICAvKiBpcyBpdCBhbHJlYWR5IHJlZ2lzdGVyZWQ/ICovCi0gICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgewotICAgICAgIGlmIChtZW1jbXAoJnBybmdfZGVzY3JpcHRvclt4XSwgcHJuZywgc2l6ZW9mKHN0cnVjdCBfcHJuZ19kZXNjcmlwdG9yKSkgPT0gMCkgewotICAgICAgICAgIHJldHVybiB4OwotICAgICAgIH0KLSAgIH0KLQotICAgLyogZmluZCBhIGJsYW5rIHNwb3QgKi8KLSAgIGZvciAoeCA9IDA7IHggPCBUQUJfU0laRTsgeCsrKSB7Ci0gICAgICAgaWYgKHBybmdfZGVzY3JpcHRvclt4XS5uYW1lID09IE5VTEwpIHsKLSAgICAgICAgICBtZW1jcHkoJnBybmdfZGVzY3JpcHRvclt4XSwgcHJuZywgc2l6ZW9mKHN0cnVjdCBfcHJuZ19kZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgfQotICAgfQotCi0gICAvKiBubyBzcG90ICovCi0gICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS9jcnlwdF91bnJlZ2lzdGVyX2NpcGhlci5jIGIvY3J5cHRfdW5yZWdpc3Rlcl9jaXBoZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyMWRhZi4uMDAwMDAwMAotLS0gYS9jcnlwdF91bnJlZ2lzdGVyX2NpcGhlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi1pbnQgdW5yZWdpc3Rlcl9jaXBoZXIoY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciAqY2lwaGVyKQotewotICAgaW50IHg7Ci0KLSAgIF9BUkdDSEsoY2lwaGVyICE9IE5VTEwpOwotCi0gICAvKiBpcyBpdCBhbHJlYWR5IHJlZ2lzdGVyZWQ/ICovCi0gICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgewotICAgICAgIGlmIChtZW1jbXAoJmNpcGhlcl9kZXNjcmlwdG9yW3hdLCBjaXBoZXIsIHNpemVvZihzdHJ1Y3QgX2NpcGhlcl9kZXNjcmlwdG9yKSkgPT0gMCkgewotICAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW3hdLm5hbWUgPSBOVUxMOwotICAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW3hdLklEICAgPSAyNTU7Ci0gICAgICAgICAgcmV0dXJuIENSWVBUX09LOwotICAgICAgIH0KLSAgIH0KLSAgIHJldHVybiBDUllQVF9FUlJPUjsKLX0KZGlmZiAtLWdpdCBhL2NyeXB0X3VucmVnaXN0ZXJfaGFzaC5jIGIvY3J5cHRfdW5yZWdpc3Rlcl9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZGNhNWYuLjAwMDAwMDAKLS0tIGEvY3J5cHRfdW5yZWdpc3Rlcl9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLWludCB1bnJlZ2lzdGVyX2hhc2goY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3IgKmhhc2gpCi17Ci0gICBpbnQgeDsKLQotICAgX0FSR0NISyhoYXNoICE9IE5VTEwpOwotCi0gICAvKiBpcyBpdCBhbHJlYWR5IHJlZ2lzdGVyZWQ/ICovCi0gICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgewotICAgICAgIGlmIChtZW1jbXAoJmhhc2hfZGVzY3JpcHRvclt4XSwgaGFzaCwgc2l6ZW9mKHN0cnVjdCBfaGFzaF9kZXNjcmlwdG9yKSkgPT0gMCkgewotICAgICAgICAgIGhhc2hfZGVzY3JpcHRvclt4XS5uYW1lID0gTlVMTDsKLSAgICAgICAgICByZXR1cm4gQ1JZUFRfT0s7Ci0gICAgICAgfQotICAgfQotICAgcmV0dXJuIENSWVBUX0VSUk9SOwotfQpkaWZmIC0tZ2l0IGEvY3J5cHRfdW5yZWdpc3Rlcl9wcm5nLmMgYi9jcnlwdF91bnJlZ2lzdGVyX3BybmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxNTMzOC4uMDAwMDAwMAotLS0gYS9jcnlwdF91bnJlZ2lzdGVyX3BybmcuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotaW50IHVucmVnaXN0ZXJfcHJuZyhjb25zdCBzdHJ1Y3QgX3BybmdfZGVzY3JpcHRvciAqcHJuZykKLXsKLSAgIGludCB4OwotCi0gICBfQVJHQ0hLKHBybmcgIT0gTlVMTCk7Ci0KLSAgIC8qIGlzIGl0IGFscmVhZHkgcmVnaXN0ZXJlZD8gKi8KLSAgIGZvciAoeCA9IDA7IHggPCBUQUJfU0laRTsgeCsrKSB7Ci0gICAgICAgaWYgKG1lbWNtcCgmcHJuZ19kZXNjcmlwdG9yW3hdLCBwcm5nLCBzaXplb2Yoc3RydWN0IF9wcm5nX2Rlc2NyaXB0b3IpKSAhPSAwKSB7Ci0gICAgICAgICAgcHJuZ19kZXNjcmlwdG9yW3hdLm5hbWUgPSBOVUxMOwotICAgICAgICAgIHJldHVybiBDUllQVF9PSzsKLSAgICAgICB9Ci0gICB9Ci0gICByZXR1cm4gQ1JZUFRfRVJST1I7Ci19CmRpZmYgLS1naXQgYS9jdHJfZGVjcnlwdC5jIGIvY3RyX2RlY3J5cHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlM2EzOS4uMDAwMDAwMAotLS0gYS9jdHJfZGVjcnlwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgQ1RSCi0KLWludCBjdHJfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfQ1RSICpjdHIpCi17Ci0gICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY3RyICE9IE5VTEwpOwotCi0gICByZXR1cm4gY3RyX2VuY3J5cHQoY3QsIHB0LCBsZW4sIGN0cik7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9jdHJfZW5jcnlwdC5jIGIvY3RyX2VuY3J5cHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2ZGUzOC4uMDAwMDAwMAotLS0gYS9jdHJfZW5jcnlwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgQ1RSCi0KLWludCBjdHJfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfQ1RSICpjdHIpCi17Ci0gICBpbnQgeCwgZXJyOwotCi0gICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY3RyICE9IE5VTEwpOwotCi0gICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChjdHItPmNpcGhlcikpICE9IENSWVBUX09LKSB7Ci0gICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIAotICAgLyogaXMgYmxvY2tsZW4vcGFkbGVuIHZhbGlkPyAqLwotICAgaWYgKGN0ci0+YmxvY2tsZW4gPCAwIHx8IGN0ci0+YmxvY2tsZW4gPiAoaW50KXNpemVvZihjdHItPmN0cikgfHwKLSAgICAgICBjdHItPnBhZGxlbiAgIDwgMCB8fCBjdHItPnBhZGxlbiAgID4gKGludClzaXplb2YoY3RyLT5wYWQpKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9Ci0KLSAgIHdoaWxlIChsZW4tLSA+IDApIHsKLSAgICAgIC8qIGlzIHRoZSBwYWQgZW1wdHk/ICovCi0gICAgICBpZiAoY3RyLT5wYWRsZW4gPT0gY3RyLT5ibG9ja2xlbikgewotICAgICAgICAgLyogaW5jcmVtZW50IGNvdW50ZXIgKi8KLSAgICAgICAgIGlmIChjdHItPm1vZGUgPT0gMCkgewotICAgICAgICAgICAgLyogbGl0dGxlLWVuZGlhbiAqLwotICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGN0ci0+YmxvY2tsZW47IHgrKykgewotICAgICAgICAgICAgICAgY3RyLT5jdHJbeF0gPSAoY3RyLT5jdHJbeF0gKyAodW5zaWduZWQgY2hhcikxKSAmICh1bnNpZ25lZCBjaGFyKTI1NTsKLSAgICAgICAgICAgICAgIGlmIChjdHItPmN0clt4XSAhPSAodW5zaWduZWQgY2hhcikwKSB7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBiaWctZW5kaWFuICovCi0gICAgICAgICAgICBmb3IgKHggPSBjdHItPmJsb2NrbGVuLTE7IHggPj0gMDsgeC0tKSB7Ci0gICAgICAgICAgICAgICBjdHItPmN0clt4XSA9IChjdHItPmN0clt4XSArICh1bnNpZ25lZCBjaGFyKTEpICYgKHVuc2lnbmVkIGNoYXIpMjU1OwotICAgICAgICAgICAgICAgaWYgKGN0ci0+Y3RyW3hdICE9ICh1bnNpZ25lZCBjaGFyKTApIHsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgfQotCi0gICAgICAgICAvKiBlbmNyeXB0IGl0ICovCi0gICAgICAgICBjaXBoZXJfZGVzY3JpcHRvcltjdHItPmNpcGhlcl0uZWNiX2VuY3J5cHQoY3RyLT5jdHIsIGN0ci0+cGFkLCAmY3RyLT5rZXkpOwotICAgICAgICAgY3RyLT5wYWRsZW4gPSAwOwotICAgICAgfQotICAgICAgKmN0KysgPSAqcHQrKyBeIGN0ci0+cGFkW2N0ci0+cGFkbGVuKytdOwotICAgfQotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2N0cl9nZXRpdi5jIGIvY3RyX2dldGl2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDBmMGIuLjAwMDAwMDAKLS0tIGEvY3RyX2dldGl2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIENUUgotCi1pbnQgY3RyX2dldGl2KHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nICpsZW4sIHN5bW1ldHJpY19DVFIgKmN0cikKLXsKLSAgIF9BUkdDSEsoSVYgICE9IE5VTEwpOwotICAgX0FSR0NISyhsZW4gIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ciAhPSBOVUxMKTsKLSAgIGlmICgodW5zaWduZWQgbG9uZyljdHItPmJsb2NrbGVuID4gKmxlbikgewotICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgIH0KLSAgIG1lbWNweShJViwgY3RyLT5jdHIsIGN0ci0+YmxvY2tsZW4pOwotICAgKmxlbiA9IGN0ci0+YmxvY2tsZW47Ci0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jdHJfc2V0aXYuYyBiL2N0cl9zZXRpdi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWEyZjJmLi4wMDAwMDAwCi0tLSBhL2N0cl9zZXRpdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBDVFIKLQotaW50IGN0cl9zZXRpdihjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DVFIgKmN0cikKLXsKLSAgIGludCBlcnI7Ci0gICAKLSAgIF9BUkdDSEsoSVYgICE9IE5VTEwpOwotICAgX0FSR0NISyhjdHIgIT0gTlVMTCk7Ci0KLSAgIC8qIGJhZCBwYXJhbT8gKi8KLSAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGN0ci0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICAKLSAgIGlmIChsZW4gIT0gKHVuc2lnbmVkIGxvbmcpY3RyLT5ibG9ja2xlbikgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOwotICAgfQotCi0gICAvKiBzZXQgSVYgKi8KLSAgIG1lbWNweShjdHItPmN0ciwgSVYsIGxlbik7Ci0gICAKLSAgIC8qIGZvcmNlIG5leHQgYmxvY2sgKi8KLSAgIGN0ci0+cGFkbGVuID0gMDsKLSAgIGNpcGhlcl9kZXNjcmlwdG9yW2N0ci0+Y2lwaGVyXS5lY2JfZW5jcnlwdChJViwgY3RyLT5wYWQsICZjdHItPmtleSk7Ci0gICAKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIAotCmRpZmYgLS1naXQgYS9jdHJfc3RhcnQuYyBiL2N0cl9zdGFydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzUyYjY1Li4wMDAwMDAwCi0tLSBhL2N0cl9zdGFydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgQ1RSCi0KLWludCBjdHJfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqY291bnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgCi0gICAgICAgICAgICAgIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfQ1RSICpjdHIpCi17Ci0gICBpbnQgeCwgZXJyOwotCi0gICBfQVJHQ0hLKGNvdW50ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ciAhPSBOVUxMKTsKLQotICAgLyogYmFkIHBhcmFtPyAqLwotICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIHNldHVwIGNpcGhlciAqLwotICAgaWYgKChlcnIgPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLnNldHVwKGtleSwga2V5bGVuLCBudW1fcm91bmRzLCAmY3RyLT5rZXkpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogY29weSBjdHIgKi8KLSAgIGN0ci0+YmxvY2tsZW4gPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmJsb2NrX2xlbmd0aDsKLSAgIGN0ci0+Y2lwaGVyICAgPSBjaXBoZXI7Ci0gICBjdHItPnBhZGxlbiAgID0gMDsKLSAgIGN0ci0+bW9kZSAgICAgPSAwOwotICAgZm9yICh4ID0gMDsgeCA8IGN0ci0+YmxvY2tsZW47IHgrKykgewotICAgICAgIGN0ci0+Y3RyW3hdID0gY291bnRbeF07Ci0gICB9Ci0gICBjaXBoZXJfZGVzY3JpcHRvcltjdHItPmNpcGhlcl0uZWNiX2VuY3J5cHQoY3RyLT5jdHIsIGN0ci0+cGFkLCAmY3RyLT5rZXkpOwotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RlbW9zL2VuY3J5cHQuYyBiL2RlbW9zL2VuY3J5cHQuYwppbmRleCA1MzIwYzIxLi5kOGViMjkzIDEwMDY0NAotLS0gYS9kZW1vcy9lbmNyeXB0LmMKKysrIGIvZGVtb3MvZW5jcnlwdC5jCkBAIC03LDcgKzcsNyBAQAogLyogaWU6IC4vZW5jcnlwdCBibG93ZmlzaCBzdG9yeS50eHQgc3RvcnkuY3QgKi8KIC8qIC4vZW5jcnlwdCAtZCBibG93ZmlzaCBzdG9yeS5jdCBzdG9yeS5wdCAqLwogCi0jaW5jbHVkZSA8bXljcnlwdC5oPgorI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CiAKIGludCBlcnJubzsKIApAQCAtNjksNiArNjksMTIgQEAKICNpZmRlZiBTS0lQSkFDSwogICByZWdpc3Rlcl9jaXBoZXIgKCZza2lwamFja19kZXNjKTsKICNlbmRpZgorI2lmZGVmIEtIQVpBRAorICByZWdpc3Rlcl9jaXBoZXIgKCZraGF6YWRfZGVzYyk7CisjZW5kaWYKKyNpZmRlZiBBTlVCSVMKKyAgcmVnaXN0ZXJfY2lwaGVyICgmYW51YmlzX2Rlc2MpOworI2VuZGlmCiAKICAgIGlmIChyZWdpc3Rlcl9oYXNoKCZzaGEyNTZfZGVzYykgPT0gLTEpIHsKICAgICAgIHByaW50ZigiRXJyb3IgcmVnaXN0ZXJpbmcgU0hBMjU2XG4iKTsKQEAgLTIyOSwzICsyMzUsNyBAQAogICAgfQogICAgcmV0dXJuIDA7CiB9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L2RlbW9zL2VuY3J5cHQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4yICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU2ICQgKi8KZGlmZiAtLWdpdCBhL2RlbW9zL2hhc2hzdW0uYyBiL2RlbW9zL2hhc2hzdW0uYwppbmRleCBlMDI2OWIzLi42NTNiNmVmIDEwMDY0NAotLS0gYS9kZW1vcy9oYXNoc3VtLmMKKysrIGIvZGVtb3MvaGFzaHN1bS5jCkBAIC03LDcgKzcsNyBAQAogICogbW9yZSBmdW5jdGlvbnMgOykKICovCiAKLSNpbmNsdWRlIDxteWNyeXB0X2N1c3RvbS5oPgorI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CiAKIGludCBlcnJubzsKIApAQCAtMjYsNyArMjYsNyBAQAogICAgICAgcHJpbnRmKCJ1c2FnZTogLi9oYXNoIGFsZ29yaXRobSBmaWxlIFtmaWxlIC4uLl1cbiIpOwogICAgICAgcHJpbnRmKCJBbGdvcml0aG1zOlxuIik7CiAgICAgICBmb3IgKHggPSAwOyBoYXNoX2Rlc2NyaXB0b3JbeF0ubmFtZSAhPSBOVUxMOyB4KyspIHsKLSAgICAgICAgIHByaW50ZigiICVzXG4iLCBoYXNoX2Rlc2NyaXB0b3JbeF0ubmFtZSk7CisgICAgICAgICBwcmludGYoIiAlcyAoJWQpXG4iLCBoYXNoX2Rlc2NyaXB0b3JbeF0ubmFtZSwgaGFzaF9kZXNjcmlwdG9yW3hdLklEKTsKICAgICAgIH0KICAgICAgIGV4aXQoRVhJVF9TVUNDRVNTKTsKICAgIH0KQEAgLTY2LDYgKzY2LDggQEAKIAogdm9pZCByZWdpc3Rlcl9hbGdzKHZvaWQpCiB7CisgIGludCBlcnI7CisKICNpZmRlZiBUSUdFUgogICByZWdpc3Rlcl9oYXNoICgmdGlnZXJfZGVzYyk7CiAjZW5kaWYKQEAgLTEwMiw1ICsxMDQsMTYgQEAKICNpZmRlZiBXSElSTFBPT0wKICAgcmVnaXN0ZXJfaGFzaCAoJndoaXJscG9vbF9kZXNjKTsKICNlbmRpZgorI2lmZGVmIENIQ19IQVNICisgIHJlZ2lzdGVyX2hhc2goJmNoY19kZXNjKTsKKyAgaWYgKChlcnIgPSBjaGNfcmVnaXN0ZXIocmVnaXN0ZXJfY2lwaGVyKCZhZXNfZW5jX2Rlc2MpKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgcHJpbnRmKCJjaGNfcmVnaXN0ZXIgZXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgfQorI2VuZGlmCiAKIH0KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvZGVtb3MvaGFzaHN1bS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjIgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTYgJCAqLwpkaWZmIC0tZ2l0IGEvZGVtb3MvbXVsdGkuYyBiL2RlbW9zL211bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY0ZDZiNgotLS0gL2Rldi9udWxsCisrKyBiL2RlbW9zL211bHRpLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIHRlc3QgdGhlIG11bHRpIGhlbHBlcnMuLi4gKi8KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgorCitpbnQgbWFpbih2b2lkKQoreworICAgdW5zaWduZWQgY2hhciBrZXlbMTZdLCBidWZbMl1bTUFYQkxPQ0tTSVpFXTsKKyAgIHVuc2lnbmVkIGxvbmcgbGVuLCBsZW4yOworCisKKy8qIHJlZ2lzdGVyIGFsZ29zICovCisgICByZWdpc3Rlcl9oYXNoKCZzaGEyNTZfZGVzYyk7CisgICByZWdpc3Rlcl9jaXBoZXIoJmFlc19kZXNjKTsKKworLyogSEFTSCB0ZXN0aW5nICovCisgICBsZW4gPSBzaXplb2YoYnVmWzBdKTsKKyAgIGhhc2hfbWVtb3J5KGZpbmRfaGFzaCgic2hhMjU2IiksICJoZWxsbyIsIDUsIGJ1ZlswXSwgJmxlbik7CisgICBsZW4yID0gc2l6ZW9mKGJ1ZlswXSk7CisgICBoYXNoX21lbW9yeV9tdWx0aShmaW5kX2hhc2goInNoYTI1NiIpLCBidWZbMV0sICZsZW4yLCAiaGVsbG8iLCA1LCBOVUxMKTsKKyAgIGlmIChsZW4gIT0gbGVuMiB8fCBtZW1jbXAoYnVmWzBdLCBidWZbMV0sIGxlbikpIHsKKyAgICAgIHByaW50ZigiRmFpbGVkOiAlZCAlbHUgJWx1XG4iLCBfX0xJTkVfXywgbGVuLCBsZW4yKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisgICBsZW4yID0gc2l6ZW9mKGJ1ZlswXSk7CisgICBoYXNoX21lbW9yeV9tdWx0aShmaW5kX2hhc2goInNoYTI1NiIpLCBidWZbMV0sICZsZW4yLCAiaGUiLCAyLCAibGxvIiwgMywgTlVMTCk7CisgICBpZiAobGVuICE9IGxlbjIgfHwgbWVtY21wKGJ1ZlswXSwgYnVmWzFdLCBsZW4pKSB7CisgICAgICBwcmludGYoIkZhaWxlZDogJWQgJWx1ICVsdVxuIiwgX19MSU5FX18sIGxlbiwgbGVuMik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgfQorICAgbGVuMiA9IHNpemVvZihidWZbMF0pOworICAgaGFzaF9tZW1vcnlfbXVsdGkoZmluZF9oYXNoKCJzaGEyNTYiKSwgYnVmWzFdLCAmbGVuMiwgImgiLCAxLCAiZSIsIDEsICJsIiwgMSwgImwiLCAxLCAibyIsIDEsIE5VTEwpOworICAgaWYgKGxlbiAhPSBsZW4yIHx8IG1lbWNtcChidWZbMF0sIGJ1ZlsxXSwgbGVuKSkgeworICAgICAgcHJpbnRmKCJGYWlsZWQ6ICVkICVsdSAlbHVcbiIsIF9fTElORV9fLCBsZW4sIGxlbjIpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgIH0KKworLyogSE1BQyAqLworICAgbGVuID0gc2l6ZW9mKGJ1ZlswXSk7CisgICBobWFjX21lbW9yeShmaW5kX2hhc2goInNoYTI1NiIpLCBrZXksIDE2LCAiaGVsbG8iLCA1LCBidWZbMF0sICZsZW4pOworICAgbGVuMiA9IHNpemVvZihidWZbMF0pOworICAgaG1hY19tZW1vcnlfbXVsdGkoZmluZF9oYXNoKCJzaGEyNTYiKSwga2V5LCAxNiwgYnVmWzFdLCAmbGVuMiwgImhlbGxvIiwgNSwgTlVMTCk7CisgICBpZiAobGVuICE9IGxlbjIgfHwgbWVtY21wKGJ1ZlswXSwgYnVmWzFdLCBsZW4pKSB7CisgICAgICBwcmludGYoIkZhaWxlZDogJWQgJWx1ICVsdVxuIiwgX19MSU5FX18sIGxlbiwgbGVuMik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgfQorICAgbGVuMiA9IHNpemVvZihidWZbMF0pOworICAgaG1hY19tZW1vcnlfbXVsdGkoZmluZF9oYXNoKCJzaGEyNTYiKSwga2V5LCAxNiwgYnVmWzFdLCAmbGVuMiwgImhlIiwgMiwgImxsbyIsIDMsIE5VTEwpOworICAgaWYgKGxlbiAhPSBsZW4yIHx8IG1lbWNtcChidWZbMF0sIGJ1ZlsxXSwgbGVuKSkgeworICAgICAgcHJpbnRmKCJGYWlsZWQ6ICVkICVsdSAlbHVcbiIsIF9fTElORV9fLCBsZW4sIGxlbjIpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgIH0KKyAgIGxlbjIgPSBzaXplb2YoYnVmWzBdKTsKKyAgIGhtYWNfbWVtb3J5X211bHRpKGZpbmRfaGFzaCgic2hhMjU2IiksIGtleSwgMTYsIGJ1ZlsxXSwgJmxlbjIsICJoIiwgMSwgImUiLCAxLCAibCIsIDEsICJsIiwgMSwgIm8iLCAxLCBOVUxMKTsKKyAgIGlmIChsZW4gIT0gbGVuMiB8fCBtZW1jbXAoYnVmWzBdLCBidWZbMV0sIGxlbikpIHsKKyAgICAgIHByaW50ZigiRmFpbGVkOiAlZCAlbHUgJWx1XG4iLCBfX0xJTkVfXywgbGVuLCBsZW4yKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisKKy8qIE9NQUMgKi8KKyAgIGxlbiA9IHNpemVvZihidWZbMF0pOworICAgb21hY19tZW1vcnkoZmluZF9jaXBoZXIoImFlcyIpLCBrZXksIDE2LCAiaGVsbG8iLCA1LCBidWZbMF0sICZsZW4pOworICAgbGVuMiA9IHNpemVvZihidWZbMF0pOworICAgb21hY19tZW1vcnlfbXVsdGkoZmluZF9jaXBoZXIoImFlcyIpLCBrZXksIDE2LCBidWZbMV0sICZsZW4yLCAiaGVsbG8iLCA1LCBOVUxMKTsKKyAgIGlmIChsZW4gIT0gbGVuMiB8fCBtZW1jbXAoYnVmWzBdLCBidWZbMV0sIGxlbikpIHsKKyAgICAgIHByaW50ZigiRmFpbGVkOiAlZCAlbHUgJWx1XG4iLCBfX0xJTkVfXywgbGVuLCBsZW4yKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisgICBsZW4yID0gc2l6ZW9mKGJ1ZlswXSk7CisgICBvbWFjX21lbW9yeV9tdWx0aShmaW5kX2NpcGhlcigiYWVzIiksIGtleSwgMTYsIGJ1ZlsxXSwgJmxlbjIsICJoZSIsIDIsICJsbG8iLCAzLCBOVUxMKTsKKyAgIGlmIChsZW4gIT0gbGVuMiB8fCBtZW1jbXAoYnVmWzBdLCBidWZbMV0sIGxlbikpIHsKKyAgICAgIHByaW50ZigiRmFpbGVkOiAlZCAlbHUgJWx1XG4iLCBfX0xJTkVfXywgbGVuLCBsZW4yKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisgICBsZW4yID0gc2l6ZW9mKGJ1ZlswXSk7CisgICBvbWFjX21lbW9yeV9tdWx0aShmaW5kX2NpcGhlcigiYWVzIiksIGtleSwgMTYsIGJ1ZlsxXSwgJmxlbjIsICJoIiwgMSwgImUiLCAxLCAibCIsIDEsICJsIiwgMSwgIm8iLCAxLCBOVUxMKTsKKyAgIGlmIChsZW4gIT0gbGVuMiB8fCBtZW1jbXAoYnVmWzBdLCBidWZbMV0sIGxlbikpIHsKKyAgICAgIHByaW50ZigiRmFpbGVkOiAlZCAlbHUgJWx1XG4iLCBfX0xJTkVfXywgbGVuLCBsZW4yKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisKKy8qIFBNQUMgKi8KKyAgIGxlbiA9IHNpemVvZihidWZbMF0pOworICAgcG1hY19tZW1vcnkoZmluZF9jaXBoZXIoImFlcyIpLCBrZXksIDE2LCAiaGVsbG8iLCA1LCBidWZbMF0sICZsZW4pOworICAgbGVuMiA9IHNpemVvZihidWZbMF0pOworICAgcG1hY19tZW1vcnlfbXVsdGkoZmluZF9jaXBoZXIoImFlcyIpLCBrZXksIDE2LCBidWZbMV0sICZsZW4yLCAiaGVsbG8iLCA1LCBOVUxMKTsKKyAgIGlmIChsZW4gIT0gbGVuMiB8fCBtZW1jbXAoYnVmWzBdLCBidWZbMV0sIGxlbikpIHsKKyAgICAgIHByaW50ZigiRmFpbGVkOiAlZCAlbHUgJWx1XG4iLCBfX0xJTkVfXywgbGVuLCBsZW4yKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisgICBsZW4yID0gc2l6ZW9mKGJ1ZlswXSk7CisgICBwbWFjX21lbW9yeV9tdWx0aShmaW5kX2NpcGhlcigiYWVzIiksIGtleSwgMTYsIGJ1ZlsxXSwgJmxlbjIsICJoZSIsIDIsICJsbG8iLCAzLCBOVUxMKTsKKyAgIGlmIChsZW4gIT0gbGVuMiB8fCBtZW1jbXAoYnVmWzBdLCBidWZbMV0sIGxlbikpIHsKKyAgICAgIHByaW50ZigiRmFpbGVkOiAlZCAlbHUgJWx1XG4iLCBfX0xJTkVfXywgbGVuLCBsZW4yKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisgICBsZW4yID0gc2l6ZW9mKGJ1ZlswXSk7CisgICBwbWFjX21lbW9yeV9tdWx0aShmaW5kX2NpcGhlcigiYWVzIiksIGtleSwgMTYsIGJ1ZlsxXSwgJmxlbjIsICJoIiwgMSwgImUiLCAxLCAibCIsIDEsICJsIiwgMSwgIm8iLCAxLCBOVUxMKTsKKyAgIGlmIChsZW4gIT0gbGVuMiB8fCBtZW1jbXAoYnVmWzBdLCBidWZbMV0sIGxlbikpIHsKKyAgICAgIHByaW50ZigiRmFpbGVkOiAlZCAlbHUgJWx1XG4iLCBfX0xJTkVfXywgbGVuLCBsZW4yKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICB9CisKKworICAgcHJpbnRmKCJBbGwgcGFzc2VkXG4iKTsKKyAgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvZGVtb3MvbXVsdGkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4yICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU2ICQgKi8KZGlmZiAtLWdpdCBhL2RlbW9zL3NtYWxsLmMgYi9kZW1vcy9zbWFsbC5jCmluZGV4IGY1YTBkNDMuLjZiZGQ4NDIgMTAwNjQ0Ci0tLSBhL2RlbW9zL3NtYWxsLmMKKysrIGIvZGVtb3Mvc21hbGwuYwpAQCAtMSw2ICsxLDUgQEAKIC8vIHNtYWxsIGRlbW8gYXBwIHRoYXQganVzdCBpbmNsdWRlcyBhIGNpcGhlci9oYXNoL3BybmcKLQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogCiBpbnQgbWFpbih2b2lkKQogewpAQCAtOSwzICs4LDcgQEAKICAgIHJlZ2lzdGVyX2hhc2goJnNoYTI1Nl9kZXNjKTsKICAgIHJldHVybiAwOwogfQorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9kZW1vcy9zbWFsbC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjIgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTYgJCAqLwpkaWZmIC0tZ2l0IGEvZGVtb3MvdGVzdC5jIGIvZGVtb3MvdGVzdC5jCmluZGV4IGEyNjg0ZmIuLmY2YzcxNzAgMTAwNjQ0Ci0tLSBhL2RlbW9zL3Rlc3QuYworKysgYi9kZW1vcy90ZXN0LmMKQEAgLTEsMTYyMiArMSwyNCBAQAotLyogVGhpcyBpcyB0aGUgd29yc3QgY29kZSB5b3UgaGF2ZSBldmVyIHNlZW4gd3JpdHRlbiBvbiBwdXJwb3NlLi4uLiB0aGlzIGNvZGUgaXMganVzdCBhIGJpZyBoYWNrIHRvIHRlc3QKLW91dCB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGlicmFyeSAqLworI2luY2x1ZGUgPHRvbWNyeXB0X3Rlc3QuaD4KIAotI2lmZGVmIFNPTllfUFMyCi0jaW5jbHVkZSA8ZWV0eXBlcy5oPgotI2luY2x1ZGUgPGVlcmVncy5oPgotI2luY2x1ZGUgInRpbWVyLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KLQotaW50ICAgICBlcnJudW07Ci0KLQotaW50Ci1udWxsX3NldHVwIChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLAotICAgICAgICBzeW1tZXRyaWNfa2V5ICogc2tleSkKK2ludCBtYWluKHZvaWQpCiB7Ci0gIHJldHVybiBDUllQVF9PSzsKKyAgIGludCB4OworICAgcmVnX2FsZ3MoKTsKKyAgIHByaW50ZigiYnVpbGQgPT0gXG4lc1xuIiwgY3J5cHRfYnVpbGRfc2V0dGluZ3MpOworICAgcHJpbnRmKCJcbnN0b3JlX3Rlc3QuLi4uIik7IGZmbHVzaChzdGRvdXQpOyB4ID0gc3RvcmVfdGVzdCgpOyAgICAgICBwcmludGYoeCA/ICJmYWlsZWQiIDogInBhc3NlZCIpO2lmICh4KSBleGl0KEVYSVRfRkFJTFVSRSk7CisgICBwcmludGYoIlxuY2lwaGVyX3Rlc3QuLi4iKTsgZmZsdXNoKHN0ZG91dCk7IHggPSBjaXBoZXJfaGFzaF90ZXN0KCk7IHByaW50Zih4ID8gImZhaWxlZCIgOiAicGFzc2VkIik7aWYgKHgpIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgIHByaW50ZigiXG5tb2Rlc190ZXN0Li4uLiIpOyBmZmx1c2goc3Rkb3V0KTsgeCA9IG1vZGVzX3Rlc3QoKTsgICAgICAgcHJpbnRmKHggPyAiZmFpbGVkIiA6ICJwYXNzZWQiKTtpZiAoeCkgZXhpdChFWElUX0ZBSUxVUkUpOworICAgcHJpbnRmKCJcbmRlcl90ZXN0Li4uLi4uIik7IGZmbHVzaChzdGRvdXQpOyB4ID0gZGVyX3Rlc3RzKCk7ICAgICAgICBwcmludGYoeCA/ICJmYWlsZWQiIDogInBhc3NlZCIpO2lmICh4KSBleGl0KEVYSVRfRkFJTFVSRSk7CisgICBwcmludGYoIlxubWFjX3Rlc3QuLi4uLi4iKTsgZmZsdXNoKHN0ZG91dCk7IHggPSBtYWNfdGVzdCgpOyAgICAgICAgIHByaW50Zih4ID8gImZhaWxlZCIgOiAicGFzc2VkIik7aWYgKHgpIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgIHByaW50ZigiXG5wa2NzXzFfdGVzdC4uLiIpOyBmZmx1c2goc3Rkb3V0KTsgeCA9IHBrY3NfMV90ZXN0KCk7ICAgICAgcHJpbnRmKHggPyAiZmFpbGVkIiA6ICJwYXNzZWQiKTtpZiAoeCkgZXhpdChFWElUX0ZBSUxVUkUpOworICAgcHJpbnRmKCJcbnJzYV90ZXN0Li4uLi4uIik7IGZmbHVzaChzdGRvdXQpOyB4ID0gcnNhX3Rlc3QoKTsgICAgICAgICBwcmludGYoeCA/ICJmYWlsZWQiIDogInBhc3NlZCIpO2lmICh4KSBleGl0KEVYSVRfRkFJTFVSRSk7CisgICBwcmludGYoIlxuZWNjX3Rlc3QuLi4uLi4iKTsgZmZsdXNoKHN0ZG91dCk7IHggPSBlY2NfdGVzdHMoKTsgICAgICAgIHByaW50Zih4ID8gImZhaWxlZCIgOiAicGFzc2VkIik7aWYgKHgpIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgIHByaW50ZigiXG5kc2FfdGVzdC4uLi4uLiIpOyBmZmx1c2goc3Rkb3V0KTsgeCA9IGRzYV90ZXN0KCk7ICAgICAgICAgcHJpbnRmKHggPyAiZmFpbGVkIiA6ICJwYXNzZWQiKTtpZiAoeCkgZXhpdChFWElUX0ZBSUxVUkUpOworICAgcHJpbnRmKCJcbmRoX3Rlc3QuLi4uLi4uIik7IGZmbHVzaChzdGRvdXQpOyB4ID0gZGhfdGVzdHMoKTsgICAgICAgICBwcmludGYoeCA/ICJmYWlsZWQiIDogInBhc3NlZCIpO2lmICh4KSBleGl0KEVYSVRfRkFJTFVSRSk7CisgICBwcmludGYoIlxuIik7CisgICByZXR1cm4gRVhJVF9TVUNDRVNTOwogfQogCi12b2lkCi1udWxsX2VjYl9lbmNyeXB0IChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsCi0gICAgICAgICAgc3ltbWV0cmljX2tleSAqIGtleSkKLXsKLSAgbWVtY3B5IChjdCwgcHQsIDgpOwotfQotCi12b2lkCi1udWxsX2VjYl9kZWNyeXB0IChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsCi0gICAgICAgICAgc3ltbWV0cmljX2tleSAqIGtleSkKLXsKLSAgbWVtY3B5IChwdCwgY3QsIDgpOwotfQotCi1pbnQKLW51bGxfdGVzdCAodm9pZCkKLXsKLSAgcmV0dXJuIENSWVBUX09LOwotfQotCi1pbnQKLW51bGxfa2V5c2l6ZSAoaW50ICpkZXNpcmVkX2tleXNpemUpCi17Ci0gIHJldHVybiBDUllQVF9PSzsKLX0KLQotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciBudWxsX2Rlc2MgPSB7Ci0gICJtZW1jcHkoKSIsCi0gIDI1NSwKLSAgOCwgOCwgOCwgMSwKLSAgJm51bGxfc2V0dXAsCi0gICZudWxsX2VjYl9lbmNyeXB0LAotICAmbnVsbF9lY2JfZGVjcnlwdCwKLSAgJm51bGxfdGVzdCwKLSAgJm51bGxfa2V5c2l6ZQotfTsKLQotCi1wcm5nX3N0YXRlIHBybmc7Ci0KLXZvaWQKLXN0b3JlX3Rlc3RzICh2b2lkKQotewotICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKLSAgdW5zaWduZWQgbG9uZyBMOwotICB1bG9uZzY0IExMOwotCi0gIHByaW50ZiAoIkxPQUQzMi9TVE9SRTMyIHRlc3RzXG4iKTsKLSAgTCA9IDB4MTIzNDU2NzhVTDsKLSAgU1RPUkUzMkwgKEwsICZidWZbMF0pOwotICBMID0gMDsKLSAgTE9BRDMyTCAoTCwgJmJ1ZlswXSk7Ci0gIGlmIChMICE9IDB4MTIzNDU2NzhVTCkgewotICAgIHByaW50ZiAoIkxPQUQvU1RPUkUzMiBMaXR0bGUgZG9uJ3Qgd29ya1xuIik7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIExMID0gQ09OU1Q2NCAoMHgwMTAyMDMwNDA1MDYwNyk7Ci0gIFNUT1JFNjRMIChMTCwgJmJ1ZlswXSk7Ci0gIExMID0gMDsKLSAgTE9BRDY0TCAoTEwsICZidWZbMF0pCi0gICAgaWYgKExMICE9IENPTlNUNjQgKDB4MDEwMjAzMDQwNTA2MDcpKSB7Ci0gICAgcHJpbnRmICgiTE9BRC9TVE9SRTY0IExpdHRsZSBkb24ndCB3b3JrXG4iKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLQotICBMID0gMHgxMjM0NTY3OFVMOwotICBTVE9SRTMySCAoTCwgJmJ1ZlswXSk7Ci0gIEwgPSAwOwotICBMT0FEMzJIIChMLCAmYnVmWzBdKTsKLSAgaWYgKEwgIT0gMHgxMjM0NTY3OFVMKSB7Ci0gICAgcHJpbnRmICgiTE9BRC9TVE9SRTMyIEhpZ2ggZG9uJ3Qgd29yaywgJTA4bHhcbiIsIEwpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotICBMTCA9IENPTlNUNjQgKDB4MDEwMjAzMDQwNTA2MDcpOwotICBTVE9SRTY0SCAoTEwsICZidWZbMF0pOwotICBMTCA9IDA7Ci0gIExPQUQ2NEggKExMLCAmYnVmWzBdKQotICAgIGlmIChMTCAhPSBDT05TVDY0ICgweDAxMDIwMzA0MDUwNjA3KSkgewotICAgIHByaW50ZiAoIkxPQUQvU1RPUkU2NCBIaWdoIGRvbid0IHdvcmtcbiIpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotfQotCi12b2lkCi1jaXBoZXJfdGVzdHMgKHZvaWQpCi17Ci0gIGludCAgICAgeDsKLQotICBwcmludGYgKCJDaXBoZXJzIGNvbXBpbGVkIGluXG4iKTsKLSAgZm9yICh4ID0gMDsgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSAhPSBOVUxMOyB4KyspIHsKLSAgICBwcmludGYKLSAgICAgICgiICUxMnMgKCUyZCkgS2V5IFNpemU6ICU0ZCB0byAlNGQsIEJsb2NrIFNpemU6ICUzZCwgRGVmYXVsdCAjIG9mIHJvdW5kczogJTJkXG4iLAotICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW3hdLm5hbWUsIGNpcGhlcl9kZXNjcmlwdG9yW3hdLklELAotICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW3hdLm1pbl9rZXlfbGVuZ3RoICogOCwKLSAgICAgICBjaXBoZXJfZGVzY3JpcHRvclt4XS5tYXhfa2V5X2xlbmd0aCAqIDgsCi0gICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbeF0uYmxvY2tfbGVuZ3RoICogOCwKLSAgICAgICBjaXBoZXJfZGVzY3JpcHRvclt4XS5kZWZhdWx0X3JvdW5kcyk7Ci0gIH0KLQotfQotCi12b2lkCi1lY2JfdGVzdHMgKHZvaWQpCi17Ci0gIGludCAgICAgeDsKLQotICBwcmludGYgKCJFQ0IgdGVzdHNcbiIpOwotICBmb3IgKHggPSAwOyBjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEw7IHgrKykgewotICAgIHByaW50ZiAoIiAlMTJzOiAiLCBjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lKTsKLSAgICBpZiAoKGVycm51bSA9IGNpcGhlcl9kZXNjcmlwdG9yW3hdLnRlc3QgKCkpICE9IENSWVBUX09LKSB7Ci0gICAgICBwcmludGYgKCIgKipmYWlsZWQqKiBSZWFzb246ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgICAgZXhpdCAoLTEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGYgKCJwYXNzZWRcbiIpOwotICAgIH0KLSAgfQotfQotCi0jaWZkZWYgQ0JDCi12b2lkCi1jYmNfdGVzdHMgKHZvaWQpCi17Ci0gIHN5bW1ldHJpY19DQkMgY2JjOwotICBpbnQgICAgIHgsIHk7Ci0gIHVuc2lnbmVkIGNoYXIgYmxrWzMyXSwgY3RbMzJdLCBrZXlbMzJdLCBJVlszMl07Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGVzdFtdID0KLSAgICB7IDBYRkYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKLQotICBwcmludGYgKCJDQkMgdGVzdHNcbiIpOwotICAvKiAtLS0tIENCQyBFTkNPRElORyAtLS0tICovCi0gIC8qIG1ha2UgdXAgYSBibG9jayBhbmQgSVYgKi8KLSAgZm9yICh4ID0gMDsgeCA8IDMyOyB4KyspCi0gICAgYmxrW3hdID0gSVZbeF0gPSB4OwotCi0gIC8qIG5vdyBsZXRzIHN0YXJ0IGEgY2JjIHNlc3Npb24gKi8KLSAgaWYgKChlcnJudW0gPQotICAgICAgIGNiY19zdGFydCAoZmluZF9jaXBoZXIgKCJibG93ZmlzaCIpLCBJViwga2V5LCAxNiwgMCwKLSAgICAgICAgICAmY2JjKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJDQkMgU2V0dXA6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotCi0gIC8qIG5vdyBsZXRzIGVuY29kZSAzMiBieXRlcyAqLwotICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7Ci0gICAgaWYgKChlcnJudW0gPSBjYmNfZW5jcnlwdCAoYmxrICsgOCAqIHgsIGN0ICsgOCAqIHgsICZjYmMpKSAhPSBDUllQVF9PSykgewotICAgICAgcHJpbnRmICgiQ0JDIGVuY3J5cHQ6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgICAgZXhpdCAoLTEpOwotICAgIH0KLSAgfQotCi0gIHplcm9tZW0gKGJsaywgc2l6ZW9mIChibGspKTsKLQotICAvKiAtLS0tIENCQyBERUNPRElORyAtLS0tICovCi0gIC8qIG1ha2UgdXAgYSBJViAqLwotICBmb3IgKHggPSAwOyB4IDwgMzI7IHgrKykKLSAgICBJVlt4XSA9IHg7Ci0KLSAgLyogbm93IGxldHMgc3RhcnQgYSBjYmMgc2Vzc2lvbiAqLwotICBpZiAoKGVycm51bSA9Ci0gICAgICAgY2JjX3N0YXJ0IChmaW5kX2NpcGhlciAoImJsb3dmaXNoIiksIElWLCBrZXksIDE2LCAwLAotICAgICAgICAgICZjYmMpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkNCQyBTZXR1cDogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0KLSAgLyogbm93IGxldHMgZGVjb2RlIDMyIGJ5dGVzICovCi0gIGZvciAoeCA9IDA7IHggPCA0OyB4KyspIHsKLSAgICBpZiAoKGVycm51bSA9IGNiY19kZWNyeXB0IChjdCArIDggKiB4LCBibGsgKyA4ICogeCwgJmNiYykpICE9IENSWVBUX09LKSB7Ci0gICAgICBwcmludGYgKCJDQkMgZGVjcnlwdDogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgfQotICB9Ci0KLQotICAvKiBwcmludCBvdXRwdXQgKi8KLSAgZm9yICh4ID0geSA9IDA7IHggPCAzMjsgeCsrKQotICAgIGlmIChibGtbeF0gIT0geCkKLSAgICAgIHkgPSAxOwotICBwcmludGYgKCIgICVzXG4iLCB5ID8gImZhaWxlZCIgOiAicGFzc2VkIik7Ci0KLSAgLyogbGV0cyBhY3R1YWxseSBjaGVjayB0aGUgYnl0ZXMgKi8KLSAgbWVtc2V0IChJViwgMCwgOCk7Ci0gIElWWzBdID0gMHhGRjsgICAgICAgICAvKiBJViAgPSBGRiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAqLwotICBtZW1zZXQgKGJsaywgMCwgMzIpOwotICBibGtbOF0gPSAweEZGOyAgICAgICAgLyogQkxLID0gMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgRkYgMDAgMDAgMDAgMDAgMDAgMDAgMDAgKi8KLSAgY2JjX3N0YXJ0IChmaW5kX2NpcGhlciAoIm1lbWNweSgpIiksIElWLCBrZXksIDgsIDAsICZjYmMpOwotICBjYmNfZW5jcnlwdCAoYmxrLCBjdCwgJmNiYyk7ICAvKiBleHBlY3Q6IEZGIDAwIDAwIDAwIDAwIDAwIDAwIDAwICovCi0gIGNiY19lbmNyeXB0IChibGsgKyA4LCBjdCArIDgsICZjYmMpOyAgLyogZXhwZWN0OiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAqLwotICBpZiAobWVtY21wIChjdCwgdGVzdCwgMTYpKSB7Ci0gICAgcHJpbnRmICgiQ0JDIGZhaWxlZCBsb2dpY2FsIHRlc3RpbmcuXG4iKTsKLSAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKLSAgICAgIHByaW50ZiAoIiUwMnggIiwgY3RbeF0pOwotICAgIHByaW50ZiAoIlxuIik7Ci0gICAgZXhpdCAoLTEpOwotICB9IGVsc2UgewotICAgIHByaW50ZiAoIkNCQyBwYXNzZWQgbG9naWNhbCB0ZXN0aW5nLlxuIik7Ci0gIH0KLX0KLSNlbHNlCi12b2lkCi1jYmNfdGVzdHMgKHZvaWQpCi17Ci0gIHByaW50ZiAoIkNCQyBub3QgY29tcGlsZWQgaW5cbiIpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBPRkIKLXZvaWQKLW9mYl90ZXN0cyAodm9pZCkKLXsKLSAgc3ltbWV0cmljX09GQiBvZmI7Ci0gIGludCAgICAgeCwgeTsKLSAgdW5zaWduZWQgY2hhciBibGtbMzJdLCBjdFszMl0sIGtleVszMl0sIElWWzMyXTsKLQotICBwcmludGYgKCJPRkIgdGVzdHNcbiIpOwotICAvKiAtLS0tIG9mYiBFTkNPRElORyAtLS0tICovCi0gIC8qIG1ha2UgdXAgYSBibG9jayBhbmQgSVYgKi8KLSAgZm9yICh4ID0gMDsgeCA8IDMyOyB4KyspCi0gICAgYmxrW3hdID0gSVZbeF0gPSB4OwotCi0gIC8qIG5vdyBsZXRzIHN0YXJ0IGEgb2ZiIHNlc3Npb24gKi8KLSAgaWYgKChlcnJudW0gPQotICAgICAgIG9mYl9zdGFydCAoZmluZF9jaXBoZXIgKCJjYXN0NSIpLCBJViwga2V5LCAxNiwgMCwgJm9mYikpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiT0ZCIFNldHVwOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLQotICAvKiBub3cgbGV0cyBlbmNvZGUgMzIgYnl0ZXMgKi8KLSAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykgewotICAgIGlmICgoZXJybnVtID0gb2ZiX2VuY3J5cHQgKGJsayArIDggKiB4LCBjdCArIDggKiB4LCA4LCAmb2ZiKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHByaW50ZiAoIk9GQiBlbmNyeXB0OiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIH0KLQotICB6ZXJvbWVtIChibGssIHNpemVvZiAoYmxrKSk7Ci0KLSAgLyogLS0tLSBvZmIgREVDT0RJTkcgLS0tLSAqLwotICAvKiBtYWtlIHVwIGEgSVYgKi8KLSAgZm9yICh4ID0gMDsgeCA8IDMyOyB4KyspCi0gICAgSVZbeF0gPSB4OwotCi0gIC8qIG5vdyBsZXRzIHN0YXJ0IGEgb2ZiIHNlc3Npb24gKi8KLSAgaWYgKChlcnJudW0gPQotICAgICAgIG9mYl9zdGFydCAoZmluZF9jaXBoZXIgKCJjYXN0NSIpLCBJViwga2V5LCAxNiwgMCwgJm9mYikpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiT0ZCIHNldHVwOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLQotICAvKiBub3cgbGV0cyBkZWNvZGUgMzIgYnl0ZXMgKi8KLSAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykgewotICAgIGlmICgoZXJybnVtID0gb2ZiX2RlY3J5cHQgKGN0ICsgOCAqIHgsIGJsayArIDggKiB4LCA4LCAmb2ZiKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHByaW50ZiAoIk9GQiBkZWNyeXB0OiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIH0KLQotICAvKiBwcmludCBvdXRwdXQgKi8KLSAgZm9yICh4ID0geSA9IDA7IHggPCAzMjsgeCsrKQotICAgIGlmIChibGtbeF0gIT0geCkKLSAgICAgIHkgPSAxOwotICBwcmludGYgKCIgICVzXG4iLCB5ID8gImZhaWxlZCIgOiAicGFzc2VkIik7Ci0gIGlmICh5KQotICAgIGV4aXQgKC0xKTsKLX0KLSNlbHNlCi12b2lkCi1vZmJfdGVzdHMgKHZvaWQpCi17Ci0gIHByaW50ZiAoIk9GQiBub3QgY29tcGlsZWQgaW5cbiIpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDRkIKLXZvaWQKLWNmYl90ZXN0cyAodm9pZCkKLXsKLSAgc3ltbWV0cmljX0NGQiBjZmI7Ci0gIGludCAgICAgeCwgeTsKLSAgdW5zaWduZWQgY2hhciBibGtbMzJdLCBjdFszMl0sIGtleVszMl0sIElWWzMyXTsKLQotICBwcmludGYgKCJDRkIgdGVzdHNcbiIpOwotICAvKiAtLS0tIGNmYiBFTkNPRElORyAtLS0tICovCi0gIC8qIG1ha2UgdXAgYSBibG9jayBhbmQgSVYgKi8KLSAgZm9yICh4ID0gMDsgeCA8IDMyOyB4KyspCi0gICAgYmxrW3hdID0gSVZbeF0gPSB4OwotCi0gIC8qIG5vdyBsZXRzIHN0YXJ0IGEgY2ZiIHNlc3Npb24gKi8KLSAgaWYgKChlcnJudW0gPQotICAgICAgIGNmYl9zdGFydCAoZmluZF9jaXBoZXIgKCJibG93ZmlzaCIpLCBJViwga2V5LCAxNiwgMCwKLSAgICAgICAgICAmY2ZiKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJDRkIgc2V0dXA6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotCi0gIC8qIG5vdyBsZXRzIGVuY29kZSAzMiBieXRlcyAqLwotICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7Ci0gICAgaWYgKChlcnJudW0gPSBjZmJfZW5jcnlwdCAoYmxrICsgOCAqIHgsIGN0ICsgOCAqIHgsIDgsICZjZmIpKSAhPSBDUllQVF9PSykgewotICAgICAgcHJpbnRmICgiQ0ZCIGVuY3J5cHQ6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgICAgZXhpdCAoLTEpOwotICAgIH0KLSAgfQotCi0gIHplcm9tZW0gKGJsaywgc2l6ZW9mIChibGspKTsKLQotICAvKiAtLS0tIGNmYiBERUNPRElORyAtLS0tICovCi0gIC8qIG1ha2UgdXAgYWhhc2hfZGVzY3JpcHRvcltwcm5nLT55YXJyb3cuaGFzaF0uaGFzaHNpemUgSVYgKi8KLSAgZm9yICh4ID0gMDsgeCA8IDMyOyB4KyspCi0gICAgSVZbeF0gPSB4OwotCi0gIC8qIG5vdyBsZXRzIHN0YXJ0IGEgY2ZiIHNlc3Npb24gKi8KLSAgaWYgKChlcnJudW0gPQotICAgICAgIGNmYl9zdGFydCAoZmluZF9jaXBoZXIgKCJibG93ZmlzaCIpLCBJViwga2V5LCAxNiwgMCwKLSAgICAgICAgICAmY2ZiKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJDRkIgU2V0dXA6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotCi0gIC8qIG5vdyBsZXRzIGRlY29kZSAzMiBieXRlcyAqLwotICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7Ci0gICAgaWYgKChlcnJudW0gPSBjZmJfZGVjcnlwdCAoY3QgKyA4ICogeCwgYmxrICsgOCAqIHgsIDgsICZjZmIpKSAhPSBDUllQVF9PSykgewotICAgICAgcHJpbnRmICgiQ0ZCIGRlY3J5cHQ6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgICAgZXhpdCAoLTEpOwotICAgIH0KLSAgfQotCi0gIC8qIHByaW50IG91dHB1dCAqLwotICBmb3IgKHggPSB5ID0gMDsgeCA8IDMyOyB4KyspCi0gICAgaWYgKGJsa1t4XSAhPSB4KQotICAgICAgeSA9IDE7Ci0gIHByaW50ZiAoIiAgJXNcbiIsIHkgPyAiZmFpbGVkIiA6ICJwYXNzZWQiKTsKLSAgaWYgKHkpCi0gICAgZXhpdCAoLTEpOwotfQotI2Vsc2UKLXZvaWQKLWNmYl90ZXN0cyAodm9pZCkKLXsKLSAgcHJpbnRmICgiQ0ZCIG5vdCBjb21waWxlZCBpblxuIik7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENUUgotdm9pZAotY3RyX3Rlc3RzICh2b2lkKQotewotICBzeW1tZXRyaWNfQ1RSIGN0cjsKLSAgaW50ICAgICB4LCB5OwotICB1bnNpZ25lZCBjaGFyIGJsa1szMl0sIGN0WzMyXSwga2V5WzMyXSwgY291bnRbMzJdOwotICBjb25zdCB1bnNpZ25lZCBjaGFyIHRlc3RbXSA9Ci0gICAgeyAweEZGLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzLCAwLCAwLCAwLCAwLCAwLCAwIH07Ci0KLSAgcHJpbnRmICgiQ1RSIHRlc3RzXG4iKTsKLSAgLyogLS0tLSBDVFIgRU5DT0RJTkcgLS0tLSAqLwotICAvKiBtYWtlIHVwIGEgYmxvY2sgYW5kIElWICovCi0gIGZvciAoeCA9IDA7IHggPCAzMjsgeCsrKQotICAgIGJsa1t4XSA9IGNvdW50W3hdID0geDsKLQotICAvKiBub3cgbGV0cyBzdGFydCBhIGN0ciBzZXNzaW9uICovCi0gIGlmICgoZXJybnVtID0KLSAgICAgICBjdHJfc3RhcnQgKGZpbmRfY2lwaGVyICgieHRlYSIpLCBjb3VudCwga2V5LCAxNiwgMCwKLSAgICAgICAgICAmY3RyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJDVFIgU2V0dXA6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotCi0gIC8qIG5vdyBsZXRzIGVuY29kZSAzMiBieXRlcyAqLwotICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7Ci0gICAgaWYgKChlcnJudW0gPSBjdHJfZW5jcnlwdCAoYmxrICsgOCAqIHgsIGN0ICsgOCAqIHgsIDgsICZjdHIpKSAhPSBDUllQVF9PSykgewotICAgICAgcHJpbnRmICgiQ1RSIGVuY3J5cHQ6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgICAgZXhpdCAoLTEpOwotICAgIH0KLSAgfQotCi0gIHplcm9tZW0gKGJsaywgc2l6ZW9mIChibGspKTsKLQotICAvKiAtLS0tIENUUiBERUNPRElORyAtLS0tICovCi0gIC8qIG1ha2UgdXAgYSBJViAqLwotICBmb3IgKHggPSAwOyB4IDwgMzI7IHgrKykKLSAgICBjb3VudFt4XSA9IHg7Ci0KLSAgLyogbm93IGxldHMgc3RhcnQgYSBjYmMgc2Vzc2lvbiAqLwotICBpZiAoKGVycm51bSA9Ci0gICAgICAgY3RyX3N0YXJ0IChmaW5kX2NpcGhlciAoInh0ZWEiKSwgY291bnQsIGtleSwgMTYsIDAsCi0gICAgICAgICAgJmN0cikpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiQ1RSIFNldHVwOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLQotICAvKiBub3cgbGV0cyBkZWNvZGUgMzIgYnl0ZXMgKi8KLSAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykgewotICAgIGlmICgoZXJybnVtID0gY3RyX2RlY3J5cHQgKGN0ICsgOCAqIHgsIGJsayArIDggKiB4LCA4LCAmY3RyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHByaW50ZiAoIkNUUiBkZWNyeXB0OiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIH0KLQotICAvKiBwcmludCBvdXRwdXQgKi8KLSAgZm9yICh4ID0geSA9IDA7IHggPCAzMjsgeCsrKQotICAgIGlmIChibGtbeF0gIT0geCkKLSAgICAgIHkgPSAxOwotICBwcmludGYgKCIgICVzXG4iLCB5ID8gImZhaWxlZCIgOiAicGFzc2VkIik7Ci0gIGlmICh5KQotICAgIGV4aXQgKC0xKTsKLQotICAvKiBsZXRzIGFjdHVhbGx5IGNoZWNrIHRoZSBieXRlcyAqLwotICBtZW1zZXQgKGNvdW50LCAwLCA4KTsKLSAgY291bnRbMF0gPSAweEZGOyAgICAgIC8qIElWICA9IEZGIDAwIDAwIDAwIDAwIDAwIDAwIDAwICovCi0gIG1lbXNldCAoYmxrLCAwLCAzMik7Ci0gIGJsa1s5XSA9IDI7ICAgICAgICAgICAvKiBCTEsgPSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMiAwMCAwMCAwMCAwMCAwMCAwMCAqLwotICBjdHJfc3RhcnQgKGZpbmRfY2lwaGVyICgibWVtY3B5KCkiKSwgY291bnQsIGtleSwgOCwgMCwgJmN0cik7Ci0gIGN0cl9lbmNyeXB0IChibGssIGN0LCA4LCAmY3RyKTsgICAvKiBleHBlY3Q6IEZGIDAwIDAwIDAwIDAwIDAwIDAwIDAwICovCi0gIGN0cl9lbmNyeXB0IChibGsgKyA4LCBjdCArIDgsIDgsICZjdHIpOyAgIC8qIGV4cGVjdDogMDAgMDMgMDAgMDAgMDAgMDAgMDAgMDAgKi8KLSAgaWYgKG1lbWNtcCAoY3QsIHRlc3QsIDE2KSkgewotICAgIHByaW50ZiAoIkNUUiBmYWlsZWQgbG9naWNhbCB0ZXN0aW5nLlxuIik7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCi0gICAgICBwcmludGYgKCIlMDJ4ICIsIGN0W3hdKTsKLSAgICBwcmludGYgKCJcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZiAoIkNUUiBwYXNzZWQgbG9naWNhbCB0ZXN0aW5nLlxuIik7Ci0gIH0KLQotfQotI2Vsc2UKLXZvaWQKLWN0cl90ZXN0cyAodm9pZCkKLXsKLSAgcHJpbnRmICgiQ1RSIG5vdCBjb21waWxlZCBpblxuIik7Ci19Ci0jZW5kaWYKLQotdm9pZAotaGFzaF90ZXN0cyAodm9pZCkKLXsKLSAgaW50ICAgICB4OwotICBwcmludGYgKCJIYXNoIHRlc3RzXG4iKTsKLSAgZm9yICh4ID0gMDsgaGFzaF9kZXNjcmlwdG9yW3hdLm5hbWUgIT0gTlVMTDsgeCsrKSB7Ci0gICAgcHJpbnRmICgiICUxMHMgKCUyZCkgIiwgaGFzaF9kZXNjcmlwdG9yW3hdLm5hbWUsIGhhc2hfZGVzY3JpcHRvclt4XS5JRCk7Ci0gICAgaWYgKChlcnJudW0gPSBoYXNoX2Rlc2NyaXB0b3JbeF0udGVzdCAoKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHByaW50ZiAoIioqZmFpbGVkKiogUmVhc29uOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICAgIGV4aXQoLTEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGYgKCJwYXNzZWRcbiIpOwotICAgIH0KLSAgfQotfQotCi0jaWZkZWYgTVJTQQotdm9pZAotcGFkX3Rlc3QgKHZvaWQpCi17Ci0gIHVuc2lnbmVkIGNoYXIgaW5bMTAwXSwgb3V0WzEwMF07Ci0gIHVuc2lnbmVkIGxvbmcgeCwgeTsKLQotICAvKiBtYWtlIGEgZHVtbXkgbWVzc2FnZSAqLwotICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKLSAgICBpblt4XSA9ICh1bnNpZ25lZCBjaGFyKSB4OwotCi0gIC8qIHBhZCB0aGUgbWVzc2FnZSBzbyB0aGF0IHJhbmRvbSBmaWxsZXIgaXMgcGxhY2VkIGJlZm9yZSBhbmQgYWZ0ZXIgaXQgKi8KLSAgeSA9IDEwMDsKLSAgaWYgKChlcnJudW0gPQotICAgICAgIHJzYV9wYWQgKGluLCAxNiwgb3V0LCAmeSwgZmluZF9wcm5nICgieWFycm93IiksICZwcm5nKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0KLSAgLyogZGVwYWQgdGhlIG1lc3NhZ2UgdG8gZ2V0IHRoZSBvcmlnaW5hbCBjb250ZW50ICovCi0gIG1lbXNldCAoaW4sIDAsIHNpemVvZiAoaW4pKTsKLSAgeCA9IDEwMDsKLSAgaWYgKChlcnJudW0gPSByc2FfZGVwYWQgKG91dCwgeSwgaW4sICZ4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0KLSAgLyogY2hlY2sgb3V0Y29tZSAqLwotICBwcmludGYgKCJyc2FfcGFkOiAiKTsKLSAgaWYgKHggIT0gMTYpIHsKLSAgICBwcmludGYgKCJGYWlsZWQuICBXcm9uZyBzaXplLlxuIik7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQotICAgIGlmIChpblt4XSAhPSB4KSB7Ci0gICAgICBwcmludGYgKCJGYWlsZWQuICBFeHBlY3RlZCAlMDJseCBhbmQgZ290ICUwMnguXG4iLCB4LCBpblt4XSk7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgfQotICBwcmludGYgKCJwYXNzZWQuXG4iKTsKLX0KLXZvaWQKLXJzYV90ZXN0ICh2b2lkKQotewotICB1bnNpZ25lZCBjaGFyIGluWzUyMF0sIG91dFs1MjBdOwotICB1bnNpZ25lZCBsb25nIHgsIHksIHosIGxpbWl0OwotICBpbnQgICAgIHN0YXQ7Ci0gIHJzYV9rZXkga2V5OwotICBjbG9ja190IHQ7Ci0KLSAgLyogLS0tLSBTSU5HTEUgRU5DUllQVCAtLS0tICovCi0gIC8qIGVuY3J5cHQgYSBzaG9ydCA4IGJ5dGUgc3RyaW5nICovCi0gIGlmICgoZXJybnVtID0KLSAgICAgICByc2FfbWFrZV9rZXkgKCZwcm5nLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgMTAyNCAvIDgsIDY1NTM3LAotICAgICAgICAgICAgICZrZXkpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKLSAgICBpblt4XSA9ICh1bnNpZ25lZCBjaGFyKSAoeCArIDEpOwotICB5ID0gc2l6ZW9mIChpbik7Ci0gIGlmICgoZXJybnVtID0gcnNhX2V4cHRtb2QgKGluLCA4LCBvdXQsICZ5LCBQS19QVUJMSUMsICZrZXkpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLQotICAvKiBkZWNyeXB0IGl0ICovCi0gIHplcm9tZW0gKGluLCBzaXplb2YgKGluKSk7Ci0gIHggPSBzaXplb2YgKG91dCk7Ci0gIGlmICgoZXJybnVtID0gcnNhX2V4cHRtb2QgKG91dCwgeSwgaW4sICZ4LCBQS19QUklWQVRFLCAma2V5KSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0KLSAgLyogY29tcGFyZSAqLwotICBwcmludGYgKCJSU0EgICAgOiAiKTsKLSAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKLSAgICBpZiAoaW5beF0gIT0gKHggKyAxKSkgewotICAgICAgcHJpbnRmICgiRmFpbGVkLiAgeD09JTAybHgsIGluWyVsZF09PSUwMnhcbiIsIHgsIHgsIGluW3hdKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIHByaW50ZiAoInBhc3NlZC5cbiIpOwotCi0gIC8qIHRlc3QgdGhlIHJzYV9lbmNyeXB0X2tleSBmdW5jdGlvbnMgKi8KLSAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCi0gICAgaW5beF0gPSB4OwotICB5ID0gc2l6ZW9mIChvdXQpOwotICBpZiAoKGVycm51bSA9Ci0gICAgICAgcnNhX2VuY3J5cHRfa2V5IChpbiwgMTYsIG91dCwgJnksICZwcm5nLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwKLSAgICAgICAgICAgICZrZXkpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgemVyb21lbSAoaW4sIHNpemVvZiAoaW4pKTsKLSAgeCA9IHNpemVvZiAoaW4pOwotICBpZiAoKGVycm51bSA9IHJzYV9kZWNyeXB0X2tleSAob3V0LCB5LCBpbiwgJngsICZrZXkpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgcHJpbnRmICgiUlNBIGVuL2RlIGNyeXB0IGtleSByb3V0aW5lczogIik7Ci0gIGlmICh4ICE9IDE2KSB7Ci0gICAgcHJpbnRmICgiRmFpbGVkIChsZW5ndGgpXG4iKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCi0gICAgaWYgKGluW3hdICE9IHgpIHsKLSAgICAgIHByaW50ZiAoIkZhaWxlZCAoY29udGVudHMpXG4iKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gIHByaW50ZiAoIlBhc3NlZFxuIik7Ci0KLSAgLyogdGVzdCBzaWduX2hhc2ggZnVuY3Rpb25zICovCi0gIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQotICAgIGluW3hdID0geDsKLSAgeCA9IHNpemVvZiAoaW4pOwotICBpZiAoKGVycm51bSA9IHJzYV9zaWduX2hhc2ggKGluLCAxNiwgb3V0LCAmeCwgJmtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiRXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotICBwcmludGYgKCJSU0Egc2lnbmVkIGhhc2g6ICVsdSBieXRlc1xuIiwgeCk7Ci0gIGlmICgoZXJybnVtID0gcnNhX3ZlcmlmeV9oYXNoIChvdXQsIHgsIGluLCAmc3RhdCwgJmtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiRXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotICBwcmludGYgKCJWZXJpZnkgaGFzaDogJXMsICIsIHN0YXQgPyAicGFzc2VkIiA6ICJmYWlsZWQiKTsKLSAgaW5bMF0gXj0gMTsKLSAgaWYgKChlcnJudW0gPSByc2FfdmVyaWZ5X2hhc2ggKG91dCwgeCwgaW4sICZzdGF0LCAma2V5KSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIHByaW50ZiAoIiVzXG4iLCAoIXN0YXQpID8gInBhc3NlZCIgOiAiZmFpbGVkIik7Ci0gIGlmIChzdGF0KQotICAgIGV4aXQgKC0xKTsKLSAgcnNhX2ZyZWUgKCZrZXkpOwotCi0gIC8qIG1ha2UgYSBSU0Ega2V5ICovCi0jaWZkZWYgU09OWV9QUzJfTk9QRQotICBsaW1pdCA9IDEwMjQ7Ci0jZWxzZQotICBsaW1pdCA9IDIwNDg7Ci0jZW5kaWYKLQotICB7Ci0gICAgaW50ICAgICB0dDsKLQotICAgIGZvciAoeiA9IDEwMjQ7IHogPD0gbGltaXQ7IHogKz0gNTEyKSB7Ci0gICAgICB0ID0gWENMT0NLICgpOwotICAgICAgZm9yICh0dCA9IDA7IHR0IDwgMzsgdHQrKykgewotICAgICAgICAgaWYgKChlcnJudW0gPSByc2FfbWFrZV9rZXkgKCZwcm5nLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgeiAvIDgsIDY1NTM3LCAma2V5KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICAgICAgICAgIGV4aXQgKC0xKTsKLSAgICAgICAgIH0KLQotICAgICAgICAgLyogY2hlY2sgbW9kdWx1cyBzaXplICovCi0gICAgICAgICBpZiAobXBfdW5zaWduZWRfYmluX3NpemUoJmtleS5OKSAhPSAoaW50KSh6LzgpKSB7IAotICAgICAgICAgICAgcHJpbnRmKCJcblJTQSBrZXkgc3VwcG9zZWQgdG8gYmUgJWx1IGJpdHMgYnV0IHdhcyAlZCBiaXRzXG4iLCB6LCBtcF9jb3VudF9iaXRzKCZrZXkuTikpOwotICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgICAgICAgfQotCi0gICAgICAgICBpZiAodHQgPCAyKSB7Ci0gICAgICAgICAgICByc2FfZnJlZSAoJmtleSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0ID0gWENMT0NLICgpIC0gdDsKLSAgICAgIHByaW50ZiAoIlRvb2sgJS4wZiBtcyB0byBtYWtlIGEgJWxkLWJpdCBSU0Ega2V5LlxuIiwgMTAwMC4wICogKCgoZG91YmxlKSB0IC8gMy4wKSAvIChkb3VibGUpIFhDTE9DS1NfUEVSX1NFQyksIHopOwotCi0gICAgICAvKiB0aW1lIGVuY3J5cHRpb24gKi8KLSAgICAgIHQgPSBYQ0xPQ0sgKCk7Ci0KLSAgICAgIGZvciAodHQgPSAwOyB0dCA8IDIwOyB0dCsrKSB7Ci0gICAgICAgICB5ID0gc2l6ZW9mIChpbik7Ci0gICAgICAgICBpZiAoKGVycm51bSA9IHJzYV9leHB0bW9kIChpbiwgOCwgb3V0LCAmeSwgUEtfUFVCTElDLCAma2V5KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICAgICAgICAgIGV4aXQgKC0xKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHQgPSBYQ0xPQ0sgKCkgLSB0OwotICAgICAgcHJpbnRmICgiVG9vayAlLjBmIG1zIHRvIGVuY3J5cHQgd2l0aCBhICVsZC1iaXQgUlNBIGtleS5cbiIsCi0gICAgICAgICAgICAgIDEwMDAuMCAqICgoKGRvdWJsZSkgdCAvIDIwLjApIC8gKGRvdWJsZSkgWENMT0NLU19QRVJfU0VDKSwgeik7Ci0KLSAgICAgIC8qIHRpbWUgZGVjcnlwdGlvbiAqLwotICAgICAgdCA9IFhDTE9DSyAoKTsKLSAgICAgIGZvciAodHQgPSAwOyB0dCA8IDIwOyB0dCsrKSB7Ci0gICAgICAgICAgeCA9IHNpemVvZiAob3V0KTsKLSAgICAgICAgICBpZiAoKGVycm51bSA9IHJzYV9leHB0bW9kIChvdXQsIHksIGluLCAmeCwgUEtfUFJJVkFURSwgJmtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICAgICAgcHJpbnRmICgiRXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgICAgICAgICAgIGV4aXQgKC0xKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0ID0gWENMT0NLICgpIC0gdDsKLSAgICAgIHByaW50ZiAoIlRvb2sgJS4wZiBtcyB0byBkZWNyeXB0IHdpdGggYSAlbGQtYml0IFJTQSBrZXkuXG4iLAotICAgICAgMTAwMC4wICogKCgoZG91YmxlKSB0IC8gMjAuMCkgLyAoZG91YmxlKSBYQ0xPQ0tTX1BFUl9TRUMpLCB6KTsKLSAgICAgIHJzYV9mcmVlICgma2V5KTsKLSAgICB9Ci0gIH0KLX0KLSNlbHNlCi12b2lkCi1wYWRfdGVzdCAodm9pZCkKLXsKLSAgcHJpbnRmICgiTVJTQSBub3QgY29tcGlsZWQgaW5cbiIpOwotfQotCi12b2lkCi1yc2FfdGVzdCAodm9pZCkKLXsKLSAgcHJpbnRmICgiTVJTQSBub3QgY29tcGlsZWQgaW5cbiIpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBCQVNFNjQKLXZvaWQKLWJhc2U2NF90ZXN0ICh2b2lkKQotewotICB1bnNpZ25lZCBjaGFyIGJ1ZlsyXVsxMDBdOwotICB1bnNpZ25lZCBsb25nIHgsIHk7Ci0KLSAgcHJpbnRmICgiQmFzZTY0IHRlc3RzXG4iKTsKLSAgemVyb21lbSAoYnVmLCBzaXplb2YgKGJ1ZikpOwotICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKLSAgICBidWZbMF1beF0gPSAodW5zaWduZWQgY2hhcikgeDsKLQotICB4ID0gMTAwOwotICBpZiAoYmFzZTY0X2VuY29kZSAoYnVmWzBdLCAxNiwgYnVmWzFdLCAmeCkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCIgIGVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgcHJpbnRmICgiICBlbmNvZGVkIDE2IGJ5dGVzIHRvICVsZCBieXRlcy4uLlslc11cbiIsIHgsIGJ1ZlsxXSk7Ci0gIG1lbXNldCAoYnVmWzBdLCAwLCAxMDApOwotICB5ID0gMTAwOwotICBpZiAoYmFzZTY0X2RlY29kZSAoYnVmWzFdLCB4LCBidWZbMF0sICZ5KSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIiAgZXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotICBwcmludGYgKCIgIGRlY29kZWQgJWxkIGJ5dGVzIHRvICVsZCBieXRlc1xuIiwgeCwgeSk7Ci0gIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQotICAgIGlmIChidWZbMF1beF0gIT0geCkgewotICAgICAgcHJpbnRmICgiICoqZmFpbGVkKipcbiIpOwotICAgICAgZXhpdCAoLTEpOwotICAgIH0KLSAgcHJpbnRmICgiICBwYXNzZWRcbiIpOwotfQotI2Vsc2UKLXZvaWQKLWJhc2U2NF90ZXN0ICh2b2lkKQotewotICBwcmludGYgKCJCYXNlNjQgbm90IGNvbXBpbGVkIGluXG4iKTsKLX0KLSNlbmRpZgotCi12b2lkCi10aW1lX2hhc2ggKHZvaWQpCi17Ci0gIGNsb2NrX3QgdDE7Ci0gIGludCAgICAgeCwgeTsKLSAgdW5zaWduZWQgbG9uZyB6OwotICB1bnNpZ25lZCBjaGFyIGlucHV0WzQwOTZdLCBvdXRbTUFYQkxPQ0tTSVpFXTsKLSAgcHJpbnRmICgiSGFzaCBUaW1lIFRyaWFscyAoNEtCIGJsb2Nrcyk6XG4iKTsKLSAgZm9yICh4ID0gMDsgaGFzaF9kZXNjcmlwdG9yW3hdLm5hbWUgIT0gTlVMTDsgeCsrKSB7Ci0gICAgdDEgPSBYQ0xPQ0sgKCk7Ci0gICAgeiA9IHNpemVvZiAob3V0KTsKLSAgICB5ID0gMDsKLSAgICB3aGlsZSAoWENMT0NLICgpIC0gdDEgPCAoNSAqIFhDTE9DS1NfUEVSX1NFQykpIHsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgaGFzaF9tZW1vcnkgKHgsIGlucHV0LCA0MDk2LCBvdXQsICZ6KTsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgaGFzaF9tZW1vcnkgKHgsIGlucHV0LCA0MDk2LCBvdXQsICZ6KTsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgaGFzaF9tZW1vcnkgKHgsIGlucHV0LCA0MDk2LCBvdXQsICZ6KTsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgaGFzaF9tZW1vcnkgKHgsIGlucHV0LCA0MDk2LCBvdXQsICZ6KTsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgaGFzaF9tZW1vcnkgKHgsIGlucHV0LCA0MDk2LCBvdXQsICZ6KTsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgaGFzaF9tZW1vcnkgKHgsIGlucHV0LCA0MDk2LCBvdXQsICZ6KTsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgaGFzaF9tZW1vcnkgKHgsIGlucHV0LCA0MDk2LCBvdXQsICZ6KTsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgaGFzaF9tZW1vcnkgKHgsIGlucHV0LCA0MDk2LCBvdXQsICZ6KTsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgaGFzaF9tZW1vcnkgKHgsIGlucHV0LCA0MDk2LCBvdXQsICZ6KTsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgaGFzaF9tZW1vcnkgKHgsIGlucHV0LCA0MDk2LCBvdXQsICZ6KTsKLSAgICAgIGhhc2hfbWVtb3J5ICh4LCBpbnB1dCwgNDA5Niwgb3V0LCAmeik7Ci0gICAgICBoYXNoX21lbW9yeSAoeCwgaW5wdXQsIDQwOTYsIG91dCwgJnopOwotICAgICAgeSArPSAzMjsKLSAgICB9Ci0gICAgdDEgPSBYQ0xPQ0sgKCkgLSB0MTsKLSAgICBwcmludGYgKCIlLTIwczogSGFzaCBhdCAlNS4yZiBNYml0L3NlY1xuIiwgaGFzaF9kZXNjcmlwdG9yW3hdLm5hbWUsCi0gICAgICAgICgoOC4wICogNDA5Ni4wKSAqCi0gICAgICAgICAoKGRvdWJsZSkgeSAvICgoZG91YmxlKSB0MSAvIChkb3VibGUpIFhDTE9DS1NfUEVSX1NFQykpKSAvCi0gICAgICAgIDEwMDAwMDAuMCk7Ci0gIH0KLX0KLQotdm9pZAotdGltZV9lY2IgKHZvaWQpCi17Ci0gIGNsb2NrX3QgdDEsIHQyOwotICBsb25nICAgIHgsIHkxLCB5MjsKLSAgdW5zaWduZWQgY2hhciBwdFszMl0sIGtleVszMl07Ci0gIHN5bW1ldHJpY19rZXkgc2tleTsKLSAgdm9pZCAgICAoKmZ1bmMpIChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgc3ltbWV0cmljX2tleSAqKTsKLQotICBwcmludGYgKCJFQ0IgVGltZSBUcmlhbHMgZm9yIHRoZSBTeW1tZXRyaWMgQ2lwaGVyczpcbiIpOwotICBmb3IgKHggPSAwOyBjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEw7IHgrKykgewotICAgIGNpcGhlcl9kZXNjcmlwdG9yW3hdLnNldHVwIChrZXksIGNpcGhlcl9kZXNjcmlwdG9yW3hdLm1pbl9rZXlfbGVuZ3RoLCAwLAotICAgICAgICAgICAgICAgICZza2V5KTsKLQotI2RlZmluZSBETzEgICBmdW5jKHB0LHB0LCZza2V5KTsKLSNkZWZpbmUgRE8yICAgRE8xIERPMQotI2RlZmluZSBETzQgICBETzIgRE8yCi0jZGVmaW5lIERPOCAgIERPNCBETzQKLSNkZWZpbmUgRE8xNiAgRE84IERPOAotI2RlZmluZSBETzMyICBETzE2IERPMTYKLSNkZWZpbmUgRE82NCAgRE8zMiBETzMyCi0jZGVmaW5lIERPMTI4IERPNjQgRE82NAotI2RlZmluZSBETzI1NiBETzEyOCBETzEyOAotCi0gICAgZnVuYyA9IGNpcGhlcl9kZXNjcmlwdG9yW3hdLmVjYl9lbmNyeXB0OwotICAgIHkxID0gMDsKLSAgICB0MSA9IFhDTE9DSyAoKTsKLSAgICB3aGlsZSAoWENMT0NLICgpIC0gdDEgPCAzICogWENMT0NLU19QRVJfU0VDKSB7Ci0gICAgICBETzI1NjsKLSAgICAgIHkxICs9IDI1NjsKLSAgICB9Ci0gICAgdDEgPSBYQ0xPQ0sgKCkgLSB0MTsKLQotICAgIGZ1bmMgPSBjaXBoZXJfZGVzY3JpcHRvclt4XS5lY2JfZGVjcnlwdDsKLSAgICB5MiA9IDA7Ci0gICAgdDIgPSBYQ0xPQ0sgKCk7Ci0gICAgd2hpbGUgKFhDTE9DSyAoKSAtIHQyIDwgMyAqIFhDTE9DS1NfUEVSX1NFQykgewotICAgICAgRE8yNTY7Ci0gICAgICB5MiArPSAyNTY7Ci0gICAgfQotICAgIHQyID0gWENMT0NLICgpIC0gdDI7Ci0gICAgcHJpbnRmCi0gICAgICAoIiUtMjBzOiBFbmNyeXB0IGF0ICU1LjJmIE1iaXQvc2VjIGFuZCBEZWNyeXB0IGF0ICU1LjJmIE1iaXQvc2VjXG4iLAotICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW3hdLm5hbWUsCi0gICAgICAgKCg4LjAgKiAoZG91YmxlKSBjaXBoZXJfZGVzY3JpcHRvclt4XS5ibG9ja19sZW5ndGgpICoKLSAgICAoKGRvdWJsZSkgeTEgLyAoKGRvdWJsZSkgdDEgLyAoZG91YmxlKSBYQ0xPQ0tTX1BFUl9TRUMpKSkgLyAxMDAwMDAwLjAsCi0gICAgICAgKCg4LjAgKiAoZG91YmxlKSBjaXBoZXJfZGVzY3JpcHRvclt4XS5ibG9ja19sZW5ndGgpICoKLSAgICAoKGRvdWJsZSkgeTIgLyAoKGRvdWJsZSkgdDIgLyAoZG91YmxlKSBYQ0xPQ0tTX1BFUl9TRUMpKSkgLwotICAgICAgIDEwMDAwMDAuMCk7Ci0KLSN1bmRlZiBETzI1NgotI3VuZGVmIERPMTI4Ci0jdW5kZWYgRE82NAotI3VuZGVmIERPMzIKLSN1bmRlZiBETzE2Ci0jdW5kZWYgRE84Ci0jdW5kZWYgRE80Ci0jdW5kZWYgRE8yCi0jdW5kZWYgRE8xCi0gIH0KLX0KLQotI2lmZGVmIE1ESAotdm9pZAotZGhfdGVzdHMgKHZvaWQpCi17Ci0gIHVuc2lnbmVkIGNoYXIgYnVmWzNdWzQwOTZdOwotICB1bnNpZ25lZCBsb25nIHgsIHksIHo7Ci0gIGludCAgICAgbG93LCBoaWdoLCBzdGF0LCBzdGF0MjsKLSAgZGhfa2V5ICB1c2VyYSwgdXNlcmI7Ci0gIGNsb2NrX3QgdDE7Ci0KLSAgcHJpbnRmKCJUZXN0aW5nIGJ1aWx0aW5nIERIIHBhcmFtZXRlcnMuLi4uIik7IGZmbHVzaChzdGRvdXQpOwotICBpZiAoKGVycm51bSA9IGRoX3Rlc3QoKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgcHJpbnRmKCJESCBFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnJudW0pKTsKLSAgICAgZXhpdCgtMSk7Ci0gIH0KLSAgcHJpbnRmKCJQYXNzZWQuXG4iKTsKLQotICBkaF9zaXplcyAoJmxvdywgJmhpZ2gpOwotICBwcmludGYgKCJESCBLZXlzIGZyb20gJWQgdG8gJWQgc3VwcG9ydGVkLlxuIiwgbG93ICogOCwgaGlnaCAqIDgpOwotCi0gIC8qIG1ha2UgdXAgdHdvIGtleXMgKi8KLSAgaWYgKChlcnJudW0gPQotICAgICAgIGRoX21ha2Vfa2V5ICgmcHJuZywgZmluZF9wcm5nICgieWFycm93IiksIDk2LCAmdXNlcmEpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgaWYgKChlcnJudW0gPQotICAgICAgIGRoX21ha2Vfa2V5ICgmcHJuZywgZmluZF9wcm5nICgieWFycm93IiksIDk2LCAmdXNlcmIpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLQotICAvKiBtYWtlIHRoZSBzaGFyZWQgc2VjcmV0ICovCi0gIHggPSA0MDk2OwotICBpZiAoKGVycm51bSA9IGRoX3NoYXJlZF9zZWNyZXQgKCZ1c2VyYSwgJnVzZXJiLCBidWZbMF0sICZ4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0KLSAgeSA9IDQwOTY7Ci0gIGlmICgoZXJybnVtID0gZGhfc2hhcmVkX3NlY3JldCAoJnVzZXJiLCAmdXNlcmEsIGJ1ZlsxXSwgJnkpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgaWYgKHkgIT0geCkgewotICAgIHByaW50ZiAoIkRIIFNoYXJlZCBrZXlzIGFyZSBub3Qgc2FtZSBzaXplLlxuIik7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIGlmIChtZW1jbXAgKGJ1ZlswXSwgYnVmWzFdLCB4KSkgewotICAgIHByaW50ZiAoIkRIIFNoYXJlZCBrZXlzIG5vdCBzYW1lIGNvbnRlbnRzLlxuIik7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0KLSAgLyogbm93IGV4cG9ydCB1c2VyYiAqLwotICB5ID0gNDA5NjsKLSAgaWYgKChlcnJudW0gPSBkaF9leHBvcnQgKGJ1ZlsxXSwgJnksIFBLX1BVQkxJQywgJnVzZXJiKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIGRoX2ZyZWUgKCZ1c2VyYik7Ci0KLSAgLyogaW1wb3J0IGFuZCBtYWtlIHRoZSBzaGFyZWQgc2VjcmV0IGFnYWluICovCi0gIGlmICgoZXJybnVtID0gZGhfaW1wb3J0IChidWZbMV0sIHksICZ1c2VyYikpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiRXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotICB6ID0gNDA5NjsKLSAgaWYgKChlcnJudW0gPSBkaF9zaGFyZWRfc2VjcmV0ICgmdXNlcmEsICZ1c2VyYiwgYnVmWzJdLCAmeikpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiRXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotCi0gIHByaW50ZiAoIkRIIHJvdXRpbmVzOiAiKTsKLSAgaWYgKHogIT0geCkgewotICAgIHByaW50ZiAoImZhaWxlZC4gIFNpemUgZG9uJ3QgbWF0Y2g/XG4iKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgaWYgKG1lbWNtcCAoYnVmWzBdLCBidWZbMl0sIHgpKSB7Ci0gICAgcHJpbnRmICgiRmFpbGVkLiAgQ29udGVudCBkaWRuJ3QgbWF0Y2guXG4iKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgcHJpbnRmICgiUGFzc2VkXG4iKTsKLSAgZGhfZnJlZSAoJnVzZXJhKTsKLSAgZGhfZnJlZSAoJnVzZXJiKTsKLQotLyogdGltZSBzdHVmZiAqLwotICB7Ci0gICAgc3RhdGljIGludCBzaXplc1tdID0geyA5NiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0LCA1MTIgfTsKLSAgICBpbnQgICAgIGlpLCB0dDsKLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IChpbnQpIChzaXplb2YgKHNpemVzKSAvIHNpemVvZiAoc2l6ZXNbMF0pKTsgaWkrKykgewotICAgICAgdDEgPSBYQ0xPQ0sgKCk7Ci0gICAgICBmb3IgKHR0ID0gMDsgdHQgPCAyNTsgdHQrKykgewotICAgIGRoX21ha2Vfa2V5ICgmcHJuZywgZmluZF9wcm5nICgieWFycm93IiksIHNpemVzW2lpXSwgJnVzZXJhKTsKLSAgICBkaF9mcmVlICgmdXNlcmEpOwotICAgICAgfQotICAgICAgdDEgPSBYQ0xPQ0sgKCkgLSB0MTsKLSAgICAgIHByaW50ZiAoIk1ha2UgZGgtJWQga2V5IHRvb2sgJWYgbXNlY1xuIiwgc2l6ZXNbaWldICogOCwKLSAgICAgICAgICAxMDAwLjAgKiAoKChkb3VibGUpIHQxIC8gMjUuMCkgLyAoZG91YmxlKSBYQ0xPQ0tTX1BFUl9TRUMpKTsKLSAgICB9Ci0gIH0KLQotLyogdGVzdCBlbmNyeXB0X2tleSAqLwotICBkaF9tYWtlX2tleSAoJnBybmcsIGZpbmRfcHJuZyAoInlhcnJvdyIpLCAxMjgsICZ1c2VyYSk7Ci0gIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQotICAgIGJ1ZlswXVt4XSA9IHg7Ci0gIHkgPSBzaXplb2YgKGJ1ZlsxXSk7Ci0gIGlmICgoZXJybnVtID0KLSAgICAgICBkaF9lbmNyeXB0X2tleSAoYnVmWzBdLCAxNiwgYnVmWzFdLCAmeSwgJnBybmcsIGZpbmRfcHJuZyAoInlhcnJvdyIpLAotICAgICAgICAgICAgICAgZmluZF9oYXNoICgibWQ1IiksICZ1c2VyYSkpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiRXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotICB6ZXJvbWVtIChidWZbMF0sIHNpemVvZiAoYnVmWzBdKSk7Ci0gIHggPSBzaXplb2YgKGJ1ZlswXSk7Ci0gIGlmICgoZXJybnVtID0gZGhfZGVjcnlwdF9rZXkgKGJ1ZlsxXSwgeSwgYnVmWzBdLCAmeCwgJnVzZXJhKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIHByaW50ZiAoIkRIIGVuL2RlIGNyeXB0IGtleSByb3V0aW5lczogIik7Ci0gIGlmICh4ICE9IDE2KSB7Ci0gICAgcHJpbnRmICgiRmFpbGVkIChsZW5ndGgpXG4iKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCi0gICAgaWYgKGJ1ZlswXVt4XSAhPSB4KSB7Ci0gICAgICBwcmludGYgKCJGYWlsZWQgKGNvbnRlbnRzKVxuIik7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgfQotICBwcmludGYgKCJQYXNzZWQgKHNpemUgJWx1KVxuIiwgeSk7Ci0KLS8qIHRlc3Qgc2lnbl9oYXNoICovCi0gIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQotICAgIGJ1ZlswXVt4XSA9IHg7Ci0gIHggPSBzaXplb2YgKGJ1ZlsxXSk7Ci0gIGlmICgoZXJybnVtID0KLSAgICAgICBkaF9zaWduX2hhc2ggKGJ1ZlswXSwgMTYsIGJ1ZlsxXSwgJngsICZwcm5nLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwKLSAgICAgICAgICAgICAmdXNlcmEpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgaWYgKChlcnJudW0gPSBkaF92ZXJpZnlfaGFzaCAoYnVmWzFdLCB4LCBidWZbMF0sIDE2LCAmc3RhdCwgJnVzZXJhKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIGJ1ZlswXVswXSBePSAxOwotICBpZiAoKGVycm51bSA9IGRoX3ZlcmlmeV9oYXNoIChidWZbMV0sIHgsIGJ1ZlswXSwgMTYsICZzdGF0MiwgJnVzZXJhKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIHByaW50ZiAoImRoX3NpZ24vdmVyaWZ5X2hhc2g6ICVzICglZCwlZCksICVsdVxuIiwKLSAgICAgICgoc3RhdCA9PSAxKQotICAgICAgICYmIChzdGF0MiA9PSAwKSkgPyAicGFzc2VkIiA6ICJmYWlsZWQiLCBzdGF0LCBzdGF0MiwgeCk7Ci0gIGRoX2ZyZWUgKCZ1c2VyYSk7Ci19Ci0jZWxzZQotdm9pZAotZGhfdGVzdHMgKHZvaWQpCi17Ci0gIHByaW50ZiAoIk1ESCBub3QgY29tcGlsZWQgaW5cbiIpOwotfQotI2VuZGlmCi0KLWludCAgICAgY2FsbGJhY2tfeCA9IDA7Ci12b2lkCi1jYWxsYmFjayAodm9pZCkKLXsKLSAgcHJpbnRmICgiJWNceDA4IiwgIi1cXHwvIlsrK2NhbGxiYWNrX3ggJiAzXSk7Ci0jaWZuZGVmIFNPTllfUFMyCi0gIGZmbHVzaCAoc3Rkb3V0KTsKLSNlbmRpZgotfQotCi12b2lkCi1ybmdfdGVzdHMgKHZvaWQpCi17Ci0gIHVuc2lnbmVkIGNoYXIgYnVmWzE2XTsKLSAgY2xvY2tfdCB0MTsKLSAgaW50ICAgICB4LCB5OwotCi0gIHByaW50ZiAoIlJORyB0ZXN0c1xuIik7Ci0gIHQxID0gWENMT0NLICgpOwotICB4ID0gcm5nX2dldF9ieXRlcyAoYnVmLCBzaXplb2YgKGJ1ZiksICZjYWxsYmFjayk7Ci0gIHQxID0gWENMT0NLICgpIC0gdDE7Ci0gIHByaW50ZiAoIiAgJWYgYnl0ZXMgcGVyIHNlY29uZC4uLiIsCi0gICAgICAoZG91YmxlKSB4IC8gKChkb3VibGUpIHQxIC8gKGRvdWJsZSkgWENMT0NLU19QRVJfU0VDKSk7Ci0gIHByaW50ZiAoInJlYWQgJWQgYnl0ZXMuXG4gICIsIHgpOwotICBmb3IgKHkgPSAwOyB5IDwgeDsgeSsrKQotICAgIHByaW50ZiAoIiUwMnggIiwgYnVmW3ldKTsKLSAgcHJpbnRmICgiXG4iKTsKLQotI2lmZGVmIFlBUlJPVwotICBpZiAoKGVycm51bSA9Ci0gICAgICAgcm5nX21ha2VfcHJuZyAoMTI4LCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgJnBybmcsCi0gICAgICAgICAgICAgICZjYWxsYmFjaykpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiIHN0YXJ0aW5nIHlhcnJvdyBlcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0jZW5kaWYKLX0KLQotI2lmZGVmIE1FQ0MKLXZvaWQKLWVjY190ZXN0cyAodm9pZCkKLXsKLSAgdW5zaWduZWQgY2hhciBidWZbNF1bNDA5Nl07Ci0gIHVuc2lnbmVkIGxvbmcgeCwgeSwgejsKLSAgaW50ICAgICBzdGF0LCBzdGF0MiwgbG93LCBoaWdoOwotICBlY2Nfa2V5IHVzZXJhLCB1c2VyYjsKLSAgY2xvY2tfdCB0MTsKLQotICBpZiAoKGVycm51bSA9IGVjY190ZXN0ICgpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoImVjYyBFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0KLSAgZWNjX3NpemVzICgmbG93LCAmaGlnaCk7Ci0gIHByaW50ZiAoImVjYyBLZXlzIGZyb20gJWQgdG8gJWQgc3VwcG9ydGVkLlxuIiwgbG93ICogOCwgaGlnaCAqIDgpOwotCi0gIC8qIG1ha2UgdXAgdHdvIGtleXMgKi8KLSAgaWYgKChlcnJudW0gPQotICAgICAgIGVjY19tYWtlX2tleSAoJnBybmcsIGZpbmRfcHJuZyAoInlhcnJvdyIpLCAyNCwgJnVzZXJhKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIGlmICgoZXJybnVtID0KLSAgICAgICBlY2NfbWFrZV9rZXkgKCZwcm5nLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgMjQsICZ1c2VyYikpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiRXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotCi0gIC8qIG1ha2UgdGhlIHNoYXJlZCBzZWNyZXQgKi8KLSAgeCA9IDQwOTY7Ci0gIGlmICgoZXJybnVtID0gZWNjX3NoYXJlZF9zZWNyZXQgKCZ1c2VyYSwgJnVzZXJiLCBidWZbMF0sICZ4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0KLSAgeSA9IDQwOTY7Ci0gIGlmICgoZXJybnVtID0gZWNjX3NoYXJlZF9zZWNyZXQgKCZ1c2VyYiwgJnVzZXJhLCBidWZbMV0sICZ5KSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0KLSAgaWYgKHkgIT0geCkgewotICAgIHByaW50ZiAoImVjYyBTaGFyZWQga2V5cyBhcmUgbm90IHNhbWUgc2l6ZS5cbiIpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotCi0gIGlmIChtZW1jbXAgKGJ1ZlswXSwgYnVmWzFdLCB4KSkgewotICAgIHByaW50ZiAoImVjYyBTaGFyZWQga2V5cyBub3Qgc2FtZSBjb250ZW50cy5cbiIpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotCi0gIC8qIG5vdyBleHBvcnQgdXNlcmIgKi8KLSAgeSA9IDQwOTY7Ci0gIGlmICgoZXJybnVtID0gZWNjX2V4cG9ydCAoYnVmWzFdLCAmeSwgUEtfUFVCTElDLCAmdXNlcmIpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgZWNjX2ZyZWUgKCZ1c2VyYik7Ci0gIHByaW50ZiAoIkVDQy0xOTIgZXhwb3J0IHRvb2sgJWxkIGJ5dGVzXG4iLCB5KTsKLQotICAvKiBpbXBvcnQgYW5kIG1ha2UgdGhlIHNoYXJlZCBzZWNyZXQgYWdhaW4gKi8KLSAgaWYgKChlcnJudW0gPSBlY2NfaW1wb3J0IChidWZbMV0sIHksICZ1c2VyYikpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiRXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotCi0gIHogPSA0MDk2OwotICBpZiAoKGVycm51bSA9IGVjY19zaGFyZWRfc2VjcmV0ICgmdXNlcmEsICZ1c2VyYiwgYnVmWzJdLCAmeikpICE9IENSWVBUX09LKSB7Ci0gICAgcHJpbnRmICgiRXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICAgIGV4aXQgKC0xKTsKLSAgfQotCi0gIHByaW50ZiAoImVjYyByb3V0aW5lczogIik7Ci0gIGlmICh6ICE9IHgpIHsKLSAgICBwcmludGYgKCJmYWlsZWQuICBTaXplIGRvbid0IG1hdGNoP1xuIik7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIGlmIChtZW1jbXAgKGJ1ZlswXSwgYnVmWzJdLCB4KSkgewotICAgIHByaW50ZiAoIkZhaWxlZC4gIENvbnRlbnQgZGlkbid0IG1hdGNoLlxuIik7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIHByaW50ZiAoIlBhc3NlZFxuIik7Ci0gIGVjY19mcmVlICgmdXNlcmEpOwotICBlY2NfZnJlZSAoJnVzZXJiKTsKLQotLyogdGltZSBzdHVmZiAqLwotICB7Ci0gICAgc3RhdGljIGludCBzaXplc1tdID0geyAyMCwgMjQsIDI4LCAzMiwgNDgsIDY1IH07Ci0gICAgaW50ICAgICBpaSwgdHQ7Ci0KLSAgICBmb3IgKGlpID0gMDsgaWkgPCAoaW50KSAoc2l6ZW9mIChzaXplcykgLyBzaXplb2YgKHNpemVzWzBdKSk7IGlpKyspIHsKLSAgICAgIHQxID0gWENMT0NLICgpOwotICAgICAgZm9yICh0dCA9IDA7IHR0IDwgMTA7IHR0KyspIHsKLSAgICBpZiAoKGVycm51bSA9Ci0gICAgICAgICBlY2NfbWFrZV9rZXkgKCZwcm5nLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgc2l6ZXNbaWldLAotICAgICAgICAgICAgICAgJnVzZXJhKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICAgIGV4aXQgKC0xKTsKLSAgICB9Ci0gICAgZWNjX2ZyZWUgKCZ1c2VyYSk7Ci0gICAgICB9Ci0gICAgICB0MSA9IFhDTE9DSyAoKSAtIHQxOwotICAgICAgcHJpbnRmICgiTWFrZSBFQ0MtJWQga2V5IHRvb2sgJWYgbXNlY1xuIiwgc2l6ZXNbaWldICogOCwKLSAgICAgICAgICAxMDAwLjAgKiAoKChkb3VibGUpIHQxIC8gMTAuMCkgLyAoZG91YmxlKSBYQ0xPQ0tTX1BFUl9TRUMpKTsKLSAgICB9Ci0gIH0KLQotLyogdGVzdCBlbmNyeXB0X2tleSAqLwotICBlY2NfbWFrZV9rZXkgKCZwcm5nLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgMjAsICZ1c2VyYSk7Ci0gIGZvciAoeCA9IDA7IHggPCAzMjsgeCsrKQotICAgIGJ1ZlswXVt4XSA9IHg7Ci0gIHkgPSBzaXplb2YgKGJ1ZlsxXSk7Ci0gIGlmICgoZXJybnVtID0KLSAgICAgICBlY2NfZW5jcnlwdF9rZXkgKGJ1ZlswXSwgMzIsIGJ1ZlsxXSwgJnksICZwcm5nLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwKLSAgICAgICAgICAgIGZpbmRfaGFzaCAoInNoYTI1NiIpLCAmdXNlcmEpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgemVyb21lbSAoYnVmWzBdLCBzaXplb2YgKGJ1ZlswXSkpOwotICB4ID0gc2l6ZW9mIChidWZbMF0pOwotICBpZiAoKGVycm51bSA9IGVjY19kZWNyeXB0X2tleSAoYnVmWzFdLCB5LCBidWZbMF0sICZ4LCAmdXNlcmEpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgcHJpbnRmICgiRUNDIGVuL2RlIGNyeXB0IGtleSByb3V0aW5lczogIik7Ci0gIGlmICh4ICE9IDMyKSB7Ci0gICAgcHJpbnRmICgiRmFpbGVkIChsZW5ndGgpXG4iKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgZm9yICh4ID0gMDsgeCA8IDMyOyB4KyspCi0gICAgaWYgKGJ1ZlswXVt4XSAhPSB4KSB7Ci0gICAgICBwcmludGYgKCJGYWlsZWQgKGNvbnRlbnRzKVxuIik7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgfQotICBwcmludGYgKCJQYXNzZWQgKHNpemU6ICVsdSlcbiIsIHkpOwotLyogdGVzdCBzaWduX2hhc2ggKi8KLSAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCi0gICAgYnVmWzBdW3hdID0geDsKLSAgeCA9IHNpemVvZiAoYnVmWzFdKTsKLSAgaWYgKChlcnJudW0gPQotICAgICAgIGVjY19zaWduX2hhc2ggKGJ1ZlswXSwgMTYsIGJ1ZlsxXSwgJngsICZwcm5nLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwKLSAgICAgICAgICAgICAgJnVzZXJhKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIHByaW50ZigiU2lnbmF0dXJlIHNpemU6ICVsdVxuIiwgeCk7Ci0gIGlmIChlY2NfdmVyaWZ5X2hhc2ggKGJ1ZlsxXSwgeCwgYnVmWzBdLCAxNiwgJnN0YXQsICZ1c2VyYSkpIHsKLSAgICBwcmludGYgKCJFcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gICAgZXhpdCAoLTEpOwotICB9Ci0gIGJ1ZlswXVswXSBePSAxOwotICBpZiAoZWNjX3ZlcmlmeV9oYXNoIChidWZbMV0sIHgsIGJ1ZlswXSwgMTYsICZzdGF0MiwgJnVzZXJhKSkgewotICAgIHByaW50ZiAoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nIChlcnJudW0pKTsKLSAgICBleGl0ICgtMSk7Ci0gIH0KLSAgcHJpbnRmICgiZWNjX3NpZ24vdmVyaWZ5X2hhc2g6ICVzICglZCwlZClcbiIsCi0gICAgICAoKHN0YXQgPT0gMSkgJiYgKHN0YXQyID09IDApKSA/ICJwYXNzZWQiIDogImZhaWxlZCIsIHN0YXQsIHN0YXQyKTsKLSAgZWNjX2ZyZWUgKCZ1c2VyYSk7Ci19Ci0jZWxzZQotdm9pZAotZWNjX3Rlc3RzICh2b2lkKQotewotICBwcmludGYgKCJNRUNDIG5vdCBjb21waWxlZCBpblxuIik7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIE1QSQotdm9pZAotdGVzdF9wcmltZSAodm9pZCkKLXsKLSAgY2hhciBidWZbMTAyNF07Ci0gIG1wX2ludCAgYTsKLSAgaW50ICAgICB4OwotCi0gIC8qIG1ha2UgYSAxMDI0IGJpdCBwcmltZSAqLwotICBtcF9pbml0ICgmYSk7Ci0gIHJhbmRfcHJpbWUgKCZhLCAxMjgqOCwgJnBybmcsIGZpbmRfcHJuZyAoInlhcnJvdyIpKTsKLQotICAvKiBkdW1wIGl0ICovCi0gIG1wX3RvZGVjaW1hbCAoJmEsIGJ1Zik7Ci0gIHByaW50ZiAoIjEwMjQtYml0IHByaW1lOlxuIik7Ci0gIGZvciAoeCA9IDA7IHggPCAoaW50KSBzdHJsZW4gKGJ1Zik7KSB7Ci0gICAgcHJpbnRmICgiJWMiLCBidWZbeF0pOwotICAgIGlmICghKCsreCAlIDYwKSkKLSAgICAgIHByaW50ZiAoIlxcIFxuIik7Ci0gIH0KLSAgcHJpbnRmICgiXG5cbiIpOwotCi0gIG1wX2NsZWFyICgmYSk7Ci19Ci0jZWxzZQotdm9pZAotdGVzdF9wcmltZSAodm9pZCkKLXsKLSAgcHJpbnRmICgiTVBJIG5vdCBjb21waWxlZCBpblxuIik7Ci19Ci0jZW5kaWYKLQotdm9pZAotcmVnaXN0ZXJfYWxsX2FsZ3MgKHZvaWQpCi17Ci0jaWZkZWYgUklKTkRBRUwKLSAgcmVnaXN0ZXJfY2lwaGVyICgmYWVzX2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgQkxPV0ZJU0gKLSAgcmVnaXN0ZXJfY2lwaGVyICgmYmxvd2Zpc2hfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBYVEVBCi0gIHJlZ2lzdGVyX2NpcGhlciAoJnh0ZWFfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBSQzUKLSAgcmVnaXN0ZXJfY2lwaGVyICgmcmM1X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgUkM2Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnJjNl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFNBRkVSUAotICByZWdpc3Rlcl9jaXBoZXIgKCZzYWZlcnBfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBUV09GSVNICi0gIHJlZ2lzdGVyX2NpcGhlciAoJnR3b2Zpc2hfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBTQUZFUgotICByZWdpc3Rlcl9jaXBoZXIgKCZzYWZlcl9rNjRfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVyX3NrNjRfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVyX2sxMjhfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVyX3NrMTI4X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgUkMyCi0gIHJlZ2lzdGVyX2NpcGhlciAoJnJjMl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIERFUwotICByZWdpc3Rlcl9jaXBoZXIgKCZkZXNfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJmRlczNfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBDQVNUNQotICByZWdpc3Rlcl9jaXBoZXIgKCZjYXN0NV9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIE5PRUtFT04KLSAgcmVnaXN0ZXJfY2lwaGVyICgmbm9la2Vvbl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFNLSVBKQUNLCi0gIHJlZ2lzdGVyX2NpcGhlciAoJnNraXBqYWNrX2Rlc2MpOwotI2VuZGlmCi0gIHJlZ2lzdGVyX2NpcGhlciAoJm51bGxfZGVzYyk7Ci0KLSNpZmRlZiBUSUdFUgotICByZWdpc3Rlcl9oYXNoICgmdGlnZXJfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBNRDIKLSAgcmVnaXN0ZXJfaGFzaCAoJm1kMl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIE1ENAotICByZWdpc3Rlcl9oYXNoICgmbWQ0X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgTUQ1Ci0gIHJlZ2lzdGVyX2hhc2ggKCZtZDVfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBTSEExCi0gIHJlZ2lzdGVyX2hhc2ggKCZzaGExX2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgU0hBMjU2Ci0gIHJlZ2lzdGVyX2hhc2ggKCZzaGEyNTZfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBTSEEyMjQKLSAgcmVnaXN0ZXJfaGFzaCAoJnNoYTIyNF9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFNIQTM4NAotICByZWdpc3Rlcl9oYXNoICgmc2hhMzg0X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgU0hBNTEyCi0gIHJlZ2lzdGVyX2hhc2ggKCZzaGE1MTJfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBSSVBFTUQxMjgKLSAgcmVnaXN0ZXJfaGFzaCAoJnJtZDEyOF9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFJJUEVNRDE2MAotICByZWdpc3Rlcl9oYXNoICgmcm1kMTYwX2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgV0hJUkxQT09MCi0gIHJlZ2lzdGVyX2hhc2ggKCZ3aGlybHBvb2xfZGVzYyk7Ci0jZW5kaWYKLQotI2lmZGVmIFlBUlJPVwotICByZWdpc3Rlcl9wcm5nICgmeWFycm93X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgU1BSTkcKLSAgcmVnaXN0ZXJfcHJuZyAoJnNwcm5nX2Rlc2MpOwotI2VuZGlmCi19Ci0KLXZvaWQKLXRlc3RfZXJycyAodm9pZCkKLXsKLSNkZWZpbmUgRVJSKHgpICBwcmludGYoIiUyNXMgPT4gJXNcbiIsICN4LCBlcnJvcl90b19zdHJpbmcoeCkpOwotCi0gIEVSUiAoQ1JZUFRfT0spOwotICBFUlIgKENSWVBUX0VSUk9SKTsKLQotICBFUlIgKENSWVBUX0lOVkFMSURfS0VZU0laRSk7Ci0gIEVSUiAoQ1JZUFRfSU5WQUxJRF9ST1VORFMpOwotICBFUlIgKENSWVBUX0ZBSUxfVEVTVFZFQ1RPUik7Ci0KLSAgRVJSIChDUllQVF9CVUZGRVJfT1ZFUkZMT1cpOwotICBFUlIgKENSWVBUX0lOVkFMSURfUEFDS0VUKTsKLQotICBFUlIgKENSWVBUX0lOVkFMSURfUFJOR1NJWkUpOwotICBFUlIgKENSWVBUX0VSUk9SX1JFQURQUk5HKTsKLQotICBFUlIgKENSWVBUX0lOVkFMSURfQ0lQSEVSKTsKLSAgRVJSIChDUllQVF9JTlZBTElEX0hBU0gpOwotICBFUlIgKENSWVBUX0lOVkFMSURfUFJORyk7Ci0KLSAgRVJSIChDUllQVF9NRU0pOwotCi0gIEVSUiAoQ1JZUFRfUEtfVFlQRV9NSVNNQVRDSCk7Ci0gIEVSUiAoQ1JZUFRfUEtfTk9UX1BSSVZBVEUpOwotCi0gIEVSUiAoQ1JZUFRfSU5WQUxJRF9BUkcpOwotICBFUlIgKENSWVBUX0ZJTEVfTk9URk9VTkQpOwotCi0gIEVSUiAoQ1JZUFRfUEtfSU5WQUxJRF9UWVBFKTsKLSAgRVJSIChDUllQVF9QS19JTlZBTElEX1NZU1RFTSk7Ci0gIEVSUiAoQ1JZUFRfUEtfRFVQKTsKLSAgRVJSIChDUllQVF9QS19OT1RfRk9VTkQpOwotICBFUlIgKENSWVBUX1BLX0lOVkFMSURfU0laRSk7Ci0KLSAgRVJSIChDUllQVF9JTlZBTElEX1BSSU1FX1NJWkUpOwotfQotCi0KLXZvaWQgZHNhX3Rlc3RzKHZvaWQpCi17Ci0gICB1bnNpZ25lZCBjaGFyIG1zZ1sxNl0sIG91dFsxMDI0XSwgb3V0MlsxMDI0XTsKLSAgIHVuc2lnbmVkIGxvbmcgeCwgeTsKLSAgIGludCBlcnIsIHN0YXQxLCBzdGF0MjsKLSAgIGRzYV9rZXkga2V5LCBrZXkyOwotCi0gICAvKiBtYWtlIGEgcmFuZG9tIGtleSAqLwotICAgaWYgKChlcnIgPSBkc2FfbWFrZV9rZXkoJnBybmcsIGZpbmRfcHJuZygieWFycm93IiksIDIwLCAxMjgsICZrZXkpKSAhPSBDUllQVF9PSykgewotICAgICAgcHJpbnRmKCJFcnJvciBtYWtpbmcgRFNBIGtleTogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKLSAgICAgIGV4aXQoLTEpOwotICAgfQotICAgcHJpbnRmKCJEU0EgS2V5IE1hZGVcbiIpOwotCi0gICAvKiB2ZXJpZnkgaXQgKi8KLSAgIGlmICgoZXJyID0gZHNhX3ZlcmlmeV9rZXkoJmtleSwgJnN0YXQxKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHByaW50ZigiRXJyb3IgdmVyaWZ5aW5nIERTQSBrZXk6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7Ci0gICAgICBleGl0KC0xKTsKLSAgIH0KLSAgIHByaW50ZigiRFNBIGtleSB2ZXJpZmljYXRpb246ICVzXG4iLCBzdGF0MSA9PSAxID8gInBhc3NlZCIgOiAiZmFpbGVkIik7Ci0gICBpZiAoc3RhdDEgPT0gMCkgZXhpdCgtMSk7ICAgICAKLQotICAgLyogc2lnbiB0aGUgbWVzc2FnZSAqLwotICAgeCA9IHNpemVvZihvdXQpOwotICAgaWYgKChlcnIgPSBkc2Ffc2lnbl9oYXNoKG1zZywgc2l6ZW9mKG1zZyksIG91dCwgJngsICZwcm5nLCBmaW5kX3BybmcoInlhcnJvdyIpLCAma2V5KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHByaW50ZigiRXJyb3Igc2lnbmluZyB3aXRoIERTQSBrZXk6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7Ci0gICAgICBleGl0KC0xKTsKLSAgIH0KLSAgIHByaW50ZigiRFNBIDE2MC8xMDI0IHNpZ25hdHVyZSBpcyAlbHUgYnl0ZXMgbG9uZ1xuIiwgeCk7Ci0KLSAgIC8qIHZlcmlmeSBpdCBvbmNlICovCi0gICBpZiAoKGVyciA9IGRzYV92ZXJpZnlfaGFzaChvdXQsIHgsIG1zZywgc2l6ZW9mKG1zZyksICZzdGF0MSwgJmtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgICBwcmludGYoIkVycm9yIHZlcmlmeWluZyB3aXRoIERTQSBrZXkgMTogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKLSAgICAgIGV4aXQoLTEpOwotICAgfQotCi0gICAvKiBNb2RpZnkgYW5kIHZlcmlmeSBhZ2FpbiAqLwotICAgbXNnWzBdIF49IDE7Ci0gICBpZiAoKGVyciA9IGRzYV92ZXJpZnlfaGFzaChvdXQsIHgsIG1zZywgc2l6ZW9mKG1zZyksICZzdGF0MiwgJmtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgICBwcmludGYoIkVycm9yIHZlcmlmeWluZyB3aXRoIERTQSBrZXkgMjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKLSAgICAgIGV4aXQoLTEpOwotICAgfQotICAgbXNnWzBdIF49IDE7Ci0gICBwcmludGYoIkRTQSBWZXJpZmljYXRpb246ICVkLCAlZCwgJXNcbiIsIHN0YXQxLCBzdGF0MiwgKHN0YXQxID09IDEgJiYgc3RhdDIgPT0gMCkgPyAicGFzc2VkIiA6ICJmYWlsZWQiKTsKLSAgIGlmICghKHN0YXQxID09IDEgJiYgc3RhdDIgPT0gMCkpIGV4aXQoLTEpOwotCi0gICAvKiB0ZXN0IGV4cG9ydGluZyBpdCAqLwotICAgeCA9IHNpemVvZihvdXQyKTsKLSAgIGlmICgoZXJyID0gZHNhX2V4cG9ydChvdXQyLCAmeCwgUEtfUFJJVkFURSwgJmtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgICBwcmludGYoIkVycm9yIGV4cG9ydCBQS19QUklWQVRFIERTQSBrZXk6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7Ci0gICAgICBleGl0KC0xKTsKLSAgIH0KLSAgIHByaW50ZigiRXhwb3J0ZWQgUEtfUFJJVkFURSBEU0Ega2V5IGluICVsdSBieXRlc1xuIiwgeCk7Ci0gICBpZiAoKGVyciA9IGRzYV9pbXBvcnQob3V0MiwgeCwgJmtleTIpKSAhPSBDUllQVF9PSykgewotICAgICAgcHJpbnRmKCJFcnJvciBpbXBvcnRpbmcgUEtfUFJJVkFURSBEU0Ega2V5OiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOwotICAgICAgZXhpdCgtMSk7Ci0gICB9Ci0gICAvKiB2ZXJpZnkgYSBzaWduYXR1cmUgd2l0aCBpdCAqLwotICAgaWYgKChlcnIgPSBkc2FfdmVyaWZ5X2hhc2gob3V0LCB4LCBtc2csIHNpemVvZihtc2cpLCAmc3RhdDEsICZrZXkyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHByaW50ZigiRXJyb3IgdmVyaWZ5aW5nIHdpdGggRFNBIGtleSAzOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOwotICAgICAgZXhpdCgtMSk7Ci0gICB9Ci0gICBwcmludGYoIlBSSVZBVEUgSW1wb3J0IFRlc3Q6ICVzXG4iLCBzdGF0MSA9PSAxID8gInBhc3NlZCIgOiAiZmFpbGVkIik7Ci0gICBpZiAoc3RhdDEgPT0gMCkgZXhpdCgtMSk7Ci0gICBkc2FfZnJlZSgma2V5Mik7Ci0KLSAgIC8qIGV4cG9ydCBhcyBwdWJsaWMgbm93ICovCi0gICB4ID0gc2l6ZW9mKG91dDIpOwotICAgaWYgKChlcnIgPSBkc2FfZXhwb3J0KG91dDIsICZ4LCBQS19QVUJMSUMsICZrZXkpKSAhPSBDUllQVF9PSykgewotICAgICAgcHJpbnRmKCJFcnJvciBleHBvcnQgUEtfUFVCTElDIERTQSBrZXk6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7Ci0gICAgICBleGl0KC0xKTsKLSAgIH0KLSAgIHByaW50ZigiRXhwb3J0ZWQgUEtfUFVCTElDIERTQSBrZXkgaW4gJWx1IGJ5dGVzXG4iLCB4KTsKLSAgIGlmICgoZXJyID0gZHNhX2ltcG9ydChvdXQyLCB4LCAma2V5MikpICE9IENSWVBUX09LKSB7Ci0gICAgICBwcmludGYoIkVycm9yIGltcG9ydGluZyBQS19QVUJMSUMgRFNBIGtleTogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKLSAgICAgIGV4aXQoLTEpOwotICAgfQotICAgLyogdmVyaWZ5IGEgc2lnbmF0dXJlIHdpdGggaXQgKi8KLSAgIGlmICgoZXJyID0gZHNhX3ZlcmlmeV9oYXNoKG91dCwgeCwgbXNnLCBzaXplb2YobXNnKSwgJnN0YXQxLCAma2V5MikpICE9IENSWVBUX09LKSB7Ci0gICAgICBwcmludGYoIkVycm9yIHZlcmlmeWluZyB3aXRoIERTQSBrZXkgNDogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKLSAgICAgIGV4aXQoLTEpOwotICAgfQotICAgcHJpbnRmKCJQVUJMSUMgSW1wb3J0IFRlc3Q6ICVzXG4iLCBzdGF0MSA9PSAxID8gInBhc3NlZCIgOiAiZmFpbGVkIik7Ci0gICBpZiAoc3RhdDEgPT0gMCkgZXhpdCgtMSk7Ci0KLSAgIGRzYV9mcmVlKCZrZXkyKTsKLSAgIGRzYV9mcmVlKCZrZXkpOwotfQotCi0jaWZkZWYgUEtDU18xCi12b2lkIHBrY3MxX3Rlc3Qodm9pZCkKLXsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzNdWzEyOF07Ci0gICBpbnQgZXJyLCByZXMxLCByZXMyLCByZXMzLCBwcm5nX2lkeCwgaGFzaF9pZHg7Ci0gICB1bnNpZ25lZCBsb25nIHgsIHksIGwxLCBsMiwgbDMsIGkxLCBpMjsKLQotICAgLyogZ2V0IGhhc2gvcHJuZyAgKi8KLSAgIGhhc2hfaWR4ID0gZmluZF9oYXNoKCJzaGExIik7Ci0gICBwcm5nX2lkeCA9IGZpbmRfcHJuZygieWFycm93Iik7Ci0KLSAgIC8qIGRvIG1hbnkgdGVzdHMgKi8KLSAgIGZvciAoeCA9IDA7IHggPCAxMDAwMDsgeCsrKSB7Ci0gICAgICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCi0gICAgICAvKiBtYWtlIGEgZHVtbXkgbWVzc2FnZSAob2YgcmFuZG9tIGxlbmd0aCkgKi8KLSAgICAgIGwzID0gKHJhbmQoKSAmIDMxKSArIDg7Ci0gICAgICBmb3IgKHkgPSAwOyB5IDwgbDM7IHkrKykgYnVmWzBdW3ldID0gcmFuZCgpICYgMjU1OwotCi0gICAgICAvKiBlbmNvZGUgaXQgKi8KLSAgICAgIGwxID0gc2l6ZW9mKGJ1ZlsxXSk7Ci0gICAgICBpZiAoKGVyciA9IHBrY3NfMV9vYWVwX2VuY29kZShidWZbMF0sIGwzLCBOVUxMLCAwLCAxMDI0LCBoYXNoX2lkeCwgcHJuZ19pZHgsICZwcm5nLCBidWZbMV0sICZsMSkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICBwcmludGYoIk9BRVAgZW5jb2RlOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOwotICAgICAgICAgZXhpdCgtMSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGRlY29kZSBpdCAqLwotICAgICAgbDIgPSBzaXplb2YoYnVmWzJdKTsKLSAgICAgIGlmICgoZXJyID0gcGtjc18xX29hZXBfZGVjb2RlKGJ1ZlsxXSwgbDEsIE5VTEwsIDAsIDEwMjQsIGhhc2hfaWR4LCBidWZbMl0sICZsMiwgJnJlczEpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgcHJpbnRmKCJPQUVQIGRlY29kZTogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKLSAgICAgICAgIGV4aXQoLTEpOwotICAgICAgfQotCi0gICAgICBpZiAocmVzMSAhPSAxIHx8IGwyICE9IGwzIHx8IG1lbWNtcChidWZbMl0sIGJ1ZlswXSwgbDMpICE9IDApIHsKLSAgICAgICAgIHByaW50ZigicmVzID09ICVkLCBPdXRzaXplID09ICVsdSwgc2hvdWxkIGhhdmUgYmVlbiAlbHUsIG1zZyBjb250ZW50cyBmb2xsb3cuXG4iLCByZXMxLCBsMiwgbDMpOwotICAgICAgICAgcHJpbnRmKCJPUklHSU5BTDpcbiIpOwotICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGwzOyB4KyspIHsKLSAgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgYnVmWzBdW3hdKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHByaW50ZigiXG5SRVNVTFQ6XG4iKTsKLSAgICAgICAgIGZvciAoeCA9IDA7IHggPCBsMjsgeCsrKSB7Ci0gICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGJ1ZlsyXVt4XSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBwcmludGYoIlxuXG4iKTsKLSAgICAgICAgIGV4aXQoLTEpOwotICAgICAgfQotCi0gICAgICAvKiB0ZXN0IFBTUyAqLwotICAgICAgbDEgPSBzaXplb2YoYnVmWzFdKTsKLSAgICAgIGlmICgoZXJyID0gcGtjc18xX3Bzc19lbmNvZGUoYnVmWzBdLCBsMywgbDM+PjIsIGhhc2hfaWR4LCBwcm5nX2lkeCwgJnBybmcsIDEwMjQsIGJ1ZlsxXSwgJmwxKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgIHByaW50ZigiUFNTIGVuY29kZTogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKLSAgICAgICAgIGV4aXQoLTEpOyAKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKChlcnIgPSBwa2NzXzFfcHNzX2RlY29kZShidWZbMF0sIGwzLCBidWZbMV0sIGwxLCBsMz4+MiwgaGFzaF9pZHgsIDEwMjQsICZyZXMxKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgIHByaW50ZigiUFNTIGRlY29kZTE6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7Ci0gICAgICAgICBleGl0KC0xKTsgCi0gICAgICB9Ci0gICAgICAKLSAgICAgIGJ1ZlswXVtpMSA9IGFicyhyYW5kKCkpICUgbDNdIF49IDE7Ci0gICAgICBpZiAoKGVyciA9IHBrY3NfMV9wc3NfZGVjb2RlKGJ1ZlswXSwgbDMsIGJ1ZlsxXSwgbDEsIGwzPj4yLCBoYXNoX2lkeCwgMTAyNCwgJnJlczIpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgcHJpbnRmKCJQU1MgZGVjb2RlMjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKLSAgICAgICAgIGV4aXQoLTEpOyAKLSAgICAgIH0KLQotICAgICAgYnVmWzBdW2kxXSBePSAxOwotICAgICAgYnVmWzFdW2kyID0gYWJzKHJhbmQoKSkgJSBsMV0gXj0gMTsKLSAgICAgIGlmICgoZXJyID0gcGtjc18xX3Bzc19kZWNvZGUoYnVmWzBdLCBsMywgYnVmWzFdLCBsMSwgbDM+PjIsIGhhc2hfaWR4LCAxMDI0LCAmcmVzMykpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICBwcmludGYoIlBTUyBkZWNvZGUzOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOwotICAgICAgICAgZXhpdCgtMSk7IAotICAgICAgfQotCi0gICAgICBpZiAoIShyZXMxID09IDEgJiYgcmVzMiA9PSAwICYmIHJlczMgPT0gMCkpIHsKLSAgICAgICAgIHByaW50ZigiUFNTIGZhaWxlZDogJWQsICVkLCAlZCwgJWx1XG4iLCByZXMxLCByZXMyLCByZXMzLCBsMyk7Ci0gICAgICAgICBleGl0KC0xKTsKLSAgICAgIH0KLSAgIH0KLSAgIHByaW50ZigiUEtDUyAjMTogUGFzc2VkXG4iKTsKLX0KLQotI2VuZGlmIC8qIFBLQ1NfMSAqLwotCi1pbnQKLW1haW4gKHZvaWQpCi17Ci0jaWZkZWYgU09OWV9QUzIKLSAgVElNRVJfSW5pdCAoKTsKLSNlbmRpZgotICBzcmFuZCh0aW1lKE5VTEwpKTsKLQotICByZWdpc3Rlcl9hbGxfYWxncyAoKTsKLSAgIAotICBpZiAoKGVycm51bSA9IHlhcnJvd19zdGFydCAoJnBybmcpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoInlhcnJvd19zdGFydDogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gIH0KLSAgaWYgKChlcnJudW0gPSB5YXJyb3dfYWRkX2VudHJvcHkgKCh1bnNpZ25lZCBjaGFyICopImhlbGxvIiwgNSwgJnBybmcpKSAhPSBDUllQVF9PSykgewotICAgIHByaW50ZiAoInlhcnJvd19hZGRfZW50cm9weTogJXNcbiIsIGVycm9yX3RvX3N0cmluZyAoZXJybnVtKSk7Ci0gIH0KLSAgaWYgKChlcnJudW0gPSB5YXJyb3dfcmVhZHkgKCZwcm5nKSkgIT0gQ1JZUFRfT0spIHsKLSAgICBwcmludGYgKCJ5YXJyb3dfcmVhZHk6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcgKGVycm51bSkpOwotICB9Ci0KLSAgcHJpbnRmIChjcnlwdF9idWlsZF9zZXR0aW5ncyk7Ci0gIHRlc3RfZXJycyAoKTsKLQotI2lmZGVmIEhNQUMKLSAgcHJpbnRmICgiSE1BQzogJXNcbiIsIGhtYWNfdGVzdCAoKSA9PSBDUllQVF9PSyA/ICJwYXNzZWQiIDogImZhaWxlZCIpOwotICBpZiAoaG1hY190ZXN0KCkgIT0gQ1JZUFRfT0spIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotCi0jaWZkZWYgT01BQwotICBwcmludGYgKCJPTUFDOiAlc1xuIiwgb21hY190ZXN0ICgpID09IENSWVBUX09LID8gInBhc3NlZCIgOiAiZmFpbGVkIik7Ci0gIGlmIChvbWFjX3Rlc3QoKSAhPSBDUllQVF9PSykgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSNpZmRlZiBQTUFDCi0gIHByaW50ZiAoIlBNQUM6ICVzXG4iLCBwbWFjX3Rlc3QgKCkgPT0gQ1JZUFRfT0sgPyAicGFzc2VkIiA6ICJmYWlsZWQiKTsKLSAgaWYgKHBtYWNfdGVzdCgpICE9IENSWVBUX09LKSBleGl0KEVYSVRfRkFJTFVSRSk7Ci0jZW5kaWYKLQotI2lmZGVmIEVBWF9NT0RFCi0gIHByaW50ZiAoIkVBWCA6ICVzXG4iLCBlYXhfdGVzdCAoKSA9PSBDUllQVF9PSyA/ICJwYXNzZWQiIDogImZhaWxlZCIpOwotICBpZiAoZWF4X3Rlc3QoKSAhPSBDUllQVF9PSykgZXhpdChFWElUX0ZBSUxVUkUpOwotI2VuZGlmCi0KLSNpZmRlZiBPQ0JfTU9ERQotICBwcmludGYgKCJPQ0IgOiAlc1xuIiwgb2NiX3Rlc3QgKCkgPT0gQ1JZUFRfT0sgPyAicGFzc2VkIiA6ICJmYWlsZWQiKTsKLSAgaWYgKG9jYl90ZXN0KCkgIT0gQ1JZUFRfT0spIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSNlbmRpZgotCi0gIHN0b3JlX3Rlc3RzICgpOwotICBjaXBoZXJfdGVzdHMgKCk7Ci0gIGhhc2hfdGVzdHMgKCk7Ci0KLSNpZmRlZiBQS0NTXzEKLSAgcGtjczFfdGVzdCgpOwotI2VuZGlmCi0KLSAgZWNiX3Rlc3RzICgpOwotICBjYmNfdGVzdHMgKCk7Ci0gIGN0cl90ZXN0cyAoKTsKLSAgb2ZiX3Rlc3RzICgpOwotICBjZmJfdGVzdHMgKCk7Ci0KLSAgcm5nX3Rlc3RzICgpOwotICB0ZXN0X3ByaW1lKCk7Ci0KLSAgZHNhX3Rlc3RzKCk7Ci0gIHJzYV90ZXN0ICgpOwotICBwYWRfdGVzdCAoKTsKLSAgZWNjX3Rlc3RzICgpOwotICBkaF90ZXN0cyAoKTsKLQotICBiYXNlNjRfdGVzdCAoKTsKLQotICB0aW1lX2VjYiAoKTsKLSAgdGltZV9oYXNoICgpOwotCi0jaWZkZWYgU09OWV9QUzIKLSAgVElNRVJfU2h1dGRvd24gKCk7Ci0jZW5kaWYKLQotICByZXR1cm4gMDsKLX0KKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L2RlbW9zL3Rlc3QuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xMiAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOSAxMjowNjo1OCAkICovCmRpZmYgLS1naXQgYS9kZW1vcy90ZXN0L2Jhc2U2NF90ZXN0LmMgYi9kZW1vcy90ZXN0L2Jhc2U2NF90ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMmMxYTIuLjAwMDAwMDAKLS0tIGEvZGVtb3MvdGVzdC9iYXNlNjRfdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2luY2x1ZGUgICJ0ZXN0LmgiCi0KLWludCBiYXNlNjRfdGVzdCh2b2lkKQotewotICAgdW5zaWduZWQgY2hhciBpbls2NF0sIG91dFsyNTZdLCB0bXBbNjRdOwotICAgdW5zaWduZWQgbG9uZyB4LCBsMSwgbDI7Ci0gICAKLSAgIGZvciAgKHggPSAwOyB4IDwgNjQ7IHgrKykgewotICAgICAgIHlhcnJvd19yZWFkKGluLCB4LCAmdGVzdF95YXJyb3cpOwotICAgICAgIGwxID0gc2l6ZW9mKG91dCk7Ci0gICAgICAgRE8oYmFzZTY0X2VuY29kZShpbiwgeCwgb3V0LCAmbDEpKTsKLSAgICAgICBsMiA9IHNpemVvZih0bXApOwotICAgICAgIERPKGJhc2U2NF9kZWNvZGUob3V0LCBsMSwgdG1wLCAmbDIpKTsKLSAgICAgICBpZiAobDIgIT0geCB8fCBtZW1jbXAodG1wLCBpbiwgeCkpIHsKLSAgICAgICAgICAgcHJpbnRmKCJiYXNlNjQgIGZhaWxlZCAlbHUgJWx1ICVsdSIsIHgsIGwxLCBsMik7Ci0gICAgICAgICAgIHJldHVybiAxOwotICAgICAgIH0KLSAgIH0KLSAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZGVtb3MvdGVzdC9jaXBoZXJfaGFzaF90ZXN0LmMgYi9kZW1vcy90ZXN0L2NpcGhlcl9oYXNoX3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlOWU2NS4uMDAwMDAwMAotLS0gYS9kZW1vcy90ZXN0L2NpcGhlcl9oYXNoX3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qIHRlc3QgdGhlIGNpcGhlcnMgYW5kIGhhc2hlcyB1c2luZyB0aGVpciBidWlsdC1pbiBzZWxmLXRlc3RzICovCi0KLSNpbmNsdWRlICJ0ZXN0LmgiCi0KLWludCBjaXBoZXJfaGFzaF90ZXN0KHZvaWQpCi17Ci0gICBpbnQgeDsKLSAgIAotICAgLyogdGVzdCBjaXBoZXJzICovCi0gICBmb3IgKHggPSAwOyBjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEw7IHgrKykgewotICAgICAgRE8oY2lwaGVyX2Rlc2NyaXB0b3JbeF0udGVzdCgpKTsKLSAgIH0KLSAgIAotICAgLyogdGVzdCBoYXNoZXMgKi8KLSAgIGZvciAoeCA9IDA7IGhhc2hfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEw7IHgrKykgewotICAgICAgRE8oaGFzaF9kZXNjcmlwdG9yW3hdLnRlc3QoKSk7Ci0gICB9Ci0gICAKLSAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZGVtb3MvdGVzdC9kc2FfdGVzdC5jIGIvZGVtb3MvdGVzdC9kc2FfdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDc2MDg5Li4wMDAwMDAwCi0tLSBhL2RlbW9zL3Rlc3QvZHNhX3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSNpbmNsdWRlICJ0ZXN0LmgiCi0KLWludCBkc2FfdGVzdCh2b2lkKQotewotICAgdW5zaWduZWQgY2hhciBtc2dbMTZdLCBvdXRbMTAyNF0sIG91dDJbMTAyNF07Ci0gICB1bnNpZ25lZCBsb25nIHgsIHk7Ci0gICBpbnQgZXJyLCBzdGF0MSwgc3RhdDI7Ci0gICBkc2Ffa2V5IGtleSwga2V5MjsKLQotICAgLyogbWFrZSBhIHJhbmRvbSBrZXkgKi8KLSAgIERPKGRzYV9tYWtlX2tleSgmdGVzdF95YXJyb3csIGZpbmRfcHJuZygieWFycm93IiksIDIwLCAxMjgsICZrZXkpKTsKLQotICAgLyogdmVyaWZ5IGl0ICovCi0gICBETyhkc2FfdmVyaWZ5X2tleSgma2V5LCAmc3RhdDEpKTsKLSAgIGlmIChzdGF0MSA9PSAwKSB7IHByaW50ZigiZHNhX3ZlcmlmeV9rZXkgIik7IHJldHVybiAxOyB9Ci0KLSAgIC8qIHNpZ24gdGhlIG1lc3NhZ2UgKi8KLSAgIHggPSBzaXplb2Yob3V0KTsKLSAgIERPKGRzYV9zaWduX2hhc2gobXNnLCBzaXplb2YobXNnKSwgb3V0LCAmeCwgJnRlc3RfeWFycm93LCBmaW5kX3BybmcoInlhcnJvdyIpLCAma2V5KSk7Ci0KLSAgIC8qIHZlcmlmeSBpdCBvbmNlICovCi0gICBETyhkc2FfdmVyaWZ5X2hhc2gob3V0LCB4LCBtc2csIHNpemVvZihtc2cpLCAmc3RhdDEsICZrZXkpKTsKLQotICAgLyogTW9kaWZ5IGFuZCB2ZXJpZnkgYWdhaW4gKi8KLSAgIG1zZ1swXSBePSAxOwotICAgRE8oZHNhX3ZlcmlmeV9oYXNoKG91dCwgeCwgbXNnLCBzaXplb2YobXNnKSwgJnN0YXQyLCAma2V5KSk7Ci0gICBtc2dbMF0gXj0gMTsKLSAgIGlmICghKHN0YXQxID09IDEgJiYgc3RhdDIgPT0gMCkpIHsgcHJpbnRmKCJkc2FfdmVyaWZ5ICVkICVkIiwgc3RhdDEsIHN0YXQyKTsgcmV0dXJuIDE7IH0KLQotICAgLyogdGVzdCBleHBvcnRpbmcgaXQgKi8KLSAgIHggPSBzaXplb2Yob3V0Mik7Ci0gICBETyhkc2FfZXhwb3J0KG91dDIsICZ4LCBQS19QUklWQVRFLCAma2V5KSk7Ci0gICBETyhkc2FfaW1wb3J0KG91dDIsIHgsICZrZXkyKSk7Ci0KLSAgIC8qIHZlcmlmeSBhIHNpZ25hdHVyZSB3aXRoIGl0ICovCi0gICBETyhkc2FfdmVyaWZ5X2hhc2gob3V0LCB4LCBtc2csIHNpemVvZihtc2cpLCAmc3RhdDEsICZrZXkyKSk7Ci0gICBpZiAoc3RhdDEgPT0gMCkgeyBwcmludGYoImRzYV92ZXJpZnkgKGltcG9ydCBwcml2YXRlKSAlZCAiLCBzdGF0MSk7IHJldHVybiAxOyB9Ci0gICBkc2FfZnJlZSgma2V5Mik7Ci0KLSAgIC8qIGV4cG9ydCBhcyBwdWJsaWMgbm93ICovCi0gICB4ID0gc2l6ZW9mKG91dDIpOwotICAgRE8oZHNhX2V4cG9ydChvdXQyLCAmeCwgUEtfUFVCTElDLCAma2V5KSk7Ci0gICBETyhkc2FfaW1wb3J0KG91dDIsIHgsICZrZXkyKSk7Ci0gICAvKiB2ZXJpZnkgYSBzaWduYXR1cmUgd2l0aCBpdCAqLwotICAgRE8oZHNhX3ZlcmlmeV9oYXNoKG91dCwgeCwgbXNnLCBzaXplb2YobXNnKSwgJnN0YXQxLCAma2V5MikpOwotICAgaWYgKHN0YXQxID09IDApIHsgcHJpbnRmKCJkc2FfdmVyaWZ5IChpbXBvcnQgcHVibGljKSAlZCAiLCBzdGF0MSk7IHJldHVybiAxOyB9Ci0gICBkc2FfZnJlZSgma2V5Mik7Ci0gICBkc2FfZnJlZSgma2V5KTsKLQotICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kZW1vcy90ZXN0L2VjY190ZXN0LmMgYi9kZW1vcy90ZXN0L2VjY190ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZjFmOTEuLjAwMDAwMDAKLS0tIGEvZGVtb3MvdGVzdC9lY2NfdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotI2luY2x1ZGUgInRlc3QuaCIKLQotaW50IGVjY190ZXN0cyAodm9pZCkKLXsKLSAgdW5zaWduZWQgY2hhciBidWZbNF1bNDA5Nl07Ci0gIHVuc2lnbmVkIGxvbmcgeCwgeSwgejsKLSAgaW50ICAgICAgICAgICBzdGF0LCBzdGF0MjsKLSAgZWNjX2tleSB1c2VyYSwgdXNlcmI7Ci0JCi0gIERPKGVjY190ZXN0ICgpKTsKLQotICAvKiBtYWtlIHVwIHR3byBrZXlzICovCi0gIERPKGVjY19tYWtlX2tleSAoJnRlc3RfeWFycm93LCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgMjQsICZ1c2VyYSkpOwotICBETyhlY2NfbWFrZV9rZXkgKCZ0ZXN0X3lhcnJvdywgZmluZF9wcm5nICgieWFycm93IiksIDI0LCAmdXNlcmIpKTsKLQotICAvKiBtYWtlIHRoZSBzaGFyZWQgc2VjcmV0ICovCi0gIHggPSA0MDk2OwotICBETyhlY2Nfc2hhcmVkX3NlY3JldCAoJnVzZXJhLCAmdXNlcmIsIGJ1ZlswXSwgJngpKTsKLQotICB5ID0gNDA5NjsKLSAgRE8oZWNjX3NoYXJlZF9zZWNyZXQgKCZ1c2VyYiwgJnVzZXJhLCBidWZbMV0sICZ5KSk7Ci0KLSAgaWYgKHkgIT0geCkgewotICAgIHByaW50ZiAoImVjYyBTaGFyZWQga2V5cyBhcmUgbm90IHNhbWUgc2l6ZS4iKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIGlmIChtZW1jbXAgKGJ1ZlswXSwgYnVmWzFdLCB4KSkgewotICAgIHByaW50ZiAoImVjYyBTaGFyZWQga2V5cyBub3Qgc2FtZSBjb250ZW50cy4iKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8qIG5vdyBleHBvcnQgdXNlcmIgKi8KLSAgeSA9IDQwOTY7Ci0gIERPKGVjY19leHBvcnQgKGJ1ZlsxXSwgJnksIFBLX1BVQkxJQywgJnVzZXJiKSk7Ci0gIGVjY19mcmVlICgmdXNlcmIpOwotCi0gIC8qIGltcG9ydCBhbmQgbWFrZSB0aGUgc2hhcmVkIHNlY3JldCBhZ2FpbiAqLwotICBETyhlY2NfaW1wb3J0IChidWZbMV0sIHksICZ1c2VyYikpOwotCi0gIHogPSA0MDk2OwotICBETyhlY2Nfc2hhcmVkX3NlY3JldCAoJnVzZXJhLCAmdXNlcmIsIGJ1ZlsyXSwgJnopKTsKLQotICBpZiAoeiAhPSB4KSB7Ci0gICAgcHJpbnRmICgiZmFpbGVkLiAgU2l6ZSBkb24ndCBtYXRjaD8iKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICBpZiAobWVtY21wIChidWZbMF0sIGJ1ZlsyXSwgeCkpIHsKLSAgICBwcmludGYgKCJGYWlsZWQuICBDb250ZW50IGRpZG4ndCBtYXRjaC4iKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICBlY2NfZnJlZSAoJnVzZXJhKTsKLSAgZWNjX2ZyZWUgKCZ1c2VyYik7Ci0KLS8qIHRlc3QgZW5jcnlwdF9rZXkgKi8KLSAgZWNjX21ha2Vfa2V5ICgmdGVzdF95YXJyb3csIGZpbmRfcHJuZyAoInlhcnJvdyIpLCAyMCwgJnVzZXJhKTsKLSAgZm9yICh4ID0gMDsgeCA8IDMyOyB4KyspIHsKLSAgICBidWZbMF1beF0gPSB4OwotICB9Ci0gIHkgPSBzaXplb2YgKGJ1ZlsxXSk7Ci0gIERPKGVjY19lbmNyeXB0X2tleSAoYnVmWzBdLCAzMiwgYnVmWzFdLCAmeSwgJnRlc3RfeWFycm93LCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgZmluZF9oYXNoICgic2hhMjU2IiksICZ1c2VyYSkpOwotICB6ZXJvbWVtIChidWZbMF0sIHNpemVvZiAoYnVmWzBdKSk7Ci0gIHggPSBzaXplb2YgKGJ1ZlswXSk7Ci0gIERPKGVjY19kZWNyeXB0X2tleSAoYnVmWzFdLCB5LCBidWZbMF0sICZ4LCAmdXNlcmEpKTsKLSAgaWYgKHggIT0gMzIpIHsKLSAgICBwcmludGYgKCJGYWlsZWQgKGxlbmd0aCkiKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICBmb3IgKHggPSAwOyB4IDwgMzI7IHgrKykKLSAgICBpZiAoYnVmWzBdW3hdICE9IHgpIHsKLSAgICAgIHByaW50ZiAoIkZhaWxlZCAoY29udGVudHMpIik7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0vKiB0ZXN0IHNpZ25faGFzaCAqLwotICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykgewotICAgIGJ1ZlswXVt4XSA9IHg7Ci0gIH0KLSAgeCA9IHNpemVvZiAoYnVmWzFdKTsKLSAgRE8oZWNjX3NpZ25faGFzaCAoYnVmWzBdLCAxNiwgYnVmWzFdLCAmeCwgJnRlc3RfeWFycm93LCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgJnVzZXJhKSk7Ci0gIERPKGVjY192ZXJpZnlfaGFzaCAoYnVmWzFdLCB4LCBidWZbMF0sIDE2LCAmc3RhdCwgJnVzZXJhKSk7Ci0gIGJ1ZlswXVswXSBePSAxOwotICBETyhlY2NfdmVyaWZ5X2hhc2ggKGJ1ZlsxXSwgeCwgYnVmWzBdLCAxNiwgJnN0YXQyLCAmdXNlcmEpKTsKLSAgaWYgKCEoc3RhdCA9PSAxICYmIHN0YXQyID09IDApKSB7IAotICAgIHByaW50ZigiZWNjX3ZlcmlmeV9oYXNoIGZhaWxlZCIpOwotICAgIHJldHVybiAxOwotICB9Ci0gIGVjY19mcmVlICgmdXNlcmEpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RlbW9zL3Rlc3QvbWFjX3Rlc3QuYyBiL2RlbW9zL3Rlc3QvbWFjX3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjOGQzNC4uMDAwMDAwMAotLS0gYS9kZW1vcy90ZXN0L21hY190ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKiB0ZXN0IHBtYWMvb21hYy9obWFjICovCi0jaW5jbHVkZSAidGVzdC5oIgotCi1pbnQgbWFjX3Rlc3Qodm9pZCkKLXsKLSAgIERPKGhtYWNfdGVzdCgpKTsKLSAgIERPKHBtYWNfdGVzdCgpKTsKLSAgIERPKG9tYWNfdGVzdCgpKTsKLSAgIERPKGVheF90ZXN0KCkpOwotICAgRE8ob2NiX3Rlc3QoKSk7Ci0gICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RlbW9zL3Rlc3QvbWFrZWZpbGUgYi9kZW1vcy90ZXN0L21ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTk2NzY3Li4wMDAwMDAwCi0tLSBhL2RlbW9zL3Rlc3QvbWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIG1ha2UgdGVzdCBoYXJuZXNzLCBpdCBpcyBnb29kLgotQ0ZMQUdTICs9IC1XYWxsIC1XIC1PcyAtSS4uLy4uLyAtSS4vCi0KLWRlZmF1bHQ6IHRlc3QKLQotT0JKRUNUUz10ZXN0Lm8gY2lwaGVyX2hhc2hfdGVzdC5vIG1hY190ZXN0Lm8gbW9kZXNfdGVzdC5vIFwKLXBrY3NfMV90ZXN0Lm8gc3RvcmVfdGVzdC5vIHJzYV90ZXN0Lm8gZWNjX3Rlc3QubyBkc2FfdGVzdC5jIGRoX3Rlc3RzLm8gCi0KLXRlc3Q6ICQoT0JKRUNUUykKLQkkKENDKSAkKE9CSkVDVFMpIC1sdG9tY3J5cHQgLW8gdGVzdAotCQotY2xlYW46Ci0Jcm0gLWYgdGVzdCAqLm8gKi5vYmogKi5leGUgKn4JCmRpZmYgLS1naXQgYS9kZW1vcy90ZXN0L21ha2VmaWxlLmljYyBiL2RlbW9zL3Rlc3QvbWFrZWZpbGUuaWNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmM3MTU0Li4wMDAwMDAwCi0tLSBhL2RlbW9zL3Rlc3QvbWFrZWZpbGUuaWNjCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBtYWtlIHRlc3QgaGFybmVzcywgaXQgaXMgZ29vZC4KLUNGTEFHUyArPSAtTzMgLXhOIC1pcCAtSS4uLy4uLyAtSS4vCi1DQz1pY2MKLQotZGVmYXVsdDogdGVzdAotCi1PQkpFQ1RTPXRlc3QubyBjaXBoZXJfaGFzaF90ZXN0Lm8gbWFjX3Rlc3QubyBtb2Rlc190ZXN0Lm8gXAotcGtjc18xX3Rlc3QubyBzdG9yZV90ZXN0Lm8gcnNhX3Rlc3QubyBlY2NfdGVzdC5vIGRzYV90ZXN0LmMgZGhfdGVzdHMubyAKLQotdGVzdDogJChPQkpFQ1RTKQotCSQoQ0MpICQoT0JKRUNUUykgLWx0b21jcnlwdCAtbyB0ZXN0Ci0JCi1jbGVhbjoKLQlybSAtZiB0ZXN0ICoubyAqfgkKZGlmZiAtLWdpdCBhL2RlbW9zL3Rlc3QvbWFrZWZpbGUubXN2YyBiL2RlbW9zL3Rlc3QvbWFrZWZpbGUubXN2YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjYThlMC4uMDAwMDAwMAotLS0gYS9kZW1vcy90ZXN0L21ha2VmaWxlLm1zdmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIG1ha2UgdGVzdCBoYXJuZXNzLCBpdCBpcyBnb29kLgotQ0ZMQUdTID0gJChDRkxBR1MpIC9XMyAvT3ggLUkuLi8uLi8gLUkuLwotCi1kZWZhdWx0OiB0ZXN0LmV4ZQotCi1PQkpFQ1RTID0gdGVzdC5vYmogY2lwaGVyX2hhc2hfdGVzdC5vYmogbWFjX3Rlc3Qub2JqIG1vZGVzX3Rlc3Qub2JqIFwKLXBrY3NfMV90ZXN0Lm9iaiBzdG9yZV90ZXN0Lm9iaiByc2FfdGVzdC5vYmogZWNjX3Rlc3Qub2JqIGRzYV90ZXN0LmMgZGhfdGVzdHMub2JqIAotCi0KLXRlc3QuZXhlOiAkKE9CSkVDVFMpCi0JY2wgJChPQkpFQ1RTKSB0b21jcnlwdC5saWIgYWR2YXBpMzIubGliIAotCQotY2xlYW46Ci0Jcm0gLWYgdGVzdC5leGUgKi5vYmogKn4JCmRpZmYgLS1naXQgYS9kZW1vcy90ZXN0L3BrY3NfMV90ZXN0LmMgYi9kZW1vcy90ZXN0L3BrY3NfMV90ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMTI5N2EuLjAwMDAwMDAKLS0tIGEvZGVtb3MvdGVzdC9wa2NzXzFfdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLSNpbmNsdWRlICJ0ZXN0LmgiCi0KLWludCBwa2NzXzFfdGVzdCh2b2lkKQotewotICAgdW5zaWduZWQgY2hhciBidWZbM11bMTI4XTsKLSAgIGludCByZXMxLCByZXMyLCByZXMzLCBwcm5nX2lkeCwgaGFzaF9pZHg7Ci0gICB1bnNpZ25lZCBsb25nIHgsIHksIGwxLCBsMiwgbDMsIGkxLCBpMiwgbHBhcmFtbGVuLCBzYWx0bGVuLCBtb2RsZW47Ci0gICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBscGFyYW1bXSA9IHsgMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYgfTsKLQotICAgLyogZ2V0IGhhc2gvcHJuZyAgKi8KLSAgIGhhc2hfaWR4ID0gZmluZF9oYXNoKCJzaGExIik7Ci0gICBwcm5nX2lkeCA9IGZpbmRfcHJuZygieWFycm93Iik7Ci0gICAKLSAgIGlmIChoYXNoX2lkeCA9PSAtMSB8fCBwcm5nX2lkeCA9PSAtMSkgewotICAgICAgcHJpbnRmKCJwa2NzXzEgdGVzdHMgcmVxdWlyZSBzaGExL3lhcnJvdyIpOwotICAgICAgcmV0dXJuIDE7Ci0gICB9ICAgCi0KLSAgIC8qIGRvIG1hbnkgdGVzdHMgKi8KLSAgIGZvciAoeCA9IDA7IHggPCAxMDAwMDsgeCsrKSB7Ci0gICAgICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCi0gICAgICAvKiBtYWtlIGEgZHVtbXkgbWVzc2FnZSAob2YgcmFuZG9tIGxlbmd0aCkgKi8KLSAgICAgIGwzID0gKHJhbmQoKSAmIDMxKSArIDg7Ci0gICAgICBmb3IgKHkgPSAwOyB5IDwgbDM7IHkrKykgYnVmWzBdW3ldID0gcmFuZCgpICYgMjU1OwotCi0gICAgICAvKiByYW5kb20gbW9kdWx1cyBsZW4gKHYxLjUgbXVzdCBiZSBtdWx0aXBsZSBvZiA4IHRob3VnaCBhcmJpdHJhcnkgc2l6ZXMgc2VlbSB0byB3b3JrKSAqLwotICAgICAgbW9kbGVuID0gODAwICsgOCAqIChhYnMocmFuZCgpKSAlIDI4KTsKLQotICAgICAgLyogUEtDUyB2MS41IHRlc3RpbmcgKGVuY3J5cHRpb24pICovCi0gICAgICBsMSA9IHNpemVvZihidWZbMV0pOwotICAgICAgRE8ocGtjc18xX3YxNV9lc19lbmNvZGUoYnVmWzBdLCBsMywgbW9kbGVuLCAmdGVzdF95YXJyb3csIHBybmdfaWR4LCBidWZbMV0sICZsMSkpOwotICAgICAgRE8ocGtjc18xX3YxNV9lc19kZWNvZGUoYnVmWzFdLCBsMSwgbW9kbGVuLCBidWZbMl0sIGwzLCAmcmVzMSkpOwotICAgICAgaWYgKHJlczEgIT0gMSB8fCBtZW1jbXAoYnVmWzBdLCBidWZbMl0sIGwzKSkgewotICAgICAgICAgcHJpbnRmKCJwa2NzIHYxLjUgZW5jcnlwdCBmYWlsZWQgJWQsICVsdSwgJWx1ICIsIHJlczEsIGwxLCBsMyk7Ci0gICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLQotICAgICAgLyogUEtDUyB2MS41IHRlc3RpbmcgKHNpZ25hdHVyZXMpICovCi0gICAgICBsMSA9IHNpemVvZihidWZbMV0pOwotICAgICAgRE8ocGtjc18xX3YxNV9zYV9lbmNvZGUoYnVmWzBdLCBsMywgaGFzaF9pZHgsIG1vZGxlbiwgYnVmWzFdLCAmbDEpKTsKLSAgICAgIERPKHBrY3NfMV92MTVfc2FfZGVjb2RlKGJ1ZlswXSwgbDMsIGJ1ZlsxXSwgbDEsIGhhc2hfaWR4LCBtb2RsZW4sICZyZXMxKSk7Ci0gICAgICBidWZbMF1baTEgPSBhYnMocmFuZCgpKSAlIGwzXSBePSAxOwotICAgICAgRE8ocGtjc18xX3YxNV9zYV9kZWNvZGUoYnVmWzBdLCBsMywgYnVmWzFdLCBsMSwgaGFzaF9pZHgsIG1vZGxlbiwgJnJlczIpKTsKLSAgICAgIGJ1ZlswXVtpMV0gXj0gMTsKLSAgICAgIGJ1ZlsxXVtpMiA9IGFicyhyYW5kKCkpICUgbDFdIF49IDE7Ci0gICAgICBETyhwa2NzXzFfdjE1X3NhX2RlY29kZShidWZbMF0sIGwzLCBidWZbMV0sIGwxLCBoYXNoX2lkeCwgbW9kbGVuLCAmcmVzMykpOwotCi0gICAgICBpZiAoIShyZXMxID09IDEgJiYgcmVzMiA9PSAwICYmIHJlczMgPT0gMCkpIHsKLSAgICAgICAgIHByaW50ZigicGtjcyB2MS41IHNpZ24gZmFpbGVkICVkICVkICVkICIsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHBpY2sgYSByYW5kb20gbHBhcmFtIGxlbiBbMC4uMTZdICovCi0gICAgICBscGFyYW1sZW4gPSBhYnMocmFuZCgpKSAlIDE3OwotCi0gICAgICAvKiBwaWNrIGEgcmFuZG9tIHNhbHRsZW4gMC4uMTYgKi8KLSAgICAgIHNhbHRsZW4gICA9IGFicyhyYW5kKCkpICUgMTc7Ci0KLSAgICAgIC8qIFBLQ1MgIzEgdjIuMCBzdXBwb3J0cyBtb2RsZW5zIG5vdCBtdWx0aXBsZSBvZiA4ICovCi0gICAgICBtb2RsZW4gPSA4MDAgKyAoYWJzKHJhbmQoKSkgJSAyMjQpOwotCi0gICAgICAvKiBlbmNvZGUgaXQgKi8KLSAgICAgIGwxID0gc2l6ZW9mKGJ1ZlsxXSk7Ci0gICAgICBETyhwa2NzXzFfb2FlcF9lbmNvZGUoYnVmWzBdLCBsMywgbHBhcmFtLCBscGFyYW1sZW4sIG1vZGxlbiwgJnRlc3RfeWFycm93LCBwcm5nX2lkeCwgaGFzaF9pZHgsIGJ1ZlsxXSwgJmwxKSk7Ci0KLSAgICAgIC8qIGRlY29kZSBpdCAqLwotICAgICAgbDIgPSBzaXplb2YoYnVmWzJdKTsKLSAgICAgIERPKHBrY3NfMV9vYWVwX2RlY29kZShidWZbMV0sIGwxLCBscGFyYW0sIGxwYXJhbWxlbiwgbW9kbGVuLCBoYXNoX2lkeCwgYnVmWzJdLCAmbDIsICZyZXMxKSk7Ci0KLSAgICAgIGlmIChyZXMxICE9IDEgfHwgbDIgIT0gbDMgfHwgbWVtY21wKGJ1ZlsyXSwgYnVmWzBdLCBsMykgIT0gMCkgewotICAgICAgICAgcHJpbnRmKCJPdXRzaXplID09ICVsdSwgc2hvdWxkIGhhdmUgYmVlbiAlbHUsIHJlczEgPSAlZCwgbHBhcmFtbGVuID0gJWx1LCBtc2cgY29udGVudHMgZm9sbG93LlxuIiwgbDIsIGwzLCByZXMxLCBscGFyYW1sZW4pOwotICAgICAgICAgcHJpbnRmKCJPUklHSU5BTDpcbiIpOwotICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGwzOyB4KyspIHsKLSAgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgYnVmWzBdW3hdKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHByaW50ZigiXG5SRVNVTFQ6XG4iKTsKLSAgICAgICAgIGZvciAoeCA9IDA7IHggPCBsMjsgeCsrKSB7Ci0gICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGJ1ZlsyXVt4XSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBwcmludGYoIlxuXG4iKTsKLSAgICAgICAgIHJldHVybiAxOwotICAgICAgfQotCi0gICAgICAvKiB0ZXN0IFBTUyAqLwotICAgICAgbDEgPSBzaXplb2YoYnVmWzFdKTsKLSAgICAgIERPKHBrY3NfMV9wc3NfZW5jb2RlKGJ1ZlswXSwgbDMsIHNhbHRsZW4sICZ0ZXN0X3lhcnJvdywgcHJuZ19pZHgsIGhhc2hfaWR4LCBtb2RsZW4sIGJ1ZlsxXSwgJmwxKSk7Ci0gICAgICBETyhwa2NzXzFfcHNzX2RlY29kZShidWZbMF0sIGwzLCBidWZbMV0sIGwxLCBzYWx0bGVuLCBoYXNoX2lkeCwgbW9kbGVuLCAmcmVzMSkpOwotICAgICAgCi0gICAgICBidWZbMF1baTEgPSBhYnMocmFuZCgpKSAlIGwzXSBePSAxOwotICAgICAgRE8ocGtjc18xX3Bzc19kZWNvZGUoYnVmWzBdLCBsMywgYnVmWzFdLCBsMSwgc2FsdGxlbiwgaGFzaF9pZHgsIG1vZGxlbiwgJnJlczIpKTsKLQotICAgICAgYnVmWzBdW2kxXSBePSAxOwotICAgICAgYnVmWzFdW2kyID0gYWJzKHJhbmQoKSkgJSBsMV0gXj0gMTsKLSAgICAgIERPKHBrY3NfMV9wc3NfZGVjb2RlKGJ1ZlswXSwgbDMsIGJ1ZlsxXSwgbDEsIHNhbHRsZW4sIGhhc2hfaWR4LCBtb2RsZW4sICZyZXMzKSk7Ci0KLSAgICAgIGlmICghKHJlczEgPT0gMSAmJiByZXMyID09IDAgJiYgcmVzMyA9PSAwKSkgewotICAgICAgICAgcHJpbnRmKCJQU1MgZmFpbGVkOiAlZCwgJWQsICVkLCAlbHUsICVsdVxuIiwgcmVzMSwgcmVzMiwgcmVzMywgbDMsIHNhbHRsZW4pOwotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICB9Ci0gICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RlbW9zL3Rlc3QvcnNhX3Rlc3QuYyBiL2RlbW9zL3Rlc3QvcnNhX3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyNTUwYS4uMDAwMDAwMAotLS0gYS9kZW1vcy90ZXN0L3JzYV90ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0jaW5jbHVkZSAidGVzdC5oIgotCi1pbnQgcnNhX3Rlc3Qodm9pZCkKLXsKLSAgIHVuc2lnbmVkIGNoYXIgaW5bMTAyNF0sIG91dFsxMDI0XSwgdG1wWzEwMjRdOwotICAgcnNhX2tleSAgICAgICBrZXk7Ci0gICBpbnQgICAgICAgICAgIGhhc2hfaWR4LCBwcm5nX2lkeCwgc3RhdCwgc3RhdDI7Ci0gICB1bnNpZ25lZCBsb25nIGxlbiwgbGVuMjsKLSAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGxwYXJhbVtdID0geyAweDAxLCAweDAyLCAweDAzLCAweDA0IH07Ci0gICAgICAKLSAgIGhhc2hfaWR4ID0gZmluZF9oYXNoKCJzaGExIik7Ci0gICBwcm5nX2lkeCA9IGZpbmRfcHJuZygieWFycm93Iik7Ci0gICBpZiAoaGFzaF9pZHggPT0gLTEgfHwgcHJuZ19pZHggPT0gLTEpIHsKLSAgICAgIHByaW50ZigicnNhX3Rlc3QgcmVxdWlyZXMgU0hBMSBhbmQgeWFycm93Iik7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLSAgIAotICAgLyogbWFrZSBhIHJhbmRvbSBrZXkvbXNnICovCi0gICB5YXJyb3dfcmVhZChpbiwgMjAsICZ0ZXN0X3lhcnJvdyk7Ci0gICAKLSAgIC8qIG1ha2UgYSByYW5kb20ga2V5ICovCi0gICBETyhyc2FfbWFrZV9rZXkoJnRlc3RfeWFycm93LCBwcm5nX2lkeCwgMTAyNC84LCA2NTUzNywgJmtleSkpOwotICAgCi0gICAvKiBlbmNyeXB0IHRoZSBrZXkgKHdpdGhvdXQgbHBhcmFtKSAqLwotICAgbGVuICA9IHNpemVvZihvdXQpOwotICAgbGVuMiA9IHNpemVvZih0bXApOwotICAgRE8ocnNhX2VuY3J5cHRfa2V5KGluLCAyMCwgb3V0LCAmbGVuLCBOVUxMLCAwLCAmdGVzdF95YXJyb3csIHBybmdfaWR4LCBoYXNoX2lkeCwgJmtleSkpOwotICAgLyogY2hhbmdlIGEgYnl0ZSAqLwotICAgb3V0WzBdIF49IDE7Ci0gICBETyhyc2FfZGVjcnlwdF9rZXkob3V0LCBsZW4sIHRtcCwgJmxlbjIsIE5VTEwsIDAsICZ0ZXN0X3lhcnJvdywgcHJuZ19pZHgsIGhhc2hfaWR4LCAmc3RhdDIsICZrZXkpKTsKLSAgIC8qIGNoYW5nZSBhIGJ5dGUgYmFjayAqLwotICAgb3V0WzBdIF49IDE7Ci0gICBETyhyc2FfZGVjcnlwdF9rZXkob3V0LCBsZW4sIHRtcCwgJmxlbjIsIE5VTEwsIDAsICZ0ZXN0X3lhcnJvdywgcHJuZ19pZHgsIGhhc2hfaWR4LCAmc3RhdCwgJmtleSkpOwotICAgaWYgKCEoc3RhdCA9PSAxICYmIHN0YXQyID09IDApKSB7Ci0gICAgICBwcmludGYoInJzYV9kZWNyeXB0X2tleSBmYWlsZWQiKTsKLSAgICAgIHJldHVybiAxOwotICAgfQotICAgaWYgKGxlbjIgIT0gMjAgfHwgbWVtY21wKHRtcCwgaW4sIDIwKSkgewotICAgICAgcHJpbnRmKCJyc2FfZGVjcnlwdF9rZXkgbWlzbWF0Y2ggbGVuICVsdSIsIGxlbjIpOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0KLSAgIC8qIGVuY3J5cHQgdGhlIGtleSAod2l0aCBscGFyYW0pICovCi0gICBsZW4gID0gc2l6ZW9mKG91dCk7Ci0gICBsZW4yID0gc2l6ZW9mKHRtcCk7Ci0gICBETyhyc2FfZW5jcnlwdF9rZXkoaW4sIDIwLCBvdXQsICZsZW4sIGxwYXJhbSwgc2l6ZW9mKGxwYXJhbSksICZ0ZXN0X3lhcnJvdywgcHJuZ19pZHgsIGhhc2hfaWR4LCAma2V5KSk7Ci0gICAvKiBjaGFuZ2UgYSBieXRlICovCi0gICBvdXRbMF0gXj0gMTsKLSAgIERPKHJzYV9kZWNyeXB0X2tleShvdXQsIGxlbiwgdG1wLCAmbGVuMiwgbHBhcmFtLCBzaXplb2YobHBhcmFtKSwgJnRlc3RfeWFycm93LCBwcm5nX2lkeCwgaGFzaF9pZHgsICZzdGF0MiwgJmtleSkpOwotICAgLyogY2hhbmdlIGEgYnl0ZSBiYWNrICovCi0gICBvdXRbMF0gXj0gMTsKLSAgIERPKHJzYV9kZWNyeXB0X2tleShvdXQsIGxlbiwgdG1wLCAmbGVuMiwgbHBhcmFtLCBzaXplb2YobHBhcmFtKSwgJnRlc3RfeWFycm93LCBwcm5nX2lkeCwgaGFzaF9pZHgsICZzdGF0LCAma2V5KSk7Ci0gICBpZiAoIShzdGF0ID09IDEgJiYgc3RhdDIgPT0gMCkpIHsKLSAgICAgIHByaW50ZigicnNhX2RlY3J5cHRfa2V5IGZhaWxlZCIpOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0gICBpZiAobGVuMiAhPSAyMCB8fCBtZW1jbXAodG1wLCBpbiwgMjApKSB7Ci0gICAgICBwcmludGYoInJzYV9kZWNyeXB0X2tleSBtaXNtYXRjaCBsZW4gJWx1IiwgbGVuMik7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLQotICAgLyogc2lnbiBhIG1lc3NhZ2UgKHVuc2FsdGVkLCBsb3dlciBjaG9sZXN0b3JvbCBhbmQgQXRraW5zIGFwcHJvdmVkKSBub3cgKi8KLSAgIGxlbiA9IHNpemVvZihvdXQpOwotICAgRE8ocnNhX3NpZ25faGFzaChpbiwgMjAsIG91dCwgJmxlbiwgJnRlc3RfeWFycm93LCBwcm5nX2lkeCwgaGFzaF9pZHgsIDAsICZrZXkpKTsKLSAgIERPKHJzYV92ZXJpZnlfaGFzaChvdXQsIGxlbiwgaW4sIDIwLCAmdGVzdF95YXJyb3csIHBybmdfaWR4LCBoYXNoX2lkeCwgMCwgJnN0YXQsICZrZXkpKTsKLSAgIC8qIGNoYW5nZSBhIGJ5dGUgKi8KLSAgIGluWzBdIF49IDE7Ci0gICBETyhyc2FfdmVyaWZ5X2hhc2gob3V0LCBsZW4sIGluLCAyMCwgJnRlc3RfeWFycm93LCBwcm5nX2lkeCwgaGFzaF9pZHgsIDAsICZzdGF0MiwgJmtleSkpOwotICAgCi0gICBpZiAoIShzdGF0ID09IDEgJiYgc3RhdDIgPT0gMCkpIHsKLSAgICAgIHByaW50ZigicnNhX3ZlcmlmeV9oYXNoICh1bnNhbHRlZCkgZmFpbGVkLCAlZCwgJWQiLCBzdGF0LCBzdGF0Mik7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLQotICAgLyogc2lnbiBhIG1lc3NhZ2UgKHNhbHRlZCkgbm93ICovCi0gICBsZW4gPSBzaXplb2Yob3V0KTsKLSAgIERPKHJzYV9zaWduX2hhc2goaW4sIDIwLCBvdXQsICZsZW4sICZ0ZXN0X3lhcnJvdywgcHJuZ19pZHgsIGhhc2hfaWR4LCA4LCAma2V5KSk7Ci0gICBETyhyc2FfdmVyaWZ5X2hhc2gob3V0LCBsZW4sIGluLCAyMCwgJnRlc3RfeWFycm93LCBwcm5nX2lkeCwgaGFzaF9pZHgsIDgsICZzdGF0LCAma2V5KSk7Ci0gICAvKiBjaGFuZ2UgYSBieXRlICovCi0gICBpblswXSBePSAxOwotICAgRE8ocnNhX3ZlcmlmeV9oYXNoKG91dCwgbGVuLCBpbiwgMjAsICZ0ZXN0X3lhcnJvdywgcHJuZ19pZHgsIGhhc2hfaWR4LCA4LCAmc3RhdDIsICZrZXkpKTsKLSAgIAotICAgaWYgKCEoc3RhdCA9PSAxICYmIHN0YXQyID09IDApKSB7Ci0gICAgICBwcmludGYoInJzYV92ZXJpZnlfaGFzaCAoc2FsdGVkKSBmYWlsZWQsICVkLCAlZCIsIHN0YXQsIHN0YXQyKTsKLSAgICAgIHJldHVybiAxOwotICAgfQotICAgCi0gICAvKiBmcmVlIHRoZSBrZXkgYW5kIHJldHVybiAqLwotICAgcnNhX2ZyZWUoJmtleSk7Ci0gICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RlbW9zL3Rlc3Qvc3RvcmVfdGVzdC5jIGIvZGVtb3MvdGVzdC9zdG9yZV90ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OGQ1MmYuLjAwMDAwMDAKLS0tIGEvZGVtb3MvdGVzdC9zdG9yZV90ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jaW5jbHVkZSAidGVzdC5oIgotCi1pbnQgc3RvcmVfdGVzdCh2b2lkKQotewotICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKLSAgdW5zaWduZWQgbG9uZyBMOwotICB1bG9uZzY0IExMOwotCi0gIEwgPSAweDEyMzQ1Njc4VUw7Ci0gIFNUT1JFMzJMIChMLCAmYnVmWzBdKTsKLSAgTCA9IDA7Ci0gIExPQUQzMkwgKEwsICZidWZbMF0pOwotICBpZiAoTCAhPSAweDEyMzQ1Njc4VUwpIHsKLSAgICBwcmludGYgKCJMT0FEL1NUT1JFMzIgTGl0dGxlIGRvbid0IHdvcmsiKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICBMTCA9IENPTlNUNjQgKDB4MDEwMjAzMDQwNTA2MDcpOwotICBTVE9SRTY0TCAoTEwsICZidWZbMF0pOwotICBMTCA9IDA7Ci0gIExPQUQ2NEwgKExMLCAmYnVmWzBdKQotICAgIGlmIChMTCAhPSBDT05TVDY0ICgweDAxMDIwMzA0MDUwNjA3KSkgewotICAgIHByaW50ZiAoIkxPQUQvU1RPUkU2NCBMaXR0bGUgZG9uJ3Qgd29yayIpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgTCA9IDB4MTIzNDU2NzhVTDsKLSAgU1RPUkUzMkggKEwsICZidWZbMF0pOwotICBMID0gMDsKLSAgTE9BRDMySCAoTCwgJmJ1ZlswXSk7Ci0gIGlmIChMICE9IDB4MTIzNDU2NzhVTCkgewotICAgIHByaW50ZiAoIkxPQUQvU1RPUkUzMiBIaWdoIGRvbid0IHdvcmssICUwOGx4IiwgTCk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgTEwgPSBDT05TVDY0ICgweDAxMDIwMzA0MDUwNjA3KTsKLSAgU1RPUkU2NEggKExMLCAmYnVmWzBdKTsKLSAgTEwgPSAwOwotICBMT0FENjRIIChMTCwgJmJ1ZlswXSkKLSAgICBpZiAoTEwgIT0gQ09OU1Q2NCAoMHgwMTAyMDMwNDA1MDYwNykpIHsKLSAgICBwcmludGYgKCJMT0FEL1NUT1JFNjQgSGlnaCBkb24ndCB3b3JrIik7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kZW1vcy90ZXN0L3Rlc3QuYyBiL2RlbW9zL3Rlc3QvdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWY1OTAwLi4wMDAwMDAwCi0tLSBhL2RlbW9zL3Rlc3QvdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLSNpbmNsdWRlICJ0ZXN0LmgiCi0KLXRlc3RfZW50cnkgdGVzdHNbMjZdOwotCi10ZXN0X2VudHJ5IHRlc3RfbGlzdFsyNl0gPSB7IAotCi0vKiB0ZXN0IG5hbWUgICAgICAgICAgcHJvdmlkZXMgICAgcmVxdWlyZXMgICAgICAgICAgICAgZW50cnkgKi8KLXsic3RvcmVfdGVzdCIsICAgICAgICAgICAgICJhIiwgICAgICAgICAiIiwgICAgICAgICAgc3RvcmVfdGVzdCAgICAgICAgICAgfSwKLXsiY2lwaGVyX2hhc2hfdGVzdCIsICAgICAgICJiIiwgICAgICAgICJhIiwgICAgICAgICAgY2lwaGVyX2hhc2hfdGVzdCAgICAgfSwKLXsibW9kZXNfdGVzdCIsICAgICAgICAgICAgICJjIiwgICAgICAgICJiIiwgICAgICAgICAgbW9kZXNfdGVzdCAgICAgICAgICAgfSwKLXsibWFjX3Rlc3QiLCAgICAgICAgICAgICAgICJkIiwgICAgICAgICJjIiwgICAgICAgICAgbWFjX3Rlc3QgICAgICAgICAgICAgfSwKLXsicGtjc18xX3Rlc3QiLCAgICAgICAgICAgICJlIiwgICAgICAgICJiIiwgICAgICAgICAgcGtjc18xX3Rlc3QgICAgICAgICAgfSwKLXsicnNhX3Rlc3QiLCAgICAgICAgICAgICAgICJmIiwgICAgICAgICJlIiwgICAgICAgICAgcnNhX3Rlc3QgICAgICAgICAgICAgfSwKLXsiZWNjX3Rlc3QiLCAgICAgICAgICAgICAgICJnIiwgICAgICAgICJhIiwgICAgICAgICAgZWNjX3Rlc3RzICAgICAgICAgICAgfSwKLXsiZHNhX3Rlc3QiLCAgICAgICAgICAgICAgICJoIiwgICAgICAgICJhIiwgICAgICAgICAgZHNhX3Rlc3QgICAgICAgICAgICAgfSwKLXsiZGhfdGVzdCIsICAgICAgICAgICAgICAgICJpIiwgICAgICAgICJhIiwgICAgICAgICAgZGhfdGVzdHMgICAgICAgICAgICAgfSwKLQote05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9IAotfTsKLQotcHJuZ19zdGF0ZSB0ZXN0X3lhcnJvdzsKLXN0YXRpYyBpbnQgY3VycmVudF90ZXN0OwotCi12b2lkIHJ1bl9jbWQoaW50IHJlcywgaW50IGxpbmUsIGNoYXIgKmZpbGUsIGNoYXIgKmNtZCkKLXsKLSAgIGlmIChyZXMgIT0gQ1JZUFRfT0spIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVzXTogJXMgKCVkKVxuJXM6JWQ6JXNcbiIsIHRlc3RzW2N1cnJlbnRfdGVzdF0ubmFtZSwgZXJyb3JfdG9fc3RyaW5nKHJlcyksIHJlcywgZmlsZSwgbGluZSwgY21kKTsKLSAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgIH0KLX0KLQotdm9pZCByZWdpc3Rlcl9hbGdzKHZvaWQpCi17Ci0jaWZkZWYgUklKTkRBRUwKLSAgcmVnaXN0ZXJfY2lwaGVyICgmYWVzX2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgQkxPV0ZJU0gKLSAgcmVnaXN0ZXJfY2lwaGVyICgmYmxvd2Zpc2hfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBYVEVBCi0gIHJlZ2lzdGVyX2NpcGhlciAoJnh0ZWFfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBSQzUKLSAgcmVnaXN0ZXJfY2lwaGVyICgmcmM1X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgUkM2Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnJjNl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFNBRkVSUAotICByZWdpc3Rlcl9jaXBoZXIgKCZzYWZlcnBfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBUV09GSVNICi0gIHJlZ2lzdGVyX2NpcGhlciAoJnR3b2Zpc2hfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBTQUZFUgotICByZWdpc3Rlcl9jaXBoZXIgKCZzYWZlcl9rNjRfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVyX3NrNjRfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVyX2sxMjhfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVyX3NrMTI4X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgUkMyCi0gIHJlZ2lzdGVyX2NpcGhlciAoJnJjMl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIERFUwotICByZWdpc3Rlcl9jaXBoZXIgKCZkZXNfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJmRlczNfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBDQVNUNQotICByZWdpc3Rlcl9jaXBoZXIgKCZjYXN0NV9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIE5PRUtFT04KLSAgcmVnaXN0ZXJfY2lwaGVyICgmbm9la2Vvbl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFNLSVBKQUNLCi0gIHJlZ2lzdGVyX2NpcGhlciAoJnNraXBqYWNrX2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgVElHRVIKLSAgcmVnaXN0ZXJfaGFzaCAoJnRpZ2VyX2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgTUQyCi0gIHJlZ2lzdGVyX2hhc2ggKCZtZDJfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBNRDQKLSAgcmVnaXN0ZXJfaGFzaCAoJm1kNF9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIE1ENQotICByZWdpc3Rlcl9oYXNoICgmbWQ1X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgU0hBMQotICByZWdpc3Rlcl9oYXNoICgmc2hhMV9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFNIQTI1NgotICByZWdpc3Rlcl9oYXNoICgmc2hhMjU2X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgU0hBMjI0Ci0gIHJlZ2lzdGVyX2hhc2ggKCZzaGEyMjRfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBTSEEzODQKLSAgcmVnaXN0ZXJfaGFzaCAoJnNoYTM4NF9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFNIQTUxMgotICByZWdpc3Rlcl9oYXNoICgmc2hhNTEyX2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgUklQRU1EMTI4Ci0gIHJlZ2lzdGVyX2hhc2ggKCZybWQxMjhfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBSSVBFTUQxNjAKLSAgcmVnaXN0ZXJfaGFzaCAoJnJtZDE2MF9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFdISVJMUE9PTAotICByZWdpc3Rlcl9oYXNoICgmd2hpcmxwb29sX2Rlc2MpOwotI2VuZGlmCi0KLSAgIGlmIChyZWdpc3Rlcl9wcm5nKCZ5YXJyb3dfZGVzYykgPT0gLTEpIHsKLSAgICAgIHByaW50ZigiRXJyb3IgcmVnaXN0ZXJpbmcgeWFycm93IFBSTkdcbiIpOwotICAgICAgZXhpdCgtMSk7Ci0gICB9Ci0KLSAgIGlmIChyZWdpc3Rlcl9wcm5nKCZzcHJuZ19kZXNjKSA9PSAtMSkgewotICAgICAgcHJpbnRmKCJFcnJvciByZWdpc3RlcmluZyBzcHJuZyBQUk5HXG4iKTsKLSAgICAgIGV4aXQoLTEpOwotICAgfQotfQotCi0vKiBzb3J0IHRlc3RzIGJhc2VkIG9uIHRoZWlyIHJlcXVpcmVtZW50L3NlcnZpY2VzLiAgSGVscHMgbWFrZSBzdXJlIGRlcGVuZGVuY2llcyBhcmUgdGVzdGVkIGZpcnN0ICovCi12b2lkIHNvcnQodm9pZCkKLXsKLSAgIHVuc2lnbmVkIHgsIHksIHosIGEsIHBpZHhbMjZdOwotICAgICAgCi0gICAvKiBmaW5kIG91dCB3aGVyZSB0aGluZ3MgYXJlIHByb3ZpZGVkICovCi0gICB6ZXJvbWVtKHBpZHgsIHNpemVvZihwaWR4KSk7ICAgCi0gICB6ID0gMDsKLSAgIGRvIHsgCi0gICAgICB5ID0gMDsKLSAgICAgIGZvciAoeCA9IDA7IHRlc3RfbGlzdFt4XS5uYW1lICE9IE5VTEw7IHgrKykgewotICAgICAgICBpZiAodGVzdF9saXN0W3hdLmVudHJ5ID09IE5VTEwpIGNvbnRpbnVlOwotICAgICAgICBpZiAoc3RybGVuKHRlc3RfbGlzdFt4XS5wcm92KSA9PSAwKSB7Ci0gICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICB0ZXN0c1t6KytdID0gdGVzdF9saXN0W3hdOyB0ZXN0X2xpc3RbeF0uZW50cnkgPSBOVUxMOwotICAgICAgICAgICBwaWR4W3Rlc3RfbGlzdFt4XS5wcm92WzBdLSdhJ10gPSAxOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IHN0cmxlbih0ZXN0X2xpc3RbeF0ucmVxKTsgYSsrKSB7Ci0gICAgICAgICAgICAgICBpZiAocGlkeFt0ZXN0X2xpc3RbeF0ucmVxW2FdLSdhJ10gPT0gMCkgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKGEgPT0gc3RybGVuKHRlc3RfbGlzdFt4XS5yZXEpKSB7Ci0gICAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgICB0ZXN0c1t6KytdID0gdGVzdF9saXN0W3hdOyB0ZXN0X2xpc3RbeF0uZW50cnkgPSBOVUxMOwotICAgICAgICAgICAgICBwaWR4W3Rlc3RfbGlzdFt4XS5wcm92WzBdLSdhJ10gPSAxOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICB9IHdoaWxlICh5ID09IDEpOwotfQotICAgCi1pbnQgbWFpbih2b2lkKQotewotICAgcHJpbnRmKCJCdWlsdCB3aXRoXG4lc1xuIiwgY3J5cHRfYnVpbGRfc2V0dGluZ3MpOwotCi0gICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgIHNvcnQoKTsKLSAgIHJlZ2lzdGVyX2FsZ3MoKTsKLSAgICAgIAotICAgLy8gc3RhcnQgZHVtbXkgeWFycm93IGZvciBpbnRlcm5hbCB1c2UgCi0gICBETyh5YXJyb3dfc3RhcnQoJnRlc3RfeWFycm93KSk7Ci0gICBETyh5YXJyb3dfYWRkX2VudHJvcHkoInRlc3QiLCA0LCAmdGVzdF95YXJyb3cpKTsKLSAgIERPKHlhcnJvd19yZWFkeSgmdGVzdF95YXJyb3cpKTsKLQotICAgLy8gZG8gdGVzdHMKLSAgIGZvciAoY3VycmVudF90ZXN0ID0gMDsgdGVzdHNbY3VycmVudF90ZXN0XS5uYW1lICE9IE5VTEw7IGN1cnJlbnRfdGVzdCsrKSB7Ci0gICAgICAgcHJpbnRmKCJbJS0yMHNdOiAiLCB0ZXN0c1tjdXJyZW50X3Rlc3RdLm5hbWUpOyBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICBwcmludGYoIlx0JXNcbiIsIHRlc3RzW2N1cnJlbnRfdGVzdF0uZW50cnkoKT09MD8icGFzc2VkIjoiZmFpbGVkIik7IAotICAgfQotICAgCi0gICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RlbW9zL3Rlc3QvdGVzdC5oIGIvZGVtb3MvdGVzdC90ZXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMTMxNTcuLjAwMDAwMDAKLS0tIGEvZGVtb3MvdGVzdC90ZXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jaWZuZGVmIF9fVEVTVF9IXwotI2RlZmluZSBfX1RFU1RfSF8KLQotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNoYXIgKm5hbWUsICpwcm92LCAqcmVxOwotICAgIGludCAgKCplbnRyeSkodm9pZCk7Ci19IHRlc3RfZW50cnk7Ci0KLWV4dGVybiBwcm5nX3N0YXRlIHRlc3RfeWFycm93OwotCi12b2lkIHJ1bl9jbWQoaW50IHJlcywgaW50IGxpbmUsIGNoYXIgKmZpbGUsIGNoYXIgKmNtZCk7Ci0jZGVmaW5lIERPKHgpIHJ1bl9jbWQoKHgpLCBfX0xJTkVfXywgX19GSUxFX18sICN4KQotCi0KLQotLyogVEVTVFMgKi8KLWludCBjaXBoZXJfaGFzaF90ZXN0KHZvaWQpOwotaW50IG1vZGVzX3Rlc3Qodm9pZCk7Ci1pbnQgbWFjX3Rlc3Qodm9pZCk7Ci1pbnQgcGtjc18xX3Rlc3Qodm9pZCk7Ci1pbnQgc3RvcmVfdGVzdCh2b2lkKTsKLWludCByc2FfdGVzdCh2b2lkKTsKLWludCBlY2NfdGVzdHModm9pZCk7Ci1pbnQgZHNhX3Rlc3Qodm9pZCk7Ci1pbnQgZGhfdGVzdHModm9pZCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZGVtb3MvdGltaW5nLmMgYi9kZW1vcy90aW1pbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjhkNmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZGVtb3MvdGltaW5nLmMKQEAgLTAsMCArMSwyNiBAQAorI2luY2x1ZGUgPHRvbWNyeXB0X3Rlc3QuaD4KKworaW50IG1haW4odm9pZCkKK3sKK2luaXRfdGltZXIoKTsKK3JlZ19hbGdzKCk7Cit0aW1lX2tleXNjaGVkKCk7Cit0aW1lX2NpcGhlcigpOwordGltZV9jaXBoZXIyKCk7Cit0aW1lX2NpcGhlcjMoKTsKK3RpbWVfaGFzaCgpOwordGltZV9tYWNzKCk7Cit0aW1lX2VuY21hY3MoKTsKK3RpbWVfcHJuZygpOwordGltZV9tdWx0KCk7Cit0aW1lX3NxcigpOwordGltZV9yc2EoKTsKK3RpbWVfZWNjKCk7Cit0aW1lX2RoKCk7CityZXR1cm4gRVhJVF9TVUNDRVNTOworCit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L2RlbW9zL3RpbWluZy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjE3ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzIzIDAyOjE2OjI2ICQgKi8KZGlmZiAtLWdpdCBhL2RlbW9zL3R2X2dlbi5jIGIvZGVtb3MvdHZfZ2VuLmMKaW5kZXggY2Y3NWQzYi4uZWRhYWUzZSAxMDA2NDQKLS0tIGEvZGVtb3MvdHZfZ2VuLmMKKysrIGIvZGVtb3MvdHZfZ2VuLmMKQEAgLTEsNyArMSw5IEBACi0jaW5jbHVkZSA8bXljcnlwdC5oPgorI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CiAKIHZvaWQgcmVnX2FsZ3Modm9pZCkKIHsKKyAgaW50IGVycjsKKwogI2lmZGVmIFJJSk5EQUVMCiAgIHJlZ2lzdGVyX2NpcGhlciAoJmFlc19kZXNjKTsKICNlbmRpZgpAQCAtNDUsNiArNDcsMTIgQEAKICNpZmRlZiBTS0lQSkFDSwogICByZWdpc3Rlcl9jaXBoZXIgKCZza2lwamFja19kZXNjKTsKICNlbmRpZgorI2lmZGVmIEFOVUJJUworICByZWdpc3Rlcl9jaXBoZXIgKCZhbnViaXNfZGVzYyk7CisjZW5kaWYKKyNpZmRlZiBLSEFaQUQKKyAgcmVnaXN0ZXJfY2lwaGVyICgma2hhemFkX2Rlc2MpOworI2VuZGlmCiAKICNpZmRlZiBUSUdFUgogICByZWdpc3Rlcl9oYXNoICgmdGlnZXJfZGVzYyk7CkBAIC04MiwyNiArOTAsNDUgQEAKICNpZmRlZiBXSElSTFBPT0wKICAgcmVnaXN0ZXJfaGFzaCAoJndoaXJscG9vbF9kZXNjKTsKICNlbmRpZgorI2lmZGVmIENIQ19IQVNICisgIHJlZ2lzdGVyX2hhc2goJmNoY19kZXNjKTsKKyAgaWYgKChlcnIgPSBjaGNfcmVnaXN0ZXIocmVnaXN0ZXJfY2lwaGVyKCZhZXNfZGVzYykpKSAhPSBDUllQVF9PSykgeworICAgICBwcmludGYoImNoY19yZWdpc3RlciBlcnJvcjogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKKyAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICB9CisjZW5kaWYKKwogfQogCiB2b2lkIGhhc2hfZ2VuKHZvaWQpCiB7Ci0gICB1bnNpZ25lZCBjaGFyIG1kW01BWEJMT0NLU0laRV0sIGJ1ZltNQVhCTE9DS1NJWkUqMisyXTsKKyAgIHVuc2lnbmVkIGNoYXIgbWRbTUFYQkxPQ0tTSVpFXSwgKmJ1ZjsKICAgIHVuc2lnbmVkIGxvbmcgb3V0bGVuLCB4LCB5LCB6OwogICAgRklMRSAqb3V0OworICAgaW50ICAgZXJyOwogICAgCiAgICBvdXQgPSBmb3BlbigiaGFzaF90di50eHQiLCAidyIpOworICAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgICBwZXJyb3IoImNhbid0IG9wZW4gaGFzaF90diIpOworICAgfQogICAgCiAgICBmcHJpbnRmKG91dCwgIkhhc2ggVGVzdCBWZWN0b3JzOlxuXG5UaGVzZSBhcmUgdGhlIGhhc2hlcyBvZiBubiBieXRlcyAnMDAgMDEgMDIgMDMgLi4gKG5uLTEpJ1xuXG4iKTsKICAgIGZvciAoeCA9IDA7IGhhc2hfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEw7IHgrKykgeworICAgICAgYnVmID0gWE1BTExPQygyICogaGFzaF9kZXNjcmlwdG9yW3hdLmJsb2Nrc2l6ZSArIDEpOworICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICBwZXJyb3IoImNhbid0IGFsbG9jIG1lbSIpOworICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgfQogICAgICAgZnByaW50ZihvdXQsICJIYXNoOiAlc1xuIiwgaGFzaF9kZXNjcmlwdG9yW3hdLm5hbWUpOwotICAgICAgCiAgICAgICBmb3IgKHkgPSAwOyB5IDw9IChoYXNoX2Rlc2NyaXB0b3JbeF0uYmxvY2tzaXplICogMik7IHkrKykgewogICAgICAgICAgZm9yICh6ID0gMDsgeiA8IHk7IHorKykgewogICAgICAgICAgICAgYnVmW3pdID0gKHVuc2lnbmVkIGNoYXIpKHogJiAyNTUpOwogICAgICAgICAgfQogICAgICAgICAgb3V0bGVuID0gc2l6ZW9mKG1kKTsKLSAgICAgICAgIGhhc2hfbWVtb3J5KHgsIGJ1ZiwgeSwgbWQsICZvdXRsZW4pOworICAgICAgICAgaWYgKChlcnIgPSBoYXNoX21lbW9yeSh4LCBidWYsIHksIG1kLCAmb3V0bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiaGFzaF9tZW1vcnkgZXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICB9CiAgICAgICAgICBmcHJpbnRmKG91dCwgIiUzbHU6ICIsIHkpOwogICAgICAgICAgZm9yICh6ID0gMDsgeiA8IG91dGxlbjsgeisrKSB7CiAgICAgICAgICAgICBmcHJpbnRmKG91dCwgIiUwMlgiLCBtZFt6XSk7CkBAIC0xMDksMTUgKzEzNiwxNiBAQAogICAgICAgICAgZnByaW50ZihvdXQsICJcbiIpOwogICAgICAgfQogICAgICAgZnByaW50ZihvdXQsICJcbiIpOworICAgICAgWEZSRUUoYnVmKTsKICAgIH0KICAgIGZjbG9zZShvdXQpOwogfQogCiB2b2lkIGNpcGhlcl9nZW4odm9pZCkKIHsKLSAgIHVuc2lnbmVkIGNoYXIga2V5W01BWEJMT0NLU0laRV0sIHB0W01BWEJMT0NLU0laRV07CisgICB1bnNpZ25lZCBjaGFyICprZXksIHB0W01BWEJMT0NLU0laRV07CiAgICB1bnNpZ25lZCBsb25nIHgsIHksIHosIHc7Ci0gICBpbnQga2wsIGxhc3RrbDsKKyAgIGludCBlcnIsIGtsLCBsYXN0a2w7CiAgICBGSUxFICpvdXQ7CiAgICBzeW1tZXRyaWNfa2V5IHNrZXk7CiAgICAKQEAgLTEzOCwxNSArMTY2LDI3IEBACiAgICAgICAgICAgICBjYXNlIDE6IGtsID0gKGNpcGhlcl9kZXNjcmlwdG9yW3hdLm1pbl9rZXlfbGVuZ3RoICsgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubWF4X2tleV9sZW5ndGgpLzI7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSAyOiBrbCA9IGNpcGhlcl9kZXNjcmlwdG9yW3hdLm1heF9rZXlfbGVuZ3RoOyBicmVhazsKICAgICAgICAgIH0KLSAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW3hdLmtleXNpemUoJmtsKTsKKyAgICAgICAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbeF0ua2V5c2l6ZSgma2wpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgcHJpbnRmKCJrZXlzaXplIGVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgfQogICAgICAgICAgaWYgKGtsID09IGxhc3RrbCkgYnJlYWs7CiAgICAgICAgICBsYXN0a2wgPSBrbDsKICAgICAgICAgIGZwcmludGYob3V0LCAiS2V5IFNpemU6ICVkIGJ5dGVzXG4iLCBrbCk7CiAKKyAgICAgICAgIGtleSA9IFhNQUxMT0Moa2wpOworICAgICAgICAgaWYgKGtleSA9PSBOVUxMKSB7CisgICAgICAgICAgICBwZXJyb3IoImNhbid0IG1hbGxvYyBtZW1vcnkiKTsKKyAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgIH0KKwogICAgICAgICAgZm9yICh6ID0gMDsgKGludCl6IDwga2w7IHorKykgewogICAgICAgICAgICAgIGtleVt6XSA9ICh1bnNpZ25lZCBjaGFyKXo7CiAgICAgICAgICB9Ci0gICAgICAgICBjaXBoZXJfZGVzY3JpcHRvclt4XS5zZXR1cChrZXksIGtsLCAwLCAmc2tleSk7CisgICAgICAgICBpZiAoKGVyciA9IGNpcGhlcl9kZXNjcmlwdG9yW3hdLnNldHVwKGtleSwga2wsIDAsICZza2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgIHByaW50Zigic2V0dXAgZXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGZvciAoeiA9IDA7IChpbnQpeiA8IGNpcGhlcl9kZXNjcmlwdG9yW3hdLmJsb2NrX2xlbmd0aDsgeisrKSB7CiAgICAgICAgICAgICBwdFt6XSA9ICh1bnNpZ25lZCBjaGFyKXo7CkBAIC0xNjMsOSArMjAzLDEzIEBACiAgICAgICAgICAgICAgZm9yICh6ID0gMDsgeiA8ICh1bnNpZ25lZCBsb25nKWtsOyB6KyspIHsKICAgICAgICAgICAgICAgICAga2V5W3pdID0gcHRbeiAlIGNpcGhlcl9kZXNjcmlwdG9yW3hdLmJsb2NrX2xlbmd0aF07CiAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW3hdLnNldHVwKGtleSwga2wsIDAsICZza2V5KTsKKyAgICAgICAgICAgICBpZiAoKGVyciA9IGNpcGhlcl9kZXNjcmlwdG9yW3hdLnNldHVwKGtleSwga2wsIDAsICZza2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImNpcGhlciBzZXR1cDIgZXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZwcmludGYob3V0LCAiXG4iKTsKKyAgICAgICAgIFhGUkVFKGtleSk7CiAgICAgIH0KICAgICAgZnByaW50ZihvdXQsICJcbiIpOwogICB9CkBAIC0xNzQsOCArMjE4LDggQEAKIAogdm9pZCBobWFjX2dlbih2b2lkKQogewotICAgdW5zaWduZWQgY2hhciBrZXlbTUFYQkxPQ0tTSVpFXSwgb3V0cHV0W01BWEJMT0NLU0laRV0sIGlucHV0W01BWEJMT0NLU0laRSoyKzJdOwotICAgaW50IHgsIHksIHosIGtsLCBlcnI7CisgICB1bnNpZ25lZCBjaGFyIGtleVtNQVhCTE9DS1NJWkVdLCBvdXRwdXRbTUFYQkxPQ0tTSVpFXSwgKmlucHV0OworICAgaW50IHgsIHksIHosIGVycjsKICAgIEZJTEUgKm91dDsKICAgIHVuc2lnbmVkIGxvbmcgbGVuOwogICAKQEAgLTE5Myw2ICsyMzcsMTIgQEAKICAgICAgIGZvciAoeSA9IDA7IHkgPCAoaW50KWhhc2hfZGVzY3JpcHRvclt4XS5oYXNoc2l6ZTsgeSsrKSB7CiAgICAgICAgICAga2V5W3ldID0gKHkmMjU1KTsKICAgICAgIH0KKworICAgICAgaW5wdXQgPSBYTUFMTE9DKGhhc2hfZGVzY3JpcHRvclt4XS5ibG9ja3NpemUgKiAyICsgMSk7CisgICAgICBpZiAoaW5wdXQgPT0gTlVMTCkgeworICAgICAgICAgcGVycm9yKCJDYW4ndCBtYWxsb2MgbWVtb3J5Iik7CisgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICB9CiAgICAgICAKICAgICAgIGZvciAoeSA9IDA7IHkgPD0gKGludCkoaGFzaF9kZXNjcmlwdG9yW3hdLmJsb2Nrc2l6ZSAqIDIpOyB5KyspIHsKICAgICAgICAgIGZvciAoeiA9IDA7IHogPCB5OyB6KyspIHsKQEAgLTIxMiw2ICsyNjIsNyBAQAogICAgICAgICAgLyogZm9yd2FyZCB0aGUga2V5ICovCiAgICAgICAgICBtZW1jcHkoa2V5LCBvdXRwdXQsIGhhc2hfZGVzY3JpcHRvclt4XS5oYXNoc2l6ZSk7CiAgICAgICB9CisgICAgICBYRlJFRShpbnB1dCk7CiAgICAgICBmcHJpbnRmKG91dCwgIlxuIik7CiAgICB9CiAgICBmY2xvc2Uob3V0KTsKQEAgLTQ1MCw2ICs1MDEsMTI3IEBACiAgICBmY2xvc2Uob3V0KTsKIH0KIAorCit2b2lkIGNjbV9nZW4odm9pZCkKK3sKKyAgIGludCBlcnIsIGtsLCB4LCB5MSwgejsKKyAgIEZJTEUgKm91dDsKKyAgIHVuc2lnbmVkIGNoYXIga2V5W01BWEJMT0NLU0laRV0sIG5vbmNlW01BWEJMT0NLU0laRSoyXSwgCisgICAgICAgICAgICAgICAgIHBsYWludGV4dFtNQVhCTE9DS1NJWkUqMl0sIHRhZ1tNQVhCTE9DS1NJWkVdOworICAgdW5zaWduZWQgbG9uZyBsZW47CisKKyAgIG91dCA9IGZvcGVuKCJjY21fdHYudHh0IiwgInciKTsKKyAgIGZwcmludGYob3V0LCAiQ0NNIFRlc3QgVmVjdG9ycy4gIFVzZXMgdGhlIDAwMDEwMjAzLi4uTk4tMSBwYXR0ZXJuIGZvciBub25jZS9oZWFkZXIvcGxhaW50ZXh0L2tleS4gIFRoZSBvdXRwdXRzXG4iCisgICAgICAgICAgICAgICAgImFyZSBvZiB0aGUgZm9ybSBjaXBoZXJ0ZXh0LHRhZyBmb3IgYSBnaXZlbiBOTi4gIFRoZSBrZXkgZm9yIHN0ZXAgTj4xIGlzIHRoZSB0YWcgb2YgdGhlIHByZXZpb3VzXG4iCisgICAgICAgICAgICAgICAgInN0ZXAgcmVwZWF0ZWQgc3VmZmljaWVudGx5LiAgVGhlIG5vbmNlIGlzIGZpeGVkIHRocm91Z2hvdXQgYXQgMTMgYnl0ZXMgMDAwMTAyLi4uXG5cbiIpOworCisgICBmb3IgKHggPSAwOyBjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEw7IHgrKykgeworICAgICAga2wgPSBjaXBoZXJfZGVzY3JpcHRvclt4XS5ibG9ja19sZW5ndGg7CisKKyAgICAgIC8qIHNraXAgY2lwaGVycyB3aGljaCBkbyBub3QgaGF2ZSAxMjggYml0IGJsb2NrIHNpemVzICovCisgICAgICBpZiAoa2wgIT0gMTYpIGNvbnRpbnVlOworCisgICAgICBpZiAoY2lwaGVyX2Rlc2NyaXB0b3JbeF0ua2V5c2l6ZSgma2wpICE9IENSWVBUX09LKSB7CisgICAgICAgICBrbCA9IGNpcGhlcl9kZXNjcmlwdG9yW3hdLm1heF9rZXlfbGVuZ3RoOworICAgICAgfQorICAgICAgZnByaW50ZihvdXQsICJDQ00tJXMgKCVkIGJ5dGUga2V5KVxuIiwgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSwga2wpOworCisgICAgICAvKiB0aGUga2V5ICovCisgICAgICBmb3IgKHogPSAwOyB6IDwga2w7IHorKykgeworICAgICAgICAgIGtleVt6XSA9ICh6ICYgMjU1KTsKKyAgICAgIH0KKworICAgICAgLyogZml4ZWQgbm9uY2UgKi8KKyAgICAgIGZvciAoeiA9IDA7IHogPCBjaXBoZXJfZGVzY3JpcHRvclt4XS5ibG9ja19sZW5ndGg7IHorKykgeworICAgICAgICAgIG5vbmNlW3pdID0gejsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZm9yICh5MSA9IDA7IHkxIDw9IChpbnQpKGNpcGhlcl9kZXNjcmlwdG9yW3hdLmJsb2NrX2xlbmd0aCoyKTsgeTErKyl7CisgICAgICAgICBmb3IgKHogPSAwOyB6IDwgeTE7IHorKykgeworICAgICAgICAgICAgcGxhaW50ZXh0W3pdID0gKHVuc2lnbmVkIGNoYXIpKHogJiAyNTUpOworICAgICAgICAgfQorICAgICAgICAgbGVuID0gc2l6ZW9mKHRhZyk7CisgICAgICAgICBpZiAoKGVyciA9IGNjbV9tZW1vcnkoeCwga2V5LCBrbCwgbm9uY2UsIDEzLCBwbGFpbnRleHQsIHkxLCBwbGFpbnRleHQsIHkxLCBwbGFpbnRleHQsIHRhZywgJmxlbiwgQ0NNX0VOQ1JZUFQpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBDQ00naW5nOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgfQorICAgICAgICAgZnByaW50ZihvdXQsICIlM2Q6ICIsIHkxKTsKKyAgICAgICAgIGZvciAoeiA9IDA7IHogPCB5MTsgeisrKSB7CisgICAgICAgICAgICBmcHJpbnRmKG91dCwgIiUwMlgiLCBwbGFpbnRleHRbel0pOworICAgICAgICAgfQorICAgICAgICAgZnByaW50ZihvdXQsICIsICIpOworICAgICAgICAgZm9yICh6ID0gMDsgeiA8KGludClsZW47IHorKykgeworICAgICAgICAgICAgZnByaW50ZihvdXQsICIlMDJYIiwgdGFnW3pdKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGZwcmludGYob3V0LCAiXG4iKTsKKworICAgICAgICAgLyogZm9yd2FyZCB0aGUga2V5ICovCisgICAgICAgICBmb3IgKHogPSAwOyB6IDwga2w7IHorKykgeworICAgICAgICAgICAgIGtleVt6XSA9IHRhZ1t6ICUgbGVuXTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZwcmludGYob3V0LCAiXG4iKTsKKyAgIH0KKyAgIGZjbG9zZShvdXQpOworfQorCit2b2lkIGdjbV9nZW4odm9pZCkKK3sKKyAgIGludCBlcnIsIGtsLCB4LCB5MSwgejsKKyAgIEZJTEUgKm91dDsKKyAgIHVuc2lnbmVkIGNoYXIga2V5W01BWEJMT0NLU0laRV0sIHBsYWludGV4dFtNQVhCTE9DS1NJWkUqMl0sIHRhZ1tNQVhCTE9DS1NJWkVdOworICAgdW5zaWduZWQgbG9uZyBsZW47CisKKyAgIG91dCA9IGZvcGVuKCJnY21fdHYudHh0IiwgInciKTsKKyAgIGZwcmludGYob3V0LCAiR0NNIFRlc3QgVmVjdG9ycy4gIFVzZXMgdGhlIDAwMDEwMjAzLi4uTk4tMSBwYXR0ZXJuIGZvciBub25jZS9oZWFkZXIvcGxhaW50ZXh0L2tleS4gIFRoZSBvdXRwdXRzXG4iCisgICAgICAgICAgICAgICAgImFyZSBvZiB0aGUgZm9ybSBjaXBoZXJ0ZXh0LHRhZyBmb3IgYSBnaXZlbiBOTi4gIFRoZSBrZXkgZm9yIHN0ZXAgTj4xIGlzIHRoZSB0YWcgb2YgdGhlIHByZXZpb3VzXG4iCisgICAgICAgICAgICAgICAgInN0ZXAgcmVwZWF0ZWQgc3VmZmljaWVudGx5LiAgVGhlIG5vbmNlIGlzIGZpeGVkIHRocm91Z2hvdXQgYXQgMTMgYnl0ZXMgMDAwMTAyLi4uXG5cbiIpOworCisgICBmb3IgKHggPSAwOyBjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEw7IHgrKykgeworICAgICAga2wgPSBjaXBoZXJfZGVzY3JpcHRvclt4XS5ibG9ja19sZW5ndGg7CisKKyAgICAgIC8qIHNraXAgY2lwaGVycyB3aGljaCBkbyBub3QgaGF2ZSAxMjggYml0IGJsb2NrIHNpemVzICovCisgICAgICBpZiAoa2wgIT0gMTYpIGNvbnRpbnVlOworCisgICAgICBpZiAoY2lwaGVyX2Rlc2NyaXB0b3JbeF0ua2V5c2l6ZSgma2wpICE9IENSWVBUX09LKSB7CisgICAgICAgICBrbCA9IGNpcGhlcl9kZXNjcmlwdG9yW3hdLm1heF9rZXlfbGVuZ3RoOworICAgICAgfQorICAgICAgZnByaW50ZihvdXQsICJHQ00tJXMgKCVkIGJ5dGUga2V5KVxuIiwgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSwga2wpOworCisgICAgICAvKiB0aGUga2V5ICovCisgICAgICBmb3IgKHogPSAwOyB6IDwga2w7IHorKykgeworICAgICAgICAgIGtleVt6XSA9ICh6ICYgMjU1KTsKKyAgICAgIH0KKyAgICAgCisgICAgICBmb3IgKHkxID0gMDsgeTEgPD0gKGludCkoY2lwaGVyX2Rlc2NyaXB0b3JbeF0uYmxvY2tfbGVuZ3RoKjIpOyB5MSsrKXsKKyAgICAgICAgIGZvciAoeiA9IDA7IHogPCB5MTsgeisrKSB7CisgICAgICAgICAgICBwbGFpbnRleHRbel0gPSAodW5zaWduZWQgY2hhcikoeiAmIDI1NSk7CisgICAgICAgICB9CisgICAgICAgICBsZW4gPSBzaXplb2YodGFnKTsKKyAgICAgICAgIGlmICgoZXJyID0gZ2NtX21lbW9yeSh4LCBrZXksIGtsLCBwbGFpbnRleHQsIHkxLCBwbGFpbnRleHQsIHkxLCBwbGFpbnRleHQsIHkxLCBwbGFpbnRleHQsIHRhZywgJmxlbiwgR0NNX0VOQ1JZUFQpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBHQ00naW5nOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgfQorICAgICAgICAgZnByaW50ZihvdXQsICIlM2Q6ICIsIHkxKTsKKyAgICAgICAgIGZvciAoeiA9IDA7IHogPCB5MTsgeisrKSB7CisgICAgICAgICAgICBmcHJpbnRmKG91dCwgIiUwMlgiLCBwbGFpbnRleHRbel0pOworICAgICAgICAgfQorICAgICAgICAgZnByaW50ZihvdXQsICIsICIpOworICAgICAgICAgZm9yICh6ID0gMDsgeiA8KGludClsZW47IHorKykgeworICAgICAgICAgICAgZnByaW50ZihvdXQsICIlMDJYIiwgdGFnW3pdKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGZwcmludGYob3V0LCAiXG4iKTsKKworICAgICAgICAgLyogZm9yd2FyZCB0aGUga2V5ICovCisgICAgICAgICBmb3IgKHogPSAwOyB6IDwga2w7IHorKykgeworICAgICAgICAgICAgIGtleVt6XSA9IHRhZ1t6ICUgbGVuXTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZwcmludGYob3V0LCAiXG4iKTsKKyAgIH0KKyAgIGZjbG9zZShvdXQpOworfQorCiB2b2lkIGJhc2U2NF9nZW4odm9pZCkKIHsKICAgIEZJTEUgKm91dDsKQEAgLTQ3OSw2ICs2NTEsOCBAQAogICAgcHJpbnRmKCJHZW5lcmF0aW5nIFBNQUMgICB2ZWN0b3JzLi4uIik7IGZmbHVzaChzdGRvdXQpOyBwbWFjX2dlbigpOyBwcmludGYoImRvbmVcbiIpOwogICAgcHJpbnRmKCJHZW5lcmF0aW5nIEVBWCAgICB2ZWN0b3JzLi4uIik7IGZmbHVzaChzdGRvdXQpOyBlYXhfZ2VuKCk7IHByaW50ZigiZG9uZVxuIik7CiAgICBwcmludGYoIkdlbmVyYXRpbmcgT0NCICAgIHZlY3RvcnMuLi4iKTsgZmZsdXNoKHN0ZG91dCk7IG9jYl9nZW4oKTsgcHJpbnRmKCJkb25lXG4iKTsKKyAgIHByaW50ZigiR2VuZXJhdGluZyBDQ00gICAgdmVjdG9ycy4uLiIpOyBmZmx1c2goc3Rkb3V0KTsgY2NtX2dlbigpOyBwcmludGYoImRvbmVcbiIpOworICAgcHJpbnRmKCJHZW5lcmF0aW5nIEdDTSAgICB2ZWN0b3JzLi4uIik7IGZmbHVzaChzdGRvdXQpOyBnY21fZ2VuKCk7IHByaW50ZigiZG9uZVxuIik7CiAgICBwcmludGYoIkdlbmVyYXRpbmcgQkFTRTY0IHZlY3RvcnMuLi4iKTsgZmZsdXNoKHN0ZG91dCk7IGJhc2U2NF9nZW4oKTsgcHJpbnRmKCJkb25lXG4iKTsKICAgIHJldHVybiAwOwogfQpAQCAtNDkwLDMgKzY2NCw3IEBACiAgICAgICAKICAgICAKICAgIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9kZW1vcy90dl9nZW4uYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU2ICQgKi8KZGlmZiAtLWdpdCBhL2RlbW9zL3g4Nl9wcm9mLmMgYi9kZW1vcy94ODZfcHJvZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTY4NTU0Li4wMDAwMDAwCi0tLSBhL2RlbW9zL3g4Nl9wcm9mLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotI2luY2x1ZGUgPG15Y3J5cHQuaD4KLQotI2RlZmluZSBLVElNRVMgIDI1Ci0jZGVmaW5lIFRJTUVTICAgMTAwMDAwCi0KLXN0cnVjdCBsaXN0IHsKLSAgICBpbnQgaWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBzcGQxLCBzcGQyLCBhdmc7Ci19IHJlc3VsdHNbMTAwXTsKLQotaW50IG5vX3Jlc3VsdHM7Ci0KLWludCBzb3J0ZXIoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLSAgIGNvbnN0IHN0cnVjdCBsaXN0ICpBLCAqQjsKLSAgIEEgPSBhOwotICAgQiA9IGI7Ci0gICBpZiAoQS0+YXZnIDwgQi0+YXZnKSByZXR1cm4gLTE7Ci0gICBpZiAoQS0+YXZnID4gQi0+YXZnKSByZXR1cm4gMTsKLSAgIHJldHVybiAwOwotfQotCi12b2lkIHRhbGx5X3Jlc3VsdHMoaW50IHR5cGUpCi17Ci0gICBpbnQgeDsKLQotICAgLy8gcXNvcnQgdGhlIHJlc3VsdHMKLSAgIHFzb3J0KHJlc3VsdHMsIG5vX3Jlc3VsdHMsIHNpemVvZihzdHJ1Y3QgbGlzdCksICZzb3J0ZXIpOwotCi0gICBwcmludGYoIlxuIik7Ci0gICBpZiAodHlwZSA9PSAwKSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgbm9fcmVzdWx0czsgeCsrKSB7Ci0gICAgICAgICBwcmludGYoIiUtMjBzOiBTY2hlZHVsZSBhdCAlNmx1XG4iLCBjaXBoZXJfZGVzY3JpcHRvcltyZXN1bHRzW3hdLmlkXS5uYW1lLCAodW5zaWduZWQgbG9uZylyZXN1bHRzW3hdLnNwZDEpOwotICAgICAgfSAKLSAgIH0gZWxzZSBpZiAodHlwZSA9PSAxKSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgbm9fcmVzdWx0czsgeCsrKSB7Ci0gICAgICAgIHByaW50ZgotICAgICAgICAgICgiJS0yMHM6IEVuY3J5cHQgYXQgJTVsdSwgRGVjcnlwdCBhdCAlNWx1XG4iLCBjaXBoZXJfZGVzY3JpcHRvcltyZXN1bHRzW3hdLmlkXS5uYW1lLCByZXN1bHRzW3hdLnNwZDEsIHJlc3VsdHNbeF0uc3BkMik7Ci0gICAgICB9Ci0gICB9IGVsc2UgewotICAgICAgZm9yICh4ID0gMDsgeCA8IG5vX3Jlc3VsdHM7IHgrKykgewotICAgICAgICBwcmludGYKLSAgICAgICAgICAoIiUtMjBzOiBQcm9jZXNzIGF0ICU1bHVcbiIsIGhhc2hfZGVzY3JpcHRvcltyZXN1bHRzW3hdLmlkXS5uYW1lLCByZXN1bHRzW3hdLnNwZDEgLyAxMDAwKTsKLSAgICAgIH0KLSAgIH0KLX0KLQotCi0KLQotLyogUkRUU0MgZnJvbSBTY290dCBEdXBsaWNoYW4gKi8KLXN0YXRpYyB1bG9uZzY0IHJkdHNjICh2b2lkKQotICAgewotICAgI2lmIGRlZmluZWQgX19HTlVDX18KLSAgICAgICNpZmRlZiBfX2kzODZfXwotICAgICAgICAgdWxvbmc2NCBhOwotICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJyZHRzYyAiOiI9QSIgKGEpKTsKLSAgICAgICAgIHJldHVybiBhOwotICAgICAgI2Vsc2UgLyogZ2NjLUlBNjQgdmVyc2lvbiAqLwotICAgICAgICAgdW5zaWduZWQgbG9uZyByZXN1bHQ7Ci0gICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ICUwPWFyLml0YyIgOiAiPXIiKHJlc3VsdCkgOjogIm1lbW9yeSIpOwotICAgICAgICAgd2hpbGUgKF9fYnVpbHRpbl9leHBlY3QgKChpbnQpIHJlc3VsdCA9PSAtMSwgMCkpCi0gICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ICUwPWFyLml0YyIgOiAiPXIiKHJlc3VsdCkgOjogIm1lbW9yeSIpOwotICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICNlbmRpZgotCi0gICAvLyBNaWNyb3NvZnQgYW5kIEludGVsIFdpbmRvd3MgY29tcGlsZXJzCi0gICAjZWxpZiBkZWZpbmVkIF9NX0lYODYKLSAgICAgX19hc20gcmR0c2MKLSAgICNlbGlmIGRlZmluZWQgX01fQU1ENjQKLSAgICAgcmV0dXJuIF9fcmR0c2MgKCk7Ci0gICAjZWxpZiBkZWZpbmVkIF9NX0lBNjQKLSAgICAgI2lmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgotICAgICAgICNpbmNsdWRlIDxpYTY0aW50cmluLmg+Ci0gICAgICNlbmRpZgotICAgICAgcmV0dXJuIF9fZ2V0UmVnICgzMTE2KTsKLSAgICNlbHNlCi0gICAgICNlcnJvciBuZWVkIHJkdHNjIGZ1bmN0aW9uIGZvciB0aGlzIGJ1aWxkCi0gICAjZW5kaWYKLSAgIH0KLQotdWxvbmc2NCB0aW1lciwgc2tldyA9IDA7Ci1wcm5nX3N0YXRlIHBybmc7Ci0KLXZvaWQgdF9zdGFydCh2b2lkKQotewotICAgdGltZXIgPSByZHRzYygpOwotfQotCi11bG9uZzY0IHRfcmVhZCh2b2lkKQotewotICAgcmV0dXJuIHJkdHNjKCkgLSB0aW1lcjsKLX0KLQotdm9pZCBpbml0X3RpbWVyKHZvaWQpCi17Ci0gICB1bG9uZzY0IGMxLCBjMiwgdDEsIHQyLCB0MzsKLSAgIHVuc2lnbmVkIGxvbmcgeTE7Ci0KLSAgIGMxID0gYzIgPSAodWxvbmc2NCktMTsKLSAgIGZvciAoeTEgPSAwOyB5MSA8IFRJTUVTKjEwMDsgeTErKykgewotICAgICAgdF9zdGFydCgpOwotICAgICAgdDEgPSB0X3JlYWQoKTsKLSAgICAgIHQzID0gdF9yZWFkKCk7Ci0gICAgICB0MiA9IHRfcmVhZCgpIC0gdDE7Ci0KLSAgICAgIGMxID0gKGMxID4gdDEpID8gdDEgOiBjMTsKLSAgICAgIGMyID0gKGMyID4gdDIpID8gdDIgOiBjMjsKLSAgIH0KLSAgIHNrZXcgPSBjMiAtIGMxOwotICAgcHJpbnRmKCJDbG9jayBTa2V3OiAlbHVcbiIsICh1bnNpZ25lZCBsb25nKXNrZXcpOwotfQotCi12b2lkIHJlZ19hbGdzKHZvaWQpCi17Ci0jaWZkZWYgUklKTkRBRUwKLSAgcmVnaXN0ZXJfY2lwaGVyICgmYWVzX2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgQkxPV0ZJU0gKLSAgcmVnaXN0ZXJfY2lwaGVyICgmYmxvd2Zpc2hfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBYVEVBCi0gIHJlZ2lzdGVyX2NpcGhlciAoJnh0ZWFfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBSQzUKLSAgcmVnaXN0ZXJfY2lwaGVyICgmcmM1X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgUkM2Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnJjNl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFNBRkVSUAotICByZWdpc3Rlcl9jaXBoZXIgKCZzYWZlcnBfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBUV09GSVNICi0gIHJlZ2lzdGVyX2NpcGhlciAoJnR3b2Zpc2hfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBTQUZFUgotICByZWdpc3Rlcl9jaXBoZXIgKCZzYWZlcl9rNjRfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVyX3NrNjRfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVyX2sxMjhfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVyX3NrMTI4X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgUkMyCi0gIHJlZ2lzdGVyX2NpcGhlciAoJnJjMl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIERFUwotICByZWdpc3Rlcl9jaXBoZXIgKCZkZXNfZGVzYyk7Ci0gIHJlZ2lzdGVyX2NpcGhlciAoJmRlczNfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBDQVNUNQotICByZWdpc3Rlcl9jaXBoZXIgKCZjYXN0NV9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIE5PRUtFT04KLSAgcmVnaXN0ZXJfY2lwaGVyICgmbm9la2Vvbl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFNLSVBKQUNLCi0gIHJlZ2lzdGVyX2NpcGhlciAoJnNraXBqYWNrX2Rlc2MpOwotI2VuZGlmCi0KLSNpZmRlZiBUSUdFUgotICByZWdpc3Rlcl9oYXNoICgmdGlnZXJfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBNRDIKLSAgcmVnaXN0ZXJfaGFzaCAoJm1kMl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIE1ENAotICByZWdpc3Rlcl9oYXNoICgmbWQ0X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgTUQ1Ci0gIHJlZ2lzdGVyX2hhc2ggKCZtZDVfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBTSEExCi0gIHJlZ2lzdGVyX2hhc2ggKCZzaGExX2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgU0hBMjI0Ci0gIHJlZ2lzdGVyX2hhc2ggKCZzaGEyMjRfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBTSEEyNTYKLSAgcmVnaXN0ZXJfaGFzaCAoJnNoYTI1Nl9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFNIQTM4NAotICByZWdpc3Rlcl9oYXNoICgmc2hhMzg0X2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgU0hBNTEyCi0gIHJlZ2lzdGVyX2hhc2ggKCZzaGE1MTJfZGVzYyk7Ci0jZW5kaWYKLSNpZmRlZiBSSVBFTUQxMjgKLSAgcmVnaXN0ZXJfaGFzaCAoJnJtZDEyOF9kZXNjKTsKLSNlbmRpZgotI2lmZGVmIFJJUEVNRDE2MAotICByZWdpc3Rlcl9oYXNoICgmcm1kMTYwX2Rlc2MpOwotI2VuZGlmCi0jaWZkZWYgV0hJUkxQT09MCi0gIHJlZ2lzdGVyX2hhc2ggKCZ3aGlybHBvb2xfZGVzYyk7Ci0jZW5kaWYKLQotcmVnaXN0ZXJfcHJuZygmeWFycm93X2Rlc2MpOwotcm5nX21ha2VfcHJuZygxMjgsIGZpbmRfcHJuZygieWFycm93IiksICZwcm5nLCBOVUxMKTsKLX0KLQotaW50IHRpbWVfa2V5c2NoZWQodm9pZCkKLXsKLSAgdW5zaWduZWQgbG9uZyB4LCBpLCB5MTsKLSAgdWxvbmc2NCB0MSwgYzE7Ci0gIHN5bW1ldHJpY19rZXkgc2tleTsKLSAgaW50IGtsOwotICBpbnQgICAgKCpmdW5jKSAoY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQgLCBpbnQgLCBzeW1tZXRyaWNfa2V5ICopOwotICB1bnNpZ25lZCBjaGFyIGtleVtNQVhCTE9DS1NJWkVdOwotCi0gIHByaW50ZiAoIlxuXG5LZXkgU2NoZWR1bGUgVGltZSBUcmlhbHMgZm9yIHRoZSBTeW1tZXRyaWMgQ2lwaGVyczpcbihUaW1lcyBhcmUgY3ljbGVzIHBlciBrZXkpXG4iKTsKLSAgbm9fcmVzdWx0cyA9IDA7IAotIGZvciAoeCA9IDA7IGNpcGhlcl9kZXNjcmlwdG9yW3hdLm5hbWUgIT0gTlVMTDsgeCsrKSB7Ci0jZGVmaW5lIERPMShrKSAgIGZ1bmMoaywga2wsIDAsICZza2V5KTsKLQotICAgIGZ1bmMgPSBjaXBoZXJfZGVzY3JpcHRvclt4XS5zZXR1cDsKLSAgICBrbCAgID0gY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubWluX2tleV9sZW5ndGg7Ci0gICAgYzEgPSAodWxvbmc2NCktMTsKLSAgICBmb3IgKHkxID0gMDsgeTEgPCBLVElNRVM7IHkxKyspIHsKLSAgICAgICB5YXJyb3dfcmVhZChrZXksIGtsLCAmcHJuZyk7Ci0gICAgICAgdF9zdGFydCgpOwotICAgICAgIERPMShrZXkpOwotICAgICAgIHQxID0gdF9yZWFkKCk7Ci0gICAgICAgYzEgPSAodDEgPiBjMSkgPyBjMSA6IHQxOwotICAgIH0KLSAgICB0MSA9IGMxIC0gc2tldzsKLSAgICByZXN1bHRzW25vX3Jlc3VsdHNdLnNwZDEgPSByZXN1bHRzW25vX3Jlc3VsdHNdLmF2ZyA9IHQxOwotICAgIHJlc3VsdHNbbm9fcmVzdWx0cysrXS5pZCA9IHg7Ci0gICAgcHJpbnRmKCIuIik7IGZmbHVzaChzdGRvdXQpOwotCi0jdW5kZWYgRE8xCi0gICB9Ci0gICB0YWxseV9yZXN1bHRzKDApOwotCi0gICByZXR1cm4gMDsKLX0KLQotaW50IHRpbWVfY2lwaGVyKHZvaWQpCi17Ci0gIHVuc2lnbmVkIGxvbmcgeCwgeTE7Ci0gIHVsb25nNjQgIHQxLCB0MiwgYzEsIGMyLCBhMSwgYTI7Ci0gIHN5bW1ldHJpY19rZXkgc2tleTsKLSAgdm9pZCAgICAoKmZ1bmMpIChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgc3ltbWV0cmljX2tleSAqKTsKLSAgdW5zaWduZWQgY2hhciBrZXlbTUFYQkxPQ0tTSVpFXSwgcHRbTUFYQkxPQ0tTSVpFXTsKLQotCi0gIHByaW50ZiAoIlxuXG5FQ0IgVGltZSBUcmlhbHMgZm9yIHRoZSBTeW1tZXRyaWMgQ2lwaGVyczpcbiIpOwotICBub19yZXN1bHRzID0gMDsKLSAgZm9yICh4ID0gMDsgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSAhPSBOVUxMOyB4KyspIHsKLSAgICBjaXBoZXJfZGVzY3JpcHRvclt4XS5zZXR1cCAoa2V5LCBjaXBoZXJfZGVzY3JpcHRvclt4XS5taW5fa2V5X2xlbmd0aCwgMCwKLSAgICAgICAgICAgICAgICAmc2tleSk7Ci0KLSNkZWZpbmUgRE8xICAgZnVuYyhwdCxwdCwmc2tleSk7Ci0jZGVmaW5lIERPMiAgIERPMSBETzEKLQotICAgIGZ1bmMgPSBjaXBoZXJfZGVzY3JpcHRvclt4XS5lY2JfZW5jcnlwdDsKLSAgICBjMSA9IGMyID0gKHVsb25nNjQpLTE7Ci0gICAgZm9yICh5MSA9IDA7IHkxIDwgVElNRVM7IHkxKyspIHsKLSAgICAgICAgdF9zdGFydCgpOwotICAgICAgICBETzE7Ci0gICAgICAgIHQxID0gdF9yZWFkKCk7Ci0gICAgICAgIERPMjsKLSAgICAgICAgdDIgPSB0X3JlYWQoKTsKLSAgICAgICAgdDIgLT0gdDE7Ci0KLSAgICAgICAgYzEgPSAodDEgPiBjMSA/IGMxIDogdDEpOwotICAgICAgICBjMiA9ICh0MiA+IGMyID8gYzIgOiB0Mik7Ci0gICAgfQotICAgIGExID0gYzIgLSBjMSAtIHNrZXc7Ci0KLQotICAgIGZ1bmMgPSBjaXBoZXJfZGVzY3JpcHRvclt4XS5lY2JfZGVjcnlwdDsKLSAgICBjMSA9IGMyID0gKHVsb25nNjQpLTE7Ci0gICAgZm9yICh5MSA9IDA7IHkxIDwgVElNRVM7IHkxKyspIHsKLSAgICAgICAgdF9zdGFydCgpOwotICAgICAgICBETzE7Ci0gICAgICAgIHQxID0gdF9yZWFkKCk7Ci0gICAgICAgIERPMjsKLSAgICAgICAgdDIgPSB0X3JlYWQoKTsKLSAgICAgICAgdDIgLT0gdDE7Ci0KLSAgICAgICAgYzEgPSAodDEgPiBjMSA/IGMxIDogdDEpOwotICAgICAgICBjMiA9ICh0MiA+IGMyID8gYzIgOiB0Mik7Ci0gICAgfQotICAgIGEyID0gYzIgLSBjMSAtIHNrZXc7Ci0gICAgCi0gICAgcmVzdWx0c1tub19yZXN1bHRzXS5pZCA9IHg7Ci0gICAgcmVzdWx0c1tub19yZXN1bHRzXS5zcGQxID0gYTEvY2lwaGVyX2Rlc2NyaXB0b3JbeF0uYmxvY2tfbGVuZ3RoOwotICAgIHJlc3VsdHNbbm9fcmVzdWx0c10uc3BkMiA9IGEyL2NpcGhlcl9kZXNjcmlwdG9yW3hdLmJsb2NrX2xlbmd0aDs7Ci0gICAgcmVzdWx0c1tub19yZXN1bHRzXS5hdmcgPSAocmVzdWx0c1tub19yZXN1bHRzXS5zcGQxICsgcmVzdWx0c1tub19yZXN1bHRzXS5zcGQyKzEpLzI7Ci0gICAgKytub19yZXN1bHRzOwotICAgIHByaW50ZigiLiIpOyBmZmx1c2goc3Rkb3V0KTsKLSAgICAKLSN1bmRlZiBETzIKLSN1bmRlZiBETzEKLSAgIH0KLSAgIHRhbGx5X3Jlc3VsdHMoMSk7Ci0KLSAgIHJldHVybiAwOwotfQotCi1pbnQgdGltZV9oYXNoKHZvaWQpCi17Ci0gIHVuc2lnbmVkIGxvbmcgeCwgeTEsIGxlbjsKLSAgdWxvbmc2NCB0MSwgdDIsIGMxLCBjMjsKLSAgaGFzaF9zdGF0ZSBtZDsKLSAgaW50ICAgICgqZnVuYykoaGFzaF9zdGF0ZSAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcpOwotICB1bnNpZ25lZCBjaGFyIHB0W01BWEJMT0NLU0laRV07Ci0KLQotICBwcmludGYgKCJcblxuSEFTSCBUaW1lIFRyaWFscyBmb3I6XG4iKTsKLSAgbm9fcmVzdWx0cyA9IDA7Ci0gIGZvciAoeCA9IDA7IGhhc2hfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEw7IHgrKykgewotICAgIGhhc2hfZGVzY3JpcHRvclt4XS5pbml0KCZtZCk7Ci0KLSNkZWZpbmUgRE8xICAgZnVuYygmbWQscHQsbGVuKTsKLSNkZWZpbmUgRE8yICAgRE8xIERPMQotCi0gICAgZnVuYyA9IGhhc2hfZGVzY3JpcHRvclt4XS5wcm9jZXNzOwotICAgIGxlbiAgPSBoYXNoX2Rlc2NyaXB0b3JbeF0uYmxvY2tzaXplOwotCi0gICAgYzEgPSBjMiA9ICh1bG9uZzY0KS0xOwotICAgIGZvciAoeTEgPSAwOyB5MSA8IFRJTUVTOyB5MSsrKSB7Ci0gICAgICAgdF9zdGFydCgpOwotICAgICAgIERPMTsKLSAgICAgICB0MSA9IHRfcmVhZCgpOwotICAgICAgIERPMjsKLSAgICAgICB0MiA9IHRfcmVhZCgpIC0gdDE7Ci0gICAgICAgYzEgPSAodDEgPiBjMSkgPyBjMSA6IHQxOwotICAgICAgIGMyID0gKHQyID4gYzIpID8gYzIgOiB0MjsKLSAgICB9Ci0gICAgdDEgPSBjMiAtIGMxIC0gc2tldzsKLSAgICB0MSA9ICgodDEgKiBDT05TVDY0KDEwMDApKSkgLyAoKHVsb25nNjQpaGFzaF9kZXNjcmlwdG9yW3hdLmJsb2Nrc2l6ZSk7Ci0gICAgcmVzdWx0c1tub19yZXN1bHRzXS5pZCA9IHg7Ci0gICAgcmVzdWx0c1tub19yZXN1bHRzXS5zcGQxID0gcmVzdWx0c1tub19yZXN1bHRzXS5hdmcgPSB0MTsKLSAgICArK25vX3Jlc3VsdHM7Ci0gICAgcHJpbnRmKCIuIik7IGZmbHVzaChzdGRvdXQpOwotI3VuZGVmIERPMgotI3VuZGVmIERPMQotICAgfQotICAgdGFsbHlfcmVzdWx0cygyKTsKLQotICAgcmV0dXJuIDA7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gIHJlZ19hbGdzKCk7Ci0KLSAgcHJpbnRmKCJUaW1pbmdzIGZvciBjaXBoZXJzIGFuZCBoYXNoZXMuICBUaW1lcyBhcmUgbGlzdGVkIGFzIGN5Y2xlcyBwZXIgYnl0ZSBwcm9jZXNzZWQuXG5cbiIpOwotCi0vLyAgaW5pdF90aW1lcigpOwotICB0aW1lX2NpcGhlcigpOwotICB0aW1lX2tleXNjaGVkKCk7Ci0gIHRpbWVfaGFzaCgpOwotCi0gIHJldHVybiBFWElUX1NVQ0NFU1M7Ci19Ci0KZGlmZiAtLWdpdCBhL2RvYy9mb290ZXIuaHRtbCBiL2RvYy9mb290ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTg5NWFjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2Zvb3Rlci5odG1sCkBAIC0wLDAgKzEsMTAgQEAKKzxociB3aWR0aD0iODAlIj4KK0NvZGUgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5saWJ0b21jcnlwdC5vcmcvIj5Ub208L2E+PGJyPgorRG9jcyB1c2luZyA8aW1nIHNyYz0iZG94eWdlbi5wbmciIGFsdD0iZG94eWdlbiIgYWxpZ249Im1pZGRsZSIgYm9yZGVyPTA+Cis8YSBocmVmPSJodHRwOi8vamxjb29rZS5jYS90b20vaGlkZGVuX2ltYWdlLnBuZyI+CisKKzwhLS0KKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L2RvYy9mb290ZXIuaHRtbCx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA3IDEwOjA5OjIwICQgKi8KKy0tPgpkaWZmIC0tZ2l0IGEvZG9jL2hlYWRlci5odG1sIGIvZG9jL2hlYWRlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMTQ3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaGVhZGVyLmh0bWwKQEAgLTAsMCArMSwxMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PWlzby04ODU5LTEiPgorPHRpdGxlPkxpYlRvbUNyeXB0OiBNYWluIFBhZ2U8L3RpdGxlPgorPGxpbmsgaHJlZj0iZG94eWdlbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPC9oZWFkPjxib2R5PgorPCEtLSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAxLjMuOCAtLT4KKworPCEtLQorLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvZG9jL2hlYWRlci5odG1sLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDcgMTA6MDk6MjAgJCAqLworLS0+CmRpZmYgLS1naXQgYS9kc2FfZXhwb3J0LmMgYi9kc2FfZXhwb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NWIxY2YuLjAwMDAwMDAKLS0tIGEvZHNhX2V4cG9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgTURTQQotCi1pbnQgZHNhX2V4cG9ydCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgaW50IHR5cGUsIGRzYV9rZXkgKmtleSkKLXsKLSAgIHVuc2lnbmVkIGxvbmcgeSwgejsKLSAgIGludCBlcnI7Ci0KLSAgIF9BUkdDSEsob3V0ICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKLQotICAgLyogY2FuIHdlIHN0b3JlIHRoZSBzdGF0aWMgaGVhZGVyPyAgKi8KLSAgIGlmICgqb3V0bGVuIDwgKFBBQ0tFVF9TSVpFICsgMSArIDIpKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgfQotICAgCi0gICBpZiAodHlwZSA9PSBQS19QUklWQVRFICYmIGtleS0+dHlwZSAhPSBQS19QUklWQVRFKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfUEtfVFlQRV9NSVNNQVRDSDsKLSAgIH0KLQotICAgaWYgKHR5cGUgIT0gUEtfUFVCTElDICYmIHR5cGUgIT0gUEtfUFJJVkFURSkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOwotICAgfQotCi0gICAvKiBzdG9yZSBoZWFkZXIgKi8KLSAgIHBhY2tldF9zdG9yZV9oZWFkZXIob3V0LCBQQUNLRVRfU0VDVF9EU0EsIFBBQ0tFVF9TVUJfS0VZKTsKLSAgIHkgPSBQQUNLRVRfU0laRTsKLQotICAgLyogc3RvcmUgZywgcCwgcSwgcW9yZCAqLwotICAgb3V0W3krK10gPSB0eXBlOwotICAgb3V0W3krK10gPSAoa2V5LT5xb3JkPj44KSYyNTU7Ci0gICBvdXRbeSsrXSA9IGtleS0+cW9yZCAmIDI1NTsKLQotICAgT1VUUFVUX0JJR05VTSgma2V5LT5nLG91dCx5LHopOwotICAgT1VUUFVUX0JJR05VTSgma2V5LT5wLG91dCx5LHopOwotICAgT1VUUFVUX0JJR05VTSgma2V5LT5xLG91dCx5LHopOwotCi0gICAvKiBwdWJsaWMgZXhwb25lbnQgKi8KLSAgIE9VVFBVVF9CSUdOVU0oJmtleS0+eSxvdXQseSx6KTsKLSAgIAotICAgaWYgKHR5cGUgPT0gUEtfUFJJVkFURSkgewotICAgICAgT1VUUFVUX0JJR05VTSgma2V5LT54LG91dCx5LHopOwotICAgfQotCi0gICAqb3V0bGVuID0geTsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RzYV9mcmVlLmMgYi9kc2FfZnJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDUxOTUxLi4wMDAwMDAwCi0tLSBhL2RzYV9mcmVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBNRFNBCi0KLXZvaWQgZHNhX2ZyZWUoZHNhX2tleSAqa2V5KQotewotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBtcF9jbGVhcl9tdWx0aSgma2V5LT5nLCAma2V5LT5xLCAma2V5LT5wLCAma2V5LT54LCAma2V5LT55LCBOVUxMKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kc2FfaW1wb3J0LmMgYi9kc2FfaW1wb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOTg3NmQuLjAwMDAwMDAKLS0tIGEvZHNhX2ltcG9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgTURTQQotCi1pbnQgZHNhX2ltcG9ydChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgZHNhX2tleSAqa2V5KQotewotICAgdW5zaWduZWQgbG9uZyB4LCB5OwotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhpbiAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLQotICAgLyogY2hlY2sgbGVuZ3RoICovCi0gICBpZiAoKDErMitQQUNLRVRfU0laRSkgPiBpbmxlbikgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgfQotCi0gICAvKiBjaGVjayB0eXBlICovCi0gICBpZiAoKGVyciA9IHBhY2tldF92YWxpZF9oZWFkZXIoKHVuc2lnbmVkIGNoYXIgKilpbiwgUEFDS0VUX1NFQ1RfRFNBLCBQQUNLRVRfU1VCX0tFWSkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotICAgeSA9IFBBQ0tFVF9TSVpFOwotCi0gICAvKiBpbml0IGtleSAqLwotICAgaWYgKG1wX2luaXRfbXVsdGkoJmtleS0+cCwgJmtleS0+ZywgJmtleS0+cSwgJmtleS0+eCwgJmtleS0+eSwgTlVMTCkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIENSWVBUX01FTTsKLSAgIH0KLQotICAgLyogcmVhZCB0eXBlL3FvcmQgKi8KLSAgIGtleS0+dHlwZSA9IGluW3krK107Ci0gICBrZXktPnFvcmQgPSAoKHVuc2lnbmVkKWluW3ldPDw4KXwoKHVuc2lnbmVkKWluW3krMV0pOwotICAgeSArPSAyOwotCi0gICAvKiBpbnB1dCBwdWJsaWNzICovCi0gICBJTlBVVF9CSUdOVU0oJmtleS0+Zyxpbix4LHksIGlubGVuKTsKLSAgIElOUFVUX0JJR05VTSgma2V5LT5wLGluLHgseSwgaW5sZW4pOwotICAgSU5QVVRfQklHTlVNKCZrZXktPnEsaW4seCx5LCBpbmxlbik7Ci0gICBJTlBVVF9CSUdOVU0oJmtleS0+eSxpbix4LHksIGlubGVuKTsKLSAgIGlmIChrZXktPnR5cGUgPT0gUEtfUFJJVkFURSkgewotICAgICAgSU5QVVRfQklHTlVNKCZrZXktPngsaW4seCx5LCBpbmxlbik7Ci0gICB9Ci0KLSAgIHJldHVybiBDUllQVF9PSzsKLWVycm9yOiAKLSAgIG1wX2NsZWFyX211bHRpKCZrZXktPnAsICZrZXktPmcsICZrZXktPnEsICZrZXktPngsICZrZXktPnksIE5VTEwpOwotICAgcmV0dXJuIGVycjsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kc2Ffc2lnbl9oYXNoLmMgYi9kc2Ffc2lnbl9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDQzNzEuLjAwMDAwMDAKLS0tIGEvZHNhX3NpZ25faGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE1EU0EKLQotaW50IGRzYV9zaWduX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGRzYV9rZXkgKmtleSkKLXsKLSAgIG1wX2ludCBrLCBraW52LCB0bXAsIHIsIHM7Ci0gICB1bnNpZ25lZCBjaGFyIGJ1Zls1MTJdOwotICAgaW50IGVyciwgeTsKLSAgIHVuc2lnbmVkIGxvbmcgbGVuOwotCi0KLSAgIF9BUkdDSEsoaW4gICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAgICE9IE5VTEwpOwotCi0gICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQod3BybmcpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIGlmIChrZXktPnR5cGUgIT0gUEtfUFJJVkFURSkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX05PVF9QUklWQVRFOwotICAgfQotCi0gICAvKiBjaGVjayBncm91cCBvcmRlciBzaXplICAqLwotICAgaWYgKGtleS0+cW9yZCA+PSAoaW50KXNpemVvZihidWYpKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9Ci0KLSAgIC8qIEluaXQgb3VyIHRlbXBzICovCi0gICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJmssICZraW52LCAmciwgJnMsICZ0bXAsIE5VTEwpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotCi1yZXRyeToKLQotICAgZG8gewotICAgICAgLyogZ2VuIHJhbmRvbSBrICovCi0gICAgICBpZiAocHJuZ19kZXNjcmlwdG9yW3dwcm5nXS5yZWFkKGJ1Ziwga2V5LT5xb3JkLCBwcm5nKSAhPSAodW5zaWduZWQgbG9uZylrZXktPnFvcmQpIHsKLSAgICAgICAgIGVyciA9IENSWVBUX0VSUk9SX1JFQURQUk5HOwotICAgICAgICAgZ290byBkb25lOwotICAgICAgfQotCi0gICAgICAvKiByZWFkIGsgKi8KLSAgICAgIGlmICgoZXJyID0gbXBfcmVhZF91bnNpZ25lZF9iaW4oJmssIGJ1Ziwga2V5LT5xb3JkKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0KLSAgICAgIC8qIGsgPiAxID8gKi8KLSAgICAgIGlmIChtcF9jbXBfZCgmaywgMSkgIT0gTVBfR1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIHJldHJ5OyB9Ci0KLSAgICAgIC8qIHRlc3QgZ2NkICovCi0gICAgICBpZiAoKGVyciA9IG1wX2djZCgmaywgJmtleS0+cSwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgfSB3aGlsZSAobXBfY21wX2QoJnRtcCwgMSkgIT0gTVBfRVEpOwotCi0gICAvKiBub3cgZmluZCAxL2sgbW9kIHEgKi8KLSAgIGlmICgoZXJyID0gbXBfaW52bW9kKCZrLCAma2V5LT5xLCAma2ludikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0KLSAgIC8qIG5vdyBmaW5kIHIgPSBnXmsgbW9kIHAgbW9kIHEgKi8KLSAgIGlmICgoZXJyID0gbXBfZXhwdG1vZCgma2V5LT5nLCAmaywgJmtleS0+cCwgJnIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICBpZiAoKGVyciA9IG1wX21vZCgmciwgJmtleS0+cSwgJnIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotCi0gICBpZiAobXBfaXN6ZXJvKCZyKSA9PSBNUF9ZRVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byByZXRyeTsgfQotCi0gICAvKiBub3cgZmluZCBzID0gKGluICsgeHIpL2sgbW9kIHEgKi8KLSAgIGlmICgoZXJyID0gbXBfcmVhZF91bnNpZ25lZF9iaW4oJnRtcCwgKHVuc2lnbmVkIGNoYXIgKilpbiwgaW5sZW4pKSAhPSBNUF9PS0FZKSAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICBpZiAoKGVyciA9IG1wX211bCgma2V5LT54LCAmciwgJnMpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgaWYgKChlcnIgPSBtcF9hZGQoJnMsICZ0bXAsICZzKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIGlmICgoZXJyID0gbXBfbXVsbW9kKCZzLCAma2ludiwgJmtleS0+cSwgJnMpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0KLSAgIGlmIChtcF9pc3plcm8oJnMpID09IE1QX1lFUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIHJldHJ5OyB9Ci0KLSAgIC8qIG5vdyBzdG9yZSBlbSBib3RoICovCi0gICAKLSAgIC8qIGZpcnN0IGNoZWNrIHRoYXQgd2UgaGF2ZSBlbm91Z2ggcm9vbSAqLwotICAgaWYgKCpvdXRsZW4gPCAodW5zaWduZWQgbG9uZykoUEFDS0VUX1NJWkUgKyA0ICsgbXBfdW5zaWduZWRfYmluX3NpemUoJnMpICsgbXBfdW5zaWduZWRfYmluX3NpemUoJnIpKSkgewotICAgICAgZXJyID0gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgICAgZ290byBkb25lOwotICAgfQotCi0gICAvKiBwYWNrZXQgaGVhZGVyICovCi0gICBwYWNrZXRfc3RvcmVfaGVhZGVyKG91dCwgUEFDS0VUX1NFQ1RfRFNBLCBQQUNLRVRfU1VCX1NJR05FRCk7Ci0gICB5ID0gUEFDS0VUX1NJWkU7Ci0KLSAgIC8qIHN0b3JlIGxlbmd0aCBvZiByICovCi0gICBsZW4gPSBtcF91bnNpZ25lZF9iaW5fc2l6ZSgmcik7Ci0gICBvdXRbeSsrXSA9IChsZW4+PjgpJjI1NTsKLSAgIG91dFt5KytdID0gbGVuJjI1NTsKLSAgIAotICAgLyogc3RvcmUgciAqLwotICAgaWYgKChlcnIgPSBtcF90b191bnNpZ25lZF9iaW4oJnIsIG91dCt5KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIHkgKz0gbGVuOwotCi0gICAvKiBzdG9yZSBsZW5ndGggb2YgcyAqLwotICAgbGVuID0gbXBfdW5zaWduZWRfYmluX3NpemUoJnMpOwotICAgb3V0W3krK10gPSAobGVuPj44KSYyNTU7Ci0gICBvdXRbeSsrXSA9IGxlbiYyNTU7Ci0gICAKLSAgIC8qIHN0b3JlIHMgKi8KLSAgIGlmICgoZXJyID0gbXBfdG9fdW5zaWduZWRfYmluKCZzLCBvdXQreSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICB5ICs9IGxlbjsKLQotICAgLyogcmVzZXQgc2l6ZSAqLwotICAgKm91dGxlbiA9IHk7Ci0KLSAgIGVyciA9IENSWVBUX09LOwotICAgZ290byBkb25lOwotCi1lcnJvciA6IGVyciA9IG1waV90b19sdGNfZXJyb3IoZXJyKTsKLWRvbmUgIDogbXBfY2xlYXJfbXVsdGkoJmssICZraW52LCAmciwgJnMsICZ0bXAsIE5VTEwpOwotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotI2VuZGlmCi0gICByZXR1cm4gZXJyOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RzYV92ZXJpZnlfaGFzaC5jIGIvZHNhX3ZlcmlmeV9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWNkN2MuLjAwMDAwMDAKLS0tIGEvZHNhX3ZlcmlmeV9oYXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBNRFNBCi0KLWludCBkc2FfdmVyaWZ5X2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLCB1bnNpZ25lZCBsb25nIHNpZ2xlbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaCwgdW5zaWduZWQgbG9uZyBpbmxlbiwgCi0gICAgICAgICAgICAgICAgICAgIGludCAqc3RhdCwgZHNhX2tleSAqa2V5KQotewotICAgbXBfaW50IHIsIHMsIHcsIHYsIHUxLCB1MjsKLSAgIHVuc2lnbmVkIGxvbmcgeCwgeTsKLSAgIGludCBlcnI7Ci0KLSAgIF9BUkdDSEsoc2lnICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoaGFzaCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoc3RhdCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAhPSBOVUxMKTsKLQotICAgLyogZGVmYXVsdCB0byBpbnZhbGlkIHNpZ25hdHVyZSAqLwotICAgKnN0YXQgPSAwOwotCi0gICBpZiAoc2lnbGVuIDwgUEFDS0VUX1NJWkUrMisyKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7Ci0gICB9IAotCi0gICAvKiBpcyB0aGUgbWVzc2FnZSBmb3JtYXQgY29ycmVjdD8gKi8KLSAgIGlmICgoZXJyID0gcGFja2V0X3ZhbGlkX2hlYWRlcigodW5zaWduZWQgY2hhciAqKXNpZywgUEFDS0VUX1NFQ1RfRFNBLCBQQUNLRVRfU1VCX1NJR05FRCkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBza2lwIG92ZXIgaGVhZGVyICovCi0gICB5ID0gUEFDS0VUX1NJWkU7Ci0KLSAgIC8qIGluaXQgb3VyIHZhcmlhYmxlcyAqLwotICAgaWYgKChlcnIgPSBtcF9pbml0X211bHRpKCZyLCAmcywgJncsICZ2LCAmdTEsICZ1MiwgTlVMTCkpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7Ci0gICB9Ci0KLSAgIC8qIHJlYWQgaW4gciBmb2xsb3dlZCBieSBzICovCi0gICB4ID0gKCh1bnNpZ25lZClzaWdbeV08PDgpfCgodW5zaWduZWQpc2lnW3krMV0pOwotICAgeSArPSAyOwotICAgaWYgKHkgKyB4ID4gc2lnbGVuKSB7IAotICAgICAgZXJyID0gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICB9Ci0gICBpZiAoKGVyciA9IG1wX3JlYWRfdW5zaWduZWRfYmluKCZyLCAodW5zaWduZWQgY2hhciAqKXNpZyt5LCB4KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICB5ICs9IHg7Ci0KLSAgIC8qIGxvYWQgcyAqLwotICAgeCA9ICgodW5zaWduZWQpc2lnW3ldPDw4KXwoKHVuc2lnbmVkKXNpZ1t5KzFdKTsKLSAgIHkgKz0gMjsKLSAgIGlmICh5ICsgeCA+IHNpZ2xlbikgeyAKLSAgICAgIGVyciA9IENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgICAgZ290byBkb25lOwotICAgfQotICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbigmcywgKHVuc2lnbmVkIGNoYXIgKilzaWcreSwgeCkpICE9IE1QX09LQVkpICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotCi0gICAvKiB3ID0gMS9zIG1vZCBxICovCi0gICBpZiAoKGVyciA9IG1wX2ludm1vZCgmcywgJmtleS0+cSwgJncpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0KLSAgIC8qIHUxID0gbSAqIHcgbW9kIHEgKi8KLSAgIGlmICgoZXJyID0gbXBfcmVhZF91bnNpZ25lZF9iaW4oJnUxLCAodW5zaWduZWQgY2hhciAqKWhhc2gsIGlubGVuKSkgIT0gTVBfT0tBWSkgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIGlmICgoZXJyID0gbXBfbXVsbW9kKCZ1MSwgJncsICZrZXktPnEsICZ1MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLQotICAgLyogdTIgPSByKncgbW9kIHEgKi8KLSAgIGlmICgoZXJyID0gbXBfbXVsbW9kKCZyLCAmdywgJmtleS0+cSwgJnUyKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gCi0KLSAgIC8qIHYgPSBnXnUxICogeV51MiBtb2QgcCBtb2QgcSAqLwotICAgaWYgKChlcnIgPSBtcF9leHB0bW9kKCZrZXktPmcsICZ1MSwgJmtleS0+cCwgJnUxKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgaWYgKChlcnIgPSBtcF9leHB0bW9kKCZrZXktPnksICZ1MiwgJmtleS0+cCwgJnUyKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgaWYgKChlcnIgPSBtcF9tdWxtb2QoJnUxLCAmdTIsICZrZXktPnAsICZ2KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgaWYgKChlcnIgPSBtcF9tb2QoJnYsICZrZXktPnEsICZ2KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotCi0gICAvKiBpZiByID0gdiB0aGVuIHdlJ3JlIHNldCAqLwotICAgaWYgKG1wX2NtcCgmciwgJnYpID09IE1QX0VRKSB7Ci0gICAgICAqc3RhdCA9IDE7Ci0gICB9Ci0KLSAgIGVyciA9IENSWVBUX09LOwotICAgZ290byBkb25lOwotCi1lcnJvciA6IGVyciA9IG1waV90b19sdGNfZXJyb3IoZXJyKTsKLWRvbmUgIDogbXBfY2xlYXJfbXVsdGkoJnIsICZzLCAmdywgJnYsICZ1MSwgJnUyLCBOVUxMKTsKLSAgIHJldHVybiBlcnI7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9lYXhfYWRkaGVhZGVyLmMgYi9lYXhfYWRkaGVhZGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZGZkZDAuLjAwMDAwMDAKLS0tIGEvZWF4X2FkZGhlYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLS8qIEVBWCBJbXBsZW1lbnRhdGlvbiBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBFQVhfTU9ERQotCi0vKiBhZGQgaGVhZGVyIChtZXRhZGF0YSkgdG8gdGhlIHN0cmVhbSAqLwotaW50IGVheF9hZGRoZWFkZXIoZWF4X3N0YXRlICplYXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCi17Ci0gICBfQVJHQ0hLKGVheCAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoaGVhZGVyICE9IE5VTEwpOwotICAgcmV0dXJuIG9tYWNfcHJvY2VzcygmZWF4LT5oZWFkZXJvbWFjLCBoZWFkZXIsIGxlbmd0aCk7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZWF4X2RlY3J5cHQuYyBiL2VheF9kZWNyeXB0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlN2MyOTAuLjAwMDAwMDAKLS0tIGEvZWF4X2RlY3J5cHQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotCi0vKiBFQVggSW1wbGVtZW50YXRpb24gYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgRUFYX01PREUKLQotaW50IGVheF9kZWNyeXB0KGVheF9zdGF0ZSAqZWF4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQotewotICAgaW50IGVycjsKLSAgIAotICAgX0FSR0NISyhlYXggIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHB0ICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY3QgICE9IE5VTEwpOwotCi0gICAvKiBvbWFjIGNpcGhlcnRleHQgKi8KLSAgIGlmICgoZXJyID0gb21hY19wcm9jZXNzKCZlYXgtPmN0b21hYywgY3QsIGxlbmd0aCkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBkZWNyeXB0ICAqLwotICAgcmV0dXJuIGN0cl9kZWNyeXB0KGN0LCBwdCwgbGVuZ3RoLCAmZWF4LT5jdHIpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2VheF9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkuYyBiL2VheF9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2OGVmZS4uMDAwMDAwMAotLS0gYS9lYXhfZGVjcnlwdF92ZXJpZnlfbWVtb3J5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogRUFYIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIEVBWF9NT0RFCi0KLWludCBlYXhfZGVjcnlwdF92ZXJpZnlfbWVtb3J5KGludCBjaXBoZXIsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIHVuc2lnbmVkIGxvbmcgbm9uY2VsZW4sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGVhZGVyLCB1bnNpZ25lZCBsb25nIGhlYWRlcmxlbiwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgICAgIHVuc2lnbmVkIGxvbmcgY3RsZW4sCi0gICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsCi0gICAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnLCAgICB1bnNpZ25lZCBsb25nIHRhZ2xlbiwKLSAgICAgICAgICBpbnQgICAgICAgICAgICpyZXMpCi17Ci0gICBpbnQgZXJyOwotICAgZWF4X3N0YXRlIGVheDsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmW01BWEJMT0NLU0laRV07Ci0gICB1bnNpZ25lZCBsb25nIGJ1ZmxlbjsKLQotICAgX0FSR0NISyhyZXMgIT0gTlVMTCk7Ci0KLSAgIC8qIGRlZmF1bHQgdG8gemVybyAqLwotICAgKnJlcyA9IDA7Ci0KLSAgIGlmICgoZXJyID0gZWF4X2luaXQoJmVheCwgY2lwaGVyLCBrZXksIGtleWxlbiwgbm9uY2UsIG5vbmNlbGVuLCBoZWFkZXIsIGhlYWRlcmxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICBpZiAoKGVyciA9IGVheF9kZWNyeXB0KCZlYXgsIGN0LCBwdCwgY3RsZW4pKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAKLSAgIGJ1ZmxlbiA9IE1JTihzaXplb2YoYnVmKSwgdGFnbGVuKTsKLSAgIGlmICgoZXJyID0gZWF4X2RvbmUoJmVheCwgYnVmLCAmYnVmbGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIGNvbXBhcmUgdGFncyAqLwotICAgaWYgKGJ1ZmxlbiA+PSB0YWdsZW4gJiYgbWVtY21wKGJ1ZiwgdGFnLCB0YWdsZW4pID09IDApIHsKLSAgICAgICpyZXMgPSAxOwotICAgfQotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0jZW5kaWYKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9lYXhfZG9uZS5jIGIvZWF4X2RvbmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjMzcwNi4uMDAwMDAwMAotLS0gYS9lYXhfZG9uZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLS8qIEVBWCBJbXBsZW1lbnRhdGlvbiBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBFQVhfTU9ERQotCi1pbnQgZWF4X2RvbmUoZWF4X3N0YXRlICplYXgsIHVuc2lnbmVkIGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyAqdGFnbGVuKQotewotICAgaW50ICAgICAgICAgICBlcnI7Ci0gICB1bnNpZ25lZCBjaGFyIGhlYWRlcm1hY1tNQVhCTE9DS1NJWkVdLCBjdG1hY1tNQVhCTE9DS1NJWkVdOwotICAgdW5zaWduZWQgbG9uZyB4LCBsZW47Ci0KLSAgIF9BUkdDSEsoZWF4ICAgICE9IE5VTEwpOwotICAgX0FSR0NISyh0YWcgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHRhZ2xlbiAhPSBOVUxMKTsKLQotICAgLyogZmluaXNoIGN0b21hYyAqLwotICAgbGVuID0gc2l6ZW9mKGN0bWFjKTsKLSAgIGlmICgoZXJyID0gb21hY19kb25lKCZlYXgtPmN0b21hYywgY3RtYWMsICZsZW4pKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogZmluaXNoIGhlYWRlcm9tYWMgKi8KLQotICAgLyogbm90ZSB3ZSBzcGVjaWZpY2FsbHkgZG9uJ3QgcmVzZXQgbGVuIHNvIHRoZSB0d28gbGVucyBhcmUgbWluaW1hbCAqLwotCi0gICBpZiAoKGVyciA9IG9tYWNfZG9uZSgmZWF4LT5oZWFkZXJvbWFjLCBoZWFkZXJtYWMsICZsZW4pKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogY29tcHV0ZSBOIHhvciBIIHhvciBDICovCi0gICBmb3IgKHggPSAwOyB4IDwgbGVuICYmIHggPCAqdGFnbGVuOyB4KyspIHsKLSAgICAgICB0YWdbeF0gPSBlYXgtPk5beF0gXiBoZWFkZXJtYWNbeF0gXiBjdG1hY1t4XTsKLSAgIH0KLSAgICp0YWdsZW4gPSB4OwotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oY3RtYWMsIHNpemVvZihjdG1hYykpOwotICAgemVyb21lbShoZWFkZXJtYWMsIHNpemVvZihoZWFkZXJtYWMpKTsKLSAgIHplcm9tZW0oZWF4LCBzaXplb2YoKmVheCkpOwotI2VuZGlmCi0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9lYXhfZW5jcnlwdC5jIGIvZWF4X2VuY3J5cHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0OTMwZS4uMDAwMDAwMAotLS0gYS9lYXhfZW5jcnlwdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLS8qIEVBWCBJbXBsZW1lbnRhdGlvbiBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBFQVhfTU9ERQotCi1pbnQgZWF4X2VuY3J5cHQoZWF4X3N0YXRlICplYXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCi17Ci0gICBpbnQgZXJyOwotICAgCi0gICBfQVJHQ0hLKGVheCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsocHQgICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAgIT0gTlVMTCk7Ci0KLSAgIC8qIGVuY3J5cHQgKi8KLSAgIGlmICgoZXJyID0gY3RyX2VuY3J5cHQocHQsIGN0LCBsZW5ndGgsICZlYXgtPmN0cikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBvbWFjIGNpcGhlcnRleHQgKi8KLSAgIHJldHVybiBvbWFjX3Byb2Nlc3MoJmVheC0+Y3RvbWFjLCBjdCwgbGVuZ3RoKTsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2VheF9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkuYyBiL2VheF9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlOWZhNy4uMDAwMDAwMAotLS0gYS9lYXhfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogRUFYIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIEVBWF9NT0RFCi0KLWludCBlYXhfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5KGludCBjaXBoZXIsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIHVuc2lnbmVkIGxvbmcgbm9uY2VsZW4sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGVhZGVyLCB1bnNpZ25lZCBsb25nIGhlYWRlcmxlbiwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgICAgIHVuc2lnbmVkIGxvbmcgcHRsZW4sCi0gICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsCi0gICAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnLCAgICB1bnNpZ25lZCBsb25nICp0YWdsZW4pCi17Ci0gICBpbnQgZXJyOwotICAgZWF4X3N0YXRlIGVheDsKLQotICAgaWYgKChlcnIgPSBlYXhfaW5pdCgmZWF4LCBjaXBoZXIsIGtleSwga2V5bGVuLCBub25jZSwgbm9uY2VsZW4sIGhlYWRlciwgaGVhZGVybGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIGlmICgoZXJyID0gZWF4X2VuY3J5cHQoJmVheCwgcHQsIGN0LCBwdGxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotIAotICAgaWYgKChlcnIgPSBlYXhfZG9uZSgmZWF4LCB0YWcsIHRhZ2xlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZWF4X2luaXQuYyBiL2VheF9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMWJiYmEuLjAwMDAwMDAKLS0tIGEvZWF4X2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogRUFYIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIEVBWF9NT0RFCi0KLWludCBlYXhfaW5pdChlYXhfc3RhdGUgKmVheCwgaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgdW5zaWduZWQgbG9uZyBub25jZWxlbiwKLSAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoZWFkZXIsIHVuc2lnbmVkIGxvbmcgaGVhZGVybGVuKQotewotICAgdW5zaWduZWQgY2hhciBidWZbTUFYQkxPQ0tTSVpFXTsKLSAgIGludCAgICAgICAgICAgZXJyLCBibGtsZW47Ci0gICBvbWFjX3N0YXRlICAgIG9tYWM7Ci0gICB1bnNpZ25lZCBsb25nIGxlbjsKLQotCi0gICBfQVJHQ0hLKGVheCAgICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsobm9uY2UgIT0gTlVMTCk7Ci0gICBpZiAoaGVhZGVybGVuID4gMCkgewotICAgICAgX0FSR0NISyhoZWFkZXIgIT0gTlVMTCk7Ci0gICB9Ci0KLSAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNpcGhlcikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotICAgYmxrbGVuID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5ibG9ja19sZW5ndGg7Ci0KLSAgIC8qIE4gPSBPTUFDXzBLKG5vbmNlKSAqLwotICAgemVyb21lbShidWYsIHNpemVvZihidWYpKTsKLSAgIGlmICgoZXJyID0gb21hY19pbml0KCZvbWFjLCBjaXBoZXIsIGtleSwga2V5bGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIG9tYWMgdGhlIFswXV9uICovCi0gICBpZiAoKGVyciA9IG9tYWNfcHJvY2Vzcygmb21hYywgYnVmLCBibGtsZW4pKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIC8qIG9tYWMgdGhlIG5vbmNlICovCi0gICBpZiAoKGVyciA9IG9tYWNfcHJvY2Vzcygmb21hYywgbm9uY2UsIG5vbmNlbGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICAvKiBzdG9yZSByZXN1bHQgKi8KLSAgIGxlbiA9IHNpemVvZihlYXgtPk4pOwotICAgaWYgKChlcnIgPSBvbWFjX2RvbmUoJm9tYWMsIGVheC0+TiwgJmxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBIID0gT01BQ18xSyhoZWFkZXIpICovCi0gICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgYnVmW2Jsa2xlbiAtIDFdID0gMTsKLQotICAgaWYgKChlcnIgPSBvbWFjX2luaXQoJmVheC0+aGVhZGVyb21hYywgY2lwaGVyLCBrZXksIGtleWxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBvbWFjIHRoZSBbMV1fbiAqLwotICAgaWYgKChlcnIgPSBvbWFjX3Byb2Nlc3MoJmVheC0+aGVhZGVyb21hYywgYnVmLCBibGtsZW4pKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIC8qIG9tYWMgdGhlIGhlYWRlciAqLwotICAgaWYgKGhlYWRlcmxlbiAhPSAwKSB7Ci0gICAgICBpZiAoKGVyciA9IG9tYWNfcHJvY2VzcygmZWF4LT5oZWFkZXJvbWFjLCBoZWFkZXIsIGhlYWRlcmxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICByZXR1cm4gZXJyOwotICAgICAgfQotICAgfQotCi0gICAvKiBub3RlIHdlIGRvbid0IGZpbmlzaCB0aGUgaGVhZGVyb21hYywgdGhpcyBhbGxvd3MgdXMgdG8gYWRkIG1vcmUgaGVhZGVyIGxhdGVyICovCi0KLSAgIC8qIHNldHVwIHRoZSBDVFIgbW9kZSAqLwotICAgaWYgKChlcnIgPSBjdHJfc3RhcnQoY2lwaGVyLCBlYXgtPk4sIGtleSwga2V5bGVuLCAwLCAmZWF4LT5jdHIpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIC8qIHVzZSBiaWctZW5kaWFuIGNvdW50ZXIgKi8KLSAgIGVheC0+Y3RyLm1vZGUgPSAxOwotCi0gICAvKiBzZXR1cCB0aGUgT01BQyBmb3IgdGhlIGNpcGhlcnRleHQgKi8KLSAgIGlmICgoZXJyID0gb21hY19pbml0KCZlYXgtPmN0b21hYywgY2lwaGVyLCBrZXksIGtleWxlbikpICE9IENSWVBUX09LKSB7IAotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogb21hYyBbMl1fbiAqLwotICAgemVyb21lbShidWYsIHNpemVvZihidWYpKTsKLSAgIGJ1ZltibGtsZW4tMV0gPSAyOwotICAgaWYgKChlcnIgPSBvbWFjX3Byb2Nlc3MoJmVheC0+Y3RvbWFjLCBidWYsIGJsa2xlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0gICB6ZXJvbWVtKCZvbWFjLCBzaXplb2Yob21hYykpOwotI2VuZGlmCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZiAKZGlmZiAtLWdpdCBhL2VjYl9kZWNyeXB0LmMgYi9lY2JfZGVjcnlwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjIzMTU2Li4wMDAwMDAwCi0tLSBhL2VjYl9kZWNyeXB0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBFQ0IKLQotaW50IGVjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX0VDQiAqZWNiKQotewotICAgaW50IGVycjsKLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgX0FSR0NISyhlY2IgIT0gTlVMTCk7Ci0KLSAgIC8qIHZhbGlkIGNpcGhlcj8gKi8KLSAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGVjYi0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICByZXR1cm4gZXJyOwotICAgfQotICAgX0FSR0NISyhjaXBoZXJfZGVzY3JpcHRvcltlY2ItPmNpcGhlcl0uZWNiX2RlY3J5cHQgIT0gTlVMTCk7Ci0gICAKLSAgIGNpcGhlcl9kZXNjcmlwdG9yW2VjYi0+Y2lwaGVyXS5lY2JfZGVjcnlwdChjdCwgcHQsICZlY2ItPmtleSk7Ci0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL2VjYl9lbmNyeXB0LmMgYi9lY2JfZW5jcnlwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWI3NjQ2Li4wMDAwMDAwCi0tLSBhL2VjYl9lbmNyeXB0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBFQ0IKLQotaW50IGVjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX0VDQiAqZWNiKQotewotICAgaW50IGVycjsKLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgX0FSR0NISyhlY2IgIT0gTlVMTCk7Ci0KLSAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGVjYi0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICByZXR1cm4gZXJyOwotICAgfQotICAgY2lwaGVyX2Rlc2NyaXB0b3JbZWNiLT5jaXBoZXJdLmVjYl9lbmNyeXB0KHB0LCBjdCwgJmVjYi0+a2V5KTsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9lY2Jfc3RhcnQuYyBiL2VjYl9zdGFydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzNiYmU5Li4wMDAwMDAwCi0tLSBhL2VjYl9zdGFydC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgRUNCCi0KLWludCBlY2Jfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX0VDQiAqZWNiKQotewotICAgaW50IGVycjsKLSAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOwotICAgX0FSR0NISyhlY2IgIT0gTlVMTCk7Ci0KLSAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNpcGhlcikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotICAgZWNiLT5jaXBoZXIgPSBjaXBoZXI7Ci0gICBlY2ItPmJsb2NrbGVuID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5ibG9ja19sZW5ndGg7Ci0gICByZXR1cm4gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5zZXR1cChrZXksIGtleWxlbiwgbnVtX3JvdW5kcywgJmVjYi0+a2V5KTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9lY2MuYyBiL2VjYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE5NjgxLi4wMDAwMDAwCi0tLSBhL2VjYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTM3ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotCi0vKiBJbXBsZW1lbnRzIEVDQyBvdmVyIFovcFogZm9yIGN1cnZlIHleMiA9IHheMyAtIDN4ICsgYgotICoKLSAqIEFsbCBjdXJ2ZXMgdGFrZW4gZnJvbSBOSVNUIHJlY29tbWVuZGF0aW9uIHBhcGVyIG9mIEp1bHkgMTk5OQotICogQXZhaWxhYmxlIGF0IGh0dHA6Ly9jc3JjLm5pc3QuZ292L2NyeXB0dmFsL2Rzcy5odG0KLSAqLwotCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgTUVDQwotCi0vKiBUaGlzIGhvbGRzIHRoZSBrZXkgc2V0dGluZ3MuICAqKipNVVNUKioqIGJlIG9yZ2FuaXplZCBieSBzaXplIGZyb20gc21hbGxlc3QgdG8gbGFyZ2VzdC4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgaW50IHNpemU7Ci0gICBjaGFyICpuYW1lLCAqcHJpbWUsICpCLCAqb3JkZXIsICpHeCwgKkd5OwotfSBzZXRzW10gPSB7Ci0jaWZkZWYgRUNDMTYwCi17Ci0gICAyMCwKLSAgICJFQ0MtMTYwIiwKLSAgIC8qIHByaW1lICovCi0gICAiRzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3IiwKLSAgIC8qIEIgKi8KLSAgICIxb1VWMnZPYVNsV2J4cjYiLAotICAgLyogb3JkZXIgKi8KLSAgICJHMDAwMDAwMDAwMDAwNHNDUVV0RHhhcURVTjUiLAotICAgLyogR3ggKi8KLSAgICJqcHFPZjFCSHVzNllkL3B5aHlWcFAiLAotICAgLyogR3kgKi8KLSAgICJEL3d5a3V1SUZmcit2UHl4N2tRRVB1OE1peE8iLAotfSwKLSNlbmRpZgotI2lmZGVmIEVDQzE5MgotewotICAgIDI0LAotICAgIkVDQy0xOTIiLAotICAgLyogcHJpbWUgKi8KLSAgICIvLy8vLy8vLy8vLy8vLy8vLy8vLy9sLy8vLy8vLy8vLyIsCi0KLSAgIC8qIEIgKi8KLSAgICJQMjQ1NlVNU1dFU0ZmK2NoU1lHbUlWd3V0a3AxSGhjbiIsCi0KLSAgIC8qIG9yZGVyICovCi0gICAiLy8vLy8vLy8vLy8vLy8vL2NUeHVEWEhob1I2cXFZV24iLAotCi0gICAvKiBHeCAqLwotICAgIjY4c2UzaDBtYUZQeWxvM2hHdzY4MEZKLzJsczIvbjBJIiwKLQotICAgLyogR3kgKi8KLSAgICIxbmFoYlYvOHNkWFo0MTdqUW9KRHJORnZUdzRVVUtXSCIKLX0sCi0jZW5kaWYKLSNpZmRlZiBFQ0MyMjQKLXsKLSAgIDI4LAotICAgIkVDQy0yMjQiLAotCi0gICAvKiBwcmltZSAqLwotICAgIjQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEJWIiwKLQotICAgLyogQiAqLwotICAgIjIxSGtXR0wyQ3hKSXAiLAotCi0gICAvKiBvcmRlciAqLwotICAgIjQwMDAwMDAwMDAwMDAwMDAwMDBLeG5peGs5dDhNTHpNaVYyNjQvIiwKLQotICAgLyogR3ggKi8KLSAgICJqcHFPZjFCSHVzNllkL3B5aHlWcFAiLAotCi0gICAvKiBHeSAqLwotICAgIjNGQ3R5bzJ5SEE1U0Zqa0NHYll4Yk92TmVDaHdTK2o2d1NJd2NrIiwKLX0sCi0jZW5kaWYKLSNpZmRlZiBFQ0MyNTYKLXsKLSAgIDMyLAotICAgIkVDQy0yNTYiLAotICAgLyogUHJpbWUgKi8KLSAgICJGLy8vL3kwMDAwMTAwMDAwMDAwMDAwMDAwMDAvLy8vLy8vLy8vLy8vLy8vIiwKLQotICAgLyogQiAqLwotICAgIjVoNkRUWWdFZkZkaStrekxOUU9YaG5iN0dRbXA1RW16WmxFRjN1ZHFjMUIiLAotCi0gICAvKiBPcmRlciAqLwotICAgIkYvLy8veTAwMDAwLy8vLy8vLy8vLyt5dmxnamZuVVVYRkV2b2lCeU9vTEgiLAotCi0gICAvKiBHeCAqLwotICAgIjZpTnFWQlhCNDk3K0JwY3ZNRWFHRjl0MHRzMUJVaXBlRklYRUtOT2NDQU0iLAotCi0gICAvKiBHeSAqLwotICAgIjQvWkdrQis2ZCtSWmtWaElkbUZkWE9ocFpETlFwNVVwaWtzRzZXdGxyN3IiCi19LAotI2VuZGlmCi0jaWZkZWYgRUNDMzg0Ci17Ci0gICA0OCwKLSAgICJFQ0MtMzg0IiwKLSAgIC8qIHByaW1lICovCi0gICAiLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8veC8vLy8vMDAwMDAwMDAwMDMvIgotICAgIi8vLy8iLAotCi0gICAvKiBCICovCi0gICAiaXA0bGYrOCt2K0lPWldMaHUvV2o2SFdUZDZ4K1dLNEkwbkc4WnIwSlhyaDZMWmNEWVl4SGRJZzVvRXRKIgotICAgIngyaGwiLAotCi0gICAvKiBPcmRlciAqLwotICAgIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vbnNERFdWR3RCVHpPNldzb0lCMmRVa3BpNk1oQyIKLSAgICJuSWJwIiwKLQotICAgLyogR3ggYW5kIEd5ICovCi0gICAiZ2VWQThod0IxSlVFaVNTVXlvMmpUNnVURXNBQmZ2a09NVlQxdTg5S0FaWEwwbDlUbHJLZlIzZktOWlhvIgotICAgIlRXZ3QiLAotCi0gICAiRFhWVUlmT2NCNnpUZGZZL2FmQlNBVlpxN1JxZWNYSHl3VGVuNHhObWtDMEFPQjdFN053MWROZjM3Tm9HIgotICAgIndXdlYiCi19LAotI2VuZGlmCi0jaWZkZWYgRUNDNTIxCi17Ci0gICA2NSwKLSAgICJFQ0MtNTIxIiwKLSAgIC8qIHByaW1lICovCi0gICAiVi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIgotICAgIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyIsCi0KLSAgIC8qIEIgKi8KLSAgICI1NkxGaGJYWlhvUTd2QVE4UTJzWEsza2VqZm9NdmNwNVZFdWo4Y0habDQ5dUxPUEVMN2lWZkR4NWJCMGwiCi0gICAiSmtubG1TclN6KzhGSW1xeVV6NTd6SGhLM3kwIiwKLQotICAgLyogT3JkZXIgKi8KLSAgICJWLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vK2I2Nlh1RS9CdlBoVnltMUkiCi0gICAiRlM5ZlQweGpTY3VZUG43aGhqbGpud0hFNkc5IiwKLQotICAgLyogR3ggYW5kIEd5ICovCi0gICAiQ1E1WldRdDEwSmZwUHUrb3NPWmJSSDJkNkkxRUdLL2pJN3VBQXpXUXFxemtnNUJOZFZsdnJhZS9YdDE5IgotICAgIndCL2dEdXBJQkYxWE1mMmMvYitWWjcydlJyYyIsCi0KLSAgICJIV3ZBTWZ1Y1psMDE1b0FOeEdpVkhsUGNGTDRJTFVSSDZXTmh4cU45cHZjQjlWa1NmYlV6MlAwbkwydjAiCi0gICAiSitqMXM0ckY3MjZlZEIyRzhZK2I3UVZxTVBHIiwKLX0sCi0jZW5kaWYKLXsKLSAgIDAsCi0gICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi19Ci19OwotCi0jaWYgMAotCi0vKiB5b3UgcGx1ZyBpbiBhIHByaW1lIGFuZCBCIHZhbHVlIGFuZCBpdCBmaW5kcyBhIHBzZXVkby1yYW5kb20gYmFzZSBwb2ludCAqLwotdm9pZCBlY2NfZmluZF9iYXNlKHZvaWQpCi17Ci0gICBzdGF0aWMgY2hhciAqcHJpbWUgPSAiMjY5NTk5NDY2NjcxNTA2Mzk3OTQ2NjcwMTUwODcwMTk2MzA2NzM2MzcxNDQ0MjI1NDA1NzI0ODExMDM2MTAyNDk5NTEiOwotICAgc3RhdGljIGNoYXIgKm9yZGVyID0gIjI2OTU5OTQ2NjY3MTUwNjM5Nzk0NjY3MDE1MDg3MDE5NjM3NDY3MTExNTYzNzQ1MDU0NjA1ODYxNDYzNTM4NTU3MjQ3IjsKLSAgIHN0YXRpYyBjaGFyICpiICAgICA9ICI5NTM4OTU3MzQ4OTU3MzUzNDg5NTg3IjsKLSAgIG1wX2ludCBwcCwgcCwgciwgQiwgdG1wMSwgdG1wMiwgdHgsIHR5LCB4LCB5OwotICAgY2hhciBidWZbNDA5Nl07Ci0gICBpbnQgaTsKLQotICAgbXBfaW5pdF9tdWx0aSgmdHgsICZ0eSwgJngsICZ5LCAmcCwgJnBwLCAmciwgJkIsICZ0bXAxLCAmdG1wMiwgTlVMTCk7Ci0gICBtcF9yZWFkX3JhZGl4KCZwLCBwcmltZSwgMTApOwotICAgbXBfcmVhZF9yYWRpeCgmciwgb3JkZXIsIDEwKTsKLSAgIG1wX3JlYWRfcmFkaXgoJkIsIGIsIDEwKTsKLQotICAgLyogZ2V0IChwKzEpLzQgKi8KLSAgIG1wX2FkZF9kKCZwLCAxLCAmcHApOwotICAgbXBfZGl2XzIoJnBwLCAmcHApOwotICAgbXBfZGl2XzIoJnBwLCAmcHApOwotCi0gICBidWZbMF0gPSAwOwotICAgZG8gewotICAgICAgcHJpbnRmKCIuIik7IGZmbHVzaChzdGRvdXQpOwotICAgICAgLyogbWFrZSBhIHJhbmRvbSB2YWx1ZSBvZiB4ICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgYnVmW2krMV0gPSByYW5kKCkgJiAyNTU7Ci0gICAgICBtcF9yZWFkX3JhdygmeCwgYnVmLCAxNyk7Ci0gICAgICBtcF9jb3B5KCZ4LCAmdHgpOwotCi0gICAgICAvKiBub3cgY29tcHV0ZSB4XjMgLSAzeCArIGIgKi8KLSAgICAgIG1wX2V4cHRfZCgmeCwgMywgJnRtcDEpOwotICAgICAgbXBfbXVsX2QoJngsIDMsICZ0bXAyKTsKLSAgICAgIG1wX3N1YigmdG1wMSwgJnRtcDIsICZ0bXAxKTsKLSAgICAgIG1wX2FkZCgmdG1wMSwgJkIsICZ0bXAxKTsKLSAgICAgIG1wX21vZCgmdG1wMSwgJnAsICZ0bXAxKTsKLQotICAgICAgLyogbm93IGNvbXB1dGUgc3FydCB2aWEgeF4oKHArMSkvNCkgKi8KLSAgICAgIG1wX2V4cHRtb2QoJnRtcDEsICZwcCwgJnAsICZ0bXAyKTsKLSAgICAgIG1wX2NvcHkoJnRtcDIsICZ0eSk7Ci0KLSAgICAgIC8qIG5vdyBzcXVhcmUgaXQgKi8KLSAgICAgIG1wX3Nxcm1vZCgmdG1wMiwgJnAsICZ0bXAyKTsKLQotICAgICAgLyogdG1wMiBzaG91bGQgZXF1YWwgdG1wMSAqLwotICAgfSB3aGlsZSAobXBfY21wKCZ0bXAxLCAmdG1wMikpOwotCi0gICAvKiBub3cgb3V0cHV0IHZhbHVlcyBpbiB3YXkgdGhhdCBsaWJ0b21jcnlwdCB3YW50cyAqLwotICAgbXBfdG9kZWNpbWFsKCZwLCBidWYpOwotICAgcHJpbnRmKCJcblxucD09JXNcbiIsIGJ1Zik7Ci0gICBtcF90b2hleCgmQiwgYnVmKTsKLSAgIHByaW50ZigiYj09JXNcbiIsIGJ1Zik7Ci0gICBtcF90b2RlY2ltYWwoJnIsIGJ1Zik7Ci0gICBwcmludGYoInI9PSVzXG4iLCBidWYpOwotICAgbXBfdG9oZXgoJnR4LCBidWYpOwotICAgcHJpbnRmKCJHeD09JXNcbiIsIGJ1Zik7Ci0gICBtcF90b2hleCgmdHksIGJ1Zik7Ci0gICBwcmludGYoIkd5PT0lc1xuIiwgYnVmKTsKLQotICAgbXBfY2xlYXJfbXVsdGkoJnR4LCAmdHksICZ4LCAmeSwgJnAsICZwcCwgJnIsICZCLCAmdG1wMSwgJnRtcDIsIE5VTEwpOwotfQotIAotI2VuZGlmCi0KLQotCi0KLXN0YXRpYyBpbnQgaXNfdmFsaWRfaWR4KGludCBuKQotewotICAgaW50IHg7Ci0KLSAgIGZvciAoeCA9IDA7IHNldHNbeF0uc2l6ZSAhPSAwOyB4KyspOwotICAgaWYgKChuIDwgMCkgfHwgKG4gPj0geCkpIHsKLSAgICAgIHJldHVybiAwOwotICAgfQotICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBlY2NfcG9pbnQgKm5ld19wb2ludCh2b2lkKQotewotICAgZWNjX3BvaW50ICpwOwotICAgcCA9IFhNQUxMT0Moc2l6ZW9mKGVjY19wb2ludCkpOwotICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9Ci0gICBpZiAobXBfaW5pdF9tdWx0aSgmcC0+eCwgJnAtPnksIE5VTEwpICE9IE1QX09LQVkpIHsKLSAgICAgIFhGUkVFKHApOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICB9Ci0gICByZXR1cm4gcDsKLX0KLQotc3RhdGljIHZvaWQgZGVsX3BvaW50KGVjY19wb2ludCAqcCkKLXsKLSAgIC8qIHByZXZlbnRzIGZyZWUnaW5nIG51bGwgYXJndW1lbnRzICovCi0gICBpZiAocCAhPSBOVUxMKSB7Ci0gICAgICBtcF9jbGVhcl9tdWx0aSgmcC0+eCwgJnAtPnksIE5VTEwpOwotICAgICAgWEZSRUUocCk7Ci0gICB9Ci19Ci0KLS8qIGRvdWJsZSBhIHBvaW50IFIgPSAyUCwgUiBjYW4gYmUgUCovCi1zdGF0aWMgaW50IGRibF9wb2ludChlY2NfcG9pbnQgKlAsIGVjY19wb2ludCAqUiwgbXBfaW50ICptb2R1bHVzLCBtcF9pbnQgKm11KQotewotICAgbXBfaW50IHMsIHRtcCwgdG1weDsKLSAgIGludCBlcnI7Ci0KLSAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgmcywgJnRtcCwgJnRtcHgsIE5VTEwpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotICAgfQotCi0gICAvKiBzID0gKDNYcF4yICsgYSkgLyAoMllwKSAqLwotICAgaWYgKChlcnIgPSBtcF9tdWxfMigmUC0+eSwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAgPSAyKnkgKi8KLSAgIGlmICgoZXJyID0gbXBfaW52bW9kKCZ0bXAsIG1vZHVsdXMsICZ0bXApKSAhPSBNUF9PS0FZKSAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wID0gMS90bXAgbW9kIG1vZHVsdXMgKi8KLSAgIGlmICgoZXJyID0gbXBfc3FyKCZQLT54LCAmcykpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogcyA9IHheMiAgKi8KLSAgIGlmICgoZXJyID0gbXBfcmVkdWNlKCZzLCBtb2R1bHVzLCBtdSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIGlmICgoZXJyID0gbXBfbXVsX2QoJnMsKG1wX2RpZ2l0KTMsICZzKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogcyA9IDMqKHheMikgKi8KLSAgIGlmICgoZXJyID0gbXBfc3ViX2QoJnMsKG1wX2RpZ2l0KTMsICZzKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogcyA9IDMqKHheMikgLSAzICovCi0gICBpZiAobXBfY21wX2QoJnMsIDApID09IE1QX0xUKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBzIDwgMCBhZGQgbW9kdWx1cyAqLwotICAgICAgaWYgKChlcnIgPSBtcF9hZGQoJnMsIG1vZHVsdXMsICZzKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgfQotICAgaWYgKChlcnIgPSBtcF9tdWwoJnMsICZ0bXAsICZzKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiBzID0gdG1wICogcyBtb2QgbW9kdWx1cyAqLwotICAgaWYgKChlcnIgPSBtcF9yZWR1Y2UoJnMsIG1vZHVsdXMsIG11KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotCi0gICAvKiBYciA9IHNeMiAtIDJYcCAqLwotICAgaWYgKChlcnIgPSBtcF9zcXIoJnMsICAmdG1weCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXB4ID0gc14yICAqLwotICAgaWYgKChlcnIgPSBtcF9yZWR1Y2UoJnRtcHgsIG1vZHVsdXMsIG11KSkgIT0gTVBfT0tBWSkgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXB4ID0gdG1weCBtb2QgbW9kdWx1cyAqLwotICAgaWYgKChlcnIgPSBtcF9zdWIoJnRtcHgsICZQLT54LCAmdG1weCkpICE9IE1QX09LQVkpICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXB4ID0gdG1weCAtIHggKi8KLSAgIGlmICgoZXJyID0gbXBfc3VibW9kKCZ0bXB4LCAmUC0+eCwgbW9kdWx1cywgJnRtcHgpKSAhPSBNUF9PS0FZKSB7IGdvdG8gZXJyb3I7IH0gLyogdG1weCA9IHRtcHggLSB4IG1vZCBtb2R1bHVzICovCi0KLSAgIC8qIFlyID0gLVlwICsgcyhYcCAtIFhyKSAgKi8KLSAgIGlmICgoZXJyID0gbXBfc3ViKCZQLT54LCAmdG1weCwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wID0geCAtIHRtcHggKi8KLSAgIGlmICgoZXJyID0gbXBfbXVsKCZ0bXAsICZzLCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wID0gdG1wICogcyAqLwotICAgaWYgKChlcnIgPSBtcF9zdWJtb2QoJnRtcCwgJlAtPnksIG1vZHVsdXMsICZSLT55KSkgIT0gTVBfT0tBWSkgIHsgZ290byBlcnJvcjsgfSAvKiB5ID0gdG1wIC0geSBtb2QgbW9kdWx1cyAqLwotICAgaWYgKChlcnIgPSBtcF9jb3B5KCZ0bXB4LCAmUi0+eCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB4ID0gdG1weCAqLwotCi0gICBlcnIgPSBDUllQVF9PSzsKLSAgIGdvdG8gZG9uZTsKLWVycm9yOgotICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotZG9uZToKLSAgIG1wX2NsZWFyX211bHRpKCZ0bXB4LCAmdG1wLCAmcywgTlVMTCk7Ci0gICByZXR1cm4gZXJyOwotfQotCi0vKiBhZGQgdHdvIGRpZmZlcmVudCBwb2ludHMgb3ZlciBaL3BaLCBSID0gUCArIFEsIG5vdGUgUiBjYW4gZXF1YWwgZWl0aGVyIFAgb3IgUSAqLwotc3RhdGljIGludCBhZGRfcG9pbnQoZWNjX3BvaW50ICpQLCBlY2NfcG9pbnQgKlEsIGVjY19wb2ludCAqUiwgbXBfaW50ICptb2R1bHVzLCBtcF9pbnQgKm11KQotewotICAgbXBfaW50IHMsIHRtcCwgdG1weDsKLSAgIGludCBlcnI7Ci0KLSAgIGlmICgoZXJyID0gbXBfaW5pdCgmdG1wKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsKLSAgIH0KLQotICAgLyogaXMgUD09USBvciBQPT0tUT8gKi8KLSAgIGlmICgoKGVyciA9IG1wX25lZygmUS0+eSwgJnRtcCkpICE9IE1QX09LQVkpIHx8ICgoZXJyID0gbXBfbW9kKCZ0bXAsIG1vZHVsdXMsICZ0bXApKSAhPSBNUF9PS0FZKSkgewotICAgICAgbXBfY2xlYXIoJnRtcCk7Ci0gICAgICByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotICAgfQotCi0gICBpZiAobXBfY21wKCZQLT54LCAmUS0+eCkgPT0gTVBfRVEpCi0gICAgICBpZiAobXBfY21wKCZQLT55LCAmUS0+eSkgPT0gTVBfRVEgfHwgbXBfY21wKCZQLT55LCAmdG1wKSA9PSBNUF9FUSkgewotICAgICAgICAgbXBfY2xlYXIoJnRtcCk7Ci0gICAgICAgICByZXR1cm4gZGJsX3BvaW50KFAsIFIsIG1vZHVsdXMsIG11KTsKLSAgICAgIH0KLQotICAgaWYgKChlcnIgPSBtcF9pbml0X211bHRpKCZ0bXB4LCAmcywgTlVMTCkpICE9IE1QX09LQVkpIHsKLSAgICAgIG1wX2NsZWFyKCZ0bXApOwotICAgICAgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsKLSAgIH0KLQotICAgLyogZ2V0IHMgPSAoWXAgLSBZcSkvKFhwLVhxKSBtb2QgcCAqLwotICAgaWYgKChlcnIgPSBtcF9zdWIoJlAtPngsICZRLT54LCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAgPSBQeCAtIFF4IG1vZCBtb2R1bHVzICovCi0gICBpZiAobXBfY21wX2QoJnRtcCwgMCkgPT0gTVBfTFQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0bXA8MCBhZGQgbW9kdWx1cyAqLwotICAgICAgaWYgKChlcnIgPSBtcF9hZGQoJnRtcCwgbW9kdWx1cywgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgfQotICAgaWYgKChlcnIgPSBtcF9pbnZtb2QoJnRtcCwgbW9kdWx1cywgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAgPSAxL3RtcCBtb2QgbW9kdWx1cyAqLwotICAgaWYgKChlcnIgPSBtcF9zdWIoJlAtPnksICZRLT55LCAmcykpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiBzID0gUHkgLSBReSBtb2QgbW9kdWx1cyAqLwotICAgaWYgKG1wX2NtcF9kKCZzLCAwKSA9PSBNUF9MVCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgczwwIGFkZCBtb2R1bHVzICovCi0gICAgICBpZiAoKGVyciA9IG1wX2FkZCgmcywgbW9kdWx1cywgJnMpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICB9Ci0gICBpZiAoKGVyciA9IG1wX211bCgmcywgJnRtcCwgJnMpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9IC8qIHMgPSBzICogdG1wIG1vZCBtb2R1bHVzICovCi0gICBpZiAoKGVyciA9IG1wX3JlZHVjZSgmcywgbW9kdWx1cywgbXUpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0KLSAgIC8qIFhyID0gc14yIC0gWHAgLSBYcSAqLwotICAgaWYgKChlcnIgPSBtcF9zcXIoJnMsICZ0bXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAgPSBzXjIgbW9kIG1vZHVsdXMgKi8KLSAgIGlmICgoZXJyID0gbXBfcmVkdWNlKCZ0bXAsIG1vZHVsdXMsIG11KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIGlmICgoZXJyID0gbXBfc3ViKCZ0bXAsICZQLT54LCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wID0gdG1wIC0gUHggKi8KLSAgIGlmICgoZXJyID0gbXBfc3ViKCZ0bXAsICZRLT54LCAmdG1weCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1weCA9IHRtcCAtIFF4ICovCi0KLSAgIC8qIFlyID0gLVlwICsgcyhYcCAtIFhyKSAqLwotICAgaWYgKChlcnIgPSBtcF9zdWIoJlAtPngsICZ0bXB4LCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAgPSBQeCAtIHRtcHggKi8KLSAgIGlmICgoZXJyID0gbXBfbXVsKCZ0bXAsICZzLCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wID0gdG1wICogcyAqLwotICAgaWYgKChlcnIgPSBtcF9zdWJtb2QoJnRtcCwgJlAtPnksIG1vZHVsdXMsICZSLT55KSkgIT0gTVBfT0tBWSkgICAgIHsgZ290byBlcnJvcjsgfSAvKiBSeSA9IHRtcCAtIFB5IG1vZCBtb2R1bHVzICovCi0gICBpZiAoKGVyciA9IG1wX21vZCgmdG1weCwgbW9kdWx1cywgJlItPngpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9IC8qIFJ4ID0gdG1weCBtb2QgbW9kdWx1cyAqLwotCi0gICBlcnIgPSBDUllQVF9PSzsKLSAgIGdvdG8gZG9uZTsKLWVycm9yOgotICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotZG9uZToKLSAgIG1wX2NsZWFyX211bHRpKCZzLCAmdG1weCwgJnRtcCwgTlVMTCk7Ci0gICByZXR1cm4gZXJyOwotfQotCi0vKiBzaXplIG9mIHNsaWRpbmcgd2luZG93LCBkb24ndCBjaGFuZ2UgdGhpcyEgKi8KLSNkZWZpbmUgV0lOU0laRSA0Ci0KLS8qIHBlcmZvcm0gUiA9IGtHIHdoZXJlIGsgPT0gaW50ZWdlciBhbmQgRyA9PSBlY2NfcG9pbnQgKi8KLXN0YXRpYyBpbnQgZWNjX211bG1vZChtcF9pbnQgKmssIGVjY19wb2ludCAqRywgZWNjX3BvaW50ICpSLCBtcF9pbnQgKm1vZHVsdXMpCi17Ci0gICBlY2NfcG9pbnQgKnRHLCAqTVs4XTsKLSAgIGludCBpLCBqLCBlcnI7Ci0gICBtcF9pbnQgbXU7Ci0gICBtcF9kaWdpdCBidWY7Ci0gICBpbnQgICAgIGZpcnN0LCBiaXRidWYsIGJpdGNweSwgYml0Y250LCBtb2RlLCBkaWdpZHg7Ci0KLSAgLyogaW5pdCBiYXJyZXR0IHJlZHVjdGlvbiAqLwotICBpZiAoKGVyciA9IG1wX2luaXQoJm11KSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsKLSAgfQotICBpZiAoKGVyciA9IG1wX3JlZHVjZV9zZXR1cCgmbXUsIG1vZHVsdXMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBtcF9jbGVhcigmbXUpOwotICAgICAgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsKLSAgfQotCi0gIC8qIGFsbG9jIHJhbSBmb3Igd2luZG93IHRlbXBzICovCi0gIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICAgIE1baV0gPSBuZXdfcG9pbnQoKTsKLSAgICAgIGlmIChNW2ldID09IE5VTEwpIHsKLSAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKLSAgICAgICAgICAgICBkZWxfcG9pbnQoTVtqXSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBtcF9jbGVhcigmbXUpOwotICAgICAgICAgcmV0dXJuIENSWVBUX01FTTsKLSAgICAgIH0KLSAgfQotCi0gICAvKiBtYWtlIGEgY29weSBvZiBHIGluY2FzZSBSPT1HICovCi0gICB0RyA9IG5ld19wb2ludCgpOwotICAgaWYgKHRHID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBlcnIgPSBDUllQVF9NRU07IGdvdG8gZG9uZTsgfQotCi0gICAvKiB0RyA9IEcgKi8KLSAgIGlmICgoZXJyID0gbXBfY29weSgmRy0+eCwgJnRHLT54KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgaWYgKChlcnIgPSBtcF9jb3B5KCZHLT55LCAmdEctPnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICAKLSAgIC8qIGNhbGMgdGhlIE0gdGFiLCB3aGljaCBob2xkcyBrRyBmb3Igaz09OC4uMTUgKi8KLSAgIC8qIE1bMF0gPT0gOEcgKi8KLSAgIGlmICgoZXJyID0gZGJsX3BvaW50KEcsIE1bMF0sIG1vZHVsdXMsICZtdSkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgICAgIHsgZ290byBkb25lOyB9Ci0gICBpZiAoKGVyciA9IGRibF9wb2ludChNWzBdLCBNWzBdLCBtb2R1bHVzLCAmbXUpKSAhPSBDUllQVF9PSykgICAgICAgICAgICAgICB7IGdvdG8gZG9uZTsgfQotICAgaWYgKChlcnIgPSBkYmxfcG9pbnQoTVswXSwgTVswXSwgbW9kdWx1cywgJm11KSkgIT0gQ1JZUFRfT0spICAgICAgICAgICAgICAgeyBnb3RvIGRvbmU7IH0KLQotICAgLyogbm93IGZpbmQgKDgraylHIGZvciBrPTEuLjcgKi8KLSAgIGZvciAoaiA9IDk7IGogPCAxNjsgaisrKSB7Ci0gICAgICAgaWYgKChlcnIgPSBhZGRfcG9pbnQoTVtqLTldLCBHLCBNW2otOF0sIG1vZHVsdXMsICZtdSkpICE9IENSWVBUX09LKSAgICB7IGdvdG8gZG9uZTsgfQotICAgfQotCi0gICAvKiBzZXR1cCBzbGlkaW5nIHdpbmRvdyAqLwotICAgbW9kZSAgID0gMDsKLSAgIGJpdGNudCA9IDE7Ci0gICBidWYgICAgPSAwOwotICAgZGlnaWR4ID0gay0+dXNlZCAtIDE7Ci0gICBiaXRjcHkgPSBiaXRidWYgPSAwOwotICAgZmlyc3QgID0gMTsKLQotICAgLyogcGVyZm9ybSBvcHMgKi8KLSAgIGZvciAoOzspIHsKLSAgICAgLyogZ3JhYiBuZXh0IGRpZ2l0IGFzIHJlcXVpcmVkICovCi0gICAgIGlmICgtLWJpdGNudCA9PSAwKSB7Ci0gICAgICAgaWYgKGRpZ2lkeCA9PSAtMSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICAgICBidWYgPSBrLT5kcFtkaWdpZHgtLV07Ci0gICAgICAgYml0Y250ID0gKGludCkgRElHSVRfQklUOwotICAgICB9Ci0KLSAgICAgLyogZ3JhYiB0aGUgbmV4dCBtc2IgZnJvbSB0aGUgbXVsdGlwbGljYW5kICovCi0gICAgIGkgPSAoYnVmID4+IChESUdJVF9CSVQgLSAxKSkgJiAxOwotICAgICBidWYgPDw9IDE7Ci0KLSAgICAgLyogc2tpcCBsZWFkaW5nIHplcm8gYml0cyAqLwotICAgICBpZiAobW9kZSA9PSAwICYmIGkgPT0gMCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgfQotCi0gICAgIC8qIGlmIHRoZSBiaXQgaXMgemVybyBhbmQgbW9kZSA9PSAxIHRoZW4gd2UgZG91YmxlICovCi0gICAgIGlmIChtb2RlID09IDEgJiYgaSA9PSAwKSB7Ci0gICAgICAgIGlmICgoZXJyID0gZGJsX3BvaW50KFIsIFIsIG1vZHVsdXMsICZtdSkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgICB7IGdvdG8gZG9uZTsgfQotICAgICAgICBjb250aW51ZTsKLSAgICAgfQotCi0gICAgIC8qIGVsc2Ugd2UgYWRkIGl0IHRvIHRoZSB3aW5kb3cgKi8KLSAgICAgYml0YnVmIHw9IChpIDw8IChXSU5TSVpFIC0gKytiaXRjcHkpKTsKLSAgICAgbW9kZSA9IDI7Ci0KLSAgICAgaWYgKGJpdGNweSA9PSBXSU5TSVpFKSB7Ci0gICAgICAgLyogaWYgdGhpcyBpcyB0aGUgZmlyc3Qgd2luZG93IHdlIGRvIGEgc2ltcGxlIGNvcHkgKi8KLSAgICAgICBpZiAoZmlyc3QgPT0gMSkgewotICAgICAgICAgIC8qIFIgPSBrRyBbayA9IGZpcnN0IHdpbmRvd10gKi8KLSAgICAgICAgICBpZiAoKGVyciA9IG1wX2NvcHkoJk1bYml0YnVmLThdLT54LCAmUi0+eCkpICE9IE1QX09LQVkpICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgICAgICAgIGlmICgoZXJyID0gbXBfY29weSgmTVtiaXRidWYtOF0tPnksICZSLT55KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAvKiBub3JtYWwgd2luZG93ICovCi0gICAgICAgICAvKiBvayB3aW5kb3cgaXMgZmlsbGVkIHNvIGRvdWJsZSBhcyByZXF1aXJlZCBhbmQgYWRkICAqLwotICAgICAgICAgLyogZG91YmxlIGZpcnN0ICovCi0gICAgICAgICBmb3IgKGogPSAwOyBqIDwgV0lOU0laRTsgaisrKSB7Ci0gICAgICAgICAgIGlmICgoZXJyID0gZGJsX3BvaW50KFIsIFIsIG1vZHVsdXMsICZtdSkpICE9IENSWVBUX09LKSAgICAgICAgICAgICB7IGdvdG8gZG9uZTsgfQotICAgICAgICAgfQotCi0gICAgICAgICAvKiB0aGVuIGFkZCwgYml0YnVmIHdpbGwgYmUgOC4uMTUgWzguLjJeV0lOU0laRV0gZ3VhcmFudGVlZCAqLwotICAgICAgICAgaWYgKChlcnIgPSBhZGRfcG9pbnQoUiwgTVtiaXRidWYtOF0sIFIsIG1vZHVsdXMsICZtdSkpICE9IENSWVBUX09LKSAgeyBnb3RvIGRvbmU7IH0KLSAgICAgICB9Ci0gICAgICAgLyogZW1wdHkgd2luZG93IGFuZCByZXNldCAqLwotICAgICAgIGJpdGNweSA9IGJpdGJ1ZiA9IDA7Ci0gICAgICAgbW9kZSA9IDE7Ci0gICAgfQotICB9Ci0KLSAgIC8qIGlmIGJpdHMgcmVtYWluIHRoZW4gZG91YmxlL2FkZCAqLwotICAgaWYgKG1vZGUgPT0gMiAmJiBiaXRjcHkgPiAwKSB7Ci0gICAgIC8qIGRvdWJsZSB0aGVuIGFkZCAqLwotICAgICBmb3IgKGogPSAwOyBqIDwgYml0Y3B5OyBqKyspIHsKLSAgICAgICAvKiBvbmx5IGRvdWJsZSBpZiB3ZSBoYXZlIGhhZCBhdCBsZWFzdCBvbmUgYWRkIGZpcnN0ICovCi0gICAgICAgaWYgKGZpcnN0ID09IDApIHsKLSAgICAgICAgICBpZiAoKGVyciA9IGRibF9wb2ludChSLCBSLCBtb2R1bHVzLCAmbXUpKSAhPSBDUllQVF9PSykgICAgICAgICAgICAgICB7IGdvdG8gZG9uZTsgfQotICAgICAgIH0KLQotICAgICAgIGJpdGJ1ZiA8PD0gMTsKLSAgICAgICBpZiAoKGJpdGJ1ZiAmICgxIDw8IFdJTlNJWkUpKSAhPSAwKSB7Ci0gICAgICAgICBpZiAoZmlyc3QgPT0gMSl7Ci0gICAgICAgICAgICAvKiBmaXJzdCBhZGQsIHNvIGNvcHkgKi8KLSAgICAgICAgICAgIGlmICgoZXJyID0gbXBfY29weSgmdEctPngsICZSLT54KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgICAgICAgICAgIGlmICgoZXJyID0gbXBfY29weSgmdEctPnksICZSLT55KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgICAgICAgICAgIGZpcnN0ID0gMDsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiB0aGVuIGFkZCAqLwotICAgICAgICAgICAgaWYgKChlcnIgPSBhZGRfcG9pbnQoUiwgdEcsIFIsIG1vZHVsdXMsICZtdSkpICE9IENSWVBUX09LKSAgICAgICAgIHsgZ290byBkb25lOyB9Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICB9Ci0gICB9Ci0gICBlcnIgPSBDUllQVF9PSzsKLSAgIGdvdG8gZG9uZTsKLWVycm9yOgotICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotZG9uZToKLSAgIGRlbF9wb2ludCh0Ryk7Ci0gICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgZGVsX3BvaW50KE1baV0pOwotICAgfQotICAgbXBfY2xlYXIoJm11KTsKLSAgIHJldHVybiBlcnI7Ci19Ci0KLSN1bmRlZiBXSU5TSVpFCi0KLWludCBlY2NfdGVzdCh2b2lkKQotewotICAgbXBfaW50ICAgICBtb2R1bHVzLCBvcmRlcjsKLSAgIGVjY19wb2ludCAgKkcsICpHRzsKLSAgIGludCBpLCBlcnIsIHByaW1hbGl0eTsKLQotICAgaWYgKChlcnIgPSBtcF9pbml0X211bHRpKCZtb2R1bHVzLCAmb3JkZXIsIE5VTEwpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotICAgfQotCi0gICBHICAgPSBuZXdfcG9pbnQoKTsKLSAgIEdHICA9IG5ld19wb2ludCgpOwotICAgaWYgKEcgPT0gTlVMTCB8fCBHRyA9PSBOVUxMKSB7Ci0gICAgICBtcF9jbGVhcl9tdWx0aSgmbW9kdWx1cywgJm9yZGVyLCBOVUxMKTsKLSAgICAgIGRlbF9wb2ludChHKTsKLSAgICAgIGRlbF9wb2ludChHRyk7Ci0gICAgICByZXR1cm4gQ1JZUFRfTUVNOwotICAgfQotCi0gICBmb3IgKGkgPSAwOyBzZXRzW2ldLnNpemU7IGkrKykgewotICAgICAgICNpZiAwCi0gICAgICAgICAgcHJpbnRmKCJUZXN0aW5nICVkXG4iLCBzZXRzW2ldLnNpemUpOwotICAgICAgICNlbmRpZgotICAgICAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmbW9kdWx1cywgKGNoYXIgKilzZXRzW2ldLnByaW1lLCA2NCkpICE9IE1QX09LQVkpICAgeyBnb3RvIGVycm9yOyB9Ci0gICAgICAgaWYgKChlcnIgPSBtcF9yZWFkX3JhZGl4KCZvcmRlciwgKGNoYXIgKilzZXRzW2ldLm9yZGVyLCA2NCkpICE9IE1QX09LQVkpICAgICB7IGdvdG8gZXJyb3I7IH0KLQotICAgICAgIC8qIGlzIHByaW1lIGFjdHVhbGx5IHByaW1lPyAqLwotICAgICAgIGlmICgoZXJyID0gaXNfcHJpbWUoJm1vZHVsdXMsICZwcmltYWxpdHkpKSAhPSBDUllQVF9PSykgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGRvbmU7IH0KLSAgICAgICBpZiAocHJpbWFsaXR5ID09IDApIHsKLSAgICAgICAgICBlcnIgPSBDUllQVF9GQUlMX1RFU1RWRUNUT1I7Ci0gICAgICAgICAgZ290byBkb25lOwotICAgICAgIH0KLQotICAgICAgIC8qIGlzIG9yZGVyIHByaW1lID8gKi8KLSAgICAgICBpZiAoKGVyciA9IGlzX3ByaW1lKCZvcmRlciwgJnByaW1hbGl0eSkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBkb25lOyB9Ci0gICAgICAgaWYgKHByaW1hbGl0eSA9PSAwKSB7Ci0gICAgICAgICAgZXJyID0gQ1JZUFRfRkFJTF9URVNUVkVDVE9SOwotICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICB9Ci0KLSAgICAgICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJkctPngsIChjaGFyICopc2V0c1tpXS5HeCwgNjQpKSAhPSBNUF9PS0FZKSAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgICAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmRy0+eSwgKGNoYXIgKilzZXRzW2ldLkd5LCA2NCkpICE9IE1QX09LQVkpICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0KLSAgICAgICAvKiB0aGVuIHdlIHNob3VsZCBoYXZlIEcgPT0gKG9yZGVyICsgMSlHICovCi0gICAgICAgaWYgKChlcnIgPSBtcF9hZGRfZCgmb3JkZXIsIDEsICZvcmRlcikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgICAgICBpZiAoKGVyciA9IGVjY19tdWxtb2QoJm9yZGVyLCBHLCBHRywgJm1vZHVsdXMpKSAhPSBDUllQVF9PSykgICAgICAgICAgICAgICAgIHsgZ290byBkb25lOyB9Ci0gICAgICAgaWYgKG1wX2NtcCgmRy0+eCwgJkdHLT54KSAhPSAwIHx8IG1wX2NtcCgmRy0+eSwgJkdHLT55KSAhPSAwKSB7Ci0gICAgICAgICAgZXJyID0gQ1JZUFRfRkFJTF9URVNUVkVDVE9SOwotICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICB9Ci0gICB9Ci0gICBlcnIgPSBDUllQVF9PSzsKLSAgIGdvdG8gZG9uZTsKLWVycm9yOgotICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotZG9uZToKLSAgIGRlbF9wb2ludChHRyk7Ci0gICBkZWxfcG9pbnQoRyk7Ci0gICBtcF9jbGVhcl9tdWx0aSgmb3JkZXIsICZtb2R1bHVzLCBOVUxMKTsKLSAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgZWNjX3NpemVzKGludCAqbG93LCBpbnQgKmhpZ2gpCi17Ci0gaW50IGk7Ci0gX0FSR0NISyhsb3cgICE9IE5VTEwpOwotIF9BUkdDSEsoaGlnaCAhPSBOVUxMKTsKLQotICpsb3cgPSBJTlRfTUFYOwotICpoaWdoID0gMDsKLSBmb3IgKGkgPSAwOyBzZXRzW2ldLnNpemUgIT0gMDsgaSsrKSB7Ci0gICAgIGlmIChzZXRzW2ldLnNpemUgPCAqbG93KSAgewotICAgICAgICAqbG93ICA9IHNldHNbaV0uc2l6ZTsKLSAgICAgfQotICAgICBpZiAoc2V0c1tpXS5zaXplID4gKmhpZ2gpIHsKLSAgICAgICAgKmhpZ2ggPSBzZXRzW2ldLnNpemU7Ci0gICAgIH0KLSB9Ci19Ci0KLWludCBlY2NfbWFrZV9rZXkocHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBpbnQga2V5c2l6ZSwgZWNjX2tleSAqa2V5KQotewotICAgaW50IHgsIGVycjsKLSAgIGVjY19wb2ludCAqYmFzZTsKLSAgIG1wX2ludCBwcmltZTsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzEyOF07Ci0KLSAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOwotCi0gICAvKiBnb29kIHBybmc/ICovCi0gICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQod3BybmcpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogZmluZCBrZXkgc2l6ZSAqLwotICAgZm9yICh4ID0gMDsgKGtleXNpemUgPiBzZXRzW3hdLnNpemUpICYmIChzZXRzW3hdLnNpemUgIT0gMCk7IHgrKyk7Ci0gICBrZXlzaXplID0gc2V0c1t4XS5zaXplOwotCi0gICBpZiAoc2V0c1t4XS5zaXplID09IDApIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0tFWVNJWkU7Ci0gICB9Ci0gICBrZXktPmlkeCA9IHg7Ci0KLSAgIC8qIG1ha2UgdXAgcmFuZG9tIHN0cmluZyAqLwotICAgaWYgKHBybmdfZGVzY3JpcHRvclt3cHJuZ10ucmVhZChidWYsICh1bnNpZ25lZCBsb25nKWtleXNpemUsIHBybmcpICE9ICh1bnNpZ25lZCBsb25nKWtleXNpemUpIHsKLSAgICAgIHJldHVybiBDUllQVF9FUlJPUl9SRUFEUFJORzsKLSAgIH0KLQotICAgLyogc2V0dXAgdGhlIGtleSB2YXJpYWJsZXMgKi8KLSAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgma2V5LT5wdWJrZXkueCwgJmtleS0+cHVia2V5LnksICZrZXktPmssICZwcmltZSwgTlVMTCkpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7Ci0gICB9Ci0gICBiYXNlID0gbmV3X3BvaW50KCk7Ci0gICBpZiAoYmFzZSA9PSBOVUxMKSB7Ci0gICAgICBtcF9jbGVhcl9tdWx0aSgma2V5LT5wdWJrZXkueCwgJmtleS0+cHVia2V5LnksICZrZXktPmssICZwcmltZSwgTlVMTCk7Ci0gICAgICByZXR1cm4gQ1JZUFRfTUVNOwotICAgfQotCi0gICAvKiByZWFkIGluIHRoZSBzcGVjcyBmb3IgdGhpcyBrZXkgKi8KLSAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmcHJpbWUsIChjaGFyICopc2V0c1trZXktPmlkeF0ucHJpbWUsIDY0KSkgIT0gTVBfT0tBWSkgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmYmFzZS0+eCwgKGNoYXIgKilzZXRzW2tleS0+aWR4XS5HeCwgNjQpKSAhPSBNUF9PS0FZKSAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmYmFzZS0+eSwgKGNoYXIgKilzZXRzW2tleS0+aWR4XS5HeSwgNjQpKSAhPSBNUF9PS0FZKSAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIGlmICgoZXJyID0gbXBfcmVhZF91bnNpZ25lZF9iaW4oJmtleS0+aywgKHVuc2lnbmVkIGNoYXIgKilidWYsIGtleXNpemUpKSAhPSBNUF9PS0FZKSB7IGdvdG8gZXJyb3I7IH0KLQotICAgLyogbWFrZSB0aGUgcHVibGljIGtleSAqLwotICAgaWYgKChlcnIgPSBlY2NfbXVsbW9kKCZrZXktPmssIGJhc2UsICZrZXktPnB1YmtleSwgJnByaW1lKSkgIT0gQ1JZUFRfT0spICAgICAgICAgICAgIHsgZ290byBkb25lOyB9Ci0gICBrZXktPnR5cGUgPSBQS19QUklWQVRFOwotCi0gICAvKiBzaHJpbmsga2V5ICovCi0gICBpZiAoKGVyciA9IG1wX3Nocmluaygma2V5LT5rKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICBpZiAoKGVyciA9IG1wX3Nocmluaygma2V5LT5wdWJrZXkueCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICBpZiAoKGVyciA9IG1wX3Nocmluaygma2V5LT5wdWJrZXkueSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0KLSAgIC8qIGZyZWUgdXAgcmFtICovCi0gICBlcnIgPSBDUllQVF9PSzsKLSAgIGdvdG8gZG9uZTsKLWVycm9yOgotICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotZG9uZToKLSAgIGRlbF9wb2ludChiYXNlKTsKLSAgIG1wX2NsZWFyKCZwcmltZSk7Ci0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0jZW5kaWYKLSAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgZWNjX2ZyZWUoZWNjX2tleSAqa2V5KQotewotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBtcF9jbGVhcl9tdWx0aSgma2V5LT5wdWJrZXkueCwgJmtleS0+cHVia2V5LnksICZrZXktPmssIE5VTEwpOwotfQotCi1zdGF0aWMgaW50IGNvbXByZXNzX3lfcG9pbnQoZWNjX3BvaW50ICpwdCwgaW50IGlkeCwgaW50ICpyZXN1bHQpCi17Ci0gICBtcF9pbnQgdG1wLCB0bXAyLCBwOwotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhwdCAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHJlc3VsdCAhPSBOVUxMKTsKLQotICAgaWYgKChlcnIgPSBtcF9pbml0X211bHRpKCZ0bXAsICZ0bXAyLCAmcCwgTlVMTCkpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7Ci0gICB9Ci0KLSAgIC8qIGdldCB4XjMgLSAzeCArIGIgKi8KLSAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmcCwgKGNoYXIgKilzZXRzW2lkeF0uQiwgNjQpKSAhPSBNUF9PS0FZKSB7IGdvdG8gZXJyb3I7IH0gLyogcCA9IEIgKi8KLSAgIGlmICgoZXJyID0gbXBfZXhwdF9kKCZwdC0+eCwgMywgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wID0gcFheMyAgKi8KLSAgIGlmICgoZXJyID0gbXBfbXVsX2QoJnB0LT54LCAzLCAmdG1wMikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wMiA9IDMqcFheMyAqLwotICAgaWYgKChlcnIgPSBtcF9zdWIoJnRtcCwgJnRtcDIsICZ0bXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAgPSB0bXAgLSB0bXAyICovCi0gICBpZiAoKGVyciA9IG1wX2FkZCgmdG1wLCAmcCwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9IC8qIHRtcCA9IHRtcCArIHAgKi8KLSAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmcCwgKGNoYXIgKilzZXRzW2lkeF0ucHJpbWUsIDY0KSkgIT0gTVBfT0tBWSkgIHsgZ290byBlcnJvcjsgfSAvKiBwID0gcHJpbWUgKi8KLSAgIGlmICgoZXJyID0gbXBfbW9kKCZ0bXAsICZwLCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wID0gdG1wIG1vZCBwICovCi0KLSAgIC8qIG5vdyBmaW5kIHNxdWFyZSByb290ICovCi0gICBpZiAoKGVyciA9IG1wX2FkZF9kKCZwLCAxLCAmdG1wMikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9IC8qIHRtcDIgPSBwICsgMSAqLwotICAgaWYgKChlcnIgPSBtcF9kaXZfMmQoJnRtcDIsIDIsICZ0bXAyLCBOVUxMKSkgIT0gTVBfT0tBWSkgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAyID0gKHArMSkvNCAqLwotICAgaWYgKChlcnIgPSBtcF9leHB0bW9kKCZ0bXAsICZ0bXAyLCAmcCwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAgID0gKHheMyAtIDN4ICsgYileKChwKzEpLzQpIG1vZCBwICovCi0KLSAgIC8qIGlmIHRtcCBlcXVhbHMgdGhlIHkgcG9pbnQgZ2l2ZSBhIDAsIG90aGVyd2lzZSAxICovCi0gICBpZiAobXBfY21wKCZ0bXAsICZwdC0+eSkgPT0gMCkgewotICAgICAgKnJlc3VsdCA9IDA7Ci0gICB9IGVsc2UgewotICAgICAgKnJlc3VsdCA9IDE7Ci0gICB9Ci0KLSAgIGVyciA9IENSWVBUX09LOwotICAgZ290byBkb25lOwotZXJyb3I6Ci0gICBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7Ci1kb25lOgotICAgbXBfY2xlYXJfbXVsdGkoJnAsICZ0bXAsICZ0bXAyLCBOVUxMKTsKLSAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgZXhwYW5kX3lfcG9pbnQoZWNjX3BvaW50ICpwdCwgaW50IGlkeCwgaW50IHJlc3VsdCkKLXsKLSAgIG1wX2ludCB0bXAsIHRtcDIsIHA7Ci0gICBpbnQgZXJyOwotCi0gICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotCi0gICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJnRtcCwgJnRtcDIsICZwLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIENSWVBUX01FTTsKLSAgIH0KLQotICAgLyogZ2V0IHheMyAtIDN4ICsgYiAqLwotICAgaWYgKChlcnIgPSBtcF9yZWFkX3JhZGl4KCZwLCAoY2hhciAqKXNldHNbaWR4XS5CLCA2NCkpICE9IE1QX09LQVkpIHsgZ290byBlcnJvcjsgfSAvKiBwID0gQiAqLwotICAgaWYgKChlcnIgPSBtcF9leHB0X2QoJnB0LT54LCAzLCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAgPSBwWF4zICovCi0gICBpZiAoKGVyciA9IG1wX211bF9kKCZwdC0+eCwgMywgJnRtcDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9IC8qIHRtcDIgPSAzKnBYXjMgKi8KLSAgIGlmICgoZXJyID0gbXBfc3ViKCZ0bXAsICZ0bXAyLCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wID0gdG1wIC0gdG1wMiAqLwotICAgaWYgKChlcnIgPSBtcF9hZGQoJnRtcCwgJnAsICZ0bXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAgPSB0bXAgKyBwICovCi0gICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJnAsIChjaGFyICopc2V0c1tpZHhdLnByaW1lLCA2NCkpICE9IE1QX09LQVkpICB7IGdvdG8gZXJyb3I7IH0gLyogcCA9IHByaW1lICovCi0gICBpZiAoKGVyciA9IG1wX21vZCgmdG1wLCAmcCwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9IC8qIHRtcCA9IHRtcCBtb2QgcCAqLwotCi0gICAvKiBub3cgZmluZCBzcXVhcmUgcm9vdCAqLwotICAgaWYgKChlcnIgPSBtcF9hZGRfZCgmcCwgMSwgJnRtcDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiB0bXAyID0gcCArIDEgKi8KLSAgIGlmICgoZXJyID0gbXBfZGl2XzJkKCZ0bXAyLCAyLCAmdG1wMiwgTlVMTCkpICE9IE1QX09LQVkpICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wMiA9IChwKzEpLzQgKi8KLSAgIGlmICgoZXJyID0gbXBfZXhwdG1vZCgmdG1wLCAmdG1wMiwgJnAsICZ0bXApKSAhPSBNUF9PS0FZKSAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogdG1wICA9ICh4XjMgLSAzeCArIGIpXigocCsxKS80KSBtb2QgcCAqLwotCi0gICAvKiBpZiByZXN1bHQ9PTAsIHRoZW4geT09dG1wLCBvdGhlcndpc2UgeT09cC10bXAgKi8KLSAgIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgaWYgKChlcnIgPSBtcF9jb3B5KCZ0bXAsICZwdC0+eSkgIT0gTVBfT0tBWSkpICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgfSBlbHNlIHsKLSAgICAgIGlmICgoZXJyID0gbXBfc3ViKCZwLCAmdG1wLCAmcHQtPnkpICE9IE1QX09LQVkpKSAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIH0KLQotICAgZXJyID0gQ1JZUFRfT0s7Ci0gICBnb3RvIGRvbmU7Ci1lcnJvcjoKLSAgIGVyciA9IG1waV90b19sdGNfZXJyb3IoZXJyKTsKLWRvbmU6Ci0gICBtcF9jbGVhcl9tdWx0aSgmcCwgJnRtcCwgJnRtcDIsIE5VTEwpOwotICAgcmV0dXJuIGVycjsKLX0KLQotaW50IGVjY19leHBvcnQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIGludCB0eXBlLCBlY2Nfa2V5ICprZXkpCi17Ci0gICB1bnNpZ25lZCBsb25nIHksIHo7Ci0gICBpbnQgY3AsIGVycjsKLQotICAgX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAgICE9IE5VTEwpOwotICAgCi0gICAvKiBjYW4gd2Ugc3RvcmUgdGhlIHN0YXRpYyBoZWFkZXI/ICAqLwotICAgaWYgKCpvdXRsZW4gPCAoUEFDS0VUX1NJWkUgKyAzKSkgewotICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgIH0KLQotICAgLyogdHlwZSB2YWxpZD8gKi8KLSAgIGlmIChrZXktPnR5cGUgIT0gUEtfUFJJVkFURSAmJiB0eXBlID09IFBLX1BSSVZBVEUpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19UWVBFX01JU01BVENIOwotICAgfQotCi0gICAvKiBvdXRwdXQgdHlwZSBhbmQgbWFnaWMgYnl0ZSAqLwotICAgeSA9IFBBQ0tFVF9TSVpFOwotICAgb3V0W3krK10gPSAodW5zaWduZWQgY2hhcil0eXBlOwotICAgb3V0W3krK10gPSAodW5zaWduZWQgY2hhcilzZXRzW2tleS0+aWR4XS5zaXplOwotCi0gICAvKiBvdXRwdXQgeCBjb29yZGluYXRlICovCi0gICBPVVRQVVRfQklHTlVNKCYoa2V5LT5wdWJrZXkueCksIG91dCwgeSwgeik7Ci0KLSAgIC8qIGNvbXByZXNzIHkgYW5kIG91dHB1dCBpdCAgKi8KLSAgIGlmICgoZXJyID0gY29tcHJlc3NfeV9wb2ludCgma2V5LT5wdWJrZXksIGtleS0+aWR4LCAmY3ApKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIG91dFt5KytdID0gKHVuc2lnbmVkIGNoYXIpY3A7Ci0KLSAgIGlmICh0eXBlID09IFBLX1BSSVZBVEUpIHsKLSAgICAgIE9VVFBVVF9CSUdOVU0oJmtleS0+aywgb3V0LCB5LCB6KTsKLSAgIH0KLQotICAgLyogc3RvcmUgaGVhZGVyICovCi0gICBwYWNrZXRfc3RvcmVfaGVhZGVyKG91dCwgUEFDS0VUX1NFQ1RfRUNDLCBQQUNLRVRfU1VCX0tFWSk7Ci0gICAqb3V0bGVuID0geTsKLQotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi1pbnQgZWNjX2ltcG9ydChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgZWNjX2tleSAqa2V5KQotewotICAgdW5zaWduZWQgbG9uZyB4LCB5LCBzOwotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhpbiAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLQotICAgLyogY2hlY2sgbGVuZ3RoICovCi0gICBpZiAoKDMrUEFDS0VUX1NJWkUpID4gaW5sZW4pIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKLSAgIH0KLQotICAgLyogY2hlY2sgdHlwZSAqLwotICAgaWYgKChlcnIgPSBwYWNrZXRfdmFsaWRfaGVhZGVyKCh1bnNpZ25lZCBjaGFyICopaW4sIFBBQ0tFVF9TRUNUX0VDQywgUEFDS0VUX1NVQl9LRVkpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogaW5pdCBrZXkgKi8KLSAgIGlmIChtcF9pbml0X211bHRpKCZrZXktPnB1YmtleS54LCAma2V5LT5wdWJrZXkueSwgJmtleS0+aywgTlVMTCkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIENSWVBUX01FTTsKLSAgIH0KLQotICAgeSA9IFBBQ0tFVF9TSVpFOwotICAga2V5LT50eXBlID0gKGludClpblt5KytdOwotICAgcyA9ICh1bnNpZ25lZCBsb25nKWluW3krK107Ci0KLSAgIGZvciAoeCA9IDA7IChzID4gKHVuc2lnbmVkIGxvbmcpc2V0c1t4XS5zaXplKSAmJiAoc2V0c1t4XS5zaXplICE9IDApOyB4KyspOwotICAgaWYgKHNldHNbeF0uc2l6ZSA9PSAwKSB7Ci0gICAgICBlcnIgPSBDUllQVF9JTlZBTElEX0tFWVNJWkU7Ci0gICAgICBnb3RvIGVycm9yOwotICAgfQotICAga2V5LT5pZHggPSAoaW50KXg7Ci0KLSAgIC8qIHR5cGUgY2hlY2sgYm90aCB2YWx1ZXMgKi8KLSAgIGlmICgoa2V5LT50eXBlICE9IFBLX1BVQkxJQykgJiYgKGtleS0+dHlwZSAhPSBQS19QUklWQVRFKSkgIHsKLSAgICAgIGVyciA9IENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgICAgZ290byBlcnJvcjsKLSAgIH0KLQotICAgLyogaXMgdGhlIGtleSBpZHggdmFsaWQ/ICovCi0gICBpZiAoaXNfdmFsaWRfaWR4KGtleS0+aWR4KSAhPSAxKSB7Ci0gICAgICBlcnIgPSBDUllQVF9JTlZBTElEX1BBQ0tFVDsKLSAgICAgIGdvdG8gZXJyb3I7Ci0gICB9Ci0KLSAgIC8qIGxvYWQgeCBjb29yZGluYXRlICovCi0gICBJTlBVVF9CSUdOVU0oJmtleS0+cHVia2V5LngsIGluLCB4LCB5LCBpbmxlbik7Ci0KLSAgIC8qIGxvYWQgeSAqLwotICAgeCA9ICh1bnNpZ25lZCBsb25nKWluW3krK107Ci0gICBpZiAoKGVyciA9IGV4cGFuZF95X3BvaW50KCZrZXktPnB1YmtleSwga2V5LT5pZHgsIChpbnQpeCkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgZ290byBlcnJvcjsKLSAgIH0KLQotICAgaWYgKGtleS0+dHlwZSA9PSBQS19QUklWQVRFKSB7Ci0gICAgICAvKiBsb2FkIHByaXZhdGUga2V5ICovCi0gICAgICBJTlBVVF9CSUdOVU0oJmtleS0+aywgaW4sIHgsIHksIGlubGVuKTsKLSAgIH0KLQotICAgLyogZWxpbWluYXRlIHByaXZhdGUga2V5IGlmIHB1YmxpYyAqLwotICAgaWYgKGtleS0+dHlwZSA9PSBQS19QVUJMSUMpIHsKLSAgICAgIG1wX2NsZWFyKCZrZXktPmspOwotICAgfQotCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci1lcnJvcjoKLSAgIG1wX2NsZWFyX211bHRpKCZrZXktPnB1YmtleS54LCAma2V5LT5wdWJrZXkueSwgJmtleS0+aywgTlVMTCk7Ci0gICByZXR1cm4gZXJyOwotfQotCi1pbnQgZWNjX3NoYXJlZF9zZWNyZXQoZWNjX2tleSAqcHJpdmF0ZV9rZXksIGVjY19rZXkgKnB1YmxpY19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0gICB1bnNpZ25lZCBsb25nIHgsIHk7Ci0gICBlY2NfcG9pbnQgKnJlc3VsdDsKLSAgIG1wX2ludCBwcmltZTsKLSAgIGludCBlcnI7Ci0KLSAgIF9BUkdDSEsocHJpdmF0ZV9rZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHB1YmxpY19rZXkgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAgICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICAgICAgIT0gTlVMTCk7Ci0KLSAgIC8qIHR5cGUgdmFsaWQ/ICovCi0gICBpZiAocHJpdmF0ZV9rZXktPnR5cGUgIT0gUEtfUFJJVkFURSkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX05PVF9QUklWQVRFOwotICAgfQotCi0gICBpZiAocHJpdmF0ZV9rZXktPmlkeCAhPSBwdWJsaWNfa2V5LT5pZHgpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19UWVBFX01JU01BVENIOwotICAgfQotCi0gICAvKiBtYWtlIG5ldyBwb2ludCAqLwotICAgcmVzdWx0ID0gbmV3X3BvaW50KCk7Ci0gICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBDUllQVF9NRU07Ci0gICB9Ci0KLSAgIGlmICgoZXJyID0gbXBfaW5pdCgmcHJpbWUpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBkZWxfcG9pbnQocmVzdWx0KTsKLSAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7Ci0gICB9Ci0KLSAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmcHJpbWUsIChjaGFyICopc2V0c1twcml2YXRlX2tleS0+aWR4XS5wcmltZSwgNjQpKSAhPSBNUF9PS0FZKSAgIHsgZ290byBlcnJvcjsgfQotICAgaWYgKChlcnIgPSBlY2NfbXVsbW9kKCZwcml2YXRlX2tleS0+aywgJnB1YmxpY19rZXktPnB1YmtleSwgcmVzdWx0LCAmcHJpbWUpKSAhPSBDUllQVF9PSykgeyBnb3RvIGRvbmUxOyB9Ci0KLSAgIHggPSAodW5zaWduZWQgbG9uZyltcF91bnNpZ25lZF9iaW5fc2l6ZSgmcmVzdWx0LT54KTsKLSAgIHkgPSAodW5zaWduZWQgbG9uZyltcF91bnNpZ25lZF9iaW5fc2l6ZSgmcmVzdWx0LT55KTsKLQotICAgaWYgKCpvdXRsZW4gPCAoeCt5KSkgewotICAgICAgZXJyID0gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgICAgZ290byBkb25lMTsKLSAgIH0KLSAgICpvdXRsZW4gPSB4K3k7Ci0gICBpZiAoKGVyciA9IG1wX3RvX3Vuc2lnbmVkX2JpbigmcmVzdWx0LT54LCBvdXQpKSAgICE9IE1QX09LQVkpICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgaWYgKChlcnIgPSBtcF90b191bnNpZ25lZF9iaW4oJnJlc3VsdC0+eSwgb3V0K3gpKSAhPSBNUF9PS0FZKSAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLQotICAgZXJyID0gQ1JZUFRfT0s7Ci0gICBnb3RvIGRvbmUxOwotZXJyb3I6Ci0gICBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7Ci1kb25lMToKLSAgIG1wX2NsZWFyKCZwcmltZSk7Ci0gICBkZWxfcG9pbnQocmVzdWx0KTsKLSAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBlY2NfZ2V0X3NpemUoZWNjX2tleSAqa2V5KQotewotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBpZiAoaXNfdmFsaWRfaWR4KGtleS0+aWR4KSkKLSAgICAgIHJldHVybiBzZXRzW2tleS0+aWR4XS5zaXplOwotICAgZWxzZQotICAgICAgcmV0dXJuIElOVF9NQVg7IC8qIGxhcmdlIHZhbHVlIGtub3duIHRvIGNhdXNlIGl0IHRvIGZhaWwgd2hlbiBwYXNzZWQgdG8gZWNjX21ha2Vfa2V5KCkgKi8KLX0KLQotI2luY2x1ZGUgImVjY19zeXMuYyIKLQotI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvZWNjX3N5cy5jIGIvZWNjX3N5cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2UxMzExLi4wMDAwMDAwCi0tLSBhL2VjY19zeXMuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLWludCBlY2NfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW5rZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpsZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGludCBoYXNoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZWNjX2tleSAqa2V5KQotewotICAgIHVuc2lnbmVkIGNoYXIgcHViX2V4cHRbMjU2XSwgZWNjX3NoYXJlZFsyNTZdLCBza2V5W01BWEJMT0NLU0laRV07Ci0gICAgZWNjX2tleSBwdWJrZXk7Ci0gICAgdW5zaWduZWQgbG9uZyB4LCB5LCB6LCBoYXNoc2l6ZSwgcHVia2V5c2l6ZTsKLSAgICBpbnQgZXJyOwotCi0gICAgX0FSR0NISyhpbmtleSAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKG91dCAgICE9IE5VTEwpOwotICAgIF9BUkdDSEsobGVuICAgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhrZXkgICAhPSBOVUxMKTsKLQotICAgIC8qIGNoZWNrIHRoYXQgd3BybmcvY2lwaGVyL2hhc2ggYXJlIG5vdCBpbnZhbGlkICovCi0gICAgaWYgKChlcnIgPSBwcm5nX2lzX3ZhbGlkKHdwcm5nKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChrZXlsZW4gPiBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uaGFzaHNpemUpIHsKLSAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9IQVNIOwotICAgIH0KLQotICAgIC8qIG1ha2UgYSByYW5kb20ga2V5IGFuZCBleHBvcnQgdGhlIHB1YmxpYyBjb3B5ICovCi0gICAgaWYgKChlcnIgPSBlY2NfbWFrZV9rZXkocHJuZywgd3BybmcsIGVjY19nZXRfc2l6ZShrZXkpLCAmcHVia2V5KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHB1YmtleXNpemUgPSAodW5zaWduZWQgbG9uZylzaXplb2YocHViX2V4cHQpOwotICAgIGlmICgoZXJyID0gZWNjX2V4cG9ydChwdWJfZXhwdCwgJnB1YmtleXNpemUsIFBLX1BVQkxJQywgJnB1YmtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgZWNjX2ZyZWUoJnB1YmtleSk7Ci0gICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgCi0gICAgLyogbm93IGNoZWNrIGlmIHRoZSBvdXQgYnVmZmVyIGlzIGJpZyBlbm91Z2ggKi8KLSAgICBpZiAoKmxlbiA8ICg5ICsgUEFDS0VUX1NJWkUgKyBwdWJrZXlzaXplICsgaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplKSkgewotICAgICAgIGVjY19mcmVlKCZwdWJrZXkpOwotICAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gICAgfQotCi0gICAgLyogbWFrZSByYW5kb20ga2V5ICovCi0gICAgaGFzaHNpemUgID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplOwotICAgIHggPSAodW5zaWduZWQgbG9uZylzaXplb2YoZWNjX3NoYXJlZCk7Ci0gICAgaWYgKChlcnIgPSBlY2Nfc2hhcmVkX3NlY3JldCgmcHVia2V5LCBrZXksIGVjY19zaGFyZWQsICZ4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICBlY2NfZnJlZSgmcHVia2V5KTsKLSAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICBlY2NfZnJlZSgmcHVia2V5KTsKLSAgICB6ID0gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKHNrZXkpOwotICAgIGlmICgoZXJyID0gaGFzaF9tZW1vcnkoaGFzaCwgZWNjX3NoYXJlZCwgeCwgc2tleSwgJnopKSAhPSBDUllQVF9PSykgewotICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIAotICAgIC8qIHN0b3JlIGhlYWRlciAqLwotICAgIHBhY2tldF9zdG9yZV9oZWFkZXIob3V0LCBQQUNLRVRfU0VDVF9FQ0MsIFBBQ0tFVF9TVUJfRU5DX0tFWSk7ICAgIAotCi0gICAgLyogb3V0cHV0IGhlYWRlciAqLwotICAgIHkgPSBQQUNLRVRfU0laRTsKLSAKLSAgICAvKiBzaXplIG9mIGhhc2ggbmFtZSBhbmQgdGhlIG5hbWUgaXRzZWxmICovCi0gICAgb3V0W3krK10gPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uSUQ7Ci0KLSAgICAvKiBsZW5ndGggb2YgRUNDIHB1YmtleSBhbmQgdGhlIGtleSBpdHNlbGYgKi8KLSAgICBTVE9SRTMyTChwdWJrZXlzaXplLCBvdXQreSk7Ci0gICAgeSArPSA0OwotCi0gICAgZm9yICh4ID0gMDsgeCA8IHB1YmtleXNpemU7IHgrKywgeSsrKSB7Ci0gICAgICAgIG91dFt5XSA9IHB1Yl9leHB0W3hdOwotICAgIH0KLQotICAgIFNUT1JFMzJMKGtleWxlbiwgb3V0K3kpOwotICAgIHkgKz0gNDsKLQotICAgIC8qIEVuY3J5cHQvU3RvcmUgdGhlIGVuY3J5cHRlZCBrZXkgKi8KLSAgICBmb3IgKHggPSAwOyB4IDwga2V5bGVuOyB4KyssIHkrKykgewotICAgICAgb3V0W3ldID0gc2tleVt4XSBeIGlua2V5W3hdOwotICAgIH0KLSAgICAqbGVuID0geTsKLQotI2lmZGVmIENMRUFOX1NUQUNLCi0gICAgLyogY2xlYW4gdXAgKi8KLSAgICB6ZXJvbWVtKHB1Yl9leHB0LCBzaXplb2YocHViX2V4cHQpKTsKLSAgICB6ZXJvbWVtKGVjY19zaGFyZWQsIHNpemVvZihlY2Nfc2hhcmVkKSk7Ci0gICAgemVyb21lbShza2V5LCBzaXplb2Yoc2tleSkpOwotI2VuZGlmCi0gICAgcmV0dXJuIENSWVBUX09LOwotfQotCi1pbnQgZWNjX2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRrZXksIHVuc2lnbmVkIGxvbmcgKmtleWxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVjY19rZXkgKmtleSkKLXsKLSAgIHVuc2lnbmVkIGNoYXIgc2hhcmVkX3NlY3JldFsyNTZdLCBza2V5W01BWEJMT0NLU0laRV07Ci0gICB1bnNpZ25lZCBsb25nIHgsIHksIHosIGhhc2hzaXplLCBrZXlzaXplOwotICAgaW50IGhhc2gsIGVycjsKLSAgIGVjY19rZXkgcHVia2V5OwotCi0gICBfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0a2V5ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXlsZW4gIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKLQotICAgLyogcmlnaHQga2V5IHR5cGU/ICovCi0gICBpZiAoa2V5LT50eXBlICE9IFBLX1BSSVZBVEUpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19OT1RfUFJJVkFURTsKLSAgIH0KLSAgIAotICAgLyogY29ycmVjdCBsZW5ndGggPyAqLwotICAgaWYgKGlubGVuIDwgUEFDS0VUX1NJWkUrMSs0KzQpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKLSAgIH0gZWxzZSB7Ci0gICAgICBpbmxlbiAtPSBQQUNLRVRfU0laRSsxKzQrNDsKLSAgIH0KLQotICAgLyogaXMgaGVhZGVyIGNvcnJlY3Q/ICovCi0gICBpZiAoKGVyciA9IHBhY2tldF92YWxpZF9oZWFkZXIoKHVuc2lnbmVkIGNoYXIgKilpbiwgUEFDS0VUX1NFQ1RfRUNDLCBQQUNLRVRfU1VCX0VOQ19LRVkpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogbm93IGxldHMgZ2V0IHRoZSBoYXNoIG5hbWUgKi8KLSAgIHkgPSBQQUNLRVRfU0laRTsKLSAgIGhhc2ggPSBmaW5kX2hhc2hfaWQoaW5beSsrXSk7Ci0gICBpZiAoaGFzaCA9PSAtMSkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfSEFTSDsKLSAgIH0KLQotICAgLyogY29tbW9uIHZhbHVlcyAqLwotICAgaGFzaHNpemUgID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplOwotCi0gICAvKiBnZXQgcHVibGljIGtleSAqLwotICAgTE9BRDMyTCh4LCBpbit5KTsKLSAgIGlmIChpbmxlbiA8IHgpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKLSAgIH0gZWxzZSB7Ci0gICAgICBpbmxlbiAtPSB4OwotICAgfQotICAgeSArPSA0OwotICAgaWYgKChlcnIgPSBlY2NfaW1wb3J0KGluK3ksIHgsICZwdWJrZXkpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIHkgKz0geDsKLQotICAgLyogbWFrZSBzaGFyZWQga2V5ICovCi0gICB4ID0gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKHNoYXJlZF9zZWNyZXQpOwotICAgaWYgKChlcnIgPSBlY2Nfc2hhcmVkX3NlY3JldChrZXksICZwdWJrZXksIHNoYXJlZF9zZWNyZXQsICZ4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIGVjY19mcmVlKCZwdWJrZXkpOwotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIGVjY19mcmVlKCZwdWJrZXkpOwotCi0gICB6ID0gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKHNrZXkpOwotICAgaWYgKChlcnIgPSBoYXNoX21lbW9yeShoYXNoLCBzaGFyZWRfc2VjcmV0LCB4LCBza2V5LCAmeikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICBMT0FEMzJMKGtleXNpemUsIGluK3kpOwotICAgaWYgKGlubGVuIDwga2V5c2l6ZSkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgfSBlbHNlIHsKLSAgICAgIGlubGVuIC09IGtleXNpemU7Ci0gICB9Ci0gICB5ICs9IDQ7Ci0KLSAgIGlmICgqa2V5bGVuIDwga2V5c2l6ZSkgewotICAgICAgIGVyciA9IENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgICAgICBnb3RvIGRvbmU7Ci0gICB9Ci0KLSAgIC8qIERlY3J5cHQgdGhlIGtleSAqLwotICAgZm9yICh4ID0gMDsgeCA8IGtleXNpemU7IHgrKywgeSsrKSB7Ci0gICAgIG91dGtleVt4XSA9IHNrZXlbeF0gXiBpblt5XTsKLSAgIH0KLQotICAgKmtleWxlbiA9IGtleXNpemU7Ci0KLSAgIGVyciA9IENSWVBUX09LOwotZG9uZToKLSNpZmRlZiBDTEVBTl9TVEFDSwotICAgemVyb21lbShzaGFyZWRfc2VjcmV0LCBzaXplb2Yoc2hhcmVkX3NlY3JldCkpOwotICAgemVyb21lbShza2V5LCBzaXplb2Yoc2tleSkpOwotI2VuZGlmCi0gICByZXR1cm4gZXJyOwotfQotCi1pbnQgZWNjX3NpZ25faGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBlY2Nfa2V5ICprZXkpCi17Ci0gICBlY2Nfa2V5IHB1YmtleTsKLSAgIG1wX2ludCBiLCBwOwotICAgdW5zaWduZWQgY2hhciBlcHVia2V5WzI1Nl0sIGVyWzI1Nl07Ci0gICB1bnNpZ25lZCBsb25nIHgsIHksIHB1YmtleXNpemUsIHJzaXplOwotICAgaW50ICBlcnI7Ci0KLSAgIF9BUkdDSEsoaW4gICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAgICE9IE5VTEwpOwotCi0gICAvKiBpcyB0aGlzIGEgcHJpdmF0ZSBrZXk/ICovCi0gICBpZiAoa2V5LT50eXBlICE9IFBLX1BSSVZBVEUpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19OT1RfUFJJVkFURTsKLSAgIH0KLSAgIAotICAgLyogaXMgdGhlIElEWCB2YWxpZCA/ICAqLwotICAgaWYgKGlzX3ZhbGlkX2lkeChrZXktPmlkeCkgIT0gMSkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX0lOVkFMSURfVFlQRTsKLSAgIH0KLSAgIAotICAgaWYgKChlcnIgPSBwcm5nX2lzX3ZhbGlkKHdwcm5nKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIG1ha2UgdXAgYSBrZXkgYW5kIGV4cG9ydCB0aGUgcHVibGljIGNvcHkgKi8KLSAgIGlmICgoZXJyID0gZWNjX21ha2Vfa2V5KHBybmcsIHdwcm5nLCBlY2NfZ2V0X3NpemUoa2V5KSwgJnB1YmtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICBwdWJrZXlzaXplID0gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGVwdWJrZXkpOwotICAgaWYgKChlcnIgPSBlY2NfZXhwb3J0KGVwdWJrZXksICZwdWJrZXlzaXplLCBQS19QVUJMSUMsICZwdWJrZXkpKSAhPSBDUllQVF9PSykgewotICAgICAgZWNjX2ZyZWUoJnB1YmtleSk7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBnZXQgdGhlIGhhc2ggYW5kIGxvYWQgaXQgYXMgYSBiaWdudW0gaW50byAnYicgKi8KLSAgIC8qIGluaXQgdGhlIGJpZ251bXMgKi8KLSAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgmYiwgJnAsIE5VTEwpKSAhPSBNUF9PS0FZKSB7IAotICAgICAgZWNjX2ZyZWUoJnB1YmtleSk7Ci0gICAgICByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotICAgfQotICAgaWYgKChlcnIgPSBtcF9yZWFkX3JhZGl4KCZwLCAoY2hhciAqKXNldHNba2V5LT5pZHhdLm9yZGVyLCA2NCkpICE9IE1QX09LQVkpICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIGlmICgoZXJyID0gbXBfcmVhZF91bnNpZ25lZF9iaW4oJmIsICh1bnNpZ25lZCBjaGFyICopaW4sIChpbnQpaW5sZW4pKSAhPSBNUF9PS0FZKSAgeyBnb3RvIGVycm9yOyB9Ci0KLSAgIC8qIGZpbmQgYiA9IChtIC0geCkvayAqLwotICAgaWYgKChlcnIgPSBtcF9pbnZtb2QoJnB1YmtleS5rLCAmcCwgJnB1YmtleS5rKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogayA9IDEvayAqLwotICAgaWYgKChlcnIgPSBtcF9zdWJtb2QoJmIsICZrZXktPmssICZwLCAmYikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0gLyogYiA9IG0gLSB4ICovCi0gICBpZiAoKGVyciA9IG1wX211bG1vZCgmYiwgJnB1YmtleS5rLCAmcCwgJmIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiBiID0gKG0gLSB4KS9rICovCi0KLSAgIC8qIGV4cG9ydCBpdCAqLwotICAgcnNpemUgPSAodW5zaWduZWQgbG9uZyltcF91bnNpZ25lZF9iaW5fc2l6ZSgmYik7Ci0gICBpZiAocnNpemUgPiAodW5zaWduZWQgbG9uZylzaXplb2YoZXIpKSB7IAotICAgICAgZXJyID0gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgICAgZ290byBlcnJvcjsgCi0gICB9Ci0gICBpZiAoKGVyciA9IG1wX3RvX3Vuc2lnbmVkX2JpbigmYiwgZXIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotCi0gICAvKiBub3cgbGV0cyBjaGVjayB0aGUgb3V0bGVuIGJlZm9yZSB3ZSB3cml0ZSAqLwotICAgaWYgKCpvdXRsZW4gPCAoMTIgKyByc2l6ZSArIHB1YmtleXNpemUpKSB7Ci0gICAgICBlcnIgPSBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICB9Ci0KLSAgIC8qIGxldHMgb3V0cHV0ICovCi0gICB5ID0gUEFDS0VUX1NJWkU7Ci0gICAKLSAgIC8qIHNpemUgb2YgcHVibGljIGtleSAqLwotICAgU1RPUkUzMkwocHVia2V5c2l6ZSwgb3V0K3kpOwotICAgeSArPSA0OwotCi0gICAvKiBjb3B5IHRoZSBwdWJsaWMga2V5ICovCi0gICBmb3IgKHggPSAwOyB4IDwgcHVia2V5c2l6ZTsgeCsrLCB5KyspIHsKLSAgICAgICBvdXRbeV0gPSBlcHVia2V5W3hdOwotICAgfQotCi0gICAvKiBzaXplIG9mICdyJyAqLwotICAgU1RPUkUzMkwocnNpemUsIG91dCt5KTsKLSAgIHkgKz0gNDsKLQotICAgLyogY29weSByICovCi0gICBmb3IgKHggPSAwOyB4IDwgcnNpemU7IHgrKywgeSsrKSB7Ci0gICAgICAgb3V0W3ldID0gZXJbeF07Ci0gICB9Ci0KLSAgIC8qIHN0b3JlIGhlYWRlciAqLwotICAgcGFja2V0X3N0b3JlX2hlYWRlcihvdXQsIFBBQ0tFVF9TRUNUX0VDQywgUEFDS0VUX1NVQl9TSUdORUQpOwotCi0gICAvKiBjbGVhciBtZW1vcnkgKi8KLSAgICpvdXRsZW4gPSB5OwotICAgZXJyID0gQ1JZUFRfT0s7Ci0gICBnb3RvIGRvbmU7Ci1lcnJvcjoKLSAgIGVyciA9IG1waV90b19sdGNfZXJyb3IoZXJyKTsKLWRvbmU6Ci0gICBtcF9jbGVhcl9tdWx0aSgmYiwgJnAsIE5VTEwpOwotICAgZWNjX2ZyZWUoJnB1YmtleSk7Ci0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oZXIsIHNpemVvZihlcikpOwotICAgemVyb21lbShlcHVia2V5LCBzaXplb2YoZXB1YmtleSkpOwotI2VuZGlmCi0gICByZXR1cm4gZXJyOyAgIAotfQotCi0vKiB2ZXJpZnkgdGhhdCBtRyA9IChiQSArIFkpCi0gKgotICogVGhlIHNpZ25hdHVyZXMgd29yayBieSBtYWtpbmcgdXAgYSBmcmVzaCBrZXkgImEiIHdpdGggYSBwdWJsaWMga2V5ICJBIi4gIE5vdyB3ZSB3YW50IHRvIHNpZ24gc28gdGhlIAotICogcHVibGljIGtleSBZID0geEcgY2FuIHZlcmlmeSBpdC4KLSAqCi0gKiBiID0gKG0gLSB4KS9rLCBBIGlzIHRoZSBwdWJsaWMga2V5IGVtYmVkZGVkIGFuZCBZIGlzIHRoZSB1c2VycyBwdWJsaWMga2V5IFt3aG8gc2lnbmVkIGl0XQotICogQSA9IGtHIHRoZXJlZm9yZSBiQSA9PSAoKG0teCkvaylrRyA9PSAobS14KUcKLSAqCi0gKiBBZGRpbmcgWSA9IHhHIHRvIHRoZSBiQSBnaXZlcyB1cyAobS14KUcgKyB4RyA9PSBtRwotICoKLSAqIFRoZSB1c2VyIGdpdmVuIG9ubHkgeEcsIGtHIGFuZCBiIGNhbm5vdCBkZXRlcm1pbmUgayBvciB4IHdoaWNoIG1lYW5zIHRoZXkgY2FuJ3QgZmluZCB0aGUgcHJpdmF0ZSBrZXkuCi0gKiAKLSAqLwotaW50IGVjY192ZXJpZnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIHVuc2lnbmVkIGxvbmcgc2lnbGVuLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoLCB1bnNpZ25lZCBsb25nIGlubGVuLCAKLSAgICAgICAgICAgICAgICAgICAgaW50ICpzdGF0LCBlY2Nfa2V5ICprZXkpCi17Ci0gICBlY2NfcG9pbnQgKm1HOwotICAgZWNjX2tleSAgIHB1YmtleTsKLSAgIG1wX2ludCBiLCBwLCBtLCBtdTsKLSAgIHVuc2lnbmVkIGxvbmcgeCwgeTsKLSAgIGludCBlcnI7Ci0KLSAgIF9BUkdDSEsoc2lnICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoaGFzaCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoc3RhdCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAhPSBOVUxMKTsKLQotICAgLyogZGVmYXVsdCB0byBpbnZhbGlkIHNpZ25hdHVyZSAqLwotICAgKnN0YXQgPSAwOwotCi0gICBpZiAoc2lnbGVuIDwgUEFDS0VUX1NJWkUrNCs0KSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7Ci0gICB9IGVsc2UgewotICAgICAgc2lnbGVuIC09IFBBQ0tFVF9TSVpFKzQrNDsKLSAgIH0KLQotICAgLyogaXMgdGhlIG1lc3NhZ2UgZm9ybWF0IGNvcnJlY3Q/ICovCi0gICBpZiAoKGVyciA9IHBhY2tldF92YWxpZF9oZWFkZXIoKHVuc2lnbmVkIGNoYXIgKilzaWcsIFBBQ0tFVF9TRUNUX0VDQywgUEFDS0VUX1NVQl9TSUdORUQpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0gICAgIAotCi0gICAvKiBnZXQgaGFzaCBuYW1lICovCi0gICB5ID0gUEFDS0VUX1NJWkU7Ci0KLSAgIC8qIGdldCBzaXplIG9mIHB1YmxpYyBrZXkgKi8KLSAgIExPQUQzMkwoeCwgc2lnK3kpOwotICAgaWYgKHNpZ2xlbiA8IHgpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKLSAgIH0gZWxzZSB7Ci0gICAgICBzaWdsZW4gLT0geDsKLSAgIH0KLSAgIHkgKz0gNDsKLQotICAgLyogbG9hZCB0aGUgcHVibGljIGtleSAqLwotICAgaWYgKChlcnIgPSBlY2NfaW1wb3J0KCh1bnNpZ25lZCBjaGFyKilzaWcreSwgeCwgJnB1YmtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotICAgeSArPSB4OwotCi0gICAvKiBsb2FkIHNpemUgb2YgJ2InICovCi0gICBMT0FEMzJMKHgsIHNpZyt5KTsKLSAgIGlmIChzaWdsZW4gPCB4KSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7Ci0gICB9IGVsc2UgewotICAgICAgc2lnbGVuIC09IHg7Ci0gICB9Ci0gICB5ICs9IDQ7Ci0KLSAgIC8qIGluaXQgdmFsdWVzICovCi0gICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJmIsICZtLCAmcCwgJm11LCBOVUxMKSkgIT0gTVBfT0tBWSkgeyAKLSAgICAgIGVjY19mcmVlKCZwdWJrZXkpOwotICAgICAgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsKLSAgIH0KLQotICAgbUcgPSBuZXdfcG9pbnQoKTsKLSAgIGlmIChtRyA9PSBOVUxMKSB7IAotICAgICAgbXBfY2xlYXJfbXVsdGkoJmIsICZtLCAmcCwgJm11LCBOVUxMKTsKLSAgICAgIGVjY19mcmVlKCZwdWJrZXkpOwotICAgICAgcmV0dXJuIENSWVBUX01FTTsKLSAgIH0gCi0KLSAgIC8qIGxvYWQgYiAqLwotICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbigmYiwgKHVuc2lnbmVkIGNoYXIgKilzaWcreSwgKGludCl4KSkgIT0gTVBfT0tBWSkgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgeSArPSB4OwotCi0gICAvKiBnZXQgbSBpbiBiaW5hcnkgYSBiaWdudW0gKi8KLSAgIGlmICgoZXJyID0gbXBfcmVhZF91bnNpZ25lZF9iaW4oJm0sICh1bnNpZ25lZCBjaGFyICopaGFzaCwgKGludClpbmxlbikpICE9IE1QX09LQVkpICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIAotICAgLyogbG9hZCBwcmltZSAqLwotICAgaWYgKChlcnIgPSBtcF9yZWFkX3JhZGl4KCZwLCAoY2hhciAqKXNldHNba2V5LT5pZHhdLnByaW1lLCA2NCkpICE9IE1QX09LQVkpICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgCi0gICAvKiBjYWxjdWxhdGUgYmFycmV0dCBzdHVmZiAqLwotICAgbXBfc2V0KCZtdSwgMSk7IAotICAgbXBfbHNoZCgmbXUsIDIgKiBVU0VEKCZwKSk7Ci0gICBpZiAoKGVyciA9IG1wX2RpdigmbXUsICZwLCAmbXUsIE5VTEwpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0KLSAgIC8qIGdldCBiQSAqLwotICAgaWYgKChlcnIgPSBlY2NfbXVsbW9kKCZiLCAmcHVia2V5LnB1YmtleSwgJnB1YmtleS5wdWJrZXksICZwKSkgIT0gQ1JZUFRfT0spICAgICAgICAgICAgICAgICAgeyBnb3RvIGRvbmU7IH0KLSAgIAotICAgLyogZ2V0IGJBICsgWSAqLwotICAgaWYgKChlcnIgPSBhZGRfcG9pbnQoJnB1YmtleS5wdWJrZXksICZrZXktPnB1YmtleSwgJnB1YmtleS5wdWJrZXksICZwLCAmbXUpKSAhPSBDUllQVF9PSykgICAgeyBnb3RvIGRvbmU7IH0KLQotICAgLyogZ2V0IG1HICovCi0gICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJm1HLT54LCAoY2hhciAqKXNldHNba2V5LT5pZHhdLkd4LCA2NCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmbUctPnksIChjaGFyICopc2V0c1trZXktPmlkeF0uR3ksIDY0KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgaWYgKChlcnIgPSBlY2NfbXVsbW9kKCZtLCBtRywgbUcsICZwKSkgIT0gQ1JZUFRfT0spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGRvbmU7IH0KLQotICAgLyogY29tcGFyZSBtRyB0byBiQSArIFkgKi8KLSAgIGlmIChtcF9jbXAoJm1HLT54LCAmcHVia2V5LnB1YmtleS54KSA9PSBNUF9FUSAmJiBtcF9jbXAoJm1HLT55LCAmcHVia2V5LnB1YmtleS55KSA9PSBNUF9FUSkgewotICAgICAgKnN0YXQgPSAxOwotICAgfQotCi0gICAvKiBjbGVhciB1cCBhbmQgcmV0dXJuICovCi0gICBlcnIgPSBDUllQVF9PSzsKLSAgIGdvdG8gZG9uZTsKLWVycm9yOgotICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotZG9uZToKLSAgIGRlbF9wb2ludChtRyk7Ci0gICBlY2NfZnJlZSgmcHVia2V5KTsKLSAgIG1wX2NsZWFyX211bHRpKCZwLCAmbSwgJmIsICZtdSwgTlVMTCk7Ci0gICByZXR1cm4gZXJyOwotfQotCmRpZmYgLS1naXQgYS9leGFtcGxlcy9jaDEtMDEuYyBiL2V4YW1wbGVzL2NoMS0wMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTBjY2Q3Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL2NoMS0wMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogCi0gKiBOYW1lICAgICAgOiBjaDEtMDEuYwotICogUHVycG9zZSAgIDogRGVtb25zdHJhdGlvbiBvZiBhIGJhc2ljIGxpYnRvbWNyeXB0IHByb2dyYW0KLSAqIEF1dGhvciAgICA6IFRvbSBTdCBEZW5pcwotICoKLSAqIEhpc3RvcnkgICA6IHYwLjc5IEluaXRpYWwgcmVsZWFzZQotICovCi0gCi0vKiBjaDEtMDEtMSAgKi8KLS8qIEluY2x1ZGUgdGhlIGRlZmF1bHQgaGVhZGVycyBhbmQgbGlidG9tY3J5cHQgaGVhZGVycyAqLwotI2luY2x1ZGUgPG15Y3J5cHQuaD4KLQotaW50IG1haW4odm9pZCkKLXsKLSAgIHJldHVybiAwOwotfQotLyogY2gxLTAxLTEgICovCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NoMS0wMi5jIGIvZXhhbXBsZXMvY2gxLTAyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDFmMjEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvY2gxLTAyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiAKLSAqIE5hbWUgICAgICA6IGNoMS0wMi5jCi0gKiBQdXJwb3NlICAgOiBEZW1vbnN0cmF0aW9uIG9mIGVycm9yIGhhbmRsaW5nCi0gKiBBdXRob3IgICAgOiBUb20gU3QgRGVuaXMKLSAqCi0gKiBIaXN0b3J5ICAgOiB2MC43OSBJbml0aWFsIHJlbGVhc2UKLSAqLwotIAotLyogY2gxLTAxLTEgKi8KLSNpbmNsdWRlIDxteWNyeXB0Lmg+Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICBpbnQgZXJybm87Ci0gICAKLSAgIGlmICgoZXJybm8gPSBzb21lX2Z1bmMoLi4uKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHByaW50ZigiRXJyb3I6ICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJybm8pKTsKLSAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7Ci0gICB9Ci0gICAKLSAgIHJldHVybiAwOwotfQotLypjaDEtMDEtMSAqLwotCi0KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NoMS0wMy5jIGIvZXhhbXBsZXMvY2gxLTAzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDlhYTEuLjAwMDAwMDAKLS0tIGEvZXhhbXBsZXMvY2gxLTAzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiAKLSAqIE5hbWUgICAgICA6IGNoMS0wMy5jCi0gKiBQdXJwb3NlICAgOiBEZW1vbnN0cmF0aW9uIG9mIHZhcmlhYmxlIGxlbmd0aCBvdXRwdXRzCi0gKiBBdXRob3IgICAgOiBUb20gU3QgRGVuaXMKLSAqCi0gKiBIaXN0b3J5ICAgOiB2MC43OSBJbml0aWFsIHJlbGVhc2UKLSAqLwotIAotIC8qIGNoMS0wMS0xICovCi0gI2luY2x1ZGUgPG15Y3J5cHQuaD4KLSAKLSBpbnQgbWFpbih2b2lkKQotIHsKLSAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcls1MTJdOwotICAgIGludCBlcnJubzsKLSAgICAKLSAgICBsZW5ndGggPSBzaXplb2YoYnVmZmVyKTsKLSAgICBpZiAoKGVycm5vID0gc29tZV9mdW5jKC4uLiwgYnVmZmVyLCAmbGVuZ3RoKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICBwcmludGYoIkVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycm5vKSk7Ci0gICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKLSAgICB9Ci0gICAgcHJpbnRmKCJTaXplIG9mIG91dHB1dCBpcyAlbHUgYnl0ZXNcbiIsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0vKiBjaDEtMDEtMSAqLwotCi0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9jaDItMDEuYyBiL2V4YW1wbGVzL2NoMi0wMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTY1NDc5Li4wMDAwMDAwCi0tLSBhL2V4YW1wbGVzL2NoMi0wMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogCi0gKiBOYW1lICAgICAgOiBjaDItMDEuYwotICogUHVycG9zZSAgIDogRGVtb25zdHJhdGlvbiBvZiByZWFkaW5nIHRoZSBSTkcKLSAqIEF1dGhvciAgICA6IFRvbSBTdCBEZW5pcwotICoKLSAqIEhpc3RvcnkgICA6IHYwLjgxIEluaXRpYWwgcmVsZWFzZQotICovCi0gCi0gLyogY2gyLTAyLTIgKi8KLSAjaW5jbHVkZSA8bXljcnlwdC5oPgotIAotIGludCBtYWluKHZvaWQpIAotIHsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07Ci0gICAgdW5zaWduZWQgbG9uZyBsZW47Ci0gICAgaW50ICAgICAgICAgICBpeDsKLSAgICAKLSAgICAvKiByZWFkIHRoZSBSTkcgKi8KLSAgICBsZW4gPSBybmdfZ2V0X2J5dGVzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwpOwotICAgIAotICAgIC8qIHZlcmlmeSByZXR1cm4gKi8KLSAgICBpZiAobGVuICE9IHNpemVvZihidWYpKSB7Ci0gICAgICAgcHJpbnRmKCJFcnJvcjogT25seSByZWFkICVsdSBieXRlcy5cbiIsIGxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICBwcmludGYoIlJlYWQgJWx1IGJ5dGVzXG4iLCBsZW4pOwotICAgICAgIGZvciAoaXggPSAwOyBpeCA8IHNpemVvZihidWYpOyBpeCsrKSB7Ci0gICAgICAgICAgIHByaW50ZigiJTAyeCAiLCBidWZbaXhdKTsKLSAgICAgICB9Ci0gICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwotfQotLyogY2gyLTAyLTIgKi8KLQpkaWZmIC0tZ2l0IGEvZ2VubGlzdC5zaCBiL2dlbmxpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyZThlNwotLS0gL2Rldi9udWxsCisrKyBiL2dlbmxpc3Quc2gKQEAgLTAsMCArMSwxMCBAQAorIyEvYmluL2Jhc2gKKyMgYWVzX3RhYi5vIGlzIGEgcHNldWRvIG9iamVjdCBhcyBpdCdzIG1hZGUgZnJvbSBhZXMubyBhbmQgTVBJIGlzIG9wdGlvbmFsCitleHBvcnQgYT1gZWNobyAtbiAic3JjL2NpcGhlcnMvYWVzL2Flc19lbmMubyAqKE1QSU9CSkVDVCkgIiA7IGZpbmQgLiAtdHlwZSBmIHwgc29ydCB8IGdyZXAgIlsuXS9zcmMiIHwgZ3JlcCAiWy5dYyIgfCBncmVwIC12ICJzaGEyMjQiIHwgZ3JlcCAtdiAic2hhMzg0IiB8IGdyZXAgLXYgImFlc190YWIiIHwgZ3JlcCAtdiAidHdvZmlzaF90YWIiIHwgZ3JlcCAtdiAid2hpcmx0YWIiIHwgZ3JlcCAtdiAiZGhfc3lzIiB8IGdyZXAgLXYgImVjY19zeXMiIHwgZ3JlcCAtdiAibXBpWy5dYyIgfCBncmVwIC12ICJzb2JlcjEyOHRhYiIgfCBzZWQgLWUgJ3NFXC4vRUUnIHwgc2VkIC1lICdzL1wuYy9cLm8vJyB8IHhhcmdzYAorcGVybCAuL3BhcnNlbmFtZXMucGwgT0JKRUNUUyAiJGEiCitleHBvcnQgYT1gZmluZCAuIC10eXBlIGYgfCBncmVwIFsuXS9zcmMgfCBncmVwIFsuXWggfCBzZWQgLWUgJ3NlXC4vZWUnIHwgeGFyZ3NgCitwZXJsIC4vcGFyc2VuYW1lcy5wbCBIRUFERVJTICIkYSIKKworIyAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9nZW5saXN0LnNoLHYgJCAgIAorIyAkUmV2aXNpb246IDEuMyAkICAgCisjICREYXRlOiAyMDA1LzA1LzA1IDE0OjQ5OjI3ICQgCmRpZmYgLS1naXQgYS9nZi5jIGIvZ2YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhYmIxNS4uMDAwMDAwMAotLS0gYS9nZi5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotLyogcG9seW5vbWlhbCBiYXNpcyBHRigyXncpIHJvdXRpbmVzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgR0YKLQotI2RlZmluZSBGT1JMT09QIGZvciAoaSA9IDA7IGkgPCBMU0laRTsgaSsrKSAKLQotLyogYyA9IGEgKyBiICovCi12b2lkIGdmX2FkZChnZl9pbnRwIGEsIGdmX2ludHAgYiwgZ2ZfaW50cCBjKQotewotICAgaW50IGk7Ci0gICBGT1JMT09QIGNbaV0gPSBhW2ldXmJbaV07Ci19Ci0KLS8qIGIgPSBhICovCi12b2lkIGdmX2NvcHkoZ2ZfaW50cCBhLCBnZl9pbnRwIGIpCi17Ci0gICBpbnQgaTsKLSAgIEZPUkxPT1AgYltpXSA9IGFbaV07Ci19Ci0KLS8qIGEgPSAwICovCi12b2lkIGdmX3plcm8oZ2ZfaW50cCBhKQotewotICAgaW50IGk7Ci0gICBGT1JMT09QIGFbaV0gPSAwOwotfQotCi0vKiBpcyBhIHplcm8/ICovCi1pbnQgZ2ZfaXN6ZXJvKGdmX2ludHAgYSkKLXsKLSAgIGludCBpOwotICAgRk9STE9PUCBpZiAoYVtpXSkgewotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0gICByZXR1cm4gMTsKLX0KLQotLyogaXMgYSBvbmU/ICovCi1pbnQgZ2ZfaXNvbmUoZ2ZfaW50cCBhKQoteyAKLSAgIGludCBpOwotICAgZm9yIChpID0gMTsgaSA8IExTSVpFOyBpKyspIHsKLSAgICAgICBpZiAoYVtpXSkgewotICAgICAgICAgIHJldHVybiAwOwotICAgICAgIH0KLSAgIH0KLSAgIHJldHVybiBhWzBdID09IDE7Ci19Ci0KLS8qIGIgPSBhIDw8IDEqLwotdm9pZCBnZl9zaGwoZ2ZfaW50cCBhLCBnZl9pbnRwIGIpCi17Ci0gICBpbnQgaTsKLSAgIGdmX2ludCB0bXA7Ci0KLSAgIGdmX2NvcHkoYSwgdG1wKTsKLSAgIGZvciAoaSA9IExTSVpFLTE7IGkgPiAwOyBpLS0pIAotICAgICAgIGJbaV0gPSAoKHRtcFtpXTw8MSl8KCh0bXBbaS0xXSYweEZGRkZGRkZGVUwpPj4zMSkpJjB4RkZGRkZGRkZVTDsKLSAgIGJbMF0gPSAodG1wWzBdIDw8IDEpJjB4RkZGRkZGRkZVTDsKLSAgIGdmX3plcm8odG1wKTsKLX0KLQotLyogYiA9IGEgPj4gMSAqLwotdm9pZCBnZl9zaHIoZ2ZfaW50cCBhLCBnZl9pbnRwIGIpCi17Ci0gICBpbnQgaTsKLSAgIGdmX2ludCB0bXA7Ci0KLSAgIGdmX2NvcHkoYSwgdG1wKTsKLSAgIGZvciAoaSA9IDA7IGkgPCBMU0laRS0xOyBpKyspCi0gICAgICAgYltpXSA9ICgoKHRtcFtpXSYweEZGRkZGRkZGVUwpPj4xKXwodG1wW2krMV08PDMxKSkmMHhGRkZGRkZGRlVMOwotICAgYltMU0laRS0xXSA9ICh0bXBbTFNJWkUtMV0mMHhGRkZGRkZGRlVMKT4+MTsKLSAgIGdmX3plcm8odG1wKTsKLX0KLQotLyogcmV0dXJucyAtMSBpZiBpdHMgemVybywgb3RoZXJ3aXNlIGRlZ3JlZSBvZiBhICovCi1pbnQgZ2ZfZGVnKGdmX2ludHAgYSkKLXsKLSAgIGludCBpLCBpaTsKLSAgIHVuc2lnbmVkIGxvbmcgdDsKLQotICAgaWkgPSAtMTsKLSAgIGZvciAoaSA9IExTSVpFLTE7IGkgPj0gMDsgaS0tKQotICAgICAgIGlmIChhW2ldKSB7Ci0gICAgICAgICAgZm9yICh0ID0gYVtpXSwgaWkgPSAwOyB0OyB0ID4+PSAxLCArK2lpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICB9Ci0gICBpZiAoaSA9PSAtMSkgaSA9IDA7Ci0gICByZXR1cm4gKGk8PDUpK2lpOwotfQotCi0vKiBjID0gYWIgKi8KLXZvaWQgZ2ZfbXVsKGdmX2ludHAgYSwgZ2ZfaW50cCBiLCBnZl9pbnRwIGMpCi17Ci0gICBnZl9pbnQgdGEsIHRiOwotICAgaW50IGksIG47Ci0KLSAgIGdmX2NvcHkoYSwgdGEpOwotICAgZ2ZfY29weShiLCB0Yik7Ci0gICBnZl96ZXJvKGMpOwotICAgbiA9IGdmX2RlZyh0YSkrMTsKLSAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICBpZiAodGFbaT4+NV0mKDE8PChpJjMxKSkpCi0gICAgICAgICAgZ2ZfYWRkKGMsIHRiLCBjKTsKLSAgICAgICBnZl9zaGwodGIsIHRiKTsKLSAgIH0KLSAgIGdmX3plcm8odGEpOwotICAgZ2ZfemVybyh0Yik7Ci19Ci0KLS8qIHEgPSBhL2IsIHIgPSBhJWIgKi8KLXZvaWQgZ2ZfZGl2KGdmX2ludHAgYSwgZ2ZfaW50cCBiLCBnZl9pbnRwIHEsIGdmX2ludHAgcikKLXsKLSAgIGdmX2ludCB0YSwgdGIsIHNoaWZ0c1tMU0laRSozMl07Ci0gICBpbnQgaSwgbWFnYiwgbWFnOwotCi0gICBtYWcgID0gZ2ZfZGVnKGEpOwotICAgbWFnYiA9IGdmX2RlZyhiKTsKLQotICAgLyogc3BlY2lhbCBjYXNlcyAqLwotICAgaWYgKG1hZ2IgPiBtYWcpIHsKLSAgICAgIGdmX2NvcHkoYSwgcik7Ci0gICAgICBnZl96ZXJvKHEpOwotICAgICAgcmV0dXJuOwotICAgfQotICAgaWYgKG1hZ2IgPT0gLTEpIHsKLSAgICAgIHJldHVybjsKLSAgIH0KLQotICAgLyogY29weSBsb2NhbGx5ICovCi0gICBnZl9jb3B5KGEsIHRhKTsKLSAgIGdmX2NvcHkoYiwgdGIpOwotICAgZ2ZfemVybyhxKTsKLQotICAgLyogbWFrZSBzaGlmdGVkIHZlcnNpb25zIG9mICJiIiAqLwotICAgZ2ZfY29weSh0Yiwgc2hpZnRzWzBdKTsKLSAgIGZvciAoaSA9IDE7IGkgPD0gKG1hZy1tYWdiKTsgaSsrKSAKLSAgICAgICBnZl9zaGwoc2hpZnRzW2ktMV0sIHNoaWZ0c1tpXSk7Ci0KLSAgIHdoaWxlIChtYWcgPj0gbWFnYikgewotICAgICAgIGkgPSAobWFnIC0gbWFnYik7Ci0gICAgICAgcVtpPj41XSB8PSAoMTw8KGkmMzEpKTsKLSAgICAgICBnZl9hZGQodGEsIHNoaWZ0c1tpXSwgdGEpOwotICAgICAgIG1hZyA9IGdmX2RlZyh0YSk7Ci0gICB9Ci0gICBnZl9jb3B5KHRhLCByKTsKLSAgIGdmX3plcm8odGEpOwotICAgZ2ZfemVybyh0Yik7Ci0gICB6ZXJvbWVtKHNoaWZ0cywgc2l6ZW9mKHNoaWZ0cykpOwotfQotCi0vKiBiID0gYSBtb2QgbSAqLwotdm9pZCBnZl9tb2QoZ2ZfaW50cCBhLCBnZl9pbnRwIG0sIGdmX2ludHAgYikKLXsKLSAgIGdmX2ludCB0bXA7Ci0gICBnZl9kaXYoYSxtLHRtcCxiKTsKLSAgIGdmX3plcm8odG1wKTsKLX0KLQotLyogYyA9IGFiIChtb2QgbSkgKi8KLXZvaWQgZ2ZfbXVsbW9kKGdmX2ludHAgYSwgZ2ZfaW50cCBiLCBnZl9pbnRwIG0sIGdmX2ludHAgYykKLXsKLSAgIGdmX2ludCB0bXA7Ci0gICBnZl9tdWwoYSwgYiwgdG1wKTsKLSAgIGdmX21vZCh0bXAsIG0sIGMpOwotICAgZ2ZfemVybyh0bXApOwotfQotCi0vKiBCID0gMS9BIG1vZCBNICovCi12b2lkIGdmX2ludm1vZChnZl9pbnRwIEEsIGdmX2ludHAgTSwgZ2ZfaW50cCBCKQotewotICBnZl9pbnQgbSwgbiwgcDAsIHAxLCBwMiwgciwgcSwgdG1wOwotCi0gIC8qIHB1dCBhbGwgdmFyaWFibGVzIGluIGtub3duIHNldHVwIHN0YXRlICovCi0gIGdmX3plcm8ocDApOwotICBnZl96ZXJvKHAyKTsKLSAgZ2ZfY29weShNLCBtKTsKLSAgZ2ZfY29weShBLCBuKTsKLSAgcDBbMF0gPSAxOwotICBnZl9kaXYobSwgbiwgcDEsIHIpOwotICBnZl9jb3B5KHAxLCBxKTsKLQotICAvKiBsb29wIHVudGlsIHIgPT0gMCAqLwotICB3aGlsZSAoIWdmX2lzemVybyhyKSkgewotICAgICBnZl9jb3B5KG4sIG0pOwotICAgICBnZl9jb3B5KHIsIG4pOwotICAgICBnZl9kaXYobSwgbiwgcSwgcik7Ci0gICAgIGdmX211bChxLCBwMSwgdG1wKTsKLSAgICAgZ2ZfYWRkKHRtcCwgcDAsIHAyKTsKLSAgICAgZ2ZfY29weShwMSwgcDApOwotICAgICBnZl9jb3B5KHAyLCBwMSk7Ci0gIH0KLSAgZ2ZfY29weShwMCwgQik7Ci0gIGdmX3plcm8ocDApOwotfQotCi0vKiBmaW5kIGEgc3F1YXJlIHJvb3QgbW9kdWxvIGEgcHJpbWUuICBOb3RlIHRoZSBudW1iZXIgb2YgCi0gKiBlbGVtZW50cyBpcyAyXmsgLSAxLCBzbyB3ZSBtdXN0IHNxdWFyZSBrLTIgdGltZXMgdG8gZ2V0IHRoZQotICogc3F1YXJlIHJvb3QuLiAKLSAqLwotdm9pZCBnZl9zcXJ0KGdmX2ludHAgYSwgZ2ZfaW50cCBNLCBnZl9pbnRwIGIpCi17Ci0gICBpbnQgazsKLSAgIGsgPSBnZl9kZWcoTSktMjsKLSAgIGdmX2NvcHkoYSwgYik7Ci0gICB3aGlsZSAoay0tKQotICAgICAgZ2ZfbXVsbW9kKGIsIGIsIE0sIGIpOwotfQotCi0vKiBjID0gZ2NkKEEsQikgKi8KLXZvaWQgZ2ZfZ2NkKGdmX2ludHAgQSwgZ2ZfaW50cCBCLCBnZl9pbnRwIGMpCi17Ci0gICBnZl9pbnQgYSwgYiwgcjsKLSAgIGludCBuOwotCi0gICBnZl9hZGQoQSwgQiwgcik7Ci0gICBuID0gZ2ZfZGVnKHIpOwotICAgaWYgKGdmX2RlZyhBKSA+IG4pIHsKLSAgICAgIGdmX2NvcHkoQSwgYSk7Ci0gICAgICBnZl9jb3B5KEIsIGIpOwotICAgfSBlbHNlIHsKLSAgICAgIGdmX2NvcHkoQSwgYik7Ci0gICAgICBnZl9jb3B5KEIsIGEpOwotICAgfQotCi0gICBkbyB7Ci0gICAgICBnZl9tb2QoYSwgYiwgcik7Ci0gICAgICBnZl9jb3B5KGIsIGEpOwotICAgICAgZ2ZfY29weShyLCBiKTsKLSAgIH0gd2hpbGUgKCFnZl9pc3plcm8ocikpOwotICAgZ2ZfY29weShhLCBjKTsKLSAgIGdmX3plcm8oYSk7Ci0gICBnZl96ZXJvKGIpOwotfQotCi0vKiByZXR1cm5zIG5vbi16ZXJvIGlmICdhJyBpcyBpcnJlZHVjaWJsZSAqLwotaW50IGdmX2lzX3ByaW1lKGdmX2ludHAgYSkKLXsKLSAgIGdmX2ludCB1LCB0bXA7Ci0gICBpbnQgbSwgbjsKLQotICAgZ2ZfemVybyh1KTsKLSAgIHVbMF0gPSAyOwkJCS8qIHUoeCkgPSB4ICovCi0gICBtID0gZ2ZfZGVnKGEpOwotICAgZm9yIChuID0gMDsgbiA8IChtLzIpOyBuKyspIHsgCi0gICAgICAgZ2ZfbXVsbW9kKHUsIHUsIGEsIHUpOyAgIC8qIHUoeCkgPSB1KHgpXjIgbW9kIGEoeCkgKi8KLSAgICAgICBnZl9jb3B5KHUsIHRtcCk7Ci0gICAgICAgdG1wWzBdIF49IDI7CQkvKiB0bXAoeCkgPSB1KHgpIC0geCAqLwotICAgICAgIGdmX2djZCh0bXAsIGEsIHRtcCk7ICAgICAvKiB0bXAoeCkgPSBnY2QoYSh4KSwgdSh4KSAtIHgpICovCi0gICAgICAgaWYgKCFnZl9pc29uZSh0bXApKSB7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgfQotICAgfQotICAgcmV0dXJuIDE7Ci19ICAKLQotLyogcmV0dXJucyBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhIGdmX2ludCAqLwotaW50IGdmX3NpemUoZ2ZfaW50cCBhKQotewotICAgaW50IG47Ci0KLSAgIG4gPSBnZl9kZWcoYSk7Ci0gICBpZiAobiA9PSAtMSkgewotICAgICAgcmV0dXJuIDQ7Ci0gICB9Ci0gICBuID0gbiArICgzMiAtIChuJjMxKSk7Ci0gICByZXR1cm4gbi84OwotfQotCi0vKiBzdG9yZSBhIGdmX2ludCAqLwotdm9pZCBnZl90b3JhdyhnZl9pbnRwIGEsIHVuc2lnbmVkIGNoYXIgKmRzdCkKLXsKLSAgIGludCB4LCBuOwotICAgbiA9IGdmX3NpemUoYSkvNDsKLSAgIGZvciAoeCA9IDA7IHggPCBuOyB4KyspIHsKLSAgICAgICBTVE9SRTMyTChhW3hdLCBkc3QpOwotICAgICAgIGRzdCArPSA0OwotICAgfQotfQotCi0vKiByZWFkIGEgZ2ZfaW50IChsZW4gPT0gaW4gYnl0ZXMpICovCi12b2lkIGdmX3JlYWRyYXcoZ2ZfaW50cCBhLCB1bnNpZ25lZCBjaGFyICpzdHIsIGludCBsZW4pCi17Ci0gICBpbnQgeDsKLSAgIGdmX3plcm8oYSk7Ci0gICBmb3IgKHggPSAwOyB4IDwgbGVuLzQ7IHgrKykgewotICAgICAgIExPQUQzMkwoYVt4XSwgc3RyKTsKLSAgICAgICBzdHIgKz0gNDsKLSAgIH0KLX0KLQotI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvaGFzaF9maWxlLmMgYi9oYXNoX2ZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxMWYyYy4uMDAwMDAwMAotLS0gYS9oYXNoX2ZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotaW50IGhhc2hfZmlsZShpbnQgaGFzaCwgY29uc3QgY2hhciAqZm5hbWUsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQotewotI2lmZGVmIE5PX0ZJTEUKLSAgICByZXR1cm4gQ1JZUFRfTk9QOwotI2Vsc2UKLSAgICBGSUxFICppbjsKLSAgICBpbnQgZXJyOwotICAgIF9BUkdDSEsoZm5hbWUgICE9IE5VTEwpOwotICAgIF9BUkdDSEsoZHN0ICAgICE9IE5VTEwpOwotICAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotCi0gICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGhhc2gpKSAhPSBDUllQVF9PSykgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGluID0gZm9wZW4oZm5hbWUsICJyYiIpOwotICAgIGlmIChpbiA9PSBOVUxMKSB7IAotICAgICAgIHJldHVybiBDUllQVF9GSUxFX05PVEZPVU5EOwotICAgIH0KLQotICAgIGVyciA9IGhhc2hfZmlsZWhhbmRsZShoYXNoLCBpbiwgZHN0LCBvdXRsZW4pOwotICAgIGlmIChmY2xvc2UoaW4pICE9IDApIHsKLSAgICAgICByZXR1cm4gQ1JZUFRfRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLSNlbmRpZgotfQotCmRpZmYgLS1naXQgYS9oYXNoX2ZpbGVoYW5kbGUuYyBiL2hhc2hfZmlsZWhhbmRsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTZiZTkwLi4wMDAwMDAwCi0tLSBhL2hhc2hfZmlsZWhhbmRsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi1pbnQgaGFzaF9maWxlaGFuZGxlKGludCBoYXNoLCBGSUxFICppbiwgdW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0jaWZkZWYgTk9fRklMRQotICAgIHJldHVybiBDUllQVF9OT1A7Ci0jZWxzZQotICAgIGhhc2hfc3RhdGUgbWQ7Ci0gICAgdW5zaWduZWQgY2hhciBidWZbNTEyXTsKLSAgICBzaXplX3QgeDsKLSAgICBpbnQgZXJyOwotCi0gICAgX0FSR0NISyhkc3QgICAgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7Ci0KLSAgICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaCkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKCpvdXRsZW4gPCBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uaGFzaHNpemUpIHsKLSAgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgIH0KLSAgICAqb3V0bGVuID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplOwotCi0gICAgaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmluaXQoJm1kKTsKLSAgICBkbyB7Ci0gICAgICAgIHggPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBpbik7Ci0gICAgICAgIGhhc2hfZGVzY3JpcHRvcltoYXNoXS5wcm9jZXNzKCZtZCwgYnVmLCB4KTsKLSAgICB9IHdoaWxlICh4ID09IHNpemVvZihidWYpKTsKLSAgICBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uZG9uZSgmbWQsIGRzdCk7Ci0KLSNpZmRlZiBDTEVBTl9TVEFDSwotICAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0jZW5kaWYKLSAgICByZXR1cm4gQ1JZUFRfT0s7Ci0jZW5kaWYKLX0KLQpkaWZmIC0tZ2l0IGEvaGFzaF9tZW1vcnkuYyBiL2hhc2hfbWVtb3J5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmExNDUuLjAwMDAwMDAKLS0tIGEvaGFzaF9tZW1vcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotaW50IGhhc2hfbWVtb3J5KGludCBoYXNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0gICAgaGFzaF9zdGF0ZSBtZDsKLSAgICBpbnQgZXJyOwotCi0gICAgX0FSR0NISyhkYXRhICAgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhkc3QgICAgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7Ci0KLSAgICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaCkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKCpvdXRsZW4gPCBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uaGFzaHNpemUpIHsKLSAgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgIH0KLSAgICAqb3V0bGVuID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplOwotCi0gICAgaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmluaXQoJm1kKTsKLSAgICBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0ucHJvY2VzcygmbWQsIGRhdGEsIGxlbik7Ci0gICAgaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmRvbmUoJm1kLCBkc3QpOwotICAgIHJldHVybiBDUllQVF9PSzsKLX0KZGlmZiAtLWdpdCBhL2htYWNfZG9uZS5jIGIvaG1hY19kb25lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZWJiY2QuLjAwMDAwMDAKLS0tIGEvaG1hY19kb25lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLS8qIFN1Ym1pdGVkIGJ5IERvYmVzIFZhbmRlcm1lZXIgIChkb2Jlc0BzbWFydHQuY29tKSAqLwotCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0vKgotICAgICgxKSBhcHBlbmQgemVyb3MgdG8gdGhlIGVuZCBvZiBLIHRvIGNyZWF0ZSBhIEIgYnl0ZSBzdHJpbmcKLSAgICAgICAgKGUuZy4sIGlmIEsgaXMgb2YgbGVuZ3RoIDIwIGJ5dGVzIGFuZCBCPTY0LCB0aGVuIEsgd2lsbCBiZQotICAgICAgICAgYXBwZW5kZWQgd2l0aCA0NCB6ZXJvIGJ5dGVzIDB4MDApCi0gICAgKDIpIFhPUiAoYml0d2lzZSBleGNsdXNpdmUtT1IpIHRoZSBCIGJ5dGUgc3RyaW5nIGNvbXB1dGVkIGluIHN0ZXAKLSAgICAgICAgKDEpIHdpdGggaXBhZCAoaXBhZCA9IHRoZSBieXRlIDB4MzYgcmVwZWF0ZWQgQiB0aW1lcykKLSAgICAoMykgYXBwZW5kIHRoZSBzdHJlYW0gb2YgZGF0YSAndGV4dCcgdG8gdGhlIEIgYnl0ZSBzdHJpbmcgcmVzdWx0aW5nCi0gICAgICAgIGZyb20gc3RlcCAoMikKLSAgICAoNCkgYXBwbHkgSCB0byB0aGUgc3RyZWFtIGdlbmVyYXRlZCBpbiBzdGVwICgzKQotICAgICg1KSBYT1IgKGJpdHdpc2UgZXhjbHVzaXZlLU9SKSB0aGUgQiBieXRlIHN0cmluZyBjb21wdXRlZCBpbgotICAgICAgICBzdGVwICgxKSB3aXRoIG9wYWQgKG9wYWQgPSB0aGUgYnl0ZSAweDVDIHJlcGVhdGVkIEIgdGltZXMuKQotICAgICg2KSBhcHBlbmQgdGhlIEggcmVzdWx0IGZyb20gc3RlcCAoNCkgdG8gdGhlIEIgYnl0ZSBzdHJpbmcKLSAgICAgICAgcmVzdWx0aW5nIGZyb20gc3RlcCAoNSkKLSAgICAoNykgYXBwbHkgSCB0byB0aGUgc3RyZWFtIGdlbmVyYXRlZCBpbiBzdGVwICg2KSBhbmQgb3V0cHV0Ci0gICAgICAgIHRoZSByZXN1bHQKLSovCi0KLSNpZmRlZiBITUFDCi0KLSNkZWZpbmUgSE1BQ19CTE9DS1NJWkUgaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmJsb2Nrc2l6ZQotCi1pbnQgaG1hY19kb25lKGhtYWNfc3RhdGUgKmhtYWMsIHVuc2lnbmVkIGNoYXIgKmhhc2hPdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZltNQVhCTE9DS1NJWkVdOwotICAgIHVuc2lnbmVkIGNoYXIgaXNoYVtNQVhCTE9DS1NJWkVdOwotICAgIHVuc2lnbmVkIGxvbmcgaGFzaHNpemUsIGk7Ci0gICAgaW50IGhhc2gsIGVycjsKLQotICAgIF9BUkdDSEsoaG1hYyAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGhhc2hPdXQgIT0gTlVMTCk7Ci0KLSAgICBoYXNoID0gaG1hYy0+aGFzaDsKLSAgICBpZigoZXJyID0gaGFzaF9pc192YWxpZChoYXNoKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiBnZXQgdGhlIGhhc2ggbWVzc2FnZSBkaWdlc3Qgc2l6ZSAqLwotICAgIGhhc2hzaXplID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplOwotCi0gICAgLy8gR2V0IHRoZSBoYXNoIG9mIHRoZSBmaXJzdCBITUFDIHZlY3RvciBwbHVzIHRoZSBkYXRhCi0gICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uZG9uZSgmaG1hYy0+bWQsIGlzaGEpKSAhPSBDUllQVF9PSykgewotICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHRoZSBzZWNvbmQgSE1BQyB2ZWN0b3IgdmVjdG9yIGZvciBzdGVwICgzKQotICAgIGZvcihpPTA7IGkgPCBITUFDX0JMT0NLU0laRTsgaSsrKSB7Ci0gICAgICAgIGJ1ZltpXSA9IGhtYWMtPmtleVtpXSBeIDB4NUM7Ci0gICAgfQotCi0gICAgLy8gTm93IGNhbGN1bGF0ZSB0aGUgIm91dGVyIiBoYXNoIGZvciBzdGVwICg1KSwgKDYpLCBhbmQgKDcpCi0gICAgaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmluaXQoJmhtYWMtPm1kKTsKLSAgICBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0ucHJvY2VzcygmaG1hYy0+bWQsIGJ1ZiwgSE1BQ19CTE9DS1NJWkUpOwotICAgIGhhc2hfZGVzY3JpcHRvcltoYXNoXS5wcm9jZXNzKCZobWFjLT5tZCwgaXNoYSwgaGFzaHNpemUpOwotICAgIGhhc2hfZGVzY3JpcHRvcltoYXNoXS5kb25lKCZobWFjLT5tZCwgYnVmKTsKLQotICAgIC8vIGNvcHkgdG8gb3V0cHV0IAotICAgIGZvciAoaSA9IDA7IGkgPCBoYXNoc2l6ZSAmJiBpIDwgKm91dGxlbjsgaSsrKSB7Ci0gICAgICAgIGhhc2hPdXRbaV0gPSBidWZbaV07Ci0gICAgfQotICAgICpvdXRsZW4gPSBpOwotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgICB6ZXJvbWVtKGlzaGEsIHNpemVvZihidWYpKTsKLSAgICB6ZXJvbWVtKGJ1ZiwgIHNpemVvZihpc2hhKSk7Ci0gICAgemVyb21lbShobWFjLCBzaXplb2YoKmhtYWMpKTsKLSNlbmRpZgotICAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9obWFjX2ZpbGUuYyBiL2htYWNfZmlsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE5NGJkLi4wMDAwMDAwCi0tLSBhL2htYWNfZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0vKiBTdWJtaXRlZCBieSBEb2JlcyBWYW5kZXJtZWVyICAoZG9iZXNAc21hcnR0LmNvbSkgKi8KLQotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotLyoKLSAgICAoMSkgYXBwZW5kIHplcm9zIHRvIHRoZSBlbmQgb2YgSyB0byBjcmVhdGUgYSBCIGJ5dGUgc3RyaW5nCi0gICAgICAgIChlLmcuLCBpZiBLIGlzIG9mIGxlbmd0aCAyMCBieXRlcyBhbmQgQj02NCwgdGhlbiBLIHdpbGwgYmUKLSAgICAgICAgIGFwcGVuZGVkIHdpdGggNDQgemVybyBieXRlcyAweDAwKQotICAgICgyKSBYT1IgKGJpdHdpc2UgZXhjbHVzaXZlLU9SKSB0aGUgQiBieXRlIHN0cmluZyBjb21wdXRlZCBpbiBzdGVwCi0gICAgICAgICgxKSB3aXRoIGlwYWQgKGlwYWQgPSB0aGUgYnl0ZSAweDM2IHJlcGVhdGVkIEIgdGltZXMpCi0gICAgKDMpIGFwcGVuZCB0aGUgc3RyZWFtIG9mIGRhdGEgJ3RleHQnIHRvIHRoZSBCIGJ5dGUgc3RyaW5nIHJlc3VsdGluZwotICAgICAgICBmcm9tIHN0ZXAgKDIpCi0gICAgKDQpIGFwcGx5IEggdG8gdGhlIHN0cmVhbSBnZW5lcmF0ZWQgaW4gc3RlcCAoMykKLSAgICAoNSkgWE9SIChiaXR3aXNlIGV4Y2x1c2l2ZS1PUikgdGhlIEIgYnl0ZSBzdHJpbmcgY29tcHV0ZWQgaW4KLSAgICAgICAgc3RlcCAoMSkgd2l0aCBvcGFkIChvcGFkID0gdGhlIGJ5dGUgMHg1QyByZXBlYXRlZCBCIHRpbWVzLikKLSAgICAoNikgYXBwZW5kIHRoZSBIIHJlc3VsdCBmcm9tIHN0ZXAgKDQpIHRvIHRoZSBCIGJ5dGUgc3RyaW5nCi0gICAgICAgIHJlc3VsdGluZyBmcm9tIHN0ZXAgKDUpCi0gICAgKDcpIGFwcGx5IEggdG8gdGhlIHN0cmVhbSBnZW5lcmF0ZWQgaW4gc3RlcCAoNikgYW5kIG91dHB1dAotICAgICAgICB0aGUgcmVzdWx0Ci0qLwotCi0jaWZkZWYgSE1BQwotCi0jZGVmaW5lIEhNQUNfQkxPQ0tTSVpFIGhhc2hfZGVzY3JpcHRvcltoYXNoXS5ibG9ja3NpemUKLQotLyogaG1hY19maWxlIGFkZGVkIGJ5IFRvbSBTdCBEZW5pcyAqLwotaW50IGhtYWNfZmlsZShpbnQgaGFzaCwgY29uc3QgY2hhciAqZm5hbWUsIAotICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLCAKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBsb25nICpkc3RsZW4pCi17Ci0jaWZkZWYgTk9fRklMRQotICAgIHJldHVybiBDUllQVF9OT1A7Ci0jZWxzZQotICAgaG1hY19zdGF0ZSBobWFjOwotICAgRklMRSAqaW47Ci0gICB1bnNpZ25lZCBjaGFyIGJ1Zls1MTJdOwotICAgc2l6ZV90IHg7Ci0gICBpbnQgZXJyOwotCi0gICBfQVJHQ0hLKGZuYW1lICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhkc3QgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGRzdGxlbiAhPSBOVUxMKTsKLSAgIAotICAgaWYoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaCkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgaWYgKChlcnIgPSBobWFjX2luaXQoJmhtYWMsIGhhc2gsIGtleSwga2V5bGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICBpbiA9IGZvcGVuKGZuYW1lLCAicmIiKTsKLSAgIGlmIChpbiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfRklMRV9OT1RGT1VORDsKLSAgIH0KLQotICAgLyogcHJvY2VzcyB0aGUgZmlsZSBjb250ZW50cyAqLwotICAgZG8gewotICAgICAgeCA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGluKTsKLSAgICAgIGlmICgoZXJyID0gaG1hY19wcm9jZXNzKCZobWFjLCBidWYsICh1bnNpZ25lZCBsb25nKXgpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgLyogd2UgZG9uJ3QgdHJhcCB0aGlzIGVycm9yIHNpbmNlIHdlJ3JlIGFscmVhZHkgcmV0dXJuaW5nIGFuIGVycm9yISAqLwotICAgICAgICAgZmNsb3NlKGluKTsKLSAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICB9Ci0gICB9IHdoaWxlICh4ID09IHNpemVvZihidWYpKTsKLQotICAgaWYgKGZjbG9zZShpbikgIT0gMCkgewotICAgICAgcmV0dXJuIENSWVBUX0VSUk9SOwotICAgfQotCi0gICAvKiBnZXQgZmluYWwgaG1hYyAqLwotICAgaWYgKChlcnIgPSBobWFjX2RvbmUoJmhtYWMsIGRzdCwgZHN0bGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSNpZmRlZiBDTEVBTl9TVEFDSwotICAgLyogY2xlYXIgbWVtb3J5ICovCi0gICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotI2VuZGlmICAgCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci0jZW5kaWYKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2htYWNfaW5pdC5jIGIvaG1hY19pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOWI4MDEuLjAwMDAwMDAKLS0tIGEvaG1hY19pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLS8qIFN1Ym1pdGVkIGJ5IERvYmVzIFZhbmRlcm1lZXIgIChkb2Jlc0BzbWFydHQuY29tKSAqLwotCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0vKgotICAgICgxKSBhcHBlbmQgemVyb3MgdG8gdGhlIGVuZCBvZiBLIHRvIGNyZWF0ZSBhIEIgYnl0ZSBzdHJpbmcKLSAgICAgICAgKGUuZy4sIGlmIEsgaXMgb2YgbGVuZ3RoIDIwIGJ5dGVzIGFuZCBCPTY0LCB0aGVuIEsgd2lsbCBiZQotICAgICAgICAgYXBwZW5kZWQgd2l0aCA0NCB6ZXJvIGJ5dGVzIDB4MDApCi0gICAgKDIpIFhPUiAoYml0d2lzZSBleGNsdXNpdmUtT1IpIHRoZSBCIGJ5dGUgc3RyaW5nIGNvbXB1dGVkIGluIHN0ZXAKLSAgICAgICAgKDEpIHdpdGggaXBhZCAoaXBhZCA9IHRoZSBieXRlIDB4MzYgcmVwZWF0ZWQgQiB0aW1lcykKLSAgICAoMykgYXBwZW5kIHRoZSBzdHJlYW0gb2YgZGF0YSAndGV4dCcgdG8gdGhlIEIgYnl0ZSBzdHJpbmcgcmVzdWx0aW5nCi0gICAgICAgIGZyb20gc3RlcCAoMikKLSAgICAoNCkgYXBwbHkgSCB0byB0aGUgc3RyZWFtIGdlbmVyYXRlZCBpbiBzdGVwICgzKQotICAgICg1KSBYT1IgKGJpdHdpc2UgZXhjbHVzaXZlLU9SKSB0aGUgQiBieXRlIHN0cmluZyBjb21wdXRlZCBpbgotICAgICAgICBzdGVwICgxKSB3aXRoIG9wYWQgKG9wYWQgPSB0aGUgYnl0ZSAweDVDIHJlcGVhdGVkIEIgdGltZXMuKQotICAgICg2KSBhcHBlbmQgdGhlIEggcmVzdWx0IGZyb20gc3RlcCAoNCkgdG8gdGhlIEIgYnl0ZSBzdHJpbmcKLSAgICAgICAgcmVzdWx0aW5nIGZyb20gc3RlcCAoNSkKLSAgICAoNykgYXBwbHkgSCB0byB0aGUgc3RyZWFtIGdlbmVyYXRlZCBpbiBzdGVwICg2KSBhbmQgb3V0cHV0Ci0gICAgICAgIHRoZSByZXN1bHQKLSovCi0KLSNpZmRlZiBITUFDCi0KLSNkZWZpbmUgSE1BQ19CTE9DS1NJWkUgaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmJsb2Nrc2l6ZQotCi1pbnQgaG1hY19pbml0KGhtYWNfc3RhdGUgKmhtYWMsIGludCBoYXNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuKQotewotICAgIHVuc2lnbmVkIGNoYXIgYnVmW01BWEJMT0NLU0laRV07Ci0gICAgdW5zaWduZWQgbG9uZyBoYXNoc2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nIGksIHo7Ci0gICAgaW50IGVycjsKLQotICAgIF9BUkdDSEsoaG1hYyAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLQotICAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICAvKiB2YWxpZCBrZXkgbGVuZ3RoPyAqLwotICAgIGlmIChrZXlsZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOwotICAgIH0KLQotICAgIGhtYWMtPmhhc2ggPSBoYXNoOwotCi0gICAgLy8gKDEpIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgbGFyZ2UgZW5vdWdoIGtleQotICAgIGhhc2hzaXplID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplOwotICAgIGlmKGtleWxlbiA+IEhNQUNfQkxPQ0tTSVpFKSB7Ci0gICAgICAgIHogPSAodW5zaWduZWQgbG9uZylzaXplb2YoaG1hYy0+a2V5KTsKLSAgICAgICAgaWYgKChlcnIgPSBoYXNoX21lbW9yeShoYXNoLCBrZXksIGtleWxlbiwgaG1hYy0+a2V5LCAmeikpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoaGFzaHNpemUgPCBITUFDX0JMT0NLU0laRSkgewotICAgICAgICAgICAgemVyb21lbSgoaG1hYy0+a2V5KSArIGhhc2hzaXplLCAoc2l6ZV90KShITUFDX0JMT0NLU0laRSAtIGhhc2hzaXplKSk7Ci0gICAgICAgIH0KLSAgICAgICAga2V5bGVuID0gaGFzaHNpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWVtY3B5KGhtYWMtPmtleSwga2V5LCAoc2l6ZV90KWtleWxlbik7Ci0gICAgICAgIGlmKGtleWxlbiA8IEhNQUNfQkxPQ0tTSVpFKSB7Ci0gICAgICAgICAgICB6ZXJvbWVtKChobWFjLT5rZXkpICsga2V5bGVuLCAoc2l6ZV90KShITUFDX0JMT0NLU0laRSAtIGtleWxlbikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHRoZSBpbml0aWFsIHZlY3RvciBmb3Igc3RlcCAoMykKLSAgICBmb3IoaT0wOyBpIDwgSE1BQ19CTE9DS1NJWkU7ICAgaSsrKSB7Ci0gICAgICAgYnVmW2ldID0gaG1hYy0+a2V5W2ldIF4gMHgzNjsKLSAgICB9Ci0KLSAgICAvLyBQcmUtcGVuZCB0aGF0IHRvIHRoZSBoYXNoIGRhdGEKLSAgICBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uaW5pdCgmaG1hYy0+bWQpOwotICAgIGhhc2hfZGVzY3JpcHRvcltoYXNoXS5wcm9jZXNzKCZobWFjLT5tZCwgYnVmLCBITUFDX0JMT0NLU0laRSk7Ci0KLSAgICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaG1hY19tZW1vcnkuYyBiL2htYWNfbWVtb3J5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MzhhMzAuLjAwMDAwMDAKLS0tIGEvaG1hY19tZW1vcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotLyogU3VibWl0ZWQgYnkgRG9iZXMgVmFuZGVybWVlciAgKGRvYmVzQHNtYXJ0dC5jb20pICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLS8qCi0gICAgKDEpIGFwcGVuZCB6ZXJvcyB0byB0aGUgZW5kIG9mIEsgdG8gY3JlYXRlIGEgQiBieXRlIHN0cmluZwotICAgICAgICAoZS5nLiwgaWYgSyBpcyBvZiBsZW5ndGggMjAgYnl0ZXMgYW5kIEI9NjQsIHRoZW4gSyB3aWxsIGJlCi0gICAgICAgICBhcHBlbmRlZCB3aXRoIDQ0IHplcm8gYnl0ZXMgMHgwMCkKLSAgICAoMikgWE9SIChiaXR3aXNlIGV4Y2x1c2l2ZS1PUikgdGhlIEIgYnl0ZSBzdHJpbmcgY29tcHV0ZWQgaW4gc3RlcAotICAgICAgICAoMSkgd2l0aCBpcGFkIChpcGFkID0gdGhlIGJ5dGUgMHgzNiByZXBlYXRlZCBCIHRpbWVzKQotICAgICgzKSBhcHBlbmQgdGhlIHN0cmVhbSBvZiBkYXRhICd0ZXh0JyB0byB0aGUgQiBieXRlIHN0cmluZyByZXN1bHRpbmcKLSAgICAgICAgZnJvbSBzdGVwICgyKQotICAgICg0KSBhcHBseSBIIHRvIHRoZSBzdHJlYW0gZ2VuZXJhdGVkIGluIHN0ZXAgKDMpCi0gICAgKDUpIFhPUiAoYml0d2lzZSBleGNsdXNpdmUtT1IpIHRoZSBCIGJ5dGUgc3RyaW5nIGNvbXB1dGVkIGluCi0gICAgICAgIHN0ZXAgKDEpIHdpdGggb3BhZCAob3BhZCA9IHRoZSBieXRlIDB4NUMgcmVwZWF0ZWQgQiB0aW1lcy4pCi0gICAgKDYpIGFwcGVuZCB0aGUgSCByZXN1bHQgZnJvbSBzdGVwICg0KSB0byB0aGUgQiBieXRlIHN0cmluZwotICAgICAgICByZXN1bHRpbmcgZnJvbSBzdGVwICg1KQotICAgICg3KSBhcHBseSBIIHRvIHRoZSBzdHJlYW0gZ2VuZXJhdGVkIGluIHN0ZXAgKDYpIGFuZCBvdXRwdXQKLSAgICAgICAgdGhlIHJlc3VsdAotKi8KLQotI2lmZGVmIEhNQUMKLQotI2RlZmluZSBITUFDX0JMT0NLU0laRSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uYmxvY2tzaXplCi0KLWludCBobWFjX21lbW9yeShpbnQgaGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBsb25nIGxlbiwgCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBsb25nICpkc3RsZW4pCi17Ci0gICAgaG1hY19zdGF0ZSBobWFjOwotICAgIGludCBlcnI7Ci0KLSAgICBfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGRhdGEgICAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGRzdCAgICAhPSBOVUxMKTsgCi0gICAgX0FSR0NISyhkc3RsZW4gIT0gTlVMTCk7Ci0gICAgCi0gICAgaWYoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaCkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKChlcnIgPSBobWFjX2luaXQoJmhtYWMsIGhhc2gsIGtleSwga2V5bGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoKGVyciA9IGhtYWNfcHJvY2VzcygmaG1hYywgZGF0YSwgbGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmICgoZXJyID0gaG1hY19kb25lKCZobWFjLCBkc3QsIGRzdGxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvaG1hY19wcm9jZXNzLmMgYi9obWFjX3Byb2Nlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0YzFlNi4uMDAwMDAwMAotLS0gYS9obWFjX3Byb2Nlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotLyogU3VibWl0ZWQgYnkgRG9iZXMgVmFuZGVybWVlciAgKGRvYmVzQHNtYXJ0dC5jb20pICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLS8qCi0gICAgKDEpIGFwcGVuZCB6ZXJvcyB0byB0aGUgZW5kIG9mIEsgdG8gY3JlYXRlIGEgQiBieXRlIHN0cmluZwotICAgICAgICAoZS5nLiwgaWYgSyBpcyBvZiBsZW5ndGggMjAgYnl0ZXMgYW5kIEI9NjQsIHRoZW4gSyB3aWxsIGJlCi0gICAgICAgICBhcHBlbmRlZCB3aXRoIDQ0IHplcm8gYnl0ZXMgMHgwMCkKLSAgICAoMikgWE9SIChiaXR3aXNlIGV4Y2x1c2l2ZS1PUikgdGhlIEIgYnl0ZSBzdHJpbmcgY29tcHV0ZWQgaW4gc3RlcAotICAgICAgICAoMSkgd2l0aCBpcGFkIChpcGFkID0gdGhlIGJ5dGUgMHgzNiByZXBlYXRlZCBCIHRpbWVzKQotICAgICgzKSBhcHBlbmQgdGhlIHN0cmVhbSBvZiBkYXRhICd0ZXh0JyB0byB0aGUgQiBieXRlIHN0cmluZyByZXN1bHRpbmcKLSAgICAgICAgZnJvbSBzdGVwICgyKQotICAgICg0KSBhcHBseSBIIHRvIHRoZSBzdHJlYW0gZ2VuZXJhdGVkIGluIHN0ZXAgKDMpCi0gICAgKDUpIFhPUiAoYml0d2lzZSBleGNsdXNpdmUtT1IpIHRoZSBCIGJ5dGUgc3RyaW5nIGNvbXB1dGVkIGluCi0gICAgICAgIHN0ZXAgKDEpIHdpdGggb3BhZCAob3BhZCA9IHRoZSBieXRlIDB4NUMgcmVwZWF0ZWQgQiB0aW1lcy4pCi0gICAgKDYpIGFwcGVuZCB0aGUgSCByZXN1bHQgZnJvbSBzdGVwICg0KSB0byB0aGUgQiBieXRlIHN0cmluZwotICAgICAgICByZXN1bHRpbmcgZnJvbSBzdGVwICg1KQotICAgICg3KSBhcHBseSBIIHRvIHRoZSBzdHJlYW0gZ2VuZXJhdGVkIGluIHN0ZXAgKDYpIGFuZCBvdXRwdXQKLSAgICAgICAgdGhlIHJlc3VsdAotKi8KLQotI2lmZGVmIEhNQUMKLQotI2RlZmluZSBITUFDX0JMT0NLU0laRSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uYmxvY2tzaXplCi0KLWludCBobWFjX3Byb2Nlc3MoaG1hY19zdGF0ZSAqaG1hYywgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbikKLXsKLSAgICBpbnQgZXJyOwotICAgIF9BUkdDSEsoaG1hYyAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGJ1ZiAhPSBOVUxMKTsKLSAgICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaG1hYy0+aGFzaCkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIHJldHVybiBoYXNoX2Rlc2NyaXB0b3JbaG1hYy0+aGFzaF0ucHJvY2VzcygmaG1hYy0+bWQsIGJ1ZiwgbGVuKTsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2tleXJpbmcuYyBiL2tleXJpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZmMTI4ZC4uMDAwMDAwMAotLS0gYS9rZXlyaW5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NjIgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0vKiBQcm92aWRlcyBrZXlyaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIGxpYnRvbWNyeXB0LCBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlIDxteWNyeXB0Lmg+Ci0KLSNpZmRlZiBLUgotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrZXlfbWFnaWNbNF0gID0geyAweDEyLCAweDM0LCAweDU2LCAweDc4IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmaWxlX21hZ2ljWzRdID0geyAweDlBLCAweEJDLCAweERFLCAweEYwIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzaWduX21hZ2ljWzRdID0geyAweDg3LCAweDU2LCAweDQzLCAweDIxIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBlbmNfbWFnaWNbNF0gID0geyAweDBGLCAweEVELCAweENCLCAweEE5IH07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGNyY190YWJsZVsyNTZdID0gewotICAweDAwMDAwMDAwVUwsIDB4NzcwNzMwOTZVTCwgMHhlZTBlNjEyY1VMLCAweDk5MDk1MWJhVUwsIDB4MDc2ZGM0MTlVTCwKLSAgMHg3MDZhZjQ4ZlVMLCAweGU5NjNhNTM1VUwsIDB4OWU2NDk1YTNVTCwgMHgwZWRiODgzMlVMLCAweDc5ZGNiOGE0VUwsCi0gIDB4ZTBkNWU5MWVVTCwgMHg5N2QyZDk4OFVMLCAweDA5YjY0YzJiVUwsIDB4N2ViMTdjYmRVTCwgMHhlN2I4MmQwN1VMLAotICAweDkwYmYxZDkxVUwsIDB4MWRiNzEwNjRVTCwgMHg2YWIwMjBmMlVMLCAweGYzYjk3MTQ4VUwsIDB4ODRiZTQxZGVVTCwKLSAgMHgxYWRhZDQ3ZFVMLCAweDZkZGRlNGViVUwsIDB4ZjRkNGI1NTFVTCwgMHg4M2QzODVjN1VMLCAweDEzNmM5ODU2VUwsCi0gIDB4NjQ2YmE4YzBVTCwgMHhmZDYyZjk3YVVMLCAweDhhNjVjOWVjVUwsIDB4MTQwMTVjNGZVTCwgMHg2MzA2NmNkOVVMLAotICAweGZhMGYzZDYzVUwsIDB4OGQwODBkZjVVTCwgMHgzYjZlMjBjOFVMLCAweDRjNjkxMDVlVUwsIDB4ZDU2MDQxZTRVTCwKLSAgMHhhMjY3NzE3MlVMLCAweDNjMDNlNGQxVUwsIDB4NGIwNGQ0NDdVTCwgMHhkMjBkODVmZFVMLCAweGE1MGFiNTZiVUwsCi0gIDB4MzViNWE4ZmFVTCwgMHg0MmIyOTg2Y1VMLCAweGRiYmJjOWQ2VUwsIDB4YWNiY2Y5NDBVTCwgMHgzMmQ4NmNlM1VMLAotICAweDQ1ZGY1Yzc1VUwsIDB4ZGNkNjBkY2ZVTCwgMHhhYmQxM2Q1OVVMLCAweDI2ZDkzMGFjVUwsIDB4NTFkZTAwM2FVTCwKLSAgMHhjOGQ3NTE4MFVMLCAweGJmZDA2MTE2VUwsIDB4MjFiNGY0YjVVTCwgMHg1NmIzYzQyM1VMLCAweGNmYmE5NTk5VUwsCi0gIDB4YjhiZGE1MGZVTCwgMHgyODAyYjg5ZVVMLCAweDVmMDU4ODA4VUwsIDB4YzYwY2Q5YjJVTCwgMHhiMTBiZTkyNFVMLAotICAweDJmNmY3Yzg3VUwsIDB4NTg2ODRjMTFVTCwgMHhjMTYxMWRhYlVMLCAweGI2NjYyZDNkVUwsIDB4NzZkYzQxOTBVTCwKLSAgMHgwMWRiNzEwNlVMLCAweDk4ZDIyMGJjVUwsIDB4ZWZkNTEwMmFVTCwgMHg3MWIxODU4OVVMLCAweDA2YjZiNTFmVUwsCi0gIDB4OWZiZmU0YTVVTCwgMHhlOGI4ZDQzM1VMLCAweDc4MDdjOWEyVUwsIDB4MGYwMGY5MzRVTCwgMHg5NjA5YTg4ZVVMLAotICAweGUxMGU5ODE4VUwsIDB4N2Y2YTBkYmJVTCwgMHgwODZkM2QyZFVMLCAweDkxNjQ2Yzk3VUwsIDB4ZTY2MzVjMDFVTCwKLSAgMHg2YjZiNTFmNFVMLCAweDFjNmM2MTYyVUwsIDB4ODU2NTMwZDhVTCwgMHhmMjYyMDA0ZVVMLCAweDZjMDY5NWVkVUwsCi0gIDB4MWIwMWE1N2JVTCwgMHg4MjA4ZjRjMVVMLCAweGY1MGZjNDU3VUwsIDB4NjViMGQ5YzZVTCwgMHgxMmI3ZTk1MFVMLAotICAweDhiYmViOGVhVUwsIDB4ZmNiOTg4N2NVTCwgMHg2MmRkMWRkZlVMLCAweDE1ZGEyZDQ5VUwsIDB4OGNkMzdjZjNVTCwKLSAgMHhmYmQ0NGM2NVVMLCAweDRkYjI2MTU4VUwsIDB4M2FiNTUxY2VVTCwgMHhhM2JjMDA3NFVMLCAweGQ0YmIzMGUyVUwsCi0gIDB4NGFkZmE1NDFVTCwgMHgzZGQ4OTVkN1VMLCAweGE0ZDFjNDZkVUwsIDB4ZDNkNmY0ZmJVTCwgMHg0MzY5ZTk2YVVMLAotICAweDM0NmVkOWZjVUwsIDB4YWQ2Nzg4NDZVTCwgMHhkYTYwYjhkMFVMLCAweDQ0MDQyZDczVUwsIDB4MzMwMzFkZTVVTCwKLSAgMHhhYTBhNGM1ZlVMLCAweGRkMGQ3Y2M5VUwsIDB4NTAwNTcxM2NVTCwgMHgyNzAyNDFhYVVMLCAweGJlMGIxMDEwVUwsCi0gIDB4YzkwYzIwODZVTCwgMHg1NzY4YjUyNVVMLCAweDIwNmY4NWIzVUwsIDB4Yjk2NmQ0MDlVTCwgMHhjZTYxZTQ5ZlVMLAotICAweDVlZGVmOTBlVUwsIDB4MjlkOWM5OThVTCwgMHhiMGQwOTgyMlVMLCAweGM3ZDdhOGI0VUwsIDB4NTliMzNkMTdVTCwKLSAgMHgyZWI0MGQ4MVVMLCAweGI3YmQ1YzNiVUwsIDB4YzBiYTZjYWRVTCwgMHhlZGI4ODMyMFVMLCAweDlhYmZiM2I2VUwsCi0gIDB4MDNiNmUyMGNVTCwgMHg3NGIxZDI5YVVMLCAweGVhZDU0NzM5VUwsIDB4OWRkMjc3YWZVTCwgMHgwNGRiMjYxNVVMLAotICAweDczZGMxNjgzVUwsIDB4ZTM2MzBiMTJVTCwgMHg5NDY0M2I4NFVMLCAweDBkNmQ2YTNlVUwsIDB4N2E2YTVhYThVTCwKLSAgMHhlNDBlY2YwYlVMLCAweDkzMDlmZjlkVUwsIDB4MGEwMGFlMjdVTCwgMHg3ZDA3OWViMVVMLCAweGYwMGY5MzQ0VUwsCi0gIDB4ODcwOGEzZDJVTCwgMHgxZTAxZjI2OFVMLCAweDY5MDZjMmZlVUwsIDB4Zjc2MjU3NWRVTCwgMHg4MDY1NjdjYlVMLAotICAweDE5NmMzNjcxVUwsIDB4NmU2YjA2ZTdVTCwgMHhmZWQ0MWI3NlVMLCAweDg5ZDMyYmUwVUwsIDB4MTBkYTdhNWFVTCwKLSAgMHg2N2RkNGFjY1VMLCAweGY5YjlkZjZmVUwsIDB4OGViZWVmZjlVTCwgMHgxN2I3YmU0M1VMLCAweDYwYjA4ZWQ1VUwsCi0gIDB4ZDZkNmEzZThVTCwgMHhhMWQxOTM3ZVVMLCAweDM4ZDhjMmM0VUwsIDB4NGZkZmYyNTJVTCwgMHhkMWJiNjdmMVVMLAotICAweGE2YmM1NzY3VUwsIDB4M2ZiNTA2ZGRVTCwgMHg0OGIyMzY0YlVMLCAweGQ4MGQyYmRhVUwsIDB4YWYwYTFiNGNVTCwKLSAgMHgzNjAzNGFmNlVMLCAweDQxMDQ3YTYwVUwsIDB4ZGY2MGVmYzNVTCwgMHhhODY3ZGY1NVVMLCAweDMxNmU4ZWVmVUwsCi0gIDB4NDY2OWJlNzlVTCwgMHhjYjYxYjM4Y1VMLCAweGJjNjY4MzFhVUwsIDB4MjU2ZmQyYTBVTCwgMHg1MjY4ZTIzNlVMLAotICAweGNjMGM3Nzk1VUwsIDB4YmIwYjQ3MDNVTCwgMHgyMjAyMTZiOVVMLCAweDU1MDUyNjJmVUwsIDB4YzViYTNiYmVVTCwKLSAgMHhiMmJkMGIyOFVMLCAweDJiYjQ1YTkyVUwsIDB4NWNiMzZhMDRVTCwgMHhjMmQ3ZmZhN1VMLCAweGI1ZDBjZjMxVUwsCi0gIDB4MmNkOTllOGJVTCwgMHg1YmRlYWUxZFVMLCAweDliNjRjMmIwVUwsIDB4ZWM2M2YyMjZVTCwgMHg3NTZhYTM5Y1VMLAotICAweDAyNmQ5MzBhVUwsIDB4OWMwOTA2YTlVTCwgMHhlYjBlMzYzZlVMLCAweDcyMDc2Nzg1VUwsIDB4MDUwMDU3MTNVTCwKLSAgMHg5NWJmNGE4MlVMLCAweGUyYjg3YTE0VUwsIDB4N2JiMTJiYWVVTCwgMHgwY2I2MWIzOFVMLCAweDkyZDI4ZTliVUwsCi0gIDB4ZTVkNWJlMGRVTCwgMHg3Y2RjZWZiN1VMLCAweDBiZGJkZjIxVUwsIDB4ODZkM2QyZDRVTCwgMHhmMWQ0ZTI0MlVMLAotICAweDY4ZGRiM2Y4VUwsIDB4MWZkYTgzNmVVTCwgMHg4MWJlMTZjZFVMLCAweGY2YjkyNjViVUwsIDB4NmZiMDc3ZTFVTCwKLSAgMHgxOGI3NDc3N1VMLCAweDg4MDg1YWU2VUwsIDB4ZmYwZjZhNzBVTCwgMHg2NjA2M2JjYVVMLCAweDExMDEwYjVjVUwsCi0gIDB4OGY2NTllZmZVTCwgMHhmODYyYWU2OVVMLCAweDYxNmJmZmQzVUwsIDB4MTY2Y2NmNDVVTCwgMHhhMDBhZTI3OFVMLAotICAweGQ3MGRkMmVlVUwsIDB4NGUwNDgzNTRVTCwgMHgzOTAzYjNjMlVMLCAweGE3NjcyNjYxVUwsIDB4ZDA2MDE2ZjdVTCwKLSAgMHg0OTY5NDc0ZFVMLCAweDNlNmU3N2RiVUwsIDB4YWVkMTZhNGFVTCwgMHhkOWQ2NWFkY1VMLCAweDQwZGYwYjY2VUwsCi0gIDB4MzdkODNiZjBVTCwgMHhhOWJjYWU1M1VMLCAweGRlYmI5ZWM1VUwsIDB4NDdiMmNmN2ZVTCwgMHgzMGI1ZmZlOVVMLAotICAweGJkYmRmMjFjVUwsIDB4Y2FiYWMyOGFVTCwgMHg1M2IzOTMzMFVMLCAweDI0YjRhM2E2VUwsIDB4YmFkMDM2MDVVTCwKLSAgMHhjZGQ3MDY5M1VMLCAweDU0ZGU1NzI5VUwsIDB4MjNkOTY3YmZVTCwgMHhiMzY2N2EyZVVMLCAweGM0NjE0YWI4VUwsCi0gIDB4NWQ2ODFiMDJVTCwgMHgyYTZmMmI5NFVMLCAweGI0MGJiZTM3VUwsIDB4YzMwYzhlYTFVTCwgMHg1YTA1ZGYxYlVMLAotICAweDJkMDJlZjhkVUwKLX07Ci0KLSNkZWZpbmUgRE8xKGJ1ZikgY3JjID0gY3JjX3RhYmxlWyhjcmMgXiAoKmJ1ZisrKSkgJiAweGZmXSBeIChjcmMgPj4gOCk7Ci0jZGVmaW5lIERPMihidWYpICBETzEoYnVmKTsgRE8xKGJ1Zik7Ci0jZGVmaW5lIERPNChidWYpICBETzIoYnVmKTsgRE8yKGJ1Zik7Ci0jZGVmaW5lIERPOChidWYpICBETzQoYnVmKTsgRE80KGJ1Zik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNyYzMyICh1bnNpZ25lZCBsb25nIGNyYywgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbikKLXsKLSAgLy9fQVJHQ0hLKGJ1ZiAhPSBOVUxMICAmJiBsZW4gPT0gMCk7Ci0gIGNyYyA9IGNyYyBeIDB4ZmZmZmZmZmZMOwotICB3aGlsZSAobGVuID49IDgpIHsKLSAgICAgIERPOCAoYnVmKTsKLSAgICAgIGxlbiAtPSA4OwotICB9Ci0gIAotICBpZiAobGVuID4gMCkgewotICAgIGRvIHsKLQkgICBETzEgKGJ1Zik7Ci0gICAgfSB3aGlsZSAoLS1sZW4gPiAwKTsKLSAgfSAgICAKLSAgcmV0dXJuIGNyYyBeIDB4ZmZmZmZmZmZVTDsKLX0KLQotaW50IGtyX2luaXQocGtfa2V5ICoqcGspCi17Ci0gICBfQVJHQ0hLKHBrICE9IE5VTEwpOwotCi0gICAqcGsgPSBYQ0FMTE9DKDEsIHNpemVvZihwa19rZXkpKTsKLSAgIGlmICgqcGsgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIENSWVBUX01FTTsKLSAgIH0KLSAgICgqcGspLT5zeXN0ZW0gPSBOT05fS0VZOwotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi11bnNpZ25lZCBsb25nIGtyX2NyYyhjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICplbWFpbCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGVzY3JpcHRpb24pCi17Ci0gICB1bnNpZ25lZCBsb25nIGNyYzsKLSAgIF9BUkdDSEsobmFtZSAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoZW1haWwgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGRlc2NyaXB0aW9uICE9IE5VTEwpOwotICAgY3JjID0gY3JjMzIoMFVMLCBOVUxMLCAwVUwpOwotICAgY3JjID0gY3JjMzIoY3JjLCBuYW1lLCAgKHVuc2lnbmVkIGxvbmcpTUlOKE1BWExFTiwgc3RybGVuKChjaGFyICopbmFtZSkpKTsKLSAgIGNyYyA9IGNyYzMyKGNyYywgZW1haWwsICh1bnNpZ25lZCBsb25nKU1JTihNQVhMRU4sIHN0cmxlbigoY2hhciAqKWVtYWlsKSkpOwotICAgcmV0dXJuIGNyYzMyKGNyYywgZGVzY3JpcHRpb24sICh1bnNpZ25lZCBsb25nKU1JTihNQVhMRU4sIHN0cmxlbigoY2hhciAqKWRlc2NyaXB0aW9uKSkpOwotfQotCi1wa19rZXkgKmtyX2ZpbmQocGtfa2V5ICpwaywgdW5zaWduZWQgbG9uZyBJRCkKLXsKLSAgIF9BUkdDSEsocGsgIT0gTlVMTCk7Ci0KLSAgIHdoaWxlIChwayAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChway0+c3lzdGVtICE9IE5PTl9LRVkgJiYgcGstPklEID09IElEKSB7Ci0gICAgICAgICAgIHJldHVybiBwazsKLSAgICAgICAgfQotICAgICAgICBwayA9IHBrLT5uZXh0OwotICAgfQotICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXBrX2tleSAqa3JfZmluZF9uYW1lKHBrX2tleSAqcGssIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICBfQVJHQ0hLKHBrICE9IE5VTEwpOwotICAgX0FSR0NISyhuYW1lICE9IE5VTEwpOwotCi0gICB3aGlsZSAocGsgIT0gTlVMTCkgewotICAgICAgICBpZiAocGstPnN5c3RlbSAhPSBOT05fS0VZICYmIHN0cm5jbXAoKGNoYXIgKilway0+bmFtZSwgKGNoYXIgKiluYW1lLCBzaXplb2YocGstPm5hbWUpLTEpID09IDApIHsKLSAgICAgICAgICAgcmV0dXJuIHBrOwotICAgICAgICB9Ci0gICAgICAgIHBrID0gcGstPm5leHQ7Ci0gICB9Ci0gICByZXR1cm4gTlVMTDsKLX0KLSAKLQotaW50IGtyX2FkZChwa19rZXkgKnBrLCBpbnQga2V5X3R5cGUsIGludCBzeXMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIAotICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICplbWFpbCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGVzY3JpcHRpb24sIGNvbnN0IF9wa19rZXkgKmtleSkKLXsKLSAgIF9BUkdDSEsocGsgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG5hbWUgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGVtYWlsICE9IE5VTEwpOwotICAgX0FSR0NISyhkZXNjcmlwdGlvbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOwotCi0gICAvKiBjaGVjayBwYXJhbWV0ZXJzICovCi0gICBpZiAoa2V5X3R5cGUgIT0gUEtfUFJJVkFURSAmJiBrZXlfdHlwZSAhPSBQS19QUklWQVRFX09QVElNSVpFRCAmJiBrZXlfdHlwZSAhPSBQS19QVUJMSUMpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19JTlZBTElEX1RZUEU7Ci0gICB9Ci0gCi0gICBpZiAoc3lzICE9IFJTQV9LRVkgJiYgc3lzICE9IERIX0tFWSAmJiBzeXMgIT0gRUNDX0tFWSkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX0lOVkFMSURfU1lTVEVNOwotICAgfQotCi0gICAvKiBzZWUgaWYgaXRzIGEgZHVwZSAgKi8KLSAgIGlmIChrcl9maW5kKHBrLCBrcl9jcmMobmFtZSwgZW1haWwsIGRlc2NyaXB0aW9uKSkgIT0gTlVMTCkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX0RVUDsKLSAgIH0KLSAgIAotICAgLyogZmluZCBzcG90IGluIGtleSByaW5nICovCi0gICB3aGlsZSAocGstPnN5c3RlbSAhPSBOT05fS0VZKSB7Ci0gICAgICAgICBpZiAocGstPm5leHQgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIENSWVBUX0VSUk9SOwotICAgICAgICAgfQotICAgICAgICAgcGsgPSBway0+bmV4dDsKLSAgIH0KLQotICAgLyogbm93IHdlIGhhdmUgYSBzcG90IG1ha2UgYSBuZXh0IHNwb3QgKi8KLSAgIHBrLT5uZXh0ID0gWENBTExPQygxLCBzaXplb2YocGtfa2V5KSk7Ci0gICBpZiAocGstPm5leHQgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIENSWVBUX01FTTsKLSAgIH0KLSAgIHBrLT5uZXh0LT5zeXN0ZW0gPSBOT05fS0VZOwotCi0gICAvKiBub3cgYWRkIHRoaXMgbmV3IGRhdGEgdG8gdGhpcyByaW5nIHNwb3QgKi8KLSAgIHBrLT5rZXlfdHlwZSA9IGtleV90eXBlOwotICAgcGstPnN5c3RlbSAgID0gc3lzOwotICAgc3RybmNweSgoY2hhciAqKXBrLT5uYW1lLCAoY2hhciAqKW5hbWUsIHNpemVvZihway0+bmFtZSktMSk7Ci0gICBzdHJuY3B5KChjaGFyICopcGstPmVtYWlsLCAoY2hhciAqKWVtYWlsLCBzaXplb2YocGstPmVtYWlsKS0xKTsKLSAgIHN0cm5jcHkoKGNoYXIgKilway0+ZGVzY3JpcHRpb24sIChjaGFyICopZGVzY3JpcHRpb24sIHNpemVvZihway0+ZGVzY3JpcHRpb24pLTEpOwotICAgcGstPklEICAgICAgID0ga3JfY3JjKHBrLT5uYW1lLCBway0+ZW1haWwsIHBrLT5kZXNjcmlwdGlvbik7Ci0KLSAgIC8qIGNsZWFyIHRoZSBtZW1vcnkgYXJlYSAqLwotICAgemVyb21lbSgmKHBrLT5rZXkpLCBzaXplb2YocGstPmtleSkpOwotCi0gICAvKiBjb3B5IHRoZSBrZXkgKi8KLSAgIHN3aXRjaCAoc3lzKSB7Ci0gICAgICAgICBjYXNlIFJTQV9LRVk6Ci0gICAgICAgICAgICAgIG1lbWNweSgmKHBrLT5rZXkucnNhKSwgJihrZXktPnJzYSksIHNpemVvZihrZXktPnJzYSkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgIGNhc2UgREhfS0VZOgotICAgICAgICAgICAgICBtZW1jcHkoJihway0+a2V5LmRoKSwgJihrZXktPmRoKSwgc2l6ZW9mKGtleS0+ZGgpKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICBjYXNlIEVDQ19LRVk6Ci0gICAgICAgICAgICAgIG1lbWNweSgmKHBrLT5rZXkuZWNjKSwgJihrZXktPmVjYyksIHNpemVvZihrZXktPmVjYykpOwotICAgICAgICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IGtyX2RlbChwa19rZXkgKipfcGssIHVuc2lnbmVkIGxvbmcgSUQpCi17Ci0gICBwa19rZXkgKnBwaywgKnBrOwotCi0gICBfQVJHQ0hLKF9wayAhPSBOVUxMKTsKLQotICAgcGsgID0gKl9wazsKLSAgIHBwayA9IE5VTEw7Ci0gICB3aGlsZSAocGstPnN5c3RlbSAhPSBOT05fS0VZICYmIHBrLT5JRCAhPSBJRCkgewotICAgICAgICBwcGsgPSBwazsKLSAgICAgICAgcGsgID0gcGstPm5leHQ7Ci0gICAgICAgIGlmIChwayA9PSBOVUxMKSB7Ci0gICAgICAgICAgIHJldHVybiBDUllQVF9QS19OT1RfRk9VTkQ7Ci0gICAgICAgIH0KLSAgIH0KLQotICAgc3dpdGNoIChway0+c3lzdGVtKSB7Ci0gICAgICAgIGNhc2UgUlNBX0tFWToKLSAgICAgICAgICAgIHJzYV9mcmVlKCYocGstPmtleS5yc2EpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERIX0tFWToKLSAgICAgICAgICAgIGRoX2ZyZWUoJihway0+a2V5LmRoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQ0NfS0VZOgotICAgICAgICAgICAgZWNjX2ZyZWUoJihway0+a2V5LmVjYykpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgIGlmIChwcGsgPT0gTlVMTCkgeyAgICAgICAvKiB0aGUgZmlyc3QgZWxlbWVudCBtYXRjaGVzIHRoZSBJRCAqLwotICAgICAgcHBrID0gcGstPm5leHQ7ICAgICAgIC8qIGdldCB0aGUgMm5kIGVsZW1lbnQgKi8KLSAgICAgIFhGUkVFKHBrKTsgICAgICAgICAgICAgLyogZnJlZSB0aGUgZmlyc3QgKi8KLSAgICAgICpfcGsgPSBwcGs7ICAgICAgICAgICAvKiBtYWtlIHRoZSBmaXJzdCBlbGVtZW50IHRoZSBzZWNvbmQgKi8KLSAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAvKiAobm90KSBmaXJzdCBlbGVtZW50IG1hdGNoZXMgdGhlIElEICovCi0gICAgICBwcGstPm5leHQgPSBway0+bmV4dDsgLyogbWFrZSB0aGUgcHJldmlvdXMnZXMgbmV4dCBwb2ludCB0byB0aGUgY3VycmVudCBuZXh0ICovCi0gICAgICBYRlJFRShwayk7ICAgICAgICAgICAgIC8qIGZyZWUgdGhlIGVsZW1lbnQgKi8KLSAgIH0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IGtyX2NsZWFyKHBrX2tleSAqKnBrKQotewotICAgaW50IGVycjsKLSAgIF9BUkdDSEsocGsgIT0gTlVMTCk7Ci0KLSAgIHdoaWxlICgoKnBrKS0+c3lzdGVtICE9IE5PTl9LRVkpIHsKLSAgICAgICBpZiAoKGVyciA9IGtyX2RlbChwaywgKCpwayktPklEKSkgIT0gQ1JZUFRfT0spIHsgCi0gICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICB9Ci0gICB9ICAgICAgIAotICAgWEZSRUUoKnBrKTsKLSAgICpwayA9IE5VTEw7Ci0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF93cml0ZSh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBGSUxFICpmLCBzeW1tZXRyaWNfQ1RSICpjdHIpCi17Ci0jaWZkZWYgTk9fRklMRQotICAgcmV0dXJuIDA7Ci0jZWxzZQotICAgX0FSR0NISyhidWYgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGYgICAhPSBOVUxMKTsKLSAgIGlmIChjdHIgIT0gTlVMTCkgewotICAgICAgaWYgKGN0cl9lbmNyeXB0KGJ1ZiwgYnVmLCBsZW4sIGN0cikgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgfQotICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKWZ3cml0ZShidWYsIDEsIChzaXplX3QpbGVuLCBmKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfcmVhZCh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBGSUxFICpmLCBzeW1tZXRyaWNfQ1RSICpjdHIpCi17Ci0jaWZkZWYgTk9fRklMRQotICAgIHJldHVybiAwOwotI2Vsc2UKLSAgIHVuc2lnbmVkIGxvbmcgeTsKLSAgIF9BUkdDSEsoYnVmICE9IE5VTEwpOwotICAgX0FSR0NISyhmICAgIT0gTlVMTCk7Ci0gICB5ID0gKHVuc2lnbmVkIGxvbmcpZnJlYWQoYnVmLCAxLCAoc2l6ZV90KWxlbiwgZik7Ci0gICBpZiAoY3RyICE9IE5VTEwpIHsKLSAgICAgIGlmIChjdHJfZGVjcnlwdChidWYsIGJ1ZiwgeSwgY3RyKSAhPSBDUllQVF9PSykgewotICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICB9Ci0gICByZXR1cm4geTsKLSNlbmRpZgotfQotCi1pbnQga3JfZXhwb3J0KHBrX2tleSAqcGssIHVuc2lnbmVkIGxvbmcgSUQsIGludCBrZXlfdHlwZSwgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0gICB1bnNpZ25lZCBjaGFyIGJ1Zls4MTkyXSwgKm9idWY7Ci0gICBwa19rZXkgKnBwazsKLSAgIHVuc2lnbmVkIGxvbmcgbGVuOwotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhwayAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0ICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7Ci0KLSAgIC8qIGZpbmQgdGhlIGRlc2lyZWQga2V5ICovCi0gICBwcGsgPSBrcl9maW5kKHBrLCBJRCk7Ci0gICBpZiAocHBrID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19OT1RfRk9VTkQ7Ci0gICB9Ci0KLSAgIGlmIChwcGstPmtleV90eXBlID09IFBLX1BVQkxJQyAmJiBrZXlfdHlwZSAhPSBQS19QVUJMSUMpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19OT1RfUFJJVkFURTsKLSAgIH0KLQotICAgLyogdGhpcyBtYWtlcyBQS19QUklWQVRFIGFuIGFsaWFzIGZvciBQS19QUklWQVRFX09QVElNSVpFRCB0eXBlICovCi0gICBpZiAocHBrLT5rZXlfdHlwZSA9PSBQS19QUklWQVRFX09QVElNSVpFRCAmJiBrZXlfdHlwZSA9PSBQS19QUklWQVRFKSB7Ci0gICAgICBrZXlfdHlwZSA9IFBLX1BSSVZBVEVfT1BUSU1JWkVEOwotICAgfQotCi0gICAvKiBub3cgY29weSB0aGUgaGVhZGVyIGFuZCB2YXJpb3VzIG90aGVyIGRldGFpbHMgKi8KLSAgIG1lbWNweShidWYsIGtleV9tYWdpYywgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFnaWMgaW5mbyAqLwotICAgYnVmWzRdID0ga2V5X3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBrZXkgdHlwZSAqLwotICAgYnVmWzVdID0gcHBrLT5zeXN0ZW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeXN0ZW0gKi8KLSAgIFNUT1JFMzJMKHBway0+SUQsIGJ1Zis2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoga2V5IElEICovCi0gICBtZW1jcHkoYnVmKzEwLCBwcGstPm5hbWUsIE1BWExFTik7ICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBuYW1lICovCi0gICBtZW1jcHkoYnVmKzEwK01BWExFTiwgcHBrLT5lbWFpbCwgTUFYTEVOKTsgICAgICAgICAgICAgIC8qIHRoZSBlbWFpbCAqLwotICAgbWVtY3B5KGJ1ZisxMCtNQVhMRU4rTUFYTEVOLCBwcGstPmRlc2NyaXB0aW9uLCBNQVhMRU4pOyAvKiB0aGUgZGVzY3JpcHRpb24gKi8KLSAgIAotICAgLyogZXhwb3J0IGtleSAqLwotICAgbGVuID0gc2l6ZW9mKGJ1ZikgLSAoNiArIDQgKyBNQVhMRU4qMyk7Ci0gICBvYnVmID0gYnVmKzYrNCtNQVhMRU4qMzsKLSAgIHN3aXRjaCAocHBrLT5zeXN0ZW0pIHsKLSAgICAgICBjYXNlIFJTQV9LRVk6Ci0gICAgICAgICAgIGlmICgoZXJyID0gcnNhX2V4cG9ydChvYnVmLCAmbGVuLCBrZXlfdHlwZSwgJihwcGstPmtleS5yc2EpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIERIX0tFWToKLSAgICAgICAgICAgaWYgKChlcnIgPSBkaF9leHBvcnQob2J1ZiwgJmxlbiwga2V5X3R5cGUsICYocHBrLT5rZXkuZGgpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIEVDQ19LRVk6Ci0gICAgICAgICAgIGlmICgoZXJyID0gZWNjX2V4cG9ydChvYnVmLCAmbGVuLCBrZXlfdHlwZSwgJihwcGstPmtleS5lY2MpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBicmVhazsKLSAgIH0KLQotICAgLyogZ2V0IHRoZSBlbnRpcmUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgKi8KLSAgIGxlbiArPSA2ICsgNCArIDMqTUFYTEVOOwotCi0gICBpZiAoKm91dGxlbiA8IGxlbikgewotICAgICAgI2lmZGVmIENMRUFOX1NUQUNLCi0gICAgICAgICAgemVyb21lbShidWYsIHNpemVvZihidWYpKTsKLSAgICAgICNlbmRpZgotICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgIH0gZWxzZSB7Ci0gICAgICAqb3V0bGVuID0gbGVuOwotICAgICAgbWVtY3B5KG91dCwgYnVmLCBsZW4pOwotICAgICAgI2lmZGVmIENMRUFOX1NUQUNLCi0gICAgICAgICAgemVyb21lbShidWYsIHNpemVvZihidWYpKTsKLSAgICAgICNlbmRpZgotICAgICAgcmV0dXJuIENSWVBUX09LOwotICAgfQotfQotCi1pbnQga3JfaW1wb3J0KHBrX2tleSAqcGssIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKQotewotICAgX3BrX2tleSBrZXk7Ci0gICBpbnQgc3lzLCBrZXlfdHlwZSwgZXJyOwotICAgdW5zaWduZWQgbG9uZyBJRDsKLQotICAgX0FSR0NISyhwayAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoaW4gIT0gTlVMTCk7Ci0KLSAgIGlmIChpbmxlbiA8IDEwKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7Ci0gICB9Ci0KLSAgIGlmIChtZW1jbXAoaW4sIGtleV9tYWdpYywgNCkgIT0gMCkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgfQotICAga2V5X3R5cGUgPSBpbls0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgdHlwZSAqLwotICAgc3lzICAgICAgPSBpbls1XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgc3lzdGVtICovCi0gICBMT0FEMzJMKElELGluKzYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBJRCAqLwotCi0gICBpZiAoSUQgIT0ga3JfY3JjKGluKzEwLCBpbisxMCtNQVhMRU4sIGluKzEwK01BWExFTitNQVhMRU4pKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7Ci0gICB9Ci0KLSAgIHplcm9tZW0oJmtleSwgc2l6ZW9mKGtleSkpOwotICAgCi0gICAvKiBzaXplIG9mIHJlbWFpbmluZyBwYWNrZXQgKi8KLSAgIGlubGVuIC09IDEwICsgMypNQVhMRU47Ci0gICAKLSAgIHN3aXRjaCAoc3lzKSB7Ci0gICAgICAgIGNhc2UgUlNBX0tFWToKLSAgICAgICAgICAgIGlmICgoZXJyID0gcnNhX2ltcG9ydChpbisxMCszKk1BWExFTiwgaW5sZW4sICYoa2V5LnJzYSkpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERIX0tFWToKLSAgICAgICAgICAgIGlmICgoZXJyID0gZGhfaW1wb3J0KGluKzEwKzMqTUFYTEVOLCBpbmxlbiwgJihrZXkuZGgpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQ0NfS0VZOgotICAgICAgICAgICAgaWYgKChlcnIgPSBlY2NfaW1wb3J0KGluKzEwKzMqTUFYTEVOLCBpbmxlbiwgJihrZXkuZWNjKSkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4ga3JfYWRkKHBrLCBrZXlfdHlwZSwgc3lzLCAKLSAgICAgICAgICAgICAgICAgaW4rMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIG5hbWUgKi8KLSAgICAgICAgICAgICAgICAgaW4rMTArTUFYTEVOLCAgICAgICAgICAgICAgICAgICAgLyogZW1haWwgYWRkcmVzcyAqLwotICAgICAgICAgICAgICAgICBpbisxMCtNQVhMRU4rTUFYTEVOLCAgICAgICAgICAgICAvKiBkZXNjcmlwdGlvbiAqLwotICAgICAgICAgICAgICAgICAma2V5KTsKLX0KLQotCi1pbnQga3JfbG9hZChwa19rZXkgKipwaywgRklMRSAqaW4sIHN5bW1ldHJpY19DVFIgKmN0cikKLXsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzgxOTJdLCBibGVuWzRdOwotICAgdW5zaWduZWQgbG9uZyBsZW47Ci0gICBpbnQgcmVzLCBlcnI7Ci0KLSAgIF9BUkdDSEsocGsgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGluICE9IE5VTEwpOwotCi0gICAvKiBpbml0IGtleXJpbmcgKi8KLSAgIGlmICgoZXJyID0ga3JfaW5pdChwaykpICE9IENSWVBUX09LKSB7IAotICAgICAgcmV0dXJuIGVycjsgCi0gICB9Ci0KLSAgIC8qIHJlYWQgaW4gbWFnaWMgYnl0ZXMgKi8KLSAgIGlmIChfcmVhZChidWYsIDYsIGluLCBjdHIpICE9IDYpICAgICAgICAgICB7IGdvdG8gZG9uZTI7IH0KLQotICAgaWYgKG1lbWNtcChidWYsIGZpbGVfbWFnaWMsIDQpICE9IDApIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKLSAgIH0KLQotICAgbGVuID0gKHVuc2lnbmVkIGxvbmcpYnVmWzRdIHwgKCh1bnNpZ25lZCBsb25nKWJ1Zls1XSA8PCA4KTsKLSAgIGlmIChsZW4gPiBDUllQVCkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgfQotCi0gICAvKiB3aGlsZSB0aGVyZSBhcmUgbGVuZ3RocyB0byByZWFkLi4uICovCi0gICB3aGlsZSAoX3JlYWQoYmxlbiwgNCwgaW4sIGN0cikgPT0gNCkgewotICAgICAgLyogZ2V0IGxlbmd0aCAqLwotICAgICAgTE9BRDMyTChsZW4sIGJsZW4pOwotCi0gICAgICBpZiAobGVuID4gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGJ1ZikpIHsKLSAgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKLSAgICAgIH0KLQotICAgICAgaWYgKF9yZWFkKGJ1ZiwgbGVuLCBpbiwgY3RyKSAhPSBsZW4pICAgICAgICAgICB7IGdvdG8gZG9uZTI7IH0KLSAgICAgIGlmICgoZXJyID0ga3JfaW1wb3J0KCpwaywgYnVmLCBsZW4pKSAhPSBDUllQVF9PSykgeyAKLSAgICAgICAgIHJldHVybiBlcnI7IAotICAgICAgfQotICAgfQotCi0gICByZXMgPSBDUllQVF9PSzsKLSAgIGdvdG8gZG9uZTsKLWRvbmUyOgotICAgcmVzID0gQ1JZUFRfRVJST1I7Ci1kb25lOgotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotI2VuZGlmCi0gICByZXR1cm4gcmVzOwotfQotCi1pbnQga3Jfc2F2ZShwa19rZXkgKnBrLCBGSUxFICpvdXQsIHN5bW1ldHJpY19DVFIgKmN0cikKLXsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzgxOTJdLCBibGVuWzRdOwotICAgdW5zaWduZWQgbG9uZyBsZW47Ci0gICBpbnQgcmVzLCBlcnI7Ci0KLSAgIF9BUkdDSEsocGsgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAhPSBOVUxMKTsKLQotICAgLyogd3JpdGUgb3V0IG1hZ2ljIGJ5dGVzICovCi0gICBtZW1jcHkoYnVmLCBmaWxlX21hZ2ljLCA0KTsKLSAgIGJ1Zls0XSA9ICh1bnNpZ25lZCBjaGFyKShDUllQVCYyNTUpOwotICAgYnVmWzVdID0gKHVuc2lnbmVkIGNoYXIpKChDUllQVD4+OCkmMjU1KTsKLSAgIGlmIChfd3JpdGUoYnVmLCA2LCBvdXQsIGN0cikgIT0gNikgICAgICAgICAgIHsgZ290byBkb25lMjsgfQotCi0gICB3aGlsZSAocGstPnN5c3RlbSAhPSBOT05fS0VZKSB7Ci0gICAgICAgICBsZW4gPSBzaXplb2YoYnVmKTsKLSAgICAgICAgIGlmICgoZXJyID0ga3JfZXhwb3J0KHBrLCBway0+SUQsIHBrLT5rZXlfdHlwZSwgYnVmLCAmbGVuKSkgIT0gQ1JZUFRfT0spIHsgCi0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgU1RPUkUzMkwobGVuLCBibGVuKTsKLSAgICAgICAgIGlmIChfd3JpdGUoYmxlbiwgNCwgb3V0LCBjdHIpICE9IDQpICAgIHsgZ290byBkb25lMjsgfQotICAgICAgICAgaWYgKF93cml0ZShidWYsIGxlbiwgb3V0LCBjdHIpICE9IGxlbikgeyBnb3RvIGRvbmUyOyB9Ci0KLSAgICAgICAgIHBrID0gcGstPm5leHQ7Ci0gICB9Ci0gICAgICAgICAKLSAgIHJlcyA9IENSWVBUX09LOwotICAgZ290byBkb25lOwotZG9uZTI6Ci0gICByZXMgPSBDUllQVF9FUlJPUjsKLWRvbmU6Ci0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0jZW5kaWYKLSAgIHJldHVybiByZXM7Ci19Ci0KLWludCBrcl9tYWtlX2tleShwa19rZXkgKnBrLCBwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIAotICAgICAgICAgICAgICAgIGludCBzeXMsIGludCBrZXlzaXplLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVtYWlsLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkZXNjcmlwdGlvbikKLXsKLSAgIF9wa19rZXkga2V5OwotICAgaW50IGtleV90eXBlLCBlcnI7Ci0KLSAgIF9BUkdDSEsocGsgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG5hbWUgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGVtYWlsICE9IE5VTEwpOwotICAgX0FSR0NISyhkZXNjcmlwdGlvbiAhPSBOVUxMKTsKLQotICAgLyogdmFsaWQgUFJORz8gKi8KLSAgIGlmICgoZXJyID0gcHJuZ19pc192YWxpZCh3cHJuZykpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBtYWtlIHRoZSBrZXkgZmlyc3QgKi8KLSAgIHplcm9tZW0oJmtleSwgc2l6ZW9mKGtleSkpOwotICAgc3dpdGNoIChzeXMpIHsKLSAgICAgIGNhc2UgUlNBX0tFWTogCi0gICAgICAgICAgaWYgKChlcnIgPSByc2FfbWFrZV9rZXkocHJuZywgd3BybmcsIGtleXNpemUsIDY1NTM3LCAmKGtleS5yc2EpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgIH0KLSAgICAgICAgICBrZXlfdHlwZSA9IGtleS5yc2EudHlwZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgREhfS0VZOiAKLSAgICAgICAgICBpZiAoKGVyciA9IGRoX21ha2Vfa2V5KHBybmcsIHdwcm5nLCBrZXlzaXplLCAmKGtleS5kaCkpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGtleV90eXBlID0ga2V5LmRoLnR5cGU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEVDQ19LRVk6IAotICAgICAgICAgIGlmICgoZXJyID0gZWNjX21ha2Vfa2V5KHBybmcsIHdwcm5nLCBrZXlzaXplLCAmKGtleS5lY2MpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgIH0KLSAgICAgICAgICBrZXlfdHlwZSA9IGtleS5lY2MudHlwZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIENSWVBUX1BLX0lOVkFMSURfU1lTVEVNOwotICAgfQotCi0gICAvKiBub3cgYWRkIHRoZSBrZXkgKi8KLSAgIGlmICgoZXJyID0ga3JfYWRkKHBrLCBrZXlfdHlwZSwgc3lzLCBuYW1lLCBlbWFpbCwgZGVzY3JpcHRpb24sICZrZXkpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKCZrZXksIHNpemVvZihrZXkpKTsKLSNlbmRpZgotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi1pbnQga3JfZW5jcnlwdF9rZXkocGtfa2V5ICpwaywgdW5zaWduZWQgbG9uZyBJRCwgCi0gICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCi0gICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBpbnQgaGFzaCkKLXsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzgxOTJdOwotICAgdW5zaWduZWQgbG9uZyBsZW47Ci0gICBwa19rZXkgKmtyOwotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhwayAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoaW4gIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotCi0gICAvKiBmaW5kIHRoZSBrZXkgKi8KLSAgIGtyID0ga3JfZmluZChwaywgSUQpOwotICAgaWYgKGtyID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19OT1RfRk9VTkQ7Ci0gICB9Ci0KLSAgIC8qIHN0b3JlIHRoZSBoZWFkZXIgKi8KLSAgIG1lbWNweShidWYsIGVuY19tYWdpYywgNCk7Ci0KLSAgIC8qIG5vdyBzdG9yZSB0aGUgSUQgKi8KLSAgIFNUT1JFMzJMKGtyLT5JRCxidWYrNCk7Ci0KLSAgIC8qIG5vdyBlbmNyeXB0IGl0ICovCi0gICBsZW4gPSBzaXplb2YoYnVmKS0xMjsKLSAgIHN3aXRjaCAoa3ItPnN5c3RlbSkgewotICAgICAgICBjYXNlIFJTQV9LRVk6Ci0gICAgICAgICAgICBpZiAoKGVyciA9IHJzYV9lbmNyeXB0X2tleShpbiwgaW5sZW4sIGJ1ZisxMiwgJmxlbiwgcHJuZywgd3BybmcsICYoa3ItPmtleS5yc2EpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBESF9LRVk6Ci0gICAgICAgICAgICBpZiAoKGVyciA9IGRoX2VuY3J5cHRfa2V5KGluLCBpbmxlbiwgYnVmKzEyLCAmbGVuLCBwcm5nLCB3cHJuZywgaGFzaCwgJihrci0+a2V5LmRoKSkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUNDX0tFWToKLSAgICAgICAgICAgIGlmICgoZXJyID0gZWNjX2VuY3J5cHRfa2V5KGluLCBpbmxlbiwgYnVmKzEyLCAmbGVuLCBwcm5nLCB3cHJuZywgaGFzaCwgJihrci0+a2V5LmVjYykpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBTVE9SRTMyTChsZW4sYnVmKzgpOwotICAgIGxlbiArPSAxMjsKLQotICAgIGlmIChsZW4gPiAqb3V0bGVuKSB7Ci0gICAgICAgI2lmZGVmIENMRUFOX1NUQUNLCi0gICAgICAgICAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgI2VuZGlmCi0gICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgICB9IGVsc2UgewotICAgICAgIG1lbWNweShvdXQsIGJ1ZiwgbGVuKTsKLSAgICAgICAjaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgICAgICAgICAgemVyb21lbShidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAjZW5kaWYKLSAgICAgICAqb3V0bGVuID0gbGVuOwotICAgICAgIHJldHVybiBDUllQVF9PSzsKLSAgICB9Ci19Ci0KLWludCBrcl9kZWNyeXB0X2tleShwa19rZXkgKnBrLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwKLSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKLXsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzgxOTJdOwotICAgdW5zaWduZWQgbG9uZyBwa2xlbiwgbGVuLCBJRDsKLSAgIHBrX2tleSAqa3I7Ci0gICBpbnQgZXJyOwotCi0gICBfQVJHQ0hLKHBrICE9IE5VTEwpOwotICAgX0FSR0NISyhpbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0ICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7Ci0KLSAgIC8qIGNoZWNrIG1hZ2ljIGhlYWRlciAqLwotICAgaWYgKG1lbWNtcChpbiwgZW5jX21hZ2ljLCA0KSkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgfQotCi0gICAvKiBub3cgdHJ5IHRvIGZpbmQga2V5ICovCi0gICBMT0FEMzJMKElELGluKzQpOwotICAga3IgPSBrcl9maW5kKHBrLCBJRCk7Ci0gICBpZiAoa3IgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX05PVF9GT1VORDsKLSAgIH0KLQotICAgLyogaXMgaXQgcHVibGljPyAqLwotICAgaWYgKGtyLT5rZXlfdHlwZSA9PSBQS19QVUJMSUMpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19OT1RfUFJJVkFURTsKLSAgIH0KLQotICAgLyogbm93IHRyeSBhbmQgZGVjcnlwdCBpdCAqLwotICAgTE9BRDMyTChwa2xlbixpbis4KTsKLSAgIGxlbiA9IHNpemVvZihidWYpOwotICAgc3dpdGNoIChrci0+c3lzdGVtKSB7Ci0gICAgICAgY2FzZSBSU0FfS0VZOgotICAgICAgICAgICBpZiAoKGVyciA9IHJzYV9kZWNyeXB0X2tleShpbisxMiwgcGtsZW4sIGJ1ZiwgJmxlbiwgJihrci0+a2V5LnJzYSkpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgREhfS0VZOgotICAgICAgICAgICBpZiAoKGVyciA9IGRoX2RlY3J5cHRfa2V5KGluKzEyLCBwa2xlbiwgYnVmLCAmbGVuLCAmKGtyLT5rZXkuZGgpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIEVDQ19LRVk6Ci0gICAgICAgICAgIGlmICgoZXJyID0gZWNjX2RlY3J5cHRfa2V5KGluKzEyLCBwa2xlbiwgYnVmLCAmbGVuLCAmKGtyLT5rZXkuZWNjKSkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgYnJlYWs7Ci0gICB9Ci0KLSAgICBpZiAobGVuID4gKm91dGxlbikgewotICAgICAgICNpZmRlZiBDTEVBTl9TVEFDSwotICAgICAgICAgICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICNlbmRpZgotICAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gICAgfSBlbHNlIHsKLSAgICAgICBtZW1jcHkob3V0LCBidWYsIGxlbik7Ci0gICAgICAgI2lmZGVmIENMRUFOX1NUQUNLCi0gICAgICAgICAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgI2VuZGlmCi0gICAgICAgKm91dGxlbiA9IGxlbjsKLSAgICAgICByZXR1cm4gQ1JZUFRfT0s7Ci0gICAgfQotfQotCi1pbnQga3Jfc2lnbl9oYXNoKHBrX2tleSAqcGssIHVuc2lnbmVkIGxvbmcgSUQsIAotICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwKLSAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZykKLXsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzgxOTJdOwotICAgdW5zaWduZWQgbG9uZyBsZW47Ci0gICBwa19rZXkgKmtyOwotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhwayAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoaW4gIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotCi0gICAvKiBmaW5kIHRoZSBrZXkgKi8KLSAgIGtyID0ga3JfZmluZChwaywgSUQpOwotICAgaWYgKGtyID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19OT1RfRk9VTkQ7Ci0gICB9Ci0KLSAgIC8qIGlzIGl0IHB1YmxpYz8gKi8KLSAgIGlmIChrci0+a2V5X3R5cGUgPT0gUEtfUFVCTElDKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfUEtfTk9UX1BSSVZBVEU7Ci0gICB9Ci0KLSAgIC8qIHN0b3JlIHRoZSBoZWFkZXIgKi8KLSAgIG1lbWNweShidWYsIHNpZ25fbWFnaWMsIDQpOwotCi0gICAvKiBub3cgc3RvcmUgdGhlIElEICovCi0gICBTVE9SRTMyTChrci0+SUQsYnVmKzQpOwotCi0gICAvKiBub3cgc2lnbiBpdCAqLwotICAgbGVuID0gc2l6ZW9mKGJ1ZiktMTY7Ci0gICBzd2l0Y2ggKGtyLT5zeXN0ZW0pIHsKLSAgICAgICAgY2FzZSBSU0FfS0VZOgotICAgICAgICAgICAgaWYgKChlcnIgPSByc2Ffc2lnbl9oYXNoKGluLCBpbmxlbiwgYnVmKzE2LCAmbGVuLCAmKGtyLT5rZXkucnNhKSkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREhfS0VZOgotICAgICAgICAgICAgaWYgKChlcnIgPSBkaF9zaWduX2hhc2goaW4sIGlubGVuLCBidWYrMTYsICZsZW4sIHBybmcsIHdwcm5nLCAmKGtyLT5rZXkuZGgpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFQ0NfS0VZOgotICAgICAgICAgICAgaWYgKChlcnIgPSBlY2Nfc2lnbl9oYXNoKGluLCBpbmxlbiwgYnVmKzE2LCAmbGVuLCBwcm5nLCB3cHJuZywgJihrci0+a2V5LmVjYykpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBTVE9SRTMyTChpbmxlbixidWYrOCk7Ci0gICAgU1RPUkUzMkwobGVuLGJ1ZisxMik7Ci0gICAgbGVuICs9IDE2OwotCi0gICAgaWYgKGxlbiA+ICpvdXRsZW4pIHsKLSAgICAgICAjaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgICAgICAgICAgemVyb21lbShidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAjZW5kaWYKLSAgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgIH0gZWxzZSB7Ci0gICAgICAgbWVtY3B5KG91dCwgYnVmLCBsZW4pOwotICAgICAgICNpZmRlZiBDTEVBTl9TVEFDSwotICAgICAgICAgICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICNlbmRpZgotICAgICAgICpvdXRsZW4gPSBsZW47Ci0gICAgICAgcmV0dXJuIENSWVBUX09LOwotICAgIH0KLX0KLQotaW50IGtyX3ZlcmlmeV9oYXNoKHBrX2tleSAqcGssIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBjb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoLCAKLSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGhhc2hsZW4sIGludCAqc3RhdCkKLXsKLSAgIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBrbGVuLCBJRDsKLSAgIHBrX2tleSAqa3I7Ci0gICBpbnQgZXJyOwotCi0gICBfQVJHQ0hLKHBrICE9IE5VTEwpOwotICAgX0FSR0NISyhpbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoaGFzaCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoc3RhdCAhPSBOVUxMKTsKLQotICAgLyogZGVmYXVsdCB0byBub3QgbWF0Y2ggKi8KLSAgICpzdGF0ID0gMDsKLQotICAgLyogY2hlY2sgbWFnaWMgaGVhZGVyICovCi0gICBpZiAobWVtY21wKGluLCBzaWduX21hZ2ljLCA0KSkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgfQotCi0gICAvKiBub3cgdHJ5IHRvIGZpbmQga2V5ICovCi0gICBMT0FEMzJMKElELGluKzQpOwotICAga3IgPSBrcl9maW5kKHBrLCBJRCk7Ci0gICBpZiAoa3IgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX05PVF9GT1VORDsKLSAgIH0KLQotICAgLyogbm93IHRyeSBhbmQgdmVyaWZ5IGl0ICovCi0gICBMT0FEMzJMKGlubGVuLGluKzgpOyAgICAgICAgIC8qIHRoaXMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgb3JpZ2luYWwgaW5sZW4gKi8KLSAgIExPQUQzMkwocGtsZW4saW4rMTIpOyAgICAgICAgLyogc2l6ZSBvZiB0aGUgUEsgcGFja2V0ICovCi0gICBpZiAoaW5sZW4gIT0gaGFzaGxlbikgeyAgICAgIC8qIHNpemUgZG9lc24ndCBtYXRjaCBtZWFucyB0aGUgc2lnbmF0dXJlIGlzIGludmFsaWQgKi8KLSAgICAgIHJldHVybiBDUllQVF9PSzsKLSAgIH0KLQotICAgc3dpdGNoIChrci0+c3lzdGVtKSB7Ci0gICAgICAgY2FzZSBSU0FfS0VZOgotICAgICAgICAgICBpZiAoKGVyciA9IHJzYV92ZXJpZnlfaGFzaChpbisxNiwgcGtsZW4sIGhhc2gsIHN0YXQsICYoa3ItPmtleS5yc2EpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIERIX0tFWToKLSAgICAgICAgICAgaWYgKChlcnIgPSBkaF92ZXJpZnlfaGFzaChpbisxNiwgcGtsZW4sIGhhc2gsIGlubGVuLCBzdGF0LCAmKGtyLT5rZXkuZGgpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIEVDQ19LRVk6Ci0gICAgICAgICAgIGlmICgoZXJyID0gZWNjX3ZlcmlmeV9oYXNoKGluKzE2LCBwa2xlbiwgaGFzaCwgaW5sZW4sIHN0YXQsICYoa3ItPmtleS5lY2MpKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IGtyX2ZpbmdlcnByaW50KHBrX2tleSAqcGssIHVuc2lnbmVkIGxvbmcgSUQsIGludCBoYXNoLAotICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQotewotICAgdW5zaWduZWQgY2hhciBidWZbODE5Ml07Ci0gICB1bnNpZ25lZCBsb25nIGxlbjsKLSAgIGludCBlcnI7Ci0KLSAgIF9BUkdDSEsocGsgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotCi0gICAvKiB2YWxpZCBoYXNoPyAqLwotICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGhhc2gpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgbGVuID0gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGJ1Zik7Ci0gICBpZiAoKGVyciA9IGtyX2V4cG9ydChwaywgSUQsIFBLX1BVQkxJQywgYnVmLCAmbGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICAKLSAgIC8qIG5vdyBoYXNoIGl0ICovCi0gICBpZiAoKGVyciA9IGhhc2hfbWVtb3J5KGhhc2gsIGJ1ZiwgbGVuLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0jZW5kaWYKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCi0KLQpkaWZmIC0tZ2l0IGEvbHRjX3RvbW1hdGguaCBiL2x0Y190b21tYXRoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjk5OTQuLjAwMDAwMDAKLS0tIGEvbHRjX3RvbW1hdGguaAorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpZm5kZWYgQk5fSF8KLSNkZWZpbmUgQk5fSF8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI3VuZGVmIE1JTgotI2RlZmluZSBNSU4oeCx5KSAoKHgpPCh5KT8oeCk6KHkpKQotI3VuZGVmIE1BWAotI2RlZmluZSBNQVgoeCx5KSAoKHgpPih5KT8oeCk6KHkpKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotCi0vKiBDKysgY29tcGlsZXJzIGRvbid0IGxpa2UgYXNzaWduaW5nIHZvaWQgKiB0byBtcF9kaWdpdCAqICovCi0jZGVmaW5lICBPUFRfQ0FTVCh4KSAgKHggKikKLQotI2Vsc2UKLQotLyogQyBvbiB0aGUgb3RoZXIgaGFuZCBkb2Vzbid0IGNhcmUgKi8KLSNkZWZpbmUgIE9QVF9DQVNUKHgpCi0KLSNlbmRpZgotCi0vKiBzb21lIGRlZmF1bHQgY29uZmlndXJhdGlvbnMuCi0gKgotICogQSAibXBfZGlnaXQiIG11c3QgYmUgYWJsZSB0byBob2xkIERJR0lUX0JJVCArIDEgYml0cwotICogQSAibXBfd29yZCIgbXVzdCBiZSBhYmxlIHRvIGhvbGQgMipESUdJVF9CSVQgKyAxIGJpdHMKLSAqCi0gKiBBdCB0aGUgdmVyeSBsZWFzdCBhIG1wX2RpZ2l0IG11c3QgYmUgYWJsZSB0byBob2xkIDcgYml0cwotICogW2FueSBzaXplIGJleW9uZCB0aGF0IGlzIG9rIHByb3ZpZGVkIGl0IGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIGRhdGEgdHlwZV0KLSAqLwotI2lmZGVmIE1QXzhCSVQKLSAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgIG1wX2RpZ2l0OwotICAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgbXBfd29yZDsKLSNlbGlmIGRlZmluZWQoTVBfMTZCSVQpCi0gICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICBtcF9kaWdpdDsKLSAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgIG1wX3dvcmQ7Ci0jZWxpZiBkZWZpbmVkKE1QXzY0QklUKQotICAgLyogZm9yIEdDQyBvbmx5IG9uIHN1cHBvcnRlZCBwbGF0Zm9ybXMgKi8KLSNpZm5kZWYgQ1JZUFQKLSAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsb25nNjQ7Ci0gICB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICBsb25nNjQ7Ci0jZW5kaWYKLQotICAgdHlwZWRlZiB1bG9uZzY0ICAgICAgICAgICAgbXBfZGlnaXQ7Ci0gICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICBtcF93b3JkIF9fYXR0cmlidXRlX18gKChtb2RlKFRJKSkpOwotCi0gICAjZGVmaW5lIERJR0lUX0JJVCAgICAgICAgICA2MAotI2Vsc2UKLSAgIC8qIHRoaXMgaXMgdGhlIGRlZmF1bHQgY2FzZSwgMjgtYml0IGRpZ2l0cyAqLwotICAgCi0gICAvKiB0aGlzIGlzIHRvIG1ha2UgcG9ydGluZyBpbnRvIExpYlRvbUNyeXB0IGVhc2llciA6LSkgKi8KLSNpZm5kZWYgQ1JZUFQKLSAgICNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykgCi0gICAgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICB1bG9uZzY0OwotICAgICAgdHlwZWRlZiBzaWduZWQgX19pbnQ2NCAgICAgbG9uZzY0OwotICAgI2Vsc2UKLSAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsb25nNjQ7Ci0gICAgICB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICBsb25nNjQ7Ci0gICAjZW5kaWYKLSNlbmRpZgotCi0gICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICBtcF9kaWdpdDsKLSAgIHR5cGVkZWYgdWxvbmc2NCAgICAgICAgICAgIG1wX3dvcmQ7Ci0KLSNpZmRlZiBNUF8zMUJJVCAgIAotICAgLyogdGhpcyBpcyBhbiBleHRlbnNpb24gdGhhdCB1c2VzIDMxLWJpdCBkaWdpdHMgKi8KLSAgICNkZWZpbmUgRElHSVRfQklUICAgICAgICAgIDMxCi0jZWxzZQotICAgLyogZGVmYXVsdCBjYXNlIGlzIDI4LWJpdCBkaWdpdHMsIGRlZmluZXMgTVBfMjhCSVQgYXMgYSBoYW5keSBtYWNybyB0byB0ZXN0ICovCi0gICAjZGVmaW5lIERJR0lUX0JJVCAgICAgICAgICAyOAotICAgI2RlZmluZSBNUF8yOEJJVAotI2VuZGlmICAgCi0jZW5kaWYKLQotLyogZGVmaW5lIGhlYXAgbWFjcm9zICovCi0jaWZuZGVmIENSWVBUCi0gICAvKiBkZWZhdWx0IHRvIGxpYmMgc3R1ZmYgKi8KLSAgICNpZm5kZWYgWE1BTExPQyAKLSAgICAgICAjZGVmaW5lIFhNQUxMT0MgIG1hbGxvYwotICAgICAgICNkZWZpbmUgWEZSRUUgICAgZnJlZQotICAgICAgICNkZWZpbmUgWFJFQUxMT0MgcmVhbGxvYwotICAgICAgICNkZWZpbmUgWENBTExPQyAgY2FsbG9jCi0gICAjZWxzZQotICAgICAgLyogcHJvdG90eXBlcyBmb3Igb3VyIGhlYXAgZnVuY3Rpb25zICovCi0gICAgICBleHRlcm4gdm9pZCAqWE1BTExPQyhzaXplX3Qgbik7Ci0gICAgICBleHRlcm4gdm9pZCAqUkVBTExPQyh2b2lkICpwLCBzaXplX3Qgbik7Ci0gICAgICBleHRlcm4gdm9pZCAqWENBTExPQyhzaXplX3Qgbiwgc2l6ZV90IHMpOwotICAgICAgZXh0ZXJuIHZvaWQgWEZSRUUodm9pZCAqcCk7Ci0gICAjZW5kaWYKLSNlbmRpZgotCi0KLS8qIG90aGVyd2lzZSB0aGUgYml0cyBwZXIgZGlnaXQgaXMgY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHNpemUgb2YgYSBtcF9kaWdpdCAqLwotI2lmbmRlZiBESUdJVF9CSVQKLSAgICNkZWZpbmUgRElHSVRfQklUICAgICAoKGludCkoKENIQVJfQklUICogc2l6ZW9mKG1wX2RpZ2l0KSAtIDEpKSkgIC8qIGJpdHMgcGVyIGRpZ2l0ICovCi0jZW5kaWYKLQotI2RlZmluZSBNUF9ESUdJVF9CSVQgICAgIERJR0lUX0JJVAotI2RlZmluZSBNUF9NQVNLICAgICAgICAgICgoKChtcF9kaWdpdCkxKTw8KChtcF9kaWdpdClESUdJVF9CSVQpKS0oKG1wX2RpZ2l0KTEpKQotI2RlZmluZSBNUF9ESUdJVF9NQVggICAgIE1QX01BU0sKLQotLyogZXF1YWxpdGllcyAqLwotI2RlZmluZSBNUF9MVCAgICAgICAgLTEgICAvKiBsZXNzIHRoYW4gKi8KLSNkZWZpbmUgTVBfRVEgICAgICAgICAwICAgLyogZXF1YWwgdG8gKi8KLSNkZWZpbmUgTVBfR1QgICAgICAgICAxICAgLyogZ3JlYXRlciB0aGFuICovCi0KLSNkZWZpbmUgTVBfWlBPUyAgICAgICAwICAgLyogcG9zaXRpdmUgaW50ZWdlciAqLwotI2RlZmluZSBNUF9ORUcgICAgICAgIDEgICAvKiBuZWdhdGl2ZSAqLwotCi0jZGVmaW5lIE1QX09LQVkgICAgICAgMCAgIC8qIG9rIHJlc3VsdCAqLwotI2RlZmluZSBNUF9NRU0gICAgICAgIC0yICAvKiBvdXQgb2YgbWVtICovCi0jZGVmaW5lIE1QX1ZBTCAgICAgICAgLTMgIC8qIGludmFsaWQgaW5wdXQgKi8KLSNkZWZpbmUgTVBfUkFOR0UgICAgICBNUF9WQUwKLQotI2RlZmluZSBNUF9ZRVMgICAgICAgIDEgICAvKiB5ZXMgcmVzcG9uc2UgKi8KLSNkZWZpbmUgTVBfTk8gICAgICAgICAwICAgLyogbm8gcmVzcG9uc2UgKi8KLQotLyogUHJpbWFsaXR5IGdlbmVyYXRpb24gZmxhZ3MgKi8KLSNkZWZpbmUgTFRNX1BSSU1FX0JCUyAgICAgIDB4MDAwMSAvKiBCQlMgc3R5bGUgcHJpbWUgKi8KLSNkZWZpbmUgTFRNX1BSSU1FX1NBRkUgICAgIDB4MDAwMiAvKiBTYWZlIHByaW1lIChwLTEpLzIgPT0gcHJpbWUgKi8KLSNkZWZpbmUgTFRNX1BSSU1FXzJNU0JfT0ZGIDB4MDAwNCAvKiBmb3JjZSAybmQgTVNCIHRvIDAgKi8KLSNkZWZpbmUgTFRNX1BSSU1FXzJNU0JfT04gIDB4MDAwOCAvKiBmb3JjZSAybmQgTVNCIHRvIDEgKi8KLQotdHlwZWRlZiBpbnQgICAgICAgICAgIG1wX2VycjsKLQotLyogeW91J2xsIGhhdmUgdG8gdHVuZSB0aGVzZS4uLiAqLwotZXh0ZXJuIGludCBLQVJBVFNVQkFfTVVMX0NVVE9GRiwKLSAgICAgICAgICAgS0FSQVRTVUJBX1NRUl9DVVRPRkYsCi0gICAgICAgICAgIFRPT01fTVVMX0NVVE9GRiwKLSAgICAgICAgICAgVE9PTV9TUVJfQ1VUT0ZGOwotCi0vKiBkZWZpbmUgdGhpcyB0byB1c2UgbG93ZXIgbWVtb3J5IHVzYWdlIHJvdXRpbmVzIChleHB0bW9kcyBtb3N0bHkpICovCi0vKiAjZGVmaW5lIE1QX0xPV19NRU0gKi8KLQotLyogZGVmYXVsdCBwcmVjaXNpb24gKi8KLSNpZm5kZWYgTVBfUFJFQwotICAgI2lmZGVmIE1QX0xPV19NRU0KLSAgICAgICNkZWZpbmUgTVBfUFJFQyAgICAgICAgICAgICAgICAgNjQgICAgIC8qIGRlZmF1bHQgZGlnaXRzIG9mIHByZWNpc2lvbiAqLwotICAgI2Vsc2UKLSAgICAgICNkZWZpbmUgTVBfUFJFQyAgICAgICAgICAgICAgICAgOCAgICAgIC8qIGRlZmF1bHQgZGlnaXRzIG9mIHByZWNpc2lvbiAqLwotICAgI2VuZGlmICAgCi0jZW5kaWYKLQotLyogc2l6ZSBvZiBjb21iYSBhcnJheXMsIHNob3VsZCBiZSBhdCBsZWFzdCAyICogMioqKEJJVFNfUEVSX1dPUkQgLSBCSVRTX1BFUl9ESUdJVCoyKSAqLwotI2RlZmluZSBNUF9XQVJSQVkgICAgICAgICAgICAgICAoMSA8PCAoc2l6ZW9mKG1wX3dvcmQpICogQ0hBUl9CSVQgLSAyICogRElHSVRfQklUICsgMSkpCi0KLS8qIHRoZSBpbmZhbW91cyBtcF9pbnQgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCAgewotICAgIGludCB1c2VkLCBhbGxvYywgc2lnbjsKLSAgICBtcF9kaWdpdCAqZHA7Ci19IG1wX2ludDsKLQotLyogY2FsbGJhY2sgZm9yIG1wX3ByaW1lX3JhbmRvbSwgc2hvdWxkIGZpbGwgZHN0IHdpdGggcmFuZG9tIGJ5dGVzIGFuZCByZXR1cm4gaG93IG1hbnkgcmVhZCBbdXB0byBsZW5dICovCi10eXBlZGVmIGludCBsdG1fcHJpbWVfY2FsbGJhY2sodW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuLCB2b2lkICpkYXQpOwotCi0KLSNkZWZpbmUgVVNFRChtKSAgICAoKG0pLT51c2VkKQotI2RlZmluZSBESUdJVChtLGspICgobSktPmRwWyhrKV0pCi0jZGVmaW5lIFNJR04obSkgICAgKChtKS0+c2lnbikKLQotLyogZXJyb3IgY29kZSB0byBjaGFyKiBzdHJpbmcgKi8KLWNoYXIgKm1wX2Vycm9yX3RvX3N0cmluZyhpbnQgY29kZSk7Ci0KLS8qIC0tLT4gaW5pdCBhbmQgZGVpbml0IGJpZ251bSBmdW5jdGlvbnMgPC0tLSAqLwotLyogaW5pdCBhIGJpZ251bSAqLwotaW50IG1wX2luaXQobXBfaW50ICphKTsKLQotLyogZnJlZSBhIGJpZ251bSAqLwotdm9pZCBtcF9jbGVhcihtcF9pbnQgKmEpOwotCi0vKiBpbml0IGEgbnVsbCB0ZXJtaW5hdGVkIHNlcmllcyBvZiBhcmd1bWVudHMgKi8KLWludCBtcF9pbml0X211bHRpKG1wX2ludCAqbXAsIC4uLik7Ci0KLS8qIGNsZWFyIGEgbnVsbCB0ZXJtaW5hdGVkIHNlcmllcyBvZiBhcmd1bWVudHMgKi8KLXZvaWQgbXBfY2xlYXJfbXVsdGkobXBfaW50ICptcCwgLi4uKTsKLQotLyogZXhjaGFuZ2UgdHdvIGludHMgKi8KLXZvaWQgbXBfZXhjaChtcF9pbnQgKmEsIG1wX2ludCAqYik7Ci0KLS8qIHNocmluayByYW0gcmVxdWlyZWQgZm9yIGEgYmlnbnVtICovCi1pbnQgbXBfc2hyaW5rKG1wX2ludCAqYSk7Ci0KLS8qIGdyb3cgYW4gaW50IHRvIGEgZ2l2ZW4gc2l6ZSAqLwotaW50IG1wX2dyb3cobXBfaW50ICphLCBpbnQgc2l6ZSk7Ci0KLS8qIGluaXQgdG8gYSBnaXZlbiBudW1iZXIgb2YgZGlnaXRzICovCi1pbnQgbXBfaW5pdF9zaXplKG1wX2ludCAqYSwgaW50IHNpemUpOwotCi0vKiAtLS0+IEJhc2ljIE1hbmlwdWxhdGlvbnMgPC0tLSAqLwotI2RlZmluZSBtcF9pc3plcm8oYSkgKCgoYSktPnVzZWQgPT0gMCkgPyBNUF9ZRVMgOiBNUF9OTykKLSNkZWZpbmUgbXBfaXNldmVuKGEpICgoKGEpLT51c2VkID4gMCAmJiAoKChhKS0+ZHBbMF0gJiAxKSA9PSAwKSkgPyBNUF9ZRVMgOiBNUF9OTykKLSNkZWZpbmUgbXBfaXNvZGQoYSkgICgoKGEpLT51c2VkID4gMCAmJiAoKChhKS0+ZHBbMF0gJiAxKSA9PSAxKSkgPyBNUF9ZRVMgOiBNUF9OTykKLQotLyogc2V0IHRvIHplcm8gKi8KLXZvaWQgbXBfemVybyhtcF9pbnQgKmEpOwotCi0vKiBzZXQgdG8gYSBkaWdpdCAqLwotdm9pZCBtcF9zZXQobXBfaW50ICphLCBtcF9kaWdpdCBiKTsKLQotLyogc2V0IGEgMzItYml0IGNvbnN0ICovCi1pbnQgbXBfc2V0X2ludChtcF9pbnQgKmEsIHVuc2lnbmVkIGxvbmcgYik7Ci0KLS8qIGdldCBhIDMyLWJpdCB2YWx1ZSAqLwotdW5zaWduZWQgbG9uZyBtcF9nZXRfaW50KG1wX2ludCAqIGEpOwotCi0vKiBpbml0aWFsaXplIGFuZCBzZXQgYSBkaWdpdCAqLwotaW50IG1wX2luaXRfc2V0IChtcF9pbnQgKiBhLCBtcF9kaWdpdCBiKTsKLQotLyogaW5pdGlhbGl6ZSBhbmQgc2V0IDMyLWJpdCB2YWx1ZSAqLwotaW50IG1wX2luaXRfc2V0X2ludCAobXBfaW50ICogYSwgdW5zaWduZWQgbG9uZyBiKTsKLQotLyogY29weSwgYiA9IGEgKi8KLWludCBtcF9jb3B5KG1wX2ludCAqYSwgbXBfaW50ICpiKTsKLQotLyogaW5pdHMgYW5kIGNvcGllcywgYSA9IGIgKi8KLWludCBtcF9pbml0X2NvcHkobXBfaW50ICphLCBtcF9pbnQgKmIpOwotCi0vKiB0cmltIHVudXNlZCBkaWdpdHMgKi8KLXZvaWQgbXBfY2xhbXAobXBfaW50ICphKTsKLQotLyogLS0tPiBkaWdpdCBtYW5pcHVsYXRpb24gPC0tLSAqLwotCi0vKiByaWdodCBzaGlmdCBieSAiYiIgZGlnaXRzICovCi12b2lkIG1wX3JzaGQobXBfaW50ICphLCBpbnQgYik7Ci0KLS8qIGxlZnQgc2hpZnQgYnkgImIiIGRpZ2l0cyAqLwotaW50IG1wX2xzaGQobXBfaW50ICphLCBpbnQgYik7Ci0KLS8qIGMgPSBhIC8gMioqYiAqLwotaW50IG1wX2Rpdl8yZChtcF9pbnQgKmEsIGludCBiLCBtcF9pbnQgKmMsIG1wX2ludCAqZCk7Ci0KLS8qIGIgPSBhLzIgKi8KLWludCBtcF9kaXZfMihtcF9pbnQgKmEsIG1wX2ludCAqYik7Ci0KLS8qIGMgPSBhICogMioqYiAqLwotaW50IG1wX211bF8yZChtcF9pbnQgKmEsIGludCBiLCBtcF9pbnQgKmMpOwotCi0vKiBiID0gYSoyICovCi1pbnQgbXBfbXVsXzIobXBfaW50ICphLCBtcF9pbnQgKmIpOwotCi0vKiBjID0gYSBtb2QgMioqZCAqLwotaW50IG1wX21vZF8yZChtcF9pbnQgKmEsIGludCBiLCBtcF9pbnQgKmMpOwotCi0vKiBjb21wdXRlcyBhID0gMioqYiAqLwotaW50IG1wXzJleHB0KG1wX2ludCAqYSwgaW50IGIpOwotCi0vKiBDb3VudHMgdGhlIG51bWJlciBvZiBsc2JzIHdoaWNoIGFyZSB6ZXJvIGJlZm9yZSB0aGUgZmlyc3QgemVybyBiaXQgKi8KLWludCBtcF9jbnRfbHNiKG1wX2ludCAqYSk7Ci0KLS8qIEkgTG92ZSBFYXJ0aCEgKi8KLQotLyogbWFrZXMgYSBwc2V1ZG8tcmFuZG9tIGludCBvZiBhIGdpdmVuIHNpemUgKi8KLWludCBtcF9yYW5kKG1wX2ludCAqYSwgaW50IGRpZ2l0cyk7Ci0KLS8qIC0tLT4gYmluYXJ5IG9wZXJhdGlvbnMgPC0tLSAqLwotLyogYyA9IGEgWE9SIGIgICovCi1pbnQgbXBfeG9yKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwotCi0vKiBjID0gYSBPUiBiICovCi1pbnQgbXBfb3IobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYyk7Ci0KLS8qIGMgPSBhIEFORCBiICovCi1pbnQgbXBfYW5kKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwotCi0vKiAtLS0+IEJhc2ljIGFyaXRobWV0aWMgPC0tLSAqLwotCi0vKiBiID0gLWEgKi8KLWludCBtcF9uZWcobXBfaW50ICphLCBtcF9pbnQgKmIpOwotCi0vKiBiID0gfGF8ICovCi1pbnQgbXBfYWJzKG1wX2ludCAqYSwgbXBfaW50ICpiKTsKLQotLyogY29tcGFyZSBhIHRvIGIgKi8KLWludCBtcF9jbXAobXBfaW50ICphLCBtcF9pbnQgKmIpOwotCi0vKiBjb21wYXJlIHxhfCB0byB8YnwgKi8KLWludCBtcF9jbXBfbWFnKG1wX2ludCAqYSwgbXBfaW50ICpiKTsKLQotLyogYyA9IGEgKyBiICovCi1pbnQgbXBfYWRkKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwotCi0vKiBjID0gYSAtIGIgKi8KLWludCBtcF9zdWIobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYyk7Ci0KLS8qIGMgPSBhICogYiAqLwotaW50IG1wX211bChtcF9pbnQgKmEsIG1wX2ludCAqYiwgbXBfaW50ICpjKTsKLQotLyogYiA9IGEqYSAgKi8KLWludCBtcF9zcXIobXBfaW50ICphLCBtcF9pbnQgKmIpOwotCi0vKiBhL2IgPT4gY2IgKyBkID09IGEgKi8KLWludCBtcF9kaXYobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYywgbXBfaW50ICpkKTsKLQotLyogYyA9IGEgbW9kIGIsIDAgPD0gYyA8IGIgICovCi1pbnQgbXBfbW9kKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwotCi0vKiAtLS0+IHNpbmdsZSBkaWdpdCBmdW5jdGlvbnMgPC0tLSAqLwotCi0vKiBjb21wYXJlIGFnYWluc3QgYSBzaW5nbGUgZGlnaXQgKi8KLWludCBtcF9jbXBfZChtcF9pbnQgKmEsIG1wX2RpZ2l0IGIpOwotCi0vKiBjID0gYSArIGIgKi8KLWludCBtcF9hZGRfZChtcF9pbnQgKmEsIG1wX2RpZ2l0IGIsIG1wX2ludCAqYyk7Ci0KLS8qIGMgPSBhIC0gYiAqLwotaW50IG1wX3N1Yl9kKG1wX2ludCAqYSwgbXBfZGlnaXQgYiwgbXBfaW50ICpjKTsKLQotLyogYyA9IGEgKiBiICovCi1pbnQgbXBfbXVsX2QobXBfaW50ICphLCBtcF9kaWdpdCBiLCBtcF9pbnQgKmMpOwotCi0vKiBhL2IgPT4gY2IgKyBkID09IGEgKi8KLWludCBtcF9kaXZfZChtcF9pbnQgKmEsIG1wX2RpZ2l0IGIsIG1wX2ludCAqYywgbXBfZGlnaXQgKmQpOwotCi0vKiBhLzMgPT4gM2MgKyBkID09IGEgKi8KLWludCBtcF9kaXZfMyhtcF9pbnQgKmEsIG1wX2ludCAqYywgbXBfZGlnaXQgKmQpOwotCi0vKiBjID0gYSoqYiAqLwotaW50IG1wX2V4cHRfZChtcF9pbnQgKmEsIG1wX2RpZ2l0IGIsIG1wX2ludCAqYyk7Ci0KLS8qIGMgPSBhIG1vZCBiLCAwIDw9IGMgPCBiICAqLwotaW50IG1wX21vZF9kKG1wX2ludCAqYSwgbXBfZGlnaXQgYiwgbXBfZGlnaXQgKmMpOwotCi0vKiAtLS0+IG51bWJlciB0aGVvcnkgPC0tLSAqLwotCi0vKiBkID0gYSArIGIgKG1vZCBjKSAqLwotaW50IG1wX2FkZG1vZChtcF9pbnQgKmEsIG1wX2ludCAqYiwgbXBfaW50ICpjLCBtcF9pbnQgKmQpOwotCi0vKiBkID0gYSAtIGIgKG1vZCBjKSAqLwotaW50IG1wX3N1Ym1vZChtcF9pbnQgKmEsIG1wX2ludCAqYiwgbXBfaW50ICpjLCBtcF9pbnQgKmQpOwotCi0vKiBkID0gYSAqIGIgKG1vZCBjKSAqLwotaW50IG1wX211bG1vZChtcF9pbnQgKmEsIG1wX2ludCAqYiwgbXBfaW50ICpjLCBtcF9pbnQgKmQpOwotCi0vKiBjID0gYSAqIGEgKG1vZCBiKSAqLwotaW50IG1wX3Nxcm1vZChtcF9pbnQgKmEsIG1wX2ludCAqYiwgbXBfaW50ICpjKTsKLQotLyogYyA9IDEvYSAobW9kIGIpICovCi1pbnQgbXBfaW52bW9kKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwotCi0vKiBjID0gKGEsIGIpICovCi1pbnQgbXBfZ2NkKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwotCi0vKiBwcm9kdWNlcyB2YWx1ZSBzdWNoIHRoYXQgVTEqYSArIFUyKmIgPSBVMyAqLwotaW50IG1wX2V4dGV1Y2xpZChtcF9pbnQgKmEsIG1wX2ludCAqYiwgbXBfaW50ICpVMSwgbXBfaW50ICpVMiwgbXBfaW50ICpVMyk7Ci0KLS8qIGMgPSBbYSwgYl0gb3IgKGEqYikvKGEsIGIpICovCi1pbnQgbXBfbGNtKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwotCi0vKiBmaW5kcyBvbmUgb2YgdGhlIGIndGggcm9vdCBvZiBhLCBzdWNoIHRoYXQgfGN8KipiIDw9IHxhfAotICoKLSAqIHJldHVybnMgZXJyb3IgaWYgYSA8IDAgYW5kIGIgaXMgZXZlbgotICovCi1pbnQgbXBfbl9yb290KG1wX2ludCAqYSwgbXBfZGlnaXQgYiwgbXBfaW50ICpjKTsKLQotLyogc3BlY2lhbCBzcXJ0IGFsZ28gKi8KLWludCBtcF9zcXJ0KG1wX2ludCAqYXJnLCBtcF9pbnQgKnJldCk7Ci0KLS8qIGlzIG51bWJlciBhIHNxdWFyZT8gKi8KLWludCBtcF9pc19zcXVhcmUobXBfaW50ICphcmcsIGludCAqcmV0KTsKLQotLyogY29tcHV0ZXMgdGhlIGphY29iaSBjID0gKGEgfCBuKSAob3IgTGVnZW5kcmUgaWYgYiBpcyBwcmltZSkgICovCi1pbnQgbXBfamFjb2JpKG1wX2ludCAqYSwgbXBfaW50ICpuLCBpbnQgKmMpOwotCi0vKiB1c2VkIHRvIHNldHVwIHRoZSBCYXJyZXR0IHJlZHVjdGlvbiBmb3IgYSBnaXZlbiBtb2R1bHVzIGIgKi8KLWludCBtcF9yZWR1Y2Vfc2V0dXAobXBfaW50ICphLCBtcF9pbnQgKmIpOwotCi0vKiBCYXJyZXR0IFJlZHVjdGlvbiwgY29tcHV0ZXMgYSAobW9kIGIpIHdpdGggYSBwcmVjb21wdXRlZCB2YWx1ZSBjCi0gKgotICogQXNzdW1lcyB0aGF0IDAgPCBhIDw9IGIqYiwgbm90ZSBpZiAwID4gYSA+IC0oYipiKSB0aGVuIHlvdSBjYW4gbWVyZWx5Ci0gKiBjb21wdXRlIHRoZSByZWR1Y3Rpb24gYXMgLTEgKiBtcF9yZWR1Y2UobXBfYWJzKGEpKSBbcHNldWRvIGNvZGVdLgotICovCi1pbnQgbXBfcmVkdWNlKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwotCi0vKiBzZXR1cHMgdGhlIG1vbnRnb21lcnkgcmVkdWN0aW9uICovCi1pbnQgbXBfbW9udGdvbWVyeV9zZXR1cChtcF9pbnQgKmEsIG1wX2RpZ2l0ICptcCk7Ci0KLS8qIGNvbXB1dGVzIGEgPSBCKipuIG1vZCBiIHdpdGhvdXQgZGl2aXNpb24gb3IgbXVsdGlwbGljYXRpb24gdXNlZnVsIGZvcgotICogbm9ybWFsaXppbmcgbnVtYmVycyBpbiBhIE1vbnRnb21lcnkgc3lzdGVtLgotICovCi1pbnQgbXBfbW9udGdvbWVyeV9jYWxjX25vcm1hbGl6YXRpb24obXBfaW50ICphLCBtcF9pbnQgKmIpOwotCi0vKiBjb21wdXRlcyB4L1IgPT0geCAobW9kIE4pIHZpYSBNb250Z29tZXJ5IFJlZHVjdGlvbiAqLwotaW50IG1wX21vbnRnb21lcnlfcmVkdWNlKG1wX2ludCAqYSwgbXBfaW50ICptLCBtcF9kaWdpdCBtcCk7Ci0KLS8qIHJldHVybnMgMSBpZiBhIGlzIGEgdmFsaWQgRFIgbW9kdWx1cyAqLwotaW50IG1wX2RyX2lzX21vZHVsdXMobXBfaW50ICphKTsKLQotLyogc2V0cyB0aGUgdmFsdWUgb2YgImQiIHJlcXVpcmVkIGZvciBtcF9kcl9yZWR1Y2UgKi8KLXZvaWQgbXBfZHJfc2V0dXAobXBfaW50ICphLCBtcF9kaWdpdCAqZCk7Ci0KLS8qIHJlZHVjZXMgYSBtb2R1bG8gYiB1c2luZyB0aGUgRGltaW5pc2hlZCBSYWRpeCBtZXRob2QgKi8KLWludCBtcF9kcl9yZWR1Y2UobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2RpZ2l0IG1wKTsKLQotLyogcmV0dXJucyB0cnVlIGlmIGEgY2FuIGJlIHJlZHVjZWQgd2l0aCBtcF9yZWR1Y2VfMmsgKi8KLWludCBtcF9yZWR1Y2VfaXNfMmsobXBfaW50ICphKTsKLQotLyogZGV0ZXJtaW5lcyBrIHZhbHVlIGZvciAyayByZWR1Y3Rpb24gKi8KLWludCBtcF9yZWR1Y2VfMmtfc2V0dXAobXBfaW50ICphLCBtcF9kaWdpdCAqZCk7Ci0KLS8qIHJlZHVjZXMgYSBtb2R1bG8gYiB3aGVyZSBiIGlzIG9mIHRoZSBmb3JtIDIqKnAgLSBrIFswIDw9IGFdICovCi1pbnQgbXBfcmVkdWNlXzJrKG1wX2ludCAqYSwgbXBfaW50ICpuLCBtcF9kaWdpdCBkKTsKLQotLyogZCA9IGEqKmIgKG1vZCBjKSAqLwotaW50IG1wX2V4cHRtb2QobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYywgbXBfaW50ICpkKTsKLQotLyogLS0tPiBQcmltZXMgPC0tLSAqLwotCi0vKiBudW1iZXIgb2YgcHJpbWVzICovCi0jaWZkZWYgTVBfOEJJVAotICAgI2RlZmluZSBQUklNRV9TSVpFICAgICAgMzEKLSNlbHNlCi0gICAjZGVmaW5lIFBSSU1FX1NJWkUgICAgICAyNTYKLSNlbmRpZgotCi0vKiB0YWJsZSBvZiBmaXJzdCBQUklNRV9TSVpFIHByaW1lcyAqLwotZXh0ZXJuIGNvbnN0IG1wX2RpZ2l0IF9fcHJpbWVfdGFiW107Ci0KLS8qIHJlc3VsdD0xIGlmIGEgaXMgZGl2aXNpYmxlIGJ5IG9uZSBvZiB0aGUgZmlyc3QgUFJJTUVfU0laRSBwcmltZXMgKi8KLWludCBtcF9wcmltZV9pc19kaXZpc2libGUobXBfaW50ICphLCBpbnQgKnJlc3VsdCk7Ci0KLS8qIHBlcmZvcm1zIG9uZSBGZXJtYXQgdGVzdCBvZiAiYSIgdXNpbmcgYmFzZSAiYiIuCi0gKiBTZXRzIHJlc3VsdCB0byAwIGlmIGNvbXBvc2l0ZSBvciAxIGlmIHByb2JhYmxlIHByaW1lCi0gKi8KLWludCBtcF9wcmltZV9mZXJtYXQobXBfaW50ICphLCBtcF9pbnQgKmIsIGludCAqcmVzdWx0KTsKLQotLyogcGVyZm9ybXMgb25lIE1pbGxlci1SYWJpbiB0ZXN0IG9mICJhIiB1c2luZyBiYXNlICJiIi4KLSAqIFNldHMgcmVzdWx0IHRvIDAgaWYgY29tcG9zaXRlIG9yIDEgaWYgcHJvYmFibGUgcHJpbWUKLSAqLwotaW50IG1wX3ByaW1lX21pbGxlcl9yYWJpbihtcF9pbnQgKmEsIG1wX2ludCAqYiwgaW50ICpyZXN1bHQpOwotCi0vKiBUaGlzIGdpdmVzIFtmb3IgYSBnaXZlbiBiaXQgc2l6ZV0gdGhlIG51bWJlciBvZiB0cmlhbHMgcmVxdWlyZWQKLSAqIHN1Y2ggdGhhdCBNaWxsZXItUmFiaW4gZ2l2ZXMgYSBwcm9iIG9mIGZhaWx1cmUgbG93ZXIgdGhhbiAyXi05NiAKLSAqLwotaW50IG1wX3ByaW1lX3JhYmluX21pbGxlcl90cmlhbHMoaW50IHNpemUpOwotCi0vKiBwZXJmb3JtcyB0IHJvdW5kcyBvZiBNaWxsZXItUmFiaW4gb24gImEiIHVzaW5nIHRoZSBmaXJzdAotICogdCBwcmltZSBiYXNlcy4gIEFsc28gcGVyZm9ybXMgYW4gaW5pdGlhbCBzaWV2ZSBvZiB0cmlhbAotICogZGl2aXNpb24uICBEZXRlcm1pbmVzIGlmICJhIiBpcyBwcmltZSB3aXRoIHByb2JhYmlsaXR5Ci0gKiBvZiBlcnJvciBubyBtb3JlIHRoYW4gKDEvNCkqKnQuCi0gKgotICogU2V0cyByZXN1bHQgdG8gMSBpZiBwcm9iYWJseSBwcmltZSwgMCBvdGhlcndpc2UKLSAqLwotaW50IG1wX3ByaW1lX2lzX3ByaW1lKG1wX2ludCAqYSwgaW50IHQsIGludCAqcmVzdWx0KTsKLQotLyogZmluZHMgdGhlIG5leHQgcHJpbWUgYWZ0ZXIgdGhlIG51bWJlciAiYSIgdXNpbmcgInQiIHRyaWFscwotICogb2YgTWlsbGVyLVJhYmluLgotICoKLSAqIGJic19zdHlsZSA9IDEgbWVhbnMgdGhlIHByaW1lIG11c3QgYmUgY29uZ3J1ZW50IHRvIDMgbW9kIDQKLSAqLwotaW50IG1wX3ByaW1lX25leHRfcHJpbWUobXBfaW50ICphLCBpbnQgdCwgaW50IGJic19zdHlsZSk7Ci0KLS8qIG1ha2VzIGEgdHJ1bHkgcmFuZG9tIHByaW1lIG9mIGEgZ2l2ZW4gc2l6ZSAoYnl0ZXMpLAotICogY2FsbCB3aXRoIGJicyA9IDEgaWYgeW91IHdhbnQgaXQgdG8gYmUgY29uZ3J1ZW50IHRvIDMgbW9kIDQgCi0gKgotICogWW91IGhhdmUgdG8gc3VwcGx5IGEgY2FsbGJhY2sgd2hpY2ggZmlsbHMgaW4gYSBidWZmZXIgd2l0aCByYW5kb20gYnl0ZXMuICAiZGF0IiBpcyBhIHBhcmFtZXRlciB5b3UgY2FuCi0gKiBoYXZlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgKGUuZy4gYSBzdGF0ZSBvciBzb21ldGhpbmcpLiAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHVzZSAiZGF0IiBpdHNlbGYKLSAqIHNvIGl0IGNhbiBiZSBOVUxMCi0gKgotICogVGhlIHByaW1lIGdlbmVyYXRlZCB3aWxsIGJlIGxhcmdlciB0aGFuIDJeKDgqc2l6ZSkuCi0gKi8KLSNkZWZpbmUgbXBfcHJpbWVfcmFuZG9tKGEsIHQsIHNpemUsIGJicywgY2IsIGRhdCkgbXBfcHJpbWVfcmFuZG9tX2V4KGEsIHQsICgoc2l6ZSkgKiA4KSArIDEsIChiYnM9PTEpP0xUTV9QUklNRV9CQlM6MCwgY2IsIGRhdCkKLQotLyogbWFrZXMgYSB0cnVseSByYW5kb20gcHJpbWUgb2YgYSBnaXZlbiBzaXplIChiaXRzKSwKLSAqCi0gKiBGbGFncyBhcmUgYXMgZm9sbG93czoKLSAqIAotICogICBMVE1fUFJJTUVfQkJTICAgICAgLSBtYWtlIHByaW1lIGNvbmdydWVudCB0byAzIG1vZCA0Ci0gKiAgIExUTV9QUklNRV9TQUZFICAgICAtIG1ha2Ugc3VyZSAocC0xKS8yIGlzIHByaW1lIGFzIHdlbGwgKGltcGxpZXMgTFRNX1BSSU1FX0JCUykKLSAqICAgTFRNX1BSSU1FXzJNU0JfT0ZGIC0gbWFrZSB0aGUgMm5kIGhpZ2hlc3QgYml0IHplcm8KLSAqICAgTFRNX1BSSU1FXzJNU0JfT04gIC0gbWFrZSB0aGUgMm5kIGhpZ2hlc3QgYml0IG9uZQotICoKLSAqIFlvdSBoYXZlIHRvIHN1cHBseSBhIGNhbGxiYWNrIHdoaWNoIGZpbGxzIGluIGEgYnVmZmVyIHdpdGggcmFuZG9tIGJ5dGVzLiAgImRhdCIgaXMgYSBwYXJhbWV0ZXIgeW91IGNhbgotICogaGF2ZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIChlLmcuIGEgc3RhdGUgb3Igc29tZXRoaW5nKS4gIFRoaXMgZnVuY3Rpb24gZG9lc24ndCB1c2UgImRhdCIgaXRzZWxmCi0gKiBzbyBpdCBjYW4gYmUgTlVMTAotICoKLSAqLwotaW50IG1wX3ByaW1lX3JhbmRvbV9leChtcF9pbnQgKmEsIGludCB0LCBpbnQgc2l6ZSwgaW50IGZsYWdzLCBsdG1fcHJpbWVfY2FsbGJhY2sgY2IsIHZvaWQgKmRhdCk7Ci0KLS8qIC0tLT4gcmFkaXggY29udmVyc2lvbiA8LS0tICovCi1pbnQgbXBfY291bnRfYml0cyhtcF9pbnQgKmEpOwotCi1pbnQgbXBfdW5zaWduZWRfYmluX3NpemUobXBfaW50ICphKTsKLWludCBtcF9yZWFkX3Vuc2lnbmVkX2JpbihtcF9pbnQgKmEsIHVuc2lnbmVkIGNoYXIgKmIsIGludCBjKTsKLWludCBtcF90b191bnNpZ25lZF9iaW4obXBfaW50ICphLCB1bnNpZ25lZCBjaGFyICpiKTsKLQotaW50IG1wX3NpZ25lZF9iaW5fc2l6ZShtcF9pbnQgKmEpOwotaW50IG1wX3JlYWRfc2lnbmVkX2JpbihtcF9pbnQgKmEsIHVuc2lnbmVkIGNoYXIgKmIsIGludCBjKTsKLWludCBtcF90b19zaWduZWRfYmluKG1wX2ludCAqYSwgdW5zaWduZWQgY2hhciAqYik7Ci0KLWludCBtcF9yZWFkX3JhZGl4KG1wX2ludCAqYSwgY2hhciAqc3RyLCBpbnQgcmFkaXgpOwotaW50IG1wX3RvcmFkaXgobXBfaW50ICphLCBjaGFyICpzdHIsIGludCByYWRpeCk7Ci1pbnQgbXBfdG9yYWRpeF9uKG1wX2ludCAqIGEsIGNoYXIgKnN0ciwgaW50IHJhZGl4LCBpbnQgbWF4bGVuKTsKLWludCBtcF9yYWRpeF9zaXplKG1wX2ludCAqYSwgaW50IHJhZGl4LCBpbnQgKnNpemUpOwotCi1pbnQgbXBfZnJlYWQobXBfaW50ICphLCBpbnQgcmFkaXgsIEZJTEUgKnN0cmVhbSk7Ci1pbnQgbXBfZndyaXRlKG1wX2ludCAqYSwgaW50IHJhZGl4LCBGSUxFICpzdHJlYW0pOwotCi0jZGVmaW5lIG1wX3JlYWRfcmF3KG1wLCBzdHIsIGxlbikgbXBfcmVhZF9zaWduZWRfYmluKChtcCksIChzdHIpLCAobGVuKSkKLSNkZWZpbmUgbXBfcmF3X3NpemUobXApICAgICAgICAgICBtcF9zaWduZWRfYmluX3NpemUobXApCi0jZGVmaW5lIG1wX3RvcmF3KG1wLCBzdHIpICAgICAgICAgbXBfdG9fc2lnbmVkX2JpbigobXApLCAoc3RyKSkKLSNkZWZpbmUgbXBfcmVhZF9tYWcobXAsIHN0ciwgbGVuKSBtcF9yZWFkX3Vuc2lnbmVkX2JpbigobXApLCAoc3RyKSwgKGxlbikpCi0jZGVmaW5lIG1wX21hZ19zaXplKG1wKSAgICAgICAgICAgbXBfdW5zaWduZWRfYmluX3NpemUobXApCi0jZGVmaW5lIG1wX3RvbWFnKG1wLCBzdHIpICAgICAgICAgbXBfdG9fdW5zaWduZWRfYmluKChtcCksIChzdHIpKQotCi0jZGVmaW5lIG1wX3RvYmluYXJ5KE0sIFMpICBtcF90b3JhZGl4KChNKSwgKFMpLCAyKQotI2RlZmluZSBtcF90b29jdGFsKE0sIFMpICAgbXBfdG9yYWRpeCgoTSksIChTKSwgOCkKLSNkZWZpbmUgbXBfdG9kZWNpbWFsKE0sIFMpIG1wX3RvcmFkaXgoKE0pLCAoUyksIDEwKQotI2RlZmluZSBtcF90b2hleChNLCBTKSAgICAgbXBfdG9yYWRpeCgoTSksIChTKSwgMTYpCi0KLS8qIGxvd2xldmVsIGZ1bmN0aW9ucywgZG8gbm90IGNhbGwhICovCi1pbnQgc19tcF9hZGQobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYyk7Ci1pbnQgc19tcF9zdWIobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYyk7Ci0jZGVmaW5lIHNfbXBfbXVsKGEsIGIsIGMpIHNfbXBfbXVsX2RpZ3MoYSwgYiwgYywgKGEpLT51c2VkICsgKGIpLT51c2VkICsgMSkKLWludCBmYXN0X3NfbXBfbXVsX2RpZ3MobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYywgaW50IGRpZ3MpOwotaW50IHNfbXBfbXVsX2RpZ3MobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYywgaW50IGRpZ3MpOwotaW50IGZhc3Rfc19tcF9tdWxfaGlnaF9kaWdzKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMsIGludCBkaWdzKTsKLWludCBzX21wX211bF9oaWdoX2RpZ3MobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYywgaW50IGRpZ3MpOwotaW50IGZhc3Rfc19tcF9zcXIobXBfaW50ICphLCBtcF9pbnQgKmIpOwotaW50IHNfbXBfc3FyKG1wX2ludCAqYSwgbXBfaW50ICpiKTsKLWludCBtcF9rYXJhdHN1YmFfbXVsKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwotaW50IG1wX3Rvb21fbXVsKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKmMpOwotaW50IG1wX2thcmF0c3ViYV9zcXIobXBfaW50ICphLCBtcF9pbnQgKmIpOwotaW50IG1wX3Rvb21fc3FyKG1wX2ludCAqYSwgbXBfaW50ICpiKTsKLWludCBmYXN0X21wX2ludm1vZChtcF9pbnQgKmEsIG1wX2ludCAqYiwgbXBfaW50ICpjKTsKLWludCBmYXN0X21wX21vbnRnb21lcnlfcmVkdWNlKG1wX2ludCAqYSwgbXBfaW50ICptLCBtcF9kaWdpdCBtcCk7Ci1pbnQgbXBfZXhwdG1vZF9mYXN0KG1wX2ludCAqRywgbXBfaW50ICpYLCBtcF9pbnQgKlAsIG1wX2ludCAqWSwgaW50IG1vZGUpOwotaW50IHNfbXBfZXhwdG1vZCAobXBfaW50ICogRywgbXBfaW50ICogWCwgbXBfaW50ICogUCwgbXBfaW50ICogWSk7Ci12b2lkIGJuX3JldmVyc2UodW5zaWduZWQgY2hhciAqcywgaW50IGxlbik7Ci0KLWV4dGVybiBjb25zdCBjaGFyICptcF9zX3JtYXA7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotICAgfQotI2VuZGlmCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5jeWd3aW5fZGxsIGIvbWFrZWZpbGUuY3lnd2luX2RsbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3Njc3ZC4uMDAwMDAwMAotLS0gYS9tYWtlZmlsZS5jeWd3aW5fZGxsCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotI21ha2VmaWxlIGZvciBDeWd3aW4gW21ha2VzIGEgLmRsbF0KLQotZGVmYXVsdDogbHRjX2RsbAotCi0KLSMgQ29tcGlsYXRpb24gZmxhZ3MuIE5vdGUgdGhlICs9IGRvZXMgbm90IHdyaXRlIG92ZXIgdGhlIHVzZXIncyBDRkxBR1MhCi1DRkxBR1MgKz0gLUkuLyAtV2FsbCAtV3NpZ24tY29tcGFyZSAtVyAtV25vLXVudXNlZCAtV3NoYWRvdyAtbW5vLWN5Z3dpbiAtRFdJTjMyCi0KLSMgb3B0aW1pemUgZm9yIFNQRUVECi0jQ0ZMQUdTICs9IC1PMyAtZnVucm9sbC1sb29wcwotCi0jYWRkIC1mb21pdC1mcmFtZS1wb2ludGVyLiAgdjMuMiBpcyBidWdneSBmb3IgY2VydGFpbiBwbGF0Zm9ybXMhCi0jQ0ZMQUdTICs9IC1mb21pdC1mcmFtZS1wb2ludGVyCi0KLSMgb3B0aW1pemUgZm9yIFNJWkUKLUNGTEFHUyArPSAtT3MKLQotI0xlYXZlIE1QSSBidWlsdC1pbiBvciBmb3JjZSBkZXZlbG9wZXIgdG8gbGluayBhZ2FpbnN0IGxpYnRvbW1hdGg/Ci1NUElPQkpFQ1Q9bXBpLm8KLQotT0JKRUNUUz1lcnJvcl90b19zdHJpbmcubyBtcGlfdG9fbHRjX2Vycm9yLm8gYmFzZTY0X2VuY29kZS5vIGJhc2U2NF9kZWNvZGUubyBcCi1cCi1jcnlwdC5vICAgICAgICAgICAgICAgICAgICBjcnlwdF9maW5kX2NpcGhlci5vICAgICAgY3J5cHRfZmluZF9oYXNoX2FueS5vICAgICAgXAotY3J5cHRfaGFzaF9pc192YWxpZC5vICAgICAgY3J5cHRfcmVnaXN0ZXJfaGFzaC5vICAgIGNyeXB0X3VucmVnaXN0ZXJfcHJuZy5vICAgIFwKLWNyeXB0X2FyZ2Noay5vICAgICAgICAgICAgIGNyeXB0X2ZpbmRfY2lwaGVyX2FueS5vICBjcnlwdF9maW5kX2hhc2hfaWQubyAgICAgICBcCi1jcnlwdF9wcm5nX2Rlc2NyaXB0b3IubyAgICBjcnlwdF9yZWdpc3Rlcl9wcm5nLm8gICAgY3J5cHRfY2lwaGVyX2Rlc2NyaXB0b3IubyAgXAotY3J5cHRfZmluZF9jaXBoZXJfaWQubyAgICAgY3J5cHRfZmluZF9wcm5nLm8gICAgICAgIGNyeXB0X3BybmdfaXNfdmFsaWQubyAgICAgIFwKLWNyeXB0X3VucmVnaXN0ZXJfY2lwaGVyLm8gIGNyeXB0X2NpcGhlcl9pc192YWxpZC5vICBjcnlwdF9maW5kX2hhc2gubyAgICAgICAgICBcCi1jcnlwdF9oYXNoX2Rlc2NyaXB0b3IubyAgICBjcnlwdF9yZWdpc3Rlcl9jaXBoZXIubyAgY3J5cHRfdW5yZWdpc3Rlcl9oYXNoLm8gICAgXAotXAotc3BybmcubyB5YXJyb3cubyByYzQubyBybmdfZ2V0X2J5dGVzLm8gIHJuZ19tYWtlX3BybmcubyBcCi1cCi1yYW5kX3ByaW1lLm8gaXNfcHJpbWUubyBcCi1cCi1lY2MubyAgZGgubyBcCi1cCi1yc2FfZGVjcnlwdF9rZXkubyAgcnNhX2VuY3J5cHRfa2V5Lm8gIHJzYV9leHB0bW9kLm8gIHJzYV9mcmVlLm8gIHJzYV9tYWtlX2tleS5vICBcCi1yc2Ffc2lnbl9oYXNoLm8gIHJzYV92ZXJpZnlfaGFzaC5vIHJzYV9leHBvcnQubyByc2FfaW1wb3J0Lm8gdGltX2V4cHRtb2QubyBcCi1cCi1kc2FfZXhwb3J0Lm8gIGRzYV9mcmVlLm8gIGRzYV9pbXBvcnQubyAgZHNhX21ha2Vfa2V5Lm8gIGRzYV9zaWduX2hhc2gubyAgXAotZHNhX3ZlcmlmeV9oYXNoLm8gIGRzYV92ZXJpZnlfa2V5Lm8gXAotXAotYWVzLm8gYWVzX2VuYy5vIFwKLVwKLWJsb3dmaXNoLm8gZGVzLm8gc2FmZXJfdGFiLm8gc2FmZXIubyBzYWZlcnAubyByYzIubyB4dGVhLm8gXAotcmM2Lm8gcmM1Lm8gY2FzdDUubyBub2VrZW9uLm8gdHdvZmlzaC5vIHNraXBqYWNrLm8gXAotXAotbWQyLm8gbWQ0Lm8gbWQ1Lm8gc2hhMS5vIHNoYTI1Ni5vIHNoYTUxMi5vIHRpZ2VyLm8gd2hpcmwubyBcCi1ybWQxMjgubyBybWQxNjAubyBcCi1cCi1wYWNrZXRfc3RvcmVfaGVhZGVyLm8gIHBhY2tldF92YWxpZF9oZWFkZXIubyBcCi1cCi1lYXhfYWRkaGVhZGVyLm8gIGVheF9kZWNyeXB0Lm8gIGVheF9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkubyAgZWF4X2RvbmUubyAgZWF4X2VuY3J5cHQubyAgXAotZWF4X2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5vICBlYXhfaW5pdC5vICBlYXhfdGVzdC5vIFwKLVwKLW9jYl9kZWNyeXB0Lm8gIG9jYl9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkubyAgb2NiX2RvbmVfZGVjcnlwdC5vICBvY2JfZG9uZV9lbmNyeXB0Lm8gIFwKLW9jYl9lbmNyeXB0Lm8gIG9jYl9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkubyAgb2NiX2luaXQubyAgb2NiX250ei5vICBcCi1vY2Jfc2hpZnRfeG9yLm8gIG9jYl90ZXN0Lm8gc19vY2JfZG9uZS5vIFwKLVwKLW9tYWNfZG9uZS5vICBvbWFjX2ZpbGUubyAgb21hY19pbml0Lm8gIG9tYWNfbWVtb3J5Lm8gIG9tYWNfcHJvY2Vzcy5vICBvbWFjX3Rlc3QubyBcCi1cCi1wbWFjX2RvbmUubyAgcG1hY19maWxlLm8gIHBtYWNfaW5pdC5vICBwbWFjX21lbW9yeS5vICBwbWFjX250ei5vICBwbWFjX3Byb2Nlc3MubyAgXAotcG1hY19zaGlmdF94b3IubyAgcG1hY190ZXN0Lm8gXAotXAotY2JjX3N0YXJ0Lm8gY2JjX2VuY3J5cHQubyBjYmNfZGVjcnlwdC5vIGNiY19nZXRpdi5vIGNiY19zZXRpdi5vIFwKLWNmYl9zdGFydC5vIGNmYl9lbmNyeXB0Lm8gY2ZiX2RlY3J5cHQubyBjZmJfZ2V0aXYubyBjZmJfc2V0aXYubyBcCi1vZmJfc3RhcnQubyBvZmJfZW5jcnlwdC5vIG9mYl9kZWNyeXB0Lm8gb2ZiX2dldGl2Lm8gb2ZiX3NldGl2Lm8gXAotY3RyX3N0YXJ0Lm8gY3RyX2VuY3J5cHQubyBjdHJfZGVjcnlwdC5vIGN0cl9nZXRpdi5vIGN0cl9zZXRpdi5vIFwKLWVjYl9zdGFydC5vIGVjYl9lbmNyeXB0Lm8gZWNiX2RlY3J5cHQubyBcCi1cCi1oYXNoX2ZpbGUubyAgaGFzaF9maWxlaGFuZGxlLm8gIGhhc2hfbWVtb3J5Lm8gXAotXAotaG1hY19kb25lLm8gIGhtYWNfZmlsZS5vICBobWFjX2luaXQubyAgaG1hY19tZW1vcnkubyAgaG1hY19wcm9jZXNzLm8gIGhtYWNfdGVzdC5vIFwKLVwKLXBrY3NfMV9tZ2YxLm8gcGtjc18xX29hZXBfZW5jb2RlLm8gcGtjc18xX29hZXBfZGVjb2RlLm8gIFwKLXBrY3NfMV9wc3NfZW5jb2RlLm8gcGtjc18xX3Bzc19kZWNvZGUubyBwa2NzXzFfaTJvc3AubyBwa2NzXzFfb3MyaXAubyBcCi1wa2NzXzFfdjE1X2VzX2VuY29kZS5vIHBrY3NfMV92MTVfZXNfZGVjb2RlLm8gcGtjc18xX3YxNV9zYV9lbmNvZGUubyBwa2NzXzFfdjE1X3NhX2RlY29kZS5vIFwKLVwKLXBrY3NfNV8xLm8gcGtjc181XzIubyBcCi1cCi1idXJuX3N0YWNrLm8gemVyb21lbS5vIFwKLSQoTVBJT0JKRUNUKQotCi0jY2lwaGVycyBjb21lIGluIHR3byBmbGF2b3Vycy4uLiBlbmMrZGVjIGFuZCBlbmMgCi1hZXNfZW5jLm86IGFlcy5jIGFlc190YWIuYwotCSQoQ0MpICQoQ0ZMQUdTKSAtREVOQ1JZUFRfT05MWSAtYyBhZXMuYyAtbyBhZXNfZW5jLm8KLQotbHRjX2RsbDogJChPQkpFQ1RTKSAkKE1QSU9CSkVDVCkKLQlnY2MgLW1uby1jeWd3aW4gLW1kbGwgLW8gbGlidG9tY3J5cHQuZGxsIC1XbCwtLW91dC1pbXBsaWI9bGlidG9tY3J5cHQuZGxsLmEgLVdsLC0tZXhwb3J0LWFsbC1zeW1ib2xzICoubyAtbGFkdmFwaTMyCi0JcmFubGliIGxpYnRvbWNyeXB0LmRsbC5hCmRpZmYgLS1naXQgYS9tYWtlZmlsZS5pY2MgYi9tYWtlZmlsZS5pY2MKaW5kZXggMjA4YTNjZi4uYTlhYjM4ZiAxMDA2NDQKLS0tIGEvbWFrZWZpbGUuaWNjCisrKyBiL21ha2VmaWxlLmljYwpAQCAtMjIsNyArMjIsNyBAQAogI0FSRkxBR1M9cgogCiAjIENvbXBpbGF0aW9uIGZsYWdzLiBOb3RlIHRoZSArPSBkb2VzIG5vdCB3cml0ZSBvdmVyIHRoZSB1c2VyJ3MgQ0ZMQUdTIQotQ0ZMQUdTICs9IC1jIC1JLi8gLURJTlRFTF9DQworQ0ZMQUdTICs9IC1jIC1Jc3JjL2hlYWRlcnMvIC1JdGVzdHByb2YvIC1ESU5URUxfQ0MKIAogI1RoZSBkZWZhdWx0IHJ1bGUgZm9yIG1ha2UgYnVpbGRzIHRoZSBsaWJ0b21jcnlwdCBsaWJyYXJ5LgogZGVmYXVsdDpsaWJyYXJ5CkBAIC0zMCwxOCArMzAsMjQgQEAKICMgb3B0aW1pemUgZm9yIFNQRUVECiAjCiAjIC1tY3B1PSBjYW4gYmUgcGVudGl1bSwgcGVudGl1bXBybyAoY292ZXJzIFBJSSB0aHJvdWdoIFBJSUkpIG9yIHBlbnRpdW00Ci0jIC1heD8gICBzcGVjaWZpZXMgbWFrZSBjb2RlIHNwZWNpZmljYWxseSBmb3IgPyBidXQgY29tcGF0aWJsZSB3aXRoIElBLTMyCi0jIC14PyAgICBzcGVjaWZpZXMgY29tcGlsZSBzb2xlbHkgZm9yID8gW25vdCBzcGVjaWZpY2FsbHkgSUEtMzIgY29tcGF0aWJsZV0KKyMgLWF4PwlzcGVjaWZpZXMgbWFrZSBjb2RlIHNwZWNpZmljYWxseSBmb3IgPyBidXQgY29tcGF0aWJsZSB3aXRoIElBLTMyCisjIC14Pwkgc3BlY2lmaWVzIGNvbXBpbGUgc29sZWx5IGZvciA/IFtub3Qgc3BlY2lmaWNhbGx5IElBLTMyIGNvbXBhdGlibGVdCiAjCiAjIHdoZXJlID8gaXMgCi0jICAgSyAtIFBJSUkKLSMgICBXIC0gZmlyc3QgUDQgW1dpbGxpYW1ldHRlXQotIyAgIE4gLSBQNCBOb3J0aHdvb2QKLSMgICBQIC0gUDQgUHJlc2NvdHQKLSMgICBCIC0gQmxlbmQgb2YgUDQgYW5kIFBNIFttb2JpbGVdCisjCUsgLSBQSUlJCisjCVcgLSBmaXJzdCBQNCBbV2lsbGlhbWV0dGVdCisjCU4gLSBQNCBOb3J0aHdvb2QKKyMJUCAtIFA0IFByZXNjb3R0CisjCUIgLSBCbGVuZCBvZiBQNCBhbmQgUE0gW21vYmlsZV0KICMKICMgRGVmYXVsdCB0byBqdXN0IGdlbmVyaWMgbWF4IG9wdHMKLUNGTEFHUyArPSAtTzMgLXhOIC1pcAoraWZkZWYgTFRDX1NNQUxMCitDRkxBR1MgKz0gLU8yIC14UCAtaXAKK2VuZGlmCisKK2lmbmRlZiBJR05PUkVfU1BFRUQKK0NGTEFHUyArPSAtTzMgLXhQIC1pcCAKK2VuZGlmCiAKICMgd2FudCB0byBzZWUgc3R1ZmY/CiAjQ0ZMQUdTICs9IC1vcHRfcmVwb3J0CkBAIC01MCwxMSArNTYsMTUgQEAKIAogI091dHB1dCBmaWxlbmFtZXMgZm9yIHZhcmlvdXMgdGFyZ2V0cy4KIExJQk5BTUU9bGlidG9tY3J5cHQuYQorTElCVEVTVD10ZXN0cHJvZi9saWJ0b21jcnlwdF9wcm9mLmEKIEhBU0g9aGFzaHN1bQogQ1JZUFQ9ZW5jcnlwdAogU01BTEw9c21hbGwKIFBST0Y9eDg2X3Byb2YKIFRWPXR2X2dlbgorTVVMVEk9bXVsdGkKK1RJTUlORz10aW1pbmcKK1RFU1Q9dGVzdAogCiAjTElCUEFUSC1UaGUgZGlyZWN0b3J5IGZvciBsaWJ0b21jcnlwdCB0byBiZSBpbnN0YWxsZWQgdG8uCiAjSU5DUEFUSC1UaGUgZGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIGhlYWRlciBmaWxlcyBmb3IgbGlidG9tY3J5cHQuCkBAIC02Nyw3MSArNzcsOTQgQEAKICNMaXN0IG9mIG9iamVjdHMgdG8gY29tcGlsZS4KIAogI0xlYXZlIE1QSSBidWlsdC1pbiBvciBmb3JjZSBkZXZlbG9wZXIgdG8gbGluayBhZ2FpbnN0IGxpYnRvbW1hdGg/Ci1NUElPQkpFQ1Q9bXBpLm8KK01QSU9CSkVDVD1zcmMvbWlzYy9tcGkvbXBpLm8KIAotT0JKRUNUUz1lcnJvcl90b19zdHJpbmcubyBtcGlfdG9fbHRjX2Vycm9yLm8gYmFzZTY0X2VuY29kZS5vIGJhc2U2NF9kZWNvZGUubyBcCi1cCi1jcnlwdC5vICAgICAgICAgICAgICAgICAgICBjcnlwdF9maW5kX2NpcGhlci5vICAgICAgY3J5cHRfZmluZF9oYXNoX2FueS5vICAgICAgXAotY3J5cHRfaGFzaF9pc192YWxpZC5vICAgICAgY3J5cHRfcmVnaXN0ZXJfaGFzaC5vICAgIGNyeXB0X3VucmVnaXN0ZXJfcHJuZy5vICAgIFwKLWNyeXB0X2FyZ2Noay5vICAgICAgICAgICAgIGNyeXB0X2ZpbmRfY2lwaGVyX2FueS5vICBjcnlwdF9maW5kX2hhc2hfaWQubyAgICAgICBcCi1jcnlwdF9wcm5nX2Rlc2NyaXB0b3IubyAgICBjcnlwdF9yZWdpc3Rlcl9wcm5nLm8gICAgY3J5cHRfY2lwaGVyX2Rlc2NyaXB0b3IubyAgXAotY3J5cHRfZmluZF9jaXBoZXJfaWQubyAgICAgY3J5cHRfZmluZF9wcm5nLm8gICAgICAgIGNyeXB0X3BybmdfaXNfdmFsaWQubyAgICAgIFwKLWNyeXB0X3VucmVnaXN0ZXJfY2lwaGVyLm8gIGNyeXB0X2NpcGhlcl9pc192YWxpZC5vICBjcnlwdF9maW5kX2hhc2gubyAgICAgICAgICBcCi1jcnlwdF9oYXNoX2Rlc2NyaXB0b3IubyAgICBjcnlwdF9yZWdpc3Rlcl9jaXBoZXIubyAgY3J5cHRfdW5yZWdpc3Rlcl9oYXNoLm8gICAgXAotXAotc3BybmcubyB5YXJyb3cubyByYzQubyBybmdfZ2V0X2J5dGVzLm8gIHJuZ19tYWtlX3BybmcubyBcCi1cCi1yYW5kX3ByaW1lLm8gaXNfcHJpbWUubyBcCi1cCi1lY2MubyAgZGgubyBcCi1cCi1yc2FfZGVjcnlwdF9rZXkubyAgcnNhX2VuY3J5cHRfa2V5Lm8gIHJzYV9leHB0bW9kLm8gIHJzYV9mcmVlLm8gIHJzYV9tYWtlX2tleS5vICBcCi1yc2Ffc2lnbl9oYXNoLm8gIHJzYV92ZXJpZnlfaGFzaC5vIHJzYV9leHBvcnQubyByc2FfaW1wb3J0Lm8gdGltX2V4cHRtb2QubyBcCi1cCi1kc2FfZXhwb3J0Lm8gIGRzYV9mcmVlLm8gIGRzYV9pbXBvcnQubyAgZHNhX21ha2Vfa2V5Lm8gIGRzYV9zaWduX2hhc2gubyAgXAotZHNhX3ZlcmlmeV9oYXNoLm8gIGRzYV92ZXJpZnlfa2V5Lm8gXAotXAotYWVzLm8gYWVzX2VuYy5vIFwKLVwKLWJsb3dmaXNoLm8gZGVzLm8gc2FmZXJfdGFiLm8gc2FmZXIubyBzYWZlcnAubyByYzIubyB4dGVhLm8gXAotcmM2Lm8gcmM1Lm8gY2FzdDUubyBub2VrZW9uLm8gdHdvZmlzaC5vIHNraXBqYWNrLm8gXAotXAotbWQyLm8gbWQ0Lm8gbWQ1Lm8gc2hhMS5vIHNoYTI1Ni5vIHNoYTUxMi5vIHRpZ2VyLm8gd2hpcmwubyBcCi1ybWQxMjgubyBybWQxNjAubyBcCi1cCi1wYWNrZXRfc3RvcmVfaGVhZGVyLm8gIHBhY2tldF92YWxpZF9oZWFkZXIubyBcCi1cCi1lYXhfYWRkaGVhZGVyLm8gIGVheF9kZWNyeXB0Lm8gIGVheF9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkubyAgZWF4X2RvbmUubyAgZWF4X2VuY3J5cHQubyAgXAotZWF4X2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5vICBlYXhfaW5pdC5vICBlYXhfdGVzdC5vIFwKLVwKLW9jYl9kZWNyeXB0Lm8gIG9jYl9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkubyAgb2NiX2RvbmVfZGVjcnlwdC5vICBvY2JfZG9uZV9lbmNyeXB0Lm8gIFwKLW9jYl9lbmNyeXB0Lm8gIG9jYl9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkubyAgb2NiX2luaXQubyAgb2NiX250ei5vICBcCi1vY2Jfc2hpZnRfeG9yLm8gIG9jYl90ZXN0Lm8gc19vY2JfZG9uZS5vIFwKLVwKLW9tYWNfZG9uZS5vICBvbWFjX2ZpbGUubyAgb21hY19pbml0Lm8gIG9tYWNfbWVtb3J5Lm8gIG9tYWNfcHJvY2Vzcy5vICBvbWFjX3Rlc3QubyBcCi1cCi1wbWFjX2RvbmUubyAgcG1hY19maWxlLm8gIHBtYWNfaW5pdC5vICBwbWFjX21lbW9yeS5vICBwbWFjX250ei5vICBwbWFjX3Byb2Nlc3MubyAgXAotcG1hY19zaGlmdF94b3IubyAgcG1hY190ZXN0Lm8gXAotXAotY2JjX3N0YXJ0Lm8gY2JjX2VuY3J5cHQubyBjYmNfZGVjcnlwdC5vIGNiY19nZXRpdi5vIGNiY19zZXRpdi5vIFwKLWNmYl9zdGFydC5vIGNmYl9lbmNyeXB0Lm8gY2ZiX2RlY3J5cHQubyBjZmJfZ2V0aXYubyBjZmJfc2V0aXYubyBcCi1vZmJfc3RhcnQubyBvZmJfZW5jcnlwdC5vIG9mYl9kZWNyeXB0Lm8gb2ZiX2dldGl2Lm8gb2ZiX3NldGl2Lm8gXAotY3RyX3N0YXJ0Lm8gY3RyX2VuY3J5cHQubyBjdHJfZGVjcnlwdC5vIGN0cl9nZXRpdi5vIGN0cl9zZXRpdi5vIFwKLWVjYl9zdGFydC5vIGVjYl9lbmNyeXB0Lm8gZWNiX2RlY3J5cHQubyBcCi1cCi1oYXNoX2ZpbGUubyAgaGFzaF9maWxlaGFuZGxlLm8gIGhhc2hfbWVtb3J5Lm8gXAotXAotaG1hY19kb25lLm8gIGhtYWNfZmlsZS5vICBobWFjX2luaXQubyAgaG1hY19tZW1vcnkubyAgaG1hY19wcm9jZXNzLm8gIGhtYWNfdGVzdC5vIFwKLVwKLXBrY3NfMV9tZ2YxLm8gcGtjc18xX29hZXBfZW5jb2RlLm8gcGtjc18xX29hZXBfZGVjb2RlLm8gIFwKLXBrY3NfMV9wc3NfZW5jb2RlLm8gcGtjc18xX3Bzc19kZWNvZGUubyBwa2NzXzFfaTJvc3AubyBwa2NzXzFfb3MyaXAubyBcCi1wa2NzXzFfdjE1X2VzX2VuY29kZS5vIHBrY3NfMV92MTVfZXNfZGVjb2RlLm8gcGtjc18xX3YxNV9zYV9lbmNvZGUubyBwa2NzXzFfdjE1X3NhX2RlY29kZS5vIFwKLVwKLXBrY3NfNV8xLm8gcGtjc181XzIubyBcCi1cCi1idXJuX3N0YWNrLm8gemVyb21lbS5vIFwKLSQoTVBJT0JKRUNUKQorT0JKRUNUUz1zcmMvY2lwaGVycy9hZXMvYWVzX2VuYy5vICQoTVBJT0JKRUNUKSBzcmMvY2lwaGVycy9hZXMvYWVzLm8gc3JjL2NpcGhlcnMvYW51YmlzLm8gXAorc3JjL2NpcGhlcnMvYmxvd2Zpc2gubyBzcmMvY2lwaGVycy9jYXN0NS5vIHNyYy9jaXBoZXJzL2Rlcy5vIHNyYy9jaXBoZXJzL2toYXphZC5vIHNyYy9jaXBoZXJzL25vZWtlb24ubyBcCitzcmMvY2lwaGVycy9yYzIubyBzcmMvY2lwaGVycy9yYzUubyBzcmMvY2lwaGVycy9yYzYubyBzcmMvY2lwaGVycy9zYWZlci9zYWZlci5vIFwKK3NyYy9jaXBoZXJzL3NhZmVyL3NhZmVyX3RhYi5vIHNyYy9jaXBoZXJzL3NhZmVyL3NhZmVycC5vIHNyYy9jaXBoZXJzL3NraXBqYWNrLm8gXAorc3JjL2NpcGhlcnMvdHdvZmlzaC90d29maXNoLm8gc3JjL2NpcGhlcnMveHRlYS5vIHNyYy9lbmNhdXRoL2NjbS9jY21fbWVtb3J5Lm8gXAorc3JjL2VuY2F1dGgvY2NtL2NjbV90ZXN0Lm8gc3JjL2VuY2F1dGgvZWF4L2VheF9hZGRoZWFkZXIubyBzcmMvZW5jYXV0aC9lYXgvZWF4X2RlY3J5cHQubyBcCitzcmMvZW5jYXV0aC9lYXgvZWF4X2RlY3J5cHRfdmVyaWZ5X21lbW9yeS5vIHNyYy9lbmNhdXRoL2VheC9lYXhfZG9uZS5vIHNyYy9lbmNhdXRoL2VheC9lYXhfZW5jcnlwdC5vIFwKK3NyYy9lbmNhdXRoL2VheC9lYXhfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5Lm8gc3JjL2VuY2F1dGgvZWF4L2VheF9pbml0Lm8gXAorc3JjL2VuY2F1dGgvZWF4L2VheF90ZXN0Lm8gc3JjL2VuY2F1dGgvZ2NtL2djbV9hZGRfYWFkLm8gc3JjL2VuY2F1dGgvZ2NtL2djbV9hZGRfaXYubyBcCitzcmMvZW5jYXV0aC9nY20vZ2NtX2RvbmUubyBzcmMvZW5jYXV0aC9nY20vZ2NtX2dmX211bHQubyBzcmMvZW5jYXV0aC9nY20vZ2NtX2luaXQubyBcCitzcmMvZW5jYXV0aC9nY20vZ2NtX21lbW9yeS5vIHNyYy9lbmNhdXRoL2djbS9nY21fcHJvY2Vzcy5vIHNyYy9lbmNhdXRoL2djbS9nY21fcmVzZXQubyBcCitzcmMvZW5jYXV0aC9nY20vZ2NtX3Rlc3QubyBzcmMvZW5jYXV0aC9vY2Ivb2NiX2RlY3J5cHQubyBzcmMvZW5jYXV0aC9vY2Ivb2NiX2RlY3J5cHRfdmVyaWZ5X21lbW9yeS5vIFwKK3NyYy9lbmNhdXRoL29jYi9vY2JfZG9uZV9kZWNyeXB0Lm8gc3JjL2VuY2F1dGgvb2NiL29jYl9kb25lX2VuY3J5cHQubyBzcmMvZW5jYXV0aC9vY2Ivb2NiX2VuY3J5cHQubyBcCitzcmMvZW5jYXV0aC9vY2Ivb2NiX2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5vIHNyYy9lbmNhdXRoL29jYi9vY2JfaW5pdC5vIHNyYy9lbmNhdXRoL29jYi9vY2JfbnR6Lm8gXAorc3JjL2VuY2F1dGgvb2NiL29jYl9zaGlmdF94b3IubyBzcmMvZW5jYXV0aC9vY2Ivb2NiX3Rlc3QubyBzcmMvZW5jYXV0aC9vY2Ivc19vY2JfZG9uZS5vIFwKK3NyYy9oYXNoZXMvY2hjL2NoYy5vIHNyYy9oYXNoZXMvaGVscGVyL2hhc2hfZmlsZS5vIHNyYy9oYXNoZXMvaGVscGVyL2hhc2hfZmlsZWhhbmRsZS5vIFwKK3NyYy9oYXNoZXMvaGVscGVyL2hhc2hfbWVtb3J5Lm8gc3JjL2hhc2hlcy9oZWxwZXIvaGFzaF9tZW1vcnlfbXVsdGkubyBzcmMvaGFzaGVzL21kMi5vIHNyYy9oYXNoZXMvbWQ0Lm8gXAorc3JjL2hhc2hlcy9tZDUubyBzcmMvaGFzaGVzL3JtZDEyOC5vIHNyYy9oYXNoZXMvcm1kMTYwLm8gc3JjL2hhc2hlcy9zaGExLm8gc3JjL2hhc2hlcy9zaGEyL3NoYTI1Ni5vIFwKK3NyYy9oYXNoZXMvc2hhMi9zaGE1MTIubyBzcmMvaGFzaGVzL3RpZ2VyLm8gc3JjL2hhc2hlcy93aGlybC93aGlybC5vIHNyYy9tYWMvaG1hYy9obWFjX2RvbmUubyBcCitzcmMvbWFjL2htYWMvaG1hY19maWxlLm8gc3JjL21hYy9obWFjL2htYWNfaW5pdC5vIHNyYy9tYWMvaG1hYy9obWFjX21lbW9yeS5vIFwKK3NyYy9tYWMvaG1hYy9obWFjX21lbW9yeV9tdWx0aS5vIHNyYy9tYWMvaG1hYy9obWFjX3Byb2Nlc3MubyBzcmMvbWFjL2htYWMvaG1hY190ZXN0Lm8gXAorc3JjL21hYy9vbWFjL29tYWNfZG9uZS5vIHNyYy9tYWMvb21hYy9vbWFjX2ZpbGUubyBzcmMvbWFjL29tYWMvb21hY19pbml0Lm8gc3JjL21hYy9vbWFjL29tYWNfbWVtb3J5Lm8gXAorc3JjL21hYy9vbWFjL29tYWNfbWVtb3J5X211bHRpLm8gc3JjL21hYy9vbWFjL29tYWNfcHJvY2Vzcy5vIHNyYy9tYWMvb21hYy9vbWFjX3Rlc3QubyBcCitzcmMvbWFjL3BlbGljYW4vcGVsaWNhbi5vIHNyYy9tYWMvcGVsaWNhbi9wZWxpY2FuX21lbW9yeS5vIHNyYy9tYWMvcGVsaWNhbi9wZWxpY2FuX3Rlc3QubyBcCitzcmMvbWFjL3BtYWMvcG1hY19kb25lLm8gc3JjL21hYy9wbWFjL3BtYWNfZmlsZS5vIHNyYy9tYWMvcG1hYy9wbWFjX2luaXQubyBzcmMvbWFjL3BtYWMvcG1hY19tZW1vcnkubyBcCitzcmMvbWFjL3BtYWMvcG1hY19tZW1vcnlfbXVsdGkubyBzcmMvbWFjL3BtYWMvcG1hY19udHoubyBzcmMvbWFjL3BtYWMvcG1hY19wcm9jZXNzLm8gXAorc3JjL21hYy9wbWFjL3BtYWNfc2hpZnRfeG9yLm8gc3JjL21hYy9wbWFjL3BtYWNfdGVzdC5vIHNyYy9taXNjL2Jhc2U2NC9iYXNlNjRfZGVjb2RlLm8gXAorc3JjL21pc2MvYmFzZTY0L2Jhc2U2NF9lbmNvZGUubyBzcmMvbWlzYy9idXJuX3N0YWNrLm8gc3JjL21pc2MvY3J5cHQvY3J5cHQubyBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF9hcmdjaGsubyBzcmMvbWlzYy9jcnlwdC9jcnlwdF9jaXBoZXJfZGVzY3JpcHRvci5vIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X2NpcGhlcl9pc192YWxpZC5vIHNyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfY2lwaGVyLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXJfYW55Lm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXJfaWQubyBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2hhc2gubyBzcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2hhc2hfYW55Lm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9oYXNoX2lkLm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9wcm5nLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfaGFzaF9kZXNjcmlwdG9yLm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfaGFzaF9pc192YWxpZC5vIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X3BybmdfZGVzY3JpcHRvci5vIHNyYy9taXNjL2NyeXB0L2NyeXB0X3BybmdfaXNfdmFsaWQubyBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF9yZWdpc3Rlcl9jaXBoZXIubyBzcmMvbWlzYy9jcnlwdC9jcnlwdF9yZWdpc3Rlcl9oYXNoLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfcmVnaXN0ZXJfcHJuZy5vIHNyYy9taXNjL2NyeXB0L2NyeXB0X3VucmVnaXN0ZXJfY2lwaGVyLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfdW5yZWdpc3Rlcl9oYXNoLm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfdW5yZWdpc3Rlcl9wcm5nLm8gXAorc3JjL21pc2MvZXJyb3JfdG9fc3RyaW5nLm8gc3JjL21pc2MvbXBpL2lzX3ByaW1lLm8gc3JjL21pc2MvbXBpL21waV90b19sdGNfZXJyb3IubyBcCitzcmMvbWlzYy9tcGkvcmFuZF9wcmltZS5vIHNyYy9taXNjL3BrY3M1L3BrY3NfNV8xLm8gc3JjL21pc2MvcGtjczUvcGtjc181XzIubyBzcmMvbWlzYy96ZXJvbWVtLm8gXAorc3JjL21vZGVzL2NiYy9jYmNfZGVjcnlwdC5vIHNyYy9tb2Rlcy9jYmMvY2JjX2RvbmUubyBzcmMvbW9kZXMvY2JjL2NiY19lbmNyeXB0Lm8gXAorc3JjL21vZGVzL2NiYy9jYmNfZ2V0aXYubyBzcmMvbW9kZXMvY2JjL2NiY19zZXRpdi5vIHNyYy9tb2Rlcy9jYmMvY2JjX3N0YXJ0Lm8gXAorc3JjL21vZGVzL2NmYi9jZmJfZGVjcnlwdC5vIHNyYy9tb2Rlcy9jZmIvY2ZiX2RvbmUubyBzcmMvbW9kZXMvY2ZiL2NmYl9lbmNyeXB0Lm8gXAorc3JjL21vZGVzL2NmYi9jZmJfZ2V0aXYubyBzcmMvbW9kZXMvY2ZiL2NmYl9zZXRpdi5vIHNyYy9tb2Rlcy9jZmIvY2ZiX3N0YXJ0Lm8gXAorc3JjL21vZGVzL2N0ci9jdHJfZGVjcnlwdC5vIHNyYy9tb2Rlcy9jdHIvY3RyX2RvbmUubyBzcmMvbW9kZXMvY3RyL2N0cl9lbmNyeXB0Lm8gXAorc3JjL21vZGVzL2N0ci9jdHJfZ2V0aXYubyBzcmMvbW9kZXMvY3RyL2N0cl9zZXRpdi5vIHNyYy9tb2Rlcy9jdHIvY3RyX3N0YXJ0Lm8gXAorc3JjL21vZGVzL2VjYi9lY2JfZGVjcnlwdC5vIHNyYy9tb2Rlcy9lY2IvZWNiX2RvbmUubyBzcmMvbW9kZXMvZWNiL2VjYl9lbmNyeXB0Lm8gXAorc3JjL21vZGVzL2VjYi9lY2Jfc3RhcnQubyBzcmMvbW9kZXMvb2ZiL29mYl9kZWNyeXB0Lm8gc3JjL21vZGVzL29mYi9vZmJfZG9uZS5vIFwKK3NyYy9tb2Rlcy9vZmIvb2ZiX2VuY3J5cHQubyBzcmMvbW9kZXMvb2ZiL29mYl9nZXRpdi5vIHNyYy9tb2Rlcy9vZmIvb2ZiX3NldGl2Lm8gXAorc3JjL21vZGVzL29mYi9vZmJfc3RhcnQubyBzcmMvcGsvYXNuMS9kZXIvYml0L2Rlcl9kZWNvZGVfYml0X3N0cmluZy5vIFwKK3NyYy9way9hc24xL2Rlci9iaXQvZGVyX2VuY29kZV9iaXRfc3RyaW5nLm8gc3JjL3BrL2FzbjEvZGVyL2JpdC9kZXJfbGVuZ3RoX2JpdF9zdHJpbmcubyBcCitzcmMvcGsvYXNuMS9kZXIvY2hvaWNlL2Rlcl9kZWNvZGVfY2hvaWNlLm8gc3JjL3BrL2FzbjEvZGVyL2lhNS9kZXJfZGVjb2RlX2lhNV9zdHJpbmcubyBcCitzcmMvcGsvYXNuMS9kZXIvaWE1L2Rlcl9lbmNvZGVfaWE1X3N0cmluZy5vIHNyYy9way9hc24xL2Rlci9pYTUvZGVyX2xlbmd0aF9pYTVfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2RlY29kZV9pbnRlZ2VyLm8gc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2VuY29kZV9pbnRlZ2VyLm8gXAorc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2xlbmd0aF9pbnRlZ2VyLm8gXAorc3JjL3BrL2FzbjEvZGVyL29iamVjdF9pZGVudGlmaWVyL2Rlcl9kZWNvZGVfb2JqZWN0X2lkZW50aWZpZXIubyBcCitzcmMvcGsvYXNuMS9kZXIvb2JqZWN0X2lkZW50aWZpZXIvZGVyX2VuY29kZV9vYmplY3RfaWRlbnRpZmllci5vIFwKK3NyYy9way9hc24xL2Rlci9vYmplY3RfaWRlbnRpZmllci9kZXJfbGVuZ3RoX29iamVjdF9pZGVudGlmaWVyLm8gXAorc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9kZWNvZGVfb2N0ZXRfc3RyaW5nLm8gc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9lbmNvZGVfb2N0ZXRfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9sZW5ndGhfb2N0ZXRfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2RlY29kZV9wcmludGFibGVfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2VuY29kZV9wcmludGFibGVfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2xlbmd0aF9wcmludGFibGVfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9kZWNvZGVfc2VxdWVuY2UubyBzcmMvcGsvYXNuMS9kZXIvc2VxdWVuY2UvZGVyX2RlY29kZV9zZXF1ZW5jZV9tdWx0aS5vIFwKK3NyYy9way9hc24xL2Rlci9zZXF1ZW5jZS9kZXJfZW5jb2RlX3NlcXVlbmNlLm8gc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9lbmNvZGVfc2VxdWVuY2VfbXVsdGkubyBcCitzcmMvcGsvYXNuMS9kZXIvc2VxdWVuY2UvZGVyX2xlbmd0aF9zZXF1ZW5jZS5vIFwKK3NyYy9way9hc24xL2Rlci9zaG9ydF9pbnRlZ2VyL2Rlcl9kZWNvZGVfc2hvcnRfaW50ZWdlci5vIFwKK3NyYy9way9hc24xL2Rlci9zaG9ydF9pbnRlZ2VyL2Rlcl9lbmNvZGVfc2hvcnRfaW50ZWdlci5vIFwKK3NyYy9way9hc24xL2Rlci9zaG9ydF9pbnRlZ2VyL2Rlcl9sZW5ndGhfc2hvcnRfaW50ZWdlci5vIHNyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9kZWNvZGVfdXRjdGltZS5vIFwKK3NyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9lbmNvZGVfdXRjdGltZS5vIHNyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9sZW5ndGhfdXRjdGltZS5vIFwKK3NyYy9way9kaC9kaC5vIHNyYy9way9kc2EvZHNhX2V4cG9ydC5vIHNyYy9way9kc2EvZHNhX2ZyZWUubyBzcmMvcGsvZHNhL2RzYV9pbXBvcnQubyBcCitzcmMvcGsvZHNhL2RzYV9tYWtlX2tleS5vIHNyYy9way9kc2EvZHNhX3NpZ25faGFzaC5vIHNyYy9way9kc2EvZHNhX3ZlcmlmeV9oYXNoLm8gXAorc3JjL3BrL2RzYS9kc2FfdmVyaWZ5X2tleS5vIHNyYy9way9lY2MvZWNjLm8gc3JjL3BrL3BhY2tldF9zdG9yZV9oZWFkZXIubyBzcmMvcGsvcGFja2V0X3ZhbGlkX2hlYWRlci5vIFwKK3NyYy9way9wa2NzMS9wa2NzXzFfaTJvc3AubyBzcmMvcGsvcGtjczEvcGtjc18xX21nZjEubyBzcmMvcGsvcGtjczEvcGtjc18xX29hZXBfZGVjb2RlLm8gXAorc3JjL3BrL3BrY3MxL3BrY3NfMV9vYWVwX2VuY29kZS5vIHNyYy9way9wa2NzMS9wa2NzXzFfb3MyaXAubyBzcmMvcGsvcGtjczEvcGtjc18xX3Bzc19kZWNvZGUubyBcCitzcmMvcGsvcGtjczEvcGtjc18xX3Bzc19lbmNvZGUubyBzcmMvcGsvcnNhL3JzYV9kZWNyeXB0X2tleS5vIHNyYy9way9yc2EvcnNhX2VuY3J5cHRfa2V5Lm8gXAorc3JjL3BrL3JzYS9yc2FfZXhwb3J0Lm8gc3JjL3BrL3JzYS9yc2FfZXhwdG1vZC5vIHNyYy9way9yc2EvcnNhX2ZyZWUubyBzcmMvcGsvcnNhL3JzYV9pbXBvcnQubyBcCitzcmMvcGsvcnNhL3JzYV9tYWtlX2tleS5vIHNyYy9way9yc2EvcnNhX3NpZ25faGFzaC5vIHNyYy9way9yc2EvcnNhX3ZlcmlmeV9oYXNoLm8gc3JjL3BybmdzL2ZvcnR1bmEubyBcCitzcmMvcHJuZ3MvcmM0Lm8gc3JjL3BybmdzL3JuZ19nZXRfYnl0ZXMubyBzcmMvcHJuZ3Mvcm5nX21ha2VfcHJuZy5vIHNyYy9wcm5ncy9zb2JlcjEyOC5vIFwKK3NyYy9wcm5ncy9zcHJuZy5vIHNyYy9wcm5ncy95YXJyb3cubyAKIAorSEVBREVSUz1zcmMvaGVhZGVycy90b21tYXRoX3N1cGVyY2xhc3MuaCBzcmMvaGVhZGVycy90b21jcnlwdF9jZmcuaCBzcmMvaGVhZGVycy90b21jcnlwdF9tYWMuaCBcCitzcmMvaGVhZGVycy90b21jcnlwdF9tYWNyb3MuaCBzcmMvaGVhZGVycy90b21jcnlwdF9jdXN0b20uaCBzcmMvaGVhZGVycy90b21jcnlwdF9hcmdjaGsuaCBcCitzcmMvaGVhZGVycy90b21jcnlwdF9jaXBoZXIuaCBzcmMvaGVhZGVycy90b21jcnlwdF9way5oIHNyYy9oZWFkZXJzL3RvbW1hdGhfY2xhc3MuaCBcCitzcmMvaGVhZGVycy9sdGNfdG9tbWF0aC5oIHNyYy9oZWFkZXJzL3RvbWNyeXB0X2hhc2guaCBzcmMvaGVhZGVycy90b21jcnlwdF9taXNjLmggXAorc3JjL2hlYWRlcnMvdG9tY3J5cHQuaCBzcmMvaGVhZGVycy90b21jcnlwdF9wa2NzLmggc3JjL2hlYWRlcnMvdG9tY3J5cHRfcHJuZy5oIHRlc3Rwcm9mL3RvbWNyeXB0X3Rlc3QuaAogCiAjY2lwaGVycyBjb21lIGluIHR3byBmbGF2b3Vycy4uLiBlbmMrZGVjIGFuZCBlbmMgCiBhZXNfZW5jLm86IGFlcy5jIGFlc190YWIuYwpAQCAtMTQwLDggKzE3Myw5IEBACiBIQVNIT0JKRUNUUz1kZW1vcy9oYXNoc3VtLm8KIENSWVBUT0JKRUNUUz1kZW1vcy9lbmNyeXB0Lm8KIFNNQUxMT0JKRUNUUz1kZW1vcy9zbWFsbC5vCi1QUk9GUz1kZW1vcy94ODZfcHJvZi5vCiBUVlM9ZGVtb3MvdHZfZ2VuLm8KK1RJTUlOR1M9ZGVtb3MvdGltaW5nLm8KK1RFU1RTPWRlbW9zL3Rlc3QubwogCiAjRmlsZXMgbGVmdCBvdmVyIGZyb20gbWFraW5nIHRoZSBjcnlwdC5wZGYuCiBMRUZUT1ZFUlM9Ki5kdmkgKi5sb2cgKi5hdXggKi50b2MgKi5pZHggKi5pbGcgKi5pbmQKQEAgLTE0OSwyNSArMTgzLDI4IEBACiAjQ29tcHJlc3NlZCBmaWxlbmFtZXMKIENPTVBSRVNTRUQ9Y3J5cHQudGFyLmJ6MiBjcnlwdC56aXAgY3J5cHQudGFyLmd6CiAKLSNIZWFkZXIgZmlsZXMgdXNlZCBieSBsaWJ0b21jcnlwdC4KLUhFQURFUlM9dG9tbWF0aC5oIG15Y3J5cHRfY2ZnLmggbXljcnlwdF9nZi5oIG15Y3J5cHRfa3IuaCBcCi1teWNyeXB0X21pc2MuaCAgbXljcnlwdF9wcm5nLmggbXljcnlwdF9jaXBoZXIuaCAgbXljcnlwdF9oYXNoLmggXAotbXljcnlwdF9tYWNyb3MuaCAgbXljcnlwdF9way5oIG15Y3J5cHQuaCBteWNyeXB0X2FyZ2Noay5oIG15Y3J5cHRfY3VzdG9tLmgKKyNjaXBoZXJzIGNvbWUgaW4gdHdvIGZsYXZvdXJzLi4uIGVuYytkZWMgYW5kIGVuYyAKK3NyYy9jaXBoZXJzL2Flcy9hZXNfZW5jLm86IHNyYy9jaXBoZXJzL2Flcy9hZXMuYyBzcmMvY2lwaGVycy9hZXMvYWVzX3RhYi5jCisJJChDQykgJChDRkxBR1MpIC1ERU5DUllQVF9PTkxZIC1jIHNyYy9jaXBoZXJzL2Flcy9hZXMuYyAtbyBzcmMvY2lwaGVycy9hZXMvYWVzX2VuYy5vCiAKICNUaGVzZSBhcmUgdGhlIHJ1bGVzIHRvIG1ha2UgY2VydGFpbiBvYmplY3QgZmlsZXMuCi1yc2EubzogcnNhLmMgcnNhX3N5cy5jCi1lY2MubzogZWNjLmMgZWNjX3N5cy5jCi1kaC5vOiBkaC5jIGRoX3N5cy5jCi1hZXMubzogYWVzLmMgYWVzX3RhYi5jCi10d29maXNoLm86IHR3b2Zpc2guYyB0d29maXNoX3RhYi5jCi1zaGE1MTIubzogc2hhNTEyLmMgc2hhMzg0LmMKLXNoYTI1Ni5vOiBzaGEyNTYuYyBzaGEyMjQuYworc3JjL2NpcGhlcnMvYWVzL2Flcy5vOiBzcmMvY2lwaGVycy9hZXMvYWVzLmMgc3JjL2NpcGhlcnMvYWVzL2Flc190YWIuYworc3JjL2NpcGhlcnMvdHdvZmlzaC90d29maXNoLm86IHNyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaC5jIHNyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaF90YWIuYworc3JjL2hhc2hlcy93aGlybC93aGlybC5vOiBzcmMvaGFzaGVzL3doaXJsL3doaXJsLmMgc3JjL2hhc2hlcy93aGlybC93aGlybHRhYi5jCitzcmMvcGsvZWNjL2VjYy5vOiBzcmMvcGsvZWNjL2VjYy5jIHNyYy9way9lY2MvZWNjX3N5cy5jCitzcmMvcGsvZGgvZGgubzogc3JjL3BrL2RoL2RoLmMgc3JjL3BrL2RoL2RoX3N5cy5jCitzcmMvaGFzaGVzL3NoYTIvc2hhNTEyLm86IHNyYy9oYXNoZXMvc2hhMi9zaGE1MTIuYyBzcmMvaGFzaGVzL3NoYTIvc2hhMzg0LmMKK3NyYy9oYXNoZXMvc2hhMi9zaGEyNTYubzogc3JjL2hhc2hlcy9zaGEyL3NoYTI1Ni5jIHNyYy9oYXNoZXMvc2hhMi9zaGEyMjQuYwogCiAjVGhpcyBydWxlIG1ha2VzIHRoZSBsaWJ0b21jcnlwdCBsaWJyYXJ5LgotbGlicmFyeTogJChMSUJOQU1FKQorbGlicmFyeTogJChMSUJURVNUKSAkKExJQk5BTUUpCisKKyQoTElCVEVTVCk6CisJY2QgdGVzdHByb2YgOyBtYWtlIC1mIG1ha2VmaWxlLmljYwogCiAkKExJQk5BTUUpOiAkKE9CSkVDVFMpCi0JJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSkVDVFMpIAorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpFQ1RTKQorCXJhbmxpYiAkKExJQk5BTUUpCiAKICNUaGlzIHJ1bGUgbWFrZXMgdGhlIGhhc2ggcHJvZ3JhbSBpbmNsdWRlZCB3aXRoIGxpYnRvbWNyeXB0CiBoYXNoc3VtOiBsaWJyYXJ5ICQoSEFTSE9CSkVDVFMpCkBAIC0xODEsMTIgKzIxOCwxNCBAQAogc21hbGw6IGxpYnJhcnkgJChTTUFMTE9CSkVDVFMpCiAJJChDQykgJChTTUFMTE9CSkVDVFMpICQoTElCTkFNRSkgLW8gJChTTUFMTCkgJChXQVJOKQogCQoteDg2X3Byb2Y6IGxpYnJhcnkgJChQUk9GUykKLQkkKENDKSAkKFBST0ZTKSAkKExJQk5BTUUpIC1vICQoUFJPRikKLQogdHZfZ2VuOiBsaWJyYXJ5ICQoVFZTKQogCSQoQ0MpICQoVFZTKSAkKExJQk5BTUUpIC1vICQoVFYpCiAKK3RpbWluZzogbGlicmFyeSAkKFRJTUlOR1MpCisJJChDQykgJChUSU1JTkdTKSAkKExJQlRFU1QpICQoTElCTkFNRSkgLW8gJChUSU1JTkcpCisKK3Rlc3Q6IGxpYnJhcnkgJChURVNUUykKKwkkKENDKSAkKFRFU1RTKSAkKExJQlRFU1QpICQoTElCTkFNRSkgLW8gJChURVNUKQogICAKICNUaGlzIHJ1bGUgaW5zdGFsbHMgdGhlIGxpYnJhcnkgYW5kIHRoZSBoZWFkZXIgZmlsZXMuIFRoaXMgbXVzdCBiZSBydW4KICNhcyByb290IGluIG9yZGVyIHRvIGhhdmUgYSBoaWdoIGVub3VnaCBwZXJtaXNzaW9uIHRvIHdyaXRlIHRvIHRoZSBjb3JyZWN0CkBAIC0xOTUsMTEgKzIzNCw5IEBACiAJaW5zdGFsbCAtZCAtZyByb290IC1vIHJvb3QgJChERVNURElSKSQoTElCUEFUSCkKIAlpbnN0YWxsIC1kIC1nIHJvb3QgLW8gcm9vdCAkKERFU1RESVIpJChJTkNQQVRIKQogCWluc3RhbGwgLWcgcm9vdCAtbyByb290ICQoTElCTkFNRSkgJChERVNURElSKSQoTElCUEFUSCkKKwlpbnN0YWxsIC1nIHJvb3QgLW8gcm9vdCAkKExJQlRFU1QpICQoREVTVERJUikkKExJQlBBVEgpCiAJaW5zdGFsbCAtZyByb290IC1vIHJvb3QgJChIRUFERVJTKSAkKERFU1RESVIpJChJTkNQQVRIKQogCi0jVGhpcyBydWxlIGNsZWFucyB0aGUgc291cmNlIHRyZWUgb2YgYWxsIGNvbXBpbGVkIGNvZGUsIG5vdCBpbmNsdWRpbmcgdGhlIHBkZgotI2RvY3VtZW50YXRpb24uCi1jbGVhbjoKLQlybSAtZiAkKE9CSkVDVFMpICQoVEVTVE9CSkVDVFMpICQoSEFTSE9CSkVDVFMpICQoQ1JZUFRPQkpFQ1RTKSAkKFNNQUxMT0JKRUNUUykgJChMRUZUT1ZFUlMpICQoTElCTkFNRSkKLQlybSAtZiAkKFRFU1QpICQoSEFTSCkgJChDT01QUkVTU0VEKSAkKFBST0ZTKSAkKFBST0YpICQoVFZTKSAkKFRWKQotCXJtIC1mICouYSAqLmRsbCAqc3RhY2tkdW1wICoubGliICouZXhlICoub2JqIGRlbW9zLyoub2JqIGRlbW9zLyoubyAqLmJhdCAqLnR4dCAqLmlsICouZGEgZGVtb3MvKi5pbCBkZW1vcy8qLmRhICouZHluCisjICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L21ha2VmaWxlLmljYyx2ICQgICAKKyMgJFJldmlzaW9uOiAxLjMzICQgICAKKyMgJERhdGU6IDIwMDUvMDYvMTkgMTg6MjI6MzEgJCAKZGlmZiAtLWdpdCBhL21ha2VmaWxlLm1zdmMgYi9tYWtlZmlsZS5tc3ZjCmluZGV4IGFhOGE5YmMuLmFlMDEwNzkgMTAwNjQ0Ci0tLSBhL21ha2VmaWxlLm1zdmMKKysrIGIvbWFrZWZpbGUubXN2YwpAQCAtMSw4OCArMSwxMjIgQEAKICNNU1ZDIE1ha2VmaWxlIFt0ZXN0ZWQgd2l0aCBNU1ZDIDYuMDAgd2l0aCBTUDVdCiAjCiAjVG9tIFN0IERlbmlzCi1DRkxBR1MgPSAvSS4gL094IC9EV0lOMzIgL1czCitDRkxBR1MgPSAvSXNyYy9oZWFkZXJzLyAvSXRlc3Rwcm9mLyAvT3ggL0RXSU4zMiAvVzMgL0ZvJEAKIAogZGVmYXVsdDogbGlicmFyeQogCiAjIGxlYXZlIHRoaXMgYmxhbmsgYW5kIGxpbmsgYWdhaW5zdCBsaWJ0b21tYXRoIGlmIHlvdSB3YW50IGJldHRlciBsaW5rIHJlc29sdXRpb24KLU1QSU9CSkVDVD1tcGkub2JqCitNUElPQkpFQ1Q9c3JjL21pc2MvbXBpL21waS5vYmoKIAotT0JKRUNUUz1lcnJvcl90b19zdHJpbmcub2JqIG1waV90b19sdGNfZXJyb3Iub2JqIGJhc2U2NF9lbmNvZGUub2JqIGJhc2U2NF9kZWNvZGUub2JqIFwKLVwKLWNyeXB0Lm9iaiAgICAgICAgICAgICAgICAgICAgY3J5cHRfZmluZF9jaXBoZXIub2JqICAgICAgY3J5cHRfZmluZF9oYXNoX2FueS5vYmogICAgICBcCi1jcnlwdF9oYXNoX2lzX3ZhbGlkLm9iaiAgICAgIGNyeXB0X3JlZ2lzdGVyX2hhc2gub2JqICAgIGNyeXB0X3VucmVnaXN0ZXJfcHJuZy5vYmogICAgXAotY3J5cHRfYXJnY2hrLm9iaiAgICAgICAgICAgICBjcnlwdF9maW5kX2NpcGhlcl9hbnkub2JqICBjcnlwdF9maW5kX2hhc2hfaWQub2JqICAgICAgIFwKLWNyeXB0X3BybmdfZGVzY3JpcHRvci5vYmogICAgY3J5cHRfcmVnaXN0ZXJfcHJuZy5vYmogICAgY3J5cHRfY2lwaGVyX2Rlc2NyaXB0b3Iub2JqICBcCi1jcnlwdF9maW5kX2NpcGhlcl9pZC5vYmogICAgIGNyeXB0X2ZpbmRfcHJuZy5vYmogICAgICAgIGNyeXB0X3BybmdfaXNfdmFsaWQub2JqICAgICAgXAotY3J5cHRfdW5yZWdpc3Rlcl9jaXBoZXIub2JqICBjcnlwdF9jaXBoZXJfaXNfdmFsaWQub2JqICBjcnlwdF9maW5kX2hhc2gub2JqICAgICAgICAgIFwKLWNyeXB0X2hhc2hfZGVzY3JpcHRvci5vYmogICAgY3J5cHRfcmVnaXN0ZXJfY2lwaGVyLm9iaiAgY3J5cHRfdW5yZWdpc3Rlcl9oYXNoLm9iaiAgICBcCi1cCi1zcHJuZy5vYmogeWFycm93Lm9iaiByYzQub2JqIHJuZ19nZXRfYnl0ZXMub2JqICBybmdfbWFrZV9wcm5nLm9iaiBcCi1cCi1yYW5kX3ByaW1lLm9iaiBpc19wcmltZS5vYmogXAotXAotZWNjLm9iaiAgZGgub2JqIFwKLVwKLXJzYV9kZWNyeXB0X2tleS5vYmogIHJzYV9lbmNyeXB0X2tleS5vYmogIHJzYV9leHB0bW9kLm9iaiAgcnNhX2ZyZWUub2JqICByc2FfbWFrZV9rZXkub2JqICBcCi1yc2Ffc2lnbl9oYXNoLm9iaiAgcnNhX3ZlcmlmeV9oYXNoLm9iaiByc2FfZXhwb3J0Lm9iaiByc2FfaW1wb3J0Lm9iaiB0aW1fZXhwdG1vZC5vYmogXAotXAotZHNhX2V4cG9ydC5vYmogIGRzYV9mcmVlLm9iaiAgZHNhX2ltcG9ydC5vYmogIGRzYV9tYWtlX2tleS5vYmogIGRzYV9zaWduX2hhc2gub2JqICBcCi1kc2FfdmVyaWZ5X2hhc2gub2JqICBkc2FfdmVyaWZ5X2tleS5vYmogXAotXAotYWVzLm9iaiBhZXNfZW5jLm9iaiBcCi1cCi1ibG93ZmlzaC5vYmogZGVzLm9iaiBzYWZlcl90YWIub2JqIHNhZmVyLm9iaiBzYWZlcnAub2JqIHJjMi5vYmogeHRlYS5vYmogXAotcmM2Lm9iaiByYzUub2JqIGNhc3Q1Lm9iaiBub2VrZW9uLm9iaiB0d29maXNoLm9iaiBza2lwamFjay5vYmogXAotXAotbWQyLm9iaiBtZDQub2JqIG1kNS5vYmogc2hhMS5vYmogc2hhMjU2Lm9iaiBzaGE1MTIub2JqIHRpZ2VyLm9iaiB3aGlybC5vYmogXAotcm1kMTI4Lm9iaiBybWQxNjAub2JqIFwKLVwKLXBhY2tldF9zdG9yZV9oZWFkZXIub2JqICBwYWNrZXRfdmFsaWRfaGVhZGVyLm9iaiBcCi1cCi1lYXhfYWRkaGVhZGVyLm9iaiAgZWF4X2RlY3J5cHQub2JqICBlYXhfZGVjcnlwdF92ZXJpZnlfbWVtb3J5Lm9iaiAgZWF4X2RvbmUub2JqICBlYXhfZW5jcnlwdC5vYmogIFwKLWVheF9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkub2JqICBlYXhfaW5pdC5vYmogIGVheF90ZXN0Lm9iaiBcCi1cCi1vY2JfZGVjcnlwdC5vYmogIG9jYl9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkub2JqICBvY2JfZG9uZV9kZWNyeXB0Lm9iaiAgb2NiX2RvbmVfZW5jcnlwdC5vYmogIFwKLW9jYl9lbmNyeXB0Lm9iaiAgb2NiX2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5vYmogIG9jYl9pbml0Lm9iaiAgb2NiX250ei5vYmogIFwKLW9jYl9zaGlmdF94b3Iub2JqICBvY2JfdGVzdC5vYmogc19vY2JfZG9uZS5vYmogXAotXAotb21hY19kb25lLm9iaiAgb21hY19maWxlLm9iaiAgb21hY19pbml0Lm9iaiAgb21hY19tZW1vcnkub2JqICBvbWFjX3Byb2Nlc3Mub2JqICBvbWFjX3Rlc3Qub2JqIFwKLVwKLXBtYWNfZG9uZS5vYmogIHBtYWNfZmlsZS5vYmogIHBtYWNfaW5pdC5vYmogIHBtYWNfbWVtb3J5Lm9iaiAgcG1hY19udHoub2JqICBwbWFjX3Byb2Nlc3Mub2JqICBcCi1wbWFjX3NoaWZ0X3hvci5vYmogIHBtYWNfdGVzdC5vYmogXAotXAotY2JjX3N0YXJ0Lm9iaiBjYmNfZW5jcnlwdC5vYmogY2JjX2RlY3J5cHQub2JqIGNiY19nZXRpdi5vYmogY2JjX3NldGl2Lm9iaiBcCi1jZmJfc3RhcnQub2JqIGNmYl9lbmNyeXB0Lm9iaiBjZmJfZGVjcnlwdC5vYmogY2ZiX2dldGl2Lm9iaiBjZmJfc2V0aXYub2JqIFwKLW9mYl9zdGFydC5vYmogb2ZiX2VuY3J5cHQub2JqIG9mYl9kZWNyeXB0Lm9iaiBvZmJfZ2V0aXYub2JqIG9mYl9zZXRpdi5vYmogXAotY3RyX3N0YXJ0Lm9iaiBjdHJfZW5jcnlwdC5vYmogY3RyX2RlY3J5cHQub2JqIGN0cl9nZXRpdi5vYmogY3RyX3NldGl2Lm9iaiBcCi1lY2Jfc3RhcnQub2JqIGVjYl9lbmNyeXB0Lm9iaiBlY2JfZGVjcnlwdC5vYmogXAotXAotaGFzaF9maWxlLm9iaiAgaGFzaF9maWxlaGFuZGxlLm9iaiAgaGFzaF9tZW1vcnkub2JqIFwKLVwKLWhtYWNfZG9uZS5vYmogIGhtYWNfZmlsZS5vYmogIGhtYWNfaW5pdC5vYmogIGhtYWNfbWVtb3J5Lm9iaiAgaG1hY19wcm9jZXNzLm9iaiAgaG1hY190ZXN0Lm9iaiBcCi1cCi1wa2NzXzFfbWdmMS5vYmogcGtjc18xX29hZXBfZW5jb2RlLm9iaiBwa2NzXzFfb2FlcF9kZWNvZGUub2JqICBcCi1wa2NzXzFfcHNzX2VuY29kZS5vYmogcGtjc18xX3Bzc19kZWNvZGUub2JqIHBrY3NfMV9pMm9zcC5vYmogcGtjc18xX29zMmlwLm9iaiBcCi1wa2NzXzFfdjE1X2VzX2VuY29kZS5vYmogcGtjc18xX3YxNV9lc19kZWNvZGUub2JqIHBrY3NfMV92MTVfc2FfZW5jb2RlLm9iaiBwa2NzXzFfdjE1X3NhX2RlY29kZS5vYmogXAotXAotcGtjc181XzEub2JqIHBrY3NfNV8yLm9iaiBcCi1cCi1idXJuX3N0YWNrLm9iaiB6ZXJvbWVtLm9iaiBcCi0kKE1QSU9CSkVDVCkKK09CSkVDVFM9c3JjL2NpcGhlcnMvYWVzL2Flc19lbmMub2JqICQoTVBJT0JKRUNUKSBzcmMvY2lwaGVycy9hZXMvYWVzLm9iaiBzcmMvY2lwaGVycy9hbnViaXMub2JqIFwKK3NyYy9jaXBoZXJzL2Jsb3dmaXNoLm9iaiBzcmMvY2lwaGVycy9jYXN0NS5vYmogc3JjL2NpcGhlcnMvZGVzLm9iaiBzcmMvY2lwaGVycy9raGF6YWQub2JqIHNyYy9jaXBoZXJzL25vZWtlb24ub2JqIFwKK3NyYy9jaXBoZXJzL3JjMi5vYmogc3JjL2NpcGhlcnMvcmM1Lm9iaiBzcmMvY2lwaGVycy9yYzYub2JqIHNyYy9jaXBoZXJzL3NhZmVyL3NhZmVyLm9iaiBcCitzcmMvY2lwaGVycy9zYWZlci9zYWZlcl90YWIub2JqIHNyYy9jaXBoZXJzL3NhZmVyL3NhZmVycC5vYmogc3JjL2NpcGhlcnMvc2tpcGphY2sub2JqIFwKK3NyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaC5vYmogc3JjL2NpcGhlcnMveHRlYS5vYmogc3JjL2VuY2F1dGgvY2NtL2NjbV9tZW1vcnkub2JqIFwKK3NyYy9lbmNhdXRoL2NjbS9jY21fdGVzdC5vYmogc3JjL2VuY2F1dGgvZWF4L2VheF9hZGRoZWFkZXIub2JqIHNyYy9lbmNhdXRoL2VheC9lYXhfZGVjcnlwdC5vYmogXAorc3JjL2VuY2F1dGgvZWF4L2VheF9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkub2JqIHNyYy9lbmNhdXRoL2VheC9lYXhfZG9uZS5vYmogc3JjL2VuY2F1dGgvZWF4L2VheF9lbmNyeXB0Lm9iaiBcCitzcmMvZW5jYXV0aC9lYXgvZWF4X2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5vYmogc3JjL2VuY2F1dGgvZWF4L2VheF9pbml0Lm9iaiBcCitzcmMvZW5jYXV0aC9lYXgvZWF4X3Rlc3Qub2JqIHNyYy9lbmNhdXRoL2djbS9nY21fYWRkX2FhZC5vYmogc3JjL2VuY2F1dGgvZ2NtL2djbV9hZGRfaXYub2JqIFwKK3NyYy9lbmNhdXRoL2djbS9nY21fZG9uZS5vYmogc3JjL2VuY2F1dGgvZ2NtL2djbV9nZl9tdWx0Lm9iaiBzcmMvZW5jYXV0aC9nY20vZ2NtX2luaXQub2JqIFwKK3NyYy9lbmNhdXRoL2djbS9nY21fbWVtb3J5Lm9iaiBzcmMvZW5jYXV0aC9nY20vZ2NtX3Byb2Nlc3Mub2JqIHNyYy9lbmNhdXRoL2djbS9nY21fcmVzZXQub2JqIFwKK3NyYy9lbmNhdXRoL2djbS9nY21fdGVzdC5vYmogc3JjL2VuY2F1dGgvb2NiL29jYl9kZWNyeXB0Lm9iaiBzcmMvZW5jYXV0aC9vY2Ivb2NiX2RlY3J5cHRfdmVyaWZ5X21lbW9yeS5vYmogXAorc3JjL2VuY2F1dGgvb2NiL29jYl9kb25lX2RlY3J5cHQub2JqIHNyYy9lbmNhdXRoL29jYi9vY2JfZG9uZV9lbmNyeXB0Lm9iaiBzcmMvZW5jYXV0aC9vY2Ivb2NiX2VuY3J5cHQub2JqIFwKK3NyYy9lbmNhdXRoL29jYi9vY2JfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5Lm9iaiBzcmMvZW5jYXV0aC9vY2Ivb2NiX2luaXQub2JqIHNyYy9lbmNhdXRoL29jYi9vY2JfbnR6Lm9iaiBcCitzcmMvZW5jYXV0aC9vY2Ivb2NiX3NoaWZ0X3hvci5vYmogc3JjL2VuY2F1dGgvb2NiL29jYl90ZXN0Lm9iaiBzcmMvZW5jYXV0aC9vY2Ivc19vY2JfZG9uZS5vYmogXAorc3JjL2hhc2hlcy9jaGMvY2hjLm9iaiBzcmMvaGFzaGVzL2hlbHBlci9oYXNoX2ZpbGUub2JqIHNyYy9oYXNoZXMvaGVscGVyL2hhc2hfZmlsZWhhbmRsZS5vYmogXAorc3JjL2hhc2hlcy9oZWxwZXIvaGFzaF9tZW1vcnkub2JqIHNyYy9oYXNoZXMvaGVscGVyL2hhc2hfbWVtb3J5X211bHRpLm9iaiBzcmMvaGFzaGVzL21kMi5vYmogc3JjL2hhc2hlcy9tZDQub2JqIFwKK3NyYy9oYXNoZXMvbWQ1Lm9iaiBzcmMvaGFzaGVzL3JtZDEyOC5vYmogc3JjL2hhc2hlcy9ybWQxNjAub2JqIHNyYy9oYXNoZXMvc2hhMS5vYmogc3JjL2hhc2hlcy9zaGEyL3NoYTI1Ni5vYmogXAorc3JjL2hhc2hlcy9zaGEyL3NoYTUxMi5vYmogc3JjL2hhc2hlcy90aWdlci5vYmogc3JjL2hhc2hlcy93aGlybC93aGlybC5vYmogc3JjL21hYy9obWFjL2htYWNfZG9uZS5vYmogXAorc3JjL21hYy9obWFjL2htYWNfZmlsZS5vYmogc3JjL21hYy9obWFjL2htYWNfaW5pdC5vYmogc3JjL21hYy9obWFjL2htYWNfbWVtb3J5Lm9iaiBcCitzcmMvbWFjL2htYWMvaG1hY19tZW1vcnlfbXVsdGkub2JqIHNyYy9tYWMvaG1hYy9obWFjX3Byb2Nlc3Mub2JqIHNyYy9tYWMvaG1hYy9obWFjX3Rlc3Qub2JqIFwKK3NyYy9tYWMvb21hYy9vbWFjX2RvbmUub2JqIHNyYy9tYWMvb21hYy9vbWFjX2ZpbGUub2JqIHNyYy9tYWMvb21hYy9vbWFjX2luaXQub2JqIHNyYy9tYWMvb21hYy9vbWFjX21lbW9yeS5vYmogXAorc3JjL21hYy9vbWFjL29tYWNfbWVtb3J5X211bHRpLm9iaiBzcmMvbWFjL29tYWMvb21hY19wcm9jZXNzLm9iaiBzcmMvbWFjL29tYWMvb21hY190ZXN0Lm9iaiBcCitzcmMvbWFjL3BlbGljYW4vcGVsaWNhbi5vYmogc3JjL21hYy9wZWxpY2FuL3BlbGljYW5fbWVtb3J5Lm9iaiBzcmMvbWFjL3BlbGljYW4vcGVsaWNhbl90ZXN0Lm9iaiBcCitzcmMvbWFjL3BtYWMvcG1hY19kb25lLm9iaiBzcmMvbWFjL3BtYWMvcG1hY19maWxlLm9iaiBzcmMvbWFjL3BtYWMvcG1hY19pbml0Lm9iaiBzcmMvbWFjL3BtYWMvcG1hY19tZW1vcnkub2JqIFwKK3NyYy9tYWMvcG1hYy9wbWFjX21lbW9yeV9tdWx0aS5vYmogc3JjL21hYy9wbWFjL3BtYWNfbnR6Lm9iaiBzcmMvbWFjL3BtYWMvcG1hY19wcm9jZXNzLm9iaiBcCitzcmMvbWFjL3BtYWMvcG1hY19zaGlmdF94b3Iub2JqIHNyYy9tYWMvcG1hYy9wbWFjX3Rlc3Qub2JqIHNyYy9taXNjL2Jhc2U2NC9iYXNlNjRfZGVjb2RlLm9iaiBcCitzcmMvbWlzYy9iYXNlNjQvYmFzZTY0X2VuY29kZS5vYmogc3JjL21pc2MvYnVybl9zdGFjay5vYmogc3JjL21pc2MvY3J5cHQvY3J5cHQub2JqIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X2FyZ2Noay5vYmogc3JjL21pc2MvY3J5cHQvY3J5cHRfY2lwaGVyX2Rlc2NyaXB0b3Iub2JqIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X2NpcGhlcl9pc192YWxpZC5vYmogc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXIub2JqIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfY2lwaGVyX2FueS5vYmogc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXJfaWQub2JqIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfaGFzaC5vYmogc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9oYXNoX2FueS5vYmogXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9oYXNoX2lkLm9iaiBzcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX3Bybmcub2JqIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X2hhc2hfZGVzY3JpcHRvci5vYmogc3JjL21pc2MvY3J5cHQvY3J5cHRfaGFzaF9pc192YWxpZC5vYmogXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfcHJuZ19kZXNjcmlwdG9yLm9iaiBzcmMvbWlzYy9jcnlwdC9jcnlwdF9wcm5nX2lzX3ZhbGlkLm9iaiBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF9yZWdpc3Rlcl9jaXBoZXIub2JqIHNyYy9taXNjL2NyeXB0L2NyeXB0X3JlZ2lzdGVyX2hhc2gub2JqIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X3JlZ2lzdGVyX3Bybmcub2JqIHNyYy9taXNjL2NyeXB0L2NyeXB0X3VucmVnaXN0ZXJfY2lwaGVyLm9iaiBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF91bnJlZ2lzdGVyX2hhc2gub2JqIHNyYy9taXNjL2NyeXB0L2NyeXB0X3VucmVnaXN0ZXJfcHJuZy5vYmogXAorc3JjL21pc2MvZXJyb3JfdG9fc3RyaW5nLm9iaiBzcmMvbWlzYy9tcGkvaXNfcHJpbWUub2JqIHNyYy9taXNjL21waS9tcGlfdG9fbHRjX2Vycm9yLm9iaiBcCitzcmMvbWlzYy9tcGkvcmFuZF9wcmltZS5vYmogc3JjL21pc2MvcGtjczUvcGtjc181XzEub2JqIHNyYy9taXNjL3BrY3M1L3BrY3NfNV8yLm9iaiBzcmMvbWlzYy96ZXJvbWVtLm9iaiBcCitzcmMvbW9kZXMvY2JjL2NiY19kZWNyeXB0Lm9iaiBzcmMvbW9kZXMvY2JjL2NiY19kb25lLm9iaiBzcmMvbW9kZXMvY2JjL2NiY19lbmNyeXB0Lm9iaiBcCitzcmMvbW9kZXMvY2JjL2NiY19nZXRpdi5vYmogc3JjL21vZGVzL2NiYy9jYmNfc2V0aXYub2JqIHNyYy9tb2Rlcy9jYmMvY2JjX3N0YXJ0Lm9iaiBcCitzcmMvbW9kZXMvY2ZiL2NmYl9kZWNyeXB0Lm9iaiBzcmMvbW9kZXMvY2ZiL2NmYl9kb25lLm9iaiBzcmMvbW9kZXMvY2ZiL2NmYl9lbmNyeXB0Lm9iaiBcCitzcmMvbW9kZXMvY2ZiL2NmYl9nZXRpdi5vYmogc3JjL21vZGVzL2NmYi9jZmJfc2V0aXYub2JqIHNyYy9tb2Rlcy9jZmIvY2ZiX3N0YXJ0Lm9iaiBcCitzcmMvbW9kZXMvY3RyL2N0cl9kZWNyeXB0Lm9iaiBzcmMvbW9kZXMvY3RyL2N0cl9kb25lLm9iaiBzcmMvbW9kZXMvY3RyL2N0cl9lbmNyeXB0Lm9iaiBcCitzcmMvbW9kZXMvY3RyL2N0cl9nZXRpdi5vYmogc3JjL21vZGVzL2N0ci9jdHJfc2V0aXYub2JqIHNyYy9tb2Rlcy9jdHIvY3RyX3N0YXJ0Lm9iaiBcCitzcmMvbW9kZXMvZWNiL2VjYl9kZWNyeXB0Lm9iaiBzcmMvbW9kZXMvZWNiL2VjYl9kb25lLm9iaiBzcmMvbW9kZXMvZWNiL2VjYl9lbmNyeXB0Lm9iaiBcCitzcmMvbW9kZXMvZWNiL2VjYl9zdGFydC5vYmogc3JjL21vZGVzL29mYi9vZmJfZGVjcnlwdC5vYmogc3JjL21vZGVzL29mYi9vZmJfZG9uZS5vYmogXAorc3JjL21vZGVzL29mYi9vZmJfZW5jcnlwdC5vYmogc3JjL21vZGVzL29mYi9vZmJfZ2V0aXYub2JqIHNyYy9tb2Rlcy9vZmIvb2ZiX3NldGl2Lm9iaiBcCitzcmMvbW9kZXMvb2ZiL29mYl9zdGFydC5vYmogc3JjL3BrL2FzbjEvZGVyL2JpdC9kZXJfZGVjb2RlX2JpdF9zdHJpbmcub2JqIFwKK3NyYy9way9hc24xL2Rlci9iaXQvZGVyX2VuY29kZV9iaXRfc3RyaW5nLm9iaiBzcmMvcGsvYXNuMS9kZXIvYml0L2Rlcl9sZW5ndGhfYml0X3N0cmluZy5vYmogXAorc3JjL3BrL2FzbjEvZGVyL2Nob2ljZS9kZXJfZGVjb2RlX2Nob2ljZS5vYmogc3JjL3BrL2FzbjEvZGVyL2lhNS9kZXJfZGVjb2RlX2lhNV9zdHJpbmcub2JqIFwKK3NyYy9way9hc24xL2Rlci9pYTUvZGVyX2VuY29kZV9pYTVfc3RyaW5nLm9iaiBzcmMvcGsvYXNuMS9kZXIvaWE1L2Rlcl9sZW5ndGhfaWE1X3N0cmluZy5vYmogXAorc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2RlY29kZV9pbnRlZ2VyLm9iaiBzcmMvcGsvYXNuMS9kZXIvaW50ZWdlci9kZXJfZW5jb2RlX2ludGVnZXIub2JqIFwKK3NyYy9way9hc24xL2Rlci9pbnRlZ2VyL2Rlcl9sZW5ndGhfaW50ZWdlci5vYmogXAorc3JjL3BrL2FzbjEvZGVyL29iamVjdF9pZGVudGlmaWVyL2Rlcl9kZWNvZGVfb2JqZWN0X2lkZW50aWZpZXIub2JqIFwKK3NyYy9way9hc24xL2Rlci9vYmplY3RfaWRlbnRpZmllci9kZXJfZW5jb2RlX29iamVjdF9pZGVudGlmaWVyLm9iaiBcCitzcmMvcGsvYXNuMS9kZXIvb2JqZWN0X2lkZW50aWZpZXIvZGVyX2xlbmd0aF9vYmplY3RfaWRlbnRpZmllci5vYmogXAorc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9kZWNvZGVfb2N0ZXRfc3RyaW5nLm9iaiBzcmMvcGsvYXNuMS9kZXIvb2N0ZXQvZGVyX2VuY29kZV9vY3RldF9zdHJpbmcub2JqIFwKK3NyYy9way9hc24xL2Rlci9vY3RldC9kZXJfbGVuZ3RoX29jdGV0X3N0cmluZy5vYmogXAorc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2RlY29kZV9wcmludGFibGVfc3RyaW5nLm9iaiBcCitzcmMvcGsvYXNuMS9kZXIvcHJpbnRhYmxlX3N0cmluZy9kZXJfZW5jb2RlX3ByaW50YWJsZV9zdHJpbmcub2JqIFwKK3NyYy9way9hc24xL2Rlci9wcmludGFibGVfc3RyaW5nL2Rlcl9sZW5ndGhfcHJpbnRhYmxlX3N0cmluZy5vYmogXAorc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9kZWNvZGVfc2VxdWVuY2Uub2JqIHNyYy9way9hc24xL2Rlci9zZXF1ZW5jZS9kZXJfZGVjb2RlX3NlcXVlbmNlX211bHRpLm9iaiBcCitzcmMvcGsvYXNuMS9kZXIvc2VxdWVuY2UvZGVyX2VuY29kZV9zZXF1ZW5jZS5vYmogc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9lbmNvZGVfc2VxdWVuY2VfbXVsdGkub2JqIFwKK3NyYy9way9hc24xL2Rlci9zZXF1ZW5jZS9kZXJfbGVuZ3RoX3NlcXVlbmNlLm9iaiBcCitzcmMvcGsvYXNuMS9kZXIvc2hvcnRfaW50ZWdlci9kZXJfZGVjb2RlX3Nob3J0X2ludGVnZXIub2JqIFwKK3NyYy9way9hc24xL2Rlci9zaG9ydF9pbnRlZ2VyL2Rlcl9lbmNvZGVfc2hvcnRfaW50ZWdlci5vYmogXAorc3JjL3BrL2FzbjEvZGVyL3Nob3J0X2ludGVnZXIvZGVyX2xlbmd0aF9zaG9ydF9pbnRlZ2VyLm9iaiBzcmMvcGsvYXNuMS9kZXIvdXRjdGltZS9kZXJfZGVjb2RlX3V0Y3RpbWUub2JqIFwKK3NyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9lbmNvZGVfdXRjdGltZS5vYmogc3JjL3BrL2FzbjEvZGVyL3V0Y3RpbWUvZGVyX2xlbmd0aF91dGN0aW1lLm9iaiBcCitzcmMvcGsvZGgvZGgub2JqIHNyYy9way9kc2EvZHNhX2V4cG9ydC5vYmogc3JjL3BrL2RzYS9kc2FfZnJlZS5vYmogc3JjL3BrL2RzYS9kc2FfaW1wb3J0Lm9iaiBcCitzcmMvcGsvZHNhL2RzYV9tYWtlX2tleS5vYmogc3JjL3BrL2RzYS9kc2Ffc2lnbl9oYXNoLm9iaiBzcmMvcGsvZHNhL2RzYV92ZXJpZnlfaGFzaC5vYmogXAorc3JjL3BrL2RzYS9kc2FfdmVyaWZ5X2tleS5vYmogc3JjL3BrL2VjYy9lY2Mub2JqIHNyYy9way9wYWNrZXRfc3RvcmVfaGVhZGVyLm9iaiBzcmMvcGsvcGFja2V0X3ZhbGlkX2hlYWRlci5vYmogXAorc3JjL3BrL3BrY3MxL3BrY3NfMV9pMm9zcC5vYmogc3JjL3BrL3BrY3MxL3BrY3NfMV9tZ2YxLm9iaiBzcmMvcGsvcGtjczEvcGtjc18xX29hZXBfZGVjb2RlLm9iaiBcCitzcmMvcGsvcGtjczEvcGtjc18xX29hZXBfZW5jb2RlLm9iaiBzcmMvcGsvcGtjczEvcGtjc18xX29zMmlwLm9iaiBzcmMvcGsvcGtjczEvcGtjc18xX3Bzc19kZWNvZGUub2JqIFwKK3NyYy9way9wa2NzMS9wa2NzXzFfcHNzX2VuY29kZS5vYmogc3JjL3BrL3JzYS9yc2FfZGVjcnlwdF9rZXkub2JqIHNyYy9way9yc2EvcnNhX2VuY3J5cHRfa2V5Lm9iaiBcCitzcmMvcGsvcnNhL3JzYV9leHBvcnQub2JqIHNyYy9way9yc2EvcnNhX2V4cHRtb2Qub2JqIHNyYy9way9yc2EvcnNhX2ZyZWUub2JqIHNyYy9way9yc2EvcnNhX2ltcG9ydC5vYmogXAorc3JjL3BrL3JzYS9yc2FfbWFrZV9rZXkub2JqIHNyYy9way9yc2EvcnNhX3NpZ25faGFzaC5vYmogc3JjL3BrL3JzYS9yc2FfdmVyaWZ5X2hhc2gub2JqIHNyYy9wcm5ncy9mb3J0dW5hLm9iaiBcCitzcmMvcHJuZ3MvcmM0Lm9iaiBzcmMvcHJuZ3Mvcm5nX2dldF9ieXRlcy5vYmogc3JjL3BybmdzL3JuZ19tYWtlX3Bybmcub2JqIHNyYy9wcm5ncy9zb2JlcjEyOC5vYmogXAorc3JjL3BybmdzL3Nwcm5nLm9iaiBzcmMvcHJuZ3MveWFycm93Lm9iaiAKIAotI2NpcGhlcnMgY29tZSBpbiB0d28gZmxhdm91cnMuLi4gZW5jK2RlYyBhbmQgZW5jIAotYWVzX2VuYy5vYmo6IGFlcy5jIGFlc190YWIuYwotCSQoQ0MpICQoQ0ZMQUdTKSAvREVOQ1JZUFRfT05MWSAvYyBhZXMuYyAvRm9hZXNfZW5jLm9iagorSEVBREVSUz1zcmMvaGVhZGVycy90b21tYXRoX3N1cGVyY2xhc3MuaCBzcmMvaGVhZGVycy90b21jcnlwdF9jZmcuaCBzcmMvaGVhZGVycy90b21jcnlwdF9tYWMuaCBcCitzcmMvaGVhZGVycy90b21jcnlwdF9tYWNyb3MuaCBzcmMvaGVhZGVycy90b21jcnlwdF9jdXN0b20uaCBzcmMvaGVhZGVycy90b21jcnlwdF9hcmdjaGsuaCBcCitzcmMvaGVhZGVycy90b21jcnlwdF9jaXBoZXIuaCBzcmMvaGVhZGVycy90b21jcnlwdF9way5oIHNyYy9oZWFkZXJzL3RvbW1hdGhfY2xhc3MuaCBcCitzcmMvaGVhZGVycy9sdGNfdG9tbWF0aC5oIHNyYy9oZWFkZXJzL3RvbWNyeXB0X2hhc2guaCBzcmMvaGVhZGVycy90b21jcnlwdF9taXNjLmggXAorc3JjL2hlYWRlcnMvdG9tY3J5cHQuaCBzcmMvaGVhZGVycy90b21jcnlwdF9wa2NzLmggc3JjL2hlYWRlcnMvdG9tY3J5cHRfcHJuZy5oIHRlc3Rwcm9mL3RvbWNyeXB0X3Rlc3QuaAorCisjY2lwaGVycyBjb21lIGluIHR3byBmbGF2b3Vycy4uLiBlbmMrZGVjIGFuZCBlbmMKK3NyYy9jaXBoZXJzL2Flcy9hZXNfZW5jLm9iajogc3JjL2NpcGhlcnMvYWVzL2Flcy5jIHNyYy9jaXBoZXJzL2Flcy9hZXNfdGFiLmMKKwkkKENDKSAkKENGTEFHUykgL0RFTkNSWVBUX09OTFkgL2Mgc3JjL2NpcGhlcnMvYWVzL2Flcy5jIC9Gb3NyYy9jaXBoZXJzL2Flcy9hZXNfZW5jLm9iagogCiBsaWJyYXJ5OiAkKE9CSkVDVFMpCiAJbGliIC9vdXQ6dG9tY3J5cHQubGliICQoT0JKRUNUUykKKwljZCB0ZXN0cHJvZiAKKwlubWFrZSAtZiBtYWtlZmlsZS5tc3ZjCisJY2QgLi4KIAkKLXg4Nl9wcm9mOiBkZW1vcy94ODZfcHJvZi5jIGxpYnJhcnkKLQljbCAkKENGTEFHUykgZGVtb3MveDg2X3Byb2YuYyB0b21jcnlwdC5saWIgYWR2YXBpMzIubGliIAotCiB0dl9nZW46IGRlbW9zL3R2X2dlbi5jIGxpYnJhcnkKIAljbCAkKENGTEFHUykgZGVtb3MvdHZfZ2VuLmMgdG9tY3J5cHQubGliIGFkdmFwaTMyLmxpYiAKIAogaGFzaHN1bTogZGVtb3MvaGFzaHN1bS5jIGxpYnJhcnkKIAljbCAkKENGTEFHUykgZGVtb3MvaGFzaHN1bS5jIHRvbWNyeXB0LmxpYiBhZHZhcGkzMi5saWIKKwordGVzdDogZGVtb3MvdGVzdC5jIGxpYnJhcnkKKwljbCAkKENGTEFHUykgZGVtb3MvdGVzdC5jIHRlc3Rwcm9mL3RvbWNyeXB0X3Byb2YubGliIHRvbWNyeXB0LmxpYiBhZHZhcGkzMi5saWIKKwordGltaW5nOiBkZW1vcy90aW1pbmcuYyBsaWJyYXJ5CisJY2wgJChDRkxBR1MpIGRlbW9zL3RpbWluZy5jIHRlc3Rwcm9mL3RvbWNyeXB0X3Byb2YubGliIHRvbWNyeXB0LmxpYiBhZHZhcGkzMi5saWIKKworIyAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9tYWtlZmlsZS5tc3ZjLHYgJCAgIAorIyAkUmV2aXNpb246IDEuMTUgJCAgIAorIyAkRGF0ZTogMjAwNS8wNi8yNyAxMjozNzowNiAkIApkaWZmIC0tZ2l0IGEvbWFrZWZpbGUuc2hhcmVkIGIvbWFrZWZpbGUuc2hhcmVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyY2M4N2IKLS0tIC9kZXYvbnVsbAorKysgYi9tYWtlZmlsZS5zaGFyZWQKQEAgLTAsMCArMSwyMjkgQEAKKyMgTUFLRUZJTEUgZm9yIGxpbnV4IEdDQworIworIyBUaGlzIG1ha2VmaWxlIHByb2R1Y2VzIGEgc2hhcmVkIG9iamVjdCBhbmQgcmVxdWlyZXMgbGlidG9vbCB0byBiZSBpbnN0YWxsZWQuCisjCisjIFRoYW5rcyB0byBaZWQgU2hhdyBmb3IgaGVscGluZyBkZWJ1ZyB0aGlzIG9uIEJTRC9PU1guICAKKyMgVG9tIFN0IERlbmlzCisKKyMgVGhlIHZlcnNpb24KK1ZFUlNJT049MDoxMDUKKworIyBDb21waWxlciBhbmQgTGlua2VyIE5hbWVzCitDQz1saWJ0b29sIC0tbW9kZT1jb21waWxlIGdjYworCisjIENvbXBpbGF0aW9uIGZsYWdzLiBOb3RlIHRoZSArPSBkb2VzIG5vdCB3cml0ZSBvdmVyIHRoZSB1c2VyJ3MgQ0ZMQUdTIQorQ0ZMQUdTICs9IC1jIC1JLi9zcmMvaGVhZGVycy8gLVdhbGwgLVdzaWduLWNvbXBhcmUgLVcgLVdzaGFkb3cgCisKKyMgYWRkaXRpb25hbCB3YXJuaW5ncyAobmV3ZXIgR0NDIDMuNCBhbmQgaGlnaGVyKQorI0NGTEFHUyArPSAtV3N5c3RlbS1oZWFkZXJzIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1XYmFkLWZ1bmN0aW9uLWNhc3QgLVdjYXN0LWFsaWduIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgXAorIwkJCSAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XcG9pbnRlci1hcml0aCAKKworaWZuZGVmIElHTk9SRV9TUEVFRAorCisjIG9wdGltaXplIGZvciBTUEVFRAorQ0ZMQUdTICs9IC1PMyAtZnVucm9sbC1sb29wcworCisjIGFkZCAtZm9taXQtZnJhbWUtcG9pbnRlci4gIGhpbmRlcnMgZGVidWdnaW5nIQorQ0ZMQUdTICs9IC1mb21pdC1mcmFtZS1wb2ludGVyCisKKyMgb3B0aW1pemUgZm9yIFNJWkUKKyNDRkxBR1MgKz0gLU9zIC1ETFRDX1NNQUxMX0NPREUKKworZW5kaWYKKworIyBjb21waWxlIGZvciBERUJVR0lORyAocmVxdWlyZWQgZm9yIGNjbWFsbG9jIGNoZWNraW5nISEhKQorI0NGTEFHUyArPSAtZzMKKworIyBvbGRlciBHQ0NzIGNhbid0IGhhbmRsZSB0aGUgInJvdGF0ZSB3aXRoIGltbWVkaWF0ZSIgUk9MYy9ST1JjL2V0YyBtYWNyb3MKKyMgZGVmaW5lIHRoaXMgdG8gaGVscAorI0NGTEFHUyArPSAtRExUQ19OT19ST0xDCisKKyNPdXRwdXQgZmlsZW5hbWVzIGZvciB2YXJpb3VzIHRhcmdldHMuCitMSUJURVNUPWxpYnRvbWNyeXB0X3Byb2YubGEKK0xJQk5BTUU9bGlidG9tY3J5cHQubGEKK0hBU0g9aGFzaHN1bQorQ1JZUFQ9ZW5jcnlwdAorU01BTEw9c21hbGwKK1BST0Y9eDg2X3Byb2YKK1RWPXR2X2dlbgorVEVTVD10ZXN0CitUSU1JTkc9dGltaW5nCisKKyNMSUJQQVRILVRoZSBkaXJlY3RvcnkgZm9yIGxpYnRvbWNyeXB0IHRvIGJlIGluc3RhbGxlZCB0by4KKyNJTkNQQVRILVRoZSBkaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgaGVhZGVyIGZpbGVzIGZvciBsaWJ0b21jcnlwdC4KKyNEQVRBUEFUSC1UaGUgZGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIHBkZiBkb2NzLgorREVTVERJUj0KK0xJQlBBVEg9L3Vzci9saWIKK0lOQ1BBVEg9L3Vzci9pbmNsdWRlCitEQVRBUEFUSD0vdXNyL3NoYXJlL2RvYy9saWJ0b21jcnlwdC9wZGYKKworI1dobyBkbyB3ZSBpbnN0YWxsIGFzPworaWZkZWYgSU5TVEFMTF9VU0VSCitVU0VSPSQoSU5TVEFMTF9VU0VSKQorZWxzZQorVVNFUj1yb290CitlbmRpZgorCitpZmRlZiBJTlNUQUxMX0dST1VQCitHUk9VUD0kKElOU1RBTExfR1JPVVApICAgCitlbHNlCitHUk9VUD13aGVlbCAgCitlbmRpZgorCisjTGlzdCBvZiBvYmplY3RzIHRvIGNvbXBpbGUuCisKKyNMZWF2ZSBNUEkgYnVpbHQtaW4gb3IgZm9yY2UgZGV2ZWxvcGVyIHRvIGxpbmsgYWdhaW5zdCBsaWJ0b21tYXRoPworaWZuZGVmIElHTk9SRV9NUEkKK01QSU9CSkVDVD1zcmMvbWlzYy9tcGkvbXBpLm8KK2Vsc2UgCisjSWYgeW91IGRvbid0IHdhbnQgbXBpLm8gdGhlbiBhZGQgdGhpcworTVBJU0hBUkVEPSQoTElCUEFUSCkvbGlidG9tbWF0aC5sYQorZW5kaWYKKworT0JKRUNUUz1zcmMvY2lwaGVycy9hZXMvYWVzX2VuYy5vICQoTVBJT0JKRUNUKSBzcmMvY2lwaGVycy9hZXMvYWVzLm8gc3JjL2NpcGhlcnMvYW51YmlzLm8gXAorc3JjL2NpcGhlcnMvYmxvd2Zpc2gubyBzcmMvY2lwaGVycy9jYXN0NS5vIHNyYy9jaXBoZXJzL2Rlcy5vIHNyYy9jaXBoZXJzL2toYXphZC5vIHNyYy9jaXBoZXJzL25vZWtlb24ubyBcCitzcmMvY2lwaGVycy9yYzIubyBzcmMvY2lwaGVycy9yYzUubyBzcmMvY2lwaGVycy9yYzYubyBzcmMvY2lwaGVycy9zYWZlci9zYWZlci5vIFwKK3NyYy9jaXBoZXJzL3NhZmVyL3NhZmVyX3RhYi5vIHNyYy9jaXBoZXJzL3NhZmVyL3NhZmVycC5vIHNyYy9jaXBoZXJzL3NraXBqYWNrLm8gXAorc3JjL2NpcGhlcnMvdHdvZmlzaC90d29maXNoLm8gc3JjL2NpcGhlcnMveHRlYS5vIHNyYy9lbmNhdXRoL2NjbS9jY21fbWVtb3J5Lm8gXAorc3JjL2VuY2F1dGgvY2NtL2NjbV90ZXN0Lm8gc3JjL2VuY2F1dGgvZWF4L2VheF9hZGRoZWFkZXIubyBzcmMvZW5jYXV0aC9lYXgvZWF4X2RlY3J5cHQubyBcCitzcmMvZW5jYXV0aC9lYXgvZWF4X2RlY3J5cHRfdmVyaWZ5X21lbW9yeS5vIHNyYy9lbmNhdXRoL2VheC9lYXhfZG9uZS5vIHNyYy9lbmNhdXRoL2VheC9lYXhfZW5jcnlwdC5vIFwKK3NyYy9lbmNhdXRoL2VheC9lYXhfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5Lm8gc3JjL2VuY2F1dGgvZWF4L2VheF9pbml0Lm8gXAorc3JjL2VuY2F1dGgvZWF4L2VheF90ZXN0Lm8gc3JjL2VuY2F1dGgvZ2NtL2djbV9hZGRfYWFkLm8gc3JjL2VuY2F1dGgvZ2NtL2djbV9hZGRfaXYubyBcCitzcmMvZW5jYXV0aC9nY20vZ2NtX2RvbmUubyBzcmMvZW5jYXV0aC9nY20vZ2NtX2dmX211bHQubyBzcmMvZW5jYXV0aC9nY20vZ2NtX2luaXQubyBcCitzcmMvZW5jYXV0aC9nY20vZ2NtX21lbW9yeS5vIHNyYy9lbmNhdXRoL2djbS9nY21fcHJvY2Vzcy5vIHNyYy9lbmNhdXRoL2djbS9nY21fcmVzZXQubyBcCitzcmMvZW5jYXV0aC9nY20vZ2NtX3Rlc3QubyBzcmMvZW5jYXV0aC9vY2Ivb2NiX2RlY3J5cHQubyBzcmMvZW5jYXV0aC9vY2Ivb2NiX2RlY3J5cHRfdmVyaWZ5X21lbW9yeS5vIFwKK3NyYy9lbmNhdXRoL29jYi9vY2JfZG9uZV9kZWNyeXB0Lm8gc3JjL2VuY2F1dGgvb2NiL29jYl9kb25lX2VuY3J5cHQubyBzcmMvZW5jYXV0aC9vY2Ivb2NiX2VuY3J5cHQubyBcCitzcmMvZW5jYXV0aC9vY2Ivb2NiX2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5vIHNyYy9lbmNhdXRoL29jYi9vY2JfaW5pdC5vIHNyYy9lbmNhdXRoL29jYi9vY2JfbnR6Lm8gXAorc3JjL2VuY2F1dGgvb2NiL29jYl9zaGlmdF94b3IubyBzcmMvZW5jYXV0aC9vY2Ivb2NiX3Rlc3QubyBzcmMvZW5jYXV0aC9vY2Ivc19vY2JfZG9uZS5vIFwKK3NyYy9oYXNoZXMvY2hjL2NoYy5vIHNyYy9oYXNoZXMvaGVscGVyL2hhc2hfZmlsZS5vIHNyYy9oYXNoZXMvaGVscGVyL2hhc2hfZmlsZWhhbmRsZS5vIFwKK3NyYy9oYXNoZXMvaGVscGVyL2hhc2hfbWVtb3J5Lm8gc3JjL2hhc2hlcy9oZWxwZXIvaGFzaF9tZW1vcnlfbXVsdGkubyBzcmMvaGFzaGVzL21kMi5vIHNyYy9oYXNoZXMvbWQ0Lm8gXAorc3JjL2hhc2hlcy9tZDUubyBzcmMvaGFzaGVzL3JtZDEyOC5vIHNyYy9oYXNoZXMvcm1kMTYwLm8gc3JjL2hhc2hlcy9zaGExLm8gc3JjL2hhc2hlcy9zaGEyL3NoYTI1Ni5vIFwKK3NyYy9oYXNoZXMvc2hhMi9zaGE1MTIubyBzcmMvaGFzaGVzL3RpZ2VyLm8gc3JjL2hhc2hlcy93aGlybC93aGlybC5vIHNyYy9tYWMvaG1hYy9obWFjX2RvbmUubyBcCitzcmMvbWFjL2htYWMvaG1hY19maWxlLm8gc3JjL21hYy9obWFjL2htYWNfaW5pdC5vIHNyYy9tYWMvaG1hYy9obWFjX21lbW9yeS5vIFwKK3NyYy9tYWMvaG1hYy9obWFjX21lbW9yeV9tdWx0aS5vIHNyYy9tYWMvaG1hYy9obWFjX3Byb2Nlc3MubyBzcmMvbWFjL2htYWMvaG1hY190ZXN0Lm8gXAorc3JjL21hYy9vbWFjL29tYWNfZG9uZS5vIHNyYy9tYWMvb21hYy9vbWFjX2ZpbGUubyBzcmMvbWFjL29tYWMvb21hY19pbml0Lm8gc3JjL21hYy9vbWFjL29tYWNfbWVtb3J5Lm8gXAorc3JjL21hYy9vbWFjL29tYWNfbWVtb3J5X211bHRpLm8gc3JjL21hYy9vbWFjL29tYWNfcHJvY2Vzcy5vIHNyYy9tYWMvb21hYy9vbWFjX3Rlc3QubyBcCitzcmMvbWFjL3BlbGljYW4vcGVsaWNhbi5vIHNyYy9tYWMvcGVsaWNhbi9wZWxpY2FuX21lbW9yeS5vIHNyYy9tYWMvcGVsaWNhbi9wZWxpY2FuX3Rlc3QubyBcCitzcmMvbWFjL3BtYWMvcG1hY19kb25lLm8gc3JjL21hYy9wbWFjL3BtYWNfZmlsZS5vIHNyYy9tYWMvcG1hYy9wbWFjX2luaXQubyBzcmMvbWFjL3BtYWMvcG1hY19tZW1vcnkubyBcCitzcmMvbWFjL3BtYWMvcG1hY19tZW1vcnlfbXVsdGkubyBzcmMvbWFjL3BtYWMvcG1hY19udHoubyBzcmMvbWFjL3BtYWMvcG1hY19wcm9jZXNzLm8gXAorc3JjL21hYy9wbWFjL3BtYWNfc2hpZnRfeG9yLm8gc3JjL21hYy9wbWFjL3BtYWNfdGVzdC5vIHNyYy9taXNjL2Jhc2U2NC9iYXNlNjRfZGVjb2RlLm8gXAorc3JjL21pc2MvYmFzZTY0L2Jhc2U2NF9lbmNvZGUubyBzcmMvbWlzYy9idXJuX3N0YWNrLm8gc3JjL21pc2MvY3J5cHQvY3J5cHQubyBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF9hcmdjaGsubyBzcmMvbWlzYy9jcnlwdC9jcnlwdF9jaXBoZXJfZGVzY3JpcHRvci5vIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X2NpcGhlcl9pc192YWxpZC5vIHNyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfY2lwaGVyLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXJfYW55Lm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXJfaWQubyBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2hhc2gubyBzcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2hhc2hfYW55Lm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9oYXNoX2lkLm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9wcm5nLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfaGFzaF9kZXNjcmlwdG9yLm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfaGFzaF9pc192YWxpZC5vIFwKK3NyYy9taXNjL2NyeXB0L2NyeXB0X3BybmdfZGVzY3JpcHRvci5vIHNyYy9taXNjL2NyeXB0L2NyeXB0X3BybmdfaXNfdmFsaWQubyBcCitzcmMvbWlzYy9jcnlwdC9jcnlwdF9yZWdpc3Rlcl9jaXBoZXIubyBzcmMvbWlzYy9jcnlwdC9jcnlwdF9yZWdpc3Rlcl9oYXNoLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfcmVnaXN0ZXJfcHJuZy5vIHNyYy9taXNjL2NyeXB0L2NyeXB0X3VucmVnaXN0ZXJfY2lwaGVyLm8gXAorc3JjL21pc2MvY3J5cHQvY3J5cHRfdW5yZWdpc3Rlcl9oYXNoLm8gc3JjL21pc2MvY3J5cHQvY3J5cHRfdW5yZWdpc3Rlcl9wcm5nLm8gXAorc3JjL21pc2MvZXJyb3JfdG9fc3RyaW5nLm8gc3JjL21pc2MvbXBpL2lzX3ByaW1lLm8gc3JjL21pc2MvbXBpL21waV90b19sdGNfZXJyb3IubyBcCitzcmMvbWlzYy9tcGkvcmFuZF9wcmltZS5vIHNyYy9taXNjL3BrY3M1L3BrY3NfNV8xLm8gc3JjL21pc2MvcGtjczUvcGtjc181XzIubyBzcmMvbWlzYy96ZXJvbWVtLm8gXAorc3JjL21vZGVzL2NiYy9jYmNfZGVjcnlwdC5vIHNyYy9tb2Rlcy9jYmMvY2JjX2RvbmUubyBzcmMvbW9kZXMvY2JjL2NiY19lbmNyeXB0Lm8gXAorc3JjL21vZGVzL2NiYy9jYmNfZ2V0aXYubyBzcmMvbW9kZXMvY2JjL2NiY19zZXRpdi5vIHNyYy9tb2Rlcy9jYmMvY2JjX3N0YXJ0Lm8gXAorc3JjL21vZGVzL2NmYi9jZmJfZGVjcnlwdC5vIHNyYy9tb2Rlcy9jZmIvY2ZiX2RvbmUubyBzcmMvbW9kZXMvY2ZiL2NmYl9lbmNyeXB0Lm8gXAorc3JjL21vZGVzL2NmYi9jZmJfZ2V0aXYubyBzcmMvbW9kZXMvY2ZiL2NmYl9zZXRpdi5vIHNyYy9tb2Rlcy9jZmIvY2ZiX3N0YXJ0Lm8gXAorc3JjL21vZGVzL2N0ci9jdHJfZGVjcnlwdC5vIHNyYy9tb2Rlcy9jdHIvY3RyX2RvbmUubyBzcmMvbW9kZXMvY3RyL2N0cl9lbmNyeXB0Lm8gXAorc3JjL21vZGVzL2N0ci9jdHJfZ2V0aXYubyBzcmMvbW9kZXMvY3RyL2N0cl9zZXRpdi5vIHNyYy9tb2Rlcy9jdHIvY3RyX3N0YXJ0Lm8gXAorc3JjL21vZGVzL2VjYi9lY2JfZGVjcnlwdC5vIHNyYy9tb2Rlcy9lY2IvZWNiX2RvbmUubyBzcmMvbW9kZXMvZWNiL2VjYl9lbmNyeXB0Lm8gXAorc3JjL21vZGVzL2VjYi9lY2Jfc3RhcnQubyBzcmMvbW9kZXMvb2ZiL29mYl9kZWNyeXB0Lm8gc3JjL21vZGVzL29mYi9vZmJfZG9uZS5vIFwKK3NyYy9tb2Rlcy9vZmIvb2ZiX2VuY3J5cHQubyBzcmMvbW9kZXMvb2ZiL29mYl9nZXRpdi5vIHNyYy9tb2Rlcy9vZmIvb2ZiX3NldGl2Lm8gXAorc3JjL21vZGVzL29mYi9vZmJfc3RhcnQubyBzcmMvcGsvYXNuMS9kZXIvYml0L2Rlcl9kZWNvZGVfYml0X3N0cmluZy5vIFwKK3NyYy9way9hc24xL2Rlci9iaXQvZGVyX2VuY29kZV9iaXRfc3RyaW5nLm8gc3JjL3BrL2FzbjEvZGVyL2JpdC9kZXJfbGVuZ3RoX2JpdF9zdHJpbmcubyBcCitzcmMvcGsvYXNuMS9kZXIvY2hvaWNlL2Rlcl9kZWNvZGVfY2hvaWNlLm8gc3JjL3BrL2FzbjEvZGVyL2lhNS9kZXJfZGVjb2RlX2lhNV9zdHJpbmcubyBcCitzcmMvcGsvYXNuMS9kZXIvaWE1L2Rlcl9lbmNvZGVfaWE1X3N0cmluZy5vIHNyYy9way9hc24xL2Rlci9pYTUvZGVyX2xlbmd0aF9pYTVfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2RlY29kZV9pbnRlZ2VyLm8gc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2VuY29kZV9pbnRlZ2VyLm8gXAorc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2xlbmd0aF9pbnRlZ2VyLm8gXAorc3JjL3BrL2FzbjEvZGVyL29iamVjdF9pZGVudGlmaWVyL2Rlcl9kZWNvZGVfb2JqZWN0X2lkZW50aWZpZXIubyBcCitzcmMvcGsvYXNuMS9kZXIvb2JqZWN0X2lkZW50aWZpZXIvZGVyX2VuY29kZV9vYmplY3RfaWRlbnRpZmllci5vIFwKK3NyYy9way9hc24xL2Rlci9vYmplY3RfaWRlbnRpZmllci9kZXJfbGVuZ3RoX29iamVjdF9pZGVudGlmaWVyLm8gXAorc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9kZWNvZGVfb2N0ZXRfc3RyaW5nLm8gc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9lbmNvZGVfb2N0ZXRfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9sZW5ndGhfb2N0ZXRfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2RlY29kZV9wcmludGFibGVfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2VuY29kZV9wcmludGFibGVfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2xlbmd0aF9wcmludGFibGVfc3RyaW5nLm8gXAorc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9kZWNvZGVfc2VxdWVuY2UubyBzcmMvcGsvYXNuMS9kZXIvc2VxdWVuY2UvZGVyX2RlY29kZV9zZXF1ZW5jZV9tdWx0aS5vIFwKK3NyYy9way9hc24xL2Rlci9zZXF1ZW5jZS9kZXJfZW5jb2RlX3NlcXVlbmNlLm8gc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9lbmNvZGVfc2VxdWVuY2VfbXVsdGkubyBcCitzcmMvcGsvYXNuMS9kZXIvc2VxdWVuY2UvZGVyX2xlbmd0aF9zZXF1ZW5jZS5vIFwKK3NyYy9way9hc24xL2Rlci9zaG9ydF9pbnRlZ2VyL2Rlcl9kZWNvZGVfc2hvcnRfaW50ZWdlci5vIFwKK3NyYy9way9hc24xL2Rlci9zaG9ydF9pbnRlZ2VyL2Rlcl9lbmNvZGVfc2hvcnRfaW50ZWdlci5vIFwKK3NyYy9way9hc24xL2Rlci9zaG9ydF9pbnRlZ2VyL2Rlcl9sZW5ndGhfc2hvcnRfaW50ZWdlci5vIHNyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9kZWNvZGVfdXRjdGltZS5vIFwKK3NyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9lbmNvZGVfdXRjdGltZS5vIHNyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9sZW5ndGhfdXRjdGltZS5vIFwKK3NyYy9way9kaC9kaC5vIHNyYy9way9kc2EvZHNhX2V4cG9ydC5vIHNyYy9way9kc2EvZHNhX2ZyZWUubyBzcmMvcGsvZHNhL2RzYV9pbXBvcnQubyBcCitzcmMvcGsvZHNhL2RzYV9tYWtlX2tleS5vIHNyYy9way9kc2EvZHNhX3NpZ25faGFzaC5vIHNyYy9way9kc2EvZHNhX3ZlcmlmeV9oYXNoLm8gXAorc3JjL3BrL2RzYS9kc2FfdmVyaWZ5X2tleS5vIHNyYy9way9lY2MvZWNjLm8gc3JjL3BrL3BhY2tldF9zdG9yZV9oZWFkZXIubyBzcmMvcGsvcGFja2V0X3ZhbGlkX2hlYWRlci5vIFwKK3NyYy9way9wa2NzMS9wa2NzXzFfaTJvc3AubyBzcmMvcGsvcGtjczEvcGtjc18xX21nZjEubyBzcmMvcGsvcGtjczEvcGtjc18xX29hZXBfZGVjb2RlLm8gXAorc3JjL3BrL3BrY3MxL3BrY3NfMV9vYWVwX2VuY29kZS5vIHNyYy9way9wa2NzMS9wa2NzXzFfb3MyaXAubyBzcmMvcGsvcGtjczEvcGtjc18xX3Bzc19kZWNvZGUubyBcCitzcmMvcGsvcGtjczEvcGtjc18xX3Bzc19lbmNvZGUubyBzcmMvcGsvcnNhL3JzYV9kZWNyeXB0X2tleS5vIHNyYy9way9yc2EvcnNhX2VuY3J5cHRfa2V5Lm8gXAorc3JjL3BrL3JzYS9yc2FfZXhwb3J0Lm8gc3JjL3BrL3JzYS9yc2FfZXhwdG1vZC5vIHNyYy9way9yc2EvcnNhX2ZyZWUubyBzcmMvcGsvcnNhL3JzYV9pbXBvcnQubyBcCitzcmMvcGsvcnNhL3JzYV9tYWtlX2tleS5vIHNyYy9way9yc2EvcnNhX3NpZ25faGFzaC5vIHNyYy9way9yc2EvcnNhX3ZlcmlmeV9oYXNoLm8gc3JjL3BybmdzL2ZvcnR1bmEubyBcCitzcmMvcHJuZ3MvcmM0Lm8gc3JjL3BybmdzL3JuZ19nZXRfYnl0ZXMubyBzcmMvcHJuZ3Mvcm5nX21ha2VfcHJuZy5vIHNyYy9wcm5ncy9zb2JlcjEyOC5vIFwKK3NyYy9wcm5ncy9zcHJuZy5vIHNyYy9wcm5ncy95YXJyb3cubyAKKworSEVBREVSUz1zcmMvaGVhZGVycy90b21tYXRoX3N1cGVyY2xhc3MuaCBzcmMvaGVhZGVycy90b21jcnlwdF9jZmcuaCBzcmMvaGVhZGVycy90b21jcnlwdF9tYWMuaCBcCitzcmMvaGVhZGVycy90b21jcnlwdF9tYWNyb3MuaCBzcmMvaGVhZGVycy90b21jcnlwdF9jdXN0b20uaCBzcmMvaGVhZGVycy90b21jcnlwdF9hcmdjaGsuaCBcCitzcmMvaGVhZGVycy90b21jcnlwdF9jaXBoZXIuaCBzcmMvaGVhZGVycy90b21jcnlwdF9way5oIHNyYy9oZWFkZXJzL3RvbW1hdGhfY2xhc3MuaCBcCitzcmMvaGVhZGVycy9sdGNfdG9tbWF0aC5oIHNyYy9oZWFkZXJzL3RvbWNyeXB0X2hhc2guaCBzcmMvaGVhZGVycy90b21jcnlwdF9taXNjLmggXAorc3JjL2hlYWRlcnMvdG9tY3J5cHQuaCBzcmMvaGVhZGVycy90b21jcnlwdF9wa2NzLmggc3JjL2hlYWRlcnMvdG9tY3J5cHRfcHJuZy5oIHRlc3Rwcm9mL3RvbWNyeXB0X3Rlc3QuaAorCitURVNUT0JKRUNUUz1kZW1vcy90ZXN0Lm8KK0hBU0hPQkpFQ1RTPWRlbW9zL2hhc2hzdW0ubworQ1JZUFRPQkpFQ1RTPWRlbW9zL2VuY3J5cHQubworU01BTExPQkpFQ1RTPWRlbW9zL3NtYWxsLm8KK1RWUz1kZW1vcy90dl9nZW4ubworVEVTVFM9ZGVtb3MvdGVzdC5vCitUSU1JTkdTPWRlbW9zL3RpbWluZy5vCisKKyNUaGUgZGVmYXVsdCBydWxlIGZvciBtYWtlIGJ1aWxkcyB0aGUgbGlidG9tY3J5cHQgbGlicmFyeS4KK2RlZmF1bHQ6bGlicmFyeQorCisjY2lwaGVycyBjb21lIGluIHR3byBmbGF2b3Vycy4uLiBlbmMrZGVjIGFuZCBlbmMgCitzcmMvY2lwaGVycy9hZXMvYWVzX2VuYy5vOiBzcmMvY2lwaGVycy9hZXMvYWVzLmMgc3JjL2NpcGhlcnMvYWVzL2Flc190YWIuYworCSQoQ0MpICQoQ0ZMQUdTKSAtREVOQ1JZUFRfT05MWSAtYyBzcmMvY2lwaGVycy9hZXMvYWVzLmMgLW8gc3JjL2NpcGhlcnMvYWVzL2Flc19lbmMubworCisjVGhlc2UgYXJlIHRoZSBydWxlcyB0byBtYWtlIGNlcnRhaW4gb2JqZWN0IGZpbGVzLgorc3JjL2NpcGhlcnMvYWVzL2Flcy5vOiBzcmMvY2lwaGVycy9hZXMvYWVzLmMgc3JjL2NpcGhlcnMvYWVzL2Flc190YWIuYworc3JjL2NpcGhlcnMvdHdvZmlzaC90d29maXNoLm86IHNyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaC5jIHNyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaF90YWIuYworc3JjL2hhc2hlcy93aGlybC93aGlybC5vOiBzcmMvaGFzaGVzL3doaXJsL3doaXJsLmMgc3JjL2hhc2hlcy93aGlybC93aGlybHRhYi5jCitzcmMvcGsvZWNjL2VjYy5vOiBzcmMvcGsvZWNjL2VjYy5jIHNyYy9way9lY2MvZWNjX3N5cy5jCitzcmMvcGsvZGgvZGgubzogc3JjL3BrL2RoL2RoLmMgc3JjL3BrL2RoL2RoX3N5cy5jCitzcmMvaGFzaGVzL3NoYTIvc2hhNTEyLm86IHNyYy9oYXNoZXMvc2hhMi9zaGE1MTIuYyBzcmMvaGFzaGVzL3NoYTIvc2hhMzg0LmMKK3NyYy9oYXNoZXMvc2hhMi9zaGEyNTYubzogc3JjL2hhc2hlcy9zaGEyL3NoYTI1Ni5jIHNyYy9oYXNoZXMvc2hhMi9zaGEyMjQuYworCisjVGhpcyBydWxlIG1ha2VzIHRoZSBsaWJ0b21jcnlwdCBsaWJyYXJ5LgorbGlicmFyeTogJChMSUJOQU1FKQorCiskKExJQlRFU1QpOgorCWNkIHRlc3Rwcm9mIDsgQ0ZMQUdTPSIkKENGTEFHUykiIEdST1VQPSQoR1JPVVApIFVTRVI9JChVU0VSKSBWRVJTSU9OPSQoVkVSU0lPTikgTElCUEFUSD0kKExJQlBBVEgpIExJQk5BTUU9JChMSUJURVNUKSBtYWtlIC1mIG1ha2VmaWxlLnNoYXJlZAorCiskKExJQk5BTUUpOiAkKE9CSkVDVFMpCisJbGlidG9vbCAtLXNpbGVudCAtLW1vZGU9bGluayBnY2MgJChDRkxBR1MpIGBmaW5kIC4gLXR5cGUgZiB8IGdyZXAgIlsuXWxvIiB8IGdyZXAgInNyYy8iIHwgeGFyZ3NgIC1vIGxpYnRvbWNyeXB0LmxhIC1ycGF0aCAkKExJQlBBVEgpIC12ZXJzaW9uLWluZm8gJChWRVJTSU9OKQorCWxpYnRvb2wgLS1zaWxlbnQgLS1tb2RlPWxpbmsgZ2NjICQoQ0ZMQUdTKSBgZmluZCAuIC10eXBlIGYgfCBncmVwICJbLl1vIiB8IGdyZXAgInNyYy8iIHwgeGFyZ3NgICAtbyBsaWJ0b21jcnlwdC5hCisJcmFubGliIGxpYnRvbWNyeXB0LmEKKwlsaWJ0b29sIC0tc2lsZW50IC0tbW9kZT1pbnN0YWxsIGluc3RhbGwgLWMgbGlidG9tY3J5cHQubGEgJChMSUJQQVRIKS9saWJ0b21jcnlwdC5sYQorCWluc3RhbGwgLWQgLWcgJChHUk9VUCkgLW8gJChVU0VSKSAkKERFU1RESVIpJChJTkNQQVRIKQorCWluc3RhbGwgLWcgJChHUk9VUCkgLW8gJChVU0VSKSAkKEhFQURFUlMpICQoREVTVERJUikkKElOQ1BBVEgpCisKKyNUaGlzIHJ1bGUgbWFrZXMgdGhlIGhhc2ggcHJvZ3JhbSBpbmNsdWRlZCB3aXRoIGxpYnRvbWNyeXB0CitoYXNoc3VtOiBsaWJyYXJ5CisJZ2NjICQoQ0ZMQUdTKSBkZW1vcy9oYXNoc3VtLmMgLW8gaGFzaHN1bS5vCisJZ2NjIC1vIGhhc2hzdW0gaGFzaHN1bS5vIC1sdG9tY3J5cHQgJChNUElTSEFSRUQpCisKKyNtYWtlcyB0aGUgY3J5cHQgcHJvZ3JhbQorY3J5cHQ6IGxpYnJhcnkgCisJZ2NjICQoQ0ZMQUdTKSBkZW1vcy9lbmNyeXB0LmMgLW8gZW5jcnlwdC5vCisJZ2NjIC1vIGNyeXB0IGVuY3J5cHQubyAtbHRvbWNyeXB0ICQoTVBJU0hBUkVEKQorCit0dl9nZW46IGxpYnJhcnkgJChUVlMpCisJZ2NjIC1vIHR2X2dlbiAkKFRWUykgLWx0b21jcnlwdCAkKE1QSVNIQVJFRCkKKwordGVzdDogbGlicmFyeSAkKExJQlRFU1QpICQoVEVTVFMpCisJZ2NjIC1vICQoVEVTVCkgJChURVNUUykgLWx0b21jcnlwdF9wcm9mIC1sdG9tY3J5cHQgJChNUElTSEFSRUQpCisKK3RpbWluZzogbGlicmFyeSAkKExJQlRFU1QpICQoVElNSU5HUykKKwlnY2MgLW8gJChUSU1JTkcpICQoVElNSU5HUykgLWx0b21jcnlwdF9wcm9mIC1sdG9tY3J5cHQgJChNUElTSEFSRUQpCisKKyMgJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvbWFrZWZpbGUuc2hhcmVkLHYgJCAgIAorIyAkUmV2aXNpb246IDEuMTkgJCAgIAorIyAkRGF0ZTogMjAwNS8wNi8yNyAxMjozNzowNiAkIApkaWZmIC0tZ2l0IGEvbWVzcy5zaCBiL21lc3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2MzljZQotLS0gL2Rldi9udWxsCisrKyBiL21lc3Muc2gKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vYmFzaAoraWYgY3ZzIGxvZyAkMSA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuIGV4aXQgMDsgZWxzZSBlY2hvICIkMSBzaG91bGRuJ3QgYmUgaGVyZSIgOyBleGl0IDE7IGZpCisKKwpkaWZmIC0tZ2l0IGEvbW9kZXNfdGVzdC5jIGIvbW9kZXNfdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmM4OTIwLi4wMDAwMDAwCi0tLSBhL21vZGVzX3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIHRlc3QgQ0ZCL09GQi9DQkMgbW9kZXMgKi8KLSNpbmNsdWRlICJ0ZXN0LmgiCi0KLWludCBtb2Rlc190ZXN0KHZvaWQpCi17Ci0gICB1bnNpZ25lZCBjaGFyIHB0WzY0XSwgY3RbNjRdLCB0bXBbNjRdLCBrZXlbMTZdLCBpdlsxNl07Ci0gICBpbnQgeCwgY2lwaGVyX2lkeDsKLSAgIHN5bW1ldHJpY19DQkMgY2JjOwotICAgCi0gICAvKiBtYWtlIGEgcmFuZG9tIHB0LCBrZXkgYW5kIGl2ICovCi0gICB5YXJyb3dfcmVhZChwdCwgNjQsICAmdGVzdF95YXJyb3cpOwotICAgeWFycm93X3JlYWQoa2V5LCAxNiwgJnRlc3RfeWFycm93KTsKLSAgIHlhcnJvd19yZWFkKGl2LCAxNiwgICZ0ZXN0X3lhcnJvdyk7Ci0gICAKLS8qIHRlc3QgQ0JDIG1vZGUgKi8KLSAgIGNpcGhlcl9pZHggPSBmaW5kX2NpcGhlcigiYWVzIik7Ci0gICBpZiAoY2lwaGVyX2lkeCA9PSAtMSkgewotICAgICAgcHJpbnRmKCJ0ZXN0IHJlcXVpcmVzIEFFUyIpOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0gICAKLSAgIAotICAgLyogZW5jb2RlIHRoZSBibG9jayAqLwotICAgRE8oY2JjX3N0YXJ0KGNpcGhlcl9pZHgsIGl2LCBrZXksIDE2LCAwLCAmY2JjKSk7Ci0gICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7Ci0gICAgICBETyhjYmNfZW5jcnlwdChwdCt4KjE2LCBjdCt4KjE2LCAmY2JjKSk7Ci0gICB9Ci0gICAKLSAgIC8qIGRlY29kZSB0aGUgYmxvY2sgKi8KLSAgIERPKGNiY19zdGFydChjaXBoZXJfaWR4LCBpdiwga2V5LCAxNiwgMCwgJmNiYykpOwotICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykgewotICAgICAgRE8oY2JjX2RlY3J5cHQoY3QreCoxNiwgdG1wK3gqMTYsICZjYmMpKTsKLSAgIH0KLSAgIGlmIChtZW1jbXAodG1wLCBwdCwgNjQpICE9IDApIHsKLSAgICAgIHByaW50ZigiQ0JDIGZhaWxlZCIpOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0gICAKLS8qICAgCi0gICBleHRlcm4gaW50IGNiY19zdGFydChpbnQgY2lwaGVyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19DQkMgKmNiYyk7Ci1leHRlcm4gaW50IGNiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX0NCQyAqY2JjKTsKLWV4dGVybiBpbnQgY2JjX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfQ0JDICpjYmMpOwotKi8KLQotfQpkaWZmIC0tZ2l0IGEvbXBpLmMgYi9tcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0NWEyNy4uMDAwMDAwMAotLS0gYS9tcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDg0MTYgKzAsMCBAQAotLyogU3RhcnQ6IGJuX2Vycm9yLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgICBpbnQgY29kZTsKLSAgICAgY2hhciAqbXNnOwotfSBtc2dzW10gPSB7Ci0gICAgIHsgTVBfT0tBWSwgIlN1Y2Nlc3NmdWwiIH0sCi0gICAgIHsgTVBfTUVNLCAgIk91dCBvZiBoZWFwIiB9LAotICAgICB7IE1QX1ZBTCwgICJWYWx1ZSBvdXQgb2YgcmFuZ2UiIH0KLX07Ci0KLS8qIHJldHVybiBhIGNoYXIgKiBzdHJpbmcgZm9yIGEgZ2l2ZW4gY29kZSAqLwotY2hhciAqbXBfZXJyb3JfdG9fc3RyaW5nKGludCBjb2RlKQotewotICAgaW50IHg7Ci0KLSAgIC8qIHNjYW4gdGhlIGxvb2t1cCB0YWJsZSBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UgKi8KLSAgIGZvciAoeCA9IDA7IHggPCAoaW50KShzaXplb2YobXNncykgLyBzaXplb2YobXNnc1swXSkpOyB4KyspIHsKLSAgICAgICBpZiAobXNnc1t4XS5jb2RlID09IGNvZGUpIHsKLSAgICAgICAgICByZXR1cm4gbXNnc1t4XS5tc2c7Ci0gICAgICAgfQotICAgfQotCi0gICAvKiBnZW5lcmljIHJlcGx5IGZvciBpbnZhbGlkIGNvZGUgKi8KLSAgIHJldHVybiAiSW52YWxpZCBlcnJvciBjb2RlIjsKLX0KLQotCi0vKiBFbmQ6IGJuX2Vycm9yLmMgKi8KLQotLyogU3RhcnQ6IGJuX2Zhc3RfbXBfaW52bW9kLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGNvbXB1dGVzIHRoZSBtb2R1bGFyIGludmVyc2UgdmlhIGJpbmFyeSBleHRlbmRlZCBldWNsaWRlYW4gYWxnb3JpdGhtLCAKLSAqIHRoYXQgaXMgYyA9IDEvYSBtb2QgYiAKLSAqCi0gKiBCYXNlZCBvbiBtcF9pbnZtb2QgZXhjZXB0IHRoaXMgaXMgb3B0aW1pemVkIGZvciB0aGUgY2FzZSB3aGVyZSBiIGlzIAotICogb2RkIGFzIHBlciBIQUMgTm90ZSAxNC42NCBvbiBwcC4gNjEwCi0gKi8KLWludAotZmFzdF9tcF9pbnZtb2QgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMpCi17Ci0gIG1wX2ludCAgeCwgeSwgdSwgdiwgQiwgRDsKLSAgaW50ICAgICByZXMsIG5lZzsKLQotICAvKiAyLiBbbW9kaWZpZWRdIGIgbXVzdCBiZSBvZGQgICAqLwotICBpZiAobXBfaXNldmVuIChiKSA9PSAxKSB7Ci0gICAgcmV0dXJuIE1QX1ZBTDsKLSAgfQotCi0gIC8qIGluaXQgYWxsIG91ciB0ZW1wcyAqLwotICBpZiAoKHJlcyA9IG1wX2luaXRfbXVsdGkoJngsICZ5LCAmdSwgJnYsICZCLCAmRCwgTlVMTCkpICE9IE1QX09LQVkpIHsKLSAgICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qIHggPT0gbW9kdWx1cywgeSA9PSB2YWx1ZSB0byBpbnZlcnQgKi8KLSAgaWYgKChyZXMgPSBtcF9jb3B5IChiLCAmeCkpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIF9fRVJSOwotICB9Ci0KLSAgLyogd2UgbmVlZCB5ID0gfGF8ICovCi0gIGlmICgocmVzID0gbXBfYWJzIChhLCAmeSkpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIF9fRVJSOwotICB9Ci0KLSAgLyogMy4gdT14LCB2PXksIEE9MSwgQj0wLCBDPTAsRD0xICovCi0gIGlmICgocmVzID0gbXBfY29weSAoJngsICZ1KSkgIT0gTVBfT0tBWSkgewotICAgIGdvdG8gX19FUlI7Ci0gIH0KLSAgaWYgKChyZXMgPSBtcF9jb3B5ICgmeSwgJnYpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX0VSUjsKLSAgfQotICBtcF9zZXQgKCZELCAxKTsKLQotdG9wOgotICAvKiA0LiAgd2hpbGUgdSBpcyBldmVuIGRvICovCi0gIHdoaWxlIChtcF9pc2V2ZW4gKCZ1KSA9PSAxKSB7Ci0gICAgLyogNC4xIHUgPSB1LzIgKi8KLSAgICBpZiAoKHJlcyA9IG1wX2Rpdl8yICgmdSwgJnUpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fRVJSOwotICAgIH0KLSAgICAvKiA0LjIgaWYgQiBpcyBvZGQgdGhlbiAqLwotICAgIGlmIChtcF9pc29kZCAoJkIpID09IDEpIHsKLSAgICAgIGlmICgocmVzID0gbXBfc3ViICgmQiwgJngsICZCKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fRVJSOwotICAgICAgfQotICAgIH0KLSAgICAvKiBCID0gQi8yICovCi0gICAgaWYgKChyZXMgPSBtcF9kaXZfMiAoJkIsICZCKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX0VSUjsKLSAgICB9Ci0gIH0KLQotICAvKiA1LiAgd2hpbGUgdiBpcyBldmVuIGRvICovCi0gIHdoaWxlIChtcF9pc2V2ZW4gKCZ2KSA9PSAxKSB7Ci0gICAgLyogNS4xIHYgPSB2LzIgKi8KLSAgICBpZiAoKHJlcyA9IG1wX2Rpdl8yICgmdiwgJnYpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fRVJSOwotICAgIH0KLSAgICAvKiA1LjIgaWYgRCBpcyBvZGQgdGhlbiAqLwotICAgIGlmIChtcF9pc29kZCAoJkQpID09IDEpIHsKLSAgICAgIC8qIEQgPSAoRC14KS8yICovCi0gICAgICBpZiAoKHJlcyA9IG1wX3N1YiAoJkQsICZ4LCAmRCkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBfX0VSUjsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogRCA9IEQvMiAqLwotICAgIGlmICgocmVzID0gbXBfZGl2XzIgKCZELCAmRCkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19FUlI7Ci0gICAgfQotICB9Ci0KLSAgLyogNi4gIGlmIHUgPj0gdiB0aGVuICovCi0gIGlmIChtcF9jbXAgKCZ1LCAmdikgIT0gTVBfTFQpIHsKLSAgICAvKiB1ID0gdSAtIHYsIEIgPSBCIC0gRCAqLwotICAgIGlmICgocmVzID0gbXBfc3ViICgmdSwgJnYsICZ1KSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX0VSUjsKLSAgICB9Ci0KLSAgICBpZiAoKHJlcyA9IG1wX3N1YiAoJkIsICZELCAmQikpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19FUlI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIHYgLSB2IC0gdSwgRCA9IEQgLSBCICovCi0gICAgaWYgKChyZXMgPSBtcF9zdWIgKCZ2LCAmdSwgJnYpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fRVJSOwotICAgIH0KLQotICAgIGlmICgocmVzID0gbXBfc3ViICgmRCwgJkIsICZEKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX0VSUjsKLSAgICB9Ci0gIH0KLQotICAvKiBpZiBub3QgemVybyBnb3RvIHN0ZXAgNCAqLwotICBpZiAobXBfaXN6ZXJvICgmdSkgPT0gMCkgewotICAgIGdvdG8gdG9wOwotICB9Ci0KLSAgLyogbm93IGEgPSBDLCBiID0gRCwgZ2NkID09IGcqdiAqLwotCi0gIC8qIGlmIHYgIT0gMSB0aGVuIHRoZXJlIGlzIG5vIGludmVyc2UgKi8KLSAgaWYgKG1wX2NtcF9kICgmdiwgMSkgIT0gTVBfRVEpIHsKLSAgICByZXMgPSBNUF9WQUw7Ci0gICAgZ290byBfX0VSUjsKLSAgfQotCi0gIC8qIGIgaXMgbm93IHRoZSBpbnZlcnNlICovCi0gIG5lZyA9IGEtPnNpZ247Ci0gIHdoaWxlIChELnNpZ24gPT0gTVBfTkVHKSB7Ci0gICAgaWYgKChyZXMgPSBtcF9hZGQgKCZELCBiLCAmRCkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19FUlI7Ci0gICAgfQotICB9Ci0gIG1wX2V4Y2ggKCZELCBjKTsKLSAgYy0+c2lnbiA9IG5lZzsKLSAgcmVzID0gTVBfT0tBWTsKLQotX19FUlI6bXBfY2xlYXJfbXVsdGkgKCZ4LCAmeSwgJnUsICZ2LCAmQiwgJkQsIE5VTEwpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiBFbmQ6IGJuX2Zhc3RfbXBfaW52bW9kLmMgKi8KLQotLyogU3RhcnQ6IGJuX2Zhc3RfbXBfbW9udGdvbWVyeV9yZWR1Y2UuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogY29tcHV0ZXMgeFIqKi0xID09IHggKG1vZCBOKSB2aWEgTW9udGdvbWVyeSBSZWR1Y3Rpb24KLSAqCi0gKiBUaGlzIGlzIGFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBvZiBtcF9tb250Z29tZXJ5X3JlZHVjZQotICogd2hpY2ggdXNlcyB0aGUgY29tYmEgbWV0aG9kIHRvIHF1aWNrbHkgY2FsY3VsYXRlIHRoZSBjb2x1bW5zIG9mIHRoZQotICogcmVkdWN0aW9uLgotICoKLSAqIEJhc2VkIG9uIEFsZ29yaXRobSAxNC4zMiBvbiBwcC42MDEgb2YgSEFDLgotKi8KLWludAotZmFzdF9tcF9tb250Z29tZXJ5X3JlZHVjZSAobXBfaW50ICogeCwgbXBfaW50ICogbiwgbXBfZGlnaXQgcmhvKQotewotICBpbnQgICAgIGl4LCByZXMsIG9sZHVzZTsKLSAgbXBfd29yZCBXW01QX1dBUlJBWV07Ci0KLSAgLyogZ2V0IG9sZCB1c2VkIGNvdW50ICovCi0gIG9sZHVzZSA9IHgtPnVzZWQ7Ci0KLSAgLyogZ3JvdyBhIGFzIHJlcXVpcmVkICovCi0gIGlmICh4LT5hbGxvYyA8IG4tPnVzZWQgKyAxKSB7Ci0gICAgaWYgKChyZXMgPSBtcF9ncm93ICh4LCBuLT51c2VkICsgMSkpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICB9Ci0KLSAgLyogZmlyc3Qgd2UgaGF2ZSB0byBnZXQgdGhlIGRpZ2l0cyBvZiB0aGUgaW5wdXQgaW50bwotICAgKiBhbiBhcnJheSBvZiBkb3VibGUgcHJlY2lzaW9uIHdvcmRzIFdbLi4uXQotICAgKi8KLSAgewotICAgIHJlZ2lzdGVyIG1wX3dvcmQgKl9XOwotICAgIHJlZ2lzdGVyIG1wX2RpZ2l0ICp0bXB4OwotCi0gICAgLyogYWxpYXMgZm9yIHRoZSBXW10gYXJyYXkgKi8KLSAgICBfVyAgID0gVzsKLQotICAgIC8qIGFsaWFzIGZvciB0aGUgZGlnaXRzIG9mICB4Ki8KLSAgICB0bXB4ID0geC0+ZHA7Ci0KLSAgICAvKiBjb3B5IHRoZSBkaWdpdHMgb2YgYSBpbnRvIFdbMC4uYS0+dXNlZC0xXSAqLwotICAgIGZvciAoaXggPSAwOyBpeCA8IHgtPnVzZWQ7IGl4KyspIHsKLSAgICAgICpfVysrID0gKnRtcHgrKzsKLSAgICB9Ci0KLSAgICAvKiB6ZXJvIHRoZSBoaWdoIHdvcmRzIG9mIFdbYS0+dXNlZC4ubS0+dXNlZCoyXSAqLwotICAgIGZvciAoOyBpeCA8IG4tPnVzZWQgKiAyICsgMTsgaXgrKykgewotICAgICAgKl9XKysgPSAwOwotICAgIH0KLSAgfQotCi0gIC8qIG5vdyB3ZSBwcm9jZWVkIHRvIHplcm8gc3VjY2Vzc2l2ZSBkaWdpdHMKLSAgICogZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgdXB3YXJkcwotICAgKi8KLSAgZm9yIChpeCA9IDA7IGl4IDwgbi0+dXNlZDsgaXgrKykgewotICAgIC8qIG11ID0gYWkgKiBtJyBtb2QgYgotICAgICAqCi0gICAgICogV2UgYXZvaWQgYSBkb3VibGUgcHJlY2lzaW9uIG11bHRpcGxpY2F0aW9uICh3aGljaCBpc24ndCByZXF1aXJlZCkKLSAgICAgKiBieSBjYXN0aW5nIHRoZSB2YWx1ZSBkb3duIHRvIGEgbXBfZGlnaXQuICBOb3RlIHRoaXMgcmVxdWlyZXMKLSAgICAgKiB0aGF0IFdbaXgtMV0gaGF2ZSAgdGhlIGNhcnJ5IGNsZWFyZWQgKHNlZSBhZnRlciB0aGUgaW5uZXIgbG9vcCkKLSAgICAgKi8KLSAgICByZWdpc3RlciBtcF9kaWdpdCBtdTsKLSAgICBtdSA9IChtcF9kaWdpdCkgKCgoV1tpeF0gJiBNUF9NQVNLKSAqIHJobykgJiBNUF9NQVNLKTsKLQotICAgIC8qIGEgPSBhICsgbXUgKiBtICogYioqaQotICAgICAqCi0gICAgICogVGhpcyBpcyBjb21wdXRlZCBpbiBwbGFjZSBhbmQgb24gdGhlIGZseS4gIFRoZSBtdWx0aXBsaWNhdGlvbgotICAgICAqIGJ5IGIqKmkgaXMgaGFuZGxlZCBieSBvZmZzZXRpbmcgd2hpY2ggY29sdW1ucyB0aGUgcmVzdWx0cwotICAgICAqIGFyZSBhZGRlZCB0by4KLSAgICAgKgotICAgICAqIE5vdGUgdGhlIGNvbWJhIG1ldGhvZCBub3JtYWxseSBkb2Vzbid0IGhhbmRsZSBjYXJyaWVzIGluIHRoZQotICAgICAqIGlubmVyIGxvb3AgSW4gdGhpcyBjYXNlIHdlIGZpeCB0aGUgY2FycnkgZnJvbSB0aGUgcHJldmlvdXMKLSAgICAgKiBjb2x1bW4gc2luY2UgdGhlIE1vbnRnb21lcnkgcmVkdWN0aW9uIHJlcXVpcmVzIGRpZ2l0cyBvZiB0aGUKLSAgICAgKiByZXN1bHQgKHNvIGZhcikgW3NlZSBhYm92ZV0gdG8gd29yay4gIFRoaXMgaXMKLSAgICAgKiBoYW5kbGVkIGJ5IGZpeGluZyB1cCBvbmUgY2FycnkgYWZ0ZXIgdGhlIGlubmVyIGxvb3AuICBUaGUKLSAgICAgKiBjYXJyeSBmaXh1cHMgYXJlIGRvbmUgaW4gb3JkZXIgc28gYWZ0ZXIgdGhlc2UgbG9vcHMgdGhlCi0gICAgICogZmlyc3QgbS0+dXNlZCB3b3JkcyBvZiBXW10gaGF2ZSB0aGUgY2FycmllcyBmaXhlZAotICAgICAqLwotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBpeTsKLSAgICAgIHJlZ2lzdGVyIG1wX2RpZ2l0ICp0bXBuOwotICAgICAgcmVnaXN0ZXIgbXBfd29yZCAqX1c7Ci0KLSAgICAgIC8qIGFsaWFzIGZvciB0aGUgZGlnaXRzIG9mIHRoZSBtb2R1bHVzICovCi0gICAgICB0bXBuID0gbi0+ZHA7Ci0KLSAgICAgIC8qIEFsaWFzIGZvciB0aGUgY29sdW1ucyBzZXQgYnkgYW4gb2Zmc2V0IG9mIGl4ICovCi0gICAgICBfVyA9IFcgKyBpeDsKLQotICAgICAgLyogaW5uZXIgbG9vcCAqLwotICAgICAgZm9yIChpeSA9IDA7IGl5IDwgbi0+dXNlZDsgaXkrKykgewotICAgICAgICAgICpfVysrICs9ICgobXBfd29yZCltdSkgKiAoKG1wX3dvcmQpKnRtcG4rKyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogbm93IGZpeCBjYXJyeSBmb3IgbmV4dCBkaWdpdCwgV1tpeCsxXSAqLwotICAgIFdbaXggKyAxXSArPSBXW2l4XSA+PiAoKG1wX3dvcmQpIERJR0lUX0JJVCk7Ci0gIH0KLQotICAvKiBub3cgd2UgaGF2ZSB0byBwcm9wYWdhdGUgdGhlIGNhcnJpZXMgYW5kCi0gICAqIHNoaWZ0IHRoZSB3b3JkcyBkb3dud2FyZCBbYWxsIHRob3NlIGxlYXN0Ci0gICAqIHNpZ25pZmljYW50IGRpZ2l0cyB3ZSB6ZXJvZWRdLgotICAgKi8KLSAgewotICAgIHJlZ2lzdGVyIG1wX2RpZ2l0ICp0bXB4OwotICAgIHJlZ2lzdGVyIG1wX3dvcmQgKl9XLCAqX1cxOwotCi0gICAgLyogbm94IGZpeCByZXN0IG9mIGNhcnJpZXMgKi8KLQotICAgIC8qIGFsaWFzIGZvciBjdXJyZW50IHdvcmQgKi8KLSAgICBfVzEgPSBXICsgaXg7Ci0KLSAgICAvKiBhbGlhcyBmb3IgbmV4dCB3b3JkLCB3aGVyZSB0aGUgY2FycnkgZ29lcyAqLwotICAgIF9XID0gVyArICsraXg7Ci0KLSAgICBmb3IgKDsgaXggPD0gbi0+dXNlZCAqIDIgKyAxOyBpeCsrKSB7Ci0gICAgICAqX1crKyArPSAqX1cxKysgPj4gKChtcF93b3JkKSBESUdJVF9CSVQpOwotICAgIH0KLQotICAgIC8qIGNvcHkgb3V0LCBBID0gQS9iKipuCi0gICAgICoKLSAgICAgKiBUaGUgcmVzdWx0IGlzIEEvYioqbiBidXQgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIGZyb20gYW4KLSAgICAgKiBhcnJheSBvZiBtcF93b3JkIHRvIG1wX2RpZ2l0IHRoYW4gY2FsbGluZyBtcF9yc2hkCi0gICAgICogd2UganVzdCBjb3B5IHRoZW0gaW4gdGhlIHJpZ2h0IG9yZGVyCi0gICAgICovCi0KLSAgICAvKiBhbGlhcyBmb3IgZGVzdGluYXRpb24gd29yZCAqLwotICAgIHRtcHggPSB4LT5kcDsKLQotICAgIC8qIGFsaWFzIGZvciBzaGlmdGVkIGRvdWJsZSBwcmVjaXNpb24gcmVzdWx0ICovCi0gICAgX1cgPSBXICsgbi0+dXNlZDsKLQotICAgIGZvciAoaXggPSAwOyBpeCA8IG4tPnVzZWQgKyAxOyBpeCsrKSB7Ci0gICAgICAqdG1weCsrID0gKG1wX2RpZ2l0KSgqX1crKyAmICgobXBfd29yZCkgTVBfTUFTSykpOwotICAgIH0KLQotICAgIC8qIHplcm8gb2xkdXNlZCBkaWdpdHMsIGlmIHRoZSBpbnB1dCBhIHdhcyBsYXJnZXIgdGhhbgotICAgICAqIG0tPnVzZWQrMSB3ZSdsbCBoYXZlIHRvIGNsZWFyIHRoZSBkaWdpdHMKLSAgICAgKi8KLSAgICBmb3IgKDsgaXggPCBvbGR1c2U7IGl4KyspIHsKLSAgICAgICp0bXB4KysgPSAwOwotICAgIH0KLSAgfQotCi0gIC8qIHNldCB0aGUgbWF4IHVzZWQgYW5kIGNsYW1wICovCi0gIHgtPnVzZWQgPSBuLT51c2VkICsgMTsKLSAgbXBfY2xhbXAgKHgpOwotCi0gIC8qIGlmIEEgPj0gbSB0aGVuIEEgPSBBIC0gbSAqLwotICBpZiAobXBfY21wX21hZyAoeCwgbikgIT0gTVBfTFQpIHsKLSAgICByZXR1cm4gc19tcF9zdWIgKHgsIG4sIHgpOwotICB9Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX2Zhc3RfbXBfbW9udGdvbWVyeV9yZWR1Y2UuYyAqLwotCi0vKiBTdGFydDogYm5fZmFzdF9zX21wX211bF9kaWdzLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIEZhc3QgKGNvbWJhKSBtdWx0aXBsaWVyCi0gKgotICogVGhpcyBpcyB0aGUgZmFzdCBjb2x1bW4tYXJyYXkgW2NvbWJhXSBtdWx0aXBsaWVyLiAgSXQgaXMgCi0gKiBkZXNpZ25lZCB0byBjb21wdXRlIHRoZSBjb2x1bW5zIG9mIHRoZSBwcm9kdWN0IGZpcnN0IAotICogdGhlbiBoYW5kbGUgdGhlIGNhcnJpZXMgYWZ0ZXJ3YXJkcy4gIFRoaXMgaGFzIHRoZSBlZmZlY3QgCi0gKiBvZiBtYWtpbmcgdGhlIG5lc3RlZCBsb29wcyB0aGF0IGNvbXB1dGUgdGhlIGNvbHVtbnMgdmVyeQotICogc2ltcGxlIGFuZCBzY2hlZHVsYWJsZSBvbiBzdXBlci1zY2FsYXIgcHJvY2Vzc29ycy4KLSAqCi0gKiBUaGlzIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHByb2R1Y2UgYSB2YXJpYWJsZSBudW1iZXIgb2YgCi0gKiBkaWdpdHMgb2Ygb3V0cHV0IHNvIGlmIHNheSBvbmx5IGEgaGFsZi1wcm9kdWN0IGlzIHJlcXVpcmVkIAotICogeW91IGRvbid0IGhhdmUgdG8gY29tcHV0ZSB0aGUgdXBwZXIgaGFsZiAoYSBmZWF0dXJlIAotICogcmVxdWlyZWQgZm9yIGZhc3QgQmFycmV0dCByZWR1Y3Rpb24pLgotICoKLSAqIEJhc2VkIG9uIEFsZ29yaXRobSAxNC4xMiBvbiBwcC41OTUgb2YgSEFDLgotICoKLSAqLwotaW50Ci1mYXN0X3NfbXBfbXVsX2RpZ3MgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMsIGludCBkaWdzKQotewotICBpbnQgICAgIG9sZHVzZSwgcmVzLCBwYSwgaXg7Ci0gIG1wX3dvcmQgV1tNUF9XQVJSQVldOwotCi0gIC8qIGdyb3cgdGhlIGRlc3RpbmF0aW9uIGFzIHJlcXVpcmVkICovCi0gIGlmIChjLT5hbGxvYyA8IGRpZ3MpIHsKLSAgICBpZiAoKHJlcyA9IG1wX2dyb3cgKGMsIGRpZ3MpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgfQotCi0gIC8qIGNsZWFyIHRlbXAgYnVmICh0aGUgY29sdW1ucykgKi8KLSAgbWVtc2V0IChXLCAwLCBzaXplb2YgKG1wX3dvcmQpICogZGlncyk7Ci0KLSAgLyogY2FsY3VsYXRlIHRoZSBjb2x1bW5zICovCi0gIHBhID0gYS0+dXNlZDsKLSAgZm9yIChpeCA9IDA7IGl4IDwgcGE7IGl4KyspIHsKLSAgICAvKiB0aGlzIG11bHRpcGxpZXIgaGFzIGJlZW4gbW9kaWZpZWQgdG8gYWxsb3cgeW91IHRvIAotICAgICAqIGNvbnRyb2wgaG93IG1hbnkgZGlnaXRzIG9mIG91dHB1dCBhcmUgcHJvZHVjZWQuICAKLSAgICAgKiBTbyBhdCBtb3N0IHdlIHdhbnQgdG8gbWFrZSB1cHRvICJkaWdzIiBkaWdpdHMgb2Ygb3V0cHV0LgotICAgICAqCi0gICAgICogdGhpcyBhZGRzIHByb2R1Y3RzIHRvIGRpc3RpbmN0IGNvbHVtbnMgKGF0IGl4K2l5KSBvZiBXCi0gICAgICogbm90ZSB0aGF0IGVhY2ggc3RlcCB0aHJvdWdoIHRoZSBsb29wIGlzIG5vdCBkZXBlbmRlbnQgb24KLSAgICAgKiB0aGUgcHJldmlvdXMgd2hpY2ggbWVhbnMgdGhlIGNvbXBpbGVyIGNhbiBlYXNpbHkgdW5yb2xsCi0gICAgICogdGhlIGxvb3Agd2l0aG91dCBzY2hlZHVsaW5nIHByb2JsZW1zCi0gICAgICovCi0gICAgewotICAgICAgcmVnaXN0ZXIgbXBfZGlnaXQgdG1weCwgKnRtcHk7Ci0gICAgICByZWdpc3RlciBtcF93b3JkICpfVzsKLSAgICAgIHJlZ2lzdGVyIGludCBpeSwgcGI7Ci0KLSAgICAgIC8qIGFsaWFzIGZvciB0aGUgdGhlIHdvcmQgb24gdGhlIGxlZnQgZS5nLiBBW2l4XSAqIEFbaXldICovCi0gICAgICB0bXB4ID0gYS0+ZHBbaXhdOwotCi0gICAgICAvKiBhbGlhcyBmb3IgdGhlIHJpZ2h0IHNpZGUgKi8KLSAgICAgIHRtcHkgPSBiLT5kcDsKLQotICAgICAgLyogYWxpYXMgZm9yIHRoZSBjb2x1bW5zLCBlYWNoIHN0ZXAgdGhyb3VnaCB0aGUgbG9vcCBhZGRzIGEgbmV3Ci0gICAgICAgICB0ZXJtIHRvIGVhY2ggY29sdW1uCi0gICAgICAgKi8KLSAgICAgIF9XID0gVyArIGl4OwotCi0gICAgICAvKiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpcyBsaW1pdGVkIGJ5IHRoZWlyIHBsYWNlbWVudC4gIEUuZy4KLSAgICAgICAgIHdlIGF2b2lkIG11bHRpcGx5aW5nIGRpZ2l0cyB0aGF0IHdpbGwgZW5kIHVwIGFib3ZlIHRoZSAjIG9mCi0gICAgICAgICBkaWdpdHMgb2YgcHJlY2lzaW9uIHJlcXVlc3RlZAotICAgICAgICovCi0gICAgICBwYiA9IE1JTiAoYi0+dXNlZCwgZGlncyAtIGl4KTsKLQotICAgICAgZm9yIChpeSA9IDA7IGl5IDwgcGI7IGl5KyspIHsKLSAgICAgICAgKl9XKysgKz0gKChtcF93b3JkKXRtcHgpICogKChtcF93b3JkKSp0bXB5KyspOwotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLyogc2V0dXAgZGVzdCAqLwotICBvbGR1c2UgID0gYy0+dXNlZDsKLSAgYy0+dXNlZCA9IGRpZ3M7Ci0KLSAgewotICAgIHJlZ2lzdGVyIG1wX2RpZ2l0ICp0bXBjOwotCi0gICAgLyogQXQgdGhpcyBwb2ludCBXW10gY29udGFpbnMgdGhlIHN1bXMgb2YgZWFjaCBjb2x1bW4uICBUbyBnZXQgdGhlCi0gICAgICogY29ycmVjdCByZXN1bHQgd2UgbXVzdCB0YWtlIHRoZSBleHRyYSBiaXRzIGZyb20gZWFjaCBjb2x1bW4gYW5kCi0gICAgICogY2FycnkgdGhlbSBkb3duCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgd2hpbGUgdGhpcyBhZGRzIGV4dHJhIGNvZGUgdG8gdGhlIG11bHRpcGxpZXIgaXQgCi0gICAgICogc2F2ZXMgdGltZSBzaW5jZSB0aGUgY2FycnkgcHJvcGFnYXRpb24gaXMgcmVtb3ZlZCBmcm9tIHRoZSAKLSAgICAgKiBhYm92ZSBuZXN0ZWQgbG9vcC5UaGlzIGhhcyB0aGUgZWZmZWN0IG9mIHJlZHVjaW5nIHRoZSB3b3JrIAotICAgICAqIGZyb20gTiooTitOKmMpPT1OKioyICsgYypOKioyIHRvIE4qKjIgKyBOKmMgd2hlcmUgYyBpcyB0aGUgCi0gICAgICogY29zdCBvZiB0aGUgc2hpZnRpbmcuICBPbiB2ZXJ5IHNtYWxsIG51bWJlcnMgdGhpcyBpcyBzbG93ZXIgCi0gICAgICogYnV0IG9uIG1vc3QgY3J5cHRvZ3JhcGhpYyBzaXplIG51bWJlcnMgaXQgaXMgZmFzdGVyLgotICAgICAqCi0gICAgICogSW4gdGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIHdlIGZlZWQgdGhlIGNhcnJpZXMgZnJvbQotICAgICAqIGJlaGluZCB3aGljaCBtZWFucyB3aGVuIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2Ugc3RpbGwgaGF2ZSBvbmUKLSAgICAgKiBsYXN0IGRpZ2l0IHRvIGNvcHkKLSAgICAgKi8KLSAgICB0bXBjID0gYy0+ZHA7Ci0gICAgZm9yIChpeCA9IDE7IGl4IDwgZGlnczsgaXgrKykgewotICAgICAgLyogZm9yd2FyZCB0aGUgY2FycnkgZnJvbSB0aGUgcHJldmlvdXMgdGVtcCAqLwotICAgICAgV1tpeF0gKz0gKFdbaXggLSAxXSA+PiAoKG1wX3dvcmQpIERJR0lUX0JJVCkpOwotCi0gICAgICAvKiBub3cgZXh0cmFjdCB0aGUgcHJldmlvdXMgZGlnaXQgW2JlbG93IHRoZSBjYXJyeV0gKi8KLSAgICAgICp0bXBjKysgPSAobXBfZGlnaXQpIChXW2l4IC0gMV0gJiAoKG1wX3dvcmQpIE1QX01BU0spKTsKLSAgICB9Ci0gICAgLyogZmV0Y2ggdGhlIGxhc3QgZGlnaXQgKi8KLSAgICAqdG1wYysrID0gKG1wX2RpZ2l0KSAoV1tkaWdzIC0gMV0gJiAoKG1wX3dvcmQpIE1QX01BU0spKTsKLQotICAgIC8qIGNsZWFyIHVudXNlZCBkaWdpdHMgW3RoYXQgZXhpc3RlZCBpbiB0aGUgb2xkIGNvcHkgb2YgY10gKi8KLSAgICBmb3IgKDsgaXggPCBvbGR1c2U7IGl4KyspIHsKLSAgICAgICp0bXBjKysgPSAwOwotICAgIH0KLSAgfQotICBtcF9jbGFtcCAoYyk7Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX2Zhc3Rfc19tcF9tdWxfZGlncy5jICovCi0KLS8qIFN0YXJ0OiBibl9mYXN0X3NfbXBfbXVsX2hpZ2hfZGlncy5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSAjaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogdGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgZmFzdF9zX21wX211bF9kaWdzIHRoYXQgb25seSBwcm9kdWNlcwotICogb3V0cHV0IGRpZ2l0cyAqYWJvdmUqIGRpZ3MuICBTZWUgdGhlIGNvbW1lbnRzIGZvciBmYXN0X3NfbXBfbXVsX2RpZ3MKLSAqIHRvIHNlZSBob3cgaXQgd29ya3MuCi0gKgotICogVGhpcyBpcyB1c2VkIGluIHRoZSBCYXJyZXR0IHJlZHVjdGlvbiBzaW5jZSBmb3Igb25lIG9mIHRoZSBtdWx0aXBsaWNhdGlvbnMKLSAqIG9ubHkgdGhlIGhpZ2hlciBkaWdpdHMgd2VyZSBuZWVkZWQuICBUaGlzIGVzc2VudGlhbGx5IGhhbHZlcyB0aGUgd29yay4KLSAqCi0gKiBCYXNlZCBvbiBBbGdvcml0aG0gMTQuMTIgb24gcHAuNTk1IG9mIEhBQy4KLSAqLwotaW50Ci1mYXN0X3NfbXBfbXVsX2hpZ2hfZGlncyAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYywgaW50IGRpZ3MpCi17Ci0gIGludCAgICAgb2xkdXNlZCwgbmV3dXNlZCwgcmVzLCBwYSwgcGIsIGl4OwotICBtcF93b3JkIFdbTVBfV0FSUkFZXTsKLQotICAvKiBjYWxjdWxhdGUgc2l6ZSBvZiBwcm9kdWN0IGFuZCBhbGxvY2F0ZSBtb3JlIHNwYWNlIGlmIHJlcXVpcmVkICovCi0gIG5ld3VzZWQgPSBhLT51c2VkICsgYi0+dXNlZCArIDE7Ci0gIGlmIChjLT5hbGxvYyA8IG5ld3VzZWQpIHsKLSAgICBpZiAoKHJlcyA9IG1wX2dyb3cgKGMsIG5ld3VzZWQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgfQotCi0gIC8qIGxpa2UgdGhlIG90aGVyIGNvbWJhIG1ldGhvZCB3ZSBjb21wdXRlIHRoZSBjb2x1bW5zIGZpcnN0ICovCi0gIHBhID0gYS0+dXNlZDsKLSAgcGIgPSBiLT51c2VkOwotICBtZW1zZXQgKFcgKyBkaWdzLCAwLCAocGEgKyBwYiArIDEgLSBkaWdzKSAqIHNpemVvZiAobXBfd29yZCkpOwotICBmb3IgKGl4ID0gMDsgaXggPCBwYTsgaXgrKykgewotICAgIHsKLSAgICAgIHJlZ2lzdGVyIG1wX2RpZ2l0IHRtcHgsICp0bXB5OwotICAgICAgcmVnaXN0ZXIgaW50IGl5OwotICAgICAgcmVnaXN0ZXIgbXBfd29yZCAqX1c7Ci0KLSAgICAgIC8qIHdvcmsgdG9kbywgdGhhdCBpcyB3ZSBvbmx5IGNhbGN1bGF0ZSBkaWdpdHMgdGhhdCBhcmUgYXQgImRpZ3MiIG9yIGFib3ZlICAqLwotICAgICAgaXkgPSBkaWdzIC0gaXg7Ci0KLSAgICAgIC8qIGNvcHkgb2Ygd29yZCBvbiB0aGUgbGVmdCBvZiBBW2l4XSAqIEJbaXldICovCi0gICAgICB0bXB4ID0gYS0+ZHBbaXhdOwotCi0gICAgICAvKiBhbGlhcyBmb3IgcmlnaHQgc2lkZSAqLwotICAgICAgdG1weSA9IGItPmRwICsgaXk7Ci0gICAgIAotICAgICAgLyogYWxpYXMgZm9yIHRoZSBjb2x1bW5zIG9mIG91dHB1dC4gIE9mZnNldCB0byBiZSBlcXVhbCB0byBvciBhYm92ZSB0aGUgCi0gICAgICAgKiBzbWFsbGVzdCBkaWdpdCBwbGFjZSByZXF1ZXN0ZWQgCi0gICAgICAgKi8KLSAgICAgIF9XID0gVyArIGRpZ3M7ICAgICAKLSAgICAgIAotICAgICAgLyogc2tpcCBjYXNlcyBiZWxvdyB6ZXJvIHdoZXJlIGl4ID4gZGlncyAqLwotICAgICAgaWYgKGl5IDwgMCkgewotICAgICAgICAgaXkgICAgPSBhYnMoaXkpOwotICAgICAgICAgdG1weSArPSBpeTsKLSAgICAgICAgIF9XICAgKz0gaXk7Ci0gICAgICAgICBpeSAgICA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvbXB1dGUgY29sdW1uIHByb2R1Y3RzIGZvciBkaWdpdHMgYWJvdmUgdGhlIG1pbmltdW0gKi8KLSAgICAgIGZvciAoOyBpeSA8IHBiOyBpeSsrKSB7Ci0gICAgICAgICAqX1crKyArPSAoKG1wX3dvcmQpIHRtcHgpICogKChtcF93b3JkKSp0bXB5KyspOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIHNldHVwIGRlc3QgKi8KLSAgb2xkdXNlZCA9IGMtPnVzZWQ7Ci0gIGMtPnVzZWQgPSBuZXd1c2VkOwotCi0gIC8qIG5vdyBjb252ZXJ0IHRoZSBhcnJheSBXIGRvd250byB3aGF0IHdlIG5lZWQKLSAgICoKLSAgICogU2VlIGNvbW1lbnRzIGluIGJuX2Zhc3Rfc19tcF9tdWxfZGlncy5jCi0gICAqLwotICBmb3IgKGl4ID0gZGlncyArIDE7IGl4IDwgbmV3dXNlZDsgaXgrKykgewotICAgIFdbaXhdICs9IChXW2l4IC0gMV0gPj4gKChtcF93b3JkKSBESUdJVF9CSVQpKTsKLSAgICBjLT5kcFtpeCAtIDFdID0gKG1wX2RpZ2l0KSAoV1tpeCAtIDFdICYgKChtcF93b3JkKSBNUF9NQVNLKSk7Ci0gIH0KLSAgYy0+ZHBbbmV3dXNlZCAtIDFdID0gKG1wX2RpZ2l0KSAoV1tuZXd1c2VkIC0gMV0gJiAoKG1wX3dvcmQpIE1QX01BU0spKTsKLQotICBmb3IgKDsgaXggPCBvbGR1c2VkOyBpeCsrKSB7Ci0gICAgYy0+ZHBbaXhdID0gMDsKLSAgfQotICBtcF9jbGFtcCAoYyk7Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX2Zhc3Rfc19tcF9tdWxfaGlnaF9kaWdzLmMgKi8KLQotLyogU3RhcnQ6IGJuX2Zhc3Rfc19tcF9zcXIuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogZmFzdCBzcXVhcmluZwotICoKLSAqIFRoaXMgaXMgdGhlIGNvbWJhIG1ldGhvZCB3aGVyZSB0aGUgY29sdW1ucyBvZiB0aGUgcHJvZHVjdAotICogYXJlIGNvbXB1dGVkIGZpcnN0IHRoZW4gdGhlIGNhcnJpZXMgYXJlIGNvbXB1dGVkLiAgVGhpcwotICogaGFzIHRoZSBlZmZlY3Qgb2YgbWFraW5nIGEgdmVyeSBzaW1wbGUgaW5uZXIgbG9vcCB0aGF0Ci0gKiBpcyBleGVjdXRlZCB0aGUgbW9zdAotICoKLSAqIFcyIHJlcHJlc2VudHMgdGhlIG91dGVyIHByb2R1Y3RzIGFuZCBXIHRoZSBpbm5lci4KLSAqCi0gKiBBIGZ1cnRoZXIgb3B0aW1pemF0aW9ucyBpcyBtYWRlIGJlY2F1c2UgdGhlIGlubmVyCi0gKiBwcm9kdWN0cyBhcmUgb2YgdGhlIGZvcm0gIkEgKiBCICogMiIuICBUaGUgKjIgcGFydCBkb2VzCi0gKiBub3QgbmVlZCB0byBiZSBjb21wdXRlZCB1bnRpbCB0aGUgZW5kIHdoaWNoIGlzIGdvb2QKLSAqIGJlY2F1c2UgNjQtYml0IHNoaWZ0cyBhcmUgc2xvdyEKLSAqCi0gKiBCYXNlZCBvbiBBbGdvcml0aG0gMTQuMTYgb24gcHAuNTk3IG9mIEhBQy4KLSAqCi0gKi8KLWludCBmYXN0X3NfbXBfc3FyIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiKQotewotICBpbnQgICAgIG9sZHVzZSwgbmV3dXNlZCwgcmVzLCBpeCwgcGE7Ci0gIG1wX3dvcmQgVzJbTVBfV0FSUkFZXSwgV1tNUF9XQVJSQVldOwotCi0gIC8qIGNhbGN1bGF0ZSBzaXplIG9mIHByb2R1Y3QgYW5kIGFsbG9jYXRlIGFzIHJlcXVpcmVkICovCi0gIHBhID0gYS0+dXNlZDsKLSAgbmV3dXNlZCA9IHBhICsgcGEgKyAxOwotICBpZiAoYi0+YWxsb2MgPCBuZXd1c2VkKSB7Ci0gICAgaWYgKChyZXMgPSBtcF9ncm93IChiLCBuZXd1c2VkKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gIH0KLQotICAvKiB6ZXJvIHRlbXAgYnVmZmVyIChjb2x1bW5zKQotICAgKiBOb3RlIHRoYXQgdGhlcmUgYXJlIHR3byBidWZmZXJzLiAgU2luY2Ugc3F1YXJpbmcgcmVxdWlyZXMKLSAgICogYSBvdXRlciBhbmQgaW5uZXIgcHJvZHVjdCBhbmQgdGhlIGlubmVyIHByb2R1Y3QgcmVxdWlyZXMKLSAgICogY29tcHV0aW5nIGEgcHJvZHVjdCBhbmQgZG91YmxpbmcgaXQgKGEgcmVsYXRpdmVseSBleHBlbnNpdmUKLSAgICogb3AgdG8gcGVyZm9ybSBuKioyIHRpbWVzIGlmIHlvdSBkb24ndCBoYXZlIHRvKSB0aGUgaW5uZXIgYW5kCi0gICAqIG91dGVyIHByb2R1Y3RzIGFyZSBjb21wdXRlZCBpbiBkaWZmZXJlbnQgYnVmZmVycy4gIFRoaXMgd2F5Ci0gICAqIHRoZSBpbm5lciBwcm9kdWN0IGNhbiBiZSBkb3VibGVkIHVzaW5nIG4gZG91YmxpbmdzIGluc3RlYWQgb2YKLSAgICogbioqMgotICAgKi8KLSAgbWVtc2V0IChXLCAgMCwgbmV3dXNlZCAqIHNpemVvZiAobXBfd29yZCkpOwotICBtZW1zZXQgKFcyLCAwLCBuZXd1c2VkICogc2l6ZW9mIChtcF93b3JkKSk7Ci0KLSAgLyogVGhpcyBjb21wdXRlcyB0aGUgaW5uZXIgcHJvZHVjdC4gIFRvIHNpbXBsaWZ5IHRoZSBpbm5lciBOKioyIGxvb3AKLSAgICogdGhlIG11bHRpcGxpY2F0aW9uIGJ5IHR3byBpcyBkb25lIGFmdGVyd2FyZHMgaW4gdGhlIE4gbG9vcC4KLSAgICovCi0gIGZvciAoaXggPSAwOyBpeCA8IHBhOyBpeCsrKSB7Ci0gICAgLyogY29tcHV0ZSB0aGUgb3V0ZXIgcHJvZHVjdAotICAgICAqCi0gICAgICogTm90ZSB0aGF0IGV2ZXJ5IG91dGVyIHByb2R1Y3QgaXMgY29tcHV0ZWQKLSAgICAgKiBmb3IgYSBwYXJ0aWN1bGFyIGNvbHVtbiBvbmx5IG9uY2Ugd2hpY2ggbWVhbnMgdGhhdAotICAgICAqIHRoZXJlIGlzIG5vIG5lZWQgdG9kbyBhIGRvdWJsZSBwcmVjaXNpb24gYWRkaXRpb24KLSAgICAgKiBpbnRvIHRoZSBXMltdIGFycmF5LgotICAgICAqLwotICAgIFcyW2l4ICsgaXhdID0gKChtcF93b3JkKWEtPmRwW2l4XSkgKiAoKG1wX3dvcmQpYS0+ZHBbaXhdKTsKLQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIG1wX2RpZ2l0IHRtcHgsICp0bXB5OwotICAgICAgcmVnaXN0ZXIgbXBfd29yZCAqX1c7Ci0gICAgICByZWdpc3RlciBpbnQgaXk7Ci0KLSAgICAgIC8qIGNvcHkgb2YgbGVmdCBzaWRlICovCi0gICAgICB0bXB4ID0gYS0+ZHBbaXhdOwotCi0gICAgICAvKiBhbGlhcyBmb3IgcmlnaHQgc2lkZSAqLwotICAgICAgdG1weSA9IGEtPmRwICsgKGl4ICsgMSk7Ci0KLSAgICAgIC8qIHRoZSBjb2x1bW4gdG8gc3RvcmUgdGhlIHJlc3VsdCBpbiAqLwotICAgICAgX1cgPSBXICsgKGl4ICsgaXggKyAxKTsKLQotICAgICAgLyogaW5uZXIgcHJvZHVjdHMgKi8KLSAgICAgIGZvciAoaXkgPSBpeCArIDE7IGl5IDwgcGE7IGl5KyspIHsKLSAgICAgICAgICAqX1crKyArPSAoKG1wX3dvcmQpdG1weCkgKiAoKG1wX3dvcmQpKnRtcHkrKyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogc2V0dXAgZGVzdCAqLwotICBvbGR1c2UgID0gYi0+dXNlZDsKLSAgYi0+dXNlZCA9IG5ld3VzZWQ7Ci0KLSAgLyogbm93IGNvbXB1dGUgZGlnaXRzCi0gICAqCi0gICAqIFdlIGhhdmUgdG8gZG91YmxlIHRoZSBpbm5lciBwcm9kdWN0IHN1bXMsIGFkZCBpbiB0aGUKLSAgICogb3V0ZXIgcHJvZHVjdCBzdW1zLCBwcm9wYWdhdGUgY2FycmllcyBhbmQgY29udmVydAotICAgKiB0byBzaW5nbGUgcHJlY2lzaW9uLgotICAgKi8KLSAgewotICAgIHJlZ2lzdGVyIG1wX2RpZ2l0ICp0bXBiOwotCi0gICAgLyogZG91YmxlIGZpcnN0IHZhbHVlLCBzaW5jZSB0aGUgaW5uZXIgcHJvZHVjdHMgYXJlCi0gICAgICogaGFsZiBvZiB3aGF0IHRoZXkgc2hvdWxkIGJlCi0gICAgICovCi0gICAgV1swXSArPSBXWzBdICsgVzJbMF07Ci0KLSAgICB0bXBiID0gYi0+ZHA7Ci0gICAgZm9yIChpeCA9IDE7IGl4IDwgbmV3dXNlZDsgaXgrKykgewotICAgICAgLyogZG91YmxlL2FkZCBuZXh0IGRpZ2l0ICovCi0gICAgICBXW2l4XSArPSBXW2l4XSArIFcyW2l4XTsKLQotICAgICAgLyogcHJvcGFnYXRlIGNhcnJ5IGZvcndhcmRzIFtmcm9tIHRoZSBwcmV2aW91cyBkaWdpdF0gKi8KLSAgICAgIFdbaXhdID0gV1tpeF0gKyAoV1tpeCAtIDFdID4+ICgobXBfd29yZCkgRElHSVRfQklUKSk7Ci0KLSAgICAgIC8qIHN0b3JlIHRoZSBjdXJyZW50IGRpZ2l0IG5vdyB0aGF0IHRoZSBjYXJyeSBpc24ndAotICAgICAgICogbmVlZGVkCi0gICAgICAgKi8KLSAgICAgICp0bXBiKysgPSAobXBfZGlnaXQpIChXW2l4IC0gMV0gJiAoKG1wX3dvcmQpIE1QX01BU0spKTsKLSAgICB9Ci0gICAgLyogc2V0IHRoZSBsYXN0IHZhbHVlLiAgTm90ZSBldmVuIGlmIHRoZSBjYXJyeSBpcyB6ZXJvCi0gICAgICogdGhpcyBpcyByZXF1aXJlZCBzaW5jZSB0aGUgbmV4dCBzdGVwIHdpbGwgbm90IHplcm8KLSAgICAgKiBpdCBpZiBiIG9yaWdpbmFsbHkgaGFkIGEgdmFsdWUgYXQgYi0+ZHBbMiphLnVzZWRdCi0gICAgICovCi0gICAgKnRtcGIrKyA9IChtcF9kaWdpdCkgKFdbKG5ld3VzZWQpIC0gMV0gJiAoKG1wX3dvcmQpIE1QX01BU0spKTsKLQotICAgIC8qIGNsZWFyIGhpZ2ggZGlnaXRzIG9mIGIgaWYgdGhlcmUgd2VyZSBhbnkgb3JpZ2luYWxseSAqLwotICAgIGZvciAoOyBpeCA8IG9sZHVzZTsgaXgrKykgewotICAgICAgKnRtcGIrKyA9IDA7Ci0gICAgfQotICB9Ci0KLSAgbXBfY2xhbXAgKGIpOwotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9mYXN0X3NfbXBfc3FyLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wXzJleHB0LmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGNvbXB1dGVzIGEgPSAyKipiIAotICoKLSAqIFNpbXBsZSBhbGdvcml0aG0gd2hpY2ggemVyb2VzIHRoZSBpbnQsIGdyb3dzIGl0IHRoZW4ganVzdCBzZXRzIG9uZSBiaXQKLSAqIGFzIHJlcXVpcmVkLgotICovCi1pbnQKLW1wXzJleHB0IChtcF9pbnQgKiBhLCBpbnQgYikKLXsKLSAgaW50ICAgICByZXM7Ci0KLSAgLyogemVybyBhIGFzIHBlciBkZWZhdWx0ICovCi0gIG1wX3plcm8gKGEpOwotCi0gIC8qIGdyb3cgYSB0byBhY2NvbW9kYXRlIHRoZSBzaW5nbGUgYml0ICovCi0gIGlmICgocmVzID0gbXBfZ3JvdyAoYSwgYiAvIERJR0lUX0JJVCArIDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qIHNldCB0aGUgdXNlZCBjb3VudCBvZiB3aGVyZSB0aGUgYml0IHdpbGwgZ28gKi8KLSAgYS0+dXNlZCA9IGIgLyBESUdJVF9CSVQgKyAxOwotCi0gIC8qIHB1dCB0aGUgc2luZ2xlIGJpdCBpbiBpdHMgcGxhY2UgKi8KLSAgYS0+ZHBbYiAvIERJR0lUX0JJVF0gPSAxIDw8IChiICUgRElHSVRfQklUKTsKLQotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9tcF8yZXhwdC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9hYnMuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogYiA9IHxhfCAKLSAqCi0gKiBTaW1wbGUgZnVuY3Rpb24gY29waWVzIHRoZSBpbnB1dCBhbmQgZml4ZXMgdGhlIHNpZ24gdG8gcG9zaXRpdmUKLSAqLwotaW50Ci1tcF9hYnMgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIpCi17Ci0gIGludCAgICAgcmVzOwotCi0gIC8qIGNvcHkgYSB0byBiICovCi0gIGlmIChhICE9IGIpIHsKLSAgICAgaWYgKChyZXMgPSBtcF9jb3B5IChhLCBiKSkgIT0gTVBfT0tBWSkgewotICAgICAgIHJldHVybiByZXM7Ci0gICAgIH0KLSAgfQotCi0gIC8qIGZvcmNlIHRoZSBzaWduIG9mIGIgdG8gcG9zaXRpdmUgKi8KLSAgYi0+c2lnbiA9IE1QX1pQT1M7Ci0KLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfYWJzLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2FkZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBoaWdoIGxldmVsIGFkZGl0aW9uIChoYW5kbGVzIHNpZ25zKSAqLwotaW50IG1wX2FkZCAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYykKLXsKLSAgaW50ICAgICBzYSwgc2IsIHJlczsKLQotICAvKiBnZXQgc2lnbiBvZiBib3RoIGlucHV0cyAqLwotICBzYSA9IGEtPnNpZ247Ci0gIHNiID0gYi0+c2lnbjsKLQotICAvKiBoYW5kbGUgdHdvIGNhc2VzLCBub3QgZm91ciAqLwotICBpZiAoc2EgPT0gc2IpIHsKLSAgICAvKiBib3RoIHBvc2l0aXZlIG9yIGJvdGggbmVnYXRpdmUgKi8KLSAgICAvKiBhZGQgdGhlaXIgbWFnbml0dWRlcywgY29weSB0aGUgc2lnbiAqLwotICAgIGMtPnNpZ24gPSBzYTsKLSAgICByZXMgPSBzX21wX2FkZCAoYSwgYiwgYyk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogb25lIHBvc2l0aXZlLCB0aGUgb3RoZXIgbmVnYXRpdmUgKi8KLSAgICAvKiBzdWJ0cmFjdCB0aGUgb25lIHdpdGggdGhlIGdyZWF0ZXIgbWFnbml0dWRlIGZyb20gKi8KLSAgICAvKiB0aGUgb25lIG9mIHRoZSBsZXNzZXIgbWFnbml0dWRlLiAgVGhlIHJlc3VsdCBnZXRzICovCi0gICAgLyogdGhlIHNpZ24gb2YgdGhlIG9uZSB3aXRoIHRoZSBncmVhdGVyIG1hZ25pdHVkZS4gKi8KLSAgICBpZiAobXBfY21wX21hZyAoYSwgYikgPT0gTVBfTFQpIHsKLSAgICAgIGMtPnNpZ24gPSBzYjsKLSAgICAgIHJlcyA9IHNfbXBfc3ViIChiLCBhLCBjKTsKLSAgICB9IGVsc2UgewotICAgICAgYy0+c2lnbiA9IHNhOwotICAgICAgcmVzID0gc19tcF9zdWIgKGEsIGIsIGMpOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzOwotfQotCi0KLS8qIEVuZDogYm5fbXBfYWRkLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2FkZF9kLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHNpbmdsZSBkaWdpdCBhZGRpdGlvbiAqLwotaW50Ci1tcF9hZGRfZCAobXBfaW50ICogYSwgbXBfZGlnaXQgYiwgbXBfaW50ICogYykKLXsKLSAgaW50ICAgICByZXMsIGl4LCBvbGR1c2VkOwotICBtcF9kaWdpdCAqdG1wYSwgKnRtcGMsIG11OwotCi0gIC8qIGdyb3cgYyBhcyByZXF1aXJlZCAqLwotICBpZiAoYy0+YWxsb2MgPCBhLT51c2VkICsgMSkgewotICAgICBpZiAoKHJlcyA9IG1wX2dyb3coYywgYS0+dXNlZCArIDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgIH0KLSAgfQotCi0gIC8qIGlmIGEgaXMgbmVnYXRpdmUgYW5kIHxhfCA+PSBiLCBjYWxsIGMgPSB8YXwgLSBiICovCi0gIGlmIChhLT5zaWduID09IE1QX05FRyAmJiAoYS0+dXNlZCA+IDEgfHwgYS0+ZHBbMF0gPj0gYikpIHsKLSAgICAgLyogdGVtcG9yYXJpbHkgZml4IHNpZ24gb2YgYSAqLwotICAgICBhLT5zaWduID0gTVBfWlBPUzsKLQotICAgICAvKiBjID0gfGF8IC0gYiAqLwotICAgICByZXMgPSBtcF9zdWJfZChhLCBiLCBjKTsKLQotICAgICAvKiBmaXggc2lnbiAgKi8KLSAgICAgYS0+c2lnbiA9IGMtPnNpZ24gPSBNUF9ORUc7Ci0KLSAgICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qIG9sZCBudW1iZXIgb2YgdXNlZCBkaWdpdHMgaW4gYyAqLwotICBvbGR1c2VkID0gYy0+dXNlZDsKLQotICAvKiBzaWduIGFsd2F5cyBwb3NpdGl2ZSAqLwotICBjLT5zaWduID0gTVBfWlBPUzsKLQotICAvKiBzb3VyY2UgYWxpYXMgKi8KLSAgdG1wYSAgICA9IGEtPmRwOwotCi0gIC8qIGRlc3RpbmF0aW9uIGFsaWFzICovCi0gIHRtcGMgICAgPSBjLT5kcDsKLQotICAvKiBpZiBhIGlzIHBvc2l0aXZlICovCi0gIGlmIChhLT5zaWduID09IE1QX1pQT1MpIHsKLSAgICAgLyogYWRkIGRpZ2l0LCBhZnRlciB0aGlzIHdlJ3JlIHByb3BhZ2F0aW5nCi0gICAgICAqIHRoZSBjYXJyeS4KLSAgICAgICovCi0gICAgICp0bXBjICAgPSAqdG1wYSsrICsgYjsKLSAgICAgbXUgICAgICA9ICp0bXBjID4+IERJR0lUX0JJVDsKLSAgICAgKnRtcGMrKyAmPSBNUF9NQVNLOwotCi0gICAgIC8qIG5vdyBoYW5kbGUgcmVzdCBvZiB0aGUgZGlnaXRzICovCi0gICAgIGZvciAoaXggPSAxOyBpeCA8IGEtPnVzZWQ7IGl4KyspIHsKLSAgICAgICAgKnRtcGMgICA9ICp0bXBhKysgKyBtdTsKLSAgICAgICAgbXUgICAgICA9ICp0bXBjID4+IERJR0lUX0JJVDsKLSAgICAgICAgKnRtcGMrKyAmPSBNUF9NQVNLOwotICAgICB9Ci0gICAgIC8qIHNldCBmaW5hbCBjYXJyeSAqLwotICAgICBpeCsrOwotICAgICAqdG1wYysrICA9IG11OwotCi0gICAgIC8qIHNldHVwIHNpemUgKi8KLSAgICAgYy0+dXNlZCA9IGEtPnVzZWQgKyAxOwotICB9IGVsc2UgewotICAgICAvKiBhIHdhcyBuZWdhdGl2ZSBhbmQgfGF8IDwgYiAqLwotICAgICBjLT51c2VkICA9IDE7Ci0KLSAgICAgLyogdGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBkaWdpdCAqLwotICAgICBpZiAoYS0+dXNlZCA9PSAxKSB7Ci0gICAgICAgICp0bXBjKysgID0gIGIgLSBhLT5kcFswXTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgKnRtcGMrKyAgPSAgYjsKLSAgICAgfQotCi0gICAgIC8qIHNldHVwIGNvdW50IHNvIHRoZSBjbGVhcmluZyBvZiBvbGR1c2VkCi0gICAgICAqIGNhbiBmYWxsIHRocm91Z2ggY29ycmVjdGx5Ci0gICAgICAqLwotICAgICBpeCAgICAgICA9IDE7Ci0gIH0KLQotICAvKiBub3cgemVybyB0byBvbGR1c2VkICovCi0gIHdoaWxlIChpeCsrIDwgb2xkdXNlZCkgewotICAgICAqdG1wYysrID0gMDsKLSAgfQotICBtcF9jbGFtcChjKTsKLQotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotCi0vKiBFbmQ6IGJuX21wX2FkZF9kLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2FkZG1vZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBkID0gYSArIGIgKG1vZCBjKSAqLwotaW50Ci1tcF9hZGRtb2QgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMsIG1wX2ludCAqIGQpCi17Ci0gIGludCAgICAgcmVzOwotICBtcF9pbnQgIHQ7Ci0KLSAgaWYgKChyZXMgPSBtcF9pbml0ICgmdCkpICE9IE1QX09LQVkpIHsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgaWYgKChyZXMgPSBtcF9hZGQgKGEsIGIsICZ0KSkgIT0gTVBfT0tBWSkgewotICAgIG1wX2NsZWFyICgmdCk7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotICByZXMgPSBtcF9tb2QgKCZ0LCBjLCBkKTsKLSAgbXBfY2xlYXIgKCZ0KTsKLSAgcmV0dXJuIHJlczsKLX0KLQotLyogRW5kOiBibl9tcF9hZGRtb2QuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfYW5kLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIEFORCB0d28gaW50cyB0b2dldGhlciAqLwotaW50Ci1tcF9hbmQgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMpCi17Ci0gIGludCAgICAgcmVzLCBpeCwgcHg7Ci0gIG1wX2ludCAgdCwgKng7Ci0KLSAgaWYgKGEtPnVzZWQgPiBiLT51c2VkKSB7Ci0gICAgaWYgKChyZXMgPSBtcF9pbml0X2NvcHkgKCZ0LCBhKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcHggPSBiLT51c2VkOwotICAgIHggPSBiOwotICB9IGVsc2UgewotICAgIGlmICgocmVzID0gbXBfaW5pdF9jb3B5ICgmdCwgYikpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIHB4ID0gYS0+dXNlZDsKLSAgICB4ID0gYTsKLSAgfQotCi0gIGZvciAoaXggPSAwOyBpeCA8IHB4OyBpeCsrKSB7Ci0gICAgdC5kcFtpeF0gJj0geC0+ZHBbaXhdOwotICB9Ci0KLSAgLyogemVybyBkaWdpdHMgYWJvdmUgdGhlIGxhc3QgZnJvbSB0aGUgc21hbGxlc3QgbXBfaW50ICovCi0gIGZvciAoOyBpeCA8IHQudXNlZDsgaXgrKykgewotICAgIHQuZHBbaXhdID0gMDsKLSAgfQotCi0gIG1wX2NsYW1wICgmdCk7Ci0gIG1wX2V4Y2ggKGMsICZ0KTsKLSAgbXBfY2xlYXIgKCZ0KTsKLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfYW5kLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2NsYW1wLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHRyaW0gdW51c2VkIGRpZ2l0cyAKLSAqCi0gKiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgbGVhZGluZyB6ZXJvIGRpZ2l0cyBhcmUKLSAqIHRyaW1lZCBhbmQgdGhlIGxlYWRpbmcgInVzZWQiIGRpZ2l0IHdpbGwgYmUgbm9uLXplcm8KLSAqIFR5cGljYWxseSB2ZXJ5IGZhc3QuICBBbHNvIGZpeGVzIHRoZSBzaWduIGlmIHRoZXJlCi0gKiBhcmUgbm8gbW9yZSBsZWFkaW5nIGRpZ2l0cwotICovCi12b2lkCi1tcF9jbGFtcCAobXBfaW50ICogYSkKLXsKLSAgLyogZGVjcmVhc2UgdXNlZCB3aGlsZSB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdCBpcwotICAgKiB6ZXJvLgotICAgKi8KLSAgd2hpbGUgKGEtPnVzZWQgPiAwICYmIGEtPmRwW2EtPnVzZWQgLSAxXSA9PSAwKSB7Ci0gICAgLS0oYS0+dXNlZCk7Ci0gIH0KLQotICAvKiByZXNldCB0aGUgc2lnbiBmbGFnIGlmIHVzZWQgPT0gMCAqLwotICBpZiAoYS0+dXNlZCA9PSAwKSB7Ci0gICAgYS0+c2lnbiA9IE1QX1pQT1M7Ci0gIH0KLX0KLQotLyogRW5kOiBibl9tcF9jbGFtcC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9jbGVhci5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBjbGVhciBvbmUgKGZyZWVzKSAgKi8KLXZvaWQKLW1wX2NsZWFyIChtcF9pbnQgKiBhKQotewotICAvKiBvbmx5IGRvIGFueXRoaW5nIGlmIGEgaGFzbid0IGJlZW4gZnJlZWQgcHJldmlvdXNseSAqLwotICBpZiAoYS0+ZHAgIT0gTlVMTCkgewotICAgIC8qIGZpcnN0IHplcm8gdGhlIGRpZ2l0cyAqLwotICAgIG1lbXNldCAoYS0+ZHAsIDAsIHNpemVvZiAobXBfZGlnaXQpICogYS0+dXNlZCk7Ci0KLSAgICAvKiBmcmVlIHJhbSAqLwotICAgIFhGUkVFKGEtPmRwKTsKLQotICAgIC8qIHJlc2V0IG1lbWJlcnMgdG8gbWFrZSBkZWJ1Z2dpbmcgZWFzaWVyICovCi0gICAgYS0+ZHAgICAgPSBOVUxMOwotICAgIGEtPmFsbG9jID0gYS0+dXNlZCA9IDA7Ci0gICAgYS0+c2lnbiAgPSBNUF9aUE9TOwotICB9Ci19Ci0KLS8qIEVuZDogYm5fbXBfY2xlYXIuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfY2xlYXJfbXVsdGkuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotdm9pZCBtcF9jbGVhcl9tdWx0aShtcF9pbnQgKm1wLCAuLi4pIAotewotICAgIG1wX2ludCogbmV4dF9tcCA9IG1wOwotICAgIHZhX2xpc3QgYXJnczsKLSAgICB2YV9zdGFydChhcmdzLCBtcCk7Ci0gICAgd2hpbGUgKG5leHRfbXAgIT0gTlVMTCkgewotICAgICAgICBtcF9jbGVhcihuZXh0X21wKTsKLSAgICAgICAgbmV4dF9tcCA9IHZhX2FyZyhhcmdzLCBtcF9pbnQqKTsKLSAgICB9Ci0gICAgdmFfZW5kKGFyZ3MpOwotfQotCi0vKiBFbmQ6IGJuX21wX2NsZWFyX211bHRpLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2NtcC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBjb21wYXJlIHR3byBpbnRzIChzaWduZWQpKi8KLWludAotbXBfY21wIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiKQotewotICAvKiBjb21wYXJlIGJhc2VkIG9uIHNpZ24gKi8KLSAgaWYgKGEtPnNpZ24gIT0gYi0+c2lnbikgewotICAgICBpZiAoYS0+c2lnbiA9PSBNUF9ORUcpIHsKLSAgICAgICAgcmV0dXJuIE1QX0xUOwotICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTVBfR1Q7Ci0gICAgIH0KLSAgfQotICAKLSAgLyogY29tcGFyZSBkaWdpdHMgKi8KLSAgaWYgKGEtPnNpZ24gPT0gTVBfTkVHKSB7Ci0gICAgIC8qIGlmIG5lZ2F0aXZlIGNvbXBhcmUgb3Bwb3NpdGUgZGlyZWN0aW9uICovCi0gICAgIHJldHVybiBtcF9jbXBfbWFnKGIsIGEpOwotICB9IGVsc2UgewotICAgICByZXR1cm4gbXBfY21wX21hZyhhLCBiKTsKLSAgfQotfQotCi0vKiBFbmQ6IGJuX21wX2NtcC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9jbXBfZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBjb21wYXJlIGEgZGlnaXQgKi8KLWludCBtcF9jbXBfZChtcF9pbnQgKiBhLCBtcF9kaWdpdCBiKQotewotICAvKiBjb21wYXJlIGJhc2VkIG9uIHNpZ24gKi8KLSAgaWYgKGEtPnNpZ24gPT0gTVBfTkVHKSB7Ci0gICAgcmV0dXJuIE1QX0xUOwotICB9Ci0KLSAgLyogY29tcGFyZSBiYXNlZCBvbiBtYWduaXR1ZGUgKi8KLSAgaWYgKGEtPnVzZWQgPiAxKSB7Ci0gICAgcmV0dXJuIE1QX0dUOwotICB9Ci0KLSAgLyogY29tcGFyZSB0aGUgb25seSBkaWdpdCBvZiBhIHRvIGIgKi8KLSAgaWYgKGEtPmRwWzBdID4gYikgewotICAgIHJldHVybiBNUF9HVDsKLSAgfSBlbHNlIGlmIChhLT5kcFswXSA8IGIpIHsKLSAgICByZXR1cm4gTVBfTFQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE1QX0VROwotICB9Ci19Ci0KLS8qIEVuZDogYm5fbXBfY21wX2QuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfY21wX21hZy5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBjb21wYXJlIG1hZ2luaXR1ZGUgb2YgdHdvIGludHMgKHVuc2lnbmVkKSAqLwotaW50IG1wX2NtcF9tYWcgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIpCi17Ci0gIGludCAgICAgbjsKLSAgbXBfZGlnaXQgKnRtcGEsICp0bXBiOwotCi0gIC8qIGNvbXBhcmUgYmFzZWQgb24gIyBvZiBub24temVybyBkaWdpdHMgKi8KLSAgaWYgKGEtPnVzZWQgPiBiLT51c2VkKSB7Ci0gICAgcmV0dXJuIE1QX0dUOwotICB9Ci0gIAotICBpZiAoYS0+dXNlZCA8IGItPnVzZWQpIHsKLSAgICByZXR1cm4gTVBfTFQ7Ci0gIH0KLQotICAvKiBhbGlhcyBmb3IgYSAqLwotICB0bXBhID0gYS0+ZHAgKyAoYS0+dXNlZCAtIDEpOwotCi0gIC8qIGFsaWFzIGZvciBiICovCi0gIHRtcGIgPSBiLT5kcCArIChhLT51c2VkIC0gMSk7Ci0KLSAgLyogY29tcGFyZSBiYXNlZCBvbiBkaWdpdHMgICovCi0gIGZvciAobiA9IDA7IG4gPCBhLT51c2VkOyArK24sIC0tdG1wYSwgLS10bXBiKSB7Ci0gICAgaWYgKCp0bXBhID4gKnRtcGIpIHsKLSAgICAgIHJldHVybiBNUF9HVDsKLSAgICB9Ci0KLSAgICBpZiAoKnRtcGEgPCAqdG1wYikgewotICAgICAgcmV0dXJuIE1QX0xUOwotICAgIH0KLSAgfQotICByZXR1cm4gTVBfRVE7Ci19Ci0KLS8qIEVuZDogYm5fbXBfY21wX21hZy5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9jbnRfbHNiLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLXN0YXRpYyBjb25zdCBpbnQgbG56WzE2XSA9IHsgCi0gICA0LCAwLCAxLCAwLCAyLCAwLCAxLCAwLCAzLCAwLCAxLCAwLCAyLCAwLCAxLCAwCi19OwotCi0vKiBDb3VudHMgdGhlIG51bWJlciBvZiBsc2JzIHdoaWNoIGFyZSB6ZXJvIGJlZm9yZSB0aGUgZmlyc3QgemVybyBiaXQgKi8KLWludCBtcF9jbnRfbHNiKG1wX2ludCAqYSkKLXsKLSAgIGludCB4OwotICAgbXBfZGlnaXQgcSwgcXE7Ci0KLSAgIC8qIGVhc3kgb3V0ICovCi0gICBpZiAobXBfaXN6ZXJvKGEpID09IDEpIHsKLSAgICAgIHJldHVybiAwOwotICAgfQotCi0gICAvKiBzY2FuIGxvd2VyIGRpZ2l0cyB1bnRpbCBub24temVybyAqLwotICAgZm9yICh4ID0gMDsgeCA8IGEtPnVzZWQgJiYgYS0+ZHBbeF0gPT0gMDsgeCsrKTsKLSAgIHEgPSBhLT5kcFt4XTsKLSAgIHggKj0gRElHSVRfQklUOwotCi0gICAvKiBub3cgc2NhbiB0aGlzIGRpZ2l0IHVudGlsIGEgMSBpcyBmb3VuZCAqLwotICAgaWYgKChxICYgMSkgPT0gMCkgewotICAgICAgZG8gewotICAgICAgICAgcXEgID0gcSAmIDE1OwotICAgICAgICAgeCAgKz0gbG56W3FxXTsKLSAgICAgICAgIHEgPj49IDQ7Ci0gICAgICB9IHdoaWxlIChxcSA9PSAwKTsKLSAgIH0KLSAgIHJldHVybiB4OwotfQotCi0KLS8qIEVuZDogYm5fbXBfY250X2xzYi5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9jb3B5LmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGNvcHksIGIgPSBhICovCi1pbnQKLW1wX2NvcHkgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIpCi17Ci0gIGludCAgICAgcmVzLCBuOwotCi0gIC8qIGlmIGRzdCA9PSBzcmMgZG8gbm90aGluZyAqLwotICBpZiAoYSA9PSBiKSB7Ci0gICAgcmV0dXJuIE1QX09LQVk7Ci0gIH0KLQotICAvKiBncm93IGRlc3QgKi8KLSAgaWYgKGItPmFsbG9jIDwgYS0+dXNlZCkgewotICAgICBpZiAoKHJlcyA9IG1wX2dyb3cgKGIsIGEtPnVzZWQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgIH0KLSAgfQotCi0gIC8qIHplcm8gYiBhbmQgY29weSB0aGUgcGFyYW1ldGVycyBvdmVyICovCi0gIHsKLSAgICByZWdpc3RlciBtcF9kaWdpdCAqdG1wYSwgKnRtcGI7Ci0KLSAgICAvKiBwb2ludGVyIGFsaWFzZXMgKi8KLQotICAgIC8qIHNvdXJjZSAqLwotICAgIHRtcGEgPSBhLT5kcDsKLQotICAgIC8qIGRlc3RpbmF0aW9uICovCi0gICAgdG1wYiA9IGItPmRwOwotCi0gICAgLyogY29weSBhbGwgdGhlIGRpZ2l0cyAqLwotICAgIGZvciAobiA9IDA7IG4gPCBhLT51c2VkOyBuKyspIHsKLSAgICAgICp0bXBiKysgPSAqdG1wYSsrOwotICAgIH0KLQotICAgIC8qIGNsZWFyIGhpZ2ggZGlnaXRzICovCi0gICAgZm9yICg7IG4gPCBiLT51c2VkOyBuKyspIHsKLSAgICAgICp0bXBiKysgPSAwOwotICAgIH0KLSAgfQotCi0gIC8qIGNvcHkgdXNlZCBjb3VudCBhbmQgc2lnbiAqLwotICBiLT51c2VkID0gYS0+dXNlZDsKLSAgYi0+c2lnbiA9IGEtPnNpZ247Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX2NvcHkuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfY291bnRfYml0cy5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhbiBpbnQgKi8KLWludAotbXBfY291bnRfYml0cyAobXBfaW50ICogYSkKLXsKLSAgaW50ICAgICByOwotICBtcF9kaWdpdCBxOwotCi0gIC8qIHNob3J0Y3V0ICovCi0gIGlmIChhLT51c2VkID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIGdldCBudW1iZXIgb2YgZGlnaXRzIGFuZCBhZGQgdGhhdCAqLwotICByID0gKGEtPnVzZWQgLSAxKSAqIERJR0lUX0JJVDsKLSAgCi0gIC8qIHRha2UgdGhlIGxhc3QgZGlnaXQgYW5kIGNvdW50IHRoZSBiaXRzIGluIGl0ICovCi0gIHEgPSBhLT5kcFthLT51c2VkIC0gMV07Ci0gIHdoaWxlIChxID4gKChtcF9kaWdpdCkgMCkpIHsKLSAgICArK3I7Ci0gICAgcSA+Pj0gKChtcF9kaWdpdCkgMSk7Ci0gIH0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIEVuZDogYm5fbXBfY291bnRfYml0cy5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9kaXYuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogaW50ZWdlciBzaWduZWQgZGl2aXNpb24uIAotICogYypiICsgZCA9PSBhIFtlLmcuIGEvYiwgYz1xdW90aWVudCwgZD1yZW1haW5kZXJdCi0gKiBIQUMgcHAuNTk4IEFsZ29yaXRobSAxNC4yMAotICoKLSAqIE5vdGUgdGhhdCB0aGUgZGVzY3JpcHRpb24gaW4gSEFDIGlzIGhvcnJpYmx5IAotICogaW5jb21wbGV0ZS4gIEZvciBleGFtcGxlLCBpdCBkb2Vzbid0IGNvbnNpZGVyIAotICogdGhlIGNhc2Ugd2hlcmUgZGlnaXRzIGFyZSByZW1vdmVkIGZyb20gJ3gnIGluIAotICogdGhlIGlubmVyIGxvb3AuICBJdCBhbHNvIGRvZXNuJ3QgY29uc2lkZXIgdGhlIAotICogY2FzZSB0aGF0IHkgaGFzIGZld2VyIHRoYW4gdGhyZWUgZGlnaXRzLCBldGMuLgotICoKLSAqIFRoZSBvdmVyYWxsIGFsZ29yaXRobSBpcyBhcyBkZXNjcmliZWQgYXMgCi0gKiAxNC4yMCBmcm9tIEhBQyBidXQgZml4ZWQgdG8gdHJlYXQgdGhlc2UgY2FzZXMuCi0qLwotaW50IG1wX2RpdiAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYywgbXBfaW50ICogZCkKLXsKLSAgbXBfaW50ICBxLCB4LCB5LCB0MSwgdDI7Ci0gIGludCAgICAgcmVzLCBuLCB0LCBpLCBub3JtLCBuZWc7Ci0KLSAgLyogaXMgZGl2aXNvciB6ZXJvID8gKi8KLSAgaWYgKG1wX2lzemVybyAoYikgPT0gMSkgewotICAgIHJldHVybiBNUF9WQUw7Ci0gIH0KLQotICAvKiBpZiBhIDwgYiB0aGVuIHE9MCwgciA9IGEgKi8KLSAgaWYgKG1wX2NtcF9tYWcgKGEsIGIpID09IE1QX0xUKSB7Ci0gICAgaWYgKGQgIT0gTlVMTCkgewotICAgICAgcmVzID0gbXBfY29weSAoYSwgZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlcyA9IE1QX09LQVk7Ci0gICAgfQotICAgIGlmIChjICE9IE5VTEwpIHsKLSAgICAgIG1wX3plcm8gKGMpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgaWYgKChyZXMgPSBtcF9pbml0X3NpemUgKCZxLCBhLT51c2VkICsgMikpICE9IE1QX09LQVkpIHsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0gIHEudXNlZCA9IGEtPnVzZWQgKyAyOwotCi0gIGlmICgocmVzID0gbXBfaW5pdCAoJnQxKSkgIT0gTVBfT0tBWSkgewotICAgIGdvdG8gX19ROwotICB9Ci0KLSAgaWYgKChyZXMgPSBtcF9pbml0ICgmdDIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX1QxOwotICB9Ci0KLSAgaWYgKChyZXMgPSBtcF9pbml0X2NvcHkgKCZ4LCBhKSkgIT0gTVBfT0tBWSkgewotICAgIGdvdG8gX19UMjsKLSAgfQotCi0gIGlmICgocmVzID0gbXBfaW5pdF9jb3B5ICgmeSwgYikpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIF9fWDsKLSAgfQotCi0gIC8qIGZpeCB0aGUgc2lnbiAqLwotICBuZWcgPSAoYS0+c2lnbiA9PSBiLT5zaWduKSA/IE1QX1pQT1MgOiBNUF9ORUc7Ci0gIHguc2lnbiA9IHkuc2lnbiA9IE1QX1pQT1M7Ci0KLSAgLyogbm9ybWFsaXplIGJvdGggeCBhbmQgeSwgZW5zdXJlIHRoYXQgeSA+PSBiLzIsIFtiID09IDIqKkRJR0lUX0JJVF0gKi8KLSAgbm9ybSA9IG1wX2NvdW50X2JpdHMoJnkpICUgRElHSVRfQklUOwotICBpZiAobm9ybSA8IChpbnQpKERJR0lUX0JJVC0xKSkgewotICAgICBub3JtID0gKERJR0lUX0JJVC0xKSAtIG5vcm07Ci0gICAgIGlmICgocmVzID0gbXBfbXVsXzJkICgmeCwgbm9ybSwgJngpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBfX1k7Ci0gICAgIH0KLSAgICAgaWYgKChyZXMgPSBtcF9tdWxfMmQgKCZ5LCBub3JtLCAmeSkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIF9fWTsKLSAgICAgfQotICB9IGVsc2UgewotICAgICBub3JtID0gMDsKLSAgfQotCi0gIC8qIG5vdGUgaGFjIGRvZXMgMCBiYXNlZCwgc28gaWYgdXNlZD09NSB0aGVuIGl0cyAwLDEsMiwzLDQsIGUuZy4gdXNlIDQgKi8KLSAgbiA9IHgudXNlZCAtIDE7Ci0gIHQgPSB5LnVzZWQgLSAxOwotCi0gIC8qIHdoaWxlICh4ID49IHkqYioqbi10KSBkbyB7IHFbbi10XSArPSAxOyB4IC09IHkqYioqe24tdH0gfSAqLwotICBpZiAoKHJlcyA9IG1wX2xzaGQgKCZ5LCBuIC0gdCkpICE9IE1QX09LQVkpIHsgLyogeSA9IHkqYioqe24tdH0gKi8KLSAgICBnb3RvIF9fWTsKLSAgfQotCi0gIHdoaWxlIChtcF9jbXAgKCZ4LCAmeSkgIT0gTVBfTFQpIHsKLSAgICArKyhxLmRwW24gLSB0XSk7Ci0gICAgaWYgKChyZXMgPSBtcF9zdWIgKCZ4LCAmeSwgJngpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fWTsKLSAgICB9Ci0gIH0KLQotICAvKiByZXNldCB5IGJ5IHNoaWZ0aW5nIGl0IGJhY2sgZG93biAqLwotICBtcF9yc2hkICgmeSwgbiAtIHQpOwotCi0gIC8qIHN0ZXAgMy4gZm9yIGkgZnJvbSBuIGRvd24gdG8gKHQgKyAxKSAqLwotICBmb3IgKGkgPSBuOyBpID49ICh0ICsgMSk7IGktLSkgewotICAgIGlmIChpID4geC51c2VkKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBzdGVwIDMuMSBpZiB4aSA9PSB5dCB0aGVuIHNldCBxe2ktdC0xfSB0byBiLTEsIAotICAgICAqIG90aGVyd2lzZSBzZXQgcXtpLXQtMX0gdG8gKHhpKmIgKyB4e2ktMX0pL3l0ICovCi0gICAgaWYgKHguZHBbaV0gPT0geS5kcFt0XSkgewotICAgICAgcS5kcFtpIC0gdCAtIDFdID0gKCgoKG1wX2RpZ2l0KTEpIDw8IERJR0lUX0JJVCkgLSAxKTsKLSAgICB9IGVsc2UgewotICAgICAgbXBfd29yZCB0bXA7Ci0gICAgICB0bXAgPSAoKG1wX3dvcmQpIHguZHBbaV0pIDw8ICgobXBfd29yZCkgRElHSVRfQklUKTsKLSAgICAgIHRtcCB8PSAoKG1wX3dvcmQpIHguZHBbaSAtIDFdKTsKLSAgICAgIHRtcCAvPSAoKG1wX3dvcmQpIHkuZHBbdF0pOwotICAgICAgaWYgKHRtcCA+IChtcF93b3JkKSBNUF9NQVNLKQotICAgICAgICB0bXAgPSBNUF9NQVNLOwotICAgICAgcS5kcFtpIC0gdCAtIDFdID0gKG1wX2RpZ2l0KSAodG1wICYgKG1wX3dvcmQpIChNUF9NQVNLKSk7Ci0gICAgfQotCi0gICAgLyogd2hpbGUgKHF7aS10LTF9ICogKHl0ICogYiArIHl7dC0xfSkpID4gCi0gICAgICAgICAgICAgeGkgKiBiKioyICsgeGktMSAqIGIgKyB4aS0yIAotICAgICAKLSAgICAgICBkbyBxe2ktdC0xfSAtPSAxOyAKLSAgICAqLwotICAgIHEuZHBbaSAtIHQgLSAxXSA9IChxLmRwW2kgLSB0IC0gMV0gKyAxKSAmIE1QX01BU0s7Ci0gICAgZG8gewotICAgICAgcS5kcFtpIC0gdCAtIDFdID0gKHEuZHBbaSAtIHQgLSAxXSAtIDEpICYgTVBfTUFTSzsKLQotICAgICAgLyogZmluZCBsZWZ0IGhhbmQgKi8KLSAgICAgIG1wX3plcm8gKCZ0MSk7Ci0gICAgICB0MS5kcFswXSA9ICh0IC0gMSA8IDApID8gMCA6IHkuZHBbdCAtIDFdOwotICAgICAgdDEuZHBbMV0gPSB5LmRwW3RdOwotICAgICAgdDEudXNlZCA9IDI7Ci0gICAgICBpZiAoKHJlcyA9IG1wX211bF9kICgmdDEsIHEuZHBbaSAtIHQgLSAxXSwgJnQxKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fWTsKLSAgICAgIH0KLQotICAgICAgLyogZmluZCByaWdodCBoYW5kICovCi0gICAgICB0Mi5kcFswXSA9IChpIC0gMiA8IDApID8gMCA6IHguZHBbaSAtIDJdOwotICAgICAgdDIuZHBbMV0gPSAoaSAtIDEgPCAwKSA/IDAgOiB4LmRwW2kgLSAxXTsKLSAgICAgIHQyLmRwWzJdID0geC5kcFtpXTsKLSAgICAgIHQyLnVzZWQgPSAzOwotICAgIH0gd2hpbGUgKG1wX2NtcF9tYWcoJnQxLCAmdDIpID09IE1QX0dUKTsKLQotICAgIC8qIHN0ZXAgMy4zIHggPSB4IC0gcXtpLXQtMX0gKiB5ICogYioqe2ktdC0xfSAqLwotICAgIGlmICgocmVzID0gbXBfbXVsX2QgKCZ5LCBxLmRwW2kgLSB0IC0gMV0sICZ0MSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19ZOwotICAgIH0KLQotICAgIGlmICgocmVzID0gbXBfbHNoZCAoJnQxLCBpIC0gdCAtIDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fWTsKLSAgICB9Ci0KLSAgICBpZiAoKHJlcyA9IG1wX3N1YiAoJngsICZ0MSwgJngpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fWTsKLSAgICB9Ci0KLSAgICAvKiBpZiB4IDwgMCB0aGVuIHsgeCA9IHggKyB5KmIqKntpLXQtMX07IHF7aS10LTF9IC09IDE7IH0gKi8KLSAgICBpZiAoeC5zaWduID09IE1QX05FRykgewotICAgICAgaWYgKChyZXMgPSBtcF9jb3B5ICgmeSwgJnQxKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fWTsKLSAgICAgIH0KLSAgICAgIGlmICgocmVzID0gbXBfbHNoZCAoJnQxLCBpIC0gdCAtIDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gX19ZOwotICAgICAgfQotICAgICAgaWYgKChyZXMgPSBtcF9hZGQgKCZ4LCAmdDEsICZ4KSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fWTsKLSAgICAgIH0KLQotICAgICAgcS5kcFtpIC0gdCAtIDFdID0gKHEuZHBbaSAtIHQgLSAxXSAtIDFVTCkgJiBNUF9NQVNLOwotICAgIH0KLSAgfQotCi0gIC8qIG5vdyBxIGlzIHRoZSBxdW90aWVudCBhbmQgeCBpcyB0aGUgcmVtYWluZGVyIAotICAgKiBbd2hpY2ggd2UgaGF2ZSB0byBub3JtYWxpemVdIAotICAgKi8KLSAgCi0gIC8qIGdldCBzaWduIGJlZm9yZSB3cml0aW5nIHRvIGMgKi8KLSAgeC5zaWduID0gYS0+c2lnbjsKLQotICBpZiAoYyAhPSBOVUxMKSB7Ci0gICAgbXBfY2xhbXAgKCZxKTsKLSAgICBtcF9leGNoICgmcSwgYyk7Ci0gICAgYy0+c2lnbiA9IG5lZzsKLSAgfQotCi0gIGlmIChkICE9IE5VTEwpIHsKLSAgICBtcF9kaXZfMmQgKCZ4LCBub3JtLCAmeCwgTlVMTCk7Ci0gICAgbXBfZXhjaCAoJngsIGQpOwotICB9Ci0KLSAgcmVzID0gTVBfT0tBWTsKLQotX19ZOm1wX2NsZWFyICgmeSk7Ci1fX1g6bXBfY2xlYXIgKCZ4KTsKLV9fVDI6bXBfY2xlYXIgKCZ0Mik7Ci1fX1QxOm1wX2NsZWFyICgmdDEpOwotX19ROm1wX2NsZWFyICgmcSk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIEVuZDogYm5fbXBfZGl2LmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2Rpdl8yLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGIgPSBhLzIgKi8KLWludCBtcF9kaXZfMihtcF9pbnQgKiBhLCBtcF9pbnQgKiBiKQotewotICBpbnQgICAgIHgsIHJlcywgb2xkdXNlZDsKLQotICAvKiBjb3B5ICovCi0gIGlmIChiLT5hbGxvYyA8IGEtPnVzZWQpIHsKLSAgICBpZiAoKHJlcyA9IG1wX2dyb3cgKGIsIGEtPnVzZWQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgfQotCi0gIG9sZHVzZWQgPSBiLT51c2VkOwotICBiLT51c2VkID0gYS0+dXNlZDsKLSAgewotICAgIHJlZ2lzdGVyIG1wX2RpZ2l0IHIsIHJyLCAqdG1wYSwgKnRtcGI7Ci0KLSAgICAvKiBzb3VyY2UgYWxpYXMgKi8KLSAgICB0bXBhID0gYS0+ZHAgKyBiLT51c2VkIC0gMTsKLQotICAgIC8qIGRlc3QgYWxpYXMgKi8KLSAgICB0bXBiID0gYi0+ZHAgKyBiLT51c2VkIC0gMTsKLQotICAgIC8qIGNhcnJ5ICovCi0gICAgciA9IDA7Ci0gICAgZm9yICh4ID0gYi0+dXNlZCAtIDE7IHggPj0gMDsgeC0tKSB7Ci0gICAgICAvKiBnZXQgdGhlIGNhcnJ5IGZvciB0aGUgbmV4dCBpdGVyYXRpb24gKi8KLSAgICAgIHJyID0gKnRtcGEgJiAxOwotCi0gICAgICAvKiBzaGlmdCB0aGUgY3VycmVudCBkaWdpdCwgYWRkIGluIGNhcnJ5IGFuZCBzdG9yZSAqLwotICAgICAgKnRtcGItLSA9ICgqdG1wYS0tID4+IDEpIHwgKHIgPDwgKERJR0lUX0JJVCAtIDEpKTsKLQotICAgICAgLyogZm9yd2FyZCBjYXJyeSB0byBuZXh0IGl0ZXJhdGlvbiAqLwotICAgICAgciA9IHJyOwotICAgIH0KLQotICAgIC8qIHplcm8gZXhjZXNzIGRpZ2l0cyAqLwotICAgIHRtcGIgPSBiLT5kcCArIGItPnVzZWQ7Ci0gICAgZm9yICh4ID0gYi0+dXNlZDsgeCA8IG9sZHVzZWQ7IHgrKykgewotICAgICAgKnRtcGIrKyA9IDA7Ci0gICAgfQotICB9Ci0gIGItPnNpZ24gPSBhLT5zaWduOwotICBtcF9jbGFtcCAoYik7Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX2Rpdl8yLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2Rpdl8yZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBzaGlmdCByaWdodCBieSBhIGNlcnRhaW4gYml0IGNvdW50IChzdG9yZSBxdW90aWVudCBpbiBjLCBvcHRpb25hbCByZW1haW5kZXIgaW4gZCkgKi8KLWludCBtcF9kaXZfMmQgKG1wX2ludCAqIGEsIGludCBiLCBtcF9pbnQgKiBjLCBtcF9pbnQgKiBkKQotewotICBtcF9kaWdpdCBELCByLCBycjsKLSAgaW50ICAgICB4LCByZXM7Ci0gIG1wX2ludCAgdDsKLQotCi0gIC8qIGlmIHRoZSBzaGlmdCBjb3VudCBpcyA8PSAwIHRoZW4gd2UgZG8gbm8gd29yayAqLwotICBpZiAoYiA8PSAwKSB7Ci0gICAgcmVzID0gbXBfY29weSAoYSwgYyk7Ci0gICAgaWYgKGQgIT0gTlVMTCkgewotICAgICAgbXBfemVybyAoZCk7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICBpZiAoKHJlcyA9IG1wX2luaXQgKCZ0KSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKiBnZXQgdGhlIHJlbWFpbmRlciAqLwotICBpZiAoZCAhPSBOVUxMKSB7Ci0gICAgaWYgKChyZXMgPSBtcF9tb2RfMmQgKGEsIGIsICZ0KSkgIT0gTVBfT0tBWSkgewotICAgICAgbXBfY2xlYXIgKCZ0KTsKLSAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICB9Ci0KLSAgLyogY29weSAqLwotICBpZiAoKHJlcyA9IG1wX2NvcHkgKGEsIGMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgbXBfY2xlYXIgKCZ0KTsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgLyogc2hpZnQgYnkgYXMgbWFueSBkaWdpdHMgaW4gdGhlIGJpdCBjb3VudCAqLwotICBpZiAoYiA+PSAoaW50KURJR0lUX0JJVCkgewotICAgIG1wX3JzaGQgKGMsIGIgLyBESUdJVF9CSVQpOwotICB9Ci0KLSAgLyogc2hpZnQgYW55IGJpdCBjb3VudCA8IERJR0lUX0JJVCAqLwotICBEID0gKG1wX2RpZ2l0KSAoYiAlIERJR0lUX0JJVCk7Ci0gIGlmIChEICE9IDApIHsKLSAgICByZWdpc3RlciBtcF9kaWdpdCAqdG1wYywgbWFzaywgc2hpZnQ7Ci0KLSAgICAvKiBtYXNrICovCi0gICAgbWFzayA9ICgoKG1wX2RpZ2l0KTEpIDw8IEQpIC0gMTsKLQotICAgIC8qIHNoaWZ0IGZvciBsc2IgKi8KLSAgICBzaGlmdCA9IERJR0lUX0JJVCAtIEQ7Ci0KLSAgICAvKiBhbGlhcyAqLwotICAgIHRtcGMgPSBjLT5kcCArIChjLT51c2VkIC0gMSk7Ci0KLSAgICAvKiBjYXJyeSAqLwotICAgIHIgPSAwOwotICAgIGZvciAoeCA9IGMtPnVzZWQgLSAxOyB4ID49IDA7IHgtLSkgewotICAgICAgLyogZ2V0IHRoZSBsb3dlciAgYml0cyBvZiB0aGlzIHdvcmQgaW4gYSB0ZW1wICovCi0gICAgICByciA9ICp0bXBjICYgbWFzazsKLQotICAgICAgLyogc2hpZnQgdGhlIGN1cnJlbnQgd29yZCBhbmQgbWl4IGluIHRoZSBjYXJyeSBiaXRzIGZyb20gdGhlIHByZXZpb3VzIHdvcmQgKi8KLSAgICAgICp0bXBjID0gKCp0bXBjID4+IEQpIHwgKHIgPDwgc2hpZnQpOwotICAgICAgLS10bXBjOwotCi0gICAgICAvKiBzZXQgdGhlIGNhcnJ5IHRvIHRoZSBjYXJyeSBiaXRzIG9mIHRoZSBjdXJyZW50IHdvcmQgZm91bmQgYWJvdmUgKi8KLSAgICAgIHIgPSBycjsKLSAgICB9Ci0gIH0KLSAgbXBfY2xhbXAgKGMpOwotICBpZiAoZCAhPSBOVUxMKSB7Ci0gICAgbXBfZXhjaCAoJnQsIGQpOwotICB9Ci0gIG1wX2NsZWFyICgmdCk7Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX2Rpdl8yZC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9kaXZfMy5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBkaXZpZGUgYnkgdGhyZWUgKGJhc2VkIG9uIHJvdXRpbmUgZnJvbSBNUEkgYW5kIHRoZSBHTVAgbWFudWFsKSAqLwotaW50Ci1tcF9kaXZfMyAobXBfaW50ICogYSwgbXBfaW50ICpjLCBtcF9kaWdpdCAqIGQpCi17Ci0gIG1wX2ludCAgIHE7Ci0gIG1wX3dvcmQgIHcsIHQ7Ci0gIG1wX2RpZ2l0IGI7Ci0gIGludCAgICAgIHJlcywgaXg7Ci0gIAotICAvKiBiID0gMioqRElHSVRfQklUIC8gMyAqLwotICBiID0gKCgobXBfd29yZCkxKSA8PCAoKG1wX3dvcmQpRElHSVRfQklUKSkgLyAoKG1wX3dvcmQpMyk7Ci0KLSAgaWYgKChyZXMgPSBtcF9pbml0X3NpemUoJnEsIGEtPnVzZWQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgIHJldHVybiByZXM7Ci0gIH0KLSAgCi0gIHEudXNlZCA9IGEtPnVzZWQ7Ci0gIHEuc2lnbiA9IGEtPnNpZ247Ci0gIHcgPSAwOwotICBmb3IgKGl4ID0gYS0+dXNlZCAtIDE7IGl4ID49IDA7IGl4LS0pIHsKLSAgICAgdyA9ICh3IDw8ICgobXBfd29yZClESUdJVF9CSVQpKSB8ICgobXBfd29yZClhLT5kcFtpeF0pOwotCi0gICAgIGlmICh3ID49IDMpIHsKLSAgICAgICAgLyogbXVsdGlwbHkgdyBieSBbMS8zXSAqLwotICAgICAgICB0ID0gKHcgKiAoKG1wX3dvcmQpYikpID4+ICgobXBfd29yZClESUdJVF9CSVQpOwotCi0gICAgICAgIC8qIG5vdyBzdWJ0cmFjdCAzICogW3cvM10gZnJvbSB3LCB0byBnZXQgdGhlIHJlbWFpbmRlciAqLwotICAgICAgICB3IC09IHQrdCt0OwotCi0gICAgICAgIC8qIGZpeHVwIHRoZSByZW1haW5kZXIgYXMgcmVxdWlyZWQgc2luY2UKLSAgICAgICAgICogdGhlIG9wdGltaXphdGlvbiBpcyBub3QgZXhhY3QuCi0gICAgICAgICAqLwotICAgICAgICB3aGlsZSAodyA+PSAzKSB7Ci0gICAgICAgICAgIHQgKz0gMTsKLSAgICAgICAgICAgdyAtPSAzOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0ID0gMDsKLSAgICAgIH0KLSAgICAgIHEuZHBbaXhdID0gKG1wX2RpZ2l0KXQ7Ci0gIH0KLQotICAvKiBbb3B0aW9uYWxdIHN0b3JlIHRoZSByZW1haW5kZXIgKi8KLSAgaWYgKGQgIT0gTlVMTCkgewotICAgICAqZCA9IChtcF9kaWdpdCl3OwotICB9Ci0KLSAgLyogW29wdGlvbmFsXSBzdG9yZSB0aGUgcXVvdGllbnQgKi8KLSAgaWYgKGMgIT0gTlVMTCkgewotICAgICBtcF9jbGFtcCgmcSk7Ci0gICAgIG1wX2V4Y2goJnEsIGMpOwotICB9Ci0gIG1wX2NsZWFyKCZxKTsKLSAgCi0gIHJldHVybiByZXM7Ci19Ci0KLQotLyogRW5kOiBibl9tcF9kaXZfMy5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9kaXZfZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi1zdGF0aWMgaW50IHNfaXNfcG93ZXJfb2ZfdHdvKG1wX2RpZ2l0IGIsIGludCAqcCkKLXsKLSAgIGludCB4OwotCi0gICBmb3IgKHggPSAxOyB4IDwgRElHSVRfQklUOyB4KyspIHsKLSAgICAgIGlmIChiID09ICgoKG1wX2RpZ2l0KTEpPDx4KSkgewotICAgICAgICAgKnAgPSB4OwotICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICB9Ci0gICByZXR1cm4gMDsKLX0KLQotLyogc2luZ2xlIGRpZ2l0IGRpdmlzaW9uIChiYXNlZCBvbiByb3V0aW5lIGZyb20gTVBJKSAqLwotaW50IG1wX2Rpdl9kIChtcF9pbnQgKiBhLCBtcF9kaWdpdCBiLCBtcF9pbnQgKiBjLCBtcF9kaWdpdCAqIGQpCi17Ci0gIG1wX2ludCAgcTsKLSAgbXBfd29yZCB3OwotICBtcF9kaWdpdCB0OwotICBpbnQgICAgIHJlcywgaXg7Ci0KLSAgLyogY2Fubm90IGRpdmlkZSBieSB6ZXJvICovCi0gIGlmIChiID09IDApIHsKLSAgICAgcmV0dXJuIE1QX1ZBTDsKLSAgfQotCi0gIC8qIHF1aWNrIG91dHMgKi8KLSAgaWYgKGIgPT0gMSB8fCBtcF9pc3plcm8oYSkgPT0gMSkgewotICAgICBpZiAoZCAhPSBOVUxMKSB7Ci0gICAgICAgICpkID0gMDsKLSAgICAgfQotICAgICBpZiAoYyAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBtcF9jb3B5KGEsIGMpOwotICAgICB9Ci0gICAgIHJldHVybiBNUF9PS0FZOwotICB9Ci0KLSAgLyogcG93ZXIgb2YgdHdvID8gKi8KLSAgaWYgKHNfaXNfcG93ZXJfb2ZfdHdvKGIsICZpeCkgPT0gMSkgewotICAgICBpZiAoZCAhPSBOVUxMKSB7Ci0gICAgICAgICpkID0gYS0+ZHBbMF0gJiAoKDE8PGl4KSAtIDEpOwotICAgICB9Ci0gICAgIGlmIChjICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIG1wX2Rpdl8yZChhLCBpeCwgYywgTlVMTCk7Ci0gICAgIH0KLSAgICAgcmV0dXJuIE1QX09LQVk7Ci0gIH0KLQotICAvKiB0aHJlZT8gKi8KLSAgaWYgKGIgPT0gMykgewotICAgICByZXR1cm4gbXBfZGl2XzMoYSwgYywgZCk7Ci0gIH0KLQotICAvKiBubyBlYXN5IGFuc3dlciBbYydlc3QgbGEgdmllXS4gIEp1c3QgZGl2aXNpb24gKi8KLSAgaWYgKChyZXMgPSBtcF9pbml0X3NpemUoJnEsIGEtPnVzZWQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgIHJldHVybiByZXM7Ci0gIH0KLSAgCi0gIHEudXNlZCA9IGEtPnVzZWQ7Ci0gIHEuc2lnbiA9IGEtPnNpZ247Ci0gIHcgPSAwOwotICBmb3IgKGl4ID0gYS0+dXNlZCAtIDE7IGl4ID49IDA7IGl4LS0pIHsKLSAgICAgdyA9ICh3IDw8ICgobXBfd29yZClESUdJVF9CSVQpKSB8ICgobXBfd29yZClhLT5kcFtpeF0pOwotICAgICAKLSAgICAgaWYgKHcgPj0gYikgewotICAgICAgICB0ID0gKG1wX2RpZ2l0KSh3IC8gYik7Ci0gICAgICAgIHcgLT0gKChtcF93b3JkKXQpICogKChtcF93b3JkKWIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdCA9IDA7Ci0gICAgICB9Ci0gICAgICBxLmRwW2l4XSA9IChtcF9kaWdpdCl0OwotICB9Ci0gIAotICBpZiAoZCAhPSBOVUxMKSB7Ci0gICAgICpkID0gKG1wX2RpZ2l0KXc7Ci0gIH0KLSAgCi0gIGlmIChjICE9IE5VTEwpIHsKLSAgICAgbXBfY2xhbXAoJnEpOwotICAgICBtcF9leGNoKCZxLCBjKTsKLSAgfQotICBtcF9jbGVhcigmcSk7Ci0gIAotICByZXR1cm4gcmVzOwotfQotCi0KLS8qIEVuZDogYm5fbXBfZGl2X2QuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfZHJfaXNfbW9kdWx1cy5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBkZXRlcm1pbmVzIGlmIGEgbnVtYmVyIGlzIGEgdmFsaWQgRFIgbW9kdWx1cyAqLwotaW50IG1wX2RyX2lzX21vZHVsdXMobXBfaW50ICphKQotewotICAgaW50IGl4OwotCi0gICAvKiBtdXN0IGJlIGF0IGxlYXN0IHR3byBkaWdpdHMgKi8KLSAgIGlmIChhLT51c2VkIDwgMikgewotICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0KLSAgIC8qIG11c3QgYmUgb2YgdGhlIGZvcm0gYioqayAtIGEgW2EgPD0gYl0gc28gYWxsCi0gICAgKiBidXQgdGhlIGZpcnN0IGRpZ2l0IG11c3QgYmUgZXF1YWwgdG8gLTEgKG1vZCBiKS4KLSAgICAqLwotICAgZm9yIChpeCA9IDE7IGl4IDwgYS0+dXNlZDsgaXgrKykgewotICAgICAgIGlmIChhLT5kcFtpeF0gIT0gTVBfTUFTSykgewotICAgICAgICAgIHJldHVybiAwOwotICAgICAgIH0KLSAgIH0KLSAgIHJldHVybiAxOwotfQotCi0KLS8qIEVuZDogYm5fbXBfZHJfaXNfbW9kdWx1cy5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9kcl9yZWR1Y2UuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogcmVkdWNlICJ4IiBpbiBwbGFjZSBtb2R1bG8gIm4iIHVzaW5nIHRoZSBEaW1pbmlzaGVkIFJhZGl4IGFsZ29yaXRobS4KLSAqCi0gKiBCYXNlZCBvbiBhbGdvcml0aG0gZnJvbSB0aGUgcGFwZXIKLSAqCi0gKiAiR2VuZXJhdGluZyBFZmZpY2llbnQgUHJpbWVzIGZvciBEaXNjcmV0ZSBMb2cgQ3J5cHRvc3lzdGVtcyIKLSAqICAgICAgICAgICAgICAgICBDaGFlIEhvb24gTGltLCBQaWwgTG9vbmcgTGVlLAotICogICAgICAgICAgUE9TVEVDSCBJbmZvcm1hdGlvbiBSZXNlYXJjaCBMYWJvcmF0b3JpZXMKLSAqCi0gKiBUaGUgbW9kdWx1cyBtdXN0IGJlIG9mIGEgc3BlY2lhbCBmb3JtYXQgW3NlZSBtYW51YWxdCi0gKgotICogSGFzIGJlZW4gbW9kaWZpZWQgdG8gdXNlIGFsZ29yaXRobSA3LjEwIGZyb20gdGhlIExUTSBib29rIGluc3RlYWQKLSAqCi0gKiBJbnB1dCB4IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgPD0geCA8PSAobi0xKSoqMgotICovCi1pbnQKLW1wX2RyX3JlZHVjZSAobXBfaW50ICogeCwgbXBfaW50ICogbiwgbXBfZGlnaXQgaykKLXsKLSAgaW50ICAgICAgZXJyLCBpLCBtOwotICBtcF93b3JkICByOwotICBtcF9kaWdpdCBtdSwgKnRtcHgxLCAqdG1weDI7Ci0KLSAgLyogbSA9IGRpZ2l0cyBpbiBtb2R1bHVzICovCi0gIG0gPSBuLT51c2VkOwotCi0gIC8qIGVuc3VyZSB0aGF0ICJ4IiBoYXMgYXQgbGVhc3QgMm0gZGlnaXRzICovCi0gIGlmICh4LT5hbGxvYyA8IG0gKyBtKSB7Ci0gICAgaWYgKChlcnIgPSBtcF9ncm93ICh4LCBtICsgbSkpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICB9Ci0KLS8qIHRvcCBvZiBsb29wLCB0aGlzIGlzIHdoZXJlIHRoZSBjb2RlIHJlc3VtZXMgaWYKLSAqIGFub3RoZXIgcmVkdWN0aW9uIHBhc3MgaXMgcmVxdWlyZWQuCi0gKi8KLXRvcDoKLSAgLyogYWxpYXNlcyBmb3IgZGlnaXRzICovCi0gIC8qIGFsaWFzIGZvciBsb3dlciBoYWxmIG9mIHggKi8KLSAgdG1weDEgPSB4LT5kcDsKLQotICAvKiBhbGlhcyBmb3IgdXBwZXIgaGFsZiBvZiB4LCBvciB4L0IqKm0gKi8KLSAgdG1weDIgPSB4LT5kcCArIG07Ci0KLSAgLyogc2V0IGNhcnJ5IHRvIHplcm8gKi8KLSAgbXUgPSAwOwotCi0gIC8qIGNvbXB1dGUgKHggbW9kIEIqKm0pICsgayAqIFt4L0IqKm1dIGlubGluZSBhbmQgaW5wbGFjZSAqLwotICBmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7Ci0gICAgICByICAgICAgICAgPSAoKG1wX3dvcmQpKnRtcHgyKyspICogKChtcF93b3JkKWspICsgKnRtcHgxICsgbXU7Ci0gICAgICAqdG1weDErKyAgPSAobXBfZGlnaXQpKHIgJiBNUF9NQVNLKTsKLSAgICAgIG11ICAgICAgICA9IChtcF9kaWdpdCkociA+PiAoKG1wX3dvcmQpRElHSVRfQklUKSk7Ci0gIH0KLQotICAvKiBzZXQgZmluYWwgY2FycnkgKi8KLSAgKnRtcHgxKysgPSBtdTsKLQotICAvKiB6ZXJvIHdvcmRzIGFib3ZlIG0gKi8KLSAgZm9yIChpID0gbSArIDE7IGkgPCB4LT51c2VkOyBpKyspIHsKLSAgICAgICp0bXB4MSsrID0gMDsKLSAgfQotCi0gIC8qIGNsYW1wLCBzdWIgYW5kIHJldHVybiAqLwotICBtcF9jbGFtcCAoeCk7Ci0KLSAgLyogaWYgeCA+PSBuIHRoZW4gc3VidHJhY3QgYW5kIHJlZHVjZSBhZ2FpbgotICAgKiBFYWNoIHN1Y2Nlc3NpdmUgInJlY3Vyc2lvbiIgbWFrZXMgdGhlIGlucHV0IHNtYWxsZXIgYW5kIHNtYWxsZXIuCi0gICAqLwotICBpZiAobXBfY21wX21hZyAoeCwgbikgIT0gTVBfTFQpIHsKLSAgICBzX21wX3N1Yih4LCBuLCB4KTsKLSAgICBnb3RvIHRvcDsKLSAgfQotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9tcF9kcl9yZWR1Y2UuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfZHJfc2V0dXAuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogZGV0ZXJtaW5lcyB0aGUgc2V0dXAgdmFsdWUgKi8KLXZvaWQgbXBfZHJfc2V0dXAobXBfaW50ICphLCBtcF9kaWdpdCAqZCkKLXsKLSAgIC8qIHRoZSBjYXN0cyBhcmUgcmVxdWlyZWQgaWYgRElHSVRfQklUIGlzIG9uZSBsZXNzIHRoYW4KLSAgICAqIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIG1wX2RpZ2l0IFtlLmcuIERJR0lUX0JJVD09MzFdCi0gICAgKi8KLSAgICpkID0gKG1wX2RpZ2l0KSgoKChtcF93b3JkKTEpIDw8ICgobXBfd29yZClESUdJVF9CSVQpKSAtIAotICAgICAgICAoKG1wX3dvcmQpYS0+ZHBbMF0pKTsKLX0KLQotCi0vKiBFbmQ6IGJuX21wX2RyX3NldHVwLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2V4Y2guYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogc3dhcCB0aGUgZWxlbWVudHMgb2YgdHdvIGludGVnZXJzLCBmb3IgY2FzZXMgd2hlcmUgeW91IGNhbid0IHNpbXBseSBzd2FwIHRoZSAKLSAqIG1wX2ludCBwb2ludGVycyBhcm91bmQKLSAqLwotdm9pZAotbXBfZXhjaCAobXBfaW50ICogYSwgbXBfaW50ICogYikKLXsKLSAgbXBfaW50ICB0OwotCi0gIHQgID0gKmE7Ci0gICphID0gKmI7Ci0gICpiID0gdDsKLX0KLQotLyogRW5kOiBibl9tcF9leGNoLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2V4cHRfZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBjYWxjdWxhdGUgYyA9IGEqKmIgIHVzaW5nIGEgc3F1YXJlLW11bHRpcGx5IGFsZ29yaXRobSAqLwotaW50IG1wX2V4cHRfZCAobXBfaW50ICogYSwgbXBfZGlnaXQgYiwgbXBfaW50ICogYykKLXsKLSAgaW50ICAgICByZXMsIHg7Ci0gIG1wX2ludCAgZzsKLQotICBpZiAoKHJlcyA9IG1wX2luaXRfY29weSAoJmcsIGEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qIHNldCBpbml0aWFsIHJlc3VsdCAqLwotICBtcF9zZXQgKGMsIDEpOwotCi0gIGZvciAoeCA9IDA7IHggPCAoaW50KSBESUdJVF9CSVQ7IHgrKykgewotICAgIC8qIHNxdWFyZSAqLwotICAgIGlmICgocmVzID0gbXBfc3FyIChjLCBjKSkgIT0gTVBfT0tBWSkgewotICAgICAgbXBfY2xlYXIgKCZnKTsKLSAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgLyogaWYgdGhlIGJpdCBpcyBzZXQgbXVsdGlwbHkgKi8KLSAgICBpZiAoKGIgJiAobXBfZGlnaXQpICgoKG1wX2RpZ2l0KTEpIDw8IChESUdJVF9CSVQgLSAxKSkpICE9IDApIHsKLSAgICAgIGlmICgocmVzID0gbXBfbXVsIChjLCAmZywgYykpICE9IE1QX09LQVkpIHsKLSAgICAgICAgIG1wX2NsZWFyICgmZyk7Ci0gICAgICAgICByZXR1cm4gcmVzOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHNoaWZ0IHRvIG5leHQgYml0ICovCi0gICAgYiA8PD0gMTsKLSAgfQotCi0gIG1wX2NsZWFyICgmZyk7Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX2V4cHRfZC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9leHB0bW9kLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLQotLyogdGhpcyBpcyBhIHNoZWxsIGZ1bmN0aW9uIHRoYXQgY2FsbHMgZWl0aGVyIHRoZSBub3JtYWwgb3IgTW9udGdvbWVyeQotICogZXhwdG1vZCBmdW5jdGlvbnMuICBPcmlnaW5hbGx5IHRoZSBjYWxsIHRvIHRoZSBtb250Z29tZXJ5IGNvZGUgd2FzCi0gKiBlbWJlZGRlZCBpbiB0aGUgbm9ybWFsIGZ1bmN0aW9uIGJ1dCB0aGF0IHdhc3RlZCBhbG90IG9mIHN0YWNrIHNwYWNlCi0gKiBmb3Igbm90aGluZyAoc2luY2UgOTklIG9mIHRoZSB0aW1lIHRoZSBNb250Z29tZXJ5IGNvZGUgd291bGQgYmUgY2FsbGVkKQotICovCi1pbnQgbXBfZXhwdG1vZCAobXBfaW50ICogRywgbXBfaW50ICogWCwgbXBfaW50ICogUCwgbXBfaW50ICogWSkKLXsKLSAgaW50IGRyOwotCi0gIC8qIG1vZHVsdXMgUCBtdXN0IGJlIHBvc2l0aXZlICovCi0gIGlmIChQLT5zaWduID09IE1QX05FRykgewotICAgICByZXR1cm4gTVBfVkFMOwotICB9Ci0KLSAgLyogaWYgZXhwb25lbnQgWCBpcyBuZWdhdGl2ZSB3ZSBoYXZlIHRvIHJlY3Vyc2UgKi8KLSAgaWYgKFgtPnNpZ24gPT0gTVBfTkVHKSB7Ci0gICAgIG1wX2ludCB0bXBHLCB0bXBYOwotICAgICBpbnQgZXJyOwotCi0gICAgIC8qIGZpcnN0IGNvbXB1dGUgMS9HIG1vZCBQICovCi0gICAgIGlmICgoZXJyID0gbXBfaW5pdCgmdG1wRykpICE9IE1QX09LQVkpIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgfQotICAgICBpZiAoKGVyciA9IG1wX2ludm1vZChHLCBQLCAmdG1wRykpICE9IE1QX09LQVkpIHsKLSAgICAgICAgbXBfY2xlYXIoJnRtcEcpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgICB9Ci0KLSAgICAgLyogbm93IGdldCB8WHwgKi8KLSAgICAgaWYgKChlcnIgPSBtcF9pbml0KCZ0bXBYKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBtcF9jbGVhcigmdG1wRyk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgIH0KLSAgICAgaWYgKChlcnIgPSBtcF9hYnMoWCwgJnRtcFgpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIG1wX2NsZWFyX211bHRpKCZ0bXBHLCAmdG1wWCwgTlVMTCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgIH0KLQotICAgICAvKiBhbmQgbm93IGNvbXB1dGUgKDEvRykqKnxYfCBpbnN0ZWFkIG9mIEcqKlggW1ggPCAwXSAqLwotICAgICBlcnIgPSBtcF9leHB0bW9kKCZ0bXBHLCAmdG1wWCwgUCwgWSk7Ci0gICAgIG1wX2NsZWFyX211bHRpKCZ0bXBHLCAmdG1wWCwgTlVMTCk7Ci0gICAgIHJldHVybiBlcnI7Ci0gIH0KLQotICAvKiBpcyBpdCBhIERSIG1vZHVsdXM/ICovCi0gIGRyID0gbXBfZHJfaXNfbW9kdWx1cyhQKTsKLQotICAvKiBpZiBub3QsIGlzIGl0IGEgdURSIG1vZHVsdXM/ICovCi0gIGlmIChkciA9PSAwKSB7Ci0gICAgIGRyID0gbXBfcmVkdWNlX2lzXzJrKFApIDw8IDE7Ci0gIH0KLSAgICAKLSAgLyogaWYgdGhlIG1vZHVsdXMgaXMgb2RkIG9yIGRyICE9IDAgdXNlIHRoZSBmYXN0IG1ldGhvZCAqLwotICBpZiAobXBfaXNvZGQgKFApID09IDEgfHwgZHIgIT0gIDApIHsKLSAgICByZXR1cm4gbXBfZXhwdG1vZF9mYXN0IChHLCBYLCBQLCBZLCBkcik7Ci0gIH0gZWxzZSB7Ci0gICAgLyogb3RoZXJ3aXNlIHVzZSB0aGUgZ2VuZXJpYyBCYXJyZXR0IHJlZHVjdGlvbiB0ZWNobmlxdWUgKi8KLSAgICByZXR1cm4gc19tcF9leHB0bW9kIChHLCBYLCBQLCBZKTsKLSAgfQotfQotCi0KLS8qIEVuZDogYm5fbXBfZXhwdG1vZC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9leHB0bW9kX2Zhc3QuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogY29tcHV0ZXMgWSA9PSBHKipYIG1vZCBQLCBIQUMgcHAuNjE2LCBBbGdvcml0aG0gMTQuODUKLSAqCi0gKiBVc2VzIGEgbGVmdC10by1yaWdodCBrLWFyeSBzbGlkaW5nIHdpbmRvdyB0byBjb21wdXRlIHRoZSBtb2R1bGFyIGV4cG9uZW50aWF0aW9uLgotICogVGhlIHZhbHVlIG9mIGsgY2hhbmdlcyBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgZXhwb25lbnQuCi0gKgotICogVXNlcyBNb250Z29tZXJ5IG9yIERpbWluaXNoZWQgUmFkaXggcmVkdWN0aW9uIFt3aGljaGV2ZXIgYXBwcm9wcmlhdGVdCi0gKi8KLQotI2lmZGVmIE1QX0xPV19NRU0KLSAgICNkZWZpbmUgVEFCX1NJWkUgMzIKLSNlbHNlCi0gICAjZGVmaW5lIFRBQl9TSVpFIDI1NgotI2VuZGlmCi0KLWludAotbXBfZXhwdG1vZF9mYXN0IChtcF9pbnQgKiBHLCBtcF9pbnQgKiBYLCBtcF9pbnQgKiBQLCBtcF9pbnQgKiBZLCBpbnQgcmVkbW9kZSkKLXsKLSAgbXBfaW50ICBNW1RBQl9TSVpFXSwgcmVzOwotICBtcF9kaWdpdCBidWYsIG1wOwotICBpbnQgICAgIGVyciwgYml0YnVmLCBiaXRjcHksIGJpdGNudCwgbW9kZSwgZGlnaWR4LCB4LCB5LCB3aW5zaXplOwotCi0gIC8qIHVzZSBhIHBvaW50ZXIgdG8gdGhlIHJlZHVjdGlvbiBhbGdvcml0aG0uICBUaGlzIGFsbG93cyB1cyB0byB1c2UKLSAgICogb25lIG9mIG1hbnkgcmVkdWN0aW9uIGFsZ29yaXRobXMgd2l0aG91dCBtb2RkaW5nIHRoZSBndXRzIG9mCi0gICAqIHRoZSBjb2RlIHdpdGggaWYgc3RhdGVtZW50cyBldmVyeXdoZXJlLgotICAgKi8KLSAgaW50ICAgICAoKnJlZHV4KShtcF9pbnQqLG1wX2ludCosbXBfZGlnaXQpOwotCi0gIC8qIGZpbmQgd2luZG93IHNpemUgKi8KLSAgeCA9IG1wX2NvdW50X2JpdHMgKFgpOwotICBpZiAoeCA8PSA3KSB7Ci0gICAgd2luc2l6ZSA9IDI7Ci0gIH0gZWxzZSBpZiAoeCA8PSAzNikgewotICAgIHdpbnNpemUgPSAzOwotICB9IGVsc2UgaWYgKHggPD0gMTQwKSB7Ci0gICAgd2luc2l6ZSA9IDQ7Ci0gIH0gZWxzZSBpZiAoeCA8PSA0NTApIHsKLSAgICB3aW5zaXplID0gNTsKLSAgfSBlbHNlIGlmICh4IDw9IDEzMDMpIHsKLSAgICB3aW5zaXplID0gNjsKLSAgfSBlbHNlIGlmICh4IDw9IDM1MjkpIHsKLSAgICB3aW5zaXplID0gNzsKLSAgfSBlbHNlIHsKLSAgICB3aW5zaXplID0gODsKLSAgfQotCi0jaWZkZWYgTVBfTE9XX01FTQotICBpZiAod2luc2l6ZSA+IDUpIHsKLSAgICAgd2luc2l6ZSA9IDU7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIGluaXQgTSBhcnJheSAqLwotICAvKiBpbml0IGZpcnN0IGNlbGwgKi8KLSAgaWYgKChlcnIgPSBtcF9pbml0KCZNWzFdKSkgIT0gTVBfT0tBWSkgewotICAgICByZXR1cm4gZXJyOwotICB9Ci0KLSAgLyogbm93IGluaXQgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBhcnJheSAqLwotICBmb3IgKHggPSAxPDwod2luc2l6ZS0xKTsgeCA8ICgxIDw8IHdpbnNpemUpOyB4KyspIHsKLSAgICBpZiAoKGVyciA9IG1wX2luaXQoJk1beF0pKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBmb3IgKHkgPSAxPDwod2luc2l6ZS0xKTsgeSA8IHg7IHkrKykgewotICAgICAgICBtcF9jbGVhciAoJk1beV0pOwotICAgICAgfQotICAgICAgbXBfY2xlYXIoJk1bMV0pOwotICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gIH0KLQotICAvKiBkZXRlcm1pbmUgYW5kIHNldHVwIHJlZHVjdGlvbiBjb2RlICovCi0gIGlmIChyZWRtb2RlID09IDApIHsKLSAgICAgLyogbm93IHNldHVwIG1vbnRnb21lcnkgICovCi0gICAgIGlmICgoZXJyID0gbXBfbW9udGdvbWVyeV9zZXR1cCAoUCwgJm1wKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fTTsKLSAgICAgfQotCi0gICAgIC8qIGF1dG9tYXRpY2FsbHkgcGljayB0aGUgY29tYmEgb25lIGlmIGF2YWlsYWJsZSAoc2F2ZXMgcXVpdGUgYSBmZXcgY2FsbHMvaWZzKSAqLwotICAgICBpZiAoKChQLT51c2VkICogMiArIDEpIDwgTVBfV0FSUkFZKSAmJgotICAgICAgICAgIFAtPnVzZWQgPCAoMSA8PCAoKENIQVJfQklUICogc2l6ZW9mIChtcF93b3JkKSkgLSAoMiAqIERJR0lUX0JJVCkpKSkgewotICAgICAgICByZWR1eCA9IGZhc3RfbXBfbW9udGdvbWVyeV9yZWR1Y2U7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIHVzZSBzbG93ZXIgYmFzZWxpbmUgTW9udGdvbWVyeSBtZXRob2QgKi8KLSAgICAgICAgcmVkdXggPSBtcF9tb250Z29tZXJ5X3JlZHVjZTsKLSAgICAgfQotICB9IGVsc2UgaWYgKHJlZG1vZGUgPT0gMSkgewotICAgICAvKiBzZXR1cCBEUiByZWR1Y3Rpb24gZm9yIG1vZHVsaSBvZiB0aGUgZm9ybSBCKiprIC0gYiAqLwotICAgICBtcF9kcl9zZXR1cChQLCAmbXApOwotICAgICByZWR1eCA9IG1wX2RyX3JlZHVjZTsKLSAgfSBlbHNlIHsKLSAgICAgLyogc2V0dXAgRFIgcmVkdWN0aW9uIGZvciBtb2R1bGkgb2YgdGhlIGZvcm0gMioqayAtIGIgKi8KLSAgICAgaWYgKChlcnIgPSBtcF9yZWR1Y2VfMmtfc2V0dXAoUCwgJm1wKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fTTsKLSAgICAgfQotICAgICByZWR1eCA9IG1wX3JlZHVjZV8yazsKLSAgfQotCi0gIC8qIHNldHVwIHJlc3VsdCAqLwotICBpZiAoKGVyciA9IG1wX2luaXQgKCZyZXMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX007Ci0gIH0KLQotICAvKiBjcmVhdGUgTSB0YWJsZQotICAgKgotICAgKiBUaGUgTSB0YWJsZSBjb250YWlucyBwb3dlcnMgb2YgdGhlIGlucHV0IGJhc2UsIGUuZy4gTVt4XSA9IEdeeCBtb2QgUAotICAgKgotICAgKiBUaGUgZmlyc3QgaGFsZiBvZiB0aGUgdGFibGUgaXMgbm90IGNvbXB1dGVkIHRob3VnaCBhY2NlcHQgZm9yIE1bMF0gYW5kIE1bMV0KLSAgICovCi0KLSAgaWYgKHJlZG1vZGUgPT0gMCkgewotICAgICAvKiBub3cgd2UgbmVlZCBSIG1vZCBtICovCi0gICAgIGlmICgoZXJyID0gbXBfbW9udGdvbWVyeV9jYWxjX25vcm1hbGl6YXRpb24gKCZyZXMsIFApKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBfX1JFUzsKLSAgICAgfQotCi0gICAgIC8qIG5vdyBzZXQgTVsxXSB0byBHICogUiBtb2QgbSAqLwotICAgICBpZiAoKGVyciA9IG1wX211bG1vZCAoRywgJnJlcywgUCwgJk1bMV0pKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBfX1JFUzsKLSAgICAgfQotICB9IGVsc2UgewotICAgICBtcF9zZXQoJnJlcywgMSk7Ci0gICAgIGlmICgoZXJyID0gbXBfbW9kKEcsIFAsICZNWzFdKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fUkVTOwotICAgICB9Ci0gIH0KLQotICAvKiBjb21wdXRlIHRoZSB2YWx1ZSBhdCBNWzE8PCh3aW5zaXplLTEpXSBieSBzcXVhcmluZyBNWzFdICh3aW5zaXplLTEpIHRpbWVzICovCi0gIGlmICgoZXJyID0gbXBfY29weSAoJk1bMV0sICZNWzEgPDwgKHdpbnNpemUgLSAxKV0pKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX1JFUzsKLSAgfQotCi0gIGZvciAoeCA9IDA7IHggPCAod2luc2l6ZSAtIDEpOyB4KyspIHsKLSAgICBpZiAoKGVyciA9IG1wX3NxciAoJk1bMSA8PCAod2luc2l6ZSAtIDEpXSwgJk1bMSA8PCAod2luc2l6ZSAtIDEpXSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19SRVM7Ci0gICAgfQotICAgIGlmICgoZXJyID0gcmVkdXggKCZNWzEgPDwgKHdpbnNpemUgLSAxKV0sIFAsIG1wKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX1JFUzsKLSAgICB9Ci0gIH0KLQotICAvKiBjcmVhdGUgdXBwZXIgdGFibGUgKi8KLSAgZm9yICh4ID0gKDEgPDwgKHdpbnNpemUgLSAxKSkgKyAxOyB4IDwgKDEgPDwgd2luc2l6ZSk7IHgrKykgewotICAgIGlmICgoZXJyID0gbXBfbXVsICgmTVt4IC0gMV0sICZNWzFdLCAmTVt4XSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19SRVM7Ci0gICAgfQotICAgIGlmICgoZXJyID0gcmVkdXggKCZNW3hdLCBQLCBtcCkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19SRVM7Ci0gICAgfQotICB9Ci0KLSAgLyogc2V0IGluaXRpYWwgbW9kZSBhbmQgYml0IGNudCAqLwotICBtb2RlICAgPSAwOwotICBiaXRjbnQgPSAxOwotICBidWYgICAgPSAwOwotICBkaWdpZHggPSBYLT51c2VkIC0gMTsKLSAgYml0Y3B5ID0gMDsKLSAgYml0YnVmID0gMDsKLQotICBmb3IgKDs7KSB7Ci0gICAgLyogZ3JhYiBuZXh0IGRpZ2l0IGFzIHJlcXVpcmVkICovCi0gICAgaWYgKC0tYml0Y250ID09IDApIHsKLSAgICAgIC8qIGlmIGRpZ2lkeCA9PSAtMSB3ZSBhcmUgb3V0IG9mIGRpZ2l0cyBzbyBicmVhayAqLwotICAgICAgaWYgKGRpZ2lkeCA9PSAtMSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIC8qIHJlYWQgbmV4dCBkaWdpdCBhbmQgcmVzZXQgYml0Y250ICovCi0gICAgICBidWYgICAgPSBYLT5kcFtkaWdpZHgtLV07Ci0gICAgICBiaXRjbnQgPSAoaW50KURJR0lUX0JJVDsKLSAgICB9Ci0KLSAgICAvKiBncmFiIHRoZSBuZXh0IG1zYiBmcm9tIHRoZSBleHBvbmVudCAqLwotICAgIHkgICAgID0gKG1wX2RpZ2l0KShidWYgPj4gKERJR0lUX0JJVCAtIDEpKSAmIDE7Ci0gICAgYnVmIDw8PSAobXBfZGlnaXQpMTsKLQotICAgIC8qIGlmIHRoZSBiaXQgaXMgemVybyBhbmQgbW9kZSA9PSAwIHRoZW4gd2UgaWdub3JlIGl0Ci0gICAgICogVGhlc2UgcmVwcmVzZW50IHRoZSBsZWFkaW5nIHplcm8gYml0cyBiZWZvcmUgdGhlIGZpcnN0IDEgYml0Ci0gICAgICogaW4gdGhlIGV4cG9uZW50LiAgVGVjaG5pY2FsbHkgdGhpcyBvcHQgaXMgbm90IHJlcXVpcmVkIGJ1dCBpdAotICAgICAqIGRvZXMgbG93ZXIgdGhlICMgb2YgdHJpdmlhbCBzcXVhcmluZy9yZWR1Y3Rpb25zIHVzZWQKLSAgICAgKi8KLSAgICBpZiAobW9kZSA9PSAwICYmIHkgPT0gMCkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLyogaWYgdGhlIGJpdCBpcyB6ZXJvIGFuZCBtb2RlID09IDEgdGhlbiB3ZSBzcXVhcmUgKi8KLSAgICBpZiAobW9kZSA9PSAxICYmIHkgPT0gMCkgewotICAgICAgaWYgKChlcnIgPSBtcF9zcXIgKCZyZXMsICZyZXMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gX19SRVM7Ci0gICAgICB9Ci0gICAgICBpZiAoKGVyciA9IHJlZHV4ICgmcmVzLCBQLCBtcCkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBfX1JFUzsKLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIGVsc2Ugd2UgYWRkIGl0IHRvIHRoZSB3aW5kb3cgKi8KLSAgICBiaXRidWYgfD0gKHkgPDwgKHdpbnNpemUgLSArK2JpdGNweSkpOwotICAgIG1vZGUgICAgPSAyOwotCi0gICAgaWYgKGJpdGNweSA9PSB3aW5zaXplKSB7Ci0gICAgICAvKiBvayB3aW5kb3cgaXMgZmlsbGVkIHNvIHNxdWFyZSBhcyByZXF1aXJlZCBhbmQgbXVsdGlwbHkgICovCi0gICAgICAvKiBzcXVhcmUgZmlyc3QgKi8KLSAgICAgIGZvciAoeCA9IDA7IHggPCB3aW5zaXplOyB4KyspIHsKLSAgICAgICAgaWYgKChlcnIgPSBtcF9zcXIgKCZyZXMsICZyZXMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICAgZ290byBfX1JFUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGVyciA9IHJlZHV4ICgmcmVzLCBQLCBtcCkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgICBnb3RvIF9fUkVTOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIHRoZW4gbXVsdGlwbHkgKi8KLSAgICAgIGlmICgoZXJyID0gbXBfbXVsICgmcmVzLCAmTVtiaXRidWZdLCAmcmVzKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fUkVTOwotICAgICAgfQotICAgICAgaWYgKChlcnIgPSByZWR1eCAoJnJlcywgUCwgbXApKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gX19SRVM7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGVtcHR5IHdpbmRvdyBhbmQgcmVzZXQgKi8KLSAgICAgIGJpdGNweSA9IDA7Ci0gICAgICBiaXRidWYgPSAwOwotICAgICAgbW9kZSAgID0gMTsKLSAgICB9Ci0gIH0KLQotICAvKiBpZiBiaXRzIHJlbWFpbiB0aGVuIHNxdWFyZS9tdWx0aXBseSAqLwotICBpZiAobW9kZSA9PSAyICYmIGJpdGNweSA+IDApIHsKLSAgICAvKiBzcXVhcmUgdGhlbiBtdWx0aXBseSBpZiB0aGUgYml0IGlzIHNldCAqLwotICAgIGZvciAoeCA9IDA7IHggPCBiaXRjcHk7IHgrKykgewotICAgICAgaWYgKChlcnIgPSBtcF9zcXIgKCZyZXMsICZyZXMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gX19SRVM7Ci0gICAgICB9Ci0gICAgICBpZiAoKGVyciA9IHJlZHV4ICgmcmVzLCBQLCBtcCkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBfX1JFUzsKLSAgICAgIH0KLQotICAgICAgLyogZ2V0IG5leHQgYml0IG9mIHRoZSB3aW5kb3cgKi8KLSAgICAgIGJpdGJ1ZiA8PD0gMTsKLSAgICAgIGlmICgoYml0YnVmICYgKDEgPDwgd2luc2l6ZSkpICE9IDApIHsKLSAgICAgICAgLyogdGhlbiBtdWx0aXBseSAqLwotICAgICAgICBpZiAoKGVyciA9IG1wX211bCAoJnJlcywgJk1bMV0sICZyZXMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICAgZ290byBfX1JFUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGVyciA9IHJlZHV4ICgmcmVzLCBQLCBtcCkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgICBnb3RvIF9fUkVTOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHJlZG1vZGUgPT0gMCkgewotICAgICAvKiBmaXh1cCByZXN1bHQgaWYgTW9udGdvbWVyeSByZWR1Y3Rpb24gaXMgdXNlZAotICAgICAgKiByZWNhbGwgdGhhdCBhbnkgdmFsdWUgaW4gYSBNb250Z29tZXJ5IHN5c3RlbSBpcwotICAgICAgKiBhY3R1YWxseSBtdWx0aXBsaWVkIGJ5IFIgbW9kIG4uICBTbyB3ZSBoYXZlCi0gICAgICAqIHRvIHJlZHVjZSBvbmUgbW9yZSB0aW1lIHRvIGNhbmNlbCBvdXQgdGhlIGZhY3RvcgotICAgICAgKiBvZiBSLgotICAgICAgKi8KLSAgICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3JlZHVjZSAoJnJlcywgUCwgbXApKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBfX1JFUzsKLSAgICAgfQotICB9Ci0KLSAgLyogc3dhcCByZXMgd2l0aCBZICovCi0gIG1wX2V4Y2ggKCZyZXMsIFkpOwotICBlcnIgPSBNUF9PS0FZOwotX19SRVM6bXBfY2xlYXIgKCZyZXMpOwotX19NOgotICBtcF9jbGVhcigmTVsxXSk7Ci0gIGZvciAoeCA9IDE8PCh3aW5zaXplLTEpOyB4IDwgKDEgPDwgd2luc2l6ZSk7IHgrKykgewotICAgIG1wX2NsZWFyICgmTVt4XSk7Ci0gIH0KLSAgcmV0dXJuIGVycjsKLX0KLQotLyogRW5kOiBibl9tcF9leHB0bW9kX2Zhc3QuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfZXh0ZXVjbGlkLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIEV4dGVuZGVkIGV1Y2xpZGVhbiBhbGdvcml0aG0gb2YgKGEsIGIpIHByb2R1Y2VzIAotICAgYSp1MSArIGIqdTIgPSB1MwotICovCi1pbnQgbXBfZXh0ZXVjbGlkKG1wX2ludCAqYSwgbXBfaW50ICpiLCBtcF9pbnQgKlUxLCBtcF9pbnQgKlUyLCBtcF9pbnQgKlUzKQotewotICAgbXBfaW50IHUxLHUyLHUzLHYxLHYyLHYzLHQxLHQyLHQzLHEsdG1wOwotICAgaW50IGVycjsKLQotICAgaWYgKChlcnIgPSBtcF9pbml0X211bHRpKCZ1MSwgJnUyLCAmdTMsICZ2MSwgJnYyLCAmdjMsICZ0MSwgJnQyLCAmdDMsICZxLCAmdG1wLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogaW5pdGlhbGl6ZSwgKHUxLHUyLHUzKSA9ICgxLDAsYSkgKi8KLSAgIG1wX3NldCgmdTEsIDEpOwotICAgaWYgKChlcnIgPSBtcF9jb3B5KGEsICZ1MykpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBfRVJSOyB9Ci0KLSAgIC8qIGluaXRpYWxpemUsICh2MSx2Mix2MykgPSAoMCwxLGIpICovCi0gICBtcF9zZXQoJnYyLCAxKTsKLSAgIGlmICgoZXJyID0gbXBfY29weShiLCAmdjMpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gX0VSUjsgfQotCi0gICAvKiBsb29wIHdoaWxlIHYzICE9IDAgKi8KLSAgIHdoaWxlIChtcF9pc3plcm8oJnYzKSA9PSBNUF9OTykgewotICAgICAgIC8qIHEgPSB1My92MyAqLwotICAgICAgIGlmICgoZXJyID0gbXBfZGl2KCZ1MywgJnYzLCAmcSwgTlVMTCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBfRVJSOyB9Ci0KLSAgICAgICAvKiAodDEsdDIsdDMpID0gKHUxLHUyLHUzKSAtICh2MSx2Mix2MylxICovCi0gICAgICAgaWYgKChlcnIgPSBtcF9tdWwoJnYxLCAmcSwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIF9FUlI7IH0KLSAgICAgICBpZiAoKGVyciA9IG1wX3N1YigmdTEsICZ0bXAsICZ0MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gX0VSUjsgfQotICAgICAgIGlmICgoZXJyID0gbXBfbXVsKCZ2MiwgJnEsICZ0bXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBfRVJSOyB9Ci0gICAgICAgaWYgKChlcnIgPSBtcF9zdWIoJnUyLCAmdG1wLCAmdDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIF9FUlI7IH0KLSAgICAgICBpZiAoKGVyciA9IG1wX211bCgmdjMsICZxLCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gX0VSUjsgfQotICAgICAgIGlmICgoZXJyID0gbXBfc3ViKCZ1MywgJnRtcCwgJnQzKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBfRVJSOyB9Ci0KLSAgICAgICAvKiAodTEsdTIsdTMpID0gKHYxLHYyLHYzKSAqLwotICAgICAgIGlmICgoZXJyID0gbXBfY29weSgmdjEsICZ1MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBfRVJSOyB9Ci0gICAgICAgaWYgKChlcnIgPSBtcF9jb3B5KCZ2MiwgJnUyKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIF9FUlI7IH0KLSAgICAgICBpZiAoKGVyciA9IG1wX2NvcHkoJnYzLCAmdTMpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gX0VSUjsgfQotCi0gICAgICAgLyogKHYxLHYyLHYzKSA9ICh0MSx0Mix0MykgKi8KLSAgICAgICBpZiAoKGVyciA9IG1wX2NvcHkoJnQxLCAmdjEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gX0VSUjsgfQotICAgICAgIGlmICgoZXJyID0gbXBfY29weSgmdDIsICZ2MikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBfRVJSOyB9Ci0gICAgICAgaWYgKChlcnIgPSBtcF9jb3B5KCZ0MywgJnYzKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIF9FUlI7IH0KLSAgIH0KLQotICAgLyogY29weSByZXN1bHQgb3V0ICovCi0gICBpZiAoVTEgIT0gTlVMTCkgeyBtcF9leGNoKFUxLCAmdTEpOyB9Ci0gICBpZiAoVTIgIT0gTlVMTCkgeyBtcF9leGNoKFUyLCAmdTIpOyB9Ci0gICBpZiAoVTMgIT0gTlVMTCkgeyBtcF9leGNoKFUzLCAmdTMpOyB9Ci0KLSAgIGVyciA9IE1QX09LQVk7Ci1fRVJSOiBtcF9jbGVhcl9tdWx0aSgmdTEsICZ1MiwgJnUzLCAmdjEsICZ2MiwgJnYzLCAmdDEsICZ0MiwgJnQzLCAmcSwgJnRtcCwgTlVMTCk7Ci0gICByZXR1cm4gZXJyOwotfQotCi0vKiBFbmQ6IGJuX21wX2V4dGV1Y2xpZC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9mcmVhZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiByZWFkIGEgYmlnaW50IGZyb20gYSBmaWxlIHN0cmVhbSBpbiBBU0NJSSAqLwotaW50IG1wX2ZyZWFkKG1wX2ludCAqYSwgaW50IHJhZGl4LCBGSUxFICpzdHJlYW0pCi17Ci0gICBpbnQgZXJyLCBjaCwgbmVnLCB5OwotICAgCi0gICAvKiBjbGVhciBhICovCi0gICBtcF96ZXJvKGEpOwotICAgCi0gICAvKiBpZiBmaXJzdCBkaWdpdCBpcyAtIHRoZW4gc2V0IG5lZ2F0aXZlICovCi0gICBjaCA9IGZnZXRjKHN0cmVhbSk7Ci0gICBpZiAoY2ggPT0gJy0nKSB7Ci0gICAgICBuZWcgPSBNUF9ORUc7Ci0gICAgICBjaCA9IGZnZXRjKHN0cmVhbSk7Ci0gICB9IGVsc2UgewotICAgICAgbmVnID0gTVBfWlBPUzsKLSAgIH0KLSAgIAotICAgZm9yICg7OykgewotICAgICAgLyogZmluZCB5IGluIHRoZSByYWRpeCBtYXAgKi8KLSAgICAgIGZvciAoeSA9IDA7IHkgPCByYWRpeDsgeSsrKSB7Ci0gICAgICAgICAgaWYgKG1wX3Nfcm1hcFt5XSA9PSBjaCkgewotICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICh5ID09IHJhZGl4KSB7Ci0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogc2hpZnQgdXAgYW5kIGFkZCAqLwotICAgICAgaWYgKChlcnIgPSBtcF9tdWxfZChhLCByYWRpeCwgYSkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICB9Ci0gICAgICBpZiAoKGVyciA9IG1wX2FkZF9kKGEsIHksIGEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICByZXR1cm4gZXJyOwotICAgICAgfQotICAgICAgCi0gICAgICBjaCA9IGZnZXRjKHN0cmVhbSk7Ci0gICB9Ci0gICBpZiAobXBfY21wX2QoYSwgMCkgIT0gTVBfRVEpIHsKLSAgICAgIGEtPnNpZ24gPSBuZWc7Ci0gICB9Ci0gICAKLSAgIHJldHVybiBNUF9PS0FZOwotfQotCi0KLS8qIEVuZDogYm5fbXBfZnJlYWQuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfZndyaXRlLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLWludCBtcF9md3JpdGUobXBfaW50ICphLCBpbnQgcmFkaXgsIEZJTEUgKnN0cmVhbSkKLXsKLSAgIGNoYXIgKmJ1ZjsKLSAgIGludCBlcnIsIGxlbiwgeDsKLSAgIAotICAgaWYgKChlcnIgPSBtcF9yYWRpeF9zaXplKGEsIHJhZGl4LCAmbGVuKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgYnVmID0gT1BUX0NBU1QoY2hhcikgWE1BTExPQyAobGVuKTsKLSAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE1QX01FTTsKLSAgIH0KLSAgIAotICAgaWYgKChlcnIgPSBtcF90b3JhZGl4KGEsIGJ1ZiwgcmFkaXgpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBYRlJFRSAoYnVmKTsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICAKLSAgIGZvciAoeCA9IDA7IHggPCBsZW47IHgrKykgewotICAgICAgIGlmIChmcHV0YyhidWZbeF0sIHN0cmVhbSkgPT0gRU9GKSB7Ci0gICAgICAgICAgWEZSRUUgKGJ1Zik7Ci0gICAgICAgICAgcmV0dXJuIE1QX1ZBTDsKLSAgICAgICB9Ci0gICB9Ci0gICAKLSAgIFhGUkVFIChidWYpOwotICAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLQotLyogRW5kOiBibl9tcF9md3JpdGUuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfZ2NkLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIEdyZWF0ZXN0IENvbW1vbiBEaXZpc29yIHVzaW5nIHRoZSBiaW5hcnkgbWV0aG9kICovCi1pbnQgbXBfZ2NkIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiLCBtcF9pbnQgKiBjKQotewotICBtcF9pbnQgIHUsIHY7Ci0gIGludCAgICAgaywgdV9sc2IsIHZfbHNiLCByZXM7Ci0KLSAgLyogZWl0aGVyIHplcm8gdGhhbiBnY2QgaXMgdGhlIGxhcmdlc3QgKi8KLSAgaWYgKG1wX2lzemVybyAoYSkgPT0gMSAmJiBtcF9pc3plcm8gKGIpID09IDApIHsKLSAgICByZXR1cm4gbXBfYWJzIChiLCBjKTsKLSAgfQotICBpZiAobXBfaXN6ZXJvIChhKSA9PSAwICYmIG1wX2lzemVybyAoYikgPT0gMSkgewotICAgIHJldHVybiBtcF9hYnMgKGEsIGMpOwotICB9Ci0KLSAgLyogb3B0aW1pemVkLiAgQXQgdGhpcyBwb2ludCBpZiBhID09IDAgdGhlbgotICAgKiBiIG11c3QgZXF1YWwgemVybyB0b28KLSAgICovCi0gIGlmIChtcF9pc3plcm8gKGEpID09IDEpIHsKLSAgICBtcF96ZXJvKGMpOwotICAgIHJldHVybiBNUF9PS0FZOwotICB9Ci0KLSAgLyogZ2V0IGNvcGllcyBvZiBhIGFuZCBiIHdlIGNhbiBtb2RpZnkgKi8KLSAgaWYgKChyZXMgPSBtcF9pbml0X2NvcHkgKCZ1LCBhKSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICBpZiAoKHJlcyA9IG1wX2luaXRfY29weSAoJnYsIGIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX1U7Ci0gIH0KLQotICAvKiBtdXN0IGJlIHBvc2l0aXZlIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBhbGdvcml0aG0gKi8KLSAgdS5zaWduID0gdi5zaWduID0gTVBfWlBPUzsKLQotICAvKiBCMS4gIEZpbmQgdGhlIGNvbW1vbiBwb3dlciBvZiB0d28gZm9yIHUgYW5kIHYgKi8KLSAgdV9sc2IgPSBtcF9jbnRfbHNiKCZ1KTsKLSAgdl9sc2IgPSBtcF9jbnRfbHNiKCZ2KTsKLSAgayAgICAgPSBNSU4odV9sc2IsIHZfbHNiKTsKLQotICBpZiAoayA+IDApIHsKLSAgICAgLyogZGl2aWRlIHRoZSBwb3dlciBvZiB0d28gb3V0ICovCi0gICAgIGlmICgocmVzID0gbXBfZGl2XzJkKCZ1LCBrLCAmdSwgTlVMTCkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBfX1Y7Ci0gICAgIH0KLQotICAgICBpZiAoKHJlcyA9IG1wX2Rpdl8yZCgmdiwgaywgJnYsIE5VTEwpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gX19WOwotICAgICB9Ci0gIH0KLQotICAvKiBkaXZpZGUgYW55IHJlbWFpbmluZyBmYWN0b3JzIG9mIHR3byBvdXQgKi8KLSAgaWYgKHVfbHNiICE9IGspIHsKLSAgICAgaWYgKChyZXMgPSBtcF9kaXZfMmQoJnUsIHVfbHNiIC0gaywgJnUsIE5VTEwpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gX19WOwotICAgICB9Ci0gIH0KLQotICBpZiAodl9sc2IgIT0gaykgewotICAgICBpZiAoKHJlcyA9IG1wX2Rpdl8yZCgmdiwgdl9sc2IgLSBrLCAmdiwgTlVMTCkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBfX1Y7Ci0gICAgIH0KLSAgfQotCi0gIHdoaWxlIChtcF9pc3plcm8oJnYpID09IDApIHsKLSAgICAgLyogbWFrZSBzdXJlIHYgaXMgdGhlIGxhcmdlc3QgKi8KLSAgICAgaWYgKG1wX2NtcF9tYWcoJnUsICZ2KSA9PSBNUF9HVCkgewotICAgICAgICAvKiBzd2FwIHUgYW5kIHYgdG8gbWFrZSBzdXJlIHYgaXMgPj0gdSAqLwotICAgICAgICBtcF9leGNoKCZ1LCAmdik7Ci0gICAgIH0KLSAgICAgCi0gICAgIC8qIHN1YnRyYWN0IHNtYWxsZXN0IGZyb20gbGFyZ2VzdCAqLwotICAgICBpZiAoKHJlcyA9IHNfbXBfc3ViKCZ2LCAmdSwgJnYpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gX19WOwotICAgICB9Ci0gICAgIAotICAgICAvKiBEaXZpZGUgb3V0IGFsbCBmYWN0b3JzIG9mIHR3byAqLwotICAgICBpZiAoKHJlcyA9IG1wX2Rpdl8yZCgmdiwgbXBfY250X2xzYigmdiksICZ2LCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fVjsKLSAgICAgfSAKLSAgfSAKLQotICAvKiBtdWx0aXBseSBieSAyKiprIHdoaWNoIHdlIGRpdmlkZWQgb3V0IGF0IHRoZSBiZWdpbm5pbmcgKi8KLSAgaWYgKChyZXMgPSBtcF9tdWxfMmQgKCZ1LCBrLCBjKSkgIT0gTVBfT0tBWSkgewotICAgICBnb3RvIF9fVjsKLSAgfQotICBjLT5zaWduID0gTVBfWlBPUzsKLSAgcmVzID0gTVBfT0tBWTsKLV9fVjptcF9jbGVhciAoJnUpOwotX19VOm1wX2NsZWFyICgmdik7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIEVuZDogYm5fbXBfZ2NkLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2dldF9pbnQuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogZ2V0IHRoZSBsb3dlciAzMi1iaXRzIG9mIGFuIG1wX2ludCAqLwotdW5zaWduZWQgbG9uZyBtcF9nZXRfaW50KG1wX2ludCAqIGEpIAotewotICBpbnQgaTsKLSAgdW5zaWduZWQgbG9uZyByZXM7Ci0KLSAgaWYgKGEtPnVzZWQgPT0gMCkgewotICAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIGdldCBudW1iZXIgb2YgZGlnaXRzIG9mIHRoZSBsc2Igd2UgaGF2ZSB0byByZWFkICovCi0gIGkgPSBNSU4oYS0+dXNlZCwoaW50KSgoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKkNIQVJfQklUK0RJR0lUX0JJVC0xKS9ESUdJVF9CSVQpKS0xOwotCi0gIC8qIGdldCBtb3N0IHNpZ25pZmljYW50IGRpZ2l0IG9mIHJlc3VsdCAqLwotICByZXMgPSBESUdJVChhLGkpOwotICAgCi0gIHdoaWxlICgtLWkgPj0gMCkgewotICAgIHJlcyA9IChyZXMgPDwgRElHSVRfQklUKSB8IERJR0lUKGEsaSk7Ci0gIH0KLQotICAvKiBmb3JjZSByZXN1bHQgdG8gMzItYml0cyBhbHdheXMgc28gaXQgaXMgY29uc2lzdGVudCBvbiBub24gMzItYml0IHBsYXRmb3JtcyAqLwotICByZXR1cm4gcmVzICYgMHhGRkZGRkZGRlVMOwotfQotCi0vKiBFbmQ6IGJuX21wX2dldF9pbnQuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfZ3Jvdy5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBncm93IGFzIHJlcXVpcmVkICovCi1pbnQgbXBfZ3JvdyAobXBfaW50ICogYSwgaW50IHNpemUpCi17Ci0gIGludCAgICAgaTsKLSAgbXBfZGlnaXQgKnRtcDsKLQotICAvKiBpZiB0aGUgYWxsb2Mgc2l6ZSBpcyBzbWFsbGVyIGFsbG9jIG1vcmUgcmFtICovCi0gIGlmIChhLT5hbGxvYyA8IHNpemUpIHsKLSAgICAvKiBlbnN1cmUgdGhlcmUgYXJlIGFsd2F5cyBhdCBsZWFzdCBNUF9QUkVDIGRpZ2l0cyBleHRyYSBvbiB0b3AgKi8KLSAgICBzaXplICs9IChNUF9QUkVDICogMikgLSAoc2l6ZSAlIE1QX1BSRUMpOwotCi0gICAgLyogcmVhbGxvY2F0ZSB0aGUgYXJyYXkgYS0+ZHAKLSAgICAgKgotICAgICAqIFdlIHN0b3JlIHRoZSByZXR1cm4gaW4gYSB0ZW1wb3JhcnkgdmFyaWFibGUKLSAgICAgKiBpbiBjYXNlIHRoZSBvcGVyYXRpb24gZmFpbGVkIHdlIGRvbid0IHdhbnQKLSAgICAgKiB0byBvdmVyd3JpdGUgdGhlIGRwIG1lbWJlciBvZiBhLgotICAgICAqLwotICAgIHRtcCA9IE9QVF9DQVNUKG1wX2RpZ2l0KSBYUkVBTExPQyAoYS0+ZHAsIHNpemVvZiAobXBfZGlnaXQpICogc2l6ZSk7Ci0gICAgaWYgKHRtcCA9PSBOVUxMKSB7Ci0gICAgICAvKiByZWFsbG9jYXRpb24gZmFpbGVkIGJ1dCAiYSIgaXMgc3RpbGwgdmFsaWQgW2NhbiBiZSBmcmVlZF0gKi8KLSAgICAgIHJldHVybiBNUF9NRU07Ci0gICAgfQotCi0gICAgLyogcmVhbGxvY2F0aW9uIHN1Y2NlZWRlZCBzbyBzZXQgYS0+ZHAgKi8KLSAgICBhLT5kcCA9IHRtcDsKLQotICAgIC8qIHplcm8gZXhjZXNzIGRpZ2l0cyAqLwotICAgIGkgICAgICAgID0gYS0+YWxsb2M7Ci0gICAgYS0+YWxsb2MgPSBzaXplOwotICAgIGZvciAoOyBpIDwgYS0+YWxsb2M7IGkrKykgewotICAgICAgYS0+ZHBbaV0gPSAwOwotICAgIH0KLSAgfQotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9tcF9ncm93LmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2luaXQuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogaW5pdCBhIG5ldyBiaWdpbnQgKi8KLWludCBtcF9pbml0IChtcF9pbnQgKiBhKQotewotICAvKiBhbGxvY2F0ZSBtZW1vcnkgcmVxdWlyZWQgYW5kIGNsZWFyIGl0ICovCi0gIGEtPmRwID0gT1BUX0NBU1QobXBfZGlnaXQpIFhDQUxMT0MgKHNpemVvZiAobXBfZGlnaXQpLCBNUF9QUkVDKTsKLSAgaWYgKGEtPmRwID09IE5VTEwpIHsKLSAgICByZXR1cm4gTVBfTUVNOwotICB9Ci0KLSAgLyogc2V0IHRoZSB1c2VkIHRvIHplcm8sIGFsbG9jYXRlZCBkaWdpdHMgdG8gdGhlIGRlZmF1bHQgcHJlY2lzaW9uCi0gICAqIGFuZCBzaWduIHRvIHBvc2l0aXZlICovCi0gIGEtPnVzZWQgID0gMDsKLSAgYS0+YWxsb2MgPSBNUF9QUkVDOwotICBhLT5zaWduICA9IE1QX1pQT1M7Ci0KLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfaW5pdC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9pbml0X2NvcHkuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogY3JlYXRlcyAiYSIgdGhlbiBjb3BpZXMgYiBpbnRvIGl0ICovCi1pbnQgbXBfaW5pdF9jb3B5IChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiKQotewotICBpbnQgICAgIHJlczsKLQotICBpZiAoKHJlcyA9IG1wX2luaXQgKGEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotICByZXR1cm4gbXBfY29weSAoYiwgYSk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfaW5pdF9jb3B5LmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2luaXRfbXVsdGkuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotaW50IG1wX2luaXRfbXVsdGkobXBfaW50ICptcCwgLi4uKSAKLXsKLSAgICBtcF9lcnIgcmVzID0gTVBfT0tBWTsgICAgICAvKiBBc3N1bWUgb2sgdW50aWwgcHJvdmVuIG90aGVyd2lzZSAqLwotICAgIGludCBuID0gMDsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBvayBpbml0cyAqLwotICAgIG1wX2ludCogY3VyX2FyZyA9IG1wOwotICAgIHZhX2xpc3QgYXJnczsKLQotICAgIHZhX3N0YXJ0KGFyZ3MsIG1wKTsgICAgICAgIC8qIGluaXQgYXJncyB0byBuZXh0IGFyZ3VtZW50IGZyb20gY2FsbGVyICovCi0gICAgd2hpbGUgKGN1cl9hcmcgIT0gTlVMTCkgewotICAgICAgICBpZiAobXBfaW5pdChjdXJfYXJnKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICAgICAvKiBPb3BzIC0gZXJyb3IhIEJhY2stdHJhY2sgYW5kIG1wX2NsZWFyIHdoYXQgd2UgYWxyZWFkeQotICAgICAgICAgICAgICAgc3VjY2VlZGVkIGluIGluaXQtaW5nLCB0aGVuIHJldHVybiBlcnJvci4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICB2YV9saXN0IGNsZWFuX2FyZ3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIGVuZCB0aGUgY3VycmVudCBsaXN0ICovCi0gICAgICAgICAgICB2YV9lbmQoYXJncyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qIG5vdyBzdGFydCBjbGVhbmluZyB1cCAqLyAgICAgICAgICAgIAotICAgICAgICAgICAgY3VyX2FyZyA9IG1wOwotICAgICAgICAgICAgdmFfc3RhcnQoY2xlYW5fYXJncywgbXApOwotICAgICAgICAgICAgd2hpbGUgKG4tLSkgewotICAgICAgICAgICAgICAgIG1wX2NsZWFyKGN1cl9hcmcpOwotICAgICAgICAgICAgICAgIGN1cl9hcmcgPSB2YV9hcmcoY2xlYW5fYXJncywgbXBfaW50Kik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YV9lbmQoY2xlYW5fYXJncyk7Ci0gICAgICAgICAgICByZXMgPSBNUF9NRU07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBuKys7Ci0gICAgICAgIGN1cl9hcmcgPSB2YV9hcmcoYXJncywgbXBfaW50Kik7Ci0gICAgfQotICAgIHZhX2VuZChhcmdzKTsKLSAgICByZXR1cm4gcmVzOyAgICAgICAgICAgICAgICAvKiBBc3N1bWVkIG9rLCBpZiBlcnJvciBmbGFnZ2VkIGFib3ZlLiAqLwotfQotCi0KLS8qIEVuZDogYm5fbXBfaW5pdF9tdWx0aS5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9pbml0X3NldC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBpbml0aWFsaXplIGFuZCBzZXQgYSBkaWdpdCAqLwotaW50IG1wX2luaXRfc2V0IChtcF9pbnQgKiBhLCBtcF9kaWdpdCBiKQotewotICBpbnQgZXJyOwotICBpZiAoKGVyciA9IG1wX2luaXQoYSkpICE9IE1QX09LQVkpIHsKLSAgICAgcmV0dXJuIGVycjsKLSAgfQotICBtcF9zZXQoYSwgYik7Ci0gIHJldHVybiBlcnI7Ci19Ci0KLS8qIEVuZDogYm5fbXBfaW5pdF9zZXQuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfaW5pdF9zZXRfaW50LmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGluaXRpYWxpemUgYW5kIHNldCBhIGRpZ2l0ICovCi1pbnQgbXBfaW5pdF9zZXRfaW50IChtcF9pbnQgKiBhLCB1bnNpZ25lZCBsb25nIGIpCi17Ci0gIGludCBlcnI7Ci0gIGlmICgoZXJyID0gbXBfaW5pdChhKSkgIT0gTVBfT0tBWSkgewotICAgICByZXR1cm4gZXJyOwotICB9Ci0gIHJldHVybiBtcF9zZXRfaW50KGEsIGIpOwotfQotCi0vKiBFbmQ6IGJuX21wX2luaXRfc2V0X2ludC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9pbml0X3NpemUuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogaW5pdCBhbiBtcF9pbml0IGZvciBhIGdpdmVuIHNpemUgKi8KLWludCBtcF9pbml0X3NpemUgKG1wX2ludCAqIGEsIGludCBzaXplKQotewotICAvKiBwYWQgc2l6ZSBzbyB0aGVyZSBhcmUgYWx3YXlzIGV4dHJhIGRpZ2l0cyAqLwotICBzaXplICs9IChNUF9QUkVDICogMikgLSAoc2l6ZSAlIE1QX1BSRUMpOwkKLSAgCi0gIC8qIGFsbG9jIG1lbSAqLwotICBhLT5kcCA9IE9QVF9DQVNUKG1wX2RpZ2l0KSBYQ0FMTE9DIChzaXplb2YgKG1wX2RpZ2l0KSwgc2l6ZSk7Ci0gIGlmIChhLT5kcCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE1QX01FTTsKLSAgfQotICBhLT51c2VkICA9IDA7Ci0gIGEtPmFsbG9jID0gc2l6ZTsKLSAgYS0+c2lnbiAgPSBNUF9aUE9TOwotCi0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX2luaXRfc2l6ZS5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9pbnZtb2QuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogaGFjIDE0LjYxLCBwcDYwOCAqLwotaW50IG1wX2ludm1vZCAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYykKLXsKLSAgbXBfaW50ICB4LCB5LCB1LCB2LCBBLCBCLCBDLCBEOwotICBpbnQgICAgIHJlczsKLQotICAvKiBiIGNhbm5vdCBiZSBuZWdhdGl2ZSAqLwotICBpZiAoYi0+c2lnbiA9PSBNUF9ORUcgfHwgbXBfaXN6ZXJvKGIpID09IDEpIHsKLSAgICByZXR1cm4gTVBfVkFMOwotICB9Ci0KLSAgLyogaWYgdGhlIG1vZHVsdXMgaXMgb2RkIHdlIGNhbiB1c2UgYSBmYXN0ZXIgcm91dGluZSBpbnN0ZWFkICovCi0gIGlmIChtcF9pc29kZCAoYikgPT0gMSkgewotICAgIHJldHVybiBmYXN0X21wX2ludm1vZCAoYSwgYiwgYyk7Ci0gIH0KLSAgCi0gIC8qIGluaXQgdGVtcHMgKi8KLSAgaWYgKChyZXMgPSBtcF9pbml0X211bHRpKCZ4LCAmeSwgJnUsICZ2LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZBLCAmQiwgJkMsICZELCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgLyogeCA9IGEsIHkgPSBiICovCi0gIGlmICgocmVzID0gbXBfY29weSAoYSwgJngpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX0VSUjsKLSAgfQotICBpZiAoKHJlcyA9IG1wX2NvcHkgKGIsICZ5KSkgIT0gTVBfT0tBWSkgewotICAgIGdvdG8gX19FUlI7Ci0gIH0KLQotICAvKiAyLiBbbW9kaWZpZWRdIGlmIHgseSBhcmUgYm90aCBldmVuIHRoZW4gcmV0dXJuIGFuIGVycm9yISAqLwotICBpZiAobXBfaXNldmVuICgmeCkgPT0gMSAmJiBtcF9pc2V2ZW4gKCZ5KSA9PSAxKSB7Ci0gICAgcmVzID0gTVBfVkFMOwotICAgIGdvdG8gX19FUlI7Ci0gIH0KLQotICAvKiAzLiB1PXgsIHY9eSwgQT0xLCBCPTAsIEM9MCxEPTEgKi8KLSAgaWYgKChyZXMgPSBtcF9jb3B5ICgmeCwgJnUpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX0VSUjsKLSAgfQotICBpZiAoKHJlcyA9IG1wX2NvcHkgKCZ5LCAmdikpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIF9fRVJSOwotICB9Ci0gIG1wX3NldCAoJkEsIDEpOwotICBtcF9zZXQgKCZELCAxKTsKLQotdG9wOgotICAvKiA0LiAgd2hpbGUgdSBpcyBldmVuIGRvICovCi0gIHdoaWxlIChtcF9pc2V2ZW4gKCZ1KSA9PSAxKSB7Ci0gICAgLyogNC4xIHUgPSB1LzIgKi8KLSAgICBpZiAoKHJlcyA9IG1wX2Rpdl8yICgmdSwgJnUpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fRVJSOwotICAgIH0KLSAgICAvKiA0LjIgaWYgQSBvciBCIGlzIG9kZCB0aGVuICovCi0gICAgaWYgKG1wX2lzb2RkICgmQSkgPT0gMSB8fCBtcF9pc29kZCAoJkIpID09IDEpIHsKLSAgICAgIC8qIEEgPSAoQSt5KS8yLCBCID0gKEIteCkvMiAqLwotICAgICAgaWYgKChyZXMgPSBtcF9hZGQgKCZBLCAmeSwgJkEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICBnb3RvIF9fRVJSOwotICAgICAgfQotICAgICAgaWYgKChyZXMgPSBtcF9zdWIgKCZCLCAmeCwgJkIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICBnb3RvIF9fRVJSOwotICAgICAgfQotICAgIH0KLSAgICAvKiBBID0gQS8yLCBCID0gQi8yICovCi0gICAgaWYgKChyZXMgPSBtcF9kaXZfMiAoJkEsICZBKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX0VSUjsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9kaXZfMiAoJkIsICZCKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX0VSUjsKLSAgICB9Ci0gIH0KLQotICAvKiA1LiAgd2hpbGUgdiBpcyBldmVuIGRvICovCi0gIHdoaWxlIChtcF9pc2V2ZW4gKCZ2KSA9PSAxKSB7Ci0gICAgLyogNS4xIHYgPSB2LzIgKi8KLSAgICBpZiAoKHJlcyA9IG1wX2Rpdl8yICgmdiwgJnYpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fRVJSOwotICAgIH0KLSAgICAvKiA1LjIgaWYgQyBvciBEIGlzIG9kZCB0aGVuICovCi0gICAgaWYgKG1wX2lzb2RkICgmQykgPT0gMSB8fCBtcF9pc29kZCAoJkQpID09IDEpIHsKLSAgICAgIC8qIEMgPSAoQyt5KS8yLCBEID0gKEQteCkvMiAqLwotICAgICAgaWYgKChyZXMgPSBtcF9hZGQgKCZDLCAmeSwgJkMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICBnb3RvIF9fRVJSOwotICAgICAgfQotICAgICAgaWYgKChyZXMgPSBtcF9zdWIgKCZELCAmeCwgJkQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICBnb3RvIF9fRVJSOwotICAgICAgfQotICAgIH0KLSAgICAvKiBDID0gQy8yLCBEID0gRC8yICovCi0gICAgaWYgKChyZXMgPSBtcF9kaXZfMiAoJkMsICZDKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX0VSUjsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9kaXZfMiAoJkQsICZEKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX0VSUjsKLSAgICB9Ci0gIH0KLQotICAvKiA2LiAgaWYgdSA+PSB2IHRoZW4gKi8KLSAgaWYgKG1wX2NtcCAoJnUsICZ2KSAhPSBNUF9MVCkgewotICAgIC8qIHUgPSB1IC0gdiwgQSA9IEEgLSBDLCBCID0gQiAtIEQgKi8KLSAgICBpZiAoKHJlcyA9IG1wX3N1YiAoJnUsICZ2LCAmdSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19FUlI7Ci0gICAgfQotCi0gICAgaWYgKChyZXMgPSBtcF9zdWIgKCZBLCAmQywgJkEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fRVJSOwotICAgIH0KLQotICAgIGlmICgocmVzID0gbXBfc3ViICgmQiwgJkQsICZCKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX0VSUjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogdiAtIHYgLSB1LCBDID0gQyAtIEEsIEQgPSBEIC0gQiAqLwotICAgIGlmICgocmVzID0gbXBfc3ViICgmdiwgJnUsICZ2KSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX0VSUjsKLSAgICB9Ci0KLSAgICBpZiAoKHJlcyA9IG1wX3N1YiAoJkMsICZBLCAmQykpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19FUlI7Ci0gICAgfQotCi0gICAgaWYgKChyZXMgPSBtcF9zdWIgKCZELCAmQiwgJkQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fRVJSOwotICAgIH0KLSAgfQotCi0gIC8qIGlmIG5vdCB6ZXJvIGdvdG8gc3RlcCA0ICovCi0gIGlmIChtcF9pc3plcm8gKCZ1KSA9PSAwKQotICAgIGdvdG8gdG9wOwotCi0gIC8qIG5vdyBhID0gQywgYiA9IEQsIGdjZCA9PSBnKnYgKi8KLQotICAvKiBpZiB2ICE9IDEgdGhlbiB0aGVyZSBpcyBubyBpbnZlcnNlICovCi0gIGlmIChtcF9jbXBfZCAoJnYsIDEpICE9IE1QX0VRKSB7Ci0gICAgcmVzID0gTVBfVkFMOwotICAgIGdvdG8gX19FUlI7Ci0gIH0KLQotICAvKiBpZiBpdHMgdG9vIGxvdyAqLwotICB3aGlsZSAobXBfY21wX2QoJkMsIDApID09IE1QX0xUKSB7Ci0gICAgICBpZiAoKHJlcyA9IG1wX2FkZCgmQywgYiwgJkMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICBnb3RvIF9fRVJSOwotICAgICAgfQotICB9Ci0gIAotICAvKiB0b28gYmlnICovCi0gIHdoaWxlIChtcF9jbXBfbWFnKCZDLCBiKSAhPSBNUF9MVCkgewotICAgICAgaWYgKChyZXMgPSBtcF9zdWIoJkMsIGIsICZDKSkgIT0gTVBfT0tBWSkgewotICAgICAgICAgZ290byBfX0VSUjsKLSAgICAgIH0KLSAgfQotICAKLSAgLyogQyBpcyBub3cgdGhlIGludmVyc2UgKi8KLSAgbXBfZXhjaCAoJkMsIGMpOwotICByZXMgPSBNUF9PS0FZOwotX19FUlI6bXBfY2xlYXJfbXVsdGkgKCZ4LCAmeSwgJnUsICZ2LCAmQSwgJkIsICZDLCAmRCwgTlVMTCk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIEVuZDogYm5fbXBfaW52bW9kLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2lzX3NxdWFyZS5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBDaGVjayBpZiByZW1haW5kZXJzIGFyZSBwb3NzaWJsZSBzcXVhcmVzIC0gZmFzdCBleGNsdWRlIG5vbi1zcXVhcmVzICovCi1zdGF0aWMgY29uc3QgY2hhciByZW1fMTI4WzEyOF0gPSB7Ci0gMCwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwKLSAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAxLAotIDEsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsCi0gMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwKLSAwLCAwLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAxLAotIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsCi0gMSwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwKLSAxLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAxCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciByZW1fMTA1WzEwNV0gPSB7Ci0gMCwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwKLSAwLCAwLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLAotIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsCi0gMSwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAwLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAxLCAxLCAxLAotIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEsCi0gMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMSwgMSwgMSwgMQotfTsKLQotLyogU3RvcmUgbm9uLXplcm8gdG8gcmV0IGlmIGFyZyBpcyBzcXVhcmUsIGFuZCB6ZXJvIGlmIG5vdCAqLwotaW50IG1wX2lzX3NxdWFyZShtcF9pbnQgKmFyZyxpbnQgKnJldCkgCi17Ci0gIGludCAgICAgICAgICAgcmVzOwotICBtcF9kaWdpdCAgICAgIGM7Ci0gIG1wX2ludCAgICAgICAgdDsKLSAgdW5zaWduZWQgbG9uZyByOwotCi0gIC8qIERlZmF1bHQgdG8gTm9uLXNxdWFyZSA6KSAqLwotICAqcmV0ID0gTVBfTk87IAotCi0gIGlmIChhcmctPnNpZ24gPT0gTVBfTkVHKSB7Ci0gICAgcmV0dXJuIE1QX1ZBTDsKLSAgfQotCi0gIC8qIGRpZ2l0cyB1c2VkPyAgKFRTRCkgKi8KLSAgaWYgKGFyZy0+dXNlZCA9PSAwKSB7Ci0gICAgIHJldHVybiBNUF9PS0FZOwotICB9Ci0KLSAgLyogRmlyc3QgY2hlY2sgbW9kIDEyOCAoc3VwcG9zZSB0aGF0IERJR0lUX0JJVCBpcyBhdCBsZWFzdCA3KSAqLwotICBpZiAocmVtXzEyOFsxMjcgJiBESUdJVChhcmcsMCldID09IDEpIHsKLSAgICAgcmV0dXJuIE1QX09LQVk7Ci0gIH0KLQotICAvKiBOZXh0IGNoZWNrIG1vZCAxMDUgKDMqNSo3KSAqLwotICBpZiAoKHJlcyA9IG1wX21vZF9kKGFyZywxMDUsJmMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgIHJldHVybiByZXM7Ci0gIH0KLSAgaWYgKHJlbV8xMDVbY10gPT0gMSkgewotICAgICByZXR1cm4gTVBfT0tBWTsKLSAgfQotCi0gIC8qIHByb2R1Y3Qgb2YgcHJpbWVzIGxlc3MgdGhhbiAyXjMxICovCi0gIGlmICgocmVzID0gbXBfaW5pdF9zZXRfaW50KCZ0LDExTCoxM0wqMTdMKjE5TCoyM0wqMjlMKjMxTCkpICE9IE1QX09LQVkpIHsKLSAgICAgcmV0dXJuIHJlczsKLSAgfQotICBpZiAoKHJlcyA9IG1wX21vZChhcmcsJnQsJnQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgIGdvdG8gRVJSOwotICB9Ci0gIHIgPSBtcF9nZXRfaW50KCZ0KTsKLSAgLyogQ2hlY2sgZm9yIG90aGVyIHByaW1lIG1vZHVsZXMsIG5vdGUgaXQncyBub3QgYW4gRVJST1IgYnV0IHdlIG11c3QKLSAgICogZnJlZSAidCIgc28gdGhlIGVhc2llc3Qgd2F5IGlzIHRvIGdvdG8gRVJSLiAgV2Uga25vdyB0aGF0IHJlcwotICAgKiBpcyBhbHJlYWR5IGVxdWFsIHRvIE1QX09LQVkgZnJvbSB0aGUgbXBfbW9kIGNhbGwgCi0gICAqLyAKLSAgaWYgKCAoMUw8PChyJTExKSkgJiAweDVDNEwgKSAgICAgICAgICAgICBnb3RvIEVSUjsKLSAgaWYgKCAoMUw8PChyJTEzKSkgJiAweDlFNEwgKSAgICAgICAgICAgICBnb3RvIEVSUjsKLSAgaWYgKCAoMUw8PChyJTE3KSkgJiAweDVDRThMICkgICAgICAgICAgICBnb3RvIEVSUjsKLSAgaWYgKCAoMUw8PChyJTE5KSkgJiAweDRGNTBDTCApICAgICAgICAgICBnb3RvIEVSUjsKLSAgaWYgKCAoMUw8PChyJTIzKSkgJiAweDdBQ0NBMEwgKSAgICAgICAgICBnb3RvIEVSUjsKLSAgaWYgKCAoMUw8PChyJTI5KSkgJiAweEMyRUREMENMICkgICAgICAgICBnb3RvIEVSUjsKLSAgaWYgKCAoMUw8PChyJTMxKSkgJiAweDZERTJCODQ4TCApICAgICAgICBnb3RvIEVSUjsKLQotICAvKiBGaW5hbCBjaGVjayAtIGlzIHNxcihzcXJ0KGFyZykpID09IGFyZyA/ICovCi0gIGlmICgocmVzID0gbXBfc3FydChhcmcsJnQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgIGdvdG8gRVJSOwotICB9Ci0gIGlmICgocmVzID0gbXBfc3FyKCZ0LCZ0KSkgIT0gTVBfT0tBWSkgewotICAgICBnb3RvIEVSUjsKLSAgfQotCi0gICpyZXQgPSAobXBfY21wX21hZygmdCxhcmcpID09IE1QX0VRKSA/IE1QX1lFUyA6IE1QX05POwotRVJSOm1wX2NsZWFyKCZ0KTsKLSAgcmV0dXJuIHJlczsKLX0KLQotLyogRW5kOiBibl9tcF9pc19zcXVhcmUuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfamFjb2JpLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGNvbXB1dGVzIHRoZSBqYWNvYmkgYyA9IChhIHwgbikgKG9yIExlZ2VuZHJlIGlmIG4gaXMgcHJpbWUpCi0gKiBIQUMgcHAuIDczIEFsZ29yaXRobSAyLjE0OQotICovCi1pbnQgbXBfamFjb2JpIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBwLCBpbnQgKmMpCi17Ci0gIG1wX2ludCAgYTEsIHAxOwotICBpbnQgICAgIGssIHMsIHIsIHJlczsKLSAgbXBfZGlnaXQgcmVzaWR1ZTsKLQotICAvKiBpZiBwIDw9IDAgcmV0dXJuIE1QX1ZBTCAqLwotICBpZiAobXBfY21wX2QocCwgMCkgIT0gTVBfR1QpIHsKLSAgICAgcmV0dXJuIE1QX1ZBTDsKLSAgfQotCi0gIC8qIHN0ZXAgMS4gIGlmIGEgPT0gMCwgcmV0dXJuIDAgKi8KLSAgaWYgKG1wX2lzemVybyAoYSkgPT0gMSkgewotICAgICpjID0gMDsKLSAgICByZXR1cm4gTVBfT0tBWTsKLSAgfQotCi0gIC8qIHN0ZXAgMi4gIGlmIGEgPT0gMSwgcmV0dXJuIDEgKi8KLSAgaWYgKG1wX2NtcF9kIChhLCAxKSA9PSBNUF9FUSkgewotICAgICpjID0gMTsKLSAgICByZXR1cm4gTVBfT0tBWTsKLSAgfQotCi0gIC8qIGRlZmF1bHQgKi8KLSAgcyA9IDA7Ci0KLSAgLyogc3RlcCAzLiAgd3JpdGUgYSA9IGExICogMioqayAgKi8KLSAgaWYgKChyZXMgPSBtcF9pbml0X2NvcHkgKCZhMSwgYSkpICE9IE1QX09LQVkpIHsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgaWYgKChyZXMgPSBtcF9pbml0ICgmcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX0ExOwotICB9Ci0KLSAgLyogZGl2aWRlIG91dCBsYXJnZXIgcG93ZXIgb2YgdHdvICovCi0gIGsgPSBtcF9jbnRfbHNiKCZhMSk7Ci0gIGlmICgocmVzID0gbXBfZGl2XzJkKCZhMSwgaywgJmExLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICBnb3RvIF9fUDE7Ci0gIH0KLQotICAvKiBzdGVwIDQuICBpZiBlIGlzIGV2ZW4gc2V0IHM9MSAqLwotICBpZiAoKGsgJiAxKSA9PSAwKSB7Ci0gICAgcyA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgLyogZWxzZSBzZXQgcz0xIGlmIHAgPSAxLzcgKG1vZCA4KSBvciBzPS0xIGlmIHAgPSAzLzUgKG1vZCA4KSAqLwotICAgIHJlc2lkdWUgPSBwLT5kcFswXSAmIDc7Ci0KLSAgICBpZiAocmVzaWR1ZSA9PSAxIHx8IHJlc2lkdWUgPT0gNykgewotICAgICAgcyA9IDE7Ci0gICAgfSBlbHNlIGlmIChyZXNpZHVlID09IDMgfHwgcmVzaWR1ZSA9PSA1KSB7Ci0gICAgICBzID0gLTE7Ci0gICAgfQotICB9Ci0KLSAgLyogc3RlcCA1LiAgaWYgcCA9PSAzIChtb2QgNCkgKmFuZCogYTEgPT0gMyAobW9kIDQpIHRoZW4gcyA9IC1zICovCi0gIGlmICggKChwLT5kcFswXSAmIDMpID09IDMpICYmICgoYTEuZHBbMF0gJiAzKSA9PSAzKSkgewotICAgIHMgPSAtczsKLSAgfQotCi0gIC8qIGlmIGExID09IDEgd2UncmUgZG9uZSAqLwotICBpZiAobXBfY21wX2QgKCZhMSwgMSkgPT0gTVBfRVEpIHsKLSAgICAqYyA9IHM7Ci0gIH0gZWxzZSB7Ci0gICAgLyogbjEgPSBuIG1vZCBhMSAqLwotICAgIGlmICgocmVzID0gbXBfbW9kIChwLCAmYTEsICZwMSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19QMTsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9qYWNvYmkgKCZwMSwgJmExLCAmcikpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19QMTsKLSAgICB9Ci0gICAgKmMgPSBzICogcjsKLSAgfQotCi0gIC8qIGRvbmUgKi8KLSAgcmVzID0gTVBfT0tBWTsKLV9fUDE6bXBfY2xlYXIgKCZwMSk7Ci1fX0ExOm1wX2NsZWFyICgmYTEpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiBFbmQ6IGJuX21wX2phY29iaS5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9rYXJhdHN1YmFfbXVsLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGMgPSB8YXwgKiB8YnwgdXNpbmcgS2FyYXRzdWJhIE11bHRpcGxpY2F0aW9uIHVzaW5nIAotICogdGhyZWUgaGFsZiBzaXplIG11bHRpcGxpY2F0aW9ucwotICoKLSAqIExldCBCIHJlcHJlc2VudCB0aGUgcmFkaXggW2UuZy4gMioqRElHSVRfQklUXSBhbmQgCi0gKiBsZXQgbiByZXByZXNlbnQgaGFsZiBvZiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpbiAKLSAqIHRoZSBtaW4oYSxiKQotICoKLSAqIGEgPSBhMSAqIEIqKm4gKyBhMAotICogYiA9IGIxICogQioqbiArIGIwCi0gKgotICogVGhlbiwgYSAqIGIgPT4gCi0gICBhMWIxICogQioqMm4gKyAoKGExIC0gYTApKGIxIC0gYjApICsgYTBiMCArIGExYjEpICogQiArIGEwYjAKLSAqCi0gKiBOb3RlIHRoYXQgYTFiMSBhbmQgYTBiMCBhcmUgdXNlZCB0d2ljZSBhbmQgb25seSBuZWVkIHRvIGJlIAotICogY29tcHV0ZWQgb25jZS4gIFNvIGluIHRvdGFsIHRocmVlIGhhbGYgc2l6ZSAoaGFsZiAjIG9mIAotICogZGlnaXQpIG11bHRpcGxpY2F0aW9ucyBhcmUgcGVyZm9ybWVkLCBhMGIwLCBhMWIxIGFuZCAKLSAqIChhMS1iMSkoYTAtYjApCi0gKgotICogTm90ZSB0aGF0IGEgbXVsdGlwbGljYXRpb24gb2YgaGFsZiB0aGUgZGlnaXRzIHJlcXVpcmVzCi0gKiAxLzR0aCB0aGUgbnVtYmVyIG9mIHNpbmdsZSBwcmVjaXNpb24gbXVsdGlwbGljYXRpb25zIHNvIGluIAotICogdG90YWwgYWZ0ZXIgb25lIGNhbGwgMjUlIG9mIHRoZSBzaW5nbGUgcHJlY2lzaW9uIG11bHRpcGxpY2F0aW9ucyAKLSAqIGFyZSBzYXZlZC4gIE5vdGUgYWxzbyB0aGF0IHRoZSBjYWxsIHRvIG1wX211bCBjYW4gZW5kIHVwIGJhY2sgCi0gKiBpbiB0aGlzIGZ1bmN0aW9uIGlmIHRoZSBhMCwgYTEsIGIwLCBvciBiMSBhcmUgYWJvdmUgdGhlIHRocmVzaG9sZC4gIAotICogVGhpcyBpcyBrbm93biBhcyBkaXZpZGUtYW5kLWNvbnF1ZXIgYW5kIGxlYWRzIHRvIHRoZSBmYW1vdXMgCi0gKiBPKE4qKmxnKDMpKSBvciBPKE4qKjEuNTg0KSB3b3JrIHdoaWNoIGlzIGFzeW1wdG9waWNhbGx5IGxvd2VyIHRoYW4gCi0gKiB0aGUgc3RhbmRhcmQgTyhOKioyKSB0aGF0IHRoZSBiYXNlbGluZS9jb21iYSBtZXRob2RzIHVzZS4gIAotICogR2VuZXJhbGx5IHRob3VnaCB0aGUgb3ZlcmhlYWQgb2YgdGhpcyBtZXRob2QgZG9lc24ndCBwYXkgb2ZmIAotICogdW50aWwgYSBjZXJ0YWluIHNpemUgKE4gfiA4MCkgaXMgcmVhY2hlZC4KLSAqLwotaW50IG1wX2thcmF0c3ViYV9tdWwgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMpCi17Ci0gIG1wX2ludCAgeDAsIHgxLCB5MCwgeTEsIHQxLCB4MHkwLCB4MXkxOwotICBpbnQgICAgIEIsIGVycjsKLQotICAvKiBkZWZhdWx0IHRoZSByZXR1cm4gY29kZSB0byBhbiBlcnJvciAqLwotICBlcnIgPSBNUF9NRU07Ci0KLSAgLyogbWluICMgb2YgZGlnaXRzICovCi0gIEIgPSBNSU4gKGEtPnVzZWQsIGItPnVzZWQpOwotCi0gIC8qIG5vdyBkaXZpZGUgaW4gdHdvICovCi0gIEIgPSBCID4+IDE7Ci0KLSAgLyogaW5pdCBjb3B5IGFsbCB0aGUgdGVtcHMgKi8KLSAgaWYgKG1wX2luaXRfc2l6ZSAoJngwLCBCKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gRVJSOwotICBpZiAobXBfaW5pdF9zaXplICgmeDEsIGEtPnVzZWQgLSBCKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWDA7Ci0gIGlmIChtcF9pbml0X3NpemUgKCZ5MCwgQikgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgxOwotICBpZiAobXBfaW5pdF9zaXplICgmeTEsIGItPnVzZWQgLSBCKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWTA7Ci0KLSAgLyogaW5pdCB0ZW1wcyAqLwotICBpZiAobXBfaW5pdF9zaXplICgmdDEsIEIgKiAyKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWTE7Ci0gIGlmIChtcF9pbml0X3NpemUgKCZ4MHkwLCBCICogMikgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFQxOwotICBpZiAobXBfaW5pdF9zaXplICgmeDF5MSwgQiAqIDIpICE9IE1QX09LQVkpCi0gICAgZ290byBYMFkwOwotCi0gIC8qIG5vdyBzaGlmdCB0aGUgZGlnaXRzICovCi0gIHgwLnNpZ24gPSB4MS5zaWduID0gYS0+c2lnbjsKLSAgeTAuc2lnbiA9IHkxLnNpZ24gPSBiLT5zaWduOwotCi0gIHgwLnVzZWQgPSB5MC51c2VkID0gQjsKLSAgeDEudXNlZCA9IGEtPnVzZWQgLSBCOwotICB5MS51c2VkID0gYi0+dXNlZCAtIEI7Ci0KLSAgewotICAgIHJlZ2lzdGVyIGludCB4OwotICAgIHJlZ2lzdGVyIG1wX2RpZ2l0ICp0bXBhLCAqdG1wYiwgKnRtcHgsICp0bXB5OwotCi0gICAgLyogd2UgY29weSB0aGUgZGlnaXRzIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgaGlnaGVyIGxldmVsIGZ1bmN0aW9ucwotICAgICAqIHNpbmNlIHdlIGFsc28gbmVlZCB0byBzaGlmdCB0aGUgZGlnaXRzCi0gICAgICovCi0gICAgdG1wYSA9IGEtPmRwOwotICAgIHRtcGIgPSBiLT5kcDsKLQotICAgIHRtcHggPSB4MC5kcDsKLSAgICB0bXB5ID0geTAuZHA7Ci0gICAgZm9yICh4ID0gMDsgeCA8IEI7IHgrKykgewotICAgICAgKnRtcHgrKyA9ICp0bXBhKys7Ci0gICAgICAqdG1weSsrID0gKnRtcGIrKzsKLSAgICB9Ci0KLSAgICB0bXB4ID0geDEuZHA7Ci0gICAgZm9yICh4ID0gQjsgeCA8IGEtPnVzZWQ7IHgrKykgewotICAgICAgKnRtcHgrKyA9ICp0bXBhKys7Ci0gICAgfQotCi0gICAgdG1weSA9IHkxLmRwOwotICAgIGZvciAoeCA9IEI7IHggPCBiLT51c2VkOyB4KyspIHsKLSAgICAgICp0bXB5KysgPSAqdG1wYisrOwotICAgIH0KLSAgfQotCi0gIC8qIG9ubHkgbmVlZCB0byBjbGFtcCB0aGUgbG93ZXIgd29yZHMgc2luY2UgYnkgZGVmaW5pdGlvbiB0aGUgCi0gICAqIHVwcGVyIHdvcmRzIHgxL3kxIG11c3QgaGF2ZSBhIGtub3duIG51bWJlciBvZiBkaWdpdHMKLSAgICovCi0gIG1wX2NsYW1wICgmeDApOwotICBtcF9jbGFtcCAoJnkwKTsKLQotICAvKiBub3cgY2FsYyB0aGUgcHJvZHVjdHMgeDB5MCBhbmQgeDF5MSAqLwotICAvKiBhZnRlciB0aGlzIHgwIGlzIG5vIGxvbmdlciByZXF1aXJlZCwgZnJlZSB0ZW1wIFt4MD09dDJdISAqLwotICBpZiAobXBfbXVsICgmeDAsICZ5MCwgJngweTApICE9IE1QX09LQVkpICAKLSAgICBnb3RvIFgxWTE7ICAgICAgICAgIC8qIHgweTAgPSB4MCp5MCAqLwotICBpZiAobXBfbXVsICgmeDEsICZ5MSwgJngxeTEpICE9IE1QX09LQVkpCi0gICAgZ290byBYMVkxOyAgICAgICAgICAvKiB4MXkxID0geDEqeTEgKi8KLQotICAvKiBub3cgY2FsYyB4MS14MCBhbmQgeTEteTAgKi8KLSAgaWYgKG1wX3N1YiAoJngxLCAmeDAsICZ0MSkgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgxWTE7ICAgICAgICAgIC8qIHQxID0geDEgLSB4MCAqLwotICBpZiAobXBfc3ViICgmeTEsICZ5MCwgJngwKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWDFZMTsgICAgICAgICAgLyogdDIgPSB5MSAtIHkwICovCi0gIGlmIChtcF9tdWwgKCZ0MSwgJngwLCAmdDEpICE9IE1QX09LQVkpCi0gICAgZ290byBYMVkxOyAgICAgICAgICAvKiB0MSA9ICh4MSAtIHgwKSAqICh5MSAtIHkwKSAqLwotCi0gIC8qIGFkZCB4MHkwICovCi0gIGlmIChtcF9hZGQgKCZ4MHkwLCAmeDF5MSwgJngwKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWDFZMTsgICAgICAgICAgLyogdDIgPSB4MHkwICsgeDF5MSAqLwotICBpZiAobXBfc3ViICgmeDAsICZ0MSwgJnQxKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWDFZMTsgICAgICAgICAgLyogdDEgPSB4MHkwICsgeDF5MSAtICh4MS14MCkqKHkxLXkwKSAqLwotCi0gIC8qIHNoaWZ0IGJ5IEIgKi8KLSAgaWYgKG1wX2xzaGQgKCZ0MSwgQikgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgxWTE7ICAgICAgICAgIC8qIHQxID0gKHgweTAgKyB4MXkxIC0gKHgxLXgwKSooeTEteTApKTw8QiAqLwotICBpZiAobXBfbHNoZCAoJngxeTEsIEIgKiAyKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWDFZMTsgICAgICAgICAgLyogeDF5MSA9IHgxeTEgPDwgMipCICovCi0KLSAgaWYgKG1wX2FkZCAoJngweTAsICZ0MSwgJnQxKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWDFZMTsgICAgICAgICAgLyogdDEgPSB4MHkwICsgdDEgKi8KLSAgaWYgKG1wX2FkZCAoJnQxLCAmeDF5MSwgYykgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgxWTE7ICAgICAgICAgIC8qIHQxID0geDB5MCArIHQxICsgeDF5MSAqLwotCi0gIC8qIEFsZ29yaXRobSBzdWNjZWVkZWQgc2V0IHRoZSByZXR1cm4gY29kZSB0byBNUF9PS0FZICovCi0gIGVyciA9IE1QX09LQVk7Ci0KLVgxWTE6bXBfY2xlYXIgKCZ4MXkxKTsKLVgwWTA6bXBfY2xlYXIgKCZ4MHkwKTsKLVQxOm1wX2NsZWFyICgmdDEpOwotWTE6bXBfY2xlYXIgKCZ5MSk7Ci1ZMDptcF9jbGVhciAoJnkwKTsKLVgxOm1wX2NsZWFyICgmeDEpOwotWDA6bXBfY2xlYXIgKCZ4MCk7Ci1FUlI6Ci0gIHJldHVybiBlcnI7Ci19Ci0KLS8qIEVuZDogYm5fbXBfa2FyYXRzdWJhX211bC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9rYXJhdHN1YmFfc3FyLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIEthcmF0c3ViYSBzcXVhcmluZywgY29tcHV0ZXMgYiA9IGEqYSB1c2luZyB0aHJlZSAKLSAqIGhhbGYgc2l6ZSBzcXVhcmluZ3MKLSAqCi0gKiBTZWUgY29tbWVudHMgb2YgbXBfa2FyYXRzdWJhX211bCBmb3IgZGV0YWlscy4gIEl0IAotICogaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYWxnb3JpdGhtIGJ1dCBtZXJlbHkgCi0gKiB0dW5lZCB0byBwZXJmb3JtIHJlY3Vyc2l2ZSBzcXVhcmluZ3MuCi0gKi8KLWludCBtcF9rYXJhdHN1YmFfc3FyIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiKQotewotICBtcF9pbnQgIHgwLCB4MSwgdDEsIHQyLCB4MHgwLCB4MXgxOwotICBpbnQgICAgIEIsIGVycjsKLQotICBlcnIgPSBNUF9NRU07Ci0KLSAgLyogbWluICMgb2YgZGlnaXRzICovCi0gIEIgPSBhLT51c2VkOwotCi0gIC8qIG5vdyBkaXZpZGUgaW4gdHdvICovCi0gIEIgPSBCID4+IDE7Ci0KLSAgLyogaW5pdCBjb3B5IGFsbCB0aGUgdGVtcHMgKi8KLSAgaWYgKG1wX2luaXRfc2l6ZSAoJngwLCBCKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gRVJSOwotICBpZiAobXBfaW5pdF9zaXplICgmeDEsIGEtPnVzZWQgLSBCKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWDA7Ci0KLSAgLyogaW5pdCB0ZW1wcyAqLwotICBpZiAobXBfaW5pdF9zaXplICgmdDEsIGEtPnVzZWQgKiAyKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWDE7Ci0gIGlmIChtcF9pbml0X3NpemUgKCZ0MiwgYS0+dXNlZCAqIDIpICE9IE1QX09LQVkpCi0gICAgZ290byBUMTsKLSAgaWYgKG1wX2luaXRfc2l6ZSAoJngweDAsIEIgKiAyKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gVDI7Ci0gIGlmIChtcF9pbml0X3NpemUgKCZ4MXgxLCAoYS0+dXNlZCAtIEIpICogMikgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgwWDA7Ci0KLSAgewotICAgIHJlZ2lzdGVyIGludCB4OwotICAgIHJlZ2lzdGVyIG1wX2RpZ2l0ICpkc3QsICpzcmM7Ci0KLSAgICBzcmMgPSBhLT5kcDsKLQotICAgIC8qIG5vdyBzaGlmdCB0aGUgZGlnaXRzICovCi0gICAgZHN0ID0geDAuZHA7Ci0gICAgZm9yICh4ID0gMDsgeCA8IEI7IHgrKykgewotICAgICAgKmRzdCsrID0gKnNyYysrOwotICAgIH0KLQotICAgIGRzdCA9IHgxLmRwOwotICAgIGZvciAoeCA9IEI7IHggPCBhLT51c2VkOyB4KyspIHsKLSAgICAgICpkc3QrKyA9ICpzcmMrKzsKLSAgICB9Ci0gIH0KLQotICB4MC51c2VkID0gQjsKLSAgeDEudXNlZCA9IGEtPnVzZWQgLSBCOwotCi0gIG1wX2NsYW1wICgmeDApOwotCi0gIC8qIG5vdyBjYWxjIHRoZSBwcm9kdWN0cyB4MCp4MCBhbmQgeDEqeDEgKi8KLSAgaWYgKG1wX3NxciAoJngwLCAmeDB4MCkgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgxWDE7ICAgICAgICAgICAvKiB4MHgwID0geDAqeDAgKi8KLSAgaWYgKG1wX3NxciAoJngxLCAmeDF4MSkgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgxWDE7ICAgICAgICAgICAvKiB4MXgxID0geDEqeDEgKi8KLQotICAvKiBub3cgY2FsYyAoeDEteDApKioyICovCi0gIGlmIChtcF9zdWIgKCZ4MSwgJngwLCAmdDEpICE9IE1QX09LQVkpCi0gICAgZ290byBYMVgxOyAgICAgICAgICAgLyogdDEgPSB4MSAtIHgwICovCi0gIGlmIChtcF9zcXIgKCZ0MSwgJnQxKSAhPSBNUF9PS0FZKQotICAgIGdvdG8gWDFYMTsgICAgICAgICAgIC8qIHQxID0gKHgxIC0geDApICogKHgxIC0geDApICovCi0KLSAgLyogYWRkIHgweTAgKi8KLSAgaWYgKHNfbXBfYWRkICgmeDB4MCwgJngxeDEsICZ0MikgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgxWDE7ICAgICAgICAgICAvKiB0MiA9IHgweDAgKyB4MXgxICovCi0gIGlmIChtcF9zdWIgKCZ0MiwgJnQxLCAmdDEpICE9IE1QX09LQVkpCi0gICAgZ290byBYMVgxOyAgICAgICAgICAgLyogdDEgPSB4MHgwICsgeDF4MSAtICh4MS14MCkqKHgxLXgwKSAqLwotCi0gIC8qIHNoaWZ0IGJ5IEIgKi8KLSAgaWYgKG1wX2xzaGQgKCZ0MSwgQikgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgxWDE7ICAgICAgICAgICAvKiB0MSA9ICh4MHgwICsgeDF4MSAtICh4MS14MCkqKHgxLXgwKSk8PEIgKi8KLSAgaWYgKG1wX2xzaGQgKCZ4MXgxLCBCICogMikgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgxWDE7ICAgICAgICAgICAvKiB4MXgxID0geDF4MSA8PCAyKkIgKi8KLQotICBpZiAobXBfYWRkICgmeDB4MCwgJnQxLCAmdDEpICE9IE1QX09LQVkpCi0gICAgZ290byBYMVgxOyAgICAgICAgICAgLyogdDEgPSB4MHgwICsgdDEgKi8KLSAgaWYgKG1wX2FkZCAoJnQxLCAmeDF4MSwgYikgIT0gTVBfT0tBWSkKLSAgICBnb3RvIFgxWDE7ICAgICAgICAgICAvKiB0MSA9IHgweDAgKyB0MSArIHgxeDEgKi8KLQotICBlcnIgPSBNUF9PS0FZOwotCi1YMVgxOm1wX2NsZWFyICgmeDF4MSk7Ci1YMFgwOm1wX2NsZWFyICgmeDB4MCk7Ci1UMjptcF9jbGVhciAoJnQyKTsKLVQxOm1wX2NsZWFyICgmdDEpOwotWDE6bXBfY2xlYXIgKCZ4MSk7Ci1YMDptcF9jbGVhciAoJngwKTsKLUVSUjoKLSAgcmV0dXJuIGVycjsKLX0KLQotLyogRW5kOiBibl9tcF9rYXJhdHN1YmFfc3FyLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX2xjbS5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBjb21wdXRlcyBsZWFzdCBjb21tb24gbXVsdGlwbGUgYXMgfGEqYnwvKGEsIGIpICovCi1pbnQgbXBfbGNtIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiLCBtcF9pbnQgKiBjKQotewotICBpbnQgICAgIHJlczsKLSAgbXBfaW50ICB0MSwgdDI7Ci0KLQotICBpZiAoKHJlcyA9IG1wX2luaXRfbXVsdGkgKCZ0MSwgJnQyLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKiB0MSA9IGdldCB0aGUgR0NEIG9mIHRoZSB0d28gaW5wdXRzICovCi0gIGlmICgocmVzID0gbXBfZ2NkIChhLCBiLCAmdDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX1Q7Ci0gIH0KLQotICAvKiBkaXZpZGUgdGhlIHNtYWxsZXN0IGJ5IHRoZSBHQ0QgKi8KLSAgaWYgKG1wX2NtcF9tYWcoYSwgYikgPT0gTVBfTFQpIHsKLSAgICAgLyogc3RvcmUgcXVvdGllbnQgaW4gdDIgc3VjaCB0aGF0IHQyICogYiBpcyB0aGUgTENNICovCi0gICAgIGlmICgocmVzID0gbXBfZGl2KGEsICZ0MSwgJnQyLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fVDsKLSAgICAgfQotICAgICByZXMgPSBtcF9tdWwoYiwgJnQyLCBjKTsKLSAgfSBlbHNlIHsKLSAgICAgLyogc3RvcmUgcXVvdGllbnQgaW4gdDIgc3VjaCB0aGF0IHQyICogYSBpcyB0aGUgTENNICovCi0gICAgIGlmICgocmVzID0gbXBfZGl2KGIsICZ0MSwgJnQyLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fVDsKLSAgICAgfQotICAgICByZXMgPSBtcF9tdWwoYSwgJnQyLCBjKTsKLSAgfQotCi0gIC8qIGZpeCB0aGUgc2lnbiB0byBwb3NpdGl2ZSAqLwotICBjLT5zaWduID0gTVBfWlBPUzsKLQotX19UOgotICBtcF9jbGVhcl9tdWx0aSAoJnQxLCAmdDIsIE5VTEwpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiBFbmQ6IGJuX21wX2xjbS5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9sc2hkLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHNoaWZ0IGxlZnQgYSBjZXJ0YWluIGFtb3VudCBvZiBkaWdpdHMgKi8KLWludCBtcF9sc2hkIChtcF9pbnQgKiBhLCBpbnQgYikKLXsKLSAgaW50ICAgICB4LCByZXM7Ci0KLSAgLyogaWYgaXRzIGxlc3MgdGhhbiB6ZXJvIHJldHVybiAqLwotICBpZiAoYiA8PSAwKSB7Ci0gICAgcmV0dXJuIE1QX09LQVk7Ci0gIH0KLQotICAvKiBncm93IHRvIGZpdCB0aGUgbmV3IGRpZ2l0cyAqLwotICBpZiAoYS0+YWxsb2MgPCBhLT51c2VkICsgYikgewotICAgICBpZiAoKHJlcyA9IG1wX2dyb3cgKGEsIGEtPnVzZWQgKyBiKSkgIT0gTVBfT0tBWSkgewotICAgICAgIHJldHVybiByZXM7Ci0gICAgIH0KLSAgfQotCi0gIHsKLSAgICByZWdpc3RlciBtcF9kaWdpdCAqdG9wLCAqYm90dG9tOwotCi0gICAgLyogaW5jcmVtZW50IHRoZSB1c2VkIGJ5IHRoZSBzaGlmdCBhbW91bnQgdGhlbiBjb3B5IHVwd2FyZHMgKi8KLSAgICBhLT51c2VkICs9IGI7Ci0KLSAgICAvKiB0b3AgKi8KLSAgICB0b3AgPSBhLT5kcCArIGEtPnVzZWQgLSAxOwotCi0gICAgLyogYmFzZSAqLwotICAgIGJvdHRvbSA9IGEtPmRwICsgYS0+dXNlZCAtIDEgLSBiOwotCi0gICAgLyogbXVjaCBsaWtlIG1wX3JzaGQgdGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHNsaWRpbmcgd2luZG93Ci0gICAgICogZXhjZXB0IHRoZSB3aW5kb3cgZ29lcyB0aGUgb3RoZXJ3YXkgYXJvdW5kLiAgQ29weWluZyBmcm9tCi0gICAgICogdGhlIGJvdHRvbSB0byB0aGUgdG9wLiAgc2VlIGJuX21wX3JzaGQuYyBmb3IgbW9yZSBpbmZvLgotICAgICAqLwotICAgIGZvciAoeCA9IGEtPnVzZWQgLSAxOyB4ID49IGI7IHgtLSkgewotICAgICAgKnRvcC0tID0gKmJvdHRvbS0tOwotICAgIH0KLQotICAgIC8qIHplcm8gdGhlIGxvd2VyIGRpZ2l0cyAqLwotICAgIHRvcCA9IGEtPmRwOwotICAgIGZvciAoeCA9IDA7IHggPCBiOyB4KyspIHsKLSAgICAgICp0b3ArKyA9IDA7Ci0gICAgfQotICB9Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX2xzaGQuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfbW9kLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGMgPSBhIG1vZCBiLCAwIDw9IGMgPCBiICovCi1pbnQKLW1wX21vZCAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYykKLXsKLSAgbXBfaW50ICB0OwotICBpbnQgICAgIHJlczsKLQotICBpZiAoKHJlcyA9IG1wX2luaXQgKCZ0KSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICBpZiAoKHJlcyA9IG1wX2RpdiAoYSwgYiwgTlVMTCwgJnQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgbXBfY2xlYXIgKCZ0KTsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgaWYgKHQuc2lnbiAhPSBiLT5zaWduKSB7Ci0gICAgcmVzID0gbXBfYWRkIChiLCAmdCwgYyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzID0gTVBfT0tBWTsKLSAgICBtcF9leGNoICgmdCwgYyk7Ci0gIH0KLQotICBtcF9jbGVhciAoJnQpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiBFbmQ6IGJuX21wX21vZC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9tb2RfMmQuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogY2FsYyBhIHZhbHVlIG1vZCAyKipiICovCi1pbnQKLW1wX21vZF8yZCAobXBfaW50ICogYSwgaW50IGIsIG1wX2ludCAqIGMpCi17Ci0gIGludCAgICAgeCwgcmVzOwotCi0gIC8qIGlmIGIgaXMgPD0gMCB0aGVuIHplcm8gdGhlIGludCAqLwotICBpZiAoYiA8PSAwKSB7Ci0gICAgbXBfemVybyAoYyk7Ci0gICAgcmV0dXJuIE1QX09LQVk7Ci0gIH0KLQotICAvKiBpZiB0aGUgbW9kdWx1cyBpcyBsYXJnZXIgdGhhbiB0aGUgdmFsdWUgdGhhbiByZXR1cm4gKi8KLSAgaWYgKGIgPiAoaW50KSAoYS0+dXNlZCAqIERJR0lUX0JJVCkpIHsKLSAgICByZXMgPSBtcF9jb3B5IChhLCBjKTsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgLyogY29weSAqLwotICBpZiAoKHJlcyA9IG1wX2NvcHkgKGEsIGMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qIHplcm8gZGlnaXRzIGFib3ZlIHRoZSBsYXN0IGRpZ2l0IG9mIHRoZSBtb2R1bHVzICovCi0gIGZvciAoeCA9IChiIC8gRElHSVRfQklUKSArICgoYiAlIERJR0lUX0JJVCkgPT0gMCA/IDAgOiAxKTsgeCA8IGMtPnVzZWQ7IHgrKykgewotICAgIGMtPmRwW3hdID0gMDsKLSAgfQotICAvKiBjbGVhciB0aGUgZGlnaXQgdGhhdCBpcyBub3QgY29tcGxldGVseSBvdXRzaWRlL2luc2lkZSB0aGUgbW9kdWx1cyAqLwotICBjLT5kcFtiIC8gRElHSVRfQklUXSAmPQotICAgIChtcF9kaWdpdCkgKCgoKG1wX2RpZ2l0KSAxKSA8PCAoKChtcF9kaWdpdCkgYikgJSBESUdJVF9CSVQpKSAtICgobXBfZGlnaXQpIDEpKTsKLSAgbXBfY2xhbXAgKGMpOwotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9tcF9tb2RfMmQuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfbW9kX2QuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotaW50Ci1tcF9tb2RfZCAobXBfaW50ICogYSwgbXBfZGlnaXQgYiwgbXBfZGlnaXQgKiBjKQotewotICByZXR1cm4gbXBfZGl2X2QoYSwgYiwgTlVMTCwgYyk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfbW9kX2QuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfbW9udGdvbWVyeV9jYWxjX25vcm1hbGl6YXRpb24uYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogY2FsY3VsYXRlcyBhID0gQl5uIG1vZCBiIGZvciBNb250Z29tZXJ5IHJlZHVjdGlvbgotICogV2hlcmUgQiBpcyB0aGUgYmFzZSBbZS5nLiAyXkRJR0lUX0JJVF0uCi0gKiBCXm4gbW9kIGIgaXMgY29tcHV0ZWQgYnkgZmlyc3QgY29tcHV0aW5nCi0gKiBBID0gQl4obi0xKSB3aGljaCBkb2Vzbid0IHJlcXVpcmUgYSByZWR1Y3Rpb24gYnV0IGEgc2ltcGxlIE9SLgotICogdGhlbiBDID0gQSAqIEIgPSBCXm4gaXMgY29tcHV0ZWQgYnkgcGVyZm9ybWluZyB1cHRvIERJR0lUX0JJVAotICogc2hpZnRzIHdpdGggc3VidHJhY3Rpb25zIHdoZW4gdGhlIHJlc3VsdCBpcyBncmVhdGVyIHRoYW4gYi4KLSAqCi0gKiBUaGUgbWV0aG9kIGlzIHNsaWdodGx5IG1vZGlmaWVkIHRvIHNoaWZ0IEIgdW5jb25kaXRpb25hbGx5IHVwdG8ganVzdCB1bmRlcgotICogdGhlIGxlYWRpbmcgYml0IG9mIGIuICBUaGlzIHNhdmVzIGFsb3Qgb2YgbXVsdGlwbGUgcHJlY2lzaW9uIHNoaWZ0aW5nLgotICovCi1pbnQKLW1wX21vbnRnb21lcnlfY2FsY19ub3JtYWxpemF0aW9uIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiKQotewotICBpbnQgICAgIHgsIGJpdHMsIHJlczsKLQotICAvKiBob3cgbWFueSBiaXRzIG9mIGxhc3QgZGlnaXQgZG9lcyBiIHVzZSAqLwotICBiaXRzID0gbXBfY291bnRfYml0cyAoYikgJSBESUdJVF9CSVQ7Ci0KLSAgLyogY29tcHV0ZSBBID0gQl4obi0xKSAqIDJeKGJpdHMtMSkgKi8KLSAgaWYgKChyZXMgPSBtcF8yZXhwdCAoYSwgKGItPnVzZWQgLSAxKSAqIERJR0lUX0JJVCArIGJpdHMgLSAxKSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKiBub3cgY29tcHV0ZSBDID0gQSAqIEIgbW9kIGIgKi8KLSAgZm9yICh4ID0gYml0cyAtIDE7IHggPCAoaW50KURJR0lUX0JJVDsgeCsrKSB7Ci0gICAgaWYgKChyZXMgPSBtcF9tdWxfMiAoYSwgYSkpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIGlmIChtcF9jbXBfbWFnIChhLCBiKSAhPSBNUF9MVCkgewotICAgICAgaWYgKChyZXMgPSBzX21wX3N1YiAoYSwgYiwgYSkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9tcF9tb250Z29tZXJ5X2NhbGNfbm9ybWFsaXphdGlvbi5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9tb250Z29tZXJ5X3JlZHVjZS5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBjb21wdXRlcyB4UioqLTEgPT0geCAobW9kIE4pIHZpYSBNb250Z29tZXJ5IFJlZHVjdGlvbiAqLwotaW50Ci1tcF9tb250Z29tZXJ5X3JlZHVjZSAobXBfaW50ICogeCwgbXBfaW50ICogbiwgbXBfZGlnaXQgcmhvKQotewotICBpbnQgICAgIGl4LCByZXMsIGRpZ3M7Ci0gIG1wX2RpZ2l0IG11OwotCi0gIC8qIGNhbiB0aGUgZmFzdCByZWR1Y3Rpb24gW2NvbWJhXSBtZXRob2QgYmUgdXNlZD8KLSAgICoKLSAgICogTm90ZSB0aGF0IHVubGlrZSBpbiBtcF9tdWwgeW91J3JlIHNhZmVseSBhbGxvd2VkICpsZXNzKgotICAgKiB0aGFuIHRoZSBhdmFpbGFibGUgY29sdW1ucyBbMjU1IHBlciBkZWZhdWx0XSBzaW5jZSBjYXJyaWVzCi0gICAqIGFyZSBmaXhlZCB1cCBpbiB0aGUgaW5uZXIgbG9vcC4KLSAgICovCi0gIGRpZ3MgPSBuLT51c2VkICogMiArIDE7Ci0gIGlmICgoZGlncyA8IE1QX1dBUlJBWSkgJiYKLSAgICAgIG4tPnVzZWQgPAotICAgICAgKDEgPDwgKChDSEFSX0JJVCAqIHNpemVvZiAobXBfd29yZCkpIC0gKDIgKiBESUdJVF9CSVQpKSkpIHsKLSAgICByZXR1cm4gZmFzdF9tcF9tb250Z29tZXJ5X3JlZHVjZSAoeCwgbiwgcmhvKTsKLSAgfQotCi0gIC8qIGdyb3cgdGhlIGlucHV0IGFzIHJlcXVpcmVkICovCi0gIGlmICh4LT5hbGxvYyA8IGRpZ3MpIHsKLSAgICBpZiAoKHJlcyA9IG1wX2dyb3cgKHgsIGRpZ3MpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgfQotICB4LT51c2VkID0gZGlnczsKLQotICBmb3IgKGl4ID0gMDsgaXggPCBuLT51c2VkOyBpeCsrKSB7Ci0gICAgLyogbXUgPSBhaSAqIHJobyBtb2QgYgotICAgICAqCi0gICAgICogVGhlIHZhbHVlIG9mIHJobyBtdXN0IGJlIHByZWNhbGN1bGF0ZWQgdmlhCi0gICAgICogYm5fbXBfbW9udGdvbWVyeV9zZXR1cCgpIHN1Y2ggdGhhdAotICAgICAqIGl0IGVxdWFscyAtMS9uMCBtb2QgYiB0aGlzIGFsbG93cyB0aGUKLSAgICAgKiBmb2xsb3dpbmcgaW5uZXIgbG9vcCB0byByZWR1Y2UgdGhlCi0gICAgICogaW5wdXQgb25lIGRpZ2l0IGF0IGEgdGltZQotICAgICAqLwotICAgIG11ID0gKG1wX2RpZ2l0KSAoKChtcF93b3JkKXgtPmRwW2l4XSkgKiAoKG1wX3dvcmQpcmhvKSAmIE1QX01BU0spOwotCi0gICAgLyogYSA9IGEgKyBtdSAqIG0gKiBiKippICovCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGl5OwotICAgICAgcmVnaXN0ZXIgbXBfZGlnaXQgKnRtcG4sICp0bXB4LCB1OwotICAgICAgcmVnaXN0ZXIgbXBfd29yZCByOwotCi0gICAgICAvKiBhbGlhcyBmb3IgZGlnaXRzIG9mIHRoZSBtb2R1bHVzICovCi0gICAgICB0bXBuID0gbi0+ZHA7Ci0KLSAgICAgIC8qIGFsaWFzIGZvciB0aGUgZGlnaXRzIG9mIHggW3RoZSBpbnB1dF0gKi8KLSAgICAgIHRtcHggPSB4LT5kcCArIGl4OwotCi0gICAgICAvKiBzZXQgdGhlIGNhcnJ5IHRvIHplcm8gKi8KLSAgICAgIHUgPSAwOwotCi0gICAgICAvKiBNdWx0aXBseSBhbmQgYWRkIGluIHBsYWNlICovCi0gICAgICBmb3IgKGl5ID0gMDsgaXkgPCBuLT51c2VkOyBpeSsrKSB7Ci0gICAgICAgIC8qIGNvbXB1dGUgcHJvZHVjdCBhbmQgc3VtICovCi0gICAgICAgIHIgICAgICAgPSAoKG1wX3dvcmQpbXUpICogKChtcF93b3JkKSp0bXBuKyspICsKLSAgICAgICAgICAgICAgICAgICgobXBfd29yZCkgdSkgKyAoKG1wX3dvcmQpICogdG1weCk7Ci0KLSAgICAgICAgLyogZ2V0IGNhcnJ5ICovCi0gICAgICAgIHUgICAgICAgPSAobXBfZGlnaXQpKHIgPj4gKChtcF93b3JkKSBESUdJVF9CSVQpKTsKLQotICAgICAgICAvKiBmaXggZGlnaXQgKi8KLSAgICAgICAgKnRtcHgrKyA9IChtcF9kaWdpdCkociAmICgobXBfd29yZCkgTVBfTUFTSykpOwotICAgICAgfQotICAgICAgLyogQXQgdGhpcyBwb2ludCB0aGUgaXgndGggZGlnaXQgb2YgeCBzaG91bGQgYmUgemVybyAqLwotCi0KLSAgICAgIC8qIHByb3BhZ2F0ZSBjYXJyaWVzIHVwd2FyZHMgYXMgcmVxdWlyZWQqLwotICAgICAgd2hpbGUgKHUpIHsKLSAgICAgICAgKnRtcHggICArPSB1OwotICAgICAgICB1ICAgICAgICA9ICp0bXB4ID4+IERJR0lUX0JJVDsKLSAgICAgICAgKnRtcHgrKyAmPSBNUF9NQVNLOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIGF0IHRoaXMgcG9pbnQgdGhlIG4udXNlZCd0aCBsZWFzdAotICAgKiBzaWduaWZpY2FudCBkaWdpdHMgb2YgeCBhcmUgYWxsIHplcm8KLSAgICogd2hpY2ggbWVhbnMgd2UgY2FuIHNoaWZ0IHggdG8gdGhlCi0gICAqIHJpZ2h0IGJ5IG4udXNlZCBkaWdpdHMgYW5kIHRoZQotICAgKiByZXNpZHVlIGlzIHVuY2hhbmdlZC4KLSAgICovCi0KLSAgLyogeCA9IHgvYioqbi51c2VkICovCi0gIG1wX2NsYW1wKHgpOwotICBtcF9yc2hkICh4LCBuLT51c2VkKTsKLQotICAvKiBpZiB4ID49IG4gdGhlbiB4ID0geCAtIG4gKi8KLSAgaWYgKG1wX2NtcF9tYWcgKHgsIG4pICE9IE1QX0xUKSB7Ci0gICAgcmV0dXJuIHNfbXBfc3ViICh4LCBuLCB4KTsKLSAgfQotCi0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX21vbnRnb21lcnlfcmVkdWNlLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX21vbnRnb21lcnlfc2V0dXAuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogc2V0dXBzIHRoZSBtb250Z29tZXJ5IHJlZHVjdGlvbiBzdHVmZiAqLwotaW50Ci1tcF9tb250Z29tZXJ5X3NldHVwIChtcF9pbnQgKiBuLCBtcF9kaWdpdCAqIHJobykKLXsKLSAgbXBfZGlnaXQgeCwgYjsKLQotLyogZmFzdCBpbnZlcnNpb24gbW9kIDIqKmsKLSAqCi0gKiBCYXNlZCBvbiB0aGUgZmFjdCB0aGF0Ci0gKgotICogWEEgPSAxIChtb2QgMioqbikgID0+ICAoWCgyLVhBKSkgQSA9IDEgKG1vZCAyKioybikKLSAqICAgICAgICAgICAgICAgICAgICA9PiAgMipYKkEgLSBYKlgqQSpBID0gMQotICogICAgICAgICAgICAgICAgICAgID0+ICAyKigxKSAtICgxKSAgICAgPSAxCi0gKi8KLSAgYiA9IG4tPmRwWzBdOwotCi0gIGlmICgoYiAmIDEpID09IDApIHsKLSAgICByZXR1cm4gTVBfVkFMOwotICB9Ci0KLSAgeCA9ICgoKGIgKyAyKSAmIDQpIDw8IDEpICsgYjsgLyogaGVyZSB4KmE9PTEgbW9kIDIqKjQgKi8KLSAgeCAqPSAyIC0gYiAqIHg7ICAgICAgICAgICAgICAgLyogaGVyZSB4KmE9PTEgbW9kIDIqKjggKi8KLSNpZiAhZGVmaW5lZChNUF84QklUKQotICB4ICo9IDIgLSBiICogeDsgICAgICAgICAgICAgICAvKiBoZXJlIHgqYT09MSBtb2QgMioqMTYgKi8KLSNlbmRpZgotI2lmIGRlZmluZWQoTVBfNjRCSVQpIHx8ICEoZGVmaW5lZChNUF84QklUKSB8fCBkZWZpbmVkKE1QXzE2QklUKSkKLSAgeCAqPSAyIC0gYiAqIHg7ICAgICAgICAgICAgICAgLyogaGVyZSB4KmE9PTEgbW9kIDIqKjMyICovCi0jZW5kaWYKLSNpZmRlZiBNUF82NEJJVAotICB4ICo9IDIgLSBiICogeDsgICAgICAgICAgICAgICAvKiBoZXJlIHgqYT09MSBtb2QgMioqNjQgKi8KLSNlbmRpZgotCi0gIC8qIHJobyA9IC0xL20gbW9kIGIgKi8KLSAgKnJobyA9ICgoKG1wX2RpZ2l0KSAxIDw8ICgobXBfZGlnaXQpIERJR0lUX0JJVCkpIC0geCkgJiBNUF9NQVNLOwotCi0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX21vbnRnb21lcnlfc2V0dXAuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfbXVsLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGhpZ2ggbGV2ZWwgbXVsdGlwbGljYXRpb24gKGhhbmRsZXMgc2lnbikgKi8KLWludCBtcF9tdWwgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMpCi17Ci0gIGludCAgICAgcmVzLCBuZWc7Ci0gIG5lZyA9IChhLT5zaWduID09IGItPnNpZ24pID8gTVBfWlBPUyA6IE1QX05FRzsKLQotICAvKiB1c2UgVG9vbS1Db29rPyAqLwotICBpZiAoTUlOIChhLT51c2VkLCBiLT51c2VkKSA+PSBUT09NX01VTF9DVVRPRkYpIHsKLSAgICByZXMgPSBtcF90b29tX211bChhLCBiLCBjKTsKLSAgLyogdXNlIEthcmF0c3ViYT8gKi8KLSAgfSBlbHNlIGlmIChNSU4gKGEtPnVzZWQsIGItPnVzZWQpID49IEtBUkFUU1VCQV9NVUxfQ1VUT0ZGKSB7Ci0gICAgcmVzID0gbXBfa2FyYXRzdWJhX211bCAoYSwgYiwgYyk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogY2FuIHdlIHVzZSB0aGUgZmFzdCBtdWx0aXBsaWVyPwotICAgICAqCi0gICAgICogVGhlIGZhc3QgbXVsdGlwbGllciBjYW4gYmUgdXNlZCBpZiB0aGUgb3V0cHV0IHdpbGwgCi0gICAgICogaGF2ZSBsZXNzIHRoYW4gTVBfV0FSUkFZIGRpZ2l0cyBhbmQgdGhlIG51bWJlciBvZiAKLSAgICAgKiBkaWdpdHMgd29uJ3QgYWZmZWN0IGNhcnJ5IHByb3BhZ2F0aW9uCi0gICAgICovCi0gICAgaW50ICAgICBkaWdzID0gYS0+dXNlZCArIGItPnVzZWQgKyAxOwotCi0gICAgaWYgKChkaWdzIDwgTVBfV0FSUkFZKSAmJgotICAgICAgICBNSU4oYS0+dXNlZCwgYi0+dXNlZCkgPD0gCi0gICAgICAgICgxIDw8ICgoQ0hBUl9CSVQgKiBzaXplb2YgKG1wX3dvcmQpKSAtICgyICogRElHSVRfQklUKSkpKSB7Ci0gICAgICByZXMgPSBmYXN0X3NfbXBfbXVsX2RpZ3MgKGEsIGIsIGMsIGRpZ3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXMgPSBzX21wX211bCAoYSwgYiwgYyk7Ci0gICAgfQotICB9Ci0gIGMtPnNpZ24gPSBuZWc7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIEVuZDogYm5fbXBfbXVsLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX211bF8yLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGIgPSBhKjIgKi8KLWludCBtcF9tdWxfMihtcF9pbnQgKiBhLCBtcF9pbnQgKiBiKQotewotICBpbnQgICAgIHgsIHJlcywgb2xkdXNlZDsKLQotICAvKiBncm93IHRvIGFjY29tb2RhdGUgcmVzdWx0ICovCi0gIGlmIChiLT5hbGxvYyA8IGEtPnVzZWQgKyAxKSB7Ci0gICAgaWYgKChyZXMgPSBtcF9ncm93IChiLCBhLT51c2VkICsgMSkpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICB9Ci0KLSAgb2xkdXNlZCA9IGItPnVzZWQ7Ci0gIGItPnVzZWQgPSBhLT51c2VkOwotCi0gIHsKLSAgICByZWdpc3RlciBtcF9kaWdpdCByLCByciwgKnRtcGEsICp0bXBiOwotCi0gICAgLyogYWxpYXMgZm9yIHNvdXJjZSAqLwotICAgIHRtcGEgPSBhLT5kcDsKLSAgICAKLSAgICAvKiBhbGlhcyBmb3IgZGVzdCAqLwotICAgIHRtcGIgPSBiLT5kcDsKLQotICAgIC8qIGNhcnJ5ICovCi0gICAgciA9IDA7Ci0gICAgZm9yICh4ID0gMDsgeCA8IGEtPnVzZWQ7IHgrKykgewotICAgIAotICAgICAgLyogZ2V0IHdoYXQgd2lsbCBiZSB0aGUgKm5leHQqIGNhcnJ5IGJpdCBmcm9tIHRoZSAKLSAgICAgICAqIE1TQiBvZiB0aGUgY3VycmVudCBkaWdpdCAKLSAgICAgICAqLwotICAgICAgcnIgPSAqdG1wYSA+PiAoKG1wX2RpZ2l0KShESUdJVF9CSVQgLSAxKSk7Ci0gICAgICAKLSAgICAgIC8qIG5vdyBzaGlmdCB1cCB0aGlzIGRpZ2l0LCBhZGQgaW4gdGhlIGNhcnJ5IFtmcm9tIHRoZSBwcmV2aW91c10gKi8KLSAgICAgICp0bXBiKysgPSAoKCp0bXBhKysgPDwgKChtcF9kaWdpdCkxKSkgfCByKSAmIE1QX01BU0s7Ci0gICAgICAKLSAgICAgIC8qIGNvcHkgdGhlIGNhcnJ5IHRoYXQgd291bGQgYmUgZnJvbSB0aGUgc291cmNlIAotICAgICAgICogZGlnaXQgaW50byB0aGUgbmV4dCBpdGVyYXRpb24gCi0gICAgICAgKi8KLSAgICAgIHIgPSBycjsKLSAgICB9Ci0KLSAgICAvKiBuZXcgbGVhZGluZyBkaWdpdD8gKi8KLSAgICBpZiAociAhPSAwKSB7Ci0gICAgICAvKiBhZGQgYSBNU0Igd2hpY2ggaXMgYWx3YXlzIDEgYXQgdGhpcyBwb2ludCAqLwotICAgICAgKnRtcGIgPSAxOwotICAgICAgKysoYi0+dXNlZCk7Ci0gICAgfQotCi0gICAgLyogbm93IHplcm8gYW55IGV4Y2VzcyBkaWdpdHMgb24gdGhlIGRlc3RpbmF0aW9uIAotICAgICAqIHRoYXQgd2UgZGlkbid0IHdyaXRlIHRvIAotICAgICAqLwotICAgIHRtcGIgPSBiLT5kcCArIGItPnVzZWQ7Ci0gICAgZm9yICh4ID0gYi0+dXNlZDsgeCA8IG9sZHVzZWQ7IHgrKykgewotICAgICAgKnRtcGIrKyA9IDA7Ci0gICAgfQotICB9Ci0gIGItPnNpZ24gPSBhLT5zaWduOwotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9tcF9tdWxfMi5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9tdWxfMmQuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogc2hpZnQgbGVmdCBieSBhIGNlcnRhaW4gYml0IGNvdW50ICovCi1pbnQgbXBfbXVsXzJkIChtcF9pbnQgKiBhLCBpbnQgYiwgbXBfaW50ICogYykKLXsKLSAgbXBfZGlnaXQgZDsKLSAgaW50ICAgICAgcmVzOwotCi0gIC8qIGNvcHkgKi8KLSAgaWYgKGEgIT0gYykgewotICAgICBpZiAoKHJlcyA9IG1wX2NvcHkgKGEsIGMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgcmV0dXJuIHJlczsKLSAgICAgfQotICB9Ci0KLSAgaWYgKGMtPmFsbG9jIDwgKGludCkoYy0+dXNlZCArIGIvRElHSVRfQklUICsgMSkpIHsKLSAgICAgaWYgKChyZXMgPSBtcF9ncm93IChjLCBjLT51c2VkICsgYiAvIERJR0lUX0JJVCArIDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgcmV0dXJuIHJlczsKLSAgICAgfQotICB9Ci0KLSAgLyogc2hpZnQgYnkgYXMgbWFueSBkaWdpdHMgaW4gdGhlIGJpdCBjb3VudCAqLwotICBpZiAoYiA+PSAoaW50KURJR0lUX0JJVCkgewotICAgIGlmICgocmVzID0gbXBfbHNoZCAoYywgYiAvIERJR0lUX0JJVCkpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICB9Ci0KLSAgLyogc2hpZnQgYW55IGJpdCBjb3VudCA8IERJR0lUX0JJVCAqLwotICBkID0gKG1wX2RpZ2l0KSAoYiAlIERJR0lUX0JJVCk7Ci0gIGlmIChkICE9IDApIHsKLSAgICByZWdpc3RlciBtcF9kaWdpdCAqdG1wYywgc2hpZnQsIG1hc2ssIHIsIHJyOwotICAgIHJlZ2lzdGVyIGludCB4OwotCi0gICAgLyogYml0bWFzayBmb3IgY2FycmllcyAqLwotICAgIG1hc2sgPSAoKChtcF9kaWdpdCkxKSA8PCBkKSAtIDE7Ci0KLSAgICAvKiBzaGlmdCBmb3IgbXNicyAqLwotICAgIHNoaWZ0ID0gRElHSVRfQklUIC0gZDsKLQotICAgIC8qIGFsaWFzICovCi0gICAgdG1wYyA9IGMtPmRwOwotCi0gICAgLyogY2FycnkgKi8KLSAgICByICAgID0gMDsKLSAgICBmb3IgKHggPSAwOyB4IDwgYy0+dXNlZDsgeCsrKSB7Ci0gICAgICAvKiBnZXQgdGhlIGhpZ2hlciBiaXRzIG9mIHRoZSBjdXJyZW50IHdvcmQgKi8KLSAgICAgIHJyID0gKCp0bXBjID4+IHNoaWZ0KSAmIG1hc2s7Ci0KLSAgICAgIC8qIHNoaWZ0IHRoZSBjdXJyZW50IHdvcmQgYW5kIE9SIGluIHRoZSBjYXJyeSAqLwotICAgICAgKnRtcGMgPSAoKCp0bXBjIDw8IGQpIHwgcikgJiBNUF9NQVNLOwotICAgICAgKyt0bXBjOwotCi0gICAgICAvKiBzZXQgdGhlIGNhcnJ5IHRvIHRoZSBjYXJyeSBiaXRzIG9mIHRoZSBjdXJyZW50IHdvcmQgKi8KLSAgICAgIHIgPSBycjsKLSAgICB9Ci0gICAgCi0gICAgLyogc2V0IGZpbmFsIGNhcnJ5ICovCi0gICAgaWYgKHIgIT0gMCkgewotICAgICAgIGMtPmRwWyhjLT51c2VkKSsrXSA9IHI7Ci0gICAgfQotICB9Ci0gIG1wX2NsYW1wIChjKTsKLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfbXVsXzJkLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX211bF9kLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIG11bHRpcGx5IGJ5IGEgZGlnaXQgKi8KLWludAotbXBfbXVsX2QgKG1wX2ludCAqIGEsIG1wX2RpZ2l0IGIsIG1wX2ludCAqIGMpCi17Ci0gIG1wX2RpZ2l0IHUsICp0bXBhLCAqdG1wYzsKLSAgbXBfd29yZCAgcjsKLSAgaW50ICAgICAgaXgsIHJlcywgb2xkdXNlOwotCi0gIC8qIG1ha2Ugc3VyZSBjIGlzIGJpZyBlbm91Z2ggdG8gaG9sZCBhKmIgKi8KLSAgaWYgKGMtPmFsbG9jIDwgYS0+dXNlZCArIDEpIHsKLSAgICBpZiAoKHJlcyA9IG1wX2dyb3cgKGMsIGEtPnVzZWQgKyAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gIH0KLQotICAvKiBnZXQgdGhlIG9yaWdpbmFsIGRlc3RpbmF0aW9ucyB1c2VkIGNvdW50ICovCi0gIG9sZHVzZSA9IGMtPnVzZWQ7Ci0KLSAgLyogc2V0IHRoZSBzaWduICovCi0gIGMtPnNpZ24gPSBhLT5zaWduOwotCi0gIC8qIGFsaWFzIGZvciBhLT5kcCBbc291cmNlXSAqLwotICB0bXBhID0gYS0+ZHA7Ci0KLSAgLyogYWxpYXMgZm9yIGMtPmRwIFtkZXN0XSAqLwotICB0bXBjID0gYy0+ZHA7Ci0KLSAgLyogemVybyBjYXJyeSAqLwotICB1ID0gMDsKLQotICAvKiBjb21wdXRlIGNvbHVtbnMgKi8KLSAgZm9yIChpeCA9IDA7IGl4IDwgYS0+dXNlZDsgaXgrKykgewotICAgIC8qIGNvbXB1dGUgcHJvZHVjdCBhbmQgY2Fycnkgc3VtIGZvciB0aGlzIHRlcm0gKi8KLSAgICByICAgICAgID0gKChtcF93b3JkKSB1KSArICgobXBfd29yZCkqdG1wYSsrKSAqICgobXBfd29yZCliKTsKLQotICAgIC8qIG1hc2sgb2ZmIGhpZ2hlciBiaXRzIHRvIGdldCBhIHNpbmdsZSBkaWdpdCAqLwotICAgICp0bXBjKysgPSAobXBfZGlnaXQpIChyICYgKChtcF93b3JkKSBNUF9NQVNLKSk7Ci0KLSAgICAvKiBzZW5kIGNhcnJ5IGludG8gbmV4dCBpdGVyYXRpb24gKi8KLSAgICB1ICAgICAgID0gKG1wX2RpZ2l0KSAociA+PiAoKG1wX3dvcmQpIERJR0lUX0JJVCkpOwotICB9Ci0KLSAgLyogc3RvcmUgZmluYWwgY2FycnkgW2lmIGFueV0gKi8KLSAgKnRtcGMrKyA9IHU7Ci0KLSAgLyogbm93IHplcm8gZGlnaXRzIGFib3ZlIHRoZSB0b3AgKi8KLSAgd2hpbGUgKGl4KysgPCBvbGR1c2UpIHsKLSAgICAgKnRtcGMrKyA9IDA7Ci0gIH0KLQotICAvKiBzZXQgdXNlZCBjb3VudCAqLwotICBjLT51c2VkID0gYS0+dXNlZCArIDE7Ci0gIG1wX2NsYW1wKGMpOwotCi0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX211bF9kLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX211bG1vZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBkID0gYSAqIGIgKG1vZCBjKSAqLwotaW50Ci1tcF9tdWxtb2QgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMsIG1wX2ludCAqIGQpCi17Ci0gIGludCAgICAgcmVzOwotICBtcF9pbnQgIHQ7Ci0KLSAgaWYgKChyZXMgPSBtcF9pbml0ICgmdCkpICE9IE1QX09LQVkpIHsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgaWYgKChyZXMgPSBtcF9tdWwgKGEsIGIsICZ0KSkgIT0gTVBfT0tBWSkgewotICAgIG1wX2NsZWFyICgmdCk7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotICByZXMgPSBtcF9tb2QgKCZ0LCBjLCBkKTsKLSAgbXBfY2xlYXIgKCZ0KTsKLSAgcmV0dXJuIHJlczsKLX0KLQotLyogRW5kOiBibl9tcF9tdWxtb2QuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfbl9yb290LmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGZpbmQgdGhlIG4ndGggcm9vdCBvZiBhbiBpbnRlZ2VyIAotICoKLSAqIFJlc3VsdCBmb3VuZCBzdWNoIHRoYXQgKGMpKipiIDw9IGEgYW5kIChjKzEpKipiID4gYSAKLSAqCi0gKiBUaGlzIGFsZ29yaXRobSB1c2VzIE5ld3RvbidzIGFwcHJveGltYXRpb24gCi0gKiB4W2krMV0gPSB4W2ldIC0gZih4W2ldKS9mJyh4W2ldKSAKLSAqIHdoaWNoIHdpbGwgZmluZCB0aGUgcm9vdCBpbiBsb2coTikgdGltZSB3aGVyZSAKLSAqIGVhY2ggc3RlcCBpbnZvbHZlcyBhIGZhaXIgYml0LiAgVGhpcyBpcyBub3QgbWVhbnQgdG8gCi0gKiBmaW5kIGh1Z2Ugcm9vdHMgW3NxdWFyZSBhbmQgY3ViZSwgZXRjXS4KLSAqLwotaW50IG1wX25fcm9vdCAobXBfaW50ICogYSwgbXBfZGlnaXQgYiwgbXBfaW50ICogYykKLXsKLSAgbXBfaW50ICB0MSwgdDIsIHQzOwotICBpbnQgICAgIHJlcywgbmVnOwotCi0gIC8qIGlucHV0IG11c3QgYmUgcG9zaXRpdmUgaWYgYiBpcyBldmVuICovCi0gIGlmICgoYiAmIDEpID09IDAgJiYgYS0+c2lnbiA9PSBNUF9ORUcpIHsKLSAgICByZXR1cm4gTVBfVkFMOwotICB9Ci0KLSAgaWYgKChyZXMgPSBtcF9pbml0ICgmdDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIGlmICgocmVzID0gbXBfaW5pdCAoJnQyKSkgIT0gTVBfT0tBWSkgewotICAgIGdvdG8gX19UMTsKLSAgfQotCi0gIGlmICgocmVzID0gbXBfaW5pdCAoJnQzKSkgIT0gTVBfT0tBWSkgewotICAgIGdvdG8gX19UMjsKLSAgfQotCi0gIC8qIGlmIGEgaXMgbmVnYXRpdmUgZnVkZ2UgdGhlIHNpZ24gYnV0IGtlZXAgdHJhY2sgKi8KLSAgbmVnICAgICA9IGEtPnNpZ247Ci0gIGEtPnNpZ24gPSBNUF9aUE9TOwotCi0gIC8qIHQyID0gMiAqLwotICBtcF9zZXQgKCZ0MiwgMik7Ci0KLSAgZG8gewotICAgIC8qIHQxID0gdDIgKi8KLSAgICBpZiAoKHJlcyA9IG1wX2NvcHkgKCZ0MiwgJnQxKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX1QzOwotICAgIH0KLQotICAgIC8qIHQyID0gdDEgLSAoKHQxKipiIC0gYSkgLyAoYiAqIHQxKiooYi0xKSkpICovCi0gICAgCi0gICAgLyogdDMgPSB0MSoqKGItMSkgKi8KLSAgICBpZiAoKHJlcyA9IG1wX2V4cHRfZCAoJnQxLCBiIC0gMSwgJnQzKSkgIT0gTVBfT0tBWSkgeyAgIAotICAgICAgZ290byBfX1QzOwotICAgIH0KLQotICAgIC8qIG51bWVyYXRvciAqLwotICAgIC8qIHQyID0gdDEqKmIgKi8KLSAgICBpZiAoKHJlcyA9IG1wX211bCAoJnQzLCAmdDEsICZ0MikpICE9IE1QX09LQVkpIHsgICAgCi0gICAgICBnb3RvIF9fVDM7Ci0gICAgfQotCi0gICAgLyogdDIgPSB0MSoqYiAtIGEgKi8KLSAgICBpZiAoKHJlcyA9IG1wX3N1YiAoJnQyLCBhLCAmdDIpKSAhPSBNUF9PS0FZKSB7ICAKLSAgICAgIGdvdG8gX19UMzsKLSAgICB9Ci0KLSAgICAvKiBkZW5vbWluYXRvciAqLwotICAgIC8qIHQzID0gdDEqKihiLTEpICogYiAgKi8KLSAgICBpZiAoKHJlcyA9IG1wX211bF9kICgmdDMsIGIsICZ0MykpICE9IE1QX09LQVkpIHsgICAgCi0gICAgICBnb3RvIF9fVDM7Ci0gICAgfQotCi0gICAgLyogdDMgPSAodDEqKmIgLSBhKS8oYiAqIHQxKiooYi0xKSkgKi8KLSAgICBpZiAoKHJlcyA9IG1wX2RpdiAoJnQyLCAmdDMsICZ0MywgTlVMTCkpICE9IE1QX09LQVkpIHsgIAotICAgICAgZ290byBfX1QzOwotICAgIH0KLQotICAgIGlmICgocmVzID0gbXBfc3ViICgmdDEsICZ0MywgJnQyKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX1QzOwotICAgIH0KLSAgfSAgd2hpbGUgKG1wX2NtcCAoJnQxLCAmdDIpICE9IE1QX0VRKTsKLQotICAvKiByZXN1bHQgY2FuIGJlIG9mZiBieSBhIGZldyBzbyBjaGVjayAqLwotICBmb3IgKDs7KSB7Ci0gICAgaWYgKChyZXMgPSBtcF9leHB0X2QgKCZ0MSwgYiwgJnQyKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBfX1QzOwotICAgIH0KLQotICAgIGlmIChtcF9jbXAgKCZ0MiwgYSkgPT0gTVBfR1QpIHsKLSAgICAgIGlmICgocmVzID0gbXBfc3ViX2QgKCZ0MSwgMSwgJnQxKSkgIT0gTVBfT0tBWSkgewotICAgICAgICAgZ290byBfX1QzOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvKiByZXNldCB0aGUgc2lnbiBvZiBhIGZpcnN0ICovCi0gIGEtPnNpZ24gPSBuZWc7Ci0KLSAgLyogc2V0IHRoZSByZXN1bHQgKi8KLSAgbXBfZXhjaCAoJnQxLCBjKTsKLQotICAvKiBzZXQgdGhlIHNpZ24gb2YgdGhlIHJlc3VsdCAqLwotICBjLT5zaWduID0gbmVnOwotCi0gIHJlcyA9IE1QX09LQVk7Ci0KLV9fVDM6bXBfY2xlYXIgKCZ0Myk7Ci1fX1QyOm1wX2NsZWFyICgmdDIpOwotX19UMTptcF9jbGVhciAoJnQxKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotLyogRW5kOiBibl9tcF9uX3Jvb3QuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfbmVnLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGIgPSAtYSAqLwotaW50IG1wX25lZyAobXBfaW50ICogYSwgbXBfaW50ICogYikKLXsKLSAgaW50ICAgICByZXM7Ci0gIGlmICgocmVzID0gbXBfY29weSAoYSwgYikpICE9IE1QX09LQVkpIHsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0gIGlmIChtcF9pc3plcm8oYikgIT0gTVBfWUVTKSB7Ci0gICAgIGItPnNpZ24gPSAoYS0+c2lnbiA9PSBNUF9aUE9TKSA/IE1QX05FRyA6IE1QX1pQT1M7Ci0gIH0KLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfbmVnLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX29yLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIE9SIHR3byBpbnRzIHRvZ2V0aGVyICovCi1pbnQgbXBfb3IgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMpCi17Ci0gIGludCAgICAgcmVzLCBpeCwgcHg7Ci0gIG1wX2ludCAgdCwgKng7Ci0KLSAgaWYgKGEtPnVzZWQgPiBiLT51c2VkKSB7Ci0gICAgaWYgKChyZXMgPSBtcF9pbml0X2NvcHkgKCZ0LCBhKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcHggPSBiLT51c2VkOwotICAgIHggPSBiOwotICB9IGVsc2UgewotICAgIGlmICgocmVzID0gbXBfaW5pdF9jb3B5ICgmdCwgYikpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIHB4ID0gYS0+dXNlZDsKLSAgICB4ID0gYTsKLSAgfQotCi0gIGZvciAoaXggPSAwOyBpeCA8IHB4OyBpeCsrKSB7Ci0gICAgdC5kcFtpeF0gfD0geC0+ZHBbaXhdOwotICB9Ci0gIG1wX2NsYW1wICgmdCk7Ci0gIG1wX2V4Y2ggKGMsICZ0KTsKLSAgbXBfY2xlYXIgKCZ0KTsKLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfb3IuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfcHJpbWVfZmVybWF0LmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHBlcmZvcm1zIG9uZSBGZXJtYXQgdGVzdC4KLSAqIAotICogSWYgImEiIHdlcmUgcHJpbWUgdGhlbiBiKiphID09IGIgKG1vZCBhKSBzaW5jZSB0aGUgb3JkZXIgb2YKLSAqIHRoZSBtdWx0aXBsaWNhdGl2ZSBzdWItZ3JvdXAgd291bGQgYmUgcGhpKGEpID0gYS0xLiAgVGhhdCBtZWFucwotICogaXQgd291bGQgYmUgdGhlIHNhbWUgYXMgYioqKGEgbW9kIChhLTEpKSA9PSBiKioxID09IGIgKG1vZCBhKS4KLSAqCi0gKiBTZXRzIHJlc3VsdCB0byAxIGlmIHRoZSBjb25ncnVlbmNlIGhvbGRzLCBvciB6ZXJvIG90aGVyd2lzZS4KLSAqLwotaW50IG1wX3ByaW1lX2Zlcm1hdCAobXBfaW50ICogYSwgbXBfaW50ICogYiwgaW50ICpyZXN1bHQpCi17Ci0gIG1wX2ludCAgdDsKLSAgaW50ICAgICBlcnI7Ci0KLSAgLyogZGVmYXVsdCB0byBjb21wb3NpdGUgICovCi0gICpyZXN1bHQgPSBNUF9OTzsKLQotICAvKiBlbnN1cmUgYiA+IDEgKi8KLSAgaWYgKG1wX2NtcF9kKGIsIDEpICE9IE1QX0dUKSB7Ci0gICAgIHJldHVybiBNUF9WQUw7Ci0gIH0KLQotICAvKiBpbml0IHQgKi8KLSAgaWYgKChlcnIgPSBtcF9pbml0ICgmdCkpICE9IE1QX09LQVkpIHsKLSAgICByZXR1cm4gZXJyOwotICB9Ci0KLSAgLyogY29tcHV0ZSB0ID0gYioqYSBtb2QgYSAqLwotICBpZiAoKGVyciA9IG1wX2V4cHRtb2QgKGIsIGEsIGEsICZ0KSkgIT0gTVBfT0tBWSkgewotICAgIGdvdG8gX19UOwotICB9Ci0KLSAgLyogaXMgaXQgZXF1YWwgdG8gYj8gKi8KLSAgaWYgKG1wX2NtcCAoJnQsIGIpID09IE1QX0VRKSB7Ci0gICAgKnJlc3VsdCA9IE1QX1lFUzsKLSAgfQotCi0gIGVyciA9IE1QX09LQVk7Ci1fX1Q6bXBfY2xlYXIgKCZ0KTsKLSAgcmV0dXJuIGVycjsKLX0KLQotLyogRW5kOiBibl9tcF9wcmltZV9mZXJtYXQuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfcHJpbWVfaXNfZGl2aXNpYmxlLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGRldGVybWluZXMgaWYgYW4gaW50ZWdlcnMgaXMgZGl2aXNpYmxlIGJ5IG9uZSAKLSAqIG9mIHRoZSBmaXJzdCBQUklNRV9TSVpFIHByaW1lcyBvciBub3QKLSAqCi0gKiBzZXRzIHJlc3VsdCB0byAwIGlmIG5vdCwgMSBpZiB5ZXMKLSAqLwotaW50IG1wX3ByaW1lX2lzX2RpdmlzaWJsZSAobXBfaW50ICogYSwgaW50ICpyZXN1bHQpCi17Ci0gIGludCAgICAgZXJyLCBpeDsKLSAgbXBfZGlnaXQgcmVzOwotCi0gIC8qIGRlZmF1bHQgdG8gbm90ICovCi0gICpyZXN1bHQgPSBNUF9OTzsKLQotICBmb3IgKGl4ID0gMDsgaXggPCBQUklNRV9TSVpFOyBpeCsrKSB7Ci0gICAgLyogd2hhdCBpcyBhIG1vZCBfX3ByaW1lX3RhYltpeF0gKi8KLSAgICBpZiAoKGVyciA9IG1wX21vZF9kIChhLCBfX3ByaW1lX3RhYltpeF0sICZyZXMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSByZXNpZHVlIHplcm8/ICovCi0gICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAqcmVzdWx0ID0gTVBfWUVTOwotICAgICAgcmV0dXJuIE1QX09LQVk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfcHJpbWVfaXNfZGl2aXNpYmxlLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX3ByaW1lX2lzX3ByaW1lLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHBlcmZvcm1zIGEgdmFyaWFibGUgbnVtYmVyIG9mIHJvdW5kcyBvZiBNaWxsZXItUmFiaW4KLSAqCi0gKiBQcm9iYWJpbGl0eSBvZiBlcnJvciBhZnRlciB0IHJvdW5kcyBpcyBubyBtb3JlIHRoYW4KLSAqICgxLzQpXnQgd2hlbiAxIDw9IHQgPD0gUFJJTUVfU0laRQotICoKLSAqIFNldHMgcmVzdWx0IHRvIDEgaWYgcHJvYmFibHkgcHJpbWUsIDAgb3RoZXJ3aXNlCi0gKi8KLWludCBtcF9wcmltZV9pc19wcmltZSAobXBfaW50ICogYSwgaW50IHQsIGludCAqcmVzdWx0KQotewotICBtcF9pbnQgIGI7Ci0gIGludCAgICAgaXgsIGVyciwgcmVzOwotCi0gIC8qIGRlZmF1bHQgdG8gbm8gKi8KLSAgKnJlc3VsdCA9IE1QX05POwotCi0gIC8qIHZhbGlkIHZhbHVlIG9mIHQ/ICovCi0gIGlmICh0IDw9IDAgfHwgdCA+IFBSSU1FX1NJWkUpIHsKLSAgICByZXR1cm4gTVBfVkFMOwotICB9Ci0KLSAgLyogaXMgdGhlIGlucHV0IGVxdWFsIHRvIG9uZSBvZiB0aGUgcHJpbWVzIGluIHRoZSB0YWJsZT8gKi8KLSAgZm9yIChpeCA9IDA7IGl4IDwgUFJJTUVfU0laRTsgaXgrKykgewotICAgICAgaWYgKG1wX2NtcF9kKGEsIF9fcHJpbWVfdGFiW2l4XSkgPT0gTVBfRVEpIHsKLSAgICAgICAgICpyZXN1bHQgPSAxOwotICAgICAgICAgcmV0dXJuIE1QX09LQVk7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBmaXJzdCBwZXJmb3JtIHRyaWFsIGRpdmlzaW9uICovCi0gIGlmICgoZXJyID0gbXBfcHJpbWVfaXNfZGl2aXNpYmxlIChhLCAmcmVzKSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiBlcnI7Ci0gIH0KLQotICAvKiByZXR1cm4gaWYgaXQgd2FzIHRyaXZpYWxseSBkaXZpc2libGUgKi8KLSAgaWYgKHJlcyA9PSBNUF9ZRVMpIHsKLSAgICByZXR1cm4gTVBfT0tBWTsKLSAgfQotCi0gIC8qIG5vdyBwZXJmb3JtIHRoZSBtaWxsZXItcmFiaW4gcm91bmRzICovCi0gIGlmICgoZXJyID0gbXBfaW5pdCAoJmIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIGVycjsKLSAgfQotCi0gIGZvciAoaXggPSAwOyBpeCA8IHQ7IGl4KyspIHsKLSAgICAvKiBzZXQgdGhlIHByaW1lICovCi0gICAgbXBfc2V0ICgmYiwgX19wcmltZV90YWJbaXhdKTsKLQotICAgIGlmICgoZXJyID0gbXBfcHJpbWVfbWlsbGVyX3JhYmluIChhLCAmYiwgJnJlcykpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19COwotICAgIH0KLQotICAgIGlmIChyZXMgPT0gTVBfTk8pIHsKLSAgICAgIGdvdG8gX19COwotICAgIH0KLSAgfQotCi0gIC8qIHBhc3NlZCB0aGUgdGVzdCAqLwotICAqcmVzdWx0ID0gTVBfWUVTOwotX19COm1wX2NsZWFyICgmYik7Ci0gIHJldHVybiBlcnI7Ci19Ci0KLS8qIEVuZDogYm5fbXBfcHJpbWVfaXNfcHJpbWUuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfcHJpbWVfbWlsbGVyX3JhYmluLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIE1pbGxlci1SYWJpbiB0ZXN0IG9mICJhIiB0byB0aGUgYmFzZSBvZiAiYiIgYXMgZGVzY3JpYmVkIGluIAotICogSEFDIHBwLiAxMzkgQWxnb3JpdGhtIDQuMjQKLSAqCi0gKiBTZXRzIHJlc3VsdCB0byAwIGlmIGRlZmluaXRlbHkgY29tcG9zaXRlIG9yIDEgaWYgcHJvYmFibHkgcHJpbWUuCi0gKiBSYW5kb21seSB0aGUgY2hhbmNlIG9mIGVycm9yIGlzIG5vIG1vcmUgdGhhbiAxLzQgYW5kIG9mdGVuIAotICogdmVyeSBtdWNoIGxvd2VyLgotICovCi1pbnQgbXBfcHJpbWVfbWlsbGVyX3JhYmluIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiLCBpbnQgKnJlc3VsdCkKLXsKLSAgbXBfaW50ICBuMSwgeSwgcjsKLSAgaW50ICAgICBzLCBqLCBlcnI7Ci0KLSAgLyogZGVmYXVsdCAqLwotICAqcmVzdWx0ID0gTVBfTk87Ci0KLSAgLyogZW5zdXJlIGIgPiAxICovCi0gIGlmIChtcF9jbXBfZChiLCAxKSAhPSBNUF9HVCkgewotICAgICByZXR1cm4gTVBfVkFMOwotICB9ICAgICAKLQotICAvKiBnZXQgbjEgPSBhIC0gMSAqLwotICBpZiAoKGVyciA9IG1wX2luaXRfY29weSAoJm4xLCBhKSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiBlcnI7Ci0gIH0KLSAgaWYgKChlcnIgPSBtcF9zdWJfZCAoJm4xLCAxLCAmbjEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX04xOwotICB9Ci0KLSAgLyogc2V0IDIqKnMgKiByID0gbjEgKi8KLSAgaWYgKChlcnIgPSBtcF9pbml0X2NvcHkgKCZyLCAmbjEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX04xOwotICB9Ci0KLSAgLyogY291bnQgdGhlIG51bWJlciBvZiBsZWFzdCBzaWduaWZpY2FudCBiaXRzCi0gICAqIHdoaWNoIGFyZSB6ZXJvCi0gICAqLwotICBzID0gbXBfY250X2xzYigmcik7Ci0KLSAgLyogbm93IGRpdmlkZSBuIC0gMSBieSAyKipzICovCi0gIGlmICgoZXJyID0gbXBfZGl2XzJkICgmciwgcywgJnIsIE5VTEwpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX1I7Ci0gIH0KLQotICAvKiBjb21wdXRlIHkgPSBiKipyIG1vZCBhICovCi0gIGlmICgoZXJyID0gbXBfaW5pdCAoJnkpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX1I7Ci0gIH0KLSAgaWYgKChlcnIgPSBtcF9leHB0bW9kIChiLCAmciwgYSwgJnkpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX1k7Ci0gIH0KLQotICAvKiBpZiB5ICE9IDEgYW5kIHkgIT0gbjEgZG8gKi8KLSAgaWYgKG1wX2NtcF9kICgmeSwgMSkgIT0gTVBfRVEgJiYgbXBfY21wICgmeSwgJm4xKSAhPSBNUF9FUSkgewotICAgIGogPSAxOwotICAgIC8qIHdoaWxlIGogPD0gcy0xIGFuZCB5ICE9IG4xICovCi0gICAgd2hpbGUgKChqIDw9IChzIC0gMSkpICYmIG1wX2NtcCAoJnksICZuMSkgIT0gTVBfRVEpIHsKLSAgICAgIGlmICgoZXJyID0gbXBfc3FybW9kICgmeSwgYSwgJnkpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICBnb3RvIF9fWTsKLSAgICAgIH0KLQotICAgICAgLyogaWYgeSA9PSAxIHRoZW4gY29tcG9zaXRlICovCi0gICAgICBpZiAobXBfY21wX2QgKCZ5LCAxKSA9PSBNUF9FUSkgewotICAgICAgICAgZ290byBfX1k7Ci0gICAgICB9Ci0KLSAgICAgICsrajsKLSAgICB9Ci0KLSAgICAvKiBpZiB5ICE9IG4xIHRoZW4gY29tcG9zaXRlICovCi0gICAgaWYgKG1wX2NtcCAoJnksICZuMSkgIT0gTVBfRVEpIHsKLSAgICAgIGdvdG8gX19ZOwotICAgIH0KLSAgfQotCi0gIC8qIHByb2JhYmx5IHByaW1lIG5vdyAqLwotICAqcmVzdWx0ID0gTVBfWUVTOwotX19ZOm1wX2NsZWFyICgmeSk7Ci1fX1I6bXBfY2xlYXIgKCZyKTsKLV9fTjE6bXBfY2xlYXIgKCZuMSk7Ci0gIHJldHVybiBlcnI7Ci19Ci0KLS8qIEVuZDogYm5fbXBfcHJpbWVfbWlsbGVyX3JhYmluLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX3ByaW1lX25leHRfcHJpbWUuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogZmluZHMgdGhlIG5leHQgcHJpbWUgYWZ0ZXIgdGhlIG51bWJlciAiYSIgdXNpbmcgInQiIHRyaWFscwotICogb2YgTWlsbGVyLVJhYmluLgotICoKLSAqIGJic19zdHlsZSA9IDEgbWVhbnMgdGhlIHByaW1lIG11c3QgYmUgY29uZ3J1ZW50IHRvIDMgbW9kIDQKLSAqLwotaW50IG1wX3ByaW1lX25leHRfcHJpbWUobXBfaW50ICphLCBpbnQgdCwgaW50IGJic19zdHlsZSkKLXsKLSAgIGludCAgICAgIGVyciwgcmVzLCB4LCB5OwotICAgbXBfZGlnaXQgcmVzX3RhYltQUklNRV9TSVpFXSwgc3RlcCwga3N0ZXA7Ci0gICBtcF9pbnQgICBiOwotCi0gICAvKiBlbnN1cmUgdCBpcyB2YWxpZCAqLwotICAgaWYgKHQgPD0gMCB8fCB0ID4gUFJJTUVfU0laRSkgewotICAgICAgcmV0dXJuIE1QX1ZBTDsKLSAgIH0KLQotICAgLyogZm9yY2UgcG9zaXRpdmUgKi8KLSAgIGEtPnNpZ24gPSBNUF9aUE9TOwotCi0gICAvKiBzaW1wbGUgYWxnbyBpZiBhIGlzIGxlc3MgdGhhbiB0aGUgbGFyZ2VzdCBwcmltZSBpbiB0aGUgdGFibGUgKi8KLSAgIGlmIChtcF9jbXBfZChhLCBfX3ByaW1lX3RhYltQUklNRV9TSVpFLTFdKSA9PSBNUF9MVCkgewotICAgICAgLyogZmluZCB3aGljaCBwcmltZSBpdCBpcyBiaWdnZXIgdGhhbiAqLwotICAgICAgZm9yICh4ID0gUFJJTUVfU0laRSAtIDI7IHggPj0gMDsgeC0tKSB7Ci0gICAgICAgICAgaWYgKG1wX2NtcF9kKGEsIF9fcHJpbWVfdGFiW3hdKSAhPSBNUF9MVCkgewotICAgICAgICAgICAgIGlmIChiYnNfc3R5bGUgPT0gMSkgewotICAgICAgICAgICAgICAgIC8qIG9rIHdlIGZvdW5kIGEgcHJpbWUgc21hbGxlciBvcgotICAgICAgICAgICAgICAgICAqIGVxdWFsIFtzbyB0aGUgbmV4dCBpcyBsYXJnZXJdCi0gICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgKiBob3dldmVyLCB0aGUgcHJpbWUgbXVzdCBiZQotICAgICAgICAgICAgICAgICAqIGNvbmdydWVudCB0byAzIG1vZCA0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKChfX3ByaW1lX3RhYlt4ICsgMV0gJiAzKSAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgLyogc2NhbiB1cHdhcmRzIGZvciBhIHByaW1lIGNvbmdydWVudCB0byAzIG1vZCA0ICovCi0gICAgICAgICAgICAgICAgICAgZm9yICh5ID0geCArIDE7IHkgPCBQUklNRV9TSVpFOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKChfX3ByaW1lX3RhYlt5XSAmIDMpID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXBfc2V0KGEsIF9fcHJpbWVfdGFiW3ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1QX09LQVk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbXBfc2V0KGEsIF9fcHJpbWVfdGFiW3ggKyAxXSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE1QX09LQVk7Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8qIGF0IHRoaXMgcG9pbnQgYSBtYXliZSAxICovCi0gICAgICBpZiAobXBfY21wX2QoYSwgMSkgPT0gTVBfRVEpIHsKLSAgICAgICAgIG1wX3NldChhLCAyKTsKLSAgICAgICAgIHJldHVybiBNUF9PS0FZOwotICAgICAgfQotICAgICAgLyogZmFsbCB0aHJvdWdoIHRvIHRoZSBzaWV2ZSAqLwotICAgfQotCi0gICAvKiBnZW5lcmF0ZSBhIHByaW1lIGNvbmdydWVudCB0byAzIG1vZCA0IG9yIDEvMyBtb2QgND8gKi8KLSAgIGlmIChiYnNfc3R5bGUgPT0gMSkgewotICAgICAga3N0ZXAgICA9IDQ7Ci0gICB9IGVsc2UgewotICAgICAga3N0ZXAgICA9IDI7Ci0gICB9Ci0KLSAgIC8qIGF0IHRoaXMgcG9pbnQgd2Ugd2lsbCB1c2UgYSBjb21iaW5hdGlvbiBvZiBhIHNpZXZlIGFuZCBNaWxsZXItUmFiaW4gKi8KLQotICAgaWYgKGJic19zdHlsZSA9PSAxKSB7Ci0gICAgICAvKiBpZiBhIG1vZCA0ICE9IDMgc3VidHJhY3QgdGhlIGNvcnJlY3QgdmFsdWUgdG8gbWFrZSBpdCBzbyAqLwotICAgICAgaWYgKChhLT5kcFswXSAmIDMpICE9IDMpIHsKLSAgICAgICAgIGlmICgoZXJyID0gbXBfc3ViX2QoYSwgKGEtPmRwWzBdICYgMykgKyAxLCBhKSkgIT0gTVBfT0tBWSkgeyByZXR1cm4gZXJyOyB9OwotICAgICAgfQotICAgfSBlbHNlIHsKLSAgICAgIGlmIChtcF9pc2V2ZW4oYSkgPT0gMSkgewotICAgICAgICAgLyogZm9yY2Ugb2RkICovCi0gICAgICAgICBpZiAoKGVyciA9IG1wX3N1Yl9kKGEsIDEsIGEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgfQotICAgICAgfQotICAgfQotCi0gICAvKiBnZW5lcmF0ZSB0aGUgcmVzdGFibGUgKi8KLSAgIGZvciAoeCA9IDE7IHggPCBQUklNRV9TSVpFOyB4KyspIHsKLSAgICAgIGlmICgoZXJyID0gbXBfbW9kX2QoYSwgX19wcmltZV90YWJbeF0sIHJlc190YWIgKyB4KSkgIT0gTVBfT0tBWSkgewotICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogaW5pdCB0ZW1wIHVzZWQgZm9yIE1pbGxlci1SYWJpbiBUZXN0aW5nICovCi0gICBpZiAoKGVyciA9IG1wX2luaXQoJmIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICBmb3IgKDs7KSB7Ci0gICAgICAvKiBza2lwIHRvIHRoZSBuZXh0IG5vbi10cml2aWFsbHkgZGl2aXNpYmxlIGNhbmRpZGF0ZSAqLwotICAgICAgc3RlcCA9IDA7Ci0gICAgICBkbyB7Ci0gICAgICAgICAvKiB5ID09IDEgaWYgYW55IHJlc2lkdWUgd2FzIHplcm8gW2UuZy4gY2Fubm90IGJlIHByaW1lXSAqLwotICAgICAgICAgeSAgICAgPSAgMDsKLQotICAgICAgICAgLyogaW5jcmVhc2Ugc3RlcCB0byBuZXh0IGNhbmRpZGF0ZSAqLwotICAgICAgICAgc3RlcCArPSBrc3RlcDsKLQotICAgICAgICAgLyogY29tcHV0ZSB0aGUgbmV3IHJlc2lkdWUgd2l0aG91dCB1c2luZyBkaXZpc2lvbiAqLwotICAgICAgICAgZm9yICh4ID0gMTsgeCA8IFBSSU1FX1NJWkU7IHgrKykgewotICAgICAgICAgICAgIC8qIGFkZCB0aGUgc3RlcCB0byBlYWNoIHJlc2lkdWUgKi8KLSAgICAgICAgICAgICByZXNfdGFiW3hdICs9IGtzdGVwOwotCi0gICAgICAgICAgICAgLyogc3VidHJhY3QgdGhlIG1vZHVsdXMgW2luc3RlYWQgb2YgdXNpbmcgZGl2aXNpb25dICovCi0gICAgICAgICAgICAgaWYgKHJlc190YWJbeF0gPj0gX19wcmltZV90YWJbeF0pIHsKLSAgICAgICAgICAgICAgICByZXNfdGFiW3hdICAtPSBfX3ByaW1lX3RhYlt4XTsKLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAvKiBzZXQgZmxhZyBpZiB6ZXJvICovCi0gICAgICAgICAgICAgaWYgKHJlc190YWJbeF0gPT0gMCkgewotICAgICAgICAgICAgICAgIHkgPSAxOwotICAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgIH0gd2hpbGUgKHkgPT0gMSAmJiBzdGVwIDwgKCgoKG1wX2RpZ2l0KTEpPDxESUdJVF9CSVQpIC0ga3N0ZXApKTsKLQotICAgICAgLyogYWRkIHRoZSBzdGVwICovCi0gICAgICBpZiAoKGVyciA9IG1wX2FkZF9kKGEsIHN0ZXAsIGEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICBnb3RvIF9fRVJSOwotICAgICAgfQotCi0gICAgICAvKiBpZiBkaWRuJ3QgcGFzcyBzaWV2ZSBhbmQgc3RlcCA9PSBNQVggdGhlbiBza2lwIHRlc3QgKi8KLSAgICAgIGlmICh5ID09IDEgJiYgc3RlcCA+PSAoKCgobXBfZGlnaXQpMSk8PERJR0lUX0JJVCkgLSBrc3RlcCkpIHsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvKiBpcyB0aGlzIHByaW1lPyAqLwotICAgICAgZm9yICh4ID0gMDsgeCA8IHQ7IHgrKykgewotICAgICAgICAgIG1wX3NldCgmYiwgX19wcmltZV90YWJbdF0pOwotICAgICAgICAgIGlmICgoZXJyID0gbXBfcHJpbWVfbWlsbGVyX3JhYmluKGEsICZiLCAmcmVzKSkgIT0gTVBfT0tBWSkgewotICAgICAgICAgICAgIGdvdG8gX19FUlI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChyZXMgPT0gTVBfTk8pIHsKLSAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXMgPT0gTVBfWUVTKSB7Ci0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgIH0KLQotICAgZXJyID0gTVBfT0tBWTsKLV9fRVJSOgotICAgbXBfY2xlYXIoJmIpOwotICAgcmV0dXJuIGVycjsKLX0KLQotCi0vKiBFbmQ6IGJuX21wX3ByaW1lX25leHRfcHJpbWUuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfcHJpbWVfcmFuZG9tX2V4LmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIG1ha2VzIGEgdHJ1bHkgcmFuZG9tIHByaW1lIG9mIGEgZ2l2ZW4gc2l6ZSAoYml0cyksCi0gKgotICogRmxhZ3MgYXJlIGFzIGZvbGxvd3M6Ci0gKiAKLSAqICAgTFRNX1BSSU1FX0JCUyAgICAgIC0gbWFrZSBwcmltZSBjb25ncnVlbnQgdG8gMyBtb2QgNAotICogICBMVE1fUFJJTUVfU0FGRSAgICAgLSBtYWtlIHN1cmUgKHAtMSkvMiBpcyBwcmltZSBhcyB3ZWxsIChpbXBsaWVzIExUTV9QUklNRV9CQlMpCi0gKiAgIExUTV9QUklNRV8yTVNCX09GRiAtIG1ha2UgdGhlIDJuZCBoaWdoZXN0IGJpdCB6ZXJvCi0gKiAgIExUTV9QUklNRV8yTVNCX09OICAtIG1ha2UgdGhlIDJuZCBoaWdoZXN0IGJpdCBvbmUKLSAqCi0gKiBZb3UgaGF2ZSB0byBzdXBwbHkgYSBjYWxsYmFjayB3aGljaCBmaWxscyBpbiBhIGJ1ZmZlciB3aXRoIHJhbmRvbSBieXRlcy4gICJkYXQiIGlzIGEgcGFyYW1ldGVyIHlvdSBjYW4KLSAqIGhhdmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayAoZS5nLiBhIHN0YXRlIG9yIHNvbWV0aGluZykuICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdXNlICJkYXQiIGl0c2VsZgotICogc28gaXQgY2FuIGJlIE5VTEwKLSAqCi0gKi8KLQotLyogVGhpcyBpcyBwb3NzaWJseSB0aGUgbW90aGVyIG9mIGFsbCBwcmltZSBnZW5lcmF0aW9uIGZ1bmN0aW9ucywgbXVhaGFoYWhhaGFoYSEgKi8KLWludCBtcF9wcmltZV9yYW5kb21fZXgobXBfaW50ICphLCBpbnQgdCwgaW50IHNpemUsIGludCBmbGFncywgbHRtX3ByaW1lX2NhbGxiYWNrIGNiLCB2b2lkICpkYXQpCi17Ci0gICB1bnNpZ25lZCBjaGFyICp0bXAsIG1hc2tBTkQsIG1hc2tPUl9tc2IsIG1hc2tPUl9sc2I7Ci0gICBpbnQgcmVzLCBlcnIsIGJzaXplLCBtYXNrT1JfbXNiX29mZnNldDsKLQotICAgLyogc2FuaXR5IGNoZWNrIHRoZSBpbnB1dCAqLwotICAgaWYgKHNpemUgPD0gMSB8fCB0IDw9IDApIHsKLSAgICAgIHJldHVybiBNUF9WQUw7Ci0gICB9Ci0KLSAgIC8qIExUTV9QUklNRV9TQUZFIGltcGxpZXMgTFRNX1BSSU1FX0JCUyAqLwotICAgaWYgKGZsYWdzICYgTFRNX1BSSU1FX1NBRkUpIHsKLSAgICAgIGZsYWdzIHw9IExUTV9QUklNRV9CQlM7Ci0gICB9Ci0KLSAgIC8qIGNhbGMgdGhlIGJ5dGUgc2l6ZSAqLwotICAgYnNpemUgPSAoc2l6ZT4+MykrKHNpemUmNz8xOjApOwotCi0gICAvKiB3ZSBuZWVkIGEgYnVmZmVyIG9mIGJzaXplIGJ5dGVzICovCi0gICB0bXAgPSBPUFRfQ0FTVCh1bnNpZ25lZCBjaGFyKSBYTUFMTE9DKGJzaXplKTsKLSAgIGlmICh0bXAgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE1QX01FTTsKLSAgIH0KLQotICAgLyogY2FsYyB0aGUgbWFza0FORCB2YWx1ZSBmb3IgdGhlIE1TYnl0ZSovCi0gICBtYXNrQU5EID0gMHhGRiA+PiAoOCAtIChzaXplICYgNykpOwotCi0gICAvKiBjYWxjIHRoZSBtYXNrT1JfbXNiICovCi0gICBtYXNrT1JfbXNiICAgICAgICA9IDA7Ci0gICBtYXNrT1JfbXNiX29mZnNldCA9IChzaXplIC0gMikgPj4gMzsKLSAgIGlmIChmbGFncyAmIExUTV9QUklNRV8yTVNCX09OKSB7Ci0gICAgICBtYXNrT1JfbXNiICAgICB8PSAxIDw8ICgoc2l6ZSAtIDIpICYgNyk7Ci0gICB9IGVsc2UgaWYgKGZsYWdzICYgTFRNX1BSSU1FXzJNU0JfT0ZGKSB7Ci0gICAgICBtYXNrQU5EICAgICAgICAmPSB+KDEgPDwgKChzaXplIC0gMikgJiA3KSk7Ci0gICB9Ci0KLSAgIC8qIGdldCB0aGUgbWFza09SX2xzYiAqLwotICAgbWFza09SX2xzYiAgICAgICAgID0gMDsKLSAgIGlmIChmbGFncyAmIExUTV9QUklNRV9CQlMpIHsKLSAgICAgIG1hc2tPUl9sc2IgICAgIHw9IDM7Ci0gICB9Ci0KLSAgIGRvIHsKLSAgICAgIC8qIHJlYWQgdGhlIGJ5dGVzICovCi0gICAgICBpZiAoY2IodG1wLCBic2l6ZSwgZGF0KSAhPSBic2l6ZSkgewotICAgICAgICAgZXJyID0gTVBfVkFMOwotICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgIH0KLSAKLSAgICAgIC8qIHdvcmsgb3ZlciB0aGUgTVNieXRlICovCi0gICAgICB0bXBbMF0gICAgJj0gbWFza0FORDsKLSAgICAgIHRtcFswXSAgICB8PSAxIDw8ICgoc2l6ZSAtIDEpICYgNyk7Ci0KLSAgICAgIC8qIG1peCBpbiB0aGUgbWFza09ScyAqLwotICAgICAgdG1wW21hc2tPUl9tc2Jfb2Zmc2V0XSAgIHw9IG1hc2tPUl9tc2I7Ci0gICAgICB0bXBbYnNpemUtMV0gICAgICAgICAgICAgfD0gbWFza09SX2xzYjsKLQotICAgICAgLyogcmVhZCBpdCBpbiAqLwotICAgICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbihhLCB0bXAsIGJzaXplKSkgIT0gTVBfT0tBWSkgICAgIHsgZ290byBlcnJvcjsgfQotCi0gICAgICAvKiBpcyBpdCBwcmltZT8gKi8KLSAgICAgIGlmICgoZXJyID0gbXBfcHJpbWVfaXNfcHJpbWUoYSwgdCwgJnJlcykpICE9IE1QX09LQVkpICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLQotICAgICAgaWYgKGZsYWdzICYgTFRNX1BSSU1FX1NBRkUpIHsKLSAgICAgICAgIC8qIHNlZSBpZiAoYS0xKS8yIGlzIHByaW1lICovCi0gICAgICAgICBpZiAoKGVyciA9IG1wX3N1Yl9kKGEsIDEsIGEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICAgICAgICBpZiAoKGVyciA9IG1wX2Rpdl8yKGEsIGEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gCi0gICAgICAgICAvKiBpcyBpdCBwcmltZT8gKi8KLSAgICAgICAgIGlmICgoZXJyID0gbXBfcHJpbWVfaXNfcHJpbWUoYSwgdCwgJnJlcykpICE9IE1QX09LQVkpICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgICAgIH0KLSAgIH0gd2hpbGUgKHJlcyA9PSBNUF9OTyk7Ci0KLSAgIGlmIChmbGFncyAmIExUTV9QUklNRV9TQUZFKSB7Ci0gICAgICAvKiByZXN0b3JlIGEgdG8gdGhlIG9yaWdpbmFsIHZhbHVlICovCi0gICAgICBpZiAoKGVyciA9IG1wX211bF8yKGEsIGEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICAgICBpZiAoKGVyciA9IG1wX2FkZF9kKGEsIDEsIGEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICB9Ci0KLSAgIGVyciA9IE1QX09LQVk7Ci1lcnJvcjoKLSAgIFhGUkVFKHRtcCk7Ci0gICByZXR1cm4gZXJyOwotfQotCi0KLQotLyogRW5kOiBibl9tcF9wcmltZV9yYW5kb21fZXguYyAqLwotCi0vKiBTdGFydDogYm5fbXBfcmFkaXhfc2l6ZS5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiByZXR1cm5zIHNpemUgb2YgQVNDSUkgcmVwcmVuc2VudGF0aW9uICovCi1pbnQgbXBfcmFkaXhfc2l6ZSAobXBfaW50ICogYSwgaW50IHJhZGl4LCBpbnQgKnNpemUpCi17Ci0gIGludCAgICAgcmVzLCBkaWdzOwotICBtcF9pbnQgIHQ7Ci0gIG1wX2RpZ2l0IGQ7Ci0KLSAgKnNpemUgPSAwOwotCi0gIC8qIHNwZWNpYWwgY2FzZSBmb3IgYmluYXJ5ICovCi0gIGlmIChyYWRpeCA9PSAyKSB7Ci0gICAgKnNpemUgPSBtcF9jb3VudF9iaXRzIChhKSArIChhLT5zaWduID09IE1QX05FRyA/IDEgOiAwKSArIDE7Ci0gICAgcmV0dXJuIE1QX09LQVk7Ci0gIH0KLQotICAvKiBtYWtlIHN1cmUgdGhlIHJhZGl4IGlzIGluIHJhbmdlICovCi0gIGlmIChyYWRpeCA8IDIgfHwgcmFkaXggPiA2NCkgewotICAgIHJldHVybiBNUF9WQUw7Ci0gIH0KLQotICAvKiBpbml0IGEgY29weSBvZiB0aGUgaW5wdXQgKi8KLSAgaWYgKChyZXMgPSBtcF9pbml0X2NvcHkgKCZ0LCBhKSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKiBkaWdzIGlzIHRoZSBkaWdpdCBjb3VudCAqLwotICBkaWdzID0gMDsKLQotICAvKiBpZiBpdCdzIG5lZ2F0aXZlIGFkZCBvbmUgZm9yIHRoZSBzaWduICovCi0gIGlmICh0LnNpZ24gPT0gTVBfTkVHKSB7Ci0gICAgKytkaWdzOwotICAgIHQuc2lnbiA9IE1QX1pQT1M7Ci0gIH0KLQotICAvKiBmZXRjaCBvdXQgYWxsIG9mIHRoZSBkaWdpdHMgKi8KLSAgd2hpbGUgKG1wX2lzemVybyAoJnQpID09IDApIHsKLSAgICBpZiAoKHJlcyA9IG1wX2Rpdl9kICgmdCwgKG1wX2RpZ2l0KSByYWRpeCwgJnQsICZkKSkgIT0gTVBfT0tBWSkgewotICAgICAgbXBfY2xlYXIgKCZ0KTsKLSAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgICsrZGlnczsKLSAgfQotICBtcF9jbGVhciAoJnQpOwotCi0gIC8qIHJldHVybiBkaWdzICsgMSwgdGhlIDEgaXMgZm9yIHRoZSBOVUxMIGJ5dGUgdGhhdCB3b3VsZCBiZSByZXF1aXJlZC4gKi8KLSAgKnNpemUgPSBkaWdzICsgMTsKLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLQotLyogRW5kOiBibl9tcF9yYWRpeF9zaXplLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX3JhZGl4X3NtYXAuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogY2hhcnMgdXNlZCBpbiByYWRpeCBjb252ZXJzaW9ucyAqLwotY29uc3QgY2hhciAqbXBfc19ybWFwID0gIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ky8iOwotCi0vKiBFbmQ6IGJuX21wX3JhZGl4X3NtYXAuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfcmFuZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBtYWtlcyBhIHBzZXVkby1yYW5kb20gaW50IG9mIGEgZ2l2ZW4gc2l6ZSAqLwotaW50Ci1tcF9yYW5kIChtcF9pbnQgKiBhLCBpbnQgZGlnaXRzKQotewotICBpbnQgICAgIHJlczsKLSAgbXBfZGlnaXQgZDsKLQotICBtcF96ZXJvIChhKTsKLSAgaWYgKGRpZ2l0cyA8PSAwKSB7Ci0gICAgcmV0dXJuIE1QX09LQVk7Ci0gIH0KLQotICAvKiBmaXJzdCBwbGFjZSBhIHJhbmRvbSBub24temVybyBkaWdpdCAqLwotICBkbyB7Ci0gICAgZCA9ICgobXBfZGlnaXQpIGFicyAocmFuZCAoKSkpOwotICB9IHdoaWxlIChkID09IDApOwotCi0gIGlmICgocmVzID0gbXBfYWRkX2QgKGEsIGQsIGEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIHdoaWxlIChkaWdpdHMtLSA+IDApIHsKLSAgICBpZiAoKHJlcyA9IG1wX2xzaGQgKGEsIDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIGlmICgocmVzID0gbXBfYWRkX2QgKGEsICgobXBfZGlnaXQpIGFicyAocmFuZCAoKSkpLCBhKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9tcF9yYW5kLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX3JlYWRfcmFkaXguYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogcmVhZCBhIHN0cmluZyBbQVNDSUldIGluIGEgZ2l2ZW4gcmFkaXggKi8KLWludCBtcF9yZWFkX3JhZGl4IChtcF9pbnQgKiBhLCBjaGFyICpzdHIsIGludCByYWRpeCkKLXsKLSAgaW50ICAgICB5LCByZXMsIG5lZzsKLSAgY2hhciAgICBjaDsKLQotICAvKiBtYWtlIHN1cmUgdGhlIHJhZGl4IGlzIG9rICovCi0gIGlmIChyYWRpeCA8IDIgfHwgcmFkaXggPiA2NCkgewotICAgIHJldHVybiBNUF9WQUw7Ci0gIH0KLQotICAvKiBpZiB0aGUgbGVhZGluZyBkaWdpdCBpcyBhIAotICAgKiBtaW51cyBzZXQgdGhlIHNpZ24gdG8gbmVnYXRpdmUuIAotICAgKi8KLSAgaWYgKCpzdHIgPT0gJy0nKSB7Ci0gICAgKytzdHI7Ci0gICAgbmVnID0gTVBfTkVHOwotICB9IGVsc2UgewotICAgIG5lZyA9IE1QX1pQT1M7Ci0gIH0KLQotICAvKiBzZXQgdGhlIGludGVnZXIgdG8gdGhlIGRlZmF1bHQgb2YgemVybyAqLwotICBtcF96ZXJvIChhKTsKLSAgCi0gIC8qIHByb2Nlc3MgZWFjaCBkaWdpdCBvZiB0aGUgc3RyaW5nICovCi0gIHdoaWxlICgqc3RyKSB7Ci0gICAgLyogaWYgdGhlIHJhZGl4IDwgMzYgdGhlIGNvbnZlcnNpb24gaXMgY2FzZSBpbnNlbnNpdGl2ZQotICAgICAqIHRoaXMgYWxsb3dzIG51bWJlcnMgbGlrZSAxQUIgYW5kIDFhYiB0byByZXByZXNlbnQgdGhlIHNhbWUgIHZhbHVlCi0gICAgICogW2UuZy4gaW4gaGV4XQotICAgICAqLwotICAgIGNoID0gKGNoYXIpICgocmFkaXggPCAzNikgPyB0b3VwcGVyICgqc3RyKSA6ICpzdHIpOwotICAgIGZvciAoeSA9IDA7IHkgPCA2NDsgeSsrKSB7Ci0gICAgICBpZiAoY2ggPT0gbXBfc19ybWFwW3ldKSB7Ci0gICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBpZiB0aGUgY2hhciB3YXMgZm91bmQgaW4gdGhlIG1hcCAKLSAgICAgKiBhbmQgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiByYWRpeCBhZGQgaXQKLSAgICAgKiB0byB0aGUgbnVtYmVyLCBvdGhlcndpc2UgZXhpdCB0aGUgbG9vcC4gCi0gICAgICovCi0gICAgaWYgKHkgPCByYWRpeCkgewotICAgICAgaWYgKChyZXMgPSBtcF9tdWxfZCAoYSwgKG1wX2RpZ2l0KSByYWRpeCwgYSkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICB9Ci0gICAgICBpZiAoKHJlcyA9IG1wX2FkZF9kIChhLCAobXBfZGlnaXQpIHksIGEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICByZXR1cm4gcmVzOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgKytzdHI7Ci0gIH0KLSAgCi0gIC8qIHNldCB0aGUgc2lnbiBvbmx5IGlmIGEgIT0gMCAqLwotICBpZiAobXBfaXN6ZXJvKGEpICE9IDEpIHsKLSAgICAgYS0+c2lnbiA9IG5lZzsKLSAgfQotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9tcF9yZWFkX3JhZGl4LmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX3JlYWRfc2lnbmVkX2Jpbi5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiByZWFkIHNpZ25lZCBiaW4sIGJpZyBlbmRpYW4sIGZpcnN0IGJ5dGUgaXMgMD09cG9zaXRpdmUgb3IgMT09bmVnYXRpdmUgKi8KLWludAotbXBfcmVhZF9zaWduZWRfYmluIChtcF9pbnQgKiBhLCB1bnNpZ25lZCBjaGFyICpiLCBpbnQgYykKLXsKLSAgaW50ICAgICByZXM7Ci0KLSAgLyogcmVhZCBtYWduaXR1ZGUgKi8KLSAgaWYgKChyZXMgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbiAoYSwgYiArIDEsIGMgLSAxKSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKiBmaXJzdCBieXRlIGlzIDAgZm9yIHBvc2l0aXZlLCBub24temVybyBmb3IgbmVnYXRpdmUgKi8KLSAgaWYgKGJbMF0gPT0gMCkgewotICAgICBhLT5zaWduID0gTVBfWlBPUzsKLSAgfSBlbHNlIHsKLSAgICAgYS0+c2lnbiA9IE1QX05FRzsKLSAgfQotCi0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX3JlYWRfc2lnbmVkX2Jpbi5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9yZWFkX3Vuc2lnbmVkX2Jpbi5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiByZWFkcyBhIHVuc2lnbmVkIGNoYXIgYXJyYXksIGFzc3VtZXMgdGhlIG1zYiBpcyBzdG9yZWQgZmlyc3QgW2JpZyBlbmRpYW5dICovCi1pbnQKLW1wX3JlYWRfdW5zaWduZWRfYmluIChtcF9pbnQgKiBhLCB1bnNpZ25lZCBjaGFyICpiLCBpbnQgYykKLXsKLSAgaW50ICAgICByZXM7Ci0KLSAgLyogbWFrZSBzdXJlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gZGlnaXRzICovCi0gIGlmIChhLT5hbGxvYyA8IDIpIHsKLSAgICAgaWYgKChyZXMgPSBtcF9ncm93KGEsIDIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgIH0KLSAgfQotCi0gIC8qIHplcm8gdGhlIGludCAqLwotICBtcF96ZXJvIChhKTsKLQotICAvKiByZWFkIHRoZSBieXRlcyBpbiAqLwotICB3aGlsZSAoYy0tID4gMCkgewotICAgIGlmICgocmVzID0gbXBfbXVsXzJkIChhLCA4LCBhKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0KLSNpZm5kZWYgTVBfOEJJVAotICAgICAgYS0+ZHBbMF0gfD0gKmIrKzsKLSAgICAgIGEtPnVzZWQgKz0gMTsKLSNlbHNlCi0gICAgICBhLT5kcFswXSA9ICgqYiAmIE1QX01BU0spOwotICAgICAgYS0+ZHBbMV0gfD0gKCgqYisrID4+IDdVKSAmIDEpOwotICAgICAgYS0+dXNlZCArPSAyOwotI2VuZGlmCi0gIH0KLSAgbXBfY2xhbXAgKGEpOwotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9tcF9yZWFkX3Vuc2lnbmVkX2Jpbi5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9yZWR1Y2UuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogcmVkdWNlcyB4IG1vZCBtLCBhc3N1bWVzIDAgPCB4IDwgbSoqMiwgbXUgaXMgCi0gKiBwcmVjb21wdXRlZCB2aWEgbXBfcmVkdWNlX3NldHVwLgotICogRnJvbSBIQUMgcHAuNjA0IEFsZ29yaXRobSAxNC40MgotICovCi1pbnQKLW1wX3JlZHVjZSAobXBfaW50ICogeCwgbXBfaW50ICogbSwgbXBfaW50ICogbXUpCi17Ci0gIG1wX2ludCAgcTsKLSAgaW50ICAgICByZXMsIHVtID0gbS0+dXNlZDsKLQotICAvKiBxID0geCAqLwotICBpZiAoKHJlcyA9IG1wX2luaXRfY29weSAoJnEsIHgpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qIHExID0geCAvIGIqKihrLTEpICAqLwotICBtcF9yc2hkICgmcSwgdW0gLSAxKTsgICAgICAgICAKLQotICAvKiBhY2NvcmRpbmcgdG8gSEFDIHRoaXMgb3B0aW1pemF0aW9uIGlzIG9rICovCi0gIGlmICgoKHVuc2lnbmVkIGxvbmcpIHVtKSA+ICgoKG1wX2RpZ2l0KTEpIDw8IChESUdJVF9CSVQgLSAxKSkpIHsKLSAgICBpZiAoKHJlcyA9IG1wX211bCAoJnEsIG11LCAmcSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gQ0xFQU5VUDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKChyZXMgPSBzX21wX211bF9oaWdoX2RpZ3MgKCZxLCBtdSwgJnEsIHVtIC0gMSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gQ0xFQU5VUDsKLSAgICB9Ci0gIH0KLQotICAvKiBxMyA9IHEyIC8gYioqKGsrMSkgKi8KLSAgbXBfcnNoZCAoJnEsIHVtICsgMSk7ICAgICAgICAgCi0KLSAgLyogeCA9IHggbW9kIGIqKihrKzEpLCBxdWljayAobm8gZGl2aXNpb24pICovCi0gIGlmICgocmVzID0gbXBfbW9kXzJkICh4LCBESUdJVF9CSVQgKiAodW0gKyAxKSwgeCkpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIENMRUFOVVA7Ci0gIH0KLQotICAvKiBxID0gcSAqIG0gbW9kIGIqKihrKzEpLCBxdWljayAobm8gZGl2aXNpb24pICovCi0gIGlmICgocmVzID0gc19tcF9tdWxfZGlncyAoJnEsIG0sICZxLCB1bSArIDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBDTEVBTlVQOwotICB9Ci0KLSAgLyogeCA9IHggLSBxICovCi0gIGlmICgocmVzID0gbXBfc3ViICh4LCAmcSwgeCkpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIENMRUFOVVA7Ci0gIH0KLQotICAvKiBJZiB4IDwgMCwgYWRkIGIqKihrKzEpIHRvIGl0ICovCi0gIGlmIChtcF9jbXBfZCAoeCwgMCkgPT0gTVBfTFQpIHsKLSAgICBtcF9zZXQgKCZxLCAxKTsKLSAgICBpZiAoKHJlcyA9IG1wX2xzaGQgKCZxLCB1bSArIDEpKSAhPSBNUF9PS0FZKQotICAgICAgZ290byBDTEVBTlVQOwotICAgIGlmICgocmVzID0gbXBfYWRkICh4LCAmcSwgeCkpICE9IE1QX09LQVkpCi0gICAgICBnb3RvIENMRUFOVVA7Ci0gIH0KLQotICAvKiBCYWNrIG9mZiBpZiBpdCdzIHRvbyBiaWcgKi8KLSAgd2hpbGUgKG1wX2NtcCAoeCwgbSkgIT0gTVBfTFQpIHsKLSAgICBpZiAoKHJlcyA9IHNfbXBfc3ViICh4LCBtLCB4KSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBDTEVBTlVQOwotICAgIH0KLSAgfQotICAKLUNMRUFOVVA6Ci0gIG1wX2NsZWFyICgmcSk7Ci0KLSAgcmV0dXJuIHJlczsKLX0KLQotLyogRW5kOiBibl9tcF9yZWR1Y2UuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfcmVkdWNlXzJrLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHJlZHVjZXMgYSBtb2R1bG8gbiB3aGVyZSBuIGlzIG9mIHRoZSBmb3JtIDIqKnAgLSBkICovCi1pbnQKLW1wX3JlZHVjZV8yayhtcF9pbnQgKmEsIG1wX2ludCAqbiwgbXBfZGlnaXQgZCkKLXsKLSAgIG1wX2ludCBxOwotICAgaW50ICAgIHAsIHJlczsKLSAgIAotICAgaWYgKChyZXMgPSBtcF9pbml0KCZxKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIHJlczsKLSAgIH0KLSAgIAotICAgcCA9IG1wX2NvdW50X2JpdHMobik7ICAgIAotdG9wOgotICAgLyogcSA9IGEvMioqcCwgYSA9IGEgbW9kIDIqKnAgKi8KLSAgIGlmICgocmVzID0gbXBfZGl2XzJkKGEsIHAsICZxLCBhKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBFUlI7Ci0gICB9Ci0gICAKLSAgIGlmIChkICE9IDEpIHsKLSAgICAgIC8qIHEgPSBxICogZCAqLwotICAgICAgaWYgKChyZXMgPSBtcF9tdWxfZCgmcSwgZCwgJnEpKSAhPSBNUF9PS0FZKSB7IAotICAgICAgICAgZ290byBFUlI7Ci0gICAgICB9Ci0gICB9Ci0gICAKLSAgIC8qIGEgPSBhICsgcSAqLwotICAgaWYgKChyZXMgPSBzX21wX2FkZChhLCAmcSwgYSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gRVJSOwotICAgfQotICAgCi0gICBpZiAobXBfY21wX21hZyhhLCBuKSAhPSBNUF9MVCkgewotICAgICAgc19tcF9zdWIoYSwgbiwgYSk7Ci0gICAgICBnb3RvIHRvcDsKLSAgIH0KLSAgIAotRVJSOgotICAgbXBfY2xlYXIoJnEpOwotICAgcmV0dXJuIHJlczsKLX0KLQotCi0vKiBFbmQ6IGJuX21wX3JlZHVjZV8yay5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9yZWR1Y2VfMmtfc2V0dXAuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogZGV0ZXJtaW5lcyB0aGUgc2V0dXAgdmFsdWUgKi8KLWludCAKLW1wX3JlZHVjZV8ya19zZXR1cChtcF9pbnQgKmEsIG1wX2RpZ2l0ICpkKQotewotICAgaW50IHJlcywgcDsKLSAgIG1wX2ludCB0bXA7Ci0gICAKLSAgIGlmICgocmVzID0gbXBfaW5pdCgmdG1wKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIHJlczsKLSAgIH0KLSAgIAotICAgcCA9IG1wX2NvdW50X2JpdHMoYSk7Ci0gICBpZiAoKHJlcyA9IG1wXzJleHB0KCZ0bXAsIHApKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBtcF9jbGVhcigmdG1wKTsKLSAgICAgIHJldHVybiByZXM7Ci0gICB9Ci0gICAKLSAgIGlmICgocmVzID0gc19tcF9zdWIoJnRtcCwgYSwgJnRtcCkpICE9IE1QX09LQVkpIHsKLSAgICAgIG1wX2NsZWFyKCZ0bXApOwotICAgICAgcmV0dXJuIHJlczsKLSAgIH0KLSAgIAotICAgKmQgPSB0bXAuZHBbMF07Ci0gICBtcF9jbGVhcigmdG1wKTsKLSAgIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX3JlZHVjZV8ya19zZXR1cC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9yZWR1Y2VfaXNfMmsuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogZGV0ZXJtaW5lcyBpZiBtcF9yZWR1Y2VfMmsgY2FuIGJlIHVzZWQgKi8KLWludCBtcF9yZWR1Y2VfaXNfMmsobXBfaW50ICphKQotewotICAgaW50IGl4LCBpeSwgaXosIGl3OwotICAgCi0gICBpZiAoYS0+dXNlZCA9PSAwKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgIH0gZWxzZSBpZiAoYS0+dXNlZCA9PSAxKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0gZWxzZSBpZiAoYS0+dXNlZCA+IDEpIHsKLSAgICAgIGl5ID0gbXBfY291bnRfYml0cyhhKTsKLSAgICAgIGl6ID0gMTsKLSAgICAgIGl3ID0gMTsKLSAgICAKLSAgICAgIC8qIFRlc3QgZXZlcnkgYml0IGZyb20gdGhlIHNlY29uZCBkaWdpdCB1cCwgbXVzdCBiZSAxICovCi0gICAgICBmb3IgKGl4ID0gRElHSVRfQklUOyBpeCA8IGl5OyBpeCsrKSB7Ci0gICAgICAgICAgaWYgKChhLT5kcFtpd10gJiBpeikgPT0gMCkgewotICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBpeiA8PD0gMTsKLSAgICAgICAgICBpZiAoaXogPiAoaW50KU1QX01BU0spIHsKLSAgICAgICAgICAgICArK2l3OwotICAgICAgICAgICAgIGl6ID0gMTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0gICByZXR1cm4gMTsKLX0KLQotCi0vKiBFbmQ6IGJuX21wX3JlZHVjZV9pc18yay5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9yZWR1Y2Vfc2V0dXAuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogcHJlLWNhbGN1bGF0ZSB0aGUgdmFsdWUgcmVxdWlyZWQgZm9yIEJhcnJldHQgcmVkdWN0aW9uCi0gKiBGb3IgYSBnaXZlbiBtb2R1bHVzICJiIiBpdCBjYWx1bGF0ZXMgdGhlIHZhbHVlIHJlcXVpcmVkIGluICJhIgotICovCi1pbnQKLW1wX3JlZHVjZV9zZXR1cCAobXBfaW50ICogYSwgbXBfaW50ICogYikKLXsKLSAgaW50ICAgICByZXM7Ci0gIAotICBpZiAoKHJlcyA9IG1wXzJleHB0IChhLCBiLT51c2VkICogMiAqIERJR0lUX0JJVCkpICE9IE1QX09LQVkpIHsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0gIHJldHVybiBtcF9kaXYgKGEsIGIsIGEsIE5VTEwpOwotfQotCi0vKiBFbmQ6IGJuX21wX3JlZHVjZV9zZXR1cC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9yc2hkLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHNoaWZ0IHJpZ2h0IGEgY2VydGFpbiBhbW91bnQgb2YgZGlnaXRzICovCi12b2lkIG1wX3JzaGQgKG1wX2ludCAqIGEsIGludCBiKQotewotICBpbnQgICAgIHg7Ci0KLSAgLyogaWYgYiA8PSAwIHRoZW4gaWdub3JlIGl0ICovCi0gIGlmIChiIDw9IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBpZiBiID4gdXNlZCB0aGVuIHNpbXBseSB6ZXJvIGl0IGFuZCByZXR1cm4gKi8KLSAgaWYgKGEtPnVzZWQgPD0gYikgewotICAgIG1wX3plcm8gKGEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHsKLSAgICByZWdpc3RlciBtcF9kaWdpdCAqYm90dG9tLCAqdG9wOwotCi0gICAgLyogc2hpZnQgdGhlIGRpZ2l0cyBkb3duICovCi0KLSAgICAvKiBib3R0b20gKi8KLSAgICBib3R0b20gPSBhLT5kcDsKLQotICAgIC8qIHRvcCBbb2Zmc2V0IGludG8gZGlnaXRzXSAqLwotICAgIHRvcCA9IGEtPmRwICsgYjsKLQotICAgIC8qIHRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBzbGlkaW5nIHdpbmRvdyB3aGVyZSAKLSAgICAgKiB0aGUgd2luZG93IGlzIGItZGlnaXRzIGxvbmcgYW5kIGRpZ2l0cyBmcm9tIAotICAgICAqIHRoZSB0b3Agb2YgdGhlIHdpbmRvdyBhcmUgY29waWVkIHRvIHRoZSBib3R0b20KLSAgICAgKgotICAgICAqIGUuZy4KLQotICAgICBiLTIgfCBiLTEgfCBiMCB8IGIxIHwgYjIgfCAuLi4gfCBiYiB8ICAgLS0tLT4KLSAgICAgICAgICAgICAgICAgL1wgICAgICAgICAgICAgICAgICAgfCAgICAgIC0tLS0+Ci0gICAgICAgICAgICAgICAgICBcLS0tLS0tLS0tLS0tLS0tLS0tLS8gICAgICAtLS0tPgotICAgICAqLwotICAgIGZvciAoeCA9IDA7IHggPCAoYS0+dXNlZCAtIGIpOyB4KyspIHsKLSAgICAgICpib3R0b20rKyA9ICp0b3ArKzsKLSAgICB9Ci0KLSAgICAvKiB6ZXJvIHRoZSB0b3AgZGlnaXRzICovCi0gICAgZm9yICg7IHggPCBhLT51c2VkOyB4KyspIHsKLSAgICAgICpib3R0b20rKyA9IDA7Ci0gICAgfQotICB9Ci0gIAotICAvKiByZW1vdmUgZXhjZXNzIGRpZ2l0cyAqLwotICBhLT51c2VkIC09IGI7Ci19Ci0KLS8qIEVuZDogYm5fbXBfcnNoZC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9zZXQuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogc2V0IHRvIGEgZGlnaXQgKi8KLXZvaWQgbXBfc2V0IChtcF9pbnQgKiBhLCBtcF9kaWdpdCBiKQotewotICBtcF96ZXJvIChhKTsKLSAgYS0+ZHBbMF0gPSBiICYgTVBfTUFTSzsKLSAgYS0+dXNlZCAgPSAoYS0+ZHBbMF0gIT0gMCkgPyAxIDogMDsKLX0KLQotLyogRW5kOiBibl9tcF9zZXQuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfc2V0X2ludC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBzZXQgYSAzMi1iaXQgY29uc3QgKi8KLWludCBtcF9zZXRfaW50IChtcF9pbnQgKiBhLCB1bnNpZ25lZCBsb25nIGIpCi17Ci0gIGludCAgICAgeCwgcmVzOwotCi0gIG1wX3plcm8gKGEpOwotICAKLSAgLyogc2V0IGZvdXIgYml0cyBhdCBhIHRpbWUgKi8KLSAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgewotICAgIC8qIHNoaWZ0IHRoZSBudW1iZXIgdXAgZm91ciBiaXRzICovCi0gICAgaWYgKChyZXMgPSBtcF9tdWxfMmQgKGEsIDQsIGEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIC8qIE9SIGluIHRoZSB0b3AgZm91ciBiaXRzIG9mIHRoZSBzb3VyY2UgKi8KLSAgICBhLT5kcFswXSB8PSAoYiA+PiAyOCkgJiAxNTsKLQotICAgIC8qIHNoaWZ0IHRoZSBzb3VyY2UgdXAgdG8gdGhlIG5leHQgZm91ciBiaXRzICovCi0gICAgYiA8PD0gNDsKLQotICAgIC8qIGVuc3VyZSB0aGF0IGRpZ2l0cyBhcmUgbm90IGNsYW1wZWQgb2ZmICovCi0gICAgYS0+dXNlZCArPSAxOwotICB9Ci0gIG1wX2NsYW1wIChhKTsKLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfc2V0X2ludC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9zaHJpbmsuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogc2hyaW5rIGEgYmlnbnVtICovCi1pbnQgbXBfc2hyaW5rIChtcF9pbnQgKiBhKQotewotICBtcF9kaWdpdCAqdG1wOwotICBpZiAoYS0+YWxsb2MgIT0gYS0+dXNlZCAmJiBhLT51c2VkID4gMCkgewotICAgIGlmICgodG1wID0gT1BUX0NBU1QobXBfZGlnaXQpIFhSRUFMTE9DIChhLT5kcCwgc2l6ZW9mIChtcF9kaWdpdCkgKiBhLT51c2VkKSkgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE1QX01FTTsKLSAgICB9Ci0gICAgYS0+ZHAgICAgPSB0bXA7Ci0gICAgYS0+YWxsb2MgPSBhLT51c2VkOwotICB9Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX3Nocmluay5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9zaWduZWRfYmluX3NpemUuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogZ2V0IHRoZSBzaXplIGZvciBhbiBzaWduZWQgZXF1aXZhbGVudCAqLwotaW50IG1wX3NpZ25lZF9iaW5fc2l6ZSAobXBfaW50ICogYSkKLXsKLSAgcmV0dXJuIDEgKyBtcF91bnNpZ25lZF9iaW5fc2l6ZSAoYSk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfc2lnbmVkX2Jpbl9zaXplLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX3Nxci5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBjb21wdXRlcyBiID0gYSphICovCi1pbnQKLW1wX3NxciAobXBfaW50ICogYSwgbXBfaW50ICogYikKLXsKLSAgaW50ICAgICByZXM7Ci0KLSAgLyogdXNlIFRvb20tQ29vaz8gKi8KLSAgaWYgKGEtPnVzZWQgPj0gVE9PTV9TUVJfQ1VUT0ZGKSB7Ci0gICAgcmVzID0gbXBfdG9vbV9zcXIoYSwgYik7Ci0gIC8qIEthcmF0c3ViYT8gKi8KLSAgfSBlbHNlIGlmIChhLT51c2VkID49IEtBUkFUU1VCQV9TUVJfQ1VUT0ZGKSB7Ci0gICAgcmVzID0gbXBfa2FyYXRzdWJhX3NxciAoYSwgYik7Ci0gIH0gZWxzZSB7Ci0gICAgLyogY2FuIHdlIHVzZSB0aGUgZmFzdCBjb21iYSBtdWx0aXBsaWVyPyAqLwotICAgIGlmICgoYS0+dXNlZCAqIDIgKyAxKSA8IE1QX1dBUlJBWSAmJiAKLSAgICAgICAgIGEtPnVzZWQgPCAKLSAgICAgICAgICgxIDw8IChzaXplb2YobXBfd29yZCkgKiBDSEFSX0JJVCAtIDIqRElHSVRfQklUIC0gMSkpKSB7Ci0gICAgICByZXMgPSBmYXN0X3NfbXBfc3FyIChhLCBiKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzID0gc19tcF9zcXIgKGEsIGIpOwotICAgIH0KLSAgfQotICBiLT5zaWduID0gTVBfWlBPUzsKLSAgcmV0dXJuIHJlczsKLX0KLQotLyogRW5kOiBibl9tcF9zcXIuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfc3FybW9kLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGMgPSBhICogYSAobW9kIGIpICovCi1pbnQKLW1wX3Nxcm1vZCAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYykKLXsKLSAgaW50ICAgICByZXM7Ci0gIG1wX2ludCAgdDsKLQotICBpZiAoKHJlcyA9IG1wX2luaXQgKCZ0KSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICBpZiAoKHJlcyA9IG1wX3NxciAoYSwgJnQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgbXBfY2xlYXIgKCZ0KTsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0gIHJlcyA9IG1wX21vZCAoJnQsIGIsIGMpOwotICBtcF9jbGVhciAoJnQpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiBFbmQ6IGJuX21wX3Nxcm1vZC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9zcXJ0LmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHRoaXMgZnVuY3Rpb24gaXMgbGVzcyBnZW5lcmljIHRoYW4gbXBfbl9yb290LCBzaW1wbGVyIGFuZCBmYXN0ZXIgKi8KLWludCBtcF9zcXJ0KG1wX2ludCAqYXJnLCBtcF9pbnQgKnJldCkgCi17Ci0gIGludCByZXM7Ci0gIG1wX2ludCB0MSx0MjsKLQotICAvKiBtdXN0IGJlIHBvc2l0aXZlICovCi0gIGlmIChhcmctPnNpZ24gPT0gTVBfTkVHKSB7Ci0gICAgcmV0dXJuIE1QX1ZBTDsKLSAgfQotCi0gIC8qIGVhc3kgb3V0ICovCi0gIGlmIChtcF9pc3plcm8oYXJnKSA9PSBNUF9ZRVMpIHsKLSAgICBtcF96ZXJvKHJldCk7Ci0gICAgcmV0dXJuIE1QX09LQVk7Ci0gIH0KLQotICBpZiAoKHJlcyA9IG1wX2luaXRfY29weSgmdDEsIGFyZykpICE9IE1QX09LQVkpIHsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgaWYgKChyZXMgPSBtcF9pbml0KCZ0MikpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIEUyOwotICB9Ci0KLSAgLyogRmlyc3QgYXBwcm94LiAobm90IHZlcnkgYmFkIGZvciBsYXJnZSBhcmcpICovCi0gIG1wX3JzaGQgKCZ0MSx0MS51c2VkLzIpOwotCi0gIC8qIHQxID4gMCAgKi8gCi0gIGlmICgocmVzID0gbXBfZGl2KGFyZywmdDEsJnQyLE5VTEwpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBFMTsKLSAgfQotICBpZiAoKHJlcyA9IG1wX2FkZCgmdDEsJnQyLCZ0MSkpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIEUxOwotICB9Ci0gIGlmICgocmVzID0gbXBfZGl2XzIoJnQxLCZ0MSkpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIEUxOwotICB9Ci0gIC8qIEFuZCBub3cgdDEgPiBzcXJ0KGFyZykgKi8KLSAgZG8geyAKLSAgICBpZiAoKHJlcyA9IG1wX2RpdihhcmcsJnQxLCZ0MixOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgZ290byBFMTsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9hZGQoJnQxLCZ0MiwmdDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIEUxOwotICAgIH0KLSAgICBpZiAoKHJlcyA9IG1wX2Rpdl8yKCZ0MSwmdDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIEUxOwotICAgIH0KLSAgICAvKiB0MSA+PSBzcXJ0KGFyZykgPj0gdDIgYXQgdGhpcyBwb2ludCAqLwotICB9IHdoaWxlIChtcF9jbXBfbWFnKCZ0MSwmdDIpID09IE1QX0dUKTsKLQotICBtcF9leGNoKCZ0MSxyZXQpOwotCi1FMTogbXBfY2xlYXIoJnQyKTsKLUUyOiBtcF9jbGVhcigmdDEpOwotICByZXR1cm4gcmVzOwotfQotCi0KLS8qIEVuZDogYm5fbXBfc3FydC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9zdWIuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogaGlnaCBsZXZlbCBzdWJ0cmFjdGlvbiAoaGFuZGxlcyBzaWducykgKi8KLWludAotbXBfc3ViIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiLCBtcF9pbnQgKiBjKQotewotICBpbnQgICAgIHNhLCBzYiwgcmVzOwotCi0gIHNhID0gYS0+c2lnbjsKLSAgc2IgPSBiLT5zaWduOwotCi0gIGlmIChzYSAhPSBzYikgewotICAgIC8qIHN1YnRyYWN0IGEgbmVnYXRpdmUgZnJvbSBhIHBvc2l0aXZlLCBPUiAqLwotICAgIC8qIHN1YnRyYWN0IGEgcG9zaXRpdmUgZnJvbSBhIG5lZ2F0aXZlLiAqLwotICAgIC8qIEluIGVpdGhlciBjYXNlLCBBREQgdGhlaXIgbWFnbml0dWRlcywgKi8KLSAgICAvKiBhbmQgdXNlIHRoZSBzaWduIG9mIHRoZSBmaXJzdCBudW1iZXIuICovCi0gICAgYy0+c2lnbiA9IHNhOwotICAgIHJlcyA9IHNfbXBfYWRkIChhLCBiLCBjKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBzdWJ0cmFjdCBhIHBvc2l0aXZlIGZyb20gYSBwb3NpdGl2ZSwgT1IgKi8KLSAgICAvKiBzdWJ0cmFjdCBhIG5lZ2F0aXZlIGZyb20gYSBuZWdhdGl2ZS4gKi8KLSAgICAvKiBGaXJzdCwgdGFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZWlyICovCi0gICAgLyogbWFnbml0dWRlcywgdGhlbi4uLiAqLwotICAgIGlmIChtcF9jbXBfbWFnIChhLCBiKSAhPSBNUF9MVCkgewotICAgICAgLyogQ29weSB0aGUgc2lnbiBmcm9tIHRoZSBmaXJzdCAqLwotICAgICAgYy0+c2lnbiA9IHNhOwotICAgICAgLyogVGhlIGZpcnN0IGhhcyBhIGxhcmdlciBvciBlcXVhbCBtYWduaXR1ZGUgKi8KLSAgICAgIHJlcyA9IHNfbXBfc3ViIChhLCBiLCBjKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogVGhlIHJlc3VsdCBoYXMgdGhlICpvcHBvc2l0ZSogc2lnbiBmcm9tICovCi0gICAgICAvKiB0aGUgZmlyc3QgbnVtYmVyLiAqLwotICAgICAgYy0+c2lnbiA9IChzYSA9PSBNUF9aUE9TKSA/IE1QX05FRyA6IE1QX1pQT1M7Ci0gICAgICAvKiBUaGUgc2Vjb25kIGhhcyBhIGxhcmdlciBtYWduaXR1ZGUgKi8KLSAgICAgIHJlcyA9IHNfbXBfc3ViIChiLCBhLCBjKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotCi0vKiBFbmQ6IGJuX21wX3N1Yi5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF9zdWJfZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBzaW5nbGUgZGlnaXQgc3VidHJhY3Rpb24gKi8KLWludAotbXBfc3ViX2QgKG1wX2ludCAqIGEsIG1wX2RpZ2l0IGIsIG1wX2ludCAqIGMpCi17Ci0gIG1wX2RpZ2l0ICp0bXBhLCAqdG1wYywgbXU7Ci0gIGludCAgICAgICByZXMsIGl4LCBvbGR1c2VkOwotCi0gIC8qIGdyb3cgYyBhcyByZXF1aXJlZCAqLwotICBpZiAoYy0+YWxsb2MgPCBhLT51c2VkICsgMSkgewotICAgICBpZiAoKHJlcyA9IG1wX2dyb3coYywgYS0+dXNlZCArIDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgIH0KLSAgfQotCi0gIC8qIGlmIGEgaXMgbmVnYXRpdmUganVzdCBkbyBhbiB1bnNpZ25lZAotICAgKiBhZGRpdGlvbiBbd2l0aCBmdWRnZWQgc2lnbnNdCi0gICAqLwotICBpZiAoYS0+c2lnbiA9PSBNUF9ORUcpIHsKLSAgICAgYS0+c2lnbiA9IE1QX1pQT1M7Ci0gICAgIHJlcyAgICAgPSBtcF9hZGRfZChhLCBiLCBjKTsKLSAgICAgYS0+c2lnbiA9IGMtPnNpZ24gPSBNUF9ORUc7Ci0gICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKiBzZXR1cCByZWdzICovCi0gIG9sZHVzZWQgPSBjLT51c2VkOwotICB0bXBhICAgID0gYS0+ZHA7Ci0gIHRtcGMgICAgPSBjLT5kcDsKLQotICAvKiBpZiBhIDw9IGIgc2ltcGx5IGZpeCB0aGUgc2luZ2xlIGRpZ2l0ICovCi0gIGlmICgoYS0+dXNlZCA9PSAxICYmIGEtPmRwWzBdIDw9IGIpIHx8IGEtPnVzZWQgPT0gMCkgewotICAgICBpZiAoYS0+dXNlZCA9PSAxKSB7Ci0gICAgICAgICp0bXBjKysgPSBiIC0gKnRtcGE7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgICp0bXBjKysgPSBiOwotICAgICB9Ci0gICAgIGl4ICAgICAgPSAxOwotCi0gICAgIC8qIG5lZ2F0aXZlLzFkaWdpdCAqLwotICAgICBjLT5zaWduID0gTVBfTkVHOwotICAgICBjLT51c2VkID0gMTsKLSAgfSBlbHNlIHsKLSAgICAgLyogcG9zaXRpdmUvc2l6ZSAqLwotICAgICBjLT5zaWduID0gTVBfWlBPUzsKLSAgICAgYy0+dXNlZCA9IGEtPnVzZWQ7Ci0KLSAgICAgLyogc3VidHJhY3QgZmlyc3QgZGlnaXQgKi8KLSAgICAgKnRtcGMgICAgPSAqdG1wYSsrIC0gYjsKLSAgICAgbXUgICAgICAgPSAqdG1wYyA+PiAoc2l6ZW9mKG1wX2RpZ2l0KSAqIENIQVJfQklUIC0gMSk7Ci0gICAgICp0bXBjKysgJj0gTVBfTUFTSzsKLQotICAgICAvKiBoYW5kbGUgcmVzdCBvZiB0aGUgZGlnaXRzICovCi0gICAgIGZvciAoaXggPSAxOyBpeCA8IGEtPnVzZWQ7IGl4KyspIHsKLSAgICAgICAgKnRtcGMgICAgPSAqdG1wYSsrIC0gbXU7Ci0gICAgICAgIG11ICAgICAgID0gKnRtcGMgPj4gKHNpemVvZihtcF9kaWdpdCkgKiBDSEFSX0JJVCAtIDEpOwotICAgICAgICAqdG1wYysrICY9IE1QX01BU0s7Ci0gICAgIH0KLSAgfQotCi0gIC8qIHplcm8gZXhjZXNzIGRpZ2l0cyAqLwotICB3aGlsZSAoaXgrKyA8IG9sZHVzZWQpIHsKLSAgICAgKnRtcGMrKyA9IDA7Ci0gIH0KLSAgbXBfY2xhbXAoYyk7Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0KLS8qIEVuZDogYm5fbXBfc3ViX2QuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfc3VibW9kLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGQgPSBhIC0gYiAobW9kIGMpICovCi1pbnQKLW1wX3N1Ym1vZCAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYywgbXBfaW50ICogZCkKLXsKLSAgaW50ICAgICByZXM7Ci0gIG1wX2ludCAgdDsKLQotCi0gIGlmICgocmVzID0gbXBfaW5pdCAoJnQpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIGlmICgocmVzID0gbXBfc3ViIChhLCBiLCAmdCkpICE9IE1QX09LQVkpIHsKLSAgICBtcF9jbGVhciAoJnQpOwotICAgIHJldHVybiByZXM7Ci0gIH0KLSAgcmVzID0gbXBfbW9kICgmdCwgYywgZCk7Ci0gIG1wX2NsZWFyICgmdCk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLS8qIEVuZDogYm5fbXBfc3VibW9kLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX3RvX3NpZ25lZF9iaW4uYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogc3RvcmUgaW4gc2lnbmVkIFtiaWcgZW5kaWFuXSBmb3JtYXQgKi8KLWludAotbXBfdG9fc2lnbmVkX2JpbiAobXBfaW50ICogYSwgdW5zaWduZWQgY2hhciAqYikKLXsKLSAgaW50ICAgICByZXM7Ci0KLSAgaWYgKChyZXMgPSBtcF90b191bnNpZ25lZF9iaW4gKGEsIGIgKyAxKSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLSAgYlswXSA9ICh1bnNpZ25lZCBjaGFyKSAoKGEtPnNpZ24gPT0gTVBfWlBPUykgPyAwIDogMSk7Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0vKiBFbmQ6IGJuX21wX3RvX3NpZ25lZF9iaW4uYyAqLwotCi0vKiBTdGFydDogYm5fbXBfdG9fdW5zaWduZWRfYmluLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHN0b3JlIGluIHVuc2lnbmVkIFtiaWcgZW5kaWFuXSBmb3JtYXQgKi8KLWludAotbXBfdG9fdW5zaWduZWRfYmluIChtcF9pbnQgKiBhLCB1bnNpZ25lZCBjaGFyICpiKQotewotICBpbnQgICAgIHgsIHJlczsKLSAgbXBfaW50ICB0OwotCi0gIGlmICgocmVzID0gbXBfaW5pdF9jb3B5ICgmdCwgYSkpICE9IE1QX09LQVkpIHsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgeCA9IDA7Ci0gIHdoaWxlIChtcF9pc3plcm8gKCZ0KSA9PSAwKSB7Ci0jaWZuZGVmIE1QXzhCSVQKLSAgICAgIGJbeCsrXSA9ICh1bnNpZ25lZCBjaGFyKSAodC5kcFswXSAmIDI1NSk7Ci0jZWxzZQotICAgICAgYlt4KytdID0gKHVuc2lnbmVkIGNoYXIpICh0LmRwWzBdIHwgKCh0LmRwWzFdICYgMHgwMSkgPDwgNykpOwotI2VuZGlmCi0gICAgaWYgKChyZXMgPSBtcF9kaXZfMmQgKCZ0LCA4LCAmdCwgTlVMTCkpICE9IE1QX09LQVkpIHsKLSAgICAgIG1wX2NsZWFyICgmdCk7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgfQotICBibl9yZXZlcnNlIChiLCB4KTsKLSAgbXBfY2xlYXIgKCZ0KTsKLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLS8qIEVuZDogYm5fbXBfdG9fdW5zaWduZWRfYmluLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX3Rvb21fbXVsLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIG11bHRpcGxpY2F0aW9uIHVzaW5nIHRoZSBUb29tLUNvb2sgMy13YXkgYWxnb3JpdGhtICovCi1pbnQgbXBfdG9vbV9tdWwobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYykKLXsKLSAgICBtcF9pbnQgdzAsIHcxLCB3MiwgdzMsIHc0LCB0bXAxLCB0bXAyLCBhMCwgYTEsIGEyLCBiMCwgYjEsIGIyOwotICAgIGludCByZXMsIEI7Ci0gICAgICAgIAotICAgIC8qIGluaXQgdGVtcHMgKi8KLSAgICBpZiAoKHJlcyA9IG1wX2luaXRfbXVsdGkoJncwLCAmdzEsICZ3MiwgJnczLCAmdzQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYTAsICZhMSwgJmEyLCAmYjAsICZiMSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiMiwgJnRtcDEsICZ0bXAyLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICAgIAotICAgIC8qIEIgKi8KLSAgICBCID0gTUlOKGEtPnVzZWQsIGItPnVzZWQpIC8gMzsKLSAgICAKLSAgICAvKiBhID0gYTIgKiBCKioyICsgYTEgKiBCICsgYTAgKi8KLSAgICBpZiAoKHJlcyA9IG1wX21vZF8yZChhLCBESUdJVF9CSVQgKiBCLCAmYTApKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotCi0gICAgaWYgKChyZXMgPSBtcF9jb3B5KGEsICZhMSkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgbXBfcnNoZCgmYTEsIEIpOwotICAgIG1wX21vZF8yZCgmYTEsIERJR0lUX0JJVCAqIEIsICZhMSk7Ci0KLSAgICBpZiAoKHJlcyA9IG1wX2NvcHkoYSwgJmEyKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICBtcF9yc2hkKCZhMiwgQioyKTsKLSAgICAKLSAgICAvKiBiID0gYjIgKiBCKioyICsgYjEgKiBCICsgYjAgKi8KLSAgICBpZiAoKHJlcyA9IG1wX21vZF8yZChiLCBESUdJVF9CSVQgKiBCLCAmYjApKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotCi0gICAgaWYgKChyZXMgPSBtcF9jb3B5KGIsICZiMSkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgbXBfcnNoZCgmYjEsIEIpOwotICAgIG1wX21vZF8yZCgmYjEsIERJR0lUX0JJVCAqIEIsICZiMSk7Ci0KLSAgICBpZiAoKHJlcyA9IG1wX2NvcHkoYiwgJmIyKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICBtcF9yc2hkKCZiMiwgQioyKTsKLSAgICAKLSAgICAvKiB3MCA9IGEwKmIwICovCi0gICAgaWYgKChyZXMgPSBtcF9tdWwoJmEwLCAmYjAsICZ3MCkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgCi0gICAgLyogdzQgPSBhMiAqIGIyICovCi0gICAgaWYgKChyZXMgPSBtcF9tdWwoJmEyLCAmYjIsICZ3NCkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgCi0gICAgLyogdzEgPSAoYTIgKyAyKGExICsgMmEwKSkoYjIgKyAyKGIxICsgMmIwKSkgKi8KLSAgICBpZiAoKHJlcyA9IG1wX211bF8yKCZhMCwgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIGlmICgocmVzID0gbXBfYWRkKCZ0bXAxLCAmYTEsICZ0bXAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICBpZiAoKHJlcyA9IG1wX211bF8yKCZ0bXAxLCAmdG1wMSkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9hZGQoJnRtcDEsICZhMiwgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIAotICAgIGlmICgocmVzID0gbXBfbXVsXzIoJmIwLCAmdG1wMikpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9hZGQoJnRtcDIsICZiMSwgJnRtcDIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIGlmICgocmVzID0gbXBfbXVsXzIoJnRtcDIsICZ0bXAyKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICBpZiAoKHJlcyA9IG1wX2FkZCgmdG1wMiwgJmIyLCAmdG1wMikpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKChyZXMgPSBtcF9tdWwoJnRtcDEsICZ0bXAyLCAmdzEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIAotICAgIC8qIHczID0gKGEwICsgMihhMSArIDJhMikpKGIwICsgMihiMSArIDJiMikpICovCi0gICAgaWYgKChyZXMgPSBtcF9tdWxfMigmYTIsICZ0bXAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICBpZiAoKHJlcyA9IG1wX2FkZCgmdG1wMSwgJmExLCAmdG1wMSkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9tdWxfMigmdG1wMSwgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIGlmICgocmVzID0gbXBfYWRkKCZ0bXAxLCAmYTAsICZ0bXAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICAKLSAgICBpZiAoKHJlcyA9IG1wX211bF8yKCZiMiwgJnRtcDIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIGlmICgocmVzID0gbXBfYWRkKCZ0bXAyLCAmYjEsICZ0bXAyKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICBpZiAoKHJlcyA9IG1wX211bF8yKCZ0bXAyLCAmdG1wMikpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9hZGQoJnRtcDIsICZiMCwgJnRtcDIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIAotICAgIGlmICgocmVzID0gbXBfbXVsKCZ0bXAxLCAmdG1wMiwgJnczKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICAKLQotICAgIC8qIHcyID0gKGEyICsgYTEgKyBhMCkoYjIgKyBiMSArIGIwKSAqLwotICAgIGlmICgocmVzID0gbXBfYWRkKCZhMiwgJmExLCAmdG1wMSkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9hZGQoJnRtcDEsICZhMCwgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIGlmICgocmVzID0gbXBfYWRkKCZiMiwgJmIxLCAmdG1wMikpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9hZGQoJnRtcDIsICZiMCwgJnRtcDIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIGlmICgocmVzID0gbXBfbXVsKCZ0bXAxLCAmdG1wMiwgJncyKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICAKLSAgICAvKiBub3cgc29sdmUgdGhlIG1hdHJpeCAKLSAgICAKLSAgICAgICAwICAwICAwICAwICAxCi0gICAgICAgMSAgMiAgNCAgOCAgMTYKLSAgICAgICAxICAxICAxICAxICAxCi0gICAgICAgMTYgOCAgNCAgMiAgMQotICAgICAgIDEgIDAgIDAgIDAgIDAKLSAgICAgICAKLSAgICAgICB1c2luZyAxMiBzdWJ0cmFjdGlvbnMsIDQgc2hpZnRzLCAKLSAgICAgICAgICAgICAgMiBzbWFsbCBkaXZpc2lvbnMgYW5kIDEgc21hbGwgbXVsdGlwbGljYXRpb24gCi0gICAgICovCi0gICAgIAotICAgICAvKiByMSAtIHI0ICovCi0gICAgIGlmICgocmVzID0gbXBfc3ViKCZ3MSwgJnc0LCAmdzEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIC8qIHIzIC0gcjAgKi8KLSAgICAgaWYgKChyZXMgPSBtcF9zdWIoJnczLCAmdzAsICZ3MykpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgLyogcjEvMiAqLwotICAgICBpZiAoKHJlcyA9IG1wX2Rpdl8yKCZ3MSwgJncxKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICAvKiByMy8yICovCi0gICAgIGlmICgocmVzID0gbXBfZGl2XzIoJnczLCAmdzMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIC8qIHIyIC0gcjAgLSByNCAqLwotICAgICBpZiAoKHJlcyA9IG1wX3N1YigmdzIsICZ3MCwgJncyKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICBpZiAoKHJlcyA9IG1wX3N1YigmdzIsICZ3NCwgJncyKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICAvKiByMSAtIHIyICovCi0gICAgIGlmICgocmVzID0gbXBfc3ViKCZ3MSwgJncyLCAmdzEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIC8qIHIzIC0gcjIgKi8KLSAgICAgaWYgKChyZXMgPSBtcF9zdWIoJnczLCAmdzIsICZ3MykpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgLyogcjEgLSA4cjAgKi8KLSAgICAgaWYgKChyZXMgPSBtcF9tdWxfMmQoJncwLCAzLCAmdG1wMSkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgaWYgKChyZXMgPSBtcF9zdWIoJncxLCAmdG1wMSwgJncxKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICAvKiByMyAtIDhyNCAqLwotICAgICBpZiAoKHJlcyA9IG1wX211bF8yZCgmdzQsIDMsICZ0bXAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICBpZiAoKHJlcyA9IG1wX3N1YigmdzMsICZ0bXAxLCAmdzMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIC8qIDNyMiAtIHIxIC0gcjMgKi8KLSAgICAgaWYgKChyZXMgPSBtcF9tdWxfZCgmdzIsIDMsICZ3MikpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgaWYgKChyZXMgPSBtcF9zdWIoJncyLCAmdzEsICZ3MikpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgaWYgKChyZXMgPSBtcF9zdWIoJncyLCAmdzMsICZ3MikpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgLyogcjEgLSByMiAqLwotICAgICBpZiAoKHJlcyA9IG1wX3N1YigmdzEsICZ3MiwgJncxKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICAvKiByMyAtIHIyICovCi0gICAgIGlmICgocmVzID0gbXBfc3ViKCZ3MywgJncyLCAmdzMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIC8qIHIxLzMgKi8KLSAgICAgaWYgKChyZXMgPSBtcF9kaXZfMygmdzEsICZ3MSwgTlVMTCkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgLyogcjMvMyAqLwotICAgICBpZiAoKHJlcyA9IG1wX2Rpdl8zKCZ3MywgJnczLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICAKLSAgICAgLyogYXQgdGhpcyBwb2ludCBzaGlmdCBXW25dIGJ5IEIqbiAqLwotICAgICBpZiAoKHJlcyA9IG1wX2xzaGQoJncxLCAxKkIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIGlmICgocmVzID0gbXBfbHNoZCgmdzIsIDIqQikpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgaWYgKChyZXMgPSBtcF9sc2hkKCZ3MywgMypCKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICBpZiAoKHJlcyA9IG1wX2xzaGQoJnc0LCA0KkIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9ICAgICAKLSAgICAgCi0gICAgIGlmICgocmVzID0gbXBfYWRkKCZ3MCwgJncxLCBjKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICBpZiAoKHJlcyA9IG1wX2FkZCgmdzIsICZ3MywgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIGlmICgocmVzID0gbXBfYWRkKCZ3NCwgJnRtcDEsICZ0bXAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICBpZiAoKHJlcyA9IG1wX2FkZCgmdG1wMSwgYywgYykpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0gICAgIAotICAgICAKLUVSUjoKLSAgICAgbXBfY2xlYXJfbXVsdGkoJncwLCAmdzEsICZ3MiwgJnczLCAmdzQsIAotICAgICAgICAgICAgICAgICAgICAmYTAsICZhMSwgJmEyLCAmYjAsICZiMSwgCi0gICAgICAgICAgICAgICAgICAgICZiMiwgJnRtcDEsICZ0bXAyLCBOVUxMKTsKLSAgICAgcmV0dXJuIHJlczsKLX0gICAgIAotICAgICAKLQotLyogRW5kOiBibl9tcF90b29tX211bC5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF90b29tX3Nxci5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBzcXVhcmluZyB1c2luZyBUb29tLUNvb2sgMy13YXkgYWxnb3JpdGhtICovCi1pbnQKLW1wX3Rvb21fc3FyKG1wX2ludCAqYSwgbXBfaW50ICpiKQotewotICAgIG1wX2ludCB3MCwgdzEsIHcyLCB3MywgdzQsIHRtcDEsIGEwLCBhMSwgYTI7Ci0gICAgaW50IHJlcywgQjsKLQotICAgIC8qIGluaXQgdGVtcHMgKi8KLSAgICBpZiAoKHJlcyA9IG1wX2luaXRfbXVsdGkoJncwLCAmdzEsICZ3MiwgJnczLCAmdzQsICZhMCwgJmExLCAmYTIsICZ0bXAxLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgLyogQiAqLwotICAgIEIgPSBhLT51c2VkIC8gMzsKLQotICAgIC8qIGEgPSBhMiAqIEIqKjIgKyBhMSAqIEIgKyBhMCAqLwotICAgIGlmICgocmVzID0gbXBfbW9kXzJkKGEsIERJR0lUX0JJVCAqIEIsICZhMCkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0KLSAgICBpZiAoKHJlcyA9IG1wX2NvcHkoYSwgJmExKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICBtcF9yc2hkKCZhMSwgQik7Ci0gICAgbXBfbW9kXzJkKCZhMSwgRElHSVRfQklUICogQiwgJmExKTsKLQotICAgIGlmICgocmVzID0gbXBfY29weShhLCAmYTIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIG1wX3JzaGQoJmEyLCBCKjIpOwotCi0gICAgLyogdzAgPSBhMCphMCAqLwotICAgIGlmICgocmVzID0gbXBfc3FyKCZhMCwgJncwKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLQotICAgIC8qIHc0ID0gYTIgKiBhMiAqLwotICAgIGlmICgocmVzID0gbXBfc3FyKCZhMiwgJnc0KSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLQotICAgIC8qIHcxID0gKGEyICsgMihhMSArIDJhMCkpKioyICovCi0gICAgaWYgKChyZXMgPSBtcF9tdWxfMigmYTAsICZ0bXAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICBpZiAoKHJlcyA9IG1wX2FkZCgmdG1wMSwgJmExLCAmdG1wMSkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9tdWxfMigmdG1wMSwgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIGlmICgocmVzID0gbXBfYWRkKCZ0bXAxLCAmYTIsICZ0bXAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLQotICAgIGlmICgocmVzID0gbXBfc3FyKCZ0bXAxLCAmdzEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotCi0gICAgLyogdzMgPSAoYTAgKyAyKGExICsgMmEyKSkqKjIgKi8KLSAgICBpZiAoKHJlcyA9IG1wX211bF8yKCZhMiwgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIGlmICgocmVzID0gbXBfYWRkKCZ0bXAxLCAmYTEsICZ0bXAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICBpZiAoKHJlcyA9IG1wX211bF8yKCZ0bXAxLCAmdG1wMSkpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0gICAgaWYgKChyZXMgPSBtcF9hZGQoJnRtcDEsICZhMCwgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotCi0gICAgaWYgKChyZXMgPSBtcF9zcXIoJnRtcDEsICZ3MykpICE9IE1QX09LQVkpIHsKLSAgICAgICBnb3RvIEVSUjsKLSAgICB9Ci0KLQotICAgIC8qIHcyID0gKGEyICsgYTEgKyBhMCkqKjIgKi8KLSAgICBpZiAoKHJlcyA9IG1wX2FkZCgmYTIsICZhMSwgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgZ290byBFUlI7Ci0gICAgfQotICAgIGlmICgocmVzID0gbXBfYWRkKCZ0bXAxLCAmYTAsICZ0bXAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLSAgICBpZiAoKHJlcyA9IG1wX3NxcigmdG1wMSwgJncyKSkgIT0gTVBfT0tBWSkgewotICAgICAgIGdvdG8gRVJSOwotICAgIH0KLQotICAgIC8qIG5vdyBzb2x2ZSB0aGUgbWF0cml4Ci0KLSAgICAgICAwICAwICAwICAwICAxCi0gICAgICAgMSAgMiAgNCAgOCAgMTYKLSAgICAgICAxICAxICAxICAxICAxCi0gICAgICAgMTYgOCAgNCAgMiAgMQotICAgICAgIDEgIDAgIDAgIDAgIDAKLQotICAgICAgIHVzaW5nIDEyIHN1YnRyYWN0aW9ucywgNCBzaGlmdHMsIDIgc21hbGwgZGl2aXNpb25zIGFuZCAxIHNtYWxsIG11bHRpcGxpY2F0aW9uLgotICAgICAqLwotCi0gICAgIC8qIHIxIC0gcjQgKi8KLSAgICAgaWYgKChyZXMgPSBtcF9zdWIoJncxLCAmdzQsICZ3MSkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgLyogcjMgLSByMCAqLwotICAgICBpZiAoKHJlcyA9IG1wX3N1YigmdzMsICZ3MCwgJnczKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICAvKiByMS8yICovCi0gICAgIGlmICgocmVzID0gbXBfZGl2XzIoJncxLCAmdzEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIC8qIHIzLzIgKi8KLSAgICAgaWYgKChyZXMgPSBtcF9kaXZfMigmdzMsICZ3MykpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgLyogcjIgLSByMCAtIHI0ICovCi0gICAgIGlmICgocmVzID0gbXBfc3ViKCZ3MiwgJncwLCAmdzIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIGlmICgocmVzID0gbXBfc3ViKCZ3MiwgJnc0LCAmdzIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIC8qIHIxIC0gcjIgKi8KLSAgICAgaWYgKChyZXMgPSBtcF9zdWIoJncxLCAmdzIsICZ3MSkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgLyogcjMgLSByMiAqLwotICAgICBpZiAoKHJlcyA9IG1wX3N1YigmdzMsICZ3MiwgJnczKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICAvKiByMSAtIDhyMCAqLwotICAgICBpZiAoKHJlcyA9IG1wX211bF8yZCgmdzAsIDMsICZ0bXAxKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICBpZiAoKHJlcyA9IG1wX3N1YigmdzEsICZ0bXAxLCAmdzEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIC8qIHIzIC0gOHI0ICovCi0gICAgIGlmICgocmVzID0gbXBfbXVsXzJkKCZ3NCwgMywgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIGlmICgocmVzID0gbXBfc3ViKCZ3MywgJnRtcDEsICZ3MykpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgLyogM3IyIC0gcjEgLSByMyAqLwotICAgICBpZiAoKHJlcyA9IG1wX211bF9kKCZ3MiwgMywgJncyKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICBpZiAoKHJlcyA9IG1wX3N1YigmdzIsICZ3MSwgJncyKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICBpZiAoKHJlcyA9IG1wX3N1YigmdzIsICZ3MywgJncyKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICAvKiByMSAtIHIyICovCi0gICAgIGlmICgocmVzID0gbXBfc3ViKCZ3MSwgJncyLCAmdzEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIC8qIHIzIC0gcjIgKi8KLSAgICAgaWYgKChyZXMgPSBtcF9zdWIoJnczLCAmdzIsICZ3MykpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgLyogcjEvMyAqLwotICAgICBpZiAoKHJlcyA9IG1wX2Rpdl8zKCZ3MSwgJncxLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICAvKiByMy8zICovCi0gICAgIGlmICgocmVzID0gbXBfZGl2XzMoJnczLCAmdzMsIE5VTEwpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0KLSAgICAgLyogYXQgdGhpcyBwb2ludCBzaGlmdCBXW25dIGJ5IEIqbiAqLwotICAgICBpZiAoKHJlcyA9IG1wX2xzaGQoJncxLCAxKkIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIGlmICgocmVzID0gbXBfbHNoZCgmdzIsIDIqQikpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgaWYgKChyZXMgPSBtcF9sc2hkKCZ3MywgMypCKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotICAgICBpZiAoKHJlcyA9IG1wX2xzaGQoJnc0LCA0KkIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0KLSAgICAgaWYgKChyZXMgPSBtcF9hZGQoJncwLCAmdzEsIGIpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIGlmICgocmVzID0gbXBfYWRkKCZ3MiwgJnczLCAmdG1wMSkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBFUlI7Ci0gICAgIH0KLSAgICAgaWYgKChyZXMgPSBtcF9hZGQoJnc0LCAmdG1wMSwgJnRtcDEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gRVJSOwotICAgICB9Ci0gICAgIGlmICgocmVzID0gbXBfYWRkKCZ0bXAxLCBiLCBiKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIEVSUjsKLSAgICAgfQotCi1FUlI6Ci0gICAgIG1wX2NsZWFyX211bHRpKCZ3MCwgJncxLCAmdzIsICZ3MywgJnc0LCAmYTAsICZhMSwgJmEyLCAmdG1wMSwgTlVMTCk7Ci0gICAgIHJldHVybiByZXM7Ci19Ci0KLQotLyogRW5kOiBibl9tcF90b29tX3Nxci5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF90b3JhZGl4LmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHN0b3JlcyBhIGJpZ251bSBhcyBhIEFTQ0lJIHN0cmluZyBpbiBhIGdpdmVuIHJhZGl4ICgyLi42NCkgKi8KLWludCBtcF90b3JhZGl4IChtcF9pbnQgKiBhLCBjaGFyICpzdHIsIGludCByYWRpeCkKLXsKLSAgaW50ICAgICByZXMsIGRpZ3M7Ci0gIG1wX2ludCAgdDsKLSAgbXBfZGlnaXQgZDsKLSAgY2hhciAgICpfcyA9IHN0cjsKLQotICAvKiBjaGVjayByYW5nZSBvZiB0aGUgcmFkaXggKi8KLSAgaWYgKHJhZGl4IDwgMiB8fCByYWRpeCA+IDY0KSB7Ci0gICAgcmV0dXJuIE1QX1ZBTDsKLSAgfQotCi0gIC8qIHF1aWNrIG91dCBpZiBpdHMgemVybyAqLwotICBpZiAobXBfaXN6ZXJvKGEpID09IDEpIHsKLSAgICAgKnN0cisrID0gJzAnOwotICAgICAqc3RyID0gJ1wwJzsKLSAgICAgcmV0dXJuIE1QX09LQVk7Ci0gIH0KLQotICBpZiAoKHJlcyA9IG1wX2luaXRfY29weSAoJnQsIGEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qIGlmIGl0IGlzIG5lZ2F0aXZlIG91dHB1dCBhIC0gKi8KLSAgaWYgKHQuc2lnbiA9PSBNUF9ORUcpIHsKLSAgICArK19zOwotICAgICpzdHIrKyA9ICctJzsKLSAgICB0LnNpZ24gPSBNUF9aUE9TOwotICB9Ci0KLSAgZGlncyA9IDA7Ci0gIHdoaWxlIChtcF9pc3plcm8gKCZ0KSA9PSAwKSB7Ci0gICAgaWYgKChyZXMgPSBtcF9kaXZfZCAoJnQsIChtcF9kaWdpdCkgcmFkaXgsICZ0LCAmZCkpICE9IE1QX09LQVkpIHsKLSAgICAgIG1wX2NsZWFyICgmdCk7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICAqc3RyKysgPSBtcF9zX3JtYXBbZF07Ci0gICAgKytkaWdzOwotICB9Ci0KLSAgLyogcmV2ZXJzZSB0aGUgZGlnaXRzIG9mIHRoZSBzdHJpbmcuICBJbiB0aGlzIGNhc2UgX3MgcG9pbnRzCi0gICAqIHRvIHRoZSBmaXJzdCBkaWdpdCBbZXhsdWRpbmcgdGhlIHNpZ25dIG9mIHRoZSBudW1iZXJdCi0gICAqLwotICBibl9yZXZlcnNlICgodW5zaWduZWQgY2hhciAqKV9zLCBkaWdzKTsKLQotICAvKiBhcHBlbmQgYSBOVUxMIHNvIHRoZSBzdHJpbmcgaXMgcHJvcGVybHkgdGVybWluYXRlZCAqLwotICAqc3RyID0gJ1wwJzsKLQotICBtcF9jbGVhciAoJnQpOwotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotCi0vKiBFbmQ6IGJuX21wX3RvcmFkaXguYyAqLwotCi0vKiBTdGFydDogYm5fbXBfdG9yYWRpeF9uLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIHN0b3JlcyBhIGJpZ251bSBhcyBhIEFTQ0lJIHN0cmluZyBpbiBhIGdpdmVuIHJhZGl4ICgyLi42NCkgCi0gKgotICogU3RvcmVzIHVwdG8gbWF4bGVuLTEgY2hhcnMgYW5kIGFsd2F5cyBhIE5VTEwgYnl0ZSAKLSAqLwotaW50IG1wX3RvcmFkaXhfbihtcF9pbnQgKiBhLCBjaGFyICpzdHIsIGludCByYWRpeCwgaW50IG1heGxlbikKLXsKLSAgaW50ICAgICByZXMsIGRpZ3M7Ci0gIG1wX2ludCAgdDsKLSAgbXBfZGlnaXQgZDsKLSAgY2hhciAgICpfcyA9IHN0cjsKLQotICAvKiBjaGVjayByYW5nZSBvZiB0aGUgbWF4bGVuLCByYWRpeCAqLwotICBpZiAobWF4bGVuIDwgMyB8fCByYWRpeCA8IDIgfHwgcmFkaXggPiA2NCkgewotICAgIHJldHVybiBNUF9WQUw7Ci0gIH0KLQotICAvKiBxdWljayBvdXQgaWYgaXRzIHplcm8gKi8KLSAgaWYgKG1wX2lzemVybyhhKSA9PSAxKSB7Ci0gICAgICpzdHIrKyA9ICcwJzsKLSAgICAgKnN0ciA9ICdcMCc7Ci0gICAgIHJldHVybiBNUF9PS0FZOwotICB9Ci0KLSAgaWYgKChyZXMgPSBtcF9pbml0X2NvcHkgKCZ0LCBhKSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKiBpZiBpdCBpcyBuZWdhdGl2ZSBvdXRwdXQgYSAtICovCi0gIGlmICh0LnNpZ24gPT0gTVBfTkVHKSB7Ci0gICAgLyogd2UgaGF2ZSB0byByZXZlcnNlIG91ciBkaWdpdHMgbGF0ZXIuLi4gYnV0IG5vdCB0aGUgLSBzaWduISEgKi8KLSAgICArK19zOwotCi0gICAgLyogc3RvcmUgdGhlIGZsYWcgYW5kIG1hcmsgdGhlIG51bWJlciBhcyBwb3NpdGl2ZSAqLwotICAgICpzdHIrKyA9ICctJzsKLSAgICB0LnNpZ24gPSBNUF9aUE9TOwotIAotICAgIC8qIHN1YnRyYWN0IGEgY2hhciAqLwotICAgIC0tbWF4bGVuOwotICB9Ci0KLSAgZGlncyA9IDA7Ci0gIHdoaWxlIChtcF9pc3plcm8gKCZ0KSA9PSAwKSB7Ci0gICAgaWYgKChyZXMgPSBtcF9kaXZfZCAoJnQsIChtcF9kaWdpdCkgcmFkaXgsICZ0LCAmZCkpICE9IE1QX09LQVkpIHsKLSAgICAgIG1wX2NsZWFyICgmdCk7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICAqc3RyKysgPSBtcF9zX3JtYXBbZF07Ci0gICAgKytkaWdzOwotCi0gICAgaWYgKC0tbWF4bGVuID09IDEpIHsKLSAgICAgICAvKiBubyBtb3JlIHJvb20gKi8KLSAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvKiByZXZlcnNlIHRoZSBkaWdpdHMgb2YgdGhlIHN0cmluZy4gIEluIHRoaXMgY2FzZSBfcyBwb2ludHMKLSAgICogdG8gdGhlIGZpcnN0IGRpZ2l0IFtleGx1ZGluZyB0aGUgc2lnbl0gb2YgdGhlIG51bWJlcl0KLSAgICovCi0gIGJuX3JldmVyc2UgKCh1bnNpZ25lZCBjaGFyICopX3MsIGRpZ3MpOwotCi0gIC8qIGFwcGVuZCBhIE5VTEwgc28gdGhlIHN0cmluZyBpcyBwcm9wZXJseSB0ZXJtaW5hdGVkICovCi0gICpzdHIgPSAnXDAnOwotCi0gIG1wX2NsZWFyICgmdCk7Ci0gIHJldHVybiBNUF9PS0FZOwotfQotCi0KLS8qIEVuZDogYm5fbXBfdG9yYWRpeF9uLmMgKi8KLQotLyogU3RhcnQ6IGJuX21wX3Vuc2lnbmVkX2Jpbl9zaXplLmMgKi8KLS8qIExpYlRvbU1hdGgsIG11bHRpcGxlLXByZWNpc2lvbiBpbnRlZ2VyIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tTWF0aCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBtdWx0aXBsZS1wcmVjaXNpb24KLSAqIGludGVnZXIgYXJpdGhtZXRpYyBhcyB3ZWxsIGFzIG51bWJlciB0aGVvcmV0aWMgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBUaGUgbGlicmFyeSB3YXMgZGVzaWduZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1QSSBsaWJyYXJ5IGJ5Ci0gKiBNaWNoYWVsIEZyb21iZXJnZXIgYnV0IGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSBzY3JhdGNoIHdpdGgKLSAqIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9ucyBpbiBwbGFjZS4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbWF0aC5saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgPGx0Y190b21tYXRoLmg+Ci0KLS8qIGdldCB0aGUgc2l6ZSBmb3IgYW4gdW5zaWduZWQgZXF1aXZhbGVudCAqLwotaW50Ci1tcF91bnNpZ25lZF9iaW5fc2l6ZSAobXBfaW50ICogYSkKLXsKLSAgaW50ICAgICBzaXplID0gbXBfY291bnRfYml0cyAoYSk7Ci0gIHJldHVybiAoc2l6ZSAvIDggKyAoKHNpemUgJiA3KSAhPSAwID8gMSA6IDApKTsKLX0KLQotLyogRW5kOiBibl9tcF91bnNpZ25lZF9iaW5fc2l6ZS5jICovCi0KLS8qIFN0YXJ0OiBibl9tcF94b3IuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogWE9SIHR3byBpbnRzIHRvZ2V0aGVyICovCi1pbnQKLW1wX3hvciAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYykKLXsKLSAgaW50ICAgICByZXMsIGl4LCBweDsKLSAgbXBfaW50ICB0LCAqeDsKLQotICBpZiAoYS0+dXNlZCA+IGItPnVzZWQpIHsKLSAgICBpZiAoKHJlcyA9IG1wX2luaXRfY29weSAoJnQsIGEpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICBweCA9IGItPnVzZWQ7Ci0gICAgeCA9IGI7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKChyZXMgPSBtcF9pbml0X2NvcHkgKCZ0LCBiKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgcHggPSBhLT51c2VkOwotICAgIHggPSBhOwotICB9Ci0KLSAgZm9yIChpeCA9IDA7IGl4IDwgcHg7IGl4KyspIHsKLSAgICB0LmRwW2l4XSBePSB4LT5kcFtpeF07Ci0gIH0KLSAgbXBfY2xhbXAgKCZ0KTsKLSAgbXBfZXhjaCAoYywgJnQpOwotICBtcF9jbGVhciAoJnQpOwotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9tcF94b3IuYyAqLwotCi0vKiBTdGFydDogYm5fbXBfemVyby5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBzZXQgdG8gemVybyAqLwotdm9pZAotbXBfemVybyAobXBfaW50ICogYSkKLXsKLSAgYS0+c2lnbiA9IE1QX1pQT1M7Ci0gIGEtPnVzZWQgPSAwOwotICBtZW1zZXQgKGEtPmRwLCAwLCBzaXplb2YgKG1wX2RpZ2l0KSAqIGEtPmFsbG9jKTsKLX0KLQotLyogRW5kOiBibl9tcF96ZXJvLmMgKi8KLQotLyogU3RhcnQ6IGJuX3ByaW1lX3NpemVzX3RhYi5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiB0aGlzIHRhYmxlIGdpdmVzIHRoZSAjIG9mIHJhYmluIG1pbGxlciB0cmlhbHMgZm9yIGEgcHJvYiBvZiBmYWlsdXJlIGxvd2VyIHRoYW4gMl4tOTYgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgaW50IGssIHQ7Ci19IHNpemVzW10gPSB7Ci17ICAgMTI4LCAgICAyOCB9LAoteyAgIDI1NiwgICAgMTYgfSwKLXsgICAzODQsICAgIDEwIH0sCi17ICAgNTEyLCAgICAgNyB9LAoteyAgIDY0MCwgICAgIDYgfSwKLXsgICA3NjgsICAgICA1IH0sCi17ICAgODk2LCAgICAgNCB9LAoteyAgMTAyNCwgICAgIDQgfSwKLXsgIDExNTIsICAgICAzIH0sCi17ICAxMjgwLCAgICAgMyB9LAoteyAgMTQwOCwgICAgIDMgfSwKLXsgIDE1MzYsICAgICAzIH0sCi17ICAxNjY0LCAgICAgMyB9LAoteyAgMTc5MiwgICAgIDIgfSB9OwotCi0vKiByZXR1cm5zICMgb2YgUk0gdHJpYWxzIHJlcXVpcmVkIGZvciBhIGdpdmVuIGJpdCBzaXplICovCi1pbnQgbXBfcHJpbWVfcmFiaW5fbWlsbGVyX3RyaWFscyhpbnQgc2l6ZSkKLXsKLSAgIGludCB4OwotCi0gICBmb3IgKHggPSAwOyB4IDwgKGludCkoc2l6ZW9mKHNpemVzKS8oc2l6ZW9mKHNpemVzWzBdKSkpOyB4KyspIHsKLSAgICAgICBpZiAoc2l6ZXNbeF0uayA9PSBzaXplKSB7Ci0gICAgICAgICAgcmV0dXJuIHNpemVzW3hdLnQ7Ci0gICAgICAgfSBlbHNlIGlmIChzaXplc1t4XS5rID4gc2l6ZSkgewotICAgICAgICAgIHJldHVybiAoeCA9PSAwKSA/IHNpemVzWzBdLnQgOiBzaXplc1t4IC0gMV0udDsKLSAgICAgICB9Ci0gICB9Ci0gICByZXR1cm4gMTsKLX0KLQotCi0KLS8qIEVuZDogYm5fcHJpbWVfc2l6ZXNfdGFiLmMgKi8KLQotLyogU3RhcnQ6IGJuX3ByaW1lX3RhYi5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotY29uc3QgbXBfZGlnaXQgX19wcmltZV90YWJbXSA9IHsKLSAgMHgwMDAyLCAweDAwMDMsIDB4MDAwNSwgMHgwMDA3LCAweDAwMEIsIDB4MDAwRCwgMHgwMDExLCAweDAwMTMsCi0gIDB4MDAxNywgMHgwMDFELCAweDAwMUYsIDB4MDAyNSwgMHgwMDI5LCAweDAwMkIsIDB4MDAyRiwgMHgwMDM1LAotICAweDAwM0IsIDB4MDAzRCwgMHgwMDQzLCAweDAwNDcsIDB4MDA0OSwgMHgwMDRGLCAweDAwNTMsIDB4MDA1OSwKLSAgMHgwMDYxLCAweDAwNjUsIDB4MDA2NywgMHgwMDZCLCAweDAwNkQsIDB4MDA3MSwgMHgwMDdGLAotI2lmbmRlZiBNUF84QklUCi0gIDB4MDA4MywKLSAgMHgwMDg5LCAweDAwOEIsIDB4MDA5NSwgMHgwMDk3LCAweDAwOUQsIDB4MDBBMywgMHgwMEE3LCAweDAwQUQsCi0gIDB4MDBCMywgMHgwMEI1LCAweDAwQkYsIDB4MDBDMSwgMHgwMEM1LCAweDAwQzcsIDB4MDBEMywgMHgwMERGLAotICAweDAwRTMsIDB4MDBFNSwgMHgwMEU5LCAweDAwRUYsIDB4MDBGMSwgMHgwMEZCLCAweDAxMDEsIDB4MDEwNywKLSAgMHgwMTBELCAweDAxMEYsIDB4MDExNSwgMHgwMTE5LCAweDAxMUIsIDB4MDEyNSwgMHgwMTMzLCAweDAxMzcsCi0KLSAgMHgwMTM5LCAweDAxM0QsIDB4MDE0QiwgMHgwMTUxLCAweDAxNUIsIDB4MDE1RCwgMHgwMTYxLCAweDAxNjcsCi0gIDB4MDE2RiwgMHgwMTc1LCAweDAxN0IsIDB4MDE3RiwgMHgwMTg1LCAweDAxOEQsIDB4MDE5MSwgMHgwMTk5LAotICAweDAxQTMsIDB4MDFBNSwgMHgwMUFGLCAweDAxQjEsIDB4MDFCNywgMHgwMUJCLCAweDAxQzEsIDB4MDFDOSwKLSAgMHgwMUNELCAweDAxQ0YsIDB4MDFEMywgMHgwMURGLCAweDAxRTcsIDB4MDFFQiwgMHgwMUYzLCAweDAxRjcsCi0gIDB4MDFGRCwgMHgwMjA5LCAweDAyMEIsIDB4MDIxRCwgMHgwMjIzLCAweDAyMkQsIDB4MDIzMywgMHgwMjM5LAotICAweDAyM0IsIDB4MDI0MSwgMHgwMjRCLCAweDAyNTEsIDB4MDI1NywgMHgwMjU5LCAweDAyNUYsIDB4MDI2NSwKLSAgMHgwMjY5LCAweDAyNkIsIDB4MDI3NywgMHgwMjgxLCAweDAyODMsIDB4MDI4NywgMHgwMjhELCAweDAyOTMsCi0gIDB4MDI5NSwgMHgwMkExLCAweDAyQTUsIDB4MDJBQiwgMHgwMkIzLCAweDAyQkQsIDB4MDJDNSwgMHgwMkNGLAotCi0gIDB4MDJENywgMHgwMkRELCAweDAyRTMsIDB4MDJFNywgMHgwMkVGLCAweDAyRjUsIDB4MDJGOSwgMHgwMzAxLAotICAweDAzMDUsIDB4MDMxMywgMHgwMzFELCAweDAzMjksIDB4MDMyQiwgMHgwMzM1LCAweDAzMzcsIDB4MDMzQiwKLSAgMHgwMzNELCAweDAzNDcsIDB4MDM1NSwgMHgwMzU5LCAweDAzNUIsIDB4MDM1RiwgMHgwMzZELCAweDAzNzEsCi0gIDB4MDM3MywgMHgwMzc3LCAweDAzOEIsIDB4MDM4RiwgMHgwMzk3LCAweDAzQTEsIDB4MDNBOSwgMHgwM0FELAotICAweDAzQjMsIDB4MDNCOSwgMHgwM0M3LCAweDAzQ0IsIDB4MDNEMSwgMHgwM0Q3LCAweDAzREYsIDB4MDNFNSwKLSAgMHgwM0YxLCAweDAzRjUsIDB4MDNGQiwgMHgwM0ZELCAweDA0MDcsIDB4MDQwOSwgMHgwNDBGLCAweDA0MTksCi0gIDB4MDQxQiwgMHgwNDI1LCAweDA0MjcsIDB4MDQyRCwgMHgwNDNGLCAweDA0NDMsIDB4MDQ0NSwgMHgwNDQ5LAotICAweDA0NEYsIDB4MDQ1NSwgMHgwNDVELCAweDA0NjMsIDB4MDQ2OSwgMHgwNDdGLCAweDA0ODEsIDB4MDQ4QiwKLQotICAweDA0OTMsIDB4MDQ5RCwgMHgwNEEzLCAweDA0QTksIDB4MDRCMSwgMHgwNEJELCAweDA0QzEsIDB4MDRDNywKLSAgMHgwNENELCAweDA0Q0YsIDB4MDRENSwgMHgwNEUxLCAweDA0RUIsIDB4MDRGRCwgMHgwNEZGLCAweDA1MDMsCi0gIDB4MDUwOSwgMHgwNTBCLCAweDA1MTEsIDB4MDUxNSwgMHgwNTE3LCAweDA1MUIsIDB4MDUyNywgMHgwNTI5LAotICAweDA1MkYsIDB4MDU1MSwgMHgwNTU3LCAweDA1NUQsIDB4MDU2NSwgMHgwNTc3LCAweDA1ODEsIDB4MDU4RiwKLSAgMHgwNTkzLCAweDA1OTUsIDB4MDU5OSwgMHgwNTlGLCAweDA1QTcsIDB4MDVBQiwgMHgwNUFELCAweDA1QjMsCi0gIDB4MDVCRiwgMHgwNUM5LCAweDA1Q0IsIDB4MDVDRiwgMHgwNUQxLCAweDA1RDUsIDB4MDVEQiwgMHgwNUU3LAotICAweDA1RjMsIDB4MDVGQiwgMHgwNjA3LCAweDA2MEQsIDB4MDYxMSwgMHgwNjE3LCAweDA2MUYsIDB4MDYyMywKLSAgMHgwNjJCLCAweDA2MkYsIDB4MDYzRCwgMHgwNjQxLCAweDA2NDcsIDB4MDY0OSwgMHgwNjRELCAweDA2NTMKLSNlbmRpZgotfTsKLQotLyogRW5kOiBibl9wcmltZV90YWIuYyAqLwotCi0vKiBTdGFydDogYm5fcmV2ZXJzZS5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiByZXZlcnNlIGFuIGFycmF5LCB1c2VkIGZvciByYWRpeCBjb2RlICovCi12b2lkCi1ibl9yZXZlcnNlICh1bnNpZ25lZCBjaGFyICpzLCBpbnQgbGVuKQotewotICBpbnQgICAgIGl4LCBpeTsKLSAgdW5zaWduZWQgY2hhciB0OwotCi0gIGl4ID0gMDsKLSAgaXkgPSBsZW4gLSAxOwotICB3aGlsZSAoaXggPCBpeSkgewotICAgIHQgICAgID0gc1tpeF07Ci0gICAgc1tpeF0gPSBzW2l5XTsKLSAgICBzW2l5XSA9IHQ7Ci0gICAgKytpeDsKLSAgICAtLWl5OwotICB9Ci19Ci0KLS8qIEVuZDogYm5fcmV2ZXJzZS5jICovCi0KLS8qIFN0YXJ0OiBibl9zX21wX2FkZC5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBsb3cgbGV2ZWwgYWRkaXRpb24sIGJhc2VkIG9uIEhBQyBwcC41OTQsIEFsZ29yaXRobSAxNC43ICovCi1pbnQKLXNfbXBfYWRkIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiLCBtcF9pbnQgKiBjKQotewotICBtcF9pbnQgKng7Ci0gIGludCAgICAgb2xkdXNlLCByZXMsIG1pbiwgbWF4OwotCi0gIC8qIGZpbmQgc2l6ZXMsIHdlIGxldCB8YXwgPD0gfGJ8IHdoaWNoIG1lYW5zIHdlIGhhdmUgdG8gc29ydAotICAgKiB0aGVtLiAgIngiIHdpbGwgcG9pbnQgdG8gdGhlIGlucHV0IHdpdGggdGhlIG1vc3QgZGlnaXRzCi0gICAqLwotICBpZiAoYS0+dXNlZCA+IGItPnVzZWQpIHsKLSAgICBtaW4gPSBiLT51c2VkOwotICAgIG1heCA9IGEtPnVzZWQ7Ci0gICAgeCA9IGE7Ci0gIH0gZWxzZSB7Ci0gICAgbWluID0gYS0+dXNlZDsKLSAgICBtYXggPSBiLT51c2VkOwotICAgIHggPSBiOwotICB9Ci0KLSAgLyogaW5pdCByZXN1bHQgKi8KLSAgaWYgKGMtPmFsbG9jIDwgbWF4ICsgMSkgewotICAgIGlmICgocmVzID0gbXBfZ3JvdyAoYywgbWF4ICsgMSkpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiByZXM7Ci0gICAgfQotICB9Ci0KLSAgLyogZ2V0IG9sZCB1c2VkIGRpZ2l0IGNvdW50IGFuZCBzZXQgbmV3IG9uZSAqLwotICBvbGR1c2UgPSBjLT51c2VkOwotICBjLT51c2VkID0gbWF4ICsgMTsKLQotICB7Ci0gICAgcmVnaXN0ZXIgbXBfZGlnaXQgdSwgKnRtcGEsICp0bXBiLCAqdG1wYzsKLSAgICByZWdpc3RlciBpbnQgaTsKLQotICAgIC8qIGFsaWFzIGZvciBkaWdpdCBwb2ludGVycyAqLwotCi0gICAgLyogZmlyc3QgaW5wdXQgKi8KLSAgICB0bXBhID0gYS0+ZHA7Ci0KLSAgICAvKiBzZWNvbmQgaW5wdXQgKi8KLSAgICB0bXBiID0gYi0+ZHA7Ci0KLSAgICAvKiBkZXN0aW5hdGlvbiAqLwotICAgIHRtcGMgPSBjLT5kcDsKLQotICAgIC8qIHplcm8gdGhlIGNhcnJ5ICovCi0gICAgdSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1pbjsgaSsrKSB7Ci0gICAgICAvKiBDb21wdXRlIHRoZSBzdW0gYXQgb25lIGRpZ2l0LCBUW2ldID0gQVtpXSArIEJbaV0gKyBVICovCi0gICAgICAqdG1wYyA9ICp0bXBhKysgKyAqdG1wYisrICsgdTsKLQotICAgICAgLyogVSA9IGNhcnJ5IGJpdCBvZiBUW2ldICovCi0gICAgICB1ID0gKnRtcGMgPj4gKChtcF9kaWdpdClESUdJVF9CSVQpOwotCi0gICAgICAvKiB0YWtlIGF3YXkgY2FycnkgYml0IGZyb20gVFtpXSAqLwotICAgICAgKnRtcGMrKyAmPSBNUF9NQVNLOwotICAgIH0KLQotICAgIC8qIG5vdyBjb3B5IGhpZ2hlciB3b3JkcyBpZiBhbnksIHRoYXQgaXMgaW4gQStCIAotICAgICAqIGlmIEEgb3IgQiBoYXMgbW9yZSBkaWdpdHMgYWRkIHRob3NlIGluIAotICAgICAqLwotICAgIGlmIChtaW4gIT0gbWF4KSB7Ci0gICAgICBmb3IgKDsgaSA8IG1heDsgaSsrKSB7Ci0gICAgICAgIC8qIFRbaV0gPSBYW2ldICsgVSAqLwotICAgICAgICAqdG1wYyA9IHgtPmRwW2ldICsgdTsKLQotICAgICAgICAvKiBVID0gY2FycnkgYml0IG9mIFRbaV0gKi8KLSAgICAgICAgdSA9ICp0bXBjID4+ICgobXBfZGlnaXQpRElHSVRfQklUKTsKLQotICAgICAgICAvKiB0YWtlIGF3YXkgY2FycnkgYml0IGZyb20gVFtpXSAqLwotICAgICAgICAqdG1wYysrICY9IE1QX01BU0s7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogYWRkIGNhcnJ5ICovCi0gICAgKnRtcGMrKyA9IHU7Ci0KLSAgICAvKiBjbGVhciBkaWdpdHMgYWJvdmUgb2xkdXNlZCAqLwotICAgIGZvciAoaSA9IGMtPnVzZWQ7IGkgPCBvbGR1c2U7IGkrKykgewotICAgICAgKnRtcGMrKyA9IDA7Ci0gICAgfQotICB9Ci0KLSAgbXBfY2xhbXAgKGMpOwotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9zX21wX2FkZC5jICovCi0KLS8qIFN0YXJ0OiBibl9zX21wX2V4cHRtb2QuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotI2lmZGVmIE1QX0xPV19NRU0KLSAgICNkZWZpbmUgVEFCX1NJWkUgMzIKLSNlbHNlCi0gICAjZGVmaW5lIFRBQl9TSVpFIDI1NgotI2VuZGlmCi0KLWludCBzX21wX2V4cHRtb2QgKG1wX2ludCAqIEcsIG1wX2ludCAqIFgsIG1wX2ludCAqIFAsIG1wX2ludCAqIFkpCi17Ci0gIG1wX2ludCAgTVtUQUJfU0laRV0sIHJlcywgbXU7Ci0gIG1wX2RpZ2l0IGJ1ZjsKLSAgaW50ICAgICBlcnIsIGJpdGJ1ZiwgYml0Y3B5LCBiaXRjbnQsIG1vZGUsIGRpZ2lkeCwgeCwgeSwgd2luc2l6ZTsKLQotICAvKiBmaW5kIHdpbmRvdyBzaXplICovCi0gIHggPSBtcF9jb3VudF9iaXRzIChYKTsKLSAgaWYgKHggPD0gNykgewotICAgIHdpbnNpemUgPSAyOwotICB9IGVsc2UgaWYgKHggPD0gMzYpIHsKLSAgICB3aW5zaXplID0gMzsKLSAgfSBlbHNlIGlmICh4IDw9IDE0MCkgewotICAgIHdpbnNpemUgPSA0OwotICB9IGVsc2UgaWYgKHggPD0gNDUwKSB7Ci0gICAgd2luc2l6ZSA9IDU7Ci0gIH0gZWxzZSBpZiAoeCA8PSAxMzAzKSB7Ci0gICAgd2luc2l6ZSA9IDY7Ci0gIH0gZWxzZSBpZiAoeCA8PSAzNTI5KSB7Ci0gICAgd2luc2l6ZSA9IDc7Ci0gIH0gZWxzZSB7Ci0gICAgd2luc2l6ZSA9IDg7Ci0gIH0KLQotI2lmZGVmIE1QX0xPV19NRU0KLSAgICBpZiAod2luc2l6ZSA+IDUpIHsKLSAgICAgICB3aW5zaXplID0gNTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBpbml0IE0gYXJyYXkgKi8KLSAgLyogaW5pdCBmaXJzdCBjZWxsICovCi0gIGlmICgoZXJyID0gbXBfaW5pdCgmTVsxXSkpICE9IE1QX09LQVkpIHsKLSAgICAgcmV0dXJuIGVycjsgCi0gIH0KLQotICAvKiBub3cgaW5pdCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGFycmF5ICovCi0gIGZvciAoeCA9IDE8PCh3aW5zaXplLTEpOyB4IDwgKDEgPDwgd2luc2l6ZSk7IHgrKykgewotICAgIGlmICgoZXJyID0gbXBfaW5pdCgmTVt4XSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGZvciAoeSA9IDE8PCh3aW5zaXplLTEpOyB5IDwgeDsgeSsrKSB7Ci0gICAgICAgIG1wX2NsZWFyICgmTVt5XSk7Ci0gICAgICB9Ci0gICAgICBtcF9jbGVhcigmTVsxXSk7Ci0gICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgfQotCi0gIC8qIGNyZWF0ZSBtdSwgdXNlZCBmb3IgQmFycmV0dCByZWR1Y3Rpb24gKi8KLSAgaWYgKChlcnIgPSBtcF9pbml0ICgmbXUpKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX007Ci0gIH0KLSAgaWYgKChlcnIgPSBtcF9yZWR1Y2Vfc2V0dXAgKCZtdSwgUCkpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIF9fTVU7Ci0gIH0KLQotICAvKiBjcmVhdGUgTSB0YWJsZQotICAgKgotICAgKiBUaGUgTSB0YWJsZSBjb250YWlucyBwb3dlcnMgb2YgdGhlIGJhc2UsIAotICAgKiBlLmcuIE1beF0gPSBHKip4IG1vZCBQCi0gICAqCi0gICAqIFRoZSBmaXJzdCBoYWxmIG9mIHRoZSB0YWJsZSBpcyBub3QgCi0gICAqIGNvbXB1dGVkIHRob3VnaCBhY2NlcHQgZm9yIE1bMF0gYW5kIE1bMV0KLSAgICovCi0gIGlmICgoZXJyID0gbXBfbW9kIChHLCBQLCAmTVsxXSkpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIF9fTVU7Ci0gIH0KLQotICAvKiBjb21wdXRlIHRoZSB2YWx1ZSBhdCBNWzE8PCh3aW5zaXplLTEpXSBieSBzcXVhcmluZyAKLSAgICogTVsxXSAod2luc2l6ZS0xKSB0aW1lcyAKLSAgICovCi0gIGlmICgoZXJyID0gbXBfY29weSAoJk1bMV0sICZNWzEgPDwgKHdpbnNpemUgLSAxKV0pKSAhPSBNUF9PS0FZKSB7Ci0gICAgZ290byBfX01VOwotICB9Ci0KLSAgZm9yICh4ID0gMDsgeCA8ICh3aW5zaXplIC0gMSk7IHgrKykgewotICAgIGlmICgoZXJyID0gbXBfc3FyICgmTVsxIDw8ICh3aW5zaXplIC0gMSldLCAKLSAgICAgICAgICAgICAgICAgICAgICAgJk1bMSA8PCAod2luc2l6ZSAtIDEpXSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19NVTsKLSAgICB9Ci0gICAgaWYgKChlcnIgPSBtcF9yZWR1Y2UgKCZNWzEgPDwgKHdpbnNpemUgLSAxKV0sIFAsICZtdSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19NVTsKLSAgICB9Ci0gIH0KLQotICAvKiBjcmVhdGUgdXBwZXIgdGFibGUsIHRoYXQgaXMgTVt4XSA9IE1beC0xXSAqIE1bMV0gKG1vZCBQKQotICAgKiBmb3IgeCA9ICgyKiood2luc2l6ZSAtIDEpICsgMSkgdG8gKDIqKndpbnNpemUgLSAxKQotICAgKi8KLSAgZm9yICh4ID0gKDEgPDwgKHdpbnNpemUgLSAxKSkgKyAxOyB4IDwgKDEgPDwgd2luc2l6ZSk7IHgrKykgewotICAgIGlmICgoZXJyID0gbXBfbXVsICgmTVt4IC0gMV0sICZNWzFdLCAmTVt4XSkpICE9IE1QX09LQVkpIHsKLSAgICAgIGdvdG8gX19NVTsKLSAgICB9Ci0gICAgaWYgKChlcnIgPSBtcF9yZWR1Y2UgKCZNW3hdLCBQLCAmbXUpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBnb3RvIF9fTVU7Ci0gICAgfQotICB9Ci0KLSAgLyogc2V0dXAgcmVzdWx0ICovCi0gIGlmICgoZXJyID0gbXBfaW5pdCAoJnJlcykpICE9IE1QX09LQVkpIHsKLSAgICBnb3RvIF9fTVU7Ci0gIH0KLSAgbXBfc2V0ICgmcmVzLCAxKTsKLQotICAvKiBzZXQgaW5pdGlhbCBtb2RlIGFuZCBiaXQgY250ICovCi0gIG1vZGUgICA9IDA7Ci0gIGJpdGNudCA9IDE7Ci0gIGJ1ZiAgICA9IDA7Ci0gIGRpZ2lkeCA9IFgtPnVzZWQgLSAxOwotICBiaXRjcHkgPSAwOwotICBiaXRidWYgPSAwOwotCi0gIGZvciAoOzspIHsKLSAgICAvKiBncmFiIG5leHQgZGlnaXQgYXMgcmVxdWlyZWQgKi8KLSAgICBpZiAoLS1iaXRjbnQgPT0gMCkgewotICAgICAgLyogaWYgZGlnaWR4ID09IC0xIHdlIGFyZSBvdXQgb2YgZGlnaXRzICovCi0gICAgICBpZiAoZGlnaWR4ID09IC0xKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgLyogcmVhZCBuZXh0IGRpZ2l0IGFuZCByZXNldCB0aGUgYml0Y250ICovCi0gICAgICBidWYgICAgPSBYLT5kcFtkaWdpZHgtLV07Ci0gICAgICBiaXRjbnQgPSAoaW50KSBESUdJVF9CSVQ7Ci0gICAgfQotCi0gICAgLyogZ3JhYiB0aGUgbmV4dCBtc2IgZnJvbSB0aGUgZXhwb25lbnQgKi8KLSAgICB5ICAgICA9IChidWYgPj4gKG1wX2RpZ2l0KShESUdJVF9CSVQgLSAxKSkgJiAxOwotICAgIGJ1ZiA8PD0gKG1wX2RpZ2l0KTE7Ci0KLSAgICAvKiBpZiB0aGUgYml0IGlzIHplcm8gYW5kIG1vZGUgPT0gMCB0aGVuIHdlIGlnbm9yZSBpdAotICAgICAqIFRoZXNlIHJlcHJlc2VudCB0aGUgbGVhZGluZyB6ZXJvIGJpdHMgYmVmb3JlIHRoZSBmaXJzdCAxIGJpdAotICAgICAqIGluIHRoZSBleHBvbmVudC4gIFRlY2huaWNhbGx5IHRoaXMgb3B0IGlzIG5vdCByZXF1aXJlZCBidXQgaXQKLSAgICAgKiBkb2VzIGxvd2VyIHRoZSAjIG9mIHRyaXZpYWwgc3F1YXJpbmcvcmVkdWN0aW9ucyB1c2VkCi0gICAgICovCi0gICAgaWYgKG1vZGUgPT0gMCAmJiB5ID09IDApIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIGlmIHRoZSBiaXQgaXMgemVybyBhbmQgbW9kZSA9PSAxIHRoZW4gd2Ugc3F1YXJlICovCi0gICAgaWYgKG1vZGUgPT0gMSAmJiB5ID09IDApIHsKLSAgICAgIGlmICgoZXJyID0gbXBfc3FyICgmcmVzLCAmcmVzKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fUkVTOwotICAgICAgfQotICAgICAgaWYgKChlcnIgPSBtcF9yZWR1Y2UgKCZyZXMsIFAsICZtdSkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBfX1JFUzsKLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIGVsc2Ugd2UgYWRkIGl0IHRvIHRoZSB3aW5kb3cgKi8KLSAgICBiaXRidWYgfD0gKHkgPDwgKHdpbnNpemUgLSArK2JpdGNweSkpOwotICAgIG1vZGUgICAgPSAyOwotCi0gICAgaWYgKGJpdGNweSA9PSB3aW5zaXplKSB7Ci0gICAgICAvKiBvayB3aW5kb3cgaXMgZmlsbGVkIHNvIHNxdWFyZSBhcyByZXF1aXJlZCBhbmQgbXVsdGlwbHkgICovCi0gICAgICAvKiBzcXVhcmUgZmlyc3QgKi8KLSAgICAgIGZvciAoeCA9IDA7IHggPCB3aW5zaXplOyB4KyspIHsKLSAgICAgICAgaWYgKChlcnIgPSBtcF9zcXIgKCZyZXMsICZyZXMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICAgZ290byBfX1JFUzsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGVyciA9IG1wX3JlZHVjZSAoJnJlcywgUCwgJm11KSkgIT0gTVBfT0tBWSkgewotICAgICAgICAgIGdvdG8gX19SRVM7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogdGhlbiBtdWx0aXBseSAqLwotICAgICAgaWYgKChlcnIgPSBtcF9tdWwgKCZyZXMsICZNW2JpdGJ1Zl0sICZyZXMpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgIGdvdG8gX19SRVM7Ci0gICAgICB9Ci0gICAgICBpZiAoKGVyciA9IG1wX3JlZHVjZSAoJnJlcywgUCwgJm11KSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fUkVTOwotICAgICAgfQotCi0gICAgICAvKiBlbXB0eSB3aW5kb3cgYW5kIHJlc2V0ICovCi0gICAgICBiaXRjcHkgPSAwOwotICAgICAgYml0YnVmID0gMDsKLSAgICAgIG1vZGUgICA9IDE7Ci0gICAgfQotICB9Ci0KLSAgLyogaWYgYml0cyByZW1haW4gdGhlbiBzcXVhcmUvbXVsdGlwbHkgKi8KLSAgaWYgKG1vZGUgPT0gMiAmJiBiaXRjcHkgPiAwKSB7Ci0gICAgLyogc3F1YXJlIHRoZW4gbXVsdGlwbHkgaWYgdGhlIGJpdCBpcyBzZXQgKi8KLSAgICBmb3IgKHggPSAwOyB4IDwgYml0Y3B5OyB4KyspIHsKLSAgICAgIGlmICgoZXJyID0gbXBfc3FyICgmcmVzLCAmcmVzKSkgIT0gTVBfT0tBWSkgewotICAgICAgICBnb3RvIF9fUkVTOwotICAgICAgfQotICAgICAgaWYgKChlcnIgPSBtcF9yZWR1Y2UgKCZyZXMsIFAsICZtdSkpICE9IE1QX09LQVkpIHsKLSAgICAgICAgZ290byBfX1JFUzsKLSAgICAgIH0KLQotICAgICAgYml0YnVmIDw8PSAxOwotICAgICAgaWYgKChiaXRidWYgJiAoMSA8PCB3aW5zaXplKSkgIT0gMCkgewotICAgICAgICAvKiB0aGVuIG11bHRpcGx5ICovCi0gICAgICAgIGlmICgoZXJyID0gbXBfbXVsICgmcmVzLCAmTVsxXSwgJnJlcykpICE9IE1QX09LQVkpIHsKLSAgICAgICAgICBnb3RvIF9fUkVTOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZXJyID0gbXBfcmVkdWNlICgmcmVzLCBQLCAmbXUpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICAgICAgZ290byBfX1JFUzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIG1wX2V4Y2ggKCZyZXMsIFkpOwotICBlcnIgPSBNUF9PS0FZOwotX19SRVM6bXBfY2xlYXIgKCZyZXMpOwotX19NVTptcF9jbGVhciAoJm11KTsKLV9fTToKLSAgbXBfY2xlYXIoJk1bMV0pOwotICBmb3IgKHggPSAxPDwod2luc2l6ZS0xKTsgeCA8ICgxIDw8IHdpbnNpemUpOyB4KyspIHsKLSAgICBtcF9jbGVhciAoJk1beF0pOwotICB9Ci0gIHJldHVybiBlcnI7Ci19Ci0KLS8qIEVuZDogYm5fc19tcF9leHB0bW9kLmMgKi8KLQotLyogU3RhcnQ6IGJuX3NfbXBfbXVsX2RpZ3MuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogbXVsdGlwbGllcyB8YXwgKiB8YnwgYW5kIG9ubHkgY29tcHV0ZXMgdXB0byBkaWdzIGRpZ2l0cyBvZiByZXN1bHQKLSAqIEhBQyBwcC4gNTk1LCBBbGdvcml0aG0gMTQuMTIgIE1vZGlmaWVkIHNvIHlvdSBjYW4gY29udHJvbCBob3cgCi0gKiBtYW55IGRpZ2l0cyBvZiBvdXRwdXQgYXJlIGNyZWF0ZWQuCi0gKi8KLWludAotc19tcF9tdWxfZGlncyAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYywgaW50IGRpZ3MpCi17Ci0gIG1wX2ludCAgdDsKLSAgaW50ICAgICByZXMsIHBhLCBwYiwgaXgsIGl5OwotICBtcF9kaWdpdCB1OwotICBtcF93b3JkIHI7Ci0gIG1wX2RpZ2l0IHRtcHgsICp0bXB0LCAqdG1weTsKLQotICAvKiBjYW4gd2UgdXNlIHRoZSBmYXN0IG11bHRpcGxpZXI/ICovCi0gIGlmICgoKGRpZ3MpIDwgTVBfV0FSUkFZKSAmJgotICAgICAgTUlOIChhLT51c2VkLCBiLT51c2VkKSA8IAotICAgICAgICAgICgxIDw8ICgoQ0hBUl9CSVQgKiBzaXplb2YgKG1wX3dvcmQpKSAtICgyICogRElHSVRfQklUKSkpKSB7Ci0gICAgcmV0dXJuIGZhc3Rfc19tcF9tdWxfZGlncyAoYSwgYiwgYywgZGlncyk7Ci0gIH0KLQotICBpZiAoKHJlcyA9IG1wX2luaXRfc2l6ZSAoJnQsIGRpZ3MpKSAhPSBNUF9PS0FZKSB7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotICB0LnVzZWQgPSBkaWdzOwotCi0gIC8qIGNvbXB1dGUgdGhlIGRpZ2l0cyBvZiB0aGUgcHJvZHVjdCBkaXJlY3RseSAqLwotICBwYSA9IGEtPnVzZWQ7Ci0gIGZvciAoaXggPSAwOyBpeCA8IHBhOyBpeCsrKSB7Ci0gICAgLyogc2V0IHRoZSBjYXJyeSB0byB6ZXJvICovCi0gICAgdSA9IDA7Ci0KLSAgICAvKiBsaW1pdCBvdXJzZWx2ZXMgdG8gbWFraW5nIGRpZ3MgZGlnaXRzIG9mIG91dHB1dCAqLwotICAgIHBiID0gTUlOIChiLT51c2VkLCBkaWdzIC0gaXgpOwotCi0gICAgLyogc2V0dXAgc29tZSBhbGlhc2VzICovCi0gICAgLyogY29weSBvZiB0aGUgZGlnaXQgZnJvbSBhIHVzZWQgd2l0aGluIHRoZSBuZXN0ZWQgbG9vcCAqLwotICAgIHRtcHggPSBhLT5kcFtpeF07Ci0gICAgCi0gICAgLyogYW4gYWxpYXMgZm9yIHRoZSBkZXN0aW5hdGlvbiBzaGlmdGVkIGl4IHBsYWNlcyAqLwotICAgIHRtcHQgPSB0LmRwICsgaXg7Ci0gICAgCi0gICAgLyogYW4gYWxpYXMgZm9yIHRoZSBkaWdpdHMgb2YgYiAqLwotICAgIHRtcHkgPSBiLT5kcDsKLQotICAgIC8qIGNvbXB1dGUgdGhlIGNvbHVtbnMgb2YgdGhlIG91dHB1dCBhbmQgcHJvcGFnYXRlIHRoZSBjYXJyeSAqLwotICAgIGZvciAoaXkgPSAwOyBpeSA8IHBiOyBpeSsrKSB7Ci0gICAgICAvKiBjb21wdXRlIHRoZSBjb2x1bW4gYXMgYSBtcF93b3JkICovCi0gICAgICByICAgICAgID0gKChtcF93b3JkKSp0bXB0KSArCi0gICAgICAgICAgICAgICAgKChtcF93b3JkKXRtcHgpICogKChtcF93b3JkKSp0bXB5KyspICsKLSAgICAgICAgICAgICAgICAoKG1wX3dvcmQpIHUpOwotCi0gICAgICAvKiB0aGUgbmV3IGNvbHVtbiBpcyB0aGUgbG93ZXIgcGFydCBvZiB0aGUgcmVzdWx0ICovCi0gICAgICAqdG1wdCsrID0gKG1wX2RpZ2l0KSAociAmICgobXBfd29yZCkgTVBfTUFTSykpOwotCi0gICAgICAvKiBnZXQgdGhlIGNhcnJ5IHdvcmQgZnJvbSB0aGUgcmVzdWx0ICovCi0gICAgICB1ICAgICAgID0gKG1wX2RpZ2l0KSAociA+PiAoKG1wX3dvcmQpIERJR0lUX0JJVCkpOwotICAgIH0KLSAgICAvKiBzZXQgY2FycnkgaWYgaXQgaXMgcGxhY2VkIGJlbG93IGRpZ3MgKi8KLSAgICBpZiAoaXggKyBpeSA8IGRpZ3MpIHsKLSAgICAgICp0bXB0ID0gdTsKLSAgICB9Ci0gIH0KLQotICBtcF9jbGFtcCAoJnQpOwotICBtcF9leGNoICgmdCwgYyk7Ci0KLSAgbXBfY2xlYXIgKCZ0KTsKLSAgcmV0dXJuIE1QX09LQVk7Ci19Ci0KLS8qIEVuZDogYm5fc19tcF9tdWxfZGlncy5jICovCi0KLS8qIFN0YXJ0OiBibl9zX21wX211bF9oaWdoX2RpZ3MuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogbXVsdGlwbGllcyB8YXwgKiB8YnwgYW5kIGRvZXMgbm90IGNvbXB1dGUgdGhlIGxvd2VyIGRpZ3MgZGlnaXRzCi0gKiBbbWVhbnQgdG8gZ2V0IHRoZSBoaWdoZXIgcGFydCBvZiB0aGUgcHJvZHVjdF0KLSAqLwotaW50Ci1zX21wX211bF9oaWdoX2RpZ3MgKG1wX2ludCAqIGEsIG1wX2ludCAqIGIsIG1wX2ludCAqIGMsIGludCBkaWdzKQotewotICBtcF9pbnQgIHQ7Ci0gIGludCAgICAgcmVzLCBwYSwgcGIsIGl4LCBpeTsKLSAgbXBfZGlnaXQgdTsKLSAgbXBfd29yZCByOwotICBtcF9kaWdpdCB0bXB4LCAqdG1wdCwgKnRtcHk7Ci0KLSAgLyogY2FuIHdlIHVzZSB0aGUgZmFzdCBtdWx0aXBsaWVyPyAqLwotICBpZiAoKChhLT51c2VkICsgYi0+dXNlZCArIDEpIDwgTVBfV0FSUkFZKQotICAgICAgJiYgTUlOIChhLT51c2VkLCBiLT51c2VkKSA8ICgxIDw8ICgoQ0hBUl9CSVQgKiBzaXplb2YgKG1wX3dvcmQpKSAtICgyICogRElHSVRfQklUKSkpKSB7Ci0gICAgcmV0dXJuIGZhc3Rfc19tcF9tdWxfaGlnaF9kaWdzIChhLCBiLCBjLCBkaWdzKTsKLSAgfQotCi0gIGlmICgocmVzID0gbXBfaW5pdF9zaXplICgmdCwgYS0+dXNlZCArIGItPnVzZWQgKyAxKSkgIT0gTVBfT0tBWSkgewotICAgIHJldHVybiByZXM7Ci0gIH0KLSAgdC51c2VkID0gYS0+dXNlZCArIGItPnVzZWQgKyAxOwotCi0gIHBhID0gYS0+dXNlZDsKLSAgcGIgPSBiLT51c2VkOwotICBmb3IgKGl4ID0gMDsgaXggPCBwYTsgaXgrKykgewotICAgIC8qIGNsZWFyIHRoZSBjYXJyeSAqLwotICAgIHUgPSAwOwotCi0gICAgLyogbGVmdCBoYW5kIHNpZGUgb2YgQVtpeF0gKiBCW2l5XSAqLwotICAgIHRtcHggPSBhLT5kcFtpeF07Ci0KLSAgICAvKiBhbGlhcyB0byB0aGUgYWRkcmVzcyBvZiB3aGVyZSB0aGUgZGlnaXRzIHdpbGwgYmUgc3RvcmVkICovCi0gICAgdG1wdCA9ICYodC5kcFtkaWdzXSk7Ci0KLSAgICAvKiBhbGlhcyBmb3Igd2hlcmUgdG8gcmVhZCB0aGUgcmlnaHQgaGFuZCBzaWRlIGZyb20gKi8KLSAgICB0bXB5ID0gYi0+ZHAgKyAoZGlncyAtIGl4KTsKLQotICAgIGZvciAoaXkgPSBkaWdzIC0gaXg7IGl5IDwgcGI7IGl5KyspIHsKLSAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgZG91YmxlIHByZWNpc2lvbiByZXN1bHQgKi8KLSAgICAgIHIgICAgICAgPSAoKG1wX3dvcmQpKnRtcHQpICsKLSAgICAgICAgICAgICAgICAoKG1wX3dvcmQpdG1weCkgKiAoKG1wX3dvcmQpKnRtcHkrKykgKwotICAgICAgICAgICAgICAgICgobXBfd29yZCkgdSk7Ci0KLSAgICAgIC8qIGdldCB0aGUgbG93ZXIgcGFydCAqLwotICAgICAgKnRtcHQrKyA9IChtcF9kaWdpdCkgKHIgJiAoKG1wX3dvcmQpIE1QX01BU0spKTsKLQotICAgICAgLyogY2FycnkgdGhlIGNhcnJ5ICovCi0gICAgICB1ICAgICAgID0gKG1wX2RpZ2l0KSAociA+PiAoKG1wX3dvcmQpIERJR0lUX0JJVCkpOwotICAgIH0KLSAgICAqdG1wdCA9IHU7Ci0gIH0KLSAgbXBfY2xhbXAgKCZ0KTsKLSAgbXBfZXhjaCAoJnQsIGMpOwotICBtcF9jbGVhciAoJnQpOwotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9zX21wX211bF9oaWdoX2RpZ3MuYyAqLwotCi0vKiBTdGFydDogYm5fc19tcF9zcXIuYyAqLwotLyogTGliVG9tTWF0aCwgbXVsdGlwbGUtcHJlY2lzaW9uIGludGVnZXIgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21NYXRoIGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIG11bHRpcGxlLXByZWNpc2lvbgotICogaW50ZWdlciBhcml0aG1ldGljIGFzIHdlbGwgYXMgbnVtYmVyIHRoZW9yZXRpYyBmdW5jdGlvbmFsaXR5LgotICoKLSAqIFRoZSBsaWJyYXJ5IHdhcyBkZXNpZ25lZCBkaXJlY3RseSBhZnRlciB0aGUgTVBJIGxpYnJhcnkgYnkKLSAqIE1pY2hhZWwgRnJvbWJlcmdlciBidXQgaGFzIGJlZW4gd3JpdHRlbiBmcm9tIHNjcmF0Y2ggd2l0aAotICogYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIGluIHBsYWNlLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9tYXRoLmxpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bHRjX3RvbW1hdGguaD4KLQotLyogbG93IGxldmVsIHNxdWFyaW5nLCBiID0gYSphLCBIQUMgcHAuNTk2LTU5NywgQWxnb3JpdGhtIDE0LjE2ICovCi1pbnQKLXNfbXBfc3FyIChtcF9pbnQgKiBhLCBtcF9pbnQgKiBiKQotewotICBtcF9pbnQgIHQ7Ci0gIGludCAgICAgcmVzLCBpeCwgaXksIHBhOwotICBtcF93b3JkIHI7Ci0gIG1wX2RpZ2l0IHUsIHRtcHgsICp0bXB0OwotCi0gIHBhID0gYS0+dXNlZDsKLSAgaWYgKChyZXMgPSBtcF9pbml0X3NpemUgKCZ0LCAyKnBhICsgMSkpICE9IE1QX09LQVkpIHsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgLyogZGVmYXVsdCB1c2VkIGlzIG1heGltdW0gcG9zc2libGUgc2l6ZSAqLwotICB0LnVzZWQgPSAyKnBhICsgMTsKLQotICBmb3IgKGl4ID0gMDsgaXggPCBwYTsgaXgrKykgewotICAgIC8qIGZpcnN0IGNhbGN1bGF0ZSB0aGUgZGlnaXQgYXQgMippeCAqLwotICAgIC8qIGNhbGN1bGF0ZSBkb3VibGUgcHJlY2lzaW9uIHJlc3VsdCAqLwotICAgIHIgPSAoKG1wX3dvcmQpIHQuZHBbMippeF0pICsKLSAgICAgICAgKChtcF93b3JkKWEtPmRwW2l4XSkqKChtcF93b3JkKWEtPmRwW2l4XSk7Ci0KLSAgICAvKiBzdG9yZSBsb3dlciBwYXJ0IGluIHJlc3VsdCAqLwotICAgIHQuZHBbaXgraXhdID0gKG1wX2RpZ2l0KSAociAmICgobXBfd29yZCkgTVBfTUFTSykpOwotCi0gICAgLyogZ2V0IHRoZSBjYXJyeSAqLwotICAgIHUgICAgICAgICAgID0gKG1wX2RpZ2l0KShyID4+ICgobXBfd29yZCkgRElHSVRfQklUKSk7Ci0KLSAgICAvKiBsZWZ0IGhhbmQgc2lkZSBvZiBBW2l4XSAqIEFbaXldICovCi0gICAgdG1weCAgICAgICAgPSBhLT5kcFtpeF07Ci0KLSAgICAvKiBhbGlhcyBmb3Igd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdHMgKi8KLSAgICB0bXB0ICAgICAgICA9IHQuZHAgKyAoMippeCArIDEpOwotICAgIAotICAgIGZvciAoaXkgPSBpeCArIDE7IGl5IDwgcGE7IGl5KyspIHsKLSAgICAgIC8qIGZpcnN0IGNhbGN1bGF0ZSB0aGUgcHJvZHVjdCAqLwotICAgICAgciAgICAgICA9ICgobXBfd29yZCl0bXB4KSAqICgobXBfd29yZClhLT5kcFtpeV0pOwotCi0gICAgICAvKiBub3cgY2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIHJlc3VsdCwgbm90ZSB3ZSB1c2UKLSAgICAgICAqIGFkZGl0aW9uIGluc3RlYWQgb2YgKjIgc2luY2UgaXQncyBlYXNpZXIgdG8gb3B0aW1pemUKLSAgICAgICAqLwotICAgICAgciAgICAgICA9ICgobXBfd29yZCkgKnRtcHQpICsgciArIHIgKyAoKG1wX3dvcmQpIHUpOwotCi0gICAgICAvKiBzdG9yZSBsb3dlciBwYXJ0ICovCi0gICAgICAqdG1wdCsrID0gKG1wX2RpZ2l0KSAociAmICgobXBfd29yZCkgTVBfTUFTSykpOwotCi0gICAgICAvKiBnZXQgY2FycnkgKi8KLSAgICAgIHUgICAgICAgPSAobXBfZGlnaXQpKHIgPj4gKChtcF93b3JkKSBESUdJVF9CSVQpKTsKLSAgICB9Ci0gICAgLyogcHJvcGFnYXRlIHVwd2FyZHMgKi8KLSAgICB3aGlsZSAodSAhPSAoKG1wX2RpZ2l0KSAwKSkgewotICAgICAgciAgICAgICA9ICgobXBfd29yZCkgKnRtcHQpICsgKChtcF93b3JkKSB1KTsKLSAgICAgICp0bXB0KysgPSAobXBfZGlnaXQpIChyICYgKChtcF93b3JkKSBNUF9NQVNLKSk7Ci0gICAgICB1ICAgICAgID0gKG1wX2RpZ2l0KShyID4+ICgobXBfd29yZCkgRElHSVRfQklUKSk7Ci0gICAgfQotICB9Ci0KLSAgbXBfY2xhbXAgKCZ0KTsKLSAgbXBfZXhjaCAoJnQsIGIpOwotICBtcF9jbGVhciAoJnQpOwotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotLyogRW5kOiBibl9zX21wX3Nxci5jICovCi0KLS8qIFN0YXJ0OiBibl9zX21wX3N1Yi5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBsb3cgbGV2ZWwgc3VidHJhY3Rpb24gKGFzc3VtZXMgfGF8ID4gfGJ8KSwgSEFDIHBwLjU5NSBBbGdvcml0aG0gMTQuOSAqLwotaW50Ci1zX21wX3N1YiAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYykKLXsKLSAgaW50ICAgICBvbGR1c2UsIHJlcywgbWluLCBtYXg7Ci0KLSAgLyogZmluZCBzaXplcyAqLwotICBtaW4gPSBiLT51c2VkOwotICBtYXggPSBhLT51c2VkOwotCi0gIC8qIGluaXQgcmVzdWx0ICovCi0gIGlmIChjLT5hbGxvYyA8IG1heCkgewotICAgIGlmICgocmVzID0gbXBfZ3JvdyAoYywgbWF4KSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gIH0KLSAgb2xkdXNlID0gYy0+dXNlZDsKLSAgYy0+dXNlZCA9IG1heDsKLQotICB7Ci0gICAgcmVnaXN0ZXIgbXBfZGlnaXQgdSwgKnRtcGEsICp0bXBiLCAqdG1wYzsKLSAgICByZWdpc3RlciBpbnQgaTsKLQotICAgIC8qIGFsaWFzIGZvciBkaWdpdCBwb2ludGVycyAqLwotICAgIHRtcGEgPSBhLT5kcDsKLSAgICB0bXBiID0gYi0+ZHA7Ci0gICAgdG1wYyA9IGMtPmRwOwotCi0gICAgLyogc2V0IGNhcnJ5IHRvIHplcm8gKi8KLSAgICB1ID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbWluOyBpKyspIHsKLSAgICAgIC8qIFRbaV0gPSBBW2ldIC0gQltpXSAtIFUgKi8KLSAgICAgICp0bXBjID0gKnRtcGErKyAtICp0bXBiKysgLSB1OwotCi0gICAgICAvKiBVID0gY2FycnkgYml0IG9mIFRbaV0KLSAgICAgICAqIE5vdGUgdGhpcyBzYXZlcyBwZXJmb3JtaW5nIGFuIEFORCBvcGVyYXRpb24gc2luY2UKLSAgICAgICAqIGlmIGEgY2FycnkgZG9lcyBvY2N1ciBpdCB3aWxsIHByb3BhZ2F0ZSBhbGwgdGhlIHdheSB0byB0aGUKLSAgICAgICAqIE1TQi4gIEFzIGEgcmVzdWx0IGEgc2luZ2xlIHNoaWZ0IGlzIGVub3VnaCB0byBnZXQgdGhlIGNhcnJ5Ci0gICAgICAgKi8KLSAgICAgIHUgPSAqdG1wYyA+PiAoKG1wX2RpZ2l0KShDSEFSX0JJVCAqIHNpemVvZiAobXBfZGlnaXQpIC0gMSkpOwotCi0gICAgICAvKiBDbGVhciBjYXJyeSBmcm9tIFRbaV0gKi8KLSAgICAgICp0bXBjKysgJj0gTVBfTUFTSzsKLSAgICB9Ci0KLSAgICAvKiBub3cgY29weSBoaWdoZXIgd29yZHMgaWYgYW55LCBlLmcuIGlmIEEgaGFzIG1vcmUgZGlnaXRzIHRoYW4gQiAgKi8KLSAgICBmb3IgKDsgaSA8IG1heDsgaSsrKSB7Ci0gICAgICAvKiBUW2ldID0gQVtpXSAtIFUgKi8KLSAgICAgICp0bXBjID0gKnRtcGErKyAtIHU7Ci0KLSAgICAgIC8qIFUgPSBjYXJyeSBiaXQgb2YgVFtpXSAqLwotICAgICAgdSA9ICp0bXBjID4+ICgobXBfZGlnaXQpKENIQVJfQklUICogc2l6ZW9mIChtcF9kaWdpdCkgLSAxKSk7Ci0KLSAgICAgIC8qIENsZWFyIGNhcnJ5IGZyb20gVFtpXSAqLwotICAgICAgKnRtcGMrKyAmPSBNUF9NQVNLOwotICAgIH0KLQotICAgIC8qIGNsZWFyIGRpZ2l0cyBhYm92ZSB1c2VkIChzaW5jZSB3ZSBtYXkgbm90IGhhdmUgZ3Jvd24gcmVzdWx0IGFib3ZlKSAqLwotICAgIGZvciAoaSA9IGMtPnVzZWQ7IGkgPCBvbGR1c2U7IGkrKykgewotICAgICAgKnRtcGMrKyA9IDA7Ci0gICAgfQotICB9Ci0KLSAgbXBfY2xhbXAgKGMpOwotICByZXR1cm4gTVBfT0tBWTsKLX0KLQotCi0vKiBFbmQ6IGJuX3NfbXBfc3ViLmMgKi8KLQotLyogU3RhcnQ6IGJuY29yZS5jICovCi0vKiBMaWJUb21NYXRoLCBtdWx0aXBsZS1wcmVjaXNpb24gaW50ZWdlciBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbU1hdGggaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgbXVsdGlwbGUtcHJlY2lzaW9uCi0gKiBpbnRlZ2VyIGFyaXRobWV0aWMgYXMgd2VsbCBhcyBudW1iZXIgdGhlb3JldGljIGZ1bmN0aW9uYWxpdHkuCi0gKgotICogVGhlIGxpYnJhcnkgd2FzIGRlc2lnbmVkIGRpcmVjdGx5IGFmdGVyIHRoZSBNUEkgbGlicmFyeSBieQotICogTWljaGFlbCBGcm9tYmVyZ2VyIGJ1dCBoYXMgYmVlbiB3cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoCi0gKiBhZGRpdGlvbmFsIG9wdGltaXphdGlvbnMgaW4gcGxhY2UuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL21hdGgubGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxsdGNfdG9tbWF0aC5oPgotCi0vKiBLbm93biBvcHRpbWFsIGNvbmZpZ3VyYXRpb25zCi0KLSBDUFUgICAgICAgICAgICAgICAgICAgIC9Db21waWxlciAgICAgL01VTCBDVVRPRkYvU1FSIENVVE9GRgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEludGVsIFA0IE5vcnRod29vZCAgICAgL0dDQyB2My4zLjMgICAvICAgICAgICA1OS8gICAgICAgIDgxL3Byb2ZpbGVkIGJ1aWxkCi0gSW50ZWwgUDQgTm9ydGh3b29kICAgICAvR0NDIHYzLjMuMyAgIC8gICAgICAgIDU5LyAgICAgICAgODAvcHJvZmlsZWRfc2luZ2xlIGJ1aWxkCi0gSW50ZWwgUDQgTm9ydGh3b29kICAgICAvSUNDIHY4LjAgICAgIC8gICAgICAgIDU3LyAgICAgICAgNzAvcHJvZmlsZWQgYnVpbGQKLSBJbnRlbCBQNCBOb3J0aHdvb2QgICAgIC9JQ0MgdjguMCAgICAgLyAgICAgICAgNTQvICAgICAgICA3Ni9wcm9maWxlZF9zaW5nbGUgYnVpbGQKLSBBTUQgQXRobG9uIFhQICAgICAgICAgIC9HQ0MgdjMuMiAgICAgLyAgICAgICAxMDkvICAgICAgIDEyNy8KLSAKLSovCi0KLWludCAgICAgS0FSQVRTVUJBX01VTF9DVVRPRkYgPSA1NywgICAgICAvKiBNaW4uIG51bWJlciBvZiBkaWdpdHMgYmVmb3JlIEthcmF0c3ViYSBtdWx0aXBsaWNhdGlvbiBpcyB1c2VkLiAqLwotICAgICAgICBLQVJBVFNVQkFfU1FSX0NVVE9GRiA9IDcwLCAgICAgIC8qIE1pbi4gbnVtYmVyIG9mIGRpZ2l0cyBiZWZvcmUgS2FyYXRzdWJhIHNxdWFyaW5nIGlzIHVzZWQuICovCi0gICAgICAgIAotICAgICAgICBUT09NX01VTF9DVVRPRkYgICAgICA9IDM1MCwgICAgICAvKiBubyBvcHRpbWFsIHZhbHVlcyBvZiB0aGVzZSBhcmUga25vd24geWV0IHNvIHNldCBlbSBoaWdoICovCi0gICAgICAgIFRPT01fU1FSX0NVVE9GRiAgICAgID0gNDAwOyAKLQotLyogRW5kOiBibmNvcmUuYyAqLwotCi0KLS8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvbXBpX3RvX2x0Y19lcnJvci5jIGIvbXBpX3RvX2x0Y19lcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTViMWIyLi4wMDAwMDAwCi0tLSBhL21waV90b19sdGNfZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgTVBJCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICBpbnQgbXBpX2NvZGUsIGx0Y19jb2RlOwotfSBtcGlfdG9fbHRjX2NvZGVzW10gPSB7Ci0gICB7IE1QX09LQVkgLCAgQ1JZUFRfT0t9LAotICAgeyBNUF9NRU0gICwgIENSWVBUX01FTX0sCi0gICB7IE1QX1ZBTCAgLCAgQ1JZUFRfSU5WQUxJRF9BUkd9LAotfTsKLQotLyogY29udmVydCBhIE1QSSBlcnJvciB0byBhIExUQyBlcnJvciAoUG9zc2libHkgdGhlIG1vc3QgcG93ZXJmdWwgZnVuY3Rpb24gZXZlciEgIE9oIHdhaXQuLi4gbm8pICovCi1pbnQgbXBpX3RvX2x0Y19lcnJvcihpbnQgZXJyKQotewotICAgaW50IHg7Ci0KLSAgIGZvciAoeCA9IDA7IHggPCAoaW50KShzaXplb2YobXBpX3RvX2x0Y19jb2Rlcykvc2l6ZW9mKG1waV90b19sdGNfY29kZXNbMF0pKTsgeCsrKSB7Ci0gICAgICAgaWYgKGVyciA9PSBtcGlfdG9fbHRjX2NvZGVzW3hdLm1waV9jb2RlKSB7IAotICAgICAgICAgIHJldHVybiBtcGlfdG9fbHRjX2NvZGVzW3hdLmx0Y19jb2RlOwotICAgICAgIH0KLSAgIH0KLSAgIHJldHVybiBDUllQVF9FUlJPUjsKLX0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9teWNyeXB0X2FyZ2Noay5oIGIvbXljcnlwdF9hcmdjaGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzOGU1NC4uMDAwMDAwMAotLS0gYS9teWNyeXB0X2FyZ2Noay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyogRGVmaW5lcyB0aGUgX0FSR0NISyBtYWNybyB1c2VkIHdpdGhpbiB0aGUgbGlicmFyeSAqLwotCi0vKiBjaDEtMDEtMSAqLwotLyogQVJHVFlQRSBpcyBkZWZpbmVkIGluIG15Y3J5cHRfY2ZnLmggKi8KLSNpZiBBUkdUWVBFID09IDAKLQotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0vKiB0aGlzIGlzIHRoZSBkZWZhdWx0IExpYlRvbUNyeXB0IG1hY3JvICAqLwotZXh0ZXJuIHZvaWQgY3J5cHRfYXJnY2hrKGNoYXIgKnYsIGNoYXIgKnMsIGludCBkKTsKLSNkZWZpbmUgX0FSR0NISyh4KSBpZiAoISh4KSkgeyBjcnlwdF9hcmdjaGsoI3gsIF9fRklMRV9fLCBfX0xJTkVfXyk7IH0KLQotI2VsaWYgQVJHVFlQRSA9PSAxCi0KLS8qIGZhdGFsIHR5cGUgb2YgZXJyb3IgKi8KLSNkZWZpbmUgX0FSR0NISyh4KSBhc3NlcnQoKHgpKQotCi0jZWxpZiBBUkdUWVBFID09IDIKLQotI2RlZmluZSBfQVJHQ0hLKHgpIAotCi0jZW5kaWYKLS8qIGNoMS0wMS0xICovCi0KZGlmZiAtLWdpdCBhL215Y3J5cHRfY2ZnLmggYi9teWNyeXB0X2NmZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDZjNWRiLi4wMDAwMDAwCi0tLSBhL215Y3J5cHRfY2ZnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBUaGlzIGlzIHRoZSBidWlsZCBjb25maWcgZmlsZS4KLSAqCi0gKiBXaXRoIHRoaXMgeW91IGNhbiBzZXR1cCB3aGF0IHRvIGlubGN1ZGUvZXhjbHVkZSBhdXRvbWF0aWNhbGx5IGR1cmluZyBhbnkgYnVpbGQuICBKdXN0IGNvbW1lbnQKLSAqIG91dCB0aGUgbGluZSB0aGF0ICNkZWZpbmUncyB0aGUgd29yZCBmb3IgdGhlIHRoaW5nIHlvdSB3YW50IHRvIHJlbW92ZS4gIHBoZXchCi0gKi8KLQotI2lmbmRlZiBNWUNSWVBUX0NGR19ICi0jZGVmaW5lIE1ZQ1JZUFRfQ0ZHX0gKLQotLyogeW91IGNhbiBjaGFuZ2UgaG93IG1lbW9yeSBhbGxvY2F0aW9uIHdvcmtzIC4uLiAqLwotZXh0ZXJuIHZvaWQgKlhNQUxMT0Moc2l6ZV90IG4pOwotZXh0ZXJuIHZvaWQgKlJFQUxMT0Modm9pZCAqcCwgc2l6ZV90IG4pOwotZXh0ZXJuIHZvaWQgKlhDQUxMT0Moc2l6ZV90IG4sIHNpemVfdCBzKTsKLWV4dGVybiB2b2lkIFhGUkVFKHZvaWQgKnApOwotCi0vKiBjaGFuZ2UgdGhlIGNsb2NrIGZ1bmN0aW9uIHRvbyAqLwotZXh0ZXJuIGNsb2NrX3QgWENMT0NLKHZvaWQpOwotCi0vKiBjaDEtMDEtMSAqLwotLyogdHlwZSBvZiBhcmd1bWVudCBjaGVja2luZywgMD1kZWZhdWx0LCAxPWZhdGFsIGFuZCAyPW5vbmUgKi8KLSNkZWZpbmUgQVJHVFlQRSAgMAotLyogY2gxLTAxLTEgKi8KLQotLyogQ29udHJvbHMgZW5kaWFuZXNzIGFuZCBzaXplIG9mIHJlZ2lzdGVycy4gIExlYXZlIHVuY29tbWVudGVkIHRvIGdldCBwbGF0Zm9ybSBuZXV0cmFsIFtzbG93ZXJdIGNvZGUgKi8KLS8qIGRldGVjdCB4ODYtMzIgbWFjaGluZXMgc29tZXdoYXQgKi8KLSNpZiBkZWZpbmVkKElOVEVMX0NDKSB8fCAoZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChXSU4zMikpIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX0RKR1BQX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX2kzODZfXykpKQotICAgI2RlZmluZSBFTkRJQU5fTElUVExFCi0gICAjZGVmaW5lIEVORElBTl8zMkJJVFdPUkQKLSNlbmRpZgotCi0vKiBkZXRlY3RzIE1JUFMgUjU5MDAgcHJvY2Vzc29ycyAoUFMyKSAqLwotI2lmIChkZWZpbmVkKF9fUjU5MDApIHx8IGRlZmluZWQoUjU5MDApIHx8IGRlZmluZWQoX19SNTkwMF9fKSkgJiYgKGRlZmluZWQoX21pcHMpIHx8IGRlZmluZWQoX19taXBzX18pIHx8IGRlZmluZWQobWlwcykpCi0gICAjZGVmaW5lIEVORElBTl9MSVRUTEUKLSAgICNkZWZpbmUgRU5ESUFOXzY0QklUV09SRAotI2VuZGlmCi0KLS8qICNkZWZpbmUgRU5ESUFOX0xJVFRMRSAqLwotLyogI2RlZmluZSBFTkRJQU5fQklHICovCi0KLS8qICNkZWZpbmUgRU5ESUFOXzMyQklUV09SRCAqLwotLyogI2RlZmluZSBFTkRJQU5fNjRCSVRXT1JEICovCi0KLSNpZiAoZGVmaW5lZChFTkRJQU5fQklHKSB8fCBkZWZpbmVkKEVORElBTl9MSVRUTEUpKSAmJiAhKGRlZmluZWQoRU5ESUFOXzMyQklUV09SRCkgfHwgZGVmaW5lZChFTkRJQU5fNjRCSVRXT1JEKSkKLSAgICAjZXJyb3IgWW91IG11c3Qgc3BlY2lmeSBhIHdvcmQgc2l6ZSBhcyB3ZWxsIGFzIGVuZGlhbmVzcyBpbiBteWNyeXB0X2NmZy5oCi0jZW5kaWYKLQotI2lmICEoZGVmaW5lZChFTkRJQU5fQklHKSB8fCBkZWZpbmVkKEVORElBTl9MSVRUTEUpKQotICAgI2RlZmluZSBFTkRJQU5fTkVVVFJBTAotI2VuZGlmCi0KLSNpZmRlZiBZQVJST1cKLSAgICNpZm5kZWYgQ1RSCi0gICAgICAjZXJyb3IgWUFSUk9XIHJlcXVpcmVzIENUUiBjaGFpbmluZyBtb2RlIHRvIGJlIGRlZmluZWQhCi0gICAjZW5kaWYKLSNlbmRpZgotCi0vKiBwYWNrZXQgY29kZSAqLwotI2lmIGRlZmluZWQoTVJTQSkgfHwgZGVmaW5lZChNREgpIHx8IGRlZmluZWQoTUVDQykKLSAgICAjZGVmaW5lIFBBQ0tFVAotCi0gICAgLyogc2l6ZSBvZiBhIHBhY2tldCBoZWFkZXIgaW4gYnl0ZXMgKi8KLSAgICAjZGVmaW5lIFBBQ0tFVF9TSVpFICAgICAgICAgICAgNAotCi0gICAgLyogU2VjdGlvbiB0YWdzICovCi0gICAgI2RlZmluZSBQQUNLRVRfU0VDVF9SU0EgICAgICAgIDAKLSAgICAjZGVmaW5lIFBBQ0tFVF9TRUNUX0RIICAgICAgICAgMQotICAgICNkZWZpbmUgUEFDS0VUX1NFQ1RfRUNDICAgICAgICAyCi0gICAgI2RlZmluZSBQQUNLRVRfU0VDVF9EU0EgICAgICAgIDMKLQotICAgIC8qIFN1YnNlY3Rpb24gVGFncyBmb3IgdGhlIGZpcnN0IHRocmVlIHNlY3Rpb25zICovCi0gICAgI2RlZmluZSBQQUNLRVRfU1VCX0tFWSAgICAgICAgIDAKLSAgICAjZGVmaW5lIFBBQ0tFVF9TVUJfRU5DUllQVEVEICAgMQotICAgICNkZWZpbmUgUEFDS0VUX1NVQl9TSUdORUQgICAgICAyCi0gICAgI2RlZmluZSBQQUNLRVRfU1VCX0VOQ19LRVkgICAgIDMKLSNlbmRpZgotCi0jZW5kaWYgLyogTVlDUllQVF9DRkdfSCAqLwotCmRpZmYgLS1naXQgYS9teWNyeXB0X2NpcGhlci5oIGIvbXljcnlwdF9jaXBoZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2OGJiZC4uMDAwMDAwMAotLS0gYS9teWNyeXB0X2NpcGhlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qIC0tLS0gU1lNTUVUUklDIEtFWSBTVFVGRiAtLS0tLQotICoKLSAqIFdlIHB1dCBlYWNoIG9mIHRoZSBjaXBoZXJzIHNjaGVkdWxlZCBrZXlzIGluIHRoZWlyIG93biBzdHJ1Y3RzIHRoZW4gd2UgcHV0IGFsbCBvZiAKLSAqIHRoZSBrZXkgZm9ybWF0cyBpbiBvbmUgdW5pb24uICBUaGlzIG1ha2VzIHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzIGVhc2llciB0byB1c2UuCi0gKi8KLSNpZmRlZiBCTE9XRklTSAotc3RydWN0IGJsb3dmaXNoX2tleSB7Ci0gICB1bG9uZzMyIFNbNF1bMjU2XTsKLSAgIHVsb25nMzIgS1sxOF07Ci19OwotI2VuZGlmCi0KLSNpZmRlZiBSQzUKLXN0cnVjdCByYzVfa2V5IHsKLSAgIGludCByb3VuZHM7Ci0gICB1bG9uZzMyIEtbNTBdOwotfTsKLSNlbmRpZgotCi0jaWZkZWYgUkM2Ci1zdHJ1Y3QgcmM2X2tleSB7Ci0gICB1bG9uZzMyIEtbNDRdOwotfTsKLSNlbmRpZgotCi0jaWZkZWYgU0FGRVJQCi1zdHJ1Y3Qgc2FmZXJwX2tleSB7Ci0gICB1bnNpZ25lZCBjaGFyIEtbMzNdWzE2XTsKLSAgIGxvbmcgcm91bmRzOwotfTsKLSNlbmRpZgotCi0jaWZkZWYgUklKTkRBRUwKLXN0cnVjdCByaWpuZGFlbF9rZXkgewotICAgdWxvbmczMiBlS1s2NF0sIGRLWzY0XTsKLSAgIGludCBOcjsKLX07Ci0jZW5kaWYKLQotI2lmZGVmIFhURUEKLXN0cnVjdCB4dGVhX2tleSB7Ci0gICB1bnNpZ25lZCBsb25nIEFbMzJdLCBCWzMyXTsKLX07Ci0jZW5kaWYKLQotI2lmZGVmIFRXT0ZJU0gKLSNpZm5kZWYgVFdPRklTSF9TTUFMTAotICAgc3RydWN0IHR3b2Zpc2hfa2V5IHsKLSAgICAgIHVsb25nMzIgU1s0XVsyNTZdLCBLWzQwXTsKLSAgIH07Ci0jZWxzZQotICAgc3RydWN0IHR3b2Zpc2hfa2V5IHsKLSAgICAgIHVsb25nMzIgS1s0MF07Ci0gICAgICB1bnNpZ25lZCBjaGFyIFNbMzJdLCBzdGFydDsKLSAgIH07Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgU0FGRVIKLSNkZWZpbmUgU0FGRVJfSzY0X0RFRkFVTFRfTk9GX1JPVU5EUyAgICAgNgotI2RlZmluZSBTQUZFUl9LMTI4X0RFRkFVTFRfTk9GX1JPVU5EUyAgIDEwCi0jZGVmaW5lIFNBRkVSX1NLNjRfREVGQVVMVF9OT0ZfUk9VTkRTICAgIDgKLSNkZWZpbmUgU0FGRVJfU0sxMjhfREVGQVVMVF9OT0ZfUk9VTkRTICAxMAotI2RlZmluZSBTQUZFUl9NQVhfTk9GX1JPVU5EUyAgICAgICAgICAgIDEzCi0jZGVmaW5lIFNBRkVSX0JMT0NLX0xFTiAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgU0FGRVJfS0VZX0xFTiAgICAgKDEgKyBTQUZFUl9CTE9DS19MRU4gKiAoMSArIDIgKiBTQUZFUl9NQVhfTk9GX1JPVU5EUykpCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgc2FmZXJfYmxvY2tfdFtTQUZFUl9CTE9DS19MRU5dOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHNhZmVyX2tleV90W1NBRkVSX0tFWV9MRU5dOwotc3RydWN0IHNhZmVyX2tleSB7IHNhZmVyX2tleV90IGtleTsgfTsKLSNlbmRpZgotCi0jaWZkZWYgUkMyCi1zdHJ1Y3QgcmMyX2tleSB7IHVuc2lnbmVkIHhrZXlbNjRdOyB9OwotI2VuZGlmCi0KLSNpZmRlZiBERVMKLXN0cnVjdCBkZXNfa2V5IHsKLSAgICB1bG9uZzMyIGVrWzMyXSwgZGtbMzJdOwotfTsKLQotc3RydWN0IGRlczNfa2V5IHsKLSAgICB1bG9uZzMyIGVrWzNdWzMyXSwgZGtbM11bMzJdOwotfTsKLSNlbmRpZgotCi0jaWZkZWYgQ0FTVDUKLXN0cnVjdCBjYXN0NV9rZXkgewotICAgIHVsb25nMzIgS1szMl0sIGtleWxlbjsKLX07Ci0jZW5kaWYKLQotI2lmZGVmIE5PRUtFT04KLXN0cnVjdCBub2VrZW9uX2tleSB7Ci0gICAgdWxvbmczMiBLWzRdLCBkS1s0XTsKLX07Ci0jZW5kaWYKLQotI2lmZGVmIFNLSVBKQUNLIAotc3RydWN0IHNraXBqYWNrX2tleSB7Ci0gICAgdW5zaWduZWQgY2hhciBrZXlbMTBdOwotfTsKLSNlbmRpZgotCi10eXBlZGVmIHVuaW9uIFN5bW1ldHJpY19rZXkgewotI2lmZGVmIERFUwotICAgc3RydWN0IGRlc19rZXkgZGVzOwotICAgc3RydWN0IGRlczNfa2V5IGRlczM7Ci0jZW5kaWYKLSNpZmRlZiBSQzIKLSAgIHN0cnVjdCByYzJfa2V5IHJjMjsKLSNlbmRpZgotI2lmZGVmIFNBRkVSCi0gICBzdHJ1Y3Qgc2FmZXJfa2V5IHNhZmVyOwotI2VuZGlmCi0jaWZkZWYgVFdPRklTSAotICAgc3RydWN0IHR3b2Zpc2hfa2V5ICB0d29maXNoOwotI2VuZGlmCi0jaWZkZWYgQkxPV0ZJU0gKLSAgIHN0cnVjdCBibG93ZmlzaF9rZXkgYmxvd2Zpc2g7Ci0jZW5kaWYKLSNpZmRlZiBSQzUKLSAgIHN0cnVjdCByYzVfa2V5ICAgICAgcmM1OwotI2VuZGlmCi0jaWZkZWYgUkM2Ci0gICBzdHJ1Y3QgcmM2X2tleSAgICAgIHJjNjsKLSNlbmRpZgotI2lmZGVmIFNBRkVSUAotICAgc3RydWN0IHNhZmVycF9rZXkgICBzYWZlcnA7Ci0jZW5kaWYKLSNpZmRlZiBSSUpOREFFTAotICAgc3RydWN0IHJpam5kYWVsX2tleSByaWpuZGFlbDsKLSNlbmRpZgotI2lmZGVmIFhURUEKLSAgIHN0cnVjdCB4dGVhX2tleSAgICAgeHRlYTsKLSNlbmRpZgotI2lmZGVmIENBU1Q1Ci0gICBzdHJ1Y3QgY2FzdDVfa2V5ICAgIGNhc3Q1OwotI2VuZGlmCi0jaWZkZWYgTk9FS0VPTgotICAgc3RydWN0IG5vZWtlb25fa2V5ICBub2VrZW9uOwotI2VuZGlmICAgCi0jaWZkZWYgU0tJUEpBQ0sKLSAgIHN0cnVjdCBza2lwamFja19rZXkgc2tpcGphY2s7Ci0jZW5kaWYKLX0gc3ltbWV0cmljX2tleTsKLQotLyogQSBibG9jayBjaXBoZXIgRUNCIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgaW50ICAgICAgICAgICAgICAgICBjaXBoZXIsIGJsb2NrbGVuOwotICAgc3ltbWV0cmljX2tleSAgICAgICBrZXk7Ci19IHN5bW1ldHJpY19FQ0I7Ci0KLS8qIEEgYmxvY2sgY2lwaGVyIENGQiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgIGludCAgICAgICAgICAgICAgICAgY2lwaGVyLCBibG9ja2xlbiwgcGFkbGVuOwotICAgdW5zaWduZWQgY2hhciAgICAgICBJVltNQVhCTE9DS1NJWkVdLCBwYWRbTUFYQkxPQ0tTSVpFXTsKLSAgIHN5bW1ldHJpY19rZXkgICAgICAga2V5OwotfSBzeW1tZXRyaWNfQ0ZCOwotCi0vKiBBIGJsb2NrIGNpcGhlciBPRkIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBpbnQgICAgICAgICAgICAgICAgIGNpcGhlciwgYmxvY2tsZW4sIHBhZGxlbjsKLSAgIHVuc2lnbmVkIGNoYXIgICAgICAgSVZbTUFYQkxPQ0tTSVpFXTsKLSAgIHN5bW1ldHJpY19rZXkgICAgICAga2V5OwotfSBzeW1tZXRyaWNfT0ZCOwotCi0vKiBBIGJsb2NrIGNpcGhlciBDQkMgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBTeW1tZXRyaWNfQ0JDIHsKLSAgIGludCAgICAgICAgICAgICAgICAgY2lwaGVyLCBibG9ja2xlbjsKLSAgIHVuc2lnbmVkIGNoYXIgICAgICAgSVZbTUFYQkxPQ0tTSVpFXTsKLSAgIHN5bW1ldHJpY19rZXkgICAgICAga2V5OwotfSBzeW1tZXRyaWNfQ0JDOwotCi0vKiBBIGJsb2NrIGNpcGhlciBDVFIgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBTeW1tZXRyaWNfQ1RSIHsKLSAgIGludCAgICAgICAgICAgICAgICAgY2lwaGVyLCBibG9ja2xlbiwgcGFkbGVuLCBtb2RlOwotICAgdW5zaWduZWQgY2hhciAgICAgICBjdHJbTUFYQkxPQ0tTSVpFXSwgcGFkW01BWEJMT0NLU0laRV07Ci0gICBzeW1tZXRyaWNfa2V5ICAgICAgIGtleTsKLX0gc3ltbWV0cmljX0NUUjsKLQotLyogY2lwaGVyIGRlc2NyaXB0b3IgdGFibGUsIGxhc3QgZW50cnkgaGFzICJuYW1lID09IE5VTEwiIHRvIG1hcmsgdGhlIGVuZCBvZiB0YWJsZSAqLwotZXh0ZXJuICBzdHJ1Y3QgX2NpcGhlcl9kZXNjcmlwdG9yIHsKLSAgIGNoYXIgKm5hbWU7Ci0gICB1bnNpZ25lZCBjaGFyIElEOwotICAgaW50ICBtaW5fa2V5X2xlbmd0aCwgbWF4X2tleV9sZW5ndGgsIGJsb2NrX2xlbmd0aCwgZGVmYXVsdF9yb3VuZHM7Ci0gICBpbnQgICgqc2V0dXApKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbmd0aCwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwotICAgdm9pZCAoKmVjYl9lbmNyeXB0KShjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSk7Ci0gICB2b2lkICgqZWNiX2RlY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLSAgIGludCAoKnRlc3QpKHZvaWQpOwotICAgaW50ICAoKmtleXNpemUpKGludCAqZGVzaXJlZF9rZXlzaXplKTsKLX0gY2lwaGVyX2Rlc2NyaXB0b3JbXTsKLQotI2lmZGVmIEJMT1dGSVNICi1leHRlcm4gaW50IGJsb3dmaXNoX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwotZXh0ZXJuIHZvaWQgYmxvd2Zpc2hfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpOwotZXh0ZXJuIHZvaWQgYmxvd2Zpc2hfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICprZXkpOwotZXh0ZXJuIGludCBibG93ZmlzaF90ZXN0KHZvaWQpOwotZXh0ZXJuIGludCBibG93ZmlzaF9rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2NpcGhlcl9kZXNjcmlwdG9yIGJsb3dmaXNoX2Rlc2M7Ci0jZW5kaWYKLQotI2lmZGVmIFJDNQotZXh0ZXJuIGludCByYzVfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Ci1leHRlcm4gdm9pZCByYzVfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpOwotZXh0ZXJuIHZvaWQgcmM1X2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiBpbnQgcmM1X3Rlc3Qodm9pZCk7Ci1leHRlcm4gaW50IHJjNV9rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2NpcGhlcl9kZXNjcmlwdG9yIHJjNV9kZXNjOwotI2VuZGlmCi0KLSNpZmRlZiBSQzYKLWV4dGVybiBpbnQgcmM2X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwotZXh0ZXJuIHZvaWQgcmM2X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiB2b2lkIHJjNl9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSk7Ci1leHRlcm4gaW50IHJjNl90ZXN0KHZvaWQpOwotZXh0ZXJuIGludCByYzZfa2V5c2l6ZShpbnQgKmRlc2lyZWRfa2V5c2l6ZSk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciByYzZfZGVzYzsKLSNlbmRpZgotCi0jaWZkZWYgUkMyCi1leHRlcm4gaW50IHJjMl9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKLWV4dGVybiB2b2lkIHJjMl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSk7Ci1leHRlcm4gdm9pZCByYzJfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICprZXkpOwotZXh0ZXJuIGludCByYzJfdGVzdCh2b2lkKTsKLWV4dGVybiBpbnQgcmMyX2tleXNpemUoaW50ICpkZXNpcmVkX2tleXNpemUpOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgcmMyX2Rlc2M7Ci0jZW5kaWYKLQotI2lmZGVmIFNBRkVSUAotZXh0ZXJuIGludCBzYWZlcnBfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Ci1leHRlcm4gdm9pZCBzYWZlcnBfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpOwotZXh0ZXJuIHZvaWQgc2FmZXJwX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiBpbnQgc2FmZXJwX3Rlc3Qodm9pZCk7Ci1leHRlcm4gaW50IHNhZmVycF9rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2NpcGhlcl9kZXNjcmlwdG9yIHNhZmVycF9kZXNjOwotI2VuZGlmCi0KLSNpZmRlZiBTQUZFUgotZXh0ZXJuIGludCBzYWZlcl9rNjRfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Ci1leHRlcm4gaW50IHNhZmVyX3NrNjRfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Ci1leHRlcm4gaW50IHNhZmVyX2sxMjhfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Ci1leHRlcm4gaW50IHNhZmVyX3NrMTI4X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwotZXh0ZXJuIHZvaWQgc2FmZXJfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpOwotZXh0ZXJuIHZvaWQgc2FmZXJfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICprZXkpOwotCi1leHRlcm4gaW50IHNhZmVyX2s2NF90ZXN0KHZvaWQpOwotZXh0ZXJuIGludCBzYWZlcl9zazY0X3Rlc3Qodm9pZCk7Ci1leHRlcm4gaW50IHNhZmVyX3NrMTI4X3Rlc3Qodm9pZCk7Ci0KLWV4dGVybiBpbnQgc2FmZXJfNjRfa2V5c2l6ZShpbnQgKmRlc2lyZWRfa2V5c2l6ZSk7Ci1leHRlcm4gaW50IHNhZmVyXzEyOF9rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2NpcGhlcl9kZXNjcmlwdG9yIHNhZmVyX2s2NF9kZXNjLCBzYWZlcl9rMTI4X2Rlc2MsIHNhZmVyX3NrNjRfZGVzYywgc2FmZXJfc2sxMjhfZGVzYzsKLSNlbmRpZgotCi0jaWZkZWYgUklKTkRBRUwKLQotLyogbWFrZSBhZXMgYW4gYWxpYXMgKi8KLSNkZWZpbmUgYWVzX3NldHVwICAgICAgICAgICByaWpuZGFlbF9zZXR1cAotI2RlZmluZSBhZXNfZWNiX2VuY3J5cHQgICAgIHJpam5kYWVsX2VjYl9lbmNyeXB0Ci0jZGVmaW5lIGFlc19lY2JfZGVjcnlwdCAgICAgcmlqbmRhZWxfZWNiX2RlY3J5cHQKLSNkZWZpbmUgYWVzX3Rlc3QgICAgICAgICAgICByaWpuZGFlbF90ZXN0Ci0jZGVmaW5lIGFlc19rZXlzaXplICAgICAgICAgcmlqbmRhZWxfa2V5c2l6ZQotCi0jZGVmaW5lIGFlc19lbmNfc2V0dXAgICAgICAgICAgIHJpam5kYWVsX2VuY19zZXR1cAotI2RlZmluZSBhZXNfZW5jX2VjYl9lbmNyeXB0ICAgICByaWpuZGFlbF9lbmNfZWNiX2VuY3J5cHQKLSNkZWZpbmUgYWVzX2VuY19rZXlzaXplICAgICAgICAgcmlqbmRhZWxfZW5jX2tleXNpemUKLQotZXh0ZXJuIGludCByaWpuZGFlbF9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKLWV4dGVybiB2b2lkIHJpam5kYWVsX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiB2b2lkIHJpam5kYWVsX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiBpbnQgcmlqbmRhZWxfdGVzdCh2b2lkKTsKLWV4dGVybiBpbnQgcmlqbmRhZWxfa2V5c2l6ZShpbnQgKmRlc2lyZWRfa2V5c2l6ZSk7Ci0KLWV4dGVybiBpbnQgcmlqbmRhZWxfZW5jX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwotZXh0ZXJuIHZvaWQgcmlqbmRhZWxfZW5jX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiBpbnQgcmlqbmRhZWxfZW5jX2tleXNpemUoaW50ICpkZXNpcmVkX2tleXNpemUpOwotCi1leHRlcm4gY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciByaWpuZGFlbF9kZXNjLCBhZXNfZGVzYzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2NpcGhlcl9kZXNjcmlwdG9yIHJpam5kYWVsX2VuY19kZXNjLCBhZXNfZW5jX2Rlc2M7Ci0jZW5kaWYKLQotI2lmZGVmIFhURUEKLWV4dGVybiBpbnQgeHRlYV9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKLWV4dGVybiB2b2lkIHh0ZWFfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpOwotZXh0ZXJuIHZvaWQgeHRlYV9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSk7Ci1leHRlcm4gaW50IHh0ZWFfdGVzdCh2b2lkKTsKLWV4dGVybiBpbnQgeHRlYV9rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2NpcGhlcl9kZXNjcmlwdG9yIHh0ZWFfZGVzYzsKLSNlbmRpZgotCi0jaWZkZWYgVFdPRklTSAotZXh0ZXJuIGludCB0d29maXNoX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwotZXh0ZXJuIHZvaWQgdHdvZmlzaF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSk7Ci1leHRlcm4gdm9pZCB0d29maXNoX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiBpbnQgdHdvZmlzaF90ZXN0KHZvaWQpOwotZXh0ZXJuIGludCB0d29maXNoX2tleXNpemUoaW50ICpkZXNpcmVkX2tleXNpemUpOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgdHdvZmlzaF9kZXNjOwotI2VuZGlmCi0KLSNpZmRlZiBERVMKLWV4dGVybiBpbnQgZGVzX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwotZXh0ZXJuIHZvaWQgZGVzX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiB2b2lkIGRlc19lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSk7Ci1leHRlcm4gaW50IGRlc190ZXN0KHZvaWQpOwotZXh0ZXJuIGludCBkZXNfa2V5c2l6ZShpbnQgKmRlc2lyZWRfa2V5c2l6ZSk7Ci0KLWV4dGVybiBpbnQgZGVzM19zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKLWV4dGVybiB2b2lkIGRlczNfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpOwotZXh0ZXJuIHZvaWQgZGVzM19lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSk7Ci1leHRlcm4gaW50IGRlczNfdGVzdCh2b2lkKTsKLWV4dGVybiBpbnQgZGVzM19rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgZGVzX2Rlc2MsIGRlczNfZGVzYzsKLSNlbmRpZgotCi0jaWZkZWYgQ0FTVDUKLWV4dGVybiBpbnQgY2FzdDVfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Ci1leHRlcm4gdm9pZCBjYXN0NV9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSk7Ci1leHRlcm4gdm9pZCBjYXN0NV9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSk7Ci1leHRlcm4gaW50IGNhc3Q1X3Rlc3Qodm9pZCk7Ci1leHRlcm4gaW50IGNhc3Q1X2tleXNpemUoaW50ICpkZXNpcmVkX2tleXNpemUpOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgY2FzdDVfZGVzYzsKLSNlbmRpZgotCi0jaWZkZWYgTk9FS0VPTgotZXh0ZXJuIGludCBub2VrZW9uX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwotZXh0ZXJuIHZvaWQgbm9la2Vvbl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSk7Ci1leHRlcm4gdm9pZCBub2VrZW9uX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiBpbnQgbm9la2Vvbl90ZXN0KHZvaWQpOwotZXh0ZXJuIGludCBub2VrZW9uX2tleXNpemUoaW50ICpkZXNpcmVkX2tleXNpemUpOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3Igbm9la2Vvbl9kZXNjOwotI2VuZGlmCi0KLSNpZmRlZiBTS0lQSkFDSwotZXh0ZXJuIGludCBza2lwamFja19zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKLWV4dGVybiB2b2lkIHNraXBqYWNrX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiB2b2lkIHNraXBqYWNrX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKLWV4dGVybiBpbnQgc2tpcGphY2tfdGVzdCh2b2lkKTsKLWV4dGVybiBpbnQgc2tpcGphY2tfa2V5c2l6ZShpbnQgKmRlc2lyZWRfa2V5c2l6ZSk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciBza2lwamFja19kZXNjOwotI2VuZGlmCi0KLSNpZmRlZiBFQ0IKLWV4dGVybiBpbnQgZWNiX3N0YXJ0KGludCBjaXBoZXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgCi0gICAgICAgICAgICAgICAgICAgICBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX0VDQiAqZWNiKTsKLWV4dGVybiBpbnQgZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfRUNCICplY2IpOwotZXh0ZXJuIGludCBlY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19FQ0IgKmVjYik7Ci0jZW5kaWYKLQotI2lmZGVmIENGQgotZXh0ZXJuIGludCBjZmJfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgCi0gICAgICAgICAgICAgICAgICAgICBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX0NGQiAqY2ZiKTsKLWV4dGVybiBpbnQgY2ZiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0NGQiAqY2ZiKTsKLWV4dGVybiBpbnQgY2ZiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0NGQiAqY2ZiKTsKLWV4dGVybiBpbnQgY2ZiX2dldGl2KHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nICpsZW4sIHN5bW1ldHJpY19DRkIgKmNmYik7Ci1leHRlcm4gaW50IGNmYl9zZXRpdihjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DRkIgKmNmYik7Ci0jZW5kaWYKLQotI2lmZGVmIE9GQgotZXh0ZXJuIGludCBvZmJfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgCi0gICAgICAgICAgICAgICAgICAgICBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX09GQiAqb2ZiKTsKLWV4dGVybiBpbnQgb2ZiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX09GQiAqb2ZiKTsKLWV4dGVybiBpbnQgb2ZiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX09GQiAqb2ZiKTsKLWV4dGVybiBpbnQgb2ZiX2dldGl2KHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nICpsZW4sIHN5bW1ldHJpY19PRkIgKm9mYik7Ci1leHRlcm4gaW50IG9mYl9zZXRpdihjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19PRkIgKm9mYik7Ci0jZW5kaWYKLQotI2lmZGVmIENCQwotZXh0ZXJuIGludCBjYmNfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfQ0JDICpjYmMpOwotZXh0ZXJuIGludCBjYmNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19DQkMgKmNiYyk7Ci1leHRlcm4gaW50IGNiY19kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX0NCQyAqY2JjKTsKLWV4dGVybiBpbnQgY2JjX2dldGl2KHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nICpsZW4sIHN5bW1ldHJpY19DQkMgKmNiYyk7Ci1leHRlcm4gaW50IGNiY19zZXRpdihjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DQkMgKmNiYyk7Ci0jZW5kaWYKLQotI2lmZGVmIENUUgotZXh0ZXJuIGludCBjdHJfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgCi0gICAgICAgICAgICAgICAgICAgICBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX0NUUiAqY3RyKTsKLWV4dGVybiBpbnQgY3RyX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0NUUiAqY3RyKTsKLWV4dGVybiBpbnQgY3RyX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0NUUiAqY3RyKTsKLWV4dGVybiBpbnQgY3RyX2dldGl2KHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nICpsZW4sIHN5bW1ldHJpY19DVFIgKmN0cik7Ci1leHRlcm4gaW50IGN0cl9zZXRpdihjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DVFIgKmN0cik7Ci0jZW5kaWYKLQotCi0gICAgCi1leHRlcm4gaW50IGZpbmRfY2lwaGVyKGNvbnN0IGNoYXIgKm5hbWUpOwotZXh0ZXJuIGludCBmaW5kX2NpcGhlcl9hbnkoY29uc3QgY2hhciAqbmFtZSwgaW50IGJsb2NrbGVuLCBpbnQga2V5bGVuKTsKLWV4dGVybiBpbnQgZmluZF9jaXBoZXJfaWQodW5zaWduZWQgY2hhciBJRCk7Ci0KLWV4dGVybiBpbnQgcmVnaXN0ZXJfY2lwaGVyKGNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgKmNpcGhlcik7Ci1leHRlcm4gaW50IHVucmVnaXN0ZXJfY2lwaGVyKGNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgKmNpcGhlcik7Ci0KLWV4dGVybiBpbnQgY2lwaGVyX2lzX3ZhbGlkKGludCBpZHgpOwotCmRpZmYgLS1naXQgYS9teWNyeXB0X2N1c3RvbS5oIGIvbXljcnlwdF9jdXN0b20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyODU2ZS4uMDAwMDAwMAotLS0gYS9teWNyeXB0X2N1c3RvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogVGhpcyBoZWFkZXIgaXMgbWVhbnQgdG8gYmUgaW5jbHVkZWQgYmVmb3JlIG15Y3J5cHQuaCBpbiBwcm9qZWN0cyB3aGVyZQotICogeW91IGRvbid0IHdhbnQgdG8gdGhyb3cgYWxsIHRoZSBkZWZpbmVzIGluIGEgbWFrZWZpbGUuIAotICovCi0KLSNpZm5kZWYgTVlDUllQVF9DVVNUT01fSF8KLSNkZWZpbmUgTVlDUllQVF9DVVNUT01fSF8KLQotLyogdGhpcyB3aWxsIHNvcnQgb3V0IHdoaWNoIHN0dWZmIGJhc2VkIG9uIHRoZSB1c2VyLWNvbmZpZyBpbiBvcHRpb25zLmggKi8KLSNpbmNsdWRlICIuLi9vcHRpb25zLmgiCi0KLSNpZmRlZiBDUllQVAotCSNlcnJvciBteWNyeXB0X2N1c3RvbS5oIHNob3VsZCBiZSBpbmNsdWRlZCBiZWZvcmUgbXljcnlwdC5oCi0jZW5kaWYKLQotLyogbWFjcm9zIGZvciB2YXJpb3VzIGxpYmMgZnVuY3Rpb25zICovCi0jZGVmaW5lIFhNQUxMT0MgbWFsbG9jCi0jZGVmaW5lIFhSRUFMTE9DIHJlYWxsb2MKLSNkZWZpbmUgWENBTExPQyBjYWxsb2MKLSNkZWZpbmUgWEZSRUUgZnJlZQotI2RlZmluZSBYQ0xPQ0sgY2xvY2sKLSNkZWZpbmUgWENMT0NLU19QRVJfU0VDIENMT0NLU19QRVJfU0VDCi0KLSNpZmRlZiBEUk9QQkVBUl9TTUFMTF9DT0RFCi0jZGVmaW5lIFNNQUxMX0NPREUKLSNlbmRpZgotCi0vKiAjZGVmaW5lIExUQ19URVNUICovCi0jZGVmaW5lIENMRUFOX1NUQUNLCi0jZGVmaW5lIE5PX0ZJTEUKLQotI2lmZGVmIERST1BCRUFSX0JMT1dGSVNIX0NCQwotI2RlZmluZSBCTE9XRklTSAotI2VuZGlmCi0KLSNpZmRlZiBEUk9QQkVBUl9BRVMxMjhfQ0JDCi0jZGVmaW5lIFJJSk5EQUVMCi0jZW5kaWYKLQotI2lmZGVmIERST1BCRUFSX1RXT0ZJU0gxMjhfQ0JDCi0jZGVmaW5lIFRXT0ZJU0gKLQotLyogZW5hYmxpbmcganVzdCBUV09GSVNIX1NNQUxMIHdpbGwgbWFrZSB0aGUgYmluYXJ5IH4xa0Igc21hbGxlciwgdHVybmluZyBvbgotICogVFdPRklTSF9UQUJMRVMgd2lsbCBtYWtlIGl0IGEgZmV3IGtCIGJpZ2dlciwgYnV0IHBlcmhhcHMgcmVkdWNlcyBydW50aW1lCi0gKiBtZW1vcnkgdXNhZ2U/ICovCi0jZGVmaW5lIFRXT0ZJU0hfU01BTEwKLS8qI2RlZmluZSBUV09GSVNIX1RBQkxFUyovCi0jZW5kaWYKLQotI2lmZGVmIERST1BCRUFSXzNERVNfQ0JDCi0jZGVmaW5lIERFUwotI2VuZGlmCi0KLSNkZWZpbmUgQ0JDCi0KLSNpZiBkZWZpbmVkKERST1BCRUFSX0RTUykgJiYgZGVmaW5lZChEU1NfUFJPVE9LKQotI2RlZmluZSBTSEE1MTIKLSNlbmRpZgotCi0jZGVmaW5lIFNIQTEKLQotI2lmZGVmIERST1BCRUFSX01ENV9ITUFDCi0jZGVmaW5lIE1ENQotI2VuZGlmCi0KLSNkZWZpbmUgSE1BQwotI2RlZmluZSBCQVNFNjQKLQotI2luY2x1ZGUgPG15Y3J5cHQuaD4KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL215Y3J5cHRfZ2YuaCBiL215Y3J5cHRfZ2YuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxMDY1ZC4uMDAwMDAwMAotLS0gYS9teWNyeXB0X2dmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0KLS8qIC0tLS0gR0YoMl53KSBwb2x5bm9taWFsIGJhc2lzIC0tLS0gKi8KLSNpZmRlZiBHRgotI2RlZmluZSAgIExTSVpFICAgIDMyICAgLyogaGFuZGxlIHVwdG8gMTAyNC1iaXQgR0YgbnVtYmVycyAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgZ2ZfaW50W0xTSVpFXTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAqZ2ZfaW50cDsKLQotZXh0ZXJuIHZvaWQgZ2ZfY29weShnZl9pbnRwIGEsIGdmX2ludHAgYik7Ci1leHRlcm4gdm9pZCBnZl96ZXJvKGdmX2ludHAgYSk7Ci1leHRlcm4gaW50IGdmX2lzemVybyhnZl9pbnRwIGEpOwotZXh0ZXJuIGludCBnZl9pc29uZShnZl9pbnRwIGEpOwotZXh0ZXJuIGludCBnZl9kZWcoZ2ZfaW50cCBhKTsKLQotZXh0ZXJuIHZvaWQgZ2Zfc2hsKGdmX2ludHAgYSwgZ2ZfaW50cCBiKTsKLWV4dGVybiB2b2lkIGdmX3NocihnZl9pbnRwIGEsIGdmX2ludHAgYik7Ci1leHRlcm4gdm9pZCBnZl9hZGQoZ2ZfaW50cCBhLCBnZl9pbnRwIGIsIGdmX2ludHAgYyk7Ci1leHRlcm4gdm9pZCBnZl9tdWwoZ2ZfaW50cCBhLCBnZl9pbnRwIGIsIGdmX2ludHAgYyk7Ci1leHRlcm4gdm9pZCBnZl9kaXYoZ2ZfaW50cCBhLCBnZl9pbnRwIGIsIGdmX2ludHAgcSwgZ2ZfaW50cCByKTsKLQotZXh0ZXJuIHZvaWQgZ2ZfbW9kKGdmX2ludHAgYSwgZ2ZfaW50cCBtLCBnZl9pbnRwIGIpOwotZXh0ZXJuIHZvaWQgZ2ZfbXVsbW9kKGdmX2ludHAgYSwgZ2ZfaW50cCBiLCBnZl9pbnRwIG0sIGdmX2ludHAgYyk7Ci1leHRlcm4gdm9pZCBnZl9pbnZtb2QoZ2ZfaW50cCBBLCBnZl9pbnRwIE0sIGdmX2ludHAgQik7Ci1leHRlcm4gdm9pZCBnZl9zcXJ0KGdmX2ludHAgYSwgZ2ZfaW50cCBNLCBnZl9pbnRwIGIpOwotZXh0ZXJuIHZvaWQgZ2ZfZ2NkKGdmX2ludHAgQSwgZ2ZfaW50cCBCLCBnZl9pbnRwIGMpOwotZXh0ZXJuIGludCBnZl9pc19wcmltZShnZl9pbnRwIGEpOwotCi1leHRlcm4gaW50IGdmX3NpemUoZ2ZfaW50cCBhKTsKLWV4dGVybiB2b2lkIGdmX3RvcmF3KGdmX2ludHAgYSwgdW5zaWduZWQgY2hhciAqZHN0KTsKLWV4dGVybiB2b2lkIGdmX3JlYWRyYXcoZ2ZfaW50cCBhLCB1bnNpZ25lZCBjaGFyICpzdHIsIGludCBsZW4pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL215Y3J5cHRfaGFzaC5oIGIvbXljcnlwdF9oYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZGY5ZTkuLjAwMDAwMDAKLS0tIGEvbXljcnlwdF9oYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyogLS0tLSBIQVNIIEZVTkNUSU9OUyAtLS0tICovCi0jaWZkZWYgU0hBNTEyCi1zdHJ1Y3Qgc2hhNTEyX3N0YXRlIHsKLSAgICB1bG9uZzY0ICBsZW5ndGgsIHN0YXRlWzhdOwotICAgIHVuc2lnbmVkIGxvbmcgY3VybGVuOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEyOF07Ci19OwotI2VuZGlmCi0KLSNpZmRlZiBTSEEyNTYKLXN0cnVjdCBzaGEyNTZfc3RhdGUgewotICAgIHVsb25nNjQgbGVuZ3RoOwotICAgIHVsb25nMzIgc3RhdGVbOF0sIGN1cmxlbjsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1Zls2NF07Ci19OwotI2VuZGlmCi0KLSNpZmRlZiBTSEExCi1zdHJ1Y3Qgc2hhMV9zdGF0ZSB7Ci0gICAgdWxvbmc2NCBsZW5ndGg7Ci0gICAgdWxvbmczMiBzdGF0ZVs1XSwgY3VybGVuOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKLX07Ci0jZW5kaWYKLQotI2lmZGVmIE1ENQotc3RydWN0IG1kNV9zdGF0ZSB7Ci0gICAgdWxvbmc2NCBsZW5ndGg7Ci0gICAgdWxvbmczMiBzdGF0ZVs0XSwgY3VybGVuOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKLX07Ci0jZW5kaWYKLQotI2lmZGVmIE1ENAotc3RydWN0IG1kNF9zdGF0ZSB7Ci0gICAgdWxvbmc2NCBsZW5ndGg7Ci0gICAgdWxvbmczMiBzdGF0ZVs0XSwgY3VybGVuOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKLX07Ci0jZW5kaWYKLQotI2lmZGVmIFRJR0VSCi1zdHJ1Y3QgdGlnZXJfc3RhdGUgewotICAgIHVsb25nNjQgc3RhdGVbM10sIGxlbmd0aDsKLSAgICB1bnNpZ25lZCBsb25nIGN1cmxlbjsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1Zls2NF07Ci19OwotI2VuZGlmCi0KLSNpZmRlZiBNRDIKLXN0cnVjdCBtZDJfc3RhdGUgewotICAgIHVuc2lnbmVkIGNoYXIgY2hrc3VtWzE2XSwgWFs0OF0sIGJ1ZlsxNl07Ci0gICAgdW5zaWduZWQgbG9uZyBjdXJsZW47Ci19OwotI2VuZGlmCi0KLSNpZmRlZiBSSVBFTUQxMjgKLXN0cnVjdCBybWQxMjhfc3RhdGUgewotICAgIHVsb25nNjQgbGVuZ3RoOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKLSAgICB1bG9uZzMyIGN1cmxlbiwgc3RhdGVbNF07Ci19OwotI2VuZGlmCi0KLSNpZmRlZiBSSVBFTUQxNjAKLXN0cnVjdCBybWQxNjBfc3RhdGUgewotICAgIHVsb25nNjQgbGVuZ3RoOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKLSAgICB1bG9uZzMyIGN1cmxlbiwgc3RhdGVbNV07Ci19OwotI2VuZGlmCi0KLSNpZmRlZiBXSElSTFBPT0wKLXN0cnVjdCB3aGlybHBvb2xfc3RhdGUgewotICAgIHVsb25nNjQgbGVuZ3RoLCBzdGF0ZVs4XTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1Zls2NF07Ci0gICAgdWxvbmczMiBjdXJsZW47Ci19OwotI2VuZGlmCi0KLXR5cGVkZWYgdW5pb24gSGFzaF9zdGF0ZSB7Ci0jaWZkZWYgV0hJUkxQT09MCi0gICAgc3RydWN0IHdoaXJscG9vbF9zdGF0ZSB3aGlybHBvb2w7Ci0jZW5kaWYKLSNpZmRlZiBTSEE1MTIKLSAgICBzdHJ1Y3Qgc2hhNTEyX3N0YXRlIHNoYTUxMjsKLSNlbmRpZgotI2lmZGVmIFNIQTI1NgotICAgIHN0cnVjdCBzaGEyNTZfc3RhdGUgc2hhMjU2OwotI2VuZGlmCi0jaWZkZWYgU0hBMQotICAgIHN0cnVjdCBzaGExX3N0YXRlICAgc2hhMTsKLSNlbmRpZgotI2lmZGVmIE1ENQotICAgIHN0cnVjdCBtZDVfc3RhdGUgICAgbWQ1OwotI2VuZGlmCi0jaWZkZWYgTUQ0Ci0gICAgc3RydWN0IG1kNF9zdGF0ZSAgICBtZDQ7Ci0jZW5kaWYKLSNpZmRlZiBNRDIKLSAgICBzdHJ1Y3QgbWQyX3N0YXRlICAgIG1kMjsKLSNlbmRpZgotI2lmZGVmIFRJR0VSCi0gICAgc3RydWN0IHRpZ2VyX3N0YXRlICB0aWdlcjsKLSNlbmRpZgotI2lmZGVmIFJJUEVNRDEyOAotICAgIHN0cnVjdCBybWQxMjhfc3RhdGUgcm1kMTI4OwotI2VuZGlmCi0jaWZkZWYgUklQRU1EMTYwCi0gICAgc3RydWN0IHJtZDE2MF9zdGF0ZSBybWQxNjA7Ci0jZW5kaWYKLX0gaGFzaF9zdGF0ZTsKLQotZXh0ZXJuIHN0cnVjdCBfaGFzaF9kZXNjcmlwdG9yIHsKLSAgICBjaGFyICpuYW1lOwotICAgIHVuc2lnbmVkIGNoYXIgSUQ7Ci0gICAgdW5zaWduZWQgbG9uZyBoYXNoc2l6ZTsgICAgICAgLyogZGlnZXN0IG91dHB1dCBzaXplIGluIGJ5dGVzICAqLwotICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplOyAgICAgIC8qIHRoZSBibG9jayBzaXplIHRoZSBoYXNoIHVzZXMgKi8KLSAgICB1bnNpZ25lZCBjaGFyIERFUls2NF07ICAgICAgICAvKiBERVIgZW5jb2RlZCBpZGVudGlmaWVyICovCi0gICAgdW5zaWduZWQgbG9uZyBERVJsZW47ICAgICAgICAgLyogbGVuZ3RoIG9mIERFUiBlbmNvZGluZyAqLwotICAgIHZvaWQgKCppbml0KShoYXNoX3N0YXRlICopOwotICAgIGludCAoKnByb2Nlc3MpKGhhc2hfc3RhdGUgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nKTsKLSAgICBpbnQgKCpkb25lKShoYXNoX3N0YXRlICosIHVuc2lnbmVkIGNoYXIgKik7Ci0gICAgaW50ICAoKnRlc3QpKHZvaWQpOwotfSBoYXNoX2Rlc2NyaXB0b3JbXTsKLQotCi0jaWZkZWYgV0hJUkxQT09MCi1leHRlcm4gdm9pZCB3aGlybHBvb2xfaW5pdChoYXNoX3N0YXRlICogbWQpOwotZXh0ZXJuIGludCB3aGlybHBvb2xfcHJvY2VzcyhoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pOwotZXh0ZXJuIGludCB3aGlybHBvb2xfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpOwotZXh0ZXJuIGludCAgd2hpcmxwb29sX3Rlc3Qodm9pZCk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3Igd2hpcmxwb29sX2Rlc2M7Ci0jZW5kaWYKLQotI2lmZGVmIFNIQTUxMgotZXh0ZXJuIHZvaWQgc2hhNTEyX2luaXQoaGFzaF9zdGF0ZSAqIG1kKTsKLWV4dGVybiBpbnQgc2hhNTEyX3Byb2Nlc3MoaGFzaF9zdGF0ZSAqIG1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKTsKLWV4dGVybiBpbnQgc2hhNTEyX2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKTsKLWV4dGVybiBpbnQgIHNoYTUxMl90ZXN0KHZvaWQpOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfaGFzaF9kZXNjcmlwdG9yIHNoYTUxMl9kZXNjOwotI2VuZGlmCi0KLSNpZmRlZiBTSEEzODQKLSNpZm5kZWYgU0hBNTEyCi0gICAjZXJyb3IgU0hBNTEyIGlzIHJlcXVpcmVkIGZvciBTSEEzODQKLSNlbmRpZgotZXh0ZXJuIHZvaWQgc2hhMzg0X2luaXQoaGFzaF9zdGF0ZSAqIG1kKTsKLSNkZWZpbmUgc2hhMzg0X3Byb2Nlc3Mgc2hhNTEyX3Byb2Nlc3MKLWV4dGVybiBpbnQgc2hhMzg0X2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKTsKLWV4dGVybiBpbnQgIHNoYTM4NF90ZXN0KHZvaWQpOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfaGFzaF9kZXNjcmlwdG9yIHNoYTM4NF9kZXNjOwotI2VuZGlmCi0KLSNpZmRlZiBTSEEyNTYKLWV4dGVybiB2b2lkIHNoYTI1Nl9pbml0KGhhc2hfc3RhdGUgKiBtZCk7Ci1leHRlcm4gaW50IHNoYTI1Nl9wcm9jZXNzKGhhc2hfc3RhdGUgKiBtZCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbik7Ci1leHRlcm4gaW50IHNoYTI1Nl9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqaGFzaCk7Ci1leHRlcm4gaW50ICBzaGEyNTZfdGVzdCh2b2lkKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvciBzaGEyNTZfZGVzYzsKLQotI2lmZGVmIFNIQTIyNAotI2lmbmRlZiBTSEEyNTYKLSAgICNlcnJvciBTSEEyNTYgaXMgcmVxdWlyZWQgZm9yIFNIQTIyNAotI2VuZGlmCi1leHRlcm4gdm9pZCBzaGEyMjRfaW5pdChoYXNoX3N0YXRlICogbWQpOwotI2RlZmluZSBzaGEyMjRfcHJvY2VzcyBzaGEyNTZfcHJvY2VzcwotZXh0ZXJuIGludCBzaGEyMjRfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpOwotZXh0ZXJuIGludCAgc2hhMjI0X3Rlc3Qodm9pZCk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3Igc2hhMjI0X2Rlc2M7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgU0hBMQotZXh0ZXJuIHZvaWQgc2hhMV9pbml0KGhhc2hfc3RhdGUgKiBtZCk7Ci1leHRlcm4gaW50IHNoYTFfcHJvY2VzcyhoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pOwotZXh0ZXJuIGludCBzaGExX2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKTsKLWV4dGVybiBpbnQgIHNoYTFfdGVzdCh2b2lkKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvciBzaGExX2Rlc2M7Ci0jZW5kaWYKLQotI2lmZGVmIE1ENQotZXh0ZXJuIHZvaWQgbWQ1X2luaXQoaGFzaF9zdGF0ZSAqIG1kKTsKLWV4dGVybiBpbnQgbWQ1X3Byb2Nlc3MoaGFzaF9zdGF0ZSAqIG1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKTsKLWV4dGVybiBpbnQgbWQ1X2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKTsKLWV4dGVybiBpbnQgIG1kNV90ZXN0KHZvaWQpOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfaGFzaF9kZXNjcmlwdG9yIG1kNV9kZXNjOwotI2VuZGlmCi0KLSNpZmRlZiBNRDQKLWV4dGVybiB2b2lkIG1kNF9pbml0KGhhc2hfc3RhdGUgKiBtZCk7Ci1leHRlcm4gaW50IG1kNF9wcm9jZXNzKGhhc2hfc3RhdGUgKiBtZCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbik7Ci1leHRlcm4gaW50IG1kNF9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqaGFzaCk7Ci1leHRlcm4gaW50ICBtZDRfdGVzdCh2b2lkKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvciBtZDRfZGVzYzsKLSNlbmRpZgotCi0jaWZkZWYgTUQyCi1leHRlcm4gdm9pZCBtZDJfaW5pdChoYXNoX3N0YXRlICogbWQpOwotZXh0ZXJuIGludCBtZDJfcHJvY2VzcyhoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pOwotZXh0ZXJuIGludCBtZDJfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpOwotZXh0ZXJuIGludCAgbWQyX3Rlc3Qodm9pZCk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3IgbWQyX2Rlc2M7Ci0jZW5kaWYKLQotI2lmZGVmIFRJR0VSCi1leHRlcm4gdm9pZCB0aWdlcl9pbml0KGhhc2hfc3RhdGUgKiBtZCk7Ci1leHRlcm4gaW50IHRpZ2VyX3Byb2Nlc3MoaGFzaF9zdGF0ZSAqIG1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKTsKLWV4dGVybiBpbnQgdGlnZXJfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpOwotZXh0ZXJuIGludCAgdGlnZXJfdGVzdCh2b2lkKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvciB0aWdlcl9kZXNjOwotI2VuZGlmCi0KLSNpZmRlZiBSSVBFTUQxMjgKLWV4dGVybiB2b2lkIHJtZDEyOF9pbml0KGhhc2hfc3RhdGUgKiBtZCk7Ci1leHRlcm4gaW50IHJtZDEyOF9wcm9jZXNzKGhhc2hfc3RhdGUgKiBtZCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbik7Ci1leHRlcm4gaW50IHJtZDEyOF9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqaGFzaCk7Ci1leHRlcm4gaW50ICBybWQxMjhfdGVzdCh2b2lkKTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvciBybWQxMjhfZGVzYzsKLSNlbmRpZgotCi0jaWZkZWYgUklQRU1EMTYwCi1leHRlcm4gdm9pZCBybWQxNjBfaW5pdChoYXNoX3N0YXRlICogbWQpOwotZXh0ZXJuIGludCBybWQxNjBfcHJvY2VzcyhoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pOwotZXh0ZXJuIGludCBybWQxNjBfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpOwotZXh0ZXJuIGludCAgcm1kMTYwX3Rlc3Qodm9pZCk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3Igcm1kMTYwX2Rlc2M7Ci0jZW5kaWYKLQotCi1leHRlcm4gaW50IGZpbmRfaGFzaChjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiBpbnQgZmluZF9oYXNoX2lkKHVuc2lnbmVkIGNoYXIgSUQpOwotZXh0ZXJuIGludCBmaW5kX2hhc2hfYW55KGNvbnN0IGNoYXIgKm5hbWUsIGludCBkaWdlc3RsZW4pOwotZXh0ZXJuIGludCByZWdpc3Rlcl9oYXNoKGNvbnN0IHN0cnVjdCBfaGFzaF9kZXNjcmlwdG9yICpoYXNoKTsKLWV4dGVybiBpbnQgdW5yZWdpc3Rlcl9oYXNoKGNvbnN0IHN0cnVjdCBfaGFzaF9kZXNjcmlwdG9yICpoYXNoKTsKLWV4dGVybiBpbnQgaGFzaF9pc192YWxpZChpbnQgaWR4KTsKLQotZXh0ZXJuIGludCBoYXNoX21lbW9yeShpbnQgaGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKLWV4dGVybiBpbnQgaGFzaF9maWxlaGFuZGxlKGludCBoYXNoLCBGSUxFICppbiwgdW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwotZXh0ZXJuIGludCBoYXNoX2ZpbGUoaW50IGhhc2gsIGNvbnN0IGNoYXIgKmZuYW1lLCB1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7Ci0KLS8qIGEgc2ltcGxlIG1hY3JvIGZvciBtYWtpbmcgaGFzaCAicHJvY2VzcyIgZnVuY3Rpb25zICovCi0jZGVmaW5lIEhBU0hfUFJPQ0VTUyhmdW5jX25hbWUsIGNvbXByZXNzX25hbWUsIHN0YXRlX3ZhciwgYmxvY2tfc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgIFwKLWludCBmdW5jX25hbWUgKGhhc2hfc3RhdGUgKiBtZCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbikgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1bnNpZ25lZCBsb25nIG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9BUkdDSEsobWQgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX0FSR0NISyhidWYgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAobWQtPiBzdGF0ZV92YXIgLmN1cmxlbiA+IHNpemVvZihtZC0+IHN0YXRlX3ZhciAuYnVmKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB3aGlsZSAobGVuID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAobWQtPiBzdGF0ZV92YXIgLmN1cmxlbiA9PSAwICYmIGxlbiA+PSBibG9ja19zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGNvbXByZXNzX25hbWUgKG1kLCAodW5zaWduZWQgY2hhciAqKWJ1Zik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgbWQtPiBzdGF0ZV92YXIgLmxlbmd0aCArPSBibG9ja19zaXplICogODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBidWYgICAgICAgICAgICAgKz0gYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGxlbiAgICAgICAgICAgICAtPSBibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBuID0gTUlOKGxlbiwgKGJsb2NrX3NpemUgLSBtZC0+IHN0YXRlX3ZhciAuY3VybGVuKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIG1lbWNweShtZC0+IHN0YXRlX3ZhciAuYnVmICsgbWQtPiBzdGF0ZV92YXIuY3VybGVuLCBidWYsIChzaXplX3Qpbik7ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgbWQtPiBzdGF0ZV92YXIgLmN1cmxlbiArPSBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBidWYgICAgICAgICAgICAgKz0gbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGxlbiAgICAgICAgICAgICAtPSBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgaWYgKG1kLT4gc3RhdGVfdmFyIC5jdXJsZW4gPT0gYmxvY2tfc2l6ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBjb21wcmVzc19uYW1lIChtZCwgbWQtPiBzdGF0ZV92YXIgLmJ1Zik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIG1kLT4gc3RhdGVfdmFyIC5sZW5ndGggKz0gOCpibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgbWQtPiBzdGF0ZV92YXIgLmN1cmxlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBDUllQVF9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNpZmRlZiBITUFDCi10eXBlZGVmIHN0cnVjdCBIbWFjX3N0YXRlIHsKLSAgICAgaGFzaF9zdGF0ZSAgICAgbWQ7Ci0gICAgIGludCAgICAgICAgICAgIGhhc2g7Ci0gICAgIGhhc2hfc3RhdGUgICAgIGhhc2hzdGF0ZTsKLSAgICAgdW5zaWduZWQgY2hhciAga2V5W01BWEJMT0NLU0laRV07Ci19IGhtYWNfc3RhdGU7Ci0KLWV4dGVybiBpbnQgaG1hY19pbml0KGhtYWNfc3RhdGUgKmhtYWMsIGludCBoYXNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuKTsKLWV4dGVybiBpbnQgaG1hY19wcm9jZXNzKGhtYWNfc3RhdGUgKmhtYWMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pOwotZXh0ZXJuIGludCBobWFjX2RvbmUoaG1hY19zdGF0ZSAqaG1hYywgdW5zaWduZWQgY2hhciAqaGFzaE91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKLWV4dGVybiBpbnQgaG1hY190ZXN0KHZvaWQpOwotZXh0ZXJuIGludCBobWFjX21lbW9yeShpbnQgaGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgbG9uZyBsZW4sIAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGxvbmcgKmRzdGxlbik7Ci1leHRlcm4gaW50IGhtYWNfZmlsZShpbnQgaGFzaCwgY29uc3QgY2hhciAqZm5hbWUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcga2V5bGVuLCAKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgbG9uZyAqZHN0bGVuKTsKLSNlbmRpZgotCi0jaWZkZWYgT01BQwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBpbnQgICAgICAgICAgICAgY2lwaGVyX2lkeCwgCi0gICAgICAgICAgICAgICAgICAgYnVmbGVuLAotICAgICAgICAgICAgICAgICAgIGJsa2xlbjsKLSAgIHVuc2lnbmVkIGNoYXIgICBibG9ja1tNQVhCTE9DS1NJWkVdLAotICAgICAgICAgICAgICAgICAgIHByZXZbTUFYQkxPQ0tTSVpFXSwKLSAgICAgICAgICAgICAgICAgICBMdVsyXVtNQVhCTE9DS1NJWkVdOwotICAgc3ltbWV0cmljX2tleSAgIGtleTsKLX0gb21hY19zdGF0ZTsKLQotZXh0ZXJuIGludCBvbWFjX2luaXQob21hY19zdGF0ZSAqb21hYywgaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbik7Ci1leHRlcm4gaW50IG9tYWNfcHJvY2VzcyhvbWFjX3N0YXRlICpzdGF0ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbik7Ci1leHRlcm4gaW50IG9tYWNfZG9uZShvbWFjX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwotZXh0ZXJuIGludCBvbWFjX21lbW9yeShpbnQgY2lwaGVyLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAotICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZywgdW5zaWduZWQgbG9uZyBtc2dsZW4sCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwotZXh0ZXJuIGludCBvbWFjX2ZpbGUoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKLWV4dGVybiBpbnQgb21hY190ZXN0KHZvaWQpOwotI2VuZGlmIC8qIE9NQUMgKi8KLQotI2lmZGVmIFBNQUMKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgdW5zaWduZWQgY2hhciAgICAgTHNbMzJdW01BWEJMT0NLU0laRV0sICAgIC8qIEwgc2hpZnRlZCBieSBpIGJpdHMgdG8gdGhlIGxlZnQgKi8KLSAgICAgICAgICAgICAgICAgICAgIExpW01BWEJMT0NLU0laRV0sICAgICAgICAvKiB2YWx1ZSBvZiBMaSBbY3VycmVudCB2YWx1ZSwgd2UgY2FsYyBmcm9tIHByZXZpb3VzIHJlY2FsbF0gKi8KLSAgICAgICAgICAgICAgICAgICAgIExyW01BWEJMT0NLU0laRV0sICAgICAgICAvKiBMICogeF4tMSAqLwotICAgICAgICAgICAgICAgICAgICAgYmxvY2tbTUFYQkxPQ0tTSVpFXSwgICAgIC8qIGN1cnJlbnRseSBhY2N1bXVsYXRlZCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1bTUFYQkxPQ0tTSVpFXTsgIC8qIGN1cnJlbnQgY2hlY2tzdW0gKi8KLQotICAgc3ltbWV0cmljX2tleSAgICAga2V5OyAgICAgICAgICAgICAgICAgICAgIC8qIHNjaGVkdWxlZCBrZXkgZm9yIGNpcGhlciAqLwotICAgdW5zaWduZWQgbG9uZyAgICAgYmxvY2tfaW5kZXg7ICAgICAgICAgICAgIC8qIGluZGV4ICMgZm9yIGN1cnJlbnQgYmxvY2sgKi8KLSAgIGludCAgICAgICAgICAgICAgIGNpcGhlcl9pZHgsICAgICAgICAgICAgICAvKiBjaXBoZXIgaWR4ICovCi0gICAgICAgICAgICAgICAgICAgICBibG9ja19sZW4sICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgICBidWZsZW47ICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgKi8KLX0gcG1hY19zdGF0ZTsKLQotZXh0ZXJuIGludCBwbWFjX2luaXQocG1hY19zdGF0ZSAqcG1hYywgaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbik7Ci1leHRlcm4gaW50IHBtYWNfcHJvY2VzcyhwbWFjX3N0YXRlICpzdGF0ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbik7Ci1leHRlcm4gaW50IHBtYWNfZG9uZShwbWFjX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwotCi1leHRlcm4gaW50IHBtYWNfbWVtb3J5KGludCBjaXBoZXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sCi0gICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbXNnLCB1bnNpZ25lZCBsb25nIG1zZ2xlbiwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7Ci0KLWV4dGVybiBpbnQgcG1hY19maWxlKGludCBjaXBoZXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7Ci0KLWV4dGVybiBpbnQgcG1hY190ZXN0KHZvaWQpOwotCi0vKiBpbnRlcm5hbCBmdW5jdGlvbnMgKi8KLWV4dGVybiBpbnQgcG1hY19udHoodW5zaWduZWQgbG9uZyB4KTsKLWV4dGVybiB2b2lkIHBtYWNfc2hpZnRfeG9yKHBtYWNfc3RhdGUgKnBtYWMpOwotCi0jZW5kaWYgLyogUE1BQyAqLwotCi0jaWZkZWYgRUFYX01PREUKLQotI2lmICEoZGVmaW5lZChPTUFDKSAmJiBkZWZpbmVkKENUUikpCi0gICAjZXJyb3IgRUFYX01PREUgcmVxdWlyZXMgT01BQyBhbmQgQ1RSCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgdW5zaWduZWQgY2hhciBOW01BWEJMT0NLU0laRV07Ci0gICBzeW1tZXRyaWNfQ1RSIGN0cjsKLSAgIG9tYWNfc3RhdGUgICAgaGVhZGVyb21hYywgY3RvbWFjOwotfSBlYXhfc3RhdGU7Ci0KLWV4dGVybiBpbnQgZWF4X2luaXQoZWF4X3N0YXRlICplYXgsIGludCBjaXBoZXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5vbmNlLCB1bnNpZ25lZCBsb25nIG5vbmNlbGVuLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoZWFkZXIsIHVuc2lnbmVkIGxvbmcgaGVhZGVybGVuKTsKLQotZXh0ZXJuIGludCBlYXhfZW5jcnlwdChlYXhfc3RhdGUgKmVheCwgY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBsb25nIGxlbmd0aCk7Ci1leHRlcm4gaW50IGVheF9kZWNyeXB0KGVheF9zdGF0ZSAqZWF4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKLWV4dGVybiBpbnQgZWF4X2FkZGhlYWRlcihlYXhfc3RhdGUgKmVheCwgY29uc3QgdW5zaWduZWQgY2hhciAqaGVhZGVyLCB1bnNpZ25lZCBsb25nIGxlbmd0aCk7Ci1leHRlcm4gaW50IGVheF9kb25lKGVheF9zdGF0ZSAqZWF4LCB1bnNpZ25lZCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbik7Ci0KLWV4dGVybiBpbnQgZWF4X2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeShpbnQgY2lwaGVyLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqbm9uY2UsICB1bnNpZ25lZCBsb25nIG5vbmNlbGVuLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBoZWFkZXJsZW4sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHQsICAgICB1bnNpZ25lZCBsb25nIHB0bGVuLAotICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LAotICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhZywgICAgdW5zaWduZWQgbG9uZyAqdGFnbGVuKTsKLQotZXh0ZXJuIGludCBlYXhfZGVjcnlwdF92ZXJpZnlfbWVtb3J5KGludCBjaXBoZXIsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIHVuc2lnbmVkIGxvbmcgbm9uY2VsZW4sCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGVhZGVyLCB1bnNpZ25lZCBsb25nIGhlYWRlcmxlbiwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgICAgIHVuc2lnbmVkIGxvbmcgY3RsZW4sCi0gICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsCi0gICAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnLCAgICB1bnNpZ25lZCBsb25nIHRhZ2xlbiwKLSAgICAgICAgICBpbnQgICAgICAgICAgICpyZXMpOwotCi1leHRlcm4gaW50IGVheF90ZXN0KHZvaWQpOwotI2VuZGlmIC8qIEVBWCBNT0RFICovCi0KLSNpZmRlZiBPQ0JfTU9ERQotdHlwZWRlZiBzdHJ1Y3QgewotICAgdW5zaWduZWQgY2hhciAgICAgTFtNQVhCTE9DS1NJWkVdLCAgICAgICAgIC8qIEwgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgIExzWzMyXVtNQVhCTE9DS1NJWkVdLCAgICAvKiBMIHNoaWZ0ZWQgYnkgaSBiaXRzIHRvIHRoZSBsZWZ0ICovCi0gICAgICAgICAgICAgICAgICAgICBMaVtNQVhCTE9DS1NJWkVdLCAgICAgICAgLyogdmFsdWUgb2YgTGkgW2N1cnJlbnQgdmFsdWUsIHdlIGNhbGMgZnJvbSBwcmV2aW91cyByZWNhbGxdICovCi0gICAgICAgICAgICAgICAgICAgICBMcltNQVhCTE9DS1NJWkVdLCAgICAgICAgLyogTCAqIHheLTEgKi8KLSAgICAgICAgICAgICAgICAgICAgIFJbTUFYQkxPQ0tTSVpFXSwgICAgICAgICAvKiBSIHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICBjaGVja3N1bVtNQVhCTE9DS1NJWkVdOyAgLyogY3VycmVudCBjaGVja3N1bSAqLwotCi0gICBzeW1tZXRyaWNfa2V5ICAgICBrZXk7ICAgICAgICAgICAgICAgICAgICAgLyogc2NoZWR1bGVkIGtleSBmb3IgY2lwaGVyICovCi0gICB1bnNpZ25lZCBsb25nICAgICBibG9ja19pbmRleDsgICAgICAgICAgICAgLyogaW5kZXggIyBmb3IgY3VycmVudCBibG9jayAqLwotICAgaW50ICAgICAgICAgICAgICAgY2lwaGVyLCAgICAgICAgICAgICAgICAgIC8qIGNpcGhlciBpZHggKi8KLSAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2xlbjsgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgYmxvY2sgKi8KLX0gb2NiX3N0YXRlOwotCi1leHRlcm4gaW50IG9jYl9pbml0KG9jYl9zdGF0ZSAqb2NiLCBpbnQgY2lwaGVyLCAKLSAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSk7Ci0KLWV4dGVybiBpbnQgb2NiX2VuY3J5cHQob2NiX3N0YXRlICpvY2IsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCk7Ci1leHRlcm4gaW50IG9jYl9kZWNyeXB0KG9jYl9zdGF0ZSAqb2NiLCBjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQpOwotCi1leHRlcm4gaW50IG9jYl9kb25lX2VuY3J5cHQob2NiX3N0YXRlICpvY2IsIAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHQsICB1bnNpZ25lZCBsb25nIHB0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nICp0YWdsZW4pOwotCi1leHRlcm4gaW50IG9jYl9kb25lX2RlY3J5cHQob2NiX3N0YXRlICpvY2IsIAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY3QsICB1bnNpZ25lZCBsb25nIGN0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsIAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nIHRhZ2xlbiwgaW50ICpyZXMpOwotCi1leHRlcm4gaW50IG9jYl9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkoaW50IGNpcGhlciwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksICAgIHVuc2lnbmVkIGxvbmcga2V5bGVuLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5vbmNlLCAgCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHQsICAgICB1bnNpZ25lZCBsb25nIHB0bGVuLAotICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LAotICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhZywgICAgdW5zaWduZWQgbG9uZyAqdGFnbGVuKTsKLQotZXh0ZXJuIGludCBvY2JfZGVjcnlwdF92ZXJpZnlfbWVtb3J5KGludCBjaXBoZXIsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCAgICAgdW5zaWduZWQgbG9uZyBjdGxlbiwKLSAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWcsICAgIHVuc2lnbmVkIGxvbmcgdGFnbGVuLAotICAgICAgICAgIGludCAgICAgICAgICAgKnJlcyk7Ci0KLWV4dGVybiBpbnQgb2NiX3Rlc3Qodm9pZCk7Ci0KLS8qIGludGVybmFsIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgb2NiX3NoaWZ0X3hvcihvY2Jfc3RhdGUgKm9jYiwgdW5zaWduZWQgY2hhciAqWik7Ci1leHRlcm4gaW50IG9jYl9udHoodW5zaWduZWQgbG9uZyB4KTsKLWV4dGVybiBpbnQgX19vY2JfZG9uZShvY2Jfc3RhdGUgKm9jYiwgY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgcHRsZW4sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nICp0YWdsZW4sIGludCBtb2RlKTsKLQotI2VuZGlmIC8qIE9DQl9NT0RFICovCi0KLQpkaWZmIC0tZ2l0IGEvbXljcnlwdF9rci5oIGIvbXljcnlwdF9rci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGMxNmNkLi4wMDAwMDAwCi0tLSBhL215Y3J5cHRfa3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLSNpZmRlZiBLUgotCi0jaWYgIWRlZmluZWQoTVJTQSkgfHwgIWRlZmluZWQoTURIKSB8fCAhZGVmaW5lZChNRUNDKQotICAgICNlcnJvciAiS2V5cmluZyBjb2RlIHJlcXVpcmVzIGFsbCB0aHJlZSBwdWJsaWMga2V5IGFsZ29yaXRobXMuIgotI2VuZGlmCi0KLSNkZWZpbmUgTUFYTEVOICAgIDI1NgotCi1lbnVtIHsKLSAgIE5PTl9LRVk9MCwKLSAgIFJTQV9LRVksCi0gICBESF9LRVksCi0gICBFQ0NfS0VZCi19OwotCi10eXBlZGVmIHVuaW9uIHsKLSAgICByc2Ffa2V5IHJzYTsKLSAgICBkaF9rZXkgIGRoOwotICAgIGVjY19rZXkgZWNjOwotfSBfcGtfa2V5OwotCi10eXBlZGVmIHN0cnVjdCBQa19rZXkgewotICAgIGludCAgICAga2V5X3R5cGUsICAgICAgICAgICAgIC8qIFBVQkxJQywgUFJJVkFURSwgUFJJVkFURV9PUFRJTUlaRUQgKi8KLSAgICAgICAgICAgIHN5c3RlbTsgICAgICAgICAgICAgICAvKiBSU0EsIEVDQyBvciBESCA/ICAgKi8KLQotICAgIHVuc2lnbmVkIGNoYXIgCi0gICAgICAgICAgICBuYW1lW01BWExFTl0sICAgICAgICAgLyogdmFyaW91cyBpbmZvJ3MgYWJvdXQgdGhpcyBrZXkgKi8KLSAgICAgICAgICAgIGVtYWlsW01BWExFTl0sCi0gICAgICAgICAgICBkZXNjcmlwdGlvbltNQVhMRU5dOwotCi0gICAgdW5zaWduZWQgbG9uZyBJRDsgICAgICAgICAgICAgLyogQ1JDMzIgb2YgdGhlIG5hbWUvZW1haWwvZGVzY3JpcHRpb24gdG9nZXRoZXIgKi8KLQotICAgIF9wa19rZXkga2V5OwotCi0gICAgc3RydWN0IFBrX2tleSAgKm5leHQ7ICAgICAgICAgLyogbGlua2VkIGxpc3QgY2hhaW4gKi8KLX0gcGtfa2V5OwotCi1leHRlcm4gaW50IGtyX2luaXQocGtfa2V5ICoqcGspOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBrcl9jcmMoY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZW1haWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlc2NyaXB0aW9uKTsKLQotZXh0ZXJuIHBrX2tleSAqa3JfZmluZChwa19rZXkgKnBrLCB1bnNpZ25lZCBsb25nIElEKTsKLWV4dGVybiBwa19rZXkgKmtyX2ZpbmRfbmFtZShwa19rZXkgKnBrLCBjb25zdCBjaGFyICpuYW1lKTsKLQotZXh0ZXJuIGludCBrcl9hZGQocGtfa2V5ICpwaywgaW50IGtleV90eXBlLCBpbnQgc3lzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCAKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVtYWlsLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkZXNjcmlwdGlvbiwgY29uc3QgX3BrX2tleSAqa2V5KTsKLSAgICAgICAgICAgICAgICAgIAotZXh0ZXJuIGludCBrcl9kZWwocGtfa2V5ICoqX3BrLCB1bnNpZ25lZCBsb25nIElEKTsKLWV4dGVybiBpbnQga3JfY2xlYXIocGtfa2V5ICoqcGspOwotZXh0ZXJuIGludCBrcl9tYWtlX2tleShwa19rZXkgKnBrLCBwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3lzLCBpbnQga2V5c2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZW1haWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlc2NyaXB0aW9uKTsKLQotZXh0ZXJuIGludCBrcl9leHBvcnQocGtfa2V5ICpwaywgdW5zaWduZWQgbG9uZyBJRCwgaW50IGtleV90eXBlLCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7Ci1leHRlcm4gaW50IGtyX2ltcG9ydChwa19rZXkgKnBrLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7Ci0KLWV4dGVybiBpbnQga3JfbG9hZChwa19rZXkgKipwaywgRklMRSAqaW4sIHN5bW1ldHJpY19DVFIgKmN0cik7Ci1leHRlcm4gaW50IGtyX3NhdmUocGtfa2V5ICpwaywgRklMRSAqb3V0LCBzeW1tZXRyaWNfQ1RSICpjdHIpOwotCi1leHRlcm4gaW50IGtyX2VuY3J5cHRfa2V5KHBrX2tleSAqcGssIHVuc2lnbmVkIGxvbmcgSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgaW50IGhhc2gpOwotCi1leHRlcm4gaW50IGtyX2RlY3J5cHRfa2V5KHBrX2tleSAqcGssIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7Ci0KLWV4dGVybiBpbnQga3Jfc2lnbl9oYXNoKHBrX2tleSAqcGssIHVuc2lnbmVkIGxvbmcgSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZyk7Ci0KLWV4dGVybiBpbnQga3JfdmVyaWZ5X2hhc2gocGtfa2V5ICpwaywgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoLCB1bnNpZ25lZCBsb25nIGhhc2hsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3RhdCk7Ci0KLWV4dGVybiBpbnQga3JfZmluZ2VycHJpbnQocGtfa2V5ICpwaywgdW5zaWduZWQgbG9uZyBJRCwgaW50IGhhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL215Y3J5cHRfbWlzYy5oIGIvbXljcnlwdF9taXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MjRjOWQuLjAwMDAwMDAKLS0tIGEvbXljcnlwdF9taXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiAtLS0tIEJBU0U2NCBSb3V0aW5lcyAtLS0tICovCi0jaWZkZWYgQkFTRTY0Ci1leHRlcm4gaW50IGJhc2U2NF9lbmNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwotCi1leHRlcm4gaW50IGJhc2U2NF9kZWNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwotI2VuZGlmCi0KLS8qIC0tLS0gTUVNIHJvdXRpbmVzIC0tLS0gKi8KLWV4dGVybiB2b2lkIHplcm9tZW0odm9pZCAqZHN0LCBzaXplX3QgbGVuKTsKLWV4dGVybiB2b2lkIGJ1cm5fc3RhY2sodW5zaWduZWQgbG9uZyBsZW4pOwotCi1leHRlcm4gY29uc3QgY2hhciAqZXJyb3JfdG9fc3RyaW5nKGludCBlcnIpOwotZXh0ZXJuIGludCBtcGlfdG9fbHRjX2Vycm9yKGludCBlcnIpOwotCi0jaWYgMAotLyogVGFrZXMgdXAgc3BhY2Ugd2UgZG9uXCd0IG5lZWQgZm9yIERyb3BiZWFyICovCi1leHRlcm4gY29uc3QgY2hhciAqY3J5cHRfYnVpbGRfc2V0dGluZ3M7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL215Y3J5cHRfcGsuaCBiL215Y3J5cHRfcGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ZTVlYy4uMDAwMDAwMAotLS0gYS9teWNyeXB0X3BrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyogLS0tLSBOVU1CRVIgVEhFT1JZIC0tLS0gKi8KLSNpZmRlZiBNUEkKLQotI2luY2x1ZGUgImx0Y190b21tYXRoLmgiCi0KLS8qIGluL291dCBtYWNyb3MgKi8KLSNkZWZpbmUgT1VUUFVUX0JJR05VTShudW0sIG91dCwgeSwgeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoKHkgKyA0KSA+ICpvdXRsZW4pIHsgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHogPSAodW5zaWduZWQgbG9uZyltcF91bnNpZ25lZF9iaW5fc2l6ZShudW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgU1RPUkUzMkwoeiwgb3V0K3kpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB5ICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmICgoeSArIHopID4gKm91dGxlbikgeyByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKChlcnIgPSBtcF90b191bnNpZ25lZF9iaW4obnVtLCBvdXQreSkpICE9IE1QX09LQVkpIHsgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsgfSAgICBcCi0gICAgICB5ICs9IHo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotCi0jZGVmaW5lIElOUFVUX0JJR05VTShudW0sIGluLCB4LCB5LCBpbmxlbikgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAvKiBsb2FkIHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGlmICgoeSArIDQpID4gaW5sZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZXJyID0gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBnb3RvIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgTE9BRDMyTCh4LCBpbit5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB5ICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgLyogc2FuaXR5IGNoZWNrLi4uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBpZiAoKHgreSkgPiBpbmxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVyciA9IENSWVBUX0lOVkFMSURfUEFDS0VUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgLyogbG9hZCBpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICBpZiAoKGVyciA9IG1wX3JlYWRfdW5zaWduZWRfYmluKG51bSwgKHVuc2lnbmVkIGNoYXIgKilpbit5LCAoaW50KXgpKSAhPSBNUF9PS0FZKSB7XAotICAgICAgICBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGdvdG8gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB5ICs9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIGlmICgoZXJyID0gbXBfc2hyaW5rKG51bSkpICE9IE1QX09LQVkpIHsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBnb3RvIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotZXh0ZXJuIGludCBpc19wcmltZShtcF9pbnQgKiwgaW50ICopOwotZXh0ZXJuIGludCByYW5kX3ByaW1lKG1wX2ludCAqTiwgbG9uZyBsZW4sIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZyk7Ci0KLSNlbHNlCi0gICAjaWZkZWYgTVJTQQotICAgICAgI2Vycm9yIFJTQSByZXF1aXJlcyB0aGUgYmlnIGludCBsaWJyYXJ5IAotICAgI2VuZGlmCi0gICAjaWZkZWYgTUVDQwotICAgICAgI2Vycm9yIEVDQyByZXF1aXJlcyB0aGUgYmlnIGludCBsaWJyYXJ5IAotICAgI2VuZGlmCi0gICAjaWZkZWYgTURICi0gICAgICAjZXJyb3IgREggcmVxdWlyZXMgdGhlIGJpZyBpbnQgbGlicmFyeSAKLSAgICNlbmRpZgotICAgI2lmZGVmIE1EU0EKLSAgICAgICNlcnJvciBEU0EgcmVxdWlyZXMgdGhlIGJpZyBpbnQgbGlicmFyeSAKLSAgICNlbmRpZgotI2VuZGlmIC8qIE1QSSAqLwotCi0KLS8qIC0tLS0gUFVCTElDIEtFWSBDUllQVE8gLS0tLSAqLwotCi0jZGVmaW5lIFBLX1BSSVZBVEUgICAgICAgICAgICAwICAgICAgICAvKiBQSyBwcml2YXRlIGtleXMgKi8KLSNkZWZpbmUgUEtfUFVCTElDICAgICAgICAgICAgIDEgICAgICAgIC8qIFBLIHB1YmxpYyBrZXlzICovCi0jZGVmaW5lIFBLX1BSSVZBVEVfT1BUSU1JWkVEICAyICAgICAgICAvKiBQSyBwcml2YXRlIGtleSBbcnNhIG9wdGltaXplZF0gKi8KLQotLyogLS0tLSBQQUNLRVQgLS0tLSAqLwotI2lmZGVmIFBBQ0tFVAotCi1leHRlcm4gdm9pZCBwYWNrZXRfc3RvcmVfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHNlY3Rpb24sIGludCBzdWJzZWN0aW9uKTsKLWV4dGVybiBpbnQgcGFja2V0X3ZhbGlkX2hlYWRlcih1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzZWN0aW9uLCBpbnQgc3Vic2VjdGlvbik7Ci0KLSNlbmRpZgotCi0KLS8qIC0tLS0gUlNBIC0tLS0gKi8KLSNpZmRlZiBNUlNBCi0KLS8qIE1pbiBhbmQgTWF4IFJTQSBrZXkgc2l6ZXMgKGluIGJpdHMpICovCi0jZGVmaW5lIE1JTl9SU0FfU0laRSAxMDI0Ci0jZGVmaW5lIE1BWF9SU0FfU0laRSA0MDk2Ci0KLS8qIFN0YWNrIHJlcXVpcmVkIGZvciB0ZW1wcyAocGx1cyBwYWRkaW5nKSAqLwotLy8gI2RlZmluZSBSU0FfU1RBQ0sgICAgKDggKyAoTUFYX1JTQV9TSVpFLzgpKQotCi10eXBlZGVmIHN0cnVjdCBSc2Ffa2V5IHsKLSAgICBpbnQgdHlwZTsKLSAgICBtcF9pbnQgZSwgZCwgTiwgcVAsIHBRLCBkUCwgZFEsIHAsIHE7Ci19IHJzYV9rZXk7Ci0KLWV4dGVybiBpbnQgcnNhX21ha2Vfa2V5KHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgaW50IHNpemUsIGxvbmcgZSwgcnNhX2tleSAqa2V5KTsKLQotZXh0ZXJuIGludCByc2FfZXhwdG1vZChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgaW50IHdoaWNoLAotICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgICAgKnBybmcsIGludCAgICAgICAgICAgcHJuZ19pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgcnNhX2tleSAqa2V5KTsKLQotI2lmZGVmIFJTQV9USU1JTkcKLQotZXh0ZXJuIGludCB0aW1fZXhwdG1vZChwcm5nX3N0YXRlICpwcm5nLCBpbnQgcHJuZ19pZHgsIAotICAgICAgICAgICAgICAgICAgICAgICBtcF9pbnQgKmMsIG1wX2ludCAqZSwgbXBfaW50ICpkLCBtcF9pbnQgKm4sIG1wX2ludCAqbSk7Ci0KLSNlbHNlCi0KLSNkZWZpbmUgdGltX2V4cHRtb2QocHJuZywgcHJuZ19pZHgsIGMsIGUsIGQsIG4sIG0pIG1waV90b19sdGNfZXJyb3IobXBfZXhwdG1vZChjLCBkLCBuLCBtKSkKLQotI2VuZGlmCi0KLWV4dGVybiB2b2lkIHJzYV9mcmVlKHJzYV9rZXkgKmtleSk7Ci0KLWludCByc2FfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW5rZXksICB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRrZXksIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbHBhcmFtLCB1bnNpZ25lZCBsb25nIGxwYXJhbWxlbiwKLSAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAqcHJuZywgaW50IHBybmdfaWR4LCBpbnQgaGFzaF9pZHgsIHJzYV9rZXkgKmtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbnQgcnNhX2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgICAgdW5zaWduZWQgbG9uZyBpbmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0a2V5LCB1bnNpZ25lZCBsb25nICprZXlsZW4sIAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpscGFyYW0sIHVuc2lnbmVkIGxvbmcgbHBhcmFtbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICAgICpwcm5nLCAgIGludCAgICAgICAgICAgcHJuZ19pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhhc2hfaWR4LCBpbnQgKnJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnNhX2tleSAgICAgICAqa2V5KTsKLQotaW50IHJzYV9zaWduX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqbXNnaGFzaCwgIHVuc2lnbmVkIGxvbmcgIG1zZ2hhc2hsZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc2lnLCAgICAgIHVuc2lnbmVkIGxvbmcgKnNpZ2xlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICAgICpwcm5nLCAgICAgaW50ICAgICAgICAgICAgcHJuZ19pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBoYXNoX2lkeCwgdW5zaWduZWQgbG9uZyAgc2FsdGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJzYV9rZXkgKmtleSk7Ci0KLWludCByc2FfdmVyaWZ5X2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLCAgICAgIHVuc2lnbmVkIGxvbmcgc2lnbGVuLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICptc2doYXNoLCAgdW5zaWduZWQgbG9uZyBtc2doYXNobGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICAgICpwcm5nLCAgICAgaW50ICAgICAgICAgICBwcm5nX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaGFzaF9pZHgsIHVuc2lnbmVkIGxvbmcgc2FsdGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqc3RhdCwgICAgIHJzYV9rZXkgICAgICAqa2V5KTsKLQotaW50IHJzYV9leHBvcnQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIGludCB0eXBlLCByc2Ffa2V5ICprZXkpOwotaW50IHJzYV9pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHJzYV9rZXkgKmtleSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSNlbmRpZgotCi0vKiAtLS0tIERIIFJvdXRpbmVzIC0tLS0gKi8KLSNpZmRlZiBNREggCi0KLXR5cGVkZWYgc3RydWN0IERoX2tleSB7Ci0gICAgaW50IGlkeCwgdHlwZTsKLSAgICBtcF9pbnQgeCwgeTsKLX0gZGhfa2V5OwotCi1leHRlcm4gaW50IGRoX3Rlc3Qodm9pZCk7Ci1leHRlcm4gdm9pZCBkaF9zaXplcyhpbnQgKmxvdywgaW50ICpoaWdoKTsKLWV4dGVybiBpbnQgZGhfZ2V0X3NpemUoZGhfa2V5ICprZXkpOwotCi1leHRlcm4gaW50IGRoX21ha2Vfa2V5KHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgaW50IGtleXNpemUsIGRoX2tleSAqa2V5KTsKLWV4dGVybiB2b2lkIGRoX2ZyZWUoZGhfa2V5ICprZXkpOwotCi1leHRlcm4gaW50IGRoX2V4cG9ydCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgaW50IHR5cGUsIGRoX2tleSAqa2V5KTsKLWV4dGVybiBpbnQgZGhfaW1wb3J0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBkaF9rZXkgKmtleSk7Ci0KLWV4dGVybiBpbnQgZGhfc2hhcmVkX3NlY3JldChkaF9rZXkgKnByaXZhdGVfa2V5LCBkaF9rZXkgKnB1YmxpY19rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwotCi1leHRlcm4gaW50IGRoX2VuY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlua2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgdW5zaWduZWQgbG9uZyAqbGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBpbnQgaGFzaCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoX2tleSAqa2V5KTsKLQotZXh0ZXJuIGludCBkaF9kZWNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRrZXksIHVuc2lnbmVkIGxvbmcgKmtleWxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoX2tleSAqa2V5KTsKLQotZXh0ZXJuIGludCBkaF9zaWduX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGRoX2tleSAqa2V5KTsKLQotZXh0ZXJuIGludCBkaF92ZXJpZnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIHVuc2lnbmVkIGxvbmcgc2lnbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoLCB1bnNpZ25lZCBsb25nIGhhc2hsZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnN0YXQsIGRoX2tleSAqa2V5KTsKLQotCi0jZW5kaWYKLQotLyogLS0tLSBFQ0MgUm91dGluZXMgLS0tLSAqLwotI2lmZGVmIE1FQ0MKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBtcF9pbnQgeCwgeTsKLX0gZWNjX3BvaW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IHR5cGUsIGlkeDsKLSAgICBlY2NfcG9pbnQgcHVia2V5OwotICAgIG1wX2ludCBrOwotfSBlY2Nfa2V5OwotCi1leHRlcm4gaW50IGVjY190ZXN0KHZvaWQpOwotZXh0ZXJuIHZvaWQgZWNjX3NpemVzKGludCAqbG93LCBpbnQgKmhpZ2gpOwotZXh0ZXJuIGludCBlY2NfZ2V0X3NpemUoZWNjX2tleSAqa2V5KTsKLQotZXh0ZXJuIGludCBlY2NfbWFrZV9rZXkocHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBpbnQga2V5c2l6ZSwgZWNjX2tleSAqa2V5KTsKLWV4dGVybiB2b2lkIGVjY19mcmVlKGVjY19rZXkgKmtleSk7Ci0KLWV4dGVybiBpbnQgZWNjX2V4cG9ydCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgaW50IHR5cGUsIGVjY19rZXkgKmtleSk7Ci1leHRlcm4gaW50IGVjY19pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIGVjY19rZXkgKmtleSk7Ci0KLWV4dGVybiBpbnQgZWNjX3NoYXJlZF9zZWNyZXQoZWNjX2tleSAqcHJpdmF0ZV9rZXksIGVjY19rZXkgKnB1YmxpY19rZXksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7Ci0KLWV4dGVybiBpbnQgZWNjX2VuY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlua2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgIHVuc2lnbmVkIGxvbmcgKmxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGludCBoYXNoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjY19rZXkgKmtleSk7Ci0KLWV4dGVybiBpbnQgZWNjX2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0a2V5LCB1bnNpZ25lZCBsb25nICprZXlsZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNjX2tleSAqa2V5KTsKLQotZXh0ZXJuIGludCBlY2Nfc2lnbl9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGVjY19rZXkgKmtleSk7Ci0KLWV4dGVybiBpbnQgZWNjX3ZlcmlmeV9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgIHVuc2lnbmVkIGxvbmcgc2lnbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaCwgdW5zaWduZWQgbG9uZyBoYXNobGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3RhdCwgZWNjX2tleSAqa2V5KTsKLSNlbmRpZgotCi0jaWZkZWYgTURTQQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICBpbnQgdHlwZSwgcW9yZDsKLSAgIG1wX2ludCBnLCBxLCBwLCB4LCB5OwotfSBkc2Ffa2V5OwotCi1leHRlcm4gaW50IGRzYV9tYWtlX2tleShwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGludCBncm91cF9zaXplLCBpbnQgbW9kdWx1c19zaXplLCBkc2Ffa2V5ICprZXkpOwotZXh0ZXJuIHZvaWQgZHNhX2ZyZWUoZHNhX2tleSAqa2V5KTsKLQotZXh0ZXJuIGludCBkc2Ffc2lnbl9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBkc2Ffa2V5ICprZXkpOwotCi1leHRlcm4gaW50IGRzYV92ZXJpZnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIHVuc2lnbmVkIGxvbmcgc2lnbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaCwgdW5zaWduZWQgbG9uZyBpbmxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnN0YXQsIGRzYV9rZXkgKmtleSk7Ci0KLWV4dGVybiBpbnQgZHNhX2ltcG9ydChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgZHNhX2tleSAqa2V5KTsKLQotZXh0ZXJuIGludCBkc2FfZXhwb3J0KHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBpbnQgdHlwZSwgZHNhX2tleSAqa2V5KTsKLQotZXh0ZXJuIGludCBkc2FfdmVyaWZ5X2tleShkc2Ffa2V5ICprZXksIGludCAqc3RhdCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbXljcnlwdF9wcm5nLmggYi9teWNyeXB0X3BybmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2ZmE0My4uMDAwMDAwMAotLS0gYS9teWNyeXB0X3BybmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIC0tLS0gUFJORyBTdHVmZiAtLS0tICovCi1zdHJ1Y3QgeWFycm93X3BybmcgewotICAgIGludCAgICAgICAgICAgICAgICAgICBjaXBoZXIsIGhhc2g7Ci0gICAgdW5zaWduZWQgY2hhciAgICAgICAgIHBvb2xbTUFYQkxPQ0tTSVpFXTsKLSAgICBzeW1tZXRyaWNfQ1RSICAgICAgICAgY3RyOwotfTsKLQotc3RydWN0IHJjNF9wcm5nIHsKLSAgICBpbnQgeCwgeTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsyNTZdOwotfTsKLQotdHlwZWRlZiB1bmlvbiBQcm5nX3N0YXRlIHsKLSAgICBzdHJ1Y3QgeWFycm93X3BybmcgICAgeWFycm93OwotICAgIHN0cnVjdCByYzRfcHJuZyAgICAgICByYzQ7Ci19IHBybmdfc3RhdGU7Ci0KLWV4dGVybiBzdHJ1Y3QgX3BybmdfZGVzY3JpcHRvciB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgKCpzdGFydCkocHJuZ19zdGF0ZSAqKTsKLSAgICBpbnQgKCphZGRfZW50cm9weSkoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBwcm5nX3N0YXRlICopOwotICAgIGludCAoKnJlYWR5KShwcm5nX3N0YXRlICopOwotICAgIHVuc2lnbmVkIGxvbmcgKCpyZWFkKSh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcgbGVuLCBwcm5nX3N0YXRlICopOwotfSBwcm5nX2Rlc2NyaXB0b3JbXTsKLQotI2lmZGVmIFlBUlJPVwotZXh0ZXJuIGludCB5YXJyb3dfc3RhcnQocHJuZ19zdGF0ZSAqcHJuZyk7Ci1leHRlcm4gaW50IHlhcnJvd19hZGRfZW50cm9weShjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBwcm5nX3N0YXRlICpwcm5nKTsKLWV4dGVybiBpbnQgeWFycm93X3JlYWR5KHBybmdfc3RhdGUgKnBybmcpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgeWFycm93X3JlYWQodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IF9wcm5nX2Rlc2NyaXB0b3IgeWFycm93X2Rlc2M7Ci0jZW5kaWYKLQotI2lmZGVmIFJDNAotZXh0ZXJuIGludCByYzRfc3RhcnQocHJuZ19zdGF0ZSAqcHJuZyk7Ci1leHRlcm4gaW50IHJjNF9hZGRfZW50cm9weShjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBwcm5nX3N0YXRlICpwcm5nKTsKLWV4dGVybiBpbnQgcmM0X3JlYWR5KHBybmdfc3RhdGUgKnBybmcpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmM0X3JlYWQodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7Ci1leHRlcm4gY29uc3Qgc3RydWN0IF9wcm5nX2Rlc2NyaXB0b3IgcmM0X2Rlc2M7Ci0jZW5kaWYKLQotI2lmZGVmIFNQUk5HCi1leHRlcm4gaW50IHNwcm5nX3N0YXJ0KHBybmdfc3RhdGUgKnBybmcpOwotZXh0ZXJuIGludCBzcHJuZ19hZGRfZW50cm9weShjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBwcm5nX3N0YXRlICpwcm5nKTsKLWV4dGVybiBpbnQgc3BybmdfcmVhZHkocHJuZ19zdGF0ZSAqcHJuZyk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBzcHJuZ19yZWFkKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4sIHBybmdfc3RhdGUgKnBybmcpOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBfcHJuZ19kZXNjcmlwdG9yIHNwcm5nX2Rlc2M7Ci0jZW5kaWYKLQotZXh0ZXJuIGludCBmaW5kX3BybmcoY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gaW50IHJlZ2lzdGVyX3BybmcoY29uc3Qgc3RydWN0IF9wcm5nX2Rlc2NyaXB0b3IgKnBybmcpOwotZXh0ZXJuIGludCB1bnJlZ2lzdGVyX3BybmcoY29uc3Qgc3RydWN0IF9wcm5nX2Rlc2NyaXB0b3IgKnBybmcpOwotZXh0ZXJuIGludCBwcm5nX2lzX3ZhbGlkKGludCBpZHgpOwotCi0KLS8qIFNsb3cgUk5HIHlvdSAqKm1pZ2h0KiogYmUgYWJsZSB0byB1c2UgdG8gc2VlZCBhIFBSTkcgd2l0aC4gIEJlIGNhcmVmdWwgYXMgdGhpcwotICogbWlnaHQgbm90IHdvcmsgb24gYWxsIHBsYXRmb3JtcyBhcyBwbGFubmVkCi0gKi8KLS8qIGNoMi0wMi0xICovIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcm5nX2dldF9ieXRlcyh1bnNpZ25lZCBjaGFyICpidWYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCkpOwotLyogY2gyLTAyLTEgKi8KLQotZXh0ZXJuIGludCBybmdfbWFrZV9wcm5nKGludCBiaXRzLCBpbnQgd3BybmcsIHBybmdfc3RhdGUgKnBybmcsIHZvaWQgKCpjYWxsYmFjaykodm9pZCkpOwotCmRpZmYgLS1naXQgYS9ub3Rlcy9jY21fdHYudHh0IGIvbm90ZXMvY2NtX3R2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmY0Yjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbm90ZXMvY2NtX3R2LnR4dApAQCAtMCwwICsxLDIxNCBAQAorQ0NNIFRlc3QgVmVjdG9ycy4gIFVzZXMgdGhlIDAwMDEwMjAzLi4uTk4tMSBwYXR0ZXJuIGZvciBub25jZS9oZWFkZXIvcGxhaW50ZXh0L2tleS4gIFRoZSBvdXRwdXRzCithcmUgb2YgdGhlIGZvcm0gY2lwaGVydGV4dCx0YWcgZm9yIGEgZ2l2ZW4gTk4uICBUaGUga2V5IGZvciBzdGVwIE4+MSBpcyB0aGUgdGFnIG9mIHRoZSBwcmV2aW91cworc3RlcCByZXBlYXRlZCBzdWZmaWNpZW50bHkuICBUaGUgbm9uY2UgaXMgZml4ZWQgdGhyb3VnaG91dCBhdCAxMyBieXRlcyAwMDAxMDIuLi4KKworQ0NNLWFlcyAoMTYgYnl0ZSBrZXkpCisgIDA6ICwgNTRDOTJGRTQ1NTEwRDZCM0IwRDQ2RUFDMkZFRThFNjMKKyAgMTogREEsIDdBODk4NDIyOERDRjk0NDkwMzkzNkNBOUQ3NzA5QUNGCisgIDI6IEI5NUUsIDEwNTZERTBDQkJFRUE3NjBFRDIwNTNGRkVCNTU0RUE2CisgIDM6IDU4RkYzQiwgQTQyREUxQTgxMkQyOUJCQzZDMUM1QUM4MDg1NjU0MzcKKyAgNDogOUQ2RTZGQjYsIDVFOEUwNDIyNzkyOTk5MzgxRUQ2NjlDRTE3NjAxRDM0CisgIDU6IDQwRDQ5RTg1MUQsIEIwNzZCNEVENzlCRjAxNTVCMzlBNzQzNTUwNTkzOTQ0CisgIDY6IDAxNTM1NkI5QTZFMSwgOEQ2MkNFRkM0NTFDQUU0QTIxQzFDNTc5QzZDQUExMjgKKyAgNzogQTJDRjBBNzdBRTBERTIsIDk3QjlEMjAxNzQwRkE1OUU4NjM1MTNFREFDQzU5RkZCCisgIDg6IEE0NEM2OEU1MkY5NUI0OEIsIEE0NjFCNzlENEQ5QjhBREY2QzY2MThFNkVDREMwNTlBCisgIDk6IEY1NkI4QUQ2OEFBMzFGMjJCOSwgQzVDN0QyRTZGRTM0RDk0Q0U3MkI4NkRBNTU2NzkwODAKKyAxMDogNUMxN0VFQkY0RTM0OENCRTMyNzgsIDI5RkFFN0I0NzBDQjY1MkM1MDEzNDNGRTIzQjI1ODk0CisgMTE6IDFFRTk2MEJGQUUzNjAzMDJEODM0RTMsIDhGOEY0NzVFQjlCQUIyOUNFMTRBOUNGNDJDMzBCMTQ4CisgMTI6IEVGRjZCQTFGMkIxMzg5MjM3QzZDMDQ1RSwgQzg5NTMwMkREOEU3NTA5Njk1MUVGNUNBNjNCRkRENjcKKyAxMzogNUExMTc5QTQwNDczMzRDQ0Q5MTYyRjM2RUIsIDExMDk4N0QzN0Y0NTQyMjYyNURFQTQwMkJENzU4MEVCCisgMTQ6IEYyNkUyQzI3RTdEMjg3QjE4MkZBNDI4Nzk5NzgsIDUzMEZERTkwQzEzQTAxRUJDQTg2NDQ5MDczQTNCMDM1CisgMTU6IDc3QkZFNzlCNEJDODcxMTZFQzUyMzI2MDZFODkwRiwgMjgwOTk0RUIwRTE2QzdDRjEwRjMxQkI2MERCRjUyQzgKKyAxNjogOTkyNkE0Q0UxQUQ3MEI4OUNDMDA1MEE1OEI5NTg3NDIsIEE2MzVCNDI3MkVCRkExRjgzREFFMjcwNDUyRDg3N0U3CisgMTc6IEJBQUY5OUNBRTQ3NTNFMzMwNEQ2RjhGOUMwQ0QzNjZDNjgsIEE2RjYwNkFBQ0QwQjg3OTIzQjQzQzNFQjYxQUMzOTY1CisgMTg6IEY3MjQ1M0M2NzY1MzUyQTMxNDk0RkEwMkIzODhFNDA3QjFGQiwgMEE0NDZEMjhCN0M1ODQ1QzM2MjFCNEQzQTBGQTk4REIKKyAxOTogQTczNzI1ODlBODZCMkUxMzdGMTI0QTk2NjE4MDk1RUI1RTE0MzUsIDNDNTlBNkE4NTg5NDdGRUJGRDMyNDQxRTM3MzA5RjFBCisgMjA6IDU2ODNFMTNBNEU4MkExQUI4QjNEQzIwNTFCNkRCRjJFMUYyQkI0MTcsIDQ1OUQxQjBEMkNGMkMzMEI1RUQ1QzIzN0QwN0RGQzE5CisgMjE6IDMzNTk0QzRCODQ1MzZDMjNEQTVBQjIxMTdFOTI2NzI1OENDRTVERUMzQiwgNkU0QkI3MEE3MjM0M0UxNDJBQzRFMzFDRTBGRTZBNzcKKyAyMjogMzMyRURDOUEzQkRCOTBEQkNDRjMxN0FDNTVCRTU4NTVDQTlCQ0EyQTczQzQsIDlGQjMxMEU1RkZGNUM3NTRFRTFFNUZGRjg2NUYxNjU2CisgMjM6IDczNDYxODY3NzA1NTQ2OTMzNUZGRDU3NEIwMDhGMkM2OEI3ODYzM0Y3OTAxMEUsIEZBRDMxMzg2RTQyQkI0RUE3NkE2NDNBOTAwNEE4Q0I0CisgMjQ6IEJBNkY2QUJBMkFGMzU4OTVGN0Y5NjZENzFGNEU5MUEwQkREMURENTUxODI2Rjg2MSwgMjVBM0VDMUM5MUMyNjI4M0JBQTU5NzUzOTAyODVBQjIKKyAyNTogRkY1MTkyMTNFODU4RTM2QUM4RDkyNDUwRjgxQ0E0NkM4Q0E4QUIxMjlBOTk3RUJCMzYsIDBENEFCMkI3QTVFQjAyMjQyQzAxQTgxQ0VCRjVEODRFCisgMjY6IEIxRjgwMDU4QzNCNDMxNkVBODZFOUE4OThDRDBCOUMwMzY2REZDQjJBRUMwNzk5MzEyRDUsIDBGNEZGMjc1OUVEREY2MzQ5RjRFMjNGMjg0RkFBRDJFCisgMjc6IDAwQkRDMTUwMTJGODE4MzExMkQ1QzNBMTM1REM2MERDOUM3NjRBMDRCRDM5QThFMDQxRjFEOSwgMEM2OEJDOUU2QTZCRjFCMDE3NDNGMzE4M0M5QjdDODAKKyAyODogMzAyMkZEMTI5NjlEOTI1MzY1QzU1M0Q5OEQ1OUU1RDFFQzQ5NDU0MDkwOUQxRkE3OTRGNDFFMTgsIDA1RTYxODQ0OTQzRTc4REI5QkQ0MTdERERFOUM5OEIyCisgMjk6IDRGNEE0NTU0QkZFRDZCQUEwOUUzRDg4NDNDNEVBMzgwN0I4NzYyNzk5QzFEMjEyODlBNDY1NzUzODksIDNBNTlBNkRDOTIzMDAyMEZFMDYxNDY2QTkyQkJDQUZECisgMzA6IDZBRTczNUVCMTVEOUIzOUM4QUQwRTU0RjQ1MzA3QUFEOTdEQjlGOEEyQTY2QkRDOUJBQkNDRkJENTRBMywgMEJEQjM2NUU0OTNBOUUxNjBFRUZEN0RFMjQxMDE4NzAKKyAzMTogNEFGMTlGMDBFQUU1NUZFRDIzMDRCOTRGQkNBMjkzODMwNDJGMkJFNzExMDQxMzIzQzFEOUYxNEJBNjMzODMsIDk0NTYxNTgxRTQ5NjU1M0QwNjgwNTJCQTY5ODY4M0QyCisgMzI6IEMyNDM4QkM0NkE5MkE0NjVFMERCNDFFNjM4Q0M2QzhFMDAyOUM0REE4NDJDQTQxNDBENzNGOTA5ODVFQUJBOUMsIDBGNUE2OUY1MkFBOEQ4NTA4RDA5RTY0MjUxMUU1NEU1CisKK0NDTS1yYzYgKDE2IGJ5dGUga2V5KQorICAwOiAsIEQwMUZBQ0YyQkI1NzdCRkE2MTk0ODAwRTUzRkI0QTAwCisgIDE6IDY1LCA5MkU0OEY3MzAwRkEyNjk3RTlFMEZGODBERDE4NzIzNworICAyOiBBRjVDLCAzMzI4NjNCQzUxNTY0OUQ1QkNBQjZBMkZFNUY1MjUwRAorICAzOiBFN0M4OUQsIDQ5QTY0MUYwMjdDNjVBMTUxMDAwMDlEOTlFNzlDRjNGCisgIDQ6IEFDQjM2RDQ2LCA1M0RFMzI4QThCNEIxNENBRDM2M0JFRDUzREFDRThBMQorICA1OiBDM0FEQUU2Q0NGLCBGNzEzRjUwNzlCRDc3MDQ2Rjk1RDg2ODVDREY1MjJEQworICA2OiA1QThDQUJDOTEyREEsIEZCOTdCMDU5RDJCRTEyNzM0OTdGQThEMjczOUExNTA1CisgIDc6IDI3RjEwMURENkQwODk0LCAyNjZBQ0VGMzQ0NzZBMEU2NDQxMEQyMDkyMTkzMzVEMAorICA4OiA2NjE2NERBMDlCRTJGNDZELCBFRkM2NEMwMTg5MEE1QjU2MkFGMzlBREZDNDhFMUNBOQorICA5OiAxQjAwMTg4OTUzOTQ3NTM5OTUsIEZBODk0RTFDODgyRDk2RTM1QTRDMjM4NzA4OTMxRjNECisgMTA6IEQzNDYwNjI4MjYxODdCQUVGQzNCLCBBMDM2QUUxRDNDMDJFMkFEMjM1NDFERTA5NUFDN0I4NAorIDExOiBFRkIzNzVCQTExMzgzMzlGQTFCNTA0LCBDREQ0MjMyRkY0NjY0RDU5RDVBQzZCRTMyQ0JFMUIzNQorIDEyOiBBRkNGNDk0MDc4RDdEN0U2RDk4MDNGRDUsIDA3RTA2RUQ5MjNGNzYxNTBCRTgyQzFERENCNjJDNERECisgMTM6IDc1REYyRUM5MTM3OTQwOERBNDI2QTQ0NEU0LCA0NDBBQ0RGMkE2NTY3RkEzQTUwMDlEREZFNTAyQTFBMQorIDE0OiAzQjM2QjYyQjAxRTMyNEU3MDI2OTQzMDVERDI5LCA0MDkzNTk4NjA3RENEOTk5Mzg0NUQxODM3RDIxMUZFMgorIDE1OiA3REY2NTk1Qzk3MTFCMTY0Qzk5Q0IyNDZCNEQ1N0UsIEYzNjQ5OTNCMkMxODcwNThGNDY2QjYyRDExRTBGOTRECisgMTY6IEQzMTdFRTlFRTE3NDZEMUI4OUE0Q0M1MkQ4OEYwODE5LCA0MTg1NkIwQjIyOUQzODM0NEZBNzE4RTA0Q0E1N0E4QgorIDE3OiA4NTI1MjI3N0E5N0NBNzU1MzAwNzk5NUJENUEwRENEMzcyLCBCREVFQUI2MzZCRDFBQ0M4RDVBMjNGNjU4MTUwRkEzMAorIDE4OiAzNkZGMzA1QUM2RUY2NjJDMTU1QTFDMTVBNkMxOTVEM0VDODgsIDlBQzQ4RUYwN0E1MTBFMzA4RTA2RTc5QzBDODBDM0EwCisgMTk6IDUxNjQ1QTYxNDMxM0U5NzhGNkRDRTdCQkRERURDMzNFMzI4NEFCLCBFOUY3NzIzRTc2M0FENTAxNjFDMDY3MUM0MDM0RkQwQQorIDIwOiAzQ0I5RTZEMDczMEZFMDVGOTAzRDMzODcwOEFEOEUzNEJGQkIzMjg1LCA4QTEyMTg1REFENTE4MDQ5RjBGQUM5NDVBOEZCMzA1QQorIDIxOiAyNzZFMzdEMjQ2QzQwQUJGMzJEQzgzMDA3Qjk1MzkwRUU4MDFDREE2RTMsIDczRkExRDMxMEQwMzFFMEEwQTNBMTQyMTY2MUI0Njk3CisgMjI6IDQ0NDRCQjA3MEVERkJEMUFDNTlEMEJGNzBENjZGNDhGMDgzMDA2OUYzNTYyLCA5RENCNkE5OUNCQ0NFM0M4QUVGMjlGMDZBRjUwNTdGQgorIDIzOiBEMTZCQTA4NENGODJFREQyRTQzMzQ5MzExMTQwQkYzQTJFMzdERTQwNTQ0QkYzLCBDQjkzQzVBRDYwQzcwMEQ0RUE2NTMxMzYxMDFBQUNDQworIDI0OiAzRkJBRUJCMzZFMkI3NDAxNDA0M0JBN0Q3MkY4OTlCMEQ4REVEODgzRjU5MkQ3NzgsIDU0REVBMzFEN0VFQTg2M0EwNkExNkQ2QzlCMjVEQzEzCisgMjU6IDM2MTRCNTQyOEI3OTA3OTNGMzFFMjM2NzBBMzhBMDcwQjY1REI4RTUxQzYxRkVBOUM5LCBBOTFCNzUwRkQ3QUJGRjE4Mzc2Qzk4MkRGQTBDODg3MgorIDI2OiBBQzE1RkQ5MEE0QzI1NEJBMTQwNkJFN0RCQTU2OTRCQjI2MjVGNjM0QzY5RjQ1Q0NDRDA0LCBFNkY5N0JDQzg1MjZCRTNDMDRCQTEzOUVCNTBFNjVERgorIDI3OiBCNTA2RTgzNTU3RTQ4NTUzQkQ4NTU3NDExRDJDMTdENjQwMDVFNzM0QkE1QTVGRjFDRjk4QjEsIDZGQTAwMTc1OEExOUY3ODNBNzFDOTdBRjFBQTYxRjk0CisgMjg6IEYwNzcyMTY2MzQwMDgzODk0N0VBMUI5NDA0RDk2ODM1NTZGMkQ5MTE0MjlBOUY1OUUzRjVBRDMxLCAzNzZBMTE2NUEzMEM5MTlFOTZDMzcwNkE0QUI1REIzNworIDI5OiA5OEI1RUI4RkUwMDA1RTUxNUE1ODVEOEY0NEQ4MzhGQTU5MDA1NEVBNTIwMUNENDQ0MzY2QjZGNzFFLCBEOEM1ODQ0OEY2MDFGMkMwNUYyNEVEMkNDMzQ5Qzc4QgorIDMwOiBFMzZFMkZDMjI1NzY3Q0MxRTJDMzg4QkVCQzJDODFDMzQwRkVGNUI1MDQ1NzVENUZBNDk2ODJFMUMyMTQsIENGRUQ1NkYzOENBNEY4NEU2RTFFMTZDRUY1MEE2MTU0CisgMzE6IDdBOUZERDhFNDgxQjgyMkIzRDI4MkFBRjcyNjk0NDEwMUVENjFEQUU3Mzc4MkRFMDU1RDdEMzA1RTM2QjI3LCAzMjhCMTA4NDFFOTc3MDQxQ0JEMTNDMzlDRDcwRjAzRgorIDMyOiA0OEFFOEI1RkEwMjc5MzBBN0JDRUMyNzQ2OEQ3OTVEMEQ4RTYwOTlDNUYwNTU4MzYxQjNBRDIwQzFFQ0ZGODlGLCBCMTgwQUE5MzUzRTlFQjZBMjI3MTBBNERFODcyRkFDQgorCitDQ00tc2FmZXIrICgxNiBieXRlIGtleSkKKyAgMDogLCBFMTA2RjQxRDYxNDAyRTUzMjY2MjIxM0VCQTQ3MUJGRgorICAxOiAwNSwgMTc0OTYwMEM3MDQ1NjQ3RENCMzI5M0MwNzI0RTdBMjEKKyAgMjogMjM1NSwgODBERDU5NzY2NTcyM0Y0QUVGRkY3NjBDNUM2QzVFRTIKKyAgMzogNUY0Q0Q4LCA1OUFFNTRFNjNBOENGNERCQUQwNTBCNDJDRTkyMjAxMworICA0OiA3NUY2M0E0MywgQzMxQjZCRDMxMjVDMDM2Qzk5NTA3RERFRTAxOTcyMDEKKyAgNTogNTFENEQ4N0I4RCwgMEYzODcyMDg4Q0RFQjBFOTU4QzM1RjM0MzY3N0FDMjQKKyAgNjogOENGNkQ4MUEyNzRDLCBDOEU2ODg5NTRFNzJBMDUyQjVGOEQxQ0E0NkZCNDRCMAorICA3OiA1RUI4MjgzQjI5OUFCMSwgNTk3N0NCOTZDOEQ0MzlERTNBODZBRTA0NTJBMkVFMzQKKyAgODogODI5QjFBNEVBODY0M0VBQSwgMUU4OTJEM0RGQjczQTQ2OTAzNUNBODFERDdGOTM3RDEKKyAgOTogMEZFRUY5NTA0Q0YwRjRFMjgyLCBFRENCRUQ3QzYxRThFMkQyNDM5MkI0MTQ1MjE4RjBBQgorIDEwOiBERUY3Njc5RDMwNzNENDYxQTk0QywgRDdBQkFFNTYxOTAxQ0JCMzBGRDdEOTQ2N0MwODhCM0IKKyAxMTogNjI1RkQ2NzlDNzM1NEE3NEQ2Mjg5MywgNDUwRTM5NTQ4NTc2NDBEREY0QzdBOTVBNkUyMDJBMUUKKyAxMjogM0M5RTc2RTRFMkQ0RDk1RkVBQkQ1QzkwLCBDRDQ0NjdGNjk1QjdFRDg5NzNBRUVENUE4MjJCMzQ3QQorIDEzOiBCMUI2Mjk0RUNFQUU2QUVFNDg1MzczMUNBOSwgNjA0MjMwMkRBRTU5ODgyMkJFODU1NEJFMDM4MTE5Q0YKKyAxNDogMjA0QkY0ODA1ODJENEJBNDA4QkFEMjNDRUI1MiwgNEQ2Qjg3MzM0RTFCRkI5QkEyRDQyQjg5QjI0MTY1QjIKKyAxNTogMjc3NTkxNzcwRTNFMkRCOTdBMzAxMUQ5NjE2OTkxLCA3NUQwQTRCOTkzNzc0OEVBRTc3OTQwNTZGN0E4QTdGRQorIDE2OiA1NjY5Rjc1RDBDOTA4QkZGN0I4MjA5NTIzMUI4NkRBQSwgM0U4MTY3NzZBNzNGQjg5Mjc2NTM0QTM2NDZDMEY4RkIKKyAxNzogMzdFNjIxRUY1QTA0M0E4M0ZDOThBNjUzMjk4OTFCQzAzMSwgMTU5QTgyM0VBNjFCM0E0N0I0MkVGQ0YxMkYzMDQ3MjUKKyAxODogMThBQzZFQ0YzRjQ3OEEwNzk3QkY4MTNDODcxMjM1QTlEMzA5LCA5QjQxNUIxQjNBOTMzQjIyQzkwMjdFMkQ3Mjc2NDk1NgorIDE5OiA2NzE0ODRDNzU4N0RBQUI4ODVDN0YyRkFGMDMwMDgxQjQ1MkNDNiwgNTc0QTYzRDExM0E1RUNFQzg3N0Q1QTM2OEEzMTYwQUEKKyAyMDogRDdBQjBGN0Q0NkI3RUQ5NzZDOEY2RTdEMEM2QUFCRTNDQUFBNUE2RSwgMjY2QzdBMDI1QzRFREY2NTdERDQyRUI4MkJCNjYxNkEKKyAyMTogRDYwRTRDRkM2NTAwRTIzNzI3NkE2OUYzNUFFNEJCQUUxNzM3MTM5MkVGLCA2RUQyQTE2NzNGOEI0REI3OTU1NDdEOUQ5M0Q3NkQ4QgorIDIyOiBGQUM2RTIxOTc5RDhEOTg5NkM3OTBDQjg4M0MyOUY4NEQ2ODIwQUU0RkQ0QiwgMUM3QjZENzMyMDBFM0MyREM1QzcwMTE1MkYzOEVFOEUKKyAyMzogMzkyNDBEQzJCNTQ0Q0E4QkVCQkI0RUE0OTlGRDQ4QTVFRTcwNzE5OEFFOEFDOCwgRTdGRkQxNjk1NTI2NjVBREU3QjlDMERGRkREMDRFQkQKKyAyNDogNkJFMkMyNDE3MkNBQTE5MkQ1NUNDM0U2NDBFMzQ2NzVERDdGNDQxQ0U1REIwRkMwLCA3NjBDQTk3NjM1NTI4MUY3NkU0OUEyODU2QTRFQzdBMAorIDI1OiAwRTIwNDI3MjE4RDY0NDdENkUyM0ZBNDgzMkNCOEQyQTE3MkIyM0ZEQzU0MkI0MTUyNCwgMjdEMEYzN0UxMDkyNTJGRjVFNkY2RjcwM0NBNzg0RjUKKyAyNjogMEFGNzVCRDg5MDI4QTU2OTFCOEI3OTkzQjlDRTRGRDI0MzM0QTMxMkRFMjgyMTJDOEIyQywgQUZFNEM2QjE5M0IwRjE3OTZGQzlFNkMyMzI5MkMwNjAKKyAyNzogNjgzMEQ4RTJFNkRFQzE0NzY3OTZEQTQ0Qzk4MkQzNjQwOUUyNjhGOTY2MjgzQTY2RTgwMUVELCA5RTJDOTJENUIzMEVCMDk0M0UxNzg2OUVENEM3ODlFQworIDI4OiA3NUVEMjgwQkVFQ0Q3NzY4RjdFMDMyMDcxRjBFMDZEOUQ2QkYxQzlGRjhFNURFQjUzNkRDRDRCQSwgQkYwREQxMUQ2MzNEQkE1RENEMjVGNDE3Mjc2NTU3MEIKKyAyOTogREYxRkFFQ0MxREIyNDcxODIzNkIxOEI5MEIzNTRGNDA1RkQ1REUxMjU3RUM0M0Y4MTFGNEE0M0RDRCwgNDhEMTgyRTU3MkU3OTQzNTBCQkRBOTFGRDc2Qjg2QkMKKyAzMDogMTc2NjgxRTM4QUNBQ0NEM0M2MjVGNTU0QzFGN0EyRDdDMkM0NzRDOTQ0NEVBQzg5MjlCOEMzNkVDMDVFLCAwODBFMTA5RkZDNUQyNDdGMTAwNzIxN0RENjQyQkJBMworIDMxOiA4QTgxNzJDMjFEODhBMUZERDQzMDg5QzU0NUMzMDg1MDc2MTdGN0JEQjAyQzQ3Q0YyNzE5RjE0ODQ0MDdFMiwgMUEwRDEwQjBBRjVCRTIxQkYxOUQ1NzBEM0ZEQTVCQ0UKKyAzMjogMEE5M0NBRTJCOTU1MTc3NzNBNDAwOUZEMzQzODIzMUEyMDdCOUQ0NkFBQkFFODNGQzRFMTA1N0VBNEUyRDZCNCwgNzE3QUVGMkY1NURDODY2OUY3RTJEMDI5OEY4QTdCRTkKKworQ0NNLXR3b2Zpc2ggKDE2IGJ5dGUga2V5KQorICAwOiAsIDMzQjNERjFCNTlDODRERDNDMTVFNEZFQjY2MTczMzAzCisgIDE6IEJGLCA5MkRDRUJGMUMxMUREMEIwMjhERUM5NDRBNTU1RTRDNgorICAyOiA4QTRGLCBBODU5QzdGNzYyOTEzMjZEODIxQkIzQzc1MTk2NTdDMAorICAzOiBCQUU3NTUsIDE0RDdDMkVGQkNBMTA2MzQ2MEZFRkNFQkFFM0FENzlBCisgIDQ6IDI1Njk1QkM2LCA5MzU4QkM0MzRCMTRCNTlFRDE3RjlDMEQzRjUxRENCMQorICA1OiAxRDlGQzcwRUNFLCAyQTg2NTc4RkEzQThDNzAyRTJFNjcyM0RCOUE5ODkzRgorICA2OiBBQzM5RjFERjM2NjEsIDNGOUM3MUVFMDUwNkZEMkJBRkZFRTcyMDBEMjJDRDkyCisgIDc6IEQzMzBBOTE1RUVEOUQwLCAyMkRDMjVFREY1QUNERUY4MzU4QkUyQTMwODIxMTJCQworICA4OiBFRjkxM0FEQUU2MzgwNTA3LCBFODdENzJCQjYzOTVFRUVGMkFENEY1NDZCNDAzM0RFOAorICA5OiA1RUMxNjk5NEU3NjJCQ0U0NjcsIEQ3NzAwRjdCRjRGRTAyNkEyMDc2RjE2MUMzMzgzQTBBCisgMTA6IDdFRUI0OTEwQjdDMkI1NDBCNDkwLCA0MEM4OEE5NzdFMURDRERBQkQ3NDlBQkM5QTBDNjBGOAorIDExOiBFNUREMzJGRjU0RDM5NDUxQ0MyQUY4LCA1NDFCMTU1OEI1QUZGNkU5RUZCRUU0OTZENjBBRDY1QworIDEyOiAyNDJDMjkwMEY4NTk5NjZCNjYyN0ZGNUMsIDFDRUQxNDgwOTgzNTBGM0E1RDFCNTYzNDE4MDgxN0EzCisgMTM6IEVFRjAyNUI5RTRFQjg2N0IxMjdFQkQxOUQ0LCBBRDAxNzlBMDdBRDE0MThDMjVGNDBFMTIzQzJCRUY0NworIDE0OiBDNUU4MTJCMEFFMzcwOTg2ODZFMkM0NDUyQzEyLCAwMkZDODhBQUE2MkUzNDc0MkJCODU3N0E2NTFFOTIyQgorIDE1OiA3QkNBQjMyRDFBODcxQTYyRjlDNzgxQUZDQUM2MEMsIDJDRDFDMTFFRTE5N0Q5RTEzMDM1OUY3NkU3RjQ5MjUxCisgMTY6IDFFODJEOEI4RUVEOUE3MzBEMTY3MEYwRENGRjE3QjYwLCBCNzczMDI2MTU2MEVBNkNGNzE1RkY3MDA2RDVGRUZFMgorIDE3OiAwRTE5NjY5OTJFMzYwREM4MTMxMkIyOEVDQTY4NjVCODExLCAxMEM0MEFDRDE2OUNCMEYyQTZGRkM5OUY5QTU1MTZFQQorIDE4OiA1RjU0MThDMTMyMkJGN0VCODI4Q0YyN0MxRjcyMDg2NTE1QkUsIDkwRjhFRDA0NDcxNzFBMTA0NzZERUQzOUY3NTE4MDc1CisgMTk6IDZDNTUyNTA2RkExNjdGQjhBQTEyRTlGNDE2OTMwMDMxNDg3RDRFLCBDOTkyMDA5RjgzRjMxQTdCRjkyMkJGQUU2OEM0MTM0QgorIDIwOiAzODQyOUQ5NjY2NzY0MDZCMTc2MzhEQjdGOUY3MjA1MjUwNDA4QkIyLCAzMzg1QTUwRTk3ODlEMkM2MzgzNUE4MEVGRTlDRkFFNAorIDIxOiA1NkVGNDI2MzE1RUY5NkJFNEM2MEI0OUY0MUM5QkRERTJFMENEQjNDMjIsIDJENTFENUI0RjVCMDRCRUYzQkMxQTdDRjFBRUE3MEU5CisgMjI6IDMxNEIwNzVDMDk3RUU1MzFFQ0NFNkFEN0NFRjIyQTcyQUFGQ0VGQjAyMDI5LCBGQjdBN0Q4NEQyM0ZGNTI0RDA2MDg3MUQ5MEZBQzEwNgorIDIzOiA2MUNDQ0Y3RTJBOUIzRTQ2Q0QwQTk0RDdGNEE3NjE3QkIwREJBMkQ5ODk5MDdBLCBCM0Y0RDQ2MDk0NzMyRjNFREQ4MUUwNzU1RjBDNTJFQgorIDI0OiA3QTgxMkEzQkNFRDRFMEE3MkZCODEyMThCRDVBNEUzM0Q2OUNBMTg4MzRGRkFFNjEsIDQ4N0Y4MDU4OEI0MUY0RTExOTgxMjQ3MDg5ODc2NjdECisgMjU6IERCRkFCNzdFRjA3QUE0QzlFRDJCMDU1MDBCREZBMDBGRTNGMTlGMTVGOTdBNzQ4ODBBLCA4NDUwNEQ5RUVDQkM2Q0UxMUIxOEJEMTA1REU1NUUyQworIDI2OiBFNjc2RDQ3MzlCMDFCNTEwMUUzNkJGOEQ5RjRGQUU4Rjc2N0MwMjhFODNBNkQ1QjM5NjY0LCAzMTQxQTA1NjY5ODA3QkNBMzBGMDkzNEY1OTlGRDA3NworIDI3OiBEOEZFQkQwNjlEODdDMUVFNTA0Q0I4RjcyQURGRjIxNjZCMTRCQTQwQjE3QjREQUE0Mzk2NjgsIDFEOTlBMzAxOTQzMDQxQzJGN0E3MTQzMkRBNzM2RkUwCisgMjg6IEQ5OEUyQTFDRkZBQjI4MzQxRjkyQzQxOTcxQTIxQUQwRkRERTczM0VBMjVGMjYwNzk2N0NEMEMzLCA0MkUwNUE1M0JGNEYxQTZDNUI3Rjg0NzQyRUNFMDMxQgorIDI5OiAxM0ZBNDEyQjQ4NDk0NUMxRkU4MjkxQTdFQjhGOEZCNzhEMkRDMkM3MkM1MTMyMzg2RUE4MkJGNEE2LCBBMUE4RThCMDI2REQxMTZCMEY5QzczRUIxNEMxQzdDRAorIDMwOiAxMEFCRDJEQzI1QzhCQTU5NEZCRkE5MzEyRTY5QzFBMkRCRjMyNjQ3NUFGMjA4MEU1NUUzNjExRkJDMEUsIDQ5REY4QTUxNzFEQUMzRkI2ODRCQTJDRjdGQkIzRDNCCisgMzE6IEY0MDFEMjEyMzYxOUI4MUY1NEYzMDdCNzgzMzYyQ0M0MEZCNEZCMjQzM0NGNTFGNTU0M0ExNDdCQ0QxRkU1LCBBQ0JCNjcwQ0IzNzIyMDU5QjRCOUZCRUU2NzcwM0U5OAorIDMyOiA4MzlBOUJGQTFEM0NBMzc5MjRCQzY2NDhERUQyMjkxRkM2MTczNkEzNjM4OTA2RDlDNURBMjhBNjZBQTY4NEFDLCBDRDA3QjgzQzhFMEMzRTZGQjQxMTVBMTQ5QkRGNkZEQQorCitDQ00tbm9la2VvbiAoMTYgYnl0ZSBrZXkpCisgIDA6ICwgRkY3M0M2Nzc1QzYxREIzNkQ5QjVFRUM4MTIwOTFGRjcKKyAgMTogNUYsIDdEMkFFQTYyQTUyMDJFM0M0RkJFMDVGMzNFQkU0Q0M1CisgIDI6IDBFQTUsIDMxMkVEMTVGRERBQjZFRUVBQzZBRjlCRTlDRTY5OEZBCisgIDM6IDk2OEY5NSwgRkExQUQ1OEI4NUI5M0I1QTRCNTA5NkM4ODFGNzczQzMKKyAgNDogOUE4RjQwNjksIDg5MTEwNjNBRERGNzlFMjdEOURDRUZGM0Y0NDBFNkQ3CisgIDU6IEE1QzAzNzZFMjcsIDk1NTNGNDRCMEJBODAzOTUyN0Y4RTA1Q0Q3MEFEOEIwCisgIDY6IDVCMDk3NzM2RjNEQSwgNDA1QjdFQzY4NUZDOTQ5MDNCMzZBQzhFNzAwNTU4QjgKKyAgNzogNjE2ODEwQUUzMDNCMkMsIDY0Qzk1QTJERjUyNjNGN0JFNkQxRjlGM0NGODhFQURFCisgIDg6IEM4RDY5QTJFMTE3MDUzMkMsIDA3M0E3RTQyNjI2NjIzN0ZENzNEODEwOUY1NUFFNUQzCisgIDk6IDNFNDJDREI3REE0QTcyRjJFMCwgNDg2NzVFQTQzMDJDQTZCRkU1OTkyREU5NkNFNDNCQjMKKyAxMDogODg1MzJDQzFGM0UzMjFGNjZENjQsIDUyOEIzNTE2QzZEOUE0QjUzOTBERDMyQzJBMkU2QzE5CisgMTE6IDkyMTZBOEZDOUE5NjFFN0Y2MDJGN0QsIEIwMzA0NzE4NkI3ODM4NDRGNUI2NzU3MDU3NTc2QjM4CisgMTI6IDg5QjA4NThENEZERTY3OTVFREUxOUNDQywgRjQ1MzBBMkRDQTgyMzMwN0FFREU1QUYzNEU1QzQxOTEKKyAxMzogQTY3NkUyMEJCMEE1RTg0RkQwQjkxNDlCRjcsIDExQjgyM0IzMTVEQTkzQjBFMTU3ODA4NTE1MjZENEJECisgMTQ6IDkwM0FENUMxMDhDNDNBODA0MzZGRTIxMTdFRjAsIEVCMUM3OUM3REYyMENFMjk2N0E5OTc4M0VBOEQ2RUY4CisgMTU6IDgxNzc0QzM2RjQ2RjY3MTU5QjdGRkMyNEMwODBENywgMkU5RTQ4MTJEOUE5Mjk3N0VDMzQ5MjI3ODJCNjQyMEQKKyAxNjogNjNGRDFDM0Y2OTJENjRCMkRBMzk4MkZDRDQ3NEE1RDQsIDA0MTcxQUU4NDg1NzcxM0E5QkFCQkQ0NTY0ODc1RDMzCisgMTc6IEIxQkY2QUQ5OUY4M0M5MTczQzZDMDIxQUNBNzRDNTQzMUMsIDM4RDE3RDRGNkFBM0MyNEI4RjNCNDY1RUFBQ0UwQTFFCisgMTg6IDA5NDhEMUVENTlGMDdERTQ0QTk2QTc2RTA1QjBCNkY3QzMwOSwgMTg0OEQ4ODZGQ0ZGMzVFODVCMERDM0NCRTVCRUU3RkEKKyAxOTogMzQ1OEU1OTExMjIyRjlDNTU1QTEwNTRDN0Q5NzQ4ODc2REEzOUEsIDU4NEFGQUU3MkZCNjA2NUE3NEJFMDE2Q0YzOUQyRTg2CisgMjA6IDY0MUYzODY3MTg1RDA2MDVFOUQ2NjZBQjYwNTE4N0U3NUExMjk5RUYsIDZGOTMzMkU2RkI1RUEwQ0U4MTFFMzM0NTU5M0NEMTYzCisgMjE6IDA2NzY2MjJEMDc3MzNFRjMxQTc2NUFBQjFFNzEzRkNFMzI5Mjc3RkIxNiwgODg1NDc0NzQwNTBGRkM5ODY5MzBDQzA0QkE4QTAzRjAKKyAyMjogNzk4NjFFQzJGRDJCQ0M1QzEyQjY5RjMwQTE1NzVGQzY2QUMxNDA1MjgxQkIsIEZDNjhFRUFDOEYzOUVENjlEMzEyQUVBQkY4MDAwMDg0CisgMjM6IENCMjczMTgzNUE1NzZGN0Y4RjJDMjc4NkQ3ODZGQjYxODZFMkY4NUQ4OURBM0IsIDNFRDlFOTVCQzUxQ0Y2MzY4RTZFRjYzNjY3QjM1QkQ4CisgMjQ6IDNDQjFDMDJGQURCNkRENTQ4M0JDNUQzQzAzRDk0NDEwMkNGQ0VERjgyQjkxMzQwMiwgMUMzRjYwQzk4OUE2RkJGNDFBN0FGNEYyOTExNUMzMzQKKyAyNTogRTY5RkFFQTVFM0QwQjc2RUY5RTcwRjk5QzU5MThEOTM0RDBFOTgzNkYyNDhEQjlFRUUsIDdGMTkxNkIyQ0Y3QzlBNUUzRjU1ODFEMzY1QURCRDMxCisgMjY6IDM2Nzc5QUQ3NTVBOURGMkRDM0M1ODI0REMyRjdERDRGRkUwMzg2MjhBNEUxQTFDMzNBRTcsIDJCREVEMzcwMzQ2OEQyNjdGOEFCN0VDMEFGOEYxRTY1CisgMjc6IEU5RDMyNTY0NkE0MUVFNUFBN0RBQkNERTk4REU4MzQ0MEE3REMwMjcxNEJBMEFFRTAxN0UyMiwgOTcyRjRENzgzMkYzMzcxQzYwRENEMDRBNkRFREVBMTUKKyAyODogMEZBQUUzRjYwMjhBMjhBODBCQkZFNzFGQTdBQTkwNDJFNTM4QjQxQTBENTE0RDZFQjRFRTYwMjksIEY3QjM5MjU0OTVFMjYwMjQ5QUNDNkUxQ0JFOTU2QkM1CisgMjk6IEE5Q0MzOUVGRkVFMzU0QzBFMDU3OTI1NkFBODVDQkFBN0IxMEU2NzBERDM4MjhBN0EwNURBMEY0OUQsIDI4RDlEMjAxODdBRkU3MEFEOUREMTY3NTlGMEVGRUI1CisgMzA6IDAzMkY0QkJCNEVCRjJFNjU3NThDNTQxRkRBRkYyMTA3RERCRUQzOTk3Mzk4NDlGOEVCQjQxQUY5NzExRiwgQTM0MzY5ODFFRDYzN0NFNUVFRTAxQjM4MEM0NkFDQUQKKyAzMTogN0IzMjFFRDgzMUNFOTZBNjAzNjY4RTNFNzRCQkM3NDUzNzQ5QTAzRDA0QTFCMzhFOTU5NjZFNkNDNDg4RjAsIDg4RDFEQURGMkMxRUUwQkE1NzlEMEE4QTkwQzFFNjJBCisgMzI6IEQ4NjJCMEJEMEUyMTc4QUUwNUFFRkIxNEYzNEM3OTE1NDdDNTk1NkYxRjNCNUJENTI1OTI2NTc4REUzODNBOTQsIEJGMzJDRkUwNTlGMjcyMjJEQzU1RDNFN0NFN0M1RjEwCisKK0NDTS1hbnViaXMgKDE2IGJ5dGUga2V5KQorICAwOiAsIEM4NUY0MTQ3NUUwNkYyNTY4MkY4NTVDM0Q0NUE2NTIzCisgIDE6IDI1LCA0MzdCRDczRUNCOENGRkFEOUIyODc2RjA4RDRCREEzNgorICAyOiA1QURDLCA1Qzc2MjA1OEE1RUY3MTI3OEI2OUY1NjdGMThDQkU1MQorICAzOiA5NUU1NDEsIERGMDk5RTgyMThBRURFODA4Nzc5MUIzODI5ODMzNEU5CisgIDQ6IDJEQUE4NEU0LCA3NDM3MDk0MTk4RTRBRDI2NDdDMjYxODI0ODc2OUEyNgorICA1OiBCOTY0MUM1ODU1LCA5MUIwMkVDNDREMjI0NjBCRkYyMkJCNDBDNzk5RTIwQworICA2OiAxMDIwMTJCQ0VGQTUsIEU2MDQ4OERBNjVENjgzMTgyRjBFRkRGOURBNTJBNzhDCisgIDc6IDhGMTQ5NzJDQTRGOEVBLCBDMjZCNTFGMjBBQ0RFQzdEQ0E5MTE1MDBDRjEyNDFFRAorICA4OiBFRDI3MTRCNjUyOTcyMjU2LCA4QkEyOTQ1OUQ1RDM3MEZDNjA4RUUzNjJCNTVCNzYzMworICA5OiBCRjU4QTI2OUE0RjU5Q0UwQTQsIEQ2OTA4MDgyMEY4MzZFNUI1Q0E4RjM5M0U2MUVEMDA5CisgMTA6IDQ0QUYxRjcxNUFEQUYyNkM2RUYwLCBGRUZCQzdEQjc1RUNEREJBNEExM0NCRjlBNTc4NzNEOAorIDExOiA3N0NERTFCOTUxRjA4MDM4OTM2NDJELCBGQkY4QjgwQjA2MTcwMzUwNEQ4RDNBNzcxODM2NkI2RQorIDEyOiBERTU5OUJBQUM5RDNFRkQ5RkNENDdFNDQsIEY2MzZFQzM1RDE3MkQ2NjFGMDE3NDZGRjg2Njg4Qjk1CisgMTM6IEE3OTJCODM1OTA1MEM0ODY2NTcyOTc3NDE1LCBBRTY3RDRFRUQ5MkU2M0ExNDAwM0ZCQzkzNkVFRjQzRQorIDE0OiA2MkQ1QTdBNERGQjc4QTE3NTgzMTYyNzk4N0NCLCAyNUY3QjQ0MERCRTk5MDJDMjhCMjhFNTBCRjAyQzUxNgorIDE1OiBCNkYyODk0NTlGOTI0Qzc2NTg2RjRFRUEwQzFDQUEsIDU0MjY2QjQ0MjRDM0FGNkU4MUY2Q0M0RjI0MzdGNTRFCisgMTY6IDg4NEI3REYzMzk1RjA2M0RDQTI2QkRGOUYyRkVGNEVBLCBFM0MyQkZBMTk2NEVGREY3OEZEQjk1NTlDODAzMUM1MAorIDE3OiA3NzQ5NjIzNzdCODczMUYyRjMwMUI5MzA0ODc1MTg4MDFGLCBGMzVCNTQyNjQ3MTFEODQzRDIzNjM2QkE2Q0ZBM0U0QworIDE4OiBFOUM4RDExNjRGMkIxOTZDNzMwNTQwNjE3OUIyMzJFNDVGMUYsIDJBMTNFMDM0QTEzNkVCQzBFRDMzNjE3MzdFQUQyMTRDCisgMTk6IEQzRENEMjQyQzk1MkM1NTg5RTAwQjY1Q0Q4MjZDQTg3NjkxQjhGLCA5RDYyNEQ0ODIwNDI3OThEQjg5NkI1NUQ4MDFFQUQ5OAorIDIwOiA1NzA2NUIyNjU1RDQ3OTlDMDQ3OEZFN0U4NDYzQTIyMTVFNzU4ODc1LCBDOEZCMDUyRjE0RjlERjY3MzFBOUM4QjU2NkU3MUQ1MworIDIxOiBGRjczNkZEQkQyMzU5M0Q5QkM5QTBEOENBN0Q4MTlGNTUwRUY5NjkzMjIsIDVDQzMwMjMwMjk3OTBCRkQ0MzIwNEIyN0Q1MkQ3RDdFCisgMjI6IEM1NjJCNzM4N0I4RjFEM0RCQTIyREQxNjM2QzlDNEFCNDQzRjJGRjE1RjcwLCAxOTVDOTI4RUFGODhCQjRBQ0JBOEEwMUI0RUJBRUU2RQorIDIzOiBEMEFDNkVBOEE4MDREQzI2MTMwNEQ0ODIxRTZBRDdGQ0MyRjBEQzFBMjk5QjlBLCAzNEZFMjAzNENDRjA5QTk4REQ1MDU4MURBOEJDQkUzOQorIDI0OiBCNjU5MzNBN0Q3QzhFRjE5QzFCREVBQUJFMkI0Q0U1RTgyMTQ1OUQ5NTM1NjVFRjgsIDQyQjIwRUYxNDJFQjIyODgwM0Q2QUY0N0M2NDgyQkVCCisgMjU6IEYxRjRGQ0U4NDJFRkVGNTYzRjZGMDQ3OTU2RTY3MDZEQzlCMTc4RDAwRDgyNzc2RDc0LCAzRUNFMzA1MEQ4QzgwMzE5ODIxRDVGNTdBN0NBNzA2NgorIDI2OiA0QTNGMTBGNEUzNDIxMEE1Q0ExQjgxQUQ0MjY5Q0JDM0ZENjhBQzY2MkJGMEU5REM5OTM1LCAwQkMwNzI0QUE5QTE5NEQ4Qzc1RUU2RkM4RTdGMjhGMQorIDI3OiAwNzdGM0MwNTUzMDNGRDY2OUJDMUEzNzBCMThBQTdGMzFEM0M4Q0JGRjVBNjkzODE0MDRGQkIsIDg3MkM3OTQ2NDAxQkU3MEU2NzdCNzlFQTEzRkIwRjU4CisgMjg6IEZEMzlEMzJCMjdGRTVCQjhFNjUxMkM2NDJENDkwRTBBRDA4NjZFMzg2NTgwQUUxMTVDODVFRDJCLCBFRTgxNzEyRUE1N0RENTREREVFOThFQUIzMjg1RTZFRQorIDI5OiBCNDVFRDE3OTI5MEE2MDY0MTg4QUZGNkI3MjJCMzdGOEMzRTk4NEVDMzdBQjVGNDdCMzUzMjI5QjEyLCAxODZCM0FEMEM5RjYwRDU3RTg0OTkyQ0JCMkIwRjcxQgorIDMwOiA4M0ZGMUZEMTc5RDUxOEE0MTQxNDhDMTVCRTU2NkJFNENDM0RCRTlGRjUzMTlBNjUxRTg2MjgxMUYxNTIsIDRCMjk0MkM2NjU2NUVCOTEzOUE4M0MyRUZENTQ5RDU1CisgMzE6IEI4MTc2NDY5RTZBMEQ1Nzk3RUQ2NDIxQTg3MUZFRUNERTQ4QUNGMDExRTM5NDk4MUM0M0FDOTE3RThGRkQ1LCBFOUIwMTM4M0RCMUEzMkU2MTI2QkQ4MDJBNkM2RjQ3RQorIDMyOiBBQjZBMEFBMjlCNjg3RDA1NzM1MTY3RDc4REI2OTdCQTI0NzhCRDE0RUNEMDU5QUU5RDEyMzlFN0YyQUI0OEZELCBBNTYwQTMwRkQ4N0NGMjhCQTY2RjVCMjYzODU2N0U0QgorCmRpZmYgLS1naXQgYS9ub3Rlcy9jaXBoZXJfdHYudHh0IGIvbm90ZXMvY2lwaGVyX3R2LnR4dAppbmRleCBmMTQ0ZmFlLi5jNjQ5ZDI2IDEwMDY0NAotLS0gYS9ub3Rlcy9jaXBoZXJfdHYudHh0CisrKyBiL25vdGVzL2NpcGhlcl90di50eHQKQEAgLTEwMDUsNiArMTAwNSwyMjIgQEAKIDQ5OiBGOEI5NzRBNEJDMTM0RjM5QkU5QjI3QkQ4QjJGMTEyOQogCiAKK0NpcGhlcjogc2FmZXItazY0CitLZXkgU2l6ZTogOCBieXRlcworIDA6IDUzM0YwQ0Q3Q0NDNkRERjYKKyAxOiBDM0NENjZCQjFFNUU1QzE3CisgMjogMDc5REZENjhGNkFGOUE3OQorIDM6IDg0RUI0OTIyMjY0QTEyMDQKKyA0OiAzMUYzQTdENzM5QzdFNDJDCisgNTogMzgxRjg4RkI0NkUxRENBMgorIDY6IENBRjRBQzQ0M0U1MEVGNDcKKyA3OiAyOTE0RTI1NURBOUJEREJCCisgODogQTE2MEEyNDEyMEU0RkVDQworIDk6IEY3NDhDNjAwOUZGQkM0NjUKKzEwOiA4QjNDQjU3ODQ4NDZEMkIwCisxMTogNEY5OEMxNjIxNDczMzk5QgorMTI6IEI0ODZCMEJDMzY1QUJFRTkKKzEzOiAzMTRFQUIyQjRFOUY3ODQwCisxNDogNjEzRkUzNjM3OTY4QThGRQorMTU6IDI4OTM1MzUyMzYxRTEyMzkKKzE2OiAwRENCMDkwMjMzQjhFQjNDCisxNzogQ0YwQkM3RjMwNzU4NkM4QgorMTg6IDY0REYzNTRGOTZDQjA3ODEKKzE5OiBEMkI3M0M2QkFBQ0E3RkIxCisyMDogNjM4RkNFRUY0OUEyOTc0MworMjE6IDIwNEM0RTBFMEMwQThCNjMKKzIyOiBGMDQxRUY2QkUwNDZEOEFBCisyMzogNzY5NTREODIyRjVFMkMzMgorMjQ6IDY3MDBDNjA5NzFBNzNDOUUKKzI1OiA4MDAxOTI5M0FBOTI5REYyCisyNjogOEVGNERFMTNGMDU0RUQ5OAorMjc6IDQxRERGOTg0NUFCQTJCN0EKKzI4OiBCOTE4MzQwNzk2NDM4NTBDCisyOTogOEY0NEVDODIzRDVENzBEQworMzA6IEVDMkZGOERFNzI2Qzg0Q0UKKzMxOiAyNURGNTlEQzJFQTIyQ0I1CiszMjogRkMxMTMwQjUxMTc5NEFCQgorMzM6IEVEMzI1OTM1OUQyRTY4RDQKKzM0OiBENzc3M0MwNDgwNDAzM0Y2CiszNTogQzFBMzJDMTE0NTg5MjUxQworMzY6IDUxNjQ3RTYxRUUzMjU0MkUKKzM3OiBCOTVBODAzNzQ1N0M4NDI1CiszODogNEY4NEIzRDQ4M0YyMzlFRQorMzk6IDQ1ODQwMUMzNzg3QkNBNUUKKzQwOiBGNTlCNUE5M0ZEMDY2RjhBCis0MTogMTQ1MEUxMDE4OUNDNDAwMAorNDI6IDBGNzU4QjcxODA0QjNBQjMKKzQzOiA1MUI3NDRCMjcxNTU0NjI2Cis0NDogQjU1QURBMUVEMUIyOUYwRAorNDU6IDU4NURGNzk0NDYxRkVCREEKKzQ2OiAzNzkwQ0M0RENBNDM3NTA1Cis0NzogN0Y3RDQ2NjE2RkYwNURGQQorNDg6IDZBRTk4MTkyMURGQ0ZCMTMKKzQ5OiBGRTg5Mjk5RDU1NDY1QkM2CisKKworQ2lwaGVyOiBzYWZlci1zazY0CitLZXkgU2l6ZTogOCBieXRlcworIDA6IDE0QTM5MUZDRTFERUNEOTUKKyAxOiAxNkE1NDE4Qzk5MEQ3N0Y0CisgMjogRUUzMzE2MTQ2NUY3RTJERAorIDM6IEFCODVBMzQ0NjRENThFQzQKKyA0OiAzRDI0N0M4NEMxQjk4NzM3CisgNTogRDg4RDI3NTU0NTEzMkYxNworIDY6IDAwQjQ1QTgxNzgwRTM0NDEKKyA3OiA2ODMwRkFFNkM0QTZEMEQzCisgODogOTNERjY5MThFMTk3NTcyMworIDk6IDE1QUI5MDM2RDAyQUEyOTAKKzEwOiAwOTMzNjY2RjBCQTQ0ODZFCisxMTogOTNGNDJERUU3MjZEOTQ5QworMTI6IDc1NkU3QkEzQTZENERFMkUKKzEzOiA0OTIyRENFOEVFRDM4Q0ZECisxNDogOEVDMDdBRkJENDJERjIxQworMTU6IEU4MkJFQkNGQjFEN0M2QjQKKzE2OiBCM0VEQjRDQjYyQjhBOUJBCisxNzogNTUyMTMwN0NBNTJERDJGMworMTg6IDU0QjVENzU1MTJFMUY4RjMKKzE5OiAxQTczNjI5M0YyRDQ2MEE4CisyMDogNzc4QzcxMzg0NTQ1RjcxMAorMjE6IENCQzA0MUQzQkY3NDIyNTMKKzIyOiA5QzQ3RkMwRkRBMUZFOEQ5CisyMzogQjg0RTI5MEQ0QkY2RUU2NgorMjQ6IEZDM0U1MTRDRTY2QkI5RTMKKzI1OiBFODc0MkM5MkUzNjQwQUE4CisyNjogNERBMjc1QTU3MUJERTFGMAorMjc6IEM1Njk4RTNGNkFDNUVEOUQKKzI4OiBBQzNFNzU4REJDNzQyNUVBCisyOTogQjFEMzE2RkMwQzVBNTlGRAorMzA6IDI4NjFDNzhDQTU5MDY5QjkKKzMxOiBFNzQyQjlCNjUyNTIwMUNGCiszMjogMjA3Mjc0NkVERjlCMzJBNgorMzM6IDQxRUY1NUEyNkQ2NkZFQkMKKzM0OiBFQzU3OTA1RTRFRUQ1QUM5CiszNTogNTg1NEU2RDFDMkZCMkI4OAorMzY6IDQ5MkQ3RTRBNjk5RUE2RDYKKzM3OiBEM0U2QjkyOTg4MTM5ODJDCiszODogNjUwNzFBODYwMjYxMjg4QgorMzk6IDQwMUVFRjQ4MzlBQzNDMkUKKzQwOiAxMDI1Q0E5QkQ5MTA5RjFECis0MTogMEMyOEI1NzBBMUFFODRFQQorNDI6IEJGQkUyMzk3MjBFNEIzQzUKKzQzOiAwOUZCMDMzOUFDQ0VDMjI4Cis0NDogREZGMkUwRTI2MzFCNTU2RAorNDU6IEVDRTM3NTAyMDU3NUIwODQKKzQ2OiAxQzRDMTQ4OTBENDRFQjQyCis0NzogRUE5MDYyQTE0RDRFMUY3RgorNDg6IDgyNzczRDlFRUZDQUIxQUIKKzQ5OiA1MTZDNzhGRjc3MEI2QTJGCisKKworQ2lwaGVyOiBzYWZlci1rMTI4CitLZXkgU2l6ZTogMTYgYnl0ZXMKKyAwOiA0RDc5MURCMjhENzI0RTU1CisgMTogNTM3ODgyMDUxMTRFMTIwMAorIDI6IDQ0NzJCQ0NBRjNEREVGNTkKKyAzOiBGRTlCMzY0MEVEMTE1ODlDCisgNDogNERERDc4NTk4MTk4NTdENworIDU6IDZCRjkwMUM0QjQ2Q0M5REIKKyA2OiA5MzBEQkZDMERFMEY1MDA3CisgNzogRTg5RjcwMjE1OEEwMEQ4MgorIDg6IEJFQjY2MTk1M0JGNDZENTAKKyA5OiA2RjBEQTY0QzBGRDEwMUY5CisxMDogNEVCQkNFNEU1QTM3QkVEOAorMTE6IDk5NkVBQTBBRjkyQTA5QUMKKzEyOiBBRUQ2QkI5NTIyRTBCMDBGCisxMzogREY5QzY0MzYyNEEyNzFCNAorMTQ6IDJFNUM3ODlERDQ0RUYwQ0YKKzE1OiA4NkE1QkExMDYwMTc3MzMwCisxNjogMjM4NURCQTRERUJFQjRBMworMTc6IDgyRTJGQzc2NTcyMjA5NEQKKzE4OiBCM0NBMjE2MTc1NzY5NUVGCisxOTogRjhBNEM2MDgxRjNBQkMwNgorMjA6IDY0MjIzMTZFMUJFRkZBQzgKKzIxOiBDMTc4NTExQkZCRkYzODBFCisyMjogMDQ5QjhDQkVERTU5NDJBOQorMjM6IDBFMTgxMjkyQzFCMURFRkMKKzI0OiBDMzQ3QkEwNjMyQTQ5RTU1CisyNTogMzJGREE0NjY2OTcxNEY5OQorMjY6IDA1MjM3NDNFMzBDMTY3ODgKKzI3OiA3ODJCRTk2QTkzNzY5RUQwCisyODogOUY5OUM5RThCRDRBNjlEOAorMjk6IDEwNEMwOTRGMTIwQzkyNkQKKzMwOiAxRjdFQTNDNDY1NEQ1OUU2CiszMTogOTBDMjYzNjI5QkM4MUQ1MworMzI6IDE4MDM0NjlCRTU5RkVEOUUKKzMzOiAxNDc4QzdDMTc2Qjg2MzM2CiszNDogMzYyRkUxMTE2MDE0MTFGRgorMzU6IDY0Mjg0MTc0MzJFQ0MzQzgKKzM2OiBENzRDNDJGQ0M2OTQ2RkM1CiszNzogMUE4RjNBODJDNzhDMkJFNgorMzg6IEVFMjJDNjQxREMwOTYzNzUKKzM5OiA1OUQzNEEwMTg3QzVDMDIxCis0MDogRjY4Q0M5NkYwOTY4NkEzMAorNDE6IENGOEM2MDhCRENDNEE3RkMKKzQyOiBEMjg5NkFCMTZDMjg0QTg1Cis0MzogODM3NUM1QjEzOUQ5MzE4OQorNDQ6IDBGMDQ2MkY5RDhFQkFFRDAKKzQ1OiBDMzM1OUI3Q0Y3OEIzOTYzCis0NjogRTRGNzIzM0Q2RjA1RENDOQorNDc6IDg1MzNEMTA2MjM5NzExOUIKKzQ4OiA0QjMwMDkxNUYzMjBERkNFCis0OTogQTA1MDk1NkE0RjcwNURCOQorCisKK0NpcGhlcjogc2FmZXItc2sxMjgKK0tleSBTaXplOiAxNiBieXRlcworIDA6IDUxMUU0RDVEOEQ3MEIzN0UKKyAxOiAzQzY4OEY2Mjk0OTBCNzk2CisgMjogNDFDQjE1NTcxRkU3MDBDNgorIDM6IEYxQ0JGRTc5RjBBRDIzQzgKKyA0OiAwQTBEQzRBQTE0QzJFOEFBCisgNTogMDU3NDBDRjdDRDFDQTAzOQorIDY6IDI0RTg4NkFENkUwQzBBNjcKKyA3OiBFRUYxNEQ3Qjk2NzA2NkJDCisgODogNkFCREY2RDhBRjg1RUFBMAorIDk6IDBFQjk0NzUyMTM1N0VEMjcKKzEwOiBCREQyQzE1OTU3RjlFQzk1CisxMTogMDk4OUI4N0E3NEEyRDQ1NAorMTI6IDA0Qzc5M0JBMkZBQjc0NjIKKzEzOiAzREFEMkZBQ0RERkEzQzQ1CisxNDogRDExOTQ5MzVDQzRFMUJENworMTU6IEJBQzBBMkM4MjQ4RkY3ODIKKzE2OiA3REQ1ODk0QTgyMjk4QzY0CisxNzogQTU5RjU1MkE0Mzc3QzA4QgorMTg6IDhERERFNDFBQjQ1ODYxNTEKKzE5OiA3Q0M0MjYxQjM4RkZBODMzCisyMDogRTk5MjA0RDY1ODQxNThFQworMjE6IEFBQ0M4RUQwODAzQ0I1QzQKKzIyOiBDMTA1Q0E3MkE3Njg4RTc5CisyMzogM0Q2NjJGREMzNUI4OEMwOQorMjQ6IEE0QkNFREMwQUU5OUUzMEUKKzI1OiBFQUVDRjlCNjAyNEQzNTNDCisyNjogMjE0NjUxQTNEMzRBRkY0MAorMjc6IDgwNzA5OTMyNUY5RDczQzIKKzI4OiA0NUVDMjFBRUI2QjkwQTI0CisyOTogRENFRDM5NTI2Njg3RjIxOQorMzA6IDJDQzI0OEUzMDFEMzEwMUQKKzMxOiBDN0YzN0FCODU3MEJBMTNDCiszMjogQkI5QjMxQTM0QTM5NjQxQgorMzM6IDUzMTQ1NzA4NDQ5NDhDQUMKKzM0OiA0NTgxRjgzN0MwMkNENEY0CiszNTogNEUwMzZCMUI2MjMwM0JGMworMzY6IDdCM0I4OERFMUY1NDkyQTQKKzM3OiBDRUYyODY1QzE0ODc1MDM1CiszODogMTRERThCRUUwOUExNTVERQorMzk6IDNBQTI4NEM3NDg2NzE2MUIKKzQwOiAzNjE2QjQ2MDczNjlENTk3Cis0MTogMDc1MTJGNTdFNzVFREVGNworNDI6IDcxMEQxNjQxRkNFNjREQzIKKzQzOiBEQjJBMDg5RTg3Qzg2N0EyCis0NDogQTE5MkQ3QjM5MkFBMkUyRgorNDU6IDhENzk3QTYyRkJGRTZDODEKKzQ2OiBFNTJDRTg5OEUxOUJGMTEwCis0NzogNzI2OTVDMjUxNThDQjg3MAorNDg6IDI5Rjk0NUI3MzNGQjQ5OEYKKzQ5OiAyNzA1NzAzN0U5NzZGM0ZCCisKKwogQ2lwaGVyOiByYzIKIEtleSBTaXplOiA4IGJ5dGVzCiAgMDogODNCMTg5REU4NzE2MTgwNQpAQCAtMTUzNywzICsxNzUzLDIxNSBAQAogNDk6IDBBQUIyOURGNjU4NjFGNEMKIAogCitDaXBoZXI6IGFudWJpcworS2V5IFNpemU6IDE2IGJ5dGVzCisgMDogMzBGRjA2NDYyOUJGN0VGNUIwMTA4MzBCRjNENEUxRTkKKyAxOiBERDdBOEU4N0NGRDM1MkFGOUY2M0VBMjRBREE3RTM1MworIDI6IDBEMEJFOEYwNTUxMEVCRDZBM0VDODQyRTVCRDlGQzJBCisgMzogMzMwRjA5NTgxRkRDODk3QjNGRTZFQzFBNTA1NkE0MTAKKyA0OiAzMDM0OUQ5NjVGNDNDMjk1Qjk0ODRDMzg5QzREOTQyQworIDU6IDkyMjUzNDNGMDA1NkJDMzU1MDYwQzAyODJDNjM4RDAyCisgNjogRTNBODVENDFCNTMzNzUzM0M0RDg3NzMwOTQ4QTlENEUKKyA3OiAwOURBMEREQjY1RkY0MzEwODFDQUIwOEEyODAxMEI3NgorIDg6IDZDMEQwQkQ2Q0VBRkI5NzgzQjMxMDIzRkQ0NTVEQUM2CisgOTogRkJFNkYyNkI3Q0EzMjJBNDUzMTI4NTZENTg2REUyRUUKKzEwOiAxRjI2OUVDMDcyRDBGQkE3MkU4N0NBNzdGOEI5ODNGQgorMTE6IENGRkFFOUFERTMwMDZCRDUxMUVEMTcyRDQyRjE2RDA1CisxMjogNzNGMEU5REU4OUY0Qzc1NDE1MDZGMDUyRDE4MUJBQzIKKzEzOiBGQ0ZBM0UyRTg5RkY3Njk4MzQyOTVDNzc0MzFFRjdDRQorMTQ6IDA0NTIzNjAzODNENTZGODI3QzgxMjYzRjZCMDg1NUJDCisxNTogNDA3NDRFMDcyOTlENkEyQTIxMEJFNTU5ODgzNTIyMUIKKzE2OiAyRjBGQzYxMTQ4QzM2RjRDN0I0MkRGMjc0QUQwRERFMAorMTc6IDJFQTBFOUJFOUU0RTRERjg1NDg4RkU2RTdDRkNENkUzCisxODogMEFEMTI1NEZBNjRDMzk5NkJCRDQ4NUQ0MUEzNjg3QTAKKzE5OiA1QjU1OTg4NjUyREYyMDAzNDhBMTE0RjgwMkZEM0MwMworMjA6IEMzMjkwNkFGNzY5MzRDMTQzNkNBNjBCQUQ1OEEwQzY2CisyMTogNTlEODc5ODdERTlERDQ4NUM0NTM3RjNBOTVBMTY0QTAKKzIyOiAwQTcwNkFERjQ4OEQ4NDYzMkM5NkY0QkVDNDNEOUZBOAorMjM6IDBCNzRFMENERDE0RDk4NEIzNzQ5MUUyRDlGQTYzQ0FFCisyNDogNDdDQjE4MjdEMTUxQTYwNDczRTY3QkQ1RDIzMzEwMkYKKzI1OiBGNDU1QjRCNjY1RDNEMEFGQjI1RkRFNEEzMzEyQUZGNgorMjY6IEY5QTA2NDk0MjFENDVERjYwNDIwNjg1NEY2ODFEQkRCCisyNzogMjE0NzdGNTU0NjMzOUU0QjZEODIxNTM2OEVFOUY4ODQKKzI4OiA1Nzc2NDBGMjNDQTczMzQ1NzAxQjA5MDZERkFCQTRCNworMjk6IDg5RjhEMDhBNkUxNzM3NTkwMjBERDczMDFFMEZFMzYxCiszMDogNDRFRjdBRjcwNDNGRDRCODExMjM0NUNFRTQyQkM5NjkKKzMxOiBEN0NGMENFMDRBNTcyNTNGNEM2M0NBQkM0QTVDQjAzNAorMzI6IEFGNzNEM0Y0Q0VEMzI1OTNCMzE1RTI3MDc5MTMxRDIyCiszMzogRjZFNjAzRTM0NTUzNTlGRTQzQTNCODNBQUYzQUYwQzUKKzM0OiBEQ0MzRkI1NTdGMkMzMDFCNjMxREVGNDk5MDk3RTRGRAorMzU6IDgyODVBMjVDRjZGN0U3MDE2NDQ3MDhFMTIwODFDNjJDCiszNjogRUM3MDJERDAyOTNGNEM2NDZCMUM5QzI2MDY3NjI4MTYKKzM3OiAyODk0OTFFNUE2NURDQTYwNUI3OEU4OERBOEE5RjhBQgorMzg6IEQ4MkZCQzE0NDUyQkUzNEM1ODQwREFEODFGQzJBNjVFCiszOTogQjg4QTM0MEVCMUJGOEQ1QURFNkE0RTZDMTYxMDRGQzgKKzQwOiBDOUZDM0Q3MEQyQkEyNkM0MDU5QkQzRDM0MTM0MjY0QworNDE6IDE4Q0UzRDI5MjBFM0JERUZBOTFDMzY5RTlERTU3QkY0Cis0MjogNTA5MTdBRTU4Mjc4RTE1QTE4QTQ3QjI4NEQ4MDI3QTMKKzQzOiBCREE2RjlERTMzNzA0MzAyQ0UwNTY0MTIxNDNCNEY4MgorNDQ6IEMyODc4OThDMTQ1MTc3NDY3NUVCN0E5NjRDMDA0RTBECis0NTogM0JERTczRTBEMzU3MzE5QUIwNkQzNjc1RjFEM0UyOEQKKzQ2OiAzMEZGNDMyNkM4OUMwRkZFNEQzMUQyRTkyQ0MwQkY5QgorNDc6IEY2OTgxNkYzMDRFRDg5MjIzMkYyMjBGMjkwMzIwQThECis0ODogMTM2ODE1M0YxQTU0RUZGOEQ2MUY5M0EyRDZBRjIxRTMKKzQ5OiAwNkREMjc0ODk0QjZFREYzMTU5QTE0MDNGNDdGMDlDNworCitLZXkgU2l6ZTogMjggYnl0ZXMKKyAwOiA3ODI4QjE5OTdEM0QwNTAyMDFEQzZFRTQ1Qzg1MjFCNQorIDE6IDBENzdGODk2RjlDRUYxNkRBQUZDRjk2MkMyMjU3QUFFCisgMjogODlDMjdCMDYyM0Y1RUVDQ0EzOEJBRTFBRDg2QUUxNTYKKyAzOiA0NEVDMDk4MzQwNTIwMDlDQzNDRDY2RTFCQTExQUYwMQorIDQ6IEY5MjJCRkRCMDNGQjE4NkEwNjlDMUU3QjQ4MjIyRTNECisgNTogMjc3Rjc5NzE5NTVEODk4NEFBRUNGMjg3QzMyQjgyMTEKKyA2OiBFNzdFRDAxNDRBM0VEODI3QjcxNDUzQjkxNTYyRkUyNQorIDc6IDE3NjBFRkQwNDQ3N0FFNTI3QkMzN0Y3MkM4QkJCQ0FFCisgODogMjYyNTk0MjVBQ0Q1ODIwN0FFMzI4QjNGMUEyMTdBQzEKKyA5OiAwODc2QzREQzUxRDIyNjU3QzQxMjFFOTA2N0MyQzNCQQorMTA6IDAyMTQ5ODE1OTJDOUNFREQ0RDY1NEY4NEFGMTc5M0E1CisxMTogM0UxMUZBMDI3QkM0RjE1MDQ4RDI3QjE4NzA2MjI1OUEKKzEyOiAyNEU3RDYxQkIyMUVBOTBCNTI4MkI0M0FBRkIwREJEQworMTM6IDY4OEY1NkVDQjQ1QjdDMjQyMDAwNjUzNDYwRjA0QTIzCisxNDogREZBNTg3NTAxQTg3NUFDREU4Njg3QTA0QUU0MDQ4NjEKKzE1OiA0QzIxQ0MzRkJCNzY4Q0M5QUYyMjQyRkEyMDZGRTQwNgorMTY6IDVDQTBCMDNGQTc3NTFERUJCRTcwQ0IyMUFBNjE3NjVBCisxNzogNDg3OUIzQUMyNjI3MEM0MjI2NDVCOUNBMjlDQUQ4QkIKKzE4OiAyNEY5NDFFMUI5QUY4NEMxOEQwMzg4NUVBQUNFMTZFMworMTk6IDA1RTE2M0EwMTUwMTIzQzI2NjQxMzFBODFCMjBBRkMxCisyMDogRDYwNkNBQTg1MzYyRTIzNTk4RTVCOEJENjBDNjA1MDYKKzIxOiAzM0JEMEFFNzUxMDE5QkI3NTFDMTUxQUU0N0JENTgxMQorMjI6IDc1REE1MjNGNUY3OTNGOTAwMzQxNDRBMzU5OURDNUU2CisyMzogQ0Q0NzA5QjU2NTIxRUEzMDZGNUFEOTVDQ0E4NzgxODMKKzI0OiA2QTRFQzJFRERFQkJCRkVCNjJDMUYxM0Y3QTU5QkYyMAorMjU6IDJBMzYyNzJEQzRFRkRGQzAzRjREQ0YwNDlFRDJBREZGCisyNjogRkQ0RjM5MDRFOEUzN0U3QzMxNTA4RTU4Mjk0ODI5NjUKKzI3OiBCQTY0QkFFMUMyQUJCODU5OUEzMUIyNDVEQkFEMTE1MworMjg6IDc1N0UwMTUxNzgzQTUwRkM5MkFFNTU4NjFEQ0Q3OTdECisyOTogNUU2M0JEQTMyMTdFQ0I1NDQ5NzJDQTE0QTkwNzREQTUKKzMwOiBFNTJGMTE5NTkyMTc2N0ZBMjQxMEJBMDk1RUE1QzMyOAorMzE6IDZEN0U0MkQ2N0UzMjlENjY5Mjk5QjVBNTkwMDE3RThECiszMjogMDUxNkY2RjdEOTlBREU1REM0MkU2MzVCQjU4MzJFODAKKzMzOiA1N0ZCNEU2QjgyRUQyQTMwOTEyNDhEQ0VGOUMyN0YxNAorMzQ6IDI1MjMxRDBFOUI5NjUzNDk3N0QyRjJBRjkzREQxMEFCCiszNTogODQ3QzRDNTI0QTU4NjU2OEQxOUVGQTNFQ0EzNDNGMUMKKzM2OiA1MjQ0ODgxNDA2NEUwRjMzQTRFQTg5MzY4QzJFMUFDQworMzc6IDQ2MTI3NTQ2NkZBQTdCQzE2QUJBRDlFQzQ1OUJENjdBCiszODogMTZDODMyNEEzODNBMDBEQTA2REJFQzQxOUI2OUM1NTEKKzM5OiA1RjI2RjdDRjcxNUZGMjY0OURDQzNDNzFFQjZCOTJERgorNDA6IDU3NTM2MzQxMUZCMDdDMDY3Q0Q0MzU3QTFDRDFENjk1Cis0MTogQUI3MEYwOEJBQjUxQzVGNTcxMzlBMTA3RUU4NThBMTIKKzQyOiA4ODdGNjJBRTNENzAwRUM1MzIzRURBMjMxQzZCNEM0OAorNDM6IDdCOTg1MUIwMURDOTA4MzI5M0YzQjIyNjY5MEE1NEY0Cis0NDogMzZFMDNERjUxQzU3NEUzNUVGMjA3N0RCN0E0OTU0OEUKKzQ1OiBFMjM4QTU2NDI0NkIxNjNGOTdFREQ3MzNBMjM1RURFQgorNDY6IDMwNjc5Q0UwODA5MTVEQzNCRkE5MUQwREFGRjVFODJFCis0NzogN0MyRTgxNDVEODAzRDRGRTE4RUUzMjk5NUFBQzE2QjAKKzQ4OiAyNEQ2RjYxRUNDODcyMDY4MDQ4ODVEMzNCRkE3QjJDQQorNDk6IDFGNEY4MTc1MUNCM0ZBRkRDOUY5QzI3RTYzOUYzNzBCCisKK0tleSBTaXplOiA0MCBieXRlcworIDA6IDMxQzMyMjFDMjE4RTRDQTE3NjJCMERFNzdCOTY0NTI4CisgMTogMEI2RTRCRDkzNzc3MzU5NzY0N0ZGRTBBMzg1OUJCMTIKKyAyOiA2N0ExMTZFNUY3NjI2MTlERTcyRjk5QUQxNTYyQTk0MworIDM6IEI2QTg0MTY2M0ZCNDY2QUNBRjg5QzhEQTVCQTA4MEYwCisgNDogMDQ0MjcwOEJGODA0NjQyQjlCMUM2OUY1RDkwNTgxN0UKKyA1OiBCQzc3MzkxRUFCNTMwQjk2Q0EzNTMxOUU1MTBEQjMwNgorIDY6IEFFRDM3OTkxQTUwQUVDQjcwQzFCOTkxMzdENUIzOEYyCisgNzogODczNUY3QUYwQkY2QzVDN0UzQzk4MDIxRTgzQTMxRUUKKyA4OiBBNjE0MjQzQjFCODcxRDgwQkRDRTRBMjNBRDAwRjlGQQorIDk6IDE2QUM2N0IxMzlBOTJBRDc3Nzg3MUM5OTBEM0RBNTcxCisxMDogQjE3NzRBMkExMkE4Q0FCMjVEMjhBNTc1QjY3Q0VGNUQKKzExOiA0QzlCMUExMjBCQzZBMzNDNjJBRjkwM0ZFRUMzQUY1RgorMTI6IDdCMTI4RjAwNDgwRTQ5N0M1NzU0RUUzMzM0NTdFRTVFCisxMzogQUI1NkQ1NzgyMjk0OTJCOTVFRDMwOUMwRUM1NjY2NTgKKzE0OiA0MkZBRjU3Nzg1NUZFREIzNDQ2RDQwQjRCNjY3NzQ0NQorMTU6IDg0RTBDMTlCNEE0NTEyMDAxRjY2M0UyMkQzMTg0RjBBCisxNjogOEIwMTY4MEQwNDlGNUE5NDIxQkE5QkVEMTAwQ0MyNzIKKzE3OiAyQjFENzBCOTJBNURGMTJDRTBGQTZBN0FBNDNFNENFRQorMTg6IEM3RjYxMzQwRDFCMjMyMUExODg0RTU0RDc0NTc2NjU3CisxOTogMTUzQzA3QzU2QjMyNTMwODY2NzIyQzRERUFDODZBNTAKKzIwOiAyRUFDQkVGQzRBMjlEMTI1MEVFQUZEMTJBMUQ0QUU3NworMjE6IEZDQ0I0MEIwOTk3RTQ3NTEyMjk1MDY2RjFBMDM0NERECisyMjogQzE0OUE1NDMzNDVFMkExQjgyNDlGNzFDQjlGOTAzQTQKKzIzOiAzRkQwNjg4QThEMEJFNUYwNkYxNTdDMjM0QzI5QkY5QQorMjQ6IDZBM0Y4MTNGMzk2RDc3QzdGNDY0MUVDQzNFMEJGM0FBCisyNTogRTI4ODhCOUQyQTZEODE5MzY3RjYxQzU3OTI4NjZBOEYKKzI2OiAxQThBMDAwRjkxQUY0RTYwMERERDg4RTA5OEJEOTM4QgorMjc6IDIyODNFNzU4QzA0NTQ4RUY4QzM3RkE5RjU3MDBBN0FECisyODogNEZENkQ4RTE2NzhEMkI4NTUyMEI5NkMwMzhDNTgyQkYKKzI5OiBEMTNDMEIyMjhGNzkyRUY4OEYwOUVEMTkyQzU3MTAyOQorMzA6IDFBMkEwNkIxOTg3QkUwREFEQTRCNTU4QUU1RTZBMTI4CiszMTogMDk3QjA0NjBDNDdGMTgwMTk4NkY1NzA2QTY5RUIwMUMKKzMyOiBERDE3QkFDMDczNzUxNUM2Mzg2RUNBNkE2RDZDMDJCNgorMzM6IDU5ODlCRDFENDZGRDZFQzE0RDRDNTVENUQ2RDE3Rjk5CiszNDogNDMxMDAyRTAyMjRCRDM0QjBCOTM5ODgzNTZDMTlFN0MKKzM1OiAzN0RCNzU3MDI5NkRDQ0U0NUFCRERFMzZFQkU0NzMxRAorMzY6IDQ3MzFERTc4RUVCQUExRDAyNTY4RUVFQTJFMDRBMkY1CiszNzogMUY4Nzk3NTNBNzk2NEFGNDRDODRGRDU3NjVEOEUwODAKKzM4OiA1NEYxMjA3MjZGNjhFQTRCMDUwMTM2NUNEMkE4NDc1OQorMzk6IDM2NkU0M0JCNzQ0QzYxNTk5OUU4OTZEMDFBMEQxRDBFCis0MDogMTg3NDdCRDc5RjFEMDUyOUQwOUNBQzcwRjREMDg5NDgKKzQxOiA0Rjk4NTRCQUUwODM0QTBDNUZEMTIzODEyMjU5NThGMgorNDI6IDdDMTRBREY5NEEwQjYxODI4OTk2RDkwMkU0Q0NGRjNFCis0MzogMjQyRjBFOUNFOTZFNEUyMDhBOUUwQzVENzZGOEU2OTgKKzQ0OiAyN0VFMTc5RTJBOTMwMUI1MjFCMkM5NEVEM0QzNkE3NworNDU6IDg5MkM4NEE1RTc3RTg4QTY3RjVGMDBGMzU5N0Y0QzA0Cis0NjogRkM3ODgwRDc4NjBFOTBERTE3RTkzNTcwMEZDOEMwMzAKKzQ3OiBCQzQ5MzczRjc3NUJGOUNENkJEQzIyQzg3RjcxRTE5MgorNDg6IDM2NTY0NkQwREUwOTJBRjQyRUM4RjEyQTE5ODQwMzQyCis0OTogNjJEMEU5QzIxMEEyMEVDRDJGRjE5MUFEMzQ5NURFNkYKKworCitDaXBoZXI6IGtoYXphZAorS2V5IFNpemU6IDE2IGJ5dGVzCisgMDogOUM0QzI5MkE5ODkxNzVGQworIDE6IEY0OUUzNjZBRjg5QkQ2QjcKKyAyOiA5RTg1OUM4RjMyMzY2NkY5CisgMzogMzQ5RUM1N0EwMjQ1MTA1OQorIDQ6IDU5RTM0Q0YwMzEzNEE2NjIKKyA1OiA0MzZDMTZCQUI4MEUzRTJECisgNjogODFDMzUwMTJCMDhBMTk0QworIDc6IDA1NkNDQzk5OTFDMUYwODcKKyA4OiAwQTU5RjI0QzQ3MTVCMzAzCisgOTogM0MyQ0ZGOThBRTg1MDBGRAorMTA6IDkxMzZDM0ZDQzMzMkQ5NzQKKzExOiBGQTNGQTcyNkU2QkVCQTY1CisxMjogREQ4NEU0RjlGMzlGQjdFRQorMTM6IEEzRjM5N0NDOUZCNzcxRjUKKzE0OiBFMkQ2RUNDMUY0MEE1MUM3CisxNTogNjcwNEExQTcwNTE2M0EwMgorMTY6IEJEODIwRjVBRjdERUVCMDQKKzE3OiBFMjFFMzdDQzEyMjAyN0ZGCisxODogRTMxOTA4NUQ4RTJDMUY0RgorMTk6IDBEREZFNTVCMTk5QTQ5QTkKKzIwOiBCNzBGMzlDQ0NCMkJBOUE2CisyMTogM0YyRjI1NzIzQUVEMkUyOQorMjI6IDc1MUZBQ0Q1RjUxN0FCMkYKKzIzOiBEMzJDRTU1RkJGMjE3Q0U5CisyNDogOTEzOTMwMThFQTg0NzAxMgorMjU6IEQ1MEYxQzU0QkFCRTcwODEKKzI2OiBDNzMzNTBGQkM1QjNBODJCCisyNzogRTlBMDU0RjcwOUZENUM1NworMjg6IDk0QkQ1MTIxQjI1NzQ2RDQKKzI5OiBFRTE5Rjg4QjI4QkVCNEI3CiszMDogQ0U2ODQ1RkQxM0EzQjc4QQorMzE6IDU2NjcyOUQwMTgzNDk2QkMKKzMyOiBEQzBFMUQzOENCNUUwM0E4CiszMzogMjUxQUQyQjI4NDJDNzVFMworMzQ6IEQzNDRBQzQxMTkwRjM1OTQKKzM1OiA1NzlCOTU2QTM2QURBM0E4CiszNjogNUY4M0QzQUZFRTlBNkYyNQorMzc6IDJEM0ZGODcwOEEwM0M2MDAKKzM4OiAzMkE3MzJDN0JFRUJCNjkzCiszOTogRjQzNzI3NkZBQTA1QkIzOQorNDA6IDU4RERENENEMDI4MUM1RkQKKzQxOiBFQ0MyQzg0QkQ4QzBBNERDCis0MjogQkFCMjRDMkNFRkUyMzUzMQorNDM6IDUyNDRCRkEzRTI4MjFFN0QKKzQ0OiBBNEIyNzNFOTYwOTQ2QjJDCis0NTogMDM5Mzc2RDAyQThENjc4OAorNDY6IEQzRUI3MDc0RTNCMDUyMDYKKzQ3OiA4OUMxOEZGQTI2RUQwODM2Cis0ODogMUYwNUEyRDJENzg5MjdEOQorNDk6IDAxMzNFMTc0NTg1NkM0NEMKKworCmRpZmYgLS1naXQgYS9ub3Rlcy9lYXhfdHYudHh0IGIvbm90ZXMvZWF4X3R2LnR4dAppbmRleCBiZjRhNTJhLi45NWNkN2MxIDEwMDY0NAotLS0gYS9ub3Rlcy9lYXhfdHYudHh0CisrKyBiL25vdGVzL2VheF90di50eHQKQEAgLTE5OSw2ICsxOTksODIgQEAKICAzMTogMkRDMjZENDQ5Mzc5OTk3RDExMDMwOUIyQTBEQzI3NjBGQ0U4Q0FEQjRCMTRFRDU4MEY4NkM3MEY2OUM5QkEsIEVGQ0I2MEVCMkIyNTczN0UyNTZCQzc2NzAwQjE5OEVGCiAgMzI6IDJCMTg5MEVCOUZDMEI4MjkzRTQ1RDQyRDIxMjZGNDA3Mjc1NEFBNTRFMjIwQzg1M0M1RjIwRkJBODZCRTA3OTUsIDFBMUIxNUJCQzI4NzM3MkZCOUFGMDM1RkIxMjRCNkExCiAKK0VBWC1zYWZlci1rNjQgKDggYnl0ZSBrZXkpCisgIDA6ICwgOTA2NTExOEM4RjZGNzg0MgorICAxOiBBMSwgMTkyNkIzRjUxMTJDMzNCQQorICAyOiAyRTlBLCA1RkE2MDc4QTBBQTdCN0M4CisgIDM6IDU2RkNFMiwgOTg0RTM4NUY5NDQxRkVDOAorICA0OiBDMzNBQ0U4QSwgMjRBQzFDQkJDQ0QwRDAwQQorICA1OiAyNDMwN0UxOTZCLCBERDJENTJFRkNBNTcxQjY4CisgIDY6IDMxNDcxRUFBNTE1NSwgRUI0MUMyQjM2RkFBQTc3NAorICA3OiAwM0QzOTdGNkNGRkY2MiwgN0RGQkM4NDg1QzhCMTY5QgorICA4OiA4RkEzOUUyODJDMjFCNUIyLCAyQzdFQzc2OTk2NkIzNkQ3CisgIDk6IEZFQTU0MDJEOUE4QkUzNDk0NiwgQTA1OEUxNjVCNUZGQjU1NgorIDEwOiA2Q0RFRjc2NTU0Q0E4NDUxOTNGMCwgRkVENTE2MDAxRkZFMDM5QQorIDExOiBEQzUwRDE5RTk4NDYzNTQzRDk0ODIwLCA4RjlDQ0YzMjM5NDQ5OEExCisgMTI6IDQyRDhEQzM0RjE5NzRGQjRFQjI1MzVENywgNzdGNjQ4NTI2QkNCQjVBRgorIDEzOiBCNzVGMTI5OUVGNjIxMUE2MzE4RjZBOEVBQSwgQzUwODZBRUExQkU3NjQwQgorIDE0OiAxRTI4RDY4MzczMzMwODI5REQxRkZDNUQwODNFLCAzM0VEQTA2QTdCNTkyOUEyCisgMTU6IDg1NTI5Q0Y4N0M0NzA2NzUxQjBENDdDQzg5Q0VBNiwgRDAzMTkwNUQ2MTQxQ0JFRAorIDE2OiBGRTVDQjYxQkFGOTNCMzBFRDNDMjk2RUU4NUY1MTg2NCwgQ0M0ODQ4ODhGMEFCRDkyMgorCitFQVgtc2FmZXItc2s2NCAoOCBieXRlIGtleSkKKyAgMDogLCA1MjU0QUIzMDc5Q0RDQjc4CisgIDE6IDc1LCA3OThEQ0YxNEZFRjhGNEQxCisgIDI6IDAzMDAsIEQ1RkNBNzVEQUM5Nzg0OUMKKyAgMzogNTIwRjk4LCAxMEUzNTc5NTdDRTIwODk4CisgIDQ6IDgwRTI3NjRELCA1QzdGNDY2NTZDNkE0NkVBCisgIDU6IEM0ODk2MENEQUEsIDNDQ0Y0NEJENDFGMDFDQTgKKyAgNjogRTBFNjBCRDlBQTJDLCBFQkI0OTM5ODNGQ0VFNzlECisgIDc6IEQxM0Q4ODA0OTA2QTFCLCA2RUREQ0E5MTk5NzhGMEI2CisgIDg6IEI3QUUxNEMzN0EzNDNCRkIsIDIzNjlFMzhBOUI2ODY3NDcKKyAgOTogNURFMzI2QkJDQzdEMEQzNUU5LCAwNDFFNUVFODU2OEU5NDFDCisgMTA6IDEzNDk0RjVCMDYzNUJBM0Q2RTUzLCBFQUVFQThBRkE1NTE0MURECisgMTE6IEE5QkIzNUIxNEM4MzFGREEwRDgzRjcsIDQwMDJBNjk2RjEzNjM5ODcKKyAxMjogRTI0MjA0M0ExQzM1NTQwOTgxOUZBQkZDLCA2M0EwODVCODg4NkM1RkRDCisgMTM6IDIwNDU5OEI4ODkyNzJDNkZFNjk0QkRCQjRELCAxOTRBMTUzMDEzOEVGRUNFCisgMTQ6IEVFM0YzOUUwODIzQTgyNjE1Njc5QzY2NERFQkYsIDFFRkY4MTM0QzhCRUZCM0EKKyAxNTogODU3OUQ4N0ZEM0I1RTI3ODBCQzIyOTY2NUYxRDFCLCBBODMyQ0QzRTFDMUMyMjg5CisgMTY6IDc0RDcyOTBENzJEQTY3QzRBOUVBRDQzNEFFM0EwQTg1LCA5NkJBQTYxNUE1MjUzQ0I1CisKK0VBWC1zYWZlci1rMTI4ICgxNiBieXRlIGtleSkKKyAgMDogLCA3RTMyRTNGOTQzNzc3RUU3CisgIDE6IEQxLCBCQTAwMzM2RjU2MTczMUE3CisgIDI6IEY2RDcsIDhFMzg2Mjg0NkNEMUY0ODIKKyAgMzogNTMyM0I1LCBCRDFCOEMyN0IwNjE5NjlCCisgIDQ6IEEzRUMzNDE2LCAxNzBCQkI5Q0UxN0QxRDYyCisgIDU6IDBDNzRENjY3MTYsIDdCRDAyNEI4OTBDNUNFMDEKKyAgNjogNjE1OEE2MzBFQjM3LCBCNUM1QkQwNjUyQUNCNzEyCisgIDc6IDE3RjJEMEUwMTk5NDdELCBGOUZGODFFMjYzOEVDMjFDCisgIDg6IDY4RTEzNUNDMTU0NTA5QzgsIEFBOUVBRUY4NDI2ODg2QUEKKyAgOTogRURCMUFCRTBCNDg2NzQ5QzIxLCAzNTVDOTlFNDY1MUMwNDAwCisgMTA6IERCMEMzMEU5MzY3QTcyRThGNUIyLCA2MzFCNTY3MUI4QTFEQjlBCisgMTE6IEQ0RTU0NTNEOUE0QzlEQjUxNzBGQ0UsIDc1QTJERjAwNDJFMTREODIKKyAxMjogM0Y0MjlDQzlBNTUwQ0JEQTQ0MTA3QUE3LCAyQzI5NzdFQTEzRkVCRDQ1CisgMTM6IEE3Q0EyMkE5N0MyMzYxMTcxQjQxNUU3MDgzLCBCRkU4MTE4NUYzMTcyN0E4CisgMTQ6IDE3MEY3OUQ4QjBFM0Y3NzI5OUM0NDIwOEM1QjEsIEQ1RUQ5Rjk0NTlERjlDMjIKKyAxNTogMkUyNDMxMkQyQUU1RDVGMDlENTQxMDkwMEE0QkJBLCAyRkM4NjVDQTk2RUE1QTdFCisgMTY6IDhGM0M0OUEzMTZCQTI3MDY3RkYyQzZEOTlFQzhDODQ2LCA5RDg0MEY0MENEQjYyRTRCCisKK0VBWC1zYWZlci1zazEyOCAoMTYgYnl0ZSBrZXkpCisgIDA6ICwgMjJEOTBBNzVCQkE1RjI5OAorICAxOiAzRiwgOThDMzFBQjJERTYxREU4MgorICAyOiA1ODRELCBGNDcwMUQ0QTFBMDk5MjhDCisgIDM6IEI5REVBRCwgNkUyMjFBOTg1MDUxNTNEQQorICA0OiAwNkQ0QTZFQiwgMEU1N0M1MUI5NkJBMTNCNgorICA1OiA3QjU4QjQ0MUNBLCBFMjhDQ0YyNzFGNUQwQTI5CisgIDY6IDc5NTBFMEQxRUMyNCwgMkFDRERFNkUzODE4MEMwNworICA3OiA2NUE0RjRFMDk4RDdDNiwgN0RDMUM5RTk2MDJCQUNGMgorICA4OiBGRUJFNEU3MkJBQTA4NDhGLCBDNDYwN0VBM0YxMzhCQUQ5CisgIDk6IDlCN0JENkQ2RDY1NTk4NUFBMywgOEIyQzU4QTk1MzBFQTZBQworIDEwOiA2MEM5MkY5MjVEMTQ3ODQ3MDIwMywgNTFFNkY1RjZEQzk5NkY4NAorIDExOiA3QjQwNzY5MzcwRTY1MUY2NEFBNjU0LCA3NEYxRjhBOEQzRjRCOUFGCisgMTI6IDcyMTU4MzJDMkZCOUM1NERGN0E5QzY4NiwgOUJGOUFFRjE0RjkxNTFEMQorIDEzOiBBRDBGOUM3OTAwODU3MkFCOEFFMjQ2NkVGRiwgRjM3NUQwNTgzRDkyMUI2OQorIDE0OiBDMDUwNzZFMkMzMzBBMEQyNUQ3Q0VDODA1OTdGLCA4NDNDMTJGODRCMDBBOEUwCisgMTU6IEQxOEYwNTYzQUIwMjc4MTQwQjBDRDlBOUIwN0IzNCwgMjYyQjE2ODhFMTZBMTcxRQorIDE2OiA2NTA3NDcwOTFGNUM1MzJFRTM3RDJENzhFRTFFQzYwNSwgMUJBQzM2MTQ0RjlBMEU4RAorCiBFQVgtcmMyICg4IGJ5dGUga2V5KQogICAwOiAsIEQ2Q0M4NjMyRUVFMEY0NkIKICAgMTogNEMsIEVBMTk1NzJDQjg5NzBDQjQKQEAgLTMyOSwzICs0MDUsNTcgQEAKICAxNTogMDdBRjQ4NkQxQzQ1OEFBQjJEQkYxM0MzMjQzRkFELCA4NzI4OEU0MUE5RTY0MDg5CiAgMTY6IDg0MDU5MjgzREY5QTJBODU2M0U3QUY2OTIzNUYyNkRGLCAzNTE2NTJBMERCQ0U5RDZFCiAKK0VBWC1hbnViaXMgKDE2IGJ5dGUga2V5KQorICAwOiAsIDhFMjBGMTlEOUJBMjJBQkEwOUZCODZGREU2QjlFRjM4CisgIDE6IDNCLCBGNDIwMUU1NDZBOTE2MEY5ODkxOTE5NDJFQzhGRDFEMworICAyOiA5RjM4LCA0RTNDRUFFM0UxQ0I5NTRFMDIxQTEwRTgxNEI3MTczMgorICAzOiA0RjQ3NjksIDNFOEYzNUE2QTVCMTEyMDBFOUYxQUEzODU5MDA2NkNECisgIDQ6IEFCNDFGNUZDLCBFQzRDOTdBODg5MkFBRjU0MzMxMDZENEFDOEE0OTg0MworICA1OiA0MTRGOTVENjFCLCBCRjgzMUUzNEQxRTNGRUNCOTczQThDNzMwRUNBMkU2RAorICA2OiA0Nzk4MzIyRjA2RDEsIDAwNUJCQzMwQkZFREJFNjQ2MzUzNkM0RjgwRDFBMDcxCisgIDc6IEYyNTZCNkNEMUJGNEY1LCA0NjhBMjhGMDY2MTg4NEI4NDZCMTkxQjUzMEM4RDA2NAorICA4OiA5MDkwNkYyN0E2MzNBRERFLCA2RDkyMDBBMzdBN0Y2QTQ1NkNCMTAzNjczMTg0QzJFNQorICA5OiAxNkNEM0MxN0M5QjRFQUIxMzUsIDZENzE2RTIzRDdCMzUxMDlGNTVCMDM2RURGQTc3NDJFCisgMTA6IDdBRDFDMjJGMUYwNjI5OERGQjI1LCBCMDc2OTkwRjgxOTM1NDNDOEYzMTg1RDM3OTJCQ0U1NgorIDExOiAwNDc2RjJBQkNEMDU3RkU2RkVFMzlELCBCQjI4NzZEQjE4QzAwMDM4RkFEQkJEOUIyNjRBQ0MzQworIDEyOiBCNjlFREUzMzY0MDdEQkMyRUU3MzU4NTcsIEFCNjNFNTkwNjExNkE4QkUyMkM1MkI1REEzMUIxODM5CisgMTM6IEMzODY0QzEzNTQwNjVBNTY0NzA2NjlFNjAyLCBDNzJCRkQzQTBCQzczQkZGMDUxQzlBQjJGMERGRUQ5MworIDE0OiAyOTZEOEYxODNBNTkwMjBEMzM4OTA0MjBERDdCLCBDOUQ5MEI5RUI0MkMzMkVEQ0Y2MjIzNTg3RDE1OThBNgorIDE1OiAyNTZFRDhFOUQ5ODI2MTY2ODA1NTk5NzlCREYyRTksIDE3OUZFNEU3QkE3RTk2NjA1MEQzNTkwMDMxN0U5OTE2CisgMTY6IEQ0RUQ4RjMwRkY5QzA0NzBENzVCM0IxNjc1MEEzQUU0LCA1RDUwRjA1QkIyNzBBMjkyREZGOUY2N0EzQkE4NDY3NQorIDE3OiA0MENERUI2Mzg4Mjc0MTQzQ0EzQzRGNjAyMEJEOUE0ODc1LCBCMjdDN0RGQjFCRkJCM0ZDQ0VFMDE3MTg1MkM3OTI0RQorIDE4OiA1NEVGMjYyRUMxODAxRDUwNUM3NjI5RDAzODY1NEVCQTA1OTQsIDlEMjA2MEZDRDBBMkM1Nzc1MTFDNzc1MkFERTYwQkJFCisgMTk6IEYzOUVFNTRBMzdGMTZERDM4QjYyNEQ3QUI4RjBEOUNCRDRCOTgxLCBCQzA1NkM3RDJDMDlEODEzNzAzQ0RENjNDMUM2OUY0NAorIDIwOiBGNEU3QUQ0NzRGQ0ExNTNBQkQ2NzBFNDMwODFFRDA5RUIyQzRDQzFBLCBGMjQ0QkQ0RDYzMDI3MkYwRDk4RkNBMDQyMjZDMDRGMQorIDIxOiAwMzlFQ0MzNkEwQTE2MjczRTcyNDZDQTFGRjE5RDIxM0FDODdCNTNGMjksIDMwNTZEQjY5MTZDOTI1REYyMjBCNkM5OTgwRUUxNDFBCisgMjI6IDdERTFEQ0RFRjAxNDQ3Q0EyRkU4MzM3NUE0OEREODRFNEE3Q0I3QzAxOTkyLCA3OUFGRUE0ODE2RUFGOERBQzhBNUU5Mzk2MEYxNTk0RgorIDIzOiBBODg2QzRCOTE0QkYwOTgzMDAzMjcyRjIyNkY5QjIxOTdFRjJEQzA1QUNEREUwLCBCNTlEODVBMEZEQTVGQTQ0MjJGNzIwM0MwNTVCOTdBOQorIDI0OiAwMEIzRTFFOTE0NDhFMjUwQUFGQjY5NUMwNjQzQTY1NzdBQjQ1M0VGRUNGQUJGNTMsIDRBN0VGRjFDQkMxQUI1MzUxMjJBMDE3MjAzNjE2RDg1CisgMjU6IDg1RTk3MkU3NzRENjZEMDUzMUU0MEI4RkU5RTI2NEE3N0I1MEZBODgzQUIwOTQzMDgwLCBCMThFMTY0QkY4OUI3RTdBQjBEQzI1NkRGRUM3QzcyRgorIDI2OiAwMDQ4NDlFMzkzMzQ5NjlCMzkyQ0IwQ0YzRkRFRkIzRDc5MkRDQkJDMTVGODMyOEM3RURDLCAzQzUxMjk1NzExRjVGODc4REU4RjBCMkI1QTI2QTIyNworIDI3OiBBMEJBRDZDMjI2NEFCMTU3ODk5M0JBNDlFNTlENDU5ODgyMkZGRUQyMEE1N0Q4OEY3NTZGRjEsIDJFQjlENTI1Njk3QTQxOUExMERCMkE4NEFFRUE1RkJDCisgMjg6IEMzNEREODA2RUFCNUFEODIzRDc4QkNBNzhBNzcwOUE3MDVGQzk0RUNDNTIxQTM2N0Q3NkM5NTg4LCAzQzU3NTgwQzc5MDMwMzlENjQ1QzA2REJBRjA3QjQ3NworIDI5OiBDNDQ3RUM3NzUxMjkzOENGNzg2MjM4OEMzMkFGMjJBQ0U2QjVFNENCQUE5OThCRTRGNUNCQzREMjE1LCA0MzQyNUQwOUI3QUNGRDkwMzcxQzA4OTUzOTQ2QTk1NQorIDMwOiAyQzE2OTkzQUFFNjI0Q0JBNENEQUYzNEZFM0QzNjg1NTlFNkJFNTQ4MjkyQjI4MTQzOTg2NjM3NTAxM0IsIDNCNzM2MEMzRkE4RkIxQzE1RDE5RjU2NzE1M0NCNDZDCisgMzE6IDUzOEU1REZBRjE0ODU0QTc4Njg1MUU0MTY1RjJFMDFDRERBOTYzRTMxOEZDRTRGQjU4RTMxQTZCNUNGQzMzLCAyRjhFQTEzQjdBNjg3M0ZFNTU2Q0E1MzVBQkEwOTY4QgorIDMyOiA1RTI5Q0RCN0Q5Njk1QTExMDA0M0U5QzI2MDEwNEJERjAyMEEzQTJBMTM5RDQxMTJFOTE4QUI1ODRCREQ3RURBLCA5MTMzMjEzQUE3QkNGMDYyRDJCRDM3Rjg2NjY4M0QzRgorCitFQVgta2hhemFkICgxNiBieXRlIGtleSkKKyAgMDogLCA3NTk2OEU1NDQ1MkY2NzgxCisgIDE6IDk1LCBBREFGNTk0OUYwOUI1QTIyCisgIDI6IDZCOEYsIEEwNkIyMDE5NDc0MjRBMTEKKyAgMzogNUJFNjY4LCAzMjUxNDE2NjI1REYzNDdBCisgIDQ6IDVBOTJFODJCLCAzM0UyNTc3MjQyN0Q5Nzg2CisgIDU6IDYyRjlGMkFCQ0MsIERFNzE0RjVGNUQxN0Q2RDAKKyAgNjogMEUzQ0Q4MjVCRDhELCBBNzk5MUM4Q0I4OTc1RUQ5CisgIDc6IDRBRDBEOTk5NTAzQUFELCA1M0E4MjdENzg4NkY3MjI3CisgIDg6IEJCMDhFNkZBRUQxREFFRTgsIDkxQTExODc0OUI3QUI5RjMKKyAgOTogMTZFMzBDQjEyRTIwRDE4NDk1LCBGOEY4QjhDMTI4MDE1OEY5CisgMTA6IDYxNkRCQ0M2MzQ2OTU5RDg5RTRBLCA1MDZCRjM1QTcwMjk3RDUzCisgMTE6IEY4NkIwMjJENEIyOEZEQjFGMEI3RDMsIEVBNDIyMjBDODA1RkQ3NTkKKyAxMjogOUI4QTNEOUNEQkFERDlCQkNDQ0QyQjI4LCBCQjQ3OEQzQ0U5QTIyOUM5CisgMTM6IENEQzRBQjRFRjJENUI0NkU4NzgyNzI0MUYwLCA2NThFREI5NDk3QTkxODIzCisgMTQ6IDFBMTEzRDk2QjIxQjRBRUJEQjEzRTM0QzM4MUEsIDYzQUQwQzQwODRBQzg0QjAKKyAxNTogMTREQTc1MUU1QUY3RTAxRjM1QjNDRTc0RUUxQUNGLCAzQzc2QUI2NEUxNzI0RENFCisgMTY6IEExM0JCQzdFNDA4RDJDNTUwNjM0Q0JDNjQ2OTBCOEZFLCAzRDRCQkMwQzc2NTM2NzMwCisKZGlmZiAtLWdpdCBhL25vdGVzL2V0Yy9zYWZlcnBfb3B0aW1pemVyLmMgYi9ub3Rlcy9ldGMvc2FmZXJwX29wdGltaXplci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZGU4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9ub3Rlcy9ldGMvc2FmZXJwX29wdGltaXplci5jCkBAIC0wLDAgKzEsMTc3IEBACisvKiBlbWl0cyBhbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBTQUZFUisgLi4uIG9ubHkgZG9lcyBlbmNyeXB0IHNvIGZhci4uLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyogVGhpcyBpcyB0aGUgIkFybWVuaWFuIiBTaHVmZmxlLiAgSXQgdGFrZXMgdGhlIGlucHV0IGZyb20gYiBhbmQgc3RvcmVzIGl0IGluIGIyICovCisjZGVmaW5lIFNIVUZcCisgICAgYjJbMF0gPSBiWzhdOyBiMlsxXSA9IGJbMTFdOyBiMlsyXSA9IGJbMTJdOyBiMlszXSA9IGJbMTVdOyAgIFwKKyAgICBiMls0XSA9IGJbMl07IGIyWzVdID0gYlsxXTsgYjJbNl0gPSBiWzZdOyBiMls3XSA9IGJbNV07ICAgICAgXAorICAgIGIyWzhdID0gYlsxMF07IGIyWzldID0gYls5XTsgYjJbMTBdID0gYlsxNF07IGIyWzExXSA9IGJbMTNdOyBcCisgICAgYjJbMTJdID0gYlswXTsgYjJbMTNdID0gYls3XTsgYjJbMTRdID0gYls0XTsgYjJbMTVdID0gYlszXTsgbWVtY3B5KGIsIGIyLCBzaXplb2YoYikpOworCisvKiBUaGlzIGlzIHRoZSBpbnZlcnNlIHNodWZmbGUuICBJdCB0YWtlcyBmcm9tIGIgYW5kIGdpdmVzIHRvIGIyICovCisjZGVmaW5lIGlTSFVGKGIsIGIyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIyWzBdID0gYlsxMl07IGIyWzFdID0gYls1XTsgYjJbMl0gPSBiWzRdOyBiMlszXSA9IGJbMTVdOyAgICAgIFwKKyAgICBiMls0XSA9IGJbMTRdOyBiMls1XSA9IGJbN107IGIyWzZdID0gYls2XTsgYjJbN10gPSBiWzEzXTsgICAgICBcCisgICAgYjJbOF0gPSBiWzBdOyBiMls5XSA9IGJbOV07IGIyWzEwXSA9IGJbOF07IGIyWzExXSA9IGJbMV07ICAgICAgXAorICAgIGIyWzEyXSA9IGJbMl07IGIyWzEzXSA9IGJbMTFdOyBiMlsxNF0gPSBiWzEwXTsgYjJbMTVdID0gYlszXTsgbWVtY3B5KGIsIGIyLCBzaXplb2YoYikpOworICAgIAorI2RlZmluZSBST1VORChiLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiWzBdICA9IChzYWZlcl9lYm94WyhiWzBdIF4gc2tleS0+c2FmZXJwLktbaV1bMF0pICYgMjU1XSArIHNrZXktPnNhZmVycC5LW2krMV1bMF0pICYgMjU1OyAgICBcCisgICAgYlsxXSAgPSBzYWZlcl9sYm94WyhiWzFdICsgc2tleS0+c2FmZXJwLktbaV1bMV0pICYgMjU1XSBeIHNrZXktPnNhZmVycC5LW2krMV1bMV07ICAgICAgICAgICAgXAorICAgIGJbMl0gID0gc2FmZXJfbGJveFsoYlsyXSArIHNrZXktPnNhZmVycC5LW2ldWzJdKSAmIDI1NV0gXiBza2V5LT5zYWZlcnAuS1tpKzFdWzJdOyAgICAgICAgICAgIFwKKyAgICBiWzNdICA9IChzYWZlcl9lYm94WyhiWzNdIF4gc2tleS0+c2FmZXJwLktbaV1bM10pICYgMjU1XSArIHNrZXktPnNhZmVycC5LW2krMV1bM10pICYgMjU1OyAgICBcCisgICAgYls0XSAgPSAoc2FmZXJfZWJveFsoYls0XSBeIHNrZXktPnNhZmVycC5LW2ldWzRdKSAmIDI1NV0gKyBza2V5LT5zYWZlcnAuS1tpKzFdWzRdKSAmIDI1NTsgICAgXAorICAgIGJbNV0gID0gc2FmZXJfbGJveFsoYls1XSArIHNrZXktPnNhZmVycC5LW2ldWzVdKSAmIDI1NV0gXiBza2V5LT5zYWZlcnAuS1tpKzFdWzVdOyAgICAgICAgICAgIFwKKyAgICBiWzZdICA9IHNhZmVyX2xib3hbKGJbNl0gKyBza2V5LT5zYWZlcnAuS1tpXVs2XSkgJiAyNTVdIF4gc2tleS0+c2FmZXJwLktbaSsxXVs2XTsgICAgICAgICAgICBcCisgICAgYls3XSAgPSAoc2FmZXJfZWJveFsoYls3XSBeIHNrZXktPnNhZmVycC5LW2ldWzddKSAmIDI1NV0gKyBza2V5LT5zYWZlcnAuS1tpKzFdWzddKSAmIDI1NTsgICAgXAorICAgIGJbOF0gID0gKHNhZmVyX2Vib3hbKGJbOF0gXiBza2V5LT5zYWZlcnAuS1tpXVs4XSkgJiAyNTVdICsgc2tleS0+c2FmZXJwLktbaSsxXVs4XSkgJiAyNTU7ICAgIFwKKyAgICBiWzldICA9IHNhZmVyX2xib3hbKGJbOV0gKyBza2V5LT5zYWZlcnAuS1tpXVs5XSkgJiAyNTVdIF4gc2tleS0+c2FmZXJwLktbaSsxXVs5XTsgICAgICAgICAgICBcCisgICAgYlsxMF0gPSBzYWZlcl9sYm94WyhiWzEwXSArIHNrZXktPnNhZmVycC5LW2ldWzEwXSkgJiAyNTVdIF4gc2tleS0+c2FmZXJwLktbaSsxXVsxMF07ICAgICAgICAgXAorICAgIGJbMTFdID0gKHNhZmVyX2Vib3hbKGJbMTFdIF4gc2tleS0+c2FmZXJwLktbaV1bMTFdKSAmIDI1NV0gKyBza2V5LT5zYWZlcnAuS1tpKzFdWzExXSkgJiAyNTU7IFwKKyAgICBiWzEyXSA9IChzYWZlcl9lYm94WyhiWzEyXSBeIHNrZXktPnNhZmVycC5LW2ldWzEyXSkgJiAyNTVdICsgc2tleS0+c2FmZXJwLktbaSsxXVsxMl0pICYgMjU1OyBcCisgICAgYlsxM10gPSBzYWZlcl9sYm94WyhiWzEzXSArIHNrZXktPnNhZmVycC5LW2ldWzEzXSkgJiAyNTVdIF4gc2tleS0+c2FmZXJwLktbaSsxXVsxM107ICAgICAgICAgXAorICAgIGJbMTRdID0gc2FmZXJfbGJveFsoYlsxNF0gKyBza2V5LT5zYWZlcnAuS1tpXVsxNF0pICYgMjU1XSBeIHNrZXktPnNhZmVycC5LW2krMV1bMTRdOyAgICAgICAgIFwKKyAgICBiWzE1XSA9IChzYWZlcl9lYm94WyhiWzE1XSBeIHNrZXktPnNhZmVycC5LW2ldWzE1XSkgJiAyNTVdICsgc2tleS0+c2FmZXJwLktbaSsxXVsxNV0pICYgMjU1OyAgICAgICAgCisKK2ludCBtYWluKHZvaWQpCit7CisgICBpbnQgYlsxNl0sIGIyWzE2XSwgeCwgeSwgejsKKyAgIAorLyogLS0gRU5DUllQVCAtLS0gICovCisgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykgYlt4XSA9IHg7CisgICAvKiBlbWl0IGVuY3J5cHQgcHJlYWJtbGUgICovCitwcmludGYoCisidm9pZCBzYWZlcnBfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KVxuIgorIntcbiIKKyIgICBpbnQgeDtcbiIKKyIgICB1bnNpZ25lZCBjaGFyIGJbMTZdO1xuIgorIlxuIgorIiAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTtcbiIKKyIgICBMVENfQVJHQ0hLKGN0ICAgIT0gTlVMTCk7XG4iCisiICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpO1xuIgorIlxuIgorIiAgIC8qIGRvIGVpZ2h0IHJvdW5kcyAqL1xuIgorIiAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKSB7XG4iCisiICAgICAgIGJbeF0gPSBwdFt4XTtcbiIKKyIgICB9XG4iKTsgICAKKworICAgLyogZG8gOCByb3VuZHMgb2YgUk9VTkQ7IExUOyAqLworICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgeworICAgICAgIC8qIFJPVU5EKC4uLiwgeCoyKSAqLworICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CitwcmludGYoImJbJWRdID0gKHNhZmVyXyVjYm94WyhiWyVkXSAlYyBza2V5LT5zYWZlcnAuS1slZF1bJWRdKSAmIDI1NV0gJWMgc2tleS0+c2FmZXJwLktbJWRdWyVkXSkgJiAyNTU7XG4iLAorICAgICAgICAgIGJbeV0sICJlbGxlIlt5JjNdLCBiW3ldLCAiXisrXiJbeSYzXSwgICAgICB4KjIsIHksICIrXl4rIlt5JjNdLCB4KjIrMSwgeSk7CisgICAgICAgfQorICAgICAgIAorICAgICAgIC8qIExUICovCisgICAgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykgeworcHJpbnRmKCIgICBiWyVkXSAgPSAoYlslZF0gKyAoYlslZF0gPSAoYlslZF0gKyBiWyVkXSkgJiAyNTUpKSAmIDI1NTtcbiIsIGJbMF0sIGJbMF0sIGJbMV0sIGJbMF0sIGJbMV0pOworcHJpbnRmKCIgICBiWyVkXSAgPSAoYlslZF0gKyAoYlslZF0gPSAoYlslZF0gKyBiWyVkXSkgJiAyNTUpKSAmIDI1NTtcbiIsIGJbMl0sIGJbMl0sIGJbM10sIGJbM10sIGJbMl0pOworcHJpbnRmKCIgICBiWyVkXSAgPSAoYlslZF0gKyAoYlslZF0gPSAoYlslZF0gKyBiWyVkXSkgJiAyNTUpKSAmIDI1NTtcbiIsIGJbNF0sIGJbNF0sIGJbNV0sIGJbNV0sIGJbNF0pOworcHJpbnRmKCIgICBiWyVkXSAgPSAoYlslZF0gKyAoYlslZF0gPSAoYlslZF0gKyBiWyVkXSkgJiAyNTUpKSAmIDI1NTtcbiIsIGJbNl0sIGJbNl0sIGJbN10sIGJbN10sIGJbNl0pOworcHJpbnRmKCIgICBiWyVkXSAgPSAoYlslZF0gKyAoYlslZF0gPSAoYlslZF0gKyBiWyVkXSkgJiAyNTUpKSAmIDI1NTtcbiIsIGJbOF0sIGJbOF0sIGJbOV0sIGJbOV0sIGJbOF0pOworcHJpbnRmKCIgICBiWyVkXSAgPSAoYlslZF0gKyAoYlslZF0gPSAoYlslZF0gKyBiWyVkXSkgJiAyNTUpKSAmIDI1NTtcbiIsIGJbMTBdLCBiWzEwXSwgYlsxMV0sIGJbMTFdLCBiWzEwXSk7CitwcmludGYoIiAgIGJbJWRdICA9IChiWyVkXSArIChiWyVkXSA9IChiWyVkXSArIGJbJWRdKSAmIDI1NSkpICYgMjU1O1xuIiwgYlsxMl0sIGJbMTJdLCBiWzEzXSwgYlsxM10sIGJbMTJdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzE0XSwgYlsxNF0sIGJbMTVdLCBiWzE1XSwgYlsxNF0pOworICAgICAgaWYgKHkgPCAzKSB7CisgICAgICAgICBTSFVGOworICAgICAgfSAgICAgICAgIAorICAgICAgfSAgIAorICB9CisgIAorcHJpbnRmKAorIiAgIGlmIChza2V5LT5zYWZlcnAucm91bmRzIDw9IDgpIHtcbiIpOworLyogZmluaXNoICovCisgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykgeworICAgcHJpbnRmKAorIiAgICAgIGN0WyVkXSA9IChiWyVkXSAlYyBza2V5LT5zYWZlcnAuS1tza2V5LT5zYWZlcnAucm91bmRzKjJdWyVkXSkgJiAyNTU7XG4iLAorICAgICAgIHgsIGJbeF0sICJeKyteIlt4JjNdLCB4KTsKKyAgIH0gICAKKyAgIHByaW50ZigiICAgICAgcmV0dXJuO1xuICAgfVxuIik7CisgIAorICAvKiAxOTItYml0IGtleXMgKi8KK3ByaW50ZiggIAorIiAgIC8qIDE5Mi1iaXQga2V5PyAqL1xuIgorIiAgIGlmIChza2V5LT5zYWZlcnAucm91bmRzID4gOCkge1xuIik7CisgIAorICAgLyogZG8gNCByb3VuZHMgb2YgUk9VTkQ7IExUOyAqLworICAgZm9yICh4ID0gODsgeCA8IDEyOyB4KyspIHsKKyAgICAgICAvKiBST1VORCguLi4sIHgqMikgKi8KKyAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworcHJpbnRmKCJiWyVkXSA9IChzYWZlcl8lY2JveFsoYlslZF0gJWMgc2tleS0+c2FmZXJwLktbJWRdWyVkXSkgJiAyNTVdICVjIHNrZXktPnNhZmVycC5LWyVkXVslZF0pICYgMjU1O1xuIiwKKyAgICAgICAgICBiW3ldLCAiZWxsZSJbeSYzXSwgYlt5XSwgIl4rK14iW3kmM10sICAgICAgeCoyLCB5LCAiK15eKyJbeSYzXSwgeCoyKzEsIHkpOworICAgICAgIH0KKyAgICAgICAKKyAgICAgICAvKiBMVCAqLworICAgICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspIHsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzBdLCBiWzBdLCBiWzFdLCBiWzBdLCBiWzFdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzJdLCBiWzJdLCBiWzNdLCBiWzNdLCBiWzJdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzRdLCBiWzRdLCBiWzVdLCBiWzVdLCBiWzRdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzZdLCBiWzZdLCBiWzddLCBiWzddLCBiWzZdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzhdLCBiWzhdLCBiWzldLCBiWzldLCBiWzhdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzEwXSwgYlsxMF0sIGJbMTFdLCBiWzExXSwgYlsxMF0pOworcHJpbnRmKCIgICBiWyVkXSAgPSAoYlslZF0gKyAoYlslZF0gPSAoYlslZF0gKyBiWyVkXSkgJiAyNTUpKSAmIDI1NTtcbiIsIGJbMTJdLCBiWzEyXSwgYlsxM10sIGJbMTNdLCBiWzEyXSk7CitwcmludGYoIiAgIGJbJWRdICA9IChiWyVkXSArIChiWyVkXSA9IChiWyVkXSArIGJbJWRdKSAmIDI1NSkpICYgMjU1O1xuIiwgYlsxNF0sIGJbMTRdLCBiWzE1XSwgYlsxNV0sIGJbMTRdKTsKKyAgICAgIGlmICh5IDwgMykgeworICAgICAgICAgU0hVRjsKKyAgICAgIH0gICAgICAgICAKKyAgICAgIH0gICAKKyAgfQorcHJpbnRmKCJ9XG4iKTsKKyAgCitwcmludGYoCisiICAgaWYgKHNrZXktPnNhZmVycC5yb3VuZHMgPD0gMTIpIHtcbiIpOworLyogZmluaXNoICovCisgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykgeworICAgcHJpbnRmKAorIiAgICAgIGN0WyVkXSA9IChiWyVkXSAlYyBza2V5LT5zYWZlcnAuS1tza2V5LT5zYWZlcnAucm91bmRzKjJdWyVkXSkgJiAyNTU7XG4iLAorICAgICAgIHgsIGJbeF0sICJeKyteIlt4JjNdLCB4KTsKKyAgIH0gICAKKyAgIHByaW50ZigiICAgICAgcmV0dXJuO1xuICAgfVxuIik7CisKKyAgLyogMjU2LWJpdCBrZXlzICovCitwcmludGYoICAKKyIgICAvKiAyNTYtYml0IGtleT8gKi9cbiIKKyIgICBpZiAoc2tleS0+c2FmZXJwLnJvdW5kcyA+IDEyKSB7XG4iKTsKKyAgCisgICAvKiBkbyA0IHJvdW5kcyBvZiBST1VORDsgTFQ7ICovCisgICBmb3IgKHggPSAxMjsgeCA8IDE2OyB4KyspIHsKKyAgICAgICAvKiBST1VORCguLi4sIHgqMikgKi8KKyAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworcHJpbnRmKCJiWyVkXSA9IChzYWZlcl8lY2JveFsoYlslZF0gJWMgc2tleS0+c2FmZXJwLktbJWRdWyVkXSkgJiAyNTVdICVjIHNrZXktPnNhZmVycC5LWyVkXVslZF0pICYgMjU1O1xuIiwKKyAgICAgICAgICBiW3ldLCAiZWxsZSJbeSYzXSwgYlt5XSwgIl4rK14iW3kmM10sICAgICAgeCoyLCB5LCAiK15eKyJbeSYzXSwgeCoyKzEsIHkpOworICAgICAgIH0KKyAgICAgICAKKyAgICAgICAvKiBMVCAqLworICAgICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspIHsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzBdLCBiWzBdLCBiWzFdLCBiWzBdLCBiWzFdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzJdLCBiWzJdLCBiWzNdLCBiWzNdLCBiWzJdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzRdLCBiWzRdLCBiWzVdLCBiWzVdLCBiWzRdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzZdLCBiWzZdLCBiWzddLCBiWzddLCBiWzZdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzhdLCBiWzhdLCBiWzldLCBiWzldLCBiWzhdKTsKK3ByaW50ZigiICAgYlslZF0gID0gKGJbJWRdICsgKGJbJWRdID0gKGJbJWRdICsgYlslZF0pICYgMjU1KSkgJiAyNTU7XG4iLCBiWzEwXSwgYlsxMF0sIGJbMTFdLCBiWzExXSwgYlsxMF0pOworcHJpbnRmKCIgICBiWyVkXSAgPSAoYlslZF0gKyAoYlslZF0gPSAoYlslZF0gKyBiWyVkXSkgJiAyNTUpKSAmIDI1NTtcbiIsIGJbMTJdLCBiWzEyXSwgYlsxM10sIGJbMTNdLCBiWzEyXSk7CitwcmludGYoIiAgIGJbJWRdICA9IChiWyVkXSArIChiWyVkXSA9IChiWyVkXSArIGJbJWRdKSAmIDI1NSkpICYgMjU1O1xuIiwgYlsxNF0sIGJbMTRdLCBiWzE1XSwgYlsxNV0sIGJbMTRdKTsKKyAgICAgIGlmICh5IDwgMykgeworICAgICAgICAgU0hVRjsKKyAgICAgIH0gICAgICAgICAKKyAgICAgIH0gICAKKyAgfQorLyogZmluaXNoICovCisgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykgeworICAgcHJpbnRmKAorIiAgICAgIGN0WyVkXSA9IChiWyVkXSAlYyBza2V5LT5zYWZlcnAuS1tza2V5LT5zYWZlcnAucm91bmRzKjJdWyVkXSkgJiAyNTU7XG4iLAorICAgICAgIHgsIGJbeF0sICJeKyteIlt4JjNdLCB4KTsKKyAgIH0gICAKKyAgIHByaW50ZigiICAgcmV0dXJuO1xuIik7CitwcmludGYoIiAgIH1cbn1cblxuIik7CisKKyAgIHJldHVybiAwOworfQorCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L25vdGVzL2V0Yy9zYWZlcnBfb3B0aW1pemVyLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMiAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9ub3Rlcy9ldGMvd2hpcmxnZW4uYyBiL25vdGVzL2V0Yy93aGlybGdlbi5jCmluZGV4IDI4ODBkM2YuLmMwNjY4N2UgMTAwNjQ0Ci0tLSBhL25vdGVzL2V0Yy93aGlybGdlbi5jCisrKyBiL25vdGVzL2V0Yy93aGlybGdlbi5jCkBAIC04OSwzICs4OSw3IEBACiB9CiAKIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9ub3Rlcy9ldGMvd2hpcmxnZW4uYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4yICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL25vdGVzL2V0Yy93aGlybHRlc3QuYyBiL25vdGVzL2V0Yy93aGlybHRlc3QuYwppbmRleCA5MTg0Zjc3Li4yMjZlMDEyIDEwMDY0NAotLS0gYS9ub3Rlcy9ldGMvd2hpcmx0ZXN0LmMKKysrIGIvbm90ZXMvZXRjL3doaXJsdGVzdC5jCkBAIC0xMywzICsxMyw3IEBACiAgICB9CiB9CiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvbm90ZXMvZXRjL3doaXJsdGVzdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjIgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvbm90ZXMvZ2NtX3R2LnR4dCBiL25vdGVzL2djbV90di50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkM2I4ZAotLS0gL2Rldi9udWxsCisrKyBiL25vdGVzL2djbV90di50eHQKQEAgLTAsMCArMSwyMTQgQEAKK0dDTSBUZXN0IFZlY3RvcnMuICBVc2VzIHRoZSAwMDAxMDIwMy4uLk5OLTEgcGF0dGVybiBmb3Igbm9uY2UvaGVhZGVyL3BsYWludGV4dC9rZXkuICBUaGUgb3V0cHV0cworYXJlIG9mIHRoZSBmb3JtIGNpcGhlcnRleHQsdGFnIGZvciBhIGdpdmVuIE5OLiAgVGhlIGtleSBmb3Igc3RlcCBOPjEgaXMgdGhlIHRhZyBvZiB0aGUgcHJldmlvdXMKK3N0ZXAgcmVwZWF0ZWQgc3VmZmljaWVudGx5LiAgVGhlIG5vbmNlIGlzIGZpeGVkIHRocm91Z2hvdXQgYXQgMTMgYnl0ZXMgMDAwMTAyLi4uCisKK0dDTS1hZXMgKDE2IGJ5dGUga2V5KQorICAwOiAsIEM2QTEzQjM3ODc4RjVCODI2RjRGODE2MkExQzhEODc5CisgIDE6IEYxLCAzOTdGNjQ5QTIwRjNGODlBMDBGNDVCRjIzMEYyNkI2MQorICAyOiBENkI4LCAxNjUzRjY3QzlDNzE2RDBGQzU5RjNCMTQxNTRERUNCRgorICAzOiA2NzM0NTYsIEU4MkVGQzc5QjMwQ0E1MjM1RTJEQzhCRTRDMTQyNjVECisgIDQ6IDI2REQ3QzI2LCBCOEQxRjREQjg0NUY3RDcwNzlERUI4OTIwOTQ5QzE0RAorICA1OiBEQTYyQUQxNDg3LCA4MjhBNDIzMjkzMjA3NjRFNUZCNzRENDRBNjEwOEY0QgorICA2OiBGQjc5RjdENTE3NDIsIDg2NTQxNUJEMDQ5RTg2RjNEQTJFMEI2RTI1RTFBNTBDCisgIDc6IDlEOTZEMTAzNDE2NkJGLCA1MDY2OTI0N0E1QjMzOEUxODNERTUxMzk4MzFDRDZBNAorICA4OiBCNDY2MDUwRTEzMzBCMjBBLCBDQjI2NEZBNzg1M0ExRkZFODZFMUEwN0NGQTdDNzMxOQorICA5OiBDRjE2RjBCM0Q5RkM2MTgzREYsIDY0N0RENkUxRjQwRjM4NUUxREZFNjY3NkZCMDM2MjQyCisgMTA6IDE0RDkwOTI4QzcyMzYwNTAwOTZGLCA5MzBDQUFBNTUzNjQwNjIxODg4NTQ3NUNBODIzQTk3MworIDExOiA0RjIzMjJENjZBNzA3OUJEN0RGNTE5LCAzQjM5MzFENDc0MTMwNDJGQUYxMzEzRjEwNDE1MDlBMworIDEyOiBGMTQ5NzkwNkYxRDhGNEY5RTQ3RTRCRTksIDQ2OUZCMEQ2MjgyODQyN0MyRTlCQTA0MDQxQTE0MjRGCisgMTM6IDJGQUZBMkEzRUVBNEMwMDA3MDJFNThEMUQ0LCBDOUE0ODRGQzRFRDg2NDRBMDYwNjBEQUUyQzNEMTU2OAorIDE0OiA1RDcwN0Y4QUNGMzE5NDEzRDIyMEFBMkZDMkIyLCAwRUU5QUFGNUIxQ0Y2MjJFQ0Y2QzRGNUU1RkY0NjU2QQorIDE1OiAyQzE5REJGOTY2RDI0QjI3MTNGODJCNjk5MzQwNjAsIDg2NzYyNDZBMkY3Nzk1QUJENDM1QjNDNkI0RUE2RTdBCisgMTY6IEIzRkVENkMyMzE1Q0U2RDk4NzI5REJFNjkyNzBBMTFFLCBCOEFDNzM5QUQxNTQ3NDRBMzNFOTA2QzM0RDkxQkQ0QgorIDE3OiBCMkJDNDRDRTA4OEJDM0Y2NTRCOTcwM0Q5QzY5MUYxN0IzLCBCQUQ4MzE0QTE3MUJDMDExOTk0MjEzNkM1ODc2QUFDQworIDE4OiBDNkU5NThFM0U5QUM4MzZDOTYyNkJENjY0Nzg5NzREMjZCMEMsIDRFNkQ2MTgzM0U5REI4MzkxMTdCNjY1QTk2REM2ODZDCisgMTk6IEQ0MEZBREQwNzhCNDc0RUJDRTEzMEZCNDREREI0ODI0MDc3OTg4LCBGNDNFM0NEOTc4QTZFMzI4QUYwMzlDQzcwRTI5MUUxQworIDIwOiBFMTc3QjNERjgzQTExN0U1NUYyNTVBNkMyQ0Q3OEFGREFGREEzMDdGLCBFRUYxQUJBQUI5Q0JFMEVFMzE3Q0M3OUU3RTVFMjRCOAorIDIxOiBEQkI0NTY5QjNFMzA1RTQ1MjVGMUY3QjNEMkFGRUYyMjZGMzk3RTY2MUQsIDY1QUNGQjcwMTMyRUVFMUQ0NzMxOUE1NTBBNTA2REI1CisgMjI6IEFDMkNBRjc3NzE4REU1OTEzMUE2Qjc0NURFOUYzQTk4OTdCMTc1ODBFQzcxLCBEOERCOTAwNkE5NTk3RjY0MEYyNTk0MzQwRDY5RTU1MQorIDIzOiA4RjYyMDIyRjcyQTBENzY5RDJEMDk1QTU1RTI4ODMyOTUwODcwQjJCNDRCMEJFLCBBN0UxOTZGODY5MDcxQjdCQjcxM0U4QTJEMTU2MjdFOQorIDI0OiAzN0Y1NjQwRjgyMDM4NEIzNUYxM0Y4QzhDN0RDMzFCREUxRTRGMjlEQ0ZCREEzMjEsIEQ1NzY1QzM5REJDQTcyQUM4OTEwMENDQjg4NjRFMURCCisgMjU6IDI1MDU5QkZDMzAyRDBGOERENDFCQjIyQ0YyMzkxRDQ1NjYzMEMwNkYxREFGNERGQTg2LCBEQzJGRkQxNTNDNzg4QzI4RDI1MUI3OEFCOEI3Mzg4QworIDI2OiAxNTFGMTU4Q0M0QkE5MzkzRkRCMTUzQzRDNzI5MTFDMTIwQkFCNTE5RkFGNjQ3MTkxMzNELCBDNjE5MTUwMDYwMzhCRjE1REVENjAzODMyRkQxNzlERQorIDI3OiBGNURDRjQyMzE0ODJGNzJEMDJGOEI5QkUwQTQxMTEzRDM1QUVBMUNEODUwMjFDRUM5NzhEOUMsIDlDQkQwMkM1NTcxODBGQkQwODY4Qzg3QTBCRUEyNUFFCisgMjg6IDVEODhCNTU1NEEyRUQ3MzA1NDIyNjQ3MzY3NkZBQTcxNTlDRTEyQjUzNTdENjM1RERFRDM1QjVBLCA1QUQxMUNENkIxNEM1OUU2NEI1QjI2REZCRDAwRkI1QworIDI5OiA1Njk2QzcwNjZFQTA5QTMwRkM4QkNCQUQ5NkQ0OEE1RTVGQkNDODc1NkI3NzBGMEE4OUI4NzExOTExLCBCOUVBNUYzQkVGMDU5OUQzODVBOUFDRUJFNDA2NDQ5OAorIDMwOiAxMjQwRkVENDdCMzA1QUMxODgzRjhDRjEzN0Q1OEU3OTA1MkI0RTY4NkRDQTE0MjNBNkEyQkVDQkQ1RjUsIDAzNkE1RUE1RjRGMkQwQkYzOTdFODg5NkVCN0FCMDNECisgMzE6IEFEOTUxN0JGMzkyQzFFQjU2RDc4RURFMUM0MUYzQzczQjcyMzA0REE0N0Y0MDBDMzkwQzg2QjM3QTUwQzJBLCBFQjNFMDI2RDUxOEVFRDQ3RjZDOTI3NTI1NzQ2QUM1NAorIDMyOiAyQUUxQ0VFRDgzQzY0OTBBN0U1NzUyRTkxNTMyNDA2RUFDNkZGNEIxMUFBNzcwRUZGRjFCMjU1RkRCNzdDNTI4LCA3NEJGQkM3RjEyMEI1OEZBMkI1RTk4OEE0MUVBRjdBQworCitHQ00tcmM2ICgxNiBieXRlIGtleSkKKyAgMDogLCBENTk1RkVEQUIwNkM2MkQ4QzUyOTBFNzZFRDg0NjAxRAorICAxOiA0RCwgNDdBNkVERUY4Mjg2RjlDMTQ0QjdCNTFDOUJDQ0NBQ0YKKyAgMjogMDA4NSwgOTc4OERERjg5ODQzRUM1MTEyMEIxMzJFQjBEMEY4MzMKKyAgMzogNDYzNzAxLCA2NzNDQjhEMjQ4RTZCRUNENUE2QTdCMEIwODQ2NUVGNgorICA0OiBGNUIzMjIyQywgMUM0MjQyODJEN0ZCNDI3RTU1Mjg1RTIwRkMyQUJGRjkKKyAgNTogM0E0QTgzNjFCMiwgQkQ0MEU2MzFCMDU0RjI4MEM3OTczRTVBQjNGMDZCNDIKKyAgNjogQTQ3NTg2NkJGMkM1LCAyMDY3RjQyRkFBQTYyNzQyNzBDRjlFNjVEODMzRkRFRAorICA3OiA2ODlEMEQ0MDcxNzJDOCwgM0JDQ0ZGQzY0RTU2RDVCNzUzMzUyRTFEREQ1Q0NBQTMKKyAgODogRDlDRTRCMDUxMjAyQTFEMywgNzlCMENDREEzRDBCOUM5QkNGNjQwQkM5RTZEOUNFMEQKKyAgOTogMDMxN0Q2OEJFMDk4RDI3NkI3LCBBRjM1MDQzREI2MjEzREM1RDRGM0RGQjhFMjlFRTUzNworIDEwOiAxNTRDRUYwQzZGMzdBQTBBNzNDNCwgNjFFNTk4QThDNkQxN0I2MzlGOUUyN0FGNTVERDAwRjMKKyAxMTogQzNEQjFCMkI2Q0NDOTE3MEI5QzA1RiwgOTY2ODcxRERENkUxMTA3MTFGQjlERDczM0I2QjJCM0EKKyAxMjogRTRGMjIzODNDNzVCQzBGQjBFNTlDNUU4LCA5NzE1MzZBRjg3OEY0RUVENjhGNTkwNDZDOTI4RUFDOAorIDEzOiAyRkJGQjk5QUFCQzYyMDlGQjg2NjQ5MTZERCwgNjhEMEJGMjE0NEFEMUFERUNDNDA3NERBRTU4NTQwQzIKKyAxNDogNUZFRURGRDA5QkY4OTcxOUEzNENEQ0NEMkFBQSwgNjRERUI3RDVFNjg5MTEwM0FBNTRDMEVCMzY2NzE1RDAKKyAxNTogRTA2M0EwNzZFMEM3NzBGQjAxMEQyNkMzQUMzRUI1LCAwQ0EzMjFCMkE3NDQ4RkVFRjg0RDRFMEFENUJBMkRBNAorIDE2OiBBRkIwREI5OTU5RjA5MDZCRDM0NkMyRDgxREM1NDEyQywgNDI1NjI3ODk1RTJDNEM5NTQ2RDMyMjc5NzU1ODU0NTkKKyAxNzogNzkxNzlDMEQ0RDZDNUUwNzQxREQ0Q0ExRThDRjI4Qzc1QywgRDAxODhBMzQ0QTFDRUU1MjI3MkZFNjM2OERCMEZCNzUKKyAxODogOEE3NTUyMTEzOUIwREUzQzA4QzlFQUVCNzdEODAxOEEzOUZFLCA0N0ZDQzIwMEQ4QTM4NDMyMEQyRjFBNUU4MDNBOTk5MQorIDE5OiAwMzk5MzgxRDBBOTc1QUUzOTgwQTlGQjc1Qjk5MUMwNTVBRjM2NywgMDM0OTE1MzcwQUY5NEI5NkE4QTRFNTBGRjlCMTM0Q0MKKyAyMDogOEMxODkwOTREQjEzRkJFNjJFQTVDNEE1M0MyOUE0MjhFRDU4N0JBMiwgOTlDNThGODM4NDIzMDMzMjk4ODk3ODQxRUQ1MjYzNDcKKyAyMTogRDkxRjUxNDRCNTI1QUY1RDQ3RUY0RDVGMEFGOTkxNTQ0N0E1NTkyN0Y5LCBGNjc1MEJGN0UwODk1MTVEMzVCNDdCQzFDNjVFMkUzQQorIDIyOiBBNEUyNkI1NTRBQTI3NzA1N0E1RkUzRkEwOEE2MTM4Q0VFQzZENjlCQjFEOCwgN0JCRUJGNTJEODI1MTEwOEM3QUExMDI1RTIxM0VDNDQKKyAyMzogNUMxQThDM0E0NkZDQTkwRDczNjc1NzA2MzEzQ0FERkJCOTBBNTM1QTRCM0Q1QSwgRTM1MjQ0QTI2MzM0NzhCQkRBRkNDODExNjFGMjhCODAKKyAyNDogRDY5RjcyNjRGQzU5NDA1N0I4OTE4MUI4MzU4MkQ3OTlBRTU0RTlFRTRGRThBRDQ4LCBENEIyOUU1QzI1Rjk0NzdEOTM0NTUyNkRCREU5MzcyQQorIDI1OiBBRkQzMjJEMEFDNEFGMzhENUI5Q0JFMERGRTg1NjE4QzAwMUE3QTc3Q0Q4RkZGQ0IzRSwgQUQwNkJCOUM1OUQyM0QyNThENkEyQUVERDk0NkFBMjAKKyAyNjogMTc5Q0E4Mzk1Q0Q4RTc1QjRFNUVBMDdEMjVDODAzNkFGMDhCMUExQzMzMDQ5MjUyM0QzNiwgRTM3MDRDNDM0MUE4MzRDMDg3NTAwRTMzMkI3REVBRTkKKyAyNzogQjkxNzhFRjc3NzQ2ODRGNDNGMUZDRTk5QTQzMTlCNUE0RDE2N0IwQTg0ODU1MUY1NjJDRDdDLCA1RDUwODJGQjAyQjlCNDk0RDU4ODNERjQ5REIzQjg0QgorIDI4OiA4MzBGQ0QxNUEwOUVDNjEyNDVEN0RBMjU4RTMwOEU3NkQzQjU0MkYyMzQ1REJGQzExQUU5ODNBMywgRjUwQzMzMzJGOEQ5MTkxMUJEQUNDRkUyMjg1NjVFNUMKKyAyOTogMTc5NjE5QjhDN0VFOUIzMTIxNDA1QkJFRDJBQzEwMkEwMjdFNkM5N0VBRURCNUVDRkVCMTM3OTJFRiwgODU5RUJBM0JBRENFNkU1QUIyNzFBMjYxQjI2REUyOEMKKyAzMDogMTQyNjRDN0UwQTE1NDExOUJGMjRCN0ZDRjQzNEU4MTQ0MEQ0MkQ1NDczOEYwQkFFNTU4MzY4NDlBQjg1LCAwQjZDOUI5Q0FEQjFCNkVDNzFDRUEwOTBDOEM3MjgzNAorIDMxOiAwRDdBMzE2RjhCODczRjYyQ0YyNkNGQzU2OTE3OUFCMTFDQkYwOUQzNDY3OTM2QTg1QURDMjY1QjJDOUE4RiwgODY2QUU3QzUxRUMyRDlERUIzMjc0OEExQzhCNjExNDMKKyAzMjogRjhGRDFGOTY3Q0QzNjMyODA1QUQ3RkE4RUNCNDBGNTMwOTI3REQ1QzQ5RDMxRkRCQUU0OTczOEUyMzE1OTA1RCwgOUNCMUNCODRBNzI3QzlGNDI1NTVFQjU2NkUwQTFERUUKKworR0NNLXNhZmVyKyAoMTYgYnl0ZSBrZXkpCisgIDA6ICwgRjc2OUI0MzZDN0ZCN0MwQzgyMkUyNEJCMkIyNTU1RDMKKyAgMTogQ0EsIEIxNTYyOTg2MjVGNTYzNEZBMDEyQjIzMDQ0NDM3ODA3CisgIDI6IDQ5NjAsIEE2NEM3M0U4OTBGM0Q3N0IyQzNCM0M3NkMyRDkxM0M2CisgIDM6IERCQkI4RCwgNjg2NjUxQTAxN0Y4OUEyMkY5RkU5NjUzM0M4NUM1MkMKKyAgNDogMTUwQUQ5OUEsIDE3N0Y3REU5RTg5N0RBQ0NBQjdFQUNFRTNDREU3NjAxCisgIDU6IDA3NzA1NTA2NUYsIDQ4QjQzMDlDNzZDQUMzN0JERjExODQyMzExQkE2Q0QzCisgIDY6IEIyRjhDRTA2MkMwNiwgRUQwNERGOTZDMDY5NTk1MjQ5NTZFOEFDNUMzMzg0NTcKKyAgNzogRENFNzE4MjExNDEwRDgsIDNGOEQ4MTgwQkRFQUMyRjAxOEVBODE2MTUxNzdDQzhGCisgIDg6IDBGNzFFMjc3MjQwMkFDODMsIDIxMzA0ODFCMkNBN0I0QjRDOEYzRUU3M0IzQjNDMjhGCisgIDk6IEI2OTAzMDczNEU1QURGNzUzQywgOENDNEI2MkJGQkMzRUE1NkNDREJGMEVEMzE4Qzc4NEQKKyAxMDogNkI4QTkxQUJDMUJGMkYyRDAxNzYsIDg2RUFBRDgwRDE0OEE0ODA4Njk4N0E0MEE1NjMxREVGCisgMTE6IDQ0QUQwMDc5OUVDOEU2MkUzNEQ2QTEsIDAxNjgzMEQ1OEYwNkY3NUU1NDUzMUI0NUQ5RTc4NUY5CisgMTI6IDBDNEI5MzgxRDc4RTBGMEE3OEIzQ0VBQSwgNEE3OUM1OERBQjEzMUEyMkYxNzJGOTE3N0RDNDE1OEIKKyAxMzogMkM1NkQ0NjI1ODc2NTI0QjREOEQ1RjA3OUIsIDdCNDA3RjcwNDIyNUIyNUYxRjEzNkM5ODRFNTY0MTQ3CisgMTQ6IDM2NDI0RDY5QkFDQzU2NDA3RDM0NUIzRDdCNEQsIEVCMTI2QzI1NUEyRENGRDMyRjY5REQ1Q0I2MTg3NkM3CisgMTU6IEZERDNFMDkxQzA0MjBEMUE0RDRBODQ4NzU3RkNDMiwgRDMxOUM1QzA3MTM0RDY3QkE0MkE0QkYzMTJDRDg3NEQKKyAxNjogRUZBRjZGMTE3RUE5QTRCNEI4MzA1MkJCRjVBMDdEQjksIEJCMDlENDczRkU4MjI1NzE0NkU3QUJDMkVGRjZGNjMxCisgMTc6IDE5QjcxMzgzQzQxNEJBQzNFRjI1MkZGRjA5RjVBQ0Q3NzcsIDUyNkRDOUFFNjg5NUVEMzNBMzRBOUE0QURCMDdFMUI2CisgMTg6IDlBQjZERkRCOTMwRDI2RTAwQjNEOThERDVBRDAxNEUwODc1NiwgRDcwQjk1QjIwQzEwNkE1QTAzRjlCODAzRDJDQUMzQTAKKyAxOTogRUVCM0MyMzZDMzAzMURFNEMzRjk0QkQ3NDY2NzdBRTg0QjI3MUQsIDk0ODNCQkNCQkZEQkExQ0M1RjYzOTJEQUJBMkFDQzE5CisgMjA6IDNBMEVCQzc1MzZGODcxN0U4RkRBRkVEQUMzOUU4RjFGNDNDMDYyN0EsIDNEQTdEQzI0NzU0NjZDRURGMDFFQjU0Mzg3MEE3NEZBCisgMjE6IDc5RDI4RDJGMTQ5RTFEOTdFOTEwMzQyREYzODNGQ0VFQ0Y1QUZENEM2QSwgMjM2NEYzM0JDRjZGMDdFMzgxRjdFMjZEQUY4MDJEODMKKyAyMjogRjFEN0MzMTlCQUZCNzQwMzMyQ0ExOUFCMEM5QjcxNzI4RDNBRTY5QkZBQzIsIDNENEFFRTk3ODBBNUM5OENCQzY5NjA2Q0REREIzMUY4CisgMjM6IDFBMEQ4MDM4MUExODY2NzNGQjdCNTJDNDBBQjZDNDZBMTFBQjA4ODkzMzNDMjAsIEFGNUMxN0UzRDBEOTcyNEVEQzFGQzQzOEExNkI0RUJCCisgMjQ6IDVFNTAzNDQwQjIyREQ2QUU2NDAxQkE0MzU1Qzg3OTFCQUNDNTk4QzlFMEYxNDEyRSwgMTU2RDgyMjFCRDYxRjVDMTA4RkMxOEZCMkY1MEQxNTkKKyAyNTogNzc4NEVGREM2RjBGQzU2RkNBREFGRjE3QkI1MkRFQjM1QjY0RkExOUMzRjM5MUJERkQsIEEyOTFFODIzOEVGMTU4QTIzNzk2OTIwNzdGNzBFOEQwCisgMjY6IDE4NEI2RTE4MDMyRDFBNzBDRTUwMjc5MTJFNDQ3QzM1N0M3MkVFRjdCMjBFRjBGQjI1NkMsIDBGQTAxMzhGQjk0ODBFMEM0QzIzN0JGNUQ2MDk5Nzc3CisgMjc6IDdBQzhGQ0I2NEYzNUI3MUM1RUQwQ0NENzc2QjFGRjc2Q0UzNTJFQjU3MjQ0MDg1RUQzNEZFOCwgRDk5NUIzQzEzNTBDQzc3Nzg3ODEwODY0MEMxQ0FEQUUKKyAyODogODZDN0EwMUZCMjI2MkE4RTM3RkYzOENDOTlCRjNFRkFFQjhCMzYxNjZEMjQ5MTNCREQzQjkxREEsIDI1RUM2RDlGNjkxNjhDNUZBMzJDMzk2MzFCNjA2QjU1CisgMjk6IDkxRjVEM0UzRkUwQjE5NzZFMjkxNUI4REEzRTc4NUY0RDU1NzY4RkQ3MjdBRUYxOUZBMTU1MkY1MDYsIEFGOTAyREVENTVFMzg2RjBGQzQyMTBDOTdEQjk0NDZFCisgMzA6IDdBQkY1QkQ5Q0IyRUZGODM4MkM2RDJCMjhDMUIwQjI1NTQwRTQzNDEyM0FDMjUyMDQ2QkREQTc0REEzMiwgNzEzMjU5RUREQTlCMUI2M0VCNjhFMDI4M0QwMjU5REIKKyAzMTogNTYzNEIyM0FDRUYyODc0QkUwNTkxQkUzMjY4QzQ1Mzg2OThGRjJEOTNENTlCMzlCQzg2RDAxMzdEQUNCQUQsIEM0MDU0Nzk2QUZEMzM1QjQzQzYwRTdFNjM0MTIyQkFGCisgMzI6IEYyNkM2OEMzNkIxRTU2NDQ5NTk1RUE0RTE2MjM5MUUwQzZBMzA2NTkyOTQ5RjY5Nzk3QjZDMjMyN0U1MzNBREIsIDdCMzkyQUY3NzZBOTQ5ODMwNzg4MTRCNkI4NDI4QkZFCisKK0dDTS10d29maXNoICgxNiBieXRlIGtleSkKKyAgMDogLCA2Mjc1RThDQTM1QjM2QzEwOEFENkQ1Rjg0RjBDQzVBMworICAxOiAzOCwgQTcxNDIxMDc5MkY5RUQxMkEyOEYyNUNBRTNCM0JDNUUKKyAgMjogOEUyRiwgNjM1N0MxRjEyNTcyM0YyMjQ0REFGMzQ0Q0RGQ0Q0N0IKKyAgMzogOTAwQTRDLCBFRDRFMEIzMTgzNDZENUI5QjY0NjQ0MUU5NDYyMDRFOQorICA0OiAwODdFQUZGOCwgQjg3MUVEOTVDODczRjFFRkEyNEVGOEI2OTE1RjQ0N0QKKyAgNTogNjNGQzlFRkJENCwgNjUwRDBFRDk4Q0JFQ0EwNzA0MEFCOTdCOTcxMjkzNjAKKyAgNjogQjYwODFFOTRBQTE5LCA2QTNCREE4MDMwQzVBNzlCNkI5MDg3NTU1QTFEQTY3QgorICA3OiBFMTBBN0I5Q0JCMjBDMiwgNTlFQjU1REZEMEEzN0M1NUE4Njk4MzRFNTk3MzczQUYKKyAgODogOTRFOTQ3RkVFMDU3ODBFRSwgMzU0OTE4NTI3Rjg1NTI2NEUzN0RCNjg5MkU4NjgwNTAKKyAgOTogOUE4MEM1NjdBQTUwMjIwODYyLCA4MTRFRTU3Q0M5RDUxRDdEOTAwQUI0ODQwQzRCMDcyRgorIDEwOiBBODc0MUJFMUU0MkJFMjA3QzQxNiwgMkIyOEFGRDhBQkUyMDY2NEQ4QkFENzUzNUY4MkYxMUEKKyAxMTogNkFCN0UzQzY4QjY2ODIwMjNFODE5MCwgNUU0OEI2NzU0MUZFODM5Njk5NTIzOTRGODREMjlFOTMKKyAxMjogNEY2NkZCNjM0RUIyNThDRUUyOTU1RDg0LCBGMjYzMkMyMTM1QjZFMTE0NDY3M0IwRUY3MzQ5OTgxOAorIDEzOiBCMjkwNDJGMzg3N0MyRjVFNjk0OTUzQzVGNiwgMDMyNjhBMzA0OTlENTdBMDZBQTg3M0VGMDAxNjBDM0MKKyAxNDogRENDN0I1RDlGNThDODhGNTRBOTYxMTM4OUI4RCwgNTUxNTQyNkZGN0NGMkVFQTkxQkUyQjM3NTIzNzFDRTAKKyAxNTogQjY2NTQ4OEJDRDc1RkMwMkEwREY3OTk0QjdDRjk4LCBCNzIxNTMxRTJBMzE3QzI1NEZBMkVEMzA2QURDRjk2QworIDE2OiA5NTM1REM4QTcyNjQ1RTM0Rjk0OEI3MUE1MTU5QUE5QiwgNUNFRUQ5M0RFMTI4MDQ0RjA0NzFDNjVBQThGMjFEMjkKKyAxNzogNUNCRkM2MUEyM0QyODU2MkZDQTkyOTM3NUU1QjU4NTMyNywgM0FBODQyQjIxNjMxOTY4RDFCNThCNzJGRUUwOTBFRTEKKyAxODogMkFDM0Y3ODBCOTU2QTkzM0MwQjg1NjVFRTUyNzE3M0I4Q0M4LCAxNkVDNEI2RDhFMkNGM0NEMEQxNkU3QTVGNDAxQzc4RQorIDE5OiA1MDY3RkQ2NTg3MEE0RUJGNkM3RkE4MTFBMTUyNzBFN0Y4RjE3RCwgOUE3NTYzQkVEQURGQTZCNkU0OEY1QzEzRkNFQUVENkUKKyAyMDogRTNBNjVBMTg4MDc3RTVEQzE3MUNGRjMwQkU4QjI3RjEwRjAxNTE2NiwgQkQ1QjNEODREMEMxREQ1MUEzOTA5Rjg0OTE0MUI1N0YKKyAyMTogODhEMEE2NUMxMDU4MjNFNjhCRTM5ODdDQjIwNUFFMEMxQTI3NTg4RkNELCBCMjgwMjIxQUQwQkQ4M0UxRDZCMzdGMzMxRjMyNkFCNQorIDIyOiA3QzU2RDk4N0ZFRjY4MDdFRUZBRkQ0QzdFQjlENzJBQTBFMDM3OTc5RDkxRSwgNjg2RTEyNjhBOERDOUNEMDE5MkEzODNFQTZDMkQ5NzUKKyAyMzogQjIzQ0NEMEEwNzZDQjEyMjc1MEI2MzRCOUU2NTUxRTA1ODVFREVBMThDMzI0NSwgNkRGMzBBN0YwNzI4RTJENTQ5QUE0MTFBRTM3NUU1NjkKKyAyNDogNzY3QkMzQUYyMDZFNjdDOUUyN0E0RDdFODE0RjNCM0E2NUQyN0JCNzBCQTlERDRELCBBQjJCMTZDMDMxRkIyQzhFODVCM0IyQjM4QTVDQkE0RQorIDI1OiA5QUJGMzRBQkQ0MzcwNUQ2MkYzNzc0NDk0NjFDNURDMjM5QTJBODZFNUE5OEFGQjE1OSwgM0RFREVEQTg1RTZCRkI1M0M2RjE4NzI2Q0Q1NjE2MDQKKyAyNjogRkU3NTYzNDRDMDVDQjEyQUEwNjczRjFDMjA2OUE4NjU1NkU1ODNGRjRCNzMxM0EwRDM5NSwgMjFDQjBFMEJBQkMzQzdFNTQ3RjVDQjIwNzI5NUMwRUUKKyAyNzogQjcwRjE2QUQxOUE2QjBBRjZEOERCRjRFOThEN0Q1QURCOTQ0RDkxQkQ4ODlEOTM5MEMzRTIxLCAyQUU2NzgxMkEyMkMxQzc4NUQzQkZDMTg0QTFDNzRFQQorIDI4OiBBNjM4OTAzMkFBOUQwOEJEQkFBQTVFMjMwRTUxMzA2NjVGQjRGMENCODY4RjNGMjBDNEM1NDM4QiwgRUNBMDU0RUZBM0YzOTQwMEE1ODc4MzlDNEYwNjA1QzcKKyAyOTogQTU1QTQxMzE1RUFGM0E2N0EwRkQwRTE0QzZFMDREMDNBNUUzOEQwRjc1NjcxOUY0QTA4MDBCMjkwQSwgN0E1Mjc3ODA5RDRCNjVFNjYzNjAzMDk5QjRERkZCRDgKKyAzMDogRTczOTYzMzU3OUFBNjIwMUEwMjRCOTg3M0YyODQxMkJCMDhCMDhCODYxNkQ2MTFCQzlEMDc5NzlCRDNBLCAzOTAwMzhBOTNBRkQzMjZDNUNDMTUyNUEyNENBOTFBRAorIDMxOiBFRDMyNjZGOEIwREFBN0MzREI3ODE0NDI3RTgxMzk4MzFDRkMwRURFNjY4RjBEQTgzRkY3MDkwMTU0NDEwRCwgREU0NDBFQzJDNjA4MDA0OEJGRjNDNTQ1NUUxQkIzM0YKKyAzMjogNEQwRjc1MUI1NURBM0EyRTBCMjhERTU5RTk2ODA2NjlGQ0I1OTg0RTlDMERCOTQyREJBQUNEREVGMDg3OTczMSwgNjJGOTZDRkUzMUQzRDZBQUEwQjlGNTEzMEVEMUIyMUIKKworR0NNLW5vZWtlb24gKDE2IGJ5dGUga2V5KQorICAwOiAsIEVCNUE4RTMwRDVDMTYzMTE4NjRFMkQ4RDMyODU5QUNCCisgIDE6IDg4LCBFQUI4OERFMUVCN0JDNzg0QTcwNkIyRDc5NDY3OThENworICAyOiBCQTFGLCBEQzNDRUM2QUEzMjRBQzdEMDUzRUZGN0E5OUFEMzA2OQorICAzOiA5QTE0NTcsIDRBQjY1ODMxREUzNzhERkY3MUMyMDI0OUM3QkVDMDVFCisgIDQ6IDJGOTQ5NkQ2LCA4MDA3NDVDRjk1RUFFM0E2OThFREY5RUM5NDlEOTJCNworICA1OiA4NDE1MzE3N0EyLCBGNkEwNUI2NTQ0MzVBQkRGNUY2OTZDMEUwNTg4Q0I1QworICA2OiBGODBCNzg2NUM3NjYsIDIzMzREMDA2MUZENDg4RDE1QTZBQzhFNDRFQTFGNEI5CisgIDc6IDg3MkVBNDg2QjRFQTlELCAzQTQ5NjcxREUzNDdGNjc1QUQ3OTA0RERGNDI1NUYzRAorICA4OiBBNEVFNTc1MDUwN0ZDODMxLCA5NTZEMDlGN0M1RkU4MTJDNkZCOTgyRTFEREJFODY0QQorICA5OiBCNTg3NEFDOTY0RkJGQzFBOTcsIDkwRkJDNzVGNDVCRkY1OEIzQTExMDAzOTM5NTVEMEMyCisgMTA6IDkyRkY1RkNGMUVDNjc1RTAyRTcxLCA5ODNDOTZBN0JENEEwREI1RDNCODc3OTExQ0U4QTZCMworIDExOiBGN0JDQTY5QTlDNzAzM0Q4NEEyQkEwLCBENEVDRTVCQjlGRkNCQjMzMUE2NDZEOUNFODA3ODYzNAorIDEyOiA1RTEwNDFCNDU1NEM4Q0REMTRBQUYxNkQsIDFFRjc3N0YzMDdDQjk2Nzg4QjkxMjBGRkY4QThCQzJGCisgMTM6IDdCQjcyODlGQ0FEMjA5RDc5OTJFQjdBRURDLCBFOEFFRkI4MzBEQkFFRDJCNEE3OTBGRkVGOTQwQTIwQgorIDE0OiAxMjc3NkE3QzkzN0E2NDhGMEE4NjI4QUQ4QzVDLCBGMDcwMjgzODUyQUMwMzA4MTlFQTY3QkY4MkM3MTlBQQorIDE1OiA3MjkzNDc2RDlFOTM1RUFFOURFQjY2RjY5N0Y2NjIsIEQ2MzIyNjAzNjcxMTUzQTFFQzE0NTNDREE1OTc4RTE1CisgMTY6IERDMTJBODZDODVFNzM1ODkxOUJBQkIxNUEzQkY1RkQ3LCBCQkJGQTQ2N0VCQTgxMjRERkVDODJEQjAxMzdENTZCOQorIDE3OiAwQ0MxREFEMDBBOTg3RjlDNTdFMzY2MEQ5NDE3RjIyNkU1LCBCQjhBRjVBMEI1QkM3OUJEMTFDNUQ0MUNBODBDREUyQworIDE4OiBEMDA0OTExNUQ2RUI1NDk1RkIzOTFDREM0OTQwMjJBRUFBNDgsIDY4MkZGMzU3QjJCQzA1OTc2NUMyOUFFNkNBNjY4RDBDCisgMTk6IDQ4RkM1NEE0MDFCNEMwNkNFODU2N0FEMjk4QjY3MjE5MUM3RTg0LCA0OTNBNEFGNEMyQTg4MjhGRUQ4NDQyQzRFRkY4NzdGNgorIDIwOiA5MDc3OTc5NTgyMUNCMUI3REJEOTcwMjhFMjlEQzFDRTdEMENGQUUwLCBFMTI2RjQ4NUY3M0I2RjdCMzg5NEI0Q0Y3RTFDNURERQorIDIxOiA4Q0E1QzI0NkM4QjdDMDRCRDcxNzFDQUUyRDFBODkyRDY2MzAyNDMzRjgsIDVENzMxNDlBMzYzNUE4NkIzQzM0REVBNUI5NUNDQkNCCisgMjI6IERGMDgyQjY2NUY3QTk1MkIyNjA0QzA0NTU0QjgxMzkzRkNDN0MwQjgxNkM4LCBEMzU2OUVEN0Q0MzExNzZCMjg2RUYyMjQxNEU0Q0JBOAorIDIzOiA3NjE5MDg1MzBDOTA2OUUxODk2NDlFRDI0QjZBNjhBODlCMDY3QzMxRTk4NjhDLCBBMjU4QkNEODNEM0ZCQzdBRTJBRUY3NTE2MDI1QUIzNgorIDI0OiA3MTcwNDhGNUEzMUYzQzg5RDM3MDRGOTAwNjlBQzVENTE3NDExODc3MEM2NUJEQTEsIDA2N0VCRjE4RjdFM0RGNEVBMTNGOUFCQUM2ODJDMkEyCisgMjU6IDA4QzZGQ0M1RDMwOTkzNDdDM0ZFQkEzODU4QTZDMjJDNTEyOThDQjU5MUREQjc3ODI3LCBCNTdCRkJBNDBCRTk5REY1MDMxOTE4QTFBNEUyQ0E4MAorIDI2OiAyQ0M1M0VGN0VCOTU0MjM0RTY0Q0Q0RDYwRkIxRDcxNTdBNDg5QUJBQkMxMDkwMEZGQ0RCLCAyMzZFNzY5NjExRDE2RUI3RjQ2M0I3NTc4NzcwRjg4NgorIDI3OiAyNTU2QjQ2RjJFODMxMjIzRDYzMkYyNjkxMzI5QTg3NEY1MTc2ODdBRjgxQjgzMjJBQzU1RDcsIEUyMTNBOTBEQkMzMURDMjYxQTQ1QTlBRTQxQ0ZFRUMzCisgMjg6IDcxMjQxNzkyNzI4NTk0RDY5NzkxQjgwQUQ2REJDNjQxN0QxRDE0RDIyMkRGNUU2RjgzNEI4MkM4LCA2MDFGOTc2MTc3MDhCMTk0NUJDREE4QTgyNDk2RUZCMQorIDI5OiA1MDAzREMyRUFBQTIzRjlFMjIyMUNDQkI5RTIwMTE2NjkyQ0NDOTlCM0NGQkQwREREM0E4NDkxRTdDLCAzNzQzMTU1Qjc5MjAxMjg0NTU1MDIwNUM4OTQ5QjczRQorIDMwOiBEMDU4OTY3NTM1N0U4NTAzMzNGODU0RkJBMTYwNjg4RjA2RDEyMkRFQzAwQ0MyNjIwREEwQjI3NzA3NjUsIDIwRTA4NTc1MkZDNEQzNzc5MUMyMjUwMUVEMURCNkFECisgMzE6IDY0NUI0NkQyRDExNEVFNzMyOUYxNEFDMUQ5NEU2ODE3RUIzODVFQjgwQzYxRjAxNEY5MDUzMDc0OTA3OUVDLCA4QTE4REU4NkY5NTU1QTEwNzBEMEJGRURBQzE1QjE0RgorIDMyOiAwNjgzODkyMDZEMzdCRjVBNDFDNTgwNzVGQzk4OTAxQzNCNDJFNkYyRjEzQzA5RjRFOTI1MjQwMjFCQjFDMUM4LCAzNzBCODY5MTRENjNDRkVFODMwM0Q1MzhBNkJFQTBFNworCitHQ00tYW51YmlzICgxNiBieXRlIGtleSkKKyAgMDogLCBBMDA2MUMyRjNCMjI5NUJGQTMzQkM3NEMwMzdFQThEQQorICAxOiBFRCwgOUU1NjQ4RENFNDBERTM3QjU2QzU1N0QyNkNCMThEODMKKyAgMjogNjcxOSwgQTY2MDUyNTNDNTlBMTAxRkY4NUM1MTAyQ0U5MkJFNDUKKyAgMzogQjg4NzNELCAxM0YzRTNFRDM2NDZCQjI5NkVFNEVENUQ2Mzc5QTIxQgorICA0OiA1QUE2RTJDQiwgMTgxMkU4Mzg1RDE1QjVCQUUwNDNFNEU4NjBCRUY0OTAKKyAgNTogNEY2RjRDRDhFOSwgOEE4MEJDNUUwODkyOUM0MkE1QTc0QzVEOUFDQzBDNkQKKyAgNjogMkYwRDhCNDgzQ0U0LCAzMTZGNTg4Rjc4RkM2QTkxOTZDOTdDRTU5QjlCNjNCNgorICA3OiA4MkQ4ODVGREUxRjk0OCwgNzE2MEJGNTU2NjE0NTExRjUzNzM4QTkyQjUyNzcwNTYKKyAgODogRTQ5MzE0NjJBRDQxQjZEQywgN0NFMjRDNEQ2QjQ5OTk3NUZDQjcyQjVFMjI3NUVENTYKKyAgOTogNTAzQUE3MEJFNjk4QkM1QjQxLCAxMEVBMEM2MUZEQkE4RkY3QjRFOTkyN0JDQ0VGRDkxMQorIDEwOiA2QjJEMjEzRDE0QjVEMjVFQkUzNiwgREMzMjIyQUVEMTJFRTI2RDNEMTRFMkU3MzNFREIyQTcKKyAxMTogN0Q4QjBCQzFCNzQ0M0U3MjY3MzcxRSwgRkNBQ0ZDNzNFMzkxODY1QkU4NkUwNDFGNTFDNDVFODEKKyAxMjogOUVGM0JGODYwOUUxMzNCRUIxMDU2NUFGLCBEODQzMjZENENBQzlENUI3NEZDRkQ4Q0JBRkU3OUU3NworIDEzOiA1OUFFN0IxRkRFMTE3OENFRTdGNjNDNDg5NCwgRTFCQ0ZDRENBODZDQUI5QzY4NEY3RDIxOTYyRDU4MEQKKyAxNDogNTY0RTdCOEJBQzU1ODJBM0JGMTE3ODkxNjU2OSwgNTQ4MDREOERGNEQ3NTc3RUY2NUMxNTQ4NzY5NUY4NDAKKyAxNTogNzU4QTZEQzQzN0M4ODIxMjc0QjBGMTZGOTExQkFBLCAxOUREMjc1MDA5MTVGNDI1RjM0RjY3Q0MyMzc0REMzNgorIDE2OiAwNDY4Qzk0QTg4QTI3QUVFRTJCM0E5NzMwNjVFNTNDQywgQzc0Mzk5NkM2RjQ5MzYzQjJGNDYxM0YyNDcwM0VGN0UKKyAxNzogM0IwQ0FCQTVFRUU0NEI3QkZGMEQ3MjZFQ0VENTQ3NjNGRiwgMTREOUQwOTgxNUJDRDkxRENDRTJGNUFFMUE5OTI5Q0YKKyAxODogNUI5NDVEODNCOThDNDNCMDI0OEY5QkMwNDc5RTMzMjg2OUFCLCA2N0EyNzVGMDMxM0Q0MjQ1QjE5NjU0MTFDRkNDOEYxNworIDE5OiA5NzMzMjQ0MUNBOTZERTg1NTNBM0M2RDg5OEZDNkQ5MEM4NkRCRiwgNzMxNTBFQzNENjMyN0UzRkM4MDE1QTYxOTI2NTJEM0IKKyAyMDogQjlBMTc3OEZBRjk3NjcxNjBEMEQ4NzgxNkVDRTFCOTlBQTcyNzA4NywgMEMxNzNEM0M0MDc4MzkyQ0UzNzczMTNDNDhEMkJBRTgKKyAyMTogNTg4MkI3MzkxMUM3RDI2RUZEQ0NBM0FFRDJFREM4QThCRkZFNzVCMUY4LCA4RjhDNTM1NjM5QTBCNTk1MzdFNTkwQzdGQzlEMkU1MworIDIyOiA3MEFFQkVEOENDRkZGNkU1Q0YwNkYzRTg0MUQxMjM4N0VGOEQ2QzdCNEJERSwgNEIwMEMyN0ZDQTlCRUI4MjMzMUNDOEVCMTNEQ0M1ODAKKyAyMzogMzQ1Q0NCNTJCQzIwREM1RjFCRjVFRURGNUQ3MkE2QzQ4RjQwMjU1N0ZGRDM0MiwgMUE3OTBBMzk1NzNCODUzREJCOEUyRTczQjczMzEwMTQKKyAyNDogMDYzN0M3OEE4MTdFOTFENjNDRTE4Q0VBRjhENjVDNjEwNzI4M0E5MEM1QTk3ODQyLCA1Mjc4NkNCODE3MjRFMTJDNzZBMEQyM0Q0NjgwRTM2QgorIDI1OiA1OTUyNkQxRTg2QTQ3M0RGQjcyMEZGMjVFOTdENjU3MTA3Nzg0NUY3M0M1RTgzMjJGMSwgMzY5RkJBNzgyM0ZDODNENzI3RkZEMjVEMTAxMzA5ODcKKyAyNjogMjkzM0JCNEU3NjAzQzMxM0I2MjMzMjgyNzYwMUY4MTg5RTE0QzFGMDhFQTU0N0UxNUFCNSwgMjA0NTIwRTM2NURBRkY2NTUxQjAxNTYyQTRDRUZERkIKKyAyNzogQTQwOThDRjJBNDhBMURDMkJDQ0U2NUNDRThERjgyNUFGNTFFN0U1Rjk0QjYxODZGRjg1RDc3LCA5ODMzRUJCOUExRDVDRDAzNTZFMDIzRTJDMzc2MUMyQgorIDI4OiAyNjU1N0I5NDJGRDY5MTNEODA2NjcyRUIwMTUyNkRCRDVENkY1MzJGNzhBQjY3NTlERTM0MTVDNSwgRURBQUNERDEwMUJDNDBFRTY1MzBEOEI1REMwMzFGMzEKKyAyOTogREI5MkMzRDc3REYwQzhGNEM5ODg0NUFBOUFENDNGQjgwMDE5MkU1N0E1M0UwODM4NjJCN0UzRkFGMCwgNjI4REVCMUUzNDUzMDNBNDA3MDAyODkwNTIwODBGRjgKKyAzMDogRkM1N0JGQUMyQzc3NzgxNzIzQzJCNzIxODg2RDQ0RUQ2N0E1MkQ5QUQ4Mjc4NzRCQzRFRUMwQTk3MjgxLCA5QTIyMkRCQzQ3QjRBQjRFNTIwRDNDQzU4NTBENERFRgorIDMxOiA3MkRGQjlFOTFBNzhFQUZFNzU4QjQ1NDIyMDZBNEE5NTdCNDUyM0E1ODQyODM5OEMxMUJDRjJBRUFFMTkzOCwgMzA3RDBCODc2MTMwRTgyODA0QzExNjdFMDNCNjlCMkYKKyAzMjogNzI3NUM2RUJEQzI2ODBERkNCNzMzMjZBOTg3RDJGQkNFODNFNDBBOUFFRkU2MzUxQ0ZEQTcyNTFBNkZFMTBBNiwgODk1RTZFRUFBOUJEODg1OTQ5MDMzMjVBMDYzQ0E0NUYKKwpkaWZmIC0tZ2l0IGEvbm90ZXMvaGFzaF90di50eHQgYi9ub3Rlcy9oYXNoX3R2LnR4dAppbmRleCA3ZmQ5MDYyLi40ZjI3MTRkIDEwMDY0NAotLS0gYS9ub3Rlcy9oYXNoX3R2LnR4dAorKysgYi9ub3Rlcy9oYXNoX3R2LnR4dApAQCAtMTczNCwzICsxNzM0LDM4IEBACiAxMjc6IDNDOUE3RjM4N0I3MTA0REYxOUNGMjY0QjBCNTgyMUIyRTQ2RTQ0QURDNzkyNjI1NDZFOThGRkExMTNFQjNENDU3OTlFQUM3OENDQTQ2NDNDOTM3RkNDM0MxRDI0OUEyMTJGQUNCMzRDNjNENDVFRUM4MTA2OTA5NUQ3Q0RDRTdCCiAxMjg6IDgwM0EzQjM3Qzg5RTg0RkJCRUM3NUJFRTNEMDBERDcyOEZGQzQyNDZCNUE1RTk4OURDOERDMkNEMEY3OTM3OTY2QUI3OEM3OUUxRDQ2NDhFRTZFQjQwRjNENzA0OTFDQjQ2QjhBQjQyRTE1NTY3MkUyQUI4Mzc0RkNGNzBERDc5CiAKK0hhc2g6IGNoY19oYXNoCisgIDA6IDQwNDc5MjlGMUY1NzI2NDNCNTVGODI5RUIzMjkxRDExCisgIDE6IDg4OThGRDA0RjgxMDUwNzc0MEU3QThEQkY0NEMxOEU4CisgIDI6IDE0NDU5MjhCQjkxMkE2RDNDNTExMTkyM0I2QzVENDhECisgIDM6IEQ4NUIyRTg4NTREMTZBNDQwQ0YzMkREREE3NDFEQTUyCisgIDQ6IDVGMzA4MjEyNDQ3MjU5ODA5OEIwMzY0OUVBNDA5Q0RDCisgIDU6IDYwNEExOTYyMkEwNkQwNDg2RDU1OUEwN0M5NUIyOTdBCisgIDY6IEExNkY4OUU0REFDQTZDODE3NEM5RDY2QUEyM0IxNUFGCisgIDc6IEZDNjg5M0Y3OUEyRDI4MzE1RkJCRUZDQUYwMjgwNzkzCisgIDg6IDZBODBGMDRDQjkzQjFDRkI5NDdERUQyODE0MUU4NzdBCisgIDk6IEQwMzZEMEI0REVGMUZBMTM4QzMxODEzNjcxNDNEMUE5CisgMTA6IEYwMzFBMkRDMkExOTZCMjY4MDQ2RjczNzI4RUU3ODMxCisgMTE6IDJFMDVDOUI1QTQzQ0ZCMDFBRDAyNkFCQThBRTgyMDFGCisgMTI6IDhCNDlFRjBCQzkzNjc5MkY5MDVFNjFBRTYyMUU2M0MzCisgMTM6IDQ4NUNGNUU4M0JDNjY4NDNENDQ2RDk5MjI1NDdFNDNCCisgMTQ6IDcwNDc2N0E3NUQxRkQ2NjM5Q0U3MjI5MUFFMUY2Q0Q4CisgMTU6IDE5RjYyMjhDMjUzMTc0N0NCMjBGNjQ0RjlFQzY1NjkxCisgMTY6IEI3OEZFQzA2MjhEN0Y0N0IwNDJBM0MxNUM1Nzc1MEZCCisgMTc6IDNFRjlBRkFBRkFFOUM4MEQwOUNEMDc4RTFDQzBCRDhBCisgMTg6IDVFNDUwMUM4REQwRDQ5NTg5RjRGRkEyMEYyNzhEMzE2CisgMTk6IDAwRDJEMEZERDBFMDQ3NkM5RDQwREU1QTA0NTA4ODQ5CisgMjA6IENDNzM4MkU3OEQ4REYwN0YwQkFCNjYyMDNGMTkxNzQ1CisgMjE6IDg1Qjg0MUJDQ0NCNEFEMjQyMEJDQUJDRkQwNkEwNzU3CisgMjI6IDcxNTlFMzhGNEQ3RTRDRUJFQkY4NkE2NUE5ODRCQTJBCisgMjM6IEM4OTQ5QTlEOTI2MDE3MjZGNzdFMUFFRjBFNUYxRTBGCisgMjQ6IDhDRTM1RUY2RUM3RERBMjk0MTM0MDc3NDIwMTU5RjY4CisgMjU6IEEwRjRFNDUyMjgzMjY3NkI0OUU3Q0QzOTNFNkQ5NzYxCisgMjY6IEY1NUMyN0QxODA5NDg1ODU4MTk4MzMzMjJEN0JDNENBCisgMjc6IDBBMzk3NUEwMTEzRTFGRTZBNjZGOEM3RDUyOTcxNUI1CisgMjg6IEY3NzEzNUM1RDA0MDk2MTgxMzA1QzA5MDZCQUVFNzg5CisgMjk6IDMxRkY4MUI0OUI5MDAzRDczRjg3OEY4MTBENDlDODUxCisgMzA6IEJFMUUxMkJGMDIxRDBEQjJGQzVDRTdENTM0OEExREU3CisgMzE6IENCNEFGNjBENzM0MEVDNjg0OTU3NERGMUU1QkFBMjRFCisgMzI6IDdDNUFCREJBMTkzOTZEN0JFNDhDMkE4NEY4Q0M3NDdCCisKZGlmZiAtLWdpdCBhL25vdGVzL2htYWNfdHYudHh0IGIvbm90ZXMvaG1hY190di50eHQKaW5kZXggMzAwMzQ5MC4uMThlZGQ3MCAxMDA2NDQKLS0tIGEvbm90ZXMvaG1hY190di50eHQKKysrIGIvbm90ZXMvaG1hY190di50eHQKQEAgLTE3MzQsMyArMTczNCwzOCBAQAogMTI3OiAxRDhCMjUyNUU1MTlBM0ZGOEJEQUFGMzFFODBFRTY5NUY1OTE0Qjc4RTdEQUI4MDE3MjlCNUQ4NEMzQTdBMkIzNkEzMzgwM0Y1RTA3MjM5ODFDRjhBOTU4NkVDMUJFQUJDNTgxNTRFRkQ5MTlBRkYwODkzNUZCRDc1NjMyN0FBQgogMTI4OiA0QUFCRjFDM0YyNEMyMEZGQUE2MUQ2MTA2RTMyRUYxQkI3Q0RFQjYwNzM1NEJENEI2MjUxODkzOTQxNzMwMDU0MjQ0RTE5OEVFQ0Q0OTQzQzc3MDgyQ0M5QjQwNkEyRTEyMjcxQkNBNDU1REYxNUQzNjEzMzM2NjE1QzM2QjIyRQogCitITUFDLWNoY19oYXNoCisgIDA6IDA2MDdGMjRENDNBQTk4QTg2RkNDNDVCNTNEQTA0RjlECisgIDE6IEJFNEZCNUUwQkM0QkQ4MTMyREIxNEJDQkQ3RTRDRDEwCisgIDI6IEEzMjQ2QzYwOUZFMzlEN0M5RjdDRkNGMTYxODVGQjQ4CisgIDM6IDNDN0VBOTUxMjA1OTM3MjQwRjA3NTZCQzBGMkY0RDFCCisgIDQ6IDdGNjlBNURENDExREZFNkJCOTlEMUI4MzkxQjMxMjcyCisgIDU6IERDQjRENEQ3RjNCOUFGNkY1MUYzMERDRjczMzA2OENDCisgIDY6IDEzNjNCMjdFNkIyOEJDRDhBRTNEQ0QwRjU1QjM4N0Q3CisgIDc6IEJCNTI1MzQyODQ1QjEyNTNDRkU5OEYwMDIzN0E4NUYzCisgIDg6IDg5RkIyNDdBMzZBOTkyNkZEQTEwRjIwMTMxMTkxNTFCCisgIDk6IDU0RUIwMjNFRjlDRTM3RURDOTg2MzczRTIzQTlFRDE2CisgMTA6IDIzNThEODg4NDQ3MUNCMUQ5RTIzMzEwN0M3QTdBNEEwCisgMTE6IDk0QkFCMDkyQjAwNTc0QzVGQkVCMUQ3RTU0QjY4NEM0CisgMTI6IERGMTgxOTcwNzYyMUI4QTY2RDk3MDkzOTdFOTJEQzJGCisgMTM6IDMwNDRERkZDNzk0Nzc4N0ZEQjEyRjYyMTQxQjlFNEZCCisgMTQ6IDlFQTk5NDNGQzI2MzVBRDg1MkQxQzU2OTkyMzQ5MTVECisgMTU6IDFDQzc1Qzk4NUJFNkVERDNBRDU5MDdFRDcyRUNFMDVFCisgMTY6IDFBODI2QzQ4MTdGRjU5RTY4NkE1OUIwQjk2QzlBNjE5CisgMTc6IDQ0REIyQTY0MjY0QjEyNURFNTM1QTE4MkNCN0IyQjJDCisgMTg6IDQ3NDFENDZGNzNGMkE4NjBGOTU3NTFFN0UxNENDMjQ0CisgMTk6IDEzRkRENDQ2MzA4NEZFRUIyNEY3MTNERDk4NThFN0Y0CisgMjA6IEQzMzA4MzgyRTY1RTU4OEQ1NzZEOTcwQTc5MkJBQzYxCisgMjE6IDM4RTA0QkQ1ODg1RkVBOUUxNDBGMDY1RjM3REQwOUZDCisgMjI6IDVDMzA5NDk5NjU3RjI0QzE4MTJGRDhCOTI2QTQxOUUyCisgMjM6IEQxRkRCOUU4QUMyNDU3MzdEQTgzNkQ2OEZBNTA3NzM2CisgMjQ6IEY2OTI0MDg1OTg4NzcwRkNDM0JDOUVFQThGNzI2MDRFCisgMjU6IEM3MkIyNjFBNzk0MTFGNzRENzA3QzZCNkY0NTgyM0JECisgMjY6IDJFRDIzMzNFQkFDNzdGMjkxRkM2RTg0NEYyQTdFNDJECisgMjc6IENFMEQzRUY2NzQ5MTdDRUE1MTcxRjFBNTJFQTYyQUFFCisgMjg6IDU1RURFQUM5RjkzNUFCRUFGMjk1NkM4RTgzRjNFNDQ3CisgMjk6IDgyMEI3OTlDQjY2REM5NzYzRkZEOUFCNjM0RDk3MUVDCisgMzA6IEUxNEIxOEFCMjUwMjVCRjVERjJDMUE3M0MyMzVBRDhCCisgMzE6IERFOUYzOTQ1NzVCOUY1MjVBNzM0RjMwMkYwREIwQTQyCisgMzI6IDYyNUVEM0IwOTE0NEFERkY1N0I2NjU5QkIyMDQ0RkJFCisKZGlmZiAtLWdpdCBhL25vdGVzL29jYl90di50eHQgYi9ub3Rlcy9vY2JfdHYudHh0CmluZGV4IGFlZmQ4ZmQuLjY0MjkyMjggMTAwNjQ0Ci0tLSBhL25vdGVzL29jYl90di50eHQKKysrIGIvbm90ZXMvb2NiX3R2LnR4dApAQCAtMTk5LDYgKzE5OSw4MiBAQAogIDMxOiBGMTc1MjMwNjA2MDQwQURBQ0VCQUZFNEQ1OEJCRDE0MEIyRDQ1RThCRjdFNUM5MDQ1MTBCNThFNEI1M0QzRiwgREFGNTc5RTFBMTI0ODFEMzlGNERDRkI3QzI4Nzk0QjEKICAzMjogMjYxMzg4RDQ5MUVGMUNCOTJDMjYxRkQ5QjkxQ0FENUI5NTQ0MERFMEE3NDcxNDRFQjg2OTc2OTlGNjAwODAxRCwgNzQ5MDU2RUJFQUY0RjIwQ0Q4NzQ2QUE4Qzg4NDZDNDcKIAorT0NCLXNhZmVyLWs2NCAoOCBieXRlIGtleSkKKyAgMDogLCAwRUREMkExQUI2OTJBQTdBCisgIDE6IDNFLCAzMDZGODE0RjNDMkMxMDlFCisgIDI6IDA1OTMsIDA2M0QxOUI3MzRDMzQ3MTUKKyAgMzogQ0E3MkM2LCBERjZEQUFGQUQ5MUJFNjk3CisgIDQ6IDA4OTI0QUVFLCAxNTA5NUZBNDlFNzg5NDgzCisgIDU6IDM1OTkwOEE2Q0QsIDE2Q0I3RjA3NDFCQTQwOTEKKyAgNjogOTdGM0JEODIwQ0Y0LCBBNTlEQjE1QjY3Qjk1RUU4CisgIDc6IDBBMjY3MjAxQUMwMzlFLCBCNEZGQzMxREJDRDgyODRBCisgIDg6IDlGNkFDRDk3MDVDOUVDQzUsIDZCNDFBOTM4RjBCMUNBRUIKKyAgOTogRjM1NUQ1QTkzN0REMTU4MkMyLCA5RDFGOTMyRTUyMUNCOTU1CisgMTA6IEVEMzk3NThDQUY4OUU3OTMyRTQ4LCAzOThFRjUxNzAxNUYxMThGCisgMTE6IEQ4QUNGMTkzNjNBMEUwQURDOTMyMUIsIEY5OEIyQTMwMjE3NzY2QUEKKyAxMjogRjhGNTRBODIwMkIwRjI4MUVENjEwRjMzLCAzNkVGN0ZBNEEyMEUwNEI3CisgMTM6IDBGODY3N0RGNjRCNTk4MkRCNkUyMjk5MTQwLCA0REVEMkRBODA2ODM0QzgxCisgMTQ6IDBDMzU3QTlEQzMyMUM5M0IzODcyODgxNTAzQjAsIDc4MTREMUMwQzZBODkwMEEKKyAxNTogMTBCNkIxQTI2MUMzMDE1QTE4MTEwQUQyMDBBN0I2LCA5QTgxNEQ2RDJCQUQ4NTBDCisgMTY6IEFBOUVBOUQxQkE3ODE4QzBEMkVCRjIzNzgxQTU0NjdELCAyMzZBMjRGQzk4ODI2NzAyCisKK09DQi1zYWZlci1zazY0ICg4IGJ5dGUga2V5KQorICAwOiAsIDc2RjE2QkRDRTU1QjNFMjMKKyAgMTogNjMsIEYzNEIwQjQ3MUY2RjhGNzUKKyAgMjogODY1MSwgRDdFRkUxNzk0M0QzNTE5MworICAzOiBENDU1MDQsIDI2MzIyNEU1MEU3RTlFNzUKKyAgNDogNTdCNDE0QzMsIEE1NTNENkNBQkNBMEYyODUKKyAgNTogNDk3NkUzQjMwMywgQUM1RTk5NjlGNzM5RUJEOQorICA2OiBGMTBBQjhFQjk0RTAsIDgzMDFGRkU2ODg0OEQ0NkQKKyAgNzogNkU5NTQ1OTNBQzQyN0QsIEMxQ0Y5M0JCQzBGOTI2NDQKKyAgODogRjQ4RjQ0NDQxQjg5OEMwRiwgNjk4RkZBRUQxQTk1RThFNAorICA5OiAxREM2MDE1NkQ2Mjc4MkUzRDAsIDZBRkYwRENDNjVENEM5MzMKKyAxMDogNzE5MjBBREM4OTk3Q0I4QjNBNzIsIDFDMTAxQzZBMjdDRkJCQkQKKyAxMTogODkwRUQ3NDkyRUQ5MTRBQzIwMzkxQiwgRjY2RENENjIwNUQ5NDVDNgorIDEyOiAxQjlGQUI4NEE4NzQ4QkFDMTg3QzczOTMsIEI0NTA3NTdGQ0FGQUFENTIKKyAxMzogQjRDODlFMUJCMjgwREJDMjY1RTQzQUNFMTUsIEFFNkJCM0QyRTZBMzcxRkYKKyAxNDogMjRCMEMyODk0NEJERjIyMDQ4RTJFODY2NDRGNSwgODRFOTNFMjE5MUNFRjE3QQorIDE1OiA4RjJENTY5NEQ1NUVFMjM1MTY4QUFBNzM1OTQzQUYsIDUxNDI1MkFFRjJGMkEyRDkKKyAxNjogNTY4QjdFMzFGRkRBNzI2NzE4RTQwMzk3Q0ZDOERDQzYsIDNDODBCQTdGQ0E5RTQxOUUKKworT0NCLXNhZmVyLWsxMjggKDE2IGJ5dGUga2V5KQorICAwOiAsIDQ5MTlGNjhGNkJDNDRBQkMKKyAgMTogNjUsIEM2Nzg1RjdCRTRERTU0RDMKKyAgMjogRTFCMCwgQzE5N0M5M0I2M0Y1ODM1NQorICAzOiBCQjcyNDcsIERGRTA5MkVGODE4NDQ0M0IKKyAgNDogMzhDMkQwMjIsIDk0M0ZEOTk5MjI3QzU1OTYKKyAgNTogRDcxRTRGRDBFRCwgNTEwNDBGRTlBMDFFQTkwMQorICA2OiBDNEIyMTFFQURDMkEsIDMyOTQyOUJFMzM2NkYyMkYKKyAgNzogNDI2REVCM0ZDM0E0QkMsIENGMUM5NzZGNkExOUNFODgKKyAgODogQTZGODEzQzA5Q0U4NDgwMCwgOThEOUZGNDI3QjNCRDU3MQorICA5OiA0RDFBOTk0OEZEMTU3ODE0QjQsIDVBMzg5RkFFRUI4NUI4QzYKKyAxMDogRUMzRUExNDJDM0YwN0Y1QTlFRUIsIDMxRTI2RTEzRjAzMkE0OEYKKyAxMTogQTc1RkIxNDM2NUQxNTMzQ0QzRkJFNywgOEVGMDFBQ0M1NjhDMDU5MQorIDEyOiA4OTE1ODJCNTg1M0RENTQ2RkYzRUEwNzEsIEUwMTNDRkZFNDMyMTlDMjEKKyAxMzogNTRDQTg0OEM0OURDREVFMDc2NzgwRjIxRjQsIDI5OEVGQzdCNEQ2QjZDRkUKKyAxNDogRUE3NjExQzY5QTYwRjFBMkVGNzFENkE3NzYyRCwgN0Q5QUE1MUNGQ0VDODEwMQorIDE1OiBCMkQxQTIxMUJDNTI0Qjk2NUEwODRCQjRCMjE3MTAsIDdCMkFDMEVFQjUyMTY4OTIKKyAxNjogNUU4MUYxQkZBMjcwRTgwNEE0ODhDOUJGQUI3NTgxMUQsIEE2N0Y2MjdDRTFFMzc4NTEKKworT0NCLXNhZmVyLXNrMTI4ICgxNiBieXRlIGtleSkKKyAgMDogLCBFNTIzQzZEQkIzQ0ExNzhECisgIDE6IDVFLCBCMUNCN0VCRTU3ODBERjk4CisgIDI6IEY0RDgsIDgwMzYyMzVGMkJFN0E4MTcKKyAgMzogNEZFMjY4LCAxMjMzMjAzOTRFQUMyNEY2CisgIDQ6IEE1QkEwMkI0LCBCODI3NkI1RTAyN0Q0NURBCisgIDU6IDE1NzE4NTlDQ0MsIDI5NDA2QzVGMkRGMkNGQzQKKyAgNjogQ0ExRTQ3NDQ3Qjk1LCA1RDRGQUY4RkQ1MzQxNzkxCisgIDc6IDg3MTBEQjM3MDIyRDk2LCBFMTAwNDBGRUE5QUVBOUMyCisgIDg6IDIwNTk5MERDOUEzNERBM0MsIEFFMjVDQjQ5QUE3QTY5N0IKKyAgOTogNzU3QUZDQjMxOTFEQzgxMUMzLCBBQThDQURBODYzOEQ2MTE4CisgMTA6IDY5OTRGOEMxNTM1MjIzNjFCQjkyLCAxQkNFRTA5RTkyOEVCMThCCisgMTE6IEE4NkZBMENERDA1MUJCNjBBRjVBQTgsIDUwQTM4RjhFOTg4OTM1NEQKKyAxMjogOEQzRkQzRUI3RkYyMjY5QUFDRkQyNEJBLCBDQjUxQ0Y4NENFRkM0NUYwCisgMTM6IDAzRDJBMzEzOTI1RDk0OTBGQzU1NDdGOTVGLCBBMUZGOUQ3MkUxMUM0MjBCCisgMTQ6IEQ3N0MwRjBGNjAwRkU5MkYxNEY0NzlGQTQ1N0MsIDFFQkUxQjRCOTY4NUVERkEKKyAxNTogMENBRjBBOEJFQjg2NEUyNjA1OEM3REY4RUJBMEVCLCAxQjE1M0REQUU4MDc1NjFGCisgMTY6IDExM0QxMjcxNkRGRTA1OTZBMkYzMEM4NzVFQzZCQTBFLCBDNjFGNUFDMDI0NTE1NEE2CisKIE9DQi1yYzIgKDggYnl0ZSBrZXkpCiAgIDA6ICwgMUEwNzNGMjVGRjU2OTBCRQogICAxOiBGNCwgM0QzMjIxRTkyRTQwRjYzNApAQCAtMzI5LDMgKzQwNSw1NyBAQAogIDE1OiAxRDVBN0FENTU2RkYzMDc4Mjg0QkIyMUE1MzZEQUEsIDAxRkFFMkY0OTM2RUQ5RDIKICAxNjogNEI4QjcxMzk2OTI0ODgwQ0IzM0VBNkVDNjU5M0Y5NjksIEEwRjRCMUJFM0I5QjRDQ0UKIAorT0NCLWFudWJpcyAoMTYgYnl0ZSBrZXkpCisgIDA6ICwgRDIyQUNGODgwQjI5N0RCMDUxM0RGQUYwRDJERjU3RDkKKyAgMTogNTksIDIxMEExNzk0NjlENjU2OEFCOTQ3MEM3NjA0MTU1NzRFCisgIDI6IEFGQTUsIDEyMjNGOUNEMTYwQUJFMkYyNTcxNjRDNkU1NTMzQzg3CisgIDM6IDk2OUJFQywgQTU3RUM3Njc1NDNDQTJBREJBNEY1QTc0MjNFQ0E3OEEKKyAgNDogQ0Y4QjMxRjEsIDEzQjVCRjlDRDg3Q0UxNUNFNjk2RjNBRjFCMDgyNjUwCisgIDU6IDlCMjJERjM4NTIsIDQ5MzdGRERBMEFGRERBMDRDQ0Q1M0NDQkIwQTgyNzQ1CisgIDY6IEUxMTcxOUIyRjBGOCwgNjg0NzkzMURCRjAyMjNGNUNFRjY2QUUzRjRERkNGOUIKKyAgNzogNUE4NUUwRjZERDIyNjYsIEExQTBBRjQ1QTY4QTY4MUNDMzk2NjE1RkUxRTFERkI1CisgIDg6IDdGMkRGQ0M2NUVEODY5NzYsIDEzNjE0QTNDNkUwRTA4NjExRDhERjhFRTVCN0Q3ODhGCisgIDk6IDFEQUYxMERGQTNGMUQ1M0U1MCwgNjczNjMyQjZERDU1M0JBRTkwRTlFNkNDOENERTBGQTUKKyAxMDogQUY3NEZEOTY3MUY5QzBBOTg3OUMsIEI4QjRERDQ0OEZFOTY3MjA3MjI3Qjg0RTQyMTI2RDkwCisgMTE6IDQ5NDIxQ0VEMTE2N0E4ODJFMjYyOTcsIDIxQzg5NTFBMTc2MUU0QkQxM0JDODVDQkQxNEQzMEJECisgMTI6IEJDMEJDNzc5QjgzRjA3RDMwQ0IzNDBEQSwgRkFBQkQyNUUxNEZGRDhENDY4QUQ2NjE2MDIxRjYwNEMKKyAxMzogODQzRDdFMDBGOTRFNjFBRTk1MEI5QUExOTEsIDA4OTMzRUQ1RkJEQ0FGNzJGNzg4MzkzQ0Q1NDIyRDBGCisgMTQ6IDI5NkYxNUMzODNDNTExQzM2MjU4RjUyOEUzMzEsIDhCRkZBREY1NjU1QzE4NjQwNTdENjlBNjcwNkQxNzM5CisgMTU6IEUzMUQyRTgwQjJEQkE0RkJGQUY1MkRCMDUxMzgzOCwgQzRDRDM2ODIxRUM2MzFDQ0JGMUYyNThFRTk5MzEyODgKKyAxNjogODdGMzE5RkU5QTQ4RTJEMDg3RURGOTU1NjM4OTZFRTUsIDUxNzk2MDQ4OEU1QTExOEQxNTBBMTU3M0U3NkMyOTBBCisgMTc6IDk2MzJCN0RDMTc0MEJCRTBBN0FFRUZEMEY1MzVCNUFFOEEsIDBDMjREMDk1MDg3MzYyMUQzMTlBOTI4ODYyRDNBNkFDCisgMTg6IDM1OTQzMUVENEIzQUM1MzcyMzhDQUMyRjg2MTI2OTcyRDQwMywgNEEwQ0VEMkY0QkZBMzM1NUMxN0Q2QzVERjlGQUJGQUEKKyAxOTogRTE1QjUwMTcyRUU4REE5QzU1MkQ0NDhBNUE0OEJFRUFBMkYxMUQsIDgxNjZCMkEyRDNBMDc0NUQxMDU1RjlGNTAzRkQ2QzAzCisgMjA6IDc1ODQyRERDMEQ1RTNCRDgwMjI1RTRCRkJEMTI5ODQyMTI0NEQ3RUYsIEJCOTU3QkIyNTgyQjY3QjYzOTc4QkNGRDdBOTQ5RURECisgMjE6IDNERDY5MTYyNzE2RDVGM0UwOTZFNjE0OTkxQ0FEN0VEOEUwMUY5MjZCOCwgNDBBOTU0RjMxRjVCMEEyQzVERDIyMEFDRUQ4RDJCM0UKKyAyMjogOEE0OUFDMTRGNTk1OTNENTM5OUExMEY5MzQ2RTJGRDM2RjQ3RjY0RUQ0MTksIDQzMjRENDA4Q0U3Rjg2MzcwNDk1QUYxNEZCRDFBODU5CisgMjM6IDZBQThGQTM1M0JDQUFCNDI2MjIxMUQ3NUYxM0QyN0JFMTczNTI2QjhCQzNDRkMsIEJBM0EyN0Q3OUVDOEVDQkM1QTc4Q0I5RkQwOTVCNzY2CisgMjQ6IEI5MTgxOTJCQjcyQ0ZFRjk4MDI5OEVFRTU3MDQ2MDM1NkE0QkExNzU1NTc2RkVBQSwgRUIzNDFFQ0UwQTA3MEU3NjlGNDk4NjAwRUU0RUJGNzcKKyAyNTogQkVGQUUwQjc3RTQyQTJGRDE4OTU4RDlFNDMyMDJFOEEzMzg1NjJBRkY4MzE3NDYxQjAsIDQ0NEMxRDZCREMwMjZBMDEwMTJCQjJDRUVBRDg5QzJDCisgMjY6IDA3RTg2RDQ5Q0ZGRTZGQjA4RkRGNDQ1ODQwMzNBRjMyMTQ0NzAwM0Q4QUQzODYyQzAwQzksIERBOTM1NUE3OUIyMjRFRjY2MkRBNjVGMTlCRTQ5NEE3CisgMjc6IDkxMUJCMjIzQUM2RjZFNTQwODJGQkZFREVDMzAwRDczRkNBRjcxNUNDQTM1OTQ5MjEyQjM3MiwgMzQ5NjE2MEE0NkEyMURDREI1QTRDMTc5RjE1OUQ4NjAKKyAyODogQUJCNTYzRkM4MDM3MTVGNTlBQTM1NDYwRTk4NDcwRTJFOTRFNDI3MDQ1NUFDRUJGNDI5NzY0MUIsIDg5OUNGRTE5NDZBMDYwREU2MjA4NzlCOEE3NDY0NzE4CisgMjk6IDQ3RDk4RTgzQjU4NDlDREUxOUIxNEFCQ0Y5RUE2Q0E5Njg0QUI0OUEzQUIzNkJEMTRGMzI4RDgwOEMsIDZENzZDRDVFRkY2RDRBRDNCNjdBNTZERjFFQjQyRTA1CisgMzA6IEM4QkYwQjcxQTk1ODg0RkZCOTNENjRDNTdFMzI3QTQ3NTRFQzVBMUVFMjY2MzJDRjhFMEI2QjI2Q0JERSwgMkIzQkU3ODUyNjNCMUE0MDBFNTg5MzI3M0FGRDA5QUUKKyAzMTogOTgwNEQ2NjhDRjJENzVDQTU4Qzk2NzFGNjU2MzBFMzM5MDkyNjlCOTUxMUFGOTExOUJFODhFQkIzNUYwMEMsIDNEREEwMjhCMUEyMzM5Q0E4MTdEQzhEOTM3MUUwRkY4CisgMzI6IEY2RTAzOEE4MkEwOUJDRDIwQkFBQzc5MjZCMjI5NkI3OEY5Q0JBOUREMTJDNDk3QzQ3RUEwOERCQ0Q4Q0VBM0EsIEEyMDNGQzFFNjhFMjFBNTJFNzIyMjQ4OTFBQzEwRUUyCisKK09DQi1raGF6YWQgKDE2IGJ5dGUga2V5KQorICAwOiAsIEJERURGRjdBQTAwNzAwNjMKKyAgMTogMDAsIDY3RTk1MTU4MkQ2NkVEOTMKKyAgMjogNUZFRCwgMDlEQzhBRUFENzA2NzNERQorICAzOiAyNkE3Q0MsIENFMTQzNkNFMUUzN0Q0QjAKKyAgNDogM0QyQkQwNjMsIDU3NEMyNDM5NUYzMTUxMUEKKyAgNTogNTk3RjFBRkNCMSwgNkZCQkU4MjBDNkYyNkNEQgorICA2OiAyMDJEQUU0NDJERjYsIDU4Q0E2RTU3MDZDOTg1MkQKKyAgNzogN0MyMEVEQTE4RTk0NDQsIEFBQkYwREEyNTJBMUJBQUQKKyAgODogREVDMDJCRjc2REZENUI3NywgQTBBOTc0NDZCODBFQUNCNgorICA5OiA1RDdBNDJGNzM4NDNGOTIwMEUsIEExREQ2MDMzNzJEMTI0Q0IKKyAxMDogMEQ0NzEwRTQ1NEMxOUI2ODM2OUUsIENDNzhFOUQ3RUFBNkEzOUYKKyAxMTogMTI2Njk0MTkxQkYwOUEyOURDRjQwRSwgNzZDOUI4NEZBM0U4OTEzRgorIDEyOiBBOTRFQkI4NkJEMzI1QjRGQTE5NDJGQTUsIDYxM0RFMzEyREIxNjY2RjcKKyAxMzogNEY5NDYyMzg2NDY5RUEwRUZEQzFCRkFGRTksIDUyNDcyNDRGRDRCQkFBNkYKKyAxNDogNEVCNzk0REZDRjM4MjNCREMzOEZBNUVGM0IyMywgMEMxMjAxN0I1RTA1ODM5OAorIDE1OiBEODcwNDc5NzgwQ0M1QjNCMTNBN0EzOTAyOUE1NkYsIDAwM0QzRkNEMzFENDk3QjUKKyAxNjogQTQ3QkYxMjE4QUM4NkE2MEY2MDAyQ0UwMDRBRjVFNTAsIEI0RUMyNzA5MUQ1RENENTgKKwpkaWZmIC0tZ2l0IGEvbm90ZXMvb21hY190di50eHQgYi9ub3Rlcy9vbWFjX3R2LnR4dAppbmRleCBlNzRmNzZmLi41NmQ4ZGE2IDEwMDY0NAotLS0gYS9ub3Rlcy9vbWFjX3R2LnR4dAorKysgYi9ub3Rlcy9vbWFjX3R2LnR4dApAQCAtMTk5LDYgKzE5OSw4MiBAQAogIDMxOiBDMjRGQ0E1REQ0QUUwREYyQkZGMTczNjREMTdENjc0MwogIDMyOiBEQzY3MzgwODA0NzhBRjlBRjdDQTgzMzI5NTAzMUUwNgogCitPTUFDLXNhZmVyLWs2NCAoOCBieXRlIGtleSkKKyAgMDogNzI2RkUyREQ0MEE0MzkyNAorICAxOiAyQTEzOEI2NUVCMzUyNjIxCisgIDI6IDk1ODhBMUI1M0UyOTYxNkMKKyAgMzogQzAyNURFRkRFMUE1OTg1MAorICA0OiA3M0QwNjJGMUI2RDhFMDAzCisgIDU6IDk0NDU5OEEyRkM4QTJENzYKKyAgNjogQjE3NkMyNUQ4Q0FGRkM5OAorICA3OiAxNEYwNTAxNERFNkEwOTBBCisgIDg6IEE3Qjk4NDdCMkNFMjJEMEYKKyAgOTogRkNENzEzMTBDQkFBM0E2MgorIDEwOiBCRkYwMENFNUQ0QTIwMzMxCisgMTE6IEJFRTEyQTIxNzEzMzNFRDUKKyAxMjogMzMzRkQ4NDlCRUI0QTY0QQorIDEzOiBEMDQ4RUM3RTkzQjkwNDM1CisgMTQ6IEYwNDk2MDM1NjY4OUNGRUYKKyAxNTogOUU2M0Q5NzQ0QkYxQjYxQQorIDE2OiA3Qzc0NDk4MkYzMkY4ODg5CisKK09NQUMtc2FmZXItc2s2NCAoOCBieXRlIGtleSkKKyAgMDogRTk2NzExQkEzN0Q1Mzc0MworICAxOiA3RENGRjI2QTAzNTA5RkUxCisgIDI6IDBBMjBFRjE5QzhFRTlCRjIKKyAgMzogRkUyODgzNzQ4QTY5NjNDRgorICA0OiA1NTcwNjAxOTVCODIwQTE4CisgIDU6IDc3MUE3OTMxRkJCRTVDMEYKKyAgNjogNkJEQkNFNUY5NkNGOTFEOAorICA3OiBGM0I5MjRDQ0U4NzI0NTk1CisgIDg6IEVDNzE5MTI4NkQ4M0MyQzMKKyAgOTogOTRGNTVCMTlCQjdBOEFDMQorIDEwOiAyMTg5RjRGMkIwNkE4Q0E0CisgMTE6IDk5ODUzREFFQkNBMzNBNDYKKyAxMjogNjZFQUMzN0EwMzM4MDJENworIDEzOiA4NDVEN0FBODY2RjhBOEFECisgMTQ6IDMzQTg3NERGRUNBQzIyQUMKKyAxNTogNjNERDlGN0E3RjM2ODNERgorIDE2OiBFQUMyNzdEOTUxNjc2QzQ0CisKK09NQUMtc2FmZXItazEyOCAoMTYgYnl0ZSBrZXkpCisgIDA6IDgwMzdCODlBRjE5M0YxMjkKKyAgMTogRkYyMzE0RTg3QkE2QUZFMQorICAyOiBDMzI0M0RGODk2QjYxRDg1CisgIDM6IDBGNjFDNzE1Q0U4MjFBQjgKKyAgNDogRUJGREM2QTlDRkQyRjVBNAorICA1OiBBQjY0OTdEN0FGMkM3RkZGCisgIDY6IEM5MjBDRUVCN0MxODE5QzIKKyAgNzogM0UxODY5NTFCNTQ1QTdFNQorICA4OiA1RUEzNkE5M0M5NEFGNEFDCisgIDk6IDZBMkM1OUZBRTMzNzA5QkUKKyAxMDogQkYxQkFGQUY5RkMzOUMxOQorIDExOiA2OUVCNkVGMDQ2Njc3QjdDCisgMTI6IENERENFRTZCMjA0NTMwOTQKKyAxMzogQTM4MzNCRDNGRUQ2ODk1QworIDE0OiBCNkMwNUU1MUYwMUUwNDlCCisgMTU6IDkwQTJEMEVBQjczOUQzOUIKKyAxNjogMDdCRjYwN0ExNjFEMEE2NgorCitPTUFDLXNhZmVyLXNrMTI4ICgxNiBieXRlIGtleSkKKyAgMDogNUU4QjEzN0EzOTQ2QTU1NworICAxOiAwMjI4RkE2NkIxM0YzQzdFCisgIDI6IEE2RjlCQkFGRjA1MERDREQKKyAgMzogRjc1ODgwRjY4NEE3OTZDRQorICA0OiBFMEFFRkI4RTMyMDQwRUJECisgIDU6IDlGNjVENjU4Qjg2RDMxMEYKKyAgNjogM0ZBNTI4MDRGQjQ2Q0NBQQorICA3OiAyRjZEMTJEMTk5RkNEMkZCCisgIDg6IENCNTZBRjYwQUZCNEQyQkIKKyAgOTogOEU2RjBGRjZGREQyNjJGRAorIDEwOiA0OTAyNDVCRTNDQ0NFREUyCisgMTE6IEVGRDMxOUFFNDZDNzMwMDUKKyAxMjogNDNFMDBFNTQ1Qzg0ODk5NQorIDEzOiAxMDQ0NEI0MUVDQTE1RUJFCisgMTQ6IDUyMTc3NUMzODlENUJFNzEKKyAxNTogOUI2ODNFRjhCMDk3RkVCQQorIDE2OiAzQzVENzQ2RUVEMDk1MzBBCisKIE9NQUMtcmMyICg4IGJ5dGUga2V5KQogICAwOiBGMDAxRkU5QkJDM0E5N0IwCiAgIDE6IDhGOERDOUM5NTI4OTdGQkQKQEAgLTMyOSwzICs0MDUsNTcgQEAKICAxNTogRUQ5MUY5OERBOThGNDJDNAogIDE2OiBEOEQwRkE1Q0U5NkIwOEJGCiAKK09NQUMtYW51YmlzICgxNiBieXRlIGtleSkKKyAgMDogRTY3MjYxN0NBQTFFNjQxQzBFN0I0QjRDQzQ3ODc0NTUKKyAgMTogQzBDMTZFOEZENjM5MDdDMDhBOEFCQkI3QjczMzc2RDMKKyAgMjogMjNGOTdDRUQ1NDkzOTM2MTgzMDM5NjIyNEE3QkREOTEKKyAgMzogN0ZEODdERUE5RjA1RTA3MjEyRERGNjEyOTJEOUUxM0QKKyAgNDogOTI5QTExQTREMDk5MUE2NDQ2QjEwNTE5MjZBNjA0OEQKKyAgNTogNEVCNzRGMUNDMDE1MEQ4NjEyNkJDNkZFMUZDODI1M0QKKyAgNjogMzNDMkMzQzA3MkQwNUJCNkQ1NEY4NzU3OUMyM0IxMTYKKyAgNzogREUzNTAxODFDOUU5MEE3OTg3OTgxM0E2MDlCRTc3RTIKKyAgODogREI1MTlFQjlFRjBFMTU0RDlEMjQ4NzM0RkQzRDM3MjQKKyAgOTogNEY3RjJFNkQzRkM3MkJBOTRGRTI0RUMwQUJCRjRFNjYKKyAxMDogRDY0NjM4OURCQ0VFREQ1OUVCQjZFOEYwOUM0MjI5MzAKKyAxMTogODU0NzY1OEFFMUNFNkE4QjhEMDEwQTFFMUZFQTdBRjQKKyAxMjogQzlCRTJCN0YzNjMwRUZERkJEM0FFQTZBMTA4Qzg2RUEKKyAxMzogMjkwNDE3QzU3MDk2QjhCOUExQkEzQzIwRkQ5MTI4NUIKKyAxNDogOUFGNjBFOTk2OTJDNUY5MTFDQkY5NjlBNkUxMURDMTQKKyAxNTogQ0RBNDMzQkU1OEM5OEU0OUVCQThBNzEwOEU1MERFMkIKKyAxNjogNzQzMEQwRUU2MzFBNDY1OTM1MUI4QTQ0ODlBNzhENDYKKyAxNzogRENDNzRDMEZEMDQxNTc2OEZFMDAyMjVDQTE0QjdEQzIKKyAxODogMENGMjQzMkIxQjQ2NUYyQThDNUZBQ0FBRjJGRUY2MTkKKyAxOTogREEwMjA2ODBDNjRFOTNBRTVGQ0EzRDcxNDY2RDAxQzEKKyAyMDogQjlDMzNBODZFNkVEOUZDQ0RDRDk3MzM4MkREMUI2QTMKKyAyMTogNjYzMTIzNkI5RjJGODEwREQ0RDk3RTYwNDZGNDFBRjIKKyAyMjogMDMxMkMzMjJGNEQ2MzRDRjRGQkMwQzI2MjRFM0U5RjIKKyAyMzogMTExRTNFOUY4RkJEQzFFNDM2NDYyMjcyM0YxQ0I1MjQKKyAyNDogNkQyNjA4RDdBQUYyNDNENTIxOUUxNDUxMzg5NUJGRjYKKyAyNTogNjgzQkQwMUI0M0NCQzA0MzBBMDA3QUNCQUIzNTdEQzkKKyAyNjogMDFCOEZDNjVDNTZCMEYxQTVCRkVCRURDQ0Y2NzQ4RDkKKyAyNzogNEQ2Mjk4RDYzQTgwRDU1NDkxNjk3QTZERDhFMzY5NEMKKyAyODogNkYwMjA1RTRFMDgzQ0FCMDA3NDdENzIzMzAwNTEwREYKKyAyOTogNTE4M0JBRUVGMDVFOTQwMkE5MzVFQjlBRkYwQUEyQTkKKyAzMDogMUU2NzNCRkFENDk0NDY0M0E3NDBDNTlEOTZBNTkyNUMKKyAzMTogOTQwRkI0MDAwRTM0RUVFNzhFOERCNDAyRTRBNzY1MDIKKyAzMjogODdCMEM0OEYzRDE1NUFEODVEMDUwMkQ5NEE0NTcyREUKKworT01BQy1raGF6YWQgKDE2IGJ5dGUga2V5KQorICAwOiA0RUJFRkE0NjA0OTk0MjRGCisgIDE6IDk3QUVFQUQ1MUU1NDFEMTYKKyAgMjogMjlBMzUyMTI5MTBDOTU5NQorICAzOiBBQkQxNTc3RDYyMjA3NEVBCisgIDQ6IDcwQTUzN0RFMTRERDc2NUMKKyAgNTogMjQwQTE5MDE2REU5OUM1MQorICA2OiA0RDQyQzEwQTlGODAzMTc3CisgIDc6IEY0NjRCQzNFMERCNUE5MDkKKyAgODogMUM2NUEwMUE3QzA4REFDNworICA5OiBFNDlBMTQyOEMyMzBDMjA5CisgMTA6IDE2REQwRkVCN0E2NTA1QjgKKyAxMTogMkREREIzRTM1QTA1QzIyMAorIDEyOiBFQzg4OTEwQzc5OUFDNkNDCisgMTM6IEIyQTY1QzlFRjM5QkVDOEEKKyAxNDogRjBEMjM2NkJBOTFERkZENQorIDE1OiBCQ0FCNjIzQ0FCN0FBQTIzCisgMTY6IDlCQ0VBQjg1NzU5NkU0NzgKKwpkaWZmIC0tZ2l0IGEvbm90ZXMvcG1hY190di50eHQgYi9ub3Rlcy9wbWFjX3R2LnR4dAppbmRleCA2YTkyMGNiLi5lMGExOTAwIDEwMDY0NAotLS0gYS9ub3Rlcy9wbWFjX3R2LnR4dAorKysgYi9ub3Rlcy9wbWFjX3R2LnR4dApAQCAtMTk5LDYgKzE5OSw4MiBAQAogIDMxOiAwRDA2RjJGQUVDNUFBNDA0QTQwODdBQUVCQzREQkIzNgogIDMyOiAwRjM5NkZFOUUzRDlENzREMTdFQjdBMEJGNjAzQUI1MQogCitQTUFDLXNhZmVyLWs2NCAoOCBieXRlIGtleSkKKyAgMDogMkU0OTc5MkM3OEMxREE1MgorICAxOiA3QTUxMzZGNEZFNjE3QzU3CisgIDI6IDZGQzg1NzVGNkYzRDc4RUMKKyAgMzogN0MwMzczQ0FFQUFBNjQwQgorICA0OiA5RDQ2OUU3RkY2QzM1RDMxCisgIDU6IDc3NTVENjJERDdEODgxMTIKKyAgNjogQUREOUU3ODU1QTk1OEM5RgorICA3OiA3NTJEMjlCQTgxNTBGMThFCisgIDg6IDA5NTQ2NDlBOTk1OTYxMDQKKyAgOTogMDVENEQ3NUE5RkFFMjMzRAorIDEwOiAxQUFEQUZEN0I0QjI1MERBCisgMTE6IEU3QThGMzFFRDc0REEzMkIKKyAxMjogMUE3NERGNjFCREI5REY5NAorIDEzOiBDMzhBNjdCMTk1NUM0RTBECisgMTQ6IEVCQURBQTQ0NzQ2QURGMTYKKyAxNTogQzBCRkJCMDkyQ0U4MUQ4RQorIDE2OiA5ODQ5NzU2NTdGM0ZGMkIwCisKK1BNQUMtc2FmZXItc2s2NCAoOCBieXRlIGtleSkKKyAgMDogRTg5MTdFMTYyOUU3NDAzRQorICAxOiBBRTgwNjFBNUU0MTJBNjQ3CisgIDI6IEM5Njk3NzFDRTVBOUIwQzYKKyAgMzogNzgxNTlDMDFEMEEzQTVDQgorICA0OiAxREQ0MzgyQThGQzgxOTIxCisgIDU6IDQwODY4ODBGRDg2M0MwNDgKKyAgNjogQTUyMEI0NTYwMEEzRkExRAorICA3OiAwRjBBQjUxMThENzUwNkM0CisgIDg6IDIyRTMxNUYyREQwM0JDQzYKKyAgOTogNUVDQjU1NjFFRTM3MjAxNgorIDEwOiA0NDZBOUIyQkNCMzY3QUQ2CisgMTE6IEIyMTA3RkUyRUI0MTFBRTkKKyAxMjogNUE1MzlCNjJGQjU4OTNERgorIDEzOiBGNDRFRTFFQjMyNzhDMkJBCisgMTQ6IDI5M0ZFQTU2RDFGNkVBODEKKyAxNTogRjM4RjYxNEQyQjVGODFDNAorIDE2OiBBQjIzRjdGOEY0QzEyQTdFCisKK1BNQUMtc2FmZXItazEyOCAoMTYgYnl0ZSBrZXkpCisgIDA6IDdFMEJERTExRUM4MkZERTYKKyAgMTogODk0MkZCMDE3QTEzNTUyMAorICAyOiAwQjA3M0U2RDBGMDM3QTAyCisgIDM6IERCRjg4NDM5RDY3MUVENEYKKyAgNDogQjg5NDI3RUQxMTIxMDY5QQorICA1OiBBQTg1NzNEQUM2NkQyMzE1CisgIDY6IDEyREEzMTQ0QkVGMTNGRjIKKyAgNzogRUY4MDQxM0NCQTI4MUIzQQorICA4OiBERkE3MTE0RDg1MDVFRUJECisgIDk6IEFFNTM2MDdGM0U2RjRBNTQKKyAxMDogM0YyQzkzOTVDRkI5Rjc4RgorIDExOiA2N0VCN0M1RjAyNzYwQUVECisgMTI6IDNFRjRDQkI0QUI1QjhEMUYKKyAxMzogODNCNjNBRkE3ODc5NUE5MgorIDE0OiA1REU0MDA5NTE3NjY5OTJBCisgMTU6IEFBODc5MUE0NTIzN0NGODMKKyAxNjogNzc0M0IxODcwNEIwMzdDRgorCitQTUFDLXNhZmVyLXNrMTI4ICgxNiBieXRlIGtleSkKKyAgMDogOEYxNTk3RkZDRjZGQjdDMQorICAxOiBBRkY4QkQ4RkY5RjM4ODhBCisgIDI6IDY1Rjg5RDgyODY5RDhCNDIKKyAgMzogQ0JFMUYwNjQ3NkIyRDVCRAorICA0OiA0ODc4RDQ3RkRGRUNFMjNFCisgIDU6IDQ3NTFBOUU2RDYxQUIyQTIKKyAgNjogMDAzQUMxNjJBRUQ0REVEOAorICA3OiAxRjYxN0E1NTU1MDkyQzIyCisgIDg6IDA4OEVFMEMzNUI2MDcxNTMKKyAgOTogRjg0MEI0ODUwODZGOTkwOAorIDEwOiBCQTk5RTBGQjVEN0QwOTc2CisgMTE6IEYwNEFGNkRDNEJBRjY4ODcKKyAxMjogNURCQkU0MEFGMkY2N0U0RQorIDEzOiA3RjUyQTkzRTg3RTI5QzlECisgMTQ6IDdCMjZBMTRBNEJENUI3MDkKKyAxNTogQzM0RjI2RTA4QzY0RjI2QgorIDE2OiAyOTFBNDFENDc5RUMxRDJBCisKIFBNQUMtcmMyICg4IGJ5dGUga2V5KQogICAwOiBFNUFGODBGQUM0NTgwNDQ0CiAgIDE6IDZBMTVENjIxMUVCNEZGOTkKQEAgLTMyOSwzICs0MDUsNTcgQEAKICAxNTogMkM1QkQ0NzVBQUM0NEM3NwogIDE2OiBGRUI4OTJEQTY2RDMxQTg0CiAKK1BNQUMtYW51YmlzICgxNiBieXRlIGtleSkKKyAgMDogREYzM0VFNTQxRkZFRTZBOTdGRTNBMUY3MkY3QTM4RkMKKyAgMTogMEFCMjg2NzVBQzM5MjNDNkREOUY1QThFMUUyOTI4RDAKKyAgMjogMkRBQkY3NUQ2NDAzRTFFMUNGQUIzRTY4NjlGQjEwODgKKyAgMzogOTU4MzVENDlFMDk3NDAxODBCNzlFMzk0RkMyQUE3NDQKKyAgNDogRjM2NEQ2REMyQzIwNzhBNTE5RTVCQUVGRTg1OEFGQ0EKKyAgNTogREE0QzY2QTQ4MDVGQzkxRkFCQUVDQzBEM0FFQUQ4NTAKKyAgNjogNDg3NjYwRkFEQ0FDN0IzMjZDNDkyQUEwNTFBMURGNDkKKyAgNzogQkYwNzgzNUFBMUE1NDhGQTczMTI1MDlBRjM1Q0UzRjMKKyAgODogM0NFOEE4QjFGMzI0QTcwMDkyM0FDMEI4MzBENTNEOTkKKyAgOTogM0M1NEQ5OUFBQ0ZBQjI2RTM0RkMxQjBCNkJCOUVCMjIKKyAxMDogMEE1NTlGOUQxMDdFRDc2RkQxOTIyN0ZERDA3NTJCOEEKKyAxMTogQkZEOUU3NEFEQzQwQjlDNzQ0NkZERDA5NTU4RkE1ODQKKyAxMjogRjExMzBGNjYzQkMwRkEzQjEwNjYxMjlFMEQxOTEwRTkKKyAxMzogNTM1RUFENzg2RjBEMjExREU3QUE3OEYzQ0I0ODA4MDMKKyAxNDogQ0RGNTg1NUYwMEE0QzMxMEQ5NUIyNjc1MUIwMUEyOEIKKyAxNTogRUY2Njg2RTk5OUQ1QTlDMzVBOTZEMjVCQjlEQkJGNTcKKyAxNjogRTc5NTczM0FBMEFBRjE2RDhGN0FCMUE4RTlDNTVFNTQKKyAxNzogRTAzQ0E4NTcyN0Q1Q0YwNkY1NkJCNjQ2NUJCM0U1QzUKKyAxODogNkVERERCNkQyMjkyRUZGNTg0RTM4MkUxQkFDRDFBNDkKKyAxOTogN0I3RkUwRDg4MjE4MzZDMUFBOTU1NzgwNzFGRjJGRDIKKyAyMDogNUY4Q0M1NjgzMzg0MDA3NDZCNjFBOTI4NkI3Q0YyNjIKKyAyMTogMzJERUU1QTExRTlFREIwNEJERjkxMTgzN0NFMEZBNEQKKyAyMjogRjFBOTk5MTRGMTNCMTdBQkYzODNGMzYxNTdGRUIxNzAKKyAyMzogOTlGNTQxNjQ3RjM4MjM5MDA0M0NBRTUzMzJFMzExNEQKKyAyNDogMzRDNUVCQjg1NjkzQTE5NzlGOENGREY4QjQzMUE1QkIKKyAyNTogMUJBNzI2NjU2OEYxRTdCNEE3N0E4NjlEMzAyMUFDMEYKKyAyNjogMEZDNjc1Qzk5QzI0RTg1OUY4Q0U3MTRFODZCRjUyODkKKyAyNzogQ0JGQUIyMUY1QUJDNDczNTZBNDNCRUQ4MDZEODczQzAKKyAyODogOTY1OUFCMUE0RDMzNEI2MjI2Mjk3MjFGOThFRUNFM0EKKyAyOTogNjQ0QzhCRUU0MUYwM0JERTc2NTJCMDNDQUVBMzFFMzcKKyAzMDogNUIzNDQ3QUZBRDkzNEI0RDFFNDkxMEE4REZENTg4RTcKKyAzMTogQkZGNDAzMzQyRThENTBEMDQ0NzYyN0FFQTJGNTZCMjMKKyAzMjogMTlGNDY4RjBGQjA1MTg0RDAwRkFCRDQwQTE4REI3QjIKKworUE1BQy1raGF6YWQgKDE2IGJ5dGUga2V5KQorICAwOiBGNDBDRUYyRTM5MkJFQUVCCisgIDE6IEM2RTA4NkJEMUNGQTA5OTIKKyAgMjogNTEzRjI4NTE1ODNBRDY5QQorICAzOiAwNzI3OUQ1NzY5NUQ3OEZGCisgIDQ6IDA1MUU5NEZFNENDODQ3QjYKKyAgNTogNUU5QUFBNTk4OUQ1Qzk1MQorICA2OiAzMTBENUQ3NDAxNDMzNjlBCisgIDc6IDlCQjFFQThFQ0Q0QUYzNEIKKyAgODogQ0Y4ODY4MDBBRjA1MjZDOAorICA5OiAwQjAzRTJDOTQ3MjlFNjQzCisgMTA6IDQyODE1QjMwOEE5MDBFQzcKKyAxMTogOUEzOEE1OEM0MzhEMjZERAorIDEyOiAwNDRCRkY2OEZEMkJGRjc2CisgMTM6IDdGNUFCQkRDMjk4NTI3MjkKKyAxNDogRjgxQTdENkY3Qjc4OEE1RAorIDE1OiA5MzA5OERBOEExODBBQTM1CisgMTY6IEJBQ0UyRjREQThBODlFMzIKKwpkaWZmIC0tZ2l0IGEvbm90ZXMvdGVjaDAwMDQudHh0IGIvbm90ZXMvdGVjaDAwMDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhY2QzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9ub3Rlcy90ZWNoMDAwNC50eHQKQEAgLTAsMCArMSw5MSBAQAorVGVjaCBOb3RlIDAwMDQKK1VzaW5nIFlhcnJvdywgRm9ydHVuYSBhbmQgU09CRVItMTI4CitUb20gU3QgRGVuaXMKKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKworVGhpcyB0ZWNoIG5vdGUgZXhwbGFpbnMgaG93IHRvIHVzZSB0aHJlZSBvZiB0aGUgbW9yZSB1c2VmdWwgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycyBhbmQgdGhlaXIgCitvd24gbGl0dGxlICJpc3N1ZXMiLiAgV2hpbGUgYWxsIG9mIHRoZSBQUk5HcyBoYXZlIHRoZSBzYW1lIEFQSSBhbmQgYXJlIHJvdWdobHkgdXNlZCBpbiB0aGUgc2FtZSAKK21hbm5lciB0aGVpciBlZmZlY3RpdmVuZXNzIHJlYWxseSBkZXBlbmRzIG9uIHRoZSB1c2VyIGtub3dpbmcgaG93IHRoZXkgd29yay4KKworCitZYXJyb3cKKy0tLS0tLQorCitZYXJyb3cgaXMgYnkgZmFyIHRoZSBzaW1wbGVzdCBvZiB0aGUgUFJOR3MuICBJdCBnYXRoZXJzIGJpdHMgb2YgZW50cm9weSBieSBoYXNoaW5nIHRoZSBwb29sIHN0YXRlCitwbHVzIHRoZSBhZGRpdGlvbmFsIGJpdHMgc3RvcmluZyB0aGUgbWVzc2FnZSBkaWdlc3QgYmFjayBpbiB0aGUgcG9vbC4gIEUuZy4KKworcG9vbCA9IGhhc2gocG9vbCB8fCBuZXdiaXRzKQorCitTaW1wbHkgZHVtcCBiaXRzIGludG8gdGhlIFBSTkcgdmlhIHlhcnJvd19hZGRfZW50cm9weSgpIGFuZCBjYWxsIHlhcnJvd19yZWFkeSgpIHdoZW4geW91IHdhbnQgdG8gCitwdXQgdGhlbSB0byB1c2UuICBUaGlzIFBSTkcgd2hpbGUgc2ltcGxlIGlzIG5vdCBlbnRpcmVseSBzYWZlLiAgQW4gYXR0YWNrZXIgd2hvIGxlYXJucyB0aGUgc3RhdGUKK29mIHRoZSBwb29sIGFuZCBjYW4gY29udHJvbCBmdXR1cmUgZXZlbnRzIGNhbiBjb250cm9sIHRoZSBQUk5HLiAgVGhpcyByZXF1aXJlcyBhbiBhY3RpdmUgYXR0YWNrZXIgYnV0IAoraXNuJ3QgZW50aXJlIGltcG9zc2libGUuCisKK1RoZSBwb29sIGlzIHRoZW4gdXNlZCBhcyBhIGtleSBmb3IgYSBjaXBoZXIgdGhhdCBpcyB1c2VkIGluIENUUiBtb2RlLiAgCisKK1lhcnJvdyBpcyBtb3N0bHkgbWVhbnQgZm9yIHNob3J0LXRlcm0gcHJvZ3JhbXMgW2UuZy4gbGlrZSBmaWxlIHV0aWxzXS4gIFRoaXMgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbgoraXMgbm90IG1lYW50IGZvciBsb25nLXRlcm0gdXNhZ2UuCisKK0ZvcnR1bmEKKy0tLS0tLS0KKworRm9ydHVuYSB3YXMgZGVzaWduZWQgYnkgTmllbHMgRmVyZ3Vzc29uIGFuZCBCcnVjZSBTY2huZWllciBbQnJ1Y2UgaXMgYWxzbyB0aGUgZ3V5IHdobyBpbnZlbnRlZCBZYXJyb3ddLiAgSXQKK29wZXJhdGVzIG9uIGEgbW9yZSBkZWZlbnNpdmUgbGV2ZWwgdGhhbiBZYXJyb3cuICBJbnN0ZWFkIG9mIDEgZW50cm9weSBwb29sIGl0IGhhcyAzMiBhbmQgdGhlIG5ldyBlbnRyb3B5IAoraXMgc3ByZWFkIFtyb3VuZCByb2Jpbl0gaW4gYWxsIG9mIHRoZSBwb29scy4gCisKK1RoYXQgaXMsIGVhY2ggY2FsbCB0byBmb3J0dW5hX2FkZF9lbnRyb3B5KCkgcHV0cyB0aGUgYml0cyBpbiB0aGUgbmV4dCBbaW4gdGhlIHNlcXVlbmVjZV0gcG9vbCBvZiBlbnRyb3B5LiAgCitFZmZlY3RpdmUgYml0cyBhcmUgYWRkZWQgdG8gdGhlIHBvb2wgYnkgc2VuZGluZyB0aGVtIHRocm91Z2ggYSBoYXNoIFtidXQgbm90IHRlcm1pbmF0aW5nIHRoZSBoYXNoXS4gIAorCitIZXJlJ3MgdGhlIG1haW4gY2F0Y2ggdGhvdWdoLiAgV2hlbiB0aGUgUFJORyBtdXN0IGJlIHJlc2VlZGVkIFtzbyB0aGF0IHlvdSBjYW4gZXh0cmFjdCBiaXRzIGZyb20gaXRdIG9ubHkKK2NlcnRhaW4gcG9vbHMgYXJlIHVzZWQuICBNb3JlIHByZWNpc2VseSB0aGUgaSd0aCBwb29sIGlzIHVzZWQgZXZlcnkgMioqaSd0aCByZXNlZWRpbmcuICBGb3IgZXhhbXBsZSwgcG9vbFswXQoraXMgYWx3YXlzIHVzZWQuICBwb29sWzFdIGlzIHVzZWQgZXZlcnkgc2Vjb25kIHJlc2VlZGluZywgcG9vbFsyXSBldmVyeSBmb3VydGguCisKK1RoZSBwb29scyBhcmUgaGFzaGVkIHRvZ2V0aGVyIGFsb25nIHdpdGggdGhlIGN1cnJlbnQga2V5IGFuZCB0aGUgcmVzdWx0IGlzIHRoZSBuZXcga2V5IGZvciBhIGNpcGhlciB3aGljaAorb3BlcmF0ZXMgaW4gQ1RSIG1vZGUgW21vcmUgYWJvdXQgdGhhdCBpbiBhIHNlY10uCisKK05vdyB0aGlzIG1heSBzZWVtIG9kZCBhdCBmaXJzdCBob3dldmVyIHRoZXJlIGlzIGEgZ29vZCByZWFzb24gYmVoaW5kIGl0LiAgQW4gYXR0YWNrZXIgd2hvIGxlYXJucyBwb29sWzBdIHdvbid0CitzdHJpY3RseSBrbm93IHRoZSBvdGhlciBwb29scy4gIFNvIHRoZSByZWNvdmVyeSByYXRlIG9mIGlzIG5vdCAwLiAgSW4gZmFjdCBwb29sWzBdIGNhbiBiZSBjb21wbGV0ZWx5IAorY29tcHJvbWlzZWQgYW5kIHRoZSBQUk5HIHdpbGwgc3RpbGwgZXZlbnR1YWxseSByZWNvdmVyLiAgVGhlIHZhbHVlIEZPUlRVTkFfV0QgaXMgdGhlICJXYXRjaERvZyIgY291bnRlci4KK0V2ZXJ5IEZPUlRVTkFfV0QgY2FsbHMgdG8gZm9ydHVuYV9yZWFkIHdpbGwgaW52b2tlIHRoZSByZXNlZWQgb3BlcmF0aW9uLiAgQnkgZGVmYXVsdCB0aGlzIGlzIHNldCB0byAxMCB3aGljaCAKK21lYW5zIGFmdGVyIDEwIGNhbGxzIHRoZSBQUk5HIHdpbGwgcmVzZWVkIGl0c2VsZi4gIAorCitUaGUgcG9vbHMgYXJlIGNvbWJpbmVkIHdpdGggdGhlIHJ1bm5pbmcgY2lwaGVyIGtleSBbMjU2IGJpdHNdIHNvIHRoYXQgYSBjaXBoZXIgaW4gQ1RSIG1vZGUgY2FuIHByb2R1Y2UgCit0aGUgc3RyZWFtLiAgVW5saWtlIFlhcnJvdyB0aGUgY2lwaGVyIGlzIHJlLWtleWVkIGFmdGVyIGV2ZXJ5IGNhbGwgdG8gZm9ydHVuYV9yZWFkKCkgW3NvIG9uZSBiaWcgY2FsbCAKK3dvdWxkIGJlIGZhc3RlciB0aGFuIG1hbnkgc21hbGxlciBjYWxsc10uICBUaGlzIHByZXZlbnRzIHRvbyBtdWNoIGRhdGEgYmVpbmcgZW5jcnlwdGVkIHVuZGVyIHRoZSBzYW1lCitrZXkgW2FuZCBtaXRpZ2F0ZXMgYSBmbGF3IGluIENUUiBtb2RlIHRoYXQgdGhlIHNhbWUgYmxvY2sgY2FuJ3QgYmUgZW1pdHRlZCB0d2ljZSB1bmRlciB0aGUgc2FtZSBrZXldLgorCitGb3J0dW5hIGlzIHJlYWxseSBtZWFudCBmb3IgYSBrZXJuZWwtbGV2ZWwgUFJORy4gIFRoZSBtb3JlIHNvdXJjZXMgW2FuZCBvZnRlbl0geW91IGZlZWQgaW50byBpdCB0aGUgCitoZWFsdGhpZXIgaXQgd2lsbCBiZS4gIEl0J3MgYWxzbyBtZWFudCB0byBiZSB1c2VkIGZvciBsb25nIHRlcm0gcHVycG9zZXMuICBTaW5jZSBpdCBjYW4gcmVjb3ZlciBmcm9tCitjb21wcm9taXNlcyBpdCBpcyBoYXJkZXIgdG8gY29udHJvbCBpdC4gIAorCitTT0JFUi0xMjgKKy0tLS0tLQorCitTT0JFUi0xMjggaXMgYWN0dWFsbHkgYSBzdHJlYW0gY2lwaGVyIGJ1dCBsaWtlIG1vc3QgY2lwaGVycyBjYW4gZWFzaWx5IGJlIG1vZGVsbGVkIGluIHRoZSBjb250ZXh0IG9mIGEgUFJORy4KK1RoaXMgUFJORyBpcyBleHRyZW1lbHkgZmFzdCBbNCBjeWNsZXMvYnl0ZSBvbiBhIFA0XSBhbmQgd2FzIGRlc2lnbmVkIGJ5IGEgd2VsbCBrbm93biBjcnlwdG9ncmFwaGVyIFtHcmVnIFJvc2VdLgorCitTT0JFUi0xMjggZG9lc24ndCByZWFsbHkgImFjdCIgbGlrZSB0aGUgb3RoZXIgdHdvIFBSTkdzLiAgSXQncyBtZWFudCB0byBiZSBzZWVkZWQgb25jZSBhbmQgdGhlbiByZWFkIGFzIAorcmVxdWlyZWQuICBJbiBzdWNoIGEgc2Vuc2UgaXQgaXNuJ3QgYSAic3lzdGVtIFBSTkciIGJ1dCB1c2VmdWwgc2hvcnQgdGVybSBwdXJwb3Nlcy4gIEluIHBhcnRpY3VsYXIKK3RoZSBzb2JlcjEyOF9yZWFkKCkgZnVuY3Rpb24gYWN0dWFsbHkgWE9ScyBhZ2FpbnN0IHRoZSBpbnB1dCBidWZmZXIgeW91IHNwZWNpZnkuICBUaGlzIGFsbG93cyB0aGUgCityZWFkKCkgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhbiAiZW5jcnlwdCIgZnVuY3Rpb24gYXMgd2VsbC4gIAorCitZb3UgY2FuIG9ubHkga2V5IFNPQkVSLTEyOCBvbmNlIFtieSBjYWxsaW5nIHNvYmVyMTI4X2FkZF9lbnRyb3B5KCldLiAgT25jZSBpdCBpdCBpcyBrZXllZCBzdWJzZXF1ZW50CitjYWxscyB0byBhZGRfZW50cm9weSgpIHdpbGwgYmUgY29uc2lkZXJlZCBhICJyZS1JViIgb3BlcmF0aW9uLiAgQ2hhbmdpbmcgdGhlIElWIGFsbG93cyB5b3UgdG8gdXNlIHNhbWUKK2luaXRpYWwga2V5IGFuZCBub3QgcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQgc3RyZWFtLiAgSXQgYWxzbyBsZXRzIHlvdSBkaWZmZXJlbnRpYXRlIHBhY2tldHMuICBFLmcuIGVhY2gKK3BhY2tldCBoYXMgaXQncyBvd24gSVYuCisKK0FsbCBpbnB1dHMgdG8gc29iZXIxMjhfYWRkX2VudHJvcHkoKSBtdXN0IGhhdmUgYSBsZW5ndGggdGhhdCBpcyBhIG11bHRpcGxlIG9mIGZvdXIuCisKK092ZXJhbGwKKy0tLS0tLS0KKworU2luY2UgU09CRVItMTI4IGlzICptdWNoKiBmYXN0ZXIgdGhhbiB0aGUgb3RoZXIgdHdvIFBSTkdzIGEgZ29vZCBzZXR1cCB3b3VsZCBiZSB0byB1c2UgRm9ydHVuYSBhcyB5b3VyIAorc3lzdGVtLXdpZGUgUFJORyBhbmQgdXNlIFNPQkVSLTEyOCBba2V5J2VkIGZyb20gRm9ydHVuYV0gZm9yIGVuY3J5cHRpbmcgc3RyZWFtcyBvciBhcyBhIFBSTkcgZm9yIAorc2ltdWxhdGlvbnMuCisKK1lhcnJvdyBpcyBzdGlsbCBhIGdvb2QgY2FuZGlkYXRlIGJ1dCBvbmx5IGZvciAic2hvcnQgbGl2ZWQiIHByb2dyYW1zLiAgSG93ZXZlciwgc2luY2UgRm9ydHVuYSBpcyBmYXN0ZXIKK1tieSBhYm91dCAxMCBjeWNsZXMvYnl0ZSBvbiBhIFA0XSBJJ2QgdXNlIEZvcnR1bmEgYW55d2F5cy4uLgorCitUb20KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9ub3Rlcy90ZWNoMDAwNS50eHQgYi9ub3Rlcy90ZWNoMDAwNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzOTNkNQotLS0gL2Rldi9udWxsCisrKyBiL25vdGVzL3RlY2gwMDA1LnR4dApAQCAtMCwwICsxLDE4IEBACitUZWNoIE5vdGUgMDAwNQorTWluaW1pemluZyBDb2RlIFNwYWNlCitUb20gU3QgRGVuaXMKKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKworVHdlYWtpbmcuLi4KKworWW91IGNhbiBkaXNhYmxlIHdob2xlIGNsYXNzZXMgb2YgYWxnb3JpdGhtcyBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggdGhlIExUQ19OT18qIGRlZmluZXMuICBGcm9tIHRoZXJlIHlvdSBjYW4gbWFudWFsbHkgdHVybiBvbiB3aGF0IHlvdSB3YW50IHRvIGVuYWJsZS4gIAorCitUaGUgZm9sbG93aW5nIGJ1aWxkIHdpdGggR0NDIDMuNC4zIG9uIGFuIEFNRDY0IGJveCBnZXRzIHlvdSBBRVMsIENUUiBtb2RlLCBTSEEtMjU2LCBITUFDLCBZYXJyb3csIGZ1bGwgUlNBIFBLQ1MgIzEsIFBLQ1MgIzUsIEFTTi4xIERFUiBhbmQgTVBJIGluIAorcm91Z2hseSA4MEtCIG9mIGNvZGUuCisKK0NGTEFHUz0iLURTQ19SU0FfMSAtRExUQ19OT19DSVBIRVJTIC1ETFRDX05PX0hBU0hFUyAtRExUQ19OT19QUk5HUyAtRExUQ19OT19NQUNTIC1ETFRDX05PX01PREVTIC1ETFRDX05PX1BLIC1EUklKTkRBRUwgLURDVFIgLURTSEEyNTYgXAorLURITUFDIC1EWUFSUk9XIC1ETVJTQSAtRE1QSSAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIiIG1ha2UgSUdOT1JFX1NQRUVEPTEKKworTmVhdG8gZWg/CmRpZmYgLS1naXQgYS9ub3Rlcy90ZWNoMDAwNi50eHQgYi9ub3Rlcy90ZWNoMDAwNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiZThiMAotLS0gL2Rldi9udWxsCisrKyBiL25vdGVzL3RlY2gwMDA2LnR4dApAQCAtMCwwICsxLDkxIEBACitUZWNoIE5vdGUgMDAwNgorUEsgU3RhbmRhcmRzIENvbXBsaWFuY2UKK1RvbSBTdCBEZW5pcworCitSU0EKKy0tLS0KKworUEtDUyAjMSBjb21wbGlhbmNlLgorCitLZXkgRm9ybWF0OiAgUlNBUHVibGljS2V5IGFuZCBSU0FQcml2YXRlS2V5IGFzIHBlciBQS0NTICMxIHYyLjEKK0VuY3J5cHRpb246ICBPQUVQIGFzIHBlciBQS0NTICMxCitTaWduYXR1cmUgOiAgUFNTICBhcyBwZXIgUEtDUyAjMQorCitEU0EKKy0tLS0KKworVGhlIE5JU1QgRFNBIGFsZ29yaXRobQorCitLZXkgRm9ybWF0OiAgSG9tZUJyZXcgW3NlZSBiZWxvd10KK1NpZ25hdHVyZSA6ICBBTlNJIFg5LjYyIGZvcm1hdCBbc2VlIGJlbG93XS4KKworS2V5cyBhcmUgc3RvcmVkIGFzIAorCitEU0FQdWJsaWNLZXkgOjo9IFNFUVVFTkNFIHsKKyAgICBwdWJsaWNGbGFncyAgICBCSVQgU1RSSU5HKDEpLCAtLSBtdXN0IGJlIDAKKyAgICBnICAgICAgICAgICAgICBJTlRFR0VSICAgICAgLCAtLSBiYXNlIGdlbmVyYXRvciwgY2hlY2sgdGhhdCBnXnEgbW9kIHAgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFuZCB0aGF0IDEgPCBnIDwgcCAtIDEKKyAgICBwICAgICAgICAgICAgICBJTlRFR0VSICAgICAgLCAtLSBwcmltZSBtb2R1bHVzIAorICAgIHEgICAgICAgICAgICAgIElOVEVHRVIgICAgICAsIC0tIG9yZGVyIG9mIHN1Yi1ncm91cCAobXVzdCBiZSBwcmltZSkKKyAgICB5ICAgICAgICAgICAgICBJTlRFR0VSICAgICAgLCAtLSBwdWJsaWMga2V5LCBzcGVjaWZpY2FsbHksIGdeeCBtb2QgcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY2hlY2sgdGhhdCB5XnEgbW9kIHAgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFuZCB0aGF0IDEgPCB5IDwgcCAtIDEKK30KKworRFNBUHJpdmF0ZUtleSA6Oj0gU0VRVUVOQ0UgeworICAgIHB1YmxpY0ZsYWdzICAgIEJJVCBTVFJJTkcoMSksIC0tIG11c3QgYmUgMQorICAgIGcgICAgICAgICAgICAgIElOVEVHRVIgICAgICAsIC0tIGJhc2UgZ2VuZXJhdG9yLCBjaGVjayB0aGF0IGdecSBtb2QgcCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYW5kIHRoYXQgMSA8IGcgPCBwIC0gMQorICAgIHAgICAgICAgICAgICAgIElOVEVHRVIgICAgICAsIC0tIHByaW1lIG1vZHVsdXMgCisgICAgcSAgICAgICAgICAgICAgSU5URUdFUiAgICAgICwgLS0gb3JkZXIgb2Ygc3ViLWdyb3VwIChtdXN0IGJlIHByaW1lKQorICAgIHkgICAgICAgICAgICAgIElOVEVHRVIgICAgICAsIC0tIHB1YmxpYyBrZXksIHNwZWNpZmljYWxseSwgZ154IG1vZCBwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBjaGVjayB0aGF0IHlecSBtb2QgcCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYW5kIHRoYXQgMSA8IHkgPCBwIC0gMQorICAgIHggICAgICAgICAgICAgIElOVEVHRVIgICAgICAgIC0tIHByaXZhdGUga2V5Cit9CisKK1NpZ25hdHVyZXMgYXJlIHN0b3JlZCBhcyAKKworRFNBU2lnbmF0dXJlIDo6PSBTRVFVRU5DRSB7CisgICAgciwgcyAgICAgICAgICAgSU5URUdFUiAgICAgICAgLS0gc2lnbmF0dXJlIHBhcmFtZXRlcnMKK30KKworRUNDCistLS0tCisKK1RoZSBBTlNJIFg5LjYyIGFuZCBYOS42MyBhbGdvcml0aG1zIFtwYXJ0aWFsXS4gIFN1cHBvcnRzIGFsbCBOSVNUIEdGKHApIGN1cnZlcy4KKworS2V5IEZvcm1hdCAgIDogIEhvbWVicmV3IFtzZWUgYmVsb3csIG9ubHkgR0YocCkgTklTVCBjdXJ2ZXMgc3VwcG9ydGVkXQorU2lnbmF0dXJlICAgIDogIFg5LjYyIGNvbXBsaWFudAorRW5jcnlwdGlvbiAgIDogIEhvbWVicmV3IFtiYXNlZCBvbiBYOS42MywgZGlmZmVycyBpbiB0aGF0IHRoZSBwdWJsaWMgcG9pbnQgaXMgc3RvcmVkIGFzIGFuIEVDQ1B1YmxpY0tleV0KK1NoYXJlZCBTZWNyZXQ6ICBYOS42MyBjb21wbGlhbnQKKworRUNDUHVibGljS2V5IDo6PSBTRVFVRU5DRSB7CisgICAgZmxhZ3MgICAgICAgQklUIFNUUklORygxKSwgLS0gcHVibGljL3ByaXZhdGUgZmxhZyAoYWx3YXlzIHplcm8pLCAKKyAgICBrZXlTaXplICAgICBJTlRFR0VSLCAgICAgICAtLSBDdXJ2ZSBzaXplIChpbiBiaXRzKSBkaXZpZGVkIGJ5IGVpZ2h0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tIGFuZCByb3VuZGVkIGRvd24sIGUuZy4gNTIxID0+IDY1CisgICAgcHVia2V5LnggICAgSU5URUdFUiwgICAgICAgLS0gVGhlIFggY28tb3JkaW5hdGUgb2YgdGhlIHB1YmxpYyBrZXkgcG9pbnQKKyAgICBwdWJrZXkueSAgICBJTlRFR0VSLCAgICAgICAtLSBUaGUgWSBjby1vcmRpbmF0ZSBvZiB0aGUgcHVibGljIGtleSBwb2ludAorfQorCitFQ0NQcml2YXRlS2V5IDo6PSBTRVFVRU5DRSB7CisgICAgZmxhZ3MgICAgICAgQklUIFNUUklORygxKSwgLS0gcHVibGljL3ByaXZhdGUgZmxhZyAoYWx3YXlzIG9uZSksIAorICAgIGtleVNpemUgICAgIElOVEVHRVIsICAgICAgIC0tIEN1cnZlIHNpemUgKGluIGJpdHMpIGRpdmlkZWQgYnkgZWlnaHQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gYW5kIHJvdW5kZWQgZG93biwgZS5nLiA1MjEgPT4gNjUKKyAgICBwdWJrZXkueCAgICBJTlRFR0VSLCAgICAgICAtLSBUaGUgWCBjby1vcmRpbmF0ZSBvZiB0aGUgcHVibGljIGtleSBwb2ludAorICAgIHB1YmtleS55ICAgIElOVEVHRVIsICAgICAgIC0tIFRoZSBZIGNvLW9yZGluYXRlIG9mIHRoZSBwdWJsaWMga2V5IHBvaW50CisgICAgc2VjcmV0LmsgICAgSU5URUdFUiwgICAgICAgLS0gVGhlIHNlY3JldCBrZXkgc2NhbGFyCit9CisKK1RoZSBlbmNyeXB0aW9uIHdvcmtzIGJ5IGZpbmRpbmcgdGhlIFg5LjYzIHNoYXJlZCBzZWNyZXQgYW5kIGhhc2hpbmcgaXQuICBUaGUgaGFzaCBpcyB0aGVuIHNpbXBseSBYT1InZWQgYWdhaW5zdCB0aGUgbWVzc2FnZSBbd2hpY2ggbXVzdCBiZSBhdCBtb3N0IHRoZSBzaXplCitvZiB0aGUgaGFzaCBkaWdlc3RdLiAgVGhlIGZvcm1hdCBvZiB0aGUgZW5jcnlwdGVkIHRleHQgaXMgYXMgZm9sbG93cworCitFQ0NFbmNyeXB0ZWQgOjo9IFNFUVVFTkNFIHsKKyAgICBoYXNoT0lEICAgICBPQkpFQ1QgSURFTlRJRklFUiwgICAtLSBUaGUgT0lEIG9mIHRoZSBoYXNoIHVzZWQKKyAgICBwdWJrZXkgICAgICBPQ1RFVCBTVFJJTkcgICAgICwgICAtLSBFbmNhcHN1bGF0aW9uIG9mIGEgcmFuZG9tIEVDQ1B1YmxpY0tleQorICAgIHNrZXkgICAgICAgIE9DVEVUIFNUUklORyAgICAgICAgIC0tIFRoZSBlbmNyeXB0ZWQgdGV4dCAod2hpY2ggdGhlIGhhc2ggd2FzIFhPUidlZCBhZ2FpbnN0KQorfQorCislICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L25vdGVzL3RlY2gwMDA2LnR4dCx2ICQgICAKKyUgJFJldmlzaW9uOiAxLjIgJCAgIAorJSAkRGF0ZTogMjAwNS8wNi8xOCAwMjoyNjoyNyAkIApkaWZmIC0tZ2l0IGEvb2NiX2RlY3J5cHRfdmVyaWZ5X21lbW9yeS5jIGIvb2NiX2RlY3J5cHRfdmVyaWZ5X21lbW9yeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGUyOWZhLi4wMDAwMDAwCi0tLSBhL29jYl9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotCi0vKiBPQ0IgSW1wbGVtZW50YXRpb24gYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgT0NCX01PREUKLQotaW50IG9jYl9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkoaW50IGNpcGhlciwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksICAgIHVuc2lnbmVkIGxvbmcga2V5bGVuLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5vbmNlLCAgCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqY3QsICAgICB1bnNpZ25lZCBsb25nIGN0bGVuLAotICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0LAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhZywgICAgdW5zaWduZWQgbG9uZyB0YWdsZW4sCi0gICAgICAgICAgaW50ICAgICAgICAgICAqcmVzKQotewotICAgaW50IGVycjsKLSAgIG9jYl9zdGF0ZSBvY2I7Ci0KLQotICAgX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG5vbmNlICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsocHQgICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHRhZyAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsocmVzICAgICE9IE5VTEwpOwotCi0gICBpZiAoKGVyciA9IG9jYl9pbml0KCZvY2IsIGNpcGhlciwga2V5LCBrZXlsZW4sIG5vbmNlKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIHdoaWxlIChjdGxlbiA+ICh1bnNpZ25lZCBsb25nKW9jYi5ibG9ja19sZW4pIHsKLSAgICAgICAgaWYgKChlcnIgPSBvY2JfZGVjcnlwdCgmb2NiLCBjdCwgcHQpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGN0bGVuICAgLT0gb2NiLmJsb2NrX2xlbjsKLSAgICAgICAgcHQgICAgICArPSBvY2IuYmxvY2tfbGVuOwotICAgICAgICBjdCAgICAgICs9IG9jYi5ibG9ja19sZW47Ci0gICB9Ci0KLSAgIHJldHVybiBvY2JfZG9uZV9kZWNyeXB0KCZvY2IsIGN0LCBjdGxlbiwgcHQsIHRhZywgdGFnbGVuLCByZXMpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29jYl9kb25lX2RlY3J5cHQuYyBiL29jYl9kb25lX2RlY3J5cHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiYTM5My4uMDAwMDAwMAotLS0gYS9vY2JfZG9uZV9kZWNyeXB0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogT0NCIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE9DQl9NT0RFCi0KLWludCBvY2JfZG9uZV9kZWNyeXB0KG9jYl9zdGF0ZSAqb2NiLCAKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCAgdW5zaWduZWQgbG9uZyBjdGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0LCAKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyB0YWdsZW4sIGludCAqcmVzKQotewotICAgaW50IGVycjsKLSAgIHVuc2lnbmVkIGNoYXIgdGFnYnVmW01BWEJMT0NLU0laRV07Ci0gICB1bnNpZ25lZCBsb25nIHRhZ2J1ZmxlbjsKLQotICAgX0FSR0NISyhvY2IgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHB0ICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY3QgICE9IE5VTEwpOwotICAgX0FSR0NISyh0YWcgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHJlcyAhPSBOVUxMKTsKLQotICAgKnJlcyA9IDA7Ci0KLSAgIHRhZ2J1ZmxlbiA9IHNpemVvZih0YWdidWYpOwotICAgaWYgKChlcnIgPSBfX29jYl9kb25lKG9jYiwgY3QsIGN0bGVuLCBwdCwgdGFnYnVmLCAmdGFnYnVmbGVuLCAxKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIGlmICh0YWdsZW4gPD0gdGFnYnVmbGVuICYmIG1lbWNtcCh0YWdidWYsIHRhZywgdGFnbGVuKSA9PSAwKSB7Ci0gICAgICAqcmVzID0gMTsKLSAgIH0KLQotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKHRhZ2J1Ziwgc2l6ZW9mKHRhZ2J1ZikpOwotI2VuZGlmCi0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL29jYl9kb25lX2VuY3J5cHQuYyBiL29jYl9kb25lX2VuY3J5cHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5ODkyZS4uMDAwMDAwMAotLS0gYS9vY2JfZG9uZV9lbmNyeXB0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogT0NCIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE9DQl9NT0RFCi0KLWludCBvY2JfZG9uZV9lbmNyeXB0KG9jYl9zdGF0ZSAqb2NiLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgbG9uZyBwdGxlbiwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbikKLXsKLSAgIF9BUkdDSEsob2NiICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhwdCAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsodGFnICAgICE9IE5VTEwpOwotICAgX0FSR0NISyh0YWdsZW4gIT0gTlVMTCk7Ci0gICByZXR1cm4gX19vY2JfZG9uZShvY2IsIHB0LCBwdGxlbiwgY3QsIHRhZywgdGFnbGVuLCAwKTsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL29jYl9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkuYyBiL29jYl9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5ZGEwMi4uMDAwMDAwMAotLS0gYS9vY2JfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogT0NCIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE9DQl9NT0RFCi0KLWludCBvY2JfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5KGludCBjaXBoZXIsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCAgICAgdW5zaWduZWQgbG9uZyBwdGxlbiwKLSAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwKLSAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWcsICAgIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbikKLXsKLSAgIGludCBlcnI7Ci0gICBvY2Jfc3RhdGUgb2NiOwotCi0gICBfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsobm9uY2UgICE9IE5VTEwpOwotICAgX0FSR0NISyhwdCAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsodGFnICAgICE9IE5VTEwpOwotICAgX0FSR0NISyh0YWdsZW4gIT0gTlVMTCk7Ci0KLSAgIGlmICgoZXJyID0gb2NiX2luaXQoJm9jYiwgY2lwaGVyLCBrZXksIGtleWxlbiwgbm9uY2UpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgd2hpbGUgKHB0bGVuID4gKHVuc2lnbmVkIGxvbmcpb2NiLmJsb2NrX2xlbikgewotICAgICAgICBpZiAoKGVyciA9IG9jYl9lbmNyeXB0KCZvY2IsIHB0LCBjdCkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgcHRsZW4gICAtPSBvY2IuYmxvY2tfbGVuOwotICAgICAgICBwdCAgICAgICs9IG9jYi5ibG9ja19sZW47Ci0gICAgICAgIGN0ICAgICAgKz0gb2NiLmJsb2NrX2xlbjsKLSAgIH0KLQotICAgcmV0dXJuIG9jYl9kb25lX2VuY3J5cHQoJm9jYiwgcHQsIHB0bGVuLCBjdCwgdGFnLCB0YWdsZW4pOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29jYl9udHouYyBiL29jYl9udHouYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmNmJiNi4uMDAwMDAwMAotLS0gYS9vY2JfbnR6LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogT0NCIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE9DQl9NT0RFCi0KLWludCBvY2JfbnR6KHVuc2lnbmVkIGxvbmcgeCkKLXsKLSAgIGludCBjOwotICAgeCAmPSAweEZGRkZGRkZGVUw7Ci0gICBjID0gMDsKLSAgIHdoaWxlICgoeCAmIDEpID09IDApIHsKLSAgICAgICsrYzsKLSAgICAgIHggPj49IDE7Ci0gICB9Ci0gICByZXR1cm4gYzsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vY2Jfc2hpZnRfeG9yLmMgYi9vY2Jfc2hpZnRfeG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTMxMzguLjAwMDAwMDAKLS0tIGEvb2NiX3NoaWZ0X3hvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLS8qIE9DQiBJbXBsZW1lbnRhdGlvbiBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBPQ0JfTU9ERQotCi12b2lkIG9jYl9zaGlmdF94b3Iob2NiX3N0YXRlICpvY2IsIHVuc2lnbmVkIGNoYXIgKlopCi17Ci0gICBpbnQgeCwgeTsKLSAgIHkgPSBvY2JfbnR6KG9jYi0+YmxvY2tfaW5kZXgrKyk7Ci0gICBmb3IgKHggPSAwOyB4IDwgb2NiLT5ibG9ja19sZW47IHgrKykgewotICAgICAgIG9jYi0+TGlbeF0gXj0gb2NiLT5Mc1t5XVt4XTsKLSAgICAgICBaW3hdICAgICAgICA9IG9jYi0+TGlbeF0gXiBvY2ItPlJbeF07Ci0gICB9Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb2ZiX2RlY3J5cHQuYyBiL29mYl9kZWNyeXB0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzE5NjkuLjAwMDAwMDAKLS0tIGEvb2ZiX2RlY3J5cHQuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE9GQgotCi1pbnQgb2ZiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX09GQiAqb2ZiKQotewotICAgX0FSR0NISyhwdCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY3QgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG9mYiAhPSBOVUxMKTsKLSAgIHJldHVybiBvZmJfZW5jcnlwdChjdCwgcHQsIGxlbiwgb2ZiKTsKLX0KLQotCi0jZW5kaWYKLQotIApkaWZmIC0tZ2l0IGEvb2ZiX2dldGl2LmMgYi9vZmJfZ2V0aXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0ZGUwMi4uMDAwMDAwMAotLS0gYS9vZmJfZ2V0aXYuYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgT0ZCCi0KLWludCBvZmJfZ2V0aXYodW5zaWduZWQgY2hhciAqSVYsIHVuc2lnbmVkIGxvbmcgKmxlbiwgc3ltbWV0cmljX09GQiAqb2ZiKQotewotICAgX0FSR0NISyhJViAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGxlbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob2ZiICE9IE5VTEwpOwotICAgaWYgKCh1bnNpZ25lZCBsb25nKW9mYi0+YmxvY2tsZW4gPiAqbGVuKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgfQotICAgbWVtY3B5KElWLCBvZmItPklWLCBvZmItPmJsb2NrbGVuKTsKLSAgICpsZW4gPSBvZmItPmJsb2NrbGVuOwotCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb2ZiX3NldGl2LmMgYi9vZmJfc2V0aXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4M2JjNy4uMDAwMDAwMAotLS0gYS9vZmJfc2V0aXYuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgT0ZCCi0KLWludCBvZmJfc2V0aXYoY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfT0ZCICpvZmIpCi17Ci0gICBpbnQgZXJyOwotCi0gICBfQVJHQ0hLKElWICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob2ZiICE9IE5VTEwpOwotCi0gICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChvZmItPmNpcGhlcikpICE9IENSWVBUX09LKSB7Ci0gICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgaWYgKGxlbiAhPSAodW5zaWduZWQgbG9uZylvZmItPmJsb2NrbGVuKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9Ci0KLSAgIC8qIGZvcmNlIG5leHQgYmxvY2sgKi8KLSAgIG9mYi0+cGFkbGVuID0gMDsKLSAgIGNpcGhlcl9kZXNjcmlwdG9yW29mYi0+Y2lwaGVyXS5lY2JfZW5jcnlwdChJViwgb2ZiLT5JViwgJm9mYi0+a2V5KTsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIAotCmRpZmYgLS1naXQgYS9vZmJfc3RhcnQuYyBiL29mYl9zdGFydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWZjYzcwLi4wMDAwMDAwCi0tLSBhL29mYl9zdGFydC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgT0ZCCi0KLWludCBvZmJfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgCi0gICAgICAgICAgICAgIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfT0ZCICpvZmIpCi17Ci0gICBpbnQgeCwgZXJyOwotCi0gICBfQVJHQ0hLKElWICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG9mYiAhPSBOVUxMKTsKLQotICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIGNvcHkgZGV0YWlscyAqLwotICAgb2ZiLT5jaXBoZXIgPSBjaXBoZXI7Ci0gICBvZmItPmJsb2NrbGVuID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5ibG9ja19sZW5ndGg7Ci0gICBmb3IgKHggPSAwOyB4IDwgb2ZiLT5ibG9ja2xlbjsgeCsrKSB7Ci0gICAgICAgb2ZiLT5JVlt4XSA9IElWW3hdOwotICAgfQotCi0gICAvKiBpbml0IHRoZSBjaXBoZXIgKi8KLSAgIG9mYi0+cGFkbGVuID0gb2ZiLT5ibG9ja2xlbjsKLSAgIHJldHVybiBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLnNldHVwKGtleSwga2V5bGVuLCBudW1fcm91bmRzLCAmb2ZiLT5rZXkpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29tYWNfZG9uZS5jIGIvb21hY19kb25lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNjVhMWQuLjAwMDAwMDAKLS0tIGEvb21hY19kb25lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLS8qIE9NQUMxIFN1cHBvcnQgYnkgVG9tIFN0IERlbmlzIChmb3IgNjQgYW5kIDEyOCBiaXQgYmxvY2sgY2lwaGVycyBvbmx5KSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE9NQUMKLQotaW50IG9tYWNfZG9uZShvbWFjX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0gICBpbnQgZXJyLCBtb2RlLCB4OwotCi0gICBfQVJHQ0hLKHN0YXRlICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAhPSBOVUxMKTsKLSAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKHN0YXRlLT5jaXBoZXJfaWR4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIGlmICgoc3RhdGUtPmJ1ZmxlbiA+IChpbnQpc2l6ZW9mKHN0YXRlLT5ibG9jaykpIHx8IChzdGF0ZS0+YnVmbGVuIDwgMCkgfHwKLSAgICAgICAoc3RhdGUtPmJsa2xlbiA+IChpbnQpc2l6ZW9mKHN0YXRlLT5ibG9jaykpIHx8IChzdGF0ZS0+YnVmbGVuID4gc3RhdGUtPmJsa2xlbikpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKLSAgIH0KLQotICAgLyogZmlndXJlIG91dCBtb2RlICovCi0gICBpZiAoc3RhdGUtPmJ1ZmxlbiAhPSBzdGF0ZS0+YmxrbGVuKSB7Ci0gICAgICAvKiBhZGQgdGhlIDB4ODAgYnl0ZSAqLwotICAgICAgc3RhdGUtPmJsb2NrW3N0YXRlLT5idWZsZW4rK10gPSAweDgwOwotCi0gICAgICAvKiBwYWQgd2l0aCAweDAwICovCi0gICAgICB3aGlsZSAoc3RhdGUtPmJ1ZmxlbiA8IHN0YXRlLT5ibGtsZW4pIHsKLSAgICAgICAgIHN0YXRlLT5ibG9ja1tzdGF0ZS0+YnVmbGVuKytdID0gMHgwMDsKLSAgICAgIH0KLSAgICAgIG1vZGUgPSAxOwotICAgfSBlbHNlIHsKLSAgICAgIG1vZGUgPSAwOwotICAgfQotCi0gICAvKiBub3cgeG9yIHByZXYgKyBMdVttb2RlXSAqLwotICAgZm9yICh4ID0gMDsgeCA8IHN0YXRlLT5ibGtsZW47IHgrKykgewotICAgICAgIHN0YXRlLT5ibG9ja1t4XSBePSBzdGF0ZS0+cHJldlt4XSBeIHN0YXRlLT5MdVttb2RlXVt4XTsKLSAgIH0KLQotICAgLyogZW5jcnlwdCBpdCAqLwotICAgY2lwaGVyX2Rlc2NyaXB0b3Jbc3RhdGUtPmNpcGhlcl9pZHhdLmVjYl9lbmNyeXB0KHN0YXRlLT5ibG9jaywgc3RhdGUtPmJsb2NrLCAmc3RhdGUtPmtleSk7Ci0gCi0gICAvKiBvdXRwdXQgaXQgKi8KLSAgIGZvciAoeCA9IDA7IHggPCBzdGF0ZS0+YmxrbGVuICYmICh1bnNpZ25lZCBsb25nKXggPCAqb3V0bGVuOyB4KyspIHsKLSAgICAgICBvdXRbeF0gPSBzdGF0ZS0+YmxvY2tbeF07Ci0gICB9Ci0gICAqb3V0bGVuID0geDsKLQotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKHN0YXRlLCBzaXplb2YoKnN0YXRlKSk7Ci0jZW5kaWYKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL29tYWNfZmlsZS5jIGIvb21hY19maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZDJkNGIuLjAwMDAwMDAKLS0tIGEvb21hY19maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLS8qIE9NQUMxIFN1cHBvcnQgYnkgVG9tIFN0IERlbmlzIChmb3IgNjQgYW5kIDEyOCBiaXQgYmxvY2sgY2lwaGVycyBvbmx5KSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE9NQUMKLQotaW50IG9tYWNfZmlsZShpbnQgY2lwaGVyLCAKLSAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKLXsKLSNpZmRlZiBOT19GSUxFCi0gICByZXR1cm4gQ1JZUFRfTk9QOwotI2Vsc2UKLSAgIGludCBlcnIsIHg7Ci0gICBvbWFjX3N0YXRlIG9tYWM7Ci0gICBGSUxFICppbjsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzUxMl07Ci0KLSAgIF9BUkdDSEsoa2V5ICAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGZpbGVuYW1lICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICAgIT0gTlVMTCk7Ci0KLSAgIGluID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwotICAgaWYgKGluID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBDUllQVF9GSUxFX05PVEZPVU5EOwotICAgfQotCi0gICBpZiAoKGVyciA9IG9tYWNfaW5pdCgmb21hYywgY2lwaGVyLCBrZXksIGtleWxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICBmY2xvc2UoaW4pOwotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgZG8gewotICAgICAgeCA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGluKTsKLSAgICAgIGlmICgoZXJyID0gb21hY19wcm9jZXNzKCZvbWFjLCBidWYsIHgpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgZmNsb3NlKGluKTsKLSAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICB9Ci0gICB9IHdoaWxlICh4ID09IHNpemVvZihidWYpKTsKLSAgIGZjbG9zZShpbik7Ci0KLSAgIGlmICgoZXJyID0gb21hY19kb25lKCZvbWFjLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0jZW5kaWYKLQotICAgcmV0dXJuIENSWVBUX09LOwotI2VuZGlmCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb21hY19tZW1vcnkuYyBiL29tYWNfbWVtb3J5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjY2E4OTEuLjAwMDAwMDAKLS0tIGEvb21hY19tZW1vcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotLyogT01BQzEgU3VwcG9ydCBieSBUb20gU3QgRGVuaXMgKGZvciA2NCBhbmQgMTI4IGJpdCBibG9jayBjaXBoZXJzIG9ubHkpICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgT01BQwotCi1pbnQgb21hY19tZW1vcnkoaW50IGNpcGhlciwgCi0gICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKLSAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgbXNnbGVuLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQotewotICAgaW50IGVycjsKLSAgIG9tYWNfc3RhdGUgb21hYzsKLQotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG1zZyAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0ICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7Ci0KLSAgIGlmICgoZXJyID0gb21hY19pbml0KCZvbWFjLCBjaXBoZXIsIGtleSwga2V5bGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICBpZiAoKGVyciA9IG9tYWNfcHJvY2Vzcygmb21hYywgbXNnLCBtc2dsZW4pKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIGlmICgoZXJyID0gb21hY19kb25lKCZvbWFjLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb21hY19wcm9jZXNzLmMgYi9vbWFjX3Byb2Nlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRhMTUyNy4uMDAwMDAwMAotLS0gYS9vbWFjX3Byb2Nlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotLyogT01BQzEgU3VwcG9ydCBieSBUb20gU3QgRGVuaXMgKGZvciA2NCBhbmQgMTI4IGJpdCBibG9jayBjaXBoZXJzIG9ubHkpICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgT01BQwotCi1pbnQgb21hY19wcm9jZXNzKG9tYWNfc3RhdGUgKnN0YXRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQotewotICAgaW50IGVyciwgbiwgeDsKLQotICAgX0FSR0NISyhzdGF0ZSAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoYnVmICAgIT0gTlVMTCk7Ci0gICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChzdGF0ZS0+Y2lwaGVyX2lkeCkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICBpZiAoKHN0YXRlLT5idWZsZW4gPiAoaW50KXNpemVvZihzdGF0ZS0+YmxvY2spKSB8fCAoc3RhdGUtPmJ1ZmxlbiA8IDApIHx8Ci0gICAgICAgKHN0YXRlLT5ibGtsZW4gPiAoaW50KXNpemVvZihzdGF0ZS0+YmxvY2spKSB8fCAoc3RhdGUtPmJ1ZmxlbiA+IHN0YXRlLT5ibGtsZW4pKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9Ci0KLSAgIHdoaWxlIChsZW4gIT0gMCkgeyAKLSAgICAgICAvKiBvayBpZiB0aGUgYmxvY2sgaXMgZnVsbCB3ZSB4b3IgaW4gcHJldiwgZW5jcnlwdCBhbmQgcmVwbGFjZSBwcmV2ICovCi0gICAgICAgaWYgKHN0YXRlLT5idWZsZW4gPT0gc3RhdGUtPmJsa2xlbikgewotICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzdGF0ZS0+YmxrbGVuOyB4KyspIHsKLSAgICAgICAgICAgICAgc3RhdGUtPmJsb2NrW3hdIF49IHN0YXRlLT5wcmV2W3hdOwotICAgICAgICAgIH0KLSAgICAgICAgICBjaXBoZXJfZGVzY3JpcHRvcltzdGF0ZS0+Y2lwaGVyX2lkeF0uZWNiX2VuY3J5cHQoc3RhdGUtPmJsb2NrLCBzdGF0ZS0+cHJldiwgJnN0YXRlLT5rZXkpOwotICAgICAgICAgIHN0YXRlLT5idWZsZW4gPSAwOwotICAgICAgIH0KLQotICAgICAgIC8qIGFkZCBieXRlcyAqLwotICAgICAgIG4gPSBNSU4obGVuLCAodW5zaWduZWQgbG9uZykoc3RhdGUtPmJsa2xlbiAtIHN0YXRlLT5idWZsZW4pKTsKLSAgICAgICBtZW1jcHkoc3RhdGUtPmJsb2NrICsgc3RhdGUtPmJ1ZmxlbiwgYnVmLCBuKTsKLSAgICAgICBzdGF0ZS0+YnVmbGVuICs9IG47Ci0gICAgICAgbGVuICAgICAgICAgICAtPSBuOwotICAgICAgIGJ1ZiAgICAgICAgICAgKz0gbjsKLSAgIH0KLQotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvcGFyc2VuYW1lcy5wbCBiL3BhcnNlbmFtZXMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxZjAzNgotLS0gL2Rldi9udWxsCisrKyBiL3BhcnNlbmFtZXMucGwKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIFNwbGl0cyB0aGUgbGlzdCBvZiBmaWxlcyBhbmQgb3V0cHV0cyBmb3IgbWFrZWZpbGUgdHlwZSBmaWxlcyAKKyMgd3JhcHBlZCBhdCA4MCBjaGFycyAKKyMgCisjIFRvbSBTdCBEZW5pcworQGEgPSBzcGxpdCgiICIsICRBUkdWWzFdKTsKKyRiID0gIiRBUkdWWzBdPSI7CiskbGVuID0gbGVuZ3RoKCRiKTsKK3ByaW50ICRiOworZm9yZWFjaCBteSAkb2JqIChAYSkgeworICAgJGxlbiA9ICRsZW4gKyBsZW5ndGgoJG9iaik7CisgICAkb2JqID1+IHMvXCovXCQvOworICAgaWYgKCRsZW4gPiAxMDApIHsKKyAgICAgIHByaW50ZiAiXFxcbiI7CisgICAgICAkbGVuID0gbGVuZ3RoKCRvYmopOworICAgfQorICAgcHJpbnQgIiRvYmogIjsKK30KK2lmICgkQVJHVlswXSBlcSAiSEVBREVSUyIpIHsgcHJpbnQgInRlc3Rwcm9mL3RvbWNyeXB0X3Rlc3QuaCI7IH0KKworcHJpbnQgIlxuXG4iOworCisjICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3BhcnNlbmFtZXMucGwsdiAkICAgCisjICRSZXZpc2lvbjogMS4zICQgICAKKyMgJERhdGU6IDIwMDUvMDUvMDUgMTQ6NDk6MjcgJCAKZGlmZiAtLWdpdCBhL3BrY3NfMV9tZ2YxLmMgYi9wa2NzXzFfbWdmMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjFkOTI4Li4wMDAwMDAwCi0tLSBhL3BrY3NfMV9tZ2YxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLS8qIFRoZSBNYXNrIEdlbmVyYXRpb24gRnVuY3Rpb24gKE1HRjEpIGZvciBQS0NTICMxIC0tIFRvbSBTdCBEZW5pcyAqLwotCi0jaWZkZWYgUEtDU18xCi0KLWludCBwa2NzXzFfbWdmMShjb25zdCB1bnNpZ25lZCBjaGFyICpzZWVkLCB1bnNpZ25lZCBsb25nIHNlZWRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaGFzaF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqbWFzaywgdW5zaWduZWQgbG9uZyBtYXNrbGVuKQotewotICAgdW5zaWduZWQgbG9uZyBoTGVuLCBjb3VudGVyLCB4OwotICAgaW50ICAgICAgICAgICBlcnI7Ci0gICBoYXNoX3N0YXRlICAgIG1kOwotICAgdW5zaWduZWQgY2hhciBidWZbTUFYQkxPQ0tTSVpFXTsKLSAKLSAgIF9BUkdDSEsoc2VlZCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsobWFzayAhPSBOVUxMKTsKLQotICAgLyogZW5zdXJlIHZhbGlkIGhhc2ggKi8KLSAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoX2lkeCkpICE9IENSWVBUX09LKSB7IAotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogZ2V0IGhhc2ggb3V0cHV0IHNpemUgKi8KLSAgIGhMZW4gPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLmhhc2hzaXplOwotCi0gICAvKiBzdGFydCBjb3VudGVyICovCi0gICBjb3VudGVyID0gMDsKLQotICAgd2hpbGUgKG1hc2tsZW4gPiAwKSB7Ci0gICAgICAgLyogaGFuZGxlIGNvdW50ZXIgKi8KLSAgICAgICBTVE9SRTMySChjb3VudGVyLCBidWYpOwotICAgICAgICsrY291bnRlcjsKLQotICAgICAgIC8qIGdldCBoYXNoIG9mIHNlZWQgfHwgY291bnRlciAqLwotICAgICAgIGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0uaW5pdCgmbWQpOwotICAgICAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5wcm9jZXNzKCZtZCwgc2VlZCwgc2VlZGxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICB9Ci0gICAgICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLnByb2Nlc3MoJm1kLCBidWYsIDQpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgfQotICAgICAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5kb25lKCZtZCwgYnVmKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgIH0KLQotICAgICAgIC8qIHN0b3JlIGl0ICovCi0gICAgICAgZm9yICh4ID0gMDsgeCA8IGhMZW4gJiYgbWFza2xlbiA+IDA7IHgrKywgbWFza2xlbi0tKSB7Ci0gICAgICAgICAgKm1hc2srKyA9IGJ1Zlt4XTsKLSAgICAgICB9Ci0gICB9Ci0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIC8qIFBLQ1NfMSAqLwpkaWZmIC0tZ2l0IGEvcGtjc18xX29hZXBfZGVjb2RlLmMgYi9wa2NzXzFfb2FlcF9kZWNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmMmUxZC4uMDAwMDAwMAotLS0gYS9wa2NzXzFfb2FlcF9kZWNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLS8qIE9BRVAgUGFkZGluZyBmb3IgUEtDUyAjMSAtLSBUb20gU3QgRGVuaXMgKi8KLQotI2lmZGVmIFBLQ1NfMQotCi1pbnQgcGtjc18xX29hZXBfZGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZywgICAgdW5zaWduZWQgbG9uZyBtc2dsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxwYXJhbSwgdW5zaWduZWQgbG9uZyBscGFyYW1sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19iaXRsZW4sIGludCBoYXNoX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgKnJlcykKLXsKLSAgIHVuc2lnbmVkIGNoYXIgREJbMTAyNF0sIHNlZWRbTUFYQkxPQ0tTSVpFXSwgbWFza1tzaXplb2YoREIpXTsKLSAgIHVuc2lnbmVkIGxvbmcgaExlbiwgeCwgeSwgbW9kdWx1c19sZW47Ci0gICBpbnQgICAgICAgICAgIGVycjsKLQotICAgX0FSR0NISyhtc2cgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotICAgX0FSR0NISyhyZXMgICAgIT0gTlVMTCk7Ci0KLSAgIC8qIGRlZmF1bHQgdG8gaW52YWxpZCBwYWNrZXQgKi8KLSAgICpyZXMgPSAwOwotICAgCi0gICAvKiB0ZXN0IHZhbGlkIGhhc2ggKi8KLSAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoX2lkeCkpICE9IENSWVBUX09LKSB7IAotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIGhMZW4gICAgICAgID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5oYXNoc2l6ZTsKLSAgIG1vZHVsdXNfbGVuID0gKG1vZHVsdXNfYml0bGVuID4+IDMpICsgKG1vZHVsdXNfYml0bGVuICYgNyA/IDEgOiAwKTsKLQotICAgLyogdGVzdCBtZXNzYWdlIHNpemUgKi8KLSAgIGlmIChtb2R1bHVzX2xlbiA+PSBzaXplb2YoREIpIHx8IG1zZ2xlbiAhPSBtb2R1bHVzX2xlbikgewotICAgICAgcmV0dXJuIENSWVBUX1BLX0lOVkFMSURfU0laRTsKLSAgIH0KLQotICAgLyogb2sgc28gaXQncyBub3cgaW4gdGhlIGZvcm0KLSAgCi0gICAgICAweDAwICB8fCBtYXNrZWRzZWVkIHx8IG1hc2tlZERCIAotICAKLSAgICAgICAxICAgIHx8ICAgaExlbiAgICAgfHwgIG1vZHVsdXNfbGVuIC0gaExlbiAtIDEKLSAgIAotICAgICovCi0KLSAgIC8qIG11c3QgaGF2ZSBsZWFkaW5nIDB4MDAgYnl0ZSAqLwotICAgaWYgKG1zZ1swXSAhPSAweDAwKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfT0s7Ci0gICB9Ci0KLSAgIC8qIG5vdyByZWFkIHRoZSBtYXNrZWQgc2VlZCAqLwotICAgZm9yICh4ID0gMSwgeSA9IDA7IHkgPCBoTGVuOyB5KyspIHsKLSAgICAgIHNlZWRbeV0gPSBtc2dbeCsrXTsKLSAgIH0KLQotICAgLyogbm93IHJlYWQgdGhlIG1hc2tlZCBEQiAqLwotICAgZm9yICh5ID0gMDsgeSA8IG1vZHVsdXNfbGVuIC0gaExlbiAtIDE7IHkrKykgewotICAgICAgREJbeV0gPSBtc2dbeCsrXTsKLSAgIH0KLQotICAgLyogY29tcHV0ZSBNR0YxIG9mIG1hc2tlZERCIChoTGVuKSAqLyAKLSAgIGlmICgoZXJyID0gcGtjc18xX21nZjEoREIsIG1vZHVsdXNfbGVuIC0gaExlbiAtIDEsIGhhc2hfaWR4LCBtYXNrLCBoTGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIFhPUiBhZ2FpbnN0IHNlZWQgKi8KLSAgIGZvciAoeSA9IDA7IHkgPCBoTGVuOyB5KyspIHsKLSAgICAgIHNlZWRbeV0gXj0gbWFza1t5XTsKLSAgIH0KLQotICAgLyogY29tcHV0ZSBNR0YxIG9mIHNlZWQgKGsgLSBobGVuIC0gMSkgKi8KLSAgIGlmICgoZXJyID0gcGtjc18xX21nZjEoc2VlZCwgaExlbiwgaGFzaF9pZHgsIG1hc2ssIG1vZHVsdXNfbGVuIC0gaExlbiAtIDEpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogeG9yIGFnYWluc3QgREIgKi8KLSAgIGZvciAoeSA9IDA7IHkgPCAobW9kdWx1c19sZW4gLSBoTGVuIC0gMSk7IHkrKykgewotICAgICAgIERCW3ldIF49IG1hc2tbeV07IAotICAgfQotCi0gICAvKiBub3cgREIgPT0gbGhhc2ggfHwgUFMgfHwgMHgwMSB8fCBNLCBQUyA9PSBrIC0gbWxlbiAtIDJobGVuIC0gMiB6ZXJvZXMgKi8KLQotICAgLyogY29tcHV0ZSBsaGFzaCBhbmQgc3RvcmUgaXQgaW4gc2VlZCBbcmV1c2UgdGVtcHMhXSAqLwotICAgeCA9IHNpemVvZihzZWVkKTsKLSAgIGlmIChscGFyYW0gIT0gTlVMTCkgewotICAgICAgaWYgKChlcnIgPSBoYXNoX21lbW9yeShoYXNoX2lkeCwgbHBhcmFtLCBscGFyYW1sZW4sIHNlZWQsICZ4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICB9Ci0gICB9IGVsc2UgewotICAgICAgLyogY2FuJ3QgcGFzcyBoYXNoX21lbW9yeSBhIE5VTEwgc28gdXNlIERCIHdpdGggemVybyBsZW5ndGggKi8KLSAgICAgIGlmICgoZXJyID0gaGFzaF9tZW1vcnkoaGFzaF9pZHgsIERCLCAwLCBzZWVkLCAmeCkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICByZXR1cm4gZXJyOwotICAgICAgfQotICAgfQotCi0gICAvKiBjb21wYXJlIHRoZSBsaGFzaCdlcyAqLwotICAgaWYgKG1lbWNtcChzZWVkLCBEQiwgaExlbikgIT0gMCkgewotICAgICAgcmV0dXJuIENSWVBUX09LOwotICAgfQotCi0gICAvKiBub3cgemVyb2VzIGJlZm9yZSBhIDB4MDEgKi8KLSAgIGZvciAoeCA9IGhMZW47IHggPCAobW9kdWx1c19sZW4gLSBoTGVuIC0gMSkgJiYgREJbeF0gPT0gMHgwMDsgeCsrKSB7Ci0gICAgICAvKiBzdGVwLi4uICovCi0gICB9Ci0KLSAgIC8qIGVycm9yIG91dCBpZiB3YXNuJ3QgMHgwMSAqLwotICAgaWYgKHggPT0gKG1vZHVsdXNfbGVuIC0gaExlbiAtIDEpIHx8IERCW3hdICE9IDB4MDEpIHsKLSAgICAgIHJldHVybiBDUllQVF9PSzsKLSAgIH0KLQotICAgLyogcmVzdCBpcyB0aGUgbWVzc2FnZSAoYW5kIHNraXAgMHgwMSkgKi8KLSAgIGlmIChtc2dsZW4gLSArK3ggPiAqb3V0bGVuKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgfQotCi0gICAvKiBjb3B5IG1lc3NhZ2UgKi8KLSAgICpvdXRsZW4gPSAobW9kdWx1c19sZW4gLSBoTGVuIC0gMSkgLSB4OwotICAgZm9yICh5ID0gMDsgeCAhPSAobW9kdWx1c19sZW4gLSBoTGVuIC0gMSk7ICkgewotICAgICAgIG91dFt5KytdID0gREJbeCsrXTsKLSAgIH0KLQotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKERCLCAgIHNpemVvZihEQikpOwotICAgemVyb21lbShzZWVkLCBzaXplb2Yoc2VlZCkpOwotICAgemVyb21lbShtYXNrLCBzaXplb2YobWFzaykpOwotI2VuZGlmCi0KLSAgIC8qIHZhbGlkIHBhY2tldCAqLwotICAgKnJlcyA9IDE7Ci0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIC8qIFBLQ1NfMSAqLwpkaWZmIC0tZ2l0IGEvcGtjc18xX29hZXBfZW5jb2RlLmMgYi9wa2NzXzFfb2FlcF9lbmNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjNzZmNC4uMDAwMDAwMAotLS0gYS9wa2NzXzFfb2FlcF9lbmNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLS8qIE9BRVAgUGFkZGluZyBmb3IgUEtDUyAjMSAtLSBUb20gU3QgRGVuaXMgKi8KLQotI2lmZGVmIFBLQ1NfMQotCi1pbnQgcGtjc18xX29hZXBfZW5jb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZywgICAgdW5zaWduZWQgbG9uZyBtc2dsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxwYXJhbSwgdW5zaWduZWQgbG9uZyBscGFyYW1sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19iaXRsZW4sIHBybmdfc3RhdGUgKnBybmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgcHJuZ19pZHgsICAgICAgICAgaW50ICBoYXNoX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0gICB1bnNpZ25lZCBjaGFyIERCWzEwMjRdLCBzZWVkW01BWEJMT0NLU0laRV0sIG1hc2tbc2l6ZW9mKERCKV07Ci0gICB1bnNpZ25lZCBsb25nIGhMZW4sIHgsIHksIG1vZHVsdXNfbGVuOwotICAgaW50ICAgICAgICAgICBlcnI7Ci0KLSAgIF9BUkdDSEsobXNnICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLQotICAgLyogdGVzdCB2YWxpZCBoYXNoICovCi0gICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaF9pZHgpKSAhPSBDUllQVF9PSykgeyAKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIHZhbGlkIHBybmcgKi8KLSAgIGlmICgoZXJyID0gcHJuZ19pc192YWxpZChwcm5nX2lkeCkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICBoTGVuICAgICAgICA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0uaGFzaHNpemU7Ci0gICBtb2R1bHVzX2xlbiA9IChtb2R1bHVzX2JpdGxlbiA+PiAzKSArIChtb2R1bHVzX2JpdGxlbiAmIDcgPyAxIDogMCk7Ci0KLSAgIC8qIHRlc3QgbWVzc2FnZSBzaXplICovCi0gICBpZiAobW9kdWx1c19sZW4gPj0gc2l6ZW9mKERCKSB8fCBtc2dsZW4gPiAobW9kdWx1c19sZW4gLSAyKmhMZW4gLSAyKSkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX0lOVkFMSURfU0laRTsKLSAgIH0KLQotICAgLyogZ2V0IGxoYXNoICovCi0vLyBEQiA9PSBsaGFzaCB8fCBQUyB8fCAweDAxIHx8IE0sIFBTID09IGsgLSBtbGVuIC0gMmhsZW4gLSAyIHplcm9lcwotICAgeCA9IHNpemVvZihEQik7Ci0gICBpZiAobHBhcmFtICE9IE5VTEwpIHsKLSAgICAgIGlmICgoZXJyID0gaGFzaF9tZW1vcnkoaGFzaF9pZHgsIGxwYXJhbSwgbHBhcmFtbGVuLCBEQiwgJngpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgIH0KLSAgIH0gZWxzZSB7Ci0gICAgICAvKiBjYW4ndCBwYXNzIGhhc2hfbWVtb3J5IGEgTlVMTCBzbyB1c2UgREIgd2l0aCB6ZXJvIGxlbmd0aCAqLwotICAgICAgaWYgKChlcnIgPSBoYXNoX21lbW9yeShoYXNoX2lkeCwgREIsIDAsIERCLCAmeCkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICByZXR1cm4gZXJyOwotICAgICAgfQotICAgfQotCi0gICAvKiBhcHBlbmQgUFMgdGhlbiAweDAxICh0byBsaGFzaCkgICovCi0gICB4ID0gaExlbjsKLSAgIHkgPSBtb2R1bHVzX2xlbiAtIG1zZ2xlbiAtIDIqaExlbiAtIDI7Ci0gICB3aGlsZSAoeS0tKSB7Ci0gICAgICBEQlt4KytdID0gMHgwMDsKLSAgIH0KLSAgIERCW3grK10gPSAweDAxOwotCi0gICAvKiBtZXNzYWdlICovCi0gICB5ID0gbXNnbGVuOwotICAgd2hpbGUgKHktLSkgewotICAgICBEQlt4KytdID0gKm1zZysrOwotICAgfQotCi0gICAvKiBub3cgY2hvb3NlIGEgcmFuZG9tIHNlZWQgKi8KLSAgIGlmIChwcm5nX2Rlc2NyaXB0b3JbcHJuZ19pZHhdLnJlYWQoc2VlZCwgaExlbiwgcHJuZykgIT0gaExlbikgewotICAgICAgcmV0dXJuIENSWVBUX0VSUk9SX1JFQURQUk5HOwotICAgfQotCi0gICAvKiBjb21wdXRlIE1HRjEgb2Ygc2VlZCAoayAtIGhsZW4gLSAxKSAqLwotICAgaWYgKChlcnIgPSBwa2NzXzFfbWdmMShzZWVkLCBoTGVuLCBoYXNoX2lkeCwgbWFzaywgbW9kdWx1c19sZW4gLSBoTGVuIC0gMSkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiB4b3IgYWdhaW5zdCBEQiAqLwotICAgZm9yICh5ID0gMDsgeSA8IChtb2R1bHVzX2xlbiAtIGhMZW4gLSAxKTsgeSsrKSB7Ci0gICAgICAgREJbeV0gXj0gbWFza1t5XTsgCi0gICB9Ci0KLSAgIC8qIGNvbXB1dGUgTUdGMSBvZiBtYXNrZWREQiAoaExlbikgKi8gCi0gICBpZiAoKGVyciA9IHBrY3NfMV9tZ2YxKERCLCBtb2R1bHVzX2xlbiAtIGhMZW4gLSAxLCBoYXNoX2lkeCwgbWFzaywgaExlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBYT1IgYWdhaW5zdCBzZWVkICovCi0gICBmb3IgKHkgPSAwOyB5IDwgaExlbjsgeSsrKSB7Ci0gICAgICBzZWVkW3ldIF49IG1hc2tbeV07Ci0gICB9Ci0KLSAgIC8qIGNyZWF0ZSBzdHJpbmcgb2YgbGVuZ3RoIG1vZHVsdXNfbGVuICovCi0gICBpZiAoKm91dGxlbiA8IG1vZHVsdXNfbGVuKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgfQotCi0gICAvKiBzdGFydCBvdXRwdXQgd2hpY2ggaXMgMHgwMCB8fCBtYXNrZWRTZWVkIHx8IG1hc2tlZERCICovCi0gICB4ID0gMDsKLSAgIG91dFt4KytdID0gMHgwMDsKLSAgIGZvciAoeSA9IDA7IHkgPCBoTGVuOyB5KyspIHsKLSAgICAgIG91dFt4KytdID0gc2VlZFt5XTsKLSAgIH0KLSAgIGZvciAoeSA9IDA7IHkgPCBtb2R1bHVzX2xlbiAtIGhMZW4gLSAxOyB5KyspIHsKLSAgICAgIG91dFt4KytdID0gREJbeV07Ci0gICB9Ci0gICAqb3V0bGVuID0geDsKLQotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKERCLCAgIHNpemVvZihEQikpOwotICAgemVyb21lbShzZWVkLCBzaXplb2Yoc2VlZCkpOwotICAgemVyb21lbShtYXNrLCBzaXplb2YobWFzaykpOwotI2VuZGlmCi0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIC8qIFBLQ1NfMSAqLwotCmRpZmYgLS1naXQgYS9wa2NzXzFfb3MyaXAuYyBiL3BrY3NfMV9vczJpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmY4ODFlLi4wMDAwMDAwCi0tLSBhL3BrY3NfMV9vczJpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0vKiAgT2N0ZXQgdG8gSW50ZWdlciBPUzJJUCAtLSBUb20gU3QgRGVuaXMgKi8KLSNpZmRlZiBQS0NTXzEKLQotaW50IHBrY3NfMV9vczJpcChtcF9pbnQgKm4sIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKQotewotICAgaW50IGVycjsKLSAgIC8qIHJlYWQgaXQgKi8KLSAgIGlmICgoZXJyID0gbXBfcmVhZF91bnNpZ25lZF9iaW4obiwgaW4sIGlubGVuKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsKLSAgIH0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIC8qIFBLQ1NfMSAqLwotCmRpZmYgLS1naXQgYS9wa2NzXzFfcHNzX2RlY29kZS5jIGIvcGtjc18xX3Bzc19kZWNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkZTY1Zi4uMDAwMDAwMAotLS0gYS9wa2NzXzFfcHNzX2RlY29kZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotLyogUEtDUyAjMSBQU1MgU2lnbmF0dXJlIFBhZGRpbmcgLS0gVG9tIFN0IERlbmlzICovCi0KLSNpZmRlZiBQS0NTXzEKLQotaW50IHBrY3NfMV9wc3NfZGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZ2hhc2gsIHVuc2lnbmVkIGxvbmcgbXNnaGFzaGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsICAgICB1bnNpZ25lZCBsb25nIHNpZ2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNhbHRsZW4sICBpbnQgICAgICAgICAgIGhhc2hfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19iaXRsZW4sIGludCAgICAqcmVzKQotewotICAgdW5zaWduZWQgY2hhciBEQlsxMDI0XSwgbWFza1tzaXplb2YoREIpXSwgc2FsdFtzaXplb2YoREIpXSwgaGFzaFtzaXplb2YoREIpXTsKLSAgIHVuc2lnbmVkIGxvbmcgeCwgeSwgaExlbiwgbW9kdWx1c19sZW47Ci0gICBpbnQgICAgICAgICAgIGVycjsKLSAgIGhhc2hfc3RhdGUgICAgbWQ7Ci0KLSAgIF9BUkdDSEsobXNnaGFzaCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsocmVzICAgICAhPSBOVUxMKTsKLQotICAgLyogZGVmYXVsdCB0byBpbnZhbGlkICovCi0gICAqcmVzID0gMDsKLQotICAgLyogZW5zdXJlIGhhc2ggaXMgdmFsaWQgKi8KLSAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoX2lkeCkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICBoTGVuICAgICAgICA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0uaGFzaHNpemU7Ci0gICBtb2R1bHVzX2xlbiA9IChtb2R1bHVzX2JpdGxlbj4+MykgKyAobW9kdWx1c19iaXRsZW4gJiA3ID8gMSA6IDApOwotCi0gICAvKiBjaGVjayBzaXplcyAqLwotICAgaWYgKChzYWx0bGVuID4gc2l6ZW9mKHNhbHQpKSB8fCAobW9kdWx1c19sZW4gPiBzaXplb2YoREIpKSB8fCAKLSAgICAgICAobW9kdWx1c19sZW4gPCBoTGVuICsgc2FsdGxlbiArIDIpIHx8IChzaWdsZW4gIT0gbW9kdWx1c19sZW4pKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9Ci0KLSAgIC8qIGVuc3VyZSB0aGUgMHhCQyBieXRlICovCi0gICBpZiAoc2lnW3NpZ2xlbi0xXSAhPSAweEJDKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfT0s7Ci0gICB9Ci0KLSAgIC8qIGNvcHkgb3V0IHRoZSBEQiAqLwotICAgZm9yICh4ID0gMDsgeCA8IG1vZHVsdXNfbGVuIC0gaExlbiAtIDE7IHgrKykgewotICAgICAgREJbeF0gPSBzaWdbeF07Ci0gICB9Ci0KLSAgIC8qIGNvcHkgb3V0IHRoZSBoYXNoICovCi0gICBmb3IgKHkgPSAwOyB5IDwgaExlbjsgeSsrKSB7Ci0gICAgICBoYXNoW3ldID0gc2lnW3grK107Ci0gICB9Ci0KLSAgIC8qIGNoZWNrIHRoZSBNU0IgKi8KLSAgIGlmICgoc2lnWzBdICYgfigweEZGID4+ICgobW9kdWx1c19sZW48PDMpIC0gKG1vZHVsdXNfYml0bGVuLTEpKSkpICE9IDApIHsKLSAgICAgIHJldHVybiBDUllQVF9PSzsKLSAgIH0KLQotICAgLyogZ2VuZXJhdGUgbWFzayBvZiBsZW5ndGggbW9kdWx1c19sZW4gLSBoTGVuIC0gMSBmcm9tIGhhc2ggKi8KLSAgIGlmICgoZXJyID0gcGtjc18xX21nZjEoaGFzaCwgaExlbiwgaGFzaF9pZHgsIG1hc2ssIG1vZHVsdXNfbGVuIC0gaExlbiAtIDEpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogeG9yIGFnYWluc3QgREIgKi8KLSAgIGZvciAoeSA9IDA7IHkgPCAobW9kdWx1c19sZW4gLSBoTGVuIC0gMSk7IHkrKykgewotICAgICAgREJbeV0gXj0gbWFza1t5XTsKLSAgIH0KLSAgIAotICAgLyogbm93IGNsZWFyIHRoZSBmaXJzdCBieXRlIFttYWtlIHN1cmUgc21hbGxlciB0aGFuIG1vZHVsdXNdICovCi0gICBEQlswXSAmPSAweEZGID4+ICgobW9kdWx1c19sZW48PDMpIC0gKG1vZHVsdXNfYml0bGVuLTEpKTsKLQotICAgLyogREIgPSBQUyB8fCAweDAxIHx8IHNhbHQsIFBTID09IG1vZHVsdXNfbGVuIC0gc2FsdGxlbiAtIGhMZW4gLSAyIHplcm8gYnl0ZXMgKi8KLQotICAgLyogY2hlY2sgZm9yIHplcm9lcyBhbmQgMHgwMSAqLwotICAgZm9yICh4ID0gMDsgeCA8IG1vZHVsdXNfbGVuIC0gc2FsdGxlbiAtIGhMZW4gLSAyOyB4KyspIHsKLSAgICAgICBpZiAoREJbeF0gIT0gMHgwMCkgewotICAgICAgICAgIHJldHVybiBDUllQVF9PSzsKLSAgICAgICB9Ci0gICB9Ci0KLSAgIGlmIChEQlt4KytdICE9IDB4MDEpIHsKLSAgICAgIHJldHVybiBDUllQVF9PSzsKLSAgIH0KLQotICAgLyogTSA9IChlaWdodCkgMHgwMCB8fCBtc2doYXNoIHx8IHNhbHQsIG1hc2sgPSBIKE0pICovCi0gICBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLmluaXQoJm1kKTsKLSAgIHplcm9tZW0obWFzaywgOCk7Ci0gICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0ucHJvY2VzcygmbWQsIG1hc2ssIDgpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5wcm9jZXNzKCZtZCwgbXNnaGFzaCwgbXNnaGFzaGxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLnByb2Nlc3MoJm1kLCBEQit4LCBzYWx0bGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0uZG9uZSgmbWQsIG1hc2spKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogbWFzayA9PSBoYXNoIG1lYW5zIHZhbGlkIHNpZ25hdHVyZSAqLwotICAgaWYgKG1lbWNtcChtYXNrLCBoYXNoLCBoTGVuKSA9PSAwKSB7Ci0gICAgICAqcmVzID0gMTsKLSAgIH0KLQotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKERCLCAgIHNpemVvZihEQikpOyAgIAotICAgemVyb21lbShtYXNrLCBzaXplb2YobWFzaykpOyAgIAotICAgemVyb21lbShzYWx0LCBzaXplb2Yoc2FsdCkpOyAgIAotICAgemVyb21lbShoYXNoLCBzaXplb2YoaGFzaCkpOyAgIAotI2VuZGlmCi0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIC8qIFBLQ1NfMSAqLwpkaWZmIC0tZ2l0IGEvcGtjc18xX3Bzc19lbmNvZGUuYyBiL3BrY3NfMV9wc3NfZW5jb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDI4OTIuLjAwMDAwMDAKLS0tIGEvcGtjc18xX3Bzc19lbmNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLS8qIFBLQ1MgIzEgUFNTIFNpZ25hdHVyZSBQYWRkaW5nIC0tIFRvbSBTdCBEZW5pcyAqLwotCi0jaWZkZWYgUEtDU18xCi0KLWludCBwa2NzXzFfcHNzX2VuY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICptc2doYXNoLCB1bnNpZ25lZCBsb25nIG1zZ2hhc2hsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzYWx0bGVuLCAgcHJuZ19zdGF0ZSAgICpwcm5nLCAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBwcm5nX2lkeCwgaW50ICAgICAgICAgICBoYXNoX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG1vZHVsdXNfYml0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKLXsKLSAgIHVuc2lnbmVkIGNoYXIgREJbMTAyNF0sIG1hc2tbc2l6ZW9mKERCKV0sIHNhbHRbc2l6ZW9mKERCKV0sIGhhc2hbc2l6ZW9mKERCKV07Ci0gICB1bnNpZ25lZCBsb25nIHgsIHksIGhMZW4sIG1vZHVsdXNfbGVuOwotICAgaW50ICAgICAgICAgICBlcnI7Ci0gICBoYXNoX3N0YXRlICAgIG1kOwotCi0gICBfQVJHQ0hLKG1zZ2hhc2ggIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAgIT0gTlVMTCk7Ci0KLSAgIC8qIGVuc3VyZSBoYXNoIGFuZCBQUk5HIGFyZSB2YWxpZCAqLwotICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGhhc2hfaWR4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQocHJuZ19pZHgpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgaExlbiAgICAgICAgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLmhhc2hzaXplOwotICAgbW9kdWx1c19sZW4gPSAobW9kdWx1c19iaXRsZW4+PjMpICsgKG1vZHVsdXNfYml0bGVuICYgNyA/IDEgOiAwKTsKLQotICAgLyogY2hlY2sgc2l6ZXMgKi8KLSAgIGlmICgoc2FsdGxlbiA+IHNpemVvZihzYWx0KSkgfHwgKG1vZHVsdXNfbGVuID4gc2l6ZW9mKERCKSkgfHwgKG1vZHVsdXNfbGVuIDwgaExlbiArIHNhbHRsZW4gKyAyKSkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOwotICAgfQotCi0gICAvKiBnZW5lcmF0ZSByYW5kb20gc2FsdCAqLwotICAgaWYgKHNhbHRsZW4gPiAwKSB7Ci0gICAgICBpZiAocHJuZ19kZXNjcmlwdG9yW3BybmdfaWR4XS5yZWFkKHNhbHQsIHNhbHRsZW4sIHBybmcpICE9IHNhbHRsZW4pIHsKLSAgICAgICAgIHJldHVybiBDUllQVF9FUlJPUl9SRUFEUFJORzsKLSAgICAgIH0KLSAgIH0KLQotICAgLyogTSA9IChlaWdodCkgMHgwMCB8fCBtc2doYXNoIHx8IHNhbHQsIGhhc2ggPSBIKE0pICovCi0gICBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLmluaXQoJm1kKTsKLSAgIHplcm9tZW0oREIsIDgpOwotICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLnByb2Nlc3MoJm1kLCBEQiwgOCkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLnByb2Nlc3MoJm1kLCBtc2doYXNoLCBtc2doYXNobGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0ucHJvY2VzcygmbWQsIHNhbHQsIHNhbHRsZW4pKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5kb25lKCZtZCwgaGFzaCkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBnZW5lcmF0ZSBEQiA9IFBTIHx8IDB4MDEgfHwgc2FsdCwgUFMgPT0gbW9kdWx1c19sZW4gLSBzYWx0bGVuIC0gaExlbiAtIDIgemVybyBieXRlcyAqLwotICAgZm9yICh4ID0gMDsgeCA8IChtb2R1bHVzX2xlbiAtIHNhbHRsZW4gLSBoTGVuIC0gMik7IHgrKykgewotICAgICAgIERCW3hdID0gMHgwMDsKLSAgIH0KLSAgIERCW3grK10gPSAweDAxOwotICAgZm9yICh5ID0gMDsgeSA8IHNhbHRsZW47IHkrKykgewotICAgICAgREJbeCsrXSA9IHNhbHRbeV07Ci0gICB9Ci0KLSAgIC8qIGdlbmVyYXRlIG1hc2sgb2YgbGVuZ3RoIG1vZHVsdXNfbGVuIC0gaExlbiAtIDEgZnJvbSBoYXNoICovCi0gICBpZiAoKGVyciA9IHBrY3NfMV9tZ2YxKGhhc2gsIGhMZW4sIGhhc2hfaWR4LCBtYXNrLCBtb2R1bHVzX2xlbiAtIGhMZW4gLSAxKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIHhvciBhZ2FpbnN0IERCICovCi0gICBmb3IgKHkgPSAwOyB5IDwgKG1vZHVsdXNfbGVuIC0gaExlbiAtIDEpOyB5KyspIHsKLSAgICAgIERCW3ldIF49IG1hc2tbeV07Ci0gICB9Ci0KLSAgIC8qIG91dHB1dCBpcyBEQiB8fCBoYXNoIHx8IDB4QkMgKi8KLSAgIGlmICgqb3V0bGVuIDwgbW9kdWx1c19sZW4pIHsKLSAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gICB9Ci0KLSAgIC8qIERCICovCi0gICBmb3IgKHkgPSB4ID0gMDsgeCA8IG1vZHVsdXNfbGVuIC0gaExlbiAtIDE7IHgrKykgewotICAgICAgIG91dFt5KytdID0gREJbeF07Ci0gICB9Ci0gICAvKiBoYXNoICovCi0gICBmb3IgKHggPSAwOyB4IDwgaExlbjsgeCsrKSB7Ci0gICAgICAgb3V0W3krK10gPSBoYXNoW3hdOwotICAgfQotICAgLyogMHhCQyAqLwotICAgb3V0W3ldID0gMHhCQzsKLQotICAgLyogbm93IGNsZWFyIHRoZSA4Km1vZHVsdXNfbGVuIC0gbW9kdWx1c19iaXRsZW4gbW9zdCBzaWduaWZpY2FudCBiaXRzICovCi0gICBvdXRbMF0gJj0gMHhGRiA+PiAoKG1vZHVsdXNfbGVuPDwzKSAtIChtb2R1bHVzX2JpdGxlbi0xKSk7Ci0KLSAgIC8qIHN0b3JlIG91dHB1dCBzaXplICovCi0gICAqb3V0bGVuID0gbW9kdWx1c19sZW47Ci0KLSNpZmRlZiBDTEVBTl9TVEFDSwotICAgemVyb21lbShEQiwgICBzaXplb2YoREIpKTsgICAKLSAgIHplcm9tZW0obWFzaywgc2l6ZW9mKG1hc2spKTsgICAKLSAgIHplcm9tZW0oc2FsdCwgc2l6ZW9mKHNhbHQpKTsgICAKLSAgIHplcm9tZW0oaGFzaCwgc2l6ZW9mKGhhc2gpKTsgICAKLSNlbmRpZgotCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZiAvKiBQS0NTXzEgKi8KZGlmZiAtLWdpdCBhL3BrY3NfMV92MTVfZXNfZGVjb2RlLmMgYi9wa2NzXzFfdjE1X2VzX2RlY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGFlNTU0Li4wMDAwMDAwCi0tLSBhL3BrY3NfMV92MTVfZXNfZGVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLS8qIFBLQ1MgIzEgdjEuNSBFbmNyeXB0aW9uIFBhZGRpbmcgLS0gVG9tIFN0IERlbmlzICovCi0KLSNpZmRlZiBQS0NTXzEKLQotaW50IHBrY3NfMV92MTVfZXNfZGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZywgIHVuc2lnbmVkIGxvbmcgbXNnbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19iaXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgdW5zaWduZWQgbG9uZyBvdXRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqcmVzKQotewotICAgdW5zaWduZWQgbG9uZyB4LCBtb2R1bHVzX2J5dGVsZW47Ci0KLSAgIF9BUkdDSEsobXNnICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHJlcyAhPSBOVUxMKTsKLSAgIAotICAgLyogZGVmYXVsdCB0byBmYWlsZWQgKi8KLSAgICpyZXMgPSAwOwotCi0gICAvKiBtdXN0IGJlIGF0IGxlYXN0IDEyIGJ5dGVzIGxvbmcgKi8KLSAgIGlmIChtc2dsZW4gPCAxMikgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOwotICAgfQotCi0gICBtb2R1bHVzX2J5dGVsZW4gPSAobW9kdWx1c19iaXRsZW4+PjMpICsgKG1vZHVsdXNfYml0bGVuICYgNyA/IDEgOiAwKTsKLQotICAgLyogc2hvdWxkIHN0YXJ0IHdpdGggMHgwMCAweDAyICovCi0gICBpZiAobXNnWzBdICE9IDB4MDAgfHwgbXNnWzFdICE9IDB4MDIpIHsKLSAgICAgIHJldHVybiBDUllQVF9PSzsKLSAgIH0KLSAgIAotICAgLyogc2tpcCBvdmVyIFBTICovCi0gICB4ID0gMiArIChtb2R1bHVzX2J5dGVsZW4gLSBvdXRsZW4gLSAzKTsKLQotICAgLyogc2hvdWxkIGJlIDB4MDAgKi8KLSAgIGlmIChtc2dbeCsrXSAhPSAweDAwKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfT0s7Ci0gICB9Ci0KLSAgIC8qIHRoZSBtZXNzYWdlIGlzIGxlZnQgKi8KLSAgIGlmICh4ICsgb3V0bGVuID4gbW9kdWx1c19ieXRlbGVuKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfUEtfSU5WQUxJRF9TSVpFOwotICAgfQotICAgbWVtY3B5KG91dCwgbXNnICsgeCwgb3V0bGVuKTsKLSAgICpyZXMgPSAxOwotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jZW5kaWYgCi0KZGlmZiAtLWdpdCBhL3BrY3NfMV92MTVfZXNfZW5jb2RlLmMgYi9wa2NzXzFfdjE1X2VzX2VuY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmQwYWFhLi4wMDAwMDAwCi0tLSBhL3BrY3NfMV92MTVfZXNfZW5jb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLS8qIHYxLjUgRW5jcnlwdGlvbiBQYWRkaW5nIGZvciBQS0NTICMxIC0tIFRvbSBTdCBEZW5pcyAqLwotCi0jaWZkZWYgUEtDU18xCi0KLWludCBwa2NzXzFfdjE1X2VzX2VuY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICptc2csICAgIHVuc2lnbmVkIGxvbmcgbXNnbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIG1vZHVsdXNfYml0bGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICAgICpwcm5nLCAgIGludCAgICAgICAgICAgcHJuZ19pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17IAotICAgdW5zaWduZWQgbG9uZyBtb2R1bHVzX2J5dGVsZW4sIHgsIHk7Ci0KLSAgIF9BUkdDSEsobXNnICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLQotICAgLyogZ2V0IG1vZHVsdXMgbGVuICovCi0gICBtb2R1bHVzX2J5dGVsZW4gPSAobW9kdWx1c19iaXRsZW4gPj4gMykgKyAobW9kdWx1c19iaXRsZW4gJiA3ID8gMSA6IDApOwotICAgaWYgKG1vZHVsdXNfYnl0ZWxlbiA8IDEyKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9Ci0KLSAgIC8qIHZlcmlmeSBsZW5ndGggKi8KLSAgIGlmIChtc2dsZW4gPiAobW9kdWx1c19ieXRlbGVuIC0gMTEpIHx8ICpvdXRsZW4gPCBtb2R1bHVzX2J5dGVsZW4pIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19JTlZBTElEX1NJWkU7Ci0gICB9Ci0KLSAgIC8qIDB4MDAgMHgwMiBQUyAweDAwIE0gKi8KLSAgIHggPSAwOwotICAgb3V0W3grK10gPSAweDAwOwotICAgb3V0W3grK10gPSAweDAyOwotICAgeSA9IG1vZHVsdXNfYnl0ZWxlbiAtIG1zZ2xlbiAtIDM7Ci0gICBpZiAocHJuZ19kZXNjcmlwdG9yW3BybmdfaWR4XS5yZWFkKG91dCt4LCB5LCBwcm5nKSAhPSB5KSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfRVJST1JfUkVBRFBSTkc7Ci0gICB9Ci0gICB4ICs9IHk7Ci0gICBvdXRbeCsrXSA9IDB4MDA7Ci0gICBtZW1jcHkob3V0K3gsIG1zZywgbXNnbGVuKTsKLSAgICpvdXRsZW4gPSBtb2R1bHVzX2J5dGVsZW47Ci0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIC8qIFBLQ1NfMSAqLwpkaWZmIC0tZ2l0IGEvcGtjc18xX3YxNV9zYV9kZWNvZGUuYyBiL3BrY3NfMV92MTVfc2FfZGVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTMwN2MuLjAwMDAwMDAKLS0tIGEvcGtjc18xX3YxNV9zYV9kZWNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotLyogUEtDUyAjMSB2MS41IFNpZ25hdHVyZSBQYWRkaW5nIC0tIFRvbSBTdCBEZW5pcyAqLwotCi0jaWZkZWYgUEtDU18xCi0KLWludCBwa2NzXzFfdjE1X3NhX2RlY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICptc2doYXNoLCB1bnNpZ25lZCBsb25nIG1zZ2hhc2hsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLCAgICAgdW5zaWduZWQgbG9uZyBzaWdsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICBoYXNoX2lkeCwgdW5zaWduZWQgbG9uZyBtb2R1bHVzX2JpdGxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICpyZXMpCi17Ci0gICB1bnNpZ25lZCBsb25nIHgsIHksIG1vZHVsdXNfYnl0ZWxlbiwgZGVybGVuOwotICAgaW50IGVycjsKLSAgIAotICAgX0FSR0NISyhtc2doYXNoICE9IE5VTEwpOwotICAgX0FSR0NISyhzaWcgICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhyZXMgICAgICE9IE5VTEwpOwotCi0gICAvKiBkZWZhdWx0IHRvIGludmFsaWQgKi8KLSAgICpyZXMgPSAwOwotCi0gICAvKiB2YWxpZCBoYXNoID8gKi8KLSAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoX2lkeCkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBnZXQgZGVybGVuICovCi0gICBkZXJsZW4gPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLkRFUmxlbjsKLQotICAgLyogZ2V0IG1vZHVsdXMgbGVuICovCi0gICBtb2R1bHVzX2J5dGVsZW4gPSAobW9kdWx1c19iaXRsZW4+PjMpICsgKG1vZHVsdXNfYml0bGVuICYgNyA/IDEgOiAwKTsKLQotICAgLyogdmFsaWQgc2l6ZXM/ICovCi0gICBpZiAoKG1zZ2hhc2hsZW4gKyAzICsgZGVybGVuID4gbW9kdWx1c19ieXRlbGVuKSB8fCAoc2lnbGVuICE9IG1vZHVsdXNfYnl0ZWxlbikpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19JTlZBTElEX1NJWkU7Ci0gICB9Ci0KLSAgIC8qIHBhY2tldCBpcyAweDAwIDB4MDEgUFMgMHgwMCBULCB3aGVyZSBQUyA9PSAweEZGIHJlcGVhdGVkIG1vZHVsdXNfYnl0ZWxlbiAtIDMgLSBkZXJsZW4gLSBtc2doYXNobGVuIHRpbWVzLCBUID09IERFUiB8fCBoYXNoICovCi0gICB4ID0gMDsKLSAgIGlmIChzaWdbeCsrXSAhPSAweDAwIHx8IHNpZ1t4KytdICE9IDB4MDEpIHsKLSAgICAgIHJldHVybiBDUllQVF9PSzsKLSAgIH0KLQotICAgLyogbm93IGZvbGxvd3MgKG1vZHVsdXNfYnl0ZWxlbiAtIDMgLSBkZXJsZW4gLSBtc2doYXNobGVuKSAweEZGIGJ5dGVzICovCi0gICBmb3IgKHkgPSAwOyB5IDwgKG1vZHVsdXNfYnl0ZWxlbiAtIDMgLSBkZXJsZW4gLSBtc2doYXNobGVuKTsgeSsrKSB7Ci0gICAgIGlmIChzaWdbeCsrXSAhPSAweEZGKSB7Ci0gICAgICAgIHJldHVybiBDUllQVF9PSzsKLSAgICAgfQotICAgfQotCi0gICBpZiAoc2lnW3grK10gIT0gMHgwMCkgewotICAgICAgcmV0dXJuIENSWVBUX09LOwotICAgfQotCi0gICBmb3IgKHkgPSAwOyB5IDwgZGVybGVuOyB5KyspIHsKLSAgICAgIGlmIChzaWdbeCsrXSAhPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLkRFUlt5XSkgewotICAgICAgICAgcmV0dXJuIENSWVBUX09LOwotICAgICAgfQotICAgfQotCi0gICBpZiAobWVtY21wKG1zZ2hhc2gsIHNpZyt4LCBtc2doYXNobGVuKSA9PSAwKSB7Ci0gICAgICAqcmVzID0gMTsKLSAgIH0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIApkaWZmIC0tZ2l0IGEvcGtjc18xX3YxNV9zYV9lbmNvZGUuYyBiL3BrY3NfMV92MTVfc2FfZW5jb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjI1OGEuLjAwMDAwMDAKLS0tIGEvcGtjc18xX3YxNV9zYV9lbmNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotLyogUEtDUyAjMSB2MS41IFNpZ25hdHVyZSBQYWRkaW5nIC0tIFRvbSBTdCBEZW5pcyAqLwotCi0jaWZkZWYgUEtDU18xCi0KLWludCBwa2NzXzFfdjE1X3NhX2VuY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICptc2doYXNoLCAgdW5zaWduZWQgbG9uZyBtc2doYXNobGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhhc2hfaWR4LCB1bnNpZ25lZCBsb25nIG1vZHVsdXNfYml0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0gIHVuc2lnbmVkIGxvbmcgZGVybGVuLCBtb2R1bHVzX2J5dGVsZW4sIHgsIHk7Ci0gIGludCBlcnI7Ci0KLSAgX0FSR0NISyhtc2doYXNoICE9IE5VTEwpCi0gIF9BUkdDSEsob3V0ICAgICAhPSBOVUxMKTsKLSAgX0FSR0NISyhvdXRsZW4gICE9IE5VTEwpOwotCi0gIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoX2lkeCkpICE9IENSWVBUX09LKSB7Ci0gICAgIHJldHVybiBlcnI7Ci0gIH0KLQotICAvKiBoYWNrLCB0byBkZXRlY3QgYW55IGhhc2ggd2l0aG91dCBhIERFUiBPSUQgKi8KLSAgaWYgKGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0uREVSbGVuID09IDApIHsKLSAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOyAKLSAgfQotCi0gIC8qIGdldCBtb2R1bHVzIGxlbiAqLwotICBtb2R1bHVzX2J5dGVsZW4gPSAobW9kdWx1c19iaXRsZW4+PjMpICsgKG1vZHVsdXNfYml0bGVuICYgNyA/IDEgOiAwKTsKLQotICAvKiBnZXQgZGVyIGxlbiBvaz8gIEZvcmdpdmUgbXkgbGFtZSBHZXJtYW4gYWNjZW50Li4uLiAqLwotICBkZXJsZW4gPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLkRFUmxlbjsKLQotICAvKiB2YWxpZCBzaXplcz8gKi8KLSAgaWYgKG1zZ2hhc2hsZW4gKyAzICsgZGVybGVuID4gbW9kdWx1c19ieXRlbGVuKSB7Ci0gICAgIHJldHVybiBDUllQVF9QS19JTlZBTElEX1NJWkU7Ci0gIH0KLQotICBpZiAoKm91dGxlbiA8IG1vZHVsdXNfYnl0ZWxlbikgewotICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICB9Ci0KLSAgLyogcGFja2V0IGlzIDB4MDAgMHgwMSBQUyAweDAwIFQsIHdoZXJlIFBTID09IDB4RkYgcmVwZWF0ZWQgbW9kdWx1c19ieXRlbGVuIC0gMyAtIGRlcmxlbiAtIG1zZ2hhc2hsZW4gdGltZXMsIFQgPT0gREVSIHx8IGhhc2ggKi8KLSAgeCA9IDA7Ci0gIG91dFt4KytdID0gMHgwMDsKLSAgb3V0W3grK10gPSAweDAxOwotICBmb3IgKHkgPSAwOyB5IDwgKG1vZHVsdXNfYnl0ZWxlbiAtIDMgLSBkZXJsZW4gLSBtc2doYXNobGVuKTsgeSsrKSB7Ci0gICAgIG91dFt4KytdID0gMHhGRjsKLSAgfQotICBvdXRbeCsrXSA9IDB4MDA7Ci0gIGZvciAoeSA9IDA7IHkgPCBkZXJsZW47IHkrKykgewotICAgICBvdXRbeCsrXSA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0uREVSW3ldOwotICB9Ci0gIGZvciAoeSA9IDA7IHkgPCBtc2doYXNobGVuOyB5KyspIHsKLSAgICAgb3V0W3grK10gPSBtc2doYXNoW3ldOwotICB9Ci0KLSAgKm91dGxlbiA9IG1vZHVsdXNfYnl0ZWxlbjsKLSAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jZW5kaWYgLyogUEtDU18xICovCmRpZmYgLS1naXQgYS9wa2NzXzVfMS5jIGIvcGtjc181XzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhZTBlMS4uMDAwMDAwMAotLS0gYS9wa2NzXzVfMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSA8bXljcnlwdC5oPgotCi0vKiBQS0NTICM1LCBBbGdvcml0aG0gIzEgKi8KLSNpZmRlZiBQS0NTXzUKLQotaW50IHBrY3NfNV9hbGcxKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBsb25nIHBhc3N3b3JkX2xlbiwgCi0gICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwgCi0gICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbl9jb3VudCwgIGludCBoYXNoX2lkeCwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQotewotICAgaW50IGVycjsKLSAgIHVuc2lnbmVkIGxvbmcgeDsKLSAgIGhhc2hfc3RhdGUgbWQ7Ci0gICB1bnNpZ25lZCBjaGFyIGJ1ZltNQVhCTE9DS1NJWkVdOwotCi0gICBfQVJHQ0hLKHBhc3N3b3JkICE9IE5VTEwpOwotICAgX0FSR0NISyhzYWx0ICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0ICAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAgICE9IE5VTEwpOwotCi0gICAvKiB0ZXN0IGhhc2ggSURYICovCi0gICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaF9pZHgpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogaGFzaCBpbml0aWFsIHBhc3N3b3JkICsgc2FsdCAqLwotICAgaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5pbml0KCZtZCk7Ci0gICBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLnByb2Nlc3MoJm1kLCBwYXNzd29yZCwgcGFzc3dvcmRfbGVuKTsKLSAgIGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0ucHJvY2VzcygmbWQsIHNhbHQsIDgpOwotICAgaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5kb25lKCZtZCwgYnVmKTsKLQotICAgd2hpbGUgKC0taXRlcmF0aW9uX2NvdW50KSB7Ci0gICAgICAvLyBjb2RlIGdvZXMgaGVyZS4KLSAgICAgIHggPSBzaXplb2YoYnVmKTsKLSAgICAgIGlmICgoZXJyID0gaGFzaF9tZW1vcnkoaGFzaF9pZHgsIGJ1ZiwgaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5oYXNoc2l6ZSwgYnVmLCAmeCkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgICByZXR1cm4gZXJyOwotICAgICAgfQotICAgfQotCi0gICAvKiBjb3B5IHVwdG8gb3V0bGVuIGJ5dGVzICovCi0gICBmb3IgKHggPSAwOyB4IDwgaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5oYXNoc2l6ZSAmJiB4IDwgKm91dGxlbjsgeCsrKSB7Ci0gICAgICAgb3V0W3hdID0gYnVmW3hdOwotICAgfQotICAgKm91dGxlbiA9IHg7Ci0KLSNpZmRlZiBDTEVBTl9TVEFDSyAKLSAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0jZW5kaWYKLQotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3BrY3NfNV8yLmMgYi9wa2NzXzVfMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJmNzViLi4wMDAwMDAwCi0tLSBhL3BrY3NfNV8yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlIDxteWNyeXB0Lmg+Ci0KLS8qIFBLQ1MgIzUsIEFsZ29yaXRobSAjMiAqLwotI2lmZGVmIFBLQ1NfNQotCi1pbnQgcGtjc181X2FsZzIoY29uc3QgdW5zaWduZWQgY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGxvbmcgcGFzc3dvcmRfbGVuLCAKLSAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LCAgICAgdW5zaWduZWQgbG9uZyBzYWx0X2xlbiwKLSAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uX2NvdW50LCAgICAgICAgICAgaW50IGhhc2hfaWR4LAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0gICBpbnQgZXJyLCBpdHRzOwotICAgdW5zaWduZWQgbG9uZyBzdG9yZWQsIGxlZnQsIHgsIHksIGJsa25vOwotICAgdW5zaWduZWQgY2hhciBidWZbMl1bTUFYQkxPQ0tTSVpFXTsKLSAgIGhtYWNfc3RhdGUgICAgaG1hYzsKLQotICAgX0FSR0NISyhwYXNzd29yZCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoc2FsdCAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXRsZW4gICAhPSBOVUxMKTsKLQotICAgLyogdGVzdCBoYXNoIElEWCAqLwotICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGhhc2hfaWR4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIGxlZnQgICA9ICpvdXRsZW47Ci0gICBibGtubyAgPSAxOwotICAgc3RvcmVkID0gMDsKLSAgIHdoaWxlIChsZWZ0ICE9IDApIHsKLSAgICAgICAvKiBwcm9jZXNzIGJsb2NrIG51bWJlciBibGtubyAqLwotICAgICAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgCi0gICAgICAgLyogc3RvcmUgY3VycmVudCBibG9jayBudW1iZXIgYW5kIGluY3JlbWVudCBmb3IgbmV4dCBwYXNzICovCi0gICAgICAgU1RPUkUzMkgoYmxrbm8sIGJ1ZlsxXSk7Ci0gICAgICAgKytibGtubzsKLQotICAgICAgIC8qIGdldCBQUkYoUCwgU3x8aW50KGJsa25vKSkgKi8KLSAgICAgICBpZiAoKGVyciA9IGhtYWNfaW5pdCgmaG1hYywgaGFzaF9pZHgsIHBhc3N3b3JkLCBwYXNzd29yZF9sZW4pKSAhPSBDUllQVF9PSykgeyAKLSAgICAgICAgICByZXR1cm4gZXJyOyAKLSAgICAgICB9Ci0gICAgICAgaWYgKChlcnIgPSBobWFjX3Byb2Nlc3MoJmhtYWMsIHNhbHQsIHNhbHRfbGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgIH0KLSAgICAgICBpZiAoKGVyciA9IGhtYWNfcHJvY2VzcygmaG1hYywgYnVmWzFdLCA0KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgIH0KLSAgICAgICB4ID0gc2l6ZW9mKGJ1ZlswXSk7Ci0gICAgICAgaWYgKChlcnIgPSBobWFjX2RvbmUoJmhtYWMsIGJ1ZlswXSwgJngpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgfQotCi0gICAgICAgLyogbm93IGNvbXB1dGUgcmVwZWF0ZWQgYW5kIFhPUiBpdCBpbiBidWZbMV0gKi8KLSAgICAgICBtZW1jcHkoYnVmWzFdLCBidWZbMF0sIHgpOwotICAgICAgIGZvciAoaXR0cyA9IDI7IGl0dHMgPCBpdGVyYXRpb25fY291bnQ7ICsraXR0cykgewotICAgICAgICAgICBpZiAoKGVyciA9IGhtYWNfbWVtb3J5KGhhc2hfaWR4LCBwYXNzd29yZCwgcGFzc3dvcmRfbGVuLCBidWZbMF0sIHgsIGJ1ZlswXSwgJngpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCB4OyB5KyspIHsKLSAgICAgICAgICAgICAgIGJ1ZlsxXVt5XSBePSBidWZbMF1beV07Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgICAvKiBub3cgZW1pdCB1cHRvIHggYnl0ZXMgb2YgYnVmWzFdIHRvIG91dHB1dCAqLwotICAgICAgIGZvciAoeSA9IDA7IHkgPCB4ICYmIGxlZnQgIT0gMDsgKyt5KSB7Ci0gICAgICAgICAgIG91dFtzdG9yZWQrK10gPSBidWZbMV1beV07Ci0gICAgICAgICAgIC0tbGVmdDsKLSAgICAgICB9Ci0gICB9Ci0gICAqb3V0bGVuID0gc3RvcmVkOwotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0jZW5kaWYKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3BtYWNfZmlsZS5jIGIvcG1hY19maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NjRhMDkuLjAwMDAwMDAKLS0tIGEvcG1hY19maWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogUE1BQyBpbXBsZW1lbnRhdGlvbiBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBQTUFDCi0KLWludCBwbWFjX2ZpbGUoaW50IGNpcGhlciwgCi0gICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0jaWZkZWYgTk9fRklMRQotICAgcmV0dXJuIENSWVBUX05PUDsKLSNlbHNlCi0gICBpbnQgZXJyLCB4OwotICAgcG1hY19zdGF0ZSBwbWFjOwotICAgRklMRSAqaW47Ci0gICB1bnNpZ25lZCBjaGFyIGJ1Zls1MTJdOwotCi0KLSAgIF9BUkdDSEsoa2V5ICAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGZpbGVuYW1lICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICAgIT0gTlVMTCk7Ci0KLSAgIGluID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwotICAgaWYgKGluID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBDUllQVF9GSUxFX05PVEZPVU5EOwotICAgfQotCi0gICBpZiAoKGVyciA9IHBtYWNfaW5pdCgmcG1hYywgY2lwaGVyLCBrZXksIGtleWxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICBmY2xvc2UoaW4pOwotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgZG8gewotICAgICAgeCA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGluKTsKLSAgICAgIGlmICgoZXJyID0gcG1hY19wcm9jZXNzKCZwbWFjLCBidWYsIHgpKSAhPSBDUllQVF9PSykgewotICAgICAgICAgZmNsb3NlKGluKTsKLSAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICB9Ci0gICB9IHdoaWxlICh4ID09IHNpemVvZihidWYpKTsKLSAgIGZjbG9zZShpbik7Ci0KLSAgIGlmICgoZXJyID0gcG1hY19kb25lKCZwbWFjLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0jZW5kaWYKLQotICAgcmV0dXJuIENSWVBUX09LOwotI2VuZGlmCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvcG1hY19tZW1vcnkuYyBiL3BtYWNfbWVtb3J5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzlkNzEuLjAwMDAwMDAKLS0tIGEvcG1hY19tZW1vcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotCi0vKiBQTUFDIGltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIFBNQUMKLQotaW50IHBtYWNfbWVtb3J5KGludCBjaXBoZXIsIAotICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sCi0gICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbXNnLCB1bnNpZ25lZCBsb25nIG1zZ2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKLXsKLSAgIGludCBlcnI7Ci0gICBwbWFjX3N0YXRlIHBtYWM7Ci0KLSAgIF9BUkdDSEsoa2V5ICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhtc2cgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotCi0KLSAgIGlmICgoZXJyID0gcG1hY19pbml0KCZwbWFjLCBjaXBoZXIsIGtleSwga2V5bGVuKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICBpZiAoKGVyciA9IHBtYWNfcHJvY2VzcygmcG1hYywgbXNnLCBtc2dsZW4pKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIGlmICgoZXJyID0gcG1hY19kb25lKCZwbWFjLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvcG1hY19udHouYyBiL3BtYWNfbnR6LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZWM0MzAuLjAwMDAwMDAKLS0tIGEvcG1hY19udHouYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotCi0vKiBQTUFDIGltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIFBNQUMKLQotaW50IHBtYWNfbnR6KHVuc2lnbmVkIGxvbmcgeCkKLXsKLSAgIGludCBjOwotICAgeCAmPSAweEZGRkZGRkZGVUw7Ci0gICBjID0gMDsKLSAgIHdoaWxlICgoeCAmIDEpID09IDApIHsKLSAgICAgICsrYzsKLSAgICAgIHggPj49IDE7Ci0gICB9Ci0gICByZXR1cm4gYzsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9wbWFjX3Byb2Nlc3MuYyBiL3BtYWNfcHJvY2Vzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJjM2ZlLi4wMDAwMDAwCi0tLSBhL3BtYWNfcHJvY2Vzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLS8qIFBNQUMgaW1wbGVtZW50YXRpb24gYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgUE1BQwotCi1pbnQgcG1hY19wcm9jZXNzKHBtYWNfc3RhdGUgKnN0YXRlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQotewotICAgaW50IGVyciwgbiwgeDsKLSAgIHVuc2lnbmVkIGNoYXIgWltNQVhCTE9DS1NJWkVdOwotCi0gICBfQVJHQ0hLKHN0YXRlICE9IE5VTEwpOwotICAgX0FSR0NISyhidWYgICAhPSBOVUxMKTsKLSAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKHN0YXRlLT5jaXBoZXJfaWR4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIGlmICgoc3RhdGUtPmJ1ZmxlbiA+IChpbnQpc2l6ZW9mKHN0YXRlLT5ibG9jaykpIHx8IChzdGF0ZS0+YnVmbGVuIDwgMCkgfHwKLSAgICAgICAoc3RhdGUtPmJsb2NrX2xlbiA+IChpbnQpc2l6ZW9mKHN0YXRlLT5ibG9jaykpIHx8IChzdGF0ZS0+YnVmbGVuID4gc3RhdGUtPmJsb2NrX2xlbikpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKLSAgIH0KLQotICAgd2hpbGUgKGxlbiAhPSAwKSB7IAotICAgICAgIC8qIG9rIGlmIHRoZSBibG9jayBpcyBmdWxsIHdlIHhvciBpbiBwcmV2LCBlbmNyeXB0IGFuZCByZXBsYWNlIHByZXYgKi8KLSAgICAgICBpZiAoc3RhdGUtPmJ1ZmxlbiA9PSBzdGF0ZS0+YmxvY2tfbGVuKSB7Ci0gICAgICAgICAgcG1hY19zaGlmdF94b3Ioc3RhdGUpOwotICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzdGF0ZS0+YmxvY2tfbGVuOyB4KyspIHsKLSAgICAgICAgICAgICAgWlt4XSA9IHN0YXRlLT5MaVt4XSBeIHN0YXRlLT5ibG9ja1t4XTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3Jbc3RhdGUtPmNpcGhlcl9pZHhdLmVjYl9lbmNyeXB0KFosIFosICZzdGF0ZS0+a2V5KTsKLSAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3RhdGUtPmJsb2NrX2xlbjsgeCsrKSB7Ci0gICAgICAgICAgICAgIHN0YXRlLT5jaGVja3N1bVt4XSBePSBaW3hdOwotICAgICAgICAgIH0KLSAgICAgICAgICBzdGF0ZS0+YnVmbGVuID0gMDsKLSAgICAgICB9Ci0KLSAgICAgICAvKiBhZGQgYnl0ZXMgKi8KLSAgICAgICBuID0gTUlOKGxlbiwgKHVuc2lnbmVkIGxvbmcpKHN0YXRlLT5ibG9ja19sZW4gLSBzdGF0ZS0+YnVmbGVuKSk7Ci0gICAgICAgbWVtY3B5KHN0YXRlLT5ibG9jayArIHN0YXRlLT5idWZsZW4sIGJ1Ziwgbik7Ci0gICAgICAgc3RhdGUtPmJ1ZmxlbiArPSBuOwotICAgICAgIGxlbiAgICAgICAgICAgLT0gbjsKLSAgICAgICBidWYgICAgICAgICAgICs9IG47Ci0gICB9Ci0KLSNpZmRlZiBDTEVBTl9TVEFDSwotICAgemVyb21lbShaLCBzaXplb2YoWikpOwotI2VuZGlmCi0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9wbWFjX3NoaWZ0X3hvci5jIGIvcG1hY19zaGlmdF94b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxNTlmYi4uMDAwMDAwMAotLS0gYS9wbWFjX3NoaWZ0X3hvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLS8qIFBNQUMgaW1wbGVtZW50YXRpb24gYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgUE1BQwotCi12b2lkIHBtYWNfc2hpZnRfeG9yKHBtYWNfc3RhdGUgKnBtYWMpCi17Ci0gICBpbnQgeCwgeTsKLSAgIHkgPSBwbWFjX250eihwbWFjLT5ibG9ja19pbmRleCsrKTsKLSAgIGZvciAoeCA9IDA7IHggPCBwbWFjLT5ibG9ja19sZW47IHgrKykgewotICAgICAgIHBtYWMtPkxpW3hdIF49IHBtYWMtPkxzW3ldW3hdOwotICAgfQotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3JjNC5jIGIvcmM0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMmY2YjcuLjAwMDAwMDAKLS0tIGEvcmM0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgUkM0Ci0KLWNvbnN0IHN0cnVjdCBfcHJuZ19kZXNjcmlwdG9yIHJjNF9kZXNjID0gCi17Ci0gICAicmM0IiwKLSAgICAmcmM0X3N0YXJ0LAotICAgICZyYzRfYWRkX2VudHJvcHksCi0gICAgJnJjNF9yZWFkeSwKLSAgICAmcmM0X3JlYWQKLX07Ci0KLWludCByYzRfc3RhcnQocHJuZ19zdGF0ZSAqcHJuZykKLXsKLSAgICBfQVJHQ0hLKHBybmcgIT0gTlVMTCk7Ci0KLSAgICAvKiBzZXQga2V5c2l6ZSB0byB6ZXJvICovCi0gICAgcHJuZy0+cmM0LnggPSAwOwotICAgIAotICAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IHJjNF9hZGRfZW50cm9weShjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBwcm5nX3N0YXRlICpwcm5nKQotewotICAgIF9BUkdDSEsoYnVmICE9IE5VTEwpOwotICAgIF9BUkdDSEsocHJuZyAhPSBOVUxMKTsKLQotICAgIGlmIChwcm5nLT5yYzQueCArIGxlbiA+IDI1NikgewotICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0tFWVNJWkU7Ci0gICAgfQotCi0gICAgd2hpbGUgKGxlbi0tKSB7Ci0gICAgICAgcHJuZy0+cmM0LmJ1Zltwcm5nLT5yYzQueCsrXSA9ICpidWYrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gQ1JZUFRfT0s7Ci0gICAgCi19Ci0KLWludCByYzRfcmVhZHkocHJuZ19zdGF0ZSAqcHJuZykKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGtleVsyNTZdLCB0bXA7Ci0gICAgaW50IGtleWxlbiwgeCwgeTsKLQotICAgIF9BUkdDSEsocHJuZyAhPSBOVUxMKTsKLQotICAgIC8qIGV4dHJhY3QgdGhlIGtleSAqLwotICAgIG1lbWNweShrZXksIHBybmctPnJjNC5idWYsIDI1Nik7Ci0gICAga2V5bGVuID0gcHJuZy0+cmM0Lng7Ci0KLSAgICAvKiBtYWtlIFJDNCBwZXJtIGFuZCBzaHVmZmxlICovCi0gICAgZm9yICh4ID0gMDsgeCA8IDI1NjsgeCsrKSB7Ci0gICAgICAgIHBybmctPnJjNC5idWZbeF0gPSB4OwotICAgIH0KLQotICAgIGZvciAoeCA9IHkgPSAwOyB4IDwgMjU2OyB4KyspIHsKLSAgICAgICAgeSA9ICh5ICsgcHJuZy0+cmM0LmJ1Zlt4XSArIGtleVt4ICUga2V5bGVuXSkgJiAyNTU7Ci0gICAgICAgIHRtcCA9IHBybmctPnJjNC5idWZbeF07IHBybmctPnJjNC5idWZbeF0gPSBwcm5nLT5yYzQuYnVmW3ldOyBwcm5nLT5yYzQuYnVmW3ldID0gdG1wOwotICAgIH0KLSAgICBwcm5nLT5yYzQueCA9IHg7Ci0gICAgcHJuZy0+cmM0LnkgPSB5OwotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgICB6ZXJvbWVtKGtleSwgc2l6ZW9mKGtleSkpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgcmM0X3JlYWQodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgcHJuZ19zdGF0ZSAqcHJuZykKLXsKLSAgIGludCB4LCB5OyAKLSAgIHVuc2lnbmVkIGNoYXIgKnMsIHRtcDsKLSAgIHVuc2lnbmVkIGxvbmcgbjsKLQotICAgX0FSR0NISyhidWYgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHBybmcgIT0gTlVMTCk7Ci0KLSAgIG4gPSBsZW47Ci0gICB4ID0gcHJuZy0+cmM0Lng7Ci0gICB5ID0gcHJuZy0+cmM0Lnk7Ci0gICBzID0gcHJuZy0+cmM0LmJ1ZjsKLSAgIHdoaWxlIChsZW4tLSkgewotICAgICAgeCA9ICh4ICsgMSkgJiAyNTU7Ci0gICAgICB5ID0gKHkgKyBzW3hdKSAmIDI1NTsKLSAgICAgIHRtcCA9IHNbeF07IHNbeF0gPSBzW3ldOyBzW3ldID0gdG1wOwotICAgICAgdG1wID0gKHNbeF0gKyBzW3ldKSAmIDI1NTsKLSAgICAgICpidWYrKyBePSBzW3RtcF07Ci0gICB9Ci0gICBwcm5nLT5yYzQueCA9IHg7Ci0gICBwcm5nLT5yYzQueSA9IHk7Ci0gICByZXR1cm4gbjsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3JzYS5jIGIvcnNhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTkwZmQuLjAwMDAwMDAKLS0tIGEvcnNhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLS8qIFJTQSBDb2RlIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE1SU0EKLQotaW50IHJzYV9zaWducGFkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKLXsKLSAgIHVuc2lnbmVkIGxvbmcgeCwgeTsKLQotICAgX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotCi0gICBpZiAoKm91dGxlbiA8ICgzICogaW5sZW4pKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgfQotCi0gICAvKiBjaGVjayBpbmxlbiAqLwotICAgaWYgKGlubGVuID4gTUFYX1JTQV9TSVpFLzgpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19JTlZBTElEX1NJWkU7Ci0gICB9Ci0KLSAgIGZvciAoeSA9IHggPSAwOyB4IDwgaW5sZW47IHgrKykKLSAgICAgICBvdXRbeSsrXSA9ICh1bnNpZ25lZCBjaGFyKTB4RkY7Ci0gICBmb3IgKHggPSAwOyB4IDwgaW5sZW47IHgrKykKLSAgICAgICBvdXRbeSsrXSA9IGluW3hdOwotICAgZm9yICh4ID0gMDsgeCA8IGlubGVuOyB4KyspCi0gICAgICAgb3V0W3krK10gPSAodW5zaWduZWQgY2hhcikweEZGOwotICAgKm91dGxlbiA9IDMgKiBpbmxlbjsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IHJzYV9wYWQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgICBpbnQgd3BybmcsIHBybmdfc3RhdGUgKnBybmcpCi17Ci0gICB1bnNpZ25lZCBjaGFyIGJ1ZlszKihNQVhfUlNBX1NJWkUvOCldOwotICAgdW5zaWduZWQgbG9uZyB4OwotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotCi0gICAvKiBpcyBvdXRwdXQgYmlnIGVub3VnaD8gKi8KLSAgIGlmICgqb3V0bGVuIDwgKDMgKiBpbmxlbikpIHsKLSAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gICB9Ci0KLSAgIC8qIGdldCByYW5kb20gcGFkZGluZyByZXF1aXJlZCAqLwotICAgaWYgKChlcnIgPSBwcm5nX2lzX3ZhbGlkKHdwcm5nKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIGNoZWNrIGlubGVuICovCi0gICBpZiAoaW5sZW4gPiAoTUFYX1JTQV9TSVpFLzgpKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfUEtfSU5WQUxJRF9TSVpFOwotICAgfQotCi0gICBpZiAocHJuZ19kZXNjcmlwdG9yW3dwcm5nXS5yZWFkKGJ1ZiwgaW5sZW4qMi0yLCBwcm5nKSAhPSAoaW5sZW4qMiAtIDIpKSAgewotICAgICAgIHJldHVybiBDUllQVF9FUlJPUl9SRUFEUFJORzsKLSAgIH0KLQotICAgLyogcGFkIGl0IGxpa2UgYSBzYW5kd2hpY2gKLSAgICAqCi0gICAgKiBMb29rcyBsaWtlIDB4RkYgUjEgTSBSMiAweEZGCi0gICAgKgotICAgICogV2hlcmUgUjEvUjIgYXJlIHJhbmRvbSBhbmQgZXhhY3RseSBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIE0gbWludXMgb25lIGJ5dGUuCi0gICAgKi8KLSAgIGZvciAoeCA9IDA7IHggPCBpbmxlbi0xOyB4KyspIHsKLSAgICAgICBvdXRbeCsxXSA9IGJ1Zlt4XTsKLSAgIH0KLQotICAgZm9yICh4ID0gMDsgeCA8IGlubGVuOyB4KyspIHsKLSAgICAgICBvdXRbeCtpbmxlbl0gPSBpblt4XTsKLSAgIH0KLQotICAgZm9yICh4ID0gMDsgeCA8IGlubGVuLTE7IHgrKykgewotICAgICAgIG91dFt4K2lubGVuK2lubGVuXSA9IGJ1Zlt4K2lubGVuLTFdOwotICAgfQotCi0gICAvKiBsYXN0IGFuZCBmaXJzdCBieXRlcyBhcmUgMHhGRiAqLwotICAgb3V0WzBdID0gb3V0W2lubGVuK2lubGVuK2lubGVuLTFdID0gKHVuc2lnbmVkIGNoYXIpMHhGRjsKLQotICAgLyogY2xlYXIgdXAgYW5kIHJldHVybiAqLwotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotI2VuZGlmCi0gICAqb3V0bGVuID0gaW5sZW4qMzsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IHJzYV9zaWduZGVwYWQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCi17Ci0gICB1bnNpZ25lZCBsb25nIHg7Ci0KLSAgIF9BUkdDSEsoaW4gICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLQotICAgaWYgKCpvdXRsZW4gPCBpbmxlbi8zKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgfQotCi0gICAvKiBjaGVjayBwYWRkaW5nIGJ5dGVzICovCi0gICBmb3IgKHggPSAwOyB4IDwgaW5sZW4vMzsgeCsrKSB7Ci0gICAgICAgaWYgKGluW3hdICE9ICh1bnNpZ25lZCBjaGFyKTB4RkYgfHwgaW5beCsoaW5sZW4vMykrKGlubGVuLzMpXSAhPSAodW5zaWduZWQgY2hhcikweEZGKSB7Ci0gICAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgICAgIH0KLSAgIH0KLSAgIGZvciAoeCA9IDA7IHggPCBpbmxlbi8zOyB4KyspIHsKLSAgICAgICBvdXRbeF0gPSBpblt4Kyhpbmxlbi8zKV07Ci0gICB9Ci0gICAqb3V0bGVuID0gaW5sZW4vMzsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IHJzYV9kZXBhZChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQotewotICAgdW5zaWduZWQgbG9uZyB4OwotCi0gICBfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0ICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7Ci0KLSAgIGlmICgqb3V0bGVuIDwgaW5sZW4vMykgewotICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgIH0KLSAgIGZvciAoeCA9IDA7IHggPCBpbmxlbi8zOyB4KyspIHsKLSAgICAgICBvdXRbeF0gPSBpblt4Kyhpbmxlbi8zKV07Ci0gICB9Ci0gICAqb3V0bGVuID0gaW5sZW4vMzsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IHJzYV9leHBvcnQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIGludCB0eXBlLCByc2Ffa2V5ICprZXkpCi17Ci0gICB1bnNpZ25lZCBsb25nIHksIHo7IAotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAgICE9IE5VTEwpOwotICAgCi0gICAvKiBjYW4gd2Ugc3RvcmUgdGhlIHN0YXRpYyBoZWFkZXI/ICAqLwotICAgaWYgKCpvdXRsZW4gPCAoUEFDS0VUX1NJWkUgKyAxKSkgewotICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgIH0gICAKLQotICAgLyogdHlwZSB2YWxpZD8gKi8KLSAgIGlmICghKGtleS0+dHlwZSA9PSBQS19QUklWQVRFIHx8IGtleS0+dHlwZSA9PSBQS19QUklWQVRFX09QVElNSVpFRCkgJiYKLSAgICAgICAgKHR5cGUgPT0gUEtfUFJJVkFURSB8fCB0eXBlID09IFBLX1BSSVZBVEVfT1BUSU1JWkVEKSkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX0lOVkFMSURfVFlQRTsKLSAgIH0KLQotICAgLyogc3RhcnQgYXQgb2Zmc2V0IHk9UEFDS0VUX1NJWkUgKi8KLSAgIHkgPSBQQUNLRVRfU0laRTsKLQotICAgLyogb3V0cHV0IGtleSB0eXBlICovCi0gICBvdXRbeSsrXSA9IHR5cGU7Ci0KLSAgIC8qIG91dHB1dCBtb2R1bHVzICovCi0gICBPVVRQVVRfQklHTlVNKCZrZXktPk4sIG91dCwgeSwgeik7Ci0KLSAgIC8qIG91dHB1dCBwdWJsaWMga2V5ICovCi0gICBPVVRQVVRfQklHTlVNKCZrZXktPmUsIG91dCwgeSwgeik7Ci0KLSAgIGlmICh0eXBlID09IFBLX1BSSVZBVEUgfHwgdHlwZSA9PSBQS19QUklWQVRFX09QVElNSVpFRCkgewotICAgICAgT1VUUFVUX0JJR05VTSgma2V5LT5kLCBvdXQsIHksIHopOwotICAgfQotCi0gICBpZiAodHlwZSA9PSBQS19QUklWQVRFX09QVElNSVpFRCkgewotICAgICAgT1VUUFVUX0JJR05VTSgma2V5LT5kUSwgb3V0LCB5LCB6KTsKLSAgICAgIE9VVFBVVF9CSUdOVU0oJmtleS0+ZFAsIG91dCwgeSwgeik7Ci0gICAgICBPVVRQVVRfQklHTlVNKCZrZXktPnBRLCBvdXQsIHksIHopOwotICAgICAgT1VUUFVUX0JJR05VTSgma2V5LT5xUCwgb3V0LCB5LCB6KTsKLSAgICAgIE9VVFBVVF9CSUdOVU0oJmtleS0+cCwgb3V0LCB5LCB6KTsKLSAgICAgIE9VVFBVVF9CSUdOVU0oJmtleS0+cSwgb3V0LCB5LCB6KTsKLSAgIH0KLQotICAgLyogc3RvcmUgcGFja2V0IGhlYWRlciAqLwotICAgcGFja2V0X3N0b3JlX2hlYWRlcihvdXQsIFBBQ0tFVF9TRUNUX1JTQSwgUEFDS0VUX1NVQl9LRVkpOwotCi0gICAvKiBjb3B5IHRvIHRoZSB1c2VyIGJ1ZmZlciAqLwotICAgKm91dGxlbiA9IHk7Ci0KLSAgIC8qIGNsZWFyIHN0YWNrIGFuZCByZXR1cm4gKi8KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IHJzYV9pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHJzYV9rZXkgKmtleSkKLXsKLSAgIHVuc2lnbmVkIGxvbmcgeCwgeTsKLSAgIGludCBlcnI7Ci0KLSAgIF9BUkdDSEsoaW4gICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0KLSAgIC8qIGNoZWNrIGxlbmd0aCAqLwotICAgaWYgKGlubGVuIDwgKDErUEFDS0VUX1NJWkUpKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7Ci0gICB9Ci0KLSAgIC8qIHRlc3QgcGFja2V0IGhlYWRlciAqLwotICAgaWYgKChlcnIgPSBwYWNrZXRfdmFsaWRfaGVhZGVyKCh1bnNpZ25lZCBjaGFyICopaW4sIFBBQ0tFVF9TRUNUX1JTQSwgUEFDS0VUX1NVQl9LRVkpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogaW5pdCBrZXkgKi8KLSAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgma2V5LT5lLCAma2V5LT5kLCAma2V5LT5OLCAma2V5LT5kUSwgJmtleS0+ZFAsICZrZXktPnFQLAotICAgICAgICAgICAgICAgICAgICAgJmtleS0+cFEsICZrZXktPnAsICZrZXktPnEsIE5VTEwpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotICAgfQotCi0gICAvKiBnZXQga2V5IHR5cGUgKi8KLSAgIHkgPSBQQUNLRVRfU0laRTsKLSAgIGtleS0+dHlwZSA9IChpbnQpaW5beSsrXTsKLQotICAgLyogbG9hZCB0aGUgbW9kdWx1cyAgKi8KLSAgIElOUFVUX0JJR05VTSgma2V5LT5OLCBpbiwgeCwgeSwgaW5sZW4pOwotCi0gICAvKiBsb2FkIHB1YmxpYyBleHBvbmVudCAqLwotICAgSU5QVVRfQklHTlVNKCZrZXktPmUsIGluLCB4LCB5LCBpbmxlbik7Ci0KLSAgIC8qIGdldCBwcml2YXRlIGV4cG9uZW50ICovCi0gICBpZiAoa2V5LT50eXBlID09IFBLX1BSSVZBVEUgfHwga2V5LT50eXBlID09IFBLX1BSSVZBVEVfT1BUSU1JWkVEKSB7Ci0gICAgICBJTlBVVF9CSUdOVU0oJmtleS0+ZCwgaW4sIHgsIHksIGlubGVuKTsKLSAgIH0KLQotICAgLyogZ2V0IENSVCBwcml2YXRlIGRhdGEgaWYgcmVxdWlyZWQgKi8KLSAgIGlmIChrZXktPnR5cGUgPT0gUEtfUFJJVkFURV9PUFRJTUlaRUQpIHsKLSAgICAgIElOUFVUX0JJR05VTSgma2V5LT5kUSwgaW4sIHgsIHksIGlubGVuKTsKLSAgICAgIElOUFVUX0JJR05VTSgma2V5LT5kUCwgaW4sIHgsIHksIGlubGVuKTsKLSAgICAgIElOUFVUX0JJR05VTSgma2V5LT5wUSwgaW4sIHgsIHksIGlubGVuKTsKLSAgICAgIElOUFVUX0JJR05VTSgma2V5LT5xUCwgaW4sIHgsIHksIGlubGVuKTsKLSAgICAgIElOUFVUX0JJR05VTSgma2V5LT5wLCBpbiwgeCwgeSwgaW5sZW4pOwotICAgICAgSU5QVVRfQklHTlVNKCZrZXktPnEsIGluLCB4LCB5LCBpbmxlbik7Ci0gICB9Ci0KLSAgIC8qIGZyZWUgdXAgcmFtIG5vdCByZXF1aXJlZCAqLwotICAgaWYgKGtleS0+dHlwZSAhPSBQS19QUklWQVRFX09QVElNSVpFRCkgewotICAgICAgbXBfY2xlYXJfbXVsdGkoJmtleS0+ZFEsICZrZXktPmRQLCAma2V5LT5wUSwgJmtleS0+cVAsICZrZXktPnAsICZrZXktPnEsIE5VTEwpOwotICAgfQotICAgaWYgKGtleS0+dHlwZSAhPSBQS19QUklWQVRFICYmIGtleS0+dHlwZSAhPSBQS19QUklWQVRFX09QVElNSVpFRCkgewotICAgICAgbXBfY2xlYXIoJmtleS0+ZCk7Ci0gICB9Ci0KLSAgIHJldHVybiBDUllQVF9PSzsKLWVycm9yOgotICAgbXBfY2xlYXJfbXVsdGkoJmtleS0+ZCwgJmtleS0+ZSwgJmtleS0+TiwgJmtleS0+ZFEsICZrZXktPmRQLAotICAgICAgICAgICAgICAgICAgJmtleS0+cFEsICZrZXktPnFQLCAma2V5LT5wLCAma2V5LT5xLCBOVUxMKTsKLSAgIHJldHVybiBlcnI7Ci19Ci0KLSNpbmNsdWRlICJyc2Ffc3lzLmMiCi0KLSNlbmRpZiAvKiBSU0EgKi8KLQotCmRpZmYgLS1naXQgYS9yc2FfZGVjcnlwdF9rZXkuYyBiL3JzYV9kZWNyeXB0X2tleS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDYzZDQ2Li4wMDAwMDAwCi0tLSBhL3JzYV9kZWNyeXB0X2tleS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBNUlNBCi0KLS8qIGRlY3J5cHQgdGhlbiBPQUVQIGRlcGFkICAqLwotaW50IHJzYV9kZWNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICAgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dGtleSwgdW5zaWduZWQgbG9uZyAqa2V5bGVuLCAKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbHBhcmFtLCB1bnNpZ25lZCBsb25nIGxwYXJhbWxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAgICAqcHJuZywgICBpbnQgICAgICAgICAgIHBybmdfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBoYXNoX2lkeCwgaW50ICpyZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJzYV9rZXkgICAgICAgKmtleSkKLXsKLSAgdW5zaWduZWQgbG9uZyBtb2R1bHVzX2JpdGxlbiwgbW9kdWx1c19ieXRlbGVuLCB4OwotICBpbnQgICAgICAgICAgIGVycjsKLSAgCi0gIF9BUkdDSEsob3V0a2V5ICE9IE5VTEwpOwotICBfQVJHQ0hLKGtleWxlbiAhPSBOVUxMKTsKLSAgX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7Ci0gIF9BUkdDSEsocmVzICAgICE9IE5VTEwpOwotICAKLSAgLyogdmFsaWQgaGFzaCA/ICovCi0gIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoX2lkeCkpICE9IENSWVBUX09LKSB7Ci0gICAgIHJldHVybiBlcnI7Ci0gIH0KLSAgCi0gIC8qIGdldCBtb2R1bHVzIGxlbiBpbiBiaXRzICovCi0gIG1vZHVsdXNfYml0bGVuID0gbXBfY291bnRfYml0cygmKGtleS0+TikpOwotCi0gIC8qIG91dGxlbiBtdXN0IGJlIGF0IGxlYXN0IHRoZSBzaXplIG9mIHRoZSBtb2R1bHVzICovCi0gIG1vZHVsdXNfYnl0ZWxlbiA9IG1wX3Vuc2lnbmVkX2Jpbl9zaXplKCYoa2V5LT5OKSk7Ci0gIGlmIChtb2R1bHVzX2J5dGVsZW4gIT0gaW5sZW4pIHsKLSAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICB9Ci0KLSAgLyogcnNhIGRlY29kZSB0aGUgcGFja2V0ICovCi0gIHggPSAqa2V5bGVuOwotICBpZiAoKGVyciA9IHJzYV9leHB0bW9kKGluLCBpbmxlbiwgb3V0a2V5LCAmeCwgUEtfUFJJVkFURSwgcHJuZywgcHJuZ19pZHgsIGtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgIHJldHVybiBlcnI7Ci0gIH0KLQotICAvKiBub3cgT0FFUCBkZWNvZGUgdGhlIHBhY2tldCAqLwotICByZXR1cm4gcGtjc18xX29hZXBfZGVjb2RlKG91dGtleSwgeCwgbHBhcmFtLCBscGFyYW1sZW4sIG1vZHVsdXNfYml0bGVuLCBoYXNoX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRrZXksIGtleWxlbiwgcmVzKTsKLX0KLQotI2VuZGlmIC8qIE1SU0EgKi8KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcnNhX2VuY3J5cHRfa2V5LmMgYi9yc2FfZW5jcnlwdF9rZXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MDc2Yi4uMDAwMDAwMAotLS0gYS9yc2FfZW5jcnlwdF9rZXkuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgTVJTQQotCi0vKiBPQUVQIHBhZCB0aGVuIGVuY3J5cHQgKi8KLWludCByc2FfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW5rZXksICB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXRrZXksIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbHBhcmFtLCB1bnNpZ25lZCBsb25nIGxwYXJhbWxlbiwKLSAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAqcHJuZywgaW50IHBybmdfaWR4LCBpbnQgaGFzaF9pZHgsIHJzYV9rZXkgKmtleSkKLXsKLSAgdW5zaWduZWQgbG9uZyBtb2R1bHVzX2JpdGxlbiwgbW9kdWx1c19ieXRlbGVuLCB4OwotICBpbnQgICAgICAgICAgIGVycjsKLSAgCi0gIF9BUkdDSEsoaW5rZXkgICE9IE5VTEwpOwotICBfQVJHQ0hLKG91dGtleSAhPSBOVUxMKTsKLSAgX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7Ci0gIF9BUkdDSEsoa2V5ICAgICE9IE5VTEwpOwotICAKLSAgLyogdmFsaWQgcHJuZyBhbmQgaGFzaCA/ICovCi0gIGlmICgoZXJyID0gcHJuZ19pc192YWxpZChwcm5nX2lkeCkpICE9IENSWVBUX09LKSB7Ci0gICAgIHJldHVybiBlcnI7Ci0gIH0KLSAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGhhc2hfaWR4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgcmV0dXJuIGVycjsKLSAgfQotICAKLSAgLyogZ2V0IG1vZHVsdXMgbGVuIGluIGJpdHMgKi8KLSAgbW9kdWx1c19iaXRsZW4gPSBtcF9jb3VudF9iaXRzKCYoa2V5LT5OKSk7Ci0KLSAgLyogb3V0bGVuIG11c3QgYmUgYXQgbGVhc3QgdGhlIHNpemUgb2YgdGhlIG1vZHVsdXMgKi8KLSAgbW9kdWx1c19ieXRlbGVuID0gbXBfdW5zaWduZWRfYmluX3NpemUoJihrZXktPk4pKTsKLSAgaWYgKG1vZHVsdXNfYnl0ZWxlbiA+ICpvdXRsZW4pIHsKLSAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgfQotICAgICAgCi0gIC8qIE9BRVAgcGFkIHRoZSBrZXkgKi8KLSAgeCA9ICpvdXRsZW47Ci0gIGlmICgoZXJyID0gcGtjc18xX29hZXBfZW5jb2RlKGlua2V5LCBpbmxlbiwgbHBhcmFtLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBhcmFtbGVuLCBtb2R1bHVzX2JpdGxlbiwgcHJuZywgcHJuZ19pZHgsIGhhc2hfaWR4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0a2V5LCAmeCkpICE9IENSWVBUX09LKSB7Ci0gICAgIHJldHVybiBlcnI7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIC8qIHJzYSBleHB0bW9kIHRoZSBPQUVQIHBhZCAqLwotICByZXR1cm4gcnNhX2V4cHRtb2Qob3V0a2V5LCB4LCBvdXRrZXksIG91dGxlbiwgUEtfUFVCTElDLCBwcm5nLCBwcm5nX2lkeCwga2V5KTsKLX0KLQotI2VuZGlmIC8qIE1SU0EgKi8KZGlmZiAtLWdpdCBhL3JzYV9leHBvcnQuYyBiL3JzYV9leHBvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkZDI2ZC4uMDAwMDAwMAotLS0gYS9yc2FfZXhwb3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE1SU0EKLQotaW50IHJzYV9leHBvcnQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIGludCB0eXBlLCByc2Ffa2V5ICprZXkpCi17Ci0gICB1bnNpZ25lZCBsb25nIHksIHo7IAotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAgICE9IE5VTEwpOwotICAgCi0gICAvKiBjYW4gd2Ugc3RvcmUgdGhlIHN0YXRpYyBoZWFkZXI/ICAqLwotICAgaWYgKCpvdXRsZW4gPCAoUEFDS0VUX1NJWkUgKyAxKSkgewotICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgIH0gICAKLQotICAgLyogdHlwZSB2YWxpZD8gKi8KLSAgIGlmICghKGtleS0+dHlwZSA9PSBQS19QUklWQVRFIHx8IGtleS0+dHlwZSA9PSBQS19QUklWQVRFX09QVElNSVpFRCkgJiYKLSAgICAgICAgKHR5cGUgPT0gUEtfUFJJVkFURSB8fCB0eXBlID09IFBLX1BSSVZBVEVfT1BUSU1JWkVEKSkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX0lOVkFMSURfVFlQRTsKLSAgIH0KLQotICAgLyogc3RhcnQgYXQgb2Zmc2V0IHk9UEFDS0VUX1NJWkUgKi8KLSAgIHkgPSBQQUNLRVRfU0laRTsKLQotICAgLyogb3V0cHV0IGtleSB0eXBlICovCi0gICBvdXRbeSsrXSA9IHR5cGU7Ci0KLSAgIC8qIG91dHB1dCBtb2R1bHVzICovCi0gICBPVVRQVVRfQklHTlVNKCZrZXktPk4sIG91dCwgeSwgeik7Ci0KLSAgIC8qIG91dHB1dCBwdWJsaWMga2V5ICovCi0gICBPVVRQVVRfQklHTlVNKCZrZXktPmUsIG91dCwgeSwgeik7Ci0KLSAgIGlmICh0eXBlID09IFBLX1BSSVZBVEUgfHwgdHlwZSA9PSBQS19QUklWQVRFX09QVElNSVpFRCkgewotICAgICAgT1VUUFVUX0JJR05VTSgma2V5LT5kLCBvdXQsIHksIHopOwotICAgfQotCi0gICBpZiAodHlwZSA9PSBQS19QUklWQVRFX09QVElNSVpFRCkgewotICAgICAgT1VUUFVUX0JJR05VTSgma2V5LT5kUSwgb3V0LCB5LCB6KTsKLSAgICAgIE9VVFBVVF9CSUdOVU0oJmtleS0+ZFAsIG91dCwgeSwgeik7Ci0gICAgICBPVVRQVVRfQklHTlVNKCZrZXktPnBRLCBvdXQsIHksIHopOwotICAgICAgT1VUUFVUX0JJR05VTSgma2V5LT5xUCwgb3V0LCB5LCB6KTsKLSAgICAgIE9VVFBVVF9CSUdOVU0oJmtleS0+cCwgb3V0LCB5LCB6KTsKLSAgICAgIE9VVFBVVF9CSUdOVU0oJmtleS0+cSwgb3V0LCB5LCB6KTsKLSAgIH0KLQotICAgLyogc3RvcmUgcGFja2V0IGhlYWRlciAqLwotICAgcGFja2V0X3N0b3JlX2hlYWRlcihvdXQsIFBBQ0tFVF9TRUNUX1JTQSwgUEFDS0VUX1NVQl9LRVkpOwotCi0gICAvKiBjb3B5IHRvIHRoZSB1c2VyIGJ1ZmZlciAqLwotICAgKm91dGxlbiA9IHk7Ci0KLSAgIC8qIGNsZWFyIHN0YWNrIGFuZCByZXR1cm4gKi8KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotI2VuZGlmIC8qIE1SU0EgKi8KLQpkaWZmIC0tZ2l0IGEvcnNhX2V4cHRtb2QuYyBiL3JzYV9leHB0bW9kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjQ5ZDQuLjAwMDAwMDAKLS0tIGEvcnNhX2V4cHRtb2QuYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKLSAqCi0gKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKLSAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgotICoKLSAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCi0gKiBndWFyYW50ZWUgaXQgd29ya3MuCi0gKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKLSAqLwotCi0vKiBSU0EgQ29kZSBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBNUlNBCi0KLWludCByc2FfZXhwdG1vZChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICB1bnNpZ25lZCBsb25nIGlubGVuLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgaW50IHdoaWNoLAotICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgICAgKnBybmcsIGludCAgICAgICAgICAgcHJuZ19pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgcnNhX2tleSAqa2V5KQotewotICAgbXBfaW50ICAgICAgICB0bXAsIHRtcGEsIHRtcGI7Ci0gICB1bnNpZ25lZCBsb25nIHg7Ci0gICBpbnQgICAgICAgICAgIGVycjsKLQotICAgX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7Ci0gICAKLSAgIGlmICgoZXJyID0gcHJuZ19pc192YWxpZChwcm5nX2lkeCkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICBpZiAod2hpY2ggPT0gUEtfUFJJVkFURSAmJiAoa2V5LT50eXBlICE9IFBLX1BSSVZBVEUgJiYga2V5LT50eXBlICE9IFBLX1BSSVZBVEVfT1BUSU1JWkVEKSkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX05PVF9QUklWQVRFOwotICAgfQotCi0gICAvKiBtdXN0IGJlIGEgcHJpdmF0ZSBvciBwdWJsaWMgb3BlcmF0aW9uICovCi0gICBpZiAod2hpY2ggIT0gUEtfUFJJVkFURSAmJiB3aGljaCAhPSBQS19QVUJMSUMpIHsKLSAgICAgIHJldHVybiBDUllQVF9QS19JTlZBTElEX1RZUEU7Ci0gICB9Ci0KLSAgIC8qIGluaXQgYW5kIGNvcHkgaW50byB0bXAgKi8KLSAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgmdG1wLCAmdG1wYSwgJnRtcGIsIE5VTEwpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQotICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbigmdG1wLCAodW5zaWduZWQgY2hhciAqKWluLCAoaW50KWlubGVuKSkgIT0gTVBfT0tBWSkgeyBnb3RvIGVycm9yOyB9Ci0KLSAgIC8qIHNhbml0eSBjaGVjayBvbiB0aGUgaW5wdXQgKi8KLSAgIGlmIChtcF9jbXAoJmtleS0+TiwgJnRtcCkgPT0gTVBfTFQpIHsKLSAgICAgIGVyciA9IENSWVBUX1BLX0lOVkFMSURfU0laRTsKLSAgICAgIGdvdG8gZG9uZTsKLSAgIH0KLQotICAgLyogYXJlIHdlIHVzaW5nIHRoZSBwcml2YXRlIGV4cG9uZW50IGFuZCBpcyB0aGUga2V5IG9wdGltaXplZD8gKi8KLSAgIGlmICh3aGljaCA9PSBQS19QUklWQVRFICYmIGtleS0+dHlwZSA9PSBQS19QUklWQVRFX09QVElNSVpFRCkgewotICAgICAgLyogdG1wYSA9IHRtcF5kUCBtb2QgcCAqLwotICAgICAgaWYgKChlcnIgPSB0aW1fZXhwdG1vZChwcm5nLCBwcm5nX2lkeCwgJnRtcCwgJmtleS0+ZSwgJmtleS0+ZFAsICZrZXktPnAsICZ0bXBhKSkgIT0gTVBfT0tBWSkgICAgeyBnb3RvIGVycm9yOyB9Ci0KLSAgICAgIC8qIHRtcGIgPSB0bXBeZFEgbW9kIHEgKi8KLSAgICAgIGlmICgoZXJyID0gdGltX2V4cHRtb2QocHJuZywgcHJuZ19pZHgsICZ0bXAsICZrZXktPmUsICAma2V5LT5kUSwgJmtleS0+cSwgJnRtcGIpKSAhPSBNUF9PS0FZKSAgICB7IGdvdG8gZXJyb3I7IH0KLQotICAgICAgLyogdG1wID0gdG1wYSpxUCArIHRtcGIqcFEgbW9kIE4gKi8KLSAgICAgIGlmICgoZXJyID0gbXBfbXVsKCZ0bXBhLCAma2V5LT5xUCwgJnRtcGEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgICAgIGlmICgoZXJyID0gbXBfbXVsKCZ0bXBiLCAma2V5LT5wUSwgJnRtcGIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgICAgIGlmICgoZXJyID0gbXBfYWRkbW9kKCZ0bXBhLCAmdG1wYiwgJmtleS0+TiwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICB7IGdvdG8gZXJyb3I7IH0KLSAgIH0gZWxzZSB7Ci0gICAgICAvKiBleHB0bW9kIGl0ICovCi0gICAgICBpZiAod2hpY2ggPT0gUEtfUFJJVkFURSkgewotICAgICAgICAgaWYgKChlcnIgPSB0aW1fZXhwdG1vZChwcm5nLCBwcm5nX2lkeCwgJnRtcCwgJmtleS0+ZSwgJmtleS0+ZCwgJmtleS0+TiwgJnRtcCkpICE9IE1QX09LQVkpIHsgZ290byBlcnJvcjsgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIGlmICgoZXJyID0gbXBfZXhwdG1vZCgmdG1wLCAma2V5LT5lLCAma2V5LT5OLCAmdG1wKSkgIT0gTVBfT0tBWSkgeyBnb3RvIGVycm9yOyB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIC8qIHJlYWQgaXQgYmFjayAqLwotICAgeCA9ICh1bnNpZ25lZCBsb25nKW1wX3Vuc2lnbmVkX2Jpbl9zaXplKCZrZXktPk4pOwotICAgaWYgKHggPiAqb3V0bGVuKSB7Ci0gICAgICBlcnIgPSBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gICAgICBnb3RvIGRvbmU7Ci0gICB9Ci0gICAqb3V0bGVuID0geDsKLQotICAgLyogY29udmVydCBpdCAqLwotICAgemVyb21lbShvdXQsIHgpOwotICAgaWYgKChlcnIgPSBtcF90b191bnNpZ25lZF9iaW4oJnRtcCwgb3V0Kyh4LW1wX3Vuc2lnbmVkX2Jpbl9zaXplKCZ0bXApKSkpICE9IE1QX09LQVkpIHsgZ290byBlcnJvcjsgfQotCi0gICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCi0gICBlcnIgPSBDUllQVF9PSzsKLSAgIGdvdG8gZG9uZTsKLWVycm9yOgotICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotZG9uZToKLSAgIG1wX2NsZWFyX211bHRpKCZ0bXAsICZ0bXBhLCAmdG1wYiwgTlVMTCk7Ci0gICByZXR1cm4gZXJyOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3JzYV9mcmVlLmMgYi9yc2FfZnJlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTcyNDJiLi4wMDAwMDAwCi0tLSBhL3JzYV9mcmVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogUlNBIENvZGUgYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgotCi0jaWZkZWYgTVJTQQotCi12b2lkIHJzYV9mcmVlKHJzYV9rZXkgKmtleSkKLXsKLSAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOwotICAgbXBfY2xlYXJfbXVsdGkoJmtleS0+ZSwgJmtleS0+ZCwgJmtleS0+TiwgJmtleS0+ZFEsICZrZXktPmRQLAotICAgICAgICAgICAgICAgICAgJmtleS0+cVAsICZrZXktPnBRLCAma2V5LT5wLCAma2V5LT5xLCBOVUxMKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9yc2FfaW1wb3J0LmMgYi9yc2FfaW1wb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZmZjMzguLjAwMDAwMDAKLS0tIGEvcnNhX2ltcG9ydC5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBNUlNBCi0KLWludCByc2FfaW1wb3J0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCByc2Ffa2V5ICprZXkpCi17Ci0gICB1bnNpZ25lZCBsb25nIHgsIHk7Ci0gICBpbnQgZXJyOwotCi0gICBfQVJHQ0hLKGluICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOwotCi0gICAvKiBjaGVjayBsZW5ndGggKi8KLSAgIGlmIChpbmxlbiA8ICgxK1BBQ0tFVF9TSVpFKSkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgfQotCi0gICAvKiB0ZXN0IHBhY2tldCBoZWFkZXIgKi8KLSAgIGlmICgoZXJyID0gcGFja2V0X3ZhbGlkX2hlYWRlcigodW5zaWduZWQgY2hhciAqKWluLCBQQUNLRVRfU0VDVF9SU0EsIFBBQ0tFVF9TVUJfS0VZKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIGluaXQga2V5ICovCi0gICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJmtleS0+ZSwgJmtleS0+ZCwgJmtleS0+TiwgJmtleS0+ZFEsICZrZXktPmRQLCAma2V5LT5xUCwKLSAgICAgICAgICAgICAgICAgICAgICZrZXktPnBRLCAma2V5LT5wLCAma2V5LT5xLCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsKLSAgIH0KLQotICAgLyogZ2V0IGtleSB0eXBlICovCi0gICB5ID0gUEFDS0VUX1NJWkU7Ci0gICBrZXktPnR5cGUgPSAoaW50KWluW3krK107Ci0KLSAgIC8qIGxvYWQgdGhlIG1vZHVsdXMgICovCi0gICBJTlBVVF9CSUdOVU0oJmtleS0+TiwgaW4sIHgsIHksIGlubGVuKTsKLQotICAgLyogbG9hZCBwdWJsaWMgZXhwb25lbnQgKi8KLSAgIElOUFVUX0JJR05VTSgma2V5LT5lLCBpbiwgeCwgeSwgaW5sZW4pOwotCi0gICAvKiBnZXQgcHJpdmF0ZSBleHBvbmVudCAqLwotICAgaWYgKGtleS0+dHlwZSA9PSBQS19QUklWQVRFIHx8IGtleS0+dHlwZSA9PSBQS19QUklWQVRFX09QVElNSVpFRCkgewotICAgICAgSU5QVVRfQklHTlVNKCZrZXktPmQsIGluLCB4LCB5LCBpbmxlbik7Ci0gICB9Ci0KLSAgIC8qIGdldCBDUlQgcHJpdmF0ZSBkYXRhIGlmIHJlcXVpcmVkICovCi0gICBpZiAoa2V5LT50eXBlID09IFBLX1BSSVZBVEVfT1BUSU1JWkVEKSB7Ci0gICAgICBJTlBVVF9CSUdOVU0oJmtleS0+ZFEsIGluLCB4LCB5LCBpbmxlbik7Ci0gICAgICBJTlBVVF9CSUdOVU0oJmtleS0+ZFAsIGluLCB4LCB5LCBpbmxlbik7Ci0gICAgICBJTlBVVF9CSUdOVU0oJmtleS0+cFEsIGluLCB4LCB5LCBpbmxlbik7Ci0gICAgICBJTlBVVF9CSUdOVU0oJmtleS0+cVAsIGluLCB4LCB5LCBpbmxlbik7Ci0gICAgICBJTlBVVF9CSUdOVU0oJmtleS0+cCwgaW4sIHgsIHksIGlubGVuKTsKLSAgICAgIElOUFVUX0JJR05VTSgma2V5LT5xLCBpbiwgeCwgeSwgaW5sZW4pOwotICAgfQotCi0gICAvKiBmcmVlIHVwIHJhbSBub3QgcmVxdWlyZWQgKi8KLSAgIGlmIChrZXktPnR5cGUgIT0gUEtfUFJJVkFURV9PUFRJTUlaRUQpIHsKLSAgICAgIG1wX2NsZWFyX211bHRpKCZrZXktPmRRLCAma2V5LT5kUCwgJmtleS0+cFEsICZrZXktPnFQLCAma2V5LT5wLCAma2V5LT5xLCBOVUxMKTsKLSAgIH0KLSAgIGlmIChrZXktPnR5cGUgIT0gUEtfUFJJVkFURSAmJiBrZXktPnR5cGUgIT0gUEtfUFJJVkFURV9PUFRJTUlaRUQpIHsKLSAgICAgIG1wX2NsZWFyKCZrZXktPmQpOwotICAgfQotCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci1lcnJvcjoKLSAgIG1wX2NsZWFyX211bHRpKCZrZXktPmQsICZrZXktPmUsICZrZXktPk4sICZrZXktPmRRLCAma2V5LT5kUCwKLSAgICAgICAgICAgICAgICAgICZrZXktPnBRLCAma2V5LT5xUCwgJmtleS0+cCwgJmtleS0+cSwgTlVMTCk7Ci0gICByZXR1cm4gZXJyOwotfQotCi0jZW5kaWYgLyogTVJTQSAqLwotCmRpZmYgLS1naXQgYS9yc2Ffc2lnbl9oYXNoLmMgYi9yc2Ffc2lnbl9oYXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlY2FjNmMuLjAwMDAwMDAKLS0tIGEvcnNhX3NpZ25faGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBNUlNBCi0KLS8qIFBTUyBwYWQgdGhlbiBzaWduICovCi1pbnQgcnNhX3NpZ25faGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICptc2doYXNoLCAgdW5zaWduZWQgbG9uZyAgbXNnaGFzaGxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzaWcsICAgICAgdW5zaWduZWQgbG9uZyAqc2lnbGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgICAgKnBybmcsICAgICBpbnQgICAgICAgICAgICBwcm5nX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhhc2hfaWR4LCB1bnNpZ25lZCBsb25nICBzYWx0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgcnNhX2tleSAqa2V5KQotewotICAgdW5zaWduZWQgbG9uZyBtb2R1bHVzX2JpdGxlbiwgbW9kdWx1c19ieXRlbGVuLCB4OwotICAgaW50ICAgICAgICAgICBlcnI7Ci0gICAKLSAgX0FSR0NISyhtc2doYXNoICAhPSBOVUxMKTsKLSAgX0FSR0NISyhzaWcgICAgICAhPSBOVUxMKTsKLSAgX0FSR0NISyhzaWdsZW4gICAhPSBOVUxMKTsKLSAgX0FSR0NISyhrZXkgICAgICAhPSBOVUxMKTsKLSAgCi0gIC8qIHZhbGlkIHBybmcgYW5kIGhhc2ggPyAqLwotICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQocHJuZ19pZHgpKSAhPSBDUllQVF9PSykgewotICAgICByZXR1cm4gZXJyOwotICB9Ci0gIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoX2lkeCkpICE9IENSWVBUX09LKSB7Ci0gICAgIHJldHVybiBlcnI7Ci0gIH0KLSAgCi0gIC8qIGdldCBtb2R1bHVzIGxlbiBpbiBiaXRzICovCi0gIG1vZHVsdXNfYml0bGVuID0gbXBfY291bnRfYml0cygmKGtleS0+TikpOwotCi0gIC8qIG91dGxlbiBtdXN0IGJlIGF0IGxlYXN0IHRoZSBzaXplIG9mIHRoZSBtb2R1bHVzICovCi0gIG1vZHVsdXNfYnl0ZWxlbiA9IG1wX3Vuc2lnbmVkX2Jpbl9zaXplKCYoa2V5LT5OKSk7Ci0gIGlmIChtb2R1bHVzX2J5dGVsZW4gPiAqc2lnbGVuKSB7Ci0gICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gIH0KLSAgICAgIAotICAvKiBQU1MgcGFkIHRoZSBrZXkgKi8KLSAgeCA9ICpzaWdsZW47Ci0gIGlmICgoZXJyID0gcGtjc18xX3Bzc19lbmNvZGUobXNnaGFzaCwgbXNnaGFzaGxlbiwgc2FsdGxlbiwgcHJuZywgcHJuZ19pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9pZHgsIG1vZHVsdXNfYml0bGVuLCBzaWcsICZ4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgcmV0dXJuIGVycjsKLSAgfQotCi0gIC8qIFJTQSBlbmNvZGUgaXQgKi8KLSAgcmV0dXJuIHJzYV9leHB0bW9kKHNpZywgeCwgc2lnLCBzaWdsZW4sIFBLX1BSSVZBVEUsIHBybmcsIHBybmdfaWR4LCBrZXkpOwotfQotCi0jZW5kaWYgLyogTVJTQSAqLwpkaWZmIC0tZ2l0IGEvcnNhX3N5cy5jIGIvcnNhX3N5cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNhYTBhLi4wMDAwMDAwCi0tLSBhL3JzYV9zeXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogdGhlc2UgYXJlIHNtYWxsZXIgcm91dGluZXMgd3JpdHRlbiBieSBDbGF5IEN1bHZlci4gIFRoZXkgZG8gdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlIHJzYV9lbmNyeXB0L2RlY3J5cHQgCi0gKiBleGNlcHQgdGhhdCB0aGV5IGFyZSB1c2VkIHRvIFJTQSBlbmNyeXB0L2RlY3J5cHQgYSBzaW5nbGUgdmFsdWUgYW5kIG5vdCBhIHBhY2tldC4KLSAqLwotaW50IHJzYV9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbmtleSwgdW5zaWduZWQgbG9uZyBpbmxlbiwKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0a2V5LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sCi0gICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgcnNhX2tleSAqa2V5KQotewotICAgdW5zaWduZWQgY2hhciByc2FfaW5bUlNBX1NUQUNLXSwgcnNhX291dFtSU0FfU1RBQ0tdOwotICAgdW5zaWduZWQgbG9uZyB4LCB5LCByc2Ffc2l6ZTsKLSAgIGludCBlcnI7Ci0KLSAgIF9BUkdDSEsoaW5rZXkgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXRrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAgICE9IE5VTEwpOwotICAgCi0gICAvKiBvbmx5IGFsbG93IGtleXMgZnJvbSA2NCB0byAyNTYgYml0cyAqLwotICAgaWYgKGlubGVuIDwgOCB8fCBpbmxlbiA+IDMyKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9Ci0KLSAgIC8qIGFyZSB0aGUgcGFyYW1ldGVycyB2YWxpZD8gKi8KLSAgIGlmICgoZXJyID0gcHJuZ19pc192YWxpZCh3cHJuZykpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOyAKLSAgIH0KLQotICAgLyogcnNhX3BhZCB0aGUgc3ltbWV0cmljIGtleSAqLwotICAgeSA9ICh1bnNpZ25lZCBsb25nKXNpemVvZihyc2FfaW4pOyAKLSAgIGlmICgoZXJyID0gcnNhX3BhZChpbmtleSwgaW5sZW4sIHJzYV9pbiwgJnksIHdwcm5nLCBwcm5nKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBDUllQVF9FUlJPUjsKLSAgIH0KLSAgIAotICAgLyogcnNhIGVuY3J5cHQgaXQgKi8KLSAgIHJzYV9zaXplID0gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKHJzYV9vdXQpOwotICAgaWYgKChlcnIgPSByc2FfZXhwdG1vZChyc2FfaW4sIHksIHJzYV9vdXQsICZyc2Ffc2l6ZSwgUEtfUFVCTElDLCBrZXkpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIENSWVBUX0VSUk9SOwotICAgfQotCi0gICAvKiBjaGVjayBzaXplICovCi0gICBpZiAoKm91dGxlbiA8IChQQUNLRVRfU0laRSs0K3JzYV9zaXplKSkgeyAKLSAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gICB9Ci0KLSAgIC8qIHN0b3JlIGhlYWRlciAqLwotICAgcGFja2V0X3N0b3JlX2hlYWRlcihvdXRrZXksIFBBQ0tFVF9TRUNUX1JTQSwgUEFDS0VUX1NVQl9FTkNfS0VZKTsKLQotICAgLyogbm93IGxldHMgbWFrZSB0aGUgaGVhZGVyICovCi0gICB5ID0gUEFDS0VUX1NJWkU7Ci0gICAKLSAgIC8qIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBSU0EgdmFsdWUgKi8KLSAgIFNUT1JFMzJMKHJzYV9zaXplLCAob3V0a2V5K3kpKTsKLSAgIHkgKz0gNDsKLQotICAgLyogc3RvcmUgdGhlIHJzYSB2YWx1ZSAqLwotICAgZm9yICh4ID0gMDsgeCA8IHJzYV9zaXplOyB4KyssIHkrKykgewotICAgICAgIG91dGtleVt5XSA9IHJzYV9vdXRbeF07Ci0gICB9Ci0KLSAgICpvdXRsZW4gPSB5OwotI2lmZGVmIENMRUFOX1NUQUNLCi0gICAvKiBjbGVhbiB1cCAqLwotICAgemVyb21lbShyc2FfaW4sIHNpemVvZihyc2FfaW4pKTsKLSAgIHplcm9tZW0ocnNhX291dCwgc2l6ZW9mKHJzYV9vdXQpKTsKLSNlbmRpZgotCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLWludCByc2FfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dGtleSwgdW5zaWduZWQgbG9uZyAqa2V5bGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnNhX2tleSAqa2V5KQotewotICAgdW5zaWduZWQgY2hhciBzeW1fa2V5W01BWEJMT0NLU0laRV0sIHJzYV9vdXRbUlNBX1NUQUNLXTsKLSAgIHVuc2lnbmVkIGxvbmcgeCwgeSwgeiwgaSwgcnNhX3NpemU7Ci0gICBpbnQgZXJyOwotCi0gICBfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0a2V5ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXlsZW4gIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKLQotICAgLyogcmlnaHQga2V5IHR5cGU/ICovCi0gICBpZiAoa2V5LT50eXBlICE9IFBLX1BSSVZBVEUgJiYga2V5LT50eXBlICE9IFBLX1BSSVZBVEVfT1BUSU1JWkVEKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfUEtfTk9UX1BSSVZBVEU7Ci0gICB9Ci0KLSAgIGlmIChpbmxlbiA8IFBBQ0tFVF9TSVpFKzQpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKLSAgIH0gZWxzZSB7Ci0gICAgICBpbmxlbiAtPSBQQUNLRVRfU0laRSs0OwotICAgfQotCi0gICAvKiBjaGVjayB0aGUgaGVhZGVyICovCi0gICBpZiAoKGVyciA9IHBhY2tldF92YWxpZF9oZWFkZXIoKHVuc2lnbmVkIGNoYXIgKilpbiwgUEFDS0VUX1NFQ1RfUlNBLCBQQUNLRVRfU1VCX0VOQ19LRVkpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogZ3JhYiBsZW5ndGggb2YgdGhlIHJzYSBrZXkgKi8KLSAgIHkgPSBQQUNLRVRfU0laRTsKLSAgIExPQUQzMkwocnNhX3NpemUsIChpbit5KSk7Ci0gICBpZiAoaW5sZW4gPCByc2Ffc2l6ZSkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgfSBlbHNlIHsKLSAgICAgIGlubGVuIC09IHJzYV9zaXplOwotICAgfQotICAgeSArPSA0OwotCi0gICAvKiBkZWNyeXB0IGl0ICovCi0gICB4ID0gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKHJzYV9vdXQpOwotICAgaWYgKChlcnIgPSByc2FfZXhwdG1vZChpbit5LCByc2Ffc2l6ZSwgcnNhX291dCwgJngsIFBLX1BSSVZBVEUsIGtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotICAgeSArPSByc2Ffc2l6ZTsKLQotICAgLyogZGVwYWQgaXQgKi8KLSAgIHogPSAodW5zaWduZWQgbG9uZylzaXplb2Yoc3ltX2tleSk7Ci0gICBpZiAoKGVyciA9IHJzYV9kZXBhZChyc2Ffb3V0LCB4LCBzeW1fa2V5LCAmeikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBjaGVjayBzaXplICovCi0gICBpZiAoKmtleWxlbiA8IHopIHsgCi0gICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgfQotCi0gICBmb3IgKGkgPSAwOyBpIDwgejsgaSsrKSB7Ci0gICAgIG91dGtleVtpXSA9IHN5bV9rZXlbaV07Ci0gICB9Ci0gICAKLSNpZmRlZiBDTEVBTl9TVEFDSwotICAgLyogY2xlYW4gdXAgKi8KLSAgIHplcm9tZW0oc3ltX2tleSwgc2l6ZW9mKHN5bV9rZXkpKTsKLSAgIHplcm9tZW0ocnNhX291dCwgc2l6ZW9mKHJzYV9vdXQpKTsKLSNlbmRpZgotICAgKmtleWxlbiA9IHo7Ci0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLWludCByc2Ffc2lnbl9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICByc2Ffa2V5ICprZXkpCi17Ci0gICB1bnNpZ25lZCBsb25nIHJzYV9zaXplLCB4LCB5OwotICAgdW5zaWduZWQgY2hhciByc2FfaW5bUlNBX1NUQUNLXSwgcnNhX291dFtSU0FfU1RBQ0tdOwotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7Ci0gICAKLSAgIC8qIHJlamVjdCBub25zZW5zZSBzaXplcyAqLwotICAgaWYgKGlubGVuID4gKDUxMi8zKSB8fCBpbmxlbiA8IDE2KSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9Ci0KLSAgIC8qIHR5cGUgb2Yga2V5PyAqLwotICAgaWYgKGtleS0+dHlwZSAhPSBQS19QUklWQVRFICYmIGtleS0+dHlwZSAhPSBQS19QUklWQVRFX09QVElNSVpFRCkgewotICAgICAgcmV0dXJuIENSWVBUX1BLX05PVF9QUklWQVRFOwotICAgfQotCi0gICAvKiBwYWQgaXQgKi8KLSAgIHggPSAodW5zaWduZWQgbG9uZylzaXplb2YocnNhX291dCk7Ci0gICBpZiAoKGVyciA9IHJzYV9zaWducGFkKGluLCBpbmxlbiwgcnNhX291dCwgJngpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogc2lnbiBpdCAqLwotICAgcnNhX3NpemUgPSAodW5zaWduZWQgbG9uZylzaXplb2YocnNhX2luKTsKLSAgIGlmICgoZXJyID0gcnNhX2V4cHRtb2QocnNhX291dCwgeCwgcnNhX2luLCAmcnNhX3NpemUsIFBLX1BSSVZBVEUsIGtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBjaGVjayBzaXplICovCi0gICBpZiAoKm91dGxlbiA8IChQQUNLRVRfU0laRSs0K3JzYV9zaXplKSkgewotICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKLSAgIH0KLQotICAgLyogbm93IGxldHMgb3V0cHV0IHRoZSBtZXNzYWdlICovCi0gICB5ID0gUEFDS0VUX1NJWkU7Ci0KLSAgIC8qIG91dHB1dCB0aGUgbGVuICovCi0gICBTVE9SRTMyTChyc2Ffc2l6ZSwgKG91dCt5KSk7Ci0gICB5ICs9IDQ7Ci0KLSAgIC8qIHN0b3JlIHRoZSBzaWduYXR1cmUgKi8KLSAgIGZvciAoeCA9IDA7IHggPCByc2Ffc2l6ZTsgeCsrLCB5KyspIHsKLSAgICAgICBvdXRbeV0gPSByc2FfaW5beF07Ci0gICB9Ci0KLSAgIC8qIHN0b3JlIGhlYWRlciAqLwotICAgcGFja2V0X3N0b3JlX2hlYWRlcihvdXQsIFBBQ0tFVF9TRUNUX1JTQSwgUEFDS0VUX1NVQl9TSUdORUQpOwotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIC8qIGNsZWFuIHVwICovCi0gICB6ZXJvbWVtKHJzYV9pbiwgc2l6ZW9mKHJzYV9pbikpOwotICAgemVyb21lbShyc2Ffb3V0LCBzaXplb2YocnNhX291dCkpOwotI2VuZGlmCi0gICAqb3V0bGVuID0geTsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IHJzYV92ZXJpZnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIHVuc2lnbmVkIGxvbmcgc2lnbGVuLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICptZCwgaW50ICpzdGF0LCByc2Ffa2V5ICprZXkpCi17Ci0gICB1bnNpZ25lZCBsb25nIHJzYV9zaXplLCB4LCB5LCB6OwotICAgdW5zaWduZWQgY2hhciByc2FfaW5bUlNBX1NUQUNLXSwgcnNhX291dFtSU0FfU1RBQ0tdOwotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhzaWcgICE9IE5VTEwpOwotICAgX0FSR0NISyhtZCAgICE9IE5VTEwpOwotICAgX0FSR0NISyhzdGF0ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgICE9IE5VTEwpOwotCi0gICAvKiBhbHdheXMgYmUgaW5jb3JyZWN0IGJ5IGRlZmF1bHQgKi8KLSAgICpzdGF0ID0gMDsKLSAgIAotICAgaWYgKHNpZ2xlbiA8IFBBQ0tFVF9TSVpFKzQpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKLSAgIH0gZWxzZSB7Ci0gICAgICBzaWdsZW4gLT0gUEFDS0VUX1NJWkUrNDsKLSAgIH0KLQotICAgLyogdmVyaWZ5IGhlYWRlciAqLwotICAgaWYgKChlcnIgPSBwYWNrZXRfdmFsaWRfaGVhZGVyKCh1bnNpZ25lZCBjaGFyICopc2lnLCBQQUNLRVRfU0VDVF9SU0EsIFBBQ0tFVF9TVUJfU0lHTkVEKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIGdldCB0aGUgbGVuICovCi0gICB5ID0gUEFDS0VUX1NJWkU7Ci0gICBMT0FEMzJMKHJzYV9zaXplLCAoc2lnK3kpKTsKLSAgIGlmIChzaWdsZW4gPCByc2Ffc2l6ZSkgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOwotICAgfSBlbHNlIHsKLSAgICAgIHNpZ2xlbiAtPSByc2Ffc2l6ZTsKLSAgIH0KLSAgIHkgKz0gNDsKLQotICAgLyogZXhwdG1vZCBpdCAqLwotICAgeCA9ICh1bnNpZ25lZCBsb25nKXNpemVvZihyc2Ffb3V0KTsKLSAgIGlmICgoZXJyID0gcnNhX2V4cHRtb2Qoc2lnK3ksIHJzYV9zaXplLCByc2Ffb3V0LCAmeCwgUEtfUFVCTElDLCBrZXkpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIHkgKz0gcnNhX3NpemU7Ci0KLSAgIC8qIGRlcGFkIGl0ICovCi0gICB6ID0gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKHJzYV9pbik7Ci0gICBpZiAoKGVyciA9IHJzYV9zaWduZGVwYWQocnNhX291dCwgeCwgcnNhX2luLCAmeikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0gICAvKiBjaGVjaz8gKi8KLSAgIGlmIChtZW1jbXAocnNhX2luLCBtZCwgKHNpemVfdCl6KSA9PSAwKSB7Ci0gICAgICAqc3RhdCA9IDE7Ci0gICB9Ci0KLSNpZmRlZiBDTEVBTl9TVEFDSwotICAgemVyb21lbShyc2FfaW4sIHNpemVvZihyc2FfaW4pKTsKLSAgIHplcm9tZW0ocnNhX291dCwgc2l6ZW9mKHJzYV9vdXQpKTsKLSNlbmRpZgotICAgcmV0dXJuIENSWVBUX09LOwotfQotCmRpZmYgLS1naXQgYS9yc2FfdmVyaWZ5X2hhc2guYyBiL3JzYV92ZXJpZnlfaGFzaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjNjY2RhLi4wMDAwMDAwCi0tLSBhL3JzYV92ZXJpZnlfaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBNUlNBCi0KLS8qIGRlc2lnbiB0aGVuIFBTUyBkZXBhZCAqLwotaW50IHJzYV92ZXJpZnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsICAgICAgdW5zaWduZWQgbG9uZyBzaWdsZW4sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZ2hhc2gsICB1bnNpZ25lZCBsb25nIG1zZ2hhc2hsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgICAgKnBybmcsICAgICBpbnQgICAgICAgICAgIHBybmdfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBoYXNoX2lkeCwgdW5zaWduZWQgbG9uZyBzYWx0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICpzdGF0LCAgICAgcnNhX2tleSAgICAgICprZXkpCi17Ci0gICB1bnNpZ25lZCBsb25nIG1vZHVsdXNfYml0bGVuLCBtb2R1bHVzX2J5dGVsZW4sIHg7Ci0gICBpbnQgICAgICAgICAgIGVycjsKLSAgIHVuc2lnbmVkIGNoYXIgKnRtcGJ1ZjsKLSAgIAotICBfQVJHQ0hLKG1zZ2hhc2ggICE9IE5VTEwpOwotICBfQVJHQ0hLKHNpZyAgICAgICE9IE5VTEwpOwotICBfQVJHQ0hLKHN0YXQgICAgICE9IE5VTEwpOwotICBfQVJHQ0hLKGtleSAgICAgICE9IE5VTEwpOwotICAKLSAgLyogdmFsaWQgaGFzaCA/ICovCi0gIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoX2lkeCkpICE9IENSWVBUX09LKSB7Ci0gICAgIHJldHVybiBlcnI7Ci0gIH0KLQotICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQocHJuZ19pZHgpKSAhPSBDUllQVF9PSykgewotICAgICByZXR1cm4gZXJyOwotICB9Ci0gIAotICAvKiBnZXQgbW9kdWx1cyBsZW4gaW4gYml0cyAqLwotICBtb2R1bHVzX2JpdGxlbiA9IG1wX2NvdW50X2JpdHMoJihrZXktPk4pKTsKLQotICAvKiBvdXRsZW4gbXVzdCBiZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgbW9kdWx1cyAqLwotICBtb2R1bHVzX2J5dGVsZW4gPSBtcF91bnNpZ25lZF9iaW5fc2l6ZSgmKGtleS0+TikpOwotICBpZiAobW9kdWx1c19ieXRlbGVuICE9IHNpZ2xlbikgewotICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7Ci0gIH0KLSAgCi0gIC8qIGFsbG9jYXRlIHRlbXAgYnVmZmVyIGZvciBkZWNvZGVkIHNpZyAqLwotICB0bXBidWYgPSBYQ0FMTE9DKDEsIG1vZHVsdXNfYnl0ZWxlbiArIDEpOwotICBpZiAodG1wYnVmID09IE5VTEwpIHsKLSAgICAgcmV0dXJuIENSWVBUX01FTTsKLSAgfQotICAgICAgCi0gIC8qIFJTQSBkZWNvZGUgaXQgICovCi0gIHggPSBzaWdsZW47Ci0gIGlmICgoZXJyID0gcnNhX2V4cHRtb2Qoc2lnLCBzaWdsZW4sIHRtcGJ1ZiwgJngsIFBLX1BVQkxJQywgcHJuZywgcHJuZ19pZHgsIGtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgIFhGUkVFKHRtcGJ1Zik7Ci0gICAgIHJldHVybiBlcnI7Ci0gIH0KLSAgCi0gIC8qIFBTUyBkZWNvZGUgaXQgKi8KLSAgZXJyID0gcGtjc18xX3Bzc19kZWNvZGUobXNnaGFzaCwgbXNnaGFzaGxlbiwgdG1wYnVmLCB4LCBzYWx0bGVuLCBoYXNoX2lkeCwgbW9kdWx1c19iaXRsZW4sIHN0YXQpOwotICBYRlJFRSh0bXBidWYpOwotICByZXR1cm4gZXJyOwotfQotCi0jZW5kaWYgLyogTVJTQSAqLwpkaWZmIC0tZ2l0IGEvcnVuLnNoIGIvcnVuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NTIxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9ydW4uc2gKQEAgLTAsMCArMSwzNSBAQAorIyEvYmluL2Jhc2gKK2Jhc2ggYnVpbGQuc2ggIiAkMSIgIiQyIC1PMiIgIiQzIElHTk9SRV9TUEVFRD0xIgoraWYgWyAtYSB0ZXN0b2sudHh0IF0gJiYgWyAtZiB0ZXN0b2sudHh0IF07IHRoZW4KKyAgIGVjaG8KK2Vsc2UKKwllY2hvCisJZWNobyAiVGVzdCBmYWlsZWQiCisJZXhpdCAxCitmaQorCitybSAtZiB0ZXN0b2sudHh0CitiYXNoIGJ1aWxkLnNoICIgJDEiICIkMiAtT3MiICIgJDMgSUdOT1JFX1NQRUVEPTEgTFRDX1NNQUxMPTEiCitpZiBbIC1hIHRlc3Rvay50eHQgXSAmJiBbIC1mIHRlc3Rvay50eHQgXTsgdGhlbgorICAgZWNobworZWxzZQorCWVjaG8KKwllY2hvICJUZXN0IGZhaWxlZCIKKwlleGl0IDEKK2ZpCisKK3JtIC1mIHRlc3Rvay50eHQKK2Jhc2ggYnVpbGQuc2ggIiAkMSIgIiAkMiIgIiAkMyIKK2lmIFsgLWEgdGVzdG9rLnR4dCBdICYmIFsgLWYgdGVzdG9rLnR4dCBdOyB0aGVuCisgICBlY2hvCitlbHNlCisJZWNobworCWVjaG8gIlRlc3QgZmFpbGVkIgorCWV4aXQgMQorZmkKKworZXhpdCAwCisKKyMgJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvcnVuLnNoLHYgJCAgIAorIyAkUmV2aXNpb246IDEuMTMgJCAgIAorIyAkRGF0ZTogMjAwNS8wNS8xMSAxODo1OTo1MyAkIApkaWZmIC0tZ2l0IGEvc19vY2JfZG9uZS5jIGIvc19vY2JfZG9uZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVkNjVjLi4wMDAwMDAwCi0tLSBhL3Nfb2NiX2RvbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogT0NCIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIE9DQl9NT0RFCi0KLS8qIFNpbmNlIHRoZSBsYXN0IGJsb2NrIGlzIGVuY3J5cHRlZCBpbiBDVFIgbW9kZSB0aGUgc2FtZSBjb2RlIGNhbgotICogYmUgdXNlZCB0byBmaW5pc2ggYSBkZWNyeXB0IG9yIGVuY3J5cHQgc3RyZWFtLiAgVGhlIG9ubHkgZGlmZmVyZW5jZQotICogaXMgd2UgWE9SIHRoZSBmaW5hbCBjaXBoZXJ0ZXh0IGludG8gdGhlIGNoZWNrc3VtIHNvIHdlIGhhdmUgdG8geG9yIGl0Ci0gKiBiZWZvcmUgd2UgQ1RSIFtkZWNyeXB0XSBvciBhZnRlciBbZW5jcnlwdF0KLSAqCi0gKiB0aGUgbmFtZXMgcHQvcHRsZW4vY3QgcmVhbGx5IGp1c3QgbWVhbiBpbi9pbmxlbi9vdXQgYnV0IHRoaXMgaXMgdGhlIHdheSBJIHdyb3RlIGl0Li4uIAotICovCi1pbnQgX19vY2JfZG9uZShvY2Jfc3RhdGUgKm9jYiwgY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgcHRsZW4sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nICp0YWdsZW4sIGludCBtb2RlKQotCi17Ci0gICB1bnNpZ25lZCBjaGFyIFpbTUFYQkxPQ0tTSVpFXSwgWVtNQVhCTE9DS1NJWkVdLCBYW01BWEJMT0NLU0laRV07Ci0gICBpbnQgZXJyLCB4OwotCi0gICBfQVJHQ0hLKG9jYiAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsocHQgICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHRhZyAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsodGFnbGVuICE9IE5VTEwpOwotICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQob2NiLT5jaXBoZXIpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLSAgIGlmIChvY2ItPmJsb2NrX2xlbiAhPSBjaXBoZXJfZGVzY3JpcHRvcltvY2ItPmNpcGhlcl0uYmxvY2tfbGVuZ3RoIHx8Ci0gICAgICAgKGludClwdGxlbiA+IG9jYi0+YmxvY2tfbGVuIHx8IChpbnQpcHRsZW4gPCAwKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9Ci0KLSAgIC8qIGNvbXB1dGUgWFttXSA9IGxlbihwdFttXSkgWE9SIExyIFhPUiBaW21dICovCi0gICBvY2Jfc2hpZnRfeG9yKG9jYiwgWCk7IAotICAgbWVtY3B5KFosIFgsIG9jYi0+YmxvY2tfbGVuKTsKLQotICAgWFtvY2ItPmJsb2NrX2xlbi0xXSBePSAocHRsZW4qOCkmMjU1OwotICAgWFtvY2ItPmJsb2NrX2xlbi0yXSBePSAoKHB0bGVuKjgpPj44KSYyNTU7Ci0gICBmb3IgKHggPSAwOyB4IDwgb2NiLT5ibG9ja19sZW47IHgrKykgewotICAgICAgIFhbeF0gXj0gb2NiLT5Mclt4XTsgCi0gICB9Ci0KLSAgIC8qIFlbbV0gPSBFKFhbbV0pKSAqLwotICAgY2lwaGVyX2Rlc2NyaXB0b3Jbb2NiLT5jaXBoZXJdLmVjYl9lbmNyeXB0KFgsIFksICZvY2ItPmtleSk7Ci0KLSAgIGlmIChtb2RlID09IDEpIHsKLSAgICAgIC8qIGRlY3J5cHQgbW9kZSwgc28gbGV0J3MgeG9yIGl0IGZpcnN0ICovCi0gICAgICAvKiB4b3IgQ1ttXSBpbnRvIGNoZWNrc3VtICovCi0gICAgICBmb3IgKHggPSAwOyB4IDwgKGludClwdGxlbjsgeCsrKSB7Ci0gICAgICAgICBvY2ItPmNoZWNrc3VtW3hdIF49IGN0W3hdOwotICAgICAgfSAgCi0gICB9Ci0KLSAgIC8qIENbbV0gPSBQW21dIHhvciBZW21dICovCi0gICBmb3IgKHggPSAwOyB4IDwgKGludClwdGxlbjsgeCsrKSB7Ci0gICAgICAgY3RbeF0gPSBwdFt4XSBeIFlbeF07Ci0gICB9Ci0KLSAgIGlmIChtb2RlID09IDApIHsKLSAgICAgIC8qIGVuY3J5cHQgbW9kZSAqLyAgICAKLSAgICAgIC8qIHhvciBDW21dIGludG8gY2hlY2tzdW0gKi8KLSAgICAgIGZvciAoeCA9IDA7IHggPCAoaW50KXB0bGVuOyB4KyspIHsKLSAgICAgICAgICBvY2ItPmNoZWNrc3VtW3hdIF49IGN0W3hdOwotICAgICAgfQotICAgfQotCi0gICAvKiB4b3IgWVttXSBhbmQgWlttXSBpbnRvIGNoZWNrc3VtICovCi0gICBmb3IgKHggPSAwOyB4IDwgb2NiLT5ibG9ja19sZW47IHgrKykgewotICAgICAgIG9jYi0+Y2hlY2tzdW1beF0gXj0gWVt4XSBeIFpbeF07Ci0gICB9Ci0gICAKLSAgIC8qIGVuY3J5cHQgY2hlY2tzdW0sIGVyLi4uIHRhZyEhICovCi0gICBjaXBoZXJfZGVzY3JpcHRvcltvY2ItPmNpcGhlcl0uZWNiX2VuY3J5cHQob2NiLT5jaGVja3N1bSwgWCwgJm9jYi0+a2V5KTsKLQotICAgLyogbm93IHN0b3JlIGl0ICovCi0gICBmb3IgKHggPSAwOyB4IDwgb2NiLT5ibG9ja19sZW4gJiYgeCA8IChpbnQpKnRhZ2xlbjsgeCsrKSB7Ci0gICAgICAgdGFnW3hdID0gWFt4XTsKLSAgIH0KLSAgICp0YWdsZW4gPSB4OwotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oWCwgc2l6ZW9mKFgpKTsKLSAgIHplcm9tZW0oWSwgc2l6ZW9mKFkpKTsKLSAgIHplcm9tZW0oWiwgc2l6ZW9mKFopKTsKLSAgIHplcm9tZW0ob2NiLCBzaXplb2YoKm9jYikpOwotI2VuZGlmCi0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zZXJwZW50LmMgYi9zZXJwZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWVhMTEuLjAwMDAwMDAKLS0tIGEvc2VycGVudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjk4ICswLDAgQEAKLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBTRVJQRU5UCi0KLWNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3Igc2VycGVudF9kZXNjID0KLXsKLSAgICAic2VycGVudCIsCi0gICAgNSwKLSAgICAxNiwgMzIsIDE2LCAzMiwKLSAgICAmc2VycGVudF9zZXR1cCwKLSAgICAmc2VycGVudF9lY2JfZW5jcnlwdCwKLSAgICAmc2VycGVudF9lY2JfZGVjcnlwdCwKLSAgICAmc2VycGVudF90ZXN0LAotICAgICZzZXJwZW50X2tleXNpemUKLX07Ci0KLS8qIFRoZXNlIGRlZmluZXMgYXJlIGRlcml2ZWQgZnJvbSBCcmlhbiBHbGFkbWFuJ3Mgd29yay4gIENvbnRhY3QgaGltIGF0IGdsYWRtYW5Ac2V2ZW43Ny5kZW1vbi5jby51ayAKLSAqCi0gKiBBdmFpbGFibGUgb24gdGhlIHdlYiBhdCBodHRwOi8vZnAuZ2xhZG1hbi5wbHVzLmNvbS9jcnlwdG9ncmFwaHlfdGVjaG5vbG9neS9hZXMvaW5kZXguaHRtCi0gKi8KLSNkZWZpbmUgc2IwKGEsYixjLGQsZSxmLGcsaCkgICAgXAotICAgIHQxID0gYSBeIGQ7ICAgICBcCi0gICAgdDIgPSBhICYgZDsgICAgIFwKLSAgICB0MyA9IGMgXiB0MTsgICAgXAotICAgIHQ2ID0gYiAmIHQxOyAgICBcCi0gICAgdDQgPSBiIF4gdDM7ICAgIFwKLSAgICB0MTAgPSB+dDM7ICAgICAgXAotICAgIGggPSB0MiBeIHQ0OyAgICBcCi0gICAgdDcgPSBhIF4gdDY7ICAgIFwKLSAgICB0MTQgPSB+dDc7ICAgICAgXAotICAgIHQ4ID0gYyB8IHQ3OyAgICBcCi0gICAgdDExID0gdDMgXiB0NzsgIFwKLSAgICBnID0gdDQgXiB0ODsgICAgXAotICAgIHQxMiA9IGggJiB0MTE7ICBcCi0gICAgZiA9IHQxMCBeIHQxMjsgIFwKLSAgICBlID0gdDEyIF4gdDE0Ci0KLS8qIDE1IHRlcm1zICovCi0KLSNkZWZpbmUgaWIwKGEsYixjLGQsZSxmLGcsaCkgICAgXAotICAgIHQxID0gfmE7ICAgICAgICBcCi0gICAgdDIgPSBhIF4gYjsgICAgIFwKLSAgICB0MyA9IHQxIHwgdDI7ICAgXAotICAgIHQ0ID0gZCBeIHQzOyAgICBcCi0gICAgdDcgPSBkICYgdDI7ICAgIFwKLSAgICB0NSA9IGMgXiB0NDsgICAgXAotICAgIHQ4ID0gdDEgXiB0NzsgICBcCi0gICAgZyA9IHQyIF4gdDU7ICAgIFwKLSAgICB0MTEgPSBhICYgdDQ7ICAgXAotICAgIHQ5ID0gZyAmIHQ4OyAgICBcCi0gICAgdDE0ID0gdDUgXiB0ODsgIFwKLSAgICBmID0gdDQgXiB0OTsgICAgXAotICAgIHQxMiA9IHQ1IHwgZjsgICBcCi0gICAgaCA9IHQxMSBeIHQxMjsgIFwKLSAgICBlID0gaCBeIHQxNAotCi0vKiAxNCB0ZXJtcyEgICovCi0KLSNkZWZpbmUgc2IxKGEsYixjLGQsZSxmLGcsaCkgICAgXAotICAgIHQxID0gfmE7ICAgICAgICBcCi0gICAgdDIgPSBiIF4gdDE7ICAgIFwKLSAgICB0MyA9IGEgfCB0MjsgICAgXAotICAgIHQ0ID0gZCB8IHQyOyAgICBcCi0gICAgdDUgPSBjIF4gdDM7ICAgIFwKLSAgICBnID0gZCBeIHQ1OyAgICAgXAotICAgIHQ3ID0gYiBeIHQ0OyAgICBcCi0gICAgdDggPSB0MiBeIGc7ICAgIFwKLSAgICB0OSA9IHQ1ICYgdDc7ICAgXAotICAgIGggPSB0OCBeIHQ5OyAgICBcCi0gICAgdDExID0gdDUgXiB0NzsgIFwKLSAgICBmID0gaCBeIHQxMTsgICAgXAotICAgIHQxMyA9IHQ4ICYgdDExOyBcCi0gICAgZSA9IHQ1IF4gdDEzCi0KLS8qIDE3IHRlcm1zICovCi0KLSNkZWZpbmUgaWIxKGEsYixjLGQsZSxmLGcsaCkgICAgXAotICAgIHQxID0gYSBeIGQ7ICAgICBcCi0gICAgdDIgPSBhICYgYjsgICAgIFwKLSAgICB0MyA9IGIgXiBjOyAgICAgXAotICAgIHQ0ID0gYSBeIHQzOyAgICBcCi0gICAgdDUgPSBiIHwgZDsgICAgIFwKLSAgICB0NyA9IGMgfCB0MTsgICAgXAotICAgIGggPSB0NCBeIHQ1OyAgICBcCi0gICAgdDggPSBiIF4gdDc7ICAgIFwKLSAgICB0MTEgPSB+dDI7ICAgICAgXAotICAgIHQ5ID0gdDQgJiB0ODsgICBcCi0gICAgZiA9IHQxIF4gdDk7ICAgIFwKLSAgICB0MTMgPSB0OSBeIHQxMTsgXAotICAgIHQxMiA9IGggJiBmOyAgICBcCi0gICAgZyA9IHQxMiBeIHQxMzsgIFwKLSAgICB0MTUgPSBhICYgZDsgICAgXAotICAgIHQxNiA9IGMgXiB0MTM7ICBcCi0gICAgZSA9IHQxNSBeIHQxNgotCi0vKiAxNiB0ZXJtcyAqLwotCi0jZGVmaW5lIHNiMihhLGIsYyxkLGUsZixnLGgpICAgIFwKLSAgICB0MSA9IH5hOyAgICAgICAgXAotICAgIHQyID0gYiBeIGQ7ICAgICBcCi0gICAgdDMgPSBjICYgdDE7ICAgIFwKLSAgICB0MTMgPSBkIHwgdDE7ICAgXAotICAgIGUgPSB0MiBeIHQzOyAgICBcCi0gICAgdDUgPSBjIF4gdDE7ICAgIFwKLSAgICB0NiA9IGMgXiBlOyAgICAgXAotICAgIHQ3ID0gYiAmIHQ2OyAgICBcCi0gICAgdDEwID0gZSB8IHQ1OyAgIFwKLSAgICBoID0gdDUgXiB0NzsgICAgXAotICAgIHQ5ID0gZCB8IHQ3OyAgICBcCi0gICAgdDExID0gdDkgJiB0MTA7IFwKLSAgICB0MTQgPSB0MiBeIGg7ICAgXAotICAgIGcgPSBhIF4gdDExOyAgICBcCi0gICAgdDE1ID0gZyBeIHQxMzsgIFwKLSAgICBmID0gdDE0IF4gdDE1Ci0KLS8qIDE2IHRlcm1zICovCi0KLSNkZWZpbmUgaWIyKGEsYixjLGQsZSxmLGcsaCkgICAgXAotICAgIHQxID0gYiBeIGQ7ICAgICBcCi0gICAgdDIgPSB+dDE7ICAgICAgIFwKLSAgICB0MyA9IGEgXiBjOyAgICAgXAotICAgIHQ0ID0gYyBeIHQxOyAgICBcCi0gICAgdDcgPSBhIHwgdDI7ICAgIFwKLSAgICB0NSA9IGIgJiB0NDsgICAgXAotICAgIHQ4ID0gZCBeIHQ3OyAgICBcCi0gICAgdDExID0gfnQ0OyAgICAgIFwKLSAgICBlID0gdDMgXiB0NTsgICAgXAotICAgIHQ5ID0gdDMgfCB0ODsgICBcCi0gICAgdDE0ID0gZCAmIHQxMTsgIFwKLSAgICBoID0gdDEgXiB0OTsgICAgXAotICAgIHQxMiA9IGUgfCBoOyAgICBcCi0gICAgZiA9IHQxMSBeIHQxMjsgIFwKLSAgICB0MTUgPSB0MyBeIHQxMjsgXAotICAgIGcgPSB0MTQgXiB0MTUKLQotLyogMTcgdGVybXMgKi8KLQotI2RlZmluZSBzYjMoYSxiLGMsZCxlLGYsZyxoKSAgICBcCi0gICAgdDEgPSBhIF4gYzsgICAgIFwKLSAgICB0MiA9IGQgXiB0MTsgICAgXAotICAgIHQzID0gYSAmIHQyOyAgICBcCi0gICAgdDQgPSBkIF4gdDM7ICAgIFwKLSAgICB0NSA9IGIgJiB0NDsgICAgXAotICAgIGcgPSB0MiBeIHQ1OyAgICBcCi0gICAgdDcgPSBhIHwgZzsgICAgIFwKLSAgICB0OCA9IGIgfCBkOyAgICAgXAotICAgIHQxMSA9IGEgfCBkOyAgICBcCi0gICAgdDkgPSB0NCAmIHQ3OyAgIFwKLSAgICBmID0gdDggXiB0OTsgICAgXAotICAgIHQxMiA9IGIgXiB0MTE7ICBcCi0gICAgdDEzID0gZyBeIHQ5OyAgIFwKLSAgICB0MTUgPSB0MyBeIHQ4OyAgXAotICAgIGggPSB0MTIgXiB0MTM7ICBcCi0gICAgdDE2ID0gYyAmIHQxNTsgIFwKLSAgICBlID0gdDEyIF4gdDE2Ci0KLS8qIDE2IHRlcm0gc29sdXRpb24gdGhhdCBwZXJmb3JtcyBsZXNzIHdlbGwgdGhhbiAxNyB0ZXJtIG9uZQotICAgaW4gbXkgZW52aXJvbm1lbnQgKFBQcm8vUElJKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotI2RlZmluZSBzYjMoYSxiLGMsZCxlLGYsZyxoKSAgICBcCi0gICAgdDEgPSBhIF4gYjsgICAgIFwKLSAgICB0MiA9IGEgJiBjOyAgICAgXAotICAgIHQzID0gYSB8IGQ7ICAgICBcCi0gICAgdDQgPSBjIF4gZDsgICAgIFwKLSAgICB0NSA9IHQxICYgdDM7ICAgXAotICAgIHQ2ID0gdDIgfCB0NTsgICBcCi0gICAgZyA9IHQ0IF4gdDY7ICAgIFwKLSAgICB0OCA9IGIgXiB0MzsgICAgXAotICAgIHQ5ID0gdDYgXiB0ODsgICBcCi0gICAgdDEwID0gdDQgJiB0OTsgIFwKLSAgICBlID0gdDEgXiB0MTA7ICAgXAotICAgIHQxMiA9IGcgJiBlOyAgICBcCi0gICAgZiA9IHQ5IF4gdDEyOyAgIFwKLSAgICB0MTQgPSBiIHwgZDsgICAgXAotICAgIHQxNSA9IHQ0IF4gdDEyOyBcCi0gICAgaCA9IHQxNCBeIHQxNQotKi8KLQotLyogMTcgdGVybXMgKi8KLQotI2RlZmluZSBpYjMoYSxiLGMsZCxlLGYsZyxoKSAgICBcCi0gICAgdDEgPSBiIF4gYzsgICAgIFwKLSAgICB0MiA9IGIgfCBjOyAgICAgXAotICAgIHQzID0gYSBeIGM7ICAgICBcCi0gICAgdDcgPSBhIF4gZDsgICAgIFwKLSAgICB0NCA9IHQyIF4gdDM7ICAgXAotICAgIHQ1ID0gZCB8IHQ0OyAgICBcCi0gICAgdDkgPSB0MiBeIHQ3OyAgIFwKLSAgICBlID0gdDEgXiB0NTsgICAgXAotICAgIHQ4ID0gdDEgfCB0NTsgICBcCi0gICAgdDExID0gYSAmIHQ0OyAgIFwKLSAgICBnID0gdDggXiB0OTsgICAgXAotICAgIHQxMiA9IGUgfCB0OTsgICBcCi0gICAgZiA9IHQxMSBeIHQxMjsgIFwKLSAgICB0MTQgPSBhICYgZzsgICAgXAotICAgIHQxNSA9IHQyIF4gdDE0OyBcCi0gICAgdDE2ID0gZSAmIHQxNTsgIFwKLSAgICBoID0gdDQgXiB0MTYKLQotLyogMTUgdGVybXMgKi8KLQotI2RlZmluZSBzYjQoYSxiLGMsZCxlLGYsZyxoKSAgICBcCi0gICAgdDEgPSBhIF4gZDsgICAgIFwKLSAgICB0MiA9IGQgJiB0MTsgICAgXAotICAgIHQzID0gYyBeIHQyOyAgICBcCi0gICAgdDQgPSBiIHwgdDM7ICAgIFwKLSAgICBoID0gdDEgXiB0NDsgICAgXAotICAgIHQ2ID0gfmI7ICAgICAgICBcCi0gICAgdDcgPSB0MSB8IHQ2OyAgIFwKLSAgICBlID0gdDMgXiB0NzsgICAgXAotICAgIHQ5ID0gYSAmIGU7ICAgICBcCi0gICAgdDEwID0gdDEgXiB0NjsgIFwKLSAgICB0MTEgPSB0NCAmIHQxMDsgXAotICAgIGcgPSB0OSBeIHQxMTsgICBcCi0gICAgdDEzID0gYSBeIHQzOyAgIFwKLSAgICB0MTQgPSB0MTAgJiBnOyAgXAotICAgIGYgPSB0MTMgXiB0MTQKLQotLyogMTcgdGVybXMgKi8KLQotI2RlZmluZSBpYjQoYSxiLGMsZCxlLGYsZyxoKSAgICBcCi0gICAgdDEgPSBjIF4gZDsgICAgIFwKLSAgICB0MiA9IGMgfCBkOyAgICAgXAotICAgIHQzID0gYiBeIHQyOyAgICBcCi0gICAgdDQgPSBhICYgdDM7ICAgIFwKLSAgICBmID0gdDEgXiB0NDsgICAgXAotICAgIHQ2ID0gYSBeIGQ7ICAgICBcCi0gICAgdDcgPSBiIHwgZDsgICAgIFwKLSAgICB0OCA9IHQ2ICYgdDc7ICAgXAotICAgIGggPSB0MyBeIHQ4OyAgICBcCi0gICAgdDEwID0gfmE7ICAgICAgIFwKLSAgICB0MTEgPSBjIF4gaDsgICAgXAotICAgIHQxMiA9IHQxMCB8IHQxMTtcCi0gICAgZSA9IHQzIF4gdDEyOyAgIFwKLSAgICB0MTQgPSBjIHwgdDQ7ICAgXAotICAgIHQxNSA9IHQ3IF4gdDE0OyBcCi0gICAgdDE2ID0gaCB8IHQxMDsgIFwKLSAgICBnID0gdDE1IF4gdDE2Ci0KLS8qIDE2IHRlcm1zICovCi0KLSNkZWZpbmUgc2I1KGEsYixjLGQsZSxmLGcsaCkgICAgXAotICAgIHQxID0gfmE7ICAgICAgICBcCi0gICAgdDIgPSBhIF4gYjsgICAgIFwKLSAgICB0MyA9IGEgXiBkOyAgICAgXAotICAgIHQ0ID0gYyBeIHQxOyAgICBcCi0gICAgdDUgPSB0MiB8IHQzOyAgIFwKLSAgICBlID0gdDQgXiB0NTsgICAgXAotICAgIHQ3ID0gZCAmIGU7ICAgICBcCi0gICAgdDggPSB0MiBeIGU7ICAgIFwKLSAgICB0MTAgPSB0MSB8IGU7ICAgXAotICAgIGYgPSB0NyBeIHQ4OyAgICBcCi0gICAgdDExID0gdDIgfCB0NzsgIFwKLSAgICB0MTIgPSB0MyBeIHQxMDsgXAotICAgIHQxNCA9IGIgXiB0NzsgICBcCi0gICAgZyA9IHQxMSBeIHQxMjsgIFwKLSAgICB0MTUgPSBmICYgdDEyOyAgXAotICAgIGggPSB0MTQgXiB0MTUKLQotLyogMTYgdGVybXMgKi8KLQotI2RlZmluZSBpYjUoYSxiLGMsZCxlLGYsZyxoKSAgICBcCi0gICAgdDEgPSB+YzsgICAgICAgIFwKLSAgICB0MiA9IGIgJiB0MTsgICAgXAotICAgIHQzID0gZCBeIHQyOyAgICBcCi0gICAgdDQgPSBhICYgdDM7ICAgIFwKLSAgICB0NSA9IGIgXiB0MTsgICAgXAotICAgIGggPSB0NCBeIHQ1OyAgICBcCi0gICAgdDcgPSBiIHwgaDsgICAgIFwKLSAgICB0OCA9IGEgJiB0NzsgICAgXAotICAgIGYgPSB0MyBeIHQ4OyAgICBcCi0gICAgdDEwID0gYSB8IGQ7ICAgIFwKLSAgICB0MTEgPSB0MSBeIHQ3OyAgXAotICAgIGUgPSB0MTAgXiB0MTE7ICBcCi0gICAgdDEzID0gYSBeIGM7ICAgIFwKLSAgICB0MTQgPSBiICYgdDEwOyAgXAotICAgIHQxNSA9IHQ0IHwgdDEzOyBcCi0gICAgZyA9IHQxNCBeIHQxNQotCi0vKiAxNSB0ZXJtcyAqLwotCi0jZGVmaW5lIHNiNihhLGIsYyxkLGUsZixnLGgpICAgIFwKLSAgICB0MSA9IH5hOyAgICAgICAgXAotICAgIHQyID0gYSBeIGQ7ICAgICBcCi0gICAgdDMgPSBiIF4gdDI7ICAgIFwKLSAgICB0NCA9IHQxIHwgdDI7ICAgXAotICAgIHQ1ID0gYyBeIHQ0OyAgICBcCi0gICAgZiA9IGIgXiB0NTsgICAgIFwKLSAgICB0MTMgPSB+dDU7ICAgICAgXAotICAgIHQ3ID0gdDIgfCBmOyAgICBcCi0gICAgdDggPSBkIF4gdDc7ICAgIFwKLSAgICB0OSA9IHQ1ICYgdDg7ICAgXAotICAgIGcgPSB0MyBeIHQ5OyAgICBcCi0gICAgdDExID0gdDUgXiB0ODsgIFwKLSAgICBlID0gZyBeIHQxMTsgICAgXAotICAgIHQxNCA9IHQzICYgdDExOyBcCi0gICAgaCA9IHQxMyBeIHQxNAotCi0vKiAxNSB0ZXJtcyAqLwotCi0jZGVmaW5lIGliNihhLGIsYyxkLGUsZixnLGgpICAgIFwKLSAgICB0MSA9IH5hOyAgICAgICAgXAotICAgIHQyID0gYSBeIGI7ICAgICBcCi0gICAgdDMgPSBjIF4gdDI7ICAgIFwKLSAgICB0NCA9IGMgfCB0MTsgICAgXAotICAgIHQ1ID0gZCBeIHQ0OyAgICBcCi0gICAgdDEzID0gZCAmIHQxOyAgIFwKLSAgICBmID0gdDMgXiB0NTsgICAgXAotICAgIHQ3ID0gdDMgJiB0NTsgICBcCi0gICAgdDggPSB0MiBeIHQ3OyAgIFwKLSAgICB0OSA9IGIgfCB0ODsgICAgXAotICAgIGggPSB0NSBeIHQ5OyAgICBcCi0gICAgdDExID0gYiB8IGg7ICAgIFwKLSAgICBlID0gdDggXiB0MTE7ICAgXAotICAgIHQxNCA9IHQzIF4gdDExOyBcCi0gICAgZyA9IHQxMyBeIHQxNAotCi0vKiAxNyB0ZXJtcyAqLwotCi0jZGVmaW5lIHNiNyhhLGIsYyxkLGUsZixnLGgpICAgIFwKLSAgICB0MSA9IH5jOyAgICAgICAgXAotICAgIHQyID0gYiBeIGM7ICAgICBcCi0gICAgdDMgPSBiIHwgdDE7ICAgIFwKLSAgICB0NCA9IGQgXiB0MzsgICAgXAotICAgIHQ1ID0gYSAmIHQ0OyAgICBcCi0gICAgdDcgPSBhIF4gZDsgICAgIFwKLSAgICBoID0gdDIgXiB0NTsgICAgXAotICAgIHQ4ID0gYiBeIHQ1OyAgICBcCi0gICAgdDkgPSB0MiB8IHQ4OyAgIFwKLSAgICB0MTEgPSBkICYgdDM7ICAgXAotICAgIGYgPSB0NyBeIHQ5OyAgICBcCi0gICAgdDEyID0gdDUgXiBmOyAgIFwKLSAgICB0MTUgPSB0MSB8IHQ0OyAgXAotICAgIHQxMyA9IGggJiB0MTI7ICBcCi0gICAgZyA9IHQxMSBeIHQxMzsgIFwKLSAgICB0MTYgPSB0MTIgXiBnOyAgXAotICAgIGUgPSB0MTUgXiB0MTYKLQotLyogMTcgdGVybXMgKi8KLQotI2RlZmluZSBpYjcoYSxiLGMsZCxlLGYsZyxoKSAgICBcCi0gICAgdDEgPSBhICYgYjsgICAgIFwKLSAgICB0MiA9IGEgfCBiOyAgICAgXAotICAgIHQzID0gYyB8IHQxOyAgICBcCi0gICAgdDQgPSBkICYgdDI7ICAgIFwKLSAgICBoID0gdDMgXiB0NDsgICAgXAotICAgIHQ2ID0gfmQ7ICAgICAgICBcCi0gICAgdDcgPSBiIF4gdDQ7ICAgIFwKLSAgICB0OCA9IGggXiB0NjsgICAgXAotICAgIHQxMSA9IGMgXiB0NzsgICBcCi0gICAgdDkgPSB0NyB8IHQ4OyAgIFwKLSAgICBmID0gYSBeIHQ5OyAgICAgXAotICAgIHQxMiA9IGQgfCBmOyAgICBcCi0gICAgZSA9IHQxMSBeIHQxMjsgIFwKLSAgICB0MTQgPSBhICYgaDsgICAgXAotICAgIHQxNSA9IHQzIF4gZjsgICBcCi0gICAgdDE2ID0gZSBeIHQxNDsgIFwKLSAgICBnID0gdDE1IF4gdDE2Ci0KLSNkZWZpbmUga194b3IocixhLGIsYyxkKSAgICAgICAgICAgICBcCi0gICAgYSBePSBza2V5LT5zZXJwZW50LktbNCAqIChyKSArIDBdOyBcCi0gICAgYiBePSBza2V5LT5zZXJwZW50LktbNCAqIChyKSArIDFdOyBcCi0gICAgYyBePSBza2V5LT5zZXJwZW50LktbNCAqIChyKSArIDJdOyBcCi0gICAgZCBePSBza2V5LT5zZXJwZW50LktbNCAqIChyKSArIDNdCi0KLSNkZWZpbmUga19zZXQocixhLGIsYyxkKSAgIFwKLSAgICBhID0gbGtleVs0ICogKHIpICsgIDhdOyAgXAotICAgIGIgPSBsa2V5WzQgKiAocikgKyAgOV07ICBcCi0gICAgYyA9IGxrZXlbNCAqIChyKSArIDEwXTsgIFwKLSAgICBkID0gbGtleVs0ICogKHIpICsgMTFdCi0KLSNkZWZpbmUga19nZXQocixhLGIsYyxkKSAgICAgICAgICAgIFwKLSAgICBza2V5LT5zZXJwZW50LktbNCAqIChyKSArIDBdID0gYTsgXAotICAgIHNrZXktPnNlcnBlbnQuS1s0ICogKHIpICsgMV0gPSBiOyBcCi0gICAgc2tleS0+c2VycGVudC5LWzQgKiAocikgKyAyXSA9IGM7IFwKLSAgICBza2V5LT5zZXJwZW50LktbNCAqIChyKSArIDNdID0gZAotCi0vKiB0aGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uIGFuZCBpdHMgaW52ZXJzZSAgICAqLwotCi0jZGVmaW5lIHJvdChhLGIsYyxkKSAgICBcCi0gICAgYSA9IFJPTChhLCAxMyk7ICAgIFwKLSAgICBjID0gUk9MKGMsIDMpOyAgICAgXAotICAgIGQgXj0gYyBeIChhIDw8IDMpOyAgXAotICAgIGIgXj0gYSBeIGM7ICAgICAgICAgXAotICAgIGQgPSBST0woZCwgNyk7ICAgICBcCi0gICAgYiA9IFJPTChiLCAxKTsgICAgIFwKLSAgICBhIF49IGIgXiBkOyAgICAgICAgIFwKLSAgICBjIF49IGQgXiAoYiA8PCA3KTsgIFwKLSAgICBhID0gUk9MKGEsIDUpOyAgICAgXAotICAgIGMgPSBST0woYywgMjIpCi0KLSNkZWZpbmUgaXJvdChhLGIsYyxkKSAgIFwKLSAgICBjID0gUk9SKGMsIDIyKTsgICAgXAotICAgIGEgPSBST1IoYSwgNSk7ICAgICBcCi0gICAgYyBePSBkIF4gKGIgPDwgNyk7ICBcCi0gICAgYSBePSBiIF4gZDsgICAgICAgICBcCi0gICAgZCA9IFJPUihkLCA3KTsgICAgIFwKLSAgICBiID0gUk9SKGIsIDEpOyAgICAgXAotICAgIGQgXj0gYyBeIChhIDw8IDMpOyAgXAotICAgIGIgXj0gYSBeIGM7ICAgICAgICAgXAotICAgIGMgPSBST1IoYywgMyk7ICAgICBcCi0gICAgYSA9IFJPUihhLCAxMykKLSAgICAKLSNpZmRlZiBDTEVBTl9TVEFDSwotc3RhdGljIGludCBfc2VycGVudF9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQotI2Vsc2UKLWludCBzZXJwZW50X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCi0jZW5kaWYKLXsKLSAgICB1bnNpZ25lZCBsb25nIGxrZXlbMTQwXSwgdCwgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgeDsKLSAgICB1bnNpZ25lZCBsb25nIHQxLHQyLHQzLHQ0LHQ1LHQ2LHQ3LHQ4LHQ5LHQxMCx0MTEsdDEyLHQxMyx0MTQsdDE1LHQxNjsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZlszMl07Ci0KLSAgICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7Ci0KLSAgICAvKiBjaGVjayByb3VuZHMgKi8KLSAgICBpZiAobnVtX3JvdW5kcyAhPSAwICYmIG51bV9yb3VuZHMgIT0gMzIpIHsKLSAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9ST1VORFM7Ci0gICAgfQotCi0gICAgLyogY2hlY2sga2V5bGVuICovCi0gICAgaWYgKGtleWxlbiA8IDE2IHx8IGtleWxlbiA+IDMyKSB7Ci0gICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKLSAgICB9Ci0KLSAgICAvKiBjb3B5IGtleSBhbmQgZXhwYW5kIHRvIDMyYnl0ZXMgYXMgcmVxdWlyZWQgKi8KLSAgICBmb3IgKHggPSAwOyB4IDwgKHVuc2lnbmVkIGxvbmcpa2V5bGVuOyB4KyspIHsKLSAgICAgICAgYnVmW3hdID0ga2V5W3hdOwotICAgIH0KLQotICAgIGlmICh4IDwgMzIpIHsKLSAgICAgICBidWZbeCsrXSA9ICh1bnNpZ25lZCBjaGFyKTB4MDE7Ci0gICAgICAgd2hpbGUgKHggPCAzMikgewotICAgICAgICAgICBidWZbeCsrXSA9ICh1bnNpZ25lZCBjaGFyKTA7Ci0gICAgICAgfQotICAgIH0KLQotICAgIC8qIGNvcHkga2V5IGludG8gMzItYml0IHdvcmRzICovCi0gICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgewotICAgICAgICBMT0FEMzJMKGxrZXlbeF0sICZidWZbeCo0XSk7Ci0gICAgfQotCi0gICAgLyogZXhwYW5kIHVzaW5nIHRoZSBMRlNSIHRvIDE0MCB3b3JkcyAqLwotICAgIGZvciAoeCA9IDA7IHggPCAxMzI7IHgrKykgewotICAgICAgICB0ID0gbGtleVt4XSBeIGxrZXlbeCszXSBeIGxrZXlbeCs1XSBeIGxrZXlbeCs3XSBeIHggXiAweDlFMzc3OUI5VUw7Ci0gICAgICAgIGxrZXlbeCArIDhdID0gUk9MKHQsIDExKTsKLSAgICB9Ci0KLSAgICAvKiBwZXJmb3JtIHRoZSBzdWJzdGl0dWlvbnMgKi8KLSAgICBmb3IgKHggPSAwOyB4IDwgMzI7ICkgewotICAgICAgIGtfc2V0KCB4LGEsYixjLGQpO3NiMyhhLGIsYyxkLGUsZixnLGgpO2tfZ2V0KCB4LGUsZixnLGgpOyArK3g7Ci0gICAgICAga19zZXQoIHgsYSxiLGMsZCk7c2IyKGEsYixjLGQsZSxmLGcsaCk7a19nZXQoIHgsZSxmLGcsaCk7ICsreDsKLSAgICAgICBrX3NldCggeCxhLGIsYyxkKTtzYjEoYSxiLGMsZCxlLGYsZyxoKTtrX2dldCggeCxlLGYsZyxoKTsgKyt4OwotICAgICAgIGtfc2V0KCB4LGEsYixjLGQpO3NiMChhLGIsYyxkLGUsZixnLGgpO2tfZ2V0KCB4LGUsZixnLGgpOyArK3g7Ci0gICAgICAga19zZXQoIHgsYSxiLGMsZCk7c2I3KGEsYixjLGQsZSxmLGcsaCk7a19nZXQoIHgsZSxmLGcsaCk7ICsreDsKLSAgICAgICBrX3NldCggeCxhLGIsYyxkKTtzYjYoYSxiLGMsZCxlLGYsZyxoKTtrX2dldCggeCxlLGYsZyxoKTsgKyt4OwotICAgICAgIGtfc2V0KCB4LGEsYixjLGQpO3NiNShhLGIsYyxkLGUsZixnLGgpO2tfZ2V0KCB4LGUsZixnLGgpOyArK3g7Ci0gICAgICAga19zZXQoIHgsYSxiLGMsZCk7c2I0KGEsYixjLGQsZSxmLGcsaCk7a19nZXQoIHgsZSxmLGcsaCk7ICsreDsKLSAgICB9Ci0gICAga19zZXQoMzIsYSxiLGMsZCk7c2IzKGEsYixjLGQsZSxmLGcsaCk7a19nZXQoMzIsZSxmLGcsaCk7Ci0gICAgcmV0dXJuIENSWVBUX09LOwotfQotCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLWludCBzZXJwZW50X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCi17Ci0gICBpbnQgeDsKLSAgIHggPSBfc2VycGVudF9zZXR1cChrZXksIGtleWxlbiwgbnVtX3JvdW5kcywgc2tleSk7Ci0gICBidXJuX3N0YWNrKHNpemVvZih1bnNpZ25lZCBsb25nKSoxNjYgKyBzaXplb2YodW5zaWduZWQgY2hhcikqMzIpOwotICAgcmV0dXJuIHg7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfc2VycGVudF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpCi0jZWxzZQotdm9pZCBzZXJwZW50X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKLSNlbmRpZgotewotICAgIHVuc2lnbmVkIGxvbmcgYSxiLGMsZCxlLGYsZyxoOwotICAgIHVuc2lnbmVkIGxvbmcgdDEsdDIsdDMsdDQsdDUsdDYsdDcsdDgsdDksdDEwLHQxMSx0MTIsdDEzLHQxNCx0MTUsdDE2OwotCi0gICAgX0FSR0NISyhwdCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgIF9BUkdDSEsoc2tleSAhPSBOVUxMKTsKLQotICAgIExPQUQzMkwoYSwgJnB0WzBdKTtMT0FEMzJMKGIsICZwdFs0XSk7TE9BRDMyTChjLCAmcHRbOF0pO0xPQUQzMkwoZCwgJnB0WzEyXSk7Ci0gICAga194b3IoIDAsYSxiLGMsZCk7IHNiMChhLGIsYyxkLGUsZixnLGgpOyByb3QoZSxmLGcsaCk7Ci0gICAga194b3IoIDEsZSxmLGcsaCk7IHNiMShlLGYsZyxoLGEsYixjLGQpOyByb3QoYSxiLGMsZCk7Ci0gICAga194b3IoIDIsYSxiLGMsZCk7IHNiMihhLGIsYyxkLGUsZixnLGgpOyByb3QoZSxmLGcsaCk7Ci0gICAga194b3IoIDMsZSxmLGcsaCk7IHNiMyhlLGYsZyxoLGEsYixjLGQpOyByb3QoYSxiLGMsZCk7Ci0gICAga194b3IoIDQsYSxiLGMsZCk7IHNiNChhLGIsYyxkLGUsZixnLGgpOyByb3QoZSxmLGcsaCk7Ci0gICAga194b3IoIDUsZSxmLGcsaCk7IHNiNShlLGYsZyxoLGEsYixjLGQpOyByb3QoYSxiLGMsZCk7Ci0gICAga194b3IoIDYsYSxiLGMsZCk7IHNiNihhLGIsYyxkLGUsZixnLGgpOyByb3QoZSxmLGcsaCk7Ci0gICAga194b3IoIDcsZSxmLGcsaCk7IHNiNyhlLGYsZyxoLGEsYixjLGQpOyByb3QoYSxiLGMsZCk7Ci0gICAga194b3IoIDgsYSxiLGMsZCk7IHNiMChhLGIsYyxkLGUsZixnLGgpOyByb3QoZSxmLGcsaCk7Ci0gICAga194b3IoIDksZSxmLGcsaCk7IHNiMShlLGYsZyxoLGEsYixjLGQpOyByb3QoYSxiLGMsZCk7IAotICAgIGtfeG9yKDEwLGEsYixjLGQpOyBzYjIoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDExLGUsZixnLGgpOyBzYjMoZSxmLGcsaCxhLGIsYyxkKTsgcm90KGEsYixjLGQpOwotICAgIGtfeG9yKDEyLGEsYixjLGQpOyBzYjQoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDEzLGUsZixnLGgpOyBzYjUoZSxmLGcsaCxhLGIsYyxkKTsgcm90KGEsYixjLGQpOwotICAgIGtfeG9yKDE0LGEsYixjLGQpOyBzYjYoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDE1LGUsZixnLGgpOyBzYjcoZSxmLGcsaCxhLGIsYyxkKTsgcm90KGEsYixjLGQpOwotICAgIGtfeG9yKDE2LGEsYixjLGQpOyBzYjAoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDE3LGUsZixnLGgpOyBzYjEoZSxmLGcsaCxhLGIsYyxkKTsgcm90KGEsYixjLGQpOwotICAgIGtfeG9yKDE4LGEsYixjLGQpOyBzYjIoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDE5LGUsZixnLGgpOyBzYjMoZSxmLGcsaCxhLGIsYyxkKTsgcm90KGEsYixjLGQpOwotICAgIGtfeG9yKDIwLGEsYixjLGQpOyBzYjQoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDIxLGUsZixnLGgpOyBzYjUoZSxmLGcsaCxhLGIsYyxkKTsgcm90KGEsYixjLGQpOwotICAgIGtfeG9yKDIyLGEsYixjLGQpOyBzYjYoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDIzLGUsZixnLGgpOyBzYjcoZSxmLGcsaCxhLGIsYyxkKTsgcm90KGEsYixjLGQpOwotICAgIGtfeG9yKDI0LGEsYixjLGQpOyBzYjAoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDI1LGUsZixnLGgpOyBzYjEoZSxmLGcsaCxhLGIsYyxkKTsgcm90KGEsYixjLGQpOwotICAgIGtfeG9yKDI2LGEsYixjLGQpOyBzYjIoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDI3LGUsZixnLGgpOyBzYjMoZSxmLGcsaCxhLGIsYyxkKTsgcm90KGEsYixjLGQpOwotICAgIGtfeG9yKDI4LGEsYixjLGQpOyBzYjQoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDI5LGUsZixnLGgpOyBzYjUoZSxmLGcsaCxhLGIsYyxkKTsgcm90KGEsYixjLGQpOwotICAgIGtfeG9yKDMwLGEsYixjLGQpOyBzYjYoYSxiLGMsZCxlLGYsZyxoKTsgcm90KGUsZixnLGgpOwotICAgIGtfeG9yKDMxLGUsZixnLGgpOyBzYjcoZSxmLGcsaCxhLGIsYyxkKTsga194b3IoMzIsYSxiLGMsZCk7Ci0gICAgU1RPUkUzMkwoYSwgJmN0WzBdKTtTVE9SRTMyTChiLCAmY3RbNF0pO1NUT1JFMzJMKGMsICZjdFs4XSk7U1RPUkUzMkwoZCwgJmN0WzEyXSk7Ci19Ci0KLSNpZmRlZiBDTEVBTl9TVEFDSwotdm9pZCBzZXJwZW50X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKLXsKLSAgIF9zZXJwZW50X2VjYl9lbmNyeXB0KHB0LCBjdCwgc2tleSk7Ci0gICBidXJuX3N0YWNrKHNpemVvZih1bnNpZ25lZCBsb25nKSoyNCk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfc2VycGVudF9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpCi0jZWxzZQotdm9pZCBzZXJwZW50X2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSkKLSNlbmRpZgotewotICAgIHVuc2lnbmVkIGxvbmcgYSxiLGMsZCxlLGYsZyxoOwotICAgIHVuc2lnbmVkIGxvbmcgdDEsdDIsdDMsdDQsdDUsdDYsdDcsdDgsdDksdDEwLHQxMSx0MTIsdDEzLHQxNCx0MTUsdDE2OwotCi0gICAgX0FSR0NISyhwdCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgIF9BUkdDSEsoc2tleSAhPSBOVUxMKTsKLQotICAgIExPQUQzMkwoYSwgJmN0WzBdKTtMT0FEMzJMKGIsICZjdFs0XSk7TE9BRDMyTChjLCAmY3RbOF0pO0xPQUQzMkwoZCwgJmN0WzEyXSk7Ci0gICAga194b3IoMzIsYSxiLGMsZCk7IGliNyhhLGIsYyxkLGUsZixnLGgpOyBrX3hvcigzMSxlLGYsZyxoKTsKLSAgICBpcm90KGUsZixnLGgpOyBpYjYoZSxmLGcsaCxhLGIsYyxkKTsga194b3IoMzAsYSxiLGMsZCk7Ci0gICAgaXJvdChhLGIsYyxkKTsgaWI1KGEsYixjLGQsZSxmLGcsaCk7IGtfeG9yKDI5LGUsZixnLGgpOwotICAgIGlyb3QoZSxmLGcsaCk7IGliNChlLGYsZyxoLGEsYixjLGQpOyBrX3hvcigyOCxhLGIsYyxkKTsKLSAgICBpcm90KGEsYixjLGQpOyBpYjMoYSxiLGMsZCxlLGYsZyxoKTsga194b3IoMjcsZSxmLGcsaCk7Ci0gICAgaXJvdChlLGYsZyxoKTsgaWIyKGUsZixnLGgsYSxiLGMsZCk7IGtfeG9yKDI2LGEsYixjLGQpOwotICAgIGlyb3QoYSxiLGMsZCk7IGliMShhLGIsYyxkLGUsZixnLGgpOyBrX3hvcigyNSxlLGYsZyxoKTsKLSAgICBpcm90KGUsZixnLGgpOyBpYjAoZSxmLGcsaCxhLGIsYyxkKTsga194b3IoMjQsYSxiLGMsZCk7Ci0gICAgaXJvdChhLGIsYyxkKTsgaWI3KGEsYixjLGQsZSxmLGcsaCk7IGtfeG9yKDIzLGUsZixnLGgpOwotICAgIGlyb3QoZSxmLGcsaCk7IGliNihlLGYsZyxoLGEsYixjLGQpOyBrX3hvcigyMixhLGIsYyxkKTsKLSAgICBpcm90KGEsYixjLGQpOyBpYjUoYSxiLGMsZCxlLGYsZyxoKTsga194b3IoMjEsZSxmLGcsaCk7Ci0gICAgaXJvdChlLGYsZyxoKTsgaWI0KGUsZixnLGgsYSxiLGMsZCk7IGtfeG9yKDIwLGEsYixjLGQpOwotICAgIGlyb3QoYSxiLGMsZCk7IGliMyhhLGIsYyxkLGUsZixnLGgpOyBrX3hvcigxOSxlLGYsZyxoKTsKLSAgICBpcm90KGUsZixnLGgpOyBpYjIoZSxmLGcsaCxhLGIsYyxkKTsga194b3IoMTgsYSxiLGMsZCk7Ci0gICAgaXJvdChhLGIsYyxkKTsgaWIxKGEsYixjLGQsZSxmLGcsaCk7IGtfeG9yKDE3LGUsZixnLGgpOwotICAgIGlyb3QoZSxmLGcsaCk7IGliMChlLGYsZyxoLGEsYixjLGQpOyBrX3hvcigxNixhLGIsYyxkKTsKLSAgICBpcm90KGEsYixjLGQpOyBpYjcoYSxiLGMsZCxlLGYsZyxoKTsga194b3IoMTUsZSxmLGcsaCk7Ci0gICAgaXJvdChlLGYsZyxoKTsgaWI2KGUsZixnLGgsYSxiLGMsZCk7IGtfeG9yKDE0LGEsYixjLGQpOwotICAgIGlyb3QoYSxiLGMsZCk7IGliNShhLGIsYyxkLGUsZixnLGgpOyBrX3hvcigxMyxlLGYsZyxoKTsKLSAgICBpcm90KGUsZixnLGgpOyBpYjQoZSxmLGcsaCxhLGIsYyxkKTsga194b3IoMTIsYSxiLGMsZCk7Ci0gICAgaXJvdChhLGIsYyxkKTsgaWIzKGEsYixjLGQsZSxmLGcsaCk7IGtfeG9yKDExLGUsZixnLGgpOwotICAgIGlyb3QoZSxmLGcsaCk7IGliMihlLGYsZyxoLGEsYixjLGQpOyBrX3hvcigxMCxhLGIsYyxkKTsKLSAgICBpcm90KGEsYixjLGQpOyBpYjEoYSxiLGMsZCxlLGYsZyxoKTsga194b3IoIDksZSxmLGcsaCk7Ci0gICAgaXJvdChlLGYsZyxoKTsgaWIwKGUsZixnLGgsYSxiLGMsZCk7IGtfeG9yKCA4LGEsYixjLGQpOwotICAgIGlyb3QoYSxiLGMsZCk7IGliNyhhLGIsYyxkLGUsZixnLGgpOyBrX3hvciggNyxlLGYsZyxoKTsKLSAgICBpcm90KGUsZixnLGgpOyBpYjYoZSxmLGcsaCxhLGIsYyxkKTsga194b3IoIDYsYSxiLGMsZCk7Ci0gICAgaXJvdChhLGIsYyxkKTsgaWI1KGEsYixjLGQsZSxmLGcsaCk7IGtfeG9yKCA1LGUsZixnLGgpOwotICAgIGlyb3QoZSxmLGcsaCk7IGliNChlLGYsZyxoLGEsYixjLGQpOyBrX3hvciggNCxhLGIsYyxkKTsKLSAgICBpcm90KGEsYixjLGQpOyBpYjMoYSxiLGMsZCxlLGYsZyxoKTsga194b3IoIDMsZSxmLGcsaCk7Ci0gICAgaXJvdChlLGYsZyxoKTsgaWIyKGUsZixnLGgsYSxiLGMsZCk7IGtfeG9yKCAyLGEsYixjLGQpOwotICAgIGlyb3QoYSxiLGMsZCk7IGliMShhLGIsYyxkLGUsZixnLGgpOyBrX3hvciggMSxlLGYsZyxoKTsKLSAgICBpcm90KGUsZixnLGgpOyBpYjAoZSxmLGcsaCxhLGIsYyxkKTsga194b3IoIDAsYSxiLGMsZCk7Ci0gICAgU1RPUkUzMkwoYSwgJnB0WzBdKTtTVE9SRTMyTChiLCAmcHRbNF0pO1NUT1JFMzJMKGMsICZwdFs4XSk7U1RPUkUzMkwoZCwgJnB0WzEyXSk7Ci19Ci0KLSNpZmRlZiBDTEVBTl9TVEFDSwotdm9pZCBzZXJwZW50X2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSkKLXsKLSAgIF9zZXJwZW50X2VjYl9kZWNyeXB0KGN0LCBwdCwgc2tleSk7Ci0gICBidXJuX3N0YWNrKHNpemVvZih1bnNpZ25lZCBsb25nKSoyNCk7Ci19Ci0jZW5kaWYKLQotaW50IHNlcnBlbnRfdGVzdCh2b2lkKQotewotICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gICAgICAgaW50IGtleWxlbjsKLSAgICAgICB1bnNpZ25lZCBjaGFyIGtleVszMl0sIHB0WzE2XSwgY3RbMTZdOwotICAgfSB0ZXN0c1tdID0gewotICAgewotICAgICAgMTYsCi0gICAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKLSAgICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAotICAgICAgeyAweGRkLCAweGQyLCAweDZiLCAweDk4LCAweGE1LCAweGZmLCAweGQ4LCAweDJjLAotICAgICAgICAweDA1LCAweDM0LCAweDVhLCAweDlkLCAweGFkLCAweGJmLCAweGFmLCAweDQ5IH0KLSAgIH0sCi0gICB7Ci0gICAgICAxNiwKLSAgICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAotICAgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwIH0sCi0gICAgICB7IDB4NGEsIDB4ZTksIDB4YTIsIDB4MGIsIDB4MmIsIDB4MTQsIDB4YTEsIDB4MDIsCi0gICAgICAgIDB4OTAsIDB4Y2IsIDB4YjgsIDB4MjAsIDB4YjcsIDB4ZmYsIDB4YjUsIDB4MTAgfQotICAgfSwKLSAgIHsKLSAgICAgIDI0LAotICAgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCi0gICAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA4IH0sCi0gICAgICB7IDB4ZTEsIDB4MWIsIDB4MDEsIDB4NTIsIDB4NGUsIDB4YTEsIDB4ZjQsIDB4NjUsIAotICAgICAgICAweGEyLCAweGEyLCAweDAwLCAweDQzLCAweGViLCAweDlmLCAweDdlLCAweDhhIH0KLSAgIH0sCi0gICB7Ci0gICAgICAzMiwKLSAgICAgIHsgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAotICAgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCi0gICAgICB7IDB4ZTAsIDB4ODgsIDB4NWQsIDB4NDQsIDB4NjAsIDB4MzcsIDB4MzQsIDB4NjksCi0gICAgICAgIDB4ZDEsIDB4ZmEsIDB4NmMsIDB4MzYsIDB4YTYsIDB4ZTEsIDB4YzUsIDB4MmYgfQotICAgfSwKLSAgIHsKLSAgICAgIDMyLAotICAgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCi0gICAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKLSAgICAgIHsgMHgxNywgMHhjNiwgMHgyNSwgMHg4ZSwgMHg2MCwgMHgwOSwgMHhlMiwgMHg4MiwKLSAgICAgICAgMHg2NiwgMHgxOCwgMHg2OSwgMHhkNSwgMHgyNSwgMHhmNywgMHhkMiwgMHgwNCB9Ci0gICB9LAotICAgewotICAgICAgMzIsCi0gICAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKLSAgICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgCi0gICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKLSAgICAgIHsgMHg5ZiwgMHhlMSwgMHg0MywgMHgyNSwgMHgwZCwgMHgwMCwgMHhlMiwgMHg1NiwgCi0gICAgICAgIDB4OTYsIDB4YjAsIDB4MWUsIDB4MGEsIDB4MmUsIDB4ZDAsIDB4NWQsIDB4YjMgfQotICAgfQotICAgfTsKLQotICAgdW5zaWduZWQgY2hhciBidWZbMl1bMTZdOwotICAgaW50IHgsIGVycjsKLSAgIHN5bW1ldHJpY19rZXkga2V5OwotCi0gICBmb3IgKHggPSAwOyB4IDwgKGludCkoc2l6ZW9mKHRlc3RzKSAvIHNpemVvZih0ZXN0c1swXSkpOyB4KyspIHsKLSAgICAgIC8qIHNldHVwIGtleSAqLwotICAgICAgaWYgKChlcnIgPSBzZXJwZW50X3NldHVwKHRlc3RzW3hdLmtleSwgdGVzdHNbeF0ua2V5bGVuLCAwLCAma2V5KSkhPSBDUllQVF9PSykgewotICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgIH0KLQotICAgICAgLyogZW5jcnlwdCBhbmQgZGVjcnlwdCAqLwotICAgICAgc2VycGVudF9lY2JfZW5jcnlwdCh0ZXN0c1t4XS5wdCwgYnVmWzBdLCAma2V5KTsKLSAgICAgIHNlcnBlbnRfZWNiX2RlY3J5cHQoYnVmWzBdLCBidWZbMV0sICZrZXkpOwotCi0gICAgICAvKiBjb21wYXJlICovCi0gICAgICBpZiAobWVtY21wKGJ1ZlswXSwgdGVzdHNbeF0uY3QsIDE2KSAhPSAwIHx8IG1lbWNtcChidWZbMV0sIHRlc3RzW3hdLnB0LCAxNikgIT0gMCkgewotICAgICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKLSAgICAgIH0KLSAgIH0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IHNlcnBlbnRfa2V5c2l6ZShpbnQgKmRlc2lyZWRfa2V5c2l6ZSkKLXsKLSAgIF9BUkdDSEsoZGVzaXJlZF9rZXlzaXplICE9IE5VTEwpOwotCi0gICBpZiAoKmRlc2lyZWRfa2V5c2l6ZSA8IDE2KQotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKLSAgIGlmICgqZGVzaXJlZF9rZXlzaXplID4gMzIpCi0gICAgICAqZGVzaXJlZF9rZXlzaXplID0gMzI7Ci0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLSNlbmRpZgotCi0KZGlmZiAtLWdpdCBhL3Nwcm5nLmMgYi9zcHJuZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjZlMzM4Li4wMDAwMDAwCi0tLSBhL3Nwcm5nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotLyogQSBzZWN1cmUgUFJORyB1c2luZyB0aGUgUk5HIGZ1bmN0aW9ucy4gIEJhc2ljYWxseSB0aGlzIGlzIGEKLSAqIHdyYXBwZXIgdGhhdCBhbGxvd3MgeW91IHRvIHVzZSBhIHNlY3VyZSBSTkcgYXMgYSBQUk5HCi0gKiBpbiB0aGUgdmFyaW91cyBvdGhlciBmdW5jdGlvbnMuCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBTUFJORwotCi1jb25zdCBzdHJ1Y3QgX3BybmdfZGVzY3JpcHRvciBzcHJuZ19kZXNjID0KLXsKLSAgICAic3BybmciLAotICAgICZzcHJuZ19zdGFydCwKLSAgICAmc3BybmdfYWRkX2VudHJvcHksCi0gICAgJnNwcm5nX3JlYWR5LAotICAgICZzcHJuZ19yZWFkCi19OwotCi1pbnQgc3Bybmdfc3RhcnQocHJuZ19zdGF0ZSAqcHJuZykKLXsKLSAgIHJldHVybiBDUllQVF9PSzsgIAotfQotCi1pbnQgc3BybmdfYWRkX2VudHJvcHkoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgcHJuZ19zdGF0ZSAqcHJuZykKLXsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IHNwcm5nX3JlYWR5KHBybmdfc3RhdGUgKnBybmcpCi17Ci0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgc3BybmdfcmVhZCh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCBwcm5nX3N0YXRlICpwcm5nKQotewotICAgX0FSR0NISyhidWYgIT0gTlVMTCk7Ci0gICByZXR1cm4gcm5nX2dldF9ieXRlcyhidWYsIGxlbiwgTlVMTCk7Ci19Ci0KLSNlbmRpZgotCi0KLSAKZGlmZiAtLWdpdCBhL2Flcy5jIGIvc3JjL2NpcGhlcnMvYWVzL2Flcy5jCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIGFlcy5jCnJlbmFtZSB0byBzcmMvY2lwaGVycy9hZXMvYWVzLmMKaW5kZXggZTBlNGM5Ni4uMGU0OTMzZiAxMDA2NDQKLS0tIGEvYWVzLmMKKysrIGIvc3JjL2NpcGhlcnMvYWVzL2Flcy5jCkBAIC02LDcgKzYsNyBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCiAKIC8qIEFFUyBpbXBsZW1lbnRhdGlvbiBieSBUb20gU3QgRGVuaXMKQEAgLTI1LDggKzI1LDEyIEBACiAgICogQGF1dGhvciBQYXVsbyBCYXJyZXRvIDxwYXVsby5iYXJyZXRvQHRlcnJhLmNvbS5icj4KIC0tLQogICovCisvKioKKyAgQGZpbGUgYWVzLmMKKyAgSW1wbGVtZW50YXRpb24gb2YgQUVTCisqLyAgIAogCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKICNpZmRlZiBSSUpOREFFTAogCkBAIC0zNSwyMyArMzksMjggQEAKICNkZWZpbmUgU0VUVVAgICAgcmlqbmRhZWxfc2V0dXAKICNkZWZpbmUgRUNCX0VOQyAgcmlqbmRhZWxfZWNiX2VuY3J5cHQKICNkZWZpbmUgRUNCX0RFQyAgcmlqbmRhZWxfZWNiX2RlY3J5cHQKKyNkZWZpbmUgRUNCX0RPTkUgcmlqbmRhZWxfZG9uZQogI2RlZmluZSBFQ0JfVEVTVCByaWpuZGFlbF90ZXN0CiAjZGVmaW5lIEVDQl9LUyAgIHJpam5kYWVsX2tleXNpemUKIAotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciByaWpuZGFlbF9kZXNjID0KKyNpZiAwCitjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHJpam5kYWVsX2Rlc2MgPQogewogICAgICJyaWpuZGFlbCIsCiAgICAgNiwKICAgICAxNiwgMzIsIDE2LCAxMCwKLSAgICBTRVRVUCwgRUNCX0VOQywgRUNCX0RFQywgRUNCX1RFU1QsIEVDQl9LUworICAgIFNFVFVQLCBFQ0JfRU5DLCBFQ0JfREVDLCBFQ0JfVEVTVCwgRUNCX0RPTkUsIEVDQl9LUywKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCiB9OworI2VuZGlmCiAKLWNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgYWVzX2Rlc2MgPQorY29uc3Qgc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvciBhZXNfZGVzYyA9CiB7CiAgICAgImFlcyIsCiAgICAgNiwKICAgICAxNiwgMzIsIDE2LCAxMCwKLSAgICBTRVRVUCwgRUNCX0VOQywgRUNCX0RFQywgRUNCX1RFU1QsIEVDQl9LUworICAgIFNFVFVQLCBFQ0JfRU5DLCBFQ0JfREVDLCBFQ0JfVEVTVCwgRUNCX0RPTkUsIEVDQl9LUywKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCiB9OwogCiAjZWxzZQpAQCAtNTksMjEgKzY4LDI0IEBACiAjZGVmaW5lIFNFVFVQICAgIHJpam5kYWVsX2VuY19zZXR1cAogI2RlZmluZSBFQ0JfRU5DICByaWpuZGFlbF9lbmNfZWNiX2VuY3J5cHQKICNkZWZpbmUgRUNCX0tTICAgcmlqbmRhZWxfZW5jX2tleXNpemUKKyNkZWZpbmUgRUNCX0RPTkUgcmlqbmRhZWxfZW5jX2RvbmUKIAotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciByaWpuZGFlbF9lbmNfZGVzYyA9Citjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHJpam5kYWVsX2VuY19kZXNjID0KIHsKICAgICAicmlqbmRhZWwiLAogICAgIDYsCiAgICAgMTYsIDMyLCAxNiwgMTAsCi0gICAgU0VUVVAsIEVDQl9FTkMsIE5VTEwsIE5VTEwsIEVDQl9LUworICAgIFNFVFVQLCBFQ0JfRU5DLCBOVUxMLCBOVUxMLCBFQ0JfRE9ORSwgRUNCX0tTLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKIH07CiAKLWNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgYWVzX2VuY19kZXNjID0KK2NvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgYWVzX2VuY19kZXNjID0KIHsKICAgICAiYWVzIiwKICAgICA2LAogICAgIDE2LCAzMiwgMTYsIDEwLAotICAgIFNFVFVQLCBFQ0JfRU5DLCBOVUxMLCBOVUxMLCBFQ0JfS1MKKyAgICBTRVRVUCwgRUNCX0VOQywgTlVMTCwgTlVMTCwgRUNCX0RPTkUsIEVDQl9LUywKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCiB9OwogCiAjZW5kaWYKQEAgLTg5LDcgKzEwMSw3IEBACiB9CiAKICNpZm5kZWYgRU5DUllQVF9PTkxZCi0KKyNpZmRlZiBMVENfU01BTExfQ09ERQogc3RhdGljIHVsb25nMzIgc2V0dXBfbWl4Mih1bG9uZzMyIHRlbXApCiB7CiAgICByZXR1cm4gVGQwKDI1NSAmIFRlNFtieXRlKHRlbXAsIDMpXSkgXgpAQCAtOTcsMjQgKzEwOSwzMiBAQAogICAgICAgICAgIFRkMigyNTUgJiBUZTRbYnl0ZSh0ZW1wLCAxKV0pIF4KICAgICAgICAgICBUZDMoMjU1ICYgVGU0W2J5dGUodGVtcCwgMCldKTsKIH0KLQorI2VuZGlmCiAjZW5kaWYKIAotaW50IFNFVFVQKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IHJvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSkKKyAvKioKKyAgICBJbml0aWFsaXplIHRoZSBBRVMgKFJpam5kYWVsKSBibG9jayBjaXBoZXIKKyAgICBAcGFyYW0ga2V5IFRoZSBzeW1tZXRyaWMga2V5IHlvdSB3aXNoIHRvIHBhc3MKKyAgICBAcGFyYW0ga2V5bGVuIFRoZSBrZXkgbGVuZ3RoIGluIGJ5dGVzCisgICAgQHBhcmFtIG51bV9yb3VuZHMgVGhlIG51bWJlciBvZiByb3VuZHMgZGVzaXJlZCAoMCBmb3IgZGVmYXVsdCkKKyAgICBAcGFyYW0gc2tleSBUaGUga2V5IGluIGFzIHNjaGVkdWxlZCBieSB0aGlzIGZ1bmN0aW9uLgorICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICovCitpbnQgU0VUVVAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKICAgICBpbnQgaSwgajsKICAgICB1bG9uZzMyIHRlbXAsICpyazsKICNpZm5kZWYgRU5DUllQVF9PTkxZCiAgICAgdWxvbmczMiAqcnJrOwogI2VuZGlmICAgIAotICAgIF9BUkdDSEsoa2V5ICAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7Ci0gICAgCisgICAgTFRDX0FSR0NISyhrZXkgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKKyAgCiAgICAgaWYgKGtleWxlbiAhPSAxNiAmJiBrZXlsZW4gIT0gMjQgJiYga2V5bGVuICE9IDMyKSB7CiAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKICAgICB9CiAgICAgCi0gICAgaWYgKHJvdW5kcyAhPSAwICYmIHJvdW5kcyAhPSAoMTAgKyAoKGtleWxlbi84KS0yKSoyKSkgeworICAgIGlmIChudW1fcm91bmRzICE9IDAgJiYgbnVtX3JvdW5kcyAhPSAoMTAgKyAoKGtleWxlbi84KS0yKSoyKSkgewogICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1JPVU5EUzsKICAgICB9CiAgICAgCkBAIC0xODEsNyArMjAxLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRlbXAgPSBya1sxMV07Ci0gICAgICAgICAgICBya1sxMl0gPSBya1sgNF0gXiBzZXR1cF9taXgoUk9SKHRlbXAsIDgpKTsKKyAgICAgICAgICAgIHJrWzEyXSA9IHJrWyA0XSBeIHNldHVwX21peChST1JjKHRlbXAsIDgpKTsKICAgICAgICAgICAgIHJrWzEzXSA9IHJrWyA1XSBeIHJrWzEyXTsKICAgICAgICAgICAgIHJrWzE0XSA9IHJrWyA2XSBeIHJrWzEzXTsKICAgICAgICAgICAgIHJrWzE1XSA9IHJrWyA3XSBeIHJrWzE0XTsKQEAgLTE4OSw3ICsyMDksNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAvKiB0aGlzIGNhbid0IGhhcHBlbiAqLwotICAgICAgIGogPSA0OworICAgICAgIHJldHVybiBDUllQVF9FUlJPUjsKICAgICB9CiAKICNpZm5kZWYgRU5DUllQVF9PTkxZICAgIApAQCAtMjA4LDcgKzIyOCw3IEBACiAgICAgZm9yIChpID0gMTsgaSA8IHNrZXktPnJpam5kYWVsLk5yOyBpKyspIHsKICAgICAgICAgcnJrIC09IDQ7CiAgICAgICAgIHJrICArPSA0OwotICAgICNpZmRlZiBTTUFMTF9DT0RFICAgICAgICAKKyAgICAjaWZkZWYgTFRDX1NNQUxMX0NPREUgICAgICAgIAogICAgICAgICB0ZW1wID0gcnJrWzBdOwogICAgICAgICBya1swXSA9IHNldHVwX21peDIodGVtcCk7CiAgICAgICAgIHRlbXAgPSBycmtbMV07CkBAIC0yNTgsNyArMjc4LDEzIEBACiAgICAgcmV0dXJuIENSWVBUX09LOyAgIAogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKy8qKgorICBFbmNyeXB0cyBhIGJsb2NrIG9mIHRleHQgd2l0aCBBRVMKKyAgQHBhcmFtIHB0IFRoZSBpbnB1dCBwbGFpbnRleHQgKDE2IGJ5dGVzKQorICBAcGFyYW0gY3QgVGhlIG91dHB1dCBjaXBoZXJ0ZXh0ICgxNiBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQKKyovCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiBzdGF0aWMgdm9pZCBfcmlqbmRhZWxfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KSAKICNlbHNlCiB2b2lkIEVDQl9FTkMoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQpAQCAtMjY3LDkgKzI5Myw5IEBACiAgICAgdWxvbmczMiBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDMsICpyazsKICAgICBpbnQgTnIsIHI7CiAgICAKLSAgICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotICAgIF9BUkdDSEsoY3QgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsocHQgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhjdCAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CiAgICAgCiAgICAgTnIgPSBza2V5LT5yaWpuZGFlbC5OcjsKICAgICByayA9IHNrZXktPnJpam5kYWVsLmVLOwpAQCAtMjg0LDcgKzMxMCw3IEBACiAgICAgTE9BRDMySChzMywgcHQgICsgMTIpOyBzMyBePSBya1szXTsKIAogCi0jaWZkZWYgU01BTExfQ09ERQorI2lmZGVmIExUQ19TTUFMTF9DT0RFCiAKICAgICBmb3IgKHIgPSAwOyA7IHIrKykgewogICAgICAgICByayArPSA0OwpAQCAtNDE4LDcgKzQ0NCw3IEBACiAgICAgU1RPUkUzMkgoczMsIGN0KzEyKTsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiB2b2lkIEVDQl9FTkMoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KSAKIHsKICAgIF9yaWpuZGFlbF9lY2JfZW5jcnlwdChwdCwgY3QsIHNrZXkpOwpAQCAtNDI4LDcgKzQ1NCwxMyBAQAogCiAjaWZuZGVmIEVOQ1JZUFRfT05MWSAKIAotI2lmZGVmIENMRUFOX1NUQUNLCisvKioKKyAgRGVjcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggQUVTCisgIEBwYXJhbSBjdCBUaGUgaW5wdXQgY2lwaGVydGV4dCAoMTYgYnl0ZXMpCisgIEBwYXJhbSBwdCBUaGUgb3V0cHV0IHBsYWludGV4dCAoMTYgYnl0ZXMpCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkIAorKi8KKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKIHN0YXRpYyB2b2lkIF9yaWpuZGFlbF9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpIAogI2Vsc2UKIHZvaWQgRUNCX0RFQyhjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpCkBAIC00MzcsOSArNDY5LDkgQEAKICAgICB1bG9uZzMyIHMwLCBzMSwgczIsIHMzLCB0MCwgdDEsIHQyLCB0MywgKnJrOwogICAgIGludCBOciwgcjsKIAotICAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhwdCAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKGN0ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKICAgICAKICAgICBOciA9IHNrZXktPnJpam5kYWVsLk5yOwogICAgIHJrID0gc2tleS0+cmlqbmRhZWwuZEs7CkBAIC00NTMsNyArNDg1LDcgQEAKICAgICBMT0FEMzJIKHMyLCBjdCAgKyAgOCk7IHMyIF49IHJrWzJdOwogICAgIExPQUQzMkgoczMsIGN0ICArIDEyKTsgczMgXj0gcmtbM107CiAKLSNpZmRlZiBTTUFMTF9DT0RFCisjaWZkZWYgTFRDX1NNQUxMX0NPREUKICAgICBmb3IgKHIgPSAwOyA7IHIrKykgewogICAgICAgICByayArPSA0OwogICAgICAgICB0MCA9CkBAIC01ODgsNyArNjIwLDcgQEAKIH0KIAogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKIHZvaWQgRUNCX0RFQyhjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpIAogewogICAgX3Jpam5kYWVsX2VjYl9kZWNyeXB0KGN0LCBwdCwgc2tleSk7CkBAIC01OTYsNiArNjI4LDEwIEBACiB9CiAjZW5kaWYKIAorLyoqCisgIFBlcmZvcm1zIGEgc2VsZi10ZXN0IG9mIHRoZSBBRVMgYmxvY2sgY2lwaGVyCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgZnVuY3Rpb25hbCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdCBoYXMgYmVlbiBkaXNhYmxlZAorKi8KIGludCBFQ0JfVEVTVCh2b2lkKQogewogICNpZm5kZWYgTFRDX1RFU1QKQEAgLTY3OSwyMyArNzE1LDQxIEBACiAKICNlbmRpZiAvKiBFTkNSWVBUX09OTFkgKi8KIAotaW50IEVDQl9LUyhpbnQgKmRlc2lyZWRfa2V5c2l6ZSkKLXsKLSAgIF9BUkdDSEsoZGVzaXJlZF9rZXlzaXplICE9IE5VTEwpOwogCi0gICBpZiAoKmRlc2lyZWRfa2V5c2l6ZSA8IDE2KQorLyoqIFRlcm1pbmF0ZSB0aGUgY29udGV4dCAKKyAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5CisqLwordm9pZCBFQ0JfRE9ORShzeW1tZXRyaWNfa2V5ICpza2V5KQoreworfQorCisKKy8qKgorICBHZXRzIHN1aXRhYmxlIGtleSBzaXplCisgIEBwYXJhbSBrZXlzaXplIFtpbi9vdXRdIFRoZSBsZW5ndGggb2YgdGhlIHJlY29tbWVuZGVkIGtleSAoaW4gYnl0ZXMpLiAgVGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIHRoZSBzdWl0YWJsZSBzaXplIGJhY2sgaW4gdGhpcyB2YXJpYWJsZS4KKyAgQHJldHVybiBDUllQVF9PSyBpZiB0aGUgaW5wdXQga2V5IHNpemUgaXMgYWNjZXB0YWJsZS4KKyovCitpbnQgRUNCX0tTKGludCAqa2V5c2l6ZSkKK3sKKyAgIExUQ19BUkdDSEsoa2V5c2l6ZSAhPSBOVUxMKTsKKworICAgaWYgKCprZXlzaXplIDwgMTYpCiAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOwotICAgaWYgKCpkZXNpcmVkX2tleXNpemUgPCAyNCkgewotICAgICAgKmRlc2lyZWRfa2V5c2l6ZSA9IDE2OworICAgaWYgKCprZXlzaXplIDwgMjQpIHsKKyAgICAgICprZXlzaXplID0gMTY7CiAgICAgICByZXR1cm4gQ1JZUFRfT0s7Ci0gICB9IGVsc2UgaWYgKCpkZXNpcmVkX2tleXNpemUgPCAzMikgewotICAgICAgKmRlc2lyZWRfa2V5c2l6ZSA9IDI0OworICAgfSBlbHNlIGlmICgqa2V5c2l6ZSA8IDMyKSB7CisgICAgICAqa2V5c2l6ZSA9IDI0OwogICAgICAgcmV0dXJuIENSWVBUX09LOwogICAgfSBlbHNlIHsKLSAgICAgICpkZXNpcmVkX2tleXNpemUgPSAzMjsKKyAgICAgICprZXlzaXplID0gMzI7CiAgICAgICByZXR1cm4gQ1JZUFRfT0s7CiAgICB9CiB9CiAKICNlbmRpZgogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9jaXBoZXJzL2Flcy9hZXMuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS44ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL2Flc190YWIuYyBiL3NyYy9jaXBoZXJzL2Flcy9hZXNfdGFiLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYWVzX3RhYi5jCnJlbmFtZSB0byBzcmMvY2lwaGVycy9hZXMvYWVzX3RhYi5jCmluZGV4IGNiNDUwYTcuLjMxZDI3NmUgMTAwNjQ0Ci0tLSBhL2Flc190YWIuYworKysgYi9zcmMvY2lwaGVycy9hZXMvYWVzX3RhYi5jCkBAIC02LDcgKzYsNyBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCiAvKiBUaGUgcHJlY29tcHV0ZWQgdGFibGVzIGZvciBBRVMgKi8KIC8qCkBAIC0yMyw2ICsyMywxMCBAQAogVGQ0W3hdID0gU2lbeF0uWzAxLCAwMSwgMDEsIDAxXTsKICovCiAKKy8qKgorICBAZmlsZSBhZXNfdGFiLmMKKyAgQUVTIHRhYmxlcworKi8gIAogc3RhdGljIGNvbnN0IHVsb25nMzIgVEUwWzI1Nl0gPSB7CiAgICAgMHhjNjYzNjNhNVVMLCAweGY4N2M3Yzg0VUwsIDB4ZWU3Nzc3OTlVTCwgMHhmNjdiN2I4ZFVMLAogICAgIDB4ZmZmMmYyMGRVTCwgMHhkNjZiNmJiZFVMLCAweGRlNmY2ZmIxVUwsIDB4OTFjNWM1NTRVTCwKQEAgLTI5NSwxNyArMjk5LDE3IEBACiAKICNlbmRpZiAvKiBFTkNSWVBUX09OTFkgKi8KIAotI2lmZGVmIFNNQUxMX0NPREUKKyNpZmRlZiBMVENfU01BTExfQ09ERQogCiAjZGVmaW5lIFRlMCh4KSBURTBbeF0KLSNkZWZpbmUgVGUxKHgpIFJPUihURTBbeF0sIDgpCi0jZGVmaW5lIFRlMih4KSBST1IoVEUwW3hdLCAxNikKLSNkZWZpbmUgVGUzKHgpIFJPUihURTBbeF0sIDI0KQorI2RlZmluZSBUZTEoeCkgUk9SYyhURTBbeF0sIDgpCisjZGVmaW5lIFRlMih4KSBST1JjKFRFMFt4XSwgMTYpCisjZGVmaW5lIFRlMyh4KSBST1JjKFRFMFt4XSwgMjQpCiAKICNkZWZpbmUgVGQwKHgpIFREMFt4XQotI2RlZmluZSBUZDEoeCkgUk9SKFREMFt4XSwgOCkKLSNkZWZpbmUgVGQyKHgpIFJPUihURDBbeF0sIDE2KQotI2RlZmluZSBUZDMoeCkgUk9SKFREMFt4XSwgMjQpCisjZGVmaW5lIFRkMSh4KSBST1JjKFREMFt4XSwgOCkKKyNkZWZpbmUgVGQyKHgpIFJPUmMoVEQwW3hdLCAxNikKKyNkZWZpbmUgVGQzKHgpIFJPUmMoVEQwW3hdLCAyNCkKIAogI2RlZmluZSBUZTRfMCAweDAwMDAwMEZGICYgVGU0CiAjZGVmaW5lIFRlNF8xIDB4MDAwMEZGMDAgJiBUZTQKQEAgLTEwMTQsMyArMTAxOCw3IEBACiAgICAgMHgxMDAwMDAwMFVMLCAweDIwMDAwMDAwVUwsIDB4NDAwMDAwMDBVTCwgMHg4MDAwMDAwMFVMLAogICAgIDB4MUIwMDAwMDBVTCwgMHgzNjAwMDAwMFVMLCAvKiBmb3IgMTI4LWJpdCBibG9ja3MsIFJpam5kYWVsIG5ldmVyIHVzZXMgbW9yZSB0aGFuIDEwIHJjb24gdmFsdWVzICovCiB9OworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvY2lwaGVycy9hZXMvYWVzX3RhYi5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NpcGhlcnMvYW51YmlzLmMgYi9zcmMvY2lwaGVycy9hbnViaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTFlYWMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NpcGhlcnMvYW51YmlzLmMKQEAgLTAsMCArMSwxNTU0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzDQorICoNCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMNCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4NCisgKg0KKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzDQorICogZ3VhcmFudGVlIGl0IHdvcmtzLg0KKyAqDQorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZw0KKyAqLw0KKw0KKy8qKg0KKyAgQGZpbGUgYW51YmlzLmMNCisgIEFudWJpcyBpbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGZyb20gcHVibGljIGRvbWFpbiBzb3VyY2UNCisgIEF1dGhvcnM6IFBhdWxvIFMuTC5NLiBCYXJyZXRvIGFuZCBWaW5jZW50IFJpam1lbi4NCisqLw0KKw0KKyNpbmNsdWRlICJ0b21jcnlwdC5oIg0KKw0KKyNpZmRlZiBBTlVCSVMNCisNCitjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIGFudWJpc19kZXNjID0gew0KKyAgICJhbnViaXMiLA0KKyAgIDE5LA0KKyAgIDE2LCA0MCwgMTYsIDEyLA0KKyAgICZhbnViaXNfc2V0dXAsDQorICAgJmFudWJpc19lY2JfZW5jcnlwdCwNCisgICAmYW51YmlzX2VjYl9kZWNyeXB0LA0KKyAgICZhbnViaXNfdGVzdCwNCisgICAmYW51YmlzX2RvbmUsDQorICAgJmFudWJpc19rZXlzaXplLA0KKyAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwNCit9Ow0KKw0KKyNkZWZpbmUgTUlOX04gICAgICAgICAgIDQgDQorI2RlZmluZSBNQVhfTiAgICAgICAgICAgMTAgDQorI2RlZmluZSBNSU5fUk9VTkRTICAgICAgKDggKyBNSU5fTikgDQorI2RlZmluZSBNQVhfUk9VTkRTICAgICAgKDggKyBNQVhfTikgDQorI2RlZmluZSBNSU5fS0VZU0laRUIgICAgKDQqTUlOX04pIA0KKyNkZWZpbmUgTUFYX0tFWVNJWkVCICAgICg0Kk1BWF9OKSANCisjZGVmaW5lIEJMT0NLU0laRSAgICAgICAxMjggDQorI2RlZmluZSBCTE9DS1NJWkVCICAgICAgKEJMT0NLU0laRS84KSANCisNCisNCisvKg0KKyAqIFRob3VnaCBBbnViaXMgaXMgZW5kaWFubmVzcy1uZXV0cmFsLCB0aGUgZW5jcnlwdGlvbiB0YWJsZXMgYXJlIGxpc3RlZA0KKyAqIGluIEJJRy1FTkRJQU4gZm9ybWF0LCB3aGljaCBpcyBhZG9wdGVkIHRocm91Z2hvdXQgdGhpcyBpbXBsZW1lbnRhdGlvbg0KKyAqIChidXQgbGl0dGxlLWVuZGlhbiBub3RhdGlvbiB3b3VsZCBiZSBlcXVhbGx5IHN1aXRhYmxlIGlmIGNvbnNpc3RlbnRseQ0KKyAqIGVtcGxveWVkKS4NCisgKi8NCisjaWYgZGVmaW5lZChBTlVCSVNfVFdFQUspDQorDQorc3RhdGljIGNvbnN0IHVsb25nMzIgVDBbMjU2XSA9IHsNCisgICAgMHhiYTY5ZDJiYlUsIDB4NTRhODRkZTVVLCAweDJmNWViY2UyVSwgMHg3NGU4Y2QyNVUsDQorICAgIDB4NTNhNjUxZjdVLCAweGQzYmI2YmQwVSwgMHhkMmI5NmZkNlUsIDB4NGQ5YTI5YjNVLA0KKyAgICAweDUwYTA1ZGZkVSwgMHhhYzQ1OGFjZlUsIDB4OGQwNzBlMDlVLCAweGJmNjNjNmE1VSwNCisgICAgMHg3MGUwZGQzZFUsIDB4NTJhNDU1ZjFVLCAweDlhMjk1MjdiVSwgMHg0Yzk4MmRiNVUsDQorICAgIDB4ZWFjOThmNDZVLCAweGQ1Yjc3M2M0VSwgMHg5NzMzNjY1NVUsIDB4ZDFiZjYzZGNVLA0KKyAgICAweDMzNjZjY2FhVSwgMHg1MWEyNTlmYlUsIDB4NWJiNjcxYzdVLCAweGE2NTFhMmYzVSwNCisgICAgMHhkZWExNWZmZVUsIDB4NDg5MDNkYWRVLCAweGE4NGQ5YWQ3VSwgMHg5OTJmNWU3MVUsDQorICAgIDB4ZGJhYjRiZTBVLCAweDMyNjRjOGFjVSwgMHhiNzczZTY5NVUsIDB4ZmNlNWQ3MzJVLA0KKyAgICAweGUzZGJhYjcwVSwgMHg5ZTIxNDI2M1UsIDB4OTEzZjdlNDFVLCAweDliMmI1NjdkVSwNCisgICAgMHhlMmQ5YWY3NlUsIDB4YmI2YmQ2YmRVLCAweDQxODIxOTliVSwgMHg2ZWRjYTU3OVUsDQorICAgIDB4YTU1N2FlZjlVLCAweGNiOGIwYjgwVSwgMHg2YmQ2YjE2N1UsIDB4OTUzNzZlNTlVLA0KKyAgICAweGExNWZiZWUxVSwgMHhmM2ZiZWIxMFUsIDB4YjE3ZmZlODFVLCAweDAyMDQwODBjVSwNCisgICAgMHhjYzg1MTc5MlUsIDB4YzQ5NTM3YTJVLCAweDFkM2E3NDRlVSwgMHgxNDI4NTA3OFUsDQorICAgIDB4YzM5YjJiYjBVLCAweDYzYzY5MTU3VSwgMHhkYWE5NGZlNlUsIDB4NWRiYTY5ZDNVLA0KKyAgICAweDVmYmU2MWRmVSwgMHhkY2E1NTdmMlUsIDB4N2RmYWU5MTNVLCAweGNkODcxMzk0VSwNCisgICAgMHg3ZmZlZTExZlUsIDB4NWFiNDc1YzFVLCAweDZjZDhhZDc1VSwgMHg1Y2I4NmRkNVUsDQorICAgIDB4ZjdmM2ZiMDhVLCAweDI2NGM5OGQ0VSwgMHhmZmUzZGIzOFUsIDB4ZWRjNzkzNTRVLA0KKyAgICAweGU4Y2Q4NzRhVSwgMHg5ZDI3NGU2OVUsIDB4NmZkZWExN2ZVLCAweDhlMDEwMjAzVSwNCisgICAgMHgxOTMyNjQ1NlUsIDB4YTA1ZGJhZTdVLCAweGYwZmRlNzFhVSwgMHg4OTBmMWUxMVUsDQorICAgIDB4MGYxZTNjMjJVLCAweDA3MGUxYzEyVSwgMHhhZjQzODZjNVUsIDB4ZmJlYmNiMjBVLA0KKyAgICAweDA4MTAyMDMwVSwgMHgxNTJhNTQ3ZVUsIDB4MGQxYTM0MmVVLCAweDA0MDgxMDE4VSwNCisgICAgMHgwMTAyMDQwNlUsIDB4NjRjODhkNDVVLCAweGRmYTM1YmY4VSwgMHg3NmVjYzUyOVUsDQorICAgIDB4NzlmMmY5MGJVLCAweGRkYTc1M2Y0VSwgMHgzZDdhZjQ4ZVUsIDB4MTYyYzU4NzRVLA0KKyAgICAweDNmN2VmYzgyVSwgMHgzNzZlZGNiMlUsIDB4NmRkYWE5NzNVLCAweDM4NzBlMDkwVSwNCisgICAgMHhiOTZmZGViMVUsIDB4NzNlNmQxMzdVLCAweGU5Y2Y4MzRjVSwgMHgzNTZhZDRiZVUsDQorICAgIDB4NTVhYTQ5ZTNVLCAweDcxZTJkOTNiVSwgMHg3YmY2ZjEwN1UsIDB4OGMwNTBhMGZVLA0KKyAgICAweDcyZTRkNTMxVSwgMHg4ODBkMWExN1UsIDB4ZjZmMWZmMGVVLCAweDJhNTRhOGZjVSwNCisgICAgMHgzZTdjZjg4NFUsIDB4NWViYzY1ZDlVLCAweDI3NGU5Y2QyVSwgMHg0NjhjMDU4OVUsDQorICAgIDB4MGMxODMwMjhVLCAweDY1Y2E4OTQzVSwgMHg2OGQwYmQ2ZFUsIDB4NjFjMjk5NWJVLA0KKyAgICAweDAzMDYwYzBhVSwgMHhjMTlmMjNiY1UsIDB4NTdhZTQxZWZVLCAweGQ2YjE3ZmNlVSwNCisgICAgMHhkOWFmNDNlY1UsIDB4NThiMDdkY2RVLCAweGQ4YWQ0N2VhVSwgMHg2NmNjODU0OVUsDQorICAgIDB4ZDdiMzdiYzhVLCAweDNhNzRlODljVSwgMHhjODhkMDc4YVUsIDB4M2M3OGYwODhVLA0KKyAgICAweGZhZTljZjI2VSwgMHg5NjMxNjI1M1UsIDB4YTc1M2E2ZjVVLCAweDk4MmQ1YTc3VSwNCisgICAgMHhlY2M1OTc1MlUsIDB4Yjg2ZGRhYjdVLCAweGM3OTMzYmE4VSwgMHhhZTQxODJjM1UsDQorICAgIDB4NjlkMmI5NmJVLCAweDRiOTYzMWE3VSwgMHhhYjRiOTZkZFUsIDB4YTk0ZjllZDFVLA0KKyAgICAweDY3Y2U4MTRmVSwgMHgwYTE0MjgzY1UsIDB4NDc4ZTAxOGZVLCAweGYyZjllZjE2VSwNCisgICAgMHhiNTc3ZWU5OVUsIDB4MjI0NDg4Y2NVLCAweGU1ZDdiMzY0VSwgMHhlZWMxOWY1ZVUsDQorICAgIDB4YmU2MWMyYTNVLCAweDJiNTZhY2ZhVSwgMHg4MTFmM2UyMVUsIDB4MTIyNDQ4NmNVLA0KKyAgICAweDgzMWIzNjJkVSwgMHgxYjM2NmM1YVUsIDB4MGUxYzM4MjRVLCAweDIzNDY4Y2NhVSwNCisgICAgMHhmNWY3ZjMwNFUsIDB4NDU4YTA5ODNVLCAweDIxNDI4NGM2VSwgMHhjZTgxMWY5ZVUsDQorICAgIDB4NDk5MjM5YWJVLCAweDJjNThiMGU4VSwgMHhmOWVmYzMyY1UsIDB4ZTZkMWJmNmVVLA0KKyAgICAweGI2NzFlMjkzVSwgMHgyODUwYTBmMFUsIDB4MTcyZTVjNzJVLCAweDgyMTkzMjJiVSwNCisgICAgMHgxYTM0Njg1Y1UsIDB4OGIwYjE2MWRVLCAweGZlZTFkZjNlVSwgMHg4YTA5MTIxYlUsDQorICAgIDB4MDkxMjI0MzZVLCAweGM5OGYwMzhjVSwgMHg4NzEzMjYzNVUsIDB4NGU5YzI1YjlVLA0KKyAgICAweGUxZGZhMzdjVSwgMHgyZTVjYjhlNFUsIDB4ZTRkNWI3NjJVLCAweGUwZGRhNzdhVSwNCisgICAgMHhlYmNiOGI0MFUsIDB4OTAzZDdhNDdVLCAweGE0NTVhYWZmVSwgMHgxZTNjNzg0NFUsDQorICAgIDB4ODUxNzJlMzlVLCAweDYwYzA5ZDVkVSwgMHgwMDAwMDAwMFUsIDB4MjU0YTk0ZGVVLA0KKyAgICAweGY0ZjVmNzAyVSwgMHhmMWZmZTMxY1UsIDB4OTQzNTZhNWZVLCAweDBiMTYyYzNhVSwNCisgICAgMHhlN2QzYmI2OFUsIDB4NzVlYWM5MjNVLCAweGVmYzM5YjU4VSwgMHgzNDY4ZDBiOFUsDQorICAgIDB4MzE2MmM0YTZVLCAweGQ0YjU3N2MyVSwgMHhkMGJkNjdkYVUsIDB4ODYxMTIyMzNVLA0KKyAgICAweDdlZmNlNTE5VSwgMHhhZDQ3OGVjOVUsIDB4ZmRlN2QzMzRVLCAweDI5NTJhNGY2VSwNCisgICAgMHgzMDYwYzBhMFUsIDB4M2I3NmVjOWFVLCAweDlmMjM0NjY1VSwgMHhmOGVkYzcyYVUsDQorICAgIDB4YzY5MTNmYWVVLCAweDEzMjY0YzZhVSwgMHgwNjBjMTgxNFUsIDB4MDUwYTE0MWVVLA0KKyAgICAweGM1OTczM2E0VSwgMHgxMTIyNDQ2NlUsIDB4NzdlZWMxMmZVLCAweDdjZjhlZDE1VSwNCisgICAgMHg3YWY0ZjUwMVUsIDB4NzhmMGZkMGRVLCAweDM2NmNkOGI0VSwgMHgxYzM4NzA0OFUsDQorICAgIDB4Mzk3MmU0OTZVLCAweDU5YjI3OWNiVSwgMHgxODMwNjA1MFUsIDB4NTZhYzQ1ZTlVLA0KKyAgICAweGIzN2JmNjhkVSwgMHhiMDdkZmE4N1UsIDB4MjQ0ODkwZDhVLCAweDIwNDA4MGMwVSwNCisgICAgMHhiMjc5ZjI4YlUsIDB4OTIzOTcyNGJVLCAweGEzNWJiNmVkVSwgMHhjMDlkMjdiYVUsDQorICAgIDB4NDQ4ODBkODVVLCAweDYyYzQ5NTUxVSwgMHgxMDIwNDA2MFUsIDB4YjQ3NWVhOWZVLA0KKyAgICAweDg0MTUyYTNmVSwgMHg0Mzg2MTE5N1UsIDB4OTMzYjc2NGRVLCAweGMyOTkyZmI2VSwNCisgICAgMHg0YTk0MzVhMVUsIDB4YmQ2N2NlYTlVLCAweDhmMDMwNjA1VSwgMHgyZDVhYjRlZVUsDQorICAgIDB4YmM2NWNhYWZVLCAweDljMjU0YTZmVSwgMHg2YWQ0YjU2MVUsIDB4NDA4MDFkOWRVLA0KKyAgICAweGNmODMxYjk4VSwgMHhhMjU5YjJlYlUsIDB4ODAxZDNhMjdVLCAweDRmOWUyMWJmVSwNCisgICAgMHgxZjNlN2M0MlUsIDB4Y2E4OTBmODZVLCAweGFhNDk5MmRiVSwgMHg0Mjg0MTU5MVUsDQorfTsNCisNCitzdGF0aWMgY29uc3QgdWxvbmczMiBUMVsyNTZdID0gew0KKyAgICAweDY5YmFiYmQyVSwgMHhhODU0ZTU0ZFUsIDB4NWUyZmUyYmNVLCAweGU4NzQyNWNkVSwNCisgICAgMHhhNjUzZjc1MVUsIDB4YmJkM2QwNmJVLCAweGI5ZDJkNjZmVSwgMHg5YTRkYjMyOVUsDQorICAgIDB4YTA1MGZkNWRVLCAweDQ1YWNjZjhhVSwgMHgwNzhkMDkwZVUsIDB4NjNiZmE1YzZVLA0KKyAgICAweGUwNzAzZGRkVSwgMHhhNDUyZjE1NVUsIDB4Mjk5YTdiNTJVLCAweDk4NGNiNTJkVSwNCisgICAgMHhjOWVhNDY4ZlUsIDB4YjdkNWM0NzNVLCAweDMzOTc1NTY2VSwgMHhiZmQxZGM2M1UsDQorICAgIDB4NjYzM2FhY2NVLCAweGEyNTFmYjU5VSwgMHhiNjViYzc3MVUsIDB4NTFhNmYzYTJVLA0KKyAgICAweGExZGVmZTVmVSwgMHg5MDQ4YWQzZFUsIDB4NGRhOGQ3OWFVLCAweDJmOTk3MTVlVSwNCisgICAgMHhhYmRiZTA0YlUsIDB4NjQzMmFjYzhVLCAweDczYjc5NWU2VSwgMHhlNWZjMzJkN1UsDQorICAgIDB4ZGJlMzcwYWJVLCAweDIxOWU2MzQyVSwgMHgzZjkxNDE3ZVUsIDB4MmI5YjdkNTZVLA0KKyAgICAweGQ5ZTI3NmFmVSwgMHg2YmJiYmRkNlUsIDB4ODI0MTliMTlVLCAweGRjNmU3OWE1VSwNCisgICAgMHg1N2E1ZjlhZVUsIDB4OGJjYjgwMGJVLCAweGQ2NmI2N2IxVSwgMHgzNzk1NTk2ZVUsDQorICAgIDB4NWZhMWUxYmVVLCAweGZiZjMxMGViVSwgMHg3ZmIxODFmZVUsIDB4MDQwMjBjMDhVLA0KKyAgICAweDg1Y2M5MjE3VSwgMHg5NWM0YTIzN1UsIDB4M2ExZDRlNzRVLCAweDI4MTQ3ODUwVSwNCisgICAgMHg5YmMzYjAyYlUsIDB4YzY2MzU3OTFVLCAweGE5ZGFlNjRmVSwgMHhiYTVkZDM2OVUsDQorICAgIDB4YmU1ZmRmNjFVLCAweGE1ZGNmMjU3VSwgMHhmYTdkMTNlOVUsIDB4ODdjZDk0MTNVLA0KKyAgICAweGZlN2YxZmUxVSwgMHhiNDVhYzE3NVUsIDB4ZDg2Yzc1YWRVLCAweGI4NWNkNTZkVSwNCisgICAgMHhmM2Y3MDhmYlUsIDB4NGMyNmQ0OThVLCAweGUzZmYzOGRiVSwgMHhjN2VkNTQ5M1UsDQorICAgIDB4Y2RlODRhODdVLCAweDI3OWQ2OTRlVSwgMHhkZTZmN2ZhMVUsIDB4MDE4ZTAzMDJVLA0KKyAgICAweDMyMTk1NjY0VSwgMHg1ZGEwZTdiYVUsIDB4ZmRmMDFhZTdVLCAweDBmODkxMTFlVSwNCisgICAgMHgxZTBmMjIzY1UsIDB4MGUwNzEyMWNVLCAweDQzYWZjNTg2VSwgMHhlYmZiMjBjYlUsDQorICAgIDB4MTAwODMwMjBVLCAweDJhMTU3ZTU0VSwgMHgxYTBkMmUzNFUsIDB4MDgwNDE4MTBVLA0KKyAgICAweDAyMDEwNjA0VSwgMHhjODY0NDU4ZFUsIDB4YTNkZmY4NWJVLCAweGVjNzYyOWM1VSwNCisgICAgMHhmMjc5MGJmOVUsIDB4YTdkZGY0NTNVLCAweDdhM2Q4ZWY0VSwgMHgyYzE2NzQ1OFUsDQorICAgIDB4N2UzZjgyZmNVLCAweDZlMzdiMmRjVSwgMHhkYTZkNzNhOVUsIDB4NzAzODkwZTBVLA0KKyAgICAweDZmYjliMWRlVSwgMHhlNjczMzdkMVUsIDB4Y2ZlOTRjODNVLCAweDZhMzViZWQ0VSwNCisgICAgMHhhYTU1ZTM0OVUsIDB4ZTI3MTNiZDlVLCAweGY2N2IwN2YxVSwgMHgwNThjMGYwYVUsDQorICAgIDB4ZTQ3MjMxZDVVLCAweDBkODgxNzFhVSwgMHhmMWY2MGVmZlUsIDB4NTQyYWZjYThVLA0KKyAgICAweDdjM2U4NGY4VSwgMHhiYzVlZDk2NVUsIDB4NGUyN2QyOWNVLCAweDhjNDY4OTA1VSwNCisgICAgMHgxODBjMjgzMFUsIDB4Y2E2NTQzODlVLCAweGQwNjg2ZGJkVSwgMHhjMjYxNWI5OVUsDQorICAgIDB4MDYwMzBhMGNVLCAweDlmYzFiYzIzVSwgMHhhZTU3ZWY0MVUsIDB4YjFkNmNlN2ZVLA0KKyAgICAweGFmZDllYzQzVSwgMHhiMDU4Y2Q3ZFUsIDB4YWRkOGVhNDdVLCAweGNjNjY0OTg1VSwNCisgICAgMHhiM2Q3Yzg3YlUsIDB4NzQzYTljZThVLCAweDhkYzg4YTA3VSwgMHg3ODNjODhmMFUsDQorICAgIDB4ZTlmYTI2Y2ZVLCAweDMxOTY1MzYyVSwgMHg1M2E3ZjVhNlUsIDB4MmQ5ODc3NWFVLA0KKyAgICAweGM1ZWM1Mjk3VSwgMHg2ZGI4YjdkYVUsIDB4OTNjN2E4M2JVLCAweDQxYWVjMzgyVSwNCisgICAgMHhkMjY5NmJiOVUsIDB4OTY0YmE3MzFVLCAweDRiYWJkZDk2VSwgMHg0ZmE5ZDE5ZVUsDQorICAgIDB4Y2U2NzRmODFVLCAweDE0MGEzYzI4VSwgMHg4ZTQ3OGYwMVUsIDB4ZjlmMjE2ZWZVLA0KKyAgICAweDc3YjU5OWVlVSwgMHg0NDIyY2M4OFUsIDB4ZDdlNTY0YjNVLCAweGMxZWU1ZTlmVSwNCisgICAgMHg2MWJlYTNjMlUsIDB4NTYyYmZhYWNVLCAweDFmODEyMTNlVSwgMHgyNDEyNmM0OFUsDQorICAgIDB4MWI4MzJkMzZVLCAweDM2MWI1YTZjVSwgMHgxYzBlMjQzOFUsIDB4NDYyM2NhOGNVLA0KKyAgICAweGY3ZjUwNGYzVSwgMHg4YTQ1ODMwOVUsIDB4NDIyMWM2ODRVLCAweDgxY2U5ZTFmVSwNCisgICAgMHg5MjQ5YWIzOVUsIDB4NTgyY2U4YjBVLCAweGVmZjkyY2MzVSwgMHhkMWU2NmViZlUsDQorICAgIDB4NzFiNjkzZTJVLCAweDUwMjhmMGEwVSwgMHgyZTE3NzI1Y1UsIDB4MTk4MjJiMzJVLA0KKyAgICAweDM0MWE1YzY4VSwgMHgwYjhiMWQxNlUsIDB4ZTFmZTNlZGZVLCAweDA5OGExYjEyVSwNCisgICAgMHgxMjA5MzYyNFUsIDB4OGZjOThjMDNVLCAweDEzODczNTI2VSwgMHg5YzRlYjkyNVUsDQorICAgIDB4ZGZlMTdjYTNVLCAweDVjMmVlNGI4VSwgMHhkNWU0NjJiN1UsIDB4ZGRlMDdhYTdVLA0KKyAgICAweGNiZWI0MDhiVSwgMHgzZDkwNDc3YVUsIDB4NTVhNGZmYWFVLCAweDNjMWU0NDc4VSwNCisgICAgMHgxNzg1MzkyZVUsIDB4YzA2MDVkOWRVLCAweDAwMDAwMDAwVSwgMHg0YTI1ZGU5NFUsDQorICAgIDB4ZjVmNDAyZjdVLCAweGZmZjExY2UzVSwgMHgzNTk0NWY2YVUsIDB4MTYwYjNhMmNVLA0KKyAgICAweGQzZTc2OGJiVSwgMHhlYTc1MjNjOVUsIDB4YzNlZjU4OWJVLCAweDY4MzRiOGQwVSwNCisgICAgMHg2MjMxYTZjNFUsIDB4YjVkNGMyNzdVLCAweGJkZDBkYTY3VSwgMHgxMTg2MzMyMlUsDQorICAgIDB4ZmM3ZTE5ZTVVLCAweDQ3YWRjOThlVSwgMHhlN2ZkMzRkM1UsIDB4NTIyOWY2YTRVLA0KKyAgICAweDYwMzBhMGMwVSwgMHg3NjNiOWFlY1UsIDB4MjM5ZjY1NDZVLCAweGVkZjgyYWM3VSwNCisgICAgMHg5MWM2YWUzZlUsIDB4MjYxMzZhNGNVLCAweDBjMDYxNDE4VSwgMHgwYTA1MWUxNFUsDQorICAgIDB4OTdjNWE0MzNVLCAweDIyMTE2NjQ0VSwgMHhlZTc3MmZjMVUsIDB4Zjg3YzE1ZWRVLA0KKyAgICAweGY0N2EwMWY1VSwgMHhmMDc4MGRmZFUsIDB4NmMzNmI0ZDhVLCAweDM4MWM0ODcwVSwNCisgICAgMHg3MjM5OTZlNFUsIDB4YjI1OWNiNzlVLCAweDMwMTg1MDYwVSwgMHhhYzU2ZTk0NVUsDQorICAgIDB4N2JiMzhkZjZVLCAweDdkYjA4N2ZhVSwgMHg0ODI0ZDg5MFUsIDB4NDAyMGMwODBVLA0KKyAgICAweDc5YjI4YmYyVSwgMHgzOTkyNGI3MlUsIDB4NWJhM2VkYjZVLCAweDlkYzBiYTI3VSwNCisgICAgMHg4ODQ0ODUwZFUsIDB4YzQ2MjUxOTVVLCAweDIwMTA2MDQwVSwgMHg3NWI0OWZlYVUsDQorICAgIDB4MTU4NDNmMmFVLCAweDg2NDM5NzExVSwgMHgzYjkzNGQ3NlUsIDB4OTljMmI2MmZVLA0KKyAgICAweDk0NGFhMTM1VSwgMHg2N2JkYTljZVUsIDB4MDM4ZjA1MDZVLCAweDVhMmRlZWI0VSwNCisgICAgMHg2NWJjYWZjYVUsIDB4MjU5YzZmNGFVLCAweGQ0NmE2MWI1VSwgMHg4MDQwOWQxZFUsDQorICAgIDB4ODNjZjk4MWJVLCAweDU5YTJlYmIyVSwgMHgxZDgwMjczYVUsIDB4OWU0ZmJmMjFVLA0KKyAgICAweDNlMWY0MjdjVSwgMHg4OWNhODYwZlUsIDB4NDlhYWRiOTJVLCAweDg0NDI5MTE1VSwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCB1bG9uZzMyIFQyWzI1Nl0gPSB7DQorICAgIDB4ZDJiYmJhNjlVLCAweDRkZTU1NGE4VSwgMHhiY2UyMmY1ZVUsIDB4Y2QyNTc0ZThVLA0KKyAgICAweDUxZjc1M2E2VSwgMHg2YmQwZDNiYlUsIDB4NmZkNmQyYjlVLCAweDI5YjM0ZDlhVSwNCisgICAgMHg1ZGZkNTBhMFUsIDB4OGFjZmFjNDVVLCAweDBlMDk4ZDA3VSwgMHhjNmE1YmY2M1UsDQorICAgIDB4ZGQzZDcwZTBVLCAweDU1ZjE1MmE0VSwgMHg1MjdiOWEyOVUsIDB4MmRiNTRjOThVLA0KKyAgICAweDhmNDZlYWM5VSwgMHg3M2M0ZDViN1UsIDB4NjY1NTk3MzNVLCAweDYzZGNkMWJmVSwNCisgICAgMHhjY2FhMzM2NlUsIDB4NTlmYjUxYTJVLCAweDcxYzc1YmI2VSwgMHhhMmYzYTY1MVUsDQorICAgIDB4NWZmZWRlYTFVLCAweDNkYWQ0ODkwVSwgMHg5YWQ3YTg0ZFUsIDB4NWU3MTk5MmZVLA0KKyAgICAweDRiZTBkYmFiVSwgMHhjOGFjMzI2NFUsIDB4ZTY5NWI3NzNVLCAweGQ3MzJmY2U1VSwNCisgICAgMHhhYjcwZTNkYlUsIDB4NDI2MzllMjFVLCAweDdlNDE5MTNmVSwgMHg1NjdkOWIyYlUsDQorICAgIDB4YWY3NmUyZDlVLCAweGQ2YmRiYjZiVSwgMHgxOTliNDE4MlUsIDB4YTU3OTZlZGNVLA0KKyAgICAweGFlZjlhNTU3VSwgMHgwYjgwY2I4YlUsIDB4YjE2NzZiZDZVLCAweDZlNTk5NTM3VSwNCisgICAgMHhiZWUxYTE1ZlUsIDB4ZWIxMGYzZmJVLCAweGZlODFiMTdmVSwgMHgwODBjMDIwNFUsDQorICAgIDB4MTc5MmNjODVVLCAweDM3YTJjNDk1VSwgMHg3NDRlMWQzYVUsIDB4NTA3ODE0MjhVLA0KKyAgICAweDJiYjBjMzliVSwgMHg5MTU3NjNjNlUsIDB4NGZlNmRhYTlVLCAweDY5ZDM1ZGJhVSwNCisgICAgMHg2MWRmNWZiZVUsIDB4NTdmMmRjYTVVLCAweGU5MTM3ZGZhVSwgMHgxMzk0Y2Q4N1UsDQorICAgIDB4ZTExZjdmZmVVLCAweDc1YzE1YWI0VSwgMHhhZDc1NmNkOFUsIDB4NmRkNTVjYjhVLA0KKyAgICAweGZiMDhmN2YzVSwgMHg5OGQ0MjY0Y1UsIDB4ZGIzOGZmZTNVLCAweDkzNTRlZGM3VSwNCisgICAgMHg4NzRhZThjZFUsIDB4NGU2OTlkMjdVLCAweGExN2Y2ZmRlVSwgMHgwMjAzOGUwMVUsDQorICAgIDB4NjQ1NjE5MzJVLCAweGJhZTdhMDVkVSwgMHhlNzFhZjBmZFUsIDB4MWUxMTg5MGZVLA0KKyAgICAweDNjMjIwZjFlVSwgMHgxYzEyMDcwZVUsIDB4ODZjNWFmNDNVLCAweGNiMjBmYmViVSwNCisgICAgMHgyMDMwMDgxMFUsIDB4NTQ3ZTE1MmFVLCAweDM0MmUwZDFhVSwgMHgxMDE4MDQwOFUsDQorICAgIDB4MDQwNjAxMDJVLCAweDhkNDU2NGM4VSwgMHg1YmY4ZGZhM1UsIDB4YzUyOTc2ZWNVLA0KKyAgICAweGY5MGI3OWYyVSwgMHg1M2Y0ZGRhN1UsIDB4ZjQ4ZTNkN2FVLCAweDU4NzQxNjJjVSwNCisgICAgMHhmYzgyM2Y3ZVUsIDB4ZGNiMjM3NmVVLCAweGE5NzM2ZGRhVSwgMHhlMDkwMzg3MFUsDQorICAgIDB4ZGViMWI5NmZVLCAweGQxMzc3M2U2VSwgMHg4MzRjZTljZlUsIDB4ZDRiZTM1NmFVLA0KKyAgICAweDQ5ZTM1NWFhVSwgMHhkOTNiNzFlMlUsIDB4ZjEwNzdiZjZVLCAweDBhMGY4YzA1VSwNCisgICAgMHhkNTMxNzJlNFUsIDB4MWExNzg4MGRVLCAweGZmMGVmNmYxVSwgMHhhOGZjMmE1NFUsDQorICAgIDB4Zjg4NDNlN2NVLCAweDY1ZDk1ZWJjVSwgMHg5Y2QyMjc0ZVUsIDB4MDU4OTQ2OGNVLA0KKyAgICAweDMwMjgwYzE4VSwgMHg4OTQzNjVjYVUsIDB4YmQ2ZDY4ZDBVLCAweDk5NWI2MWMyVSwNCisgICAgMHgwYzBhMDMwNlUsIDB4MjNiY2MxOWZVLCAweDQxZWY1N2FlVSwgMHg3ZmNlZDZiMVUsDQorICAgIDB4NDNlY2Q5YWZVLCAweDdkY2Q1OGIwVSwgMHg0N2VhZDhhZFUsIDB4ODU0OTY2Y2NVLA0KKyAgICAweDdiYzhkN2IzVSwgMHhlODljM2E3NFUsIDB4MDc4YWM4OGRVLCAweGYwODgzYzc4VSwNCisgICAgMHhjZjI2ZmFlOVUsIDB4NjI1Mzk2MzFVLCAweGE2ZjVhNzUzVSwgMHg1YTc3OTgyZFUsDQorICAgIDB4OTc1MmVjYzVVLCAweGRhYjdiODZkVSwgMHgzYmE4Yzc5M1UsIDB4ODJjM2FlNDFVLA0KKyAgICAweGI5NmI2OWQyVSwgMHgzMWE3NGI5NlUsIDB4OTZkZGFiNGJVLCAweDllZDFhOTRmVSwNCisgICAgMHg4MTRmNjdjZVUsIDB4MjgzYzBhMTRVLCAweDAxOGY0NzhlVSwgMHhlZjE2ZjJmOVUsDQorICAgIDB4ZWU5OWI1NzdVLCAweDg4Y2MyMjQ0VSwgMHhiMzY0ZTVkN1UsIDB4OWY1ZWVlYzFVLA0KKyAgICAweGMyYTNiZTYxVSwgMHhhY2ZhMmI1NlUsIDB4M2UyMTgxMWZVLCAweDQ4NmMxMjI0VSwNCisgICAgMHgzNjJkODMxYlUsIDB4NmM1YTFiMzZVLCAweDM4MjQwZTFjVSwgMHg4Y2NhMjM0NlUsDQorICAgIDB4ZjMwNGY1ZjdVLCAweDA5ODM0NThhVSwgMHg4NGM2MjE0MlUsIDB4MWY5ZWNlODFVLA0KKyAgICAweDM5YWI0OTkyVSwgMHhiMGU4MmM1OFUsIDB4YzMyY2Y5ZWZVLCAweGJmNmVlNmQxVSwNCisgICAgMHhlMjkzYjY3MVUsIDB4YTBmMDI4NTBVLCAweDVjNzIxNzJlVSwgMHgzMjJiODIxOVUsDQorICAgIDB4Njg1YzFhMzRVLCAweDE2MWQ4YjBiVSwgMHhkZjNlZmVlMVUsIDB4MTIxYjhhMDlVLA0KKyAgICAweDI0MzYwOTEyVSwgMHgwMzhjYzk4ZlUsIDB4MjYzNTg3MTNVLCAweDI1Yjk0ZTljVSwNCisgICAgMHhhMzdjZTFkZlUsIDB4YjhlNDJlNWNVLCAweGI3NjJlNGQ1VSwgMHhhNzdhZTBkZFUsDQorICAgIDB4OGI0MGViY2JVLCAweDdhNDc5MDNkVSwgMHhhYWZmYTQ1NVUsIDB4Nzg0NDFlM2NVLA0KKyAgICAweDJlMzk4NTE3VSwgMHg5ZDVkNjBjMFUsIDB4MDAwMDAwMDBVLCAweDk0ZGUyNTRhVSwNCisgICAgMHhmNzAyZjRmNVUsIDB4ZTMxY2YxZmZVLCAweDZhNWY5NDM1VSwgMHgyYzNhMGIxNlUsDQorICAgIDB4YmI2OGU3ZDNVLCAweGM5MjM3NWVhVSwgMHg5YjU4ZWZjM1UsIDB4ZDBiODM0NjhVLA0KKyAgICAweGM0YTYzMTYyVSwgMHg3N2MyZDRiNVUsIDB4NjdkYWQwYmRVLCAweDIyMzM4NjExVSwNCisgICAgMHhlNTE5N2VmY1UsIDB4OGVjOWFkNDdVLCAweGQzMzRmZGU3VSwgMHhhNGY2Mjk1MlUsDQorICAgIDB4YzBhMDMwNjBVLCAweGVjOWEzYjc2VSwgMHg0NjY1OWYyM1UsIDB4YzcyYWY4ZWRVLA0KKyAgICAweDNmYWVjNjkxVSwgMHg0YzZhMTMyNlUsIDB4MTgxNDA2MGNVLCAweDE0MWUwNTBhVSwNCisgICAgMHgzM2E0YzU5N1UsIDB4NDQ2NjExMjJVLCAweGMxMmY3N2VlVSwgMHhlZDE1N2NmOFUsDQorICAgIDB4ZjUwMTdhZjRVLCAweGZkMGQ3OGYwVSwgMHhkOGI0MzY2Y1UsIDB4NzA0ODFjMzhVLA0KKyAgICAweGU0OTYzOTcyVSwgMHg3OWNiNTliMlUsIDB4NjA1MDE4MzBVLCAweDQ1ZTk1NmFjVSwNCisgICAgMHhmNjhkYjM3YlUsIDB4ZmE4N2IwN2RVLCAweDkwZDgyNDQ4VSwgMHg4MGMwMjA0MFUsDQorICAgIDB4ZjI4YmIyNzlVLCAweDcyNGI5MjM5VSwgMHhiNmVkYTM1YlUsIDB4MjdiYWMwOWRVLA0KKyAgICAweDBkODU0NDg4VSwgMHg5NTUxNjJjNFUsIDB4NDA2MDEwMjBVLCAweGVhOWZiNDc1VSwNCisgICAgMHgyYTNmODQxNVUsIDB4MTE5NzQzODZVLCAweDc2NGQ5MzNiVSwgMHgyZmI2YzI5OVUsDQorICAgIDB4MzVhMTRhOTRVLCAweGNlYTliZDY3VSwgMHgwNjA1OGYwM1UsIDB4YjRlZTJkNWFVLA0KKyAgICAweGNhYWZiYzY1VSwgMHg0YTZmOWMyNVUsIDB4YjU2MTZhZDRVLCAweDFkOWQ0MDgwVSwNCisgICAgMHgxYjk4Y2Y4M1UsIDB4YjJlYmEyNTlVLCAweDNhMjc4MDFkVSwgMHgyMWJmNGY5ZVUsDQorICAgIDB4N2M0MjFmM2VVLCAweDBmODZjYTg5VSwgMHg5MmRiYWE0OVUsIDB4MTU5MTQyODRVLA0KK307DQorDQorc3RhdGljIGNvbnN0IHVsb25nMzIgVDNbMjU2XSA9IHsNCisgICAgMHhiYmQyNjliYVUsIDB4ZTU0ZGE4NTRVLCAweGUyYmM1ZTJmVSwgMHgyNWNkZTg3NFUsDQorICAgIDB4Zjc1MWE2NTNVLCAweGQwNmJiYmQzVSwgMHhkNjZmYjlkMlUsIDB4YjMyOTlhNGRVLA0KKyAgICAweGZkNWRhMDUwVSwgMHhjZjhhNDVhY1UsIDB4MDkwZTA3OGRVLCAweGE1YzY2M2JmVSwNCisgICAgMHgzZGRkZTA3MFUsIDB4ZjE1NWE0NTJVLCAweDdiNTIyOTlhVSwgMHhiNTJkOTg0Y1UsDQorICAgIDB4NDY4ZmM5ZWFVLCAweGM0NzNiN2Q1VSwgMHg1NTY2MzM5N1UsIDB4ZGM2M2JmZDFVLA0KKyAgICAweGFhY2M2NjMzVSwgMHhmYjU5YTI1MVUsIDB4Yzc3MWI2NWJVLCAweGYzYTI1MWE2VSwNCisgICAgMHhmZTVmYTFkZVUsIDB4YWQzZDkwNDhVLCAweGQ3OWE0ZGE4VSwgMHg3MTVlMmY5OVUsDQorICAgIDB4ZTA0YmFiZGJVLCAweGFjYzg2NDMyVSwgMHg5NWU2NzNiN1UsIDB4MzJkN2U1ZmNVLA0KKyAgICAweDcwYWJkYmUzVSwgMHg2MzQyMjE5ZVUsIDB4NDE3ZTNmOTFVLCAweDdkNTYyYjliVSwNCisgICAgMHg3NmFmZDllMlUsIDB4YmRkNjZiYmJVLCAweDliMTk4MjQxVSwgMHg3OWE1ZGM2ZVUsDQorICAgIDB4ZjlhZTU3YTVVLCAweDgwMGI4YmNiVSwgMHg2N2IxZDY2YlUsIDB4NTk2ZTM3OTVVLA0KKyAgICAweGUxYmU1ZmExVSwgMHgxMGViZmJmM1UsIDB4ODFmZTdmYjFVLCAweDBjMDgwNDAyVSwNCisgICAgMHg5MjE3ODVjY1UsIDB4YTIzNzk1YzRVLCAweDRlNzQzYTFkVSwgMHg3ODUwMjgxNFUsDQorICAgIDB4YjAyYjliYzNVLCAweDU3OTFjNjYzVSwgMHhlNjRmYTlkYVUsIDB4ZDM2OWJhNWRVLA0KKyAgICAweGRmNjFiZTVmVSwgMHhmMjU3YTVkY1UsIDB4MTNlOWZhN2RVLCAweDk0MTM4N2NkVSwNCisgICAgMHgxZmUxZmU3ZlUsIDB4YzE3NWI0NWFVLCAweDc1YWRkODZjVSwgMHhkNTZkYjg1Y1UsDQorICAgIDB4MDhmYmYzZjdVLCAweGQ0OTg0YzI2VSwgMHgzOGRiZTNmZlUsIDB4NTQ5M2M3ZWRVLA0KKyAgICAweDRhODdjZGU4VSwgMHg2OTRlMjc5ZFUsIDB4N2ZhMWRlNmZVLCAweDAzMDIwMThlVSwNCisgICAgMHg1NjY0MzIxOVUsIDB4ZTdiYTVkYTBVLCAweDFhZTdmZGYwVSwgMHgxMTFlMGY4OVUsDQorICAgIDB4MjIzYzFlMGZVLCAweDEyMWMwZTA3VSwgMHhjNTg2NDNhZlUsIDB4MjBjYmViZmJVLA0KKyAgICAweDMwMjAxMDA4VSwgMHg3ZTU0MmExNVUsIDB4MmUzNDFhMGRVLCAweDE4MTAwODA0VSwNCisgICAgMHgwNjA0MDIwMVUsIDB4NDU4ZGM4NjRVLCAweGY4NWJhM2RmVSwgMHgyOWM1ZWM3NlUsDQorICAgIDB4MGJmOWYyNzlVLCAweGY0NTNhN2RkVSwgMHg4ZWY0N2EzZFUsIDB4NzQ1ODJjMTZVLA0KKyAgICAweDgyZmM3ZTNmVSwgMHhiMmRjNmUzN1UsIDB4NzNhOWRhNmRVLCAweDkwZTA3MDM4VSwNCisgICAgMHhiMWRlNmZiOVUsIDB4MzdkMWU2NzNVLCAweDRjODNjZmU5VSwgMHhiZWQ0NmEzNVUsDQorICAgIDB4ZTM0OWFhNTVVLCAweDNiZDllMjcxVSwgMHgwN2YxZjY3YlUsIDB4MGYwYTA1OGNVLA0KKyAgICAweDMxZDVlNDcyVSwgMHgxNzFhMGQ4OFUsIDB4MGVmZmYxZjZVLCAweGZjYTg1NDJhVSwNCisgICAgMHg4NGY4N2MzZVUsIDB4ZDk2NWJjNWVVLCAweGQyOWM0ZTI3VSwgMHg4OTA1OGM0NlUsDQorICAgIDB4MjgzMDE4MGNVLCAweDQzODljYTY1VSwgMHg2ZGJkZDA2OFUsIDB4NWI5OWMyNjFVLA0KKyAgICAweDBhMGMwNjAzVSwgMHhiYzIzOWZjMVUsIDB4ZWY0MWFlNTdVLCAweGNlN2ZiMWQ2VSwNCisgICAgMHhlYzQzYWZkOVUsIDB4Y2Q3ZGIwNThVLCAweGVhNDdhZGQ4VSwgMHg0OTg1Y2M2NlUsDQorICAgIDB4Yzg3YmIzZDdVLCAweDljZTg3NDNhVSwgMHg4YTA3OGRjOFUsIDB4ODhmMDc4M2NVLA0KKyAgICAweDI2Y2ZlOWZhVSwgMHg1MzYyMzE5NlUsIDB4ZjVhNjUzYTdVLCAweDc3NWEyZDk4VSwNCisgICAgMHg1Mjk3YzVlY1UsIDB4YjdkYTZkYjhVLCAweGE4M2I5M2M3VSwgMHhjMzgyNDFhZVUsDQorICAgIDB4NmJiOWQyNjlVLCAweGE3MzE5NjRiVSwgMHhkZDk2NGJhYlUsIDB4ZDE5ZTRmYTlVLA0KKyAgICAweDRmODFjZTY3VSwgMHgzYzI4MTQwYVUsIDB4OGYwMThlNDdVLCAweDE2ZWZmOWYyVSwNCisgICAgMHg5OWVlNzdiNVUsIDB4Y2M4ODQ0MjJVLCAweDY0YjNkN2U1VSwgMHg1ZTlmYzFlZVUsDQorICAgIDB4YTNjMjYxYmVVLCAweGZhYWM1NjJiVSwgMHgyMTNlMWY4MVUsIDB4NmM0ODI0MTJVLA0KKyAgICAweDJkMzYxYjgzVSwgMHg1YTZjMzYxYlUsIDB4MjQzODFjMGVVLCAweGNhOGM0NjIzVSwNCisgICAgMHgwNGYzZjdmNVUsIDB4ODMwOThhNDVVLCAweGM2ODQ0MjIxVSwgMHg5ZTFmODFjZVUsDQorICAgIDB4YWIzOTkyNDlVLCAweGU4YjA1ODJjVSwgMHgyY2MzZWZmOVUsIDB4NmViZmQxZTZVLA0KKyAgICAweDkzZTI3MWI2VSwgMHhmMGEwNTAyOFUsIDB4NzI1YzJlMTdVLCAweDJiMzIxOTgyVSwNCisgICAgMHg1YzY4MzQxYVUsIDB4MWQxNjBiOGJVLCAweDNlZGZlMWZlVSwgMHgxYjEyMDk4YVUsDQorICAgIDB4MzYyNDEyMDlVLCAweDhjMDM4ZmM5VSwgMHgzNTI2MTM4N1UsIDB4YjkyNTljNGVVLA0KKyAgICAweDdjYTNkZmUxVSwgMHhlNGI4NWMyZVUsIDB4NjJiN2Q1ZTRVLCAweDdhYTdkZGUwVSwNCisgICAgMHg0MDhiY2JlYlUsIDB4NDc3YTNkOTBVLCAweGZmYWE1NWE0VSwgMHg0NDc4M2MxZVUsDQorICAgIDB4MzkyZTE3ODVVLCAweDVkOWRjMDYwVSwgMHgwMDAwMDAwMFUsIDB4ZGU5NDRhMjVVLA0KKyAgICAweDAyZjdmNWY0VSwgMHgxY2UzZmZmMVUsIDB4NWY2YTM1OTRVLCAweDNhMmMxNjBiVSwNCisgICAgMHg2OGJiZDNlN1UsIDB4MjNjOWVhNzVVLCAweDU4OWJjM2VmVSwgMHhiOGQwNjgzNFUsDQorICAgIDB4YTZjNDYyMzFVLCAweGMyNzdiNWQ0VSwgMHhkYTY3YmRkMFUsIDB4MzMyMjExODZVLA0KKyAgICAweDE5ZTVmYzdlVSwgMHhjOThlNDdhZFUsIDB4MzRkM2U3ZmRVLCAweGY2YTQ1MjI5VSwNCisgICAgMHhhMGMwNjAzMFUsIDB4OWFlYzc2M2JVLCAweDY1NDYyMzlmVSwgMHgyYWM3ZWRmOFUsDQorICAgIDB4YWUzZjkxYzZVLCAweDZhNGMyNjEzVSwgMHgxNDE4MGMwNlUsIDB4MWUxNDBhMDVVLA0KKyAgICAweGE0MzM5N2M1VSwgMHg2NjQ0MjIxMVUsIDB4MmZjMWVlNzdVLCAweDE1ZWRmODdjVSwNCisgICAgMHgwMWY1ZjQ3YVUsIDB4MGRmZGYwNzhVLCAweGI0ZDg2YzM2VSwgMHg0ODcwMzgxY1UsDQorICAgIDB4OTZlNDcyMzlVLCAweGNiNzliMjU5VSwgMHg1MDYwMzAxOFUsIDB4ZTk0NWFjNTZVLA0KKyAgICAweDhkZjY3YmIzVSwgMHg4N2ZhN2RiMFUsIDB4ZDg5MDQ4MjRVLCAweGMwODA0MDIwVSwNCisgICAgMHg4YmYyNzliMlUsIDB4NGI3MjM5OTJVLCAweGVkYjY1YmEzVSwgMHhiYTI3OWRjMFUsDQorICAgIDB4ODUwZDg4NDRVLCAweDUxOTVjNDYyVSwgMHg2MDQwMjAxMFUsIDB4OWZlYTc1YjRVLA0KKyAgICAweDNmMmExNTg0VSwgMHg5NzExODY0M1UsIDB4NGQ3NjNiOTNVLCAweGI2MmY5OWMyVSwNCisgICAgMHhhMTM1OTQ0YVUsIDB4YTljZTY3YmRVLCAweDA1MDYwMzhmVSwgMHhlZWI0NWEyZFUsDQorICAgIDB4YWZjYTY1YmNVLCAweDZmNGEyNTljVSwgMHg2MWI1ZDQ2YVUsIDB4OWQxZDgwNDBVLA0KKyAgICAweDk4MWI4M2NmVSwgMHhlYmIyNTlhMlUsIDB4MjczYTFkODBVLCAweGJmMjE5ZTRmVSwNCisgICAgMHg0MjdjM2UxZlUsIDB4ODYwZjg5Y2FVLCAweGRiOTI0OWFhVSwgMHg5MTE1ODQ0MlUsDQorfTsNCisNCitzdGF0aWMgY29uc3QgdWxvbmczMiBUNFsyNTZdID0gew0KKyAgICAweGJhYmFiYWJhVSwgMHg1NDU0NTQ1NFUsIDB4MmYyZjJmMmZVLCAweDc0NzQ3NDc0VSwNCisgICAgMHg1MzUzNTM1M1UsIDB4ZDNkM2QzZDNVLCAweGQyZDJkMmQyVSwgMHg0ZDRkNGQ0ZFUsDQorICAgIDB4NTA1MDUwNTBVLCAweGFjYWNhY2FjVSwgMHg4ZDhkOGQ4ZFUsIDB4YmZiZmJmYmZVLA0KKyAgICAweDcwNzA3MDcwVSwgMHg1MjUyNTI1MlUsIDB4OWE5YTlhOWFVLCAweDRjNGM0YzRjVSwNCisgICAgMHhlYWVhZWFlYVUsIDB4ZDVkNWQ1ZDVVLCAweDk3OTc5Nzk3VSwgMHhkMWQxZDFkMVUsDQorICAgIDB4MzMzMzMzMzNVLCAweDUxNTE1MTUxVSwgMHg1YjViNWI1YlUsIDB4YTZhNmE2YTZVLA0KKyAgICAweGRlZGVkZWRlVSwgMHg0ODQ4NDg0OFUsIDB4YThhOGE4YThVLCAweDk5OTk5OTk5VSwNCisgICAgMHhkYmRiZGJkYlUsIDB4MzIzMjMyMzJVLCAweGI3YjdiN2I3VSwgMHhmY2ZjZmNmY1UsDQorICAgIDB4ZTNlM2UzZTNVLCAweDllOWU5ZTllVSwgMHg5MTkxOTE5MVUsIDB4OWI5YjliOWJVLA0KKyAgICAweGUyZTJlMmUyVSwgMHhiYmJiYmJiYlUsIDB4NDE0MTQxNDFVLCAweDZlNmU2ZTZlVSwNCisgICAgMHhhNWE1YTVhNVUsIDB4Y2JjYmNiY2JVLCAweDZiNmI2YjZiVSwgMHg5NTk1OTU5NVUsDQorICAgIDB4YTFhMWExYTFVLCAweGYzZjNmM2YzVSwgMHhiMWIxYjFiMVUsIDB4MDIwMjAyMDJVLA0KKyAgICAweGNjY2NjY2NjVSwgMHhjNGM0YzRjNFUsIDB4MWQxZDFkMWRVLCAweDE0MTQxNDE0VSwNCisgICAgMHhjM2MzYzNjM1UsIDB4NjM2MzYzNjNVLCAweGRhZGFkYWRhVSwgMHg1ZDVkNWQ1ZFUsDQorICAgIDB4NWY1ZjVmNWZVLCAweGRjZGNkY2RjVSwgMHg3ZDdkN2Q3ZFUsIDB4Y2RjZGNkY2RVLA0KKyAgICAweDdmN2Y3ZjdmVSwgMHg1YTVhNWE1YVUsIDB4NmM2YzZjNmNVLCAweDVjNWM1YzVjVSwNCisgICAgMHhmN2Y3ZjdmN1UsIDB4MjYyNjI2MjZVLCAweGZmZmZmZmZmVSwgMHhlZGVkZWRlZFUsDQorICAgIDB4ZThlOGU4ZThVLCAweDlkOWQ5ZDlkVSwgMHg2ZjZmNmY2ZlUsIDB4OGU4ZThlOGVVLA0KKyAgICAweDE5MTkxOTE5VSwgMHhhMGEwYTBhMFUsIDB4ZjBmMGYwZjBVLCAweDg5ODk4OTg5VSwNCisgICAgMHgwZjBmMGYwZlUsIDB4MDcwNzA3MDdVLCAweGFmYWZhZmFmVSwgMHhmYmZiZmJmYlUsDQorICAgIDB4MDgwODA4MDhVLCAweDE1MTUxNTE1VSwgMHgwZDBkMGQwZFUsIDB4MDQwNDA0MDRVLA0KKyAgICAweDAxMDEwMTAxVSwgMHg2NDY0NjQ2NFUsIDB4ZGZkZmRmZGZVLCAweDc2NzY3Njc2VSwNCisgICAgMHg3OTc5Nzk3OVUsIDB4ZGRkZGRkZGRVLCAweDNkM2QzZDNkVSwgMHgxNjE2MTYxNlUsDQorICAgIDB4M2YzZjNmM2ZVLCAweDM3MzczNzM3VSwgMHg2ZDZkNmQ2ZFUsIDB4MzgzODM4MzhVLA0KKyAgICAweGI5YjliOWI5VSwgMHg3MzczNzM3M1UsIDB4ZTllOWU5ZTlVLCAweDM1MzUzNTM1VSwNCisgICAgMHg1NTU1NTU1NVUsIDB4NzE3MTcxNzFVLCAweDdiN2I3YjdiVSwgMHg4YzhjOGM4Y1UsDQorICAgIDB4NzI3MjcyNzJVLCAweDg4ODg4ODg4VSwgMHhmNmY2ZjZmNlUsIDB4MmEyYTJhMmFVLA0KKyAgICAweDNlM2UzZTNlVSwgMHg1ZTVlNWU1ZVUsIDB4MjcyNzI3MjdVLCAweDQ2NDY0NjQ2VSwNCisgICAgMHgwYzBjMGMwY1UsIDB4NjU2NTY1NjVVLCAweDY4Njg2ODY4VSwgMHg2MTYxNjE2MVUsDQorICAgIDB4MDMwMzAzMDNVLCAweGMxYzFjMWMxVSwgMHg1NzU3NTc1N1UsIDB4ZDZkNmQ2ZDZVLA0KKyAgICAweGQ5ZDlkOWQ5VSwgMHg1ODU4NTg1OFUsIDB4ZDhkOGQ4ZDhVLCAweDY2NjY2NjY2VSwNCisgICAgMHhkN2Q3ZDdkN1UsIDB4M2EzYTNhM2FVLCAweGM4YzhjOGM4VSwgMHgzYzNjM2MzY1UsDQorICAgIDB4ZmFmYWZhZmFVLCAweDk2OTY5Njk2VSwgMHhhN2E3YTdhN1UsIDB4OTg5ODk4OThVLA0KKyAgICAweGVjZWNlY2VjVSwgMHhiOGI4YjhiOFUsIDB4YzdjN2M3YzdVLCAweGFlYWVhZWFlVSwNCisgICAgMHg2OTY5Njk2OVUsIDB4NGI0YjRiNGJVLCAweGFiYWJhYmFiVSwgMHhhOWE5YTlhOVUsDQorICAgIDB4Njc2NzY3NjdVLCAweDBhMGEwYTBhVSwgMHg0NzQ3NDc0N1UsIDB4ZjJmMmYyZjJVLA0KKyAgICAweGI1YjViNWI1VSwgMHgyMjIyMjIyMlUsIDB4ZTVlNWU1ZTVVLCAweGVlZWVlZWVlVSwNCisgICAgMHhiZWJlYmViZVUsIDB4MmIyYjJiMmJVLCAweDgxODE4MTgxVSwgMHgxMjEyMTIxMlUsDQorICAgIDB4ODM4MzgzODNVLCAweDFiMWIxYjFiVSwgMHgwZTBlMGUwZVUsIDB4MjMyMzIzMjNVLA0KKyAgICAweGY1ZjVmNWY1VSwgMHg0NTQ1NDU0NVUsIDB4MjEyMTIxMjFVLCAweGNlY2VjZWNlVSwNCisgICAgMHg0OTQ5NDk0OVUsIDB4MmMyYzJjMmNVLCAweGY5ZjlmOWY5VSwgMHhlNmU2ZTZlNlUsDQorICAgIDB4YjZiNmI2YjZVLCAweDI4MjgyODI4VSwgMHgxNzE3MTcxN1UsIDB4ODI4MjgyODJVLA0KKyAgICAweDFhMWExYTFhVSwgMHg4YjhiOGI4YlUsIDB4ZmVmZWZlZmVVLCAweDhhOGE4YThhVSwNCisgICAgMHgwOTA5MDkwOVUsIDB4YzljOWM5YzlVLCAweDg3ODc4Nzg3VSwgMHg0ZTRlNGU0ZVUsDQorICAgIDB4ZTFlMWUxZTFVLCAweDJlMmUyZTJlVSwgMHhlNGU0ZTRlNFUsIDB4ZTBlMGUwZTBVLA0KKyAgICAweGViZWJlYmViVSwgMHg5MDkwOTA5MFUsIDB4YTRhNGE0YTRVLCAweDFlMWUxZTFlVSwNCisgICAgMHg4NTg1ODU4NVUsIDB4NjA2MDYwNjBVLCAweDAwMDAwMDAwVSwgMHgyNTI1MjUyNVUsDQorICAgIDB4ZjRmNGY0ZjRVLCAweGYxZjFmMWYxVSwgMHg5NDk0OTQ5NFUsIDB4MGIwYjBiMGJVLA0KKyAgICAweGU3ZTdlN2U3VSwgMHg3NTc1NzU3NVUsIDB4ZWZlZmVmZWZVLCAweDM0MzQzNDM0VSwNCisgICAgMHgzMTMxMzEzMVUsIDB4ZDRkNGQ0ZDRVLCAweGQwZDBkMGQwVSwgMHg4Njg2ODY4NlUsDQorICAgIDB4N2U3ZTdlN2VVLCAweGFkYWRhZGFkVSwgMHhmZGZkZmRmZFUsIDB4MjkyOTI5MjlVLA0KKyAgICAweDMwMzAzMDMwVSwgMHgzYjNiM2IzYlUsIDB4OWY5ZjlmOWZVLCAweGY4ZjhmOGY4VSwNCisgICAgMHhjNmM2YzZjNlUsIDB4MTMxMzEzMTNVLCAweDA2MDYwNjA2VSwgMHgwNTA1MDUwNVUsDQorICAgIDB4YzVjNWM1YzVVLCAweDExMTExMTExVSwgMHg3Nzc3Nzc3N1UsIDB4N2M3YzdjN2NVLA0KKyAgICAweDdhN2E3YTdhVSwgMHg3ODc4Nzg3OFUsIDB4MzYzNjM2MzZVLCAweDFjMWMxYzFjVSwNCisgICAgMHgzOTM5MzkzOVUsIDB4NTk1OTU5NTlVLCAweDE4MTgxODE4VSwgMHg1NjU2NTY1NlUsDQorICAgIDB4YjNiM2IzYjNVLCAweGIwYjBiMGIwVSwgMHgyNDI0MjQyNFUsIDB4MjAyMDIwMjBVLA0KKyAgICAweGIyYjJiMmIyVSwgMHg5MjkyOTI5MlUsIDB4YTNhM2EzYTNVLCAweGMwYzBjMGMwVSwNCisgICAgMHg0NDQ0NDQ0NFUsIDB4NjI2MjYyNjJVLCAweDEwMTAxMDEwVSwgMHhiNGI0YjRiNFUsDQorICAgIDB4ODQ4NDg0ODRVLCAweDQzNDM0MzQzVSwgMHg5MzkzOTM5M1UsIDB4YzJjMmMyYzJVLA0KKyAgICAweDRhNGE0YTRhVSwgMHhiZGJkYmRiZFUsIDB4OGY4ZjhmOGZVLCAweDJkMmQyZDJkVSwNCisgICAgMHhiY2JjYmNiY1UsIDB4OWM5YzljOWNVLCAweDZhNmE2YTZhVSwgMHg0MDQwNDA0MFUsDQorICAgIDB4Y2ZjZmNmY2ZVLCAweGEyYTJhMmEyVSwgMHg4MDgwODA4MFUsIDB4NGY0ZjRmNGZVLA0KKyAgICAweDFmMWYxZjFmVSwgMHhjYWNhY2FjYVUsIDB4YWFhYWFhYWFVLCAweDQyNDI0MjQyVSwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCB1bG9uZzMyIFQ1WzI1Nl0gPSB7DQorICAgIDB4MDAwMDAwMDBVLCAweDAxMDIwNjA4VSwgMHgwMjA0MGMxMFUsIDB4MDMwNjBhMThVLA0KKyAgICAweDA0MDgxODIwVSwgMHgwNTBhMWUyOFUsIDB4MDYwYzE0MzBVLCAweDA3MGUxMjM4VSwNCisgICAgMHgwODEwMzA0MFUsIDB4MDkxMjM2NDhVLCAweDBhMTQzYzUwVSwgMHgwYjE2M2E1OFUsDQorICAgIDB4MGMxODI4NjBVLCAweDBkMWEyZTY4VSwgMHgwZTFjMjQ3MFUsIDB4MGYxZTIyNzhVLA0KKyAgICAweDEwMjA2MDgwVSwgMHgxMTIyNjY4OFUsIDB4MTIyNDZjOTBVLCAweDEzMjY2YTk4VSwNCisgICAgMHgxNDI4NzhhMFUsIDB4MTUyYTdlYThVLCAweDE2MmM3NGIwVSwgMHgxNzJlNzJiOFUsDQorICAgIDB4MTgzMDUwYzBVLCAweDE5MzI1NmM4VSwgMHgxYTM0NWNkMFUsIDB4MWIzNjVhZDhVLA0KKyAgICAweDFjMzg0OGUwVSwgMHgxZDNhNGVlOFUsIDB4MWUzYzQ0ZjBVLCAweDFmM2U0MmY4VSwNCisgICAgMHgyMDQwYzAxZFUsIDB4MjE0MmM2MTVVLCAweDIyNDRjYzBkVSwgMHgyMzQ2Y2EwNVUsDQorICAgIDB4MjQ0OGQ4M2RVLCAweDI1NGFkZTM1VSwgMHgyNjRjZDQyZFUsIDB4Mjc0ZWQyMjVVLA0KKyAgICAweDI4NTBmMDVkVSwgMHgyOTUyZjY1NVUsIDB4MmE1NGZjNGRVLCAweDJiNTZmYTQ1VSwNCisgICAgMHgyYzU4ZTg3ZFUsIDB4MmQ1YWVlNzVVLCAweDJlNWNlNDZkVSwgMHgyZjVlZTI2NVUsDQorICAgIDB4MzA2MGEwOWRVLCAweDMxNjJhNjk1VSwgMHgzMjY0YWM4ZFUsIDB4MzM2NmFhODVVLA0KKyAgICAweDM0NjhiOGJkVSwgMHgzNTZhYmViNVUsIDB4MzY2Y2I0YWRVLCAweDM3NmViMmE1VSwNCisgICAgMHgzODcwOTBkZFUsIDB4Mzk3Mjk2ZDVVLCAweDNhNzQ5Y2NkVSwgMHgzYjc2OWFjNVUsDQorICAgIDB4M2M3ODg4ZmRVLCAweDNkN2E4ZWY1VSwgMHgzZTdjODRlZFUsIDB4M2Y3ZTgyZTVVLA0KKyAgICAweDQwODA5ZDNhVSwgMHg0MTgyOWIzMlUsIDB4NDI4NDkxMmFVLCAweDQzODY5NzIyVSwNCisgICAgMHg0NDg4ODUxYVUsIDB4NDU4YTgzMTJVLCAweDQ2OGM4OTBhVSwgMHg0NzhlOGYwMlUsDQorICAgIDB4NDg5MGFkN2FVLCAweDQ5OTJhYjcyVSwgMHg0YTk0YTE2YVUsIDB4NGI5NmE3NjJVLA0KKyAgICAweDRjOThiNTVhVSwgMHg0ZDlhYjM1MlUsIDB4NGU5Y2I5NGFVLCAweDRmOWViZjQyVSwNCisgICAgMHg1MGEwZmRiYVUsIDB4NTFhMmZiYjJVLCAweDUyYTRmMWFhVSwgMHg1M2E2ZjdhMlUsDQorICAgIDB4NTRhOGU1OWFVLCAweDU1YWFlMzkyVSwgMHg1NmFjZTk4YVUsIDB4NTdhZWVmODJVLA0KKyAgICAweDU4YjBjZGZhVSwgMHg1OWIyY2JmMlUsIDB4NWFiNGMxZWFVLCAweDViYjZjN2UyVSwNCisgICAgMHg1Y2I4ZDVkYVUsIDB4NWRiYWQzZDJVLCAweDVlYmNkOWNhVSwgMHg1ZmJlZGZjMlUsDQorICAgIDB4NjBjMDVkMjdVLCAweDYxYzI1YjJmVSwgMHg2MmM0NTEzN1UsIDB4NjNjNjU3M2ZVLA0KKyAgICAweDY0Yzg0NTA3VSwgMHg2NWNhNDMwZlUsIDB4NjZjYzQ5MTdVLCAweDY3Y2U0ZjFmVSwNCisgICAgMHg2OGQwNmQ2N1UsIDB4NjlkMjZiNmZVLCAweDZhZDQ2MTc3VSwgMHg2YmQ2Njc3ZlUsDQorICAgIDB4NmNkODc1NDdVLCAweDZkZGE3MzRmVSwgMHg2ZWRjNzk1N1UsIDB4NmZkZTdmNWZVLA0KKyAgICAweDcwZTAzZGE3VSwgMHg3MWUyM2JhZlUsIDB4NzJlNDMxYjdVLCAweDczZTYzN2JmVSwNCisgICAgMHg3NGU4MjU4N1UsIDB4NzVlYTIzOGZVLCAweDc2ZWMyOTk3VSwgMHg3N2VlMmY5ZlUsDQorICAgIDB4NzhmMDBkZTdVLCAweDc5ZjIwYmVmVSwgMHg3YWY0MDFmN1UsIDB4N2JmNjA3ZmZVLA0KKyAgICAweDdjZjgxNWM3VSwgMHg3ZGZhMTNjZlUsIDB4N2VmYzE5ZDdVLCAweDdmZmUxZmRmVSwNCisgICAgMHg4MDFkMjc3NFUsIDB4ODExZjIxN2NVLCAweDgyMTkyYjY0VSwgMHg4MzFiMmQ2Y1UsDQorICAgIDB4ODQxNTNmNTRVLCAweDg1MTczOTVjVSwgMHg4NjExMzM0NFUsIDB4ODcxMzM1NGNVLA0KKyAgICAweDg4MGQxNzM0VSwgMHg4OTBmMTEzY1UsIDB4OGEwOTFiMjRVLCAweDhiMGIxZDJjVSwNCisgICAgMHg4YzA1MGYxNFUsIDB4OGQwNzA5MWNVLCAweDhlMDEwMzA0VSwgMHg4ZjAzMDUwY1UsDQorICAgIDB4OTAzZDQ3ZjRVLCAweDkxM2Y0MWZjVSwgMHg5MjM5NGJlNFUsIDB4OTMzYjRkZWNVLA0KKyAgICAweDk0MzU1ZmQ0VSwgMHg5NTM3NTlkY1UsIDB4OTYzMTUzYzRVLCAweDk3MzM1NWNjVSwNCisgICAgMHg5ODJkNzdiNFUsIDB4OTkyZjcxYmNVLCAweDlhMjk3YmE0VSwgMHg5YjJiN2RhY1UsDQorICAgIDB4OWMyNTZmOTRVLCAweDlkMjc2OTljVSwgMHg5ZTIxNjM4NFUsIDB4OWYyMzY1OGNVLA0KKyAgICAweGEwNWRlNzY5VSwgMHhhMTVmZTE2MVUsIDB4YTI1OWViNzlVLCAweGEzNWJlZDcxVSwNCisgICAgMHhhNDU1ZmY0OVUsIDB4YTU1N2Y5NDFVLCAweGE2NTFmMzU5VSwgMHhhNzUzZjU1MVUsDQorICAgIDB4YTg0ZGQ3MjlVLCAweGE5NGZkMTIxVSwgMHhhYTQ5ZGIzOVUsIDB4YWI0YmRkMzFVLA0KKyAgICAweGFjNDVjZjA5VSwgMHhhZDQ3YzkwMVUsIDB4YWU0MWMzMTlVLCAweGFmNDNjNTExVSwNCisgICAgMHhiMDdkODdlOVUsIDB4YjE3ZjgxZTFVLCAweGIyNzk4YmY5VSwgMHhiMzdiOGRmMVUsDQorICAgIDB4YjQ3NTlmYzlVLCAweGI1Nzc5OWMxVSwgMHhiNjcxOTNkOVUsIDB4Yjc3Mzk1ZDFVLA0KKyAgICAweGI4NmRiN2E5VSwgMHhiOTZmYjFhMVUsIDB4YmE2OWJiYjlVLCAweGJiNmJiZGIxVSwNCisgICAgMHhiYzY1YWY4OVUsIDB4YmQ2N2E5ODFVLCAweGJlNjFhMzk5VSwgMHhiZjYzYTU5MVUsDQorICAgIDB4YzA5ZGJhNGVVLCAweGMxOWZiYzQ2VSwgMHhjMjk5YjY1ZVUsIDB4YzM5YmIwNTZVLA0KKyAgICAweGM0OTVhMjZlVSwgMHhjNTk3YTQ2NlUsIDB4YzY5MWFlN2VVLCAweGM3OTNhODc2VSwNCisgICAgMHhjODhkOGEwZVUsIDB4Yzk4ZjhjMDZVLCAweGNhODk4NjFlVSwgMHhjYjhiODAxNlUsDQorICAgIDB4Y2M4NTkyMmVVLCAweGNkODc5NDI2VSwgMHhjZTgxOWUzZVUsIDB4Y2Y4Mzk4MzZVLA0KKyAgICAweGQwYmRkYWNlVSwgMHhkMWJmZGNjNlUsIDB4ZDJiOWQ2ZGVVLCAweGQzYmJkMGQ2VSwNCisgICAgMHhkNGI1YzJlZVUsIDB4ZDViN2M0ZTZVLCAweGQ2YjFjZWZlVSwgMHhkN2IzYzhmNlUsDQorICAgIDB4ZDhhZGVhOGVVLCAweGQ5YWZlYzg2VSwgMHhkYWE5ZTY5ZVUsIDB4ZGJhYmUwOTZVLA0KKyAgICAweGRjYTVmMmFlVSwgMHhkZGE3ZjRhNlUsIDB4ZGVhMWZlYmVVLCAweGRmYTNmOGI2VSwNCisgICAgMHhlMGRkN2E1M1UsIDB4ZTFkZjdjNWJVLCAweGUyZDk3NjQzVSwgMHhlM2RiNzA0YlUsDQorICAgIDB4ZTRkNTYyNzNVLCAweGU1ZDc2NDdiVSwgMHhlNmQxNmU2M1UsIDB4ZTdkMzY4NmJVLA0KKyAgICAweGU4Y2Q0YTEzVSwgMHhlOWNmNGMxYlUsIDB4ZWFjOTQ2MDNVLCAweGViY2I0MDBiVSwNCisgICAgMHhlY2M1NTIzM1UsIDB4ZWRjNzU0M2JVLCAweGVlYzE1ZTIzVSwgMHhlZmMzNTgyYlUsDQorICAgIDB4ZjBmZDFhZDNVLCAweGYxZmYxY2RiVSwgMHhmMmY5MTZjM1UsIDB4ZjNmYjEwY2JVLA0KKyAgICAweGY0ZjUwMmYzVSwgMHhmNWY3MDRmYlUsIDB4ZjZmMTBlZTNVLCAweGY3ZjMwOGViVSwNCisgICAgMHhmOGVkMmE5M1UsIDB4ZjllZjJjOWJVLCAweGZhZTkyNjgzVSwgMHhmYmViMjA4YlUsDQorICAgIDB4ZmNlNTMyYjNVLCAweGZkZTczNGJiVSwgMHhmZWUxM2VhM1UsIDB4ZmZlMzM4YWJVLA0KK307DQorDQorLyoqDQorICogVGhlIHJvdW5kIGNvbnN0YW50cy4NCisgKi8NCitzdGF0aWMgY29uc3QgdWxvbmczMiByY1tdID0gew0KKyAgICAweGJhNTQyZjc0VSwgMHg1M2QzZDI0ZFUsIDB4NTBhYzhkYmZVLCAweDcwNTI5YTRjVSwNCisgICAgMHhlYWQ1OTdkMVUsIDB4MzM1MTViYTZVLCAweGRlNDhhODk5VSwgMHhkYjMyYjdmY1UsDQorICAgIDB4ZTM5ZTkxOWJVLCAweGUyYmI0MTZlVSwgMHhhNWNiNmI5NVUsIDB4YTFmM2IxMDJVLA0KKyAgICAweGNjYzQxZDE0VSwgMHhjMzYzZGE1ZFUsIDB4NWZkYzdkY2RVLCAweDdmNWE2YzVjVSwNCisgICAgMHhmNzI2ZmZlZFUsIDB4ZTg5ZDZmOGVVLCAweDE5YTBmMDg5VSwNCit9Ow0KKw0KKw0KKw0KKyNlbHNlDQorDQorDQorc3RhdGljIGNvbnN0IHVsb25nMzIgVDBbMjU2XSA9IHsNCisgICAgMHhhNzUzYTZmNVUsIDB4ZDNiYjZiZDBVLCAweGU2ZDFiZjZlVSwgMHg3MWUyZDkzYlUsDQorICAgIDB4ZDBiZDY3ZGFVLCAweGFjNDU4YWNmVSwgMHg0ZDlhMjliM1UsIDB4NzlmMmY5MGJVLA0KKyAgICAweDNhNzRlODljVSwgMHhjOThmMDM4Y1UsIDB4OTEzZjdlNDFVLCAweGZjZTVkNzMyVSwNCisgICAgMHgxZTNjNzg0NFUsIDB4NDc4ZTAxOGZVLCAweDU0YTg0ZGU1VSwgMHhiZDY3Y2VhOVUsDQorICAgIDB4OGMwNTBhMGZVLCAweGE1NTdhZWY5VSwgMHg3YWY0ZjUwMVUsIDB4ZmJlYmNiMjBVLA0KKyAgICAweDYzYzY5MTU3VSwgMHhiODZkZGFiN1UsIDB4ZGRhNzUzZjRVLCAweGQ0YjU3N2MyVSwNCisgICAgMHhlNWQ3YjM2NFUsIDB4YjM3YmY2OGRVLCAweGM1OTczM2E0VSwgMHhiZTYxYzJhM1UsDQorICAgIDB4YTk0ZjllZDFVLCAweDg4MGQxYTE3VSwgMHgwYzE4MzAyOFUsIDB4YTI1OWIyZWJVLA0KKyAgICAweDM5NzJlNDk2VSwgMHhkZmEzNWJmOFUsIDB4Mjk1MmE0ZjZVLCAweGRhYTk0ZmU2VSwNCisgICAgMHgyYjU2YWNmYVUsIDB4YTg0ZDlhZDdVLCAweGNiOGIwYjgwVSwgMHg0Yzk4MmRiNVUsDQorICAgIDB4NGI5NjMxYTdVLCAweDIyNDQ4OGNjVSwgMHhhYTQ5OTJkYlUsIDB4MjQ0ODkwZDhVLA0KKyAgICAweDQxODIxOTliVSwgMHg3MGUwZGQzZFUsIDB4YTY1MWEyZjNVLCAweGY5ZWZjMzJjVSwNCisgICAgMHg1YWI0NzVjMVUsIDB4ZTJkOWFmNzZVLCAweGIwN2RmYTg3VSwgMHgzNjZjZDhiNFUsDQorICAgIDB4N2RmYWU5MTNVLCAweGU0ZDViNzYyVSwgMHgzMzY2Y2NhYVUsIDB4ZmZlM2RiMzhVLA0KKyAgICAweDYwYzA5ZDVkVSwgMHgyMDQwODBjMFUsIDB4MDgxMDIwMzBVLCAweDhiMGIxNjFkVSwNCisgICAgMHg1ZWJjNjVkOVUsIDB4YWI0Yjk2ZGRVLCAweDdmZmVlMTFmVSwgMHg3OGYwZmQwZFUsDQorICAgIDB4N2NmOGVkMTVVLCAweDJjNThiMGU4VSwgMHg1N2FlNDFlZlUsIDB4ZDJiOTZmZDZVLA0KKyAgICAweGRjYTU1N2YyVSwgMHg2ZGRhYTk3M1UsIDB4N2VmY2U1MTlVLCAweDBkMWEzNDJlVSwNCisgICAgMHg1M2E2NTFmN1UsIDB4OTQzNTZhNWZVLCAweGMzOWIyYmIwVSwgMHgyODUwYTBmMFUsDQorICAgIDB4Mjc0ZTljZDJVLCAweDA2MGMxODE0VSwgMHg1ZmJlNjFkZlUsIDB4YWQ0NzhlYzlVLA0KKyAgICAweDY3Y2U4MTRmVSwgMHg1Y2I4NmRkNVUsIDB4NTVhYTQ5ZTNVLCAweDQ4OTAzZGFkVSwNCisgICAgMHgwZTFjMzgyNFUsIDB4NTJhNDU1ZjFVLCAweGVhYzk4ZjQ2VSwgMHg0Mjg0MTU5MVUsDQorICAgIDB4NWJiNjcxYzdVLCAweDVkYmE2OWQzVSwgMHgzMDYwYzBhMFUsIDB4NThiMDdkY2RVLA0KKyAgICAweDUxYTI1OWZiVSwgMHg1OWIyNzljYlUsIDB4M2M3OGYwODhVLCAweDRlOWMyNWI5VSwNCisgICAgMHgzODcwZTA5MFUsIDB4OGEwOTEyMWJVLCAweDcyZTRkNTMxVSwgMHgxNDI4NTA3OFUsDQorICAgIDB4ZTdkM2JiNjhVLCAweGM2OTEzZmFlVSwgMHhkZWExNWZmZVUsIDB4NTBhMDVkZmRVLA0KKyAgICAweDhlMDEwMjAzVSwgMHg5MjM5NzI0YlUsIDB4ZDFiZjYzZGNVLCAweDc3ZWVjMTJmVSwNCisgICAgMHg5MzNiNzY0ZFUsIDB4NDU4YTA5ODNVLCAweDlhMjk1MjdiVSwgMHhjZTgxMWY5ZVUsDQorICAgIDB4MmQ1YWI0ZWVVLCAweDAzMDYwYzBhVSwgMHg2MmM0OTU1MVUsIDB4YjY3MWUyOTNVLA0KKyAgICAweGI5NmZkZWIxVSwgMHhiZjYzYzZhNVUsIDB4OTYzMTYyNTNVLCAweDZiZDZiMTY3VSwNCisgICAgMHgzZjdlZmM4MlUsIDB4MDcwZTFjMTJVLCAweDEyMjQ0ODZjVSwgMHhhZTQxODJjM1UsDQorICAgIDB4NDA4MDFkOWRVLCAweDM0NjhkMGI4VSwgMHg0NjhjMDU4OVUsIDB4M2U3Y2Y4ODRVLA0KKyAgICAweGRiYWI0YmUwVSwgMHhjZjgzMWI5OFUsIDB4ZWNjNTk3NTJVLCAweGNjODUxNzkyVSwNCisgICAgMHhjMTlmMjNiY1UsIDB4YTE1ZmJlZTFVLCAweGMwOWQyN2JhVSwgMHhkNmIxN2ZjZVUsDQorICAgIDB4MWQzYTc0NGVVLCAweGY0ZjVmNzAyVSwgMHg2MWMyOTk1YlUsIDB4M2I3NmVjOWFVLA0KKyAgICAweDEwMjA0MDYwVSwgMHhkOGFkNDdlYVUsIDB4NjhkMGJkNmRVLCAweGEwNWRiYWU3VSwNCisgICAgMHhiMTdmZmU4MVUsIDB4MGExNDI4M2NVLCAweDY5ZDJiOTZiVSwgMHg2Y2Q4YWQ3NVUsDQorICAgIDB4NDk5MjM5YWJVLCAweGZhZTljZjI2VSwgMHg3NmVjYzUyOVUsIDB4YzQ5NTM3YTJVLA0KKyAgICAweDllMjE0MjYzVSwgMHg5YjJiNTY3ZFUsIDB4NmVkY2E1NzlVLCAweDk5MmY1ZTcxVSwNCisgICAgMHhjMjk5MmZiNlUsIDB4Yjc3M2U2OTVVLCAweDk4MmQ1YTc3VSwgMHhiYzY1Y2FhZlUsDQorICAgIDB4OGYwMzA2MDVVLCAweDg1MTcyZTM5VSwgMHgxZjNlN2M0MlUsIDB4YjQ3NWVhOWZVLA0KKyAgICAweGY4ZWRjNzJhVSwgMHgxMTIyNDQ2NlUsIDB4MmU1Y2I4ZTRVLCAweDAwMDAwMDAwVSwNCisgICAgMHgyNTRhOTRkZVUsIDB4MWMzODcwNDhVLCAweDJhNTRhOGZjVSwgMHgzZDdhZjQ4ZVUsDQorICAgIDB4MDUwYTE0MWVVLCAweDRmOWUyMWJmVSwgMHg3YmY2ZjEwN1UsIDB4YjI3OWYyOGJVLA0KKyAgICAweDMyNjRjOGFjVSwgMHg5MDNkN2E0N1UsIDB4YWY0Mzg2YzVVLCAweDE5MzI2NDU2VSwNCisgICAgMHhhMzViYjZlZFUsIDB4ZjdmM2ZiMDhVLCAweDczZTZkMTM3VSwgMHg5ZDI3NGU2OVUsDQorICAgIDB4MTUyYTU0N2VVLCAweDc0ZThjZDI1VSwgMHhlZWMxOWY1ZVUsIDB4Y2E4OTBmODZVLA0KKyAgICAweDlmMjM0NjY1VSwgMHgwZjFlM2MyMlUsIDB4MWIzNjZjNWFVLCAweDc1ZWFjOTIzVSwNCisgICAgMHg4NjExMjIzM1UsIDB4ODQxNTJhM2ZVLCAweDljMjU0YTZmVSwgMHg0YTk0MzVhMVUsDQorICAgIDB4OTczMzY2NTVVLCAweDFhMzQ2ODVjVSwgMHg2NWNhODk0M1UsIDB4ZjZmMWZmMGVVLA0KKyAgICAweGVkYzc5MzU0VSwgMHgwOTEyMjQzNlUsIDB4YmI2YmQ2YmRVLCAweDI2NGM5OGQ0VSwNCisgICAgMHg4MzFiMzYyZFUsIDB4ZWJjYjhiNDBVLCAweDZmZGVhMTdmVSwgMHg4MTFmM2UyMVUsDQorICAgIDB4MDQwODEwMThVLCAweDZhZDRiNTYxVSwgMHg0Mzg2MTE5N1UsIDB4MDEwMjA0MDZVLA0KKyAgICAweDE3MmU1YzcyVSwgMHhlMWRmYTM3Y1UsIDB4ODcxMzI2MzVVLCAweGY1ZjdmMzA0VSwNCisgICAgMHg4ZDA3MGUwOVUsIDB4ZTNkYmFiNzBVLCAweDIzNDY4Y2NhVSwgMHg4MDFkM2EyN1UsDQorICAgIDB4NDQ4ODBkODVVLCAweDE2MmM1ODc0VSwgMHg2NmNjODU0OVUsIDB4MjE0Mjg0YzZVLA0KKyAgICAweGZlZTFkZjNlVSwgMHhkNWI3NzNjNFUsIDB4MzE2MmM0YTZVLCAweGQ5YWY0M2VjVSwNCisgICAgMHgzNTZhZDRiZVUsIDB4MTgzMDYwNTBVLCAweDAyMDQwODBjVSwgMHg2NGM4OGQ0NVUsDQorICAgIDB4ZjJmOWVmMTZVLCAweGYxZmZlMzFjVSwgMHg1NmFjNDVlOVUsIDB4Y2Q4NzEzOTRVLA0KKyAgICAweDgyMTkzMjJiVSwgMHhjODhkMDc4YVUsIDB4YmE2OWQyYmJVLCAweGYwZmRlNzFhVSwNCisgICAgMHhlZmMzOWI1OFUsIDB4ZTljZjgzNGNVLCAweGU4Y2Q4NzRhVSwgMHhmZGU3ZDMzNFUsDQorICAgIDB4ODkwZjFlMTFVLCAweGQ3YjM3YmM4VSwgMHhjNzkzM2JhOFUsIDB4YjU3N2VlOTlVLA0KKyAgICAweGE0NTVhYWZmVSwgMHgyZjVlYmNlMlUsIDB4OTUzNzZlNTlVLCAweDEzMjY0YzZhVSwNCisgICAgMHgwYjE2MmMzYVUsIDB4ZjNmYmViMTBVLCAweGUwZGRhNzdhVSwgMHgzNzZlZGNiMlUsDQorfTsNCisNCitzdGF0aWMgY29uc3QgdWxvbmczMiBUMVsyNTZdID0gew0KKyAgICAweDUzYTdmNWE2VSwgMHhiYmQzZDA2YlUsIDB4ZDFlNjZlYmZVLCAweGUyNzEzYmQ5VSwNCisgICAgMHhiZGQwZGE2N1UsIDB4NDVhY2NmOGFVLCAweDlhNGRiMzI5VSwgMHhmMjc5MGJmOVUsDQorICAgIDB4NzQzYTljZThVLCAweDhmYzk4YzAzVSwgMHgzZjkxNDE3ZVUsIDB4ZTVmYzMyZDdVLA0KKyAgICAweDNjMWU0NDc4VSwgMHg4ZTQ3OGYwMVUsIDB4YTg1NGU1NGRVLCAweDY3YmRhOWNlVSwNCisgICAgMHgwNThjMGYwYVUsIDB4NTdhNWY5YWVVLCAweGY0N2EwMWY1VSwgMHhlYmZiMjBjYlUsDQorICAgIDB4YzY2MzU3OTFVLCAweDZkYjhiN2RhVSwgMHhhN2RkZjQ1M1UsIDB4YjVkNGMyNzdVLA0KKyAgICAweGQ3ZTU2NGIzVSwgMHg3YmIzOGRmNlUsIDB4OTdjNWE0MzNVLCAweDYxYmVhM2MyVSwNCisgICAgMHg0ZmE5ZDE5ZVUsIDB4MGQ4ODE3MWFVLCAweDE4MGMyODMwVSwgMHg1OWEyZWJiMlUsDQorICAgIDB4NzIzOTk2ZTRVLCAweGEzZGZmODViVSwgMHg1MjI5ZjZhNFUsIDB4YTlkYWU2NGZVLA0KKyAgICAweDU2MmJmYWFjVSwgMHg0ZGE4ZDc5YVUsIDB4OGJjYjgwMGJVLCAweDk4NGNiNTJkVSwNCisgICAgMHg5NjRiYTczMVUsIDB4NDQyMmNjODhVLCAweDQ5YWFkYjkyVSwgMHg0ODI0ZDg5MFUsDQorICAgIDB4ODI0MTliMTlVLCAweGUwNzAzZGRkVSwgMHg1MWE2ZjNhMlUsIDB4ZWZmOTJjYzNVLA0KKyAgICAweGI0NWFjMTc1VSwgMHhkOWUyNzZhZlUsIDB4N2RiMDg3ZmFVLCAweDZjMzZiNGQ4VSwNCisgICAgMHhmYTdkMTNlOVUsIDB4ZDVlNDYyYjdVLCAweDY2MzNhYWNjVSwgMHhlM2ZmMzhkYlUsDQorICAgIDB4YzA2MDVkOWRVLCAweDQwMjBjMDgwVSwgMHgxMDA4MzAyMFUsIDB4MGI4YjFkMTZVLA0KKyAgICAweGJjNWVkOTY1VSwgMHg0YmFiZGQ5NlUsIDB4ZmU3ZjFmZTFVLCAweGYwNzgwZGZkVSwNCisgICAgMHhmODdjMTVlZFUsIDB4NTgyY2U4YjBVLCAweGFlNTdlZjQxVSwgMHhiOWQyZDY2ZlUsDQorICAgIDB4YTVkY2YyNTdVLCAweGRhNmQ3M2E5VSwgMHhmYzdlMTllNVUsIDB4MWEwZDJlMzRVLA0KKyAgICAweGE2NTNmNzUxVSwgMHgzNTk0NWY2YVUsIDB4OWJjM2IwMmJVLCAweDUwMjhmMGEwVSwNCisgICAgMHg0ZTI3ZDI5Y1UsIDB4MGMwNjE0MThVLCAweGJlNWZkZjYxVSwgMHg0N2FkYzk4ZVUsDQorICAgIDB4Y2U2NzRmODFVLCAweGI4NWNkNTZkVSwgMHhhYTU1ZTM0OVUsIDB4OTA0OGFkM2RVLA0KKyAgICAweDFjMGUyNDM4VSwgMHhhNDUyZjE1NVUsIDB4YzllYTQ2OGZVLCAweDg0NDI5MTE1VSwNCisgICAgMHhiNjViYzc3MVUsIDB4YmE1ZGQzNjlVLCAweDYwMzBhMGMwVSwgMHhiMDU4Y2Q3ZFUsDQorICAgIDB4YTI1MWZiNTlVLCAweGIyNTljYjc5VSwgMHg3ODNjODhmMFUsIDB4OWM0ZWI5MjVVLA0KKyAgICAweDcwMzg5MGUwVSwgMHgwOThhMWIxMlUsIDB4ZTQ3MjMxZDVVLCAweDI4MTQ3ODUwVSwNCisgICAgMHhkM2U3NjhiYlUsIDB4OTFjNmFlM2ZVLCAweGExZGVmZTVmVSwgMHhhMDUwZmQ1ZFUsDQorICAgIDB4MDE4ZTAzMDJVLCAweDM5OTI0YjcyVSwgMHhiZmQxZGM2M1UsIDB4ZWU3NzJmYzFVLA0KKyAgICAweDNiOTM0ZDc2VSwgMHg4YTQ1ODMwOVUsIDB4Mjk5YTdiNTJVLCAweDgxY2U5ZTFmVSwNCisgICAgMHg1YTJkZWViNFUsIDB4MDYwMzBhMGNVLCAweGM0NjI1MTk1VSwgMHg3MWI2OTNlMlUsDQorICAgIDB4NmZiOWIxZGVVLCAweDYzYmZhNWM2VSwgMHgzMTk2NTM2MlUsIDB4ZDY2YjY3YjFVLA0KKyAgICAweDdlM2Y4MmZjVSwgMHgwZTA3MTIxY1UsIDB4MjQxMjZjNDhVLCAweDQxYWVjMzgyVSwNCisgICAgMHg4MDQwOWQxZFUsIDB4NjgzNGI4ZDBVLCAweDhjNDY4OTA1VSwgMHg3YzNlODRmOFUsDQorICAgIDB4YWJkYmUwNGJVLCAweDgzY2Y5ODFiVSwgMHhjNWVjNTI5N1UsIDB4ODVjYzkyMTdVLA0KKyAgICAweDlmYzFiYzIzVSwgMHg1ZmExZTFiZVUsIDB4OWRjMGJhMjdVLCAweGIxZDZjZTdmVSwNCisgICAgMHgzYTFkNGU3NFUsIDB4ZjVmNDAyZjdVLCAweGMyNjE1Yjk5VSwgMHg3NjNiOWFlY1UsDQorICAgIDB4MjAxMDYwNDBVLCAweGFkZDhlYTQ3VSwgMHhkMDY4NmRiZFUsIDB4NWRhMGU3YmFVLA0KKyAgICAweDdmYjE4MWZlVSwgMHgxNDBhM2MyOFUsIDB4ZDI2OTZiYjlVLCAweGQ4NmM3NWFkVSwNCisgICAgMHg5MjQ5YWIzOVUsIDB4ZTlmYTI2Y2ZVLCAweGVjNzYyOWM1VSwgMHg5NWM0YTIzN1UsDQorICAgIDB4MjE5ZTYzNDJVLCAweDJiOWI3ZDU2VSwgMHhkYzZlNzlhNVUsIDB4MmY5OTcxNWVVLA0KKyAgICAweDk5YzJiNjJmVSwgMHg3M2I3OTVlNlUsIDB4MmQ5ODc3NWFVLCAweDY1YmNhZmNhVSwNCisgICAgMHgwMzhmMDUwNlUsIDB4MTc4NTM5MmVVLCAweDNlMWY0MjdjVSwgMHg3NWI0OWZlYVUsDQorICAgIDB4ZWRmODJhYzdVLCAweDIyMTE2NjQ0VSwgMHg1YzJlZTRiOFUsIDB4MDAwMDAwMDBVLA0KKyAgICAweDRhMjVkZTk0VSwgMHgzODFjNDg3MFUsIDB4NTQyYWZjYThVLCAweDdhM2Q4ZWY0VSwNCisgICAgMHgwYTA1MWUxNFUsIDB4OWU0ZmJmMjFVLCAweGY2N2IwN2YxVSwgMHg3OWIyOGJmMlUsDQorICAgIDB4NjQzMmFjYzhVLCAweDNkOTA0NzdhVSwgMHg0M2FmYzU4NlUsIDB4MzIxOTU2NjRVLA0KKyAgICAweDViYTNlZGI2VSwgMHhmM2Y3MDhmYlUsIDB4ZTY3MzM3ZDFVLCAweDI3OWQ2OTRlVSwNCisgICAgMHgyYTE1N2U1NFUsIDB4ZTg3NDI1Y2RVLCAweGMxZWU1ZTlmVSwgMHg4OWNhODYwZlUsDQorICAgIDB4MjM5ZjY1NDZVLCAweDFlMGYyMjNjVSwgMHgzNjFiNWE2Y1UsIDB4ZWE3NTIzYzlVLA0KKyAgICAweDExODYzMzIyVSwgMHgxNTg0M2YyYVUsIDB4MjU5YzZmNGFVLCAweDk0NGFhMTM1VSwNCisgICAgMHgzMzk3NTU2NlUsIDB4MzQxYTVjNjhVLCAweGNhNjU0Mzg5VSwgMHhmMWY2MGVmZlUsDQorICAgIDB4YzdlZDU0OTNVLCAweDEyMDkzNjI0VSwgMHg2YmJiYmRkNlUsIDB4NGMyNmQ0OThVLA0KKyAgICAweDFiODMyZDM2VSwgMHhjYmViNDA4YlUsIDB4ZGU2ZjdmYTFVLCAweDFmODEyMTNlVSwNCisgICAgMHgwODA0MTgxMFUsIDB4ZDQ2YTYxYjVVLCAweDg2NDM5NzExVSwgMHgwMjAxMDYwNFUsDQorICAgIDB4MmUxNzcyNWNVLCAweGRmZTE3Y2EzVSwgMHgxMzg3MzUyNlUsIDB4ZjdmNTA0ZjNVLA0KKyAgICAweDA3OGQwOTBlVSwgMHhkYmUzNzBhYlUsIDB4NDYyM2NhOGNVLCAweDFkODAyNzNhVSwNCisgICAgMHg4ODQ0ODUwZFUsIDB4MmMxNjc0NThVLCAweGNjNjY0OTg1VSwgMHg0MjIxYzY4NFUsDQorICAgIDB4ZTFmZTNlZGZVLCAweGI3ZDVjNDczVSwgMHg2MjMxYTZjNFUsIDB4YWZkOWVjNDNVLA0KKyAgICAweDZhMzViZWQ0VSwgMHgzMDE4NTA2MFUsIDB4MDQwMjBjMDhVLCAweGM4NjQ0NThkVSwNCisgICAgMHhmOWYyMTZlZlUsIDB4ZmZmMTFjZTNVLCAweGFjNTZlOTQ1VSwgMHg4N2NkOTQxM1UsDQorICAgIDB4MTk4MjJiMzJVLCAweDhkYzg4YTA3VSwgMHg2OWJhYmJkMlUsIDB4ZmRmMDFhZTdVLA0KKyAgICAweGMzZWY1ODliVSwgMHhjZmU5NGM4M1UsIDB4Y2RlODRhODdVLCAweGU3ZmQzNGQzVSwNCisgICAgMHgwZjg5MTExZVUsIDB4YjNkN2M4N2JVLCAweDkzYzdhODNiVSwgMHg3N2I1OTllZVUsDQorICAgIDB4NTVhNGZmYWFVLCAweDVlMmZlMmJjVSwgMHgzNzk1NTk2ZVUsIDB4MjYxMzZhNGNVLA0KKyAgICAweDE2MGIzYTJjVSwgMHhmYmYzMTBlYlUsIDB4ZGRlMDdhYTdVLCAweDZlMzdiMmRjVSwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCB1bG9uZzMyIFQyWzI1Nl0gPSB7DQorICAgIDB4YTZmNWE3NTNVLCAweDZiZDBkM2JiVSwgMHhiZjZlZTZkMVUsIDB4ZDkzYjcxZTJVLA0KKyAgICAweDY3ZGFkMGJkVSwgMHg4YWNmYWM0NVUsIDB4MjliMzRkOWFVLCAweGY5MGI3OWYyVSwNCisgICAgMHhlODljM2E3NFUsIDB4MDM4Y2M5OGZVLCAweDdlNDE5MTNmVSwgMHhkNzMyZmNlNVUsDQorICAgIDB4Nzg0NDFlM2NVLCAweDAxOGY0NzhlVSwgMHg0ZGU1NTRhOFUsIDB4Y2VhOWJkNjdVLA0KKyAgICAweDBhMGY4YzA1VSwgMHhhZWY5YTU1N1UsIDB4ZjUwMTdhZjRVLCAweGNiMjBmYmViVSwNCisgICAgMHg5MTU3NjNjNlUsIDB4ZGFiN2I4NmRVLCAweDUzZjRkZGE3VSwgMHg3N2MyZDRiNVUsDQorICAgIDB4YjM2NGU1ZDdVLCAweGY2OGRiMzdiVSwgMHgzM2E0YzU5N1UsIDB4YzJhM2JlNjFVLA0KKyAgICAweDllZDFhOTRmVSwgMHgxYTE3ODgwZFUsIDB4MzAyODBjMThVLCAweGIyZWJhMjU5VSwNCisgICAgMHhlNDk2Mzk3MlUsIDB4NWJmOGRmYTNVLCAweGE0ZjYyOTUyVSwgMHg0ZmU2ZGFhOVUsDQorICAgIDB4YWNmYTJiNTZVLCAweDlhZDdhODRkVSwgMHgwYjgwY2I4YlUsIDB4MmRiNTRjOThVLA0KKyAgICAweDMxYTc0Yjk2VSwgMHg4OGNjMjI0NFUsIDB4OTJkYmFhNDlVLCAweDkwZDgyNDQ4VSwNCisgICAgMHgxOTliNDE4MlUsIDB4ZGQzZDcwZTBVLCAweGEyZjNhNjUxVSwgMHhjMzJjZjllZlUsDQorICAgIDB4NzVjMTVhYjRVLCAweGFmNzZlMmQ5VSwgMHhmYTg3YjA3ZFUsIDB4ZDhiNDM2NmNVLA0KKyAgICAweGU5MTM3ZGZhVSwgMHhiNzYyZTRkNVUsIDB4Y2NhYTMzNjZVLCAweGRiMzhmZmUzVSwNCisgICAgMHg5ZDVkNjBjMFUsIDB4ODBjMDIwNDBVLCAweDIwMzAwODEwVSwgMHgxNjFkOGIwYlUsDQorICAgIDB4NjVkOTVlYmNVLCAweDk2ZGRhYjRiVSwgMHhlMTFmN2ZmZVUsIDB4ZmQwZDc4ZjBVLA0KKyAgICAweGVkMTU3Y2Y4VSwgMHhiMGU4MmM1OFUsIDB4NDFlZjU3YWVVLCAweDZmZDZkMmI5VSwNCisgICAgMHg1N2YyZGNhNVUsIDB4YTk3MzZkZGFVLCAweGU1MTk3ZWZjVSwgMHgzNDJlMGQxYVUsDQorICAgIDB4NTFmNzUzYTZVLCAweDZhNWY5NDM1VSwgMHgyYmIwYzM5YlUsIDB4YTBmMDI4NTBVLA0KKyAgICAweDljZDIyNzRlVSwgMHgxODE0MDYwY1UsIDB4NjFkZjVmYmVVLCAweDhlYzlhZDQ3VSwNCisgICAgMHg4MTRmNjdjZVUsIDB4NmRkNTVjYjhVLCAweDQ5ZTM1NWFhVSwgMHgzZGFkNDg5MFUsDQorICAgIDB4MzgyNDBlMWNVLCAweDU1ZjE1MmE0VSwgMHg4ZjQ2ZWFjOVUsIDB4MTU5MTQyODRVLA0KKyAgICAweDcxYzc1YmI2VSwgMHg2OWQzNWRiYVUsIDB4YzBhMDMwNjBVLCAweDdkY2Q1OGIwVSwNCisgICAgMHg1OWZiNTFhMlUsIDB4NzljYjU5YjJVLCAweGYwODgzYzc4VSwgMHgyNWI5NGU5Y1UsDQorICAgIDB4ZTA5MDM4NzBVLCAweDEyMWI4YTA5VSwgMHhkNTMxNzJlNFUsIDB4NTA3ODE0MjhVLA0KKyAgICAweGJiNjhlN2QzVSwgMHgzZmFlYzY5MVUsIDB4NWZmZWRlYTFVLCAweDVkZmQ1MGEwVSwNCisgICAgMHgwMjAzOGUwMVUsIDB4NzI0YjkyMzlVLCAweDYzZGNkMWJmVSwgMHhjMTJmNzdlZVUsDQorICAgIDB4NzY0ZDkzM2JVLCAweDA5ODM0NThhVSwgMHg1MjdiOWEyOVUsIDB4MWY5ZWNlODFVLA0KKyAgICAweGI0ZWUyZDVhVSwgMHgwYzBhMDMwNlUsIDB4OTU1MTYyYzRVLCAweGUyOTNiNjcxVSwNCisgICAgMHhkZWIxYjk2ZlUsIDB4YzZhNWJmNjNVLCAweDYyNTM5NjMxVSwgMHhiMTY3NmJkNlUsDQorICAgIDB4ZmM4MjNmN2VVLCAweDFjMTIwNzBlVSwgMHg0ODZjMTIyNFUsIDB4ODJjM2FlNDFVLA0KKyAgICAweDFkOWQ0MDgwVSwgMHhkMGI4MzQ2OFUsIDB4MDU4OTQ2OGNVLCAweGY4ODQzZTdjVSwNCisgICAgMHg0YmUwZGJhYlUsIDB4MWI5OGNmODNVLCAweDk3NTJlY2M1VSwgMHgxNzkyY2M4NVUsDQorICAgIDB4MjNiY2MxOWZVLCAweGJlZTFhMTVmVSwgMHgyN2JhYzA5ZFUsIDB4N2ZjZWQ2YjFVLA0KKyAgICAweDc0NGUxZDNhVSwgMHhmNzAyZjRmNVUsIDB4OTk1YjYxYzJVLCAweGVjOWEzYjc2VSwNCisgICAgMHg0MDYwMTAyMFUsIDB4NDdlYWQ4YWRVLCAweGJkNmQ2OGQwVSwgMHhiYWU3YTA1ZFUsDQorICAgIDB4ZmU4MWIxN2ZVLCAweDI4M2MwYTE0VSwgMHhiOTZiNjlkMlUsIDB4YWQ3NTZjZDhVLA0KKyAgICAweDM5YWI0OTkyVSwgMHhjZjI2ZmFlOVUsIDB4YzUyOTc2ZWNVLCAweDM3YTJjNDk1VSwNCisgICAgMHg0MjYzOWUyMVUsIDB4NTY3ZDliMmJVLCAweGE1Nzk2ZWRjVSwgMHg1ZTcxOTkyZlUsDQorICAgIDB4MmZiNmMyOTlVLCAweGU2OTViNzczVSwgMHg1YTc3OTgyZFUsIDB4Y2FhZmJjNjVVLA0KKyAgICAweDA2MDU4ZjAzVSwgMHgyZTM5ODUxN1UsIDB4N2M0MjFmM2VVLCAweGVhOWZiNDc1VSwNCisgICAgMHhjNzJhZjhlZFUsIDB4NDQ2NjExMjJVLCAweGI4ZTQyZTVjVSwgMHgwMDAwMDAwMFUsDQorICAgIDB4OTRkZTI1NGFVLCAweDcwNDgxYzM4VSwgMHhhOGZjMmE1NFUsIDB4ZjQ4ZTNkN2FVLA0KKyAgICAweDE0MWUwNTBhVSwgMHgyMWJmNGY5ZVUsIDB4ZjEwNzdiZjZVLCAweGYyOGJiMjc5VSwNCisgICAgMHhjOGFjMzI2NFUsIDB4N2E0NzkwM2RVLCAweDg2YzVhZjQzVSwgMHg2NDU2MTkzMlUsDQorICAgIDB4YjZlZGEzNWJVLCAweGZiMDhmN2YzVSwgMHhkMTM3NzNlNlUsIDB4NGU2OTlkMjdVLA0KKyAgICAweDU0N2UxNTJhVSwgMHhjZDI1NzRlOFUsIDB4OWY1ZWVlYzFVLCAweDBmODZjYTg5VSwNCisgICAgMHg0NjY1OWYyM1UsIDB4M2MyMjBmMWVVLCAweDZjNWExYjM2VSwgMHhjOTIzNzVlYVUsDQorICAgIDB4MjIzMzg2MTFVLCAweDJhM2Y4NDE1VSwgMHg0YTZmOWMyNVUsIDB4MzVhMTRhOTRVLA0KKyAgICAweDY2NTU5NzMzVSwgMHg2ODVjMWEzNFUsIDB4ODk0MzY1Y2FVLCAweGZmMGVmNmYxVSwNCisgICAgMHg5MzU0ZWRjN1UsIDB4MjQzNjA5MTJVLCAweGQ2YmRiYjZiVSwgMHg5OGQ0MjY0Y1UsDQorICAgIDB4MzYyZDgzMWJVLCAweDhiNDBlYmNiVSwgMHhhMTdmNmZkZVUsIDB4M2UyMTgxMWZVLA0KKyAgICAweDEwMTgwNDA4VSwgMHhiNTYxNmFkNFUsIDB4MTE5NzQzODZVLCAweDA0MDYwMTAyVSwNCisgICAgMHg1YzcyMTcyZVUsIDB4YTM3Y2UxZGZVLCAweDI2MzU4NzEzVSwgMHhmMzA0ZjVmN1UsDQorICAgIDB4MGUwOThkMDdVLCAweGFiNzBlM2RiVSwgMHg4Y2NhMjM0NlUsIDB4M2EyNzgwMWRVLA0KKyAgICAweDBkODU0NDg4VSwgMHg1ODc0MTYyY1UsIDB4ODU0OTY2Y2NVLCAweDg0YzYyMTQyVSwNCisgICAgMHhkZjNlZmVlMVUsIDB4NzNjNGQ1YjdVLCAweGM0YTYzMTYyVSwgMHg0M2VjZDlhZlUsDQorICAgIDB4ZDRiZTM1NmFVLCAweDYwNTAxODMwVSwgMHgwODBjMDIwNFUsIDB4OGQ0NTY0YzhVLA0KKyAgICAweGVmMTZmMmY5VSwgMHhlMzFjZjFmZlUsIDB4NDVlOTU2YWNVLCAweDEzOTRjZDg3VSwNCisgICAgMHgzMjJiODIxOVUsIDB4MDc4YWM4OGRVLCAweGQyYmJiYTY5VSwgMHhlNzFhZjBmZFUsDQorICAgIDB4OWI1OGVmYzNVLCAweDgzNGNlOWNmVSwgMHg4NzRhZThjZFUsIDB4ZDMzNGZkZTdVLA0KKyAgICAweDFlMTE4OTBmVSwgMHg3YmM4ZDdiM1UsIDB4M2JhOGM3OTNVLCAweGVlOTliNTc3VSwNCisgICAgMHhhYWZmYTQ1NVUsIDB4YmNlMjJmNWVVLCAweDZlNTk5NTM3VSwgMHg0YzZhMTMyNlUsDQorICAgIDB4MmMzYTBiMTZVLCAweGViMTBmM2ZiVSwgMHhhNzdhZTBkZFUsIDB4ZGNiMjM3NmVVLA0KK307DQorDQorc3RhdGljIGNvbnN0IHVsb25nMzIgVDNbMjU2XSA9IHsNCisgICAgMHhmNWE2NTNhN1UsIDB4ZDA2YmJiZDNVLCAweDZlYmZkMWU2VSwgMHgzYmQ5ZTI3MVUsDQorICAgIDB4ZGE2N2JkZDBVLCAweGNmOGE0NWFjVSwgMHhiMzI5OWE0ZFUsIDB4MGJmOWYyNzlVLA0KKyAgICAweDljZTg3NDNhVSwgMHg4YzAzOGZjOVUsIDB4NDE3ZTNmOTFVLCAweDMyZDdlNWZjVSwNCisgICAgMHg0NDc4M2MxZVUsIDB4OGYwMThlNDdVLCAweGU1NGRhODU0VSwgMHhhOWNlNjdiZFUsDQorICAgIDB4MGYwYTA1OGNVLCAweGY5YWU1N2E1VSwgMHgwMWY1ZjQ3YVUsIDB4MjBjYmViZmJVLA0KKyAgICAweDU3OTFjNjYzVSwgMHhiN2RhNmRiOFUsIDB4ZjQ1M2E3ZGRVLCAweGMyNzdiNWQ0VSwNCisgICAgMHg2NGIzZDdlNVUsIDB4OGRmNjdiYjNVLCAweGE0MzM5N2M1VSwgMHhhM2MyNjFiZVUsDQorICAgIDB4ZDE5ZTRmYTlVLCAweDE3MWEwZDg4VSwgMHgyODMwMTgwY1UsIDB4ZWJiMjU5YTJVLA0KKyAgICAweDk2ZTQ3MjM5VSwgMHhmODViYTNkZlUsIDB4ZjZhNDUyMjlVLCAweGU2NGZhOWRhVSwNCisgICAgMHhmYWFjNTYyYlUsIDB4ZDc5YTRkYThVLCAweDgwMGI4YmNiVSwgMHhiNTJkOTg0Y1UsDQorICAgIDB4YTczMTk2NGJVLCAweGNjODg0NDIyVSwgMHhkYjkyNDlhYVUsIDB4ZDg5MDQ4MjRVLA0KKyAgICAweDliMTk4MjQxVSwgMHgzZGRkZTA3MFUsIDB4ZjNhMjUxYTZVLCAweDJjYzNlZmY5VSwNCisgICAgMHhjMTc1YjQ1YVUsIDB4NzZhZmQ5ZTJVLCAweDg3ZmE3ZGIwVSwgMHhiNGQ4NmMzNlUsDQorICAgIDB4MTNlOWZhN2RVLCAweDYyYjdkNWU0VSwgMHhhYWNjNjYzM1UsIDB4MzhkYmUzZmZVLA0KKyAgICAweDVkOWRjMDYwVSwgMHhjMDgwNDAyMFUsIDB4MzAyMDEwMDhVLCAweDFkMTYwYjhiVSwNCisgICAgMHhkOTY1YmM1ZVUsIDB4ZGQ5NjRiYWJVLCAweDFmZTFmZTdmVSwgMHgwZGZkZjA3OFUsDQorICAgIDB4MTVlZGY4N2NVLCAweGU4YjA1ODJjVSwgMHhlZjQxYWU1N1UsIDB4ZDY2ZmI5ZDJVLA0KKyAgICAweGYyNTdhNWRjVSwgMHg3M2E5ZGE2ZFUsIDB4MTllNWZjN2VVLCAweDJlMzQxYTBkVSwNCisgICAgMHhmNzUxYTY1M1UsIDB4NWY2YTM1OTRVLCAweGIwMmI5YmMzVSwgMHhmMGEwNTAyOFUsDQorICAgIDB4ZDI5YzRlMjdVLCAweDE0MTgwYzA2VSwgMHhkZjYxYmU1ZlUsIDB4Yzk4ZTQ3YWRVLA0KKyAgICAweDRmODFjZTY3VSwgMHhkNTZkYjg1Y1UsIDB4ZTM0OWFhNTVVLCAweGFkM2Q5MDQ4VSwNCisgICAgMHgyNDM4MWMwZVUsIDB4ZjE1NWE0NTJVLCAweDQ2OGZjOWVhVSwgMHg5MTE1ODQ0MlUsDQorICAgIDB4Yzc3MWI2NWJVLCAweGQzNjliYTVkVSwgMHhhMGMwNjAzMFUsIDB4Y2Q3ZGIwNThVLA0KKyAgICAweGZiNTlhMjUxVSwgMHhjYjc5YjI1OVUsIDB4ODhmMDc4M2NVLCAweGI5MjU5YzRlVSwNCisgICAgMHg5MGUwNzAzOFUsIDB4MWIxMjA5OGFVLCAweDMxZDVlNDcyVSwgMHg3ODUwMjgxNFUsDQorICAgIDB4NjhiYmQzZTdVLCAweGFlM2Y5MWM2VSwgMHhmZTVmYTFkZVUsIDB4ZmQ1ZGEwNTBVLA0KKyAgICAweDAzMDIwMThlVSwgMHg0YjcyMzk5MlUsIDB4ZGM2M2JmZDFVLCAweDJmYzFlZTc3VSwNCisgICAgMHg0ZDc2M2I5M1UsIDB4ODMwOThhNDVVLCAweDdiNTIyOTlhVSwgMHg5ZTFmODFjZVUsDQorICAgIDB4ZWViNDVhMmRVLCAweDBhMGMwNjAzVSwgMHg1MTk1YzQ2MlUsIDB4OTNlMjcxYjZVLA0KKyAgICAweGIxZGU2ZmI5VSwgMHhhNWM2NjNiZlUsIDB4NTM2MjMxOTZVLCAweDY3YjFkNjZiVSwNCisgICAgMHg4MmZjN2UzZlUsIDB4MTIxYzBlMDdVLCAweDZjNDgyNDEyVSwgMHhjMzgyNDFhZVUsDQorICAgIDB4OWQxZDgwNDBVLCAweGI4ZDA2ODM0VSwgMHg4OTA1OGM0NlUsIDB4ODRmODdjM2VVLA0KKyAgICAweGUwNGJhYmRiVSwgMHg5ODFiODNjZlUsIDB4NTI5N2M1ZWNVLCAweDkyMTc4NWNjVSwNCisgICAgMHhiYzIzOWZjMVUsIDB4ZTFiZTVmYTFVLCAweGJhMjc5ZGMwVSwgMHhjZTdmYjFkNlUsDQorICAgIDB4NGU3NDNhMWRVLCAweDAyZjdmNWY0VSwgMHg1Yjk5YzI2MVUsIDB4OWFlYzc2M2JVLA0KKyAgICAweDYwNDAyMDEwVSwgMHhlYTQ3YWRkOFUsIDB4NmRiZGQwNjhVLCAweGU3YmE1ZGEwVSwNCisgICAgMHg4MWZlN2ZiMVUsIDB4M2MyODE0MGFVLCAweDZiYjlkMjY5VSwgMHg3NWFkZDg2Y1UsDQorICAgIDB4YWIzOTkyNDlVLCAweDI2Y2ZlOWZhVSwgMHgyOWM1ZWM3NlUsIDB4YTIzNzk1YzRVLA0KKyAgICAweDYzNDIyMTllVSwgMHg3ZDU2MmI5YlUsIDB4NzlhNWRjNmVVLCAweDcxNWUyZjk5VSwNCisgICAgMHhiNjJmOTljMlUsIDB4OTVlNjczYjdVLCAweDc3NWEyZDk4VSwgMHhhZmNhNjViY1UsDQorICAgIDB4MDUwNjAzOGZVLCAweDM5MmUxNzg1VSwgMHg0MjdjM2UxZlUsIDB4OWZlYTc1YjRVLA0KKyAgICAweDJhYzdlZGY4VSwgMHg2NjQ0MjIxMVUsIDB4ZTRiODVjMmVVLCAweDAwMDAwMDAwVSwNCisgICAgMHhkZTk0NGEyNVUsIDB4NDg3MDM4MWNVLCAweGZjYTg1NDJhVSwgMHg4ZWY0N2EzZFUsDQorICAgIDB4MWUxNDBhMDVVLCAweGJmMjE5ZTRmVSwgMHgwN2YxZjY3YlUsIDB4OGJmMjc5YjJVLA0KKyAgICAweGFjYzg2NDMyVSwgMHg0NzdhM2Q5MFUsIDB4YzU4NjQzYWZVLCAweDU2NjQzMjE5VSwNCisgICAgMHhlZGI2NWJhM1UsIDB4MDhmYmYzZjdVLCAweDM3ZDFlNjczVSwgMHg2OTRlMjc5ZFUsDQorICAgIDB4N2U1NDJhMTVVLCAweDI1Y2RlODc0VSwgMHg1ZTlmYzFlZVUsIDB4ODYwZjg5Y2FVLA0KKyAgICAweDY1NDYyMzlmVSwgMHgyMjNjMWUwZlUsIDB4NWE2YzM2MWJVLCAweDIzYzllYTc1VSwNCisgICAgMHgzMzIyMTE4NlUsIDB4M2YyYTE1ODRVLCAweDZmNGEyNTljVSwgMHhhMTM1OTQ0YVUsDQorICAgIDB4NTU2NjMzOTdVLCAweDVjNjgzNDFhVSwgMHg0Mzg5Y2E2NVUsIDB4MGVmZmYxZjZVLA0KKyAgICAweDU0OTNjN2VkVSwgMHgzNjI0MTIwOVUsIDB4YmRkNjZiYmJVLCAweGQ0OTg0YzI2VSwNCisgICAgMHgyZDM2MWI4M1UsIDB4NDA4YmNiZWJVLCAweDdmYTFkZTZmVSwgMHgyMTNlMWY4MVUsDQorICAgIDB4MTgxMDA4MDRVLCAweDYxYjVkNDZhVSwgMHg5NzExODY0M1UsIDB4MDYwNDAyMDFVLA0KKyAgICAweDcyNWMyZTE3VSwgMHg3Y2EzZGZlMVUsIDB4MzUyNjEzODdVLCAweDA0ZjNmN2Y1VSwNCisgICAgMHgwOTBlMDc4ZFUsIDB4NzBhYmRiZTNVLCAweGNhOGM0NjIzVSwgMHgyNzNhMWQ4MFUsDQorICAgIDB4ODUwZDg4NDRVLCAweDc0NTgyYzE2VSwgMHg0OTg1Y2M2NlUsIDB4YzY4NDQyMjFVLA0KKyAgICAweDNlZGZlMWZlVSwgMHhjNDczYjdkNVUsIDB4YTZjNDYyMzFVLCAweGVjNDNhZmQ5VSwNCisgICAgMHhiZWQ0NmEzNVUsIDB4NTA2MDMwMThVLCAweDBjMDgwNDAyVSwgMHg0NThkYzg2NFUsDQorICAgIDB4MTZlZmY5ZjJVLCAweDFjZTNmZmYxVSwgMHhlOTQ1YWM1NlUsIDB4OTQxMzg3Y2RVLA0KKyAgICAweDJiMzIxOTgyVSwgMHg4YTA3OGRjOFUsIDB4YmJkMjY5YmFVLCAweDFhZTdmZGYwVSwNCisgICAgMHg1ODliYzNlZlUsIDB4NGM4M2NmZTlVLCAweDRhODdjZGU4VSwgMHgzNGQzZTdmZFUsDQorICAgIDB4MTExZTBmODlVLCAweGM4N2JiM2Q3VSwgMHhhODNiOTNjN1UsIDB4OTllZTc3YjVVLA0KKyAgICAweGZmYWE1NWE0VSwgMHhlMmJjNWUyZlUsIDB4NTk2ZTM3OTVVLCAweDZhNGMyNjEzVSwNCisgICAgMHgzYTJjMTYwYlUsIDB4MTBlYmZiZjNVLCAweDdhYTdkZGUwVSwgMHhiMmRjNmUzN1UsDQorfTsNCisNCitzdGF0aWMgY29uc3QgdWxvbmczMiBUNFsyNTZdID0gew0KKyAgICAweGE3YTdhN2E3VSwgMHhkM2QzZDNkM1UsIDB4ZTZlNmU2ZTZVLCAweDcxNzE3MTcxVSwNCisgICAgMHhkMGQwZDBkMFUsIDB4YWNhY2FjYWNVLCAweDRkNGQ0ZDRkVSwgMHg3OTc5Nzk3OVUsDQorICAgIDB4M2EzYTNhM2FVLCAweGM5YzljOWM5VSwgMHg5MTkxOTE5MVUsIDB4ZmNmY2ZjZmNVLA0KKyAgICAweDFlMWUxZTFlVSwgMHg0NzQ3NDc0N1UsIDB4NTQ1NDU0NTRVLCAweGJkYmRiZGJkVSwNCisgICAgMHg4YzhjOGM4Y1UsIDB4YTVhNWE1YTVVLCAweDdhN2E3YTdhVSwgMHhmYmZiZmJmYlUsDQorICAgIDB4NjM2MzYzNjNVLCAweGI4YjhiOGI4VSwgMHhkZGRkZGRkZFUsIDB4ZDRkNGQ0ZDRVLA0KKyAgICAweGU1ZTVlNWU1VSwgMHhiM2IzYjNiM1UsIDB4YzVjNWM1YzVVLCAweGJlYmViZWJlVSwNCisgICAgMHhhOWE5YTlhOVUsIDB4ODg4ODg4ODhVLCAweDBjMGMwYzBjVSwgMHhhMmEyYTJhMlUsDQorICAgIDB4MzkzOTM5MzlVLCAweGRmZGZkZmRmVSwgMHgyOTI5MjkyOVUsIDB4ZGFkYWRhZGFVLA0KKyAgICAweDJiMmIyYjJiVSwgMHhhOGE4YThhOFUsIDB4Y2JjYmNiY2JVLCAweDRjNGM0YzRjVSwNCisgICAgMHg0YjRiNGI0YlUsIDB4MjIyMjIyMjJVLCAweGFhYWFhYWFhVSwgMHgyNDI0MjQyNFUsDQorICAgIDB4NDE0MTQxNDFVLCAweDcwNzA3MDcwVSwgMHhhNmE2YTZhNlUsIDB4ZjlmOWY5ZjlVLA0KKyAgICAweDVhNWE1YTVhVSwgMHhlMmUyZTJlMlUsIDB4YjBiMGIwYjBVLCAweDM2MzYzNjM2VSwNCisgICAgMHg3ZDdkN2Q3ZFUsIDB4ZTRlNGU0ZTRVLCAweDMzMzMzMzMzVSwgMHhmZmZmZmZmZlUsDQorICAgIDB4NjA2MDYwNjBVLCAweDIwMjAyMDIwVSwgMHgwODA4MDgwOFUsIDB4OGI4YjhiOGJVLA0KKyAgICAweDVlNWU1ZTVlVSwgMHhhYmFiYWJhYlUsIDB4N2Y3ZjdmN2ZVLCAweDc4Nzg3ODc4VSwNCisgICAgMHg3YzdjN2M3Y1UsIDB4MmMyYzJjMmNVLCAweDU3NTc1NzU3VSwgMHhkMmQyZDJkMlUsDQorICAgIDB4ZGNkY2RjZGNVLCAweDZkNmQ2ZDZkVSwgMHg3ZTdlN2U3ZVUsIDB4MGQwZDBkMGRVLA0KKyAgICAweDUzNTM1MzUzVSwgMHg5NDk0OTQ5NFUsIDB4YzNjM2MzYzNVLCAweDI4MjgyODI4VSwNCisgICAgMHgyNzI3MjcyN1UsIDB4MDYwNjA2MDZVLCAweDVmNWY1ZjVmVSwgMHhhZGFkYWRhZFUsDQorICAgIDB4Njc2NzY3NjdVLCAweDVjNWM1YzVjVSwgMHg1NTU1NTU1NVUsIDB4NDg0ODQ4NDhVLA0KKyAgICAweDBlMGUwZTBlVSwgMHg1MjUyNTI1MlUsIDB4ZWFlYWVhZWFVLCAweDQyNDI0MjQyVSwNCisgICAgMHg1YjViNWI1YlUsIDB4NWQ1ZDVkNWRVLCAweDMwMzAzMDMwVSwgMHg1ODU4NTg1OFUsDQorICAgIDB4NTE1MTUxNTFVLCAweDU5NTk1OTU5VSwgMHgzYzNjM2MzY1UsIDB4NGU0ZTRlNGVVLA0KKyAgICAweDM4MzgzODM4VSwgMHg4YThhOGE4YVUsIDB4NzI3MjcyNzJVLCAweDE0MTQxNDE0VSwNCisgICAgMHhlN2U3ZTdlN1UsIDB4YzZjNmM2YzZVLCAweGRlZGVkZWRlVSwgMHg1MDUwNTA1MFUsDQorICAgIDB4OGU4ZThlOGVVLCAweDkyOTI5MjkyVSwgMHhkMWQxZDFkMVUsIDB4Nzc3Nzc3NzdVLA0KKyAgICAweDkzOTM5MzkzVSwgMHg0NTQ1NDU0NVUsIDB4OWE5YTlhOWFVLCAweGNlY2VjZWNlVSwNCisgICAgMHgyZDJkMmQyZFUsIDB4MDMwMzAzMDNVLCAweDYyNjI2MjYyVSwgMHhiNmI2YjZiNlUsDQorICAgIDB4YjliOWI5YjlVLCAweGJmYmZiZmJmVSwgMHg5Njk2OTY5NlUsIDB4NmI2YjZiNmJVLA0KKyAgICAweDNmM2YzZjNmVSwgMHgwNzA3MDcwN1UsIDB4MTIxMjEyMTJVLCAweGFlYWVhZWFlVSwNCisgICAgMHg0MDQwNDA0MFUsIDB4MzQzNDM0MzRVLCAweDQ2NDY0NjQ2VSwgMHgzZTNlM2UzZVUsDQorICAgIDB4ZGJkYmRiZGJVLCAweGNmY2ZjZmNmVSwgMHhlY2VjZWNlY1UsIDB4Y2NjY2NjY2NVLA0KKyAgICAweGMxYzFjMWMxVSwgMHhhMWExYTFhMVUsIDB4YzBjMGMwYzBVLCAweGQ2ZDZkNmQ2VSwNCisgICAgMHgxZDFkMWQxZFUsIDB4ZjRmNGY0ZjRVLCAweDYxNjE2MTYxVSwgMHgzYjNiM2IzYlUsDQorICAgIDB4MTAxMDEwMTBVLCAweGQ4ZDhkOGQ4VSwgMHg2ODY4Njg2OFUsIDB4YTBhMGEwYTBVLA0KKyAgICAweGIxYjFiMWIxVSwgMHgwYTBhMGEwYVUsIDB4Njk2OTY5NjlVLCAweDZjNmM2YzZjVSwNCisgICAgMHg0OTQ5NDk0OVUsIDB4ZmFmYWZhZmFVLCAweDc2NzY3Njc2VSwgMHhjNGM0YzRjNFUsDQorICAgIDB4OWU5ZTllOWVVLCAweDliOWI5YjliVSwgMHg2ZTZlNmU2ZVUsIDB4OTk5OTk5OTlVLA0KKyAgICAweGMyYzJjMmMyVSwgMHhiN2I3YjdiN1UsIDB4OTg5ODk4OThVLCAweGJjYmNiY2JjVSwNCisgICAgMHg4ZjhmOGY4ZlUsIDB4ODU4NTg1ODVVLCAweDFmMWYxZjFmVSwgMHhiNGI0YjRiNFUsDQorICAgIDB4ZjhmOGY4ZjhVLCAweDExMTExMTExVSwgMHgyZTJlMmUyZVUsIDB4MDAwMDAwMDBVLA0KKyAgICAweDI1MjUyNTI1VSwgMHgxYzFjMWMxY1UsIDB4MmEyYTJhMmFVLCAweDNkM2QzZDNkVSwNCisgICAgMHgwNTA1MDUwNVUsIDB4NGY0ZjRmNGZVLCAweDdiN2I3YjdiVSwgMHhiMmIyYjJiMlUsDQorICAgIDB4MzIzMjMyMzJVLCAweDkwOTA5MDkwVSwgMHhhZmFmYWZhZlUsIDB4MTkxOTE5MTlVLA0KKyAgICAweGEzYTNhM2EzVSwgMHhmN2Y3ZjdmN1UsIDB4NzM3MzczNzNVLCAweDlkOWQ5ZDlkVSwNCisgICAgMHgxNTE1MTUxNVUsIDB4NzQ3NDc0NzRVLCAweGVlZWVlZWVlVSwgMHhjYWNhY2FjYVUsDQorICAgIDB4OWY5ZjlmOWZVLCAweDBmMGYwZjBmVSwgMHgxYjFiMWIxYlUsIDB4NzU3NTc1NzVVLA0KKyAgICAweDg2ODY4Njg2VSwgMHg4NDg0ODQ4NFUsIDB4OWM5YzljOWNVLCAweDRhNGE0YTRhVSwNCisgICAgMHg5Nzk3OTc5N1UsIDB4MWExYTFhMWFVLCAweDY1NjU2NTY1VSwgMHhmNmY2ZjZmNlUsDQorICAgIDB4ZWRlZGVkZWRVLCAweDA5MDkwOTA5VSwgMHhiYmJiYmJiYlUsIDB4MjYyNjI2MjZVLA0KKyAgICAweDgzODM4MzgzVSwgMHhlYmViZWJlYlUsIDB4NmY2ZjZmNmZVLCAweDgxODE4MTgxVSwNCisgICAgMHgwNDA0MDQwNFUsIDB4NmE2YTZhNmFVLCAweDQzNDM0MzQzVSwgMHgwMTAxMDEwMVUsDQorICAgIDB4MTcxNzE3MTdVLCAweGUxZTFlMWUxVSwgMHg4Nzg3ODc4N1UsIDB4ZjVmNWY1ZjVVLA0KKyAgICAweDhkOGQ4ZDhkVSwgMHhlM2UzZTNlM1UsIDB4MjMyMzIzMjNVLCAweDgwODA4MDgwVSwNCisgICAgMHg0NDQ0NDQ0NFUsIDB4MTYxNjE2MTZVLCAweDY2NjY2NjY2VSwgMHgyMTIxMjEyMVUsDQorICAgIDB4ZmVmZWZlZmVVLCAweGQ1ZDVkNWQ1VSwgMHgzMTMxMzEzMVUsIDB4ZDlkOWQ5ZDlVLA0KKyAgICAweDM1MzUzNTM1VSwgMHgxODE4MTgxOFUsIDB4MDIwMjAyMDJVLCAweDY0NjQ2NDY0VSwNCisgICAgMHhmMmYyZjJmMlUsIDB4ZjFmMWYxZjFVLCAweDU2NTY1NjU2VSwgMHhjZGNkY2RjZFUsDQorICAgIDB4ODI4MjgyODJVLCAweGM4YzhjOGM4VSwgMHhiYWJhYmFiYVUsIDB4ZjBmMGYwZjBVLA0KKyAgICAweGVmZWZlZmVmVSwgMHhlOWU5ZTllOVUsIDB4ZThlOGU4ZThVLCAweGZkZmRmZGZkVSwNCisgICAgMHg4OTg5ODk4OVUsIDB4ZDdkN2Q3ZDdVLCAweGM3YzdjN2M3VSwgMHhiNWI1YjViNVUsDQorICAgIDB4YTRhNGE0YTRVLCAweDJmMmYyZjJmVSwgMHg5NTk1OTU5NVUsIDB4MTMxMzEzMTNVLA0KKyAgICAweDBiMGIwYjBiVSwgMHhmM2YzZjNmM1UsIDB4ZTBlMGUwZTBVLCAweDM3MzczNzM3VSwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCB1bG9uZzMyIFQ1WzI1Nl0gPSB7DQorICAgIDB4MDAwMDAwMDBVLCAweDAxMDIwNjA4VSwgMHgwMjA0MGMxMFUsIDB4MDMwNjBhMThVLA0KKyAgICAweDA0MDgxODIwVSwgMHgwNTBhMWUyOFUsIDB4MDYwYzE0MzBVLCAweDA3MGUxMjM4VSwNCisgICAgMHgwODEwMzA0MFUsIDB4MDkxMjM2NDhVLCAweDBhMTQzYzUwVSwgMHgwYjE2M2E1OFUsDQorICAgIDB4MGMxODI4NjBVLCAweDBkMWEyZTY4VSwgMHgwZTFjMjQ3MFUsIDB4MGYxZTIyNzhVLA0KKyAgICAweDEwMjA2MDgwVSwgMHgxMTIyNjY4OFUsIDB4MTIyNDZjOTBVLCAweDEzMjY2YTk4VSwNCisgICAgMHgxNDI4NzhhMFUsIDB4MTUyYTdlYThVLCAweDE2MmM3NGIwVSwgMHgxNzJlNzJiOFUsDQorICAgIDB4MTgzMDUwYzBVLCAweDE5MzI1NmM4VSwgMHgxYTM0NWNkMFUsIDB4MWIzNjVhZDhVLA0KKyAgICAweDFjMzg0OGUwVSwgMHgxZDNhNGVlOFUsIDB4MWUzYzQ0ZjBVLCAweDFmM2U0MmY4VSwNCisgICAgMHgyMDQwYzAxZFUsIDB4MjE0MmM2MTVVLCAweDIyNDRjYzBkVSwgMHgyMzQ2Y2EwNVUsDQorICAgIDB4MjQ0OGQ4M2RVLCAweDI1NGFkZTM1VSwgMHgyNjRjZDQyZFUsIDB4Mjc0ZWQyMjVVLA0KKyAgICAweDI4NTBmMDVkVSwgMHgyOTUyZjY1NVUsIDB4MmE1NGZjNGRVLCAweDJiNTZmYTQ1VSwNCisgICAgMHgyYzU4ZTg3ZFUsIDB4MmQ1YWVlNzVVLCAweDJlNWNlNDZkVSwgMHgyZjVlZTI2NVUsDQorICAgIDB4MzA2MGEwOWRVLCAweDMxNjJhNjk1VSwgMHgzMjY0YWM4ZFUsIDB4MzM2NmFhODVVLA0KKyAgICAweDM0NjhiOGJkVSwgMHgzNTZhYmViNVUsIDB4MzY2Y2I0YWRVLCAweDM3NmViMmE1VSwNCisgICAgMHgzODcwOTBkZFUsIDB4Mzk3Mjk2ZDVVLCAweDNhNzQ5Y2NkVSwgMHgzYjc2OWFjNVUsDQorICAgIDB4M2M3ODg4ZmRVLCAweDNkN2E4ZWY1VSwgMHgzZTdjODRlZFUsIDB4M2Y3ZTgyZTVVLA0KKyAgICAweDQwODA5ZDNhVSwgMHg0MTgyOWIzMlUsIDB4NDI4NDkxMmFVLCAweDQzODY5NzIyVSwNCisgICAgMHg0NDg4ODUxYVUsIDB4NDU4YTgzMTJVLCAweDQ2OGM4OTBhVSwgMHg0NzhlOGYwMlUsDQorICAgIDB4NDg5MGFkN2FVLCAweDQ5OTJhYjcyVSwgMHg0YTk0YTE2YVUsIDB4NGI5NmE3NjJVLA0KKyAgICAweDRjOThiNTVhVSwgMHg0ZDlhYjM1MlUsIDB4NGU5Y2I5NGFVLCAweDRmOWViZjQyVSwNCisgICAgMHg1MGEwZmRiYVUsIDB4NTFhMmZiYjJVLCAweDUyYTRmMWFhVSwgMHg1M2E2ZjdhMlUsDQorICAgIDB4NTRhOGU1OWFVLCAweDU1YWFlMzkyVSwgMHg1NmFjZTk4YVUsIDB4NTdhZWVmODJVLA0KKyAgICAweDU4YjBjZGZhVSwgMHg1OWIyY2JmMlUsIDB4NWFiNGMxZWFVLCAweDViYjZjN2UyVSwNCisgICAgMHg1Y2I4ZDVkYVUsIDB4NWRiYWQzZDJVLCAweDVlYmNkOWNhVSwgMHg1ZmJlZGZjMlUsDQorICAgIDB4NjBjMDVkMjdVLCAweDYxYzI1YjJmVSwgMHg2MmM0NTEzN1UsIDB4NjNjNjU3M2ZVLA0KKyAgICAweDY0Yzg0NTA3VSwgMHg2NWNhNDMwZlUsIDB4NjZjYzQ5MTdVLCAweDY3Y2U0ZjFmVSwNCisgICAgMHg2OGQwNmQ2N1UsIDB4NjlkMjZiNmZVLCAweDZhZDQ2MTc3VSwgMHg2YmQ2Njc3ZlUsDQorICAgIDB4NmNkODc1NDdVLCAweDZkZGE3MzRmVSwgMHg2ZWRjNzk1N1UsIDB4NmZkZTdmNWZVLA0KKyAgICAweDcwZTAzZGE3VSwgMHg3MWUyM2JhZlUsIDB4NzJlNDMxYjdVLCAweDczZTYzN2JmVSwNCisgICAgMHg3NGU4MjU4N1UsIDB4NzVlYTIzOGZVLCAweDc2ZWMyOTk3VSwgMHg3N2VlMmY5ZlUsDQorICAgIDB4NzhmMDBkZTdVLCAweDc5ZjIwYmVmVSwgMHg3YWY0MDFmN1UsIDB4N2JmNjA3ZmZVLA0KKyAgICAweDdjZjgxNWM3VSwgMHg3ZGZhMTNjZlUsIDB4N2VmYzE5ZDdVLCAweDdmZmUxZmRmVSwNCisgICAgMHg4MDFkMjc3NFUsIDB4ODExZjIxN2NVLCAweDgyMTkyYjY0VSwgMHg4MzFiMmQ2Y1UsDQorICAgIDB4ODQxNTNmNTRVLCAweDg1MTczOTVjVSwgMHg4NjExMzM0NFUsIDB4ODcxMzM1NGNVLA0KKyAgICAweDg4MGQxNzM0VSwgMHg4OTBmMTEzY1UsIDB4OGEwOTFiMjRVLCAweDhiMGIxZDJjVSwNCisgICAgMHg4YzA1MGYxNFUsIDB4OGQwNzA5MWNVLCAweDhlMDEwMzA0VSwgMHg4ZjAzMDUwY1UsDQorICAgIDB4OTAzZDQ3ZjRVLCAweDkxM2Y0MWZjVSwgMHg5MjM5NGJlNFUsIDB4OTMzYjRkZWNVLA0KKyAgICAweDk0MzU1ZmQ0VSwgMHg5NTM3NTlkY1UsIDB4OTYzMTUzYzRVLCAweDk3MzM1NWNjVSwNCisgICAgMHg5ODJkNzdiNFUsIDB4OTkyZjcxYmNVLCAweDlhMjk3YmE0VSwgMHg5YjJiN2RhY1UsDQorICAgIDB4OWMyNTZmOTRVLCAweDlkMjc2OTljVSwgMHg5ZTIxNjM4NFUsIDB4OWYyMzY1OGNVLA0KKyAgICAweGEwNWRlNzY5VSwgMHhhMTVmZTE2MVUsIDB4YTI1OWViNzlVLCAweGEzNWJlZDcxVSwNCisgICAgMHhhNDU1ZmY0OVUsIDB4YTU1N2Y5NDFVLCAweGE2NTFmMzU5VSwgMHhhNzUzZjU1MVUsDQorICAgIDB4YTg0ZGQ3MjlVLCAweGE5NGZkMTIxVSwgMHhhYTQ5ZGIzOVUsIDB4YWI0YmRkMzFVLA0KKyAgICAweGFjNDVjZjA5VSwgMHhhZDQ3YzkwMVUsIDB4YWU0MWMzMTlVLCAweGFmNDNjNTExVSwNCisgICAgMHhiMDdkODdlOVUsIDB4YjE3ZjgxZTFVLCAweGIyNzk4YmY5VSwgMHhiMzdiOGRmMVUsDQorICAgIDB4YjQ3NTlmYzlVLCAweGI1Nzc5OWMxVSwgMHhiNjcxOTNkOVUsIDB4Yjc3Mzk1ZDFVLA0KKyAgICAweGI4NmRiN2E5VSwgMHhiOTZmYjFhMVUsIDB4YmE2OWJiYjlVLCAweGJiNmJiZGIxVSwNCisgICAgMHhiYzY1YWY4OVUsIDB4YmQ2N2E5ODFVLCAweGJlNjFhMzk5VSwgMHhiZjYzYTU5MVUsDQorICAgIDB4YzA5ZGJhNGVVLCAweGMxOWZiYzQ2VSwgMHhjMjk5YjY1ZVUsIDB4YzM5YmIwNTZVLA0KKyAgICAweGM0OTVhMjZlVSwgMHhjNTk3YTQ2NlUsIDB4YzY5MWFlN2VVLCAweGM3OTNhODc2VSwNCisgICAgMHhjODhkOGEwZVUsIDB4Yzk4ZjhjMDZVLCAweGNhODk4NjFlVSwgMHhjYjhiODAxNlUsDQorICAgIDB4Y2M4NTkyMmVVLCAweGNkODc5NDI2VSwgMHhjZTgxOWUzZVUsIDB4Y2Y4Mzk4MzZVLA0KKyAgICAweGQwYmRkYWNlVSwgMHhkMWJmZGNjNlUsIDB4ZDJiOWQ2ZGVVLCAweGQzYmJkMGQ2VSwNCisgICAgMHhkNGI1YzJlZVUsIDB4ZDViN2M0ZTZVLCAweGQ2YjFjZWZlVSwgMHhkN2IzYzhmNlUsDQorICAgIDB4ZDhhZGVhOGVVLCAweGQ5YWZlYzg2VSwgMHhkYWE5ZTY5ZVUsIDB4ZGJhYmUwOTZVLA0KKyAgICAweGRjYTVmMmFlVSwgMHhkZGE3ZjRhNlUsIDB4ZGVhMWZlYmVVLCAweGRmYTNmOGI2VSwNCisgICAgMHhlMGRkN2E1M1UsIDB4ZTFkZjdjNWJVLCAweGUyZDk3NjQzVSwgMHhlM2RiNzA0YlUsDQorICAgIDB4ZTRkNTYyNzNVLCAweGU1ZDc2NDdiVSwgMHhlNmQxNmU2M1UsIDB4ZTdkMzY4NmJVLA0KKyAgICAweGU4Y2Q0YTEzVSwgMHhlOWNmNGMxYlUsIDB4ZWFjOTQ2MDNVLCAweGViY2I0MDBiVSwNCisgICAgMHhlY2M1NTIzM1UsIDB4ZWRjNzU0M2JVLCAweGVlYzE1ZTIzVSwgMHhlZmMzNTgyYlUsDQorICAgIDB4ZjBmZDFhZDNVLCAweGYxZmYxY2RiVSwgMHhmMmY5MTZjM1UsIDB4ZjNmYjEwY2JVLA0KKyAgICAweGY0ZjUwMmYzVSwgMHhmNWY3MDRmYlUsIDB4ZjZmMTBlZTNVLCAweGY3ZjMwOGViVSwNCisgICAgMHhmOGVkMmE5M1UsIDB4ZjllZjJjOWJVLCAweGZhZTkyNjgzVSwgMHhmYmViMjA4YlUsDQorICAgIDB4ZmNlNTMyYjNVLCAweGZkZTczNGJiVSwgMHhmZWUxM2VhM1UsIDB4ZmZlMzM4YWJVLA0KK307DQorDQorLyoqDQorICogVGhlIHJvdW5kIGNvbnN0YW50cy4NCisgKi8NCitzdGF0aWMgY29uc3QgdWxvbmczMiByY1tdID0gew0KKyAgIDB4YTdkM2U2NzFVLCAweGQwYWM0ZDc5VSwgMHgzYWM5OTFmY1UsIDB4MWU0NzU0YmRVLA0KKyAgIDB4OGNhNTdhZmJVLCAweDYzYjhkZGQ0VSwgMHhlNWIzYzViZVUsIDB4YTk4ODBjYTJVLA0KKyAgIDB4MzlkZjI5ZGFVLCAweDJiYThjYjRjVSwgMHg0YjIyYWEyNFUsIDB4NDE3MGE2ZjlVLA0KKyAgIDB4NWFlMmIwMzZVLCAweDdkZTQzM2ZmVSwgMHg2MDIwMDg4YlUsIDB4NWVhYjdmNzhVLA0KKyAgIDB4N2MyYzU3ZDJVLCAweGRjNmQ3ZTBkVSwgMHg1Mzk0YzMyOFUsDQorfTsNCisNCisjZW5kaWYNCisNCisgLyoqDQorICAgIEluaXRpYWxpemUgdGhlIEFudWJpcyBibG9jayBjaXBoZXINCisgICAgQHBhcmFtIGtleSBUaGUgc3ltbWV0cmljIGtleSB5b3Ugd2lzaCB0byBwYXNzDQorICAgIEBwYXJhbSBrZXlsZW4gVGhlIGtleSBsZW5ndGggaW4gYnl0ZXMNCisgICAgQHBhcmFtIG51bV9yb3VuZHMgVGhlIG51bWJlciBvZiByb3VuZHMgZGVzaXJlZCAoMCBmb3IgZGVmYXVsdCkNCisgICAgQHBhcmFtIHNrZXkgVGhlIGtleSBpbiBhcyBzY2hlZHVsZWQgYnkgdGhpcyBmdW5jdGlvbi4NCisgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsDQorICovDQorI2lmZGVmIENMRUFOX1NUQUNLDQorc3RhdGljIGludCBfYW51YmlzX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpDQorI2Vsc2UNCitpbnQgIGFudWJpc19zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQ0KKyNlbmRpZg0KK3sNCisgICBpbnQgTiwgUiwgaSwgcG9zLCByOw0KKyAgIHVsb25nMzIga2FwcGFbTUFYX05dOw0KKyAgIHVsb25nMzIgaW50ZXJbTUFYX05dOw0KKyAgIHVsb25nMzIgdiwgSzAsIEsxLCBLMiwgSzM7DQorDQorICAgTFRDX0FSR0NISyhrZXkgICE9IE5VTEwpOw0KKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsNCisNCisgICAvKiBWYWxpZCBzaXplcyAoaW4gYnl0ZXMpIGFyZSAxNiwgMjAsIDI0LCAyOCwgMzIsIDM2LCBhbmQgNDAuICovDQorICAgaWYgKChrZXlsZW4gJiAzKSB8fCAoa2V5bGVuIDwgMTYpIHx8IChrZXlsZW4gPiA0MCkpIHsNCisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOw0KKyAgIH0NCisgICBza2V5LT5hbnViaXMua2V5Qml0cyA9IGtleWxlbio4Ow0KKw0KKyAgIC8qDQorICAgICogZGV0ZXJtaW5lIHRoZSBOIGxlbmd0aCBwYXJhbWV0ZXI6DQorICAgICogKE4uQi4gaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBrZXkgbGVuZ3RoIGlzIHZhbGlkISkNCisgICAgKi8NCisgICBOID0gc2tleS0+YW51YmlzLmtleUJpdHMgPj4gNTsNCisNCisgICAvKg0KKyAgICAqIGRldGVybWluZSBudW1iZXIgb2Ygcm91bmRzIGZyb20ga2V5IHNpemU6DQorICAgICovDQorICAgc2tleS0+YW51YmlzLlIgPSBSID0gOCArIE47DQorDQorICAgaWYgKG51bV9yb3VuZHMgIT0gMCAmJiBudW1fcm91bmRzICE9IHNrZXktPmFudWJpcy5SKSB7DQorICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUk9VTkRTOw0KKyAgIH0NCisNCisgICAgLyoNCisgICAgKiBtYXAgY2lwaGVyIGtleSB0byBpbml0aWFsIGtleSBzdGF0ZSAobXUpOg0KKyAgICAqLw0KKyAgICBmb3IgKGkgPSAwLCBwb3MgPSAwOyBpIDwgTjsgaSsrLCBwb3MgKz0gNCkgew0KKyAgICAgIGthcHBhW2ldID0NCisgICAgICAgICAoa2V5W3BvcyAgICBdIDw8IDI0KSBeDQorICAgICAgICAgKGtleVtwb3MgKyAxXSA8PCAxNikgXg0KKyAgICAgICAgIChrZXlbcG9zICsgMl0gPDwgIDgpIF4NCisgICAgICAgICAoa2V5W3BvcyArIDNdICAgICAgKTsNCisgICAgfQ0KKw0KKyAgIC8qDQorICAgICogZ2VuZXJhdGUgUiArIDEgcm91bmQga2V5czoNCisgICAgKi8NCisgICBmb3IgKHIgPSAwOyByIDw9IFI7IHIrKykgew0KKyAgICAgIC8qDQorICAgICAgICogZ2VuZXJhdGUgci10aCByb3VuZCBrZXkgS15yOg0KKyAgICAgICAqLw0KKyAgICAgIEswID0gVDRbKGthcHBhW04gLSAxXSA+PiAyNCkgICAgICAgXTsNCisgICAgICBLMSA9IFQ0WyhrYXBwYVtOIC0gMV0gPj4gMTYpICYgMHhmZl07DQorICAgICAgSzIgPSBUNFsoa2FwcGFbTiAtIDFdID4+ICA4KSAmIDB4ZmZdOw0KKyAgICAgIEszID0gVDRbKGthcHBhW04gLSAxXSAgICAgICkgJiAweGZmXTsNCisgICAgICBmb3IgKGkgPSBOIC0gMjsgaSA+PSAwOyBpLS0pIHsNCisgICAgICAgICBLMCA9IFQ0WyhrYXBwYVtpXSA+PiAyNCkgICAgICAgXSBeDQorICAgICAgICAgICAgKFQ1WyhLMCA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMCA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMCA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMCAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmZVKTsNCisgICAgICAgICBLMSA9IFQ0WyhrYXBwYVtpXSA+PiAxNikgJiAweGZmXSBeDQorICAgICAgICAgICAgKFQ1WyhLMSA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMSA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMSA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMSAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmZVKTsNCisgICAgICAgICBLMiA9IFQ0WyhrYXBwYVtpXSA+PiAgOCkgJiAweGZmXSBeDQorICAgICAgICAgICAgKFQ1WyhLMiA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMiA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMiA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMiAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmZVKTsNCisgICAgICAgICBLMyA9IFQ0WyhrYXBwYVtpXSAgICAgICkgJiAweGZmXSBeDQorICAgICAgICAgICAgKFQ1WyhLMyA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMyA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMyA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDBVKSBeDQorICAgICAgICAgICAgKFQ1WyhLMyAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmZVKTsNCisgICAgICB9DQorICAgICAgLyoNCisgICAgICAtLSB0aGlzIGlzIHRoZSBjb2RlIHRvIHVzZSB3aXRoIHRoZSBsYXJnZSBVIHRhYmxlczoNCisgICAgICBLMCA9IEsxID0gSzIgPSBLMyA9IDA7DQorICAgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgew0KKyAgICAgICAgIEswIF49IFVbaV1bKGthcHBhW2ldID4+IDI0KSAgICAgICBdOw0KKyAgICAgICAgIEsxIF49IFVbaV1bKGthcHBhW2ldID4+IDE2KSAmIDB4ZmZdOw0KKyAgICAgICAgIEsyIF49IFVbaV1bKGthcHBhW2ldID4+ICA4KSAmIDB4ZmZdOw0KKyAgICAgICAgIEszIF49IFVbaV1bKGthcHBhW2ldICAgICAgKSAmIDB4ZmZdOw0KKyAgICAgIH0NCisgICAgICAqLw0KKyAgICAgIHNrZXktPmFudWJpcy5yb3VuZEtleUVuY1tyXVswXSA9IEswOw0KKyAgICAgIHNrZXktPmFudWJpcy5yb3VuZEtleUVuY1tyXVsxXSA9IEsxOw0KKyAgICAgIHNrZXktPmFudWJpcy5yb3VuZEtleUVuY1tyXVsyXSA9IEsyOw0KKyAgICAgIHNrZXktPmFudWJpcy5yb3VuZEtleUVuY1tyXVszXSA9IEszOw0KKw0KKyAgICAgIC8qDQorICAgICAgICogY29tcHV0ZSBrYXBwYV57cisxfSBmcm9tIGthcHBhXnI6DQorICAgICAgICovDQorICAgICAgaWYgKHIgPT0gUikgew0KKyAgICAgICAgIGJyZWFrOw0KKyAgICAgIH0NCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7DQorICAgICAgICAgaW50IGogPSBpOw0KKyAgICAgICAgIGludGVyW2ldICA9IFQwWyhrYXBwYVtqLS1dID4+IDI0KSAgICAgICBdOyBpZiAoaiA8IDApIGogPSBOIC0gMTsNCisgICAgICAgICBpbnRlcltpXSBePSBUMVsoa2FwcGFbai0tXSA+PiAxNikgJiAweGZmXTsgaWYgKGogPCAwKSBqID0gTiAtIDE7DQorICAgICAgICAgaW50ZXJbaV0gXj0gVDJbKGthcHBhW2otLV0gPj4gIDgpICYgMHhmZl07IGlmIChqIDwgMCkgaiA9IE4gLSAxOw0KKyAgICAgICAgIGludGVyW2ldIF49IFQzWyhrYXBwYVtqICBdICAgICAgKSAmIDB4ZmZdOw0KKyAgICAgIH0NCisgICAgICBrYXBwYVswXSA9IGludGVyWzBdIF4gcmNbcl07DQorICAgICAgZm9yIChpID0gMTsgaSA8IE47IGkrKykgew0KKyAgICAgICAgIGthcHBhW2ldID0gaW50ZXJbaV07DQorICAgICAgfQ0KKyAgIH0NCisNCisgICAvKg0KKyAgICAqIGdlbmVyYXRlIGludmVyc2Uga2V5IHNjaGVkdWxlOiBLJ14wID0gS15SLCBLJ15SID0gS14wLCBLJ15yID0gdGhldGEoS157Ui1yfSk6DQorICAgICovDQorICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgew0KKyAgICAgIHNrZXktPmFudWJpcy5yb3VuZEtleURlY1swXVtpXSA9IHNrZXktPmFudWJpcy5yb3VuZEtleUVuY1tSXVtpXTsNCisgICAgICBza2V5LT5hbnViaXMucm91bmRLZXlEZWNbUl1baV0gPSBza2V5LT5hbnViaXMucm91bmRLZXlFbmNbMF1baV07DQorICAgfQ0KKyAgIGZvciAociA9IDE7IHIgPCBSOyByKyspIHsNCisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7DQorICAgICAgICAgdiA9IHNrZXktPmFudWJpcy5yb3VuZEtleUVuY1tSIC0gcl1baV07DQorICAgICAgICAgc2tleS0+YW51YmlzLnJvdW5kS2V5RGVjW3JdW2ldID0NCisgICAgICAgICAgICBUMFtUNFsodiA+PiAyNCkgICAgICAgXSAmIDB4ZmZdIF4NCisgICAgICAgICAgICBUMVtUNFsodiA+PiAxNikgJiAweGZmXSAmIDB4ZmZdIF4NCisgICAgICAgICAgICBUMltUNFsodiA+PiAgOCkgJiAweGZmXSAmIDB4ZmZdIF4NCisgICAgICAgICAgICBUM1tUNFsodiAgICAgICkgJiAweGZmXSAmIDB4ZmZdOw0KKyAgICAgIH0NCisgICB9DQorDQorICAgcmV0dXJuIENSWVBUX09LOw0KK30NCisNCisjaWZkZWYgQ0xFQU5fU1RBQ0sNCitpbnQgIGFudWJpc19zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQ0KK3sNCisgIGludCBlcnI7DQorICBlcnIgPSBfYW51YmlzX3NldHVwKGtleSwga2V5bGVuLCBudW1fcm91bmRzLCBza2V5KTsNCisgIGJ1cm5fc3RhY2soc2l6ZW9mKGludCkgKiA1ICsgc2l6ZW9mKHVsb25nMzIpICogKE1BWF9OICsgTUFYX04gKyA1KSk7DQorICByZXR1cm4gZXJyOw0KK30NCisjZW5kaWYNCisgIA0KKw0KK3N0YXRpYyB2b2lkIGFudWJpc19jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwbGFpbnRleHQsIHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQsDQorICAgICAgICAgICAgICAgICAgICAgICAgIHVsb25nMzIgcm91bmRLZXlbMTggKyAxXVs0XSwgaW50IFIpIHsNCisgICBpbnQgaSwgcG9zLCByOw0KKyAgIHVsb25nMzIgc3RhdGVbNF07DQorICAgdWxvbmczMiBpbnRlcls0XTsNCisNCisgICAgLyoNCisgICAgKiBtYXAgcGxhaW50ZXh0IGJsb2NrIHRvIGNpcGhlciBzdGF0ZSAobXUpDQorICAgICogYW5kIGFkZCBpbml0aWFsIHJvdW5kIGtleSAoc2lnbWFbS14wXSk6DQorICAgICovDQorICAgIGZvciAoaSA9IDAsIHBvcyA9IDA7IGkgPCA0OyBpKyssIHBvcyArPSA0KSB7DQorICAgICAgc3RhdGVbaV0gPQ0KKyAgICAgICAgIChwbGFpbnRleHRbcG9zICAgIF0gPDwgMjQpIF4NCisgICAgICAgICAocGxhaW50ZXh0W3BvcyArIDFdIDw8IDE2KSBeDQorICAgICAgICAgKHBsYWludGV4dFtwb3MgKyAyXSA8PCAgOCkgXg0KKyAgICAgICAgIChwbGFpbnRleHRbcG9zICsgM10gICAgICApIF4NCisgICAgICAgICByb3VuZEtleVswXVtpXTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiBSIC0gMSBmdWxsIHJvdW5kczoNCisgICAgICovDQorICAgIGZvciAociA9IDE7IHIgPCBSOyByKyspIHsNCisgICAgICBpbnRlclswXSA9DQorICAgICAgICAgVDBbKHN0YXRlWzBdID4+IDI0KSAgICAgICBdIF4NCisgICAgICAgICBUMVsoc3RhdGVbMV0gPj4gMjQpICAgICAgIF0gXg0KKyAgICAgICAgIFQyWyhzdGF0ZVsyXSA+PiAyNCkgICAgICAgXSBeDQorICAgICAgICAgVDNbKHN0YXRlWzNdID4+IDI0KSAgICAgICBdIF4NCisgICAgICAgICByb3VuZEtleVtyXVswXTsNCisgICAgICBpbnRlclsxXSA9DQorICAgICAgICAgVDBbKHN0YXRlWzBdID4+IDE2KSAmIDB4ZmZdIF4NCisgICAgICAgICBUMVsoc3RhdGVbMV0gPj4gMTYpICYgMHhmZl0gXg0KKyAgICAgICAgIFQyWyhzdGF0ZVsyXSA+PiAxNikgJiAweGZmXSBeDQorICAgICAgICAgVDNbKHN0YXRlWzNdID4+IDE2KSAmIDB4ZmZdIF4NCisgICAgICAgICByb3VuZEtleVtyXVsxXTsNCisgICAgICBpbnRlclsyXSA9DQorICAgICAgICAgVDBbKHN0YXRlWzBdID4+ICA4KSAmIDB4ZmZdIF4NCisgICAgICAgICBUMVsoc3RhdGVbMV0gPj4gIDgpICYgMHhmZl0gXg0KKyAgICAgICAgIFQyWyhzdGF0ZVsyXSA+PiAgOCkgJiAweGZmXSBeDQorICAgICAgICAgVDNbKHN0YXRlWzNdID4+ICA4KSAmIDB4ZmZdIF4NCisgICAgICAgICByb3VuZEtleVtyXVsyXTsNCisgICAgICBpbnRlclszXSA9DQorICAgICAgICAgVDBbKHN0YXRlWzBdICAgICAgKSAmIDB4ZmZdIF4NCisgICAgICAgICBUMVsoc3RhdGVbMV0gICAgICApICYgMHhmZl0gXg0KKyAgICAgICAgIFQyWyhzdGF0ZVsyXSAgICAgICkgJiAweGZmXSBeDQorICAgICAgICAgVDNbKHN0YXRlWzNdICAgICAgKSAmIDB4ZmZdIF4NCisgICAgICAgICByb3VuZEtleVtyXVszXTsNCisgICAgICBzdGF0ZVswXSA9IGludGVyWzBdOw0KKyAgICAgIHN0YXRlWzFdID0gaW50ZXJbMV07DQorICAgICAgc3RhdGVbMl0gPSBpbnRlclsyXTsNCisgICAgICBzdGF0ZVszXSA9IGludGVyWzNdOw0KKyAgICB9DQorDQorICAgIC8qDQorICAgICogbGFzdCByb3VuZDoNCisgICAgKi8NCisgICBpbnRlclswXSA9DQorICAgICAgKFQwWyhzdGF0ZVswXSA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDBVKSBeDQorICAgICAgKFQxWyhzdGF0ZVsxXSA+PiAyNCkgICAgICAgXSAmIDB4MDBmZjAwMDBVKSBeDQorICAgICAgKFQyWyhzdGF0ZVsyXSA+PiAyNCkgICAgICAgXSAmIDB4MDAwMGZmMDBVKSBeDQorICAgICAgKFQzWyhzdGF0ZVszXSA+PiAyNCkgICAgICAgXSAmIDB4MDAwMDAwZmZVKSBeDQorICAgICAgcm91bmRLZXlbUl1bMF07DQorICAgaW50ZXJbMV0gPQ0KKyAgICAgIChUMFsoc3RhdGVbMF0gPj4gMTYpICYgMHhmZl0gJiAweGZmMDAwMDAwVSkgXg0KKyAgICAgIChUMVsoc3RhdGVbMV0gPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwVSkgXg0KKyAgICAgIChUMlsoc3RhdGVbMl0gPj4gMTYpICYgMHhmZl0gJiAweDAwMDBmZjAwVSkgXg0KKyAgICAgIChUM1soc3RhdGVbM10gPj4gMTYpICYgMHhmZl0gJiAweDAwMDAwMGZmVSkgXg0KKyAgICAgIHJvdW5kS2V5W1JdWzFdOw0KKyAgIGludGVyWzJdID0NCisgICAgICAoVDBbKHN0YXRlWzBdID4+ICA4KSAmIDB4ZmZdICYgMHhmZjAwMDAwMFUpIF4NCisgICAgICAoVDFbKHN0YXRlWzFdID4+ICA4KSAmIDB4ZmZdICYgMHgwMGZmMDAwMFUpIF4NCisgICAgICAoVDJbKHN0YXRlWzJdID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMFUpIF4NCisgICAgICAoVDNbKHN0YXRlWzNdID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwMDBmZlUpIF4NCisgICAgICByb3VuZEtleVtSXVsyXTsNCisgICBpbnRlclszXSA9DQorICAgICAgKFQwWyhzdGF0ZVswXSAgICAgICkgJiAweGZmXSAmIDB4ZmYwMDAwMDBVKSBeDQorICAgICAgKFQxWyhzdGF0ZVsxXSAgICAgICkgJiAweGZmXSAmIDB4MDBmZjAwMDBVKSBeDQorICAgICAgKFQyWyhzdGF0ZVsyXSAgICAgICkgJiAweGZmXSAmIDB4MDAwMGZmMDBVKSBeDQorICAgICAgKFQzWyhzdGF0ZVszXSAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmZVKSBeDQorICAgICAgcm91bmRLZXlbUl1bM107DQorDQorICAgLyoNCisgICAgKiBtYXAgY2lwaGVyIHN0YXRlIHRvIGNpcGhlcnRleHQgYmxvY2sgKG11XnstMX0pOg0KKyAgICAqLw0KKyAgICBmb3IgKGkgPSAwLCBwb3MgPSAwOyBpIDwgNDsgaSsrLCBwb3MgKz0gNCkgew0KKyAgICAgICAgdWxvbmczMiB3ID0gaW50ZXJbaV07DQorICAgICAgICBjaXBoZXJ0ZXh0W3BvcyAgICBdID0gKHVuc2lnbmVkIGNoYXIpKHcgPj4gMjQpOw0KKyAgICAgICAgY2lwaGVydGV4dFtwb3MgKyAxXSA9ICh1bnNpZ25lZCBjaGFyKSh3ID4+IDE2KTsNCisgICAgICAgIGNpcGhlcnRleHRbcG9zICsgMl0gPSAodW5zaWduZWQgY2hhcikodyA+PiAgOCk7DQorICAgICAgICBjaXBoZXJ0ZXh0W3BvcyArIDNdID0gKHVuc2lnbmVkIGNoYXIpKHcgICAgICApOw0KKyAgICB9DQorfQ0KKw0KKy8qKg0KKyAgRW5jcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggQW51YmlzDQorICBAcGFyYW0gcHQgVGhlIGlucHV0IHBsYWludGV4dCAoMTYgYnl0ZXMpDQorICBAcGFyYW0gY3QgVGhlIG91dHB1dCBjaXBoZXJ0ZXh0ICgxNiBieXRlcykNCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkDQorKi8NCit2b2lkIGFudWJpc19lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpDQorew0KKyAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsNCisgICBMVENfQVJHQ0hLKGN0ICAgIT0gTlVMTCk7DQorICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOw0KKyAgIGFudWJpc19jcnlwdChwdCwgY3QsIHNrZXktPmFudWJpcy5yb3VuZEtleUVuYywgc2tleS0+YW51YmlzLlIpOw0KK30NCisNCisvKioNCisgIERlY3J5cHRzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIEFudWJpcw0KKyAgQHBhcmFtIGN0IFRoZSBpbnB1dCBjaXBoZXJ0ZXh0ICgxNiBieXRlcykNCisgIEBwYXJhbSBwdCBUaGUgb3V0cHV0IHBsYWludGV4dCAoMTYgYnl0ZXMpDQorICBAcGFyYW0gc2tleSBUaGUga2V5IGFzIHNjaGVkdWxlZCANCisqLw0KK3ZvaWQgYW51YmlzX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSkNCit7DQorICAgTFRDX0FSR0NISyhwdCAgICE9IE5VTEwpOw0KKyAgIExUQ19BUkdDSEsoY3QgICAhPSBOVUxMKTsNCisgICBMVENfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7DQorICAgYW51YmlzX2NyeXB0KGN0LCBwdCwgc2tleS0+YW51YmlzLnJvdW5kS2V5RGVjLCBza2V5LT5hbnViaXMuUik7DQorfQ0KKw0KKy8qKg0KKyAgUGVyZm9ybXMgYSBzZWxmLXRlc3Qgb2YgdGhlIEFudWJpcyBibG9jayBjaXBoZXINCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgZnVuY3Rpb25hbCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdCBoYXMgYmVlbiBkaXNhYmxlZA0KKyovDQoraW50IGFudWJpc190ZXN0KHZvaWQpDQorew0KKyNpZiAhZGVmaW5lZChMVENfVEVTVCkNCisgIHJldHVybiBDUllQVF9OT1A7DQorI2Vsc2UNCisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdGVzdCB7DQorICAgICBpbnQga2V5bGVuOw0KKyAgICAgdW5zaWduZWQgY2hhciBwdFsxNl0sIGN0WzE2XSwga2V5WzQwXTsNCisgIH0gdGVzdHNbXSA9IHsNCisjaWZuZGVmIEFOVUJJU19UV0VBSw0KKyAgLyoqKiogT1JJR0lOQUwgQU5VQklTICoqKiovDQorICAvKiAxMjggYml0IGtleXMgKi8NCit7DQorICAgMTYsDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LA0KKyAgIHsgMHhGMCwgMHg2OCwgMHg2MCwgMHhGQywgMHg2NywgMHgzMCwgMHhFOCwgMHgxOCwgDQorICAgICAweEYxLCAweDMyLCAweEM3LCAweDhBLCAweEY0LCAweDEzLCAweDJBLCAweEZFIH0sDQorICAgeyAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9DQorfSwgew0KKyAgIDE2LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4QTgsIDB4NjYsIDB4ODQsIDB4ODAsIDB4MDcsIDB4NzQsIDB4NUMsIDB4ODksIA0KKyAgICAgMHhGQywgMHg1RSwgMHhCNSwgMHhCQSwgMHhENCwgMHhGRSwgMHgzMiwgMHg2RCB9LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfQ0KK30sDQorDQorICAgLyogMTYwLWJpdCBrZXlzICovDQorew0KKyAgIDIwLA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4QkQsIDB4NUUsIDB4MzIsIDB4QkUsIDB4NTEsIDB4NjcsIDB4QTgsIDB4RTIsDQorICAgICAweDcyLCAweEQ3LCAweDk1LCAweDBGLCAweDgzLCAweEM2LCAweDhDLCAweDMxIH0sDQorICAgeyAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfQ0KK30sIHsNCisgICAyMCwNCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sDQorICAgeyAweDRDLCAweDFGLCAweDg2LCAweDJFLCAweDExLCAweEVCLCAweENFLCAweEVCLA0KKyAgICAgMHhGRSwgMHhCOSwgMHg3MywgMHhDOSwgMHhERiwgMHhFRiwgMHg3QSwgMHhEQiB9LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxIH0NCit9LA0KKw0KKyAgLyogMTkyLWJpdCBrZXlzICovDQorew0KKyAgIDI0LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4MTcsIDB4QUMsIDB4NTcsIDB4NDQsIDB4OUQsIDB4NTksIDB4NjEsIDB4NjYsIA0KKyAgICAgMHhEMCwgMHhDNywgMHg5RSwgMHgwNCwgMHg3QywgMHhDNywgMHg1OCwgMHhGMCB9LA0KKyAgIHsgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0NCit9LCB7DQorICAgMjQsDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LA0KKyAgIHsgMHg3MSwgMHg1MiwgMHhCNCwgMHhFQiwgMHgxRCwgMHhBQSwgMHgzNiwgMHhGRCwgDQorICAgICAweDU3LCAweDE0LCAweDVGLCAweDU3LCAweDA0LCAweDlGLCAweDcwLCAweDc0IH0sDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfQ0KK30sDQorDQorICAvKiAyMjQtYml0IGtleXMgKi8NCit7DQorICAgMjgsDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LA0KKyAgIHsgMHhBMiwgMHhGMCwgMHhBNiwgMHhCOSwgMHgxNywgMHg5MywgMHgyQSwgMHgzQiwgDQorICAgICAweEVGLCAweDA4LCAweEU4LCAweDdBLCAweDU4LCAweEQ2LCAweEY4LCAweDUzIH0sDQorICAgeyAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwIH0NCit9LCB7DQorICAgMjgsDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LA0KKyAgIHsgMHhGMCwgMHhDQSwgMHhGQywgMHg3OCwgMHg4QiwgMHg0QiwgMHg0RSwgMHg1MywgDQorICAgICAweDhCLCAweEM0LCAweDMyLCAweDZBLCAweEY1LCAweEI5LCAweDFCLCAweDVGIH0sDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxIH0NCit9LA0KKw0KKyAgLyogMjU2LWJpdCBrZXlzICovDQorew0KKyAgIDMyLA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4RTAsIDB4ODYsIDB4QUMsIDB4NDUsIDB4NkIsIDB4M0MsIDB4RTUsIDB4MTMsIA0KKyAgICAgMHhFRCwgMHhGNSwgMHhERiwgMHhERCwgMHhENiwgMHgzQiwgMHg3MSwgMHg5MyB9LA0KKyAgIHsgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9DQorfSwgew0KKyAgIDMyLA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4NTAsIDB4MDEsIDB4QjksIDB4RjUsIDB4MjEsIDB4QzEsIDB4QzEsIDB4MjksIA0KKyAgICAgMHgwMCwgMHhENSwgMHhFQywgMHg5OCwgMHgyQiwgMHg5RSwgMHhFOCwgMHgyMSB9LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9DQorfSwNCisNCisgIC8qIDI4OC1iaXQga2V5cyAqLw0KK3sNCisgICAzNiwNCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sDQorICAgeyAweEU4LCAweEY0LCAweEFGLCAweDJCLCAweDIxLCAweEEwLCAweDg3LCAweDlCLCANCisgICAgIDB4NDEsIDB4OTUsIDB4QjksIDB4NzEsIDB4NzUsIDB4NzksIDB4MDQsIDB4N0MgfSwNCisgICB7IDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwIH0NCit9LCB7DQorICAgMzYsDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LA0KKyAgIHsgMHhFNiwgMHhBNiwgMHhBNSwgMHhCQywgMHg4QiwgMHg2MywgMHg2RiwgMHhFMiwgDQorICAgICAweEJELCAweEE3LCAweEE3LCAweDUzLCAweEFCLCAweDQwLCAweDIyLCAweEUwIH0sDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9DQorfSwNCisNCisgIC8qIDMyMC1iaXQga2V5cyAqLw0KK3sNCisgICA0MCwNCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sDQorICAgeyAweDE3LCAweDA0LCAweEQ3LCAweDJDLCAweEM2LCAweDg1LCAweDc2LCAweDAyLCANCisgICAgIDB4NEIsIDB4Q0MsIDB4MzksIDB4ODAsIDB4RDgsIDB4MjIsIDB4RUEsIDB4QTQgfSwNCisgICB7IDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0NCit9LCB7DQorICAgNDAsDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LA0KKyAgIHsgMHg3QSwgMHg0MSwgMHhFNiwgMHg3RCwgMHg0RiwgMHhEOCwgMHg2NCwgMHhGMCwgDQorICAgICAweDQ0LCAweEE4LCAweDNDLCAweDczLCAweDgxLCAweDdFLCAweDUzLCAweEQ4IH0sDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9DQorfQ0KKyNlbHNlDQorICAvKioqKiBUd2Vha2VkIEFOVUJJUyAqKioqLw0KKyAgLyogMTI4IGJpdCBrZXlzICovDQorew0KKyAgIDE2LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4QjgsIDB4MzUsIDB4QkQsIDB4QzMsIDB4MzQsIDB4ODIsIDB4OUQsIDB4ODMsDQorICAgICAweDcxLCAweEJGLCAweEEzLCAweDcxLCAweEU0LCAweEIzLCAweEM0LCAweEZEIH0sDQorICAgeyAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9DQorfSwgew0KKyAgIDE2LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4RTYsIDB4MTQsIDB4MUUsIDB4QUYsIDB4RUIsIDB4RTAsIDB4NTksIDB4M0MsDQorICAgICAweDQ4LCAweEUxLCAweENELCAweEYyLCAweDFCLCAweEJBLCAweEExLCAweDg5IH0sDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9DQorfSwNCisNCisgICAvKiAxNjAtYml0IGtleXMgKi8NCit7DQorICAgMjAsDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LA0KKyAgIHsgMHg5NywgMHg1OSwgMHg3OSwgMHg0QiwgMHg1QywgMHhBMCwgMHg3MCwgMHg3MywNCisgICAgIDB4MjQsIDB4RUYsIDB4QjMsIDB4NTgsIDB4NjcsIDB4Q0EsIDB4RDQsIDB4QjMgfSwNCisgICB7IDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9DQorfSwgew0KKyAgIDIwLA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4QjgsIDB4MEQsIDB4RkIsIDB4OUIsIDB4RTQsIDB4QTEsIDB4NTgsIDB4ODcsDQorICAgICAweEIzLCAweDc2LCAweEQ1LCAweDAyLCAweDE4LCAweDk1LCAweEMxLCAweDJFIH0sDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfQ0KK30sDQorDQorICAvKiAxOTItYml0IGtleXMgKi8NCit7DQorICAgMjQsDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LA0KKyAgIHsgMHg3RCwgMHg2MiwgMHgzQiwgMHg1MiwgMHhDNywgMHg0QywgMHg2NCwgMHhEOCwNCisgICAgIDB4RUIsIDB4QzcsIDB4MkQsIDB4NTcsIDB4OTcsIDB4ODUsIDB4NDMsIDB4OEYgfSwNCisgICB7IDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9DQorfSwgew0KKyAgIDI0LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4QjEsIDB4MEEsIDB4NTksIDB4REQsIDB4NUQsIDB4NUQsIDB4OEQsIDB4NjcsDQorICAgICAweEVDLCAweEVFLCAweDRBLCAweEM0LCAweEJFLCAweDRGLCAweEE4LCAweDRGIH0sDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfQ0KK30sDQorDQorICAvKiAyMjQtYml0IGtleXMgKi8NCit7DQorICAgMjgsDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LA0KKyAgIHsgMHg2OCwgMHg5RSwgMHgwNSwgMHg5NCwgMHg2QSwgMHg5NCwgMHg0MywgMHg4RiwNCisgICAgIDB4RTcsIDB4OEUsIDB4MzcsIDB4M0QsIDB4MjQsIDB4OTcsIDB4OTIsIDB4RjUgfSwNCisgICB7IDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfQ0KK30sIHsNCisgICAyOCwNCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sDQorICAgeyAweERELCAweEI3LCAweEIwLCAweEI0LCAweEU5LCAweEI0LCAweDlCLCAweDlDLA0KKyAgICAgMHgzOCwgMHgyMCwgMHgyNSwgMHgwQiwgMHg0NywgMHhDMiwgMHgxRiwgMHg4OSB9LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9DQorfSwNCisNCisgIC8qIDI1Ni1iaXQga2V5cyAqLw0KK3sNCisgICAzMiwNCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sDQorICAgeyAweDk2LCAweDAwLCAweEYwLCAweDc2LCAweDkxLCAweDY5LCAweDI5LCAweDg3LA0KKyAgICAgMHhGNSwgMHhFNSwgMHg5NywgMHhEQiwgMHhEQiwgMHhBRiwgMHgxQiwgMHgwQSB9LA0KKyAgIHsgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9DQorfSwgew0KKyAgIDMyLA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4NjksIDB4OUMsIDB4QUYsIDB4REQsIDB4OTQsIDB4QzcsIDB4QkMsIDB4NjAsDQorICAgICAweDQ0LCAweEZFLCAweDAyLCAweDA1LCAweDhBLCAweDZFLCAweEVGLCAweEJEIH0sDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxIH0NCit9LA0KKw0KKyAgLyogMjg4LWJpdCBrZXlzICovDQorew0KKyAgIDM2LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4MEYsIDB4QzcsIDB4QTIsIDB4QzAsIDB4MTEsIDB4MTcsIDB4QUMsIDB4NDMsDQorICAgICAweDUyLCAweDVFLCAweERGLCAweDZDLCAweEYzLCAweDk2LCAweDMzLCAweDZDIH0sDQorICAgeyAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9DQorfSwgew0KKyAgIDM2LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwNCisgICB7IDB4QUQsIDB4MDgsIDB4NEYsIDB4RUQsIDB4NTUsIDB4QTYsIDB4OTQsIDB4M0UsDQorICAgICAweDdFLCAweDVFLCAweEVELCAweDA1LCAweEExLCAweDlELCAweDQxLCAweEI0IH0sDQorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9DQorfSwNCisNCisgIC8qIDMyMC1iaXQga2V5cyAqLw0KK3sNCisgICA0MCwNCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sDQorICAgeyAweEZFLCAweEUyLCAweDBFLCAweDJBLCAweDlELCAweEM1LCAweDgzLCAweEJBLA0KKyAgICAgMHhBMywgMHhBNiwgMHhENiwgMHhBNiwgMHhGMiwgMHhFOCwgMHgwNiwgMHhBNSB9LA0KKyAgIHsgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfQ0KK30sIHsNCisgICA0MCwNCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sDQorICAgeyAweDg2LCAweDNELCAweENDLCAweDRBLCAweDYwLCAweDM0LCAweDlDLCAweDI4LA0KKyAgICAgMHhBNywgMHhEQSwgMHhBNCwgMHgzQiwgMHgwQSwgMHhENywgMHhGRCwgMHhDNyB9LA0KKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsDQorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLA0KKyAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwNCisgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEgfQ0KK30NCisjZW5kaWYNCit9Ow0KKyAgIGludCB4LCB5Ow0KKyAgIHVuc2lnbmVkIGNoYXIgYnVmWzJdWzE2XTsNCisgICBzeW1tZXRyaWNfa2V5IHNrZXk7DQorDQorICAgZm9yICh4ID0gMDsgeCA8IChpbnQpKHNpemVvZih0ZXN0cykvc2l6ZW9mKHRlc3RzWzBdKSk7IHgrKykgew0KKyAgICAgICBhbnViaXNfc2V0dXAodGVzdHNbeF0ua2V5LCB0ZXN0c1t4XS5rZXlsZW4sIDAsICZza2V5KTsNCisgICAgICAgYW51YmlzX2VjYl9lbmNyeXB0KHRlc3RzW3hdLnB0LCBidWZbMF0sICZza2V5KTsNCisgICAgICAgYW51YmlzX2VjYl9kZWNyeXB0KGJ1ZlswXSwgYnVmWzFdLCAmc2tleSk7DQorICAgICAgIGlmIChtZW1jbXAoYnVmWzBdLCB0ZXN0c1t4XS5jdCwgMTYpIHx8IG1lbWNtcChidWZbMV0sIHRlc3RzW3hdLnB0LCAxNikpIHsNCisgICAgICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsNCisgICAgICAgfQ0KKw0KKyAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTAwMDsgeSsrKSBhbnViaXNfZWNiX2VuY3J5cHQoYnVmWzBdLCBidWZbMF0sICZza2V5KTsNCisgICAgICAgZm9yICh5ID0gMDsgeSA8IDEwMDA7IHkrKykgYW51YmlzX2VjYl9kZWNyeXB0KGJ1ZlswXSwgYnVmWzBdLCAmc2tleSk7DQorICAgICAgIGlmIChtZW1jbXAoYnVmWzBdLCB0ZXN0c1t4XS5jdCwgMTYpKSB7DQorICAgICAgICAgIHJldHVybiBDUllQVF9GQUlMX1RFU1RWRUNUT1I7DQorICAgICAgIH0NCisNCisgICB9DQorICAgcmV0dXJuIENSWVBUX09LOw0KKyNlbmRpZg0KK30NCisNCisvKiogVGVybWluYXRlIHRoZSBjb250ZXh0IA0KKyAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5DQorKi8NCit2b2lkIGFudWJpc19kb25lKHN5bW1ldHJpY19rZXkgKnNrZXkpDQorew0KK30NCisNCisvKioNCisgIEdldHMgc3VpdGFibGUga2V5IHNpemUNCisgIEBwYXJhbSBrZXlzaXplIFtpbi9vdXRdIFRoZSBsZW5ndGggb2YgdGhlIHJlY29tbWVuZGVkIGtleSAoaW4gYnl0ZXMpLiAgVGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIHRoZSBzdWl0YWJsZSBzaXplIGJhY2sgaW4gdGhpcyB2YXJpYWJsZS4NCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdGhlIGlucHV0IGtleSBzaXplIGlzIGFjY2VwdGFibGUuDQorKi8NCitpbnQgYW51YmlzX2tleXNpemUoaW50ICprZXlzaXplKQ0KK3sNCisgICBMVENfQVJHQ0hLKGtleXNpemUgIT0gTlVMTCk7DQorICAgaWYgKCprZXlzaXplID49IDQwKSB7DQorICAgICAgKmtleXNpemUgPSA0MDsNCisgICB9IGVsc2UgaWYgKCprZXlzaXplID49IDM2KSB7DQorICAgICAgKmtleXNpemUgPSAzNjsNCisgICB9IGVsc2UgaWYgKCprZXlzaXplID49IDMyKSB7DQorICAgICAgKmtleXNpemUgPSAzMjsNCisgICB9IGVsc2UgaWYgKCprZXlzaXplID49IDI4KSB7DQorICAgICAgKmtleXNpemUgPSAyODsNCisgICB9IGVsc2UgaWYgKCprZXlzaXplID49IDI0KSB7DQorICAgICAgKmtleXNpemUgPSAyNDsNCisgICB9IGVsc2UgaWYgKCprZXlzaXplID49IDIwKSB7DQorICAgICAgKmtleXNpemUgPSAyMDsNCisgICB9IGVsc2UgaWYgKCprZXlzaXplID49IDE2KSB7DQorICAgICAgKmtleXNpemUgPSAxNjsNCisgICB9IGVsc2Ugew0KKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0tFWVNJWkU7DQorICAgfQ0KKyAgIHJldHVybiBDUllQVF9PSzsNCit9DQorDQorI2VuZGlmDQorDQorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvY2lwaGVycy9hbnViaXMuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS43ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL2Jsb3dmaXNoLmMgYi9zcmMvY2lwaGVycy9ibG93ZmlzaC5jCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIGJsb3dmaXNoLmMKcmVuYW1lIHRvIHNyYy9jaXBoZXJzL2Jsb3dmaXNoLmMKaW5kZXggMjI5YmE4OC4uMzUwMjk4MyAxMDA2NDQKLS0tIGEvYmxvd2Zpc2guYworKysgYi9zcmMvY2lwaGVycy9ibG93ZmlzaC5jCkBAIC02LDEzICs2LDE3IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisvKioKKyAgQGZpbGUgYmxvd2Zpc2guYworICBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQmxvd2Zpc2ggYmxvY2sgY2lwaGVyLCBUb20gU3QgRGVuaXMKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAogI2lmZGVmIEJMT1dGSVNICiAKLWNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgYmxvd2Zpc2hfZGVzYyA9Citjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIGJsb3dmaXNoX2Rlc2MgPQogewogICAgICJibG93ZmlzaCIsCiAgICAgMCwKQEAgLTIxLDcgKzI1LDkgQEAKICAgICAmYmxvd2Zpc2hfZWNiX2VuY3J5cHQsCiAgICAgJmJsb3dmaXNoX2VjYl9kZWNyeXB0LAogICAgICZibG93ZmlzaF90ZXN0LAotICAgICZibG93ZmlzaF9rZXlzaXplCisgICAgJmJsb3dmaXNoX2RvbmUsCisgICAgJmJsb3dmaXNoX2tleXNpemUsCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAogfTsKIAogc3RhdGljIGNvbnN0IHVsb25nMzIgT1JJR19QWzE2ICsgMl0gPSB7CkBAIC0yOTEsMTQgKzI5NywyMiBAQAogICAgICAgICAweEI3NEU2MTMyVUwsIDB4Q0U3N0UyNUJVTCwgMHg1NzhGREZFM1VMLCAweDNBQzM3MkU2VUwgIH0KIH07CiAKKyAvKioKKyAgICBJbml0aWFsaXplIHRoZSBCbG93ZmlzaCBibG9jayBjaXBoZXIKKyAgICBAcGFyYW0ga2V5IFRoZSBzeW1tZXRyaWMga2V5IHlvdSB3aXNoIHRvIHBhc3MKKyAgICBAcGFyYW0ga2V5bGVuIFRoZSBrZXkgbGVuZ3RoIGluIGJ5dGVzCisgICAgQHBhcmFtIG51bV9yb3VuZHMgVGhlIG51bWJlciBvZiByb3VuZHMgZGVzaXJlZCAoMCBmb3IgZGVmYXVsdCkKKyAgICBAcGFyYW0gc2tleSBUaGUga2V5IGluIGFzIHNjaGVkdWxlZCBieSB0aGlzIGZ1bmN0aW9uLgorICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICovCiBpbnQgYmxvd2Zpc2hfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywKICAgICAgICAgICAgICAgICAgICBzeW1tZXRyaWNfa2V5ICpza2V5KQogewogICAgdWxvbmczMiB4LCB5LCB6LCBBOwogICAgdW5zaWduZWQgY2hhciBCWzhdOwogCi0gICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoc2tleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogCiAgICAvKiBjaGVjayBrZXkgbGVuZ3RoICovCiAgICBpZiAoa2V5bGVuIDwgOCB8fCBrZXlsZW4gPiA1NikgewpAQCAtMzUzLDcgKzM2Nyw3IEBACiAgICAgICAgfQogICAgfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKICAgIHplcm9tZW0oQiwgc2l6ZW9mKEIpKTsKICNlbmRpZgogCkBAIC0zNjMsMTMgKzM3NywxOSBAQAogI2lmbmRlZiBfX0dOVUNfXwogI2RlZmluZSBGKHgpICgoUzFbYnl0ZSh4LDMpXSArIFMyW2J5dGUoeCwyKV0pIF4gUzNbYnl0ZSh4LDEpXSkgKyBTNFtieXRlKHgsMCldCiAjZWxzZQotI2RlZmluZSBGKHgpICgoa2V5LT5ibG93ZmlzaC5TWzBdW2J5dGUoeCwzKV0gKyBrZXktPmJsb3dmaXNoLlNbMV1bYnl0ZSh4LDIpXSkgXiBrZXktPmJsb3dmaXNoLlNbMl1bYnl0ZSh4LDEpXSkgKyBrZXktPmJsb3dmaXNoLlNbM11bYnl0ZSh4LDApXQorI2RlZmluZSBGKHgpICgoc2tleS0+Ymxvd2Zpc2guU1swXVtieXRlKHgsMyldICsgc2tleS0+Ymxvd2Zpc2guU1sxXVtieXRlKHgsMildKSBeIHNrZXktPmJsb3dmaXNoLlNbMl1bYnl0ZSh4LDEpXSkgKyBza2V5LT5ibG93ZmlzaC5TWzNdW2J5dGUoeCwwKV0KICNlbmRpZgogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIF9ibG93ZmlzaF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSkKKy8qKgorICBFbmNyeXB0cyBhIGJsb2NrIG9mIHRleHQgd2l0aCBCbG93ZmlzaAorICBAcGFyYW0gcHQgVGhlIGlucHV0IHBsYWludGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIGN0IFRoZSBvdXRwdXQgY2lwaGVydGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQKKyovCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCitzdGF0aWMgdm9pZCBfYmxvd2Zpc2hfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKLXZvaWQgYmxvd2Zpc2hfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpCit2b2lkIGJsb3dmaXNoX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKICNlbmRpZgogewogICAgdWxvbmczMiBMLCBSOwpAQCAtMzc4LDE1ICszOTgsMTUgQEAKICAgIHVsb25nMzIgKlMxLCAqUzIsICpTMywgKlM0OwogI2VuZGlmCiAKLSAgICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotICAgIF9BUkdDSEsoY3QgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhwdCAgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoY3QgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CiAKICNpZm5kZWYgX19HTlVDX18KLSAgICBTMSA9IGtleS0+Ymxvd2Zpc2guU1swXTsKLSAgICBTMiA9IGtleS0+Ymxvd2Zpc2guU1sxXTsKLSAgICBTMyA9IGtleS0+Ymxvd2Zpc2guU1syXTsKLSAgICBTNCA9IGtleS0+Ymxvd2Zpc2guU1szXTsKKyAgICBTMSA9IHNrZXktPmJsb3dmaXNoLlNbMF07CisgICAgUzIgPSBza2V5LT5ibG93ZmlzaC5TWzFdOworICAgIFMzID0gc2tleS0+Ymxvd2Zpc2guU1syXTsKKyAgICBTNCA9IHNrZXktPmJsb3dmaXNoLlNbM107CiAjZW5kaWYKIAogICAgLyogbG9hZCBpdCAqLwpAQCAtMzk1LDMzICs0MTUsMzkgQEAKIAogICAgLyogZG8gMTYgcm91bmRzICovCiAgICBmb3IgKHIgPSAwOyByIDwgMTY7ICkgewotICAgICAgTCBePSBrZXktPmJsb3dmaXNoLktbcisrXTsgIFIgXj0gRihMKTsKLSAgICAgIFIgXj0ga2V5LT5ibG93ZmlzaC5LW3IrK107ICBMIF49IEYoUik7Ci0gICAgICBMIF49IGtleS0+Ymxvd2Zpc2guS1tyKytdOyAgUiBePSBGKEwpOwotICAgICAgUiBePSBrZXktPmJsb3dmaXNoLktbcisrXTsgIEwgXj0gRihSKTsKKyAgICAgIEwgXj0gc2tleS0+Ymxvd2Zpc2guS1tyKytdOyAgUiBePSBGKEwpOworICAgICAgUiBePSBza2V5LT5ibG93ZmlzaC5LW3IrK107ICBMIF49IEYoUik7CisgICAgICBMIF49IHNrZXktPmJsb3dmaXNoLktbcisrXTsgIFIgXj0gRihMKTsKKyAgICAgIFIgXj0gc2tleS0+Ymxvd2Zpc2guS1tyKytdOyAgTCBePSBGKFIpOwogICAgfQogCiAgICAvKiBsYXN0IGtleWluZyAqLwotICAgUiBePSBrZXktPmJsb3dmaXNoLktbMTddOwotICAgTCBePSBrZXktPmJsb3dmaXNoLktbMTZdOworICAgUiBePSBza2V5LT5ibG93ZmlzaC5LWzE3XTsKKyAgIEwgXj0gc2tleS0+Ymxvd2Zpc2guS1sxNl07CiAKICAgIC8qIHN0b3JlICovCiAgICBTVE9SRTMySChSLCAmY3RbMF0pOwogICAgU1RPUkUzMkgoTCwgJmN0WzRdKTsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCi12b2lkIGJsb3dmaXNoX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KQorI2lmZGVmIExUQ19DTEVBTl9TVEFDSwordm9pZCBibG93ZmlzaF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7Ci0gICAgX2Jsb3dmaXNoX2VjYl9lbmNyeXB0KHB0LCBjdCwga2V5KTsKKyAgICBfYmxvd2Zpc2hfZWNiX2VuY3J5cHQocHQsIGN0LCBza2V5KTsKICAgICBidXJuX3N0YWNrKHNpemVvZih1bG9uZzMyKSAqIDIgKyBzaXplb2YoaW50KSk7CiB9CiAjZW5kaWYKIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfYmxvd2Zpc2hfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisvKioKKyAgRGVjcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggQmxvd2Zpc2gKKyAgQHBhcmFtIGN0IFRoZSBpbnB1dCBjaXBoZXJ0ZXh0ICg4IGJ5dGVzKQorICBAcGFyYW0gcHQgVGhlIG91dHB1dCBwbGFpbnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkIAorKi8KKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyB2b2lkIF9ibG93ZmlzaF9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiAjZWxzZQotdm9pZCBibG93ZmlzaF9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSkKK3ZvaWQgYmxvd2Zpc2hfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2VuZGlmCiB7CiAgICB1bG9uZzMyIEwsIFI7CkBAIC00MzAsMTUgKzQ1NiwxNSBAQAogICAgdWxvbmczMiAqUzEsICpTMiwgKlMzLCAqUzQ7CiAjZW5kaWYKIAotICAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKHB0ICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhjdCAgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKICAgICAKICNpZm5kZWYgX19HTlVDX18KLSAgICBTMSA9IGtleS0+Ymxvd2Zpc2guU1swXTsKLSAgICBTMiA9IGtleS0+Ymxvd2Zpc2guU1sxXTsKLSAgICBTMyA9IGtleS0+Ymxvd2Zpc2guU1syXTsKLSAgICBTNCA9IGtleS0+Ymxvd2Zpc2guU1szXTsKKyAgICBTMSA9IHNrZXktPmJsb3dmaXNoLlNbMF07CisgICAgUzIgPSBza2V5LT5ibG93ZmlzaC5TWzFdOworICAgIFMzID0gc2tleS0+Ymxvd2Zpc2guU1syXTsKKyAgICBTNCA9IHNrZXktPmJsb3dmaXNoLlNbM107CiAjZW5kaWYKIAogICAgLyogbG9hZCBpdCAqLwpAQCAtNDQ2LDE1ICs0NzIsMTUgQEAKICAgIExPQUQzMkgoTCwgJmN0WzRdKTsKIAogICAgLyogdW5kbyBsYXN0IGtleWluZyAqLwotICAgUiBePSBrZXktPmJsb3dmaXNoLktbMTddOwotICAgTCBePSBrZXktPmJsb3dmaXNoLktbMTZdOworICAgUiBePSBza2V5LT5ibG93ZmlzaC5LWzE3XTsKKyAgIEwgXj0gc2tleS0+Ymxvd2Zpc2guS1sxNl07CiAKICAgIC8qIGRvIDE2IHJvdW5kcyAqLwogICAgZm9yIChyID0gMTU7IHIgPiAwOyApIHsKLSAgICAgIEwgXj0gRihSKTsgUiBePSBrZXktPmJsb3dmaXNoLktbci0tXTsKLSAgICAgIFIgXj0gRihMKTsgTCBePSBrZXktPmJsb3dmaXNoLktbci0tXTsKLSAgICAgIEwgXj0gRihSKTsgUiBePSBrZXktPmJsb3dmaXNoLktbci0tXTsKLSAgICAgIFIgXj0gRihMKTsgTCBePSBrZXktPmJsb3dmaXNoLktbci0tXTsKKyAgICAgIEwgXj0gRihSKTsgUiBePSBza2V5LT5ibG93ZmlzaC5LW3ItLV07CisgICAgICBSIF49IEYoTCk7IEwgXj0gc2tleS0+Ymxvd2Zpc2guS1tyLS1dOworICAgICAgTCBePSBGKFIpOyBSIF49IHNrZXktPmJsb3dmaXNoLktbci0tXTsKKyAgICAgIFIgXj0gRihMKTsgTCBePSBza2V5LT5ibG93ZmlzaC5LW3ItLV07CiAgICB9CiAKICAgIC8qIHN0b3JlICovCkBAIC00NjIsMTUgKzQ4OCwxOSBAQAogICAgU1RPUkUzMkgoUiwgJnB0WzRdKTsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCi12b2lkIGJsb3dmaXNoX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KQorI2lmZGVmIExUQ19DTEVBTl9TVEFDSwordm9pZCBibG93ZmlzaF9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7Ci0gICAgX2Jsb3dmaXNoX2VjYl9kZWNyeXB0KGN0LCBwdCwga2V5KTsKKyAgICBfYmxvd2Zpc2hfZWNiX2RlY3J5cHQoY3QsIHB0LCBza2V5KTsKICAgICBidXJuX3N0YWNrKHNpemVvZih1bG9uZzMyKSAqIDIgKyBzaXplb2YoaW50KSk7CiB9CiAjZW5kaWYKIAogCisvKioKKyAgUGVyZm9ybXMgYSBzZWxmLXRlc3Qgb2YgdGhlIEJsb3dmaXNoIGJsb2NrIGNpcGhlcgorICBAcmV0dXJuIENSWVBUX09LIGlmIGZ1bmN0aW9uYWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3QgaGFzIGJlZW4gZGlzYWJsZWQKKyovCiBpbnQgYmxvd2Zpc2hfdGVzdCh2b2lkKQogewogICNpZm5kZWYgTFRDX1RFU1QKQEAgLTUyNSwxNyArNTU1LDMzIEBACiAgI2VuZGlmCiB9CiAKLWludCBibG93ZmlzaF9rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKQorLyoqIFRlcm1pbmF0ZSB0aGUgY29udGV4dCAKKyAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5CisqLwordm9pZCBibG93ZmlzaF9kb25lKHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7Ci0gICBfQVJHQ0hLKGRlc2lyZWRfa2V5c2l6ZSAhPSBOVUxMKTsKK30KIAotICAgaWYgKCpkZXNpcmVkX2tleXNpemUgPCA4KSB7CisvKioKKyAgR2V0cyBzdWl0YWJsZSBrZXkgc2l6ZQorICBAcGFyYW0ga2V5c2l6ZSBbaW4vb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSByZWNvbW1lbmRlZCBrZXkgKGluIGJ5dGVzKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSB0aGUgc3VpdGFibGUgc2l6ZSBiYWNrIGluIHRoaXMgdmFyaWFibGUuCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdGhlIGlucHV0IGtleSBzaXplIGlzIGFjY2VwdGFibGUuCisqLworaW50IGJsb3dmaXNoX2tleXNpemUoaW50ICprZXlzaXplKQoreworICAgTFRDX0FSR0NISyhrZXlzaXplICE9IE5VTEwpOworCisgICBpZiAoKmtleXNpemUgPCA4KSB7CiAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOwotICAgfSBlbHNlIGlmICgqZGVzaXJlZF9rZXlzaXplID4gNTYpIHsKLSAgICAgICpkZXNpcmVkX2tleXNpemUgPSA1NjsKKyAgIH0gZWxzZSBpZiAoKmtleXNpemUgPiA1NikgeworICAgICAgKmtleXNpemUgPSA1NjsKICAgIH0KICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAogI2VuZGlmCiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2NpcGhlcnMvYmxvd2Zpc2guYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS43ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL2Nhc3Q1LmMgYi9zcmMvY2lwaGVycy9jYXN0NS5jCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIGNhc3Q1LmMKcmVuYW1lIHRvIHNyYy9jaXBoZXJzL2Nhc3Q1LmMKaW5kZXggNDVhODQzMy4uZjRiMDQ1YyAxMDA2NDQKLS0tIGEvY2FzdDUuYworKysgYi9zcmMvY2lwaGVycy9jYXN0NS5jCkBAIC02LDE0ICs2LDE4IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLS8qIEltcGxlbWVudGF0aW9uIG9mIENBU1Q1IChSRkMgMjE0NCkgYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorIAorIC8qKiAKKyAgIEBmaWxlIGNhc3Q1LmMKKyAgIEltcGxlbWVudGF0aW9uIG9mIENBU1Q1IChSRkMgMjE0NCkgYnkgVG9tIFN0IERlbmlzIAorICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAogI2lmZGVmIENBU1Q1CiAKLWNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgY2FzdDVfZGVzYyA9IHsKK2NvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgY2FzdDVfZGVzYyA9IHsKICAgICJjYXN0NSIsCiAgICAxNSwKICAgIDUsIDE2LCA4LCAxNiwKQEAgLTIxLDcgKzI1LDkgQEAKICAgICZjYXN0NV9lY2JfZW5jcnlwdCwKICAgICZjYXN0NV9lY2JfZGVjcnlwdCwKICAgICZjYXN0NV90ZXN0LAotICAgJmNhc3Q1X2tleXNpemUKKyAgICZjYXN0NV9kb25lLAorICAgJmNhc3Q1X2tleXNpemUsCisgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCiB9OwogCiBzdGF0aWMgY29uc3QgdWxvbmczMiBTMVsyNTZdID0gewpAQCAtMzkxLDcgKzM5NywxNSBAQAogICAgI2RlZmluZSBHQih4LCBpKSAoKCh4WygxNS1pKT4+Ml0pPj4odW5zaWduZWQpKDgqKCgxNS1pKSYzKSkpJjI1NSkKICNlbmRpZiAgIAogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyAvKioKKyAgICBJbml0aWFsaXplIHRoZSBDQVNUNSBibG9jayBjaXBoZXIKKyAgICBAcGFyYW0ga2V5IFRoZSBzeW1tZXRyaWMga2V5IHlvdSB3aXNoIHRvIHBhc3MKKyAgICBAcGFyYW0ga2V5bGVuIFRoZSBrZXkgbGVuZ3RoIGluIGJ5dGVzCisgICAgQHBhcmFtIG51bV9yb3VuZHMgVGhlIG51bWJlciBvZiByb3VuZHMgZGVzaXJlZCAoMCBmb3IgZGVmYXVsdCkKKyAgICBAcGFyYW0gc2tleSBUaGUga2V5IGluIGFzIHNjaGVkdWxlZCBieSB0aGlzIGZ1bmN0aW9uLgorICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICovCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiBzdGF0aWMgaW50IF9jYXN0NV9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKIGludCBjYXN0NV9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQpAQCAtNDAxLDggKzQxNSw4IEBACiAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07CiAgICBpbnQgeSwgaTsKIAotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKIAogICAgaWYgKG51bV9yb3VuZHMgIT0gMTIgJiYgbnVtX3JvdW5kcyAhPSAxNiAmJiBudW1fcm91bmRzICE9IDApIHsKICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1JPVU5EUzsgCkBAIC00MTgsNyArNDMyLDcgQEAKIAogICAgLyogZXh0ZW5kIHRoZSBrZXkgYXMgcmVxdWlyZWQgKi8KICAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7Ci0gICBtZW1jcHkoYnVmLCBrZXksIChzaXplX3Qpa2V5bGVuKTsKKyAgIFhNRU1DUFkoYnVmLCBrZXksIChzaXplX3Qpa2V5bGVuKTsKIAogICAgLyogbG9hZCBhbmQgc3RhcnQgdGhlIGF3ZnVsIGxvb2tpbmcgbmV0d29yayAqLwogICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykgewpAQCAtNDY2LDcgKzQ4MCw3IEBACiAKICAgIHNrZXktPmNhc3Q1LmtleWxlbiA9IGtleWxlbjsKIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogICAgemVyb21lbSh4LCBzaXplb2YoeCkpOwogICAgemVyb21lbSh6LCBzaXplb2YoeikpOwpAQCAtNDc1LDcgKzQ4OSw3IEBACiAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKLSNpZmRlZiBDTEVBTl9TVEFDSworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogaW50IGNhc3Q1X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7CiAgICBpbnQgejsKQEAgLTUxNSw5NSArNTI5LDExMSBAQAogICAgcmV0dXJuICgoUzFbYnl0ZShJLCAzKV0gKyBTMltieXRlKEksMildKSBeIFMzW2J5dGUoSSwxKV0pIC0gUzRbYnl0ZShJLDApXTsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfY2FzdDVfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisvKioKKyAgRW5jcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggQ0FTVDUKKyAgQHBhcmFtIHB0IFRoZSBpbnB1dCBwbGFpbnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBjdCBUaGUgb3V0cHV0IGNpcGhlcnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkCisqLworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworc3RhdGljIHZvaWQgX2Nhc3Q1X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKICNlbHNlCi12b2lkIGNhc3Q1X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KQordm9pZCBjYXN0NV9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiAjZW5kaWYKIHsKICAgIHVsb25nMzIgUiwgTDsKIAotICAgX0FSR0NISyhwdCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY3QgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKIAogICAgTE9BRDMySChMLCZwdFswXSk7IAogICAgTE9BRDMySChSLCZwdFs0XSk7Ci0gICBMIF49IEZJKFIsIGtleS0+Y2FzdDUuS1swXSwga2V5LT5jYXN0NS5LWzE2XSk7Ci0gICBSIF49IEZJSShMLCBrZXktPmNhc3Q1LktbMV0sIGtleS0+Y2FzdDUuS1sxN10pOwotICAgTCBePSBGSUlJKFIsIGtleS0+Y2FzdDUuS1syXSwga2V5LT5jYXN0NS5LWzE4XSk7Ci0gICBSIF49IEZJKEwsIGtleS0+Y2FzdDUuS1szXSwga2V5LT5jYXN0NS5LWzE5XSk7Ci0gICBMIF49IEZJSShSLCBrZXktPmNhc3Q1LktbNF0sIGtleS0+Y2FzdDUuS1syMF0pOwotICAgUiBePSBGSUlJKEwsIGtleS0+Y2FzdDUuS1s1XSwga2V5LT5jYXN0NS5LWzIxXSk7Ci0gICBMIF49IEZJKFIsIGtleS0+Y2FzdDUuS1s2XSwga2V5LT5jYXN0NS5LWzIyXSk7Ci0gICBSIF49IEZJSShMLCBrZXktPmNhc3Q1LktbN10sIGtleS0+Y2FzdDUuS1syM10pOwotICAgTCBePSBGSUlJKFIsIGtleS0+Y2FzdDUuS1s4XSwga2V5LT5jYXN0NS5LWzI0XSk7Ci0gICBSIF49IEZJKEwsIGtleS0+Y2FzdDUuS1s5XSwga2V5LT5jYXN0NS5LWzI1XSk7Ci0gICBMIF49IEZJSShSLCBrZXktPmNhc3Q1LktbMTBdLCBrZXktPmNhc3Q1LktbMjZdKTsKLSAgIFIgXj0gRklJSShMLCBrZXktPmNhc3Q1LktbMTFdLCBrZXktPmNhc3Q1LktbMjddKTsKLSAgIGlmIChrZXktPmNhc3Q1LmtleWxlbiA+IDEwKSB7Ci0gICAgICBMIF49IEZJKFIsIGtleS0+Y2FzdDUuS1sxMl0sIGtleS0+Y2FzdDUuS1syOF0pOwotICAgICAgUiBePSBGSUkoTCwga2V5LT5jYXN0NS5LWzEzXSwga2V5LT5jYXN0NS5LWzI5XSk7Ci0gICAgICBMIF49IEZJSUkoUiwga2V5LT5jYXN0NS5LWzE0XSwga2V5LT5jYXN0NS5LWzMwXSk7Ci0gICAgICBSIF49IEZJKEwsIGtleS0+Y2FzdDUuS1sxNV0sIGtleS0+Y2FzdDUuS1szMV0pOworICAgTCBePSBGSShSLCBza2V5LT5jYXN0NS5LWzBdLCBza2V5LT5jYXN0NS5LWzE2XSk7CisgICBSIF49IEZJSShMLCBza2V5LT5jYXN0NS5LWzFdLCBza2V5LT5jYXN0NS5LWzE3XSk7CisgICBMIF49IEZJSUkoUiwgc2tleS0+Y2FzdDUuS1syXSwgc2tleS0+Y2FzdDUuS1sxOF0pOworICAgUiBePSBGSShMLCBza2V5LT5jYXN0NS5LWzNdLCBza2V5LT5jYXN0NS5LWzE5XSk7CisgICBMIF49IEZJSShSLCBza2V5LT5jYXN0NS5LWzRdLCBza2V5LT5jYXN0NS5LWzIwXSk7CisgICBSIF49IEZJSUkoTCwgc2tleS0+Y2FzdDUuS1s1XSwgc2tleS0+Y2FzdDUuS1syMV0pOworICAgTCBePSBGSShSLCBza2V5LT5jYXN0NS5LWzZdLCBza2V5LT5jYXN0NS5LWzIyXSk7CisgICBSIF49IEZJSShMLCBza2V5LT5jYXN0NS5LWzddLCBza2V5LT5jYXN0NS5LWzIzXSk7CisgICBMIF49IEZJSUkoUiwgc2tleS0+Y2FzdDUuS1s4XSwgc2tleS0+Y2FzdDUuS1syNF0pOworICAgUiBePSBGSShMLCBza2V5LT5jYXN0NS5LWzldLCBza2V5LT5jYXN0NS5LWzI1XSk7CisgICBMIF49IEZJSShSLCBza2V5LT5jYXN0NS5LWzEwXSwgc2tleS0+Y2FzdDUuS1syNl0pOworICAgUiBePSBGSUlJKEwsIHNrZXktPmNhc3Q1LktbMTFdLCBza2V5LT5jYXN0NS5LWzI3XSk7CisgICBpZiAoc2tleS0+Y2FzdDUua2V5bGVuID4gMTApIHsKKyAgICAgIEwgXj0gRkkoUiwgc2tleS0+Y2FzdDUuS1sxMl0sIHNrZXktPmNhc3Q1LktbMjhdKTsKKyAgICAgIFIgXj0gRklJKEwsIHNrZXktPmNhc3Q1LktbMTNdLCBza2V5LT5jYXN0NS5LWzI5XSk7CisgICAgICBMIF49IEZJSUkoUiwgc2tleS0+Y2FzdDUuS1sxNF0sIHNrZXktPmNhc3Q1LktbMzBdKTsKKyAgICAgIFIgXj0gRkkoTCwgc2tleS0+Y2FzdDUuS1sxNV0sIHNrZXktPmNhc3Q1LktbMzFdKTsKICAgIH0KICAgIFNUT1JFMzJIKFIsJmN0WzBdKTsKICAgIFNUT1JFMzJIKEwsJmN0WzRdKTsKIH0KIAogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXZvaWQgY2FzdDVfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCit2b2lkIGNhc3Q1X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgIF9jYXN0NV9lY2JfZW5jcnlwdChwdCxjdCxrZXkpOworICAgX2Nhc3Q1X2VjYl9lbmNyeXB0KHB0LGN0LHNrZXkpOwogICAgYnVybl9zdGFjayhzaXplb2YodWxvbmczMikqMyk7CiB9CiAjZW5kaWYKIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfY2FzdDVfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisvKioKKyAgRGVjcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggQ0FTVDUKKyAgQHBhcmFtIGN0IFRoZSBpbnB1dCBjaXBoZXJ0ZXh0ICg4IGJ5dGVzKQorICBAcGFyYW0gcHQgVGhlIG91dHB1dCBwbGFpbnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkIAorKi8KKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyB2b2lkIF9jYXN0NV9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiAjZWxzZQotdm9pZCBjYXN0NV9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSkKK3ZvaWQgY2FzdDVfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2VuZGlmCiB7CiAgICB1bG9uZzMyIFIsIEw7CiAKLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHB0ICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CiAKICAgIExPQUQzMkgoUiwmY3RbMF0pOyAKICAgIExPQUQzMkgoTCwmY3RbNF0pOwotICAgaWYgKGtleS0+Y2FzdDUua2V5bGVuID4gMTApIHsKLSAgICAgIFIgXj0gRkkoTCwga2V5LT5jYXN0NS5LWzE1XSwga2V5LT5jYXN0NS5LWzMxXSk7Ci0gICAgICBMIF49IEZJSUkoUiwga2V5LT5jYXN0NS5LWzE0XSwga2V5LT5jYXN0NS5LWzMwXSk7Ci0gICAgICBSIF49IEZJSShMLCBrZXktPmNhc3Q1LktbMTNdLCBrZXktPmNhc3Q1LktbMjldKTsKLSAgICAgIEwgXj0gRkkoUiwga2V5LT5jYXN0NS5LWzEyXSwga2V5LT5jYXN0NS5LWzI4XSk7CisgICBpZiAoc2tleS0+Y2FzdDUua2V5bGVuID4gMTApIHsKKyAgICAgIFIgXj0gRkkoTCwgc2tleS0+Y2FzdDUuS1sxNV0sIHNrZXktPmNhc3Q1LktbMzFdKTsKKyAgICAgIEwgXj0gRklJSShSLCBza2V5LT5jYXN0NS5LWzE0XSwgc2tleS0+Y2FzdDUuS1szMF0pOworICAgICAgUiBePSBGSUkoTCwgc2tleS0+Y2FzdDUuS1sxM10sIHNrZXktPmNhc3Q1LktbMjldKTsKKyAgICAgIEwgXj0gRkkoUiwgc2tleS0+Y2FzdDUuS1sxMl0sIHNrZXktPmNhc3Q1LktbMjhdKTsKICAgIH0KLSAgIFIgXj0gRklJSShMLCBrZXktPmNhc3Q1LktbMTFdLCBrZXktPmNhc3Q1LktbMjddKTsKLSAgIEwgXj0gRklJKFIsIGtleS0+Y2FzdDUuS1sxMF0sIGtleS0+Y2FzdDUuS1syNl0pOwotICAgUiBePSBGSShMLCBrZXktPmNhc3Q1LktbOV0sIGtleS0+Y2FzdDUuS1syNV0pOwotICAgTCBePSBGSUlJKFIsIGtleS0+Y2FzdDUuS1s4XSwga2V5LT5jYXN0NS5LWzI0XSk7Ci0gICBSIF49IEZJSShMLCBrZXktPmNhc3Q1LktbN10sIGtleS0+Y2FzdDUuS1syM10pOwotICAgTCBePSBGSShSLCBrZXktPmNhc3Q1LktbNl0sIGtleS0+Y2FzdDUuS1syMl0pOwotICAgUiBePSBGSUlJKEwsIGtleS0+Y2FzdDUuS1s1XSwga2V5LT5jYXN0NS5LWzIxXSk7Ci0gICBMIF49IEZJSShSLCBrZXktPmNhc3Q1LktbNF0sIGtleS0+Y2FzdDUuS1syMF0pOwotICAgUiBePSBGSShMLCBrZXktPmNhc3Q1LktbM10sIGtleS0+Y2FzdDUuS1sxOV0pOwotICAgTCBePSBGSUlJKFIsIGtleS0+Y2FzdDUuS1syXSwga2V5LT5jYXN0NS5LWzE4XSk7Ci0gICBSIF49IEZJSShMLCBrZXktPmNhc3Q1LktbMV0sIGtleS0+Y2FzdDUuS1sxN10pOwotICAgTCBePSBGSShSLCBrZXktPmNhc3Q1LktbMF0sIGtleS0+Y2FzdDUuS1sxNl0pOworICAgUiBePSBGSUlJKEwsIHNrZXktPmNhc3Q1LktbMTFdLCBza2V5LT5jYXN0NS5LWzI3XSk7CisgICBMIF49IEZJSShSLCBza2V5LT5jYXN0NS5LWzEwXSwgc2tleS0+Y2FzdDUuS1syNl0pOworICAgUiBePSBGSShMLCBza2V5LT5jYXN0NS5LWzldLCBza2V5LT5jYXN0NS5LWzI1XSk7CisgICBMIF49IEZJSUkoUiwgc2tleS0+Y2FzdDUuS1s4XSwgc2tleS0+Y2FzdDUuS1syNF0pOworICAgUiBePSBGSUkoTCwgc2tleS0+Y2FzdDUuS1s3XSwgc2tleS0+Y2FzdDUuS1syM10pOworICAgTCBePSBGSShSLCBza2V5LT5jYXN0NS5LWzZdLCBza2V5LT5jYXN0NS5LWzIyXSk7CisgICBSIF49IEZJSUkoTCwgc2tleS0+Y2FzdDUuS1s1XSwgc2tleS0+Y2FzdDUuS1syMV0pOworICAgTCBePSBGSUkoUiwgc2tleS0+Y2FzdDUuS1s0XSwgc2tleS0+Y2FzdDUuS1syMF0pOworICAgUiBePSBGSShMLCBza2V5LT5jYXN0NS5LWzNdLCBza2V5LT5jYXN0NS5LWzE5XSk7CisgICBMIF49IEZJSUkoUiwgc2tleS0+Y2FzdDUuS1syXSwgc2tleS0+Y2FzdDUuS1sxOF0pOworICAgUiBePSBGSUkoTCwgc2tleS0+Y2FzdDUuS1sxXSwgc2tleS0+Y2FzdDUuS1sxN10pOworICAgTCBePSBGSShSLCBza2V5LT5jYXN0NS5LWzBdLCBza2V5LT5jYXN0NS5LWzE2XSk7CiAgICBTVE9SRTMySChMLCZwdFswXSk7CiAgICBTVE9SRTMySChSLCZwdFs0XSk7CiB9CiAKLSNpZmRlZiBDTEVBTl9TVEFDSwotdm9pZCBjYXN0NV9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSkKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3ZvaWQgY2FzdDVfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogewotICAgX2Nhc3Q1X2VjYl9kZWNyeXB0KGN0LHB0LGtleSk7CisgICBfY2FzdDVfZWNiX2RlY3J5cHQoY3QscHQsc2tleSk7CiAgICBidXJuX3N0YWNrKHNpemVvZih1bG9uZzMyKSozKTsKIH0KICNlbmRpZgogCisvKioKKyAgUGVyZm9ybXMgYSBzZWxmLXRlc3Qgb2YgdGhlIENBU1Q1IGJsb2NrIGNpcGhlcgorICBAcmV0dXJuIENSWVBUX09LIGlmIGZ1bmN0aW9uYWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3QgaGFzIGJlZW4gZGlzYWJsZWQKKyovCiBpbnQgY2FzdDVfdGVzdCh2b2lkKQogewogICNpZm5kZWYgTFRDX1RFU1QKQEAgLTY1NSwxNSArNjg1LDMxIEBACiAgI2VuZGlmCiB9CiAKLWludCBjYXN0NV9rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKQorLyoqIFRlcm1pbmF0ZSB0aGUgY29udGV4dCAKKyAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5CisqLwordm9pZCBjYXN0NV9kb25lKHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7Ci0gICBfQVJHQ0hLKGRlc2lyZWRfa2V5c2l6ZSAhPSBOVUxMKTsKLSAgIGlmICgqZGVzaXJlZF9rZXlzaXplIDwgNSkgeworfQorCisvKioKKyAgR2V0cyBzdWl0YWJsZSBrZXkgc2l6ZQorICBAcGFyYW0ga2V5c2l6ZSBbaW4vb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSByZWNvbW1lbmRlZCBrZXkgKGluIGJ5dGVzKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSB0aGUgc3VpdGFibGUgc2l6ZSBiYWNrIGluIHRoaXMgdmFyaWFibGUuCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdGhlIGlucHV0IGtleSBzaXplIGlzIGFjY2VwdGFibGUuCisqLworaW50IGNhc3Q1X2tleXNpemUoaW50ICprZXlzaXplKQoreworICAgTFRDX0FSR0NISyhrZXlzaXplICE9IE5VTEwpOworICAgaWYgKCprZXlzaXplIDwgNSkgewogICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKLSAgIH0gZWxzZSBpZiAoKmRlc2lyZWRfa2V5c2l6ZSA+IDE2KSB7Ci0gICAgICAqZGVzaXJlZF9rZXlzaXplID0gMTY7CisgICB9IGVsc2UgaWYgKCprZXlzaXplID4gMTYpIHsKKyAgICAgICprZXlzaXplID0gMTY7CiAgICB9CiAgICByZXR1cm4gQ1JZUFRfT0s7CiB9IAogCiAjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2NpcGhlcnMvY2FzdDUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS43ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL2Rlcy5jIGIvc3JjL2NpcGhlcnMvZGVzLmMKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gZGVzLmMKcmVuYW1lIHRvIHNyYy9jaXBoZXJzL2Rlcy5jCmluZGV4IDA5MGM1OTQuLjg0MjU4ZDAgMTAwNjQ0Ci0tLSBhL2Rlcy5jCisrKyBiL3NyYy9jaXBoZXJzL2Rlcy5jCkBAIC02LDE3ICs2LDIyIEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLS8qIERFUyBjb2RlIHN1Ym1pdHRlZCBieSBEb2JlcyBWYW5kZXJtZWVyICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKiAKKyAgQGZpbGUgZGVzLmMKKyAgREVTIGNvZGUgc3VibWl0dGVkIGJ5IERvYmVzIFZhbmRlcm1lZXIgCisqLwogCiAjaWZkZWYgREVTCiAKICNkZWZpbmUgRU4wIDAgCiAjZGVmaW5lIERFMSAxCiAKLWNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgZGVzX2Rlc2MgPQorI2lmIDAKK2NvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgZGVzX2Rlc2MgPQogewogICAgICJkZXMiLAogICAgIDEzLApAQCAtMjUsMTAgKzMwLDEzIEBACiAgICAgJmRlc19lY2JfZW5jcnlwdCwKICAgICAmZGVzX2VjYl9kZWNyeXB0LAogICAgICZkZXNfdGVzdCwKLSAgICAmZGVzX2tleXNpemUKKyAgICAmZGVzX2RvbmUsCisgICAgJmRlc19rZXlzaXplLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKIH07CisjZW5kaWYKIAotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciBkZXMzX2Rlc2MgPQorY29uc3Qgc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvciBkZXMzX2Rlc2MgPQogewogICAgICIzZGVzIiwKICAgICAxNCwKQEAgLTM3LDcgKzQ1LDkgQEAKICAgICAmZGVzM19lY2JfZW5jcnlwdCwKICAgICAmZGVzM19lY2JfZGVjcnlwdCwKICAgICAmZGVzM190ZXN0LAotICAgICZkZXMzX2tleXNpemUKKyAgICAmZGVzM19kb25lLAorICAgICZkZXMzX2tleXNpemUsCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAogfTsKIAogc3RhdGljIGNvbnN0IHVsb25nMzIgYnl0ZWJpdFs4XSA9CkBAIC0yMzksNyArMjQ5LDcgQEAKICAgICAweDAwMDAxMDQwVUwsIDB4MDAwNDAwNDBVTCwgMHgxMDAwMDAwMFVMLCAweDEwMDQxMDAwVUwKIH07CiAKLSNpZm5kZWYgU01BTExfQ09ERQorI2lmbmRlZiBMVENfU01BTExfQ09ERQogCiBzdGF0aWMgY29uc3QgdWxvbmc2NCBkZXNfaXBbOF1bMjU2XSA9IHsKIApAQCAtMTI5MiwxMCArMTMwMiwxMCBAQAogCiBzdGF0aWMgdm9pZCBjb29rZXkoY29uc3QgdWxvbmczMiAqcmF3MSwgdWxvbmczMiAqa2V5b3V0KTsKIAotI2lmZGVmIENMRUFOX1NUQUNLCi12b2lkIF9kZXNrZXkoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBzaG9ydCBlZGYsIHVsb25nMzIgKmtleW91dCkKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyB2b2lkIF9kZXNrZXkoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBzaG9ydCBlZGYsIHVsb25nMzIgKmtleW91dCkKICNlbHNlCi12b2lkIGRlc2tleShjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHNob3J0IGVkZiwgdWxvbmczMiAqa2V5b3V0KQorc3RhdGljIHZvaWQgZGVza2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgc2hvcnQgZWRmLCB1bG9uZzMyICprZXlvdXQpCiAjZW5kaWYKIHsKICAgICB1bG9uZzMyIGksIGosIGwsIG0sIG4sIGtuWzMyXTsKQEAgLTEzNDQsMTUgKzEzNTQsMTUgQEAKICAgICBjb29rZXkoa24sIGtleW91dCk7CiB9CiAKLSNpZmRlZiBDTEVBTl9TVEFDSwotdm9pZCBkZXNrZXkoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBzaG9ydCBlZGYsIHVsb25nMzIgKmtleW91dCkKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyB2b2lkIGRlc2tleShjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHNob3J0IGVkZiwgdWxvbmczMiAqa2V5b3V0KQogewogICAgX2Rlc2tleShrZXksIGVkZiwga2V5b3V0KTsKICAgIGJ1cm5fc3RhY2soc2l6ZW9mKGludCkqNSArIHNpemVvZih1bG9uZzMyKSozMiArIHNpemVvZih1bnNpZ25lZCBjaGFyKSoxMTIpOwogfQogI2VuZGlmCiAKLSNpZmRlZiBDTEVBTl9TVEFDSworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogc3RhdGljIHZvaWQgX2Nvb2tleShjb25zdCB1bG9uZzMyICpyYXcxLCB1bG9uZzMyICprZXlvdXQpCiAjZWxzZQogc3RhdGljIHZvaWQgY29va2V5KGNvbnN0IHVsb25nMzIgKnJhdzEsIHVsb25nMzIgKmtleW91dCkKQEAgLTEzNzcsMTAgKzEzODcsMTAgQEAKICAgICAgICAgKmNvb2srKyB8PSAoKnJhdzEgJiAweDAwMDAwMDNmTCk7CiAgICAgfQogCi0gICAgbWVtY3B5KGtleW91dCwgZG91Z2gsIHNpemVvZiBkb3VnaCk7CisgICAgWE1FTUNQWShrZXlvdXQsIGRvdWdoLCBzaXplb2YgZG91Z2gpOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKIHN0YXRpYyB2b2lkIGNvb2tleShjb25zdCB1bG9uZzMyICpyYXcxLCB1bG9uZzMyICprZXlvdXQpCiB7CiAgICBfY29va2V5KHJhdzEsIGtleW91dCk7CkBAIC0xMzg4LDE5ICsxMzk4LDE5IEBACiB9CiAjZW5kaWYKIAotI2lmbmRlZiBDTEVBTl9TVEFDSworI2lmbmRlZiBMVENfQ0xFQU5fU1RBQ0sKIHN0YXRpYyB2b2lkIGRlc2Z1bmModWxvbmczMiAqYmxvY2ssIGNvbnN0IHVsb25nMzIgKmtleXMpCiAjZWxzZQogc3RhdGljIHZvaWQgX2Rlc2Z1bmModWxvbmczMiAqYmxvY2ssIGNvbnN0IHVsb25nMzIgKmtleXMpCiAjZW5kaWYKIHsKICAgICB1bG9uZzMyIHdvcmssIHJpZ2h0LCBsZWZ0dDsKLSAgICBpbnQgcm91bmQ7CisgICAgaW50IGN1cl9yb3VuZDsKIAogICAgIGxlZnR0ID0gYmxvY2tbMF07CiAgICAgcmlnaHQgPSBibG9ja1sxXTsKIAotI2lmZGVmIFNNQUxMX0NPREUKKyNpZmRlZiBMVENfU01BTExfQ09ERQogICAgIHdvcmsgPSAoKGxlZnR0ID4+IDQpICBeIHJpZ2h0KSAmIDB4MGYwZjBmMGZMOwogICAgIHJpZ2h0IF49IHdvcms7CiAgICAgbGVmdHQgXj0gKHdvcmsgPDwgNCk7CkBAIC0xNDE3LDEyICsxNDI3LDEyIEBACiAgICAgbGVmdHQgXj0gd29yazsKICAgICByaWdodCBePSAod29yayA8PCA4KTsKIAotICAgIHJpZ2h0ID0gUk9MKHJpZ2h0LCAxKTsKKyAgICByaWdodCA9IFJPTGMocmlnaHQsIDEpOwogICAgIHdvcmsgPSAobGVmdHQgXiByaWdodCkgJiAweGFhYWFhYWFhTDsKICAgICAKICAgICBsZWZ0dCBePSB3b3JrOwogICAgIHJpZ2h0IF49IHdvcms7Ci0gICAgbGVmdHQgPSBST0wobGVmdHQsIDEpOworICAgIGxlZnR0ID0gUk9MYyhsZWZ0dCwgMSk7CiAjZWxzZSAKICAgIHsKICAgICAgIHVsb25nNjQgdG1wOwpAQCAtMTQzOSw4ICsxNDQ5LDggQEAKICAgIH0KICNlbmRpZgogCi0gICAgZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgODsgcm91bmQrKykgewotICAgICAgICB3b3JrICA9IFJPUihyaWdodCwgNCkgXiAqa2V5cysrOworICAgIGZvciAoY3VyX3JvdW5kID0gMDsgY3VyX3JvdW5kIDwgODsgY3VyX3JvdW5kKyspIHsKKyAgICAgICAgd29yayAgPSBST1JjKHJpZ2h0LCA0KSBeICprZXlzKys7CiAgICAgICAgIGxlZnR0IF49IFNQN1t3b3JrICAgICAgICAmIDB4M2ZMXQogICAgICAgICAgICAgICBeIFNQNVsod29yayA+PiAgOCkgJiAweDNmTF0KICAgICAgICAgICAgICAgXiBTUDNbKHdvcmsgPj4gMTYpICYgMHgzZkxdCkBAIC0xNDUxLDcgKzE0NjEsNyBAQAogICAgICAgICAgICAgICBeICBTUDRbKHdvcmsgPj4gMTYpICYgMHgzZkxdCiAgICAgICAgICAgICAgIF4gIFNQMlsod29yayA+PiAyNCkgJiAweDNmTF07CiAKLSAgICAgICAgd29yayA9IFJPUihsZWZ0dCwgNCkgXiAqa2V5cysrOworICAgICAgICB3b3JrID0gUk9SYyhsZWZ0dCwgNCkgXiAqa2V5cysrOwogICAgICAgICByaWdodCBePSBTUDdbIHdvcmsgICAgICAgICYgMHgzZkxdCiAgICAgICAgICAgICAgIF4gIFNQNVsod29yayA+PiAgOCkgJiAweDNmTF0KICAgICAgICAgICAgICAgXiAgU1AzWyh3b3JrID4+IDE2KSAmIDB4M2ZMXQpAQCAtMTQ2MywxNiArMTQ3MywxNiBAQAogICAgICAgICAgICAgICBeICBTUDJbKHdvcmsgPj4gMjQpICYgMHgzZkxdOwogICAgIH0KIAotI2lmZGVmIFNNQUxMX0NPREUgICAgCi0gICAgcmlnaHQgPSBST1IocmlnaHQsIDEpOworI2lmZGVmIExUQ19TTUFMTF9DT0RFICAgIAorICAgIHJpZ2h0ID0gUk9SYyhyaWdodCwgMSk7CiAgICAgd29yayA9IChsZWZ0dCBeIHJpZ2h0KSAmIDB4YWFhYWFhYWFMOwogICAgIGxlZnR0IF49IHdvcms7CiAgICAgcmlnaHQgXj0gd29yazsKLSAgICBsZWZ0dCA9IFJPUihsZWZ0dCwgMSk7CisgICAgbGVmdHQgPSBST1JjKGxlZnR0LCAxKTsKICAgICB3b3JrID0gKChsZWZ0dCA+PiA4KSBeIHJpZ2h0KSAmIDB4MDBmZjAwZmZMOwogICAgIHJpZ2h0IF49IHdvcms7CiAgICAgbGVmdHQgXj0gKHdvcmsgPDwgOCk7Ci0gICAgLy8gLS0KKyAgICAvKiAtLSAqLwogICAgIHdvcmsgPSAoKGxlZnR0ID4+IDIpIF4gcmlnaHQpICYgMHgzMzMzMzMzM0w7CiAgICAgcmlnaHQgXj0gd29yazsKICAgICBsZWZ0dCBePSAod29yayA8PCAyKTsKQEAgLTE1MDIsNyArMTUxMiw3IEBACiAgICAgYmxvY2tbMV0gPSBsZWZ0dDsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiBzdGF0aWMgdm9pZCBkZXNmdW5jKHVsb25nMzIgKmJsb2NrLCBjb25zdCB1bG9uZzMyICprZXlzKQogewogICAgX2Rlc2Z1bmMoYmxvY2ssIGtleXMpOwpAQCAtMTUxMCwxMCArMTUyMCwxOSBAQAogfQogI2VuZGlmCiAKKyNpZiAwCisgLyoqCisgICAgSW5pdGlhbGl6ZSB0aGUgREVTIGJsb2NrIGNpcGhlcgorICAgIEBwYXJhbSBrZXkgVGhlIHN5bW1ldHJpYyBrZXkgeW91IHdpc2ggdG8gcGFzcworICAgIEBwYXJhbSBrZXlsZW4gVGhlIGtleSBsZW5ndGggaW4gYnl0ZXMKKyAgICBAcGFyYW0gbnVtX3JvdW5kcyBUaGUgbnVtYmVyIG9mIHJvdW5kcyBkZXNpcmVkICgwIGZvciBkZWZhdWx0KQorICAgIEBwYXJhbSBza2V5IFRoZSBrZXkgaW4gYXMgc2NoZWR1bGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgKi8KIGludCBkZXNfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogCiAgICAgaWYgKG51bV9yb3VuZHMgIT0gMCAmJiBudW1fcm91bmRzICE9IDE2KSB7CiAgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1JPVU5EUzsKQEAgLTE1MjgsMTMgKzE1NDcsMjIgQEAKIAogICAgIHJldHVybiBDUllQVF9PSzsKIH0KKyNlbmRpZgogCisgLyoqCisgICAgSW5pdGlhbGl6ZSB0aGUgM0RFUy1FREUgYmxvY2sgY2lwaGVyCisgICAgQHBhcmFtIGtleSBUaGUgc3ltbWV0cmljIGtleSB5b3Ugd2lzaCB0byBwYXNzCisgICAgQHBhcmFtIGtleWxlbiBUaGUga2V5IGxlbmd0aCBpbiBieXRlcworICAgIEBwYXJhbSBudW1fcm91bmRzIFRoZSBudW1iZXIgb2Ygcm91bmRzIGRlc2lyZWQgKDAgZm9yIGRlZmF1bHQpCisgICAgQHBhcmFtIHNrZXkgVGhlIGtleSBpbiBhcyBzY2hlZHVsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAqLwogaW50IGRlczNfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogCi0gICAgaWYoIG51bV9yb3VuZHMgIT0gMCAmJiBudW1fcm91bmRzICE9IDE2KSB7CisgICAgaWYobnVtX3JvdW5kcyAhPSAwICYmIG51bV9yb3VuZHMgIT0gMTYpIHsKICAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUk9VTkRTOwogICAgIH0KIApAQCAtMTU1Myw2MyArMTU4MSw5NCBAQAogICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAotdm9pZCBkZXNfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisjaWYgMAorLyoqCisgIEVuY3J5cHRzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIERFUworICBAcGFyYW0gcHQgVGhlIGlucHV0IHBsYWludGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIGN0IFRoZSBvdXRwdXQgY2lwaGVydGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQKKyovCit2b2lkIGRlc19lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7CiAgICAgdWxvbmczMiB3b3JrWzJdOwotICAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKHB0ICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhjdCAgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKICAgICBMT0FEMzJIKHdvcmtbMF0sIHB0KzApOwogICAgIExPQUQzMkgod29ya1sxXSwgcHQrNCk7Ci0gICAgZGVzZnVuYyh3b3JrLCBrZXktPmRlcy5layk7CisgICAgZGVzZnVuYyh3b3JrLCBza2V5LT5kZXMuZWspOwogICAgIFNUT1JFMzJIKHdvcmtbMF0sY3QrMCk7CiAgICAgU1RPUkUzMkgod29ya1sxXSxjdCs0KTsKIH0KIAotdm9pZCBkZXNfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisvKioKKyAgRGVjcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggREVTCisgIEBwYXJhbSBjdCBUaGUgaW5wdXQgY2lwaGVydGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHB0IFRoZSBvdXRwdXQgcGxhaW50ZXh0ICg4IGJ5dGVzKQorICBAcGFyYW0gc2tleSBUaGUga2V5IGFzIHNjaGVkdWxlZCAKKyovCit2b2lkIGRlc19lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7CiAgICAgdWxvbmczMiB3b3JrWzJdOwotICAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKHB0ICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhjdCAgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKICAgICBMT0FEMzJIKHdvcmtbMF0sIGN0KzApOwogICAgIExPQUQzMkgod29ya1sxXSwgY3QrNCk7Ci0gICAgZGVzZnVuYyh3b3JrLCBrZXktPmRlcy5kayk7CisgICAgZGVzZnVuYyh3b3JrLCBza2V5LT5kZXMuZGspOwogICAgIFNUT1JFMzJIKHdvcmtbMF0scHQrMCk7CiAgICAgU1RPUkUzMkgod29ya1sxXSxwdCs0KTsKIH0KKyNlbmRpZgogCi12b2lkIGRlczNfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisvKioKKyAgRW5jcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggM0RFUy1FREUKKyAgQHBhcmFtIHB0IFRoZSBpbnB1dCBwbGFpbnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBjdCBUaGUgb3V0cHV0IGNpcGhlcnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkCisqLwordm9pZCBkZXMzX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKICAgICB1bG9uZzMyIHdvcmtbMl07CiAgICAgCi0gICAgX0FSR0NISyhwdCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKGN0ICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogICAgIExPQUQzMkgod29ya1swXSwgcHQrMCk7CiAgICAgTE9BRDMySCh3b3JrWzFdLCBwdCs0KTsKLSAgICBkZXNmdW5jKHdvcmssIGtleS0+ZGVzMy5la1swXSk7Ci0gICAgZGVzZnVuYyh3b3JrLCBrZXktPmRlczMuZWtbMV0pOwotICAgIGRlc2Z1bmMod29yaywga2V5LT5kZXMzLmVrWzJdKTsKKyAgICBkZXNmdW5jKHdvcmssIHNrZXktPmRlczMuZWtbMF0pOworICAgIGRlc2Z1bmMod29yaywgc2tleS0+ZGVzMy5la1sxXSk7CisgICAgZGVzZnVuYyh3b3JrLCBza2V5LT5kZXMzLmVrWzJdKTsKICAgICBTVE9SRTMySCh3b3JrWzBdLGN0KzApOwogICAgIFNUT1JFMzJIKHdvcmtbMV0sY3QrNCk7CiB9CiAKLXZvaWQgZGVzM19lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSkKKy8qKgorICBEZWNyeXB0cyBhIGJsb2NrIG9mIHRleHQgd2l0aCAzREVTLUVERQorICBAcGFyYW0gY3QgVGhlIGlucHV0IGNpcGhlcnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBwdCBUaGUgb3V0cHV0IHBsYWludGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQgCisqLwordm9pZCBkZXMzX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKICAgICB1bG9uZzMyIHdvcmtbMl07Ci0gICAgX0FSR0NISyhwdCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKGN0ICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogICAgIExPQUQzMkgod29ya1swXSwgY3QrMCk7CiAgICAgTE9BRDMySCh3b3JrWzFdLCBjdCs0KTsKLSAgICBkZXNmdW5jKHdvcmssIGtleS0+ZGVzMy5ka1swXSk7Ci0gICAgZGVzZnVuYyh3b3JrLCBrZXktPmRlczMuZGtbMV0pOwotICAgIGRlc2Z1bmMod29yaywga2V5LT5kZXMzLmRrWzJdKTsKKyAgICBkZXNmdW5jKHdvcmssIHNrZXktPmRlczMuZGtbMF0pOworICAgIGRlc2Z1bmMod29yaywgc2tleS0+ZGVzMy5ka1sxXSk7CisgICAgZGVzZnVuYyh3b3JrLCBza2V5LT5kZXMzLmRrWzJdKTsKICAgICBTVE9SRTMySCh3b3JrWzBdLHB0KzApOwogICAgIFNUT1JFMzJIKHdvcmtbMV0scHQrNCk7CiB9CiAKKyNpZiAwCisvKioKKyAgUGVyZm9ybXMgYSBzZWxmLXRlc3Qgb2YgdGhlIERFUyBibG9jayBjaXBoZXIKKyAgQHJldHVybiBDUllQVF9PSyBpZiBmdW5jdGlvbmFsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0IGhhcyBiZWVuIGRpc2FibGVkCisqLwogaW50IGRlc190ZXN0KHZvaWQpCiB7CiAgI2lmbmRlZiBMVENfVEVTVApAQCAtMTYxNyw3ICsxNjc2LDcgQEAKICAjZWxzZSAgICAKICAgICBpbnQgZXJyOwogICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGVzX3Rlc3RfY2FzZSB7Ci0gICAgICAgIGludCBudW0sIG1vZGU7IC8vIG1vZGUgMSA9IGVuY3J5cHQKKyAgICAgICAgaW50IG51bSwgbW9kZTsgLyogbW9kZSAxID0gZW5jcnlwdCAqLwogICAgICAgICB1bnNpZ25lZCBjaGFyIGtleVs4XSwgdHh0WzhdLCBvdXRbOF07CiAgICAgfSBjYXNlc1tdID0gewogICAgICAgICB7IDEsIDEsICAgICB7IDB4MTAsIDB4MzEsIDB4NkUsIDB4MDIsIDB4OEMsIDB4OEYsIDB4M0IsIDB4NEEgfSwKQEAgLTE3NTIsNiArMTgxMSw3IEBACiAgICAgcmV0dXJuIENSWVBUX09LOwogICAjZW5kaWYKIH0KKyNlbmRpZgogCiBpbnQgZGVzM190ZXN0KHZvaWQpCiB7CkBAIC0xNzg5LDI1ICsxODQ5LDU4IEBACiAgI2VuZGlmCiB9CiAKLWludCBkZXNfa2V5c2l6ZShpbnQgKmRlc2lyZWRfa2V5c2l6ZSkKKyNpZiAwCisvKiogVGVybWluYXRlIHRoZSBjb250ZXh0IAorICAgQHBhcmFtIHNrZXkgICAgVGhlIHNjaGVkdWxlZCBrZXkKKyovCit2b2lkIGRlc19kb25lKHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7Ci0gICAgX0FSR0NISyhkZXNpcmVkX2tleXNpemUgIT0gTlVMTCk7Ci0gICAgaWYoKmRlc2lyZWRfa2V5c2l6ZSA8IDgpIHsKLSAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKLSAgICB9Ci0gICAgKmRlc2lyZWRfa2V5c2l6ZSA9IDg7Ci0gICAgcmV0dXJuIENSWVBUX09LOworfQorI2VuZGlmCisKKy8qKiBUZXJtaW5hdGUgdGhlIGNvbnRleHQgCisgICBAcGFyYW0gc2tleSAgICBUaGUgc2NoZWR1bGVkIGtleQorKi8KK3ZvaWQgZGVzM19kb25lKHN5bW1ldHJpY19rZXkgKnNrZXkpCit7CiB9CiAKLWludCBkZXMzX2tleXNpemUoaW50ICpkZXNpcmVkX2tleXNpemUpCisKKyNpZiAwCisvKioKKyAgR2V0cyBzdWl0YWJsZSBrZXkgc2l6ZQorICBAcGFyYW0ga2V5c2l6ZSBbaW4vb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSByZWNvbW1lbmRlZCBrZXkgKGluIGJ5dGVzKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSB0aGUgc3VpdGFibGUgc2l6ZSBiYWNrIGluIHRoaXMgdmFyaWFibGUuCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdGhlIGlucHV0IGtleSBzaXplIGlzIGFjY2VwdGFibGUuCisqLworaW50IGRlc19rZXlzaXplKGludCAqa2V5c2l6ZSkKIHsKLSAgICBfQVJHQ0hLKGRlc2lyZWRfa2V5c2l6ZSAhPSBOVUxMKTsKLSAgICBpZigqZGVzaXJlZF9rZXlzaXplIDwgMjQpIHsKKyAgICBMVENfQVJHQ0hLKGtleXNpemUgIT0gTlVMTCk7CisgICAgaWYoKmtleXNpemUgPCA4KSB7CiAgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0tFWVNJWkU7CiAgICAgfQotICAgICpkZXNpcmVkX2tleXNpemUgPSAyNDsKKyAgICAqa2V5c2l6ZSA9IDg7CisgICAgcmV0dXJuIENSWVBUX09LOworfQorI2VuZGlmCisKKy8qKgorICBHZXRzIHN1aXRhYmxlIGtleSBzaXplCisgIEBwYXJhbSBrZXlzaXplIFtpbi9vdXRdIFRoZSBsZW5ndGggb2YgdGhlIHJlY29tbWVuZGVkIGtleSAoaW4gYnl0ZXMpLiAgVGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIHRoZSBzdWl0YWJsZSBzaXplIGJhY2sgaW4gdGhpcyB2YXJpYWJsZS4KKyAgQHJldHVybiBDUllQVF9PSyBpZiB0aGUgaW5wdXQga2V5IHNpemUgaXMgYWNjZXB0YWJsZS4KKyovCitpbnQgZGVzM19rZXlzaXplKGludCAqa2V5c2l6ZSkKK3sKKyAgICBMVENfQVJHQ0hLKGtleXNpemUgIT0gTlVMTCk7CisgICAgaWYoKmtleXNpemUgPCAyNCkgeworICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOworICAgIH0KKyAgICAqa2V5c2l6ZSA9IDI0OwogICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAogI2VuZGlmCiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2NpcGhlcnMvZGVzLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuOCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvY2lwaGVycy9raGF6YWQuYyBiL3NyYy9jaXBoZXJzL2toYXphZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzEzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY2lwaGVycy9raGF6YWQuYwpAQCAtMCwwICsxLDg1MSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUga2hhemFkLmMKKyAgS2hhemFkIGltcGxlbWVudGF0aW9uIGRlcml2ZWQgZnJvbSBwdWJsaWMgZG9tYWluIHNvdXJjZQorICBBdXRob3JzOiBQYXVsbyBTLkwuTS4gQmFycmV0byBhbmQgVmluY2VudCBSaWptZW4uCisqLworCisjaWZkZWYgS0hBWkFECisKK2NvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3Iga2hhemFkX2Rlc2MgPSB7CisgICAia2hhemFkIiwKKyAgIDE4LAorICAgMTYsIDE2LCA4LCA4LAorICAgJmtoYXphZF9zZXR1cCwKKyAgICZraGF6YWRfZWNiX2VuY3J5cHQsCisgICAma2hhemFkX2VjYl9kZWNyeXB0LAorICAgJmtoYXphZF90ZXN0LAorICAgJmtoYXphZF9kb25lLAorICAgJmtoYXphZF9rZXlzaXplLAorICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworI2RlZmluZSBSICAgICAgOCAKKyNkZWZpbmUgS0VZU0laRSAgICAgIDEyOCAKKyNkZWZpbmUgS0VZU0laRUIgICAoS0VZU0laRS84KSAKKyNkZWZpbmUgQkxPQ0tTSVpFICAgNjQgCisjZGVmaW5lIEJMT0NLU0laRUIgICAoQkxPQ0tTSVpFLzgpIAorCitzdGF0aWMgY29uc3QgdWxvbmc2NCBUMFsyNTZdID0geworICAgIENPTlNUNjQoMHhiYWQzZDI2OGJiYjk2YTAxKSwgQ09OU1Q2NCgweDU0ZmM0ZDE5ZTU5YTY2YjEpLCBDT05TVDY0KDB4MmY3MWJjOTNlMjY1MTRjZCksIENPTlNUNjQoMHg3NDljY2RiOTI1ODcxYjUxKSwKKyAgICBDT05TVDY0KDB4NTNmNTUxMDJmN2EyNTdhNCksIENPTlNUNjQoMHhkMzY4NmJiOGQwZDZiZTAzKSwgQ09OU1Q2NCgweGQyNmI2ZmJkZDZkZWI1MDQpLCBDT05TVDY0KDB4NGRkNzI5NjRiMzUyODVmZSksCisgICAgQ09OU1Q2NCgweDUwZjA1ZDBkZmRiYTRhYWQpLCBDT05TVDY0KDB4YWNlOThhMjZjZjA5ZTA2MyksIENPTlNUNjQoMHg4ZDhhMGU4MzA5MWM5Njg0KSwgQ09OU1Q2NCgweGJmZGNjNjc5YTU5MTRkMWEpLAorICAgIENPTlNUNjQoMHg3MDkwZGRhZDNkYTczNzRkKSwgQ09OU1Q2NCgweDUyZjY1NTA3ZjFhYTVjYTMpLCBDT05TVDY0KDB4OWFiMzUyYzg3YmE0MTdlMSksIENPTlNUNjQoMHg0Y2Q0MmQ2MWI1NWE4ZWY5KSwKKyAgICBDT05TVDY0KDB4ZWEyMzhmNjU0NjAzMjBhYyksIENPTlNUNjQoMHhkNTYyNzNhNmM0ZTY4NDExKSwgQ09OU1Q2NCgweDk3YTQ2NmYxNTVjYzY4YzIpLCBDT05TVDY0KDB4ZDE2ZTYzYjJkY2M2YTgwZCksCisgICAgQ09OU1Q2NCgweDMzNTVjY2ZmYWE4NWQwOTkpLCBDT05TVDY0KDB4NTFmMzU5MDhmYmIyNDFhYSksIENPTlNUNjQoMHg1YmVkNzEyYWM3ZTIwZjljKSwgQ09OU1Q2NCgweGE2ZjdhMjA0ZjM1OWFlNTUpLAorICAgIENPTlNUNjQoMHhkZTdmNWY4MWZlYmVjMTIwKSwgQ09OU1Q2NCgweDQ4ZDgzZDc1YWQ3YWEyZTUpLCBDT05TVDY0KDB4YThlNTlhMzJkNzI5Y2M3ZiksIENPTlNUNjQoMHg5OWI2NWVjNzcxYmMwYWU4KSwKKyAgICBDT05TVDY0KDB4ZGI3MDRiOTBlMDk2ZTYzYiksIENPTlNUNjQoMHgzMjU2YzhmYWFjOGRkYjllKSwgQ09OU1Q2NCgweGI3YzRlNjUxOTVkMTE1MjIpLCBDT05TVDY0KDB4ZmMxOWQ3MmIzMmIzYWFjZSksCisgICAgQ09OU1Q2NCgweGUzMzhhYjQ4NzA0YjczOTMpLCBDT05TVDY0KDB4OWViZjQyZGM2Mzg0M2JmZCksIENPTlNUNjQoMHg5MWFlN2VlZjQxZmM1MmQwKSwgQ09OU1Q2NCgweDliYjA1NmNkN2RhYzFjZTYpLAorICAgIENPTlNUNjQoMHhlMjNiYWY0ZDc2NDM3ODk0KSwgQ09OU1Q2NCgweGJiZDBkNjZkYmRiMTYxMDYpLCBDT05TVDY0KDB4NDFjMzE5NTg5YjMyZjFkYSksIENPTlNUNjQoMHg2ZWIyYTVjYjc5NTdlNTE3KSwKKyAgICBDT05TVDY0KDB4YTVmMmFlMGJmOTQxYjM1YyksIENPTlNUNjQoMHhjYjQwMGJjMDgwMTY1NjRiKSwgQ09OU1Q2NCgweDZiYmRiMWRhNjc3ZmMyMGMpLCBDT05TVDY0KDB4OTVhMjZlZmI1OWRjN2VjYyksCisgICAgQ09OU1Q2NCgweGExZmViZTFmZTE2MTlmNDApLCBDT05TVDY0KDB4ZjMwOGViMTgxMGNiYzNlMyksIENPTlNUNjQoMHhiMWNlZmU0ZjgxZTEyZjMwKSwgQ09OU1Q2NCgweDAyMDYwODBhMGMxMDE2MGUpLAorICAgIENPTlNUNjQoMHhjYzQ5MTdkYjkyMmU2NzVlKSwgQ09OU1Q2NCgweGM0NTEzN2YzYTI2ZTNmNjYpLCBDT05TVDY0KDB4MWQyNzc0Njk0ZWU4Y2Y1MyksIENPTlNUNjQoMHgxNDNjNTA0NDc4YTA5YzZjKSwKKyAgICBDT05TVDY0KDB4YzM1ODJiZThiMDU2MGU3MyksIENPTlNUNjQoMHg2M2E1OTFmMjU3M2Y5YTM0KSwgQ09OU1Q2NCgweGRhNzM0Zjk1ZTY5ZWVkM2MpLCBDT05TVDY0KDB4NWRlNzY5MzRkM2QyMzU4ZSksCisgICAgQ09OU1Q2NCgweDVmZTE2MTNlZGZjMjIzODApLCBDT05TVDY0KDB4ZGM3OTU3OGJmMmFlZDcyZSksIENPTlNUNjQoMHg3ZDg3ZTk5NDEzY2Y0ODZlKSwgQ09OU1Q2NCgweGNkNGExM2RlOTQyNjZjNTkpLAorICAgIENPTlNUNjQoMHg3ZjgxZTE5ZTFmZGY1ZTYwKSwgQ09OU1Q2NCgweDVhZWU3NTJmYzFlYTA0OWIpLCBDT05TVDY0KDB4NmNiNGFkYzE3NTQ3ZjMxOSksIENPTlNUNjQoMHg1Y2U0NmQzMWQ1ZGEzZTg5KSwKKyAgICBDT05TVDY0KDB4ZjcwNGZiMGMwOGViZWZmZiksIENPTlNUNjQoMHgyNjZhOThiZWQ0MmQ0N2YyKSwgQ09OU1Q2NCgweGZmMWNkYjI0MzhhYmI3YzcpLCBDT05TVDY0KDB4ZWQyYTkzN2U1NDNiMTFiOSksCisgICAgQ09OU1Q2NCgweGU4MjU4NzZmNGExMzM2YTIpLCBDT05TVDY0KDB4OWRiYTRlZDM2OTljMjZmNCksIENPTlNUNjQoMHg2ZmIxYTFjZTdmNWZlZTEwKSwgQ09OU1Q2NCgweDhlOGYwMjhjMDMwNDhiOGQpLAorICAgIENPTlNUNjQoMHgxOTJiNjQ3ZDU2YzhlMzRmKSwgQ09OU1Q2NCgweGEwZmRiYTFhZTc2OTk0NDcpLCBDT05TVDY0KDB4ZjAwZGU3MTcxYWQzZGVlYSksIENPTlNUNjQoMHg4OTg2MWU5NzExM2NiYTk4KSwKKyAgICBDT05TVDY0KDB4MGYxMTNjMzMyMjc4NjkyZCksIENPTlNUNjQoMHgwNzA5MWMxYjEyMzgzMTE1KSwgQ09OU1Q2NCgweGFmZWM4NjI5YzUxMWZkNmEpLCBDT05TVDY0KDB4ZmIxMGNiMzAyMDhiOWJkYiksCisgICAgQ09OU1Q2NCgweDA4MTgyMDI4MzA0MDU4MzgpLCBDT05TVDY0KDB4MTUzZjU0NDE3ZWE4OTc2YiksIENPTlNUNjQoMHgwZDE3MzQzOTJlNjg3ZjIzKSwgQ09OU1Q2NCgweDA0MGMxMDE0MTgyMDJjMWMpLAorICAgIENPTlNUNjQoMHgwMTAzMDQwNTA2MDgwYjA3KSwgQ09OU1Q2NCgweDY0YWM4ZGU5NDUwN2FiMjEpLCBDT05TVDY0KDB4ZGY3YzViODRmOGI2Y2EyNyksIENPTlNUNjQoMHg3NjlhYzViMzI5OTcwZDVmKSwKKyAgICBDT05TVDY0KDB4Nzk4YmY5ODAwYmVmNjQ3MiksIENPTlNUNjQoMHhkZDdhNTM4ZWY0YTZkYzI5KSwgQ09OU1Q2NCgweDNkNDdmNGM5OGVmNWIyYjMpLCBDT05TVDY0KDB4MTYzYTU4NGU3NGIwOGE2MiksCisgICAgQ09OU1Q2NCgweDNmNDFmY2MzODJlNWE0YmQpLCBDT05TVDY0KDB4Mzc1OWRjZWJiMmE1ZmM4NSksIENPTlNUNjQoMHg2ZGI3YTljNDczNGZmODFlKSwgQ09OU1Q2NCgweDM4NDhlMGQ4OTBkZDk1YTgpLAorICAgIENPTlNUNjQoMHhiOWQ2ZGU2N2IxYTE3NzA4KSwgQ09OU1Q2NCgweDczOTVkMWEyMzdiZjJhNDQpLCBDT05TVDY0KDB4ZTkyNjgzNmE0YzFiM2RhNSksIENPTlNUNjQoMHgzNTVmZDRlMWJlYjVlYThiKSwKKyAgICBDT05TVDY0KDB4NTVmZjQ5MWNlMzkyNmRiNiksIENPTlNUNjQoMHg3MTkzZDlhODNiYWYzYzRhKSwgQ09OU1Q2NCgweDdiOGRmMThhMDdmZjcyN2MpLCBDT05TVDY0KDB4OGM4OTBhODYwZjE0OWQ4MyksCisgICAgQ09OU1Q2NCgweDcyOTZkNWE3MzFiNzIxNDMpLCBDT05TVDY0KDB4ODg4NTFhOTIxNzM0YjE5ZiksIENPTlNUNjQoMHhmNjA3ZmYwOTBlZTNlNGY4KSwgQ09OU1Q2NCgweDJhN2VhODgyZmM0ZDMzZDYpLAorICAgIENPTlNUNjQoMHgzZTQyZjhjNjg0ZWRhZmJhKSwgQ09OU1Q2NCgweDVlZTI2NTNiZDljYTI4ODcpLCBDT05TVDY0KDB4Mjc2OTljYmJkMjI1NGNmNSksIENPTlNUNjQoMHg0NmNhMDU0Mzg5MGFjMGNmKSwKKyAgICBDT05TVDY0KDB4MGMxNDMwM2MyODYwNzQyNCksIENPTlNUNjQoMHg2NWFmODllYzQzMGZhMDI2KSwgQ09OU1Q2NCgweDY4YjhiZGQ1NmQ2N2RmMDUpLCBDT05TVDY0KDB4NjFhMzk5Zjg1YjJmOGMzYSksCisgICAgQ09OU1Q2NCgweDAzMDUwYzBmMGExODFkMDkpLCBDT05TVDY0KDB4YzE1ZTIzZTJiYzQ2MTg3ZCksIENPTlNUNjQoMHg1N2Y5NDExNmVmODI3YmI4KSwgQ09OU1Q2NCgweGQ2Njc3ZmE5Y2VmZTk5MTgpLAorICAgIENPTlNUNjQoMHhkOTc2NDM5YWVjODZmMDM1KSwgQ09OU1Q2NCgweDU4ZTg3ZDI1Y2RmYTEyOTUpLCBDT05TVDY0KDB4ZDg3NTQ3OWZlYThlZmIzMiksIENPTlNUNjQoMHg2NmFhODVlMzQ5MTdiZDJmKSwKKyAgICBDT05TVDY0KDB4ZDc2NDdiYWNjOGY2OTIxZiksIENPTlNUNjQoMHgzYTRlZThkMjljY2Q4M2E2KSwgQ09OU1Q2NCgweGM4NDUwN2NmOGEwZTRiNDIpLCBDT05TVDY0KDB4M2M0NGYwY2M4OGZkYjliNCksCisgICAgQ09OU1Q2NCgweGZhMTNjZjM1MjY4MzkwZGMpLCBDT05TVDY0KDB4OTZhNzYyZjQ1M2M0NjNjNSksIENPTlNUNjQoMHhhN2Y0YTYwMWY1NTFhNTUyKSwgQ09OU1Q2NCgweDk4YjU1YWMyNzdiNDAxZWYpLAorICAgIENPTlNUNjQoMHhlYzI5OTc3YjUyMzMxYWJlKSwgQ09OU1Q2NCgweGI4ZDVkYTYyYjdhOTdjMGYpLCBDT05TVDY0KDB4Yzc1NDNiZmNhODc2MjI2ZiksIENPTlNUNjQoMHhhZWVmODIyY2MzMTlmNjZkKSwKKyAgICBDT05TVDY0KDB4NjliYmI5ZDA2YjZmZDQwMiksIENPTlNUNjQoMHg0YmRkMzE3YWE3NjJiZmVjKSwgQ09OU1Q2NCgweGFiZTA5NjNkZGQzMWQxNzYpLCBDT05TVDY0KDB4YTllNjllMzdkMTIxYzc3OCksCisgICAgQ09OU1Q2NCgweDY3YTk4MWU2NGYxZmI2MjgpLCBDT05TVDY0KDB4MGExZTI4MjIzYzUwNGUzNiksIENPTlNUNjQoMHg0N2M5MDE0NjhmMDJjYmM4KSwgQ09OU1Q2NCgweGYyMGJlZjFkMTZjM2M4ZTQpLAorICAgIENPTlNUNjQoMHhiNWMyZWU1Yjk5YzEwMzJjKSwgQ09OU1Q2NCgweDIyNjY4OGFhY2MwZDZiZWUpLCBDT05TVDY0KDB4ZTUzMmIzNTY2NDdiNDk4MSksIENPTlNUNjQoMHhlZTJmOWY3MTVlMjMwY2IwKSwKKyAgICBDT05TVDY0KDB4YmVkZmMyN2NhMzk5NDYxZCksIENPTlNUNjQoMHgyYjdkYWM4N2ZhNDUzOGQxKSwgQ09OU1Q2NCgweDgxOWUzZWJmMjE3Y2UyYTApLCBDT05TVDY0KDB4MTIzNjQ4NWE2YzkwYTY3ZSksCisgICAgQ09OU1Q2NCgweDgzOTgzNmI1MmQ2Y2Y0YWUpLCBDT05TVDY0KDB4MWIyZDZjNzc1YWQ4ZjU0MSksIENPTlNUNjQoMHgwZTEyMzgzNjI0NzA2MjJhKSwgQ09OU1Q2NCgweDIzNjU4Y2FmY2EwNTYwZTkpLAorICAgIENPTlNUNjQoMHhmNTAyZjMwNjA0ZmJmOWYxKSwgQ09OU1Q2NCgweDQ1Y2YwOTRjODMxMmRkYzYpLCBDT05TVDY0KDB4MjE2Mzg0YTVjNjE1NzZlNyksIENPTlNUNjQoMHhjZTRmMWZkMTllM2U3MTUwKSwKKyAgICBDT05TVDY0KDB4NDlkYjM5NzBhYjcyYTllMiksIENPTlNUNjQoMHgyYzc0YjA5Y2U4N2QwOWM0KSwgQ09OU1Q2NCgweGY5MTZjMzNhMmM5YjhkZDUpLCBDT05TVDY0KDB4ZTYzN2JmNTk2ZTYzNTQ4OCksCisgICAgQ09OU1Q2NCgweGI2YzdlMjU0OTNkOTFlMjUpLCBDT05TVDY0KDB4Mjg3OGEwODhmMDVkMjVkOCksIENPTlNUNjQoMHgxNzM5NWM0YjcyYjg4MTY1KSwgQ09OU1Q2NCgweDgyOWIzMmIwMmI2NGZmYTkpLAorICAgIENPTlNUNjQoMHgxYTJlNjg3MjVjZDBmZTQ2KSwgQ09OU1Q2NCgweDhiODAxNjlkMWQyY2FjOTYpLCBDT05TVDY0KDB4ZmUxZmRmMjEzZWEzYmNjMCksIENPTlNUNjQoMHg4YTgzMTI5ODFiMjRhNzkxKSwKKyAgICBDT05TVDY0KDB4MDkxYjI0MmQzNjQ4NTMzZiksIENPTlNUNjQoMHhjOTQ2MDNjYThjMDY0MDQ1KSwgQ09OU1Q2NCgweDg3OTQyNmExMzU0Y2Q4YjIpLCBDT05TVDY0KDB4NGVkMjI1NmJiOTRhOThmNyksCisgICAgQ09OU1Q2NCgweGUxM2VhMzQyN2M1YjY1OWQpLCBDT05TVDY0KDB4MmU3MmI4OTZlNDZkMWZjYSksIENPTlNUNjQoMHhlNDMxYjc1MzYyNzM0Mjg2KSwgQ09OU1Q2NCgweGUwM2RhNzQ3N2E1MzZlOWEpLAorICAgIENPTlNUNjQoMHhlYjIwOGI2MDQwMGIyYmFiKSwgQ09OU1Q2NCgweDkwYWQ3YWVhNDdmNDU5ZDcpLCBDT05TVDY0KDB4YTRmMWFhMGVmZjQ5Yjg1YiksIENPTlNUNjQoMHgxZTIyNzg2NjQ0ZjBkMjVhKSwKKyAgICBDT05TVDY0KDB4ODU5MjJlYWIzOTVjY2ViYyksIENPTlNUNjQoMHg2MGEwOWRmZDVkMjc4NzNkKSwgQ09OU1Q2NCgweDAwMDAwMDAwMDAwMDAwMDApLCBDT05TVDY0KDB4MjU2Zjk0YjFkZTM1NWFmYiksCisgICAgQ09OU1Q2NCgweGY0MDFmNzAzMDJmM2YyZjYpLCBDT05TVDY0KDB4ZjEwZWUzMTIxY2RiZDVlZCksIENPTlNUNjQoMHg5NGExNmFmZTVmZDQ3NWNiKSwgQ09OU1Q2NCgweDBiMWQyYzI3M2E1ODQ1MzEpLAorICAgIENPTlNUNjQoMHhlNzM0YmI1YzY4NmI1ZjhmKSwgQ09OU1Q2NCgweDc1OWZjOWJjMjM4ZjEwNTYpLCBDT05TVDY0KDB4ZWYyYzliNzQ1ODJiMDdiNyksIENPTlNUNjQoMHgzNDVjZDBlNGI4YmRlMThjKSwKKyAgICBDT05TVDY0KDB4MzE1M2M0ZjVhNjk1YzY5NyksIENPTlNUNjQoMHhkNDYxNzdhM2MyZWU4ZjE2KSwgQ09OU1Q2NCgweGQwNmQ2N2I3ZGFjZWEzMGEpLCBDT05TVDY0KDB4ODY5NzIyYTQzMzQ0ZDNiNSksCisgICAgQ09OU1Q2NCgweDdlODJlNTliMTlkNzU1NjcpLCBDT05TVDY0KDB4YWRlYThlMjNjOTAxZWI2NCksIENPTlNUNjQoMHhmZDFhZDMyZTM0YmJhMWM5KSwgQ09OU1Q2NCgweDI5N2JhNDhkZjY1NTJlZGYpLAorICAgIENPTlNUNjQoMHgzMDUwYzBmMGEwOWRjZDkwKSwgQ09OU1Q2NCgweDNiNGRlY2Q3OWFjNTg4YTEpLCBDT05TVDY0KDB4OWZiYzQ2ZDk2NThjMzBmYSksIENPTlNUNjQoMHhmODE1YzczZjJhOTM4NmQyKSwKKyAgICBDT05TVDY0KDB4YzY1NzNmZjlhZTdlMjk2OCksIENPTlNUNjQoMHgxMzM1NGM1ZjZhOThhZDc5KSwgQ09OU1Q2NCgweDA2MGExODFlMTQzMDNhMTIpLCBDT05TVDY0KDB4MDUwZjE0MTExZTI4MjcxYiksCisgICAgQ09OU1Q2NCgweGM1NTIzM2Y2YTQ2NjM0NjEpLCBDT05TVDY0KDB4MTEzMzQ0NTU2Njg4YmI3NyksIENPTlNUNjQoMHg3Nzk5YzFiNjJmOWYwNjU4KSwgQ09OU1Q2NCgweDdjODRlZDkxMTVjNzQzNjkpLAorICAgIENPTlNUNjQoMHg3YThlZjU4ZjAxZjc3OTdiKSwgQ09OU1Q2NCgweDc4ODhmZDg1MGRlNzZmNzUpLCBDT05TVDY0KDB4MzY1YWQ4ZWViNGFkZjc4MiksIENPTlNUNjQoMHgxYzI0NzA2YzQ4ZTBjNDU0KSwKKyAgICBDT05TVDY0KDB4Mzk0YmU0ZGQ5NmQ1OWVhZiksIENPTlNUNjQoMHg1OWViNzkyMGNiZjIxOTkyKSwgQ09OU1Q2NCgweDE4Mjg2MDc4NTBjMGU4NDgpLCBDT05TVDY0KDB4NTZmYTQ1MTNlOThhNzBiZiksCisgICAgQ09OU1Q2NCgweGIzYzhmNjQ1OGRmMTM5M2UpLCBDT05TVDY0KDB4YjBjZGZhNGE4N2U5MjQzNyksIENPTlNUNjQoMHgyNDZjOTBiNGQ4M2Q1MWZjKSwgQ09OU1Q2NCgweDIwNjA4MGEwYzAxZDdkZTApLAorICAgIENPTlNUNjQoMHhiMmNiZjI0MDhiZjkzMjM5KSwgQ09OU1Q2NCgweDkyYWI3MmUwNGJlNDRmZDkpLCBDT05TVDY0KDB4YTNmOGI2MTVlZDcxODk0ZSksIENPTlNUNjQoMHhjMDVkMjdlN2JhNGUxMzdhKSwKKyAgICBDT05TVDY0KDB4NDRjYzBkNDk4NTFhZDZjMSksIENPTlNUNjQoMHg2MmE2OTVmNzUxMzc5MTMzKSwgQ09OU1Q2NCgweDEwMzA0MDUwNjA4MGIwNzApLCBDT05TVDY0KDB4YjRjMWVhNWU5ZmM5MDgyYiksCisgICAgQ09OU1Q2NCgweDg0OTEyYWFlM2Y1NGM1YmIpLCBDT05TVDY0KDB4NDNjNTExNTI5NzIyZTdkNCksIENPTlNUNjQoMHg5M2E4NzZlNTRkZWM0NGRlKSwgQ09OU1Q2NCgweGMyNWIyZmVkYjY1ZTA1NzQpLAorICAgIENPTlNUNjQoMHg0YWRlMzU3ZmExNmFiNGViKSwgQ09OU1Q2NCgweGJkZGFjZTczYTk4MTViMTQpLCBDT05TVDY0KDB4OGY4YzA2ODkwNTBjODA4YSksIENPTlNUNjQoMHgyZDc3YjQ5OWVlNzUwMmMzKSwKKyAgICBDT05TVDY0KDB4YmNkOWNhNzZhZjg5NTAxMyksIENPTlNUNjQoMHg5Y2I5NGFkNjZmOTQyZGYzKSwgQ09OU1Q2NCgweDZhYmViNWRmNjE3N2M5MGIpLCBDT05TVDY0KDB4NDBjMDFkNWQ5ZDNhZmFkZCksCisgICAgQ09OU1Q2NCgweGNmNGMxYmQ0OTgzNjdhNTcpLCBDT05TVDY0KDB4YTJmYmIyMTBlYjc5ODI0OSksIENPTlNUNjQoMHg4MDlkM2FiYTI3NzRlOWE3KSwgQ09OU1Q2NCgweDRmZDEyMTZlYmY0MjkzZjApLAorICAgIENPTlNUNjQoMHgxZjIxN2M2MzQyZjhkOTVkKSwgQ09OU1Q2NCgweGNhNDMwZmM1ODYxZTVkNGMpLCBDT05TVDY0KDB4YWFlMzkyMzhkYjM5ZGE3MSksIENPTlNUNjQoMHg0MmM2MTU1NzkxMmFlY2QzKSwKK307CisKK3N0YXRpYyBjb25zdCB1bG9uZzY0IFQxWzI1Nl0gPSB7CisgICAgQ09OU1Q2NCgweGQzYmE2OGQyYjliYjAxNmEpLCBDT05TVDY0KDB4ZmM1NDE5NGQ5YWU1YjE2NiksIENPTlNUNjQoMHg3MTJmOTNiYzY1ZTJjZDE0KSwgQ09OU1Q2NCgweDljNzRiOWNkODcyNTUxMWIpLAorICAgIENPTlNUNjQoMHhmNTUzMDI1MWEyZjdhNDU3KSwgQ09OU1Q2NCgweDY4ZDNiODZiZDZkMDAzYmUpLCBDT05TVDY0KDB4NmJkMmJkNmZkZWQ2MDRiNSksIENPTlNUNjQoMHhkNzRkNjQyOTUyYjNmZTg1KSwKKyAgICBDT05TVDY0KDB4ZjA1MDBkNWRiYWZkYWQ0YSksIENPTlNUNjQoMHhlOWFjMjY4YTA5Y2Y2M2UwKSwgQ09OU1Q2NCgweDhhOGQ4MzBlMWMwOTg0OTYpLCBDT05TVDY0KDB4ZGNiZjc5YzY5MWE1MWE0ZCksCisgICAgQ09OU1Q2NCgweDkwNzBhZGRkYTczZDRkMzcpLCBDT05TVDY0KDB4ZjY1MjA3NTVhYWYxYTM1YyksIENPTlNUNjQoMHhiMzlhYzg1MmE0N2JlMTE3KSwgQ09OU1Q2NCgweGQ0NGM2MTJkNWFiNWY5OGUpLAorICAgIENPTlNUNjQoMHgyM2VhNjU4ZjAzNDZhYzIwKSwgQ09OU1Q2NCgweDYyZDVhNjczZTZjNDExODQpLCBDT05TVDY0KDB4YTQ5N2YxNjZjYzU1YzI2OCksIENPTlNUNjQoMHg2ZWQxYjI2M2M2ZGMwZGE4KSwKKyAgICBDT05TVDY0KDB4NTUzM2ZmY2M4NWFhOTlkMCksIENPTlNUNjQoMHhmMzUxMDg1OWIyZmJhYTQxKSwgQ09OU1Q2NCgweGVkNWIyYTcxZTJjNzljMGYpLCBDT05TVDY0KDB4ZjdhNjA0YTI1OWYzNTVhZSksCisgICAgQ09OU1Q2NCgweDdmZGU4MTVmYmVmZTIwYzEpLCBDT05TVDY0KDB4ZDg0ODc1M2Q3YWFkZTVhMiksIENPTlNUNjQoMHhlNWE4MzI5YTI5ZDc3ZmNjKSwgQ09OU1Q2NCgweGI2OTljNzVlYmM3MWU4MGEpLAorICAgIENPTlNUNjQoMHg3MGRiOTA0Yjk2ZTAzYmU2KSwgQ09OU1Q2NCgweDU2MzJmYWM4OGRhYzllZGIpLCBDT05TVDY0KDB4YzRiNzUxZTZkMTk1MjIxNSksIENPTlNUNjQoMHgxOWZjMmJkN2IzMzJjZWFhKSwKKyAgICBDT05TVDY0KDB4MzhlMzQ4YWI0YjcwOTM3MyksIENPTlNUNjQoMHhiZjllZGM0Mjg0NjNmZDNiKSwgQ09OU1Q2NCgweGFlOTFlZjdlZmM0MWQwNTIpLCBDT05TVDY0KDB4YjA5YmNkNTZhYzdkZTYxYyksCisgICAgQ09OU1Q2NCgweDNiZTI0ZGFmNDM3Njk0NzgpLCBDT05TVDY0KDB4ZDBiYjZkZDZiMWJkMDY2MSksIENPTlNUNjQoMHhjMzQxNTgxOTMyOWJkYWYxKSwgQ09OU1Q2NCgweGIyNmVjYmE1NTc3OTE3ZTUpLAorICAgIENPTlNUNjQoMHhmMmE1MGJhZTQxZjk1Y2IzKSwgQ09OU1Q2NCgweDQwY2JjMDBiMTY4MDRiNTYpLCBDT05TVDY0KDB4YmQ2YmRhYjE3ZjY3MGNjMiksIENPTlNUNjQoMHhhMjk1ZmI2ZWRjNTljYzdlKSwKKyAgICBDT05TVDY0KDB4ZmVhMTFmYmU2MWUxNDA5ZiksIENPTlNUNjQoMHgwOGYzMThlYmNiMTBlM2MzKSwgQ09OU1Q2NCgweGNlYjE0ZmZlZTE4MTMwMmYpLCBDT05TVDY0KDB4MDYwMjBhMDgxMDBjMGUxNiksCisgICAgQ09OU1Q2NCgweDQ5Y2NkYjE3MmU5MjVlNjcpLCBDT05TVDY0KDB4NTFjNGYzMzc2ZWEyNjYzZiksIENPTlNUNjQoMHgyNzFkNjk3NGU4NGU1M2NmKSwgQ09OU1Q2NCgweDNjMTQ0NDUwYTA3ODZjOWMpLAorICAgIENPTlNUNjQoMHg1OGMzZTgyYjU2YjA3MzBlKSwgQ09OU1Q2NCgweGE1NjNmMjkxM2Y1NzM0OWEpLCBDT05TVDY0KDB4NzNkYTk1NGY5ZWU2M2NlZCksIENPTlNUNjQoMHhlNzVkMzQ2OWQyZDM4ZTM1KSwKKyAgICBDT05TVDY0KDB4ZTE1ZjNlNjFjMmRmODAyMyksIENPTlNUNjQoMHg3OWRjOGI1N2FlZjIyZWQ3KSwgQ09OU1Q2NCgweDg3N2Q5NGU5Y2YxMzZlNDgpLCBDT05TVDY0KDB4NGFjZGRlMTMyNjk0NTk2YyksCisgICAgQ09OU1Q2NCgweDgxN2Y5ZWUxZGYxZjYwNWUpLCBDT05TVDY0KDB4ZWU1YTJmNzVlYWMxOWIwNCksIENPTlNUNjQoMHhiNDZjYzFhZDQ3NzUxOWYzKSwgQ09OU1Q2NCgweGU0NWMzMTZkZGFkNTg5M2UpLAorICAgIENPTlNUNjQoMHgwNGY3MGNmYmViMDhmZmVmKSwgQ09OU1Q2NCgweDZhMjZiZTk4MmRkNGYyNDcpLCBDT05TVDY0KDB4MWNmZjI0ZGJhYjM4YzdiNyksIENPTlNUNjQoMHgyYWVkN2U5MzNiNTRiOTExKSwKKyAgICBDT05TVDY0KDB4MjVlODZmODcxMzRhYTIzNiksIENPTlNUNjQoMHhiYTlkZDM0ZTljNjlmNDI2KSwgQ09OU1Q2NCgweGIxNmZjZWExNWY3ZjEwZWUpLCBDT05TVDY0KDB4OGY4ZThjMDIwNDAzOGQ4YiksCisgICAgQ09OU1Q2NCgweDJiMTk3ZDY0Yzg1NjRmZTMpLCBDT05TVDY0KDB4ZmRhMDFhYmE2OWU3NDc5NCksIENPTlNUNjQoMHgwZGYwMTdlN2QzMWFlYWRlKSwgQ09OU1Q2NCgweDg2ODk5NzFlM2MxMTk4YmEpLAorICAgIENPTlNUNjQoMHgxMTBmMzMzYzc4MjIyZDY5KSwgQ09OU1Q2NCgweDA5MDcxYjFjMzgxMjE1MzEpLCBDT05TVDY0KDB4ZWNhZjI5ODYxMWM1NmFmZCksIENPTlNUNjQoMHgxMGZiMzBjYjhiMjBkYjliKSwKKyAgICBDT05TVDY0KDB4MTgwODI4MjA0MDMwMzg1OCksIENPTlNUNjQoMHgzZjE1NDE1NGE4N2U2Yjk3KSwgQ09OU1Q2NCgweDE3MGQzOTM0NjgyZTIzN2YpLCBDT05TVDY0KDB4MGMwNDE0MTAyMDE4MWMyYyksCisgICAgQ09OU1Q2NCgweDAzMDEwNTA0MDgwNjA3MGIpLCBDT05TVDY0KDB4YWM2NGU5OGQwNzQ1MjFhYiksIENPTlNUNjQoMHg3Y2RmODQ1YmI2ZjgyN2NhKSwgQ09OU1Q2NCgweDlhNzZiM2M1OTcyOTVmMGQpLAorICAgIENPTlNUNjQoMHg4Yjc5ODBmOWVmMGI3MjY0KSwgQ09OU1Q2NCgweDdhZGQ4ZTUzYTZmNDI5ZGMpLCBDT05TVDY0KDB4NDczZGM5ZjRmNThlYjNiMiksIENPTlNUNjQoMHgzYTE2NGU1OGIwNzQ2MjhhKSwKKyAgICBDT05TVDY0KDB4NDEzZmMzZmNlNTgyYmRhNCksIENPTlNUNjQoMHg1OTM3ZWJkY2E1YjI4NWZjKSwgQ09OU1Q2NCgweGI3NmRjNGE5NGY3MzFlZjgpLCBDT05TVDY0KDB4NDgzOGQ4ZTBkZDkwYTg5NSksCisgICAgQ09OU1Q2NCgweGQ2Yjk2N2RlYTFiMTA4NzcpLCBDT05TVDY0KDB4OTU3M2EyZDFiZjM3NDQyYSksIENPTlNUNjQoMHgyNmU5NmE4MzFiNGNhNTNkKSwgQ09OU1Q2NCgweDVmMzVlMWQ0YjViZThiZWEpLAorICAgIENPTlNUNjQoMHhmZjU1MWM0OTkyZTNiNjZkKSwgQ09OU1Q2NCgweDkzNzFhOGQ5YWYzYjRhM2MpLCBDT05TVDY0KDB4OGQ3YjhhZjFmZjA3N2M3MiksIENPTlNUNjQoMHg4OThjODYwYTE0MGY4MzlkKSwKKyAgICBDT05TVDY0KDB4OTY3MmE3ZDViNzMxNDMyMSksIENPTlNUNjQoMHg4NTg4OTIxYTM0MTc5ZmIxKSwgQ09OU1Q2NCgweDA3ZjYwOWZmZTMwZWY4ZTQpLCBDT05TVDY0KDB4N2UyYTgyYTg0ZGZjZDYzMyksCisgICAgQ09OU1Q2NCgweDQyM2VjNmY4ZWQ4NGJhYWYpLCBDT05TVDY0KDB4ZTI1ZTNiNjVjYWQ5ODcyOCksIENPTlNUNjQoMHg2OTI3YmI5YzI1ZDJmNTRjKSwgQ09OU1Q2NCgweGNhNDY0MzA1MGE4OWNmYzApLAorICAgIENPTlNUNjQoMHgxNDBjM2MzMDYwMjgyNDc0KSwgQ09OU1Q2NCgweGFmNjVlYzg5MGY0MzI2YTApLCBDT05TVDY0KDB4Yjg2OGQ1YmQ2NzZkMDVkZiksIENPTlNUNjQoMHhhMzYxZjg5OTJmNWIzYThjKSwKKyAgICBDT05TVDY0KDB4MDUwMzBmMGMxODBhMDkxZCksIENPTlNUNjQoMHg1ZWMxZTIyMzQ2YmM3ZDE4KSwgQ09OU1Q2NCgweGY5NTcxNjQxODJlZmI4N2IpLCBDT05TVDY0KDB4NjdkNmE5N2ZmZWNlMTg5OSksCisgICAgQ09OU1Q2NCgweDc2ZDk5YTQzODZlYzM1ZjApLCBDT05TVDY0KDB4ZTg1ODI1N2RmYWNkOTUxMiksIENPTlNUNjQoMHg3NWQ4OWY0NzhlZWEzMmZiKSwgQ09OU1Q2NCgweGFhNjZlMzg1MTc0OTJmYmQpLAorICAgIENPTlNUNjQoMHg2NGQ3YWM3YmY2YzgxZjkyKSwgQ09OU1Q2NCgweDRlM2FkMmU4Y2Q5Y2E2ODMpLCBDT05TVDY0KDB4NDVjOGNmMDcwZThhNDI0YiksIENPTlNUNjQoMHg0NDNjY2NmMGZkODhiNGI5KSwKKyAgICBDT05TVDY0KDB4MTNmYTM1Y2Y4MzI2ZGM5MCksIENPTlNUNjQoMHhhNzk2ZjQ2MmM0NTNjNTYzKSwgQ09OU1Q2NCgweGY0YTcwMWE2NTFmNTUyYTUpLCBDT05TVDY0KDB4YjU5OGMyNWFiNDc3ZWYwMSksCisgICAgQ09OU1Q2NCgweDI5ZWM3Yjk3MzM1MmJlMWEpLCBDT05TVDY0KDB4ZDViODYyZGFhOWI3MGY3YyksIENPTlNUNjQoMHg1NGM3ZmMzYjc2YTg2ZjIyKSwgQ09OU1Q2NCgweGVmYWUyYzgyMTljMzZkZjYpLAorICAgIENPTlNUNjQoMHhiYjY5ZDBiOTZmNmIwMmQ0KSwgQ09OU1Q2NCgweGRkNGI3YTMxNjJhN2VjYmYpLCBDT05TVDY0KDB4ZTBhYjNkOTYzMWRkNzZkMSksIENPTlNUNjQoMHhlNmE5Mzc5ZTIxZDE3OGM3KSwKKyAgICBDT05TVDY0KDB4YTk2N2U2ODExZjRmMjhiNiksIENPTlNUNjQoMHgxZTBhMjIyODUwM2MzNjRlKSwgQ09OU1Q2NCgweGM5NDc0NjAxMDI4ZmM4Y2IpLCBDT05TVDY0KDB4MGJmMjFkZWZjMzE2ZTRjOCksCisgICAgQ09OU1Q2NCgweGMyYjU1YmVlYzE5OTJjMDMpLCBDT05TVDY0KDB4NjYyMmFhODgwZGNjZWU2YiksIENPTlNUNjQoMHgzMmU1NTZiMzdiNjQ4MTQ5KSwgQ09OU1Q2NCgweDJmZWU3MTlmMjM1ZWIwMGMpLAorICAgIENPTlNUNjQoMHhkZmJlN2NjMjk5YTMxZDQ2KSwgQ09OU1Q2NCgweDdkMmI4N2FjNDVmYWQxMzgpLCBDT05TVDY0KDB4OWU4MWJmM2U3YzIxYTBlMiksIENPTlNUNjQoMHgzNjEyNWE0ODkwNmM3ZWE2KSwKKyAgICBDT05TVDY0KDB4OTg4M2I1MzY2YzJkYWVmNCksIENPTlNUNjQoMHgyZDFiNzc2Y2Q4NWE0MWY1KSwgQ09OU1Q2NCgweDEyMGUzNjM4NzAyNDJhNjIpLCBDT05TVDY0KDB4NjUyM2FmOGMwNWNhZTk2MCksCisgICAgQ09OU1Q2NCgweDAyZjUwNmYzZmIwNGYxZjkpLCBDT05TVDY0KDB4Y2Y0NTRjMDkxMjgzYzZkZCksIENPTlNUNjQoMHg2MzIxYTU4NDE1YzZlNzc2KSwgQ09OU1Q2NCgweDRmY2VkMTFmM2U5ZTUwNzEpLAorICAgIENPTlNUNjQoMHhkYjQ5NzAzOTcyYWJlMmE5KSwgQ09OU1Q2NCgweDc0MmM5Y2IwN2RlOGM0MDkpLCBDT05TVDY0KDB4MTZmOTNhYzM5YjJjZDU4ZCksIENPTlNUNjQoMHgzN2U2NTliZjYzNmU4ODU0KSwKKyAgICBDT05TVDY0KDB4YzdiNjU0ZTJkOTkzMjUxZSksIENPTlNUNjQoMHg3ODI4ODhhMDVkZjBkODI1KSwgQ09OU1Q2NCgweDM5MTc0YjVjYjg3MjY1ODEpLCBDT05TVDY0KDB4OWI4MmIwMzI2NDJiYTlmZiksCisgICAgQ09OU1Q2NCgweDJlMWE3MjY4ZDA1YzQ2ZmUpLCBDT05TVDY0KDB4ODA4YjlkMTYyYzFkOTZhYyksIENPTlNUNjQoMHgxZmZlMjFkZmEzM2VjMGJjKSwgQ09OU1Q2NCgweDgzOGE5ODEyMjQxYjkxYTcpLAorICAgIENPTlNUNjQoMHgxYjA5MmQyNDQ4MzYzZjUzKSwgQ09OU1Q2NCgweDQ2YzljYTAzMDY4YzQ1NDApLCBDT05TVDY0KDB4OTQ4N2ExMjY0YzM1YjJkOCksIENPTlNUNjQoMHhkMjRlNmIyNTRhYjlmNzk4KSwKKyAgICBDT05TVDY0KDB4M2VlMTQyYTM1YjdjOWQ2NSksIENPTlNUNjQoMHg3MjJlOTZiODZkZTRjYTFmKSwgQ09OU1Q2NCgweDMxZTQ1M2I3NzM2Mjg2NDIpLCBDT05TVDY0KDB4M2RlMDQ3YTc1MzdhOWE2ZSksCisgICAgQ09OU1Q2NCgweDIwZWI2MDhiMGI0MGFiMmIpLCBDT05TVDY0KDB4YWQ5MGVhN2FmNDQ3ZDc1OSksIENPTlNUNjQoMHhmMWE0MGVhYTQ5ZmY1YmI4KSwgQ09OU1Q2NCgweDIyMWU2Njc4ZjA0NDVhZDIpLAorICAgIENPTlNUNjQoMHg5Mjg1YWIyZTVjMzliY2NlKSwgQ09OU1Q2NCgweGEwNjBmZDlkMjc1ZDNkODcpLCBDT05TVDY0KDB4MDAwMDAwMDAwMDAwMDAwMCksIENPTlNUNjQoMHg2ZjI1YjE5NDM1ZGVmYjVhKSwKKyAgICBDT05TVDY0KDB4MDFmNDAzZjdmMzAyZjZmMiksIENPTlNUNjQoMHgwZWYxMTJlM2RiMWNlZGQ1KSwgQ09OU1Q2NCgweGExOTRmZTZhZDQ1ZmNiNzUpLCBDT05TVDY0KDB4MWQwYjI3MmM1ODNhMzE0NSksCisgICAgQ09OU1Q2NCgweDM0ZTc1Y2JiNmI2ODhmNWYpLCBDT05TVDY0KDB4OWY3NWJjYzk4ZjIzNTYxMCksIENPTlNUNjQoMHgyY2VmNzQ5YjJiNThiNzA3KSwgQ09OU1Q2NCgweDVjMzRlNGQwYmRiODhjZTEpLAorICAgIENPTlNUNjQoMHg1MzMxZjVjNDk1YTY5N2M2KSwgQ09OU1Q2NCgweDYxZDRhMzc3ZWVjMjE2OGYpLCBDT05TVDY0KDB4NmRkMGI3NjdjZWRhMGFhMyksIENPTlNUNjQoMHg5Nzg2YTQyMjQ0MzNiNWQzKSwKKyAgICBDT05TVDY0KDB4ODI3ZTliZTVkNzE5Njc1NSksIENPTlNUNjQoMHhlYWFkMjM4ZTAxYzk2NGViKSwgQ09OU1Q2NCgweDFhZmQyZWQzYmIzNGM5YTEpLCBDT05TVDY0KDB4N2IyOThkYTQ1NWY2ZGYyZSksCisgICAgQ09OU1Q2NCgweDUwMzBmMGMwOWRhMDkwY2QpLCBDT05TVDY0KDB4NGQzYmQ3ZWNjNTlhYTE4OCksIENPTlNUNjQoMHhiYzlmZDk0NjhjNjVmYTMwKSwgQ09OU1Q2NCgweDE1ZjgzZmM3OTMyYWQyODYpLAorICAgIENPTlNUNjQoMHg1N2M2ZjkzZjdlYWU2ODI5KSwgQ09OU1Q2NCgweDM1MTM1ZjRjOTg2YTc5YWQpLCBDT05TVDY0KDB4MGEwNjFlMTgzMDE0MTIzYSksIENPTlNUNjQoMHgwZjA1MTExNDI4MWUxYjI3KSwKKyAgICBDT05TVDY0KDB4NTJjNWY2MzM2NmE0NjEzNCksIENPTlNUNjQoMHgzMzExNTU0NDg4NjY3N2JiKSwgQ09OU1Q2NCgweDk5NzdiNmMxOWYyZjU4MDYpLCBDT05TVDY0KDB4ODQ3YzkxZWRjNzE1Njk0MyksCisgICAgQ09OU1Q2NCgweDhlN2E4ZmY1ZjcwMTdiNzkpLCBDT05TVDY0KDB4ODg3ODg1ZmRlNzBkNzU2ZiksIENPTlNUNjQoMHg1YTM2ZWVkOGFkYjQ4MmY3KSwgQ09OU1Q2NCgweDI0MWM2YzcwZTA0ODU0YzQpLAorICAgIENPTlNUNjQoMHg0YjM5ZGRlNGQ1OTZhZjllKSwgQ09OU1Q2NCgweGViNTkyMDc5ZjJjYjkyMTkpLCBDT05TVDY0KDB4MjgxODc4NjBjMDUwNDhlOCksIENPTlNUNjQoMHhmYTU2MTM0NThhZTliZjcwKSwKKyAgICBDT05TVDY0KDB4YzhiMzQ1ZjZmMThkM2UzOSksIENPTlNUNjQoMHhjZGIwNGFmYWU5ODczNzI0KSwgQ09OU1Q2NCgweDZjMjRiNDkwM2RkOGZjNTEpLCBDT05TVDY0KDB4NjAyMGEwODAxZGMwZTA3ZCksCisgICAgQ09OU1Q2NCgweGNiYjI0MGYyZjk4YjM5MzIpLCBDT05TVDY0KDB4YWI5MmUwNzJlNDRiZDk0ZiksIENPTlNUNjQoMHhmOGEzMTViNjcxZWQ0ZTg5KSwgQ09OU1Q2NCgweDVkYzBlNzI3NGViYTdhMTMpLAorICAgIENPTlNUNjQoMHhjYzQ0NDkwZDFhODVjMWQ2KSwgQ09OU1Q2NCgweGE2NjJmNzk1Mzc1MTMzOTEpLCBDT05TVDY0KDB4MzAxMDUwNDA4MDYwNzBiMCksIENPTlNUNjQoMHhjMWI0NWVlYWM5OWYyYjA4KSwKKyAgICBDT05TVDY0KDB4OTE4NGFlMmE1NDNmYmJjNSksIENPTlNUNjQoMHhjNTQzNTIxMTIyOTdkNGU3KSwgQ09OU1Q2NCgweGE4OTNlNTc2ZWM0ZGRlNDQpLCBDT05TVDY0KDB4NWJjMmVkMmY1ZWI2NzQwNSksCisgICAgQ09OU1Q2NCgweGRlNGE3ZjM1NmFhMWViYjQpLCBDT05TVDY0KDB4ZGFiZDczY2U4MWE5MTQ1YiksIENPTlNUNjQoMHg4YzhmODkwNjBjMDU4YTgwKSwgQ09OU1Q2NCgweDc3MmQ5OWI0NzVlZWMzMDIpLAorICAgIENPTlNUNjQoMHhkOWJjNzZjYTg5YWYxMzUwKSwgQ09OU1Q2NCgweGI5OWNkNjRhOTQ2ZmYzMmQpLCBDT05TVDY0KDB4YmU2YWRmYjU3NzYxMGJjOSksIENPTlNUNjQoMHhjMDQwNWQxZDNhOWRkZGZhKSwKKyAgICBDT05TVDY0KDB4NGNjZmQ0MWIzNjk4NTc3YSksIENPTlNUNjQoMHhmYmEyMTBiMjc5ZWI0OTgyKSwgQ09OU1Q2NCgweDlkODBiYTNhNzQyN2E3ZTkpLCBDT05TVDY0KDB4ZDE0ZjZlMjE0MmJmZjA5MyksCisgICAgQ09OU1Q2NCgweDIxMWY2MzdjZjg0MjVkZDkpLCBDT05TVDY0KDB4NDNjYWM1MGYxZTg2NGM1ZCksIENPTlNUNjQoMHhlM2FhMzg5MjM5ZGI3MWRhKSwgQ09OU1Q2NCgweGM2NDI1NzE1MmE5MWQzZWMpLAorfTsKKworc3RhdGljIGNvbnN0IHVsb25nNjQgVDJbMjU2XSA9IHsKKyAgICBDT05TVDY0KDB4ZDI2OGJhZDM2YTAxYmJiOSksIENPTlNUNjQoMHg0ZDE5NTRmYzY2YjFlNTlhKSwgQ09OU1Q2NCgweGJjOTMyZjcxMTRjZGUyNjUpLCBDT05TVDY0KDB4Y2RiOTc0OWMxYjUxMjU4NyksCisgICAgQ09OU1Q2NCgweDUxMDI1M2Y1NTdhNGY3YTIpLCBDT05TVDY0KDB4NmJiOGQzNjhiZTAzZDBkNiksIENPTlNUNjQoMHg2ZmJkZDI2YmI1MDRkNmRlKSwgQ09OU1Q2NCgweDI5NjQ0ZGQ3ODVmZWIzNTIpLAorICAgIENPTlNUNjQoMHg1ZDBkNTBmMDRhYWRmZGJhKSwgQ09OU1Q2NCgweDhhMjZhY2U5ZTA2M2NmMDkpLCBDT05TVDY0KDB4MGU4MzhkOGE5Njg0MDkxYyksIENPTlNUNjQoMHhjNjc5YmZkYzRkMWFhNTkxKSwKKyAgICBDT05TVDY0KDB4ZGRhZDcwOTAzNzRkM2RhNyksIENPTlNUNjQoMHg1NTA3NTJmNjVjYTNmMWFhKSwgQ09OU1Q2NCgweDUyYzg5YWIzMTdlMTdiYTQpLCBDT05TVDY0KDB4MmQ2MTRjZDQ4ZWY5YjU1YSksCisgICAgQ09OU1Q2NCgweDhmNjVlYTIzMjBhYzQ2MDMpLCBDT05TVDY0KDB4NzNhNmQ1NjI4NDExYzRlNiksIENPTlNUNjQoMHg2NmYxOTdhNDY4YzI1NWNjKSwgQ09OU1Q2NCgweDYzYjJkMTZlYTgwZGRjYzYpLAorICAgIENPTlNUNjQoMHhjY2ZmMzM1NWQwOTlhYTg1KSwgQ09OU1Q2NCgweDU5MDg1MWYzNDFhYWZiYjIpLCBDT05TVDY0KDB4NzEyYTViZWQwZjljYzdlMiksIENPTlNUNjQoMHhhMjA0YTZmN2FlNTVmMzU5KSwKKyAgICBDT05TVDY0KDB4NWY4MWRlN2ZjMTIwZmViZSksIENPTlNUNjQoMHgzZDc1NDhkOGEyZTVhZDdhKSwgQ09OU1Q2NCgweDlhMzJhOGU1Y2M3ZmQ3MjkpLCBDT05TVDY0KDB4NWVjNzk5YjYwYWU4NzFiYyksCisgICAgQ09OU1Q2NCgweDRiOTBkYjcwZTYzYmUwOTYpLCBDT05TVDY0KDB4YzhmYTMyNTZkYjllYWM4ZCksIENPTlNUNjQoMHhlNjUxYjdjNDE1MjI5NWQxKSwgQ09OU1Q2NCgweGQ3MmJmYzE5YWFjZTMyYjMpLAorICAgIENPTlNUNjQoMHhhYjQ4ZTMzODczOTM3MDRiKSwgQ09OU1Q2NCgweDQyZGM5ZWJmM2JmZDYzODQpLCBDT05TVDY0KDB4N2VlZjkxYWU1MmQwNDFmYyksIENPTlNUNjQoMHg1NmNkOWJiMDFjZTY3ZGFjKSwKKyAgICBDT05TVDY0KDB4YWY0ZGUyM2I3ODk0NzY0MyksIENPTlNUNjQoMHhkNjZkYmJkMDYxMDZiZGIxKSwgQ09OU1Q2NCgweDE5NTg0MWMzZjFkYTliMzIpLCBDT05TVDY0KDB4YTVjYjZlYjJlNTE3Nzk1NyksCisgICAgQ09OU1Q2NCgweGFlMGJhNWYyYjM1Y2Y5NDEpLCBDT05TVDY0KDB4MGJjMGNiNDA1NjRiODAxNiksIENPTlNUNjQoMHhiMWRhNmJiZGMyMGM2NzdmKSwgQ09OU1Q2NCgweDZlZmI5NWEyN2VjYzU5ZGMpLAorICAgIENPTlNUNjQoMHhiZTFmYTFmZTlmNDBlMTYxKSwgQ09OU1Q2NCgweGViMThmMzA4YzNlMzEwY2IpLCBDT05TVDY0KDB4ZmU0ZmIxY2UyZjMwODFlMSksIENPTlNUNjQoMHgwODBhMDIwNjE2MGUwYzEwKSwKKyAgICBDT05TVDY0KDB4MTdkYmNjNDk2NzVlOTIyZSksIENPTlNUNjQoMHgzN2YzYzQ1MTNmNjZhMjZlKSwgQ09OU1Q2NCgweDc0NjkxZDI3Y2Y1MzRlZTgpLCBDT05TVDY0KDB4NTA0NDE0M2M5YzZjNzhhMCksCisgICAgQ09OU1Q2NCgweDJiZThjMzU4MGU3M2IwNTYpLCBDT05TVDY0KDB4OTFmMjYzYTU5YTM0NTczZiksIENPTlNUNjQoMHg0Zjk1ZGE3M2VkM2NlNjllKSwgQ09OU1Q2NCgweDY5MzQ1ZGU3MzU4ZWQzZDIpLAorICAgIENPTlNUNjQoMHg2MTNlNWZlMTIzODBkZmMyKSwgQ09OU1Q2NCgweDU3OGJkYzc5ZDcyZWYyYWUpLCBDT05TVDY0KDB4ZTk5NDdkODc0ODZlMTNjZiksIENPTlNUNjQoMHgxM2RlY2Q0YTZjNTk5NDI2KSwKKyAgICBDT05TVDY0KDB4ZTE5ZTdmODE1ZTYwMWZkZiksIENPTlNUNjQoMHg3NTJmNWFlZTA0OWJjMWVhKSwgQ09OU1Q2NCgweGFkYzE2Y2I0ZjMxOTc1NDcpLCBDT05TVDY0KDB4NmQzMTVjZTQzZTg5ZDVkYSksCisgICAgQ09OU1Q2NCgweGZiMGNmNzA0ZWZmZjA4ZWIpLCBDT05TVDY0KDB4OThiZTI2NmE0N2YyZDQyZCksIENPTlNUNjQoMHhkYjI0ZmYxY2I3YzczOGFiKSwgQ09OU1Q2NCgweDkzN2VlZDJhMTFiOTU0M2IpLAorICAgIENPTlNUNjQoMHg4NzZmZTgyNTM2YTI0YTEzKSwgQ09OU1Q2NCgweDRlZDM5ZGJhMjZmNDY5OWMpLCBDT05TVDY0KDB4YTFjZTZmYjFlZTEwN2Y1ZiksIENPTlNUNjQoMHgwMjhjOGU4ZjhiOGQwMzA0KSwKKyAgICBDT05TVDY0KDB4NjQ3ZDE5MmJlMzRmNTZjOCksIENPTlNUNjQoMHhiYTFhYTBmZDk0NDdlNzY5KSwgQ09OU1Q2NCgweGU3MTdmMDBkZGVlYTFhZDMpLCBDT05TVDY0KDB4MWU5Nzg5ODZiYTk4MTEzYyksCisgICAgQ09OU1Q2NCgweDNjMzMwZjExNjkyZDIyNzgpLCBDT05TVDY0KDB4MWMxYjA3MDkzMTE1MTIzOCksIENPTlNUNjQoMHg4NjI5YWZlY2ZkNmFjNTExKSwgQ09OU1Q2NCgweGNiMzBmYjEwOWJkYjIwOGIpLAorICAgIENPTlNUNjQoMHgyMDI4MDgxODU4MzgzMDQwKSwgQ09OU1Q2NCgweDU0NDExNTNmOTc2YjdlYTgpLCBDT05TVDY0KDB4MzQzOTBkMTc3ZjIzMmU2OCksIENPTlNUNjQoMHgxMDE0MDQwYzJjMWMxODIwKSwKKyAgICBDT05TVDY0KDB4MDQwNTAxMDMwYjA3MDYwOCksIENPTlNUNjQoMHg4ZGU5NjRhY2FiMjE0NTA3KSwgQ09OU1Q2NCgweDViODRkZjdjY2EyN2Y4YjYpLCBDT05TVDY0KDB4YzViMzc2OWEwZDVmMjk5NyksCisgICAgQ09OU1Q2NCgweGY5ODA3OThiNjQ3MjBiZWYpLCBDT05TVDY0KDB4NTM4ZWRkN2FkYzI5ZjRhNiksIENPTlNUNjQoMHhmNGM5M2Q0N2IyYjM4ZWY1KSwgQ09OU1Q2NCgweDU4NGUxNjNhOGE2Mjc0YjApLAorICAgIENPTlNUNjQoMHhmY2MzM2Y0MWE0YmQ4MmU1KSwgQ09OU1Q2NCgweGRjZWIzNzU5ZmM4NWIyYTUpLCBDT05TVDY0KDB4YTljNDZkYjdmODFlNzM0ZiksIENPTlNUNjQoMHhlMGQ4Mzg0ODk1YTg5MGRkKSwKKyAgICBDT05TVDY0KDB4ZGU2N2I5ZDY3NzA4YjFhMSksIENPTlNUNjQoMHhkMWEyNzM5NTJhNDQzN2JmKSwgQ09OU1Q2NCgweDgzNmFlOTI2M2RhNTRjMWIpLCBDT05TVDY0KDB4ZDRlMTM1NWZlYThiYmViNSksCisgICAgQ09OU1Q2NCgweDQ5MWM1NWZmNmRiNmUzOTIpLCBDT05TVDY0KDB4ZDlhODcxOTMzYzRhM2JhZiksIENPTlNUNjQoMHhmMThhN2I4ZDcyN2MwN2ZmKSwgQ09OU1Q2NCgweDBhODY4Yzg5OWQ4MzBmMTQpLAorICAgIENPTlNUNjQoMHhkNWE3NzI5NjIxNDMzMWI3KSwgQ09OU1Q2NCgweDFhOTI4ODg1YjE5ZjE3MzQpLCBDT05TVDY0KDB4ZmYwOWY2MDdlNGY4MGVlMyksIENPTlNUNjQoMHhhODgyMmE3ZTMzZDZmYzRkKSwKKyAgICBDT05TVDY0KDB4ZjhjNjNlNDJhZmJhODRlZCksIENPTlNUNjQoMHg2NTNiNWVlMjI4ODdkOWNhKSwgQ09OU1Q2NCgweDljYmIyNzY5NGNmNWQyMjUpLCBDT05TVDY0KDB4MDU0MzQ2Y2FjMGNmODkwYSksCisgICAgQ09OU1Q2NCgweDMwM2MwYzE0NzQyNDI4NjApLCBDT05TVDY0KDB4ODllYzY1YWZhMDI2NDMwZiksIENPTlNUNjQoMHhiZGQ1NjhiOGRmMDU2ZDY3KSwgQ09OU1Q2NCgweDk5Zjg2MWEzOGMzYTViMmYpLAorICAgIENPTlNUNjQoMHgwYzBmMDMwNTFkMDkwYTE4KSwgQ09OU1Q2NCgweDIzZTJjMTVlMTg3ZGJjNDYpLCBDT05TVDY0KDB4NDExNjU3Zjk3YmI4ZWY4MiksIENPTlNUNjQoMHg3ZmE5ZDY2Nzk5MThjZWZlKSwKKyAgICBDT05TVDY0KDB4NDM5YWQ5NzZmMDM1ZWM4NiksIENPTlNUNjQoMHg3ZDI1NThlODEyOTVjZGZhKSwgQ09OU1Q2NCgweDQ3OWZkODc1ZmIzMmVhOGUpLCBDT05TVDY0KDB4ODVlMzY2YWFiZDJmNDkxNyksCisgICAgQ09OU1Q2NCgweDdiYWNkNzY0OTIxZmM4ZjYpLCBDT05TVDY0KDB4ZThkMjNhNGU4M2E2OWNjZCksIENPTlNUNjQoMHgwN2NmYzg0NTRiNDI4YTBlKSwgQ09OU1Q2NCgweGYwY2MzYzQ0YjliNDg4ZmQpLAorICAgIENPTlNUNjQoMHhjZjM1ZmExMzkwZGMyNjgzKSwgQ09OU1Q2NCgweDYyZjQ5NmE3NjNjNTUzYzQpLCBDT05TVDY0KDB4YTYwMWE3ZjRhNTUyZjU1MSksIENPTlNUNjQoMHg1YWMyOThiNTAxZWY3N2I0KSwKKyAgICBDT05TVDY0KDB4OTc3YmVjMjkxYWJlNTIzMyksIENPTlNUNjQoMHhkYTYyYjhkNTdjMGZiN2E5KSwgQ09OU1Q2NCgweDNiZmNjNzU0MjI2ZmE4NzYpLCBDT05TVDY0KDB4ODIyY2FlZWZmNjZkYzMxOSksCisgICAgQ09OU1Q2NCgweGI5ZDA2OWJiZDQwMjZiNmYpLCBDT05TVDY0KDB4MzE3YTRiZGRiZmVjYTc2MiksIENPTlNUNjQoMHg5NjNkYWJlMGQxNzZkZDMxKSwgQ09OU1Q2NCgweDllMzdhOWU2Yzc3OGQxMjEpLAorICAgIENPTlNUNjQoMHg4MWU2NjdhOWI2Mjg0ZjFmKSwgQ09OU1Q2NCgweDI4MjIwYTFlNGUzNjNjNTApLCBDT05TVDY0KDB4MDE0NjQ3YzljYmM4OGYwMiksIENPTlNUNjQoMHhlZjFkZjIwYmM4ZTQxNmMzKSwKKyAgICBDT05TVDY0KDB4ZWU1YmI1YzIwMzJjOTljMSksIENPTlNUNjQoMHg4OGFhMjI2NjZiZWVjYzBkKSwgQ09OU1Q2NCgweGIzNTZlNTMyNDk4MTY0N2IpLCBDT05TVDY0KDB4OWY3MWVlMmYwY2IwNWUyMyksCisgICAgQ09OU1Q2NCgweGMyN2NiZWRmNDYxZGEzOTkpLCBDT05TVDY0KDB4YWM4NzJiN2QzOGQxZmE0NSksIENPTlNUNjQoMHgzZWJmODE5ZWUyYTAyMTdjKSwgQ09OU1Q2NCgweDQ4NWExMjM2YTY3ZTZjOTApLAorICAgIENPTlNUNjQoMHgzNmI1ODM5OGY0YWUyZDZjKSwgQ09OU1Q2NCgweDZjNzcxYjJkZjU0MTVhZDgpLCBDT05TVDY0KDB4MzgzNjBlMTI2MjJhMjQ3MCksIENPTlNUNjQoMHg4Y2FmMjM2NTYwZTljYTA1KSwKKyAgICBDT05TVDY0KDB4ZjMwNmY1MDJmOWYxMDRmYiksIENPTlNUNjQoMHgwOTRjNDVjZmRkYzY4MzEyKSwgQ09OU1Q2NCgweDg0YTUyMTYzNzZlN2M2MTUpLCBDT05TVDY0KDB4MWZkMWNlNGY3MTUwOWUzZSksCisgICAgQ09OU1Q2NCgweDM5NzA0OWRiYTllMmFiNzIpLCBDT05TVDY0KDB4YjA5YzJjNzQwOWM0ZTg3ZCksIENPTlNUNjQoMHhjMzNhZjkxNjhkZDUyYzliKSwgQ09OU1Q2NCgweGJmNTllNjM3NTQ4ODZlNjMpLAorICAgIENPTlNUNjQoMHhlMjU0YjZjNzFlMjU5M2Q5KSwgQ09OU1Q2NCgweGEwODgyODc4MjVkOGYwNWQpLCBDT05TVDY0KDB4NWM0YjE3Mzk4MTY1NzJiOCksIENPTlNUNjQoMHgzMmIwODI5YmZmYTkyYjY0KSwKKyAgICBDT05TVDY0KDB4Njg3MjFhMmVmZTQ2NWNkMCksIENPTlNUNjQoMHgxNjlkOGI4MGFjOTYxZDJjKSwgQ09OU1Q2NCgweGRmMjFmZTFmYmNjMDNlYTMpLCBDT05TVDY0KDB4MTI5ODhhODNhNzkxMWIyNCksCisgICAgQ09OU1Q2NCgweDI0MmQwOTFiNTMzZjM2NDgpLCBDT05TVDY0KDB4MDNjYWM5NDY0MDQ1OGMwNiksIENPTlNUNjQoMHgyNmExODc5NGQ4YjIzNTRjKSwgQ09OU1Q2NCgweDI1NmI0ZWQyOThmN2I5NGEpLAorICAgIENPTlNUNjQoMHhhMzQyZTEzZTY1OWQ3YzViKSwgQ09OU1Q2NCgweGI4OTYyZTcyMWZjYWU0NmQpLCBDT05TVDY0KDB4Yjc1M2U0MzE0Mjg2NjI3MyksIENPTlNUNjQoMHhhNzQ3ZTAzZDZlOWE3YTUzKSwKKyAgICBDT05TVDY0KDB4OGI2MGViMjAyYmFiNDAwYiksIENPTlNUNjQoMHg3YWVhOTBhZDU5ZDc0N2Y0KSwgQ09OU1Q2NCgweGFhMGVhNGYxYjg1YmZmNDkpLCBDT05TVDY0KDB4Nzg2NjFlMjJkMjVhNDRmMCksCisgICAgQ09OU1Q2NCgweDJlYWI4NTkyY2ViYzM5NWMpLCBDT05TVDY0KDB4OWRmZDYwYTA4NzNkNWQyNyksIENPTlNUNjQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQ09OU1Q2NCgweDk0YjEyNTZmNWFmYmRlMzUpLAorICAgIENPTlNUNjQoMHhmNzAzZjQwMWYyZjYwMmYzKSwgQ09OU1Q2NCgweGUzMTJmMTBlZDVlZDFjZGIpLCBDT05TVDY0KDB4NmFmZTk0YTE3NWNiNWZkNCksIENPTlNUNjQoMHgyYzI3MGIxZDQ1MzEzYTU4KSwKKyAgICBDT05TVDY0KDB4YmI1Y2U3MzQ1ZjhmNjg2YiksIENPTlNUNjQoMHhjOWJjNzU5ZjEwNTYyMzhmKSwgQ09OU1Q2NCgweDliNzRlZjJjMDdiNzU4MmIpLCBDT05TVDY0KDB4ZDBlNDM0NWNlMThjYjhiZCksCisgICAgQ09OU1Q2NCgweGM0ZjUzMTUzYzY5N2E2OTUpLCBDT05TVDY0KDB4NzdhM2Q0NjE4ZjE2YzJlZSksIENPTlNUNjQoMHg2N2I3ZDA2ZGEzMGFkYWNlKSwgQ09OU1Q2NCgweDIyYTQ4Njk3ZDNiNTMzNDQpLAorICAgIENPTlNUNjQoMHhlNTliN2U4MjU1NjcxOWQ3KSwgQ09OU1Q2NCgweDhlMjNhZGVhZWI2NGM5MDEpLCBDT05TVDY0KDB4ZDMyZWZkMWFhMWM5MzRiYiksIENPTlNUNjQoMHhhNDhkMjk3YjJlZGZmNjU1KSwKKyAgICBDT05TVDY0KDB4YzBmMDMwNTBjZDkwYTA5ZCksIENPTlNUNjQoMHhlY2Q3M2I0ZDg4YTE5YWM1KSwgQ09OU1Q2NCgweDQ2ZDk5ZmJjMzBmYTY1OGMpLCBDT05TVDY0KDB4YzczZmY4MTU4NmQyMmE5MyksCisgICAgQ09OU1Q2NCgweDNmZjljNjU3Mjk2OGFlN2UpLCBDT05TVDY0KDB4NGM1ZjEzMzVhZDc5NmE5OCksIENPTlNUNjQoMHgxODFlMDYwYTNhMTIxNDMwKSwgQ09OU1Q2NCgweDE0MTEwNTBmMjcxYjFlMjgpLAorICAgIENPTlNUNjQoMHgzM2Y2YzU1MjM0NjFhNDY2KSwgQ09OU1Q2NCgweDQ0NTUxMTMzYmI3NzY2ODgpLCBDT05TVDY0KDB4YzFiNjc3OTkwNjU4MmY5ZiksIENPTlNUNjQoMHhlZDkxN2M4NDQzNjkxNWM3KSwKKyAgICBDT05TVDY0KDB4ZjU4ZjdhOGU3OTdiMDFmNyksIENPTlNUNjQoMHhmZDg1Nzg4ODZmNzUwZGU3KSwgQ09OU1Q2NCgweGQ4ZWUzNjVhZjc4MmI0YWQpLCBDT05TVDY0KDB4NzA2YzFjMjRjNDU0NDhlMCksCisgICAgQ09OU1Q2NCgweGU0ZGQzOTRiOWVhZjk2ZDUpLCBDT05TVDY0KDB4NzkyMDU5ZWIxOTkyY2JmMiksIENPTlNUNjQoMHg2MDc4MTgyOGU4NDg1MGMwKSwgQ09OU1Q2NCgweDQ1MTM1NmZhNzBiZmU5OGEpLAorICAgIENPTlNUNjQoMHhmNjQ1YjNjODM5M2U4ZGYxKSwgQ09OU1Q2NCgweGZhNGFiMGNkMjQzNzg3ZTkpLCBDT05TVDY0KDB4OTBiNDI0NmM1MWZjZDgzZCksIENPTlNUNjQoMHg4MGEwMjA2MDdkZTBjMDFkKSwKKyAgICBDT05TVDY0KDB4ZjI0MGIyY2IzMjM5OGJmOSksIENPTlNUNjQoMHg3MmUwOTJhYjRmZDk0YmU0KSwgQ09OU1Q2NCgweGI2MTVhM2Y4ODk0ZWVkNzEpLCBDT05TVDY0KDB4MjdlN2MwNWQxMzdhYmE0ZSksCisgICAgQ09OU1Q2NCgweDBkNDk0NGNjZDZjMTg1MWEpLCBDT05TVDY0KDB4OTVmNzYyYTY5MTMzNTEzNyksIENPTlNUNjQoMHg0MDUwMTAzMGIwNzA2MDgwKSwgQ09OU1Q2NCgweGVhNWViNGMxMDgyYjlmYzkpLAorICAgIENPTlNUNjQoMHgyYWFlODQ5MWM1YmIzZjU0KSwgQ09OU1Q2NCgweDExNTI0M2M1ZTdkNDk3MjIpLCBDT05TVDY0KDB4NzZlNTkzYTg0NGRlNGRlYyksIENPTlNUNjQoMHgyZmVkYzI1YjA1NzRiNjVlKSwKKyAgICBDT05TVDY0KDB4MzU3ZjRhZGViNGViYTE2YSksIENPTlNUNjQoMHhjZTczYmRkYTViMTRhOTgxKSwgQ09OU1Q2NCgweDA2ODk4ZjhjODA4YTA1MGMpLCBDT05TVDY0KDB4YjQ5OTJkNzcwMmMzZWU3NSksCisgICAgQ09OU1Q2NCgweGNhNzZiY2Q5NTAxM2FmODkpLCBDT05TVDY0KDB4NGFkNjljYjkyZGYzNmY5NCksIENPTlNUNjQoMHhiNWRmNmFiZWM5MGI2MTc3KSwgQ09OU1Q2NCgweDFkNWQ0MGMwZmFkZDlkM2EpLAorICAgIENPTlNUNjQoMHgxYmQ0Y2Y0YzdhNTc5ODM2KSwgQ09OU1Q2NCgweGIyMTBhMmZiODI0OWViNzkpLCBDT05TVDY0KDB4M2FiYTgwOWRlOWE3Mjc3NCksIENPTlNUNjQoMHgyMTZlNGZkMTkzZjBiZjQyKSwKKyAgICBDT05TVDY0KDB4N2M2MzFmMjFkOTVkNDJmOCksIENPTlNUNjQoMHgwZmM1Y2E0MzVkNGM4NjFlKSwgQ09OU1Q2NCgweDkyMzhhYWUzZGE3MWRiMzkpLCBDT05TVDY0KDB4MTU1NzQyYzZlY2QzOTEyYSksCit9OworCitzdGF0aWMgY29uc3QgdWxvbmc2NCBUM1syNTZdID0geworICAgIENPTlNUNjQoMHg2OGQyZDNiYTAxNmFiOWJiKSwgQ09OU1Q2NCgweDE5NGRmYzU0YjE2NjlhZTUpLCBDT05TVDY0KDB4OTNiYzcxMmZjZDE0NjVlMiksIENPTlNUNjQoMHhiOWNkOWM3NDUxMWI4NzI1KSwKKyAgICBDT05TVDY0KDB4MDI1MWY1NTNhNDU3YTJmNyksIENPTlNUNjQoMHhiODZiNjhkMzAzYmVkNmQwKSwgQ09OU1Q2NCgweGJkNmY2YmQyMDRiNWRlZDYpLCBDT05TVDY0KDB4NjQyOWQ3NGRmZTg1NTJiMyksCisgICAgQ09OU1Q2NCgweDBkNWRmMDUwYWQ0YWJhZmQpLCBDT05TVDY0KDB4MjY4YWU5YWM2M2UwMDljZiksIENPTlNUNjQoMHg4MzBlOGE4ZDg0OTYxYzA5KSwgQ09OU1Q2NCgweDc5YzZkY2JmMWE0ZDkxYTUpLAorICAgIENPTlNUNjQoMHhhZGRkOTA3MDRkMzdhNzNkKSwgQ09OU1Q2NCgweDA3NTVmNjUyYTM1Y2FhZjEpLCBDT05TVDY0KDB4Yzg1MmIzOWFlMTE3YTQ3YiksIENPTlNUNjQoMHg2MTJkZDQ0Y2Y5OGU1YWI1KSwKKyAgICBDT05TVDY0KDB4NjU4ZjIzZWFhYzIwMDM0NiksIENPTlNUNjQoMHhhNjczNjJkNTExODRlNmM0KSwgQ09OU1Q2NCgweGYxNjZhNDk3YzI2OGNjNTUpLCBDT05TVDY0KDB4YjI2MzZlZDEwZGE4YzZkYyksCisgICAgQ09OU1Q2NCgweGZmY2M1NTMzOTlkMDg1YWEpLCBDT05TVDY0KDB4MDg1OWYzNTFhYTQxYjJmYiksIENPTlNUNjQoMHgyYTcxZWQ1YjljMGZlMmM3KSwgQ09OU1Q2NCgweDA0YTJmN2E2NTVhZTU5ZjMpLAorICAgIENPTlNUNjQoMHg4MTVmN2ZkZTIwYzFiZWZlKSwgQ09OU1Q2NCgweDc1M2RkODQ4ZTVhMjdhYWQpLCBDT05TVDY0KDB4MzI5YWU1YTg3ZmNjMjlkNyksIENPTlNUNjQoMHhjNzVlYjY5OWU4MGFiYzcxKSwKKyAgICBDT05TVDY0KDB4OTA0YjcwZGIzYmU2OTZlMCksIENPTlNUNjQoMHhmYWM4NTYzMjllZGI4ZGFjKSwgQ09OU1Q2NCgweDUxZTZjNGI3MjIxNWQxOTUpLCBDT05TVDY0KDB4MmJkNzE5ZmNjZWFhYjMzMiksCisgICAgQ09OU1Q2NCgweDQ4YWIzOGUzOTM3MzRiNzApLCBDT05TVDY0KDB4ZGM0MmJmOWVmZDNiODQ2MyksIENPTlNUNjQoMHhlZjdlYWU5MWQwNTJmYzQxKSwgQ09OU1Q2NCgweGNkNTZiMDliZTYxY2FjN2QpLAorICAgIENPTlNUNjQoMHg0ZGFmM2JlMjk0Nzg0Mzc2KSwgQ09OU1Q2NCgweDZkZDZkMGJiMDY2MWIxYmQpLCBDT05TVDY0KDB4NTgxOWMzNDFkYWYxMzI5YiksIENPTlNUNjQoMHhjYmE1YjI2ZTE3ZTU1Nzc5KSwKKyAgICBDT05TVDY0KDB4MGJhZWYyYTU1Y2IzNDFmOSksIENPTlNUNjQoMHhjMDBiNDBjYjRiNTYxNjgwKSwgQ09OU1Q2NCgweGRhYjFiZDZiMGNjMjdmNjcpLCBDT05TVDY0KDB4ZmI2ZWEyOTVjYzdlZGM1OSksCisgICAgQ09OU1Q2NCgweDFmYmVmZWExNDA5ZjYxZTEpLCBDT05TVDY0KDB4MThlYjA4ZjNlM2MzY2IxMCksIENPTlNUNjQoMHg0ZmZlY2ViMTMwMmZlMTgxKSwgQ09OU1Q2NCgweDBhMDgwNjAyMGUxNjEwMGMpLAorICAgIENPTlNUNjQoMHhkYjE3NDljYzVlNjcyZTkyKSwgQ09OU1Q2NCgweGYzMzc1MWM0NjYzZjZlYTIpLCBDT05TVDY0KDB4Njk3NDI3MWQ1M2NmZTg0ZSksIENPTlNUNjQoMHg0NDUwM2MxNDZjOWNhMDc4KSwKKyAgICBDT05TVDY0KDB4ZTgyYjU4YzM3MzBlNTZiMCksIENPTlNUNjQoMHhmMjkxYTU2MzM0OWEzZjU3KSwgQ09OU1Q2NCgweDk1NGY3M2RhM2NlZDllZTYpLCBDT05TVDY0KDB4MzQ2OWU3NWQ4ZTM1ZDJkMyksCisgICAgQ09OU1Q2NCgweDNlNjFlMTVmODAyM2MyZGYpLCBDT05TVDY0KDB4OGI1Nzc5ZGMyZWQ3YWVmMiksIENPTlNUNjQoMHg5NGU5ODc3ZDZlNDhjZjEzKSwgQ09OU1Q2NCgweGRlMTM0YWNkNTk2YzI2OTQpLAorICAgIENPTlNUNjQoMHg5ZWUxODE3ZjYwNWVkZjFmKSwgQ09OU1Q2NCgweDJmNzVlZTVhOWIwNGVhYzEpLCBDT05TVDY0KDB4YzFhZGI0NmMxOWYzNDc3NSksIENPTlNUNjQoMHgzMTZkZTQ1Yzg5M2VkYWQ1KSwKKyAgICBDT05TVDY0KDB4MGNmYjA0ZjdmZmVmZWIwOCksIENPTlNUNjQoMHhiZTk4NmEyNmYyNDcyZGQ0KSwgQ09OU1Q2NCgweDI0ZGIxY2ZmYzdiN2FiMzgpLCBDT05TVDY0KDB4N2U5MzJhZWRiOTExM2I1NCksCisgICAgQ09OU1Q2NCgweDZmODcyNWU4YTIzNjEzNGEpLCBDT05TVDY0KDB4ZDM0ZWJhOWRmNDI2OWM2OSksIENPTlNUNjQoMHhjZWExYjE2ZjEwZWU1ZjdmKSwgQ09OU1Q2NCgweDhjMDI4ZjhlOGQ4YjA0MDMpLAorICAgIENPTlNUNjQoMHg3ZDY0MmIxOTRmZTNjODU2KSwgQ09OU1Q2NCgweDFhYmFmZGEwNDc5NDY5ZTcpLCBDT05TVDY0KDB4MTdlNzBkZjBlYWRlZDMxYSksIENPTlNUNjQoMHg5NzFlODY4OTk4YmEzYzExKSwKKyAgICBDT05TVDY0KDB4MzMzYzExMGYyZDY5NzgyMiksIENPTlNUNjQoMHgxYjFjMDkwNzE1MzEzODEyKSwgQ09OU1Q2NCgweDI5ODZlY2FmNmFmZDExYzUpLCBDT05TVDY0KDB4MzBjYjEwZmJkYjliOGIyMCksCisgICAgQ09OU1Q2NCgweDI4MjAxODA4Mzg1ODQwMzApLCBDT05TVDY0KDB4NDE1NDNmMTU2Yjk3YTg3ZSksIENPTlNUNjQoMHgzOTM0MTcwZDIzN2Y2ODJlKSwgQ09OU1Q2NCgweDE0MTAwYzA0MWMyYzIwMTgpLAorICAgIENPTlNUNjQoMHgwNTA0MDMwMTA3MGIwODA2KSwgQ09OU1Q2NCgweGU5OGRhYzY0MjFhYjA3NDUpLCBDT05TVDY0KDB4ODQ1YjdjZGYyN2NhYjZmOCksIENPTlNUNjQoMHhiM2M1OWE3NjVmMGQ5NzI5KSwKKyAgICBDT05TVDY0KDB4ODBmOThiNzk3MjY0ZWYwYiksIENPTlNUNjQoMHg4ZTUzN2FkZDI5ZGNhNmY0KSwgQ09OU1Q2NCgweGM5ZjQ0NzNkYjNiMmY1OGUpLCBDT05TVDY0KDB4NGU1ODNhMTY2MjhhYjA3NCksCisgICAgQ09OU1Q2NCgweGMzZmM0MTNmYmRhNGU1ODIpLCBDT05TVDY0KDB4ZWJkYzU5Mzc4NWZjYTViMiksIENPTlNUNjQoMHhjNGE5Yjc2ZDFlZjg0ZjczKSwgQ09OU1Q2NCgweGQ4ZTA0ODM4YTg5NWRkOTApLAorICAgIENPTlNUNjQoMHg2N2RlZDZiOTA4NzdhMWIxKSwgQ09OU1Q2NCgweGEyZDE5NTczNDQyYWJmMzcpLCBDT05TVDY0KDB4NmE4MzI2ZTlhNTNkMWI0YyksIENPTlNUNjQoMHhlMWQ0NWYzNThiZWFiNWJlKSwKKyAgICBDT05TVDY0KDB4MWM0OWZmNTViNjZkOTJlMyksIENPTlNUNjQoMHhhOGQ5OTM3MTRhM2NhZjNiKSwgQ09OU1Q2NCgweDhhZjE4ZDdiN2M3MmZmMDcpLCBDT05TVDY0KDB4ODYwYTg5OGM4MzlkMTQwZiksCisgICAgQ09OU1Q2NCgweGE3ZDU5NjcyNDMyMWI3MzEpLCBDT05TVDY0KDB4OTIxYTg1ODg5ZmIxMzQxNyksIENPTlNUNjQoMHgwOWZmMDdmNmY4ZTRlMzBlKSwgQ09OU1Q2NCgweDgyYTg3ZTJhZDYzMzRkZmMpLAorICAgIENPTlNUNjQoMHhjNmY4NDIzZWJhYWZlZDg0KSwgQ09OU1Q2NCgweDNiNjVlMjVlODcyOGNhZDkpLCBDT05TVDY0KDB4YmI5YzY5MjdmNTRjMjVkMiksIENPTlNUNjQoMHg0MzA1Y2E0NmNmYzAwYTg5KSwKKyAgICBDT05TVDY0KDB4M2MzMDE0MGMyNDc0NjAyOCksIENPTlNUNjQoMHhlYzg5YWY2NTI2YTAwZjQzKSwgQ09OU1Q2NCgweGQ1YmRiODY4MDVkZjY3NmQpLCBDT05TVDY0KDB4Zjg5OWEzNjEzYThjMmY1YiksCisgICAgQ09OU1Q2NCgweDBmMGMwNTAzMDkxZDE4MGEpLCBDT05TVDY0KDB4ZTIyMzVlYzE3ZDE4NDZiYyksIENPTlNUNjQoMHgxNjQxZjk1N2I4N2I4MmVmKSwgQ09OU1Q2NCgweGE5N2Y2N2Q2MTg5OWZlY2UpLAorICAgIENPTlNUNjQoMHg5YTQzNzZkOTM1ZjA4NmVjKSwgQ09OU1Q2NCgweDI1N2RlODU4OTUxMmZhY2QpLCBDT05TVDY0KDB4OWY0Nzc1ZDgzMmZiOGVlYSksIENPTlNUNjQoMHhlMzg1YWE2NjJmYmQxNzQ5KSwKKyAgICBDT05TVDY0KDB4YWM3YjY0ZDcxZjkyZjZjOCksIENPTlNUNjQoMHhkMmU4NGUzYWE2ODNjZDljKSwgQ09OU1Q2NCgweGNmMDc0NWM4NDI0YjBlOGEpLCBDT05TVDY0KDB4Y2NmMDQ0M2NiNGI5ZmQ4OCksCisgICAgQ09OU1Q2NCgweDM1Y2YxM2ZhZGM5MDgzMjYpLCBDT05TVDY0KDB4ZjQ2MmE3OTZjNTYzYzQ1MyksIENPTlNUNjQoMHgwMWE2ZjRhNzUyYTU1MWY1KSwgQ09OU1Q2NCgweGMyNWFiNTk4ZWYwMWI0NzcpLAorICAgIENPTlNUNjQoMHg3Yjk3MjllY2JlMWEzMzUyKSwgQ09OU1Q2NCgweDYyZGFkNWI4MGY3Y2E5YjcpLCBDT05TVDY0KDB4ZmMzYjU0Yzc2ZjIyNzZhOCksIENPTlNUNjQoMHgyYzgyZWZhZTZkZjYxOWMzKSwKKyAgICBDT05TVDY0KDB4ZDBiOWJiNjkwMmQ0NmY2YiksIENPTlNUNjQoMHg3YTMxZGQ0YmVjYmY2MmE3KSwgQ09OU1Q2NCgweDNkOTZlMGFiNzZkMTMxZGQpLCBDT05TVDY0KDB4Mzc5ZWU2YTk3OGM3MjFkMSksCisgICAgQ09OU1Q2NCgweGU2ODFhOTY3MjhiNjFmNGYpLCBDT05TVDY0KDB4MjIyODFlMGEzNjRlNTAzYyksIENPTlNUNjQoMHg0NjAxYzk0N2M4Y2IwMjhmKSwgQ09OU1Q2NCgweDFkZWYwYmYyZTRjOGMzMTYpLAorICAgIENPTlNUNjQoMHg1YmVlYzJiNTJjMDNjMTk5KSwgQ09OU1Q2NCgweGFhODg2NjIyZWU2YjBkY2MpLCBDT05TVDY0KDB4NTZiMzMyZTU4MTQ5N2I2NCksIENPTlNUNjQoMHg3MTlmMmZlZWIwMGMyMzVlKSwKKyAgICBDT05TVDY0KDB4N2NjMmRmYmUxZDQ2OTlhMyksIENPTlNUNjQoMHg4N2FjN2QyYmQxMzg0NWZhKSwgQ09OU1Q2NCgweGJmM2U5ZTgxYTBlMjdjMjEpLCBDT05TVDY0KDB4NWE0ODM2MTI3ZWE2OTA2YyksCisgICAgQ09OU1Q2NCgweGI1MzY5ODgzYWVmNDZjMmQpLCBDT05TVDY0KDB4Nzc2YzJkMWI0MWY1ZDg1YSksIENPTlNUNjQoMHgzNjM4MTIwZTJhNjI3MDI0KSwgQ09OU1Q2NCgweGFmOGM2NTIzZTk2MDA1Y2EpLAorICAgIENPTlNUNjQoMHgwNmYzMDJmNWYxZjlmYjA0KSwgQ09OU1Q2NCgweDRjMDljZjQ1YzZkZDEyODMpLCBDT05TVDY0KDB4YTU4NDYzMjFlNzc2MTVjNiksIENPTlNUNjQoMHhkMTFmNGZjZTUwNzEzZTllKSwKKyAgICBDT05TVDY0KDB4NzAzOWRiNDllMmE5NzJhYiksIENPTlNUNjQoMHg5Y2IwNzQyY2M0MDk3ZGU4KSwgQ09OU1Q2NCgweDNhYzMxNmY5ZDU4ZDliMmMpLCBDT05TVDY0KDB4NTliZjM3ZTY4ODU0NjM2ZSksCisgICAgQ09OU1Q2NCgweDU0ZTJjN2I2MjUxZWQ5OTMpLCBDT05TVDY0KDB4ODhhMDc4MjhkODI1NWRmMCksIENPTlNUNjQoMHg0YjVjMzkxNzY1ODFiODcyKSwgQ09OU1Q2NCgweGIwMzI5YjgyYTlmZjY0MmIpLAorICAgIENPTlNUNjQoMHg3MjY4MmUxYTQ2ZmVkMDVjKSwgQ09OU1Q2NCgweDlkMTY4MDhiOTZhYzJjMWQpLCBDT05TVDY0KDB4MjFkZjFmZmVjMGJjYTMzZSksIENPTlNUNjQoMHg5ODEyODM4YTkxYTcyNDFiKSwKKyAgICBDT05TVDY0KDB4MmQyNDFiMDkzZjUzNDgzNiksIENPTlNUNjQoMHhjYTAzNDZjOTQ1NDAwNjhjKSwgQ09OU1Q2NCgweGExMjY5NDg3YjJkODRjMzUpLCBDT05TVDY0KDB4NmIyNWQyNGVmNzk4NGFiOSksCisgICAgQ09OU1Q2NCgweDQyYTMzZWUxOWQ2NTViN2MpLCBDT05TVDY0KDB4OTZiODcyMmVjYTFmNmRlNCksIENPTlNUNjQoMHg1M2I3MzFlNDg2NDI3MzYyKSwgQ09OU1Q2NCgweDQ3YTczZGUwOWE2ZTUzN2EpLAorICAgIENPTlNUNjQoMHg2MDhiMjBlYmFiMmIwYjQwKSwgQ09OU1Q2NCgweGVhN2FhZDkwZDc1OWY0NDcpLCBDT05TVDY0KDB4MGVhYWYxYTQ1YmI4NDlmZiksIENPTlNUNjQoMHg2Njc4MjIxZTVhZDJmMDQ0KSwKKyAgICBDT05TVDY0KDB4YWIyZTkyODViY2NlNWMzOSksIENPTlNUNjQoMHhmZDlkYTA2MDNkODcyNzVkKSwgQ09OU1Q2NCgweDAwMDAwMDAwMDAwMDAwMDApLCBDT05TVDY0KDB4YjE5NDZmMjVmYjVhMzVkZSksCisgICAgQ09OU1Q2NCgweDAzZjcwMWY0ZjZmMmYzMDIpLCBDT05TVDY0KDB4MTJlMzBlZjFlZGQ1ZGIxYyksIENPTlNUNjQoMHhmZTZhYTE5NGNiNzVkNDVmKSwgQ09OU1Q2NCgweDI3MmMxZDBiMzE0NTU4M2EpLAorICAgIENPTlNUNjQoMHg1Y2JiMzRlNzhmNWY2YjY4KSwgQ09OU1Q2NCgweGJjYzk5Zjc1NTYxMDhmMjMpLCBDT05TVDY0KDB4NzQ5YjJjZWZiNzA3MmI1OCksIENPTlNUNjQoMHhlNGQwNWMzNDhjZTFiZGI4KSwKKyAgICBDT05TVDY0KDB4ZjVjNDUzMzE5N2M2OTVhNiksIENPTlNUNjQoMHhhMzc3NjFkNDE2OGZlZWMyKSwgQ09OU1Q2NCgweGI3Njc2ZGQwMGFhM2NlZGEpLCBDT05TVDY0KDB4YTQyMjk3ODZiNWQzNDQzMyksCisgICAgQ09OU1Q2NCgweDliZTU4MjdlNjc1NWQ3MTkpLCBDT05TVDY0KDB4MjM4ZWVhYWQ2NGViMDFjOSksIENPTlNUNjQoMHgyZWQzMWFmZGM5YTFiYjM0KSwgQ09OU1Q2NCgweDhkYTQ3YjI5ZGYyZTU1ZjYpLAorICAgIENPTlNUNjQoMHhmMGMwNTAzMDkwY2Q5ZGEwKSwgQ09OU1Q2NCgweGQ3ZWM0ZDNiYTE4OGM1OWEpLCBDT05TVDY0KDB4ZDk0NmJjOWZmYTMwOGM2NSksIENPTlNUNjQoMHgzZmM3MTVmOGQyODY5MzJhKSwKKyAgICBDT05TVDY0KDB4ZjkzZjU3YzY2ODI5N2VhZSksIENPTlNUNjQoMHg1ZjRjMzUxMzc5YWQ5ODZhKSwgQ09OU1Q2NCgweDFlMTgwYTA2MTIzYTMwMTQpLCBDT05TVDY0KDB4MTExNDBmMDUxYjI3MjgxZSksCisgICAgQ09OU1Q2NCgweGY2MzM1MmM1NjEzNDY2YTQpLCBDT05TVDY0KDB4NTU0NDMzMTE3N2JiODg2NiksIENPTlNUNjQoMHhiNmMxOTk3NzU4MDY5ZjJmKSwgQ09OU1Q2NCgweDkxZWQ4NDdjNjk0M2M3MTUpLAorICAgIENPTlNUNjQoMHg4ZmY1OGU3YTdiNzlmNzAxKSwgQ09OU1Q2NCgweDg1ZmQ4ODc4NzU2ZmU3MGQpLCBDT05TVDY0KDB4ZWVkODVhMzY4MmY3YWRiNCksIENPTlNUNjQoMHg2YzcwMjQxYzU0YzRlMDQ4KSwKKyAgICBDT05TVDY0KDB4ZGRlNDRiMzlhZjllZDU5NiksIENPTlNUNjQoMHgyMDc5ZWI1OTkyMTlmMmNiKSwgQ09OU1Q2NCgweDc4NjAyODE4NDhlOGMwNTApLCBDT05TVDY0KDB4MTM0NWZhNTZiZjcwOGFlOSksCisgICAgQ09OU1Q2NCgweDQ1ZjZjOGIzM2UzOWYxOGQpLCBDT05TVDY0KDB4NGFmYWNkYjAzNzI0ZTk4NyksIENPTlNUNjQoMHhiNDkwNmMyNGZjNTEzZGQ4KSwgQ09OU1Q2NCgweGEwODA2MDIwZTA3ZDFkYzApLAorICAgIENPTlNUNjQoMHg0MGYyY2JiMjM5MzJmOThiKSwgQ09OU1Q2NCgweGUwNzJhYjkyZDk0ZmU0NGIpLCBDT05TVDY0KDB4MTViNmY4YTM0ZTg5NzFlZCksIENPTlNUNjQoMHhlNzI3NWRjMDdhMTM0ZWJhKSwKKyAgICBDT05TVDY0KDB4NDkwZGNjNDRjMWQ2MWE4NSksIENPTlNUNjQoMHhmNzk1YTY2MjMzOTEzNzUxKSwgQ09OU1Q2NCgweDUwNDAzMDEwNzBiMDgwNjApLCBDT05TVDY0KDB4NWVlYWMxYjQyYjA4Yzk5ZiksCisgICAgQ09OU1Q2NCgweGFlMmE5MTg0YmJjNTU0M2YpLCBDT05TVDY0KDB4NTIxMWM1NDNkNGU3MjI5NyksIENPTlNUNjQoMHhlNTc2YTg5M2RlNDRlYzRkKSwgQ09OU1Q2NCgweGVkMmY1YmMyNzQwNTVlYjYpLAorICAgIENPTlNUNjQoMHg3ZjM1ZGU0YWViYjQ2YWExKSwgQ09OU1Q2NCgweDczY2VkYWJkMTQ1YjgxYTkpLCBDT05TVDY0KDB4ODkwNjhjOGY4YTgwMGMwNSksIENPTlNUNjQoMHg5OWI0NzcyZGMzMDI3NWVlKSwKKyAgICBDT05TVDY0KDB4NzZjYWQ5YmMxMzUwODlhZiksIENPTlNUNjQoMHhkNjRhYjk5Y2YzMmQ5NDZmKSwgQ09OU1Q2NCgweGRmYjViZTZhMGJjOTc3NjEpLCBDT05TVDY0KDB4NWQxZGMwNDBkZGZhM2E5ZCksCisgICAgQ09OU1Q2NCgweGQ0MWI0Y2NmNTc3YTM2OTgpLCBDT05TVDY0KDB4MTBiMmZiYTI0OTgyNzllYiksIENPTlNUNjQoMHhiYTNhOWQ4MGE3ZTk3NDI3KSwgQ09OU1Q2NCgweDZlMjFkMTRmZjA5MzQyYmYpLAorICAgIENPTlNUNjQoMHg2MzdjMjExZjVkZDlmODQyKSwgQ09OU1Q2NCgweGM1MGY0M2NhNGM1ZDFlODYpLCBDT05TVDY0KDB4Mzg5MmUzYWE3MWRhMzlkYiksIENPTlNUNjQoMHg1NzE1YzY0MmQzZWMyYTkxKSwKK307CisKK3N0YXRpYyBjb25zdCB1bG9uZzY0IFQ0WzI1Nl0gPSB7CisgICAgQ09OU1Q2NCgweGJiYjk2YTAxYmFkM2QyNjgpLCBDT05TVDY0KDB4ZTU5YTY2YjE1NGZjNGQxOSksIENPTlNUNjQoMHhlMjY1MTRjZDJmNzFiYzkzKSwgQ09OU1Q2NCgweDI1ODcxYjUxNzQ5Y2NkYjkpLAorICAgIENPTlNUNjQoMHhmN2EyNTdhNDUzZjU1MTAyKSwgQ09OU1Q2NCgweGQwZDZiZTAzZDM2ODZiYjgpLCBDT05TVDY0KDB4ZDZkZWI1MDRkMjZiNmZiZCksIENPTlNUNjQoMHhiMzUyODVmZTRkZDcyOTY0KSwKKyAgICBDT05TVDY0KDB4ZmRiYTRhYWQ1MGYwNWQwZCksIENPTlNUNjQoMHhjZjA5ZTA2M2FjZTk4YTI2KSwgQ09OU1Q2NCgweDA5MWM5Njg0OGQ4YTBlODMpLCBDT05TVDY0KDB4YTU5MTRkMWFiZmRjYzY3OSksCisgICAgQ09OU1Q2NCgweDNkYTczNzRkNzA5MGRkYWQpLCBDT05TVDY0KDB4ZjFhYTVjYTM1MmY2NTUwNyksIENPTlNUNjQoMHg3YmE0MTdlMTlhYjM1MmM4KSwgQ09OU1Q2NCgweGI1NWE4ZWY5NGNkNDJkNjEpLAorICAgIENPTlNUNjQoMHg0NjAzMjBhY2VhMjM4ZjY1KSwgQ09OU1Q2NCgweGM0ZTY4NDExZDU2MjczYTYpLCBDT05TVDY0KDB4NTVjYzY4YzI5N2E0NjZmMSksIENPTlNUNjQoMHhkY2M2YTgwZGQxNmU2M2IyKSwKKyAgICBDT05TVDY0KDB4YWE4NWQwOTkzMzU1Y2NmZiksIENPTlNUNjQoMHhmYmIyNDFhYTUxZjM1OTA4KSwgQ09OU1Q2NCgweGM3ZTIwZjljNWJlZDcxMmEpLCBDT05TVDY0KDB4ZjM1OWFlNTVhNmY3YTIwNCksCisgICAgQ09OU1Q2NCgweGZlYmVjMTIwZGU3ZjVmODEpLCBDT05TVDY0KDB4YWQ3YWEyZTU0OGQ4M2Q3NSksIENPTlNUNjQoMHhkNzI5Y2M3ZmE4ZTU5YTMyKSwgQ09OU1Q2NCgweDcxYmMwYWU4OTliNjVlYzcpLAorICAgIENPTlNUNjQoMHhlMDk2ZTYzYmRiNzA0YjkwKSwgQ09OU1Q2NCgweGFjOGRkYjllMzI1NmM4ZmEpLCBDT05TVDY0KDB4OTVkMTE1MjJiN2M0ZTY1MSksIENPTlNUNjQoMHgzMmIzYWFjZWZjMTlkNzJiKSwKKyAgICBDT05TVDY0KDB4NzA0YjczOTNlMzM4YWI0OCksIENPTlNUNjQoMHg2Mzg0M2JmZDllYmY0MmRjKSwgQ09OU1Q2NCgweDQxZmM1MmQwOTFhZTdlZWYpLCBDT05TVDY0KDB4N2RhYzFjZTY5YmIwNTZjZCksCisgICAgQ09OU1Q2NCgweDc2NDM3ODk0ZTIzYmFmNGQpLCBDT05TVDY0KDB4YmRiMTYxMDZiYmQwZDY2ZCksIENPTlNUNjQoMHg5YjMyZjFkYTQxYzMxOTU4KSwgQ09OU1Q2NCgweDc5NTdlNTE3NmViMmE1Y2IpLAorICAgIENPTlNUNjQoMHhmOTQxYjM1Y2E1ZjJhZTBiKSwgQ09OU1Q2NCgweDgwMTY1NjRiY2I0MDBiYzApLCBDT05TVDY0KDB4Njc3ZmMyMGM2YmJkYjFkYSksIENPTlNUNjQoMHg1OWRjN2VjYzk1YTI2ZWZiKSwKKyAgICBDT05TVDY0KDB4ZTE2MTlmNDBhMWZlYmUxZiksIENPTlNUNjQoMHgxMGNiYzNlM2YzMDhlYjE4KSwgQ09OU1Q2NCgweDgxZTEyZjMwYjFjZWZlNGYpLCBDT05TVDY0KDB4MGMxMDE2MGUwMjA2MDgwYSksCisgICAgQ09OU1Q2NCgweDkyMmU2NzVlY2M0OTE3ZGIpLCBDT05TVDY0KDB4YTI2ZTNmNjZjNDUxMzdmMyksIENPTlNUNjQoMHg0ZWU4Y2Y1MzFkMjc3NDY5KSwgQ09OU1Q2NCgweDc4YTA5YzZjMTQzYzUwNDQpLAorICAgIENPTlNUNjQoMHhiMDU2MGU3M2MzNTgyYmU4KSwgQ09OU1Q2NCgweDU3M2Y5YTM0NjNhNTkxZjIpLCBDT05TVDY0KDB4ZTY5ZWVkM2NkYTczNGY5NSksIENPTlNUNjQoMHhkM2QyMzU4ZTVkZTc2OTM0KSwKKyAgICBDT05TVDY0KDB4ZGZjMjIzODA1ZmUxNjEzZSksIENPTlNUNjQoMHhmMmFlZDcyZWRjNzk1NzhiKSwgQ09OU1Q2NCgweDEzY2Y0ODZlN2Q4N2U5OTQpLCBDT05TVDY0KDB4OTQyNjZjNTljZDRhMTNkZSksCisgICAgQ09OU1Q2NCgweDFmZGY1ZTYwN2Y4MWUxOWUpLCBDT05TVDY0KDB4YzFlYTA0OWI1YWVlNzUyZiksIENPTlNUNjQoMHg3NTQ3ZjMxOTZjYjRhZGMxKSwgQ09OU1Q2NCgweGQ1ZGEzZTg5NWNlNDZkMzEpLAorICAgIENPTlNUNjQoMHgwOGViZWZmZmY3MDRmYjBjKSwgQ09OU1Q2NCgweGQ0MmQ0N2YyMjY2YTk4YmUpLCBDT05TVDY0KDB4MzhhYmI3YzdmZjFjZGIyNCksIENPTlNUNjQoMHg1NDNiMTFiOWVkMmE5MzdlKSwKKyAgICBDT05TVDY0KDB4NGExMzM2YTJlODI1ODc2ZiksIENPTlNUNjQoMHg2OTljMjZmNDlkYmE0ZWQzKSwgQ09OU1Q2NCgweDdmNWZlZTEwNmZiMWExY2UpLCBDT05TVDY0KDB4MDMwNDhiOGQ4ZThmMDI4YyksCisgICAgQ09OU1Q2NCgweDU2YzhlMzRmMTkyYjY0N2QpLCBDT05TVDY0KDB4ZTc2OTk0NDdhMGZkYmExYSksIENPTlNUNjQoMHgxYWQzZGVlYWYwMGRlNzE3KSwgQ09OU1Q2NCgweDExM2NiYTk4ODk4NjFlOTcpLAorICAgIENPTlNUNjQoMHgyMjc4NjkyZDBmMTEzYzMzKSwgQ09OU1Q2NCgweDEyMzgzMTE1MDcwOTFjMWIpLCBDT05TVDY0KDB4YzUxMWZkNmFhZmVjODYyOSksIENPTlNUNjQoMHgyMDhiOWJkYmZiMTBjYjMwKSwKKyAgICBDT05TVDY0KDB4MzA0MDU4MzgwODE4MjAyOCksIENPTlNUNjQoMHg3ZWE4OTc2YjE1M2Y1NDQxKSwgQ09OU1Q2NCgweDJlNjg3ZjIzMGQxNzM0MzkpLCBDT05TVDY0KDB4MTgyMDJjMWMwNDBjMTAxNCksCisgICAgQ09OU1Q2NCgweDA2MDgwYjA3MDEwMzA0MDUpLCBDT05TVDY0KDB4NDUwN2FiMjE2NGFjOGRlOSksIENPTlNUNjQoMHhmOGI2Y2EyN2RmN2M1Yjg0KSwgQ09OU1Q2NCgweDI5OTcwZDVmNzY5YWM1YjMpLAorICAgIENPTlNUNjQoMHgwYmVmNjQ3Mjc5OGJmOTgwKSwgQ09OU1Q2NCgweGY0YTZkYzI5ZGQ3YTUzOGUpLCBDT05TVDY0KDB4OGVmNWIyYjMzZDQ3ZjRjOSksIENPTlNUNjQoMHg3NGIwOGE2MjE2M2E1ODRlKSwKKyAgICBDT05TVDY0KDB4ODJlNWE0YmQzZjQxZmNjMyksIENPTlNUNjQoMHhiMmE1ZmM4NTM3NTlkY2ViKSwgQ09OU1Q2NCgweDczNGZmODFlNmRiN2E5YzQpLCBDT05TVDY0KDB4OTBkZDk1YTgzODQ4ZTBkOCksCisgICAgQ09OU1Q2NCgweGIxYTE3NzA4YjlkNmRlNjcpLCBDT05TVDY0KDB4MzdiZjJhNDQ3Mzk1ZDFhMiksIENPTlNUNjQoMHg0YzFiM2RhNWU5MjY4MzZhKSwgQ09OU1Q2NCgweGJlYjVlYThiMzU1ZmQ0ZTEpLAorICAgIENPTlNUNjQoMHhlMzkyNmRiNjU1ZmY0OTFjKSwgQ09OU1Q2NCgweDNiYWYzYzRhNzE5M2Q5YTgpLCBDT05TVDY0KDB4MDdmZjcyN2M3YjhkZjE4YSksIENPTlNUNjQoMHgwZjE0OWQ4MzhjODkwYTg2KSwKKyAgICBDT05TVDY0KDB4MzFiNzIxNDM3Mjk2ZDVhNyksIENPTlNUNjQoMHgxNzM0YjE5Zjg4ODUxYTkyKSwgQ09OU1Q2NCgweDBlZTNlNGY4ZjYwN2ZmMDkpLCBDT05TVDY0KDB4ZmM0ZDMzZDYyYTdlYTg4MiksCisgICAgQ09OU1Q2NCgweDg0ZWRhZmJhM2U0MmY4YzYpLCBDT05TVDY0KDB4ZDljYTI4ODc1ZWUyNjUzYiksIENPTlNUNjQoMHhkMjI1NGNmNTI3Njk5Y2JiKSwgQ09OU1Q2NCgweDg5MGFjMGNmNDZjYTA1NDMpLAorICAgIENPTlNUNjQoMHgyODYwNzQyNDBjMTQzMDNjKSwgQ09OU1Q2NCgweDQzMGZhMDI2NjVhZjg5ZWMpLCBDT05TVDY0KDB4NmQ2N2RmMDU2OGI4YmRkNSksIENPTlNUNjQoMHg1YjJmOGMzYTYxYTM5OWY4KSwKKyAgICBDT05TVDY0KDB4MGExODFkMDkwMzA1MGMwZiksIENPTlNUNjQoMHhiYzQ2MTg3ZGMxNWUyM2UyKSwgQ09OU1Q2NCgweGVmODI3YmI4NTdmOTQxMTYpLCBDT05TVDY0KDB4Y2VmZTk5MThkNjY3N2ZhOSksCisgICAgQ09OU1Q2NCgweGVjODZmMDM1ZDk3NjQzOWEpLCBDT05TVDY0KDB4Y2RmYTEyOTU1OGU4N2QyNSksIENPTlNUNjQoMHhlYThlZmIzMmQ4NzU0NzlmKSwgQ09OU1Q2NCgweDQ5MTdiZDJmNjZhYTg1ZTMpLAorICAgIENPTlNUNjQoMHhjOGY2OTIxZmQ3NjQ3YmFjKSwgQ09OU1Q2NCgweDljY2Q4M2E2M2E0ZWU4ZDIpLCBDT05TVDY0KDB4OGEwZTRiNDJjODQ1MDdjZiksIENPTlNUNjQoMHg4OGZkYjliNDNjNDRmMGNjKSwKKyAgICBDT05TVDY0KDB4MjY4MzkwZGNmYTEzY2YzNSksIENPTlNUNjQoMHg1M2M0NjNjNTk2YTc2MmY0KSwgQ09OU1Q2NCgweGY1NTFhNTUyYTdmNGE2MDEpLCBDT05TVDY0KDB4NzdiNDAxZWY5OGI1NWFjMiksCisgICAgQ09OU1Q2NCgweDUyMzMxYWJlZWMyOTk3N2IpLCBDT05TVDY0KDB4YjdhOTdjMGZiOGQ1ZGE2MiksIENPTlNUNjQoMHhhODc2MjI2ZmM3NTQzYmZjKSwgQ09OU1Q2NCgweGMzMTlmNjZkYWVlZjgyMmMpLAorICAgIENPTlNUNjQoMHg2YjZmZDQwMjY5YmJiOWQwKSwgQ09OU1Q2NCgweGE3NjJiZmVjNGJkZDMxN2EpLCBDT05TVDY0KDB4ZGQzMWQxNzZhYmUwOTYzZCksIENPTlNUNjQoMHhkMTIxYzc3OGE5ZTY5ZTM3KSwKKyAgICBDT05TVDY0KDB4NGYxZmI2Mjg2N2E5ODFlNiksIENPTlNUNjQoMHgzYzUwNGUzNjBhMWUyODIyKSwgQ09OU1Q2NCgweDhmMDJjYmM4NDdjOTAxNDYpLCBDT05TVDY0KDB4MTZjM2M4ZTRmMjBiZWYxZCksCisgICAgQ09OU1Q2NCgweDk5YzEwMzJjYjVjMmVlNWIpLCBDT05TVDY0KDB4Y2MwZDZiZWUyMjY2ODhhYSksIENPTlNUNjQoMHg2NDdiNDk4MWU1MzJiMzU2KSwgQ09OU1Q2NCgweDVlMjMwY2IwZWUyZjlmNzEpLAorICAgIENPTlNUNjQoMHhhMzk5NDYxZGJlZGZjMjdjKSwgQ09OU1Q2NCgweGZhNDUzOGQxMmI3ZGFjODcpLCBDT05TVDY0KDB4MjE3Y2UyYTA4MTllM2ViZiksIENPTlNUNjQoMHg2YzkwYTY3ZTEyMzY0ODVhKSwKKyAgICBDT05TVDY0KDB4MmQ2Y2Y0YWU4Mzk4MzZiNSksIENPTlNUNjQoMHg1YWQ4ZjU0MTFiMmQ2Yzc3KSwgQ09OU1Q2NCgweDI0NzA2MjJhMGUxMjM4MzYpLCBDT05TVDY0KDB4Y2EwNTYwZTkyMzY1OGNhZiksCisgICAgQ09OU1Q2NCgweDA0ZmJmOWYxZjUwMmYzMDYpLCBDT05TVDY0KDB4ODMxMmRkYzY0NWNmMDk0YyksIENPTlNUNjQoMHhjNjE1NzZlNzIxNjM4NGE1KSwgQ09OU1Q2NCgweDllM2U3MTUwY2U0ZjFmZDEpLAorICAgIENPTlNUNjQoMHhhYjcyYTllMjQ5ZGIzOTcwKSwgQ09OU1Q2NCgweGU4N2QwOWM0MmM3NGIwOWMpLCBDT05TVDY0KDB4MmM5YjhkZDVmOTE2YzMzYSksIENPTlNUNjQoMHg2ZTYzNTQ4OGU2MzdiZjU5KSwKKyAgICBDT05TVDY0KDB4OTNkOTFlMjViNmM3ZTI1NCksIENPTlNUNjQoMHhmMDVkMjVkODI4NzhhMDg4KSwgQ09OU1Q2NCgweDcyYjg4MTY1MTczOTVjNGIpLCBDT05TVDY0KDB4MmI2NGZmYTk4MjliMzJiMCksCisgICAgQ09OU1Q2NCgweDVjZDBmZTQ2MWEyZTY4NzIpLCBDT05TVDY0KDB4MWQyY2FjOTY4YjgwMTY5ZCksIENPTlNUNjQoMHgzZWEzYmNjMGZlMWZkZjIxKSwgQ09OU1Q2NCgweDFiMjRhNzkxOGE4MzEyOTgpLAorICAgIENPTlNUNjQoMHgzNjQ4NTMzZjA5MWIyNDJkKSwgQ09OU1Q2NCgweDhjMDY0MDQ1Yzk0NjAzY2EpLCBDT05TVDY0KDB4MzU0Y2Q4YjI4Nzk0MjZhMSksIENPTlNUNjQoMHhiOTRhOThmNzRlZDIyNTZiKSwKKyAgICBDT05TVDY0KDB4N2M1YjY1OWRlMTNlYTM0MiksIENPTlNUNjQoMHhlNDZkMWZjYTJlNzJiODk2KSwgQ09OU1Q2NCgweDYyNzM0Mjg2ZTQzMWI3NTMpLCBDT05TVDY0KDB4N2E1MzZlOWFlMDNkYTc0NyksCisgICAgQ09OU1Q2NCgweDQwMGIyYmFiZWIyMDhiNjApLCBDT05TVDY0KDB4NDdmNDU5ZDc5MGFkN2FlYSksIENPTlNUNjQoMHhmZjQ5Yjg1YmE0ZjFhYTBlKSwgQ09OU1Q2NCgweDQ0ZjBkMjVhMWUyMjc4NjYpLAorICAgIENPTlNUNjQoMHgzOTVjY2ViYzg1OTIyZWFiKSwgQ09OU1Q2NCgweDVkMjc4NzNkNjBhMDlkZmQpLCBDT05TVDY0KDB4MDAwMDAwMDAwMDAwMDAwMCksIENPTlNUNjQoMHhkZTM1NWFmYjI1NmY5NGIxKSwKKyAgICBDT05TVDY0KDB4MDJmM2YyZjZmNDAxZjcwMyksIENPTlNUNjQoMHgxY2RiZDVlZGYxMGVlMzEyKSwgQ09OU1Q2NCgweDVmZDQ3NWNiOTRhMTZhZmUpLCBDT05TVDY0KDB4M2E1ODQ1MzEwYjFkMmMyNyksCisgICAgQ09OU1Q2NCgweDY4NmI1ZjhmZTczNGJiNWMpLCBDT05TVDY0KDB4MjM4ZjEwNTY3NTlmYzliYyksIENPTlNUNjQoMHg1ODJiMDdiN2VmMmM5Yjc0KSwgQ09OU1Q2NCgweGI4YmRlMThjMzQ1Y2QwZTQpLAorICAgIENPTlNUNjQoMHhhNjk1YzY5NzMxNTNjNGY1KSwgQ09OU1Q2NCgweGMyZWU4ZjE2ZDQ2MTc3YTMpLCBDT05TVDY0KDB4ZGFjZWEzMGFkMDZkNjdiNyksIENPTlNUNjQoMHgzMzQ0ZDNiNTg2OTcyMmE0KSwKKyAgICBDT05TVDY0KDB4MTlkNzU1Njc3ZTgyZTU5YiksIENPTlNUNjQoMHhjOTAxZWI2NGFkZWE4ZTIzKSwgQ09OU1Q2NCgweDM0YmJhMWM5ZmQxYWQzMmUpLCBDT05TVDY0KDB4ZjY1NTJlZGYyOTdiYTQ4ZCksCisgICAgQ09OU1Q2NCgweGEwOWRjZDkwMzA1MGMwZjApLCBDT05TVDY0KDB4OWFjNTg4YTEzYjRkZWNkNyksIENPTlNUNjQoMHg2NThjMzBmYTlmYmM0NmQ5KSwgQ09OU1Q2NCgweDJhOTM4NmQyZjgxNWM3M2YpLAorICAgIENPTlNUNjQoMHhhZTdlMjk2OGM2NTczZmY5KSwgQ09OU1Q2NCgweDZhOThhZDc5MTMzNTRjNWYpLCBDT05TVDY0KDB4MTQzMDNhMTIwNjBhMTgxZSksIENPTlNUNjQoMHgxZTI4MjcxYjA1MGYxNDExKSwKKyAgICBDT05TVDY0KDB4YTQ2NjM0NjFjNTUyMzNmNiksIENPTlNUNjQoMHg2Njg4YmI3NzExMzM0NDU1KSwgQ09OU1Q2NCgweDJmOWYwNjU4Nzc5OWMxYjYpLCBDT05TVDY0KDB4MTVjNzQzNjk3Yzg0ZWQ5MSksCisgICAgQ09OU1Q2NCgweDAxZjc3OTdiN2E4ZWY1OGYpLCBDT05TVDY0KDB4MGRlNzZmNzU3ODg4ZmQ4NSksIENPTlNUNjQoMHhiNGFkZjc4MjM2NWFkOGVlKSwgQ09OU1Q2NCgweDQ4ZTBjNDU0MWMyNDcwNmMpLAorICAgIENPTlNUNjQoMHg5NmQ1OWVhZjM5NGJlNGRkKSwgQ09OU1Q2NCgweGNiZjIxOTkyNTllYjc5MjApLCBDT05TVDY0KDB4NTBjMGU4NDgxODI4NjA3OCksIENPTlNUNjQoMHhlOThhNzBiZjU2ZmE0NTEzKSwKKyAgICBDT05TVDY0KDB4OGRmMTM5M2ViM2M4ZjY0NSksIENPTlNUNjQoMHg4N2U5MjQzN2IwY2RmYTRhKSwgQ09OU1Q2NCgweGQ4M2Q1MWZjMjQ2YzkwYjQpLCBDT05TVDY0KDB4YzAxZDdkZTAyMDYwODBhMCksCisgICAgQ09OU1Q2NCgweDhiZjkzMjM5YjJjYmYyNDApLCBDT05TVDY0KDB4NGJlNDRmZDk5MmFiNzJlMCksIENPTlNUNjQoMHhlZDcxODk0ZWEzZjhiNjE1KSwgQ09OU1Q2NCgweGJhNGUxMzdhYzA1ZDI3ZTcpLAorICAgIENPTlNUNjQoMHg4NTFhZDZjMTQ0Y2MwZDQ5KSwgQ09OU1Q2NCgweDUxMzc5MTMzNjJhNjk1ZjcpLCBDT05TVDY0KDB4NjA4MGIwNzAxMDMwNDA1MCksIENPTlNUNjQoMHg5ZmM5MDgyYmI0YzFlYTVlKSwKKyAgICBDT05TVDY0KDB4M2Y1NGM1YmI4NDkxMmFhZSksIENPTlNUNjQoMHg5NzIyZTdkNDQzYzUxMTUyKSwgQ09OU1Q2NCgweDRkZWM0NGRlOTNhODc2ZTUpLCBDT05TVDY0KDB4YjY1ZTA1NzRjMjViMmZlZCksCisgICAgQ09OU1Q2NCgweGExNmFiNGViNGFkZTM1N2YpLCBDT05TVDY0KDB4YTk4MTViMTRiZGRhY2U3MyksIENPTlNUNjQoMHgwNTBjODA4YThmOGMwNjg5KSwgQ09OU1Q2NCgweGVlNzUwMmMzMmQ3N2I0OTkpLAorICAgIENPTlNUNjQoMHhhZjg5NTAxM2JjZDljYTc2KSwgQ09OU1Q2NCgweDZmOTQyZGYzOWNiOTRhZDYpLCBDT05TVDY0KDB4NjE3N2M5MGI2YWJlYjVkZiksIENPTlNUNjQoMHg5ZDNhZmFkZDQwYzAxZDVkKSwKKyAgICBDT05TVDY0KDB4OTgzNjdhNTdjZjRjMWJkNCksIENPTlNUNjQoMHhlYjc5ODI0OWEyZmJiMjEwKSwgQ09OU1Q2NCgweDI3NzRlOWE3ODA5ZDNhYmEpLCBDT05TVDY0KDB4YmY0MjkzZjA0ZmQxMjE2ZSksCisgICAgQ09OU1Q2NCgweDQyZjhkOTVkMWYyMTdjNjMpLCBDT05TVDY0KDB4ODYxZTVkNGNjYTQzMGZjNSksIENPTlNUNjQoMHhkYjM5ZGE3MWFhZTM5MjM4KSwgQ09OU1Q2NCgweDkxMmFlY2QzNDJjNjE1NTcpLAorfTsKKworc3RhdGljIGNvbnN0IHVsb25nNjQgVDVbMjU2XSA9IHsKKyAgICBDT05TVDY0KDB4YjliYjAxNmFkM2JhNjhkMiksIENPTlNUNjQoMHg5YWU1YjE2NmZjNTQxOTRkKSwgQ09OU1Q2NCgweDY1ZTJjZDE0NzEyZjkzYmMpLCBDT05TVDY0KDB4ODcyNTUxMWI5Yzc0YjljZCksCisgICAgQ09OU1Q2NCgweGEyZjdhNDU3ZjU1MzAyNTEpLCBDT05TVDY0KDB4ZDZkMDAzYmU2OGQzYjg2YiksIENPTlNUNjQoMHhkZWQ2MDRiNTZiZDJiZDZmKSwgQ09OU1Q2NCgweDUyYjNmZTg1ZDc0ZDY0MjkpLAorICAgIENPTlNUNjQoMHhiYWZkYWQ0YWYwNTAwZDVkKSwgQ09OU1Q2NCgweDA5Y2Y2M2UwZTlhYzI2OGEpLCBDT05TVDY0KDB4MWMwOTg0OTY4YThkODMwZSksIENPTlNUNjQoMHg5MWE1MWE0ZGRjYmY3OWM2KSwKKyAgICBDT05TVDY0KDB4YTczZDRkMzc5MDcwYWRkZCksIENPTlNUNjQoMHhhYWYxYTM1Y2Y2NTIwNzU1KSwgQ09OU1Q2NCgweGE0N2JlMTE3YjM5YWM4NTIpLCBDT05TVDY0KDB4NWFiNWY5OGVkNDRjNjEyZCksCisgICAgQ09OU1Q2NCgweDAzNDZhYzIwMjNlYTY1OGYpLCBDT05TVDY0KDB4ZTZjNDExODQ2MmQ1YTY3MyksIENPTlNUNjQoMHhjYzU1YzI2OGE0OTdmMTY2KSwgQ09OU1Q2NCgweGM2ZGMwZGE4NmVkMWIyNjMpLAorICAgIENPTlNUNjQoMHg4NWFhOTlkMDU1MzNmZmNjKSwgQ09OU1Q2NCgweGIyZmJhYTQxZjM1MTA4NTkpLCBDT05TVDY0KDB4ZTJjNzljMGZlZDViMmE3MSksIENPTlNUNjQoMHg1OWYzNTVhZWY3YTYwNGEyKSwKKyAgICBDT05TVDY0KDB4YmVmZTIwYzE3ZmRlODE1ZiksIENPTlNUNjQoMHg3YWFkZTVhMmQ4NDg3NTNkKSwgQ09OU1Q2NCgweDI5ZDc3ZmNjZTVhODMyOWEpLCBDT05TVDY0KDB4YmM3MWU4MGFiNjk5Yzc1ZSksCisgICAgQ09OU1Q2NCgweDk2ZTAzYmU2NzBkYjkwNGIpLCBDT05TVDY0KDB4OGRhYzllZGI1NjMyZmFjOCksIENPTlNUNjQoMHhkMTk1MjIxNWM0Yjc1MWU2KSwgQ09OU1Q2NCgweGIzMzJjZWFhMTlmYzJiZDcpLAorICAgIENPTlNUNjQoMHg0YjcwOTM3MzM4ZTM0OGFiKSwgQ09OU1Q2NCgweDg0NjNmZDNiYmY5ZWRjNDIpLCBDT05TVDY0KDB4ZmM0MWQwNTJhZTkxZWY3ZSksIENPTlNUNjQoMHhhYzdkZTYxY2IwOWJjZDU2KSwKKyAgICBDT05TVDY0KDB4NDM3Njk0NzgzYmUyNGRhZiksIENPTlNUNjQoMHhiMWJkMDY2MWQwYmI2ZGQ2KSwgQ09OU1Q2NCgweDMyOWJkYWYxYzM0MTU4MTkpLCBDT05TVDY0KDB4NTc3OTE3ZTViMjZlY2JhNSksCisgICAgQ09OU1Q2NCgweDQxZjk1Y2IzZjJhNTBiYWUpLCBDT05TVDY0KDB4MTY4MDRiNTY0MGNiYzAwYiksIENPTlNUNjQoMHg3ZjY3MGNjMmJkNmJkYWIxKSwgQ09OU1Q2NCgweGRjNTljYzdlYTI5NWZiNmUpLAorICAgIENPTlNUNjQoMHg2MWUxNDA5ZmZlYTExZmJlKSwgQ09OU1Q2NCgweGNiMTBlM2MzMDhmMzE4ZWIpLCBDT05TVDY0KDB4ZTE4MTMwMmZjZWIxNGZmZSksIENPTlNUNjQoMHgxMDBjMGUxNjA2MDIwYTA4KSwKKyAgICBDT05TVDY0KDB4MmU5MjVlNjc0OWNjZGIxNyksIENPTlNUNjQoMHg2ZWEyNjYzZjUxYzRmMzM3KSwgQ09OU1Q2NCgweGU4NGU1M2NmMjcxZDY5NzQpLCBDT05TVDY0KDB4YTA3ODZjOWMzYzE0NDQ1MCksCisgICAgQ09OU1Q2NCgweDU2YjA3MzBlNThjM2U4MmIpLCBDT05TVDY0KDB4M2Y1NzM0OWFhNTYzZjI5MSksIENPTlNUNjQoMHg5ZWU2M2NlZDczZGE5NTRmKSwgQ09OU1Q2NCgweGQyZDM4ZTM1ZTc1ZDM0NjkpLAorICAgIENPTlNUNjQoMHhjMmRmODAyM2UxNWYzZTYxKSwgQ09OU1Q2NCgweGFlZjIyZWQ3NzlkYzhiNTcpLCBDT05TVDY0KDB4Y2YxMzZlNDg4NzdkOTRlOSksIENPTlNUNjQoMHgyNjk0NTk2YzRhY2RkZTEzKSwKKyAgICBDT05TVDY0KDB4ZGYxZjYwNWU4MTdmOWVlMSksIENPTlNUNjQoMHhlYWMxOWIwNGVlNWEyZjc1KSwgQ09OU1Q2NCgweDQ3NzUxOWYzYjQ2Y2MxYWQpLCBDT05TVDY0KDB4ZGFkNTg5M2VlNDVjMzE2ZCksCisgICAgQ09OU1Q2NCgweGViMDhmZmVmMDRmNzBjZmIpLCBDT05TVDY0KDB4MmRkNGYyNDc2YTI2YmU5OCksIENPTlNUNjQoMHhhYjM4YzdiNzFjZmYyNGRiKSwgQ09OU1Q2NCgweDNiNTRiOTExMmFlZDdlOTMpLAorICAgIENPTlNUNjQoMHgxMzRhYTIzNjI1ZTg2Zjg3KSwgQ09OU1Q2NCgweDljNjlmNDI2YmE5ZGQzNGUpLCBDT05TVDY0KDB4NWY3ZjEwZWViMTZmY2VhMSksIENPTlNUNjQoMHgwNDAzOGQ4YjhmOGU4YzAyKSwKKyAgICBDT05TVDY0KDB4Yzg1NjRmZTMyYjE5N2Q2NCksIENPTlNUNjQoMHg2OWU3NDc5NGZkYTAxYWJhKSwgQ09OU1Q2NCgweGQzMWFlYWRlMGRmMDE3ZTcpLCBDT05TVDY0KDB4M2MxMTk4YmE4Njg5OTcxZSksCisgICAgQ09OU1Q2NCgweDc4MjIyZDY5MTEwZjMzM2MpLCBDT05TVDY0KDB4MzgxMjE1MzEwOTA3MWIxYyksIENPTlNUNjQoMHgxMWM1NmFmZGVjYWYyOTg2KSwgQ09OU1Q2NCgweDhiMjBkYjliMTBmYjMwY2IpLAorICAgIENPTlNUNjQoMHg0MDMwMzg1ODE4MDgyODIwKSwgQ09OU1Q2NCgweGE4N2U2Yjk3M2YxNTQxNTQpLCBDT05TVDY0KDB4NjgyZTIzN2YxNzBkMzkzNCksIENPTlNUNjQoMHgyMDE4MWMyYzBjMDQxNDEwKSwKKyAgICBDT05TVDY0KDB4MDgwNjA3MGIwMzAxMDUwNCksIENPTlNUNjQoMHgwNzQ1MjFhYmFjNjRlOThkKSwgQ09OU1Q2NCgweGI2ZjgyN2NhN2NkZjg0NWIpLCBDT05TVDY0KDB4OTcyOTVmMGQ5YTc2YjNjNSksCisgICAgQ09OU1Q2NCgweGVmMGI3MjY0OGI3OTgwZjkpLCBDT05TVDY0KDB4YTZmNDI5ZGM3YWRkOGU1MyksIENPTlNUNjQoMHhmNThlYjNiMjQ3M2RjOWY0KSwgQ09OU1Q2NCgweGIwNzQ2MjhhM2ExNjRlNTgpLAorICAgIENPTlNUNjQoMHhlNTgyYmRhNDQxM2ZjM2ZjKSwgQ09OU1Q2NCgweGE1YjI4NWZjNTkzN2ViZGMpLCBDT05TVDY0KDB4NGY3MzFlZjhiNzZkYzRhOSksIENPTlNUNjQoMHhkZDkwYTg5NTQ4MzhkOGUwKSwKKyAgICBDT05TVDY0KDB4YTFiMTA4NzdkNmI5NjdkZSksIENPTlNUNjQoMHhiZjM3NDQyYTk1NzNhMmQxKSwgQ09OU1Q2NCgweDFiNGNhNTNkMjZlOTZhODMpLCBDT05TVDY0KDB4YjViZThiZWE1ZjM1ZTFkNCksCisgICAgQ09OU1Q2NCgweDkyZTNiNjZkZmY1NTFjNDkpLCBDT05TVDY0KDB4YWYzYjRhM2M5MzcxYThkOSksIENPTlNUNjQoMHhmZjA3N2M3MjhkN2I4YWYxKSwgQ09OU1Q2NCgweDE0MGY4MzlkODk4Yzg2MGEpLAorICAgIENPTlNUNjQoMHhiNzMxNDMyMTk2NzJhN2Q1KSwgQ09OU1Q2NCgweDM0MTc5ZmIxODU4ODkyMWEpLCBDT05TVDY0KDB4ZTMwZWY4ZTQwN2Y2MDlmZiksIENPTlNUNjQoMHg0ZGZjZDYzMzdlMmE4MmE4KSwKKyAgICBDT05TVDY0KDB4ZWQ4NGJhYWY0MjNlYzZmOCksIENPTlNUNjQoMHhjYWQ5ODcyOGUyNWUzYjY1KSwgQ09OU1Q2NCgweDI1ZDJmNTRjNjkyN2JiOWMpLCBDT05TVDY0KDB4MGE4OWNmYzBjYTQ2NDMwNSksCisgICAgQ09OU1Q2NCgweDYwMjgyNDc0MTQwYzNjMzApLCBDT05TVDY0KDB4MGY0MzI2YTBhZjY1ZWM4OSksIENPTlNUNjQoMHg2NzZkMDVkZmI4NjhkNWJkKSwgQ09OU1Q2NCgweDJmNWIzYThjYTM2MWY4OTkpLAorICAgIENPTlNUNjQoMHgxODBhMDkxZDA1MDMwZjBjKSwgQ09OU1Q2NCgweDQ2YmM3ZDE4NWVjMWUyMjMpLCBDT05TVDY0KDB4ODJlZmI4N2JmOTU3MTY0MSksIENPTlNUNjQoMHhmZWNlMTg5OTY3ZDZhOTdmKSwKKyAgICBDT05TVDY0KDB4ODZlYzM1ZjA3NmQ5OWE0MyksIENPTlNUNjQoMHhmYWNkOTUxMmU4NTgyNTdkKSwgQ09OU1Q2NCgweDhlZWEzMmZiNzVkODlmNDcpLCBDT05TVDY0KDB4MTc0OTJmYmRhYTY2ZTM4NSksCisgICAgQ09OU1Q2NCgweGY2YzgxZjkyNjRkN2FjN2IpLCBDT05TVDY0KDB4Y2Q5Y2E2ODM0ZTNhZDJlOCksIENPTlNUNjQoMHgwZThhNDI0YjQ1YzhjZjA3KSwgQ09OU1Q2NCgweGZkODhiNGI5NDQzY2NjZjApLAorICAgIENPTlNUNjQoMHg4MzI2ZGM5MDEzZmEzNWNmKSwgQ09OU1Q2NCgweGM0NTNjNTYzYTc5NmY0NjIpLCBDT05TVDY0KDB4NTFmNTUyYTVmNGE3MDFhNiksIENPTlNUNjQoMHhiNDc3ZWYwMWI1OThjMjVhKSwKKyAgICBDT05TVDY0KDB4MzM1MmJlMWEyOWVjN2I5NyksIENPTlNUNjQoMHhhOWI3MGY3Y2Q1Yjg2MmRhKSwgQ09OU1Q2NCgweDc2YTg2ZjIyNTRjN2ZjM2IpLCBDT05TVDY0KDB4MTljMzZkZjZlZmFlMmM4MiksCisgICAgQ09OU1Q2NCgweDZmNmIwMmQ0YmI2OWQwYjkpLCBDT05TVDY0KDB4NjJhN2VjYmZkZDRiN2EzMSksIENPTlNUNjQoMHgzMWRkNzZkMWUwYWIzZDk2KSwgQ09OU1Q2NCgweDIxZDE3OGM3ZTZhOTM3OWUpLAorICAgIENPTlNUNjQoMHgxZjRmMjhiNmE5NjdlNjgxKSwgQ09OU1Q2NCgweDUwM2MzNjRlMWUwYTIyMjgpLCBDT05TVDY0KDB4MDI4ZmM4Y2JjOTQ3NDYwMSksIENPTlNUNjQoMHhjMzE2ZTRjODBiZjIxZGVmKSwKKyAgICBDT05TVDY0KDB4YzE5OTJjMDNjMmI1NWJlZSksIENPTlNUNjQoMHgwZGNjZWU2YjY2MjJhYTg4KSwgQ09OU1Q2NCgweDdiNjQ4MTQ5MzJlNTU2YjMpLCBDT05TVDY0KDB4MjM1ZWIwMGMyZmVlNzE5ZiksCisgICAgQ09OU1Q2NCgweDk5YTMxZDQ2ZGZiZTdjYzIpLCBDT05TVDY0KDB4NDVmYWQxMzg3ZDJiODdhYyksIENPTlNUNjQoMHg3YzIxYTBlMjllODFiZjNlKSwgQ09OU1Q2NCgweDkwNmM3ZWE2MzYxMjVhNDgpLAorICAgIENPTlNUNjQoMHg2YzJkYWVmNDk4ODNiNTM2KSwgQ09OU1Q2NCgweGQ4NWE0MWY1MmQxYjc3NmMpLCBDT05TVDY0KDB4NzAyNDJhNjIxMjBlMzYzOCksIENPTlNUNjQoMHgwNWNhZTk2MDY1MjNhZjhjKSwKKyAgICBDT05TVDY0KDB4ZmIwNGYxZjkwMmY1MDZmMyksIENPTlNUNjQoMHgxMjgzYzZkZGNmNDU0YzA5KSwgQ09OU1Q2NCgweDE1YzZlNzc2NjMyMWE1ODQpLCBDT05TVDY0KDB4M2U5ZTUwNzE0ZmNlZDExZiksCisgICAgQ09OU1Q2NCgweDcyYWJlMmE5ZGI0OTcwMzkpLCBDT05TVDY0KDB4N2RlOGM0MDk3NDJjOWNiMCksIENPTlNUNjQoMHg5YjJjZDU4ZDE2ZjkzYWMzKSwgQ09OU1Q2NCgweDYzNmU4ODU0MzdlNjU5YmYpLAorICAgIENPTlNUNjQoMHhkOTkzMjUxZWM3YjY1NGUyKSwgQ09OU1Q2NCgweDVkZjBkODI1NzgyODg4YTApLCBDT05TVDY0KDB4Yjg3MjY1ODEzOTE3NGI1YyksIENPTlNUNjQoMHg2NDJiYTlmZjliODJiMDMyKSwKKyAgICBDT05TVDY0KDB4ZDA1YzQ2ZmUyZTFhNzI2OCksIENPTlNUNjQoMHgyYzFkOTZhYzgwOGI5ZDE2KSwgQ09OU1Q2NCgweGEzM2VjMGJjMWZmZTIxZGYpLCBDT05TVDY0KDB4MjQxYjkxYTc4MzhhOTgxMiksCisgICAgQ09OU1Q2NCgweDQ4MzYzZjUzMWIwOTJkMjQpLCBDT05TVDY0KDB4MDY4YzQ1NDA0NmM5Y2EwMyksIENPTlNUNjQoMHg0YzM1YjJkODk0ODdhMTI2KSwgQ09OU1Q2NCgweDRhYjlmNzk4ZDI0ZTZiMjUpLAorICAgIENPTlNUNjQoMHg1YjdjOWQ2NTNlZTE0MmEzKSwgQ09OU1Q2NCgweDZkZTRjYTFmNzIyZTk2YjgpLCBDT05TVDY0KDB4NzM2Mjg2NDIzMWU0NTNiNyksIENPTlNUNjQoMHg1MzdhOWE2ZTNkZTA0N2E3KSwKKyAgICBDT05TVDY0KDB4MGI0MGFiMmIyMGViNjA4YiksIENPTlNUNjQoMHhmNDQ3ZDc1OWFkOTBlYTdhKSwgQ09OU1Q2NCgweDQ5ZmY1YmI4ZjFhNDBlYWEpLCBDT05TVDY0KDB4ZjA0NDVhZDIyMjFlNjY3OCksCisgICAgQ09OU1Q2NCgweDVjMzliY2NlOTI4NWFiMmUpLCBDT05TVDY0KDB4Mjc1ZDNkODdhMDYwZmQ5ZCksIENPTlNUNjQoMHgwMDAwMDAwMDAwMDAwMDAwKSwgQ09OU1Q2NCgweDM1ZGVmYjVhNmYyNWIxOTQpLAorICAgIENPTlNUNjQoMHhmMzAyZjZmMjAxZjQwM2Y3KSwgQ09OU1Q2NCgweGRiMWNlZGQ1MGVmMTEyZTMpLCBDT05TVDY0KDB4ZDQ1ZmNiNzVhMTk0ZmU2YSksIENPTlNUNjQoMHg1ODNhMzE0NTFkMGIyNzJjKSwKKyAgICBDT05TVDY0KDB4NmI2ODhmNWYzNGU3NWNiYiksIENPTlNUNjQoMHg4ZjIzNTYxMDlmNzViY2M5KSwgQ09OU1Q2NCgweDJiNThiNzA3MmNlZjc0OWIpLCBDT05TVDY0KDB4YmRiODhjZTE1YzM0ZTRkMCksCisgICAgQ09OU1Q2NCgweDk1YTY5N2M2NTMzMWY1YzQpLCBDT05TVDY0KDB4ZWVjMjE2OGY2MWQ0YTM3NyksIENPTlNUNjQoMHhjZWRhMGFhMzZkZDBiNzY3KSwgQ09OU1Q2NCgweDQ0MzNiNWQzOTc4NmE0MjIpLAorICAgIENPTlNUNjQoMHhkNzE5Njc1NTgyN2U5YmU1KSwgQ09OU1Q2NCgweDAxYzk2NGViZWFhZDIzOGUpLCBDT05TVDY0KDB4YmIzNGM5YTExYWZkMmVkMyksIENPTlNUNjQoMHg1NWY2ZGYyZTdiMjk4ZGE0KSwKKyAgICBDT05TVDY0KDB4OWRhMDkwY2Q1MDMwZjBjMCksIENPTlNUNjQoMHhjNTlhYTE4ODRkM2JkN2VjKSwgQ09OU1Q2NCgweDhjNjVmYTMwYmM5ZmQ5NDYpLCBDT05TVDY0KDB4OTMyYWQyODYxNWY4M2ZjNyksCisgICAgQ09OU1Q2NCgweDdlYWU2ODI5NTdjNmY5M2YpLCBDT05TVDY0KDB4OTg2YTc5YWQzNTEzNWY0YyksIENPTlNUNjQoMHgzMDE0MTIzYTBhMDYxZTE4KSwgQ09OU1Q2NCgweDI4MWUxYjI3MGYwNTExMTQpLAorICAgIENPTlNUNjQoMHg2NmE0NjEzNDUyYzVmNjMzKSwgQ09OU1Q2NCgweDg4NjY3N2JiMzMxMTU1NDQpLCBDT05TVDY0KDB4OWYyZjU4MDY5OTc3YjZjMSksIENPTlNUNjQoMHhjNzE1Njk0Mzg0N2M5MWVkKSwKKyAgICBDT05TVDY0KDB4ZjcwMTdiNzk4ZTdhOGZmNSksIENPTlNUNjQoMHhlNzBkNzU2Zjg4Nzg4NWZkKSwgQ09OU1Q2NCgweGFkYjQ4MmY3NWEzNmVlZDgpLCBDT05TVDY0KDB4ZTA0ODU0YzQyNDFjNmM3MCksCisgICAgQ09OU1Q2NCgweGQ1OTZhZjllNGIzOWRkZTQpLCBDT05TVDY0KDB4ZjJjYjkyMTllYjU5MjA3OSksIENPTlNUNjQoMHhjMDUwNDhlODI4MTg3ODYwKSwgQ09OU1Q2NCgweDhhZTliZjcwZmE1NjEzNDUpLAorICAgIENPTlNUNjQoMHhmMThkM2UzOWM4YjM0NWY2KSwgQ09OU1Q2NCgweGU5ODczNzI0Y2RiMDRhZmEpLCBDT05TVDY0KDB4M2RkOGZjNTE2YzI0YjQ5MCksIENPTlNUNjQoMHgxZGMwZTA3ZDYwMjBhMDgwKSwKKyAgICBDT05TVDY0KDB4Zjk4YjM5MzJjYmIyNDBmMiksIENPTlNUNjQoMHhlNDRiZDk0ZmFiOTJlMDcyKSwgQ09OU1Q2NCgweDcxZWQ0ZTg5ZjhhMzE1YjYpLCBDT05TVDY0KDB4NGViYTdhMTM1ZGMwZTcyNyksCisgICAgQ09OU1Q2NCgweDFhODVjMWQ2Y2M0NDQ5MGQpLCBDT05TVDY0KDB4Mzc1MTMzOTFhNjYyZjc5NSksIENPTlNUNjQoMHg4MDYwNzBiMDMwMTA1MDQwKSwgQ09OU1Q2NCgweGM5OWYyYjA4YzFiNDVlZWEpLAorICAgIENPTlNUNjQoMHg1NDNmYmJjNTkxODRhZTJhKSwgQ09OU1Q2NCgweDIyOTdkNGU3YzU0MzUyMTEpLCBDT05TVDY0KDB4ZWM0ZGRlNDRhODkzZTU3NiksIENPTlNUNjQoMHg1ZWI2NzQwNTViYzJlZDJmKSwKKyAgICBDT05TVDY0KDB4NmFhMWViYjRkZTRhN2YzNSksIENPTlNUNjQoMHg4MWE5MTQ1YmRhYmQ3M2NlKSwgQ09OU1Q2NCgweDBjMDU4YTgwOGM4Zjg5MDYpLCBDT05TVDY0KDB4NzVlZWMzMDI3NzJkOTliNCksCisgICAgQ09OU1Q2NCgweDg5YWYxMzUwZDliYzc2Y2EpLCBDT05TVDY0KDB4OTQ2ZmYzMmRiOTljZDY0YSksIENPTlNUNjQoMHg3NzYxMGJjOWJlNmFkZmI1KSwgQ09OU1Q2NCgweDNhOWRkZGZhYzA0MDVkMWQpLAorICAgIENPTlNUNjQoMHgzNjk4NTc3YTRjY2ZkNDFiKSwgQ09OU1Q2NCgweDc5ZWI0OTgyZmJhMjEwYjIpLCBDT05TVDY0KDB4NzQyN2E3ZTk5ZDgwYmEzYSksIENPTlNUNjQoMHg0MmJmZjA5M2QxNGY2ZTIxKSwKKyAgICBDT05TVDY0KDB4Zjg0MjVkZDkyMTFmNjM3YyksIENPTlNUNjQoMHgxZTg2NGM1ZDQzY2FjNTBmKSwgQ09OU1Q2NCgweDM5ZGI3MWRhZTNhYTM4OTIpLCBDT05TVDY0KDB4MmE5MWQzZWNjNjQyNTcxNSksCit9OworCitzdGF0aWMgY29uc3QgdWxvbmc2NCBUNlsyNTZdID0geworICAgIENPTlNUNjQoMHg2YTAxYmJiOWQyNjhiYWQzKSwgQ09OU1Q2NCgweDY2YjFlNTlhNGQxOTU0ZmMpLCBDT05TVDY0KDB4MTRjZGUyNjViYzkzMmY3MSksIENPTlNUNjQoMHgxYjUxMjU4N2NkYjk3NDljKSwKKyAgICBDT05TVDY0KDB4NTdhNGY3YTI1MTAyNTNmNSksIENPTlNUNjQoMHhiZTAzZDBkNjZiYjhkMzY4KSwgQ09OU1Q2NCgweGI1MDRkNmRlNmZiZGQyNmIpLCBDT05TVDY0KDB4ODVmZWIzNTIyOTY0NGRkNyksCisgICAgQ09OU1Q2NCgweDRhYWRmZGJhNWQwZDUwZjApLCBDT05TVDY0KDB4ZTA2M2NmMDk4YTI2YWNlOSksIENPTlNUNjQoMHg5Njg0MDkxYzBlODM4ZDhhKSwgQ09OU1Q2NCgweDRkMWFhNTkxYzY3OWJmZGMpLAorICAgIENPTlNUNjQoMHgzNzRkM2RhN2RkYWQ3MDkwKSwgQ09OU1Q2NCgweDVjYTNmMWFhNTUwNzUyZjYpLCBDT05TVDY0KDB4MTdlMTdiYTQ1MmM4OWFiMyksIENPTlNUNjQoMHg4ZWY5YjU1YTJkNjE0Y2Q0KSwKKyAgICBDT05TVDY0KDB4MjBhYzQ2MDM4ZjY1ZWEyMyksIENPTlNUNjQoMHg4NDExYzRlNjczYTZkNTYyKSwgQ09OU1Q2NCgweDY4YzI1NWNjNjZmMTk3YTQpLCBDT05TVDY0KDB4YTgwZGRjYzY2M2IyZDE2ZSksCisgICAgQ09OU1Q2NCgweGQwOTlhYTg1Y2NmZjMzNTUpLCBDT05TVDY0KDB4NDFhYWZiYjI1OTA4NTFmMyksIENPTlNUNjQoMHgwZjljYzdlMjcxMmE1YmVkKSwgQ09OU1Q2NCgweGFlNTVmMzU5YTIwNGE2ZjcpLAorICAgIENPTlNUNjQoMHhjMTIwZmViZTVmODFkZTdmKSwgQ09OU1Q2NCgweGEyZTVhZDdhM2Q3NTQ4ZDgpLCBDT05TVDY0KDB4Y2M3ZmQ3Mjk5YTMyYThlNSksIENPTlNUNjQoMHgwYWU4NzFiYzVlYzc5OWI2KSwKKyAgICBDT05TVDY0KDB4ZTYzYmUwOTY0YjkwZGI3MCksIENPTlNUNjQoMHhkYjllYWM4ZGM4ZmEzMjU2KSwgQ09OU1Q2NCgweDE1MjI5NWQxZTY1MWI3YzQpLCBDT05TVDY0KDB4YWFjZTMyYjNkNzJiZmMxOSksCisgICAgQ09OU1Q2NCgweDczOTM3MDRiYWI0OGUzMzgpLCBDT05TVDY0KDB4M2JmZDYzODQ0MmRjOWViZiksIENPTlNUNjQoMHg1MmQwNDFmYzdlZWY5MWFlKSwgQ09OU1Q2NCgweDFjZTY3ZGFjNTZjZDliYjApLAorICAgIENPTlNUNjQoMHg3ODk0NzY0M2FmNGRlMjNiKSwgQ09OU1Q2NCgweDYxMDZiZGIxZDY2ZGJiZDApLCBDT05TVDY0KDB4ZjFkYTliMzIxOTU4NDFjMyksIENPTlNUNjQoMHhlNTE3Nzk1N2E1Y2I2ZWIyKSwKKyAgICBDT05TVDY0KDB4YjM1Y2Y5NDFhZTBiYTVmMiksIENPTlNUNjQoMHg1NjRiODAxNjBiYzBjYjQwKSwgQ09OU1Q2NCgweGMyMGM2NzdmYjFkYTZiYmQpLCBDT05TVDY0KDB4N2VjYzU5ZGM2ZWZiOTVhMiksCisgICAgQ09OU1Q2NCgweDlmNDBlMTYxYmUxZmExZmUpLCBDT05TVDY0KDB4YzNlMzEwY2JlYjE4ZjMwOCksIENPTlNUNjQoMHgyZjMwODFlMWZlNGZiMWNlKSwgQ09OU1Q2NCgweDE2MGUwYzEwMDgwYTAyMDYpLAorICAgIENPTlNUNjQoMHg2NzVlOTIyZTE3ZGJjYzQ5KSwgQ09OU1Q2NCgweDNmNjZhMjZlMzdmM2M0NTEpLCBDT05TVDY0KDB4Y2Y1MzRlZTg3NDY5MWQyNyksIENPTlNUNjQoMHg5YzZjNzhhMDUwNDQxNDNjKSwKKyAgICBDT05TVDY0KDB4MGU3M2IwNTYyYmU4YzM1OCksIENPTlNUNjQoMHg5YTM0NTczZjkxZjI2M2E1KSwgQ09OU1Q2NCgweGVkM2NlNjllNGY5NWRhNzMpLCBDT05TVDY0KDB4MzU4ZWQzZDI2OTM0NWRlNyksCisgICAgQ09OU1Q2NCgweDIzODBkZmMyNjEzZTVmZTEpLCBDT05TVDY0KDB4ZDcyZWYyYWU1NzhiZGM3OSksIENPTlNUNjQoMHg0ODZlMTNjZmU5OTQ3ZDg3KSwgQ09OU1Q2NCgweDZjNTk5NDI2MTNkZWNkNGEpLAorICAgIENPTlNUNjQoMHg1ZTYwMWZkZmUxOWU3ZjgxKSwgQ09OU1Q2NCgweDA0OWJjMWVhNzUyZjVhZWUpLCBDT05TVDY0KDB4ZjMxOTc1NDdhZGMxNmNiNCksIENPTlNUNjQoMHgzZTg5ZDVkYTZkMzE1Y2U0KSwKKyAgICBDT05TVDY0KDB4ZWZmZjA4ZWJmYjBjZjcwNCksIENPTlNUNjQoMHg0N2YyZDQyZDk4YmUyNjZhKSwgQ09OU1Q2NCgweGI3YzczOGFiZGIyNGZmMWMpLCBDT05TVDY0KDB4MTFiOTU0M2I5MzdlZWQyYSksCisgICAgQ09OU1Q2NCgweDM2YTI0YTEzODc2ZmU4MjUpLCBDT05TVDY0KDB4MjZmNDY5OWM0ZWQzOWRiYSksIENPTlNUNjQoMHhlZTEwN2Y1ZmExY2U2ZmIxKSwgQ09OU1Q2NCgweDhiOGQwMzA0MDI4YzhlOGYpLAorICAgIENPTlNUNjQoMHhlMzRmNTZjODY0N2QxOTJiKSwgQ09OU1Q2NCgweDk0NDdlNzY5YmExYWEwZmQpLCBDT05TVDY0KDB4ZGVlYTFhZDNlNzE3ZjAwZCksIENPTlNUNjQoMHhiYTk4MTEzYzFlOTc4OTg2KSwKKyAgICBDT05TVDY0KDB4NjkyZDIyNzgzYzMzMGYxMSksIENPTlNUNjQoMHgzMTE1MTIzODFjMWIwNzA5KSwgQ09OU1Q2NCgweGZkNmFjNTExODYyOWFmZWMpLCBDT05TVDY0KDB4OWJkYjIwOGJjYjMwZmIxMCksCisgICAgQ09OU1Q2NCgweDU4MzgzMDQwMjAyODA4MTgpLCBDT05TVDY0KDB4OTc2YjdlYTg1NDQxMTUzZiksIENPTlNUNjQoMHg3ZjIzMmU2ODM0MzkwZDE3KSwgQ09OU1Q2NCgweDJjMWMxODIwMTAxNDA0MGMpLAorICAgIENPTlNUNjQoMHgwYjA3MDYwODA0MDUwMTAzKSwgQ09OU1Q2NCgweGFiMjE0NTA3OGRlOTY0YWMpLCBDT05TVDY0KDB4Y2EyN2Y4YjY1Yjg0ZGY3YyksIENPTlNUNjQoMHgwZDVmMjk5N2M1YjM3NjlhKSwKKyAgICBDT05TVDY0KDB4NjQ3MjBiZWZmOTgwNzk4YiksIENPTlNUNjQoMHhkYzI5ZjRhNjUzOGVkZDdhKSwgQ09OU1Q2NCgweGIyYjM4ZWY1ZjRjOTNkNDcpLCBDT05TVDY0KDB4OGE2Mjc0YjA1ODRlMTYzYSksCisgICAgQ09OU1Q2NCgweGE0YmQ4MmU1ZmNjMzNmNDEpLCBDT05TVDY0KDB4ZmM4NWIyYTVkY2ViMzc1OSksIENPTlNUNjQoMHhmODFlNzM0ZmE5YzQ2ZGI3KSwgQ09OU1Q2NCgweDk1YTg5MGRkZTBkODM4NDgpLAorICAgIENPTlNUNjQoMHg3NzA4YjFhMWRlNjdiOWQ2KSwgQ09OU1Q2NCgweDJhNDQzN2JmZDFhMjczOTUpLCBDT05TVDY0KDB4M2RhNTRjMWI4MzZhZTkyNiksIENPTlNUNjQoMHhlYThiYmViNWQ0ZTEzNTVmKSwKKyAgICBDT05TVDY0KDB4NmRiNmUzOTI0OTFjNTVmZiksIENPTlNUNjQoMHgzYzRhM2JhZmQ5YTg3MTkzKSwgQ09OU1Q2NCgweDcyN2MwN2ZmZjE4YTdiOGQpLCBDT05TVDY0KDB4OWQ4MzBmMTQwYTg2OGM4OSksCisgICAgQ09OU1Q2NCgweDIxNDMzMWI3ZDVhNzcyOTYpLCBDT05TVDY0KDB4YjE5ZjE3MzQxYTkyODg4NSksIENPTlNUNjQoMHhlNGY4MGVlM2ZmMDlmNjA3KSwgQ09OU1Q2NCgweDMzZDZmYzRkYTg4MjJhN2UpLAorICAgIENPTlNUNjQoMHhhZmJhODRlZGY4YzYzZTQyKSwgQ09OU1Q2NCgweDI4ODdkOWNhNjUzYjVlZTIpLCBDT05TVDY0KDB4NGNmNWQyMjU5Y2JiMjc2OSksIENPTlNUNjQoMHhjMGNmODkwYTA1NDM0NmNhKSwKKyAgICBDT05TVDY0KDB4NzQyNDI4NjAzMDNjMGMxNCksIENPTlNUNjQoMHhhMDI2NDMwZjg5ZWM2NWFmKSwgQ09OU1Q2NCgweGRmMDU2ZDY3YmRkNTY4YjgpLCBDT05TVDY0KDB4OGMzYTViMmY5OWY4NjFhMyksCisgICAgQ09OU1Q2NCgweDFkMDkwYTE4MGMwZjAzMDUpLCBDT05TVDY0KDB4MTg3ZGJjNDYyM2UyYzE1ZSksIENPTlNUNjQoMHg3YmI4ZWY4MjQxMTY1N2Y5KSwgQ09OU1Q2NCgweDk5MThjZWZlN2ZhOWQ2NjcpLAorICAgIENPTlNUNjQoMHhmMDM1ZWM4NjQzOWFkOTc2KSwgQ09OU1Q2NCgweDEyOTVjZGZhN2QyNTU4ZTgpLCBDT05TVDY0KDB4ZmIzMmVhOGU0NzlmZDg3NSksIENPTlNUNjQoMHhiZDJmNDkxNzg1ZTM2NmFhKSwKKyAgICBDT05TVDY0KDB4OTIxZmM4ZjY3YmFjZDc2NCksIENPTlNUNjQoMHg4M2E2OWNjZGU4ZDIzYTRlKSwgQ09OU1Q2NCgweDRiNDI4YTBlMDdjZmM4NDUpLCBDT05TVDY0KDB4YjliNDg4ZmRmMGNjM2M0NCksCisgICAgQ09OU1Q2NCgweDkwZGMyNjgzY2YzNWZhMTMpLCBDT05TVDY0KDB4NjNjNTUzYzQ2MmY0OTZhNyksIENPTlNUNjQoMHhhNTUyZjU1MWE2MDFhN2Y0KSwgQ09OU1Q2NCgweDAxZWY3N2I0NWFjMjk4YjUpLAorICAgIENPTlNUNjQoMHgxYWJlNTIzMzk3N2JlYzI5KSwgQ09OU1Q2NCgweDdjMGZiN2E5ZGE2MmI4ZDUpLCBDT05TVDY0KDB4MjI2ZmE4NzYzYmZjYzc1NCksIENPTlNUNjQoMHhmNjZkYzMxOTgyMmNhZWVmKSwKKyAgICBDT05TVDY0KDB4ZDQwMjZiNmZiOWQwNjliYiksIENPTlNUNjQoMHhiZmVjYTc2MjMxN2E0YmRkKSwgQ09OU1Q2NCgweGQxNzZkZDMxOTYzZGFiZTApLCBDT05TVDY0KDB4Yzc3OGQxMjE5ZTM3YTllNiksCisgICAgQ09OU1Q2NCgweGI2Mjg0ZjFmODFlNjY3YTkpLCBDT05TVDY0KDB4NGUzNjNjNTAyODIyMGExZSksIENPTlNUNjQoMHhjYmM4OGYwMjAxNDY0N2M5KSwgQ09OU1Q2NCgweGM4ZTQxNmMzZWYxZGYyMGIpLAorICAgIENPTlNUNjQoMHgwMzJjOTljMWVlNWJiNWMyKSwgQ09OU1Q2NCgweDZiZWVjYzBkODhhYTIyNjYpLCBDT05TVDY0KDB4NDk4MTY0N2JiMzU2ZTUzMiksIENPTlNUNjQoMHgwY2IwNWUyMzlmNzFlZTJmKSwKKyAgICBDT05TVDY0KDB4NDYxZGEzOTljMjdjYmVkZiksIENPTlNUNjQoMHgzOGQxZmE0NWFjODcyYjdkKSwgQ09OU1Q2NCgweGUyYTAyMTdjM2ViZjgxOWUpLCBDT05TVDY0KDB4YTY3ZTZjOTA0ODVhMTIzNiksCisgICAgQ09OU1Q2NCgweGY0YWUyZDZjMzZiNTgzOTgpLCBDT05TVDY0KDB4ZjU0MTVhZDg2Yzc3MWIyZCksIENPTlNUNjQoMHg2MjJhMjQ3MDM4MzYwZTEyKSwgQ09OU1Q2NCgweDYwZTljYTA1OGNhZjIzNjUpLAorICAgIENPTlNUNjQoMHhmOWYxMDRmYmYzMDZmNTAyKSwgQ09OU1Q2NCgweGRkYzY4MzEyMDk0YzQ1Y2YpLCBDT05TVDY0KDB4NzZlN2M2MTU4NGE1MjE2MyksIENPTlNUNjQoMHg3MTUwOWUzZTFmZDFjZTRmKSwKKyAgICBDT05TVDY0KDB4YTllMmFiNzIzOTcwNDlkYiksIENPTlNUNjQoMHgwOWM0ZTg3ZGIwOWMyYzc0KSwgQ09OU1Q2NCgweDhkZDUyYzliYzMzYWY5MTYpLCBDT05TVDY0KDB4NTQ4ODZlNjNiZjU5ZTYzNyksCisgICAgQ09OU1Q2NCgweDFlMjU5M2Q5ZTI1NGI2YzcpLCBDT05TVDY0KDB4MjVkOGYwNWRhMDg4Mjg3OCksIENPTlNUNjQoMHg4MTY1NzJiODVjNGIxNzM5KSwgQ09OU1Q2NCgweGZmYTkyYjY0MzJiMDgyOWIpLAorICAgIENPTlNUNjQoMHhmZTQ2NWNkMDY4NzIxYTJlKSwgQ09OU1Q2NCgweGFjOTYxZDJjMTY5ZDhiODApLCBDT05TVDY0KDB4YmNjMDNlYTNkZjIxZmUxZiksIENPTlNUNjQoMHhhNzkxMWIyNDEyOTg4YTgzKSwKKyAgICBDT05TVDY0KDB4NTMzZjM2NDgyNDJkMDkxYiksIENPTlNUNjQoMHg0MDQ1OGMwNjAzY2FjOTQ2KSwgQ09OU1Q2NCgweGQ4YjIzNTRjMjZhMTg3OTQpLCBDT05TVDY0KDB4OThmN2I5NGEyNTZiNGVkMiksCisgICAgQ09OU1Q2NCgweDY1OWQ3YzViYTM0MmUxM2UpLCBDT05TVDY0KDB4MWZjYWU0NmRiODk2MmU3MiksIENPTlNUNjQoMHg0Mjg2NjI3M2I3NTNlNDMxKSwgQ09OU1Q2NCgweDZlOWE3YTUzYTc0N2UwM2QpLAorICAgIENPTlNUNjQoMHgyYmFiNDAwYjhiNjBlYjIwKSwgQ09OU1Q2NCgweDU5ZDc0N2Y0N2FlYTkwYWQpLCBDT05TVDY0KDB4Yjg1YmZmNDlhYTBlYTRmMSksIENPTlNUNjQoMHhkMjVhNDRmMDc4NjYxZTIyKSwKKyAgICBDT05TVDY0KDB4Y2ViYzM5NWMyZWFiODU5MiksIENPTlNUNjQoMHg4NzNkNWQyNzlkZmQ2MGEwKSwgQ09OU1Q2NCgweDAwMDAwMDAwMDAwMDAwMDApLCBDT05TVDY0KDB4NWFmYmRlMzU5NGIxMjU2ZiksCisgICAgQ09OU1Q2NCgweGYyZjYwMmYzZjcwM2Y0MDEpLCBDT05TVDY0KDB4ZDVlZDFjZGJlMzEyZjEwZSksIENPTlNUNjQoMHg3NWNiNWZkNDZhZmU5NGExKSwgQ09OU1Q2NCgweDQ1MzEzYTU4MmMyNzBiMWQpLAorICAgIENPTlNUNjQoMHg1ZjhmNjg2YmJiNWNlNzM0KSwgQ09OU1Q2NCgweDEwNTYyMzhmYzliYzc1OWYpLCBDT05TVDY0KDB4MDdiNzU4MmI5Yjc0ZWYyYyksIENPTlNUNjQoMHhlMThjYjhiZGQwZTQzNDVjKSwKKyAgICBDT05TVDY0KDB4YzY5N2E2OTVjNGY1MzE1MyksIENPTlNUNjQoMHg4ZjE2YzJlZTc3YTNkNDYxKSwgQ09OU1Q2NCgweGEzMGFkYWNlNjdiN2QwNmQpLCBDT05TVDY0KDB4ZDNiNTMzNDQyMmE0ODY5NyksCisgICAgQ09OU1Q2NCgweDU1NjcxOWQ3ZTU5YjdlODIpLCBDT05TVDY0KDB4ZWI2NGM5MDE4ZTIzYWRlYSksIENPTlNUNjQoMHhhMWM5MzRiYmQzMmVmZDFhKSwgQ09OU1Q2NCgweDJlZGZmNjU1YTQ4ZDI5N2IpLAorICAgIENPTlNUNjQoMHhjZDkwYTA5ZGMwZjAzMDUwKSwgQ09OU1Q2NCgweDg4YTE5YWM1ZWNkNzNiNGQpLCBDT05TVDY0KDB4MzBmYTY1OGM0NmQ5OWZiYyksIENPTlNUNjQoMHg4NmQyMmE5M2M3M2ZmODE1KSwKKyAgICBDT05TVDY0KDB4Mjk2OGFlN2UzZmY5YzY1NyksIENPTlNUNjQoMHhhZDc5NmE5ODRjNWYxMzM1KSwgQ09OU1Q2NCgweDNhMTIxNDMwMTgxZTA2MGEpLCBDT05TVDY0KDB4MjcxYjFlMjgxNDExMDUwZiksCisgICAgQ09OU1Q2NCgweDM0NjFhNDY2MzNmNmM1NTIpLCBDT05TVDY0KDB4YmI3NzY2ODg0NDU1MTEzMyksIENPTlNUNjQoMHgwNjU4MmY5ZmMxYjY3Nzk5KSwgQ09OU1Q2NCgweDQzNjkxNWM3ZWQ5MTdjODQpLAorICAgIENPTlNUNjQoMHg3OTdiMDFmN2Y1OGY3YThlKSwgQ09OU1Q2NCgweDZmNzUwZGU3ZmQ4NTc4ODgpLCBDT05TVDY0KDB4Zjc4MmI0YWRkOGVlMzY1YSksIENPTlNUNjQoMHhjNDU0NDhlMDcwNmMxYzI0KSwKKyAgICBDT05TVDY0KDB4OWVhZjk2ZDVlNGRkMzk0YiksIENPTlNUNjQoMHgxOTkyY2JmMjc5MjA1OWViKSwgQ09OU1Q2NCgweGU4NDg1MGMwNjA3ODE4MjgpLCBDT05TVDY0KDB4NzBiZmU5OGE0NTEzNTZmYSksCisgICAgQ09OU1Q2NCgweDM5M2U4ZGYxZjY0NWIzYzgpLCBDT05TVDY0KDB4MjQzNzg3ZTlmYTRhYjBjZCksIENPTlNUNjQoMHg1MWZjZDgzZDkwYjQyNDZjKSwgQ09OU1Q2NCgweDdkZTBjMDFkODBhMDIwNjApLAorICAgIENPTlNUNjQoMHgzMjM5OGJmOWYyNDBiMmNiKSwgQ09OU1Q2NCgweDRmZDk0YmU0NzJlMDkyYWIpLCBDT05TVDY0KDB4ODk0ZWVkNzFiNjE1YTNmOCksIENPTlNUNjQoMHgxMzdhYmE0ZTI3ZTdjMDVkKSwKKyAgICBDT05TVDY0KDB4ZDZjMTg1MWEwZDQ5NDRjYyksIENPTlNUNjQoMHg5MTMzNTEzNzk1Zjc2MmE2KSwgQ09OU1Q2NCgweGIwNzA2MDgwNDA1MDEwMzApLCBDT05TVDY0KDB4MDgyYjlmYzllYTVlYjRjMSksCisgICAgQ09OU1Q2NCgweGM1YmIzZjU0MmFhZTg0OTEpLCBDT05TVDY0KDB4ZTdkNDk3MjIxMTUyNDNjNSksIENPTlNUNjQoMHg0NGRlNGRlYzc2ZTU5M2E4KSwgQ09OU1Q2NCgweDA1NzRiNjVlMmZlZGMyNWIpLAorICAgIENPTlNUNjQoMHhiNGViYTE2YTM1N2Y0YWRlKSwgQ09OU1Q2NCgweDViMTRhOTgxY2U3M2JkZGEpLCBDT05TVDY0KDB4ODA4YTA1MGMwNjg5OGY4YyksIENPTlNUNjQoMHgwMmMzZWU3NWI0OTkyZDc3KSwKKyAgICBDT05TVDY0KDB4NTAxM2FmODljYTc2YmNkOSksIENPTlNUNjQoMHgyZGYzNmY5NDRhZDY5Y2I5KSwgQ09OU1Q2NCgweGM5MGI2MTc3YjVkZjZhYmUpLCBDT05TVDY0KDB4ZmFkZDlkM2ExZDVkNDBjMCksCisgICAgQ09OU1Q2NCgweDdhNTc5ODM2MWJkNGNmNGMpLCBDT05TVDY0KDB4ODI0OWViNzliMjEwYTJmYiksIENPTlNUNjQoMHhlOWE3Mjc3NDNhYmE4MDlkKSwgQ09OU1Q2NCgweDkzZjBiZjQyMjE2ZTRmZDEpLAorICAgIENPTlNUNjQoMHhkOTVkNDJmODdjNjMxZjIxKSwgQ09OU1Q2NCgweDVkNGM4NjFlMGZjNWNhNDMpLCBDT05TVDY0KDB4ZGE3MWRiMzk5MjM4YWFlMyksIENPTlNUNjQoMHhlY2QzOTEyYTE1NTc0MmM2KSwKK307CisKK3N0YXRpYyBjb25zdCB1bG9uZzY0IFQ3WzI1Nl0gPSB7CisgICAgQ09OU1Q2NCgweDAxNmFiOWJiNjhkMmQzYmEpLCBDT05TVDY0KDB4YjE2NjlhZTUxOTRkZmM1NCksIENPTlNUNjQoMHhjZDE0NjVlMjkzYmM3MTJmKSwgQ09OU1Q2NCgweDUxMWI4NzI1YjljZDljNzQpLAorICAgIENPTlNUNjQoMHhhNDU3YTJmNzAyNTFmNTUzKSwgQ09OU1Q2NCgweDAzYmVkNmQwYjg2YjY4ZDMpLCBDT05TVDY0KDB4MDRiNWRlZDZiZDZmNmJkMiksIENPTlNUNjQoMHhmZTg1NTJiMzY0MjlkNzRkKSwKKyAgICBDT05TVDY0KDB4YWQ0YWJhZmQwZDVkZjA1MCksIENPTlNUNjQoMHg2M2UwMDljZjI2OGFlOWFjKSwgQ09OU1Q2NCgweDg0OTYxYzA5ODMwZThhOGQpLCBDT05TVDY0KDB4MWE0ZDkxYTU3OWM2ZGNiZiksCisgICAgQ09OU1Q2NCgweDRkMzdhNzNkYWRkZDkwNzApLCBDT05TVDY0KDB4YTM1Y2FhZjEwNzU1ZjY1MiksIENPTlNUNjQoMHhlMTE3YTQ3YmM4NTJiMzlhKSwgQ09OU1Q2NCgweGY5OGU1YWI1NjEyZGQ0NGMpLAorICAgIENPTlNUNjQoMHhhYzIwMDM0NjY1OGYyM2VhKSwgQ09OU1Q2NCgweDExODRlNmM0YTY3MzYyZDUpLCBDT05TVDY0KDB4YzI2OGNjNTVmMTY2YTQ5NyksIENPTlNUNjQoMHgwZGE4YzZkY2IyNjM2ZWQxKSwKKyAgICBDT05TVDY0KDB4OTlkMDg1YWFmZmNjNTUzMyksIENPTlNUNjQoMHhhYTQxYjJmYjA4NTlmMzUxKSwgQ09OU1Q2NCgweDljMGZlMmM3MmE3MWVkNWIpLCBDT05TVDY0KDB4NTVhZTU5ZjMwNGEyZjdhNiksCisgICAgQ09OU1Q2NCgweDIwYzFiZWZlODE1ZjdmZGUpLCBDT05TVDY0KDB4ZTVhMjdhYWQ3NTNkZDg0OCksIENPTlNUNjQoMHg3ZmNjMjlkNzMyOWFlNWE4KSwgQ09OU1Q2NCgweGU4MGFiYzcxYzc1ZWI2OTkpLAorICAgIENPTlNUNjQoMHgzYmU2OTZlMDkwNGI3MGRiKSwgQ09OU1Q2NCgweDllZGI4ZGFjZmFjODU2MzIpLCBDT05TVDY0KDB4MjIxNWQxOTU1MWU2YzRiNyksIENPTlNUNjQoMHhjZWFhYjMzMjJiZDcxOWZjKSwKKyAgICBDT05TVDY0KDB4OTM3MzRiNzA0OGFiMzhlMyksIENPTlNUNjQoMHhmZDNiODQ2M2RjNDJiZjllKSwgQ09OU1Q2NCgweGQwNTJmYzQxZWY3ZWFlOTEpLCBDT05TVDY0KDB4ZTYxY2FjN2RjZDU2YjA5YiksCisgICAgQ09OU1Q2NCgweDk0Nzg0Mzc2NGRhZjNiZTIpLCBDT05TVDY0KDB4MDY2MWIxYmQ2ZGQ2ZDBiYiksIENPTlNUNjQoMHhkYWYxMzI5YjU4MTljMzQxKSwgQ09OU1Q2NCgweDE3ZTU1Nzc5Y2JhNWIyNmUpLAorICAgIENPTlNUNjQoMHg1Y2IzNDFmOTBiYWVmMmE1KSwgQ09OU1Q2NCgweDRiNTYxNjgwYzAwYjQwY2IpLCBDT05TVDY0KDB4MGNjMjdmNjdkYWIxYmQ2YiksIENPTlNUNjQoMHhjYzdlZGM1OWZiNmVhMjk1KSwKKyAgICBDT05TVDY0KDB4NDA5ZjYxZTExZmJlZmVhMSksIENPTlNUNjQoMHhlM2MzY2IxMDE4ZWIwOGYzKSwgQ09OU1Q2NCgweDMwMmZlMTgxNGZmZWNlYjEpLCBDT05TVDY0KDB4MGUxNjEwMGMwYTA4MDYwMiksCisgICAgQ09OU1Q2NCgweDVlNjcyZTkyZGIxNzQ5Y2MpLCBDT05TVDY0KDB4NjYzZjZlYTJmMzM3NTFjNCksIENPTlNUNjQoMHg1M2NmZTg0ZTY5NzQyNzFkKSwgQ09OU1Q2NCgweDZjOWNhMDc4NDQ1MDNjMTQpLAorICAgIENPTlNUNjQoMHg3MzBlNTZiMGU4MmI1OGMzKSwgQ09OU1Q2NCgweDM0OWEzZjU3ZjI5MWE1NjMpLCBDT05TVDY0KDB4M2NlZDllZTY5NTRmNzNkYSksIENPTlNUNjQoMHg4ZTM1ZDJkMzM0NjllNzVkKSwKKyAgICBDT05TVDY0KDB4ODAyM2MyZGYzZTYxZTE1ZiksIENPTlNUNjQoMHgyZWQ3YWVmMjhiNTc3OWRjKSwgQ09OU1Q2NCgweDZlNDhjZjEzOTRlOTg3N2QpLCBDT05TVDY0KDB4NTk2YzI2OTRkZTEzNGFjZCksCisgICAgQ09OU1Q2NCgweDYwNWVkZjFmOWVlMTgxN2YpLCBDT05TVDY0KDB4OWIwNGVhYzEyZjc1ZWU1YSksIENPTlNUNjQoMHgxOWYzNDc3NWMxYWRiNDZjKSwgQ09OU1Q2NCgweDg5M2VkYWQ1MzE2ZGU0NWMpLAorICAgIENPTlNUNjQoMHhmZmVmZWIwODBjZmIwNGY3KSwgQ09OU1Q2NCgweGYyNDcyZGQ0YmU5ODZhMjYpLCBDT05TVDY0KDB4YzdiN2FiMzgyNGRiMWNmZiksIENPTlNUNjQoMHhiOTExM2I1NDdlOTMyYWVkKSwKKyAgICBDT05TVDY0KDB4YTIzNjEzNGE2Zjg3MjVlOCksIENPTlNUNjQoMHhmNDI2OWM2OWQzNGViYTlkKSwgQ09OU1Q2NCgweDEwZWU1ZjdmY2VhMWIxNmYpLCBDT05TVDY0KDB4OGQ4YjA0MDM4YzAyOGY4ZSksCisgICAgQ09OU1Q2NCgweDRmZTNjODU2N2Q2NDJiMTkpLCBDT05TVDY0KDB4NDc5NDY5ZTcxYWJhZmRhMCksIENPTlNUNjQoMHhlYWRlZDMxYTE3ZTcwZGYwKSwgQ09OU1Q2NCgweDk4YmEzYzExOTcxZTg2ODkpLAorICAgIENPTlNUNjQoMHgyZDY5NzgyMjMzM2MxMTBmKSwgQ09OU1Q2NCgweDE1MzEzODEyMWIxYzA5MDcpLCBDT05TVDY0KDB4NmFmZDExYzUyOTg2ZWNhZiksIENPTlNUNjQoMHhkYjliOGIyMDMwY2IxMGZiKSwKKyAgICBDT05TVDY0KDB4Mzg1ODQwMzAyODIwMTgwOCksIENPTlNUNjQoMHg2Yjk3YTg3ZTQxNTQzZjE1KSwgQ09OU1Q2NCgweDIzN2Y2ODJlMzkzNDE3MGQpLCBDT05TVDY0KDB4MWMyYzIwMTgxNDEwMGMwNCksCisgICAgQ09OU1Q2NCgweDA3MGIwODA2MDUwNDAzMDEpLCBDT05TVDY0KDB4MjFhYjA3NDVlOThkYWM2NCksIENPTlNUNjQoMHgyN2NhYjZmODg0NWI3Y2RmKSwgQ09OU1Q2NCgweDVmMGQ5NzI5YjNjNTlhNzYpLAorICAgIENPTlNUNjQoMHg3MjY0ZWYwYjgwZjk4Yjc5KSwgQ09OU1Q2NCgweDI5ZGNhNmY0OGU1MzdhZGQpLCBDT05TVDY0KDB4YjNiMmY1OGVjOWY0NDczZCksIENPTlNUNjQoMHg2MjhhYjA3NDRlNTgzYTE2KSwKKyAgICBDT05TVDY0KDB4YmRhNGU1ODJjM2ZjNDEzZiksIENPTlNUNjQoMHg4NWZjYTViMmViZGM1OTM3KSwgQ09OU1Q2NCgweDFlZjg0ZjczYzRhOWI3NmQpLCBDT05TVDY0KDB4YTg5NWRkOTBkOGUwNDgzOCksCisgICAgQ09OU1Q2NCgweDA4NzdhMWIxNjdkZWQ2YjkpLCBDT05TVDY0KDB4NDQyYWJmMzdhMmQxOTU3MyksIENPTlNUNjQoMHhhNTNkMWI0YzZhODMyNmU5KSwgQ09OU1Q2NCgweDhiZWFiNWJlZTFkNDVmMzUpLAorICAgIENPTlNUNjQoMHhiNjZkOTJlMzFjNDlmZjU1KSwgQ09OU1Q2NCgweDRhM2NhZjNiYThkOTkzNzEpLCBDT05TVDY0KDB4N2M3MmZmMDc4YWYxOGQ3YiksIENPTlNUNjQoMHg4MzlkMTQwZjg2MGE4OThjKSwKKyAgICBDT05TVDY0KDB4NDMyMWI3MzFhN2Q1OTY3MiksIENPTlNUNjQoMHg5ZmIxMzQxNzkyMWE4NTg4KSwgQ09OU1Q2NCgweGY4ZTRlMzBlMDlmZjA3ZjYpLCBDT05TVDY0KDB4ZDYzMzRkZmM4MmE4N2UyYSksCisgICAgQ09OU1Q2NCgweGJhYWZlZDg0YzZmODQyM2UpLCBDT05TVDY0KDB4ODcyOGNhZDkzYjY1ZTI1ZSksIENPTlNUNjQoMHhmNTRjMjVkMmJiOWM2OTI3KSwgQ09OU1Q2NCgweGNmYzAwYTg5NDMwNWNhNDYpLAorICAgIENPTlNUNjQoMHgyNDc0NjAyODNjMzAxNDBjKSwgQ09OU1Q2NCgweDI2YTAwZjQzZWM4OWFmNjUpLCBDT05TVDY0KDB4MDVkZjY3NmRkNWJkYjg2OCksIENPTlNUNjQoMHgzYThjMmY1YmY4OTlhMzYxKSwKKyAgICBDT05TVDY0KDB4MDkxZDE4MGEwZjBjMDUwMyksIENPTlNUNjQoMHg3ZDE4NDZiY2UyMjM1ZWMxKSwgQ09OU1Q2NCgweGI4N2I4MmVmMTY0MWY5NTcpLCBDT05TVDY0KDB4MTg5OWZlY2VhOTdmNjdkNiksCisgICAgQ09OU1Q2NCgweDM1ZjA4NmVjOWE0Mzc2ZDkpLCBDT05TVDY0KDB4OTUxMmZhY2QyNTdkZTg1OCksIENPTlNUNjQoMHgzMmZiOGVlYTlmNDc3NWQ4KSwgQ09OU1Q2NCgweDJmYmQxNzQ5ZTM4NWFhNjYpLAorICAgIENPTlNUNjQoMHgxZjkyZjZjOGFjN2I2NGQ3KSwgQ09OU1Q2NCgweGE2ODNjZDljZDJlODRlM2EpLCBDT05TVDY0KDB4NDI0YjBlOGFjZjA3NDVjOCksIENPTlNUNjQoMHhiNGI5ZmQ4OGNjZjA0NDNjKSwKKyAgICBDT05TVDY0KDB4ZGM5MDgzMjYzNWNmMTNmYSksIENPTlNUNjQoMHhjNTYzYzQ1M2Y0NjJhNzk2KSwgQ09OU1Q2NCgweDUyYTU1MWY1MDFhNmY0YTcpLCBDT05TVDY0KDB4ZWYwMWI0NzdjMjVhYjU5OCksCisgICAgQ09OU1Q2NCgweGJlMWEzMzUyN2I5NzI5ZWMpLCBDT05TVDY0KDB4MGY3Y2E5Yjc2MmRhZDViOCksIENPTlNUNjQoMHg2ZjIyNzZhOGZjM2I1NGM3KSwgQ09OU1Q2NCgweDZkZjYxOWMzMmM4MmVmYWUpLAorICAgIENPTlNUNjQoMHgwMmQ0NmY2YmQwYjliYjY5KSwgQ09OU1Q2NCgweGVjYmY2MmE3N2EzMWRkNGIpLCBDT05TVDY0KDB4NzZkMTMxZGQzZDk2ZTBhYiksIENPTlNUNjQoMHg3OGM3MjFkMTM3OWVlNmE5KSwKKyAgICBDT05TVDY0KDB4MjhiNjFmNGZlNjgxYTk2NyksIENPTlNUNjQoMHgzNjRlNTAzYzIyMjgxZTBhKSwgQ09OU1Q2NCgweGM4Y2IwMjhmNDYwMWM5NDcpLCBDT05TVDY0KDB4ZTRjOGMzMTYxZGVmMGJmMiksCisgICAgQ09OU1Q2NCgweDJjMDNjMTk5NWJlZWMyYjUpLCBDT05TVDY0KDB4ZWU2YjBkY2NhYTg4NjYyMiksIENPTlNUNjQoMHg4MTQ5N2I2NDU2YjMzMmU1KSwgQ09OU1Q2NCgweGIwMGMyMzVlNzE5ZjJmZWUpLAorICAgIENPTlNUNjQoMHgxZDQ2OTlhMzdjYzJkZmJlKSwgQ09OU1Q2NCgweGQxMzg0NWZhODdhYzdkMmIpLCBDT05TVDY0KDB4YTBlMjdjMjFiZjNlOWU4MSksIENPTlNUNjQoMHg3ZWE2OTA2YzVhNDgzNjEyKSwKKyAgICBDT05TVDY0KDB4YWVmNDZjMmRiNTM2OTg4MyksIENPTlNUNjQoMHg0MWY1ZDg1YTc3NmMyZDFiKSwgQ09OU1Q2NCgweDJhNjI3MDI0MzYzODEyMGUpLCBDT05TVDY0KDB4ZTk2MDA1Y2FhZjhjNjUyMyksCisgICAgQ09OU1Q2NCgweGYxZjlmYjA0MDZmMzAyZjUpLCBDT05TVDY0KDB4YzZkZDEyODM0YzA5Y2Y0NSksIENPTlNUNjQoMHhlNzc2MTVjNmE1ODQ2MzIxKSwgQ09OU1Q2NCgweDUwNzEzZTllZDExZjRmY2UpLAorICAgIENPTlNUNjQoMHhlMmE5NzJhYjcwMzlkYjQ5KSwgQ09OU1Q2NCgweGM0MDk3ZGU4OWNiMDc0MmMpLCBDT05TVDY0KDB4ZDU4ZDliMmMzYWMzMTZmOSksIENPTlNUNjQoMHg4ODU0NjM2ZTU5YmYzN2U2KSwKKyAgICBDT05TVDY0KDB4MjUxZWQ5OTM1NGUyYzdiNiksIENPTlNUNjQoMHhkODI1NWRmMDg4YTA3ODI4KSwgQ09OU1Q2NCgweDY1ODFiODcyNGI1YzM5MTcpLCBDT05TVDY0KDB4YTlmZjY0MmJiMDMyOWI4MiksCisgICAgQ09OU1Q2NCgweDQ2ZmVkMDVjNzI2ODJlMWEpLCBDT05TVDY0KDB4OTZhYzJjMWQ5ZDE2ODA4YiksIENPTlNUNjQoMHhjMGJjYTMzZTIxZGYxZmZlKSwgQ09OU1Q2NCgweDkxYTcyNDFiOTgxMjgzOGEpLAorICAgIENPTlNUNjQoMHgzZjUzNDgzNjJkMjQxYjA5KSwgQ09OU1Q2NCgweDQ1NDAwNjhjY2EwMzQ2YzkpLCBDT05TVDY0KDB4YjJkODRjMzVhMTI2OTQ4NyksIENPTlNUNjQoMHhmNzk4NGFiOTZiMjVkMjRlKSwKKyAgICBDT05TVDY0KDB4OWQ2NTViN2M0MmEzM2VlMSksIENPTlNUNjQoMHhjYTFmNmRlNDk2Yjg3MjJlKSwgQ09OU1Q2NCgweDg2NDI3MzYyNTNiNzMxZTQpLCBDT05TVDY0KDB4OWE2ZTUzN2E0N2E3M2RlMCksCisgICAgQ09OU1Q2NCgweGFiMmIwYjQwNjA4YjIwZWIpLCBDT05TVDY0KDB4ZDc1OWY0NDdlYTdhYWQ5MCksIENPTlNUNjQoMHg1YmI4NDlmZjBlYWFmMWE0KSwgQ09OU1Q2NCgweDVhZDJmMDQ0NjY3ODIyMWUpLAorICAgIENPTlNUNjQoMHhiY2NlNWMzOWFiMmU5Mjg1KSwgQ09OU1Q2NCgweDNkODcyNzVkZmQ5ZGEwNjApLCBDT05TVDY0KDB4MDAwMDAwMDAwMDAwMDAwMCksIENPTlNUNjQoMHhmYjVhMzVkZWIxOTQ2ZjI1KSwKKyAgICBDT05TVDY0KDB4ZjZmMmYzMDIwM2Y3MDFmNCksIENPTlNUNjQoMHhlZGQ1ZGIxYzEyZTMwZWYxKSwgQ09OU1Q2NCgweGNiNzVkNDVmZmU2YWExOTQpLCBDT05TVDY0KDB4MzE0NTU4M2EyNzJjMWQwYiksCisgICAgQ09OU1Q2NCgweDhmNWY2YjY4NWNiYjM0ZTcpLCBDT05TVDY0KDB4NTYxMDhmMjNiY2M5OWY3NSksIENPTlNUNjQoMHhiNzA3MmI1ODc0OWIyY2VmKSwgQ09OU1Q2NCgweDhjZTFiZGI4ZTRkMDVjMzQpLAorICAgIENPTlNUNjQoMHg5N2M2OTVhNmY1YzQ1MzMxKSwgQ09OU1Q2NCgweDE2OGZlZWMyYTM3NzYxZDQpLCBDT05TVDY0KDB4MGFhM2NlZGFiNzY3NmRkMCksIENPTlNUNjQoMHhiNWQzNDQzM2E0MjI5Nzg2KSwKKyAgICBDT05TVDY0KDB4Njc1NWQ3MTk5YmU1ODI3ZSksIENPTlNUNjQoMHg2NGViMDFjOTIzOGVlYWFkKSwgQ09OU1Q2NCgweGM5YTFiYjM0MmVkMzFhZmQpLCBDT05TVDY0KDB4ZGYyZTU1ZjY4ZGE0N2IyOSksCisgICAgQ09OU1Q2NCgweDkwY2Q5ZGEwZjBjMDUwMzApLCBDT05TVDY0KDB4YTE4OGM1OWFkN2VjNGQzYiksIENPTlNUNjQoMHhmYTMwOGM2NWQ5NDZiYzlmKSwgQ09OU1Q2NCgweGQyODY5MzJhM2ZjNzE1ZjgpLAorICAgIENPTlNUNjQoMHg2ODI5N2VhZWY5M2Y1N2M2KSwgQ09OU1Q2NCgweDc5YWQ5ODZhNWY0YzM1MTMpLCBDT05TVDY0KDB4MTIzYTMwMTQxZTE4MGEwNiksIENPTlNUNjQoMHgxYjI3MjgxZTExMTQwZjA1KSwKKyAgICBDT05TVDY0KDB4NjEzNDY2YTRmNjMzNTJjNSksIENPTlNUNjQoMHg3N2JiODg2NjU1NDQzMzExKSwgQ09OU1Q2NCgweDU4MDY5ZjJmYjZjMTk5NzcpLCBDT05TVDY0KDB4Njk0M2M3MTU5MWVkODQ3YyksCisgICAgQ09OU1Q2NCgweDdiNzlmNzAxOGZmNThlN2EpLCBDT05TVDY0KDB4NzU2ZmU3MGQ4NWZkODg3OCksIENPTlNUNjQoMHg4MmY3YWRiNGVlZDg1YTM2KSwgQ09OU1Q2NCgweDU0YzRlMDQ4NmM3MDI0MWMpLAorICAgIENPTlNUNjQoMHhhZjllZDU5NmRkZTQ0YjM5KSwgQ09OU1Q2NCgweDkyMTlmMmNiMjA3OWViNTkpLCBDT05TVDY0KDB4NDhlOGMwNTA3ODYwMjgxOCksIENPTlNUNjQoMHhiZjcwOGFlOTEzNDVmYTU2KSwKKyAgICBDT05TVDY0KDB4M2UzOWYxOGQ0NWY2YzhiMyksIENPTlNUNjQoMHgzNzI0ZTk4NzRhZmFjZGIwKSwgQ09OU1Q2NCgweGZjNTEzZGQ4YjQ5MDZjMjQpLCBDT05TVDY0KDB4ZTA3ZDFkYzBhMDgwNjAyMCksCisgICAgQ09OU1Q2NCgweDM5MzJmOThiNDBmMmNiYjIpLCBDT05TVDY0KDB4ZDk0ZmU0NGJlMDcyYWI5MiksIENPTlNUNjQoMHg0ZTg5NzFlZDE1YjZmOGEzKSwgQ09OU1Q2NCgweDdhMTM0ZWJhZTcyNzVkYzApLAorICAgIENPTlNUNjQoMHhjMWQ2MWE4NTQ5MGRjYzQ0KSwgQ09OU1Q2NCgweDMzOTEzNzUxZjc5NWE2NjIpLCBDT05TVDY0KDB4NzBiMDgwNjA1MDQwMzAxMCksIENPTlNUNjQoMHgyYjA4Yzk5ZjVlZWFjMWI0KSwKKyAgICBDT05TVDY0KDB4YmJjNTU0M2ZhZTJhOTE4NCksIENPTlNUNjQoMHhkNGU3MjI5NzUyMTFjNTQzKSwgQ09OU1Q2NCgweGRlNDRlYzRkZTU3NmE4OTMpLCBDT05TVDY0KDB4NzQwNTVlYjZlZDJmNWJjMiksCisgICAgQ09OU1Q2NCgweGViYjQ2YWExN2YzNWRlNGEpLCBDT05TVDY0KDB4MTQ1YjgxYTk3M2NlZGFiZCksIENPTlNUNjQoMHg4YTgwMGMwNTg5MDY4YzhmKSwgQ09OU1Q2NCgweGMzMDI3NWVlOTliNDc3MmQpLAorICAgIENPTlNUNjQoMHgxMzUwODlhZjc2Y2FkOWJjKSwgQ09OU1Q2NCgweGYzMmQ5NDZmZDY0YWI5OWMpLCBDT05TVDY0KDB4MGJjOTc3NjFkZmI1YmU2YSksIENPTlNUNjQoMHhkZGZhM2E5ZDVkMWRjMDQwKSwKKyAgICBDT05TVDY0KDB4NTc3YTM2OThkNDFiNGNjZiksIENPTlNUNjQoMHg0OTgyNzllYjEwYjJmYmEyKSwgQ09OU1Q2NCgweGE3ZTk3NDI3YmEzYTlkODApLCBDT05TVDY0KDB4ZjA5MzQyYmY2ZTIxZDE0ZiksCisgICAgQ09OU1Q2NCgweDVkZDlmODQyNjM3YzIxMWYpLCBDT05TVDY0KDB4NGM1ZDFlODZjNTBmNDNjYSksIENPTlNUNjQoMHg3MWRhMzlkYjM4OTJlM2FhKSwgQ09OU1Q2NCgweGQzZWMyYTkxNTcxNWM2NDIpLAorfTsKKworc3RhdGljIGNvbnN0IHVsb25nNjQgY1tSICsgMV0gPSB7CisgICAgQ09OU1Q2NCgweGJhNTQyZjc0NTNkM2QyNGQpLAorICAgIENPTlNUNjQoMHg1MGFjOGRiZjcwNTI5YTRjKSwKKyAgICBDT05TVDY0KDB4ZWFkNTk3ZDEzMzUxNWJhNiksCisgICAgQ09OU1Q2NCgweGRlNDhhODk5ZGIzMmI3ZmMpLAorICAgIENPTlNUNjQoMHhlMzllOTE5YmUyYmI0MTZlKSwKKyAgICBDT05TVDY0KDB4YTVjYjZiOTVhMWYzYjEwMiksCisgICAgQ09OU1Q2NCgweGNjYzQxZDE0YzM2M2RhNWQpLAorICAgIENPTlNUNjQoMHg1ZmRjN2RjZDdmNWE2YzVjKSwKKyAgICBDT05TVDY0KDB4ZjcyNmZmZWRlODlkNmY4ZSksCit9OworCisgLyoqCisgICAgSW5pdGlhbGl6ZSB0aGUgS2hhemFkIGJsb2NrIGNpcGhlcgorICAgIEBwYXJhbSBrZXkgVGhlIHN5bW1ldHJpYyBrZXkgeW91IHdpc2ggdG8gcGFzcworICAgIEBwYXJhbSBrZXlsZW4gVGhlIGtleSBsZW5ndGggaW4gYnl0ZXMKKyAgICBAcGFyYW0gbnVtX3JvdW5kcyBUaGUgbnVtYmVyIG9mIHJvdW5kcyBkZXNpcmVkICgwIGZvciBkZWZhdWx0KQorICAgIEBwYXJhbSBza2V5IFRoZSBrZXkgaW4gYXMgc2NoZWR1bGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgKi8KK2ludCBraGF6YWRfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSkKK3sKKyAgIGludCAgICAgICAgICAgICAgIHI7CisgICBjb25zdCB1bG9uZzY0ICAgICpTOworICAgdWxvbmc2NCAgICAgICAgICAgSzIsIEsxOworCisgICBMVENfQVJHQ0hLKGtleSAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CisgICBpZiAoa2V5bGVuICE9IDE2KSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOworICAgfQorICAgaWYgKG51bV9yb3VuZHMgIT0gOCAmJiBudW1fcm91bmRzICE9IDApIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1JPVU5EUzsKKyAgIH0KKworICAgLyogdXNlIDd0aCB0YWJsZSAqLworICAgUyA9IFQ3OworCisgICAgLyoKKyAgICAqIG1hcCB1bnNpZ25lZCBjaGFyIGFycmF5IGNpcGhlciBrZXkgdG8gaW5pdGlhbCBrZXkgc3RhdGUgKG11KToKKyAgICAqLworICAgSzIgPQorICAgICAgKCh1bG9uZzY0KWtleVsgMF0gPDwgNTYpIF4KKyAgICAgICgodWxvbmc2NClrZXlbIDFdIDw8IDQ4KSBeCisgICAgICAoKHVsb25nNjQpa2V5WyAyXSA8PCA0MCkgXgorICAgICAgKCh1bG9uZzY0KWtleVsgM10gPDwgMzIpIF4KKyAgICAgICgodWxvbmc2NClrZXlbIDRdIDw8IDI0KSBeCisgICAgICAoKHVsb25nNjQpa2V5WyA1XSA8PCAxNikgXgorICAgICAgKCh1bG9uZzY0KWtleVsgNl0gPDwgIDgpIF4KKyAgICAgICgodWxvbmc2NClrZXlbIDddICAgICAgKTsKKyAgIEsxID0KKyAgICAgICgodWxvbmc2NClrZXlbIDhdIDw8IDU2KSBeCisgICAgICAoKHVsb25nNjQpa2V5WyA5XSA8PCA0OCkgXgorICAgICAgKCh1bG9uZzY0KWtleVsxMF0gPDwgNDApIF4KKyAgICAgICgodWxvbmc2NClrZXlbMTFdIDw8IDMyKSBeCisgICAgICAoKHVsb25nNjQpa2V5WzEyXSA8PCAyNCkgXgorICAgICAgKCh1bG9uZzY0KWtleVsxM10gPDwgMTYpIF4KKyAgICAgICgodWxvbmc2NClrZXlbMTRdIDw8ICA4KSBeCisgICAgICAoKHVsb25nNjQpa2V5WzE1XSAgICAgICk7CisKKyAgIC8qCisgICAgKiBjb21wdXRlIHRoZSByb3VuZCBrZXlzOgorICAgICovCisgICBmb3IgKHIgPSAwOyByIDw9IFI7IHIrKykgeworICAgICAgLyoKKyAgICAgICAqIEtbcl0gPSByaG8oY1tyXSwgSzEpIF4gSzI7CisgICAgICAgKi8KKyAgICAgIHNrZXktPmtoYXphZC5yb3VuZEtleUVuY1tyXSA9CisgICAgICAgICBUMFsoaW50KShLMSA+PiA1NikgICAgICAgXSBeCisgICAgICAgICBUMVsoaW50KShLMSA+PiA0OCkgJiAweGZmXSBeCisgICAgICAgICBUMlsoaW50KShLMSA+PiA0MCkgJiAweGZmXSBeCisgICAgICAgICBUM1soaW50KShLMSA+PiAzMikgJiAweGZmXSBeCisgICAgICAgICBUNFsoaW50KShLMSA+PiAyNCkgJiAweGZmXSBeCisgICAgICAgICBUNVsoaW50KShLMSA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICBUNlsoaW50KShLMSA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICBUN1soaW50KShLMSAgICAgICkgJiAweGZmXSBeCisgICAgICAgICBjW3JdIF4gSzI7CisgICAgICBLMiA9IEsxOyBLMSA9IHNrZXktPmtoYXphZC5yb3VuZEtleUVuY1tyXTsKKyAgIH0KKyAgIC8qCisgICAgKiBjb21wdXRlIHRoZSBpbnZlcnNlIGtleSBzY2hlZHVsZToKKyAgICAqIEsnXjAgPSBLXlIsIEsnXlIgPSBLXjAsIEsnXnIgPSB0aGV0YShLXntSLXJ9KQorICAgICovCisgICBza2V5LT5raGF6YWQucm91bmRLZXlEZWNbMF0gPSBza2V5LT5raGF6YWQucm91bmRLZXlFbmNbUl07CisgICBmb3IgKHIgPSAxOyByIDwgUjsgcisrKSB7CisgICAgICBLMSA9IHNrZXktPmtoYXphZC5yb3VuZEtleUVuY1tSIC0gcl07CisgICAgICBza2V5LT5raGF6YWQucm91bmRLZXlEZWNbcl0gPQorICAgICAgICAgVDBbKGludClTWyhpbnQpKEsxID4+IDU2KSAgICAgICBdICYgMHhmZl0gXgorICAgICAgICAgVDFbKGludClTWyhpbnQpKEsxID4+IDQ4KSAmIDB4ZmZdICYgMHhmZl0gXgorICAgICAgICAgVDJbKGludClTWyhpbnQpKEsxID4+IDQwKSAmIDB4ZmZdICYgMHhmZl0gXgorICAgICAgICAgVDNbKGludClTWyhpbnQpKEsxID4+IDMyKSAmIDB4ZmZdICYgMHhmZl0gXgorICAgICAgICAgVDRbKGludClTWyhpbnQpKEsxID4+IDI0KSAmIDB4ZmZdICYgMHhmZl0gXgorICAgICAgICAgVDVbKGludClTWyhpbnQpKEsxID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgorICAgICAgICAgVDZbKGludClTWyhpbnQpKEsxID4+ICA4KSAmIDB4ZmZdICYgMHhmZl0gXgorICAgICAgICAgVDdbKGludClTWyhpbnQpKEsxICAgICAgKSAmIDB4ZmZdICYgMHhmZl07CisgICB9CisgICBza2V5LT5raGF6YWQucm91bmRLZXlEZWNbUl0gPSBza2V5LT5raGF6YWQucm91bmRLZXlFbmNbMF07CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworc3RhdGljIHZvaWQga2hhemFkX2NyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBsYWludGV4dCwgdW5zaWduZWQgY2hhciAqY2lwaGVydGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bG9uZzY0ICAgICAgICpyb3VuZEtleSkgeworICAgaW50ICAgICByOworICAgdWxvbmc2NCBzdGF0ZTsKKyAgICAvKgorICAgICogbWFwIHBsYWludGV4dCBibG9jayB0byBjaXBoZXIgc3RhdGUgKG11KQorICAgICogYW5kIGFkZCBpbml0aWFsIHJvdW5kIGtleSAoc2lnbWFbS14wXSk6CisgICAgKi8KKyAgIHN0YXRlID0KKyAgICAgICgodWxvbmc2NClwbGFpbnRleHRbMF0gPDwgNTYpIF4KKyAgICAgICgodWxvbmc2NClwbGFpbnRleHRbMV0gPDwgNDgpIF4KKyAgICAgICgodWxvbmc2NClwbGFpbnRleHRbMl0gPDwgNDApIF4KKyAgICAgICgodWxvbmc2NClwbGFpbnRleHRbM10gPDwgMzIpIF4KKyAgICAgICgodWxvbmc2NClwbGFpbnRleHRbNF0gPDwgMjQpIF4KKyAgICAgICgodWxvbmc2NClwbGFpbnRleHRbNV0gPDwgMTYpIF4KKyAgICAgICgodWxvbmc2NClwbGFpbnRleHRbNl0gPDwgIDgpIF4KKyAgICAgICgodWxvbmc2NClwbGFpbnRleHRbN10gICAgICApIF4KKyAgICAgIHJvdW5kS2V5WzBdOworCisgICAgLyoKKyAgICAqIFIgLSAxIGZ1bGwgcm91bmRzOgorICAgICovCisgICAgZm9yIChyID0gMTsgciA8IFI7IHIrKykgeworICAgICAgc3RhdGUgPQorICAgICAgICAgVDBbKGludCkoc3RhdGUgPj4gNTYpICAgICAgIF0gXgorICAgICAgICAgVDFbKGludCkoc3RhdGUgPj4gNDgpICYgMHhmZl0gXgorICAgICAgICAgVDJbKGludCkoc3RhdGUgPj4gNDApICYgMHhmZl0gXgorICAgICAgICAgVDNbKGludCkoc3RhdGUgPj4gMzIpICYgMHhmZl0gXgorICAgICAgICAgVDRbKGludCkoc3RhdGUgPj4gMjQpICYgMHhmZl0gXgorICAgICAgICAgVDVbKGludCkoc3RhdGUgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgVDZbKGludCkoc3RhdGUgPj4gIDgpICYgMHhmZl0gXgorICAgICAgICAgVDdbKGludCkoc3RhdGUgICAgICApICYgMHhmZl0gXgorICAgICAgICAgcm91bmRLZXlbcl07CisgICAgfQorCisgICAgLyoKKyAgICAqIGxhc3Qgcm91bmQ6CisgICAgKi8KKyAgIHN0YXRlID0KKyAgICAgIChUMFsoaW50KShzdGF0ZSA+PiA1NikgICAgICAgXSAmIENPTlNUNjQoMHhmZjAwMDAwMDAwMDAwMDAwKSkgXgorICAgICAgKFQxWyhpbnQpKHN0YXRlID4+IDQ4KSAmIDB4ZmZdICYgQ09OU1Q2NCgweDAwZmYwMDAwMDAwMDAwMDApKSBeCisgICAgICAoVDJbKGludCkoc3RhdGUgPj4gNDApICYgMHhmZl0gJiBDT05TVDY0KDB4MDAwMGZmMDAwMDAwMDAwMCkpIF4KKyAgICAgIChUM1soaW50KShzdGF0ZSA+PiAzMikgJiAweGZmXSAmIENPTlNUNjQoMHgwMDAwMDBmZjAwMDAwMDAwKSkgXgorICAgICAgKFQ0WyhpbnQpKHN0YXRlID4+IDI0KSAmIDB4ZmZdICYgQ09OU1Q2NCgweDAwMDAwMDAwZmYwMDAwMDApKSBeCisgICAgICAoVDVbKGludCkoc3RhdGUgPj4gMTYpICYgMHhmZl0gJiBDT05TVDY0KDB4MDAwMDAwMDAwMGZmMDAwMCkpIF4KKyAgICAgIChUNlsoaW50KShzdGF0ZSA+PiAgOCkgJiAweGZmXSAmIENPTlNUNjQoMHgwMDAwMDAwMDAwMDBmZjAwKSkgXgorICAgICAgKFQ3WyhpbnQpKHN0YXRlICAgICAgKSAmIDB4ZmZdICYgQ09OU1Q2NCgweDAwMDAwMDAwMDAwMDAwZmYpKSBeCisgICAgICByb3VuZEtleVtSXTsKKworICAgLyoKKyAgICAqIG1hcCBjaXBoZXIgc3RhdGUgdG8gY2lwaGVydGV4dCBibG9jayAobXVeey0xfSk6CisgICAgKi8KKyAgIGNpcGhlcnRleHRbMF0gPSAodW5zaWduZWQgY2hhcikoc3RhdGUgPj4gNTYpOworICAgY2lwaGVydGV4dFsxXSA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZSA+PiA0OCk7CisgICBjaXBoZXJ0ZXh0WzJdID0gKHVuc2lnbmVkIGNoYXIpKHN0YXRlID4+IDQwKTsKKyAgIGNpcGhlcnRleHRbM10gPSAodW5zaWduZWQgY2hhcikoc3RhdGUgPj4gMzIpOworICAgY2lwaGVydGV4dFs0XSA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZSA+PiAyNCk7CisgICBjaXBoZXJ0ZXh0WzVdID0gKHVuc2lnbmVkIGNoYXIpKHN0YXRlID4+IDE2KTsKKyAgIGNpcGhlcnRleHRbNl0gPSAodW5zaWduZWQgY2hhcikoc3RhdGUgPj4gIDgpOworICAgY2lwaGVydGV4dFs3XSA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZSAgICAgICk7Cit9CisKKy8qKgorICBFbmNyeXB0cyBhIGJsb2NrIG9mIHRleHQgd2l0aCBLaGF6YWQKKyAgQHBhcmFtIHB0IFRoZSBpbnB1dCBwbGFpbnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBjdCBUaGUgb3V0cHV0IGNpcGhlcnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkCisqLwordm9pZCBraGF6YWRfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQoreworICAgTFRDX0FSR0NISyhwdCAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAga2hhemFkX2NyeXB0KHB0LCBjdCwgc2tleS0+a2hhemFkLnJvdW5kS2V5RW5jKTsKK30KKworLyoqCisgIERlY3J5cHRzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIEtoYXphZAorICBAcGFyYW0gY3QgVGhlIGlucHV0IGNpcGhlcnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBwdCBUaGUgb3V0cHV0IHBsYWludGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQgCisqLwordm9pZCBraGF6YWRfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQoreworICAgTFRDX0FSR0NISyhwdCAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAga2hhemFkX2NyeXB0KGN0LCBwdCwgc2tleS0+a2hhemFkLnJvdW5kS2V5RGVjKTsKK30KKworLyoqCisgIFBlcmZvcm1zIGEgc2VsZi10ZXN0IG9mIHRoZSBLaGF6YWQgYmxvY2sgY2lwaGVyCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgZnVuY3Rpb25hbCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdCBoYXMgYmVlbiBkaXNhYmxlZAorKi8KK2ludCBraGF6YWRfdGVzdCh2b2lkKQoreworI2lmbmRlZiBMVENfVEVTVAorICByZXR1cm4gQ1JZUFRfTk9QOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0IHsKKyAgICAgdW5zaWduZWQgY2hhciBwdFs4XSwgY3RbOF0sIGtleVsxNl07CisgIH0gdGVzdHNbXSA9IHsKK3sKKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgeyAweDQ5LCAweEE0LCAweENFLCAweDMyLCAweEFDLCAweDE5LCAweDBFLCAweDNGIH0sCisgICB7IDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0KK30sIHsKKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgeyAweDY0LCAweDVELCAweDc3LCAweDNFLCAweDQwLCAweEFCLCAweERELCAweDUzIH0sCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxIH0KK30sIHsKKyAgIHsgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgeyAweDlFLCAweDM5LCAweDk4LCAweDY0LCAweEY3LCAweDhFLCAweENBLCAweDAyIH0sCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0KK30sIHsKKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSB9LAorICAgeyAweEE5LCAweERGLCAweDNELCAweDJDLCAweDY0LCAweEQzLCAweEVBLCAweDI4IH0sCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIAorICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0KK30KK307CisgICBpbnQgeCwgeTsKKyAgIHVuc2lnbmVkIGNoYXIgYnVmWzJdWzhdOworICAgc3ltbWV0cmljX2tleSBza2V5OworCisgICBmb3IgKHggPSAwOyB4IDwgKGludCkoc2l6ZW9mKHRlc3RzKS9zaXplb2YodGVzdHNbMF0pKTsgeCsrKSB7CisgICAgICAga2hhemFkX3NldHVwKHRlc3RzW3hdLmtleSwgMTYsIDAsICZza2V5KTsKKyAgICAgICBraGF6YWRfZWNiX2VuY3J5cHQodGVzdHNbeF0ucHQsIGJ1ZlswXSwgJnNrZXkpOworICAgICAgIGtoYXphZF9lY2JfZGVjcnlwdChidWZbMF0sIGJ1ZlsxXSwgJnNrZXkpOworICAgICAgIGlmIChtZW1jbXAoYnVmWzBdLCB0ZXN0c1t4XS5jdCwgOCkgfHwgbWVtY21wKGJ1ZlsxXSwgdGVzdHNbeF0ucHQsIDgpKSB7CisgICAgICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKKyAgICAgICB9CisKKyAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTAwMDsgeSsrKSBraGF6YWRfZWNiX2VuY3J5cHQoYnVmWzBdLCBidWZbMF0sICZza2V5KTsKKyAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTAwMDsgeSsrKSBraGF6YWRfZWNiX2RlY3J5cHQoYnVmWzBdLCBidWZbMF0sICZza2V5KTsKKyAgICAgICBpZiAobWVtY21wKGJ1ZlswXSwgdGVzdHNbeF0uY3QsIDgpKSB7CisgICAgICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKKyAgICAgICB9CisKKyAgIH0KKyAgIHJldHVybiBDUllQVF9PSzsKKyNlbmRpZgorfQorCisvKiogVGVybWluYXRlIHRoZSBjb250ZXh0IAorICAgQHBhcmFtIHNrZXkgICAgVGhlIHNjaGVkdWxlZCBrZXkKKyovCit2b2lkIGtoYXphZF9kb25lKHN5bW1ldHJpY19rZXkgKnNrZXkpCit7Cit9CisKKy8qKgorICBHZXRzIHN1aXRhYmxlIGtleSBzaXplCisgIEBwYXJhbSBrZXlzaXplIFtpbi9vdXRdIFRoZSBsZW5ndGggb2YgdGhlIHJlY29tbWVuZGVkIGtleSAoaW4gYnl0ZXMpLiAgVGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIHRoZSBzdWl0YWJsZSBzaXplIGJhY2sgaW4gdGhpcyB2YXJpYWJsZS4KKyAgQHJldHVybiBDUllQVF9PSyBpZiB0aGUgaW5wdXQga2V5IHNpemUgaXMgYWNjZXB0YWJsZS4KKyovCitpbnQga2hhemFkX2tleXNpemUoaW50ICprZXlzaXplKQoreworICAgTFRDX0FSR0NISyhrZXlzaXplICE9IE5VTEwpOworICAgaWYgKCprZXlzaXplID49IDE2KSB7CisgICAgICAqa2V5c2l6ZSA9IDE2OworICAgICAgcmV0dXJuIENSWVBUX09LOworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0tFWVNJWkU7CisgICB9Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvY2lwaGVycy9raGF6YWQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS43ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL25vZWtlb24uYyBiL3NyYy9jaXBoZXJzL25vZWtlb24uYwpzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSBub2VrZW9uLmMKcmVuYW1lIHRvIHNyYy9jaXBoZXJzL25vZWtlb24uYwppbmRleCA3YzZlODdmLi5lNTAyZGZlIDEwMDY0NAotLS0gYS9ub2VrZW9uLmMKKysrIGIvc3JjL2NpcGhlcnMvbm9la2Vvbi5jCkBAIC02LDE0ICs2LDE3IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBOb2VrZW9uIGJsb2NrIGNpcGhlciBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisvKioKKyAgIEBmaWxlIG5vZWtlb24uYworICAgSW1wbGVtZW50YXRpb24gb2YgdGhlIE5vZWtlb24gYmxvY2sgY2lwaGVyIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAogI2lmZGVmIE5PRUtFT04KIAotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciBub2VrZW9uX2Rlc2MgPQorY29uc3Qgc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvciBub2VrZW9uX2Rlc2MgPQogewogICAgICJub2VrZW9uIiwKICAgICAxNiwKQEAgLTIyLDcgKzI1LDkgQEAKICAgICAmbm9la2Vvbl9lY2JfZW5jcnlwdCwKICAgICAmbm9la2Vvbl9lY2JfZGVjcnlwdCwKICAgICAmbm9la2Vvbl90ZXN0LAotICAgICZub2VrZW9uX2tleXNpemUKKyAgICAmbm9la2Vvbl9kb25lLAorICAgICZub2VrZW9uX2tleXNpemUsCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAogfTsKIAogc3RhdGljIGNvbnN0IHVsb25nMzIgUkNbXSA9IHsKQEAgLTMzLDE3ICszOCwxNiBAQAogICAgMHgwMDAwMDBkNFVMIAogfTsKIAotCiAjZGVmaW5lIGtUSEVUQShhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wID0gYV5jOyB0ZW1wID0gdGVtcCBeIFJPTCh0ZW1wLCA4KSBeIFJPUih0ZW1wLCA4KTsgXAorICAgIHRlbXAgPSBhXmM7IHRlbXAgPSB0ZW1wIF4gUk9MYyh0ZW1wLCA4KSBeIFJPUmModGVtcCwgOCk7IFwKICAgICBiIF49IHRlbXA7IGQgXj0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRlbXAgPSBiXmQ7IHRlbXAgPSB0ZW1wIF4gUk9MKHRlbXAsIDgpIF4gUk9SKHRlbXAsIDgpOyBcCisgICAgdGVtcCA9IGJeZDsgdGVtcCA9IHRlbXAgXiBST0xjKHRlbXAsIDgpIF4gUk9SYyh0ZW1wLCA4KTsgXAogICAgIGEgXj0gdGVtcDsgYyBePSB0ZW1wOwogCiAjZGVmaW5lIFRIRVRBKGssIGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wID0gYV5jOyB0ZW1wID0gdGVtcCBeIFJPTCh0ZW1wLCA4KSBeIFJPUih0ZW1wLCA4KTsgXAorICAgIHRlbXAgPSBhXmM7IHRlbXAgPSB0ZW1wIF4gUk9MYyh0ZW1wLCA4KSBeIFJPUmModGVtcCwgOCk7IFwKICAgICBiIF49IHRlbXAgXiBrWzFdOyBkIF49IHRlbXAgXiBrWzNdOyAgICAgICAgICAgICAgICAgICAgXAotICAgIHRlbXAgPSBiXmQ7IHRlbXAgPSB0ZW1wIF4gUk9MKHRlbXAsIDgpIF4gUk9SKHRlbXAsIDgpOyBcCisgICAgdGVtcCA9IGJeZDsgdGVtcCA9IHRlbXAgXiBST0xjKHRlbXAsIDgpIF4gUk9SYyh0ZW1wLCA4KTsgXAogICAgIGEgXj0gdGVtcCBeIGtbMF07IGMgXj0gdGVtcCBeIGtbMl07CiAgICAgCiAjZGVmaW5lIEdBTU1BKGEsIGIsIGMsIGQpICAgICBcCkBAIC01NSwxNyArNTksMjUgQEAKICAgICBhIF49IGMmYjsKICAgICAKICNkZWZpbmUgUEkxKGEsIGIsIGMsIGQpIFwKLSAgICBhID0gUk9MKGEsIDEpOyBjID0gUk9MKGMsIDUpOyBkID0gUk9MKGQsIDIpOworICAgIGEgPSBST0xjKGEsIDEpOyBjID0gUk9MYyhjLCA1KTsgZCA9IFJPTGMoZCwgMik7CiAgICAgCiAjZGVmaW5lIFBJMihhLCBiLCBjLCBkKSBcCi0gICAgYSA9IFJPUihhLCAxKTsgYyA9IFJPUihjLCA1KTsgZCA9IFJPUihkLCAyKTsKKyAgICBhID0gUk9SYyhhLCAxKTsgYyA9IFJPUmMoYywgNSk7IGQgPSBST1JjKGQsIDIpOwogICAgIAorIC8qKgorICAgIEluaXRpYWxpemUgdGhlIE5vZWtlb24gYmxvY2sgY2lwaGVyCisgICAgQHBhcmFtIGtleSBUaGUgc3ltbWV0cmljIGtleSB5b3Ugd2lzaCB0byBwYXNzCisgICAgQHBhcmFtIGtleWxlbiBUaGUga2V5IGxlbmd0aCBpbiBieXRlcworICAgIEBwYXJhbSBudW1fcm91bmRzIFRoZSBudW1iZXIgb2Ygcm91bmRzIGRlc2lyZWQgKDAgZm9yIGRlZmF1bHQpCisgICAgQHBhcmFtIHNrZXkgVGhlIGtleSBpbiBhcyBzY2hlZHVsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAqLwogaW50IG5vZWtlb25fc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKICAgIHVsb25nMzIgdGVtcDsKICAgIAotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKICAgIAogICAgaWYgKGtleWxlbiAhPSAxNikgewogICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKQEAgLTkwLDExMiArMTAyLDExMCBAQAogICAgcmV0dXJuIENSWVBUX09LOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIF9ub2VrZW9uX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KQorLyoqCisgIEVuY3J5cHRzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIE5vZWtlb24KKyAgQHBhcmFtIHB0IFRoZSBpbnB1dCBwbGFpbnRleHQgKDE2IGJ5dGVzKQorICBAcGFyYW0gY3QgVGhlIG91dHB1dCBjaXBoZXJ0ZXh0ICgxNiBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQKKyovCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCitzdGF0aWMgdm9pZCBfbm9la2Vvbl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiAjZWxzZQotdm9pZCBub2VrZW9uX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KQordm9pZCBub2VrZW9uX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKICNlbmRpZgogewogICAgdWxvbmczMiBhLGIsYyxkLHRlbXA7Ci0jaWZkZWYgU01BTExfQ09ERQogICAgaW50IHI7Ci0jZW5kaWYKIAotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICAhPSBOVUxMKTsKICAgIAogICAgTE9BRDMySChhLCZwdFswXSk7IExPQUQzMkgoYiwmcHRbNF0pOwogICAgTE9BRDMySChjLCZwdFs4XSk7IExPQUQzMkgoZCwmcHRbMTJdKTsKICAgIAogI2RlZmluZSBST1VORChpKSBcCiAgICAgICAgYSBePSBSQ1tpXTsgXAotICAgICAgIFRIRVRBKGtleS0+bm9la2Vvbi5LLCBhLGIsYyxkKTsgXAorICAgICAgIFRIRVRBKHNrZXktPm5vZWtlb24uSywgYSxiLGMsZCk7IFwKICAgICAgICBQSTEoYSxiLGMsZCk7IFwKICAgICAgICBHQU1NQShhLGIsYyxkKTsgXAogICAgICAgIFBJMihhLGIsYyxkKTsKIAotI2lmZGVmIFNNQUxMX0NPREUKICAgIGZvciAociA9IDA7IHIgPCAxNjsgKytyKSB7CiAgICAgICAgUk9VTkQocik7CiAgICB9Ci0jZWxzZSAKLSAgIFJPVU5EKCAwKTsgUk9VTkQoIDEpOyBST1VORCggMik7IFJPVU5EKCAzKTsKLSAgIFJPVU5EKCA0KTsgUk9VTkQoIDUpOyBST1VORCggNik7IFJPVU5EKCA3KTsKLSAgIFJPVU5EKCA4KTsgUk9VTkQoIDkpOyBST1VORCgxMCk7IFJPVU5EKDExKTsKLSAgIFJPVU5EKDEyKTsgUk9VTkQoMTMpOyBST1VORCgxNCk7IFJPVU5EKDE1KTsKLSNlbmRpZgogCiAjdW5kZWYgUk9VTkQKIAogICAgYSBePSBSQ1sxNl07Ci0gICBUSEVUQShrZXktPm5vZWtlb24uSywgYSwgYiwgYywgZCk7CisgICBUSEVUQShza2V5LT5ub2VrZW9uLkssIGEsIGIsIGMsIGQpOwogICAgCiAgICBTVE9SRTMySChhLCZjdFswXSk7IFNUT1JFMzJIKGIsJmN0WzRdKTsKICAgIFNUT1JFMzJIKGMsJmN0WzhdKTsgU1RPUkUzMkgoZCwmY3RbMTJdKTsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCi12b2lkIG5vZWtlb25fZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCit2b2lkIG5vZWtlb25fZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogewotICAgX25vZWtlb25fZWNiX2VuY3J5cHQocHQsIGN0LCBrZXkpOworICAgX25vZWtlb25fZWNiX2VuY3J5cHQocHQsIGN0LCBza2V5KTsKICAgIGJ1cm5fc3RhY2soc2l6ZW9mKHVsb25nMzIpICogNSArIHNpemVvZihpbnQpKTsKIH0KICNlbmRpZgogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIF9ub2VrZW9uX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KQorLyoqCisgIERlY3J5cHRzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIE5vZWtlb24KKyAgQHBhcmFtIGN0IFRoZSBpbnB1dCBjaXBoZXJ0ZXh0ICgxNiBieXRlcykKKyAgQHBhcmFtIHB0IFRoZSBvdXRwdXQgcGxhaW50ZXh0ICgxNiBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQgCisqLworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworc3RhdGljIHZvaWQgX25vZWtlb25fZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKLXZvaWQgbm9la2Vvbl9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSkKK3ZvaWQgbm9la2Vvbl9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiAjZW5kaWYKIHsKICAgIHVsb25nMzIgYSxiLGMsZCwgdGVtcDsKLSNpZmRlZiBTTUFMTF9DT0RFCiAgICBpbnQgcjsKLSNlbmRpZgogCi0gICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwdCAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAgICE9IE5VTEwpOwogICAgCiAgICBMT0FEMzJIKGEsJmN0WzBdKTsgTE9BRDMySChiLCZjdFs0XSk7CiAgICBMT0FEMzJIKGMsJmN0WzhdKTsgTE9BRDMySChkLCZjdFsxMl0pOwogICAgCiAKICNkZWZpbmUgUk9VTkQoaSkgXAotICAgICAgIFRIRVRBKGtleS0+bm9la2Vvbi5kSywgYSxiLGMsZCk7IFwKKyAgICAgICBUSEVUQShza2V5LT5ub2VrZW9uLmRLLCBhLGIsYyxkKTsgXAogICAgICAgIGEgXj0gUkNbaV07IFwKICAgICAgICBQSTEoYSxiLGMsZCk7IFwKICAgICAgICBHQU1NQShhLGIsYyxkKTsgXAogICAgICAgIFBJMihhLGIsYyxkKTsgCiAKLSNpZmRlZiBTTUFMTF9DT0RFCiAgICBmb3IgKHIgPSAxNjsgciA+IDA7IC0tcikgewogICAgICAgIFJPVU5EKHIpOwogICAgfQotI2Vsc2UKLSAgIFJPVU5EKDE2KTsgUk9VTkQoMTUpOyBST1VORCgxNCk7IFJPVU5EKDEzKTsKLSAgIFJPVU5EKDEyKTsgUk9VTkQoMTEpOyBST1VORCgxMCk7IFJPVU5EKCA5KTsKLSAgIFJPVU5EKCA4KTsgUk9VTkQoIDcpOyBST1VORCggNik7IFJPVU5EKCA1KTsKLSAgIFJPVU5EKCA0KTsgUk9VTkQoIDMpOyBST1VORCggMik7IFJPVU5EKCAxKTsKLSNlbmRpZgotICAgCisKICN1bmRlZiBST1VORAogCi0gICBUSEVUQShrZXktPm5vZWtlb24uZEssIGEsYixjLGQpOworICAgVEhFVEEoc2tleS0+bm9la2Vvbi5kSywgYSxiLGMsZCk7CiAgICBhIF49IFJDWzBdOwogICAgU1RPUkUzMkgoYSwmcHRbMF0pOyBTVE9SRTMySChiLCAmcHRbNF0pOwogICAgU1RPUkUzMkgoYywmcHRbOF0pOyBTVE9SRTMySChkLCAmcHRbMTJdKTsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCi12b2lkIG5vZWtlb25fZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCit2b2lkIG5vZWtlb25fZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogewotICAgX25vZWtlb25fZWNiX2RlY3J5cHQoY3QsIHB0LCBrZXkpOworICAgX25vZWtlb25fZWNiX2RlY3J5cHQoY3QsIHB0LCBza2V5KTsKICAgIGJ1cm5fc3RhY2soc2l6ZW9mKHVsb25nMzIpICogNSArIHNpemVvZihpbnQpKTsKIH0KICNlbmRpZgogCisvKioKKyAgUGVyZm9ybXMgYSBzZWxmLXRlc3Qgb2YgdGhlIE5vZWtlb24gYmxvY2sgY2lwaGVyCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgZnVuY3Rpb25hbCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdCBoYXMgYmVlbiBkaXNhYmxlZAorKi8KIGludCBub2VrZW9uX3Rlc3Qodm9pZCkKIHsKICAjaWZuZGVmIExUQ19URVNUCkBAIC0yNTUsMTYgKzI2NSwzMiBAQAogICNlbmRpZgogfQogCi1pbnQgbm9la2Vvbl9rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKQorLyoqIFRlcm1pbmF0ZSB0aGUgY29udGV4dCAKKyAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5CisqLwordm9pZCBub2VrZW9uX2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgIF9BUkdDSEsoZGVzaXJlZF9rZXlzaXplICE9IE5VTEwpOwotICAgaWYgKCpkZXNpcmVkX2tleXNpemUgPCAxNikgeworfQorCisvKioKKyAgR2V0cyBzdWl0YWJsZSBrZXkgc2l6ZQorICBAcGFyYW0ga2V5c2l6ZSBbaW4vb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSByZWNvbW1lbmRlZCBrZXkgKGluIGJ5dGVzKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSB0aGUgc3VpdGFibGUgc2l6ZSBiYWNrIGluIHRoaXMgdmFyaWFibGUuCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdGhlIGlucHV0IGtleSBzaXplIGlzIGFjY2VwdGFibGUuCisqLworaW50IG5vZWtlb25fa2V5c2l6ZShpbnQgKmtleXNpemUpCit7CisgICBMVENfQVJHQ0hLKGtleXNpemUgIT0gTlVMTCk7CisgICBpZiAoKmtleXNpemUgPCAxNikgewogICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKICAgIH0gZWxzZSB7Ci0gICAgICAqZGVzaXJlZF9rZXlzaXplID0gMTY7CisgICAgICAqa2V5c2l6ZSA9IDE2OwogICAgICAgcmV0dXJuIENSWVBUX09LOwogICAgfQogfQogCiAjZW5kaWYKIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvY2lwaGVycy9ub2VrZW9uLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9yYzIuYyBiL3NyYy9jaXBoZXJzL3JjMi5jCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIHJjMi5jCnJlbmFtZSB0byBzcmMvY2lwaGVycy9yYzIuYwppbmRleCBhOGYxZDJkLi5lOTFmODNhIDEwMDY0NAotLS0gYS9yYzIuYworKysgYi9zcmMvY2lwaGVycy9yYzIuYwpAQCAtNiw3ICs2LDcgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCiAqIFRvIGNvbW1lbW9yYXRlIHRoZSAxOTk2IFJTQSBEYXRhIFNlY3VyaXR5IENvbmZlcmVuY2UsIHRoZSBmb2xsb3dpbmcgICoKQEAgLTE4LDMyICsxOCwyOSBAQAogKiBUaGFua3MgdG8gQ29kZVZpZXcsIFNvZnRJY2UsIGFuZCBEODYgZm9yIGhlbHBpbmcgYnJpbmcgdGhpcyBjb2RlIHRvICAqCiAqIHRoZSBwdWJsaWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CiAKLSNpbmNsdWRlIDxteWNyeXB0Lmg+CisvKioKKyAgQGZpbGUgcmMyLmMKKyAgSW1wbGVtZW50YXRpb24gb2YgUkMyCisqLyAgCiAKICNpZmRlZiBSQzIKIAotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciByYzJfZGVzYyA9IHsKK2NvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgcmMyX2Rlc2MgPSB7CiAgICAicmMyIiwKICAgIDEyLCA4LCAxMjgsIDgsIDE2LAogICAgJnJjMl9zZXR1cCwKICAgICZyYzJfZWNiX2VuY3J5cHQsCiAgICAmcmMyX2VjYl9kZWNyeXB0LAogICAgJnJjMl90ZXN0LAotICAgJnJjMl9rZXlzaXplCisgICAmcmMyX2RvbmUsCisgICAmcmMyX2tleXNpemUsCisgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCiB9OwogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKiBFeHBhbmQgYSB2YXJpYWJsZS1sZW5ndGggdXNlciBrZXkgKGJldHdlZW4gMSBhbmQgMTI4IGJ5dGVzKSB0byBhICAgICAqCi0qIDY0LXNob3J0IHdvcmtpbmcgcmMyIGtleSwgb2YgYXQgbW9zdCAiYml0cyIgZWZmZWN0aXZlIGtleSBiaXRzLiAgICAgICoKLSogVGhlIGVmZmVjdGl2ZSBrZXkgYml0cyBwYXJhbWV0ZXIgbG9va3MgbGlrZSBhbiBleHBvcnQgY29udHJvbCBoYWNrLiAgKgotKiBGb3Igbm9ybWFsIHVzZSwgaXQgc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gMTAyNC4gIEZvciBjb252ZW5pZW5jZSwgICAqCi0qIHplcm8gaXMgYWNjZXB0ZWQgYXMgYW4gYWxpYXMgZm9yIDEwMjQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAvKiAyNTYtZW50cnkgcGVybXV0YXRpb24gdGFibGUsIHByb2JhYmx5IGRlcml2ZWQgc29tZWhvdyBmcm9tIHBpICovCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGVybXV0ZVsyNTZdID0geworLyogMjU2LWVudHJ5IHBlcm11dGF0aW9uIHRhYmxlLCBwcm9iYWJseSBkZXJpdmVkIHNvbWVob3cgZnJvbSBwaSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGVybXV0ZVsyNTZdID0gewogICAgICAgICAyMTcsMTIwLDI0OSwxOTYsIDI1LDIyMSwxODEsMjM3LCA0MCwyMzMsMjUzLDEyMSwgNzQsMTYwLDIxNiwxNTcsCiAgICAgICAgIDE5OCwxMjYsIDU1LDEzMSwgNDMsMTE4LCA4MywxNDIsIDk4LCA3NiwxMDAsMTM2LCA2OCwxMzksMjUxLDE2MiwKICAgICAgICAgIDIzLDE1NCwgODksMjQ1LDEzNSwxNzksIDc5LCAxOSwgOTcsIDY5LDEwOSwxNDEsICA5LDEyOSwxMjUsIDUwLApAQCAtNjAsMjMgKzU3LDMxIEBACiAgICAgICAgIDIxMSwgIDAsMjMwLDIwNywyMjUsMTU4LDE2OCwgNDQsIDk5LCAyMiwgIDEsIDYzLCA4OCwyMjYsMTM3LDE2OSwKICAgICAgICAgIDEzLCA1NiwgNTIsIDI3LDE3MSwgNTEsMjU1LDE3NiwxODcsIDcyLCAxMiwgOTUsMTg1LDE3NywyMDUsIDQ2LAogICAgICAgICAxOTcsMjQzLDIxOSwgNzEsMjI5LDE2NSwxNTYsMTE5LCAxMCwxNjYsIDMyLDEwNCwyNTQsMTI3LDE5MywxNzMKLSAgICB9OworfTsKIAotaW50IHJjMl9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCByb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCisgLyoqCisgICAgSW5pdGlhbGl6ZSB0aGUgUkMyIGJsb2NrIGNpcGhlcgorICAgIEBwYXJhbSBrZXkgVGhlIHN5bW1ldHJpYyBrZXkgeW91IHdpc2ggdG8gcGFzcworICAgIEBwYXJhbSBrZXlsZW4gVGhlIGtleSBsZW5ndGggaW4gYnl0ZXMKKyAgICBAcGFyYW0gbnVtX3JvdW5kcyBUaGUgbnVtYmVyIG9mIHJvdW5kcyBkZXNpcmVkICgwIGZvciBkZWZhdWx0KQorICAgIEBwYXJhbSBza2V5IFRoZSBrZXkgaW4gYXMgc2NoZWR1bGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgKi8KK2ludCByYzJfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKICAgIHVuc2lnbmVkICp4a2V5ID0gc2tleS0+cmMyLnhrZXk7CiAgICB1bnNpZ25lZCBjaGFyIHRtcFsxMjhdOwogICAgdW5zaWduZWQgVDgsIFRNOwogICAgaW50IGksIGJpdHM7CiAKLSAgIF9BUkdDSEsoa2V5ICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoc2tleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKIAogICAgaWYgKGtleWxlbiA8IDggfHwga2V5bGVuID4gMTI4KSB7CiAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOwogICAgfQogCi0gICBpZiAocm91bmRzICE9IDAgJiYgcm91bmRzICE9IDE2KSB7CisgICBpZiAobnVtX3JvdW5kcyAhPSAwICYmIG51bV9yb3VuZHMgIT0gMTYpIHsKICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1JPVU5EUzsKICAgIH0KIApAQCAtODcsMjYgKzkyLDI1IEBACiAgICAgLyogUGhhc2UgMTogRXhwYW5kIGlucHV0IGtleSB0byAxMjggYnl0ZXMgKi8KICAgICBpZiAoa2V5bGVuIDwgMTI4KSB7CiAgICAgICAgIGZvciAoaSA9IGtleWxlbjsgaSA8IDEyODsgaSsrKSB7Ci0gICAgICAgICAgICB0bXBbaV0gPSBwZXJtdXRlWyhpbnQpKCh0bXBbaSAtIDFdICsgdG1wW2kgLSBrZXlsZW5dKSAmIDI1NSldOworICAgICAgICAgICAgdG1wW2ldID0gcGVybXV0ZVsodG1wW2kgLSAxXSArIHRtcFtpIC0ga2V5bGVuXSkgJiAyNTVdOwogICAgICAgICB9CiAgICAgfQogICAgIAogICAgIC8qIFBoYXNlIDIgLSByZWR1Y2UgZWZmZWN0aXZlIGtleSBzaXplIHRvICJiaXRzIiAqLwotICAgIGJpdHMgPSBrZXlsZW4qODsKKyAgICBiaXRzID0ga2V5bGVuPDwzOwogICAgIFQ4ICAgPSAodW5zaWduZWQpKGJpdHMrNyk+PjM7CiAgICAgVE0gICA9ICgyNTUgPj4gKHVuc2lnbmVkKSg3ICYgLWJpdHMpKTsKLSAgICB0bXBbMTI4IC0gVDhdID0gcGVybXV0ZVsoaW50KSh0bXBbMTI4IC0gVDhdICYgVE0pXTsKKyAgICB0bXBbMTI4IC0gVDhdID0gcGVybXV0ZVt0bXBbMTI4IC0gVDhdICYgVE1dOwogICAgIGZvciAoaSA9IDEyNyAtIFQ4OyBpID49IDA7IGktLSkgewotICAgICAgICB0bXBbaV0gPSBwZXJtdXRlWyhpbnQpKHRtcFtpICsgMV0gXiB0bXBbaSArIFQ4XSldOworICAgICAgICB0bXBbaV0gPSBwZXJtdXRlW3RtcFtpICsgMV0gXiB0bXBbaSArIFQ4XV07CiAgICAgfQogCiAgICAgLyogUGhhc2UgMyAtIGNvcHkgdG8geGtleSBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyICovCi0gICAgaSA9IDYzOwotICAgIGRvIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewogICAgICAgICB4a2V5W2ldID0gICh1bnNpZ25lZCl0bXBbMippXSArICgodW5zaWduZWQpdG1wWzIqaSsxXSA8PCA4KTsKLSAgICB9IHdoaWxlIChpLS0gPiAwKTsKKyAgICB9ICAgICAgICAKIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICAgemVyb21lbSh0bXAsIHNpemVvZih0bXApKTsKICNlbmRpZgogICAgIApAQCAtMTE2LDQyICsxMjAsNDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAogKiBFbmNyeXB0IGFuIDgtYnl0ZSBibG9jayBvZiBwbGFpbnRleHQgdXNpbmcgdGhlIGdpdmVuIGtleS4gICAgICAgICAgICAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBDTEVBTl9TVEFDSwotc3RhdGljIHZvaWQgX3JjMl9lY2JfZW5jcnlwdCggY29uc3QgdW5zaWduZWQgY2hhciAqcGxhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY2lwaGVyLAorLyoqCisgIEVuY3J5cHRzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIFJDMgorICBAcGFyYW0gcHQgVGhlIGlucHV0IHBsYWludGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIGN0IFRoZSBvdXRwdXQgY2lwaGVydGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQKKyovCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCitzdGF0aWMgdm9pZCBfcmMyX2VjYl9lbmNyeXB0KCBjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKLXZvaWQgcmMyX2VjYl9lbmNyeXB0KCBjb25zdCB1bnNpZ25lZCBjaGFyICpwbGFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjaXBoZXIsCit2b2lkIHJjMl9lY2JfZW5jcnlwdCggY29uc3QgdW5zaWduZWQgY2hhciAqcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbWV0cmljX2tleSAqc2tleSkKICNlbmRpZgogewogICAgIHVuc2lnbmVkICp4a2V5OwogICAgIHVuc2lnbmVkIHg3NiwgeDU0LCB4MzIsIHgxMCwgaTsKIAotICAgIF9BUkdDSEsocGxhaW4gIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhjaXBoZXIgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsocHQgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoY3QgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhza2V5ICAgIT0gTlVMTCk7CiAKICAgICB4a2V5ID0gc2tleS0+cmMyLnhrZXk7CiAKLSAgICB4NzYgPSAoKHVuc2lnbmVkKXBsYWluWzddIDw8IDgpICsgKHVuc2lnbmVkKXBsYWluWzZdOwotICAgIHg1NCA9ICgodW5zaWduZWQpcGxhaW5bNV0gPDwgOCkgKyAodW5zaWduZWQpcGxhaW5bNF07Ci0gICAgeDMyID0gKCh1bnNpZ25lZClwbGFpblszXSA8PCA4KSArICh1bnNpZ25lZClwbGFpblsyXTsKLSAgICB4MTAgPSAoKHVuc2lnbmVkKXBsYWluWzFdIDw8IDgpICsgKHVuc2lnbmVkKXBsYWluWzBdOworICAgIHg3NiA9ICgodW5zaWduZWQpcHRbN10gPDwgOCkgKyAodW5zaWduZWQpcHRbNl07CisgICAgeDU0ID0gKCh1bnNpZ25lZClwdFs1XSA8PCA4KSArICh1bnNpZ25lZClwdFs0XTsKKyAgICB4MzIgPSAoKHVuc2lnbmVkKXB0WzNdIDw8IDgpICsgKHVuc2lnbmVkKXB0WzJdOworICAgIHgxMCA9ICgodW5zaWduZWQpcHRbMV0gPDwgOCkgKyAodW5zaWduZWQpcHRbMF07CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICB4MTAgPSAoeDEwICsgKHgzMiAmIH54NzYpICsgKHg1NCAmIHg3NikgKyB4a2V5WzQqaSswXSkgJiAweEZGRkY7Ci0gICAgICAgIHgxMCA9ICgoeDEwIDw8IDEpIHwgKHgxMCA+PiAxNSkpICYgMHhGRkZGOworICAgICAgICB4MTAgPSAoKHgxMCA8PCAxKSB8ICh4MTAgPj4gMTUpKTsKIAogICAgICAgICB4MzIgPSAoeDMyICsgKHg1NCAmIH54MTApICsgKHg3NiAmIHgxMCkgKyB4a2V5WzQqaSsxXSkgJiAweEZGRkY7Ci0gICAgICAgIHgzMiA9ICgoeDMyIDw8IDIpIHwgKHgzMiA+PiAxNCkpICYgMHhGRkZGOworICAgICAgICB4MzIgPSAoKHgzMiA8PCAyKSB8ICh4MzIgPj4gMTQpKTsKIAogICAgICAgICB4NTQgPSAoeDU0ICsgKHg3NiAmIH54MzIpICsgKHgxMCAmIHgzMikgKyB4a2V5WzQqaSsyXSkgJiAweEZGRkY7Ci0gICAgICAgIHg1NCA9ICgoeDU0IDw8IDMpIHwgKHg1NCA+PiAxMykpICYgMHhGRkZGOworICAgICAgICB4NTQgPSAoKHg1NCA8PCAzKSB8ICh4NTQgPj4gMTMpKTsKIAogICAgICAgICB4NzYgPSAoeDc2ICsgKHgxMCAmIH54NTQpICsgKHgzMiAmIHg1NCkgKyB4a2V5WzQqaSszXSkgJiAweEZGRkY7Ci0gICAgICAgIHg3NiA9ICgoeDc2IDw8IDUpIHwgKHg3NiA+PiAxMSkpICYgMHhGRkZGOworICAgICAgICB4NzYgPSAoKHg3NiA8PCA1KSB8ICh4NzYgPj4gMTEpKTsKIAogICAgICAgICBpZiAoaSA9PSA0IHx8IGkgPT0gMTApIHsKICAgICAgICAgICAgIHgxMCA9ICh4MTAgKyB4a2V5W3g3NiAmIDYzXSkgJiAweEZGRkY7CkBAIC0xNjEsMjIgKzE3MSwyMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgY2lwaGVyWzBdID0gKHVuc2lnbmVkIGNoYXIpeDEwOwotICAgIGNpcGhlclsxXSA9ICh1bnNpZ25lZCBjaGFyKSh4MTAgPj4gOCk7Ci0gICAgY2lwaGVyWzJdID0gKHVuc2lnbmVkIGNoYXIpeDMyOwotICAgIGNpcGhlclszXSA9ICh1bnNpZ25lZCBjaGFyKSh4MzIgPj4gOCk7Ci0gICAgY2lwaGVyWzRdID0gKHVuc2lnbmVkIGNoYXIpeDU0OwotICAgIGNpcGhlcls1XSA9ICh1bnNpZ25lZCBjaGFyKSh4NTQgPj4gOCk7Ci0gICAgY2lwaGVyWzZdID0gKHVuc2lnbmVkIGNoYXIpeDc2OwotICAgIGNpcGhlcls3XSA9ICh1bnNpZ25lZCBjaGFyKSh4NzYgPj4gOCk7CisgICAgY3RbMF0gPSAodW5zaWduZWQgY2hhcil4MTA7CisgICAgY3RbMV0gPSAodW5zaWduZWQgY2hhcikoeDEwID4+IDgpOworICAgIGN0WzJdID0gKHVuc2lnbmVkIGNoYXIpeDMyOworICAgIGN0WzNdID0gKHVuc2lnbmVkIGNoYXIpKHgzMiA+PiA4KTsKKyAgICBjdFs0XSA9ICh1bnNpZ25lZCBjaGFyKXg1NDsKKyAgICBjdFs1XSA9ICh1bnNpZ25lZCBjaGFyKSh4NTQgPj4gOCk7CisgICAgY3RbNl0gPSAodW5zaWduZWQgY2hhcil4NzY7CisgICAgY3RbN10gPSAodW5zaWduZWQgY2hhcikoeDc2ID4+IDgpOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXZvaWQgcmMyX2VjYl9lbmNyeXB0KCBjb25zdCB1bnNpZ25lZCBjaGFyICpwbGFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjaXBoZXIsCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCit2b2lkIHJjMl9lY2JfZW5jcnlwdCggY29uc3QgdW5zaWduZWQgY2hhciAqcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgICBfcmMyX2VjYl9lbmNyeXB0KHBsYWluLCBjaXBoZXIsIHNrZXkpOworICAgIF9yYzJfZWNiX2VuY3J5cHQocHQsIGN0LCBza2V5KTsKICAgICBidXJuX3N0YWNrKHNpemVvZih1bnNpZ25lZCAqKSArIHNpemVvZih1bnNpZ25lZCkgKiA1KTsKIH0KICNlbmRpZgpAQCAtMTg0LDE0ICsxOTQsMTkgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAogKiBEZWNyeXB0IGFuIDgtYnl0ZSBibG9jayBvZiBjaXBoZXJ0ZXh0IHVzaW5nIHRoZSBnaXZlbiBrZXkuICAgICAgICAgICAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfcmMyX2VjYl9kZWNyeXB0KCBjb25zdCB1bnNpZ25lZCBjaGFyICpjaXBoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcGxhaW4sCisvKioKKyAgRGVjcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggUkMyCisgIEBwYXJhbSBjdCBUaGUgaW5wdXQgY2lwaGVydGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHB0IFRoZSBvdXRwdXQgcGxhaW50ZXh0ICg4IGJ5dGVzKQorICBAcGFyYW0gc2tleSBUaGUga2V5IGFzIHNjaGVkdWxlZCAKKyovCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCitzdGF0aWMgdm9pZCBfcmMyX2VjYl9kZWNyeXB0KCBjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKLXZvaWQgcmMyX2VjYl9kZWNyeXB0KCBjb25zdCB1bnNpZ25lZCBjaGFyICpjaXBoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcGxhaW4sCit2b2lkIHJjMl9lY2JfZGVjcnlwdCggY29uc3QgdW5zaWduZWQgY2hhciAqY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbWV0cmljX2tleSAqc2tleSkKICNlbmRpZgogewpAQCAtMTk5LDE2ICsyMTQsMTYgQEAKICAgICB1bnNpZ25lZCAqeGtleTsKICAgICBpbnQgaTsKIAotICAgIF9BUkdDSEsocGxhaW4gIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhjaXBoZXIgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsocHQgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoY3QgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhza2V5ICAgIT0gTlVMTCk7CiAKICAgICB4a2V5ID0gc2tleS0+cmMyLnhrZXk7CiAKLSAgICB4NzYgPSAoKHVuc2lnbmVkKWNpcGhlcls3XSA8PCA4KSArICh1bnNpZ25lZCljaXBoZXJbNl07Ci0gICAgeDU0ID0gKCh1bnNpZ25lZCljaXBoZXJbNV0gPDwgOCkgKyAodW5zaWduZWQpY2lwaGVyWzRdOwotICAgIHgzMiA9ICgodW5zaWduZWQpY2lwaGVyWzNdIDw8IDgpICsgKHVuc2lnbmVkKWNpcGhlclsyXTsKLSAgICB4MTAgPSAoKHVuc2lnbmVkKWNpcGhlclsxXSA8PCA4KSArICh1bnNpZ25lZCljaXBoZXJbMF07CisgICAgeDc2ID0gKCh1bnNpZ25lZCljdFs3XSA8PCA4KSArICh1bnNpZ25lZCljdFs2XTsKKyAgICB4NTQgPSAoKHVuc2lnbmVkKWN0WzVdIDw8IDgpICsgKHVuc2lnbmVkKWN0WzRdOworICAgIHgzMiA9ICgodW5zaWduZWQpY3RbM10gPDwgOCkgKyAodW5zaWduZWQpY3RbMl07CisgICAgeDEwID0gKCh1bnNpZ25lZCljdFsxXSA8PCA4KSArICh1bnNpZ25lZCljdFswXTsKIAogICAgIGZvciAoaSA9IDE1OyBpID49IDA7IGktLSkgewogICAgICAgICBpZiAoaSA9PSA0IHx8IGkgPT0gMTApIHsKQEAgLTIxOCwzOSArMjMzLDQzIEBACiAgICAgICAgICAgICB4MTAgPSAoeDEwIC0geGtleVt4NzYgJiA2M10pICYgMHhGRkZGOwogICAgICAgICB9CiAKLSAgICAgICAgeDc2ID0gKCh4NzYgPDwgMTEpIHwgKHg3NiA+PiA1KSkgJiAweEZGRkY7CisgICAgICAgIHg3NiA9ICgoeDc2IDw8IDExKSB8ICh4NzYgPj4gNSkpOwogICAgICAgICB4NzYgPSAoeDc2IC0gKCh4MTAgJiB+eDU0KSArICh4MzIgJiB4NTQpICsgeGtleVs0KmkrM10pKSAmIDB4RkZGRjsKIAotICAgICAgICB4NTQgPSAoKHg1NCA8PCAxMykgfCAoeDU0ID4+IDMpKSAmIDB4RkZGRjsKKyAgICAgICAgeDU0ID0gKCh4NTQgPDwgMTMpIHwgKHg1NCA+PiAzKSk7CiAgICAgICAgIHg1NCA9ICh4NTQgLSAoKHg3NiAmIH54MzIpICsgKHgxMCAmIHgzMikgKyB4a2V5WzQqaSsyXSkpICYgMHhGRkZGOwogCi0gICAgICAgIHgzMiA9ICgoeDMyIDw8IDE0KSB8ICh4MzIgPj4gMikpICYgMHhGRkZGOworICAgICAgICB4MzIgPSAoKHgzMiA8PCAxNCkgfCAoeDMyID4+IDIpKTsKICAgICAgICAgeDMyID0gKHgzMiAtICgoeDU0ICYgfngxMCkgKyAoeDc2ICYgeDEwKSArIHhrZXlbNCppKzFdKSkgJiAweEZGRkY7CiAKLSAgICAgICAgeDEwID0gKCh4MTAgPDwgMTUpIHwgKHgxMCA+PiAxKSkgJiAweEZGRkY7CisgICAgICAgIHgxMCA9ICgoeDEwIDw8IDE1KSB8ICh4MTAgPj4gMSkpOwogICAgICAgICB4MTAgPSAoeDEwIC0gKCh4MzIgJiB+eDc2KSArICh4NTQgJiB4NzYpICsgeGtleVs0KmkrMF0pKSAmIDB4RkZGRjsKICAgICB9CiAKLSAgICBwbGFpblswXSA9ICh1bnNpZ25lZCBjaGFyKXgxMDsKLSAgICBwbGFpblsxXSA9ICh1bnNpZ25lZCBjaGFyKSh4MTAgPj4gOCk7Ci0gICAgcGxhaW5bMl0gPSAodW5zaWduZWQgY2hhcil4MzI7Ci0gICAgcGxhaW5bM10gPSAodW5zaWduZWQgY2hhcikoeDMyID4+IDgpOwotICAgIHBsYWluWzRdID0gKHVuc2lnbmVkIGNoYXIpeDU0OwotICAgIHBsYWluWzVdID0gKHVuc2lnbmVkIGNoYXIpKHg1NCA+PiA4KTsKLSAgICBwbGFpbls2XSA9ICh1bnNpZ25lZCBjaGFyKXg3NjsKLSAgICBwbGFpbls3XSA9ICh1bnNpZ25lZCBjaGFyKSh4NzYgPj4gOCk7CisgICAgcHRbMF0gPSAodW5zaWduZWQgY2hhcil4MTA7CisgICAgcHRbMV0gPSAodW5zaWduZWQgY2hhcikoeDEwID4+IDgpOworICAgIHB0WzJdID0gKHVuc2lnbmVkIGNoYXIpeDMyOworICAgIHB0WzNdID0gKHVuc2lnbmVkIGNoYXIpKHgzMiA+PiA4KTsKKyAgICBwdFs0XSA9ICh1bnNpZ25lZCBjaGFyKXg1NDsKKyAgICBwdFs1XSA9ICh1bnNpZ25lZCBjaGFyKSh4NTQgPj4gOCk7CisgICAgcHRbNl0gPSAodW5zaWduZWQgY2hhcil4NzY7CisgICAgcHRbN10gPSAodW5zaWduZWQgY2hhcikoeDc2ID4+IDgpOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXZvaWQgcmMyX2VjYl9kZWNyeXB0KCBjb25zdCB1bnNpZ25lZCBjaGFyICpjaXBoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcGxhaW4sCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCit2b2lkIHJjMl9lY2JfZGVjcnlwdCggY29uc3QgdW5zaWduZWQgY2hhciAqY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgICBfcmMyX2VjYl9kZWNyeXB0KGNpcGhlciwgcGxhaW4sIHNrZXkpOworICAgIF9yYzJfZWNiX2RlY3J5cHQoY3QsIHB0LCBza2V5KTsKICAgICBidXJuX3N0YWNrKHNpemVvZih1bnNpZ25lZCAqKSArIHNpemVvZih1bnNpZ25lZCkgKiA0ICsgc2l6ZW9mKGludCkpOwogfQogI2VuZGlmCiAKKy8qKgorICBQZXJmb3JtcyBhIHNlbGYtdGVzdCBvZiB0aGUgUkMyIGJsb2NrIGNpcGhlcgorICBAcmV0dXJuIENSWVBUX09LIGlmIGZ1bmN0aW9uYWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3QgaGFzIGJlZW4gZGlzYWJsZWQKKyovCiBpbnQgcmMyX3Rlc3Qodm9pZCkKIHsKICAjaWZuZGVmIExUQ19URVNUCkBAIC0zMDIsOSArMzIxLDIxIEBACiAgICAjZW5kaWYKIH0KIAorLyoqIFRlcm1pbmF0ZSB0aGUgY29udGV4dCAKKyAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5CisqLwordm9pZCByYzJfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KQoreworfQorCisvKioKKyAgR2V0cyBzdWl0YWJsZSBrZXkgc2l6ZQorICBAcGFyYW0ga2V5c2l6ZSBbaW4vb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSByZWNvbW1lbmRlZCBrZXkgKGluIGJ5dGVzKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSB0aGUgc3VpdGFibGUgc2l6ZSBiYWNrIGluIHRoaXMgdmFyaWFibGUuCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdGhlIGlucHV0IGtleSBzaXplIGlzIGFjY2VwdGFibGUuCisqLwogaW50IHJjMl9rZXlzaXplKGludCAqa2V5c2l6ZSkKIHsKLSAgIF9BUkdDSEsoa2V5c2l6ZSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5c2l6ZSAhPSBOVUxMKTsKICAgIGlmICgqa2V5c2l6ZSA8IDgpIHsKICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOwogICAgfSBlbHNlIGlmICgqa2V5c2l6ZSA+IDEyOCkgewpAQCAtMzE3LDMgKzM0OCw3IEBACiAKIAogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9jaXBoZXJzL3JjMi5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjcgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvcmM1LmMgYi9zcmMvY2lwaGVycy9yYzUuYwpzaW1pbGFyaXR5IGluZGV4IDY4JQpyZW5hbWUgZnJvbSByYzUuYwpyZW5hbWUgdG8gc3JjL2NpcGhlcnMvcmM1LmMKaW5kZXggYWI3OTUzNS4uOTQ2NWFjOCAxMDA2NDQKLS0tIGEvcmM1LmMKKysrIGIvc3JjL2NpcGhlcnMvcmM1LmMKQEAgLTYsMTYgKzYsMTkgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwogCi0vKiBSQzUgY29kZSBieSBUb20gU3QgRGVuaXMgKi8KKy8qKgorICAgQGZpbGUgcmM1LmMKKyAgIFJDNSBjb2RlIGJ5IFRvbSBTdCBEZW5pcyAKKyovCiAKLSNpbmNsdWRlICJteWNyeXB0LmgiCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAogI2lmZGVmIFJDNQogCi1jb25zdCBzdHJ1Y3QgX2NpcGhlcl9kZXNjcmlwdG9yIHJjNV9kZXNjID0KK2NvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgcmM1X2Rlc2MgPQogewogICAgICJyYzUiLAogICAgIDIsCkBAIC0yNCw3ICsyNyw5IEBACiAgICAgJnJjNV9lY2JfZW5jcnlwdCwKICAgICAmcmM1X2VjYl9kZWNyeXB0LAogICAgICZyYzVfdGVzdCwKLSAgICAmcmM1X2tleXNpemUKKyAgICAmcmM1X2RvbmUsCisgICAgJnJjNV9rZXlzaXplLAorICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKIH07CiAKIHN0YXRpYyBjb25zdCB1bG9uZzMyIHN0YWJbNTBdID0gewpAQCAtMzcsNyArNDIsMTUgQEAKIDB4NjI0ODI0MTNVTCwgMHgwMDdmOWRjY1VMCiB9OwogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyAvKioKKyAgICBJbml0aWFsaXplIHRoZSBSQzUgYmxvY2sgY2lwaGVyCisgICAgQHBhcmFtIGtleSBUaGUgc3ltbWV0cmljIGtleSB5b3Ugd2lzaCB0byBwYXNzCisgICAgQHBhcmFtIGtleWxlbiBUaGUga2V5IGxlbmd0aCBpbiBieXRlcworICAgIEBwYXJhbSBudW1fcm91bmRzIFRoZSBudW1iZXIgb2Ygcm91bmRzIGRlc2lyZWQgKDAgZm9yIGRlZmF1bHQpCisgICAgQHBhcmFtIHNrZXkgVGhlIGtleSBpbiBhcyBzY2hlZHVsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAqLworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogc3RhdGljIGludCBfcmM1X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiAjZWxzZQogaW50IHJjNV9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQpAQCAtNDUsOCArNTgsOCBAQAogewogICAgIHVsb25nMzIgTFs2NF0sICpTLCBBLCBCLCBpLCBqLCB2LCBzLCB0LCBsOwogCi0gICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOwotICAgIF9BUkdDSEsoa2V5ICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhrZXkgICE9IE5VTEwpOwogICAgIAogICAgIC8qIHRlc3QgcGFyYW1ldGVycyAqLwogICAgIGlmIChudW1fcm91bmRzID09IDApIHsgCkBAIC04MSwxMyArOTQsMTMgQEAKIAogICAgIC8qIHNldHVwIHRoZSBTIGFycmF5ICovCiAgICAgdCA9ICh1bG9uZzMyKSgyICogKG51bV9yb3VuZHMgKyAxKSk7Ci0gICAgbWVtY3B5KFMsIHN0YWIsIHQgKiBzaXplb2YoKlMpKTsKKyAgICBYTUVNQ1BZKFMsIHN0YWIsIHQgKiBzaXplb2YoKlMpKTsKIAogICAgIC8qIG1peCBidWZmZXIgKi8KICAgICBzID0gMyAqIE1BWCh0LCBqKTsKICAgICBsID0gajsKICAgICBmb3IgKEEgPSBCID0gaSA9IGogPSB2ID0gMDsgdiA8IHM7IHYrKykgeyAKLSAgICAgICAgQSA9IFNbaV0gPSBST0woU1tpXSArIEEgKyBCLCAzKTsKKyAgICAgICAgQSA9IFNbaV0gPSBST0xjKFNbaV0gKyBBICsgQiwgMyk7CiAgICAgICAgIEIgPSBMW2pdID0gUk9MKExbal0gKyBBICsgQiwgKEErQikpOwogICAgICAgICBpZiAoKytpID09IHQpIHsgaSA9IDA7IH0KICAgICAgICAgaWYgKCsraiA9PSBsKSB7IGogPSAwOyB9CkBAIC05NSw3ICsxMDgsNyBAQAogICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiBpbnQgcmM1X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7CiAgICBpbnQgeDsKQEAgLTEwNSwyNiArMTE4LDMyIEBACiB9CiAjZW5kaWYKIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfcmM1X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KQorLyoqCisgIEVuY3J5cHRzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIFJDNQorICBAcGFyYW0gcHQgVGhlIGlucHV0IHBsYWludGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIGN0IFRoZSBvdXRwdXQgY2lwaGVydGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQKKyovCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCitzdGF0aWMgdm9pZCBfcmM1X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKICNlbHNlCi12b2lkIHJjNV9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSkKK3ZvaWQgcmM1X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKICNlbmRpZgogewogICAgdWxvbmczMiBBLCBCLCAqSzsKICAgIGludCByOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICAhPSBOVUxMKTsKIAogICAgTE9BRDMyTChBLCAmcHRbMF0pOwogICAgTE9BRDMyTChCLCAmcHRbNF0pOwotICAgQSArPSBrZXktPnJjNS5LWzBdOwotICAgQiArPSBrZXktPnJjNS5LWzFdOwotICAgSyAgPSBrZXktPnJjNS5LICsgMjsKKyAgIEEgKz0gc2tleS0+cmM1LktbMF07CisgICBCICs9IHNrZXktPnJjNS5LWzFdOworICAgSyAgPSBza2V5LT5yYzUuSyArIDI7CiAgICAKLSAgIGlmICgoa2V5LT5yYzUucm91bmRzICYgMSkgPT0gMCkgewotICAgICAgZm9yIChyID0gMDsgciA8IGtleS0+cmM1LnJvdW5kczsgciArPSAyKSB7CisgICBpZiAoKHNrZXktPnJjNS5yb3VuZHMgJiAxKSA9PSAwKSB7CisgICAgICBmb3IgKHIgPSAwOyByIDwgc2tleS0+cmM1LnJvdW5kczsgciArPSAyKSB7CiAgICAgICAgICAgQSA9IFJPTChBIF4gQiwgQikgKyBLWzBdOwogICAgICAgICAgIEIgPSBST0woQiBeIEEsIEEpICsgS1sxXTsKICAgICAgICAgICBBID0gUk9MKEEgXiBCLCBCKSArIEtbMl07CkBAIC0xMzIsNyArMTUxLDcgQEAKICAgICAgICAgICBLICs9IDQ7CiAgICAgICB9CiAgICB9IGVsc2UgewotICAgICAgZm9yIChyID0gMDsgciA8IGtleS0+cmM1LnJvdW5kczsgcisrKSB7CisgICAgICBmb3IgKHIgPSAwOyByIDwgc2tleS0+cmM1LnJvdW5kczsgcisrKSB7CiAgICAgICAgICAgQSA9IFJPTChBIF4gQiwgQikgKyBLWzBdOwogICAgICAgICAgIEIgPSBST0woQiBeIEEsIEEpICsgS1sxXTsKICAgICAgICAgICBLICs9IDI7CkBAIC0xNDIsMzMgKzE2MSwzOSBAQAogICAgU1RPUkUzMkwoQiwgJmN0WzRdKTsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCi12b2lkIHJjNV9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSkKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3ZvaWQgcmM1X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgIF9yYzVfZWNiX2VuY3J5cHQocHQsIGN0LCBrZXkpOworICAgX3JjNV9lY2JfZW5jcnlwdChwdCwgY3QsIHNrZXkpOwogICAgYnVybl9zdGFjayhzaXplb2YodWxvbmczMikgKiAyICsgc2l6ZW9mKGludCkpOwogfQogI2VuZGlmCiAKLSNpZmRlZiBDTEVBTl9TVEFDSwotc3RhdGljIHZvaWQgX3JjNV9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSkKKy8qKgorICBEZWNyeXB0cyBhIGJsb2NrIG9mIHRleHQgd2l0aCBSQzUKKyAgQHBhcmFtIGN0IFRoZSBpbnB1dCBjaXBoZXJ0ZXh0ICg4IGJ5dGVzKQorICBAcGFyYW0gcHQgVGhlIG91dHB1dCBwbGFpbnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkIAorKi8KKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyB2b2lkIF9yYzVfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKLXZvaWQgcmM1X2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KQordm9pZCByYzVfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2VuZGlmCiB7CiAgICB1bG9uZzMyIEEsIEIsICpLOwogICAgaW50IHI7Ci0gICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwdCAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAgICE9IE5VTEwpOwogCiAgICBMT0FEMzJMKEEsICZjdFswXSk7CiAgICBMT0FEMzJMKEIsICZjdFs0XSk7Ci0gICBLID0ga2V5LT5yYzUuSyArIChrZXktPnJjNS5yb3VuZHMgPDwgMSk7CisgICBLID0gc2tleS0+cmM1LksgKyAoc2tleS0+cmM1LnJvdW5kcyA8PCAxKTsKICAgIAotICAgaWYgKChrZXktPnJjNS5yb3VuZHMgJiAxKSA9PSAwKSB7CisgICBpZiAoKHNrZXktPnJjNS5yb3VuZHMgJiAxKSA9PSAwKSB7CiAgICAgICAgSyAtPSAyOwotICAgICAgIGZvciAociA9IGtleS0+cmM1LnJvdW5kcyAtIDE7IHIgPj0gMDsgciAtPSAyKSB7CisgICAgICAgZm9yIChyID0gc2tleS0+cmM1LnJvdW5kcyAtIDE7IHIgPj0gMDsgciAtPSAyKSB7CiAgICAgICAgICAgQiA9IFJPUihCIC0gS1szXSwgQSkgXiBBOwogICAgICAgICAgIEEgPSBST1IoQSAtIEtbMl0sIEIpIF4gQjsKICAgICAgICAgICBCID0gUk9SKEIgLSBLWzFdLCBBKSBeIEE7CkBAIC0xNzYsMjYgKzIwMSwzMCBAQAogICAgICAgICAgIEsgLT0gNDsKICAgICAgICAgfQogICAgfSBlbHNlIHsKLSAgICAgIGZvciAociA9IGtleS0+cmM1LnJvdW5kcyAtIDE7IHIgPj0gMDsgci0tKSB7CisgICAgICBmb3IgKHIgPSBza2V5LT5yYzUucm91bmRzIC0gMTsgciA+PSAwOyByLS0pIHsKICAgICAgICAgICBCID0gUk9SKEIgLSBLWzFdLCBBKSBeIEE7CiAgICAgICAgICAgQSA9IFJPUihBIC0gS1swXSwgQikgXiBCOwogICAgICAgICAgIEsgLT0gMjsKICAgICAgIH0KICAgIH0KLSAgIEEgLT0ga2V5LT5yYzUuS1swXTsKLSAgIEIgLT0ga2V5LT5yYzUuS1sxXTsKKyAgIEEgLT0gc2tleS0+cmM1LktbMF07CisgICBCIC09IHNrZXktPnJjNS5LWzFdOwogICAgU1RPUkUzMkwoQSwgJnB0WzBdKTsKICAgIFNUT1JFMzJMKEIsICZwdFs0XSk7CiB9CiAKLSNpZmRlZiBDTEVBTl9TVEFDSwotdm9pZCByYzVfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCit2b2lkIHJjNV9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7Ci0gICBfcmM1X2VjYl9kZWNyeXB0KGN0LCBwdCwga2V5KTsKKyAgIF9yYzVfZWNiX2RlY3J5cHQoY3QsIHB0LCBza2V5KTsKICAgIGJ1cm5fc3RhY2soc2l6ZW9mKHVsb25nMzIpICogMiArIHNpemVvZihpbnQpKTsKIH0KICNlbmRpZgogCisvKioKKyAgUGVyZm9ybXMgYSBzZWxmLXRlc3Qgb2YgdGhlIFJDNSBibG9jayBjaXBoZXIKKyAgQHJldHVybiBDUllQVF9PSyBpZiBmdW5jdGlvbmFsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0IGhhcyBiZWVuIGRpc2FibGVkCisqLwogaW50IHJjNV90ZXN0KHZvaWQpCiB7CiAgI2lmbmRlZiBMVENfVEVTVApAQCAtMjUyLDEzICsyODEsMjUgQEAKICAgI2VuZGlmCiB9CiAKLWludCByYzVfa2V5c2l6ZShpbnQgKmRlc2lyZWRfa2V5c2l6ZSkKKy8qKiBUZXJtaW5hdGUgdGhlIGNvbnRleHQgCisgICBAcGFyYW0gc2tleSAgICBUaGUgc2NoZWR1bGVkIGtleQorKi8KK3ZvaWQgcmM1X2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgIF9BUkdDSEsoZGVzaXJlZF9rZXlzaXplICE9IE5VTEwpOwotICAgaWYgKCpkZXNpcmVkX2tleXNpemUgPCA4KSB7Cit9CisKKy8qKgorICBHZXRzIHN1aXRhYmxlIGtleSBzaXplCisgIEBwYXJhbSBrZXlzaXplIFtpbi9vdXRdIFRoZSBsZW5ndGggb2YgdGhlIHJlY29tbWVuZGVkIGtleSAoaW4gYnl0ZXMpLiAgVGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIHRoZSBzdWl0YWJsZSBzaXplIGJhY2sgaW4gdGhpcyB2YXJpYWJsZS4KKyAgQHJldHVybiBDUllQVF9PSyBpZiB0aGUgaW5wdXQga2V5IHNpemUgaXMgYWNjZXB0YWJsZS4KKyovCitpbnQgcmM1X2tleXNpemUoaW50ICprZXlzaXplKQoreworICAgTFRDX0FSR0NISyhrZXlzaXplICE9IE5VTEwpOworICAgaWYgKCprZXlzaXplIDwgOCkgewogICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKLSAgIH0gZWxzZSBpZiAoKmRlc2lyZWRfa2V5c2l6ZSA+IDEyOCkgewotICAgICAgKmRlc2lyZWRfa2V5c2l6ZSA9IDEyODsKKyAgIH0gZWxzZSBpZiAoKmtleXNpemUgPiAxMjgpIHsKKyAgICAgICprZXlzaXplID0gMTI4OwogICAgfQogICAgcmV0dXJuIENSWVBUX09LOwogfQpAQCAtMjY3LDMgKzMwOCw3IEBACiAKIAogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9jaXBoZXJzL3JjNS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjcgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvcmM2LmMgYi9zcmMvY2lwaGVycy9yYzYuYwpzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSByYzYuYwpyZW5hbWUgdG8gc3JjL2NpcGhlcnMvcmM2LmMKaW5kZXggOGNjMTY1Yy4uYWU2ZjExNCAxMDA2NDQKLS0tIGEvcmM2LmMKKysrIGIvc3JjL2NpcGhlcnMvcmM2LmMKQEAgLTYsMTUgKzYsMTggQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwogCi0vKiBSQzYgY29kZSBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisvKioKKyAgIEBmaWxlIHJjNi5jCisgICBSQzYgY29kZSBieSBUb20gU3QgRGVuaXMgCisqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKICNpZmRlZiBSQzYKIAotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciByYzZfZGVzYyA9Citjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHJjNl9kZXNjID0KIHsKICAgICAicmM2IiwKICAgICAzLApAQCAtMjMsNyArMjYsOSBAQAogICAgICZyYzZfZWNiX2VuY3J5cHQsCiAgICAgJnJjNl9lY2JfZGVjcnlwdCwKICAgICAmcmM2X3Rlc3QsCi0gICAgJnJjNl9rZXlzaXplCisgICAgJnJjNl9kb25lLAorICAgICZyYzZfa2V5c2l6ZSwKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCiB9OwogCiBzdGF0aWMgY29uc3QgdWxvbmczMiBzdGFiWzQ0XSA9IHsKQEAgLTM0LDcgKzM5LDE1IEBACiAweDdlZDA4ODgzVUwsIDB4MWQwODAyM2NVTCwgMHhiYjNmN2JmNVVMLCAweDU5NzZmNWFlVUwsIDB4ZjdhZTZmNjdVTCwgMHg5NWU1ZTkyMFVMLCAweDM0MWQ2MmQ5VUwsIDB4ZDI1NGRjOTJVTCwKIDB4NzA4YzU2NGJVTCwgMHgwZWMzZDAwNFVMLCAweGFjZmI0OWJkVUwsIDB4NGIzMmMzNzZVTCB9OwogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyAvKioKKyAgICBJbml0aWFsaXplIHRoZSBSQzYgYmxvY2sgY2lwaGVyCisgICAgQHBhcmFtIGtleSBUaGUgc3ltbWV0cmljIGtleSB5b3Ugd2lzaCB0byBwYXNzCisgICAgQHBhcmFtIGtleWxlbiBUaGUga2V5IGxlbmd0aCBpbiBieXRlcworICAgIEBwYXJhbSBudW1fcm91bmRzIFRoZSBudW1iZXIgb2Ygcm91bmRzIGRlc2lyZWQgKDAgZm9yIGRlZmF1bHQpCisgICAgQHBhcmFtIHNrZXkgVGhlIGtleSBpbiBhcyBzY2hlZHVsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAqLworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogc3RhdGljIGludCBfcmM2X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiAjZWxzZQogaW50IHJjNl9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQpAQCAtNDIsOCArNTUsOCBAQAogewogICAgIHVsb25nMzIgTFs2NF0sIFNbNTBdLCBBLCBCLCBpLCBqLCB2LCBzLCBsOwogCi0gICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKIAogICAgIC8qIHRlc3QgcGFyYW1ldGVycyAqLwogICAgIGlmIChudW1fcm91bmRzICE9IDAgJiYgbnVtX3JvdW5kcyAhPSAyMCkgeyAKQEAgLTcxLDEzICs4NCwxMyBAQAogICAgIH0KIAogICAgIC8qIHNldHVwIHRoZSBTIGFycmF5ICovCi0gICAgbWVtY3B5KFMsIHN0YWIsIDQ0ICogc2l6ZW9mKHN0YWJbMF0pKTsKKyAgICBYTUVNQ1BZKFMsIHN0YWIsIDQ0ICogc2l6ZW9mKHN0YWJbMF0pKTsKIAogICAgIC8qIG1peCBidWZmZXIgKi8KICAgICBzID0gMyAqIE1BWCg0NCwgaik7CiAgICAgbCA9IGo7CiAgICAgZm9yIChBID0gQiA9IGkgPSBqID0gdiA9IDA7IHYgPCBzOyB2KyspIHsgCi0gICAgICAgIEEgPSBTW2ldID0gUk9MKFNbaV0gKyBBICsgQiwgMyk7CisgICAgICAgIEEgPSBTW2ldID0gUk9MYyhTW2ldICsgQSArIEIsIDMpOwogICAgICAgICBCID0gTFtqXSA9IFJPTChMW2pdICsgQSArIEIsIChBK0IpKTsKICAgICAgICAgaWYgKCsraSA9PSA0NCkgeyBpID0gMDsgfQogICAgICAgICBpZiAoKytqID09IGwpICB7IGogPSAwOyB9CkBAIC05MCw3ICsxMDMsNyBAQAogICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiBpbnQgcmM2X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7CiAgICBpbnQgeDsKQEAgLTEwMCwzMCArMTEzLDM2IEBACiB9CiAjZW5kaWYKIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfcmM2X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KQorLyoqCisgIEVuY3J5cHRzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIFJDNgorICBAcGFyYW0gcHQgVGhlIGlucHV0IHBsYWludGV4dCAoMTYgYnl0ZXMpCisgIEBwYXJhbSBjdCBUaGUgb3V0cHV0IGNpcGhlcnRleHQgKDE2IGJ5dGVzKQorICBAcGFyYW0gc2tleSBUaGUga2V5IGFzIHNjaGVkdWxlZAorKi8KKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyB2b2lkIF9yYzZfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKLXZvaWQgcmM2X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KQordm9pZCByYzZfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2VuZGlmCiB7CiAgICB1bG9uZzMyIGEsYixjLGQsdCx1LCAqSzsKICAgIGludCByOwogICAgCi0gICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwdCAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAgICE9IE5VTEwpOwogICAgTE9BRDMyTChhLCZwdFswXSk7TE9BRDMyTChiLCZwdFs0XSk7TE9BRDMyTChjLCZwdFs4XSk7TE9BRDMyTChkLCZwdFsxMl0pOwogCi0gICBiICs9IGtleS0+cmM2LktbMF07Ci0gICBkICs9IGtleS0+cmM2LktbMV07CisgICBiICs9IHNrZXktPnJjNi5LWzBdOworICAgZCArPSBza2V5LT5yYzYuS1sxXTsKIAogI2RlZmluZSBSTkQoYSxiLGMsZCkgXAotICAgICAgIHQgPSAoYiAqIChiICsgYiArIDEpKTsgdCA9IFJPTCh0LCA1KTsgXAotICAgICAgIHUgPSAoZCAqIChkICsgZCArIDEpKTsgdSA9IFJPTCh1LCA1KTsgXAorICAgICAgIHQgPSAoYiAqIChiICsgYiArIDEpKTsgdCA9IFJPTGModCwgNSk7IFwKKyAgICAgICB1ID0gKGQgKiAoZCArIGQgKyAxKSk7IHUgPSBST0xjKHUsIDUpOyBcCiAgICAgICAgYSA9IFJPTChhXnQsdSkgKyBLWzBdOyAgICAgICAgICAgICAgICBcCiAgICAgICAgYyA9IFJPTChjXnUsdCkgKyBLWzFdOyBLICs9IDI7ICAgCiAgICAgCi0gICBLID0ga2V5LT5yYzYuSyArIDI7CisgICBLID0gc2tleS0+cmM2LksgKyAyOwogICAgZm9yIChyID0gMDsgciA8IDIwOyByICs9IDQpIHsKICAgICAgICBSTkQoYSxiLGMsZCk7CiAgICAgICAgUk5EKGIsYyxkLGEpOwpAQCAtMTMzLDQzICsxNTIsNDkgQEAKICAgIAogI3VuZGVmIFJORAogCi0gICBhICs9IGtleS0+cmM2LktbNDJdOwotICAgYyArPSBrZXktPnJjNi5LWzQzXTsKKyAgIGEgKz0gc2tleS0+cmM2LktbNDJdOworICAgYyArPSBza2V5LT5yYzYuS1s0M107CiAgICBTVE9SRTMyTChhLCZjdFswXSk7U1RPUkUzMkwoYiwmY3RbNF0pO1NUT1JFMzJMKGMsJmN0WzhdKTtTVE9SRTMyTChkLCZjdFsxMl0pOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXZvaWQgcmM2X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KQorI2lmZGVmIExUQ19DTEVBTl9TVEFDSwordm9pZCByYzZfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogewotICAgX3JjNl9lY2JfZW5jcnlwdChwdCwgY3QsIGtleSk7CisgICBfcmM2X2VjYl9lbmNyeXB0KHB0LCBjdCwgc2tleSk7CiAgICBidXJuX3N0YWNrKHNpemVvZih1bG9uZzMyKSAqIDYgKyBzaXplb2YoaW50KSk7CiB9CiAjZW5kaWYKIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfcmM2X2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KQorLyoqCisgIERlY3J5cHRzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIFJDNgorICBAcGFyYW0gY3QgVGhlIGlucHV0IGNpcGhlcnRleHQgKDE2IGJ5dGVzKQorICBAcGFyYW0gcHQgVGhlIG91dHB1dCBwbGFpbnRleHQgKDE2IGJ5dGVzKQorICBAcGFyYW0gc2tleSBUaGUga2V5IGFzIHNjaGVkdWxlZCAKKyovCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCitzdGF0aWMgdm9pZCBfcmM2X2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSkKICNlbHNlCi12b2lkIHJjNl9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSkKK3ZvaWQgcmM2X2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSkKICNlbmRpZgogewogICAgdWxvbmczMiBhLGIsYyxkLHQsdSwgKks7CiAgICBpbnQgcjsKIAotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICAhPSBOVUxMKTsKICAgIAogICAgTE9BRDMyTChhLCZjdFswXSk7TE9BRDMyTChiLCZjdFs0XSk7TE9BRDMyTChjLCZjdFs4XSk7TE9BRDMyTChkLCZjdFsxMl0pOwotICAgYSAtPSBrZXktPnJjNi5LWzQyXTsKLSAgIGMgLT0ga2V5LT5yYzYuS1s0M107CisgICBhIC09IHNrZXktPnJjNi5LWzQyXTsKKyAgIGMgLT0gc2tleS0+cmM2LktbNDNdOwogICAgCiAjZGVmaW5lIFJORChhLGIsYyxkKSBcCi0gICAgICAgdCA9IChiICogKGIgKyBiICsgMSkpOyB0ID0gUk9MKHQsIDUpOyBcCi0gICAgICAgdSA9IChkICogKGQgKyBkICsgMSkpOyB1ID0gUk9MKHUsIDUpOyBcCisgICAgICAgdCA9IChiICogKGIgKyBiICsgMSkpOyB0ID0gUk9MYyh0LCA1KTsgXAorICAgICAgIHUgPSAoZCAqIChkICsgZCArIDEpKTsgdSA9IFJPTGModSwgNSk7IFwKICAgICAgICBjID0gUk9SKGMgLSBLWzFdLCB0KSBeIHU7IFwKICAgICAgICBhID0gUk9SKGEgLSBLWzBdLCB1KSBeIHQ7IEsgLT0gMjsKICAgIAotICAgSyA9IGtleS0+cmM2LksgKyA0MDsKKyAgIEsgPSBza2V5LT5yYzYuSyArIDQwOwogICAgCiAgICBmb3IgKHIgPSAwOyByIDwgMjA7IHIgKz0gNCkgewogICAgICAgIFJORChkLGEsYixjKTsKQEAgLTE4MCwxOSArMjA1LDIzIEBACiAgICAKICN1bmRlZiBSTkQKIAotICAgYiAtPSBrZXktPnJjNi5LWzBdOwotICAgZCAtPSBrZXktPnJjNi5LWzFdOworICAgYiAtPSBza2V5LT5yYzYuS1swXTsKKyAgIGQgLT0gc2tleS0+cmM2LktbMV07CiAgICBTVE9SRTMyTChhLCZwdFswXSk7U1RPUkUzMkwoYiwmcHRbNF0pO1NUT1JFMzJMKGMsJnB0WzhdKTtTVE9SRTMyTChkLCZwdFsxMl0pOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXZvaWQgcmM2X2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KQorI2lmZGVmIExUQ19DTEVBTl9TVEFDSwordm9pZCByYzZfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogewotICAgX3JjNl9lY2JfZGVjcnlwdChjdCwgcHQsIGtleSk7CisgICBfcmM2X2VjYl9kZWNyeXB0KGN0LCBwdCwgc2tleSk7CiAgICBidXJuX3N0YWNrKHNpemVvZih1bG9uZzMyKSAqIDYgKyBzaXplb2YoaW50KSk7CiB9CiAjZW5kaWYKIAorLyoqCisgIFBlcmZvcm1zIGEgc2VsZi10ZXN0IG9mIHRoZSBSQzYgYmxvY2sgY2lwaGVyCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgZnVuY3Rpb25hbCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdCBoYXMgYmVlbiBkaXNhYmxlZAorKi8KIGludCByYzZfdGVzdCh2b2lkKQogewogICNpZm5kZWYgTFRDX1RFU1QKQEAgLTI4MiwxMyArMzExLDI1IEBACiAgICNlbmRpZgogfQogCi1pbnQgcmM2X2tleXNpemUoaW50ICpkZXNpcmVkX2tleXNpemUpCisvKiogVGVybWluYXRlIHRoZSBjb250ZXh0IAorICAgQHBhcmFtIHNrZXkgICAgVGhlIHNjaGVkdWxlZCBrZXkKKyovCit2b2lkIHJjNl9kb25lKHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7Ci0gICBfQVJHQ0hLKGRlc2lyZWRfa2V5c2l6ZSAhPSBOVUxMKTsKLSAgIGlmICgqZGVzaXJlZF9rZXlzaXplIDwgOCkgeworfQorCisvKioKKyAgR2V0cyBzdWl0YWJsZSBrZXkgc2l6ZQorICBAcGFyYW0ga2V5c2l6ZSBbaW4vb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSByZWNvbW1lbmRlZCBrZXkgKGluIGJ5dGVzKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSB0aGUgc3VpdGFibGUgc2l6ZSBiYWNrIGluIHRoaXMgdmFyaWFibGUuCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdGhlIGlucHV0IGtleSBzaXplIGlzIGFjY2VwdGFibGUuCisqLworaW50IHJjNl9rZXlzaXplKGludCAqa2V5c2l6ZSkKK3sKKyAgIExUQ19BUkdDSEsoa2V5c2l6ZSAhPSBOVUxMKTsKKyAgIGlmICgqa2V5c2l6ZSA8IDgpIHsKICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0tFWVNJWkU7Ci0gICB9IGVsc2UgaWYgKCpkZXNpcmVkX2tleXNpemUgPiAxMjgpIHsKLSAgICAgICpkZXNpcmVkX2tleXNpemUgPSAxMjg7CisgICB9IGVsc2UgaWYgKCprZXlzaXplID4gMTI4KSB7CisgICAgICAqa2V5c2l6ZSA9IDEyODsKICAgIH0KICAgIHJldHVybiBDUllQVF9PSzsKIH0KQEAgLTI5NiwzICszMzcsNyBAQAogI2VuZGlmIC8qUkM2Ki8KIAogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9jaXBoZXJzL3JjNi5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjcgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc2FmZXIuYyBiL3NyYy9jaXBoZXJzL3NhZmVyL3NhZmVyLmMKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gc2FmZXIuYwpyZW5hbWUgdG8gc3JjL2NpcGhlcnMvc2FmZXIvc2FmZXIuYwppbmRleCA1ODA4NzJhLi5iYWQwMGEwIDEwMDY0NAotLS0gYS9zYWZlci5jCisrKyBiL3NyYy9jaXBoZXJzL3NhZmVyL3NhZmVyLmMKQEAgLTYsNyArNiw3IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI4LDExICsyOCwxMSBAQAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgPG15Y3J5cHQuaD4KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgogCiAjaWZkZWYgU0FGRVIKIAotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciAKK2NvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgCiAgICBzYWZlcl9rNjRfZGVzYyA9IHsKICAgICJzYWZlci1rNjQiLCAKICAgIDgsIDgsIDgsIDgsIFNBRkVSX0s2NF9ERUZBVUxUX05PRl9ST1VORFMsCkBAIC00MCw3ICs0MCw5IEBACiAgICAmc2FmZXJfZWNiX2VuY3J5cHQsCiAgICAmc2FmZXJfZWNiX2RlY3J5cHQsCiAgICAmc2FmZXJfazY0X3Rlc3QsCi0gICAmc2FmZXJfNjRfa2V5c2l6ZQorICAgJnNhZmVyX2RvbmUsCisgICAmc2FmZXJfNjRfa2V5c2l6ZSwKKyAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKICAgIH0sCiAKICAgIHNhZmVyX3NrNjRfZGVzYyA9IHsKQEAgLTUwLDcgKzUyLDkgQEAKICAgICZzYWZlcl9lY2JfZW5jcnlwdCwKICAgICZzYWZlcl9lY2JfZGVjcnlwdCwKICAgICZzYWZlcl9zazY0X3Rlc3QsCi0gICAmc2FmZXJfNjRfa2V5c2l6ZQorICAgJnNhZmVyX2RvbmUsCisgICAmc2FmZXJfNjRfa2V5c2l6ZSwKKyAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKICAgIH0sCiAKICAgIHNhZmVyX2sxMjhfZGVzYyA9IHsKQEAgLTYwLDcgKzY0LDkgQEAKICAgICZzYWZlcl9lY2JfZW5jcnlwdCwKICAgICZzYWZlcl9lY2JfZGVjcnlwdCwKICAgICZzYWZlcl9zazEyOF90ZXN0LAotICAgJnNhZmVyXzEyOF9rZXlzaXplCisgICAmc2FmZXJfZG9uZSwKKyAgICZzYWZlcl8xMjhfa2V5c2l6ZSwKKyAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKICAgIH0sCiAKICAgIHNhZmVyX3NrMTI4X2Rlc2MgPSB7CkBAIC03MCwxMSArNzYsMTMgQEAKICAgICZzYWZlcl9lY2JfZW5jcnlwdCwKICAgICZzYWZlcl9lY2JfZGVjcnlwdCwKICAgICZzYWZlcl9zazEyOF90ZXN0LAotICAgJnNhZmVyXzEyOF9rZXlzaXplCisgICAmc2FmZXJfZG9uZSwKKyAgICZzYWZlcl8xMjhfa2V5c2l6ZSwKKyAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKICAgIH07CiAKIC8qKioqKioqKioqKioqKioqKioqIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyAjZGVmaW5lIFRBQl9MRU4gICAgICAyNTYKKy8qICNkZWZpbmUgVEFCX0xFTiAgICAgIDI1NiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKiogQXNzZXJ0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtODksNyArOTcsNyBAQAogLyoqKioqKioqKioqKioqKioqKiogVHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHNhZmVyX2Vib3hbXSwgc2FmZXJfbGJveFtdOwogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKIHN0YXRpYyB2b2lkIF9TYWZlcl9FeHBhbmRfVXNlcmtleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2Vya2V5XzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp1c2Vya2V5XzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbm9mX3JvdW5kcywKQEAgLTE1MSwxMyArMTU5LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKICAgICB6ZXJvbWVtKGthLCBzaXplb2Yoa2EpKTsKICAgICB6ZXJvbWVtKGtiLCBzaXplb2Yoa2IpKTsKICNlbmRpZgogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKIHN0YXRpYyB2b2lkIFNhZmVyX0V4cGFuZF9Vc2Vya2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJrZXlfMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJrZXlfMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBub2Zfcm91bmRzLApAQCAtMTcxLDggKzE3OSw4IEBACiAKIGludCBzYWZlcl9rNjRfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQogewotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKIAogICAgaWYgKG51bXJvdW5kcyAhPSAwICYmIChudW1yb3VuZHMgPCA2IHx8IG51bXJvdW5kcyA+IFNBRkVSX01BWF9OT0ZfUk9VTkRTKSkgewogICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUk9VTkRTOwpAQCAtMTg4LDggKzE5Niw4IEBACiAgICAKIGludCBzYWZlcl9zazY0X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bXJvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOwotICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CiAKICAgIGlmIChudW1yb3VuZHMgIT0gMCAmJiAobnVtcm91bmRzIDwgNiB8fCBudW1yb3VuZHMgPiBTQUZFUl9NQVhfTk9GX1JPVU5EUykpIHsKICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1JPVU5EUzsKQEAgLTIwNSw4ICsyMTMsOCBAQAogCiBpbnQgc2FmZXJfazEyOF9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7Ci0gICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoc2tleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogCiAgICBpZiAobnVtcm91bmRzICE9IDAgJiYgKG51bXJvdW5kcyA8IDYgfHwgbnVtcm91bmRzID4gU0FGRVJfTUFYX05PRl9ST1VORFMpKSB7CiAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9ST1VORFM7CkBAIC0yMjIsOCArMjMwLDggQEAKIAogaW50IHNhZmVyX3NrMTI4X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bXJvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOwotICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CiAKICAgIGlmIChudW1yb3VuZHMgIT0gMCAmJiAobnVtcm91bmRzIDwgNiB8fCBudW1yb3VuZHMgPiBTQUZFUl9NQVhfTk9GX1JPVU5EUykpIHsKICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1JPVU5EUzsKQEAgLTIzNyw3ICsyNDUsNyBAQAogICAgcmV0dXJuIENSWVBUX09LOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKIHN0YXRpYyB2b2lkIF9zYWZlcl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpibG9ja19pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYmxvY2tfb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1tZXRyaWNfa2V5ICpza2V5KQpAQCAtMjUwLDkgKzI1OCw5IEBACiAgICAgdW5zaWduZWQgaW50IHJvdW5kOwogICAgIHVuc2lnbmVkIGNoYXIgKmtleTsKIAotICAgIF9BUkdDSEsoYmxvY2tfaW4gIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhibG9ja19vdXQgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoYmxvY2tfaW4gIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhibG9ja19vdXQgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogCiAgICAga2V5ID0gc2tleS0+c2FmZXIua2V5OwogICAgIGEgPSBibG9ja19pblswXTsgYiA9IGJsb2NrX2luWzFdOyBjID0gYmxvY2tfaW5bMl07IGQgPSBibG9ja19pblszXTsKQEAgLTI3OSw3ICsyODcsNyBAQAogICAgIGJsb2NrX291dFs2XSA9IGcgJiAweEZGOyBibG9ja19vdXRbN10gPSBoICYgMHhGRjsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiB2b2lkIHNhZmVyX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsb2NrX2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpibG9ja19vdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW1ldHJpY19rZXkgKnNrZXkpCkBAIC0yODksNyArMjk3LDcgQEAKIH0KICNlbmRpZgogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKIHN0YXRpYyB2b2lkIF9zYWZlcl9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpibG9ja19pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYmxvY2tfb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1tZXRyaWNfa2V5ICpza2V5KQpAQCAtMzAyLDkgKzMxMCw5IEBACiAgICAgdW5zaWduZWQgaW50IHJvdW5kOwogICAgIHVuc2lnbmVkIGNoYXIgKmtleTsKIAotICAgIF9BUkdDSEsoYmxvY2tfaW4gIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhibG9ja19vdXQgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoYmxvY2tfaW4gIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhibG9ja19vdXQgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogCiAgICAga2V5ID0gc2tleS0+c2FmZXIua2V5OwogICAgIGEgPSBibG9ja19pblswXTsgYiA9IGJsb2NrX2luWzFdOyBjID0gYmxvY2tfaW5bMl07IGQgPSBibG9ja19pblszXTsKQEAgLTMzMiw3ICszNDAsNyBAQAogICAgIGJsb2NrX291dFs2XSA9IGcgJiAweEZGOyBibG9ja19vdXRbN10gPSBoICYgMHhGRjsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiB2b2lkIHNhZmVyX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJsb2NrX2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpibG9ja19vdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW1ldHJpY19rZXkgKnNrZXkpCkBAIC0zNDQsNyArMzUyLDcgQEAKIAogaW50IHNhZmVyXzY0X2tleXNpemUoaW50ICprZXlzaXplKQogewotICAgX0FSR0NISyhrZXlzaXplICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXlzaXplICE9IE5VTEwpOwogICAgaWYgKCprZXlzaXplIDwgOCkgewogICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKICAgIH0gZWxzZSB7CkBAIC0zNTUsNyArMzYzLDcgQEAKIAogaW50IHNhZmVyXzEyOF9rZXlzaXplKGludCAqa2V5c2l6ZSkKIHsKLSAgIF9BUkdDSEsoa2V5c2l6ZSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5c2l6ZSAhPSBOVUxMKTsKICAgIGlmICgqa2V5c2l6ZSA8IDE2KSB7CiAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOwogICAgfSBlbHNlIHsKQEAgLTQyOCw2ICs0MzYsMTMgQEAKICAgI2VuZGlmCiB9CiAKKy8qKiBUZXJtaW5hdGUgdGhlIGNvbnRleHQgCisgICBAcGFyYW0gc2tleSAgICBUaGUgc2NoZWR1bGVkIGtleQorKi8KK3ZvaWQgc2FmZXJfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KQoreworfQorCiBpbnQgc2FmZXJfc2sxMjhfdGVzdCh2b2lkKQogewogICNpZm5kZWYgTFRDX1RFU1QKQEAgLTQ2NiwzICs0ODEsNyBAQAogCiAKIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvY2lwaGVycy9zYWZlci9zYWZlci5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjggJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc2FmZXJfdGFiLmMgYi9zcmMvY2lwaGVycy9zYWZlci9zYWZlcl90YWIuYwpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBzYWZlcl90YWIuYwpyZW5hbWUgdG8gc3JjL2NpcGhlcnMvc2FmZXIvc2FmZXJfdGFiLmMKaW5kZXggMDY4NTlkYi4uNDdmYmQxYyAxMDA2NDQKLS0tIGEvc2FmZXJfdGFiLmMKKysrIGIvc3JjL2NpcGhlcnMvc2FmZXIvc2FmZXJfdGFiLmMKQEAgLTYsMTAgKzYsMTUgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwogCi0jaW5jbHVkZSAibXljcnlwdC5oIgorLyoqCisgIEBmaWxlIHNhZmVyX3RhYi5jCisgIFRhYmxlcyBmb3IgU0FGRVIgYmxvY2sgY2lwaGVycworKi8gCisgCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAogI2lmIGRlZmluZWQoU0FGRVJQKSB8fCBkZWZpbmVkKFNBRkVSKQogCkBAIC01NywzICs2Miw3IEBACiAjZW5kaWYKIAogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9jaXBoZXJzL3NhZmVyL3NhZmVyX3RhYi5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc2FmZXJwLmMgYi9zcmMvY2lwaGVycy9zYWZlci9zYWZlcnAuYwpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBzYWZlcnAuYwpyZW5hbWUgdG8gc3JjL2NpcGhlcnMvc2FmZXIvc2FmZXJwLmMKaW5kZXggODQxNWRlYi4uNmQwZDU4OSAxMDA2NDQKLS0tIGEvc2FmZXJwLmMKKysrIGIvc3JjL2NpcGhlcnMvc2FmZXIvc2FmZXJwLmMKQEAgLTYsMTUgKzYsMTggQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwogCi0vKiBTQUZFUisgSW1wbGVtZW50YXRpb24gYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorLyoqIAorICAgQGZpbGUgc2FmZXJwLmMKKyAgIFNBRkVSKyBJbXBsZW1lbnRhdGlvbiBieSBUb20gU3QgRGVuaXMgCisqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKICNpZmRlZiBTQUZFUlAKIAotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciBzYWZlcnBfZGVzYyA9Citjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHNhZmVycF9kZXNjID0KIHsKICAgICAic2FmZXIrIiwKICAgICA0LApAQCAtMjMsNyArMjYsOSBAQAogICAgICZzYWZlcnBfZWNiX2VuY3J5cHQsCiAgICAgJnNhZmVycF9lY2JfZGVjcnlwdCwKICAgICAmc2FmZXJwX3Rlc3QsCi0gICAgJnNhZmVycF9rZXlzaXplCisgICAgJnNhZmVycF9kb25lLAorICAgICZzYWZlcnBfa2V5c2l6ZSwKKyAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCiB9OwogCiAvKiBST1VORChiLGkpIApAQCAtMTI5LDcgKzEzNCw3IEBACiAgICAgaVNIVUYoYjIsIGIpOyBpUEhUKGIpOyAgICBcCiAgICAgaVNIVUYoYiwgYjIpOyBpUEhUKGIyKTsKICAgICAKLSNpZmRlZiBTTUFMTF9DT0RFICAgIAorI2lmZGVmIExUQ19TTUFMTF9DT0RFICAgIAogCiBzdGF0aWMgdm9pZCBfcm91bmQodW5zaWduZWQgY2hhciAqYiwgaW50IGksIHN5bW1ldHJpY19rZXkgKnNrZXkpIAogewpAQCAtMjAwLDE0ICsyMDUsMjIgQEAKIHsgIDUzLCAgNzIsIDE1NiwgIDgxLCAgNDcsICA1OSwgIDg1LCAyMjcsIDE5MiwgMTU5LCAyMTYsIDIxMSwgMjQzLCAxNDEsIDE3NywgMjU1fSwKIHsgIDYyLCAyMjAsIDEzNCwgMTE5LCAyMTUsIDE2NiwgIDE3LCAyNTEsIDI0NCwgMTg2LCAxNDYsIDE0NSwgMTAwLCAxMzEsIDI0MSwgIDUxfX07CiAKKyAvKioKKyAgICBJbml0aWFsaXplIHRoZSBTQUZFUisgYmxvY2sgY2lwaGVyCisgICAgQHBhcmFtIGtleSBUaGUgc3ltbWV0cmljIGtleSB5b3Ugd2lzaCB0byBwYXNzCisgICAgQHBhcmFtIGtleWxlbiBUaGUga2V5IGxlbmd0aCBpbiBieXRlcworICAgIEBwYXJhbSBudW1fcm91bmRzIFRoZSBudW1iZXIgb2Ygcm91bmRzIGRlc2lyZWQgKDAgZm9yIGRlZmF1bHQpCisgICAgQHBhcmFtIHNrZXkgVGhlIGtleSBpbiBhcyBzY2hlZHVsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAqLwogaW50IHNhZmVycF9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQogewogICAgdW5zaWduZWQgeCwgeSwgejsKICAgIHVuc2lnbmVkIGNoYXIgdFszM107CiAgICBzdGF0aWMgY29uc3QgaW50IHJvdW5kc1szXSA9IHsgOCwgMTIsIDE2IH07CiAKLSAgIF9BUkdDSEsoa2V5ICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoc2tleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKIAogICAgLyogY2hlY2sgYXJndW1lbnRzICovCiAgICBpZiAoa2V5bGVuICE9IDE2ICYmIGtleWxlbiAhPSAyNCAmJiBrZXlsZW4gIT0gMzIpIHsKQEAgLTMwNSwyMCArMzE4LDI2IEBACiAgICAgICAgfQogICAgICAgIHNrZXktPnNhZmVycC5yb3VuZHMgPSAxNjsKICAgIH0KLSNpZmRlZiBDTEVBTl9TVEFDSworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogICAgemVyb21lbSh0LCBzaXplb2YodCkpOwogI2VuZGlmCiAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKKy8qKgorICBFbmNyeXB0cyBhIGJsb2NrIG9mIHRleHQgd2l0aCBTQUZFUisKKyAgQHBhcmFtIHB0IFRoZSBpbnB1dCBwbGFpbnRleHQgKDE2IGJ5dGVzKQorICBAcGFyYW0gY3QgVGhlIG91dHB1dCBjaXBoZXJ0ZXh0ICgxNiBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQKKyovCiB2b2lkIHNhZmVycF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7CiAgICB1bnNpZ25lZCBjaGFyIGJbMTZdOwogICAgaW50IHg7CiAKLSAgIF9BUkdDSEsocHQgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY3QgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoc2tleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKIAogICAgLyogZG8gZWlnaHQgcm91bmRzICovCiAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykgewpAQCAtMzYyLDE5ICszODEsMjUgQEAKICAgIGN0WzEzXSA9IChiWzEzXSArIHNrZXktPnNhZmVycC5LW3NrZXktPnNhZmVycC5yb3VuZHMqMl1bMTNdKSAmIDI1NTsKICAgIGN0WzE0XSA9IChiWzE0XSArIHNrZXktPnNhZmVycC5LW3NrZXktPnNhZmVycC5yb3VuZHMqMl1bMTRdKSAmIDI1NTsKICAgIGN0WzE1XSA9IGJbMTVdIF4gc2tleS0+c2FmZXJwLktbc2tleS0+c2FmZXJwLnJvdW5kcyoyXVsxNV07Ci0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKICAgIHplcm9tZW0oYiwgc2l6ZW9mKGIpKTsKICNlbmRpZgogfQogCisvKioKKyAgRGVjcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggU0FGRVIrCisgIEBwYXJhbSBjdCBUaGUgaW5wdXQgY2lwaGVydGV4dCAoMTYgYnl0ZXMpCisgIEBwYXJhbSBwdCBUaGUgb3V0cHV0IHBsYWludGV4dCAoMTYgYnl0ZXMpCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkIAorKi8KIHZvaWQgc2FmZXJwX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKICAgIHVuc2lnbmVkIGNoYXIgYlsxNl07CiAgICBpbnQgeDsKIAotICAgX0FSR0NISyhwdCAgICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAgICE9IE5VTEwpOwotICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwdCAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogCiAgICAvKiBkbyBlaWdodCByb3VuZHMgKi8KICAgIGJbMF0gPSBjdFswXSBeIHNrZXktPnNhZmVycC5LW3NrZXktPnNhZmVycC5yb3VuZHMqMl1bMF07CkBAIC00MTgsMTEgKzQ0MywxNSBAQAogICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspIHsKICAgICAgICBwdFt4XSA9IGJbeF07CiAgICB9Ci0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKICAgIHplcm9tZW0oYiwgc2l6ZW9mKGIpKTsKICNlbmRpZgogfQogCisvKioKKyAgUGVyZm9ybXMgYSBzZWxmLXRlc3Qgb2YgdGhlIFNBRkVSKyBibG9jayBjaXBoZXIKKyAgQHJldHVybiBDUllQVF9PSyBpZiBmdW5jdGlvbmFsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0IGhhcyBiZWVuIGRpc2FibGVkCisqLwogaW50IHNhZmVycF90ZXN0KHZvaWQpCiB7CiAgI2lmbmRlZiBMVENfVEVTVApAQCAtNDg5LDE4ICs1MTgsMzAgQEAKICAjZW5kaWYKIH0KIAotaW50IHNhZmVycF9rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKQorLyoqIFRlcm1pbmF0ZSB0aGUgY29udGV4dCAKKyAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5CisqLwordm9pZCBzYWZlcnBfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KQogewotICAgX0FSR0NISyhkZXNpcmVkX2tleXNpemUgIT0gTlVMTCk7Cit9CisKKy8qKgorICBHZXRzIHN1aXRhYmxlIGtleSBzaXplCisgIEBwYXJhbSBrZXlzaXplIFtpbi9vdXRdIFRoZSBsZW5ndGggb2YgdGhlIHJlY29tbWVuZGVkIGtleSAoaW4gYnl0ZXMpLiAgVGhpcyBmdW5jdGlvbiB3aWxsIHN0b3JlIHRoZSBzdWl0YWJsZSBzaXplIGJhY2sgaW4gdGhpcyB2YXJpYWJsZS4KKyAgQHJldHVybiBDUllQVF9PSyBpZiB0aGUgaW5wdXQga2V5IHNpemUgaXMgYWNjZXB0YWJsZS4KKyovCitpbnQgc2FmZXJwX2tleXNpemUoaW50ICprZXlzaXplKQoreworICAgTFRDX0FSR0NISyhrZXlzaXplICE9IE5VTEwpOwogICAgCi0gICBpZiAoKmRlc2lyZWRfa2V5c2l6ZSA8IDE2KQorICAgaWYgKCprZXlzaXplIDwgMTYpCiAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOwotICAgaWYgKCpkZXNpcmVkX2tleXNpemUgPCAyNCkgewotICAgICAgKmRlc2lyZWRfa2V5c2l6ZSA9IDE2OwotICAgfSBlbHNlIGlmICgqZGVzaXJlZF9rZXlzaXplIDwgMzIpIHsKLSAgICAgICpkZXNpcmVkX2tleXNpemUgPSAyNDsKKyAgIGlmICgqa2V5c2l6ZSA8IDI0KSB7CisgICAgICAqa2V5c2l6ZSA9IDE2OworICAgfSBlbHNlIGlmICgqa2V5c2l6ZSA8IDMyKSB7CisgICAgICAqa2V5c2l6ZSA9IDI0OwogICAgfSBlbHNlIHsKLSAgICAgICpkZXNpcmVkX2tleXNpemUgPSAzMjsKKyAgICAgICprZXlzaXplID0gMzI7CiAgICB9CiAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CkBAIC01MDgsMyArNTQ5LDcgQEAKICNlbmRpZgogCiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2NpcGhlcnMvc2FmZXIvc2FmZXJwLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9za2lwamFjay5jIGIvc3JjL2NpcGhlcnMvc2tpcGphY2suYwpzaW1pbGFyaXR5IGluZGV4IDc0JQpyZW5hbWUgZnJvbSBza2lwamFjay5jCnJlbmFtZSB0byBzcmMvY2lwaGVycy9za2lwamFjay5jCmluZGV4IGE2NmVmYTEuLjRjYjNiZjIgMTAwNjQ0Ci0tLSBhL3NraXBqYWNrLmMKKysrIGIvc3JjL2NpcGhlcnMvc2tpcGphY2suYwpAQCAtNiwxNSArNiwxOCBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCiAKLS8qIFNraXBqYWNrIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKKy8qKgorICBAZmlsZSBza2lwamFjay5jCisgIFNraXBqYWNrIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcworKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgogCiAjaWZkZWYgU0tJUEpBQ0sKIAotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciBza2lwamFja19kZXNjID0KK2NvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3Igc2tpcGphY2tfZGVzYyA9CiB7CiAgICAgInNraXBqYWNrIiwKICAgICAxNywKQEAgLTIzLDcgKzI2LDkgQEAKICAgICAmc2tpcGphY2tfZWNiX2VuY3J5cHQsCiAgICAgJnNraXBqYWNrX2VjYl9kZWNyeXB0LAogICAgICZza2lwamFja190ZXN0LAotICAgICZza2lwamFja19rZXlzaXplCisgICAgJnNraXBqYWNrX2RvbmUsCisgICAgJnNraXBqYWNrX2tleXNpemUsCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc2JveFsyNTZdID0gewpAQCAtNTEsMTIgKzU2LDIwIEBACiAvKiBzaW1wbGUgeCAtIDEgKG1vZCAxMCkgaW4gb25lIHN0ZXAgKi8KIHN0YXRpYyBjb25zdCBpbnQgaWtleXN0ZXBbXSA9IHsgOSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCB9OwogCisgLyoqCisgICAgSW5pdGlhbGl6ZSB0aGUgU2tpcGphY2sgYmxvY2sgY2lwaGVyCisgICAgQHBhcmFtIGtleSBUaGUgc3ltbWV0cmljIGtleSB5b3Ugd2lzaCB0byBwYXNzCisgICAgQHBhcmFtIGtleWxlbiBUaGUga2V5IGxlbmd0aCBpbiBieXRlcworICAgIEBwYXJhbSBudW1fcm91bmRzIFRoZSBudW1iZXIgb2Ygcm91bmRzIGRlc2lyZWQgKDAgZm9yIGRlZmF1bHQpCisgICAgQHBhcmFtIHNrZXkgVGhlIGtleSBpbiBhcyBzY2hlZHVsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAqLwogaW50IHNraXBqYWNrX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7CiAgICBpbnQgeDsKIAotICAgX0FSR0NISyhrZXkgICE9IE5VTEwpOwotICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogCiAgICBpZiAoa2V5bGVuICE9IDEwKSB7CiAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOwpAQCAtNzUsMjQgKzg4LDI0IEBACiB9CiAKICNkZWZpbmUgUlVMRV9BIFwKLSAgIHRtcCA9IGdfZnVuYyh3MSwgJmtwLCBrZXktPnNraXBqYWNrLmtleSk7ICAgICAgXAorICAgdG1wID0gZ19mdW5jKHcxLCAma3AsIHNrZXktPnNraXBqYWNrLmtleSk7ICAgICAgXAogICAgdzEgID0gdG1wIF4gdzQgXiB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB3NCAgPSB3MzsgdzMgPSB3MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIHcyICA9IHRtcDsKIAogI2RlZmluZSBSVUxFX0IgXAotICAgdG1wICA9IGdfZnVuYyh3MSwgJmtwLCBrZXktPnNraXBqYWNrLmtleSk7ICAgICBcCisgICB0bXAgID0gZ19mdW5jKHcxLCAma3AsIHNrZXktPnNraXBqYWNrLmtleSk7ICAgICBcCiAgICB0bXAxID0gdzQ7IHc0ICA9IHczOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIHczICAgPSB3MSBeIHcyIF4geDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgdzEgICA9IHRtcDE7IHcyID0gdG1wOwogCiAjZGVmaW5lIFJVTEVfQTEgXAogICAgdG1wID0gdzEgXiB3MiBeIHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB3MSAgPSBpZ19mdW5jKHcyLCAma3AsIGtleS0+c2tpcGphY2sua2V5KTsgICAgIFwKKyAgIHcxICA9IGlnX2Z1bmModzIsICZrcCwgc2tleS0+c2tpcGphY2sua2V5KTsgICAgIFwKICAgIHcyICA9IHczOyB3MyA9IHc0OyB3NCA9IHRtcDsKIAogI2RlZmluZSBSVUxFX0IxIFwKLSAgIHRtcCA9IGlnX2Z1bmModzIsICZrcCwga2V5LT5za2lwamFjay5rZXkpOyAgICAgXAorICAgdG1wID0gaWdfZnVuYyh3MiwgJmtwLCBza2V5LT5za2lwamFjay5rZXkpOyAgICAgXAogICAgdzIgID0gdG1wIF4gdzMgXiB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB3MyAgPSB3NDsgdzQgPSB3MTsgdzEgPSB0bXA7CiAKQEAgLTEyMCwxOCArMTMzLDI0IEBACiAgICByZXR1cm4gKCh1bnNpZ25lZClnMTw8OCl8KHVuc2lnbmVkKWcyOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIF9za2lwamFja19lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSkKKy8qKgorICBFbmNyeXB0cyBhIGJsb2NrIG9mIHRleHQgd2l0aCBTa2lwamFjaworICBAcGFyYW0gcHQgVGhlIGlucHV0IHBsYWludGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIGN0IFRoZSBvdXRwdXQgY2lwaGVydGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQKKyovCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCitzdGF0aWMgdm9pZCBfc2tpcGphY2tfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKLXZvaWQgc2tpcGphY2tfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICprZXkpCit2b2lkIHNraXBqYWNrX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSkKICNlbmRpZgogewogICAgdW5zaWduZWQgdzEsdzIsdzMsdzQsdG1wLHRtcDE7CiAgICBpbnQgeCwga3A7CiAKLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHB0ICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CiAKICAgIC8qIGxvYWQgYmxvY2sgKi8KICAgIHcxID0gKCh1bnNpZ25lZClwdFswXTw8OCl8cHRbMV07CkBAIC0xNjYsMjYgKzE4NSwzMiBAQAogICAgY3RbNl0gPSAodzQ+PjgpJjI1NTsgY3RbN10gPSB3NCYyNTU7CiB9CiAKLSNpZmRlZiBDTEVBTl9TVEFDSwotdm9pZCBza2lwamFja19lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSkKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3ZvaWQgc2tpcGphY2tfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogewotICAgX3NraXBqYWNrX2VjYl9lbmNyeXB0KHB0LCBjdCwga2V5KTsKKyAgIF9za2lwamFja19lY2JfZW5jcnlwdChwdCwgY3QsIHNrZXkpOwogICAgYnVybl9zdGFjayhzaXplb2YodW5zaWduZWQpICogOCArIHNpemVvZihpbnQpICogMik7CiB9CiAjZW5kaWYKIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfc2tpcGphY2tfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICprZXkpCisvKioKKyAgRGVjcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggU2tpcGphY2sKKyAgQHBhcmFtIGN0IFRoZSBpbnB1dCBjaXBoZXJ0ZXh0ICg4IGJ5dGVzKQorICBAcGFyYW0gcHQgVGhlIG91dHB1dCBwbGFpbnRleHQgKDggYnl0ZXMpCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkIAorKi8KKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyB2b2lkIF9za2lwamFja19lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiAjZWxzZQotdm9pZCBza2lwamFja19lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSkKK3ZvaWQgc2tpcGphY2tfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2VuZGlmCiB7CiAgICB1bnNpZ25lZCB3MSx3Mix3Myx3NCx0bXA7CiAgICBpbnQgeCwga3A7CiAKLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHB0ICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHNrZXkgIT0gTlVMTCk7CiAKICAgIC8qIGxvYWQgYmxvY2sgKi8KICAgIHcxID0gKCh1bnNpZ25lZCljdFswXTw8OCl8Y3RbMV07CkBAIC0yMjQsMTQgKzI0OSwxOCBAQAogICAgcHRbNl0gPSAodzQ+PjgpJjI1NTsgcHRbN10gPSB3NCYyNTU7CiB9CiAKLSNpZmRlZiBDTEVBTl9TVEFDSwotdm9pZCBza2lwamFja19lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSkKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3ZvaWQgc2tpcGphY2tfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogewotICAgX3NraXBqYWNrX2VjYl9kZWNyeXB0KGN0LCBwdCwga2V5KTsKKyAgIF9za2lwamFja19lY2JfZGVjcnlwdChjdCwgcHQsIHNrZXkpOwogICAgYnVybl9zdGFjayhzaXplb2YodW5zaWduZWQpICogNyArIHNpemVvZihpbnQpICogMik7CiB9CiAjZW5kaWYKIAorLyoqCisgIFBlcmZvcm1zIGEgc2VsZi10ZXN0IG9mIHRoZSBTa2lwamFjayBibG9jayBjaXBoZXIKKyAgQHJldHVybiBDUllQVF9PSyBpZiBmdW5jdGlvbmFsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0IGhhcyBiZWVuIGRpc2FibGVkCisqLwogaW50IHNraXBqYWNrX3Rlc3Qodm9pZCkKIHsKICAjaWZuZGVmIExUQ19URVNUCkBAIC0yNzYsMTUgKzMwNSwzMSBAQAogICAjZW5kaWYKIH0KIAotaW50IHNraXBqYWNrX2tleXNpemUoaW50ICpkZXNpcmVkX2tleXNpemUpCisvKiogVGVybWluYXRlIHRoZSBjb250ZXh0IAorICAgQHBhcmFtIHNrZXkgICAgVGhlIHNjaGVkdWxlZCBrZXkKKyovCit2b2lkIHNraXBqYWNrX2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgIF9BUkdDSEsoZGVzaXJlZF9rZXlzaXplICE9IE5VTEwpOwotICAgaWYgKCpkZXNpcmVkX2tleXNpemUgPCAxMCkgeworfQorCisvKioKKyAgR2V0cyBzdWl0YWJsZSBrZXkgc2l6ZQorICBAcGFyYW0ga2V5c2l6ZSBbaW4vb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSByZWNvbW1lbmRlZCBrZXkgKGluIGJ5dGVzKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSB0aGUgc3VpdGFibGUgc2l6ZSBiYWNrIGluIHRoaXMgdmFyaWFibGUuCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdGhlIGlucHV0IGtleSBzaXplIGlzIGFjY2VwdGFibGUuCisqLworaW50IHNraXBqYWNrX2tleXNpemUoaW50ICprZXlzaXplKQoreworICAgTFRDX0FSR0NISyhrZXlzaXplICE9IE5VTEwpOworICAgaWYgKCprZXlzaXplIDwgMTApIHsKICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0tFWVNJWkU7Ci0gICB9IGVsc2UgaWYgKCpkZXNpcmVkX2tleXNpemUgPiAxMCkgewotICAgICAgKmRlc2lyZWRfa2V5c2l6ZSA9IDEwOworICAgfSBlbHNlIGlmICgqa2V5c2l6ZSA+IDEwKSB7CisgICAgICAqa2V5c2l6ZSA9IDEwOwogICAgfQogICAgcmV0dXJuIENSWVBUX09LOwogfQogCiAjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2NpcGhlcnMvc2tpcGphY2suYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS43ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3R3b2Zpc2guYyBiL3NyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaC5jCnNpbWlsYXJpdHkgaW5kZXggNzklCnJlbmFtZSBmcm9tIHR3b2Zpc2guYwpyZW5hbWUgdG8gc3JjL2NpcGhlcnMvdHdvZmlzaC90d29maXNoLmMKaW5kZXggYjYxOGI5OC4uZjE0N2JhYiAxMDA2NDQKLS0tIGEvdHdvZmlzaC5jCisrKyBiL3NyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaC5jCkBAIC02LDExICs2LDE0IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KIAotLyogSW1wbGVtZW50YXRpb24gb2YgVHdvZmlzaCBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisgLyoqIAorICAgQGZpbGUgdHdvZmlzaC5jCisgICBJbXBsZW1lbnRhdGlvbiBvZiBUd29maXNoIGJ5IFRvbSBTdCBEZW5pcyAKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKICNpZmRlZiBUV09GSVNICiAKQEAgLTIxLDcgKzI0LDcgQEAKICNlbmRpZgogI2VuZGlmCiAKLWNvbnN0IHN0cnVjdCBfY2lwaGVyX2Rlc2NyaXB0b3IgdHdvZmlzaF9kZXNjID0KK2NvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgdHdvZmlzaF9kZXNjID0KIHsKICAgICAidHdvZmlzaCIsCiAgICAgNywKQEAgLTMwLDcgKzMzLDkgQEAKICAgICAmdHdvZmlzaF9lY2JfZW5jcnlwdCwKICAgICAmdHdvZmlzaF9lY2JfZGVjcnlwdCwKICAgICAmdHdvZmlzaF90ZXN0LAotICAgICZ0d29maXNoX2tleXNpemUKKyAgICAmdHdvZmlzaF9kb25lLAorICAgICZ0d29maXNoX2tleXNpemUsCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAogfTsKIAogLyogdGhlIHR3byBwb2x5bm9taWFscyAqLwpAQCAtMzgsMTIgKzQzLDE0IEBACiAjZGVmaW5lIFJTX1BPTFkgICAgICAgICAgIDB4MTRECiAKIC8qIFRoZSA0eDQgTURTIExpbmVhciBUcmFuc2Zvcm0gKi8KKyNpZiAwCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBNRFNbNF1bNF0gPSB7CiAgICAgeyAweDAxLCAweEVGLCAweDVCLCAweDVCIH0sCiAgICAgeyAweDVCLCAweEVGLCAweEVGLCAweDAxIH0sCiAgICAgeyAweEVGLCAweDVCLCAweDAxLCAweEVGIH0sCiAgICAgeyAweEVGLCAweDAxLCAweEVGLCAweDVCIH0KIH07CisjZW5kaWYKIAogLyogVGhlIDR4OCBSUyBMaW5lYXIgVHJhbnNmb3JtICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBSU1s0XVs4XSA9IHsKQEAgLTg2LDcgKzkzLDcgQEAKIH07CiAKIC8qIGNvbXB1dGVzIFNfaVt4XSAqLwotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiBzdGF0aWMgdWxvbmczMiBfc2JveChpbnQgaSwgdWxvbmczMiB4KQogI2Vsc2UKIHN0YXRpYyB1bG9uZzMyIHNib3goaW50IGksIHVsb25nMzIgeCkKQEAgLTEyNSw3ICsxMzIsNyBAQAogICAgcmV0dXJuICh1bG9uZzMyKXk7CiB9CiAKLSNpZmRlZiBDTEVBTl9TVEFDSworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogc3RhdGljIHVsb25nMzIgc2JveChpbnQgaSwgdWxvbmczMiB4KQogewogICAgdWxvbmczMiB5OwpAQCAtMTMzLDcgKzE0MCw3IEBACiAgICBidXJuX3N0YWNrKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDExKTsKICAgIHJldHVybiB5OwogfQotI2VuZGlmIC8qIENMRUFOX1NUQUNLICovCisjZW5kaWYgLyogTFRDX0NMRUFOX1NUQUNLICovCiAKICNlbmRpZiAvKiBUV09GSVNIX1RBQkxFUyAqLwogCkBAIC0yNzAsMTAgKzI3NywxMCBAQAogCiAvKiBmb3IgR0NDIHdlIGRvbid0IHVzZSBwb2ludGVyIGFsaWFzZXMgKi8KICNpZiBkZWZpbmVkKF9fR05VQ19fKQotICAgICNkZWZpbmUgUzEga2V5LT50d29maXNoLlNbMF0KLSAgICAjZGVmaW5lIFMyIGtleS0+dHdvZmlzaC5TWzFdCi0gICAgI2RlZmluZSBTMyBrZXktPnR3b2Zpc2guU1syXQotICAgICNkZWZpbmUgUzQga2V5LT50d29maXNoLlNbM10KKyAgICAjZGVmaW5lIFMxIHNrZXktPnR3b2Zpc2guU1swXQorICAgICNkZWZpbmUgUzIgc2tleS0+dHdvZmlzaC5TWzFdCisgICAgI2RlZmluZSBTMyBza2V5LT50d29maXNoLlNbMl0KKyAgICAjZGVmaW5lIFM0IHNrZXktPnR3b2Zpc2guU1szXQogI2VuZGlmCiAKIC8qIHRoZSBHIGZ1bmN0aW9uICovCkBAIC0yODIsNyArMjg5LDcgQEAKIAogI2Vsc2UKIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiBzdGF0aWMgdWxvbmczMiBfZ19mdW5jKHVsb25nMzIgeCwgc3ltbWV0cmljX2tleSAqa2V5KQogI2Vsc2UKIHN0YXRpYyB1bG9uZzMyIGdfZnVuYyh1bG9uZzMyIHgsIHN5bW1ldHJpY19rZXkgKmtleSkKQEAgLTMxMyw5ICszMjAsOSBAQAogICAgcmV0dXJuIHJlczsKIH0KIAotI2RlZmluZSBnMV9mdW5jKHgsIGtleSkgZ19mdW5jKFJPTCh4LCA4KSwga2V5KQorI2RlZmluZSBnMV9mdW5jKHgsIGtleSkgZ19mdW5jKFJPTGMoeCwgOCksIGtleSkKIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiBzdGF0aWMgdWxvbmczMiBnX2Z1bmModWxvbmczMiB4LCBzeW1tZXRyaWNfa2V5ICprZXkpCiB7CiAgICAgdWxvbmczMiB5OwpAQCAtMzIzLDExICszMzAsMTkgQEAKICAgICBidXJuX3N0YWNrKHNpemVvZih1bnNpZ25lZCBjaGFyKSAqIDQgKyBzaXplb2YodWxvbmczMikpOwogICAgIHJldHVybiB5OwogfQotI2VuZGlmIC8qIENMRUFOX1NUQUNLICovCisjZW5kaWYgLyogTFRDX0NMRUFOX1NUQUNLICovCiAKICNlbmRpZiAvKiBUV09GSVNIX1NNQUxMICovCiAKLSNpZmRlZiBDTEVBTl9TVEFDSworIC8qKgorICAgIEluaXRpYWxpemUgdGhlIFR3b2Zpc2ggYmxvY2sgY2lwaGVyCisgICAgQHBhcmFtIGtleSBUaGUgc3ltbWV0cmljIGtleSB5b3Ugd2lzaCB0byBwYXNzCisgICAgQHBhcmFtIGtleWxlbiBUaGUga2V5IGxlbmd0aCBpbiBieXRlcworICAgIEBwYXJhbSBudW1fcm91bmRzIFRoZSBudW1iZXIgb2Ygcm91bmRzIGRlc2lyZWQgKDAgZm9yIGRlZmF1bHQpCisgICAgQHBhcmFtIHNrZXkgVGhlIGtleSBpbiBhcyBzY2hlZHVsZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAqLworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogc3RhdGljIGludCBfdHdvZmlzaF9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKIGludCB0d29maXNoX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCkBAIC0zNDAsOCArMzU1LDggQEAKICAgIHVuc2lnbmVkIGNoYXIgdG1wWzRdLCB0bXAyWzRdLCBNWzgqNF07CiAgICB1bG9uZzMyIEEsIEI7CiAKLSAgIF9BUkdDSEsoa2V5ICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoc2tleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKIAogICAgLyogaW52YWxpZCBhcmd1bWVudHM/ICovCiAgICBpZiAobnVtX3JvdW5kcyAhPSAxNiAmJiBudW1fcm91bmRzICE9IDApIHsKQEAgLTM4NiwxMyArNDAxLDEzIEBACiAgICAgICAgfQogICAgICAgIGhfZnVuYyh0bXAsIHRtcDIsIE0sIGssIDEpOwogICAgICAgIExPQUQzMkwoQiwgdG1wMik7Ci0gICAgICAgQiA9IFJPTChCLCA4KTsKKyAgICAgICBCID0gUk9MYyhCLCA4KTsKIAogICAgICAgIC8qIEtbMmldICAgPSBBICsgQiAqLwogICAgICAgIHNrZXktPnR3b2Zpc2guS1t4K3hdID0gKEEgKyBCKSAmIDB4RkZGRkZGRkZVTDsKIAogICAgICAgIC8qIEtbMmkrMV0gPSAoQSArIDJCKSA8PDwgOSAqLwotICAgICAgIHNrZXktPnR3b2Zpc2guS1t4K3grMV0gPSBST0woQiArIEIgKyBBLCA5KTsKKyAgICAgICBza2V5LT50d29maXNoLktbeCt4KzFdID0gUk9MYyhCICsgQiArIEEsIDkpOwogICAgfQogCiAjaWZuZGVmIFRXT0ZJU0hfU01BTEwKQEAgLTQzNyw3ICs0NTIsNyBAQAogICAgcmV0dXJuIENSWVBUX09LOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKIGludCB0d29maXNoX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7CiAgICBpbnQgeDsKQEAgLTQ0NywxMCArNDYyLDE2IEBACiB9CiAjZW5kaWYKIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfdHdvZmlzaF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSkKKy8qKgorICBFbmNyeXB0cyBhIGJsb2NrIG9mIHRleHQgd2l0aCBUd29maXNoCisgIEBwYXJhbSBwdCBUaGUgaW5wdXQgcGxhaW50ZXh0ICgxNiBieXRlcykKKyAgQHBhcmFtIGN0IFRoZSBvdXRwdXQgY2lwaGVydGV4dCAoMTYgYnl0ZXMpCisgIEBwYXJhbSBza2V5IFRoZSBrZXkgYXMgc2NoZWR1bGVkCisqLworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworc3RhdGljIHZvaWQgX3R3b2Zpc2hfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKLXZvaWQgdHdvZmlzaF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSkKK3ZvaWQgdHdvZmlzaF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiAjZW5kaWYKIHsKICAgICB1bG9uZzMyIGEsYixjLGQsdGEsdGIsdGMsdGQsdDEsdDIsICprOwpAQCAtNDU5LDYxICs0ODAsNjcgQEAKICAgICB1bG9uZzMyICpTMSwgKlMyLCAqUzMsICpTNDsKICNlbmRpZiAgICAKIAotICAgIF9BUkdDSEsocHQgICE9IE5VTEwpOwotICAgIF9BUkdDSEsoY3QgICE9IE5VTEwpOwotICAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKGN0ICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhza2V5ICE9IE5VTEwpOwogICAgIAogI2lmICFkZWZpbmVkKFRXT0ZJU0hfU01BTEwpICYmICFkZWZpbmVkKF9fR05VQ19fKQotICAgIFMxID0ga2V5LT50d29maXNoLlNbMF07Ci0gICAgUzIgPSBrZXktPnR3b2Zpc2guU1sxXTsKLSAgICBTMyA9IGtleS0+dHdvZmlzaC5TWzJdOwotICAgIFM0ID0ga2V5LT50d29maXNoLlNbM107CisgICAgUzEgPSBza2V5LT50d29maXNoLlNbMF07CisgICAgUzIgPSBza2V5LT50d29maXNoLlNbMV07CisgICAgUzMgPSBza2V5LT50d29maXNoLlNbMl07CisgICAgUzQgPSBza2V5LT50d29maXNoLlNbM107CiAjZW5kaWYgICAgCiAKICAgICBMT0FEMzJMKGEsJnB0WzBdKTsgTE9BRDMyTChiLCZwdFs0XSk7CiAgICAgTE9BRDMyTChjLCZwdFs4XSk7IExPQUQzMkwoZCwmcHRbMTJdKTsKLSAgICBhIF49IGtleS0+dHdvZmlzaC5LWzBdOwotICAgIGIgXj0ga2V5LT50d29maXNoLktbMV07Ci0gICAgYyBePSBrZXktPnR3b2Zpc2guS1syXTsKLSAgICBkIF49IGtleS0+dHdvZmlzaC5LWzNdOworICAgIGEgXj0gc2tleS0+dHdvZmlzaC5LWzBdOworICAgIGIgXj0gc2tleS0+dHdvZmlzaC5LWzFdOworICAgIGMgXj0gc2tleS0+dHdvZmlzaC5LWzJdOworICAgIGQgXj0gc2tleS0+dHdvZmlzaC5LWzNdOwogICAgIAotICAgIGsgID0ga2V5LT50d29maXNoLksgKyA4OworICAgIGsgID0gc2tleS0+dHdvZmlzaC5LICsgODsKICAgICBmb3IgKHIgPSA4OyByICE9IDA7IC0tcikgewotICAgICAgICB0MiA9IGcxX2Z1bmMoYiwga2V5KTsKLSAgICAgICAgdDEgPSBnX2Z1bmMoYSwga2V5KSArIHQyOwotICAgICAgICBjICA9IFJPUihjIF4gKHQxICsga1swXSksIDEpOwotICAgICAgICBkICA9IFJPTChkLCAxKSBeICh0MiArIHQxICsga1sxXSk7CisgICAgICAgIHQyID0gZzFfZnVuYyhiLCBza2V5KTsKKyAgICAgICAgdDEgPSBnX2Z1bmMoYSwgc2tleSkgKyB0MjsKKyAgICAgICAgYyAgPSBST1JjKGMgXiAodDEgKyBrWzBdKSwgMSk7CisgICAgICAgIGQgID0gUk9MYyhkLCAxKSBeICh0MiArIHQxICsga1sxXSk7CiAgICAgICAgIAotICAgICAgICB0MiA9IGcxX2Z1bmMoZCwga2V5KTsKLSAgICAgICAgdDEgPSBnX2Z1bmMoYywga2V5KSArIHQyOwotICAgICAgICBhICA9IFJPUihhIF4gKHQxICsga1syXSksIDEpOwotICAgICAgICBiICA9IFJPTChiLCAxKSBeICh0MiArIHQxICsga1szXSk7CisgICAgICAgIHQyID0gZzFfZnVuYyhkLCBza2V5KTsKKyAgICAgICAgdDEgPSBnX2Z1bmMoYywgc2tleSkgKyB0MjsKKyAgICAgICAgYSAgPSBST1JjKGEgXiAodDEgKyBrWzJdKSwgMSk7CisgICAgICAgIGIgID0gUk9MYyhiLCAxKSBeICh0MiArIHQxICsga1szXSk7CiAgICAgICAgIGsgKz0gNDsKICAgIH0KIAogICAgIC8qIG91dHB1dCB3aXRoICJ1bmRvIGxhc3Qgc3dhcCIgKi8KLSAgICB0YSA9IGMgXiBrZXktPnR3b2Zpc2guS1s0XTsKLSAgICB0YiA9IGQgXiBrZXktPnR3b2Zpc2guS1s1XTsKLSAgICB0YyA9IGEgXiBrZXktPnR3b2Zpc2guS1s2XTsKLSAgICB0ZCA9IGIgXiBrZXktPnR3b2Zpc2guS1s3XTsKKyAgICB0YSA9IGMgXiBza2V5LT50d29maXNoLktbNF07CisgICAgdGIgPSBkIF4gc2tleS0+dHdvZmlzaC5LWzVdOworICAgIHRjID0gYSBeIHNrZXktPnR3b2Zpc2guS1s2XTsKKyAgICB0ZCA9IGIgXiBza2V5LT50d29maXNoLktbN107CiAKICAgICAvKiBzdG9yZSBvdXRwdXQgKi8KICAgICBTVE9SRTMyTCh0YSwmY3RbMF0pOyBTVE9SRTMyTCh0YiwmY3RbNF0pOwogICAgIFNUT1JFMzJMKHRjLCZjdFs4XSk7IFNUT1JFMzJMKHRkLCZjdFsxMl0pOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXZvaWQgdHdvZmlzaF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKmtleSkKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3ZvaWQgdHdvZmlzaF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiB7Ci0gICBfdHdvZmlzaF9lY2JfZW5jcnlwdChwdCwgY3QsIGtleSk7CisgICBfdHdvZmlzaF9lY2JfZW5jcnlwdChwdCwgY3QsIHNrZXkpOwogICAgYnVybl9zdGFjayhzaXplb2YodWxvbmczMikgKiAxMCArIHNpemVvZihpbnQpKTsKIH0KICNlbmRpZgogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIF90d29maXNoX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KQorLyoqCisgIERlY3J5cHRzIGEgYmxvY2sgb2YgdGV4dCB3aXRoIFR3b2Zpc2gKKyAgQHBhcmFtIGN0IFRoZSBpbnB1dCBjaXBoZXJ0ZXh0ICgxNiBieXRlcykKKyAgQHBhcmFtIHB0IFRoZSBvdXRwdXQgcGxhaW50ZXh0ICgxNiBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQgCisqLworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworc3RhdGljIHZvaWQgX3R3b2Zpc2hfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQogI2Vsc2UKLXZvaWQgdHdvZmlzaF9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKmtleSkKK3ZvaWQgdHdvZmlzaF9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpCiAjZW5kaWYKIHsKICAgICB1bG9uZzMyIGEsYixjLGQsdGEsdGIsdGMsdGQsdDEsdDIsICprOwpAQCAtNTIyLDE1ICs1NDksMTUgQEAKICAgICB1bG9uZzMyICpTMSwgKlMyLCAqUzMsICpTNDsKICNlbmRpZiAgICAKIAotICAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKHB0ICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhjdCAgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKICAgICAKICNpZiAhZGVmaW5lZChUV09GSVNIX1NNQUxMKSAmJiAhZGVmaW5lZChfX0dOVUNfXykKLSAgICBTMSA9IGtleS0+dHdvZmlzaC5TWzBdOwotICAgIFMyID0ga2V5LT50d29maXNoLlNbMV07Ci0gICAgUzMgPSBrZXktPnR3b2Zpc2guU1syXTsKLSAgICBTNCA9IGtleS0+dHdvZmlzaC5TWzNdOworICAgIFMxID0gc2tleS0+dHdvZmlzaC5TWzBdOworICAgIFMyID0gc2tleS0+dHdvZmlzaC5TWzFdOworICAgIFMzID0gc2tleS0+dHdvZmlzaC5TWzJdOworICAgIFM0ID0gc2tleS0+dHdvZmlzaC5TWzNdOwogI2VuZGlmICAgIAogCiAgICAgLyogbG9hZCBpbnB1dCAqLwpAQCAtNTM4LDQ0ICs1NjUsNDggQEAKICAgICBMT0FEMzJMKHRjLCZjdFs4XSk7IExPQUQzMkwodGQsJmN0WzEyXSk7CiAKICAgICAvKiB1bmRvIHVuZG8gZmluYWwgc3dhcCAqLwotICAgIGEgPSB0YyBeIGtleS0+dHdvZmlzaC5LWzZdOwotICAgIGIgPSB0ZCBeIGtleS0+dHdvZmlzaC5LWzddOwotICAgIGMgPSB0YSBeIGtleS0+dHdvZmlzaC5LWzRdOwotICAgIGQgPSB0YiBeIGtleS0+dHdvZmlzaC5LWzVdOworICAgIGEgPSB0YyBeIHNrZXktPnR3b2Zpc2guS1s2XTsKKyAgICBiID0gdGQgXiBza2V5LT50d29maXNoLktbN107CisgICAgYyA9IHRhIF4gc2tleS0+dHdvZmlzaC5LWzRdOworICAgIGQgPSB0YiBeIHNrZXktPnR3b2Zpc2guS1s1XTsKIAotICAgIGsgPSBrZXktPnR3b2Zpc2guSyArIDM2OworICAgIGsgPSBza2V5LT50d29maXNoLksgKyAzNjsKICAgICBmb3IgKHIgPSA4OyByICE9IDA7IC0tcikgewotICAgICAgICB0MiA9IGcxX2Z1bmMoZCwga2V5KTsKLSAgICAgICAgdDEgPSBnX2Z1bmMoYywga2V5KSArIHQyOwotICAgICAgICBhID0gUk9MKGEsIDEpIF4gKHQxICsga1syXSk7Ci0gICAgICAgIGIgPSBST1IoYiBeICh0MiArIHQxICsga1szXSksIDEpOworICAgICAgICB0MiA9IGcxX2Z1bmMoZCwgc2tleSk7CisgICAgICAgIHQxID0gZ19mdW5jKGMsIHNrZXkpICsgdDI7CisgICAgICAgIGEgPSBST0xjKGEsIDEpIF4gKHQxICsga1syXSk7CisgICAgICAgIGIgPSBST1JjKGIgXiAodDIgKyB0MSArIGtbM10pLCAxKTsKIAotICAgICAgICB0MiA9IGcxX2Z1bmMoYiwga2V5KTsKLSAgICAgICAgdDEgPSBnX2Z1bmMoYSwga2V5KSArIHQyOwotICAgICAgICBjID0gUk9MKGMsIDEpIF4gKHQxICsga1swXSk7Ci0gICAgICAgIGQgPSBST1IoZCBeICh0MiArICB0MSArIGtbMV0pLCAxKTsKKyAgICAgICAgdDIgPSBnMV9mdW5jKGIsIHNrZXkpOworICAgICAgICB0MSA9IGdfZnVuYyhhLCBza2V5KSArIHQyOworICAgICAgICBjID0gUk9MYyhjLCAxKSBeICh0MSArIGtbMF0pOworICAgICAgICBkID0gUk9SYyhkIF4gKHQyICsgIHQxICsga1sxXSksIDEpOwogICAgICAgICBrIC09IDQ7CiAgICAgfQogCiAgICAgLyogcHJlLXdoaXRlICovCi0gICAgYSBePSBrZXktPnR3b2Zpc2guS1swXTsKLSAgICBiIF49IGtleS0+dHdvZmlzaC5LWzFdOwotICAgIGMgXj0ga2V5LT50d29maXNoLktbMl07Ci0gICAgZCBePSBrZXktPnR3b2Zpc2guS1szXTsKKyAgICBhIF49IHNrZXktPnR3b2Zpc2guS1swXTsKKyAgICBiIF49IHNrZXktPnR3b2Zpc2guS1sxXTsKKyAgICBjIF49IHNrZXktPnR3b2Zpc2guS1syXTsKKyAgICBkIF49IHNrZXktPnR3b2Zpc2guS1szXTsKICAgICAKICAgICAvKiBzdG9yZSAqLwogICAgIFNUT1JFMzJMKGEsICZwdFswXSk7IFNUT1JFMzJMKGIsICZwdFs0XSk7CiAgICAgU1RPUkUzMkwoYywgJnB0WzhdKTsgU1RPUkUzMkwoZCwgJnB0WzEyXSk7CiB9CiAKLSNpZmRlZiBDTEVBTl9TVEFDSwotdm9pZCB0d29maXNoX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KQorI2lmZGVmIExUQ19DTEVBTl9TVEFDSwordm9pZCB0d29maXNoX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSkKIHsKLSAgIF90d29maXNoX2VjYl9kZWNyeXB0KGN0LCBwdCwga2V5KTsKKyAgIF90d29maXNoX2VjYl9kZWNyeXB0KGN0LCBwdCwgc2tleSk7CiAgICBidXJuX3N0YWNrKHNpemVvZih1bG9uZzMyKSAqIDEwICsgc2l6ZW9mKGludCkpOwogfQogI2VuZGlmCiAKKy8qKgorICBQZXJmb3JtcyBhIHNlbGYtdGVzdCBvZiB0aGUgVHdvZmlzaCBibG9jayBjaXBoZXIKKyAgQHJldHVybiBDUllQVF9PSyBpZiBmdW5jdGlvbmFsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0IGhhcyBiZWVuIGRpc2FibGVkCisqLwogaW50IHR3b2Zpc2hfdGVzdCh2b2lkKQogewogICNpZm5kZWYgTFRDX1RFU1QKQEAgLTYzOCwxOSArNjY5LDMxIEBACiAjZW5kaWYgCiB9CiAKLWludCB0d29maXNoX2tleXNpemUoaW50ICpkZXNpcmVkX2tleXNpemUpCisvKiogVGVybWluYXRlIHRoZSBjb250ZXh0IAorICAgQHBhcmFtIHNrZXkgICAgVGhlIHNjaGVkdWxlZCBrZXkKKyovCit2b2lkIHR3b2Zpc2hfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KQogewotICAgX0FSR0NISyhkZXNpcmVkX2tleXNpemUpOwotICAgaWYgKCpkZXNpcmVkX2tleXNpemUgPCAxNikKK30KKworLyoqCisgIEdldHMgc3VpdGFibGUga2V5IHNpemUKKyAgQHBhcmFtIGtleXNpemUgW2luL291dF0gVGhlIGxlbmd0aCBvZiB0aGUgcmVjb21tZW5kZWQga2V5IChpbiBieXRlcykuICBUaGlzIGZ1bmN0aW9uIHdpbGwgc3RvcmUgdGhlIHN1aXRhYmxlIHNpemUgYmFjayBpbiB0aGlzIHZhcmlhYmxlLgorICBAcmV0dXJuIENSWVBUX09LIGlmIHRoZSBpbnB1dCBrZXkgc2l6ZSBpcyBhY2NlcHRhYmxlLgorKi8KK2ludCB0d29maXNoX2tleXNpemUoaW50ICprZXlzaXplKQoreworICAgTFRDX0FSR0NISyhrZXlzaXplKTsKKyAgIGlmICgqa2V5c2l6ZSA8IDE2KQogICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKLSAgIGlmICgqZGVzaXJlZF9rZXlzaXplIDwgMjQpIHsKLSAgICAgICpkZXNpcmVkX2tleXNpemUgPSAxNjsKKyAgIGlmICgqa2V5c2l6ZSA8IDI0KSB7CisgICAgICAqa2V5c2l6ZSA9IDE2OwogICAgICAgcmV0dXJuIENSWVBUX09LOwotICAgfSBlbHNlIGlmICgqZGVzaXJlZF9rZXlzaXplIDwgMzIpIHsKLSAgICAgICpkZXNpcmVkX2tleXNpemUgPSAyNDsKKyAgIH0gZWxzZSBpZiAoKmtleXNpemUgPCAzMikgeworICAgICAgKmtleXNpemUgPSAyNDsKICAgICAgIHJldHVybiBDUllQVF9PSzsKICAgIH0gZWxzZSB7Ci0gICAgICAqZGVzaXJlZF9rZXlzaXplID0gMzI7CisgICAgICAqa2V5c2l6ZSA9IDMyOwogICAgICAgcmV0dXJuIENSWVBUX09LOwogICAgfQogfQpAQCAtNjU5LDMgKzcwMiw3IEBACiAKIAogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjggJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvdHdvZmlzaF90YWIuYyBiL3NyYy9jaXBoZXJzL3R3b2Zpc2gvdHdvZmlzaF90YWIuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSB0d29maXNoX3RhYi5jCnJlbmFtZSB0byBzcmMvY2lwaGVycy90d29maXNoL3R3b2Zpc2hfdGFiLmMKaW5kZXggNWEyYmI1Yi4uNDdkNDcxNyAxMDA2NDQKLS0tIGEvdHdvZmlzaF90YWIuYworKysgYi9zcmMvY2lwaGVycy90d29maXNoL3R3b2Zpc2hfdGFiLmMKQEAgLTYsOSArNiwxMyBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCiAKKyAvKioKKyAgICBAZmlsZSB0d29maXNoX3RhYi5jCisgICAgVHdvZmlzaCB0YWJsZXMsIFRvbSBTdCBEZW5pcworICovCiAjaWZkZWYgVFdPRklTSF9UQUJMRVMKIAogLyogcHJlIGdlbmVyYXRlZCA4eDggdGFibGVzIGZyb20gdGhlIGZvdXIgNHg0cyAqLwpAQCAtNDg2LDMgKzQ5MCw3IEBACiAjZW5kaWYgLyogVFdPRklTSF9BTExfVEFCTEVTICovCiAKICNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvY2lwaGVycy90d29maXNoL3R3b2Zpc2hfdGFiLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvY2lwaGVycy94dGVhLmMgYi9zcmMvY2lwaGVycy94dGVhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1YTEzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jaXBoZXJzL3h0ZWEuYwpAQCAtMCwwICsxLDIwNyBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKworLyoqCisgIEBmaWxlIHh0ZWEuYworICBJbXBsZW1lbnRhdGlvbiBvZiBYVEVBLCBUb20gU3QgRGVuaXMKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIFhURUEKKworY29uc3Qgc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvciB4dGVhX2Rlc2MgPQoreworICAgICJ4dGVhIiwKKyAgICAxLAorICAgIDE2LCAxNiwgOCwgMzIsCisgICAgJnh0ZWFfc2V0dXAsCisgICAgJnh0ZWFfZWNiX2VuY3J5cHQsCisgICAgJnh0ZWFfZWNiX2RlY3J5cHQsCisgICAgJnh0ZWFfdGVzdCwKKyAgICAmeHRlYV9kb25lLAorICAgICZ4dGVhX2tleXNpemUsCisgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworaW50IHh0ZWFfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSkKK3sKKyAgIHVuc2lnbmVkIGxvbmcgeCwgc3VtLCBLWzRdOworICAgCisgICBMVENfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKKworICAgLyogY2hlY2sgYXJndW1lbnRzICovCisgICBpZiAoa2V5bGVuICE9IDE2KSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOworICAgfQorCisgICBpZiAobnVtX3JvdW5kcyAhPSAwICYmIG51bV9yb3VuZHMgIT0gMzIpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1JPVU5EUzsKKyAgIH0KKworICAgLyogbG9hZCBrZXkgKi8KKyAgIExPQUQzMkwoS1swXSwga2V5KzApOworICAgTE9BRDMyTChLWzFdLCBrZXkrNCk7CisgICBMT0FEMzJMKEtbMl0sIGtleSs4KTsKKyAgIExPQUQzMkwoS1szXSwga2V5KzEyKTsKKyAgIAorICAgZm9yICh4ID0gc3VtID0gMDsgeCA8IDMyOyB4KyspIHsKKyAgICAgICBza2V5LT54dGVhLkFbeF0gPSAoc3VtICsgS1tzdW0mM10pICYgMHhGRkZGRkZGRlVMOworICAgICAgIHN1bSA9IChzdW0gKyAweDlFMzc3OUI5VUwpICYgMHhGRkZGRkZGRlVMOworICAgICAgIHNrZXktPnh0ZWEuQlt4XSA9IChzdW0gKyBLWyhzdW0+PjExKSYzXSkgJiAweEZGRkZGRkZGVUw7CisgICB9CisgICAKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKKyAgIHplcm9tZW0oJkssIHNpemVvZihLKSk7CisjZW5kaWYgICAKKyAgIAorICAgcmV0dXJuIENSWVBUX09LOworfQorCisvKioKKyAgRW5jcnlwdHMgYSBibG9jayBvZiB0ZXh0IHdpdGggWFRFQQorICBAcGFyYW0gcHQgVGhlIGlucHV0IHBsYWludGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIGN0IFRoZSBvdXRwdXQgY2lwaGVydGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHNrZXkgVGhlIGtleSBhcyBzY2hlZHVsZWQKKyovCit2b2lkIHh0ZWFfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQoreworICAgdW5zaWduZWQgbG9uZyB5LCB6OworICAgaW50IHI7CisKKyAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKKworICAgTE9BRDMyTCh5LCAmcHRbMF0pOworICAgTE9BRDMyTCh6LCAmcHRbNF0pOworICAgZm9yIChyID0gMDsgciA8IDMyOyByICs9IDQpIHsKKyAgICAgICB5ID0gKHkgKyAoKCgoejw8NCleKHo+PjUpKSArIHopIF4gc2tleS0+eHRlYS5BW3JdKSkgJiAweEZGRkZGRkZGVUw7CisgICAgICAgeiA9ICh6ICsgKCgoKHk8PDQpXih5Pj41KSkgKyB5KSBeIHNrZXktPnh0ZWEuQltyXSkpICYgMHhGRkZGRkZGRlVMOworCisgICAgICAgeSA9ICh5ICsgKCgoKHo8PDQpXih6Pj41KSkgKyB6KSBeIHNrZXktPnh0ZWEuQVtyKzFdKSkgJiAweEZGRkZGRkZGVUw7CisgICAgICAgeiA9ICh6ICsgKCgoKHk8PDQpXih5Pj41KSkgKyB5KSBeIHNrZXktPnh0ZWEuQltyKzFdKSkgJiAweEZGRkZGRkZGVUw7CisKKyAgICAgICB5ID0gKHkgKyAoKCgoejw8NCleKHo+PjUpKSArIHopIF4gc2tleS0+eHRlYS5BW3IrMl0pKSAmIDB4RkZGRkZGRkZVTDsKKyAgICAgICB6ID0gKHogKyAoKCgoeTw8NCleKHk+PjUpKSArIHkpIF4gc2tleS0+eHRlYS5CW3IrMl0pKSAmIDB4RkZGRkZGRkZVTDsKKworICAgICAgIHkgPSAoeSArICgoKCh6PDw0KV4oej4+NSkpICsgeikgXiBza2V5LT54dGVhLkFbciszXSkpICYgMHhGRkZGRkZGRlVMOworICAgICAgIHogPSAoeiArICgoKCh5PDw0KV4oeT4+NSkpICsgeSkgXiBza2V5LT54dGVhLkJbciszXSkpICYgMHhGRkZGRkZGRlVMOworICAgfQorICAgU1RPUkUzMkwoeSwgJmN0WzBdKTsKKyAgIFNUT1JFMzJMKHosICZjdFs0XSk7Cit9CisKKy8qKgorICBEZWNyeXB0cyBhIGJsb2NrIG9mIHRleHQgd2l0aCBYVEVBCisgIEBwYXJhbSBjdCBUaGUgaW5wdXQgY2lwaGVydGV4dCAoOCBieXRlcykKKyAgQHBhcmFtIHB0IFRoZSBvdXRwdXQgcGxhaW50ZXh0ICg4IGJ5dGVzKQorICBAcGFyYW0gc2tleSBUaGUga2V5IGFzIHNjaGVkdWxlZCAKKyovCit2b2lkIHh0ZWFfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KQoreworICAgdW5zaWduZWQgbG9uZyB5LCB6OworICAgaW50IHI7CisKKyAgIExUQ19BUkdDSEsocHQgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc2tleSAhPSBOVUxMKTsKKworICAgTE9BRDMyTCh5LCAmY3RbMF0pOworICAgTE9BRDMyTCh6LCAmY3RbNF0pOworICAgZm9yIChyID0gMzE7IHIgPj0gMDsgciAtPSA0KSB7CisgICAgICAgeiA9ICh6IC0gKCgoKHk8PDQpXih5Pj41KSkgKyB5KSBeIHNrZXktPnh0ZWEuQltyXSkpICYgMHhGRkZGRkZGRlVMOworICAgICAgIHkgPSAoeSAtICgoKCh6PDw0KV4oej4+NSkpICsgeikgXiBza2V5LT54dGVhLkFbcl0pKSAmIDB4RkZGRkZGRkZVTDsKKworICAgICAgIHogPSAoeiAtICgoKCh5PDw0KV4oeT4+NSkpICsgeSkgXiBza2V5LT54dGVhLkJbci0xXSkpICYgMHhGRkZGRkZGRlVMOworICAgICAgIHkgPSAoeSAtICgoKCh6PDw0KV4oej4+NSkpICsgeikgXiBza2V5LT54dGVhLkFbci0xXSkpICYgMHhGRkZGRkZGRlVMOworCisgICAgICAgeiA9ICh6IC0gKCgoKHk8PDQpXih5Pj41KSkgKyB5KSBeIHNrZXktPnh0ZWEuQltyLTJdKSkgJiAweEZGRkZGRkZGVUw7CisgICAgICAgeSA9ICh5IC0gKCgoKHo8PDQpXih6Pj41KSkgKyB6KSBeIHNrZXktPnh0ZWEuQVtyLTJdKSkgJiAweEZGRkZGRkZGVUw7CisKKyAgICAgICB6ID0gKHogLSAoKCgoeTw8NCleKHk+PjUpKSArIHkpIF4gc2tleS0+eHRlYS5CW3ItM10pKSAmIDB4RkZGRkZGRkZVTDsKKyAgICAgICB5ID0gKHkgLSAoKCgoejw8NCleKHo+PjUpKSArIHopIF4gc2tleS0+eHRlYS5BW3ItM10pKSAmIDB4RkZGRkZGRkZVTDsKKyAgIH0KKyAgIFNUT1JFMzJMKHksICZwdFswXSk7CisgICBTVE9SRTMyTCh6LCAmcHRbNF0pOworfQorCisvKioKKyAgUGVyZm9ybXMgYSBzZWxmLXRlc3Qgb2YgdGhlIFhURUEgYmxvY2sgY2lwaGVyCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgZnVuY3Rpb25hbCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdCBoYXMgYmVlbiBkaXNhYmxlZAorKi8KK2ludCB4dGVhX3Rlc3Qodm9pZCkKK3sKKyAjaWZuZGVmIExUQ19URVNUCisgICAgcmV0dXJuIENSWVBUX05PUDsKKyAjZWxzZSAgICAKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtleVsxNl0gPSAKKyAgICAgIHsgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiwgMHhmMCwgMHhjZCwgMHhjYiwgMHg5YSwKKyAgICAgICAgMHg0OCwgMHgzNywgMHgyNiwgMHgxNSwgMHhjMCwgMHhiZiwgMHhhZSwgMHg5ZCB9OworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHRbOF0gPSAKKyAgICAgIHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCB9OworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY3RbOF0gPSAKKyAgICAgIHsgMHg3NSwgMHhkNywgMHhjNSwgMHhiZiwgMHhjZiwgMHg1OCwgMHhjOSwgMHgzZiB9OworICAgdW5zaWduZWQgY2hhciB0bXBbMl1bOF07CisgICBzeW1tZXRyaWNfa2V5IHNrZXk7CisgICBpbnQgZXJyLCB5OworCisgICBpZiAoKGVyciA9IHh0ZWFfc2V0dXAoa2V5LCAxNiwgMCwgJnNrZXkpKSAhPSBDUllQVF9PSykgIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICB4dGVhX2VjYl9lbmNyeXB0KHB0LCB0bXBbMF0sICZza2V5KTsKKyAgIHh0ZWFfZWNiX2RlY3J5cHQodG1wWzBdLCB0bXBbMV0sICZza2V5KTsKKworICAgaWYgKG1lbWNtcCh0bXBbMF0sIGN0LCA4KSAhPSAwIHx8IG1lbWNtcCh0bXBbMV0sIHB0LCA4KSAhPSAwKSB7IAorICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKKyAgIH0KKworICAgICAgLyogbm93IHNlZSBpZiB3ZSBjYW4gZW5jcnlwdCBhbGwgemVybyBieXRlcyAxMDAwIHRpbWVzLCBkZWNyeXB0IGFuZCBjb21lIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCAqLworICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgdG1wWzBdW3ldID0gMDsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCAxMDAwOyB5KyspIHh0ZWFfZWNiX2VuY3J5cHQodG1wWzBdLCB0bXBbMF0sICZza2V5KTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCAxMDAwOyB5KyspIHh0ZWFfZWNiX2RlY3J5cHQodG1wWzBdLCB0bXBbMF0sICZza2V5KTsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIGlmICh0bXBbMF1beV0gIT0gMCkgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKKworICAgcmV0dXJuIENSWVBUX09LOworICNlbmRpZgorfQorCisvKiogVGVybWluYXRlIHRoZSBjb250ZXh0IAorICAgQHBhcmFtIHNrZXkgICAgVGhlIHNjaGVkdWxlZCBrZXkKKyovCit2b2lkIHh0ZWFfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KQoreworfQorCisvKioKKyAgR2V0cyBzdWl0YWJsZSBrZXkgc2l6ZQorICBAcGFyYW0ga2V5c2l6ZSBbaW4vb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSByZWNvbW1lbmRlZCBrZXkgKGluIGJ5dGVzKS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBzdG9yZSB0aGUgc3VpdGFibGUgc2l6ZSBiYWNrIGluIHRoaXMgdmFyaWFibGUuCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdGhlIGlucHV0IGtleSBzaXplIGlzIGFjY2VwdGFibGUuCisqLworaW50IHh0ZWFfa2V5c2l6ZShpbnQgKmtleXNpemUpCit7CisgICBMVENfQVJHQ0hLKGtleXNpemUgIT0gTlVMTCk7CisgICBpZiAoKmtleXNpemUgPCAxNikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsgCisgICB9CisgICAqa2V5c2l6ZSA9IDE2OworICAgcmV0dXJuIENSWVBUX09LOworfQorCisKKyNlbmRpZgorCisKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvY2lwaGVycy94dGVhLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9jY20vY2NtX21lbW9yeS5jIGIvc3JjL2VuY2F1dGgvY2NtL2NjbV9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGRjNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2VuY2F1dGgvY2NtL2NjbV9tZW1vcnkuYwpAQCAtMCwwICsxLDMwOSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY2NtX21lbW9yeS5jCisgIENDTSBzdXBwb3J0LCBwcm9jZXNzIGEgYmxvY2sgb2YgbWVtb3J5LCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBDQ01fTU9ERQorCisvKioKKyAgIENDTSBlbmNyeXB0L2RlY3J5cHQgYW5kIHByb2R1Y2UgYW4gYXV0aGVudGljYXRpb24gdGFnCisgICBAcGFyYW0gY2lwaGVyICAgICBUaGUgaW5kZXggb2YgdGhlIGNpcGhlciBkZXNpcmVkCisgICBAcGFyYW0ga2V5ICAgICAgICBUaGUgc2VjcmV0IGtleSB0byB1c2UKKyAgIEBwYXJhbSBrZXlsZW4gICAgIFRoZSBsZW5ndGggb2YgdGhlIHNlY3JldCBrZXkgKG9jdGV0cykKKyAgIEBwYXJhbSBub25jZSAgICAgIFRoZSBzZXNzaW9uIG5vbmNlIFt1c2Ugb25jZV0KKyAgIEBwYXJhbSBub25jZWxlbiAgIFRoZSBsZW5ndGggb2YgdGhlIG5vbmNlCisgICBAcGFyYW0gaGVhZGVyICAgICBUaGUgaGVhZGVyIGZvciB0aGUgc2Vzc2lvbgorICAgQHBhcmFtIGhlYWRlcmxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgaGVhZGVyIChvY3RldHMpCisgICBAcGFyYW0gcHQgICAgICAgICBbb3V0XSBUaGUgcGxhaW50ZXh0CisgICBAcGFyYW0gcHRsZW4gICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgKG9jdGV0cykKKyAgIEBwYXJhbSBjdCAgICAgICAgIFtvdXRdIFRoZSBjaXBoZXJ0ZXh0CisgICBAcGFyYW0gdGFnICAgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gdGFnCisgICBAcGFyYW0gdGFnbGVuICAgICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcKKyAgIEBwYXJhbSBkaXJlY3Rpb24gIEVuY3J5cHQgb3IgRGVjcnlwdCBkaXJlY3Rpb24gKDAgb3IgMSkKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBjY21fbWVtb3J5KGludCBjaXBoZXIsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIHVuc2lnbmVkIGxvbmcgbm9uY2VsZW4sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGVhZGVyLCB1bnNpZ25lZCBsb25nIGhlYWRlcmxlbiwKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwgICAgIHVuc2lnbmVkIGxvbmcgcHRsZW4sCisgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsCisgICAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnLCAgICB1bnNpZ25lZCBsb25nICp0YWdsZW4sCisgICAgICAgICAgICAgICAgICAgIGludCAgZGlyZWN0aW9uKQoreworICAgdW5zaWduZWQgY2hhciAgUEFEWzE2XSwgY3RyWzE2XSwgQ1RSUEFEWzE2XSwgYjsKKyAgIHN5bW1ldHJpY19rZXkgKnNrZXk7CisgICBpbnQgICAgICAgICAgICBlcnI7CisgICB1bnNpZ25lZCBsb25nICBsZW4sIEwsIHgsIHksIHosIENUUmxlbjsKKworICAgTFRDX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG5vbmNlICAhPSBOVUxMKTsKKyAgIGlmIChoZWFkZXJsZW4gPiAwKSB7CisgICAgICBMVENfQVJHQ0hLKGhlYWRlciAhPSBOVUxMKTsKKyAgIH0KKyAgIExUQ19BUkdDSEsocHQgICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHRhZyAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsodGFnbGVuICE9IE5VTEwpOworCisjaWZkZWYgTFRDX0ZBU1QKKyAgIGlmICgxNiAlIHNpemVvZihMVENfRkFTVF9UWVBFKSkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorI2VuZGlmCisKKyAgIC8qIGNoZWNrIGNpcGhlciBpbnB1dCAqLworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBpZiAoY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5ibG9ja19sZW5ndGggIT0gMTYpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0NJUEhFUjsKKyAgIH0KKworICAgLyogbWFrZSBzdXJlIHRoZSB0YWdsZW4gaXMgZXZlbiBhbmQgPD0gMTYgKi8KKyAgICp0YWdsZW4gJj0gfjE7CisgICBpZiAoKnRhZ2xlbiA+IDE2KSB7CisgICAgICAqdGFnbGVuID0gMTY7CisgICB9CisKKyAgIC8qIGNhbid0IHVzZSA8IDQgKi8KKyAgIGlmICgqdGFnbGVuIDwgNCkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICAvKiBpcyB0aGVyZSBhbiBhY2NlbGVyYXRvcj8gKi8KKyAgIGlmIChjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmFjY2VsX2NjbV9tZW1vcnkgIT0gTlVMTCkgeworICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uYWNjZWxfY2NtX21lbW9yeSgKKyAgICAgICAgICAga2V5LCAgICBrZXlsZW4sCisgICAgICAgICAgIG5vbmNlLCAgbm9uY2VsZW4sCisgICAgICAgICAgIGhlYWRlciwgaGVhZGVybGVuLAorICAgICAgICAgICBwdCwgICAgIHB0bGVuLAorICAgICAgICAgICBjdCwgCisgICAgICAgICAgIHRhZywgICAgdGFnbGVuLAorICAgICAgICAgICBkaXJlY3Rpb24pOworICAgICAgcmV0dXJuIENSWVBUX09LOworICAgfQorCisgICAvKiBsZXQncyBnZXQgdGhlIEwgdmFsdWUgKi8KKyAgIGxlbiA9IHB0bGVuOworICAgTCAgID0gMDsKKyAgIHdoaWxlIChsZW4pIHsKKyAgICAgICsrTDsKKyAgICAgIGxlbiA+Pj0gODsKKyAgIH0KKyAgIGlmIChMIDw9IDEpIHsKKyAgICAgIEwgPSAyOworICAgfQorCisgICAvKiBpbmNyZWFzZSBMIHRvIG1hdGNoIHRoZSBub25jZSBsZW4gKi8KKyAgIG5vbmNlbGVuID0gKG5vbmNlbGVuID4gMTMpID8gMTMgOiBub25jZWxlbjsKKyAgIGlmICgoMTUgLSBub25jZWxlbikgPiBMKSB7CisgICAgICBMID0gMTUgLSBub25jZWxlbjsKKyAgIH0KKworICAgLyogYWxsb2NhdGUgbWVtIGZvciB0aGUgc3ltbWV0cmljIGtleSAqLworICAgc2tleSA9IFhNQUxMT0Moc2l6ZW9mKCpza2V5KSk7CisgICBpZiAoc2tleSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICAvKiBpbml0aWFsaXplIHRoZSBjaXBoZXIgKi8KKyAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5zZXR1cChrZXksIGtleWxlbiwgMCwgc2tleSkpICE9IENSWVBUX09LKSB7CisgICAgICBYRlJFRShza2V5KTsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIC8qIGZvcm0gQl8wID09IGZsYWdzIHwgTm9uY2UgTiB8IGwobSkgKi8KKyAgIHggPSAwOworICAgUEFEW3grK10gPSAoKGhlYWRlcmxlbiA+IDApID8gKDE8PDYpIDogMCkgfAorICAgICAgICAgICAgKCgoKnRhZ2xlbiAtIDIpPj4xKTw8MykgICAgICAgIHwKKyAgICAgICAgICAgIChMLTEpOworCisgICAvKiBub25jZSAqLworICAgZm9yICh5ID0gMDsgeSA8ICgxNiAtIChMICsgMSkpOyB5KyspIHsKKyAgICAgICBQQURbeCsrXSA9IG5vbmNlW3ldOworICAgfQorCisgICAvKiBzdG9yZSBsZW4gKi8KKyAgIGxlbiA9IHB0bGVuOworCisgICAvKiBzaGlmdCBsZW4gc28gdGhlIHVwcGVyIGJ5dGVzIG9mIGxlbiBhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBsZW5ndGggKi8KKyAgIGZvciAoeSA9IEw7IHkgPCA0OyB5KyspIHsKKyAgICAgICBsZW4gPDw9IDg7CisgICB9CisKKyAgIC8qIHN0b3JlIGwobSkgKG9ubHkgc3RvcmUgMzItYml0cykgKi8KKyAgIGZvciAoeSA9IDA7IEwgPiA0ICYmIChMLXkpPjQ7IHkrKykgeworICAgICAgIFBBRFt4KytdID0gMDsKKyAgIH0KKyAgIGZvciAoOyB5IDwgTDsgeSsrKSB7CisgICAgICAgUEFEW3grK10gPSAobGVuID4+IDI0KSAmIDI1NTsKKyAgICAgICBsZW4gPDw9IDg7CisgICB9CisKKyAgIC8qIGVuY3J5cHQgUEFEICovCisgICBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmVjYl9lbmNyeXB0KFBBRCwgUEFELCBza2V5KTsKKworICAgLyogaGFuZGxlIGhlYWRlciAqLworICAgaWYgKGhlYWRlcmxlbiA+IDApIHsKKyAgICAgIHggPSAwOworICAgICAgCisgICAgICAvKiBzdG9yZSBsZW5ndGggKi8KKyAgICAgIGlmIChoZWFkZXJsZW4gPCAoKDFVTDw8MTYpIC0gKDFVTDw8OCkpKSB7CisgICAgICAgICBQQURbeCsrXSBePSAoaGVhZGVybGVuPj44KSAmIDI1NTsKKyAgICAgICAgIFBBRFt4KytdIF49IGhlYWRlcmxlbiAmIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBQQURbeCsrXSBePSAweEZGOworICAgICAgICAgUEFEW3grK10gXj0gMHhGRTsKKyAgICAgICAgIFBBRFt4KytdIF49IChoZWFkZXJsZW4+PjI0KSAmIDI1NTsKKyAgICAgICAgIFBBRFt4KytdIF49IChoZWFkZXJsZW4+PjE2KSAmIDI1NTsKKyAgICAgICAgIFBBRFt4KytdIF49IChoZWFkZXJsZW4+PjgpICYgMjU1OworICAgICAgICAgUEFEW3grK10gXj0gaGVhZGVybGVuICYgMjU1OworICAgICAgfQorCisgICAgICAvKiBub3cgYWRkIHRoZSBkYXRhICovCisgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVhZGVybGVuOyB5KyspIHsKKyAgICAgICAgICBpZiAoeCA9PSAxNikgeworICAgICAgICAgICAgIC8qIGZ1bGwgYmxvY2sgc28gbGV0J3MgZW5jcnlwdCBpdCAqLworICAgICAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uZWNiX2VuY3J5cHQoUEFELCBQQUQsIHNrZXkpOworICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBQQURbeCsrXSBePSBoZWFkZXJbeV07CisgICAgICB9CisKKyAgICAgIC8qIHJlbWFpbmRlcj8gKi8KKyAgICAgIGlmICh4ICE9IDApIHsKKyAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uZWNiX2VuY3J5cHQoUEFELCBQQUQsIHNrZXkpOworICAgICAgfQorICAgfQorCisgICAvKiBzZXR1cCB0aGUgY3RyIGNvdW50ZXIgKi8KKyAgIHggPSAwOworCisgICAvKiBmbGFncyAqLworICAgY3RyW3grK10gPSBMLTE7CisgCisgICAvKiBub25jZSAqLworICAgZm9yICh5ID0gMDsgeSA8ICgxNiAtIChMKzEpKTsgKyt5KSB7CisgICAgICBjdHJbeCsrXSA9IG5vbmNlW3ldOworICAgfQorICAgLyogb2Zmc2V0ICovCisgICB3aGlsZSAoeCA8IDE2KSB7CisgICAgICBjdHJbeCsrXSA9IDA7CisgICB9CisKKyAgIHggICAgICA9IDA7CisgICBDVFJsZW4gPSAxNjsKKworICAgLyogbm93IGhhbmRsZSB0aGUgUFQgKi8KKyAgIGlmIChwdGxlbiA+IDApIHsKKyAgICAgIHkgPSAwOworI2lmZGVmIExUQ19GQVNUCisgICAgICBpZiAocHRsZW4gJiB+MTUpICB7CisgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBDQ01fRU5DUllQVCkgeworICAgICAgICAgICAgIGZvciAoOyB5IDwgKHB0bGVuICYgfjE1KTsgeSArPSAxNikgeworICAgICAgICAgICAgICAgIC8qIGluY3JlbWVudCB0aGUgY3RyPyAqLworICAgICAgICAgICAgICAgIGZvciAoeiA9IDE1OyB6ID4gMTUtTDsgei0tKSB7CisgICAgICAgICAgICAgICAgICAgIGN0clt6XSA9IChjdHJbel0gKyAxKSAmIDI1NTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0clt6XSkgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uZWNiX2VuY3J5cHQoY3RyLCBDVFJQQUQsIHNrZXkpOworCisgICAgICAgICAgICAgICAgLyogeG9yIHRoZSBQVCBhZ2FpbnN0IHRoZSBwYWQgZmlyc3QgKi8KKyAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgMTY7IHogKz0gc2l6ZW9mKExUQ19GQVNUX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgICAgICooKExUQ19GQVNUX1RZUEUqKSgmUEFEW3pdKSkgIF49ICooKExUQ19GQVNUX1RZUEUqKSgmcHRbeSt6XSkpOworICAgICAgICAgICAgICAgICAgICAqKChMVENfRkFTVF9UWVBFKikoJmN0W3krel0pKSA9ICooKExUQ19GQVNUX1RZUEUqKSgmcHRbeSt6XSkpIF4gKigoTFRDX0ZBU1RfVFlQRSopKCZDVFJQQURbel0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5lY2JfZW5jcnlwdChQQUQsIFBBRCwgc2tleSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBmb3IgKDsgeSA8IChwdGxlbiAmIH4xNSk7IHkgKz0gMTYpIHsKKyAgICAgICAgICAgICAgICAvKiBpbmNyZW1lbnQgdGhlIGN0cj8gKi8KKyAgICAgICAgICAgICAgICBmb3IgKHogPSAxNTsgeiA+IDE1LUw7IHotLSkgeworICAgICAgICAgICAgICAgICAgICBjdHJbel0gPSAoY3RyW3pdICsgMSkgJiAyNTU7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdHJbel0pIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmVjYl9lbmNyeXB0KGN0ciwgQ1RSUEFELCBza2V5KTsKKworICAgICAgICAgICAgICAgIC8qIHhvciB0aGUgUFQgYWdhaW5zdCB0aGUgcGFkIGxhc3QgKi8KKyAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgMTY7IHogKz0gc2l6ZW9mKExUQ19GQVNUX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgICAgICooKExUQ19GQVNUX1RZUEUqKSgmcHRbeSt6XSkpID0gKigoTFRDX0ZBU1RfVFlQRSopKCZjdFt5K3pdKSkgXiAqKChMVENfRkFTVF9UWVBFKikoJkNUUlBBRFt6XSkpOworICAgICAgICAgICAgICAgICAgICAqKChMVENfRkFTVF9UWVBFKikoJlBBRFt6XSkpICBePSAqKChMVENfRkFTVF9UWVBFKikoJnB0W3krel0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5lY2JfZW5jcnlwdChQQUQsIFBBRCwgc2tleSk7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICB9CisjZW5kaWYKKworICAgICAgZm9yICg7IHkgPCBwdGxlbjsgeSsrKSB7CisgICAgICAgICAgLyogaW5jcmVtZW50IHRoZSBjdHI/ICovCisgICAgICAgICAgaWYgKENUUmxlbiA9PSAxNikgeworICAgICAgICAgICAgIGZvciAoeiA9IDE1OyB6ID4gMTUtTDsgei0tKSB7CisgICAgICAgICAgICAgICAgIGN0clt6XSA9IChjdHJbel0gKyAxKSAmIDI1NTsKKyAgICAgICAgICAgICAgICAgaWYgKGN0clt6XSkgYnJlYWs7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uZWNiX2VuY3J5cHQoY3RyLCBDVFJQQUQsIHNrZXkpOworICAgICAgICAgICAgIENUUmxlbiA9IDA7CisgICAgICAgICAgfQorCisgICAgICAgICAgLyogaWYgd2UgZW5jcnlwdCB3ZSBhZGQgdGhlIGJ5dGVzIHRvIHRoZSBNQUMgZmlyc3QgKi8KKyAgICAgICAgICBpZiAoZGlyZWN0aW9uID09IENDTV9FTkNSWVBUKSB7CisgICAgICAgICAgICAgYiAgICAgPSBwdFt5XTsKKyAgICAgICAgICAgICBjdFt5XSA9IGIgXiBDVFJQQURbQ1RSbGVuKytdOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgYiAgICAgPSBjdFt5XSBeIENUUlBBRFtDVFJsZW4rK107CisgICAgICAgICAgICAgcHRbeV0gPSBiOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICh4ID09IDE2KSB7CisgICAgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5lY2JfZW5jcnlwdChQQUQsIFBBRCwgc2tleSk7CisgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIFBBRFt4KytdIF49IGI7CisgICAgICB9CisgICAgICAgICAgICAgCisgICAgICBpZiAoeCAhPSAwKSB7CisgICAgICAgICBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmVjYl9lbmNyeXB0KFBBRCwgUEFELCBza2V5KTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogc2V0dXAgQ1RSIGZvciB0aGUgVEFHICovCisgICBjdHJbMTRdID0gY3RyWzE1XSA9IDB4MDA7CisgICBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmVjYl9lbmNyeXB0KGN0ciwgQ1RSUEFELCBza2V5KTsKKyAgIGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uZG9uZShza2V5KTsKKworICAgLyogc3RvcmUgdGhlIFRBRyAqLworICAgZm9yICh4ID0gMDsgeCA8IDE2ICYmIHggPCAqdGFnbGVuOyB4KyspIHsKKyAgICAgICB0YWdbeF0gPSBQQURbeF0gXiBDVFJQQURbeF07CisgICB9CisgICAqdGFnbGVuID0geDsKKworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShza2V5LCAgIHNpemVvZigqc2tleSkpOworICAgemVyb21lbShQQUQsICAgIHNpemVvZihQQUQpKTsKKyAgIHplcm9tZW0oQ1RSUEFELCBzaXplb2YoQ1RSUEFEKSk7CisjZW5kaWYKKworICAgWEZSRUUoc2tleSk7CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL2NjbS9jY21fbWVtb3J5LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuOSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9jY20vY2NtX3Rlc3QuYyBiL3NyYy9lbmNhdXRoL2NjbS9jY21fdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzUwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZW5jYXV0aC9jY20vY2NtX3Rlc3QuYwpAQCAtMCwwICsxLDE3NCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY2NtX3Rlc3QuYworICBDQ00gc3VwcG9ydCwgcHJvY2VzcyBhIGJsb2NrIG9mIG1lbW9yeSwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgQ0NNX01PREUKKworaW50IGNjbV90ZXN0KHZvaWQpCit7CisjaWZuZGVmIExUQ19URVNUCisgICByZXR1cm4gQ1JZUFRfTk9QOworI2Vsc2UKKyAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgIHVuc2lnbmVkIGNoYXIga2V5WzE2XTsKKyAgICAgICB1bnNpZ25lZCBjaGFyIG5vbmNlWzE2XTsKKyAgICAgICBpbnQgICAgICAgICAgIG5vbmNlbGVuOworICAgICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyWzY0XTsKKyAgICAgICBpbnQgICAgICAgICAgIGhlYWRlcmxlbjsKKyAgICAgICB1bnNpZ25lZCBjaGFyIHB0WzY0XTsKKyAgICAgICBpbnQgICAgICAgICAgIHB0bGVuOworICAgICAgIHVuc2lnbmVkIGNoYXIgY3RbNjRdOworICAgICAgIHVuc2lnbmVkIGNoYXIgdGFnWzE2XTsKKyAgICAgICBpbnQgICAgICAgICAgIHRhZ2xlbjsKKyAgIH0gdGVzdHNbXSA9IHsKKworLyogMTMgYnl0ZSBub25jZSwgOCBieXRlIGF1dGgsIDIzIGJ5dGUgcHQgKi8KK3sKKyAgIHsgMHhDMCwgMHhDMSwgMHhDMiwgMHhDMywgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNywgCisgICAgIDB4QzgsIDB4QzksIDB4Q0EsIDB4Q0IsIDB4Q0MsIDB4Q0QsIDB4Q0UsIDB4Q0YgfSwKKyAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMiwgMHgwMSwgMHgwMCwgMHhBMCwgCisgICAgIDB4QTEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTUgfSwKKyAgIDEzLAorICAgeyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3IH0sCisgICA4LAorICAgeyAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorICAgICAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFIH0sCisgICAyMywKKyAgIHsgMHg1OCwgMHg4QywgMHg5NywgMHg5QSwgMHg2MSwgMHhDNiwgMHg2MywgMHhEMiwKKyAgICAgMHhGMCwgMHg2NiwgMHhEMCwgMHhDMiwgMHhDMCwgMHhGOSwgMHg4OSwgMHg4MCwKKyAgICAgMHg2RCwgMHg1RiwgMHg2QiwgMHg2MSwgMHhEQSwgMHhDMywgMHg4NCB9LAorICAgeyAweDE3LCAweGU4LCAweGQxLCAweDJjLCAweGZkLCAweGY5LCAweDI2LCAweGUwIH0sCisgICA4Cit9LAorCisvKiAxMyBieXRlIG5vbmNlLCAxMiBieXRlIGhlYWRlciwgMTkgYnl0ZSBwdCAqLworeworICAgeyAweEMwLCAweEMxLCAweEMyLCAweEMzLCAweEM0LCAweEM1LCAweEM2LCAweEM3LCAKKyAgICAgMHhDOCwgMHhDOSwgMHhDQSwgMHhDQiwgMHhDQywgMHhDRCwgMHhDRSwgMHhDRiB9LAorICAgeyAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDA1LCAweDA0LCAweDAzLCAweEEwLCAKKyAgICAgMHhBMSwgMHhBMiwgMHhBMywgMHhBNCwgMHhBNSB9LAorICAgMTMsCisgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIgfSwKKyAgIDEyLAorICAgeyAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAKKyAgICAgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQiwgCisgICAgIDB4MUMsIDB4MUQsIDB4MUUgfSwKKyAgIDE5LAorICAgeyAweEEyLCAweDhDLCAweDY4LCAweDY1LCAweDkzLCAweDlBLCAweDlBLCAweDc5LCAKKyAgICAgMHhGQSwgMHhBQSwgMHg1QywgMHg0QywgMHgyQSwgMHg5RCwgMHg0QSwgMHg5MSwgCisgICAgIDB4Q0QsIDB4QUMsIDB4OEMgfSwKKyAgIHsgMHg5NiwgMHhDOCwgMHg2MSwgMHhCOSwgMHhDOSwgMHhFNiwgMHgxRSwgMHhGMSB9LAorICAgOAorfSwKKworLyogc3VwcGxpZWQgYnkgQnJpYW4gR2xhZG1hbiAqLworeworICAgeyAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAKKyAgICAgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiB9LAorICAgeyAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2ICB9LAorICAgNywKKyAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNyB9LAorICAgOCwKKyAgIHsgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMyB9LAorICAgNCwKKyAgIHsgMHg3MSwgMHg2MiwgMHgwMSwgMHg1YiB9LAorICAgeyAweDRkLCAweGFjLCAweDI1LCAweDVkIH0sCisgICA0Cit9LAorCit7CisgICB7IDB4YzksIDB4N2MsIDB4MWYsIDB4NjcsIDB4Y2UsIDB4MzcsIDB4MTEsIDB4ODUsIAorICAgICAweDUxLCAweDRhLCAweDhhLCAweDE5LCAweGYyLCAweGJkLCAweGQ1LCAweDJmIH0sCisgICB7IDB4MDAsIDB4NTAsIDB4MzAsIDB4ZjEsIDB4ODQsIDB4NDQsIDB4MDgsIDB4YjUsIAorICAgICAweDAzLCAweDk3LCAweDc2LCAweGU3LCAweDBjIH0sCisgICAxMywKKyAgIHsgMHgwOCwgMHg0MCwgMHgwZiwgMHhkMiwgMHhlMSwgMHgyOCwgMHhhNSwgMHg3YywgCisgICAgIDB4NTAsIDB4MzAsIDB4ZjEsIDB4ODQsIDB4NDQsIDB4MDgsIDB4YWIsIDB4YWUsIAorICAgICAweGE1LCAweGI4LCAweGZjLCAweGJhLCAweDAwLCAweDAwIH0sCisgICAyMiwKKyAgIHsgMHhmOCwgMHhiYSwgMHgxYSwgMHg1NSwgMHhkMCwgMHgyZiwgMHg4NSwgMHhhZSwgCisgICAgIDB4OTYsIDB4N2IsIDB4YjYsIDB4MmYsIDB4YjYsIDB4Y2QsIDB4YTgsIDB4ZWIsIAorICAgICAweDdlLCAweDc4LCAweGEwLCAweDUwIH0sCisgICAyMCwKKyAgIHsgMHhmMywgMHhkMCwgMHhhMiwgMHhmZSwgMHg5YSwgMHgzZCwgMHhiZiwgMHgyMywgCisgICAgIDB4NDIsIDB4YTYsIDB4NDMsIDB4ZTQsIDB4MzIsIDB4NDYsIDB4ZTgsIDB4MGMsIAorICAgICAweDNjLCAweDA0LCAweGQwLCAweDE5IH0sCisgICB7IDB4NzgsIDB4NDUsIDB4Y2UsIDB4MGIsIDB4MTYsIDB4ZjksIDB4NzYsIDB4MjMgfSwKKyAgIDgKK30sCisKK307CisgIHVuc2lnbmVkIGxvbmcgdGFnbGVuLCB4OworICB1bnNpZ25lZCBjaGFyIGJ1Zls2NF0sIGJ1ZjJbNjRdLCB0YWcyWzE2XSwgdGFnWzE2XTsKKyAgaW50ICAgICAgICAgICBlcnIsIGlkeDsKKworICBpZHggPSBmaW5kX2NpcGhlcigiYWVzIik7CisgIGlmIChpZHggPT0gLTEpIHsKKyAgICAgaWR4ID0gZmluZF9jaXBoZXIoInJpam5kYWVsIik7CisgICAgIGlmIChpZHggPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIENSWVBUX05PUDsKKyAgICAgfQorICB9CisKKyAgZm9yICh4ID0gMDsgeCA8IChzaXplb2YodGVzdHMpL3NpemVvZih0ZXN0c1swXSkpOyB4KyspIHsKKyAgICAgIHRhZ2xlbiA9IHRlc3RzW3hdLnRhZ2xlbjsKKyAgICAgIGlmICgoZXJyID0gY2NtX21lbW9yeShpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHNbeF0ua2V5LCAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0c1t4XS5ub25jZSwgdGVzdHNbeF0ubm9uY2VsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHNbeF0uaGVhZGVyLCB0ZXN0c1t4XS5oZWFkZXJsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIqKXRlc3RzW3hdLnB0LCB0ZXN0c1t4XS5wdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCAmdGFnbGVuLCAwKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgIHJldHVybiBlcnI7CisgICAgICB9CisKKyAgICAgIGlmIChtZW1jbXAoYnVmLCB0ZXN0c1t4XS5jdCwgdGVzdHNbeF0ucHRsZW4pKSB7CisgICAgICAgICByZXR1cm4gQ1JZUFRfRkFJTF9URVNUVkVDVE9SOworICAgICAgfQorICAgICAgaWYgKG1lbWNtcCh0YWcsIHRlc3RzW3hdLnRhZywgdGVzdHNbeF0udGFnbGVuKSkgeworICAgICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKKyAgICAgIH0KKworICAgICAgaWYgKChlcnIgPSBjY21fbWVtb3J5KGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0c1t4XS5rZXksIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzW3hdLm5vbmNlLCB0ZXN0c1t4XS5ub25jZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0c1t4XS5oZWFkZXIsIHRlc3RzW3hdLmhlYWRlcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYyLCB0ZXN0c1t4XS5wdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnMiwgJnRhZ2xlbiwgMQkpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIH0KKworICAgICBpZiAobWVtY21wKGJ1ZjIsIHRlc3RzW3hdLnB0LCB0ZXN0c1t4XS5wdGxlbikpIHsKKyAgICAgICAgIHJldHVybiBDUllQVF9GQUlMX1RFU1RWRUNUT1I7CisgICAgICB9CisgICAgIGlmIChtZW1jbXAodGFnMiwgdGVzdHNbeF0udGFnLCB0ZXN0c1t4XS50YWdsZW4pKSB7CisgICAgICAgICByZXR1cm4gQ1JZUFRfRkFJTF9URVNUVkVDVE9SOworICAgICB9CisgCisKKyAgfQorICByZXR1cm4gQ1JZUFRfT0s7CisjZW5kaWYKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL2NjbS9jY21fdGVzdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2VuY2F1dGgvZWF4L2VheF9hZGRoZWFkZXIuYyBiL3NyYy9lbmNhdXRoL2VheC9lYXhfYWRkaGVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiMzI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbmNhdXRoL2VheC9lYXhfYWRkaGVhZGVyLmMKQEAgLTAsMCArMSwzOCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKy8qKiAKKyAgICBAZmlsZSBlYXhfYWRkaGVhZGVyLmMKKyAgICBFQVggaW1wbGVtZW50YXRpb24sIGFkZCBtZXRhLWRhdGEsIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIEVBWF9NT0RFCisKKy8qKiAKKyAgICBhZGQgaGVhZGVyIChtZXRhZGF0YSkgdG8gdGhlIHN0cmVhbSAKKyAgICBAcGFyYW0gZWF4ICAgIFRoZSBjdXJyZW50IEVBWCBzdGF0ZQorICAgIEBwYXJhbSBoZWFkZXIgVGhlIGhlYWRlciAobWV0YS1kYXRhKSBkYXRhIHlvdSB3aXNoIHRvIGFkZCB0byB0aGUgc3RhdGUKKyAgICBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciBkYXRhCisgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGVheF9hZGRoZWFkZXIoZWF4X3N0YXRlICplYXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlciwgCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKyAgIExUQ19BUkdDSEsoZWF4ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhoZWFkZXIgIT0gTlVMTCk7CisgICByZXR1cm4gb21hY19wcm9jZXNzKCZlYXgtPmhlYWRlcm9tYWMsIGhlYWRlciwgbGVuZ3RoKTsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL2VheC9lYXhfYWRkaGVhZGVyLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9lYXgvZWF4X2RlY3J5cHQuYyBiL3NyYy9lbmNhdXRoL2VheC9lYXhfZGVjcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTIzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZW5jYXV0aC9lYXgvZWF4X2RlY3J5cHQuYwpAQCAtMCwwICsxLDUwIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworCisvKiogCisgICAgQGZpbGUgZWF4X2RlY3J5cHQuYworICAgIEVBWCBpbXBsZW1lbnRhdGlvbiwgZGVjcnlwdCBibG9jaywgYnkgVG9tIFN0IERlbmlzCisqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKyNpZmRlZiBFQVhfTU9ERQorCisvKiogIAorICAgRGVjcnlwdCBkYXRhIHdpdGggdGhlIEVBWCBwcm90b2NvbAorICAgQHBhcmFtIGVheCAgICAgVGhlIEVBWCBzdGF0ZQorICAgQHBhcmFtIGN0ICAgICAgVGhlIGNpcGhlcnRleHQKKyAgIEBwYXJhbSBwdCAgICAgIFtvdXRdIFRoZSBwbGFpbnRleHQKKyAgIEBwYXJhbSBsZW5ndGggIFRoZSBsZW5ndGggKG9jdGV0cykgb2YgdGhlIGNpcGhlcnRleHQKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBlYXhfZGVjcnlwdChlYXhfc3RhdGUgKmVheCwgY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCAKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aCkKK3sKKyAgIGludCBlcnI7CisgICAKKyAgIExUQ19BUkdDSEsoZWF4ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwdCAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICAhPSBOVUxMKTsKKworICAgLyogb21hYyBjaXBoZXJ0ZXh0ICovCisgICBpZiAoKGVyciA9IG9tYWNfcHJvY2VzcygmZWF4LT5jdG9tYWMsIGN0LCBsZW5ndGgpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogZGVjcnlwdCAgKi8KKyAgIHJldHVybiBjdHJfZGVjcnlwdChjdCwgcHQsIGxlbmd0aCwgJmVheC0+Y3RyKTsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL2VheC9lYXhfZGVjcnlwdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2VuY2F1dGgvZWF4L2VheF9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkuYyBiL3NyYy9lbmNhdXRoL2VheC9lYXhfZGVjcnlwdF92ZXJpZnlfbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkNzJhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbmNhdXRoL2VheC9lYXhfZGVjcnlwdF92ZXJpZnlfbWVtb3J5LmMKQEAgLTAsMCArMSwxMDggQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisKKy8qKgorICAgIEBmaWxlIGVheF9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkuYworICAgIEVBWCBpbXBsZW1lbnRhdGlvbiwgZGVjcnlwdCBibG9jayBvZiBtZW1vcnksIGJ5IFRvbSBTdCBEZW5pcworKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisjaWZkZWYgRUFYX01PREUKKworLyoqCisgICBEZWNyeXB0IGEgYmxvY2sgb2YgbWVtb3J5IGFuZCB2ZXJpZnkgdGhlIHByb3ZpZGVkIE1BQyB0YWcgd2l0aCBFQVgKKyAgIEBwYXJhbSBjaXBoZXIgICAgIFRoZSBpbmRleCBvZiB0aGUgY2lwaGVyIGRlc2lyZWQKKyAgIEBwYXJhbSBrZXkgICAgICAgIFRoZSBzZWNyZXQga2V5CisgICBAcGFyYW0ga2V5bGVuICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBrZXkgKG9jdGV0cykKKyAgIEBwYXJhbSBub25jZSAgICAgIFRoZSBub25jZSBkYXRhICh1c2Ugb25jZSkgZm9yIHRoZSBzZXNzaW9uCisgICBAcGFyYW0gbm9uY2VsZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBub25jZSBkYXRhLgorICAgQHBhcmFtIGhlYWRlciAgICAgVGhlIHNlc3Npb24gaGVhZGVyIGRhdGEKKyAgIEBwYXJhbSBoZWFkZXJsZW4gIFRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciAob2N0ZXRzKQorICAgQHBhcmFtIGN0ICAgICAgICAgVGhlIGNpcGhlcnRleHQKKyAgIEBwYXJhbSBjdGxlbiAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGNpcGhlcnRleHQgKG9jdGV0cykKKyAgIEBwYXJhbSBwdCAgICAgICAgIFtvdXRdIFRoZSBwbGFpbnRleHQKKyAgIEBwYXJhbSB0YWcgICAgICAgIFRoZSBhdXRoZW50aWNhdGlvbiB0YWcgcHJvdmlkZWQgYnkgdGhlIGVuY29kZXIKKyAgIEBwYXJhbSB0YWdsZW4gICAgIFtpbi9vdXRdIFRoZSBsZW5ndGggb2YgdGhlIHRhZyAob2N0ZXRzKQorICAgQHBhcmFtIHN0YXQgICAgICAgW291dF0gVGhlIHJlc3VsdCBvZiB0aGUgZGVjcnlwdGlvbiAoMT09dmFsaWQgdGFnLCAwPT1pbnZhbGlkKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlc3VsdGluZyB0YWcgY29tcGFyaXNvbgorKi8KK2ludCBlYXhfZGVjcnlwdF92ZXJpZnlfbWVtb3J5KGludCBjaXBoZXIsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIHVuc2lnbmVkIGxvbmcgbm9uY2VsZW4sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGVhZGVyLCB1bnNpZ25lZCBsb25nIGhlYWRlcmxlbiwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgICAgIHVuc2lnbmVkIGxvbmcgY3RsZW4sCisgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsCisgICAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnLCAgICB1bnNpZ25lZCBsb25nIHRhZ2xlbiwKKyAgICAgICAgICBpbnQgICAgICAgICAgICpzdGF0KQoreworICAgaW50ICAgICAgICAgICAgZXJyOworICAgZWF4X3N0YXRlICAgICAqZWF4OworICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgdW5zaWduZWQgbG9uZyAgYnVmbGVuOworCisgICBMVENfQVJHQ0hLKHN0YXQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGtleSAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHB0ICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHRhZyAgIT0gTlVMTCk7CisKKyAgIC8qIGRlZmF1bHQgdG8gemVybyAqLworICAgKnN0YXQgPSAwOworCisgICAvKiBhbGxvY2F0ZSByYW0gKi8KKyAgIGJ1ZiA9IFhNQUxMT0ModGFnbGVuKTsKKyAgIGVheCA9IFhNQUxMT0Moc2l6ZW9mKCplYXgpKTsKKyAgIGlmIChlYXggPT0gTlVMTCB8fCBidWYgPT0gTlVMTCkgeworICAgICAgaWYgKGVheCAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShlYXgpOworICAgICAgfQorICAgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShidWYpOworICAgICAgfQorICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKworICAgaWYgKChlcnIgPSBlYXhfaW5pdChlYXgsIGNpcGhlciwga2V5LCBrZXlsZW4sIG5vbmNlLCBub25jZWxlbiwgaGVhZGVyLCBoZWFkZXJsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICBpZiAoKGVyciA9IGVheF9kZWNyeXB0KGVheCwgY3QsIHB0LCBjdGxlbikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisgCisgICBidWZsZW4gPSB0YWdsZW47CisgICBpZiAoKGVyciA9IGVheF9kb25lKGVheCwgYnVmLCAmYnVmbGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogY29tcGFyZSB0YWdzICovCisgICBpZiAoYnVmbGVuID49IHRhZ2xlbiAmJiBtZW1jbXAoYnVmLCB0YWcsIHRhZ2xlbikgPT0gMCkgeworICAgICAgKnN0YXQgPSAxOworICAgfQorICAgCisgICBlcnIgPSBDUllQVF9PSzsKK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKGJ1ZiwgdGFnbGVuKTsKKyAgIHplcm9tZW0oZWF4LCBzaXplb2YoKmVheCkpOworI2VuZGlmCisKKyAgIFhGUkVFKGVheCk7CisgICBYRlJFRShidWYpOworCisgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvZWF4L2VheF9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9lbmNhdXRoL2VheC9lYXhfZG9uZS5jIGIvc3JjL2VuY2F1dGgvZWF4L2VheF9kb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlMmMyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbmNhdXRoL2VheC9lYXhfZG9uZS5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisKKy8qKgorICAgQGZpbGUgZWF4X2RvbmUuYworICAgRUFYIGltcGxlbWVudGF0aW9uLCB0ZXJtaW5hdGUgc2Vzc2lvbiwgYnkgVG9tIFN0IERlbmlzCisqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKyNpZmRlZiBFQVhfTU9ERQorCisvKioKKyAgIFRlcm1pbmF0ZSBhbiBFQVggc2Vzc2lvbiBhbmQgZ2V0IHRoZSB0YWcuCisgICBAcGFyYW0gZWF4ICAgICAgIFRoZSBFQVggc3RhdGUKKyAgIEBwYXJhbSB0YWcgICAgICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcKKyAgIEBwYXJhbSB0YWdsZW4gICAgW2luL291dF0gVGhlIG1heCBsZW5ndGggYW5kIHJlc3VsdGluZyBsZW5ndGggb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHRhZworICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGVheF9kb25lKGVheF9zdGF0ZSAqZWF4LCB1bnNpZ25lZCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbikKK3sKKyAgIGludCAgICAgICAgICAgZXJyOworICAgdW5zaWduZWQgY2hhciAqaGVhZGVybWFjLCAqY3RtYWM7CisgICB1bnNpZ25lZCBsb25nIHgsIGxlbjsKKworICAgTFRDX0FSR0NISyhlYXggICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHRhZyAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsodGFnbGVuICE9IE5VTEwpOworCisgICAvKiBhbGxvY2F0ZSByYW0gKi8KKyAgIGhlYWRlcm1hYyA9IFhNQUxMT0MoTUFYQkxPQ0tTSVpFKTsKKyAgIGN0bWFjICAgICA9IFhNQUxMT0MoTUFYQkxPQ0tTSVpFKTsKKworICAgaWYgKGhlYWRlcm1hYyA9PSBOVUxMIHx8IGN0bWFjID09IE5VTEwpIHsKKyAgICAgIGlmIChoZWFkZXJtYWMgIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUoaGVhZGVybWFjKTsKKyAgICAgIH0KKyAgICAgIGlmIChjdG1hYyAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShjdG1hYyk7CisgICAgICB9CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICAvKiBmaW5pc2ggY3RvbWFjICovCisgICBsZW4gPSBNQVhCTE9DS1NJWkU7CisgICBpZiAoKGVyciA9IG9tYWNfZG9uZSgmZWF4LT5jdG9tYWMsIGN0bWFjLCAmbGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsgCisgICB9CisKKyAgIC8qIGZpbmlzaCBoZWFkZXJvbWFjICovCisKKyAgIC8qIG5vdGUgd2Ugc3BlY2lmaWNhbGx5IGRvbid0IHJlc2V0IGxlbiBzbyB0aGUgdHdvIGxlbnMgYXJlIG1pbmltYWwgKi8KKworICAgaWYgKChlcnIgPSBvbWFjX2RvbmUoJmVheC0+aGVhZGVyb21hYywgaGVhZGVybWFjLCAmbGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsgCisgICB9CisKKyAgIC8qIHRlcm1pbmF0ZSB0aGUgQ1RSIGNoYWluICovCisgICBpZiAoKGVyciA9IGN0cl9kb25lKCZlYXgtPmN0cikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisKKyAgIC8qIGNvbXB1dGUgTiB4b3IgSCB4b3IgQyAqLworICAgZm9yICh4ID0gMDsgeCA8IGxlbiAmJiB4IDwgKnRhZ2xlbjsgeCsrKSB7CisgICAgICAgdGFnW3hdID0gZWF4LT5OW3hdIF4gaGVhZGVybWFjW3hdIF4gY3RtYWNbeF07CisgICB9CisgICAqdGFnbGVuID0geDsKKworICAgZXJyID0gQ1JZUFRfT0s7CitMQkxfRVJSOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShjdG1hYywgICAgIE1BWEJMT0NLU0laRSk7CisgICB6ZXJvbWVtKGhlYWRlcm1hYywgTUFYQkxPQ0tTSVpFKTsKKyAgIHplcm9tZW0oZWF4LCAgICAgICBzaXplb2YoKmVheCkpOworI2VuZGlmCisKKyAgIFhGUkVFKGN0bWFjKTsKKyAgIFhGUkVFKGhlYWRlcm1hYyk7CisKKyAgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvZW5jYXV0aC9lYXgvZWF4X2RvbmUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9lbmNhdXRoL2VheC9lYXhfZW5jcnlwdC5jIGIvc3JjL2VuY2F1dGgvZWF4L2VheF9lbmNyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0NjU4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbmNhdXRoL2VheC9lYXhfZW5jcnlwdC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisKKy8qKgorICAgQGZpbGUgZWF4X2VuY3J5cHQuYworICAgRUFYIGltcGxlbWVudGF0aW9uLCBlbmNyeXB0IGJsb2NrIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIEVBWF9NT0RFCisKKy8qKgorICAgRW5jcnlwdCB3aXRoIEVBWCBhIGJsb2NrIG9mIGRhdGEuCisgICBAcGFyYW0gZWF4ICAgICAgICBUaGUgRUFYIHN0YXRlCisgICBAcGFyYW0gcHQgICAgICAgICBUaGUgcGxhaW50ZXh0IHRvIGVuY3J5cHQKKyAgIEBwYXJhbSBjdCAgICAgICAgIFtvdXRdIFRoZSBjaXBoZXJ0ZXh0IGFzIGVuY3J5cHRlZAorICAgQHBhcmFtIGxlbmd0aCAgICAgVGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IChvY3RldHMpCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZWF4X2VuY3J5cHQoZWF4X3N0YXRlICplYXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGgpCit7CisgICBpbnQgZXJyOworICAgCisgICBMVENfQVJHQ0hLKGVheCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHQgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAgIT0gTlVMTCk7CisKKyAgIC8qIGVuY3J5cHQgKi8KKyAgIGlmICgoZXJyID0gY3RyX2VuY3J5cHQocHQsIGN0LCBsZW5ndGgsICZlYXgtPmN0cikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICAvKiBvbWFjIGNpcGhlcnRleHQgKi8KKyAgIHJldHVybiBvbWFjX3Byb2Nlc3MoJmVheC0+Y3RvbWFjLCBjdCwgbGVuZ3RoKTsKK30KKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvZWF4L2VheF9lbmNyeXB0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9lYXgvZWF4X2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5jIGIvc3JjL2VuY2F1dGgvZWF4L2VheF9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzYwNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2VuY2F1dGgvZWF4L2VheF9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkuYwpAQCAtMCwwICsxLDgyIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworCisvKioKKyAgQGZpbGUgZWF4X2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5jCisgIEVBWCBpbXBsZW1lbnRhdGlvbiwgZW5jcnlwdCBhIGJsb2NrIG9mIG1lbW9yeSwgYnkgVG9tIFN0IERlbmlzCisqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKyNpZmRlZiBFQVhfTU9ERQorCisvKioKKyAgIEVBWCBlbmNyeXB0IGFuZCBwcm9kdWNlIGFuIGF1dGhlbnRpY2F0aW9uIHRhZworICAgQHBhcmFtIGNpcGhlciAgICAgVGhlIGluZGV4IG9mIHRoZSBjaXBoZXIgZGVzaXJlZAorICAgQHBhcmFtIGtleSAgICAgICAgVGhlIHNlY3JldCBrZXkgdG8gdXNlCisgICBAcGFyYW0ga2V5bGVuICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5IChvY3RldHMpCisgICBAcGFyYW0gbm9uY2UgICAgICBUaGUgc2Vzc2lvbiBub25jZSBbdXNlIG9uY2VdCisgICBAcGFyYW0gbm9uY2VsZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBub25jZQorICAgQHBhcmFtIGhlYWRlciAgICAgVGhlIGhlYWRlciBmb3IgdGhlIHNlc3Npb24KKyAgIEBwYXJhbSBoZWFkZXJsZW4gIFRoZSBsZW5ndGggb2YgdGhlIGhlYWRlciAob2N0ZXRzKQorICAgQHBhcmFtIHB0ICAgICAgICAgVGhlIHBsYWludGV4dAorICAgQHBhcmFtIHB0bGVuICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IChvY3RldHMpCisgICBAcGFyYW0gY3QgICAgICAgICBbb3V0XSBUaGUgY2lwaGVydGV4dAorICAgQHBhcmFtIHRhZyAgICAgICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIHRhZworICAgQHBhcmFtIHRhZ2xlbiAgICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgYXV0aGVudGljYXRpb24gdGFnCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZWF4X2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeShpbnQgY2lwaGVyLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbm9uY2UsICB1bnNpZ25lZCBsb25nIG5vbmNlbGVuLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBoZWFkZXJsZW4sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHQsICAgICB1bnNpZ25lZCBsb25nIHB0bGVuLAorICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LAorICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhZywgICAgdW5zaWduZWQgbG9uZyAqdGFnbGVuKQoreworICAgaW50IGVycjsKKyAgIGVheF9zdGF0ZSAqZWF4OworCisgICBMVENfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHQgICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHRhZyAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsodGFnbGVuICE9IE5VTEwpOworCisgICBlYXggPSBYTUFMTE9DKHNpemVvZigqZWF4KSk7CisKKyAgIGlmICgoZXJyID0gZWF4X2luaXQoZWF4LCBjaXBoZXIsIGtleSwga2V5bGVuLCBub25jZSwgbm9uY2VsZW4sIGhlYWRlciwgaGVhZGVybGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsgCisgICB9CisKKyAgIGlmICgoZXJyID0gZWF4X2VuY3J5cHQoZWF4LCBwdCwgY3QsIHB0bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsgCisgICB9CisgCisgICBpZiAoKGVyciA9IGVheF9kb25lKGVheCwgdGFnLCB0YWdsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOyAKKyAgIH0KKworICAgZXJyID0gQ1JZUFRfT0s7CitMQkxfRVJSOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShlYXgsIHNpemVvZigqZWF4KSk7CisjZW5kaWYKKworICAgWEZSRUUoZWF4KTsKKworICAgcmV0dXJuIGVycjsgICAKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL2VheC9lYXhfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9lYXgvZWF4X2luaXQuYyBiL3NyYy9lbmNhdXRoL2VheC9lYXhfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmIyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZW5jYXV0aC9lYXgvZWF4X2luaXQuYwpAQCAtMCwwICsxLDE0NCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKworLyoqIAorICAgQGZpbGUgZWF4X2luaXQuYworICAgRUFYIGltcGxlbWVudGF0aW9uLCBpbml0aWFsaXplZCBFQVggc3RhdGUsIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIEVBWF9NT0RFCisKKy8qKiAKKyAgIEluaXRpYWxpemVkIGFuIEVBWCBzdGF0ZQorICAgQHBhcmFtIGVheCAgICAgICBbb3V0XSBUaGUgRUFYIHN0YXRlIHRvIGluaXRpYWxpemUKKyAgIEBwYXJhbSBjaXBoZXIgICAgVGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGNpcGhlcgorICAgQHBhcmFtIGtleSAgICAgICBUaGUgc2VjcmV0IGtleQorICAgQHBhcmFtIGtleWxlbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5IChvY3RldHMpCisgICBAcGFyYW0gbm9uY2UgICAgIFRoZSB1c2Utb25jZSBub25jZSBmb3IgdGhlIHNlc3Npb24KKyAgIEBwYXJhbSBub25jZWxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgbm9uY2UgKG9jdGV0cykKKyAgIEBwYXJhbSBoZWFkZXIgICAgVGhlIGhlYWRlciBmb3IgdGhlIEVBWCBzdGF0ZQorICAgQHBhcmFtIGhlYWRlcmxlbiBUaGUgaGVhZGVyIGxlbmd0aCAob2N0ZXRzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGVheF9pbml0KGVheF9zdGF0ZSAqZWF4LCBpbnQgY2lwaGVyLCAKKyAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksICAgIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5vbmNlLCAgdW5zaWduZWQgbG9uZyBub25jZWxlbiwKKyAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoZWFkZXIsIHVuc2lnbmVkIGxvbmcgaGVhZGVybGVuKQoreworICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgaW50ICAgICAgICAgICBlcnIsIGJsa2xlbjsKKyAgIG9tYWNfc3RhdGUgICAgKm9tYWM7CisgICB1bnNpZ25lZCBsb25nIGxlbjsKKworCisgICBMVENfQVJHQ0hLKGVheCAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsobm9uY2UgIT0gTlVMTCk7CisgICBpZiAoaGVhZGVybGVuID4gMCkgeworICAgICAgTFRDX0FSR0NISyhoZWFkZXIgIT0gTlVMTCk7CisgICB9CisKKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNpcGhlcikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorICAgYmxrbGVuID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5ibG9ja19sZW5ndGg7CisKKyAgIC8qIGFsbG9jYXRlIHJhbSAqLworICAgYnVmICA9IFhNQUxMT0MoTUFYQkxPQ0tTSVpFKTsKKyAgIG9tYWMgPSBYTUFMTE9DKHNpemVvZigqb21hYykpOworCisgICBpZiAoYnVmID09IE5VTEwgfHwgb21hYyA9PSBOVUxMKSB7CisgICAgICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICAgICAgIFhGUkVFKGJ1Zik7CisgICAgICB9CisgICAgICBpZiAob21hYyAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShvbWFjKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKKyAgIC8qIE4gPSBPTUFDXzBLKG5vbmNlKSAqLworICAgemVyb21lbShidWYsIE1BWEJMT0NLU0laRSk7CisgICBpZiAoKGVyciA9IG9tYWNfaW5pdChvbWFjLCBjaXBoZXIsIGtleSwga2V5bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsgCisgICB9CisKKyAgIC8qIG9tYWMgdGhlIFswXV9uICovCisgICBpZiAoKGVyciA9IG9tYWNfcHJvY2VzcyhvbWFjLCBidWYsIGJsa2xlbikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7IAorICAgfQorICAgLyogb21hYyB0aGUgbm9uY2UgKi8KKyAgIGlmICgoZXJyID0gb21hY19wcm9jZXNzKG9tYWMsIG5vbmNlLCBub25jZWxlbikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7IAorICAgfQorICAgLyogc3RvcmUgcmVzdWx0ICovCisgICBsZW4gPSBzaXplb2YoZWF4LT5OKTsKKyAgIGlmICgoZXJyID0gb21hY19kb25lKG9tYWMsIGVheC0+TiwgJmxlbikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7IAorICAgfQorCisgICAvKiBIID0gT01BQ18xSyhoZWFkZXIpICovCisgICB6ZXJvbWVtKGJ1ZiwgTUFYQkxPQ0tTSVpFKTsKKyAgIGJ1ZltibGtsZW4gLSAxXSA9IDE7CisKKyAgIGlmICgoZXJyID0gb21hY19pbml0KCZlYXgtPmhlYWRlcm9tYWMsIGNpcGhlciwga2V5LCBrZXlsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOyAKKyAgIH0KKworICAgLyogb21hYyB0aGUgWzFdX24gKi8KKyAgIGlmICgoZXJyID0gb21hY19wcm9jZXNzKCZlYXgtPmhlYWRlcm9tYWMsIGJ1ZiwgYmxrbGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsgCisgICB9CisgICAvKiBvbWFjIHRoZSBoZWFkZXIgKi8KKyAgIGlmIChoZWFkZXJsZW4gIT0gMCkgeworICAgICAgaWYgKChlcnIgPSBvbWFjX3Byb2Nlc3MoJmVheC0+aGVhZGVyb21hYywgaGVhZGVyLCBoZWFkZXJsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgICAgIGdvdG8gTEJMX0VSUjsgCisgICAgICB9CisgICB9CisKKyAgIC8qIG5vdGUgd2UgZG9uJ3QgZmluaXNoIHRoZSBoZWFkZXJvbWFjLCB0aGlzIGFsbG93cyB1cyB0byBhZGQgbW9yZSBoZWFkZXIgbGF0ZXIgKi8KKworICAgLyogc2V0dXAgdGhlIENUUiBtb2RlICovCisgICBpZiAoKGVyciA9IGN0cl9zdGFydChjaXBoZXIsIGVheC0+Tiwga2V5LCBrZXlsZW4sIDAsIENUUl9DT1VOVEVSX0JJR19FTkRJQU4sICZlYXgtPmN0cikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7IAorICAgfQorCisgICAvKiBzZXR1cCB0aGUgT01BQyBmb3IgdGhlIGNpcGhlcnRleHQgKi8KKyAgIGlmICgoZXJyID0gb21hY19pbml0KCZlYXgtPmN0b21hYywgY2lwaGVyLCBrZXksIGtleWxlbikpICE9IENSWVBUX09LKSB7IAorICAgICAgZ290byBMQkxfRVJSOyAKKyAgIH0KKworICAgLyogb21hYyBbMl1fbiAqLworICAgemVyb21lbShidWYsIE1BWEJMT0NLU0laRSk7CisgICBidWZbYmxrbGVuLTFdID0gMjsKKyAgIGlmICgoZXJyID0gb21hY19wcm9jZXNzKCZlYXgtPmN0b21hYywgYnVmLCBibGtsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOyAKKyAgIH0KKworICAgZXJyID0gQ1JZUFRfT0s7CitMQkxfRVJSOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShidWYsICBNQVhCTE9DS1NJWkUpOworICAgemVyb21lbShvbWFjLCBzaXplb2YoKm9tYWMpKTsKKyNlbmRpZgorCisgICBYRlJFRShvbWFjKTsKKyAgIFhGUkVFKGJ1Zik7CisKKyAgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvZWF4L2VheF9pbml0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9lYXhfdGVzdC5jIGIvc3JjL2VuY2F1dGgvZWF4L2VheF90ZXN0LmMKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gZWF4X3Rlc3QuYwpyZW5hbWUgdG8gc3JjL2VuY2F1dGgvZWF4L2VheF90ZXN0LmMKaW5kZXggOTM3NzRiMC4uYjA4ZjVhYiAxMDA2NDQKLS0tIGEvZWF4X3Rlc3QuYworKysgYi9zcmMvZW5jYXV0aC9lYXgvZWF4X3Rlc3QuYwpAQCAtNiwxNCArNiwyMSBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCiAKLS8qIEVBWCBJbXBsZW1lbnRhdGlvbiBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisvKiogCisgICAgQGZpbGUgZWF4X3Rlc3QuYworICAgIEVBWCBpbXBsZW1lbnRhdGlvbiwgc2VsZi10ZXN0LCBieSBUb20gU3QgRGVuaXMKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAogI2lmZGVmIEVBWF9NT0RFCiAKKy8qKgorICAgVGVzdCB0aGUgRUFYIGltcGxlbWVudGF0aW9uCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3RpbmcgaGFzIGJlZW4gZGlzYWJsZWQKKyovCiBpbnQgZWF4X3Rlc3Qodm9pZCkKIHsKICNpZm5kZWYgTFRDX1RFU1QKQEAgLTI2OSwzICsyNzYsNyBAQAogfQogCiAjZW5kaWYgLyogRUFYX01PREUgKi8KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvZWF4L2VheF90ZXN0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9nY20vZ2NtX2FkZF9hYWQuYyBiL3NyYy9lbmNhdXRoL2djbS9nY21fYWRkX2FhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzY2IyNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZW5jYXV0aC9nY20vZ2NtX2FkZF9hYWQuYwpAQCAtMCwwICsxLDEyNCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKworLyoqCisgICBAZmlsZSBnY21fYWRkX2FhZC5jCisgICBHQ00gaW1wbGVtZW50YXRpb24sIEFkZCBBQUQgZGF0YSB0byB0aGUgc3RyZWFtLCBieSBUb20gU3QgRGVuaXMKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIEdDTV9NT0RFCisKKy8qKgorICBBZGQgQUFEIHRvIHRoZSBHQ00gc3RhdGUKKyAgQHBhcmFtIGdjbSAgICAgICBUaGUgR0NNIHN0YXRlCisgIEBwYXJhbSBhZGF0YSAgICAgVGhlIGFkZGl0aW9uYWwgYXV0aGVudGljYXRpb24gZGF0YSB0byBhZGQgdG8gdGhlIEdDTSBzdGF0ZQorICBAcGFyYW0gYWRhdGFsZW4gIFRoZSBsZW5ndGggb2YgdGhlIEFBRCBkYXRhLgorICBAcmV0dXJuIENSWVBUX09LIG9uIHN1Y2Nlc3MKKyAqLworaW50IGdjbV9hZGRfYWFkKGdjbV9zdGF0ZSAqZ2NtLAorICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRhdGEsICB1bnNpZ25lZCBsb25nIGFkYXRhbGVuKQoreworICAgdW5zaWduZWQgbG9uZyB4OworICAgaW50ICAgICAgICAgICBlcnI7CisjaWZkZWYgTFRDX0ZBU1QKKyAgIHVuc2lnbmVkIGxvbmcgeTsKKyNlbmRpZgorCisgICBMVENfQVJHQ0hLKGdjbSAgICAhPSBOVUxMKTsKKyAgIGlmIChhZGF0YWxlbiA+IDApIHsKKyAgICAgIExUQ19BUkdDSEsoYWRhdGEgICE9IE5VTEwpOworICAgfQorCisgICBpZiAoZ2NtLT5idWZsZW4gPiAxNiB8fCBnY20tPmJ1ZmxlbiA8IDApIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoZ2NtLT5jaXBoZXIpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogaW4gSVYgbW9kZT8gKi8KKyAgIGlmIChnY20tPm1vZGUgPT0gR0NNX01PREVfSVYpIHsKKyAgICAgIC8qIGxldCdzIHByb2Nlc3MgdGhlIElWICovCisgICAgICBpZiAoZ2NtLT5pdm1vZGUgfHwgZ2NtLT5idWZsZW4gIT0gMTIpIHsKKyAgICAgICAgIGZvciAoeCA9IDA7IHggPCAodW5zaWduZWQgbG9uZylnY20tPmJ1ZmxlbjsgeCsrKSB7CisgICAgICAgICAgICAgZ2NtLT5YW3hdIF49IGdjbS0+YnVmW3hdOworICAgICAgICAgfQorICAgICAgICAgaWYgKGdjbS0+YnVmbGVuKSB7CisgICAgICAgICAgICBnY20tPnRvdGxlbiArPSBnY20tPmJ1ZmxlbiAqIENPTlNUNjQoOCk7CisgICAgICAgICAgICBnY21fbXVsdF9oKGdjbSwgZ2NtLT5YKTsKKyAgICAgICAgIH0KKyAKKyAgICAgICAgIC8qIG1peCBpbiB0aGUgbGVuZ3RoICovCisgICAgICAgICB6ZXJvbWVtKGdjbS0+YnVmLCA4KTsKKyAgICAgICAgIFNUT1JFNjRIKGdjbS0+dG90bGVuLCBnY20tPmJ1Zis4KTsKKyAgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKSB7CisgICAgICAgICAgICAgZ2NtLT5YW3hdIF49IGdjbS0+YnVmW3hdOworICAgICAgICAgfQorICAgICAgICAgZ2NtX211bHRfaChnY20sIGdjbS0+WCk7CisKKyAgICAgICAgIC8qIGNvcHkgY291bnRlciBvdXQgKi8gCisgICAgICAgICBYTUVNQ1BZKGdjbS0+WSwgZ2NtLT5YLCAxNik7CisgICAgICAgICB6ZXJvbWVtKGdjbS0+WCwgMTYpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIFhNRU1DUFkoZ2NtLT5ZLCBnY20tPmJ1ZiwgMTIpOworICAgICAgICAgZ2NtLT5ZWzEyXSA9IDA7CisgICAgICAgICBnY20tPllbMTNdID0gMDsKKyAgICAgICAgIGdjbS0+WVsxNF0gPSAwOworICAgICAgICAgZ2NtLT5ZWzE1XSA9IDE7CisgICAgICB9CisgICAgICBYTUVNQ1BZKGdjbS0+WV8wLCBnY20tPlksIDE2KTsKKyAgICAgIHplcm9tZW0oZ2NtLT5idWYsIDE2KTsKKyAgICAgIGdjbS0+YnVmbGVuID0gMDsKKyAgICAgIGdjbS0+dG90bGVuID0gMDsKKyAgICAgIGdjbS0+bW9kZSAgID0gR0NNX01PREVfQUFEOworICAgfQorCisgICBpZiAoZ2NtLT5tb2RlICE9IEdDTV9NT0RFX0FBRCB8fCBnY20tPmJ1ZmxlbiA+PSAxNikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICB4ID0gMDsKKyNpZmRlZiBMVENfRkFTVAorICAgaWYgKGdjbS0+YnVmbGVuID09IDApIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCAoYWRhdGFsZW4gJiB+MTUpOyB4ICs9IDE2KSB7CisgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5ICs9IHNpemVvZihMVENfRkFTVF9UWVBFKSkgeworICAgICAgICAgICAgICAqKChMVENfRkFTVF9UWVBFKikoJmdjbS0+WFt5XSkpIF49ICooKExUQ19GQVNUX1RZUEUqKSgmYWRhdGFbeCArIHldKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGdjbV9tdWx0X2goZ2NtLCBnY20tPlgpOworICAgICAgICAgIGdjbS0+dG90bGVuICs9IDEyODsKKyAgICAgIH0KKyAgICAgIGFkYXRhICs9IHg7CisgICB9CisjZW5kaWYKKworCisgICAvKiBzdGFydCBhZGRpbmcgQUFEIGRhdGEgdG8gdGhlIHN0YXRlICovCisgICBmb3IgKDsgeCA8IGFkYXRhbGVuOyB4KyspIHsKKyAgICAgICBnY20tPlhbZ2NtLT5idWZsZW4rK10gXj0gKmFkYXRhKys7CisKKyAgICAgICBpZiAoZ2NtLT5idWZsZW4gPT0gMTYpIHsKKyAgICAgICAgIC8qIEdGIG11bHQgaXQgKi8KKyAgICAgICAgIGdjbV9tdWx0X2goZ2NtLCBnY20tPlgpOworICAgICAgICAgZ2NtLT5idWZsZW4gPSAwOworICAgICAgICAgZ2NtLT50b3RsZW4gKz0gMTI4OworICAgICAgfQorICAgfQorCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisjZW5kaWYKKyAgIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvZW5jYXV0aC9nY20vZ2NtX2FkZF9hYWQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9nY20vZ2NtX2FkZF9pdi5jIGIvc3JjL2VuY2F1dGgvZ2NtL2djbV9hZGRfaXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDdjZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2VuY2F1dGgvZ2NtL2djbV9hZGRfaXYuYwpAQCAtMCwwICsxLDk0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworCisvKioKKyAgIEBmaWxlIGdjbV9hZGRfaXYuYworICAgR0NNIGltcGxlbWVudGF0aW9uLCBhZGQgSVYgZGF0YSB0byB0aGUgc3RhdGUsIGJ5IFRvbSBTdCBEZW5pcworKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisjaWZkZWYgR0NNX01PREUKKworLyoqCisgIEFkZCBJViBkYXRhIHRvIHRoZSBHQ00gc3RhdGUKKyAgQHBhcmFtIGdjbSAgICBUaGUgR0NNIHN0YXRlCisgIEBwYXJhbSBJViAgICAgVGhlIGluaXRpYWwgdmFsdWUgZGF0YSB0byBhZGQKKyAgQHBhcmFtIElWbGVuICBUaGUgbGVuZ3RoIG9mIHRoZSBJVgorICBAcmV0dXJuIENSWVBUX09LIG9uIHN1Y2Nlc3MKKyAqLworaW50IGdjbV9hZGRfaXYoZ2NtX3N0YXRlICpnY20sIAorICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsICAgICB1bnNpZ25lZCBsb25nIElWbGVuKQoreworICAgdW5zaWduZWQgbG9uZyB4LCB5OworICAgaW50ICAgICAgICAgICBlcnI7CisKKyAgIExUQ19BUkdDSEsoZ2NtICE9IE5VTEwpOworICAgaWYgKElWbGVuID4gMCkgeworICAgICAgTFRDX0FSR0NISyhJViAgIT0gTlVMTCk7CisgICB9CisKKyAgIC8qIG11c3QgYmUgaW4gSVYgbW9kZSAqLworICAgaWYgKGdjbS0+bW9kZSAhPSBHQ01fTU9ERV9JVikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorIAorICAgaWYgKGdjbS0+YnVmbGVuID49IDE2IHx8IGdjbS0+YnVmbGVuIDwgMCkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChnY20tPmNpcGhlcikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisKKyAgIC8qIHRyaXAgdGhlIGl2bW9kZSBmbGFnICovCisgICBpZiAoSVZsZW4gKyBnY20tPmJ1ZmxlbiA+IDEyKSB7CisgICAgICBnY20tPml2bW9kZSB8PSAxOworICAgfQorCisgICB4ID0gMDsKKyNpZmRlZiBMVENfRkFTVAorICAgaWYgKGdjbS0+YnVmbGVuID09IDApIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCAoSVZsZW4gJiB+MTUpOyB4ICs9IDE2KSB7CisgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5ICs9IHNpemVvZihMVENfRkFTVF9UWVBFKSkgeworICAgICAgICAgICAgICAqKChMVENfRkFTVF9UWVBFKikoJmdjbS0+WFt5XSkpIF49ICooKExUQ19GQVNUX1RZUEUqKSgmSVZbeCArIHldKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGdjbV9tdWx0X2goZ2NtLCBnY20tPlgpOworICAgICAgICAgIGdjbS0+dG90bGVuICs9IDEyODsKKyAgICAgIH0KKyAgICAgIElWICs9IHg7CisgICB9CisjZW5kaWYKKworICAgLyogc3RhcnQgYWRkaW5nIElWIGRhdGEgdG8gdGhlIHN0YXRlICovCisgICBmb3IgKDsgeCA8IElWbGVuOyB4KyspIHsKKyAgICAgICBnY20tPmJ1ZltnY20tPmJ1ZmxlbisrXSA9ICpJVisrOworCisgICAgICAgaWYgKGdjbS0+YnVmbGVuID09IDE2KSB7CisgICAgICAgICAvKiBHRiBtdWx0IGl0ICovCisgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworICAgICAgICAgICAgIGdjbS0+WFt5XSBePSBnY20tPmJ1Zlt5XTsKKyAgICAgICAgIH0KKyAgICAgICAgIGdjbV9tdWx0X2goZ2NtLCBnY20tPlgpOworICAgICAgICAgZ2NtLT5idWZsZW4gPSAwOworICAgICAgICAgZ2NtLT50b3RsZW4gKz0gMTI4OworICAgICAgfQorICAgfQorCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorICAgCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL2djbS9nY21fYWRkX2l2LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNiAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9nY20vZ2NtX2RvbmUuYyBiL3NyYy9lbmNhdXRoL2djbS9nY21fZG9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZWY3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZW5jYXV0aC9nY20vZ2NtX2RvbmUuYwpAQCAtMCwwICsxLDgxIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworCisvKioKKyAgIEBmaWxlIGdjbV9kb25lLmMKKyAgIEdDTSBpbXBsZW1lbnRhdGlvbiwgVGVybWluYXRlIHRoZSBzdHJlYW0sIGJ5IFRvbSBTdCBEZW5pcworKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisjaWZkZWYgR0NNX01PREUKKworLyoqCisgIFRlcm1pbmF0ZSBhIEdDTSBzdHJlYW0KKyAgQHBhcmFtIGdjbSAgICAgVGhlIEdDTSBzdGF0ZQorICBAcGFyYW0gdGFnICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gZm9yIHRoZSBNQUMgdGFnCisgIEBwYXJhbSB0YWdsZW4gIFtpbi9vdXRdICBUaGUgbGVuZ3RoIG9mIHRoZSBNQUMgdGFnCisgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjY2VzcworICovCitpbnQgZ2NtX2RvbmUoZ2NtX3N0YXRlICpnY20sIAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnLCAgICB1bnNpZ25lZCBsb25nICp0YWdsZW4pCit7CisgICB1bnNpZ25lZCBsb25nIHg7CisgICBpbnQgZXJyOworCisgICBMVENfQVJHQ0hLKGdjbSAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHRhZyAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHRhZ2xlbiAgIT0gTlVMTCk7CisKKyAgIGlmIChnY20tPmJ1ZmxlbiA+IDE2IHx8IGdjbS0+YnVmbGVuIDwgMCkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChnY20tPmNpcGhlcikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisKKyAgIGlmIChnY20tPm1vZGUgIT0gR0NNX01PREVfVEVYVCkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICAvKiBoYW5kbGUgcmVtYWluaW5nIGNpcGhlcnRleHQgKi8KKyAgIGlmIChnY20tPmJ1ZmxlbikgeworICAgICAgZ2NtLT5wdHRvdGxlbiArPSBnY20tPmJ1ZmxlbiAqIENPTlNUNjQoOCk7CisgICAgICBnY21fbXVsdF9oKGdjbSwgZ2NtLT5YKTsKKyAgIH0KKworICAgLyogbGVuZ3RoICovCisgICBTVE9SRTY0SChnY20tPnRvdGxlbiwgZ2NtLT5idWYpOworICAgU1RPUkU2NEgoZ2NtLT5wdHRvdGxlbiwgZ2NtLT5idWYrOCk7CisgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykgeworICAgICAgIGdjbS0+WFt4XSBePSBnY20tPmJ1Zlt4XTsKKyAgIH0KKyAgIGdjbV9tdWx0X2goZ2NtLCBnY20tPlgpOworCisgICAvKiBlbmNyeXB0IG9yaWdpbmFsIGNvdW50ZXIgKi8KKyAgIGNpcGhlcl9kZXNjcmlwdG9yW2djbS0+Y2lwaGVyXS5lY2JfZW5jcnlwdChnY20tPllfMCwgZ2NtLT5idWYsICZnY20tPkspOworICAgZm9yICh4ID0gMDsgeCA8IDE2ICYmIHggPCAqdGFnbGVuOyB4KyspIHsKKyAgICAgICB0YWdbeF0gPSBnY20tPmJ1Zlt4XSBeIGdjbS0+WFt4XTsKKyAgIH0KKyAgICp0YWdsZW4gPSB4OworCisgICBjaXBoZXJfZGVzY3JpcHRvcltnY20tPmNpcGhlcl0uZG9uZSgmZ2NtLT5LKTsKKworICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvZW5jYXV0aC9nY20vZ2NtX2RvbmUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS43ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9lbmNhdXRoL2djbS9nY21fZ2ZfbXVsdC5jIGIvc3JjL2VuY2F1dGgvZ2NtL2djbV9nZl9tdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkYjIyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbmNhdXRoL2djbS9nY21fZ2ZfbXVsdC5jCkBAIC0wLDAgKzEsOTQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisKKy8qKgorICAgQGZpbGUgZ2NtX2dmX211bHQuYworICAgR0NNIGltcGxlbWVudGF0aW9uLCBpbml0aWFsaXplIHN0YXRlLCBieSBUb20gU3QgRGVuaXMKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIEdDTV9NT0RFCisKKy8qIHJpZ2h0IHNoaWZ0ICovCitzdGF0aWMgdm9pZCBnY21fcmlnaHRzaGlmdCh1bnNpZ25lZCBjaGFyICphKQoreworICAgaW50IHg7CisgICBmb3IgKHggPSAxNTsgeCA+IDA7IHgtLSkgeworICAgICAgIGFbeF0gPSAoYVt4XT4+MSkgfCAoKGFbeC0xXTw8NykmMHg4MCk7CisgICB9CisgICBhWzBdID4+PSAxOworfQorCisvKiBjID0gYiphICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtYXNrW10gPSB7IDB4ODAsIDB4NDAsIDB4MjAsIDB4MTAsIDB4MDgsIDB4MDQsIDB4MDIsIDB4MDEgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBvbHlbXSA9IHsgMHgwMCwgMHhFMSB9OworCisgICAgIAorLyoqCisgIEdDTSBHRiBtdWx0aXBsaWVyIChpbnRlcm5hbCB1c2Ugb25seSkgCisgIEBwYXJhbSBhICAgRmlyc3QgdmFsdWUKKyAgQHBhcmFtIGIgICBTZWNvbmQgdmFsdWUKKyAgQHBhcmFtIGMgICBEZXN0aW5hdGlvbiBmb3IgYSAqIGIKKyAqLyAgCit2b2lkIGdjbV9nZl9tdWx0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmIsIHVuc2lnbmVkIGNoYXIgKmMpCit7CisgICB1bnNpZ25lZCBjaGFyIFpbMTZdLCBWWzE2XTsKKyAgIHVuc2lnbmVkIHgsIHksIHo7CisKKyAgIHplcm9tZW0oWiwgMTYpOworICAgWE1FTUNQWShWLCBhLCAxNik7CisgICBmb3IgKHggPSAwOyB4IDwgMTI4OyB4KyspIHsKKyAgICAgICBpZiAoYlt4Pj4zXSAmIG1hc2tbeCY3XSkgeworICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgICAgICAgIFpbeV0gXj0gVlt5XTsgCisgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICB6ICAgICA9IFZbMTVdICYgMHgwMTsKKyAgICAgICBnY21fcmlnaHRzaGlmdChWKTsKKyAgICAgICBWWzBdIF49IHBvbHlbel07CisgICB9CisgICBYTUVNQ1BZKGMsIFosIDE2KTsKK30KKworLyoqCisgIEdDTSBtdWx0aXBseSBieSBICisgIEBwYXJhbSBnY20gICBUaGUgR0NNIHN0YXRlIHdoaWNoIGhvbGRzIHRoZSBIIHZhbHVlCisgIEBwYXJhbSBJICAgICBUaGUgdmFsdWUgdG8gbXVsdGlwbHkgSCBieQorICovCit2b2lkIGdjbV9tdWx0X2goZ2NtX3N0YXRlICpnY20sIHVuc2lnbmVkIGNoYXIgKkkpCit7CisgICB1bnNpZ25lZCBjaGFyIFRbMTZdOworI2lmZGVmIEdDTV9UQUJMRVMKKyAgIGludCB4LCB5OworICAgWE1FTUNQWShULCAmZ2NtLT5QQ1swXVtJWzBdXVswXSwgMTYpOworICAgZm9yICh4ID0gMTsgeCA8IDE2OyB4KyspIHsKKyNpZmRlZiBMVENfRkFTVAorICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSArPSBzaXplb2YoTFRDX0ZBU1RfVFlQRSkpIHsKKyAgICAgICAgICAgKigoTFRDX0ZBU1RfVFlQRSAqKShUICsgeSkpIF49ICooKExUQ19GQVNUX1RZUEUgKikoJmdjbS0+UENbeF1bSVt4XV1beV0pKTsKKyAgICAgICB9CisjZWxzZQorICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgICAgIFRbeV0gXj0gZ2NtLT5QQ1t4XVtJW3hdXVt5XTsKKyAgICAgICB9CisjZW5kaWYKKyAgIH0KKyNlbHNlICAgICAKKyAgIGdjbV9nZl9tdWx0KGdjbS0+SCwgSSwgVCk7IAorI2VuZGlmCisgICBYTUVNQ1BZKEksIFQsIDE2KTsKK30KKworCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvZ2NtL2djbV9nZl9tdWx0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMTYgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMjEgMTQ6MzM6NDIgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2VuY2F1dGgvZ2NtL2djbV9pbml0LmMgYi9zcmMvZW5jYXV0aC9nY20vZ2NtX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDliNjFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2VuY2F1dGgvZ2NtL2djbV9pbml0LmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisKKy8qKgorICAgQGZpbGUgZ2NtX2luaXQuYworICAgR0NNIGltcGxlbWVudGF0aW9uLCBpbml0aWFsaXplIHN0YXRlLCBieSBUb20gU3QgRGVuaXMKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIEdDTV9NT0RFCisKKyNpZmRlZiBHQ01fVEFCTEVTCisKKy8qIHRoaXMgaXMgeCoyXjEyOCBtb2QgcCh4KSAuLi4gdGhlIHJlc3VsdHMgYXJlIDE2IGJ5dGVzIGVhY2ggc3RvcmVkIGluIGEgcGFja2VkIGZvcm1hdC4gIFNpbmNlIG9ubHkgdGhlIAorICogbG93ZXIgMTYgYml0cyBhcmUgbm90IHplcm8nZWQgSSByZW1vdmVkIHRoZSB1cHBlciAxNCBieXRlcyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZ2NtX3NoaWZ0X3RhYmxlWzI1NioyXSA9IHsKKzB4MDAsIDB4MDAsIDB4MDEsIDB4YzIsIDB4MDMsIDB4ODQsIDB4MDIsIDB4NDYsIDB4MDcsIDB4MDgsIDB4MDYsIDB4Y2EsIDB4MDQsIDB4OGMsIDB4MDUsIDB4NGUsCisweDBlLCAweDEwLCAweDBmLCAweGQyLCAweDBkLCAweDk0LCAweDBjLCAweDU2LCAweDA5LCAweDE4LCAweDA4LCAweGRhLCAweDBhLCAweDljLCAweDBiLCAweDVlLAorMHgxYywgMHgyMCwgMHgxZCwgMHhlMiwgMHgxZiwgMHhhNCwgMHgxZSwgMHg2NiwgMHgxYiwgMHgyOCwgMHgxYSwgMHhlYSwgMHgxOCwgMHhhYywgMHgxOSwgMHg2ZSwKKzB4MTIsIDB4MzAsIDB4MTMsIDB4ZjIsIDB4MTEsIDB4YjQsIDB4MTAsIDB4NzYsIDB4MTUsIDB4MzgsIDB4MTQsIDB4ZmEsIDB4MTYsIDB4YmMsIDB4MTcsIDB4N2UsCisweDM4LCAweDQwLCAweDM5LCAweDgyLCAweDNiLCAweGM0LCAweDNhLCAweDA2LCAweDNmLCAweDQ4LCAweDNlLCAweDhhLCAweDNjLCAweGNjLCAweDNkLCAweDBlLAorMHgzNiwgMHg1MCwgMHgzNywgMHg5MiwgMHgzNSwgMHhkNCwgMHgzNCwgMHgxNiwgMHgzMSwgMHg1OCwgMHgzMCwgMHg5YSwgMHgzMiwgMHhkYywgMHgzMywgMHgxZSwKKzB4MjQsIDB4NjAsIDB4MjUsIDB4YTIsIDB4MjcsIDB4ZTQsIDB4MjYsIDB4MjYsIDB4MjMsIDB4NjgsIDB4MjIsIDB4YWEsIDB4MjAsIDB4ZWMsIDB4MjEsIDB4MmUsCisweDJhLCAweDcwLCAweDJiLCAweGIyLCAweDI5LCAweGY0LCAweDI4LCAweDM2LCAweDJkLCAweDc4LCAweDJjLCAweGJhLCAweDJlLCAweGZjLCAweDJmLCAweDNlLAorMHg3MCwgMHg4MCwgMHg3MSwgMHg0MiwgMHg3MywgMHgwNCwgMHg3MiwgMHhjNiwgMHg3NywgMHg4OCwgMHg3NiwgMHg0YSwgMHg3NCwgMHgwYywgMHg3NSwgMHhjZSwKKzB4N2UsIDB4OTAsIDB4N2YsIDB4NTIsIDB4N2QsIDB4MTQsIDB4N2MsIDB4ZDYsIDB4NzksIDB4OTgsIDB4NzgsIDB4NWEsIDB4N2EsIDB4MWMsIDB4N2IsIDB4ZGUsCisweDZjLCAweGEwLCAweDZkLCAweDYyLCAweDZmLCAweDI0LCAweDZlLCAweGU2LCAweDZiLCAweGE4LCAweDZhLCAweDZhLCAweDY4LCAweDJjLCAweDY5LCAweGVlLAorMHg2MiwgMHhiMCwgMHg2MywgMHg3MiwgMHg2MSwgMHgzNCwgMHg2MCwgMHhmNiwgMHg2NSwgMHhiOCwgMHg2NCwgMHg3YSwgMHg2NiwgMHgzYywgMHg2NywgMHhmZSwKKzB4NDgsIDB4YzAsIDB4NDksIDB4MDIsIDB4NGIsIDB4NDQsIDB4NGEsIDB4ODYsIDB4NGYsIDB4YzgsIDB4NGUsIDB4MGEsIDB4NGMsIDB4NGMsIDB4NGQsIDB4OGUsCisweDQ2LCAweGQwLCAweDQ3LCAweDEyLCAweDQ1LCAweDU0LCAweDQ0LCAweDk2LCAweDQxLCAweGQ4LCAweDQwLCAweDFhLCAweDQyLCAweDVjLCAweDQzLCAweDllLAorMHg1NCwgMHhlMCwgMHg1NSwgMHgyMiwgMHg1NywgMHg2NCwgMHg1NiwgMHhhNiwgMHg1MywgMHhlOCwgMHg1MiwgMHgyYSwgMHg1MCwgMHg2YywgMHg1MSwgMHhhZSwKKzB4NWEsIDB4ZjAsIDB4NWIsIDB4MzIsIDB4NTksIDB4NzQsIDB4NTgsIDB4YjYsIDB4NWQsIDB4ZjgsIDB4NWMsIDB4M2EsIDB4NWUsIDB4N2MsIDB4NWYsIDB4YmUsCisweGUxLCAweDAwLCAweGUwLCAweGMyLCAweGUyLCAweDg0LCAweGUzLCAweDQ2LCAweGU2LCAweDA4LCAweGU3LCAweGNhLCAweGU1LCAweDhjLCAweGU0LCAweDRlLAorMHhlZiwgMHgxMCwgMHhlZSwgMHhkMiwgMHhlYywgMHg5NCwgMHhlZCwgMHg1NiwgMHhlOCwgMHgxOCwgMHhlOSwgMHhkYSwgMHhlYiwgMHg5YywgMHhlYSwgMHg1ZSwKKzB4ZmQsIDB4MjAsIDB4ZmMsIDB4ZTIsIDB4ZmUsIDB4YTQsIDB4ZmYsIDB4NjYsIDB4ZmEsIDB4MjgsIDB4ZmIsIDB4ZWEsIDB4ZjksIDB4YWMsIDB4ZjgsIDB4NmUsCisweGYzLCAweDMwLCAweGYyLCAweGYyLCAweGYwLCAweGI0LCAweGYxLCAweDc2LCAweGY0LCAweDM4LCAweGY1LCAweGZhLCAweGY3LCAweGJjLCAweGY2LCAweDdlLAorMHhkOSwgMHg0MCwgMHhkOCwgMHg4MiwgMHhkYSwgMHhjNCwgMHhkYiwgMHgwNiwgMHhkZSwgMHg0OCwgMHhkZiwgMHg4YSwgMHhkZCwgMHhjYywgMHhkYywgMHgwZSwKKzB4ZDcsIDB4NTAsIDB4ZDYsIDB4OTIsIDB4ZDQsIDB4ZDQsIDB4ZDUsIDB4MTYsIDB4ZDAsIDB4NTgsIDB4ZDEsIDB4OWEsIDB4ZDMsIDB4ZGMsIDB4ZDIsIDB4MWUsCisweGM1LCAweDYwLCAweGM0LCAweGEyLCAweGM2LCAweGU0LCAweGM3LCAweDI2LCAweGMyLCAweDY4LCAweGMzLCAweGFhLCAweGMxLCAweGVjLCAweGMwLCAweDJlLAorMHhjYiwgMHg3MCwgMHhjYSwgMHhiMiwgMHhjOCwgMHhmNCwgMHhjOSwgMHgzNiwgMHhjYywgMHg3OCwgMHhjZCwgMHhiYSwgMHhjZiwgMHhmYywgMHhjZSwgMHgzZSwKKzB4OTEsIDB4ODAsIDB4OTAsIDB4NDIsIDB4OTIsIDB4MDQsIDB4OTMsIDB4YzYsIDB4OTYsIDB4ODgsIDB4OTcsIDB4NGEsIDB4OTUsIDB4MGMsIDB4OTQsIDB4Y2UsCisweDlmLCAweDkwLCAweDllLCAweDUyLCAweDljLCAweDE0LCAweDlkLCAweGQ2LCAweDk4LCAweDk4LCAweDk5LCAweDVhLCAweDliLCAweDFjLCAweDlhLCAweGRlLAorMHg4ZCwgMHhhMCwgMHg4YywgMHg2MiwgMHg4ZSwgMHgyNCwgMHg4ZiwgMHhlNiwgMHg4YSwgMHhhOCwgMHg4YiwgMHg2YSwgMHg4OSwgMHgyYywgMHg4OCwgMHhlZSwKKzB4ODMsIDB4YjAsIDB4ODIsIDB4NzIsIDB4ODAsIDB4MzQsIDB4ODEsIDB4ZjYsIDB4ODQsIDB4YjgsIDB4ODUsIDB4N2EsIDB4ODcsIDB4M2MsIDB4ODYsIDB4ZmUsCisweGE5LCAweGMwLCAweGE4LCAweDAyLCAweGFhLCAweDQ0LCAweGFiLCAweDg2LCAweGFlLCAweGM4LCAweGFmLCAweDBhLCAweGFkLCAweDRjLCAweGFjLCAweDhlLAorMHhhNywgMHhkMCwgMHhhNiwgMHgxMiwgMHhhNCwgMHg1NCwgMHhhNSwgMHg5NiwgMHhhMCwgMHhkOCwgMHhhMSwgMHgxYSwgMHhhMywgMHg1YywgMHhhMiwgMHg5ZSwKKzB4YjUsIDB4ZTAsIDB4YjQsIDB4MjIsIDB4YjYsIDB4NjQsIDB4YjcsIDB4YTYsIDB4YjIsIDB4ZTgsIDB4YjMsIDB4MmEsIDB4YjEsIDB4NmMsIDB4YjAsIDB4YWUsCisweGJiLCAweGYwLCAweGJhLCAweDMyLCAweGI4LCAweDc0LCAweGI5LCAweGI2LCAweGJjLCAweGY4LCAweGJkLCAweDNhLCAweGJmLCAweDdjLCAweGJlLCAweGJlIH07CisKKyNlbmRpZgorCisvKioKKyAgSW5pdGlhbGl6ZSBhIEdDTSBzdGF0ZQorICBAcGFyYW0gZ2NtICAgICBUaGUgR0NNIHN0YXRlIHRvIGluaXRpYWxpemUKKyAgQHBhcmFtIGNpcGhlciAgVGhlIGluZGV4IG9mIHRoZSBjaXBoZXIgdG8gdXNlCisgIEBwYXJhbSBrZXkgICAgIFRoZSBzZWNyZXQga2V5CisgIEBwYXJhbSBrZXlsZW4gIFRoZSBsZW5ndGggb2YgdGhlIHNlY3JldCBrZXkKKyAgQHJldHVybiBDUllQVF9PSyBvbiBzdWNjZXNzCisgKi8KK2ludCBnY21faW5pdChnY21fc3RhdGUgKmdjbSwgaW50IGNpcGhlciwgCisgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgaW50IGtleWxlbikKK3sKKyAgIGludCAgICAgICAgICAgZXJyOworICAgdW5zaWduZWQgY2hhciBCWzE2XTsKKyNpZmRlZiBHQ01fVEFCTEVTCisgICBpbnQgICAgICAgICAgIHgsIHksIHosIHQ7CisjZW5kaWYKKworICAgTFRDX0FSR0NISyhnY20gIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKworI2lmZGVmIExUQ19GQVNUCisgICBpZiAoMTYgJSBzaXplb2YoTFRDX0ZBU1RfVFlQRSkpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKyNlbmRpZgorCisgICAvKiBpcyBjaXBoZXIgdmFsaWQ/ICovCisgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChjaXBoZXIpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIGlmIChjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmJsb2NrX2xlbmd0aCAhPSAxNikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQ0lQSEVSOworICAgfQorCisgICAvKiBzY2hlZHVsZSBrZXkgKi8KKyAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5zZXR1cChrZXksIGtleWxlbiwgMCwgJmdjbS0+SykpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICAvKiBIID0gRSgwKSAqLworICAgemVyb21lbShCLCAxNik7CisgICBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmVjYl9lbmNyeXB0KEIsIGdjbS0+SCwgJmdjbS0+Syk7CisKKyAgIC8qIHNldHVwIHN0YXRlICovCisgICB6ZXJvbWVtKGdjbS0+YnVmLCBzaXplb2YoZ2NtLT5idWYpKTsKKyAgIHplcm9tZW0oZ2NtLT5YLCAgIHNpemVvZihnY20tPlgpKTsKKyAgIGdjbS0+Y2lwaGVyICAgPSBjaXBoZXI7CisgICBnY20tPm1vZGUgICAgID0gR0NNX01PREVfSVY7CisgICBnY20tPml2bW9kZSAgID0gMDsKKyAgIGdjbS0+YnVmbGVuICAgPSAwOworICAgZ2NtLT50b3RsZW4gICA9IDA7CisgICBnY20tPnB0dG90bGVuID0gMDsKKworI2lmZGVmIEdDTV9UQUJMRVMKKyAgIC8qIHNldHVwIHRhYmxlcyAqLworCisgICAvKiBnZW5lcmF0ZSB0aGUgZmlyc3QgdGFibGUgYXMgaXQgaGFzIG5vIHNoaWZ0aW5nIChmcm9tIHdoaWNoIHdlIG1ha2UgdGhlIG90aGVyIHRhYmxlcykgKi8KKyAgIHplcm9tZW0oQiwgMTYpOworICAgZm9yICh5ID0gMDsgeSA8IDI1NjsgeSsrKSB7CisgICAgICAgIEJbMF0gPSB5OworICAgICAgICBnY21fZ2ZfbXVsdChnY20tPkgsIEIsICZnY20tPlBDWzBdW3ldWzBdKTsKKyAgIH0KKworICAgLyogbm93IGdlbmVyYXRlIHRoZSByZXN0IG9mIHRoZSB0YWJsZXMgYmFzZWQgdGhlIHByZXZpb3VzIHRhYmxlICovCisgICBmb3IgKHggPSAxOyB4IDwgMTY7IHgrKykgeworICAgICAgZm9yICh5ID0gMDsgeSA8IDI1NjsgeSsrKSB7CisgICAgICAgICAvKiBub3cgc2hpZnQgaXQgcmlnaHQgYnkgOCBiaXRzICovCisgICAgICAgICB0ID0gZ2NtLT5QQ1t4LTFdW3ldWzE1XTsKKyAgICAgICAgIGZvciAoeiA9IDE1OyB6ID4gMDsgei0tKSB7CisgICAgICAgICAgICAgZ2NtLT5QQ1t4XVt5XVt6XSA9IGdjbS0+UENbeC0xXVt5XVt6LTFdOworICAgICAgICAgfQorICAgICAgICAgZ2NtLT5QQ1t4XVt5XVswXSA9IGdjbV9zaGlmdF90YWJsZVt0PDwxXTsKKyAgICAgICAgIGdjbS0+UENbeF1beV1bMV0gXj0gZ2NtX3NoaWZ0X3RhYmxlWyh0PDwxKSsxXTsKKyAgICAgfQorICB9CisKKyNlbmRpZgorCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvZW5jYXV0aC9nY20vZ2NtX2luaXQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xNSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8yMSAxNTowNToxOSAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9nY20vZ2NtX21lbW9yeS5jIGIvc3JjL2VuY2F1dGgvZ2NtL2djbV9tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTEwZDNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2VuY2F1dGgvZ2NtL2djbV9tZW1vcnkuYwpAQCAtMCwwICsxLDkzIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworCisvKioKKyAgIEBmaWxlIGdjbV9tZW1vcnkuYworICAgR0NNIGltcGxlbWVudGF0aW9uLCBwcm9jZXNzIGEgcGFja2V0LCBieSBUb20gU3QgRGVuaXMKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIEdDTV9NT0RFCisKKy8qKgorICBQcm9jZXNzIGFuIGVudGlyZSBHQ00gcGFja2V0IGluIG9uZSBjYWxsLgorICBAcGFyYW0gY2lwaGVyICAgICAgICAgICAgSW5kZXggb2YgY2lwaGVyIHRvIHVzZQorICBAcGFyYW0ga2V5ICAgICAgICAgICAgICAgVGhlIHNlY3JldCBrZXkKKyAgQHBhcmFtIGtleWxlbiAgICAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHNlY3JldCBrZXkKKyAgQHBhcmFtIElWICAgICAgICAgICAgICAgIFRoZSBpbml0aWFsIHZlY3RvciAKKyAgQHBhcmFtIElWbGVuICAgICAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgdmVjdG9yCisgIEBwYXJhbSBhZGF0YSAgICAgICAgICAgICBUaGUgYWRkaXRpb25hbCBhdXRoZW50aWNhdGlvbiBkYXRhIChoZWFkZXIpCisgIEBwYXJhbSBhZGF0YWxlbiAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBhZGF0YQorICBAcGFyYW0gcHQgICAgICAgICAgICAgICAgVGhlIHBsYWludGV4dAorICBAcGFyYW0gcHRsZW4gICAgICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IChjaXBoZXJ0ZXh0IGxlbmd0aCBpcyB0aGUgc2FtZSkKKyAgQHBhcmFtIGN0ICAgICAgICAgICAgICAgIFRoZSBjaXBoZXJ0ZXh0CisgIEBwYXJhbSB0YWcgICAgICAgICAgICAgICBbb3V0XSBUaGUgTUFDIHRhZworICBAcGFyYW0gdGFnbGVuICAgICAgICAgICAgW2luL291dF0gVGhlIE1BQyB0YWcgbGVuZ3RoCisgIEBwYXJhbSBkaXJlY3Rpb24gICAgICAgICBFbmNyeXB0IG9yIERlY3J5cHQgbW9kZSAoR0NNX0VOQ1JZUFQgb3IgR0NNX0RFQ1JZUFQpCisgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjY2VzcworICovCitpbnQgZ2NtX21lbW9yeSggICAgICBpbnQgICAgICAgICAgIGNpcGhlciwKKyAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgICAgIHVuc2lnbmVkIGxvbmcgSVZsZW4sCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGF0YSwgIHVuc2lnbmVkIGxvbmcgYWRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwgICAgIHVuc2lnbmVkIGxvbmcgcHRsZW4sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwgCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWcsICAgIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQoreworICAgIGdjbV9zdGF0ZSAqZ2NtOworICAgIGludCAgICAgICAgZXJyOworCisgICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAKKyAgICBpZiAoY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5hY2NlbF9nY21fbWVtb3J5ICE9IE5VTEwpIHsKKyAgICAgICBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmFjY2VsX2djbV9tZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXksICAga2V5bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWLCAgICBJVmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGF0YSwgYWRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQsICAgIHB0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgICB0YWdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uKTsKKyAgICAgICByZXR1cm4gQ1JZUFRfT0s7CisgICAgfQorCisKKyAgICBnY20gPSBYTUFMTE9DKHNpemVvZigqZ2NtKSk7CisgICAgaWYgKGdjbSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBDUllQVF9NRU07CisgICAgfQorCisgICAgaWYgKChlcnIgPSBnY21faW5pdChnY20sIGNpcGhlciwga2V5LCBrZXlsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgIGdvdG8gTFRDX0VSUjsKKyAgICB9CisgICAgaWYgKChlcnIgPSBnY21fYWRkX2l2KGdjbSwgSVYsIElWbGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICBnb3RvIExUQ19FUlI7CisgICAgfQorICAgIGlmICgoZXJyID0gZ2NtX2FkZF9hYWQoZ2NtLCBhZGF0YSwgYWRhdGFsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgIGdvdG8gTFRDX0VSUjsKKyAgICB9CisgICAgaWYgKChlcnIgPSBnY21fcHJvY2VzcyhnY20sIHB0LCBwdGxlbiwgY3QsIGRpcmVjdGlvbikpICE9IENSWVBUX09LKSB7CisgICAgICAgZ290byBMVENfRVJSOworICAgIH0KKyAgICBlcnIgPSBnY21fZG9uZShnY20sIHRhZywgdGFnbGVuKTsKK0xUQ19FUlI6CisgICAgWEZSRUUoZ2NtKTsKKyAgICByZXR1cm4gZXJyOworfQorI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvZ2NtL2djbV9tZW1vcnkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xOSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9nY20vZ2NtX3Byb2Nlc3MuYyBiL3NyYy9lbmNhdXRoL2djbS9nY21fcHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTJlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZW5jYXV0aC9nY20vZ2NtX3Byb2Nlc3MuYwpAQCAtMCwwICsxLDE0NyBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKworLyoqCisgICBAZmlsZSBnY21fcHJvY2Vzcy5jCisgICBHQ00gaW1wbGVtZW50YXRpb24sIHByb2Nlc3MgbWVzc2FnZSBkYXRhLCBieSBUb20gU3QgRGVuaXMKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIEdDTV9NT0RFCisKKy8qKiAKKyAgUHJvY2VzcyBwbGFpbnRleHQvY2lwaGVydGV4dCB0aHJvdWdoIEdDTQorICBAcGFyYW0gZ2NtICAgICAgIFRoZSBHQ00gc3RhdGUgCisgIEBwYXJhbSBwdCAgICAgICAgVGhlIHBsYWludGV4dAorICBAcGFyYW0gcHRsZW4gICAgIFRoZSBwbGFpbnRleHQgbGVuZ3RoIChjaXBoZXJ0ZXh0IGxlbmd0aCBpcyB0aGUgc2FtZSkKKyAgQHBhcmFtIGN0ICAgICAgICBUaGUgY2lwaGVydGV4dAorICBAcGFyYW0gZGlyZWN0aW9uIEVuY3J5cHQgb3IgRGVjcnlwdCBtb2RlIChHQ01fRU5DUllQVCBvciBHQ01fREVDUllQVCkKKyAgQHJldHVybiBDUllQVF9PSyBvbiBzdWNjZXNzCisgKi8KK2ludCBnY21fcHJvY2VzcyhnY21fc3RhdGUgKmdjbSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0LCAgICAgdW5zaWduZWQgbG9uZyBwdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgeCwgeTsKKyAgIHVuc2lnbmVkIGNoYXIgYjsKKyAgIGludCAgICAgICAgICAgZXJyOworCisgICBMVENfQVJHQ0hLKGdjbSAhPSBOVUxMKTsKKyAgIGlmIChwdGxlbiA+IDApIHsKKyAgICAgIExUQ19BUkdDSEsocHQgICE9IE5VTEwpOworICAgICAgTFRDX0FSR0NISyhjdCAgIT0gTlVMTCk7CisgICB9CisKKyAgIGlmIChnY20tPmJ1ZmxlbiA+IDE2IHx8IGdjbS0+YnVmbGVuIDwgMCkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorIAorICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoZ2NtLT5jaXBoZXIpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogaW4gQUFEIG1vZGU/ICovCisgICBpZiAoZ2NtLT5tb2RlID09IEdDTV9NT0RFX0FBRCkgeworICAgICAgLyogbGV0J3MgcHJvY2VzcyB0aGUgQUFEICovCisgICAgICBpZiAoZ2NtLT5idWZsZW4pIHsKKyAgICAgICAgIGdjbS0+dG90bGVuICs9IGdjbS0+YnVmbGVuICogQ09OU1Q2NCg4KTsKKyAgICAgICAgIGdjbV9tdWx0X2goZ2NtLCBnY20tPlgpOworICAgICAgfQorCisgICAgICAvKiBpbmNyZW1lbnQgY291bnRlciAqLworICAgICAgZm9yICh5ID0gMTU7IHkgPj0gMTI7IHktLSkgeworICAgICAgICAgIGlmICgrK2djbS0+WVt5XSkgeyBicmVhazsgfQorICAgICAgfQorICAgICAgLyogZW5jcnlwdCB0aGUgY291bnRlciAqLworICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbZ2NtLT5jaXBoZXJdLmVjYl9lbmNyeXB0KGdjbS0+WSwgZ2NtLT5idWYsICZnY20tPkspOyAgICAgCisKKyAgICAgIGdjbS0+YnVmbGVuID0gMDsKKyAgICAgIGdjbS0+bW9kZSAgID0gR0NNX01PREVfVEVYVDsKKyAgIH0KKworICAgaWYgKGdjbS0+bW9kZSAhPSBHQ01fTU9ERV9URVhUKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisKKyAgIHggPSAwOworI2lmZGVmIExUQ19GQVNUCisgICBpZiAoZ2NtLT5idWZsZW4gPT0gMCkgeworICAgICAgaWYgKGRpcmVjdGlvbiA9PSBHQ01fRU5DUllQVCkgeyAKKyAgICAgICAgIGZvciAoeCA9IDA7IHggPCAocHRsZW4gJiB+MTUpOyB4ICs9IDE2KSB7CisgICAgICAgICAgICAgLyogY3RyIGVuY3J5cHQgKi8KKyAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkgKz0gc2l6ZW9mKExUQ19GQVNUX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgICooKExUQ19GQVNUX1RZUEUqKSgmY3RbeCArIHldKSkgPSAqKChMVENfRkFTVF9UWVBFKikoJnB0W3greV0pKSBeICooKExUQ19GQVNUX1RZUEUqKSgmZ2NtLT5idWZbeV0pKTsKKyAgICAgICAgICAgICAgICAgKigoTFRDX0ZBU1RfVFlQRSopKCZnY20tPlhbeV0pKSBePSAqKChMVENfRkFTVF9UWVBFKikoJmN0W3greV0pKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgLyogR01BQyBpdCAqLworICAgICAgICAgICAgIGdjbS0+cHR0b3RsZW4gKz0gMTI4OworICAgICAgICAgICAgIGdjbV9tdWx0X2goZ2NtLCBnY20tPlgpOworICAgICAgICAgICAgIC8qIGluY3JlbWVudCBjb3VudGVyICovCisgICAgICAgICAgICAgZm9yICh5ID0gMTU7IHkgPj0gMTI7IHktLSkgeworICAgICAgICAgICAgICAgICBpZiAoKytnY20tPllbeV0pIHsgYnJlYWs7IH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbZ2NtLT5jaXBoZXJdLmVjYl9lbmNyeXB0KGdjbS0+WSwgZ2NtLT5idWYsICZnY20tPkspOworICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGZvciAoeCA9IDA7IHggPCAocHRsZW4gJiB+MTUpOyB4ICs9IDE2KSB7CisgICAgICAgICAgICAgLyogY3RyIGVuY3J5cHQgKi8KKyAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkgKz0gc2l6ZW9mKExUQ19GQVNUX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgICooKExUQ19GQVNUX1RZUEUqKSgmZ2NtLT5YW3ldKSkgXj0gKigoTFRDX0ZBU1RfVFlQRSopKCZjdFt4K3ldKSk7CisgICAgICAgICAgICAgICAgICooKExUQ19GQVNUX1RZUEUqKSgmcHRbeCArIHldKSkgPSAqKChMVENfRkFTVF9UWVBFKikoJmN0W3greV0pKSBeICooKExUQ19GQVNUX1RZUEUqKSgmZ2NtLT5idWZbeV0pKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgLyogR01BQyBpdCAqLworICAgICAgICAgICAgIGdjbS0+cHR0b3RsZW4gKz0gMTI4OworICAgICAgICAgICAgIGdjbV9tdWx0X2goZ2NtLCBnY20tPlgpOworICAgICAgICAgICAgIC8qIGluY3JlbWVudCBjb3VudGVyICovCisgICAgICAgICAgICAgZm9yICh5ID0gMTU7IHkgPj0gMTI7IHktLSkgeworICAgICAgICAgICAgICAgICBpZiAoKytnY20tPllbeV0pIHsgYnJlYWs7IH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbZ2NtLT5jaXBoZXJdLmVjYl9lbmNyeXB0KGdjbS0+WSwgZ2NtLT5idWYsICZnY20tPkspOworICAgICAgICAgfQorICAgICB9CisgICB9CisjZW5kaWYgICAgICAgIAorCisgICAvKiBwcm9jZXNzIHRleHQgKi8KKyAgIGZvciAoOyB4IDwgcHRsZW47IHgrKykgeworICAgICAgIGlmIChnY20tPmJ1ZmxlbiA9PSAxNikgeworICAgICAgICAgIGdjbS0+cHR0b3RsZW4gKz0gMTI4OworICAgICAgICAgIGdjbV9tdWx0X2goZ2NtLCBnY20tPlgpOworICAgICAgICAgIAorICAgICAgICAgIC8qIGluY3JlbWVudCBjb3VudGVyICovCisgICAgICAgICAgZm9yICh5ID0gMTU7IHkgPj0gMTI7IHktLSkgeworICAgICAgICAgICAgICBpZiAoKytnY20tPllbeV0pIHsgYnJlYWs7IH0KKyAgICAgICAgICB9CisgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbZ2NtLT5jaXBoZXJdLmVjYl9lbmNyeXB0KGdjbS0+WSwgZ2NtLT5idWYsICZnY20tPkspOworICAgICAgICAgIGdjbS0+YnVmbGVuID0gMDsKKyAgICAgICB9CisKKyAgICAgICBpZiAoZGlyZWN0aW9uID09IEdDTV9FTkNSWVBUKSB7CisgICAgICAgICAgYiA9IGN0W3hdID0gcHRbeF0gXiBnY20tPmJ1ZltnY20tPmJ1Zmxlbl07IAorICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYiA9IGN0W3hdOworICAgICAgICAgIHB0W3hdID0gY3RbeF0gXiBnY20tPmJ1ZltnY20tPmJ1Zmxlbl07CisgICAgICAgfQorICAgICAgIGdjbS0+WFtnY20tPmJ1ZmxlbisrXSBePSBiOyAgICAgICAgICAKKyAgIH0KKworICAgcmV0dXJuIENSWVBUX09LOworfQorCisKKworI2VuZGlmCisgICAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvZ2NtL2djbV9wcm9jZXNzLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuOCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9nY20vZ2NtX3Jlc2V0LmMgYi9zcmMvZW5jYXV0aC9nY20vZ2NtX3Jlc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzNmE5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbmNhdXRoL2djbS9nY21fcmVzZXQuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworCisvKioKKyAgIEBmaWxlIGdjbV9yZXNldC5jCisgICBHQ00gaW1wbGVtZW50YXRpb24sIHJlc2V0IGEgdXNlZCBzdGF0ZSBzbyBpdCBjYW4gYWNjZXB0IElWIGRhdGEsIGJ5IFRvbSBTdCBEZW5pcworKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisjaWZkZWYgR0NNX01PREUKKworLyoqCisgIFJlc2V0IGEgR0NNIHN0YXRlIHRvIGFzIGlmIHlvdSBqdXN0IGNhbGxlZCBnY21faW5pdCgpLiAgVGhpcyBzYXZlcyB0aGUgaW5pdGlhbGl6YXRpb24gdGltZS4KKyAgQHBhcmFtIGdjbSAgIFRoZSBHQ00gc3RhdGUgdG8gcmVzZXQKKyAgQHJldHVybiBDUllQVF9PSyBvbiBzdWNjZXNzCisqLworaW50IGdjbV9yZXNldChnY21fc3RhdGUgKmdjbSkKK3sKKyAgIExUQ19BUkdDSEsoZ2NtICE9IE5VTEwpOworCisgICB6ZXJvbWVtKGdjbS0+YnVmLCBzaXplb2YoZ2NtLT5idWYpKTsKKyAgIHplcm9tZW0oZ2NtLT5YLCAgIHNpemVvZihnY20tPlgpKTsKKyAgIGdjbS0+bW9kZSAgICAgPSBHQ01fTU9ERV9JVjsKKyAgIGdjbS0+aXZtb2RlICAgPSAwOworICAgZ2NtLT5idWZsZW4gICA9IDA7CisgICBnY20tPnRvdGxlbiAgID0gMDsKKyAgIGdjbS0+cHR0b3RsZW4gPSAwOworICAKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL2djbS9nY21fcmVzZXQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9lbmNhdXRoL2djbS9nY21fdGVzdC5jIGIvc3JjL2VuY2F1dGgvZ2NtL2djbV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNjE4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbmNhdXRoL2djbS9nY21fdGVzdC5jCkBAIC0wLDAgKzEsMzY4IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworCisvKioKKyAgIEBmaWxlIGdjbV90ZXN0LmMKKyAgIEdDTSBpbXBsZW1lbnRhdGlvbiwgdGVzdGluZywgYnkgVG9tIFN0IERlbmlzCisqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKyNpZmRlZiBHQ01fTU9ERQorCisvKiogCisgIFRlc3QgdGhlIEdDTSBjb2RlCisgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjY2VzcworICovCitpbnQgZ2NtX3Rlc3Qodm9pZCkKK3sKKyNpZm5kZWYgTFRDX1RFU1QKKyAgIHJldHVybiBDUllQVF9OT1A7CisjZWxzZQorICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgdW5zaWduZWQgY2hhciBLWzMyXTsKKyAgICAgICBpbnQgICAgICAgICAgIGtleWxlbjsKKyAgICAgICB1bnNpZ25lZCBjaGFyIFBbNjRdOworICAgICAgIHVuc2lnbmVkIGxvbmcgcHRsZW47CisJCSB1bnNpZ25lZCBjaGFyIEFbNjRdOworICAgICAgIHVuc2lnbmVkIGxvbmcgYWxlbjsKKyAgICAgICB1bnNpZ25lZCBjaGFyIElWWzY0XTsKKyAgICAgICB1bnNpZ25lZCBsb25nIElWbGVuOworICAgICAgIHVuc2lnbmVkIGNoYXIgQ1s2NF07CisgICAgICAgdW5zaWduZWQgY2hhciBUWzE2XTsKKyAgIH0gdGVzdHNbXSA9IHsKKworLyogdGVzdCBjYXNlICMxICovCit7CisgIC8qIGtleSAqLworICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAxNiwKKworICAvKiBwbGFpbnRleHQgKi8KKyAgeyAwIH0sCisgIDAsCisKKyAgLyogQUFEIGRhdGEgKi8KKyAgeyAwIH0sCisgIDAsCisKKyAgLyogSVYgKi8KKyAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgMTIsCisKKyAgLyogY2lwaGVydGV4dCAgKi8KKyAgeyAwIH0sCisKKyAgLyogdGFnICovCisgIHsgMHg1OCwgMHhlMiwgMHhmYywgMHhjZSwgMHhmYSwgMHg3ZSwgMHgzMCwgMHg2MSwKKyAgICAweDM2LCAweDdmLCAweDFkLCAweDU3LCAweGE0LCAweGU3LCAweDQ1LCAweDVhIH0KK30sCisKKy8qIHRlc3QgY2FzZSAjMiAqLworeworICAvKiBrZXkgKi8KKyAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgMTYsCisKKyAgLyogUFQgKi8KKyAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgMTYsCisKKyAgLyogQURBVEEgKi8KKyAgeyAwIH0sCisgIDAsCisKKyAgLyogSVYgKi8KKyAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgMTIsCisKKyAgLyogQ1QgKi8KKyAgeyAweDAzLCAweDg4LCAweGRhLCAweGNlLCAweDYwLCAweGI2LCAweGEzLCAweDkyLAorICAgIDB4ZjMsIDB4MjgsIDB4YzIsIDB4YjksIDB4NzEsIDB4YjIsIDB4ZmUsIDB4NzggfSwKKworICAvKiBUQUcgKi8KKyAgeyAweGFiLCAweDZlLCAweDQ3LCAweGQ0LCAweDJjLCAweGVjLCAweDEzLCAweGJkLAorICAgIDB4ZjUsIDB4M2EsIDB4NjcsIDB4YjIsIDB4MTIsIDB4NTcsIDB4YmQsIDB4ZGYgfQorfSwKKworLyogdGVzdCBjYXNlICMzICovCit7CisgICAvKiBrZXkgKi8KKyAgIHsgMHhmZSwgMHhmZiwgMHhlOSwgMHg5MiwgMHg4NiwgMHg2NSwgMHg3MywgMHgxYywgCisgICAgIDB4NmQsIDB4NmEsIDB4OGYsIDB4OTQsIDB4NjcsIDB4MzAsIDB4ODMsIDB4MDgsIH0sCisgICAxNiwKKworICAgLyogUFQgKi8KKyAgIHsgMHhkOSwgMHgzMSwgMHgzMiwgMHgyNSwgMHhmOCwgMHg4NCwgMHgwNiwgMHhlNSwgCisgICAgIDB4YTUsIDB4NTksIDB4MDksIDB4YzUsIDB4YWYsIDB4ZjUsIDB4MjYsIDB4OWEsIAorICAgICAweDg2LCAweGE3LCAweGE5LCAweDUzLCAweDE1LCAweDM0LCAweGY3LCAweGRhLCAKKyAgICAgMHgyZSwgMHg0YywgMHgzMCwgMHgzZCwgMHg4YSwgMHgzMSwgMHg4YSwgMHg3MiwgCisgICAgIDB4MWMsIDB4M2MsIDB4MGMsIDB4OTUsIDB4OTUsIDB4NjgsIDB4MDksIDB4NTMsIAorICAgICAweDJmLCAweGNmLCAweDBlLCAweDI0LCAweDQ5LCAweGE2LCAweGI1LCAweDI1LCAKKyAgICAgMHhiMSwgMHg2YSwgMHhlZCwgMHhmNSwgMHhhYSwgMHgwZCwgMHhlNiwgMHg1NywgCisgICAgIDB4YmEsIDB4NjMsIDB4N2IsIDB4MzksIDB4MWEsIDB4YWYsIDB4ZDIsIDB4NTUsIH0sCisgIDY0LAorCisgIC8qIEFEQVRBICovCisgIHsgMCB9LAorICAwLAorCisgIC8qIElWICovCisgIHsgMHhjYSwgMHhmZSwgMHhiYSwgMHhiZSwgMHhmYSwgMHhjZSwgMHhkYiwgMHhhZCwgCisgICAgMHhkZSwgMHhjYSwgMHhmOCwgMHg4OCwgIH0sCisgIDEyLAorIAorICAvKiBDVCAqLworICB7IDB4NDIsIDB4ODMsIDB4MWUsIDB4YzIsIDB4MjEsIDB4NzcsIDB4NzQsIDB4MjQsIAorICAgIDB4NGIsIDB4NzIsIDB4MjEsIDB4YjcsIDB4ODQsIDB4ZDAsIDB4ZDQsIDB4OWMsIAorICAgIDB4ZTMsIDB4YWEsIDB4MjEsIDB4MmYsIDB4MmMsIDB4MDIsIDB4YTQsIDB4ZTAsIAorICAgIDB4MzUsIDB4YzEsIDB4N2UsIDB4MjMsIDB4MjksIDB4YWMsIDB4YTEsIDB4MmUsIAorICAgIDB4MjEsIDB4ZDUsIDB4MTQsIDB4YjIsIDB4NTQsIDB4NjYsIDB4OTMsIDB4MWMsIAorICAgIDB4N2QsIDB4OGYsIDB4NmEsIDB4NWEsIDB4YWMsIDB4ODQsIDB4YWEsIDB4MDUsIAorICAgIDB4MWIsIDB4YTMsIDB4MGIsIDB4MzksIDB4NmEsIDB4MGEsIDB4YWMsIDB4OTcsIAorICAgIDB4M2QsIDB4NTgsIDB4ZTAsIDB4OTEsIDB4NDcsIDB4M2YsIDB4NTksIDB4ODUsIH0sCisKKyAgLyogVEFHICovCisgIHsgMHg0ZCwgMHg1YywgMHgyYSwgMHhmMywgMHgyNywgMHhjZCwgMHg2NCwgMHhhNiwgCisgICAgMHgyYywgMHhmMywgMHg1YSwgMHhiZCwgMHgyYiwgMHhhNiwgMHhmYSwgMHhiNCwgfQorfSwKKworLyogdGVzdCBjYXNlICM0ICovCit7CisgICAvKiBrZXkgKi8KKyAgIHsgMHhmZSwgMHhmZiwgMHhlOSwgMHg5MiwgMHg4NiwgMHg2NSwgMHg3MywgMHgxYywgCisgICAgIDB4NmQsIDB4NmEsIDB4OGYsIDB4OTQsIDB4NjcsIDB4MzAsIDB4ODMsIDB4MDgsIH0sCisgICAxNiwKKworICAgLyogUFQgKi8KKyAgIHsgMHhkOSwgMHgzMSwgMHgzMiwgMHgyNSwgMHhmOCwgMHg4NCwgMHgwNiwgMHhlNSwgCisgICAgIDB4YTUsIDB4NTksIDB4MDksIDB4YzUsIDB4YWYsIDB4ZjUsIDB4MjYsIDB4OWEsIAorICAgICAweDg2LCAweGE3LCAweGE5LCAweDUzLCAweDE1LCAweDM0LCAweGY3LCAweGRhLCAKKyAgICAgMHgyZSwgMHg0YywgMHgzMCwgMHgzZCwgMHg4YSwgMHgzMSwgMHg4YSwgMHg3MiwgCisgICAgIDB4MWMsIDB4M2MsIDB4MGMsIDB4OTUsIDB4OTUsIDB4NjgsIDB4MDksIDB4NTMsIAorICAgICAweDJmLCAweGNmLCAweDBlLCAweDI0LCAweDQ5LCAweGE2LCAweGI1LCAweDI1LCAKKyAgICAgMHhiMSwgMHg2YSwgMHhlZCwgMHhmNSwgMHhhYSwgMHgwZCwgMHhlNiwgMHg1NywgCisgICAgIDB4YmEsIDB4NjMsIDB4N2IsIDB4MzksICB9LAorICAgNjAsCisKKyAgIC8qIEFEQVRBICovCisgICB7IDB4ZmUsIDB4ZWQsIDB4ZmEsIDB4Y2UsIDB4ZGUsIDB4YWQsIDB4YmUsIDB4ZWYsIAorICAgICAweGZlLCAweGVkLCAweGZhLCAweGNlLCAweGRlLCAweGFkLCAweGJlLCAweGVmLCAKKyAgICAgMHhhYiwgMHhhZCwgMHhkYSwgMHhkMiwgIH0sCisgICAyMCwKKworICAgLyogSVYgKi8KKyAgIHsgMHhjYSwgMHhmZSwgMHhiYSwgMHhiZSwgMHhmYSwgMHhjZSwgMHhkYiwgMHhhZCwgCisgICAgIDB4ZGUsIDB4Y2EsIDB4ZjgsIDB4ODgsICB9LAorICAgMTIsCisKKyAgIC8qIENUICovCisgICB7IDB4NDIsIDB4ODMsIDB4MWUsIDB4YzIsIDB4MjEsIDB4NzcsIDB4NzQsIDB4MjQsIAorICAgICAweDRiLCAweDcyLCAweDIxLCAweGI3LCAweDg0LCAweGQwLCAweGQ0LCAweDljLCAKKyAgICAgMHhlMywgMHhhYSwgMHgyMSwgMHgyZiwgMHgyYywgMHgwMiwgMHhhNCwgMHhlMCwgCisgICAgIDB4MzUsIDB4YzEsIDB4N2UsIDB4MjMsIDB4MjksIDB4YWMsIDB4YTEsIDB4MmUsIAorICAgICAweDIxLCAweGQ1LCAweDE0LCAweGIyLCAweDU0LCAweDY2LCAweDkzLCAweDFjLCAKKyAgICAgMHg3ZCwgMHg4ZiwgMHg2YSwgMHg1YSwgMHhhYywgMHg4NCwgMHhhYSwgMHgwNSwgCisgICAgIDB4MWIsIDB4YTMsIDB4MGIsIDB4MzksIDB4NmEsIDB4MGEsIDB4YWMsIDB4OTcsIAorICAgICAweDNkLCAweDU4LCAweGUwLCAweDkxLCAgfSwKKworICAgLyogVEFHICovCisgICB7IDB4NWIsIDB4YzksIDB4NGYsIDB4YmMsIDB4MzIsIDB4MjEsIDB4YTUsIDB4ZGIsIAorICAgICAweDk0LCAweGZhLCAweGU5LCAweDVhLCAweGU3LCAweDEyLCAweDFhLCAweDQ3LCB9CisKK30sCisKKy8qIHRlc3QgY2FzZSAjNSAqLworeworICAgLyoga2V5ICovCisgICB7IDB4ZmUsIDB4ZmYsIDB4ZTksIDB4OTIsIDB4ODYsIDB4NjUsIDB4NzMsIDB4MWMsIAorICAgICAweDZkLCAweDZhLCAweDhmLCAweDk0LCAweDY3LCAweDMwLCAweDgzLCAweDA4LCB9LAorICAgMTYsCisKKyAgIC8qIFBUICovCisgICB7IDB4ZDksIDB4MzEsIDB4MzIsIDB4MjUsIDB4ZjgsIDB4ODQsIDB4MDYsIDB4ZTUsIAorICAgICAweGE1LCAweDU5LCAweDA5LCAweGM1LCAweGFmLCAweGY1LCAweDI2LCAweDlhLCAKKyAgICAgMHg4NiwgMHhhNywgMHhhOSwgMHg1MywgMHgxNSwgMHgzNCwgMHhmNywgMHhkYSwgCisgICAgIDB4MmUsIDB4NGMsIDB4MzAsIDB4M2QsIDB4OGEsIDB4MzEsIDB4OGEsIDB4NzIsIAorICAgICAweDFjLCAweDNjLCAweDBjLCAweDk1LCAweDk1LCAweDY4LCAweDA5LCAweDUzLCAKKyAgICAgMHgyZiwgMHhjZiwgMHgwZSwgMHgyNCwgMHg0OSwgMHhhNiwgMHhiNSwgMHgyNSwgCisgICAgIDB4YjEsIDB4NmEsIDB4ZWQsIDB4ZjUsIDB4YWEsIDB4MGQsIDB4ZTYsIDB4NTcsIAorICAgICAweGJhLCAweDYzLCAweDdiLCAweDM5LCAgfSwKKyAgIDYwLAorCisgICAvKiBBREFUQSAqLworICAgeyAweGZlLCAweGVkLCAweGZhLCAweGNlLCAweGRlLCAweGFkLCAweGJlLCAweGVmLCAKKyAgICAgMHhmZSwgMHhlZCwgMHhmYSwgMHhjZSwgMHhkZSwgMHhhZCwgMHhiZSwgMHhlZiwgCisgICAgIDB4YWIsIDB4YWQsIDB4ZGEsIDB4ZDIsICB9LAorICAgMjAsCisKKyAgIC8qIElWICovCisgICB7IDB4Y2EsIDB4ZmUsIDB4YmEsIDB4YmUsIDB4ZmEsIDB4Y2UsIDB4ZGIsIDB4YWQsIH0sCisgICA4LAorCisgICAvKiBDVCAqLworICAgeyAweDYxLCAweDM1LCAweDNiLCAweDRjLCAweDI4LCAweDA2LCAweDkzLCAweDRhLCAKKyAgICAgMHg3NywgMHg3ZiwgMHhmNSwgMHgxZiwgMHhhMiwgMHgyYSwgMHg0NywgMHg1NSwgCisgICAgIDB4NjksIDB4OWIsIDB4MmEsIDB4NzEsIDB4NGYsIDB4Y2QsIDB4YzYsIDB4ZjgsIAorICAgICAweDM3LCAweDY2LCAweGU1LCAweGY5LCAweDdiLCAweDZjLCAweDc0LCAweDIzLCAKKyAgICAgMHg3MywgMHg4MCwgMHg2OSwgMHgwMCwgMHhlNCwgMHg5ZiwgMHgyNCwgMHhiMiwgCisgICAgIDB4MmIsIDB4MDksIDB4NzUsIDB4NDQsIDB4ZDQsIDB4ODksIDB4NmIsIDB4NDIsIAorICAgICAweDQ5LCAweDg5LCAweGI1LCAweGUxLCAweGViLCAweGFjLCAweDBmLCAweDA3LCAKKyAgICAgMHhjMiwgMHgzZiwgMHg0NSwgMHg5OCwgIH0sCisKKyAgIC8qIFRBRyAqLworICAgeyAweDM2LCAweDEyLCAweGQyLCAweGU3LCAweDllLCAweDNiLCAweDA3LCAweDg1LCAKKyAgICAgMHg1NiwgMHgxYiwgMHhlMSwgMHg0YSwgMHhhYywgMHhhMiwgMHhmYywgMHhjYiwgfQorfSwKKworLyogdGVzdCBjYXNlICM2ICovCit7CisgICAvKiBrZXkgKi8KKyAgIHsgMHhmZSwgMHhmZiwgMHhlOSwgMHg5MiwgMHg4NiwgMHg2NSwgMHg3MywgMHgxYywgCisgICAgIDB4NmQsIDB4NmEsIDB4OGYsIDB4OTQsIDB4NjcsIDB4MzAsIDB4ODMsIDB4MDgsIH0sCisgICAxNiwKKworICAgLyogUFQgKi8KKyAgIHsgMHhkOSwgMHgzMSwgMHgzMiwgMHgyNSwgMHhmOCwgMHg4NCwgMHgwNiwgMHhlNSwgCisgICAgIDB4YTUsIDB4NTksIDB4MDksIDB4YzUsIDB4YWYsIDB4ZjUsIDB4MjYsIDB4OWEsIAorICAgICAweDg2LCAweGE3LCAweGE5LCAweDUzLCAweDE1LCAweDM0LCAweGY3LCAweGRhLCAKKyAgICAgMHgyZSwgMHg0YywgMHgzMCwgMHgzZCwgMHg4YSwgMHgzMSwgMHg4YSwgMHg3MiwgCisgICAgIDB4MWMsIDB4M2MsIDB4MGMsIDB4OTUsIDB4OTUsIDB4NjgsIDB4MDksIDB4NTMsIAorICAgICAweDJmLCAweGNmLCAweDBlLCAweDI0LCAweDQ5LCAweGE2LCAweGI1LCAweDI1LCAKKyAgICAgMHhiMSwgMHg2YSwgMHhlZCwgMHhmNSwgMHhhYSwgMHgwZCwgMHhlNiwgMHg1NywgCisgICAgIDB4YmEsIDB4NjMsIDB4N2IsIDB4MzksICB9LAorICAgNjAsCisKKyAgIC8qIEFEQVRBICovCisgICB7IDB4ZmUsIDB4ZWQsIDB4ZmEsIDB4Y2UsIDB4ZGUsIDB4YWQsIDB4YmUsIDB4ZWYsIAorICAgICAweGZlLCAweGVkLCAweGZhLCAweGNlLCAweGRlLCAweGFkLCAweGJlLCAweGVmLCAKKyAgICAgMHhhYiwgMHhhZCwgMHhkYSwgMHhkMiwgIH0sCisgICAyMCwKKworICAgLyogSVYgKi8KKyAgIHsgMHg5MywgMHgxMywgMHgyMiwgMHg1ZCwgMHhmOCwgMHg4NCwgMHgwNiwgMHhlNSwgCisgICAgIDB4NTUsIDB4OTAsIDB4OWMsIDB4NWEsIDB4ZmYsIDB4NTIsIDB4NjksIDB4YWEsIAorICAgICAweDZhLCAweDdhLCAweDk1LCAweDM4LCAweDUzLCAweDRmLCAweDdkLCAweGExLCAKKyAgICAgMHhlNCwgMHhjMywgMHgwMywgMHhkMiwgMHhhMywgMHgxOCwgMHhhNywgMHgyOCwgCisgICAgIDB4YzMsIDB4YzAsIDB4YzksIDB4NTEsIDB4NTYsIDB4ODAsIDB4OTUsIDB4MzksIAorICAgICAweGZjLCAweGYwLCAweGUyLCAweDQyLCAweDlhLCAweDZiLCAweDUyLCAweDU0LCAKKyAgICAgMHgxNiwgMHhhZSwgMHhkYiwgMHhmNSwgMHhhMCwgMHhkZSwgMHg2YSwgMHg1NywgCisgICAgIDB4YTYsIDB4MzcsIDB4YjMsIDB4OWIsICB9LAorICAgNjAsCisKKyAgIC8qIENUICovCisgICB7IDB4OGMsIDB4ZTIsIDB4NDksIDB4OTgsIDB4NjIsIDB4NTYsIDB4MTUsIDB4YjYsIAorICAgICAweDAzLCAweGEwLCAweDMzLCAweGFjLCAweGExLCAweDNmLCAweGI4LCAweDk0LCAKKyAgICAgMHhiZSwgMHg5MSwgMHgxMiwgMHhhNSwgMHhjMywgMHhhMiwgMHgxMSwgMHhhOCwgCisgICAgIDB4YmEsIDB4MjYsIDB4MmEsIDB4M2MsIDB4Y2EsIDB4N2UsIDB4MmMsIDB4YTcsIAorICAgICAweDAxLCAweGU0LCAweGE5LCAweGE0LCAweGZiLCAweGE0LCAweDNjLCAweDkwLCAKKyAgICAgMHhjYywgMHhkYywgMHhiMiwgMHg4MSwgMHhkNCwgMHg4YywgMHg3YywgMHg2ZiwgCisgICAgIDB4ZDYsIDB4MjgsIDB4NzUsIDB4ZDIsIDB4YWMsIDB4YTQsIDB4MTcsIDB4MDMsIAorICAgICAweDRjLCAweDM0LCAweGFlLCAweGU1LCAgfSwKKworICAgLyogVEFHICovCisgICB7IDB4NjEsIDB4OWMsIDB4YzUsIDB4YWUsIDB4ZmYsIDB4ZmUsIDB4MGIsIDB4ZmEsIAorICAgICAweDQ2LCAweDJhLCAweGY0LCAweDNjLCAweDE2LCAweDk5LCAweGQwLCAweDUwLCB9Cit9CisKKy8qIHJlc3Qgb2YgdGVzdCBjYXNlcyBhcmUgdGhlIHNhbWUgZXhjZXB0IEFFUyBrZXkgc2l6ZSBjaGFuZ2VzLi4uIGlnbm9yZWQuLi4gKi8KK307CisgICBpbnQgICAgICAgICAgIGlkeCwgZXJyOworICAgdW5zaWduZWQgbG9uZyB4LCB5OworICAgdW5zaWduZWQgY2hhciBvdXRbMl1bNjRdLCBUWzJdWzE2XTsKKworICAgLyogZmluZCBhZXMgKi8KKyAgIGlkeCA9IGZpbmRfY2lwaGVyKCJhZXMiKTsKKyAgIGlmIChpZHggPT0gLTEpIHsKKyAgICAgIGlkeCA9IGZpbmRfY2lwaGVyKCJyaWpuZGFlbCIpOworICAgICAgaWYgKGlkeCA9PSAtMSkgeworICAgICAgICAgcmV0dXJuIENSWVBUX05PUDsKKyAgICAgIH0KKyAgIH0KKworICAgZm9yICh4ID0gMDsgeCA8IChpbnQpKHNpemVvZih0ZXN0cykvc2l6ZW9mKHRlc3RzWzBdKSk7IHgrKykgeworICAgICAgIHkgPSBzaXplb2YoVFswXSk7CisgICAgICAgaWYgKChlcnIgPSBnY21fbWVtb3J5KGlkeCwgdGVzdHNbeF0uSywgdGVzdHNbeF0ua2V5bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0c1t4XS5JViwgdGVzdHNbeF0uSVZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzW3hdLkEsIHRlc3RzW3hdLmFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKil0ZXN0c1t4XS5QLCB0ZXN0c1t4XS5wdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0WzBdLCBUWzBdLCAmeSwgR0NNX0VOQ1JZUFQpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgfQorCisgICAgICAgaWYgKG1lbWNtcChvdXRbMF0sIHRlc3RzW3hdLkMsIHRlc3RzW3hdLnB0bGVuKSkgeworI2lmIDAKKyAgICAgICAgICBwcmludGYoIlxuQ2lwaGVydGV4dCB3cm9uZyAlbHVcbiIsIHgpOworICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCB0ZXN0c1t4XS5wdGxlbjsgeSsrKSB7CisgICAgICAgICAgICAgIHByaW50ZigiJTAyeCIsIG91dFswXVt5XSAmIDI1NSk7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigiXG4iKTsKKyNlbmRpZgorICAgICAgICAgIHJldHVybiBDUllQVF9GQUlMX1RFU1RWRUNUT1I7CisgICAgICAgfQorCisgICAgICAgaWYgKG1lbWNtcChUWzBdLCB0ZXN0c1t4XS5ULCAxNikpIHsKKyNpZiAwCisgICAgICAgICAgcHJpbnRmKCJcblRhZyBvbiBwbGFpbnRleHQgd3JvbmcgJWx1XG4iLCB4KTsKKyAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworICAgICAgICAgICAgICBwcmludGYoIiUwMngiLCBUWzBdW3ldICYgMjU1KTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRmKCJcbiIpOworI2VuZGlmCisgICAgICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKKyAgICAgICB9CisKKyAgICAgICB5ID0gc2l6ZW9mKFRbMV0pOworICAgICAgIGlmICgoZXJyID0gZ2NtX21lbW9yeShpZHgsIHRlc3RzW3hdLkssIHRlc3RzW3hdLmtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHNbeF0uSVYsIHRlc3RzW3hdLklWbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0c1t4XS5BLCB0ZXN0c1t4XS5hbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbMV0sIHRlc3RzW3hdLnB0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRbMF0sIFRbMV0sICZ5LCBHQ01fREVDUllQVCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICB9CisKKyAgICAgICBpZiAobWVtY21wKG91dFsxXSwgdGVzdHNbeF0uUCwgdGVzdHNbeF0ucHRsZW4pKSB7CisjaWYgMAorICAgICAgICAgIHByaW50ZigiXG5wbGFpbnRleHQgd3JvbmcgJWx1XG4iLCB4KTsKKyAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgdGVzdHNbeF0ucHRsZW47IHkrKykgeworICAgICAgICAgICAgICBwcmludGYoIiUwMngiLCBvdXRbMF1beV0gJiAyNTUpOworICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGYoIlxuIik7CisjZW5kaWYKKyAgICAgICAgICByZXR1cm4gQ1JZUFRfRkFJTF9URVNUVkVDVE9SOworICAgICAgIH0KKworICAgICAgIGlmIChtZW1jbXAoVFsxXSwgdGVzdHNbeF0uVCwgMTYpKSB7CisjaWYgMAorICAgICAgICAgIHByaW50ZigiXG5UYWcgb24gY2lwaGVydGV4dCB3cm9uZyAlbHVcbiIsIHgpOworICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgICAgICAgIHByaW50ZigiJTAyeCIsIFRbMV1beV0gJiAyNTUpOworICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGYoIlxuIik7CisjZW5kaWYKKyAgICAgICAgICByZXR1cm4gQ1JZUFRfRkFJTF9URVNUVkVDVE9SOworICAgICAgIH0KKworICAgfQorICAgcmV0dXJuIENSWVBUX09LOworI2VuZGlmCit9CisKKyNlbmRpZgorCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL2djbS9nY21fdGVzdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjE1ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL29jYl9kZWNyeXB0LmMgYi9zcmMvZW5jYXV0aC9vY2Ivb2NiX2RlY3J5cHQuYwpzaW1pbGFyaXR5IGluZGV4IDYyJQpyZW5hbWUgZnJvbSBvY2JfZGVjcnlwdC5jCnJlbmFtZSB0byBzcmMvZW5jYXV0aC9vY2Ivb2NiX2RlY3J5cHQuYwppbmRleCBiN2M3ODViLi5hMGYyNzU0IDEwMDY0NAotLS0gYS9vY2JfZGVjcnlwdC5jCisrKyBiL3NyYy9lbmNhdXRoL29jYi9vY2JfZGVjcnlwdC5jCkBAIC02LDI4ICs2LDM4IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KIAotLyogT0NCIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKKy8qKgorICAgQGZpbGUgb2NiX2RlY3J5cHQuYworICAgT0NCIGltcGxlbWVudGF0aW9uLCBkZWNyeXB0IGRhdGEsIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAogI2lmZGVmIE9DQl9NT0RFCiAKKy8qKgorICBEZWNyeXB0IGEgYmxvY2sgd2l0aCBPQ0IuCisgIEBwYXJhbSBvY2IgICAgVGhlIE9DQiBzdGF0ZQorICBAcGFyYW0gY3QgICAgIFRoZSBjaXBoZXJ0ZXh0IChsZW5ndGggb2YgdGhlIGJsb2NrIHNpemUgb2YgdGhlIGJsb2NrIGNpcGhlcikKKyAgQHBhcmFtIHB0ICAgICBbb3V0XSBUaGUgcGxhaW50ZXh0IChsZW5ndGggb2YgY3QpCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIGludCBvY2JfZGVjcnlwdChvY2Jfc3RhdGUgKm9jYiwgY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0KQogewogICAgdW5zaWduZWQgY2hhciBaW01BWEJMT0NLU0laRV0sIHRtcFtNQVhCTE9DS1NJWkVdOwogICAgaW50IGVyciwgeDsKIAotICAgX0FSR0NISyhvY2IgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHB0ICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY3QgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvY2IgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHB0ICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICE9IE5VTEwpOwogCiAgICAvKiBjaGVjayBpZiB2YWxpZCBjaXBoZXIgKi8KICAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKG9jYi0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKICAgICAgIHJldHVybiBlcnI7CiAgICB9Ci0gICBfQVJHQ0hLKGNpcGhlcl9kZXNjcmlwdG9yW29jYi0+Y2lwaGVyXS5lY2JfZGVjcnlwdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY2lwaGVyX2Rlc2NyaXB0b3Jbb2NiLT5jaXBoZXJdLmVjYl9kZWNyeXB0ICE9IE5VTEwpOwogICAgCiAgICAvKiBjaGVjayBsZW5ndGggKi8KICAgIGlmIChvY2ItPmJsb2NrX2xlbiAhPSBjaXBoZXJfZGVzY3JpcHRvcltvY2ItPmNpcGhlcl0uYmxvY2tfbGVuZ3RoKSB7CkBAIC01Miw3ICs2Miw3IEBACiAgICB9CiAKIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICB6ZXJvbWVtKFosIHNpemVvZihaKSk7CiAgICB6ZXJvbWVtKHRtcCwgc2l6ZW9mKHRtcCkpOwogI2VuZGlmCkBAIC02MSwzICs3MSw3IEBACiAKICNlbmRpZgogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL29jYi9vY2JfZGVjcnlwdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2VuY2F1dGgvb2NiL29jYl9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkuYyBiL3NyYy9lbmNhdXRoL29jYi9vY2JfZGVjcnlwdF92ZXJpZnlfbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3M2VmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbmNhdXRoL29jYi9vY2JfZGVjcnlwdF92ZXJpZnlfbWVtb3J5LmMKQEAgLTAsMCArMSw4NiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKworLyoqIAorICBAZmlsZSBvY2JfZGVjcnlwdF92ZXJpZnlfbWVtb3J5LmMKKyAgT0NCIGltcGxlbWVudGF0aW9uLCBoZWxwZXIgdG8gZGVjcnlwdCBibG9jayBvZiBtZW1vcnksIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIE9DQl9NT0RFCisKKy8qKgorICAgRGVjcnlwdCBhbmQgY29tcGFyZSB0aGUgdGFnIHdpdGggT0NCLgorICAgQHBhcmFtIGNpcGhlciAgICAgVGhlIGluZGV4IG9mIHRoZSBjaXBoZXIgZGVzaXJlZAorICAgQHBhcmFtIGtleSAgICAgICAgVGhlIHNlY3JldCBrZXkKKyAgIEBwYXJhbSBrZXlsZW4gICAgIFRoZSBsZW5ndGggb2YgdGhlIHNlY3JldCBrZXkgKG9jdGV0cykKKyAgIEBwYXJhbSBub25jZSAgICAgIFRoZSBzZXNzaW9uIG5vbmNlIChsZW5ndGggb2YgdGhlIGJsb2NrIHNpemUgb2YgdGhlIGJsb2NrIGNpcGhlcikKKyAgIEBwYXJhbSBjdCAgICAgICAgIFRoZSBjaXBoZXJ0ZXh0CisgICBAcGFyYW0gY3RsZW4gICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBjaXBoZXJ0ZXh0IChvY3RldHMpCisgICBAcGFyYW0gcHQgICAgICAgICBbb3V0XSBUaGUgcGxhaW50ZXh0CisgICBAcGFyYW0gdGFnICAgICAgICBUaGUgdGFnIHRvIGNvbXBhcmUgYWdhaW5zdAorICAgQHBhcmFtIHRhZ2xlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgdGFnIChvY3RldHMpCisgICBAcGFyYW0gc3RhdCAgICAgICBbb3V0XSBUaGUgcmVzdWx0IG9mIHRoZSB0YWcgY29tcGFyaXNvbiAoMT09dmFsaWQsIDA9PWludmFsaWQpCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwgcmVnYXJkbGVzcyBvZiB0aGUgdGFnIGNvbXBhcmlzb24KKyovCitpbnQgb2NiX2RlY3J5cHRfdmVyaWZ5X21lbW9yeShpbnQgY2lwaGVyLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbm9uY2UsICAKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgICAgIHVuc2lnbmVkIGxvbmcgY3RsZW4sCisgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdGFnLCAgICB1bnNpZ25lZCBsb25nIHRhZ2xlbiwKKyAgICAgICAgICBpbnQgICAgICAgICAgICpzdGF0KQoreworICAgaW50IGVycjsKKyAgIG9jYl9zdGF0ZSAqb2NiOworCisgICBMVENfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsobm9uY2UgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwdCAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsodGFnICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhzdGF0ICAgICE9IE5VTEwpOworCisgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgIG9jYiA9IFhNQUxMT0Moc2l6ZW9mKG9jYl9zdGF0ZSkpOworICAgaWYgKG9jYiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICBpZiAoKGVyciA9IG9jYl9pbml0KG9jYiwgY2lwaGVyLCBrZXksIGtleWxlbiwgbm9uY2UpKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOyAKKyAgIH0KKworICAgd2hpbGUgKGN0bGVuID4gKHVuc2lnbmVkIGxvbmcpb2NiLT5ibG9ja19sZW4pIHsKKyAgICAgICAgaWYgKChlcnIgPSBvY2JfZGVjcnlwdChvY2IsIGN0LCBwdCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICBnb3RvIExCTF9FUlI7IAorICAgICAgICB9CisgICAgICAgIGN0bGVuICAgLT0gb2NiLT5ibG9ja19sZW47CisgICAgICAgIHB0ICAgICAgKz0gb2NiLT5ibG9ja19sZW47CisgICAgICAgIGN0ICAgICAgKz0gb2NiLT5ibG9ja19sZW47CisgICB9CisKKyAgIGVyciA9IG9jYl9kb25lX2RlY3J5cHQob2NiLCBjdCwgY3RsZW4sIHB0LCB0YWcsIHRhZ2xlbiwgc3RhdCk7CitMQkxfRVJSOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShvY2IsIHNpemVvZihvY2Jfc3RhdGUpKTsKKyNlbmRpZgorIAorICAgWEZSRUUob2NiKTsKKworICAgcmV0dXJuIGVycjsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL29jYi9vY2JfZGVjcnlwdF92ZXJpZnlfbWVtb3J5LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9vY2Ivb2NiX2RvbmVfZGVjcnlwdC5jIGIvc3JjL2VuY2F1dGgvb2NiL29jYl9kb25lX2RlY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjE0OWJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2VuY2F1dGgvb2NiL29jYl9kb25lX2RlY3J5cHQuYwpAQCAtMCwwICsxLDgwIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworCisvKiogCisgICBAZmlsZSBvY2JfZG9uZV9kZWNyeXB0LmMKKyAgIE9DQiBpbXBsZW1lbnRhdGlvbiwgdGVybWluYXRlIGRlY3J5cHRpb24sIGJ5IFRvbSBTdCBEZW5pcworKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisjaWZkZWYgT0NCX01PREUKKworLyoqCisgICBUZXJtaW5hdGUgYSBkZWNyeXB0aW5nIE9DQiBzdGF0ZQorICAgQHBhcmFtIG9jYiAgICBUaGUgT0NCIHN0YXRlCisgICBAcGFyYW0gY3QgICAgIFRoZSBjaXBoZXJ0ZXh0IChpZiBhbnkpCisgICBAcGFyYW0gY3RsZW4gIFRoZSBsZW5ndGggb2YgdGhlIGNpcGhlcnRleHQgKG9jdGV0cykKKyAgIEBwYXJhbSBwdCAgICAgW291dF0gVGhlIHBsYWludGV4dAorICAgQHBhcmFtIHRhZyAgICBUaGUgYXV0aGVudGljYXRpb24gdGFnICh0byBjb21wYXJlIGFnYWluc3QpCisgICBAcGFyYW0gdGFnbGVuIFRoZSBsZW5ndGggb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHRhZyBwcm92aWRlZAorICAgQHBhcmFtIHN0YXQgICAgW291dF0gVGhlIHJlc3VsdCBvZiB0aGUgdGFnIGNvbXBhcmlzb24KKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdGhlIHByb2Nlc3Mgd2FzIHN1Y2Nlc3NmdWwgcmVnYXJkbGVzcyBpZiB0aGUgdGFnIGlzIHZhbGlkCisqLworaW50IG9jYl9kb25lX2RlY3J5cHQob2NiX3N0YXRlICpvY2IsIAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY3QsICB1bnNpZ25lZCBsb25nIGN0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsIAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nIHRhZ2xlbiwgaW50ICpzdGF0KQoreworICAgaW50IGVycjsKKyAgIHVuc2lnbmVkIGNoYXIgKnRhZ2J1ZjsKKyAgIHVuc2lnbmVkIGxvbmcgdGFnYnVmbGVuOworCisgICBMVENfQVJHQ0hLKG9jYiAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHB0ICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHRhZyAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHN0YXQgIT0gTlVMTCk7CisKKyAgIC8qIGRlZmF1bHQgdG8gZmFpbGVkICovCisgICAqc3RhdCA9IDA7CisKKyAgIC8qIGFsbG9jYXRlIG1lbW9yeSAqLworICAgdGFnYnVmID0gWE1BTExPQyhNQVhCTE9DS1NJWkUpOworICAgaWYgKHRhZ2J1ZiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICB0YWdidWZsZW4gPSBNQVhCTE9DS1NJWkU7CisgICBpZiAoKGVyciA9IHNfb2NiX2RvbmUob2NiLCBjdCwgY3RsZW4sIHB0LCB0YWdidWYsICZ0YWdidWZsZW4sIDEpKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICBpZiAodGFnbGVuIDw9IHRhZ2J1ZmxlbiAmJiBtZW1jbXAodGFnYnVmLCB0YWcsIHRhZ2xlbikgPT0gMCkgeworICAgICAgKnN0YXQgPSAxOworICAgfQorCisgICBlcnIgPSBDUllQVF9PSzsKK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKHRhZ2J1ZiwgTUFYQkxPQ0tTSVpFKTsKKyNlbmRpZgorCisgICBYRlJFRSh0YWdidWYpOworCisgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvZW5jYXV0aC9vY2Ivb2NiX2RvbmVfZGVjcnlwdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2VuY2F1dGgvb2NiL29jYl9kb25lX2VuY3J5cHQuYyBiL3NyYy9lbmNhdXRoL29jYi9vY2JfZG9uZV9lbmNyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxMjZlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9lbmNhdXRoL29jYi9vY2JfZG9uZV9lbmNyeXB0LmMKQEAgLTAsMCArMSw0NiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKworLyoqIAorICAgQGZpbGUgb2NiX2RvbmVfZW5jcnlwdC5jCisgICBPQ0IgaW1wbGVtZW50YXRpb24sIHRlcm1pbmF0ZSBlbmNyeXB0aW9uLCBieSBUb20gU3QgRGVuaXMKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworI2lmZGVmIE9DQl9NT0RFCisKKy8qKiAKKyAgIFRlcm1pbmF0ZSBhbiBlbmNyeXB0aW9uIE9DQiBzdGF0ZQorICAgQHBhcmFtIG9jYiAgICAgICBUaGUgT0NCIHN0YXRlCisgICBAcGFyYW0gcHQgICAgICAgIFJlbWFpbmluZyBwbGFpbnRleHQgKGlmIGFueSkKKyAgIEBwYXJhbSBwdGxlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IChvY3RldHMpCisgICBAcGFyYW0gY3QgICAgICAgIFtvdXRdIFRoZSBjaXBoZXJ0ZXh0IChpZiBhbnkpCisgICBAcGFyYW0gdGFnICAgICAgIFtvdXRdIFRoZSB0YWcgZm9yIHRoZSBPQ0Igc3RyZWFtCisgICBAcGFyYW0gdGFnbGVuICAgIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIHRhZworICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IG9jYl9kb25lX2VuY3J5cHQob2NiX3N0YXRlICpvY2IsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBsb25nIHB0bGVuLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyAqdGFnbGVuKQoreworICAgTFRDX0FSR0NISyhvY2IgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHB0ICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyh0YWcgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHRhZ2xlbiAhPSBOVUxMKTsKKyAgIHJldHVybiBzX29jYl9kb25lKG9jYiwgcHQsIHB0bGVuLCBjdCwgdGFnLCB0YWdsZW4sIDApOworfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvZW5jYXV0aC9vY2Ivb2NiX2RvbmVfZW5jcnlwdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvb2NiX2VuY3J5cHQuYyBiL3NyYy9lbmNhdXRoL29jYi9vY2JfZW5jcnlwdC5jCnNpbWlsYXJpdHkgaW5kZXggNjMlCnJlbmFtZSBmcm9tIG9jYl9lbmNyeXB0LmMKcmVuYW1lIHRvIHNyYy9lbmNhdXRoL29jYi9vY2JfZW5jcnlwdC5jCmluZGV4IGQ5NTE5MzMuLjJhNDg1NTEgMTAwNjQ0Ci0tLSBhL29jYl9lbmNyeXB0LmMKKysrIGIvc3JjL2VuY2F1dGgvb2NiL29jYl9lbmNyeXB0LmMKQEAgLTYsMjIgKzYsMzIgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwogCi0vKiBPQ0IgSW1wbGVtZW50YXRpb24gYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorLyoqIAorICAgQGZpbGUgb2NiX2VuY3J5cHQuYworICAgT0NCIGltcGxlbWVudGF0aW9uLCBlbmNyeXB0IGRhdGEsIGJ5IFRvbSBTdCBEZW5pcworKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgogCiAjaWZkZWYgT0NCX01PREUKIAorLyoqCisgICBFbmNyeXB0IGEgYmxvY2sgb2YgZGF0YSB3aXRoIE9DQi4KKyAgIEBwYXJhbSBvY2IgICAgIFRoZSBPQ0Igc3RhdGUKKyAgIEBwYXJhbSBwdCAgICAgIFRoZSBwbGFpbnRleHQgKGxlbmd0aCBvZiB0aGUgYmxvY2sgc2l6ZSBvZiB0aGUgYmxvY2sgY2lwaGVyKQorICAgQHBhcmFtIGN0ICAgICAgW291dF0gVGhlIGNpcGhlcnRleHQgKHNhbWUgc2l6ZSBhcyB0aGUgcHQpCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCiBpbnQgb2NiX2VuY3J5cHQob2NiX3N0YXRlICpvY2IsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCkKIHsKICAgIHVuc2lnbmVkIGNoYXIgWltNQVhCTE9DS1NJWkVdLCB0bXBbTUFYQkxPQ0tTSVpFXTsKICAgIGludCBlcnIsIHg7CiAKLSAgIF9BUkdDSEsob2NiICE9IE5VTEwpOwotICAgX0FSR0NISyhwdCAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob2NiICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwdCAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICAhPSBOVUxMKTsKICAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKG9jYi0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKICAgICAgIHJldHVybiBlcnI7CiAgICB9CkBAIC00Niw3ICs1Niw3IEBACiAgICAgICAgY3RbeF0gXj0gWlt4XTsKICAgIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICB6ZXJvbWVtKFosIHNpemVvZihaKSk7CiAgICB6ZXJvbWVtKHRtcCwgc2l6ZW9mKHRtcCkpOwogI2VuZGlmCkBAIC01NCwzICs2NCw3IEBACiB9CiAKICNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvZW5jYXV0aC9vY2Ivb2NiX2VuY3J5cHQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9lbmNhdXRoL29jYi9vY2JfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5LmMgYi9zcmMvZW5jYXV0aC9vY2Ivb2NiX2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjcyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZW5jYXV0aC9vY2Ivb2NiX2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisKKy8qKiAKKyAgQGZpbGUgb2NiX2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeS5jCisgIE9DQiBpbXBsZW1lbnRhdGlvbiwgZW5jcnlwdCBibG9jayBvZiBtZW1vcnksIGJ5IFRvbSBTdCBEZW5pcworKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisjaWZkZWYgT0NCX01PREUKKworLyoqCisgICBFbmNyeXB0IGFuZCBnZW5lcmF0ZSBhbiBhdXRoZW50aWNhdGlvbiBjb2RlIGZvciBhIGJ1ZmZlciBvZiBtZW1vcnkKKyAgIEBwYXJhbSBjaXBoZXIgICAgIFRoZSBpbmRleCBvZiB0aGUgY2lwaGVyIGRlc2lyZWQKKyAgIEBwYXJhbSBrZXkgICAgICAgIFRoZSBzZWNyZXQga2V5CisgICBAcGFyYW0ga2V5bGVuICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5IChvY3RldHMpCisgICBAcGFyYW0gbm9uY2UgICAgICBUaGUgc2Vzc2lvbiBub25jZSAobGVuZ3RoIG9mIHRoZSBibG9jayBjaXBoZXJzIGJsb2NrIHNpemUpCisgICBAcGFyYW0gcHQgICAgICAgICBUaGUgcGxhaW50ZXh0CisgICBAcGFyYW0gcHRsZW4gICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgKG9jdGV0cykKKyAgIEBwYXJhbSBjdCAgICAgICAgIFtvdXRdIFRoZSBjaXBoZXJ0ZXh0CisgICBAcGFyYW0gdGFnICAgICAgICBbb3V0XSBUaGUgYXV0aGVudGljYXRpb24gdGFnCisgICBAcGFyYW0gdGFnbGVuICAgICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBvY2JfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5KGludCBjaXBoZXIsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCAgICAgdW5zaWduZWQgbG9uZyBwdGxlbiwKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWcsICAgIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbikKK3sKKyAgIGludCBlcnI7CisgICBvY2Jfc3RhdGUgKm9jYjsKKworICAgTFRDX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG5vbmNlICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHQgICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHRhZyAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsodGFnbGVuICE9IE5VTEwpOworCisgICAvKiBhbGxvY2F0ZSByYW0gKi8KKyAgIG9jYiA9IFhNQUxMT0Moc2l6ZW9mKG9jYl9zdGF0ZSkpOworICAgaWYgKG9jYiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICBpZiAoKGVyciA9IG9jYl9pbml0KG9jYiwgY2lwaGVyLCBrZXksIGtleWxlbiwgbm9uY2UpKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICB3aGlsZSAocHRsZW4gPiAodW5zaWduZWQgbG9uZylvY2ItPmJsb2NrX2xlbikgeworICAgICAgICBpZiAoKGVyciA9IG9jYl9lbmNyeXB0KG9jYiwgcHQsIGN0KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICB9CisgICAgICAgIHB0bGVuICAgLT0gb2NiLT5ibG9ja19sZW47CisgICAgICAgIHB0ICAgICAgKz0gb2NiLT5ibG9ja19sZW47CisgICAgICAgIGN0ICAgICAgKz0gb2NiLT5ibG9ja19sZW47CisgICB9CisKKyAgIGVyciA9IG9jYl9kb25lX2VuY3J5cHQob2NiLCBwdCwgcHRsZW4sIGN0LCB0YWcsIHRhZ2xlbik7CitMQkxfRVJSOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShvY2IsIHNpemVvZihvY2Jfc3RhdGUpKTsKKyNlbmRpZgorCisgICBYRlJFRShvY2IpOworCisgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvb2NiL29jYl9lbmNyeXB0X2F1dGhlbnRpY2F0ZV9tZW1vcnkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL29jYl9pbml0LmMgYi9zcmMvZW5jYXV0aC9vY2Ivb2NiX2luaXQuYwpzaW1pbGFyaXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSBvY2JfaW5pdC5jCnJlbmFtZSB0byBzcmMvZW5jYXV0aC9vY2Ivb2NiX2luaXQuYwppbmRleCBiZmI1YTg3Li45MjY2ZDVjIDEwMDY0NAotLS0gYS9vY2JfaW5pdC5jCisrKyBiL3NyYy9lbmNhdXRoL29jYi9vY2JfaW5pdC5jCkBAIC02LDExICs2LDE0IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KIAotLyogT0NCIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKKy8qKgorICAgQGZpbGUgb2NiX2luaXQuYworICAgT0NCIGltcGxlbWVudGF0aW9uLCBpbml0aWFsaXplIHN0YXRlLCBieSBUb20gU3QgRGVuaXMKKyovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAogI2lmZGVmIE9DQl9NT0RFCiAKQEAgLTMyLDE0ICszNSwyMyBAQAogfQogfTsKIAorLyoqCisgIEluaXRpYWxpemUgYW4gT0NCIGNvbnRleHQuCisgIEBwYXJhbSBvY2IgICAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgT0NCIHN0YXRlCisgIEBwYXJhbSBjaXBoZXIgIFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBjaXBoZXIKKyAgQHBhcmFtIGtleSAgICAgVGhlIHNlY3JldCBrZXkKKyAgQHBhcmFtIGtleWxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgc2VjcmV0IGtleSAob2N0ZXRzKQorICBAcGFyYW0gbm9uY2UgICBUaGUgc2Vzc2lvbiBub25jZSAobGVuZ3RoIG9mIHRoZSBibG9jayBzaXplIG9mIHRoZSBjaXBoZXIpCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIGludCBvY2JfaW5pdChvY2Jfc3RhdGUgKm9jYiwgaW50IGNpcGhlciwgCiAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbm9uY2UpCiB7CiAgICBpbnQgcG9seSwgeCwgeSwgbSwgZXJyOwogCi0gICBfQVJHQ0hLKG9jYiAgICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsobm9uY2UgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG9jYiAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsobm9uY2UgIT0gTlVMTCk7CiAKICAgIC8qIHZhbGlkIGNpcGhlcj8gKi8KICAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNpcGhlcikpICE9IENSWVBUX09LKSB7CkBAIC03Myw3ICs4NSw3IEBACiAgICBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmVjYl9lbmNyeXB0KG9jYi0+Uiwgb2NiLT5SLCAmb2NiLT5rZXkpOwogCiAgICAvKiBmaW5kIExzW2ldID0gTCA8PCBpIGZvciBpID09IDAuLjMxICovCi0gICBtZW1jcHkob2NiLT5Mc1swXSwgb2NiLT5MLCBvY2ItPmJsb2NrX2xlbik7CisgICBYTUVNQ1BZKG9jYi0+THNbMF0sIG9jYi0+TCwgb2NiLT5ibG9ja19sZW4pOwogICAgZm9yICh4ID0gMTsgeCA8IDMyOyB4KyspIHsKICAgICAgICBtID0gb2NiLT5Mc1t4LTFdWzBdID4+IDc7CiAgICAgICAgZm9yICh5ID0gMDsgeSA8IG9jYi0+YmxvY2tfbGVuLTE7IHkrKykgewpAQCAtMTA0LDcgKzExNiw3IEBACiAgICAgfQogCiAgICAgLyogc2V0IExpLCBjaGVja3N1bSAqLwotICAgIHplcm9tZW0ob2NiLT5MaSwgb2NiLT5ibG9ja19sZW4pOworICAgIHplcm9tZW0ob2NiLT5MaSwgICAgICAgb2NiLT5ibG9ja19sZW4pOwogICAgIHplcm9tZW0ob2NiLT5jaGVja3N1bSwgb2NiLT5ibG9ja19sZW4pOwogCiAgICAgLyogc2V0IG90aGVyIHBhcmFtcyAqLwpAQCAtMTE1LDMgKzEyNyw3IEBACiB9CiAKICNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvZW5jYXV0aC9vY2Ivb2NiX2luaXQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9lbmNhdXRoL29jYi9vY2JfbnR6LmMgYi9zcmMvZW5jYXV0aC9vY2Ivb2NiX250ei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODNjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZW5jYXV0aC9vY2Ivb2NiX250ei5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisKKy8qKgorICAgQGZpbGUgb2NiX250ei5jCisgICBPQ0IgaW1wbGVtZW50YXRpb24sIGludGVybmFsIGZ1bmN0aW9uLCBieSBUb20gU3QgRGVuaXMKKyovCisKKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisjaWZkZWYgT0NCX01PREUKKworLyoqCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvIGJpdHMgW2Zyb20gbHNiIHVwXQorICAgQHBhcmFtIHggIFRoZSAzMi1iaXQgdmFsdWUgdG8gb2JzZXJ2ZQorICAgQHJldHVybiAgIFRoZSBudW1iZXIgb2YgYml0cyBbZnJvbSB0aGUgbHNiIHVwXSB0aGF0IGFyZSB6ZXJvCisqLworaW50IG9jYl9udHoodW5zaWduZWQgbG9uZyB4KQoreworICAgaW50IGM7CisgICB4ICY9IDB4RkZGRkZGRkZVTDsKKyAgIGMgPSAwOworICAgd2hpbGUgKCh4ICYgMSkgPT0gMCkgeworICAgICAgKytjOworICAgICAgeCA+Pj0gMTsKKyAgIH0KKyAgIHJldHVybiBjOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvb2NiL29jYl9udHouYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9lbmNhdXRoL29jYi9vY2Jfc2hpZnRfeG9yLmMgYi9zcmMvZW5jYXV0aC9vY2Ivb2NiX3NoaWZ0X3hvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwM2RlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZW5jYXV0aC9vY2Ivb2NiX3NoaWZ0X3hvci5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisKKy8qKiAKKyAgIEBmaWxlIG9jYl9zaGlmdF94b3IuYworICAgT0NCIGltcGxlbWVudGF0aW9uLCBpbnRlcm5hbCBmdW5jdGlvbiwgYnkgVG9tIFN0IERlbmlzCisqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKyNpZmRlZiBPQ0JfTU9ERQorCisvKioKKyAgIENvbXB1dGUgdGhlIHNoaWZ0L3hvciBmb3IgT0NCIChpbnRlcm5hbCBmdW5jdGlvbikKKyAgIEBwYXJhbSBvY2IgIFRoZSBPQ0Igc3RhdGUgCisgICBAcGFyYW0gWiAgICBUaGUgZGVzdGluYXRpb24gb2YgdGhlIHNoaWZ0CisqLwordm9pZCBvY2Jfc2hpZnRfeG9yKG9jYl9zdGF0ZSAqb2NiLCB1bnNpZ25lZCBjaGFyICpaKQoreworICAgaW50IHgsIHk7CisgICB5ID0gb2NiX250eihvY2ItPmJsb2NrX2luZGV4KyspOworICAgZm9yICh4ID0gMDsgeCA8IG9jYi0+YmxvY2tfbGVuOyB4KyspIHsKKyAgICAgICBvY2ItPkxpW3hdIF49IG9jYi0+THNbeV1beF07CisgICAgICAgWlt4XSAgICAgICAgPSBvY2ItPkxpW3hdIF4gb2NiLT5SW3hdOworICAgfQorfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvb2NiL29jYl9zaGlmdF94b3IuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL29jYl90ZXN0LmMgYi9zcmMvZW5jYXV0aC9vY2Ivb2NiX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBvY2JfdGVzdC5jCnJlbmFtZSB0byBzcmMvZW5jYXV0aC9vY2Ivb2NiX3Rlc3QuYwppbmRleCAwYjVkYWZkLi43YTdmYzc3IDEwMDY0NAotLS0gYS9vY2JfdGVzdC5jCisrKyBiL3NyYy9lbmNhdXRoL29jYi9vY2JfdGVzdC5jCkBAIC02LDE0ICs2LDIxIEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KIAotLyogT0NCIEltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKKy8qKiAKKyAgIEBmaWxlIG9jYl90ZXN0LmMKKyAgIE9DQiBpbXBsZW1lbnRhdGlvbiwgc2VsZi10ZXN0IGJ5IFRvbSBTdCBEZW5pcworKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgogCiAjaWZkZWYgT0NCX01PREUKIAorLyoqIAorICBUZXN0IHRoZSBPQ0IgcHJvdG9jb2wKKyAgQHJldHVybiAgIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCiBpbnQgb2NiX3Rlc3Qodm9pZCkKIHsKICNpZm5kZWYgTFRDX1RFU1QKQEAgLTIyNCwzICsyMzEsNyBAQAogICAgLS0gaGFyZCB0byBzdHJlYW0gW3lvdSBjYW4ndCBlbWl0IGNpcGhlcnRleHQgdW50aWwgZnVsbCBibG9ja10KICAgIC0tIFRoZSBzZXR1cCBpcyBzb21ld2hhdCBjb21wbGljYXRlZC4uLgogKi8KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2VuY2F1dGgvb2NiL29jYl90ZXN0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvZW5jYXV0aC9vY2Ivc19vY2JfZG9uZS5jIGIvc3JjL2VuY2F1dGgvb2NiL3Nfb2NiX2RvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mzk5YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2VuY2F1dGgvb2NiL3Nfb2NiX2RvbmUuYwpAQCAtMCwwICsxLDE0NCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKworLyoqIAorICAgQGZpbGUgc19vY2JfZG9uZS5jCisgICBPQ0IgaW1wbGVtZW50YXRpb24sIGludGVybmFsIGhlbHBlciwgYnkgVG9tIFN0IERlbmlzCisqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKyNpZmRlZiBPQ0JfTU9ERQorCisvKiBTaW5jZSB0aGUgbGFzdCBibG9jayBpcyBlbmNyeXB0ZWQgaW4gQ1RSIG1vZGUgdGhlIHNhbWUgY29kZSBjYW4KKyAqIGJlIHVzZWQgdG8gZmluaXNoIGEgZGVjcnlwdCBvciBlbmNyeXB0IHN0cmVhbS4gIFRoZSBvbmx5IGRpZmZlcmVuY2UKKyAqIGlzIHdlIFhPUiB0aGUgZmluYWwgY2lwaGVydGV4dCBpbnRvIHRoZSBjaGVja3N1bSBzbyB3ZSBoYXZlIHRvIHhvciBpdAorICogYmVmb3JlIHdlIENUUiBbZGVjcnlwdF0gb3IgYWZ0ZXIgW2VuY3J5cHRdCisgKgorICogdGhlIG5hbWVzIHB0L3B0bGVuL2N0IHJlYWxseSBqdXN0IG1lYW4gaW4vaW5sZW4vb3V0IGJ1dCB0aGlzIGlzIHRoZSB3YXkgSSB3cm90ZSBpdC4uLiAKKyAqLworCisvKioKKyAgIFNoYXJlZCBjb2RlIHRvIGZpbmlzaCBhbiBPQ0Igc3RyZWFtCisgICBAcGFyYW0gb2NiICAgIFRoZSBPQ0Igc3RhdGUKKyAgIEBwYXJhbSBwdCAgICAgVGhlIHJlbWFpbmluZyBwbGFpbnRleHQgW29yIGlucHV0XQorICAgQHBhcmFtIHB0bGVuICBUaGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCAob2N0ZXRzKQorICAgQHBhcmFtIGN0ICAgICBbb3V0XSBUaGUgb3V0cHV0IGJ1ZmZlcgorICAgQHBhcmFtIHRhZyAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gZm9yIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcKKyAgIEBwYXJhbSB0YWdsZW4gW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgYXV0aGVudGljYXRpb24gdGFnCisgICBAcGFyYW0gbW9kZSAgIFRoZSBtb2RlIHdlIGFyZSB0ZXJtaW5hdGluZywgMD09ZW5jcnlwdCwgMT09ZGVjcnlwdAorICAgQHJldHVybiAgICAgICBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHNfb2NiX2RvbmUob2NiX3N0YXRlICpvY2IsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBsb25nIHB0bGVuLAorICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyAqdGFnbGVuLCBpbnQgbW9kZSkKKworeworICAgdW5zaWduZWQgY2hhciAqWiwgKlksICpYOworICAgaW50IGVyciwgeDsKKworICAgTFRDX0FSR0NISyhvY2IgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHB0ICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyh0YWcgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHRhZ2xlbiAhPSBOVUxMKTsKKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKG9jYi0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBpZiAob2NiLT5ibG9ja19sZW4gIT0gY2lwaGVyX2Rlc2NyaXB0b3Jbb2NiLT5jaXBoZXJdLmJsb2NrX2xlbmd0aCB8fAorICAgICAgIChpbnQpcHRsZW4gPiBvY2ItPmJsb2NrX2xlbiB8fCAoaW50KXB0bGVuIDwgMCkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICAvKiBhbGxvY2F0ZSByYW0gKi8KKyAgIFogPSBYTUFMTE9DKE1BWEJMT0NLU0laRSk7CisgICBZID0gWE1BTExPQyhNQVhCTE9DS1NJWkUpOworICAgWCA9IFhNQUxMT0MoTUFYQkxPQ0tTSVpFKTsKKyAgIGlmIChYID09IE5VTEwgfHwgWSA9PSBOVUxMIHx8IFogPT0gTlVMTCkgeworICAgICAgaWYgKFggIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUoWCk7CisgICAgICB9CisgICAgICBpZiAoWSAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShZKTsKKyAgICAgIH0KKyAgICAgIGlmIChaICE9IE5VTEwpIHsKKyAgICAgICAgIFhGUkVFKFopOworICAgICAgfQorICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKworICAgLyogY29tcHV0ZSBYW21dID0gbGVuKHB0W21dKSBYT1IgTHIgWE9SIFpbbV0gKi8KKyAgIG9jYl9zaGlmdF94b3Iob2NiLCBYKTsgCisgICBYTUVNQ1BZKFosIFgsIG9jYi0+YmxvY2tfbGVuKTsKKworICAgWFtvY2ItPmJsb2NrX2xlbi0xXSBePSAocHRsZW4qOCkmMjU1OworICAgWFtvY2ItPmJsb2NrX2xlbi0yXSBePSAoKHB0bGVuKjgpPj44KSYyNTU7CisgICBmb3IgKHggPSAwOyB4IDwgb2NiLT5ibG9ja19sZW47IHgrKykgeworICAgICAgIFhbeF0gXj0gb2NiLT5Mclt4XTsgCisgICB9CisKKyAgIC8qIFlbbV0gPSBFKFhbbV0pKSAqLworICAgY2lwaGVyX2Rlc2NyaXB0b3Jbb2NiLT5jaXBoZXJdLmVjYl9lbmNyeXB0KFgsIFksICZvY2ItPmtleSk7CisKKyAgIGlmIChtb2RlID09IDEpIHsKKyAgICAgIC8qIGRlY3J5cHQgbW9kZSwgc28gbGV0J3MgeG9yIGl0IGZpcnN0ICovCisgICAgICAvKiB4b3IgQ1ttXSBpbnRvIGNoZWNrc3VtICovCisgICAgICBmb3IgKHggPSAwOyB4IDwgKGludClwdGxlbjsgeCsrKSB7CisgICAgICAgICBvY2ItPmNoZWNrc3VtW3hdIF49IGN0W3hdOworICAgICAgfSAgCisgICB9CisKKyAgIC8qIENbbV0gPSBQW21dIHhvciBZW21dICovCisgICBmb3IgKHggPSAwOyB4IDwgKGludClwdGxlbjsgeCsrKSB7CisgICAgICAgY3RbeF0gPSBwdFt4XSBeIFlbeF07CisgICB9CisKKyAgIGlmIChtb2RlID09IDApIHsKKyAgICAgIC8qIGVuY3J5cHQgbW9kZSAqLyAgICAKKyAgICAgIC8qIHhvciBDW21dIGludG8gY2hlY2tzdW0gKi8KKyAgICAgIGZvciAoeCA9IDA7IHggPCAoaW50KXB0bGVuOyB4KyspIHsKKyAgICAgICAgICBvY2ItPmNoZWNrc3VtW3hdIF49IGN0W3hdOworICAgICAgfQorICAgfQorCisgICAvKiB4b3IgWVttXSBhbmQgWlttXSBpbnRvIGNoZWNrc3VtICovCisgICBmb3IgKHggPSAwOyB4IDwgb2NiLT5ibG9ja19sZW47IHgrKykgeworICAgICAgIG9jYi0+Y2hlY2tzdW1beF0gXj0gWVt4XSBeIFpbeF07CisgICB9CisgICAKKyAgIC8qIGVuY3J5cHQgY2hlY2tzdW0sIGVyLi4uIHRhZyEhICovCisgICBjaXBoZXJfZGVzY3JpcHRvcltvY2ItPmNpcGhlcl0uZWNiX2VuY3J5cHQob2NiLT5jaGVja3N1bSwgWCwgJm9jYi0+a2V5KTsKKyAgIGNpcGhlcl9kZXNjcmlwdG9yW29jYi0+Y2lwaGVyXS5kb25lKCZvY2ItPmtleSk7CisKKyAgIC8qIG5vdyBzdG9yZSBpdCAqLworICAgZm9yICh4ID0gMDsgeCA8IG9jYi0+YmxvY2tfbGVuICYmIHggPCAoaW50KSp0YWdsZW47IHgrKykgeworICAgICAgIHRhZ1t4XSA9IFhbeF07CisgICB9CisgICAqdGFnbGVuID0geDsKKworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShYLCBNQVhCTE9DS1NJWkUpOworICAgemVyb21lbShZLCBNQVhCTE9DS1NJWkUpOworICAgemVyb21lbShaLCBNQVhCTE9DS1NJWkUpOworICAgemVyb21lbShvY2IsIHNpemVvZigqb2NiKSk7CisjZW5kaWYKKyAgIAorICAgWEZSRUUoWCk7CisgICBYRlJFRShZKTsKKyAgIFhGUkVFKFopOworCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9lbmNhdXRoL29jYi9zX29jYl9kb25lLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvaGFzaGVzL2NoYy9jaGMuYyBiL3NyYy9oYXNoZXMvY2hjL2NoYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjM5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaGFzaGVzL2NoYy9jaGMuYwpAQCAtMCwwICsxLDI5NyBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBjaGMuYworICBDSEMgc3VwcG9ydC4gKFRvbSBTdCBEZW5pcykKKyovCisKKyNpZmRlZiBDSENfSEFTSAorCisjZGVmaW5lIFVOREVGRURfSEFTSCAgLTE3CisKKy8qIGNoYyBzZXR0aW5ncyAqLworc3RhdGljIGludCAgICAgICAgICAgIGNpcGhlcl9pZHg9VU5ERUZFRF9IQVNILCAgICAgICAgLyogd2hpY2ggY2lwaGVyICovCisgICAgICAgICAgICAgICAgICAgICAgY2lwaGVyX2Jsb2Nrc2l6ZTsgICAgICAgICAgICAgICAvKiBibG9ja3NpemUgb2YgY2lwaGVyICovCisKKworY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3IgY2hjX2Rlc2MgPSB7CisgICAiY2hjX2hhc2giLCAxMiwgMCwgMCwgeyAwIH0sIDAsCisgICAmY2hjX2luaXQsCisgICAmY2hjX3Byb2Nlc3MsCisgICAmY2hjX2RvbmUsCisgICAmY2hjX3Rlc3QKK307CisKKy8qKgorICBJbml0aWFsaXplIHRoZSBDSEMgc3RhdGUgd2l0aCBhIGdpdmVuIGNpcGhlciAKKyAgQHBhcmFtIGNpcGhlciAgVGhlIGluZGV4IG9mIHRoZSBjaXBoZXIgeW91IHdpc2ggdG8gYmluZCAKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGNoY19yZWdpc3RlcihpbnQgY2lwaGVyKQoreworICAgaW50IGVyciwga2wsIGlkeDsKKworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIC8qIHdpbGwgaXQgYmUgdmFsaWQ/ICovCisgICBrbCA9IGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uYmxvY2tfbGVuZ3RoOworCisgICAvKiBtdXN0IGJlID42NCBiaXQgYmxvY2sgKi8KKyAgIGlmIChrbCA8PSA4KSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9DSVBIRVI7CisgICB9CisKKyAgIC8qIGNhbiB3ZSB1c2UgdGhlIGlkZWFsIGtleXNpemU/ICovCisgICBpZiAoKGVyciA9IGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0ua2V5c2l6ZSgma2wpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIC8qIHdlIHJlcXVpcmUgdGhhdCBrZXkgc2l6ZSA9PSBibG9jayBzaXplIGJlIGEgdmFsaWQgY2hvaWNlICovCisgICBpZiAoa2wgIT0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5ibG9ja19sZW5ndGgpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0NJUEhFUjsKKyAgIH0KKworICAgLyogZGV0ZXJtaW5lIGlmIGNoY19oYXNoIGhhcyBiZWVuIHJlZ2lzdGVyX2hhc2gnZWQgYWxyZWFkeSAqLworICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGlkeCA9IGZpbmRfaGFzaCgiY2hjX2hhc2giKSkpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICAvKiBzdG9yZSBpbnRvIGRlc2NyaXB0b3IgKi8KKyAgIGhhc2hfZGVzY3JpcHRvcltpZHhdLmhhc2hzaXplICA9IAorICAgaGFzaF9kZXNjcmlwdG9yW2lkeF0uYmxvY2tzaXplID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5ibG9ja19sZW5ndGg7CisKKyAgIC8qIHN0b3JlIHRoZSBpZHggYW5kIGJsb2NrIHNpemUgKi8KKyAgIGNpcGhlcl9pZHggICAgICAgPSBjaXBoZXI7CisgICBjaXBoZXJfYmxvY2tzaXplID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5ibG9ja19sZW5ndGg7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKy8qKgorICAgSW5pdGlhbGl6ZSB0aGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG1kICAgVGhlIGhhc2ggc3RhdGUgeW91IHdpc2ggdG8gaW5pdGlhbGl6ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGNoY19pbml0KGhhc2hfc3RhdGUgKm1kKQoreworICAgc3ltbWV0cmljX2tleSAqa2V5OworICAgdW5zaWduZWQgY2hhciAgYnVmW01BWEJMT0NLU0laRV07CisgICBpbnQgICAgICAgICAgICBlcnI7CisgCisgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOworCisgICAvKiBpcyB0aGUgY2lwaGVyIHZhbGlkPyAqLworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyX2lkeCkpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICBpZiAoY2lwaGVyX2Jsb2Nrc2l6ZSAhPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJfaWR4XS5ibG9ja19sZW5ndGgpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0NJUEhFUjsKKyAgIH0KKworICAgaWYgKChrZXkgPSBYTUFMTE9DKHNpemVvZigqa2V5KSkpID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKKyAgIC8qIHplcm8ga2V5IGFuZCB3aGF0IG5vdCAqLyAgIAorICAgemVyb21lbShidWYsIGNpcGhlcl9ibG9ja3NpemUpOworICAgaWYgKChlcnIgPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJfaWR4XS5zZXR1cChidWYsIGNpcGhlcl9ibG9ja3NpemUsIDAsIGtleSkpICE9IENSWVBUX09LKSB7CisgICAgICBYRlJFRShrZXkpOworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogZW5jcnlwdCB6ZXJvIGJsb2NrICovCisgICBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJfaWR4XS5lY2JfZW5jcnlwdChidWYsIG1kLT5jaGMuc3RhdGUsIGtleSk7CisKKyAgIC8qIHplcm8gb3RoZXIgbWVtYmVycyAqLworICAgbWQtPmNoYy5sZW5ndGggPSAwOworICAgbWQtPmNoYy5jdXJsZW4gPSAwOworICAgemVyb21lbShtZC0+Y2hjLmJ1Ziwgc2l6ZW9mKG1kLT5jaGMuYnVmKSk7CisgICBYRlJFRShrZXkpOworICAgcmV0dXJuIENSWVBUX09LOworfQorCisvKiAKKyAgIGtleSAgICA8PSBzdGF0ZQorICAgVDAsVDEgIDw9IGJsb2NrCisgICBUMCAgICAgPD0gZW5jcnlwdCBUMAorICAgc3RhdGUgIDw9IHN0YXRlIHhvciBUMCB4b3IgVDEKKyovCitzdGF0aWMgaW50IGNoY19jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQoreworICAgdW5zaWduZWQgY2hhciAgVFsyXVtNQVhCTE9DS1NJWkVdOworICAgc3ltbWV0cmljX2tleSAqa2V5OworICAgaW50ICAgICAgICAgICAgZXJyLCB4OworCisgICBpZiAoKGtleSA9IFhNQUxMT0Moc2l6ZW9mKCprZXkpKSkgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKyAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyX2lkeF0uc2V0dXAobWQtPmNoYy5zdGF0ZSwgY2lwaGVyX2Jsb2Nrc2l6ZSwgMCwga2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIFhGUkVFKGtleSk7CisgICAgICByZXR1cm4gZXJyOworICAgfQorICAgbWVtY3B5KFRbMV0sIGJ1ZiwgY2lwaGVyX2Jsb2Nrc2l6ZSk7CisgICBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJfaWR4XS5lY2JfZW5jcnlwdChidWYsIFRbMF0sIGtleSk7CisgICBmb3IgKHggPSAwOyB4IDwgY2lwaGVyX2Jsb2Nrc2l6ZTsgeCsrKSB7CisgICAgICAgbWQtPmNoYy5zdGF0ZVt4XSBePSBUWzBdW3hdIF4gVFsxXVt4XTsKKyAgIH0KKyAgIFhGUkVFKGtleSk7CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKFQsIHNpemVvZihUKSk7CisgICB6ZXJvbWVtKCZrZXksIHNpemVvZihrZXkpKTsKKyNlbmRpZgorICAgcmV0dXJuIENSWVBUX09LOworfQorCisvKiBmdW5jdGlvbiBmb3IgcHJvY2Vzc2luZyBibG9ja3MgKi8KK2ludCBfY2hjX3Byb2Nlc3MoaGFzaF9zdGF0ZSAqIG1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK0hBU0hfUFJPQ0VTUyhfY2hjX3Byb2Nlc3MsIGNoY19jb21wcmVzcywgY2hjLCAodW5zaWduZWQgbG9uZyljaXBoZXJfYmxvY2tzaXplKQorCisvKioKKyAgIFByb2Nlc3MgYSBibG9jayBvZiBtZW1vcnkgdGhvdWdoIHRoZSBoYXNoCisgICBAcGFyYW0gbWQgICBUaGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIGluICAgVGhlIGRhdGEgdG8gaGFzaAorICAgQHBhcmFtIGlubGVuICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIChvY3RldHMpCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgY2hjX3Byb2Nlc3MoaGFzaF9zdGF0ZSAqIG1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbikKK3sKKyAgIGludCBlcnI7CisKKyAgIExUQ19BUkdDSEsobWQgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoaW4gICE9IE5VTEwpOworCisgICAvKiBpcyB0aGUgY2lwaGVyIHZhbGlkPyAqLworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyX2lkeCkpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorICAgaWYgKGNpcGhlcl9ibG9ja3NpemUgIT0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyX2lkeF0uYmxvY2tfbGVuZ3RoKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9DSVBIRVI7CisgICB9CisKKyAgIHJldHVybiBfY2hjX3Byb2Nlc3MobWQsIGluLCBpbmxlbik7Cit9CisKKy8qKgorICAgVGVybWluYXRlIHRoZSBoYXNoIHRvIGdldCB0aGUgZGlnZXN0CisgICBAcGFyYW0gbWQgICBUaGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG91dCBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGhhc2ggKGxlbmd0aCBvZiB0aGUgYmxvY2sgc2l6ZSBvZiB0aGUgYmxvY2sgY2lwaGVyKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGNoY19kb25lKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpvdXQpCit7CisgICAgaW50IGVycjsKKworICAgIExUQ19BUkdDSEsobWQgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG91dCAgIT0gTlVMTCk7CisKKyAgICAvKiBpcyB0aGUgY2lwaGVyIHZhbGlkPyAqLworICAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNpcGhlcl9pZHgpKSAhPSBDUllQVF9PSykgeworICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmIChjaXBoZXJfYmxvY2tzaXplICE9IGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl9pZHhdLmJsb2NrX2xlbmd0aCkgeworICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0NJUEhFUjsKKyAgICB9CisKKyAgICBpZiAobWQtPmNoYy5jdXJsZW4gPj0gc2l6ZW9mKG1kLT5jaGMuYnVmKSkgeworICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgICB9CisKKyAgICAvKiBpbmNyZWFzZSB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlICovCisgICAgbWQtPmNoYy5sZW5ndGggKz0gbWQtPmNoYy5jdXJsZW4gKiA4OworCisgICAgLyogYXBwZW5kIHRoZSAnMScgYml0ICovCisgICAgbWQtPmNoYy5idWZbbWQtPmNoYy5jdXJsZW4rK10gPSAodW5zaWduZWQgY2hhcikweDgwOworCisgICAgLyogaWYgdGhlIGxlbmd0aCBpcyBjdXJyZW50bHkgYWJvdmUgbC04IGJ5dGVzIHdlIGFwcGVuZCB6ZXJvcworICAgICAqIHRoZW4gY29tcHJlc3MuICBUaGVuIHdlIGNhbiBmYWxsIGJhY2sgdG8gcGFkZGluZyB6ZXJvcyBhbmQgbGVuZ3RoCisgICAgICogZW5jb2RpbmcgbGlrZSBub3JtYWwuCisgICAgICovCisgICAgaWYgKG1kLT5jaGMuY3VybGVuID4gKHVuc2lnbmVkIGxvbmcpKGNpcGhlcl9ibG9ja3NpemUgLSA4KSkgeworICAgICAgICB3aGlsZSAobWQtPmNoYy5jdXJsZW4gPCAodW5zaWduZWQgbG9uZyljaXBoZXJfYmxvY2tzaXplKSB7CisgICAgICAgICAgICBtZC0+Y2hjLmJ1ZlttZC0+Y2hjLmN1cmxlbisrXSA9ICh1bnNpZ25lZCBjaGFyKTA7CisgICAgICAgIH0KKyAgICAgICAgY2hjX2NvbXByZXNzKG1kLCBtZC0+Y2hjLmJ1Zik7CisgICAgICAgIG1kLT5jaGMuY3VybGVuID0gMDsKKyAgICB9CisKKyAgICAvKiBwYWQgdXB0byBsLTggYnl0ZXMgb2YgemVyb2VzICovCisgICAgd2hpbGUgKG1kLT5jaGMuY3VybGVuIDwgKHVuc2lnbmVkIGxvbmcpKGNpcGhlcl9ibG9ja3NpemUgLSA4KSkgeworICAgICAgICBtZC0+Y2hjLmJ1ZlttZC0+Y2hjLmN1cmxlbisrXSA9ICh1bnNpZ25lZCBjaGFyKTA7CisgICAgfQorCisgICAgLyogc3RvcmUgbGVuZ3RoICovCisgICAgU1RPUkU2NEwobWQtPmNoYy5sZW5ndGgsIG1kLT5jaGMuYnVmKyhjaXBoZXJfYmxvY2tzaXplLTgpKTsKKyAgICBjaGNfY29tcHJlc3MobWQsIG1kLT5jaGMuYnVmKTsKKworICAgIC8qIGNvcHkgb3V0cHV0ICovCisgICAgWE1FTUNQWShvdXQsIG1kLT5jaGMuc3RhdGUsIGNpcGhlcl9ibG9ja3NpemUpOworCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICAgemVyb21lbShtZCwgc2l6ZW9mKGhhc2hfc3RhdGUpKTsKKyNlbmRpZgorICAgIHJldHVybiBDUllQVF9PSzsKK30KKworLyoqCisgIFNlbGYtdGVzdCB0aGUgaGFzaAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3RzIGhhdmUgYmVlbiBkaXNhYmxlZAorKi8gIAoraW50IGNoY190ZXN0KHZvaWQpCit7CisgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgIHVuc2lnbmVkIGNoYXIgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgIG1kW01BWEJMT0NLU0laRV07CisgICAgICBpbnQgICAgICAgICAgICBsZW47CisgICB9IHRlc3RzW10gPSB7Cit7CisgICAodW5zaWduZWQgY2hhciAqKSJoZWxsbyB3b3JsZCIsCisgICB7IDB4Y2YsIDB4NTcsIDB4OWQsIDB4YzMsIDB4MGEsIDB4MGUsIDB4ZWEsIDB4NjEsIAorICAgICAweDBkLCAweDU0LCAweDQ3LCAweGM0LCAweDNjLCAweDA2LCAweGY1LCAweDRlIH0sCisgICAxNgorfQorfTsKKyAgIGludCB4LCBvbGRoYXNoaWR4LCBpZHg7CisgICB1bnNpZ25lZCBjaGFyIG91dFtNQVhCTE9DS1NJWkVdOworICAgaGFzaF9zdGF0ZSBtZDsKKworICAgLyogQUVTIGNhbiBiZSB1bmRlciByaWpuZGFlbCBvciBhZXMuLi4gdHJ5IHRvIGZpbmQgaXQgKi8KKyAgIGlmICgoaWR4ID0gZmluZF9jaXBoZXIoImFlcyIpKSA9PSAtMSkgeworICAgICAgaWYgKChpZHggPSBmaW5kX2NpcGhlcigicmlqbmRhZWwiKSkgPT0gLTEpIHsKKyAgICAgICAgIHJldHVybiBDUllQVF9OT1A7CisgICAgICB9CisgICB9CisgICBvbGRoYXNoaWR4ID0gY2lwaGVyX2lkeDsKKyAgIGNoY19yZWdpc3RlcihpZHgpOworCisgICBmb3IgKHggPSAwOyB4IDwgKGludCkoc2l6ZW9mKHRlc3RzKS9zaXplb2YodGVzdHNbMF0pKTsgeCsrKSB7CisgICAgICAgY2hjX2luaXQoJm1kKTsKKyAgICAgICBjaGNfcHJvY2VzcygmbWQsIHRlc3RzW3hdLm1zZywgc3RybGVuKChjaGFyICopdGVzdHNbeF0ubXNnKSk7CisgICAgICAgY2hjX2RvbmUoJm1kLCBvdXQpOworICAgICAgIGlmIChtZW1jbXAob3V0LCB0ZXN0c1t4XS5tZCwgdGVzdHNbeF0ubGVuKSkgeworICAgICAgICAgIHJldHVybiBDUllQVF9GQUlMX1RFU1RWRUNUT1I7CisgICAgICAgfQorICAgfQorICAgaWYgKG9sZGhhc2hpZHggIT0gVU5ERUZFRF9IQVNIKSB7CisgICAgICBjaGNfcmVnaXN0ZXIob2xkaGFzaGlkeCk7CisgICB9CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oYXNoZXMvY2hjL2NoYy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2hhc2hlcy9oZWxwZXIvaGFzaF9maWxlLmMgYi9zcmMvaGFzaGVzL2hlbHBlci9oYXNoX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGY3MjZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2hhc2hlcy9oZWxwZXIvaGFzaF9maWxlLmMKQEAgLTAsMCArMSw1NyBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKiogCisgIEBmaWxlIGhhc2hfZmlsZS5jCisgIEhhc2ggYSBmaWxlLCBUb20gU3QgRGVuaXMKKyovCisKKy8qKgorICBAcGFyYW0gaGFzaCAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCBkZXNpcmVkCisgIEBwYXJhbSBmbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGZpbGUgeW91IHdpc2ggdG8gaGFzaAorICBAcGFyYW0gb3V0ICAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgZGlnZXN0CisgIEBwYXJhbSBvdXRsZW4gW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgbWVzc2FnZSBkaWdlc3QKKyAgQHJlc3VsdCBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGhhc2hfZmlsZShpbnQgaGFzaCwgY29uc3QgY2hhciAqZm5hbWUsIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworI2lmZGVmIExUQ19OT19GSUxFCisgICAgcmV0dXJuIENSWVBUX05PUDsKKyNlbHNlCisgICAgRklMRSAqaW47CisgICAgaW50IGVycjsKKyAgICBMVENfQVJHQ0hLKGZuYW1lICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKworICAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbiA9IGZvcGVuKGZuYW1lLCAicmIiKTsKKyAgICBpZiAoaW4gPT0gTlVMTCkgeyAKKyAgICAgICByZXR1cm4gQ1JZUFRfRklMRV9OT1RGT1VORDsKKyAgICB9CisKKyAgICBlcnIgPSBoYXNoX2ZpbGVoYW5kbGUoaGFzaCwgaW4sIG91dCwgb3V0bGVuKTsKKyAgICBpZiAoZmNsb3NlKGluKSAhPSAwKSB7CisgICAgICAgcmV0dXJuIENSWVBUX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBlcnI7CisjZW5kaWYKK30KKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvaGFzaGVzL2hlbHBlci9oYXNoX2ZpbGUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9oYXNoZXMvaGVscGVyL2hhc2hfZmlsZWhhbmRsZS5jIGIvc3JjL2hhc2hlcy9oZWxwZXIvaGFzaF9maWxlaGFuZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxZWY4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9oYXNoZXMvaGVscGVyL2hhc2hfZmlsZWhhbmRsZS5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBoYXNoX2ZpbGVoYW5kbGUuYworICAgSGFzaCBvcGVuIGZpbGVzLCBUb20gU3QgRGVuaXMKKyovCisKKy8qKiAKKyAgSGFzaCBkYXRhIGZyb20gYW4gb3BlbiBmaWxlIGhhbmRsZS4gIAorICBAcGFyYW0gaGFzaCAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCB5b3Ugd2FudCB0byB1c2UKKyAgQHBhcmFtIGluICAgICBUaGUgRklMRSogaGFuZGxlIG9mIHRoZSBmaWxlIHlvdSB3YW50IHRvIGhhc2gKKyAgQHBhcmFtIG91dCAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGRpZ2VzdAorICBAcGFyYW0gb3V0bGVuIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIGRpZ2VzdAorICBAcmVzdWx0IENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwgICAKKyovCitpbnQgaGFzaF9maWxlaGFuZGxlKGludCBoYXNoLCBGSUxFICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisjaWZkZWYgTFRDX05PX0ZJTEUKKyAgICByZXR1cm4gQ1JZUFRfTk9QOworI2Vsc2UKKyAgICBoYXNoX3N0YXRlIG1kOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzUxMl07CisgICAgc2l6ZV90IHg7CisgICAgaW50IGVycjsKKworICAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoaW4gICAgICE9IE5VTEwpOworCisgICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGhhc2gpKSAhPSBDUllQVF9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgqb3V0bGVuIDwgaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplKSB7CisgICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgICB9CisgICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uaW5pdCgmbWQpKSAhPSBDUllQVF9PSykgeworICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKm91dGxlbiA9IGhhc2hfZGVzY3JpcHRvcltoYXNoXS5oYXNoc2l6ZTsKKyAgICBkbyB7CisgICAgICAgIHggPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBpbik7CisgICAgICAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLnByb2Nlc3MoJm1kLCBidWYsIHgpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfSB3aGlsZSAoeCA9PSBzaXplb2YoYnVmKSk7CisgICAgZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmRvbmUoJm1kLCBvdXQpOworCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICAgemVyb21lbShidWYsIHNpemVvZihidWYpKTsKKyNlbmRpZgorICAgIHJldHVybiBlcnI7CisjZW5kaWYKK30KKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvaGFzaGVzL2hlbHBlci9oYXNoX2ZpbGVoYW5kbGUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9oYXNoZXMvaGVscGVyL2hhc2hfbWVtb3J5LmMgYi9zcmMvaGFzaGVzL2hlbHBlci9oYXNoX21lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODQ5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaGFzaGVzL2hlbHBlci9oYXNoX21lbW9yeS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGhhc2hfbWVtb3J5LmMKKyAgSGFzaCBtZW1vcnkgaGVscGVyLCBUb20gU3QgRGVuaXMKKyovCisKKy8qKgorICBIYXNoIGEgYmxvY2sgb2YgbWVtb3J5IGFuZCBzdG9yZSB0aGUgZGlnZXN0LgorICBAcGFyYW0gaGFzaCAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCB5b3Ugd2lzaCB0byB1c2UKKyAgQHBhcmFtIGluICAgICBUaGUgZGF0YSB5b3Ugd2lzaCB0byBoYXNoCisgIEBwYXJhbSBpbmxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBoYXNoIChvY3RldHMpCisgIEBwYXJhbSBvdXQgICAgW291dF0gV2hlcmUgdG8gc3RvcmUgdGhlIGRpZ2VzdAorICBAcGFyYW0gb3V0bGVuIFtpbi9vdXRdIE1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgZGlnZXN0CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBoYXNoX21lbW9yeShpbnQgaGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworICAgIGhhc2hfc3RhdGUgKm1kOworICAgIGludCBlcnI7CisKKyAgICBMVENfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKworICAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKm91dGxlbiA8IGhhc2hfZGVzY3JpcHRvcltoYXNoXS5oYXNoc2l6ZSkgeworICAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgbWQgPSBYTUFMTE9DKHNpemVvZihoYXNoX3N0YXRlKSk7CisgICAgaWYgKG1kID09IE5VTEwpIHsKKyAgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgIH0KKworICAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmluaXQobWQpKSAhPSBDUllQVF9PSykgeworICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICB9CisgICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0ucHJvY2VzcyhtZCwgaW4sIGlubGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICBnb3RvIExCTF9FUlI7CisgICAgfQorICAgIGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoXS5kb25lKG1kLCBvdXQpOworICAgICpvdXRsZW4gPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uaGFzaHNpemU7CitMQkxfRVJSOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgIHplcm9tZW0obWQsIHNpemVvZihoYXNoX3N0YXRlKSk7CisjZW5kaWYKKyAgICBYRlJFRShtZCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvaGFzaGVzL2hlbHBlci9oYXNoX21lbW9yeS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2hhc2hlcy9oZWxwZXIvaGFzaF9tZW1vcnlfbXVsdGkuYyBiL3NyYy9oYXNoZXMvaGVscGVyL2hhc2hfbWVtb3J5X211bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjYjhlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9oYXNoZXMvaGVscGVyL2hhc2hfbWVtb3J5X211bHRpLmMKQEAgLTAsMCArMSw4NiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorLyoqCisgIEBmaWxlIGhhc2hfbWVtb3J5X211bHRpLmMKKyAgSGFzaCAobXVsdGlwbGUgYnVmZmVycykgbWVtb3J5IGhlbHBlciwgVG9tIFN0IERlbmlzCisqLworCisvKioKKyAgSGFzaCBtdWx0aXBsZSAobm9uLWFkamFjZW50KSBibG9ja3Mgb2YgbWVtb3J5IGF0IG9uY2UuICAKKyAgQHBhcmFtIGhhc2ggICBUaGUgaW5kZXggb2YgdGhlIGhhc2ggeW91IHdpc2ggdG8gdXNlCisgIEBwYXJhbSBvdXQgICAgW291dF0gV2hlcmUgdG8gc3RvcmUgdGhlIGRpZ2VzdAorICBAcGFyYW0gb3V0bGVuIFtpbi9vdXRdIE1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgZGlnZXN0CisgIEBwYXJhbSBpbiAgICAgVGhlIGRhdGEgeW91IHdpc2ggdG8gaGFzaAorICBAcGFyYW0gaW5sZW4gIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gaGFzaCAob2N0ZXRzKQorICBAcGFyYW0gLi4uICAgIHR1cGxlcyBvZiAoZGF0YSxsZW4pIHBhaXJzIHRvIGhhc2gsIHRlcm1pbmF0ZWQgd2l0aCBhIChOVUxMLHgpICh4PWRvbid0IGNhcmUpCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8gIAoraW50IGhhc2hfbWVtb3J5X211bHRpKGludCBoYXNoLCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgLi4uKQoreworICAgIGhhc2hfc3RhdGUgICAgICAgICAgKm1kOworICAgIGludCAgICAgICAgICAgICAgICAgIGVycjsKKyAgICB2YV9saXN0ICAgICAgICAgICAgICBhcmdzOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN1cnB0cjsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICBjdXJsZW47CisKKyAgICBMVENfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKworICAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKm91dGxlbiA8IGhhc2hfZGVzY3JpcHRvcltoYXNoXS5oYXNoc2l6ZSkgeworICAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgfQorCisgICAgbWQgPSBYTUFMTE9DKHNpemVvZihoYXNoX3N0YXRlKSk7CisgICAgaWYgKG1kID09IE5VTEwpIHsKKyAgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgIH0KKworICAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmluaXQobWQpKSAhPSBDUllQVF9PSykgeworICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICB9CisKKyAgICB2YV9zdGFydChhcmdzLCBpbmxlbik7CisgICAgY3VycHRyID0gaW47IAorICAgIGN1cmxlbiA9IGlubGVuOworICAgIGZvciAoOzspIHsKKyAgICAgICAvKiBwcm9jZXNzIGJ1ZiAqLworICAgICAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLnByb2Nlc3MobWQsIGN1cnB0ciwgY3VybGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgfQorICAgICAgIC8qIHN0ZXAgdG8gbmV4dCAqLworICAgICAgIGN1cnB0ciA9IHZhX2FyZyhhcmdzLCBjb25zdCB1bnNpZ25lZCBjaGFyKik7CisgICAgICAgaWYgKGN1cnB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgIGN1cmxlbiA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKyAgICB9CisgICAgZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmRvbmUobWQsIG91dCk7CisgICAgKm91dGxlbiA9IGhhc2hfZGVzY3JpcHRvcltoYXNoXS5oYXNoc2l6ZTsKK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICAgemVyb21lbShtZCwgc2l6ZW9mKGhhc2hfc3RhdGUpKTsKKyNlbmRpZgorICAgIFhGUkVFKG1kKTsKKyAgICB2YV9lbmQoYXJncyk7CisgICAgcmV0dXJuIGVycjsKK30KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hhc2hlcy9oZWxwZXIvaGFzaF9tZW1vcnlfbXVsdGkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL21kMi5jIGIvc3JjL2hhc2hlcy9tZDIuYwpzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSBtZDIuYwpyZW5hbWUgdG8gc3JjL2hhc2hlcy9tZDIuYwppbmRleCBlNjBiOTk1Li5kYjYwZmJkIDEwMDY0NAotLS0gYS9tZDIuYworKysgYi9zcmMvaGFzaGVzL21kMi5jCkBAIC02LDI1ICs2LDI3IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLS8qIE1EMiAoUkZDIDEzMTkpIGhhc2ggZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQHBhcmFtIG1kMi5jCisgICBNRDIgKFJGQyAxMzE5KSBoYXNoIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uIGJ5IFRvbSBTdCBEZW5pcyAKKyovCiAKICNpZmRlZiBNRDIKIAotY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3IgbWQyX2Rlc2MgPQorY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3IgbWQyX2Rlc2MgPQogewogICAgICJtZDIiLAogICAgIDcsCiAgICAgMTYsCiAgICAgMTYsCiAKLSAgICAvKiBERVIgZW5jb2RpbmcgKi8KLSAgICB7IDB4MzAsIDB4MjAsIDB4MzAsIDB4MEMsIDB4MDYsIDB4MDgsIDB4MkEsIDB4ODYsIAotICAgICAgMHg0OCwgMHg4NiwgMHhGNywgMHgwRCwgMHgwMiwgMHgwMiwgMHgwNSwgMHgwMCwgCi0gICAgICAweDA0LCAweDEwIH0sCi0gICAgMTgsCisgICAgLyogT0lEICovCisgICB7IDEsIDIsIDg0MCwgMTEzNTQ5LCAyLCAyLCAgfSwKKyAgIDYsCiAKICAgICAmbWQyX2luaXQsCiAgICAgJm1kMl9wcm9jZXNzLApAQCAtOTAsMzEgKzkyLDQ0IEBACiAgICB9CiB9CiAKLXZvaWQgbWQyX2luaXQoaGFzaF9zdGF0ZSAqbWQpCisvKioKKyAgIEluaXRpYWxpemUgdGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBtZCAgIFRoZSBoYXNoIHN0YXRlIHlvdSB3aXNoIHRvIGluaXRpYWxpemUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBtZDJfaW5pdChoYXNoX3N0YXRlICptZCkKIHsKLSAgIF9BUkdDSEsobWQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOwogCiAgICAvKiBNRDIgdXNlcyBhIHplcm8nZWQgc3RhdGUuLi4gKi8KICAgIHplcm9tZW0obWQtPm1kMi5YLCBzaXplb2YobWQtPm1kMi5YKSk7CiAgICB6ZXJvbWVtKG1kLT5tZDIuY2hrc3VtLCBzaXplb2YobWQtPm1kMi5jaGtzdW0pKTsKICAgIHplcm9tZW0obWQtPm1kMi5idWYsIHNpemVvZihtZC0+bWQyLmJ1ZikpOwogICAgbWQtPm1kMi5jdXJsZW4gPSAwOworICAgcmV0dXJuIENSWVBUX09LOwogfQogCi1pbnQgbWQyX3Byb2Nlc3MoaGFzaF9zdGF0ZSAqbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4pCisvKioKKyAgIFByb2Nlc3MgYSBibG9jayBvZiBtZW1vcnkgdGhvdWdoIHRoZSBoYXNoCisgICBAcGFyYW0gbWQgICAgIFRoZSBoYXNoIHN0YXRlCisgICBAcGFyYW0gaW4gICAgIFRoZSBkYXRhIHRvIGhhc2gKKyAgIEBwYXJhbSBpbmxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAob2N0ZXRzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IG1kMl9wcm9jZXNzKGhhc2hfc3RhdGUgKm1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbikKIHsKICAgICB1bnNpZ25lZCBsb25nIG47Ci0gICAgX0FSR0NISyhtZCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGJ1ZiAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoaW4gIT0gTlVMTCk7CiAgICAgaWYgKG1kLT4gbWQyIC5jdXJsZW4gPiBzaXplb2YobWQtPiBtZDIgLmJ1ZikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgICAgIG4gPSBNSU4obGVuLCAoMTYgLSBtZC0+bWQyLmN1cmxlbikpOwotICAgICAgICBtZW1jcHkobWQtPm1kMi5idWYgKyBtZC0+bWQyLmN1cmxlbiwgYnVmLCAoc2l6ZV90KW4pOworICAgIHdoaWxlIChpbmxlbiA+IDApIHsKKyAgICAgICAgbiA9IE1JTihpbmxlbiwgKDE2IC0gbWQtPm1kMi5jdXJsZW4pKTsKKyAgICAgICAgWE1FTUNQWShtZC0+bWQyLmJ1ZiArIG1kLT5tZDIuY3VybGVuLCBpbiwgKHNpemVfdCluKTsKICAgICAgICAgbWQtPm1kMi5jdXJsZW4gKz0gbjsKLSAgICAgICAgYnVmICAgICAgICAgICAgKz0gbjsKLSAgICAgICAgbGVuICAgICAgICAgICAgLT0gbjsKKyAgICAgICAgaW4gICAgICAgICAgICAgKz0gbjsKKyAgICAgICAgaW5sZW4gICAgICAgICAgLT0gbjsKIAogICAgICAgICAvKiBpcyAxNiBieXRlcyBmdWxsPyAqLwogICAgICAgICBpZiAobWQtPm1kMi5jdXJsZW4gPT0gMTYpIHsKQEAgLTEyNiwxMiArMTQxLDE4IEBACiAgICAgcmV0dXJuIENSWVBUX09LOwogfQogCi1pbnQgbWQyX2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKQorLyoqCisgICBUZXJtaW5hdGUgdGhlIGhhc2ggdG8gZ2V0IHRoZSBkaWdlc3QKKyAgIEBwYXJhbSBtZCAgVGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBvdXQgW291dF0gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBoYXNoICgxNiBieXRlcykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBtZDJfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKm91dCkKIHsKICAgICB1bnNpZ25lZCBsb25nIGksIGs7CiAKLSAgICBfQVJHQ0hLKG1kICE9IE5VTEwpOwotICAgIF9BUkdDSEsoaGFzaCAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG1kICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG91dCAhPSBOVUxMKTsKIAogICAgIGlmIChtZC0+bWQyLmN1cmxlbiA+PSBzaXplb2YobWQtPm1kMi5idWYpKSB7CiAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOwpAQCAtMTQ5LDE4ICsxNzAsMjIgQEAKICAgICBtZDJfdXBkYXRlX2Noa3N1bShtZCk7CiAKICAgICAvKiBoYXNoIGNoZWNrc3VtICovCi0gICAgbWVtY3B5KG1kLT5tZDIuYnVmLCBtZC0+bWQyLmNoa3N1bSwgMTYpOworICAgIFhNRU1DUFkobWQtPm1kMi5idWYsIG1kLT5tZDIuY2hrc3VtLCAxNik7CiAgICAgbWQyX2NvbXByZXNzKG1kKTsKIAogICAgIC8qIG91dHB1dCBpcyBsb3dlciAxNiBieXRlcyBvZiBYICovCi0gICAgbWVtY3B5KGhhc2gsIG1kLT5tZDIuWCwgMTYpOworICAgIFhNRU1DUFkob3V0LCBtZC0+bWQyLlgsIDE2KTsKIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICAgemVyb21lbShtZCwgc2l6ZW9mKGhhc2hfc3RhdGUpKTsKICNlbmRpZgogICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAorLyoqCisgIFNlbGYtdGVzdCB0aGUgaGFzaAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3RzIGhhdmUgYmVlbiBkaXNhYmxlZAorKi8gIAogaW50IG1kMl90ZXN0KHZvaWQpCiB7CiAgI2lmbmRlZiBMVENfVEVTVApAQCAtMjE5LDMgKzI0NCw3IEBACiAKICNlbmRpZgogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oYXNoZXMvbWQyLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8yMyAwMjo0MjowNyAkICovCmRpZmYgLS1naXQgYS9tZDQuYyBiL3NyYy9oYXNoZXMvbWQ0LmMKc2ltaWxhcml0eSBpbmRleCA4MSUKcmVuYW1lIGZyb20gbWQ0LmMKcmVuYW1lIHRvIHNyYy9oYXNoZXMvbWQ0LmMKaW5kZXggNWMyZWExMS4uMTdlZjM1ZSAxMDA2NDQKLS0tIGEvbWQ0LmMKKysrIGIvc3JjL2hhc2hlcy9tZDQuYwpAQCAtNiwyMyArNiwyNyBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCi0vKiBTdWJtaXR0ZWQgYnkgRG9iZXMgVmFuZGVybWVlciAgKGRvYmVzQHNtYXJ0dC5jb20pICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQHBhcmFtIG1kNC5jCisgICBTdWJtaXR0ZWQgYnkgRG9iZXMgVmFuZGVybWVlciAgKGRvYmVzQHNtYXJ0dC5jb20pIAorKi8KIAogI2lmZGVmIE1ENAogCi1jb25zdCBzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvciBtZDRfZGVzYyA9Citjb25zdCBzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvciBtZDRfZGVzYyA9CiB7CiAgICAgIm1kNCIsCiAgICAgNiwKICAgICAxNiwKICAgICA2NCwKICAKLSAgICAvKiBERVIgZW5jb2RpbmcgKG5vdCB5ZXQgc3VwcG9ydGVkKSAqLwotICAgIHsgMHgwMCB9LAotICAgIDAsICAgIAorICAgIC8qIE9JRCAqLworICAgeyAxLCAyLCA4NDAsIDExMzU0OSwgMiwgNCwgIH0sCisgICA2LAogCiAgICAgJm1kNF9pbml0LAogICAgICZtZDRfcHJvY2VzcywKQEAgLTQ5LDcgKzUzLDcgQEAKICNkZWZpbmUgSCh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQogCiAvKiBST1RBVEVfTEVGVCByb3RhdGVzIHggbGVmdCBuIGJpdHMuICovCi0jZGVmaW5lIFJPVEFURV9MRUZUKHgsIG4pIFJPTCh4LCBuKQorI2RlZmluZSBST1RBVEVfTEVGVCh4LCBuKSBST0xjKHgsIG4pCiAKIC8qIEZGLCBHRyBhbmQgSEggYXJlIHRyYW5zZm9ybWF0aW9ucyBmb3Igcm91bmRzIDEsIDIgYW5kIDMgKi8gCiAvKiBSb3RhdGlvbiBpcyBzZXBhcmF0ZSBmcm9tIGFkZGl0aW9uIHRvIHByZXZlbnQgcmVjb21wdXRhdGlvbiAqLyAKQEAgLTY3LDEwICs3MSwxMCBAQAogICAgIChhKSA9IFJPVEFURV9MRUZUICgoYSksIChzKSk7IFwKICAgfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIF9tZDRfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgX21kNF9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQogI2Vsc2UKLXN0YXRpYyB2b2lkIG1kNF9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQorc3RhdGljIGludCAgbWQ0X2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiAjZW5kaWYKIHsKICAgICB1bG9uZzMyIHhbMTZdLCBhLCBiLCBjLCBkOwpAQCAtMTQ3LDM1ICsxNTEsNTggQEAKICAgICBtZC0+bWQ0LnN0YXRlWzFdID0gbWQtPm1kNC5zdGF0ZVsxXSArIGI7CiAgICAgbWQtPm1kNC5zdGF0ZVsyXSA9IG1kLT5tZDQuc3RhdGVbMl0gKyBjOwogICAgIG1kLT5tZDQuc3RhdGVbM10gPSBtZC0+bWQ0LnN0YXRlWzNdICsgZDsKKworICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBtZDRfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgbWQ0X2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiB7Ci0gICBfbWQ0X2NvbXByZXNzKG1kLCBidWYpOworICAgaW50IGVycjsKKyAgIGVyciA9IF9tZDRfY29tcHJlc3MobWQsIGJ1Zik7CiAgICBidXJuX3N0YWNrKHNpemVvZih1bG9uZzMyKSAqIDIwICsgc2l6ZW9mKGludCkpOworICAgcmV0dXJuIGVycjsKIH0KICNlbmRpZgogCi12b2lkIG1kNF9pbml0KGhhc2hfc3RhdGUgKiBtZCkKKy8qKgorICAgSW5pdGlhbGl6ZSB0aGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG1kICAgVGhlIGhhc2ggc3RhdGUgeW91IHdpc2ggdG8gaW5pdGlhbGl6ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IG1kNF9pbml0KGhhc2hfc3RhdGUgKiBtZCkKIHsKLSAgIF9BUkdDSEsobWQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOwogICAgbWQtPm1kNC5zdGF0ZVswXSA9IDB4Njc0NTIzMDFVTDsKICAgIG1kLT5tZDQuc3RhdGVbMV0gPSAweGVmY2RhYjg5VUw7CiAgICBtZC0+bWQ0LnN0YXRlWzJdID0gMHg5OGJhZGNmZVVMOwogICAgbWQtPm1kNC5zdGF0ZVszXSA9IDB4MTAzMjU0NzZVTDsKICAgIG1kLT5tZDQubGVuZ3RoICA9IDA7CiAgICBtZC0+bWQ0LmN1cmxlbiAgPSAwOworICAgcmV0dXJuIENSWVBUX09LOwogfQogCisvKioKKyAgIFByb2Nlc3MgYSBibG9jayBvZiBtZW1vcnkgdGhvdWdoIHRoZSBoYXNoCisgICBAcGFyYW0gbWQgICAgIFRoZSBoYXNoIHN0YXRlCisgICBAcGFyYW0gaW4gICAgIFRoZSBkYXRhIHRvIGhhc2gKKyAgIEBwYXJhbSBpbmxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAob2N0ZXRzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLwogSEFTSF9QUk9DRVNTKG1kNF9wcm9jZXNzLCBtZDRfY29tcHJlc3MsIG1kNCwgNjQpCiAKLWludCBtZDRfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpCisvKioKKyAgIFRlcm1pbmF0ZSB0aGUgaGFzaCB0byBnZXQgdGhlIGRpZ2VzdAorICAgQHBhcmFtIG1kICBUaGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG91dCBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGhhc2ggKDE2IGJ5dGVzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IG1kNF9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqb3V0KQogewogICAgIGludCBpOwogCi0gICAgX0FSR0NISyhtZCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGhhc2ggIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhtZCAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhvdXQgIT0gTlVMTCk7CiAKICAgICBpZiAobWQtPm1kNC5jdXJsZW4gPj0gc2l6ZW9mKG1kLT5tZDQuYnVmKSkgewogICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKQEAgLTIxMCwxNCArMjM3LDE4IEBACiAKICAgICAvKiBjb3B5IG91dHB1dCAqLwogICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgU1RPUkUzMkwobWQtPm1kNC5zdGF0ZVtpXSwgaGFzaCsoNCppKSk7CisgICAgICAgIFNUT1JFMzJMKG1kLT5tZDQuc3RhdGVbaV0sIG91dCsoNCppKSk7CiAgICAgfQotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICAgemVyb21lbShtZCwgc2l6ZW9mKGhhc2hfc3RhdGUpKTsKICNlbmRpZiAKICAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKKy8qKgorICBTZWxmLXRlc3QgdGhlIGhhc2gKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0cyBoYXZlIGJlZW4gZGlzYWJsZWQKKyovICAKIGludCBtZDRfdGVzdCh2b2lkKQogewogICNpZm5kZWYgTFRDX1RFU1QKQEAgLTI2OSwzICszMDAsNyBAQAogI2VuZGlmCiAKIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvaGFzaGVzL21kNC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjUgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMjMgMDI6NDI6MDcgJCAqLwpkaWZmIC0tZ2l0IGEvbWQ1LmMgYi9zcmMvaGFzaGVzL21kNS5jCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIG1kNS5jCnJlbmFtZSB0byBzcmMvaGFzaGVzL21kNS5jCmluZGV4IDhmNmUxZWEuLmZiOGZmMzEgMTAwNjQ0Ci0tLSBhL21kNS5jCisrKyBiL3NyYy9oYXNoZXMvbWQ1LmMKQEAgLTYsMjcgKzYsMjggQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKLS8qIE1ENSBoYXNoIGZ1bmN0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLwogCi0jaW5jbHVkZSAibXljcnlwdC5oIgorLyoqCisgIEBmaWxlIG1kNS5jCisgIE1ENSBoYXNoIGZ1bmN0aW9uIGJ5IFRvbSBTdCBEZW5pcyAKKyovCiAKICNpZmRlZiBNRDUKIAotY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3IgbWQ1X2Rlc2MgPQorY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3IgbWQ1X2Rlc2MgPQogewogICAgICJtZDUiLAogICAgIDMsCiAgICAgMTYsCiAgICAgNjQsCiAKLSAgICAvKiBERVIgaWRlbnRpZmllciAqLwotICAgIHsgMHgzMCwgMHgyMCwgMHgzMCwgMHgwQywgMHgwNiwgMHgwOCwgMHgyQSwgMHg4NiwgCi0gICAgICAweDQ4LCAweDg2LCAweEY3LCAweDBELCAweDAyLCAweDA1LCAweDA1LCAweDAwLCAKLSAgICAgIDB4MDQsIDB4MTAgfSwKLSAgICAxOCwKKyAgICAvKiBPSUQgKi8KKyAgIHsgMSwgMiwgODQwLCAxMTM1NDksIDIsIDUsICB9LAorICAgNiwKIAogICAgICZtZDVfaW5pdCwKICAgICAmbWQ1X3Byb2Nlc3MsCkBAIC0zOSw2ICs0MCw4IEBACiAjZGVmaW5lIEgoeCx5LHopICAoeF55XnopCiAjZGVmaW5lIEkoeCx5LHopICAoeV4oeHwofnopKSkKIAorI2lmZGVmIExUQ19TTUFMTF9DT0RFCisKICNkZWZpbmUgRkYoYSxiLGMsZCxNLHMsdCkgXAogICAgIGEgPSAoYSArIEYoYixjLGQpICsgTSArIHQpOyBhID0gUk9MKGEsIHMpICsgYjsKIApAQCAtNTEsOCArNTQsNiBAQAogI2RlZmluZSBJSShhLGIsYyxkLE0scyx0KSBcCiAgICAgYSA9IChhICsgSShiLGMsZCkgKyBNICsgdCk7IGEgPSBST0woYSwgcykgKyBiOwogCi0jaWZkZWYgU01BTExfQ09ERQotCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBXb3JkZXJbNjRdID0gewogICAgMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwKICAgIDEsNiwxMSwwLDUsMTAsMTUsNCw5LDE0LDMsOCwxMywyLDcsMTIsCkBAIC03OCwxNiArNzksMzEgQEAKIDB4NmZhODdlNGZVTCwgMHhmZTJjZTZlMFVMLCAweGEzMDE0MzE0VUwsIDB4NGUwODExYTFVTCwgMHhmNzUzN2U4MlVMLCAweGJkM2FmMjM1VUwsIDB4MmFkN2QyYmJVTCwgMHhlYjg2ZDM5MVVMCiB9OwogCisjZWxzZQorCisjZGVmaW5lIEZGKGEsYixjLGQsTSxzLHQpIFwKKyAgICBhID0gKGEgKyBGKGIsYyxkKSArIE0gKyB0KTsgYSA9IFJPTGMoYSwgcykgKyBiOworCisjZGVmaW5lIEdHKGEsYixjLGQsTSxzLHQpIFwKKyAgICBhID0gKGEgKyBHKGIsYyxkKSArIE0gKyB0KTsgYSA9IFJPTGMoYSwgcykgKyBiOworCisjZGVmaW5lIEhIKGEsYixjLGQsTSxzLHQpIFwKKyAgICBhID0gKGEgKyBIKGIsYyxkKSArIE0gKyB0KTsgYSA9IFJPTGMoYSwgcykgKyBiOworCisjZGVmaW5lIElJKGEsYixjLGQsTSxzLHQpIFwKKyAgICBhID0gKGEgKyBJKGIsYyxkKSArIE0gKyB0KTsgYSA9IFJPTGMoYSwgcykgKyBiOworCisKICNlbmRpZiAgIAogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIF9tZDVfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgX21kNV9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQogI2Vsc2UKLXN0YXRpYyB2b2lkIG1kNV9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQorc3RhdGljIGludCAgbWQ1X2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiAjZW5kaWYKIHsKICAgICB1bG9uZzMyIGksIFdbMTZdLCBhLCBiLCBjLCBkOwotI2lmZGVmIFNNQUxMX0NPREUKKyNpZmRlZiBMVENfU01BTExfQ09ERQogICAgIHVsb25nMzIgdDsKICNlbmRpZgogCkBAIC0xMDIsNyArMTE4LDcgQEAKICAgICBjID0gbWQtPm1kNS5zdGF0ZVsyXTsKICAgICBkID0gbWQtPm1kNS5zdGF0ZVszXTsKIAotI2lmZGVmIFNNQUxMX0NPREUKKyNpZmRlZiBMVENfU01BTExfQ09ERQogICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CiAgICAgICAgIEZGKGEsYixjLGQsV1tXb3JkZXJbaV1dLFJvcmRlcltpXSxLb3JkZXJbaV0pOwogICAgICAgICB0ID0gZDsgZCA9IGM7IGMgPSBiOyBiID0gYTsgYSA9IHQ7CkBAIC0xOTQsMzUgKzIxMCw1OCBAQAogICAgIG1kLT5tZDUuc3RhdGVbMV0gPSBtZC0+bWQ1LnN0YXRlWzFdICsgYjsKICAgICBtZC0+bWQ1LnN0YXRlWzJdID0gbWQtPm1kNS5zdGF0ZVsyXSArIGM7CiAgICAgbWQtPm1kNS5zdGF0ZVszXSA9IG1kLT5tZDUuc3RhdGVbM10gKyBkOworCisgICAgcmV0dXJuIENSWVBUX09LOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIG1kNV9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworc3RhdGljIGludCBtZDVfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKLSAgIF9tZDVfY29tcHJlc3MobWQsIGJ1Zik7CisgICBpbnQgZXJyOworICAgZXJyID0gX21kNV9jb21wcmVzcyhtZCwgYnVmKTsKICAgIGJ1cm5fc3RhY2soc2l6ZW9mKHVsb25nMzIpICogMjEpOworICAgcmV0dXJuIGVycjsKIH0KICNlbmRpZgogCi12b2lkIG1kNV9pbml0KGhhc2hfc3RhdGUgKiBtZCkKKy8qKgorICAgSW5pdGlhbGl6ZSB0aGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG1kICAgVGhlIGhhc2ggc3RhdGUgeW91IHdpc2ggdG8gaW5pdGlhbGl6ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IG1kNV9pbml0KGhhc2hfc3RhdGUgKiBtZCkKIHsKLSAgIF9BUkdDSEsobWQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOwogICAgbWQtPm1kNS5zdGF0ZVswXSA9IDB4Njc0NTIzMDFVTDsKICAgIG1kLT5tZDUuc3RhdGVbMV0gPSAweGVmY2RhYjg5VUw7CiAgICBtZC0+bWQ1LnN0YXRlWzJdID0gMHg5OGJhZGNmZVVMOwogICAgbWQtPm1kNS5zdGF0ZVszXSA9IDB4MTAzMjU0NzZVTDsKICAgIG1kLT5tZDUuY3VybGVuID0gMDsKICAgIG1kLT5tZDUubGVuZ3RoID0gMDsKKyAgIHJldHVybiBDUllQVF9PSzsKIH0KIAorLyoqCisgICBQcm9jZXNzIGEgYmxvY2sgb2YgbWVtb3J5IHRob3VnaCB0aGUgaGFzaAorICAgQHBhcmFtIG1kICAgICBUaGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIGluICAgICBUaGUgZGF0YSB0byBoYXNoCisgICBAcGFyYW0gaW5sZW4gIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKG9jdGV0cykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIEhBU0hfUFJPQ0VTUyhtZDVfcHJvY2VzcywgbWQ1X2NvbXByZXNzLCBtZDUsIDY0KQogCi1pbnQgbWQ1X2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKQorLyoqCisgICBUZXJtaW5hdGUgdGhlIGhhc2ggdG8gZ2V0IHRoZSBkaWdlc3QKKyAgIEBwYXJhbSBtZCAgVGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBvdXQgW291dF0gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBoYXNoICgxNiBieXRlcykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBtZDVfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKm91dCkKIHsKICAgICBpbnQgaTsKIAotICAgIF9BUkdDSEsobWQgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhoYXNoICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsobWQgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0ICE9IE5VTEwpOwogCiAgICAgaWYgKG1kLT5tZDUuY3VybGVuID49IHNpemVvZihtZC0+bWQ1LmJ1ZikpIHsKICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CkBAIC0yNTgsMTQgKzI5NywxOCBAQAogCiAgICAgLyogY29weSBvdXRwdXQgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgIFNUT1JFMzJMKG1kLT5tZDUuc3RhdGVbaV0sIGhhc2grKDQqaSkpOworICAgICAgICBTVE9SRTMyTChtZC0+bWQ1LnN0YXRlW2ldLCBvdXQrKDQqaSkpOwogICAgIH0KLSNpZmRlZiBDTEVBTl9TVEFDSworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogICAgIHplcm9tZW0obWQsIHNpemVvZihoYXNoX3N0YXRlKSk7CiAjZW5kaWYKICAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKKy8qKgorICBTZWxmLXRlc3QgdGhlIGhhc2gKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0cyBoYXZlIGJlZW4gZGlzYWJsZWQKKyovICAKIGludCAgbWQ1X3Rlc3Qodm9pZCkKIHsKICAjaWZuZGVmIExUQ19URVNUCkBAIC0zMTgsMyArMzYxLDcgQEAKICNlbmRpZgogCiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hhc2hlcy9tZDUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzIzIDAyOjQyOjA3ICQgKi8KZGlmZiAtLWdpdCBhL3JtZDEyOC5jIGIvc3JjL2hhc2hlcy9ybWQxMjguYwpzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBybWQxMjguYwpyZW5hbWUgdG8gc3JjL2hhc2hlcy9ybWQxMjguYwppbmRleCAxM2EzMTM1Li4xYzY2M2U0IDEwMDY0NAotLS0gYS9ybWQxMjguYworKysgYi9zcmMvaGFzaGVzL3JtZDEyOC5jCkBAIC02LDI4ICs2LDMzIEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgIEBwYXJhbSBybWQxMjguYworICAgUk1EMTI4IEhhc2ggZnVuY3Rpb24KKyovICAgCiAKIC8qIEltcGxlbWVudGF0aW9uIG9mIFJJUEVNRC0xMjggYmFzZWQgb24gdGhlIHNvdXJjZSBieSBBbnRvb24gQm9zc2VsYWVycywgRVNBVC1DT1NJQwogICoKICAqIFRoaXMgc291cmNlIGhhcyBiZWVuIHJhZGljYWxseSBvdmVyaGF1bGVkIHRvIGJlIHBvcnRhYmxlIGFuZCB3b3JrIHdpdGhpbgogICogdGhlIExpYlRvbUNyeXB0IEFQSSBieSBUb20gU3QgRGVuaXMKICAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKIAogI2lmZGVmIFJJUEVNRDEyOAogCi1jb25zdCBzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvciBybWQxMjhfZGVzYyA9Citjb25zdCBzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvciBybWQxMjhfZGVzYyA9CiB7CiAgICAgInJtZDEyOCIsCiAgICAgOCwKICAgICAxNiwKICAgICA2NCwKIAotICAgIC8qIERFUiBpZGVudGlmaWVyIChub3Qgc3VwcG9ydGVkKSAqLwotICAgIHsgMHgwMCB9LAotICAgIDAsCisgICAgLyogT0lEICovCisgICB7IDEsIDAsIDEwMTE4LCAzLCAwLCA1MCB9LAorICAgNiwKIAogICAgICZybWQxMjhfaW5pdCwKICAgICAmcm1kMTI4X3Byb2Nlc3MsCkBAIC00NCw0MCArNDksNDAgQEAKIC8qIHRoZSBlaWdodCBiYXNpYyBvcGVyYXRpb25zIEZGKCkgdGhyb3VnaCBJSUkoKSAqLwogI2RlZmluZSBGRihhLCBiLCBjLCBkLCB4LCBzKSAgICAgICAgXAogICAgICAgKGEpICs9IEYoKGIpLCAoYyksIChkKSkgKyAoeCk7XAotICAgICAgKGEpID0gUk9MKChhKSwgKHMpKTsKKyAgICAgIChhKSA9IFJPTGMoKGEpLCAocykpOwogCiAjZGVmaW5lIEdHKGEsIGIsIGMsIGQsIHgsIHMpICAgICAgICBcCiAgICAgICAoYSkgKz0gRygoYiksIChjKSwgKGQpKSArICh4KSArIDB4NWE4Mjc5OTlVTDtcCi0gICAgICAoYSkgPSBST0woKGEpLCAocykpOworICAgICAgKGEpID0gUk9MYygoYSksIChzKSk7CiAKICNkZWZpbmUgSEgoYSwgYiwgYywgZCwgeCwgcykgICAgICAgIFwKICAgICAgIChhKSArPSBIKChiKSwgKGMpLCAoZCkpICsgKHgpICsgMHg2ZWQ5ZWJhMVVMO1wKLSAgICAgIChhKSA9IFJPTCgoYSksIChzKSk7CisgICAgICAoYSkgPSBST0xjKChhKSwgKHMpKTsKIAogI2RlZmluZSBJSShhLCBiLCBjLCBkLCB4LCBzKSAgICAgICAgXAogICAgICAgKGEpICs9IEkoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAweDhmMWJiY2RjVUw7XAotICAgICAgKGEpID0gUk9MKChhKSwgKHMpKTsKKyAgICAgIChhKSA9IFJPTGMoKGEpLCAocykpOwogCiAjZGVmaW5lIEZGRihhLCBiLCBjLCBkLCB4LCBzKSAgICAgICAgXAogICAgICAgKGEpICs9IEYoKGIpLCAoYyksIChkKSkgKyAoeCk7XAotICAgICAgKGEpID0gUk9MKChhKSwgKHMpKTsKKyAgICAgIChhKSA9IFJPTGMoKGEpLCAocykpOwogCiAjZGVmaW5lIEdHRyhhLCBiLCBjLCBkLCB4LCBzKSAgICAgICAgXAogICAgICAgKGEpICs9IEcoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAweDZkNzAzZWYzVUw7XAotICAgICAgKGEpID0gUk9MKChhKSwgKHMpKTsKKyAgICAgIChhKSA9IFJPTGMoKGEpLCAocykpOwogCiAjZGVmaW5lIEhISChhLCBiLCBjLCBkLCB4LCBzKSAgICAgICAgXAogICAgICAgKGEpICs9IEgoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAweDVjNGRkMTI0VUw7XAotICAgICAgKGEpID0gUk9MKChhKSwgKHMpKTsKKyAgICAgIChhKSA9IFJPTGMoKGEpLCAocykpOwogCiAjZGVmaW5lIElJSShhLCBiLCBjLCBkLCB4LCBzKSAgICAgICAgXAogICAgICAgKGEpICs9IEkoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAweDUwYTI4YmU2VUw7XAotICAgICAgKGEpID0gUk9MKChhKSwgKHMpKTsKKyAgICAgIChhKSA9IFJPTGMoKGEpLCAocykpOwogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIF9ybWQxMjhfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgX3JtZDEyOF9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQogI2Vsc2UKLXN0YXRpYyB2b2lkIHJtZDEyOF9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQorc3RhdGljIGludCAgcm1kMTI4X2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiAjZW5kaWYKIHsKICAgIHVsb25nMzIgYWEsYmIsY2MsZGQsYWFhLGJiYixjY2MsZGRkLFhbMTZdOwpAQCAtMjQ0LDM1ICsyNDksNTggQEAKICAgIG1kLT5ybWQxMjguc3RhdGVbMl0gPSBtZC0+cm1kMTI4LnN0YXRlWzNdICsgYWEgKyBiYmI7CiAgICBtZC0+cm1kMTI4LnN0YXRlWzNdID0gbWQtPnJtZDEyOC5zdGF0ZVswXSArIGJiICsgY2NjOwogICAgbWQtPnJtZDEyOC5zdGF0ZVswXSA9IGRkZDsKKworICAgcmV0dXJuIENSWVBUX09LOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIHJtZDEyOF9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworc3RhdGljIGludCBybWQxMjhfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKLSAgIF9ybWQxMjhfY29tcHJlc3MobWQsIGJ1Zik7CisgICBpbnQgZXJyOworICAgZXJyID0gX3JtZDEyOF9jb21wcmVzcyhtZCwgYnVmKTsKICAgIGJ1cm5fc3RhY2soc2l6ZW9mKHVsb25nMzIpICogMjQgKyBzaXplb2YoaW50KSk7CisgICByZXR1cm4gZXJyOwogfQogI2VuZGlmCiAKLXZvaWQgcm1kMTI4X2luaXQoaGFzaF9zdGF0ZSAqIG1kKQorLyoqCisgICBJbml0aWFsaXplIHRoZSBoYXNoIHN0YXRlCisgICBAcGFyYW0gbWQgICBUaGUgaGFzaCBzdGF0ZSB5b3Ugd2lzaCB0byBpbml0aWFsaXplCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgcm1kMTI4X2luaXQoaGFzaF9zdGF0ZSAqIG1kKQogewotICAgX0FSR0NISyhtZCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsobWQgIT0gTlVMTCk7CiAgICBtZC0+cm1kMTI4LnN0YXRlWzBdID0gMHg2NzQ1MjMwMVVMOwogICAgbWQtPnJtZDEyOC5zdGF0ZVsxXSA9IDB4ZWZjZGFiODlVTDsKICAgIG1kLT5ybWQxMjguc3RhdGVbMl0gPSAweDk4YmFkY2ZlVUw7CiAgICBtZC0+cm1kMTI4LnN0YXRlWzNdID0gMHgxMDMyNTQ3NlVMOwogICAgbWQtPnJtZDEyOC5jdXJsZW4gICA9IDA7CiAgICBtZC0+cm1kMTI4Lmxlbmd0aCAgID0gMDsKKyAgIHJldHVybiBDUllQVF9PSzsKIH0KIAorLyoqCisgICBQcm9jZXNzIGEgYmxvY2sgb2YgbWVtb3J5IHRob3VnaCB0aGUgaGFzaAorICAgQHBhcmFtIG1kICAgICBUaGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIGluICAgICBUaGUgZGF0YSB0byBoYXNoCisgICBAcGFyYW0gaW5sZW4gIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKG9jdGV0cykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIEhBU0hfUFJPQ0VTUyhybWQxMjhfcHJvY2Vzcywgcm1kMTI4X2NvbXByZXNzLCBybWQxMjgsIDY0KQogCi1pbnQgcm1kMTI4X2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKQorLyoqCisgICBUZXJtaW5hdGUgdGhlIGhhc2ggdG8gZ2V0IHRoZSBkaWdlc3QKKyAgIEBwYXJhbSBtZCAgVGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBvdXQgW291dF0gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBoYXNoICgxNiBieXRlcykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBybWQxMjhfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKm91dCkKIHsKICAgICBpbnQgaTsKIAotICAgIF9BUkdDSEsobWQgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhoYXNoICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsobWQgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0ICE9IE5VTEwpOwogCiAgICAgaWYgKG1kLT5ybWQxMjguY3VybGVuID49IHNpemVvZihtZC0+cm1kMTI4LmJ1ZikpIHsKICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CkBAIC0zMDgsMTQgKzMzNiwxOCBAQAogCiAgICAgLyogY29weSBvdXRwdXQgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgIFNUT1JFMzJMKG1kLT5ybWQxMjguc3RhdGVbaV0sIGhhc2grKDQqaSkpOworICAgICAgICBTVE9SRTMyTChtZC0+cm1kMTI4LnN0YXRlW2ldLCBvdXQrKDQqaSkpOwogICAgIH0KLSNpZmRlZiBDTEVBTl9TVEFDSworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogICAgIHplcm9tZW0obWQsIHNpemVvZihoYXNoX3N0YXRlKSk7CiAjZW5kaWYKICAgIHJldHVybiBDUllQVF9PSzsgIAogfQogCisvKioKKyAgU2VsZi10ZXN0IHRoZSBoYXNoCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdHMgaGF2ZSBiZWVuIGRpc2FibGVkCisqLyAgCiBpbnQgcm1kMTI4X3Rlc3Qodm9pZCkKIHsKICNpZm5kZWYgTFRDX1RFU1QKQEAgLTM3MSwzICs0MDMsNyBAQAogCiAjZW5kaWYKIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvaGFzaGVzL3JtZDEyOC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjYgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMjMgMDI6NDI6MDcgJCAqLwpkaWZmIC0tZ2l0IGEvcm1kMTYwLmMgYi9zcmMvaGFzaGVzL3JtZDE2MC5jCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIHJtZDE2MC5jCnJlbmFtZSB0byBzcmMvaGFzaGVzL3JtZDE2MC5jCmluZGV4IDZiNDkwNzYuLjYxMjRmNTkgMTAwNjQ0Ci0tLSBhL3JtZDE2MC5jCisrKyBiL3NyYy9oYXNoZXMvcm1kMTYwLmMKQEAgLTYsMjkgKzYsMzMgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgcm1kMTYwLmMKKyAgIFJNRDE2MCBoYXNoIGZ1bmN0aW9uCisqLyAgIAogCiAvKiBJbXBsZW1lbnRhdGlvbiBvZiBSSVBFTUQtMTYwIGJhc2VkIG9uIHRoZSBzb3VyY2UgYnkgQW50b29uIEJvc3NlbGFlcnMsIEVTQVQtQ09TSUMKICAqCiAgKiBUaGlzIHNvdXJjZSBoYXMgYmVlbiByYWRpY2FsbHkgb3ZlcmhhdWxlZCB0byBiZSBwb3J0YWJsZSBhbmQgd29yayB3aXRoaW4KICAqIHRoZSBMaWJUb21DcnlwdCBBUEkgYnkgVG9tIFN0IERlbmlzCiAgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCiAKICNpZmRlZiBSSVBFTUQxNjAKIAotY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3Igcm1kMTYwX2Rlc2MgPQorY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3Igcm1kMTYwX2Rlc2MgPQogewogICAgICJybWQxNjAiLAogICAgIDksCiAgICAgMjAsCiAgICAgNjQsCiAKLSAgICAvKiBERVIgaWRlbnRpZmllciAqLwotICAgIHsgMHgzMCwgMHgyMSwgMHgzMCwgMHgwOSwgMHgwNiwgMHgwNSwgMHgyQiwgMHgyNCwgCi0gICAgICAweDAzLCAweDAyLCAweDAxLCAweDA1LCAweDAwLCAweDA0LCAweDE0IH0sCi0gICAgMTUsCisgICAgLyogT0lEICovCisgICB7IDEsIDMsIDM2LCAzLCAyLCAxLCAgfSwKKyAgIDYsCiAKICAgICAmcm1kMTYwX2luaXQsCiAgICAgJnJtZDE2MF9wcm9jZXNzLApAQCAtNDYsNTkgKzUwLDU5IEBACiAvKiB0aGUgdGVuIGJhc2ljIG9wZXJhdGlvbnMgRkYoKSB0aHJvdWdoIElJSSgpICovCiAjZGVmaW5lIEZGKGEsIGIsIGMsIGQsIGUsIHgsIHMpICAgICAgICBcCiAgICAgICAoYSkgKz0gRigoYiksIChjKSwgKGQpKSArICh4KTtcCi0gICAgICAoYSkgPSBST0woKGEpLCAocykpICsgKGUpO1wKLSAgICAgIChjKSA9IFJPTCgoYyksIDEwKTsKKyAgICAgIChhKSA9IFJPTGMoKGEpLCAocykpICsgKGUpO1wKKyAgICAgIChjKSA9IFJPTGMoKGMpLCAxMCk7CiAKICNkZWZpbmUgR0coYSwgYiwgYywgZCwgZSwgeCwgcykgICAgICAgIFwKICAgICAgIChhKSArPSBHKChiKSwgKGMpLCAoZCkpICsgKHgpICsgMHg1YTgyNzk5OVVMO1wKLSAgICAgIChhKSA9IFJPTCgoYSksIChzKSkgKyAoZSk7XAotICAgICAgKGMpID0gUk9MKChjKSwgMTApOworICAgICAgKGEpID0gUk9MYygoYSksIChzKSkgKyAoZSk7XAorICAgICAgKGMpID0gUk9MYygoYyksIDEwKTsKIAogI2RlZmluZSBISChhLCBiLCBjLCBkLCBlLCB4LCBzKSAgICAgICAgXAogICAgICAgKGEpICs9IEgoKGIpLCAoYyksIChkKSkgKyAoeCkgKyAweDZlZDllYmExVUw7XAotICAgICAgKGEpID0gUk9MKChhKSwgKHMpKSArIChlKTtcCi0gICAgICAoYykgPSBST0woKGMpLCAxMCk7CisgICAgICAoYSkgPSBST0xjKChhKSwgKHMpKSArIChlKTtcCisgICAgICAoYykgPSBST0xjKChjKSwgMTApOwogCiAjZGVmaW5lIElJKGEsIGIsIGMsIGQsIGUsIHgsIHMpICAgICAgICBcCiAgICAgICAoYSkgKz0gSSgoYiksIChjKSwgKGQpKSArICh4KSArIDB4OGYxYmJjZGNVTDtcCi0gICAgICAoYSkgPSBST0woKGEpLCAocykpICsgKGUpO1wKLSAgICAgIChjKSA9IFJPTCgoYyksIDEwKTsKKyAgICAgIChhKSA9IFJPTGMoKGEpLCAocykpICsgKGUpO1wKKyAgICAgIChjKSA9IFJPTGMoKGMpLCAxMCk7CiAKICNkZWZpbmUgSkooYSwgYiwgYywgZCwgZSwgeCwgcykgICAgICAgIFwKICAgICAgIChhKSArPSBKKChiKSwgKGMpLCAoZCkpICsgKHgpICsgMHhhOTUzZmQ0ZVVMO1wKLSAgICAgIChhKSA9IFJPTCgoYSksIChzKSkgKyAoZSk7XAotICAgICAgKGMpID0gUk9MKChjKSwgMTApOworICAgICAgKGEpID0gUk9MYygoYSksIChzKSkgKyAoZSk7XAorICAgICAgKGMpID0gUk9MYygoYyksIDEwKTsKIAogI2RlZmluZSBGRkYoYSwgYiwgYywgZCwgZSwgeCwgcykgICAgICAgIFwKICAgICAgIChhKSArPSBGKChiKSwgKGMpLCAoZCkpICsgKHgpO1wKLSAgICAgIChhKSA9IFJPTCgoYSksIChzKSkgKyAoZSk7XAotICAgICAgKGMpID0gUk9MKChjKSwgMTApOworICAgICAgKGEpID0gUk9MYygoYSksIChzKSkgKyAoZSk7XAorICAgICAgKGMpID0gUk9MYygoYyksIDEwKTsKIAogI2RlZmluZSBHR0coYSwgYiwgYywgZCwgZSwgeCwgcykgICAgICAgIFwKICAgICAgIChhKSArPSBHKChiKSwgKGMpLCAoZCkpICsgKHgpICsgMHg3YTZkNzZlOVVMO1wKLSAgICAgIChhKSA9IFJPTCgoYSksIChzKSkgKyAoZSk7XAotICAgICAgKGMpID0gUk9MKChjKSwgMTApOworICAgICAgKGEpID0gUk9MYygoYSksIChzKSkgKyAoZSk7XAorICAgICAgKGMpID0gUk9MYygoYyksIDEwKTsKIAogI2RlZmluZSBISEgoYSwgYiwgYywgZCwgZSwgeCwgcykgICAgICAgIFwKICAgICAgIChhKSArPSBIKChiKSwgKGMpLCAoZCkpICsgKHgpICsgMHg2ZDcwM2VmM1VMO1wKLSAgICAgIChhKSA9IFJPTCgoYSksIChzKSkgKyAoZSk7XAotICAgICAgKGMpID0gUk9MKChjKSwgMTApOworICAgICAgKGEpID0gUk9MYygoYSksIChzKSkgKyAoZSk7XAorICAgICAgKGMpID0gUk9MYygoYyksIDEwKTsKIAogI2RlZmluZSBJSUkoYSwgYiwgYywgZCwgZSwgeCwgcykgICAgICAgIFwKICAgICAgIChhKSArPSBJKChiKSwgKGMpLCAoZCkpICsgKHgpICsgMHg1YzRkZDEyNFVMO1wKLSAgICAgIChhKSA9IFJPTCgoYSksIChzKSkgKyAoZSk7XAotICAgICAgKGMpID0gUk9MKChjKSwgMTApOworICAgICAgKGEpID0gUk9MYygoYSksIChzKSkgKyAoZSk7XAorICAgICAgKGMpID0gUk9MYygoYyksIDEwKTsKIAogI2RlZmluZSBKSkooYSwgYiwgYywgZCwgZSwgeCwgcykgICAgICAgIFwKICAgICAgIChhKSArPSBKKChiKSwgKGMpLCAoZCkpICsgKHgpICsgMHg1MGEyOGJlNlVMO1wKLSAgICAgIChhKSA9IFJPTCgoYSksIChzKSkgKyAoZSk7XAotICAgICAgKGMpID0gUk9MKChjKSwgMTApOworICAgICAgKGEpID0gUk9MYygoYSksIChzKSkgKyAoZSk7XAorICAgICAgKGMpID0gUk9MYygoYyksIDEwKTsKIAogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIF9ybWQxNjBfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgX3JtZDE2MF9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQogI2Vsc2UKLXN0YXRpYyB2b2lkIHJtZDE2MF9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQorc3RhdGljIGludCAgcm1kMTYwX2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiAjZW5kaWYKIHsKICAgIHVsb25nMzIgYWEsYmIsY2MsZGQsZWUsYWFhLGJiYixjY2MsZGRkLGVlZSxYWzE2XTsKQEAgLTMwMywxOSArMzA3LDI4IEBACiAgICBtZC0+cm1kMTYwLnN0YXRlWzNdID0gbWQtPnJtZDE2MC5zdGF0ZVs0XSArIGFhICsgYmJiOwogICAgbWQtPnJtZDE2MC5zdGF0ZVs0XSA9IG1kLT5ybWQxNjAuc3RhdGVbMF0gKyBiYiArIGNjYzsKICAgIG1kLT5ybWQxNjAuc3RhdGVbMF0gPSBkZGQ7CisKKyAgIHJldHVybiBDUllQVF9PSzsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBybWQxNjBfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgcm1kMTYwX2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiB7Ci0gICBfcm1kMTYwX2NvbXByZXNzKG1kLCBidWYpOworICAgaW50IGVycjsKKyAgIGVyciA9IF9ybWQxNjBfY29tcHJlc3MobWQsIGJ1Zik7CiAgICBidXJuX3N0YWNrKHNpemVvZih1bG9uZzMyKSAqIDI2ICsgc2l6ZW9mKGludCkpOworICAgcmV0dXJuIGVycjsKIH0KICNlbmRpZgogCi12b2lkIHJtZDE2MF9pbml0KGhhc2hfc3RhdGUgKiBtZCkKKy8qKgorICAgSW5pdGlhbGl6ZSB0aGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG1kICAgVGhlIGhhc2ggc3RhdGUgeW91IHdpc2ggdG8gaW5pdGlhbGl6ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHJtZDE2MF9pbml0KGhhc2hfc3RhdGUgKiBtZCkKIHsKLSAgIF9BUkdDSEsobWQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOwogICAgbWQtPnJtZDE2MC5zdGF0ZVswXSA9IDB4Njc0NTIzMDFVTDsKICAgIG1kLT5ybWQxNjAuc3RhdGVbMV0gPSAweGVmY2RhYjg5VUw7CiAgICBtZC0+cm1kMTYwLnN0YXRlWzJdID0gMHg5OGJhZGNmZVVMOwpAQCAtMzIzLDE2ICszMzYsMzAgQEAKICAgIG1kLT5ybWQxNjAuc3RhdGVbNF0gPSAweGMzZDJlMWYwVUw7CiAgICBtZC0+cm1kMTYwLmN1cmxlbiAgID0gMDsKICAgIG1kLT5ybWQxNjAubGVuZ3RoICAgPSAwOworICAgcmV0dXJuIENSWVBUX09LOwogfQogCisvKioKKyAgIFByb2Nlc3MgYSBibG9jayBvZiBtZW1vcnkgdGhvdWdoIHRoZSBoYXNoCisgICBAcGFyYW0gbWQgICAgIFRoZSBoYXNoIHN0YXRlCisgICBAcGFyYW0gaW4gICAgIFRoZSBkYXRhIHRvIGhhc2gKKyAgIEBwYXJhbSBpbmxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAob2N0ZXRzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLwogSEFTSF9QUk9DRVNTKHJtZDE2MF9wcm9jZXNzLCBybWQxNjBfY29tcHJlc3MsIHJtZDE2MCwgNjQpCiAKLWludCBybWQxNjBfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpCisvKioKKyAgIFRlcm1pbmF0ZSB0aGUgaGFzaCB0byBnZXQgdGhlIGRpZ2VzdAorICAgQHBhcmFtIG1kICBUaGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG91dCBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGhhc2ggKDIwIGJ5dGVzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHJtZDE2MF9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqb3V0KQogewogICAgIGludCBpOwogCi0gICAgX0FSR0NISyhtZCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGhhc2ggIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhtZCAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhvdXQgIT0gTlVMTCk7CiAKICAgICBpZiAobWQtPnJtZDE2MC5jdXJsZW4gPj0gc2l6ZW9mKG1kLT5ybWQxNjAuYnVmKSkgewogICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKQEAgLTM2OCwxNCArMzk1LDE4IEBACiAKICAgICAvKiBjb3B5IG91dHB1dCAqLwogICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgU1RPUkUzMkwobWQtPnJtZDE2MC5zdGF0ZVtpXSwgaGFzaCsoNCppKSk7CisgICAgICAgIFNUT1JFMzJMKG1kLT5ybWQxNjAuc3RhdGVbaV0sIG91dCsoNCppKSk7CiAgICAgfQotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICAgemVyb21lbShtZCwgc2l6ZW9mKGhhc2hfc3RhdGUpKTsKICNlbmRpZgogICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAorLyoqCisgIFNlbGYtdGVzdCB0aGUgaGFzaAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3RzIGhhdmUgYmVlbiBkaXNhYmxlZAorKi8gIAogaW50IHJtZDE2MF90ZXN0KHZvaWQpCiB7CiAjaWZuZGVmIExUQ19URVNUCkBAIC00MzEsMyArNDYyLDcgQEAKIAogI2VuZGlmCiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hhc2hlcy9ybWQxNjAuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzIzIDAyOjQyOjA3ICQgKi8KZGlmZiAtLWdpdCBhL3NoYTEuYyBiL3NyYy9oYXNoZXMvc2hhMS5jCnNpbWlsYXJpdHkgaW5kZXggNzAlCnJlbmFtZSBmcm9tIHNoYTEuYwpyZW5hbWUgdG8gc3JjL2hhc2hlcy9zaGExLmMKaW5kZXggNzc3MDBmNi4uYTc1ZDA0ZCAxMDA2NDQKLS0tIGEvc2hhMS5jCisrKyBiL3NyYy9oYXNoZXMvc2hhMS5jCkBAIC02LDI1ICs2LDI4IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgogCi0vKiBTSEExIGNvZGUgYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorLyoqCisgIEBmaWxlIHNoYTEuYworICBTSEExIGNvZGUgYnkgVG9tIFN0IERlbmlzIAorKi8KKwogCiAjaWZkZWYgU0hBMQogCi1jb25zdCBzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvciBzaGExX2Rlc2MgPQorY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3Igc2hhMV9kZXNjID0KIHsKICAgICAic2hhMSIsCiAgICAgMiwKICAgICAyMCwKICAgICA2NCwKIAotICAgIC8qIERFUiBpZGVudGlmaWVyICovCi0gICAgeyAweDMwLCAweDIxLCAweDMwLCAweDA5LCAweDA2LCAweDA1LCAweDJCLCAweDBFLCAKLSAgICAgIDB4MDMsIDB4MDIsIDB4MUEsIDB4MDUsIDB4MDAsIDB4MDQsIDB4MTQgfSwKLSAgICAxNSwKKyAgICAvKiBPSUQgKi8KKyAgIHsgMSwgMywgMTQsIDMsIDIsIDI2LCAgfSwKKyAgIDYsCiAKICAgICAmc2hhMV9pbml0LAogICAgICZzaGExX3Byb2Nlc3MsCkBAIC0zNywxNCArNDAsMTQgQEAKICNkZWZpbmUgRjIoeCx5LHopICAoKHggJiB5KSB8ICh6ICYgKHggfCB5KSkpCiAjZGVmaW5lIEYzKHgseSx6KSAgKHggXiB5IF4geikKIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfc2hhMV9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworc3RhdGljIGludCBfc2hhMV9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQogI2Vsc2UKLXN0YXRpYyB2b2lkIHNoYTFfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgIHNoYTFfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKICNlbmRpZgogewogICAgIHVsb25nMzIgYSxiLGMsZCxlLFdbODBdLGk7Ci0jaWZkZWYgU01BTExfQ09ERQorI2lmZGVmIExUQ19TTUFMTF9DT0RFCiAgICAgdWxvbmczMiB0OwogI2VuZGlmCiAKQEAgLTY3LDEyICs3MCwxMiBAQAogCiAgICAgLyogY29tcHJlc3MgKi8KICAgICAvKiByb3VuZCBvbmUgKi8KLSAgICAjZGVmaW5lIEZGMChhLGIsYyxkLGUsaSkgZSA9IChST0woYSwgNSkgKyBGMChiLGMsZCkgKyBlICsgV1tpXSArIDB4NWE4Mjc5OTlVTCk7IGIgPSBST0woYiwgMzApOwotICAgICNkZWZpbmUgRkYxKGEsYixjLGQsZSxpKSBlID0gKFJPTChhLCA1KSArIEYxKGIsYyxkKSArIGUgKyBXW2ldICsgMHg2ZWQ5ZWJhMVVMKTsgYiA9IFJPTChiLCAzMCk7Ci0gICAgI2RlZmluZSBGRjIoYSxiLGMsZCxlLGkpIGUgPSAoUk9MKGEsIDUpICsgRjIoYixjLGQpICsgZSArIFdbaV0gKyAweDhmMWJiY2RjVUwpOyBiID0gUk9MKGIsIDMwKTsKLSAgICAjZGVmaW5lIEZGMyhhLGIsYyxkLGUsaSkgZSA9IChST0woYSwgNSkgKyBGMyhiLGMsZCkgKyBlICsgV1tpXSArIDB4Y2E2MmMxZDZVTCk7IGIgPSBST0woYiwgMzApOworICAgICNkZWZpbmUgRkYwKGEsYixjLGQsZSxpKSBlID0gKFJPTGMoYSwgNSkgKyBGMChiLGMsZCkgKyBlICsgV1tpXSArIDB4NWE4Mjc5OTlVTCk7IGIgPSBST0xjKGIsIDMwKTsKKyAgICAjZGVmaW5lIEZGMShhLGIsYyxkLGUsaSkgZSA9IChST0xjKGEsIDUpICsgRjEoYixjLGQpICsgZSArIFdbaV0gKyAweDZlZDllYmExVUwpOyBiID0gUk9MYyhiLCAzMCk7CisgICAgI2RlZmluZSBGRjIoYSxiLGMsZCxlLGkpIGUgPSAoUk9MYyhhLCA1KSArIEYyKGIsYyxkKSArIGUgKyBXW2ldICsgMHg4ZjFiYmNkY1VMKTsgYiA9IFJPTGMoYiwgMzApOworICAgICNkZWZpbmUgRkYzKGEsYixjLGQsZSxpKSBlID0gKFJPTGMoYSwgNSkgKyBGMyhiLGMsZCkgKyBlICsgV1tpXSArIDB4Y2E2MmMxZDZVTCk7IGIgPSBST0xjKGIsIDMwKTsKICAKLSNpZmRlZiBTTUFMTF9DT0RFCisjaWZkZWYgTFRDX1NNQUxMX0NPREUKICAKICAgICBmb3IgKGkgPSAwOyBpIDwgMjA7ICkgewogICAgICAgIEZGMChhLGIsYyxkLGUsaSsrKTsgdCA9IGU7IGUgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSBhOyBhID0gdDsKQEAgLTEzOSwxOSArMTQyLDI4IEBACiAgICAgbWQtPnNoYTEuc3RhdGVbMl0gPSBtZC0+c2hhMS5zdGF0ZVsyXSArIGM7CiAgICAgbWQtPnNoYTEuc3RhdGVbM10gPSBtZC0+c2hhMS5zdGF0ZVszXSArIGQ7CiAgICAgbWQtPnNoYTEuc3RhdGVbNF0gPSBtZC0+c2hhMS5zdGF0ZVs0XSArIGU7CisKKyAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKLSNpZmRlZiBDTEVBTl9TVEFDSwotc3RhdGljIHZvaWQgc2hhMV9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworc3RhdGljIGludCBzaGExX2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiB7Ci0gICBfc2hhMV9jb21wcmVzcyhtZCwgYnVmKTsKKyAgIGludCBlcnI7CisgICBlcnIgPSBfc2hhMV9jb21wcmVzcyhtZCwgYnVmKTsKICAgIGJ1cm5fc3RhY2soc2l6ZW9mKHVsb25nMzIpICogODcpOworICAgcmV0dXJuIGVycjsKIH0KICNlbmRpZgogCi12b2lkIHNoYTFfaW5pdChoYXNoX3N0YXRlICogbWQpCisvKioKKyAgIEluaXRpYWxpemUgdGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBtZCAgIFRoZSBoYXNoIHN0YXRlIHlvdSB3aXNoIHRvIGluaXRpYWxpemUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBzaGExX2luaXQoaGFzaF9zdGF0ZSAqIG1kKQogewotICAgX0FSR0NISyhtZCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsobWQgIT0gTlVMTCk7CiAgICBtZC0+c2hhMS5zdGF0ZVswXSA9IDB4Njc0NTIzMDFVTDsKICAgIG1kLT5zaGExLnN0YXRlWzFdID0gMHhlZmNkYWI4OVVMOwogICAgbWQtPnNoYTEuc3RhdGVbMl0gPSAweDk4YmFkY2ZlVUw7CkBAIC0xNTksMTYgKzE3MSwzMCBAQAogICAgbWQtPnNoYTEuc3RhdGVbNF0gPSAweGMzZDJlMWYwVUw7CiAgICBtZC0+c2hhMS5jdXJsZW4gPSAwOwogICAgbWQtPnNoYTEubGVuZ3RoID0gMDsKKyAgIHJldHVybiBDUllQVF9PSzsKIH0KIAorLyoqCisgICBQcm9jZXNzIGEgYmxvY2sgb2YgbWVtb3J5IHRob3VnaCB0aGUgaGFzaAorICAgQHBhcmFtIG1kICAgICBUaGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIGluICAgICBUaGUgZGF0YSB0byBoYXNoCisgICBAcGFyYW0gaW5sZW4gIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKG9jdGV0cykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIEhBU0hfUFJPQ0VTUyhzaGExX3Byb2Nlc3MsIHNoYTFfY29tcHJlc3MsIHNoYTEsIDY0KQogCi1pbnQgc2hhMV9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqaGFzaCkKKy8qKgorICAgVGVybWluYXRlIHRoZSBoYXNoIHRvIGdldCB0aGUgZGlnZXN0CisgICBAcGFyYW0gbWQgIFRoZSBoYXNoIHN0YXRlCisgICBAcGFyYW0gb3V0IFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgaGFzaCAoMjAgYnl0ZXMpCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgc2hhMV9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqb3V0KQogewogICAgIGludCBpOwogCi0gICAgX0FSR0NISyhtZCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGhhc2ggIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhtZCAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhvdXQgIT0gTlVMTCk7CiAKICAgICBpZiAobWQtPnNoYTEuY3VybGVuID49IHNpemVvZihtZC0+c2hhMS5idWYpKSB7CiAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOwpAQCAtMjAzLDE0ICsyMjksMTggQEAKIAogICAgIC8qIGNvcHkgb3V0cHV0ICovCiAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICBTVE9SRTMySChtZC0+c2hhMS5zdGF0ZVtpXSwgaGFzaCsoNCppKSk7CisgICAgICAgIFNUT1JFMzJIKG1kLT5zaGExLnN0YXRlW2ldLCBvdXQrKDQqaSkpOwogICAgIH0KLSNpZmRlZiBDTEVBTl9TVEFDSworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogICAgIHplcm9tZW0obWQsIHNpemVvZihoYXNoX3N0YXRlKSk7CiAjZW5kaWYKICAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKKy8qKgorICBTZWxmLXRlc3QgdGhlIGhhc2gKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0cyBoYXZlIGJlZW4gZGlzYWJsZWQKKyovICAKIGludCAgc2hhMV90ZXN0KHZvaWQpCiB7CiAgI2lmbmRlZiBMVENfVEVTVApAQCAtMjUxLDMgKzI4MSw3IEBACiAjZW5kaWYKIAogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oYXNoZXMvc2hhMS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjUgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMjMgMDI6NDI6MDcgJCAqLwpkaWZmIC0tZ2l0IGEvc2hhMjI0LmMgYi9zcmMvaGFzaGVzL3NoYTIvc2hhMjI0LmMKc2ltaWxhcml0eSBpbmRleCA2NSUKcmVuYW1lIGZyb20gc2hhMjI0LmMKcmVuYW1lIHRvIHNyYy9oYXNoZXMvc2hhMi9zaGEyMjQuYwppbmRleCBkMDEzNTUxLi5iZmYyZmRmIDEwMDY0NAotLS0gYS9zaGEyMjQuYworKysgYi9zcmMvaGFzaGVzL3NoYTIvc2hhMjI0LmMKQEAgLTYsMjAgKzYsMjMgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLworLyoqCisgICBAcGFyYW0gc2hhMjI0LmMKKyAgIFNIQS0yMjQgbmV3IE5JU1Qgc3RhbmRhcmQgYmFzZWQgb2ZmIG9mIFNIQS0yNTYgdHJ1bmNhdGVkIHRvIDIyNCBiaXRzIChUb20gU3QgRGVuaXMpCisqLwogCi0vKiBTSEEtMjI0IG5ldyBOSVNUIHN0YW5kYXJkIGJhc2VkIG9mZiBvZiBTSEEtMjU2IHRydW5jYXRlZCB0byAyMjQgYml0cyAqLwotY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3Igc2hhMjI0X2Rlc2MgPQorY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3Igc2hhMjI0X2Rlc2MgPQogewogICAgICJzaGEyMjQiLAogICAgIDEwLAogICAgIDI4LAogICAgIDY0LAogCi0gICAgLyogREVSIGlkZW50aWZpZXIgKG5vdCBzdXBwb3J0ZWQpICovCi0gICAgeyAweDAwIH0sCi0gICAgMCwKKyAgICAvKiBPSUQgKi8KKyAgIHsgMiwgMTYsIDg0MCwgMSwgMTAxLCAzLCA0LCAyLCA0LCAgfSwKKyAgIDksCiAKICAgICAmc2hhMjI0X2luaXQsCiAgICAgJnNoYTI1Nl9wcm9jZXNzLApAQCAtMjgsOSArMzEsMTQgQEAKIH07CiAKIC8qIGluaXQgdGhlIHNoYTI1NiBlci4uLiBzaGEyMjQgc3RhdGUgOy0pICovCi12b2lkIHNoYTIyNF9pbml0KGhhc2hfc3RhdGUgKiBtZCkKKy8qKgorICAgSW5pdGlhbGl6ZSB0aGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG1kICAgVGhlIGhhc2ggc3RhdGUgeW91IHdpc2ggdG8gaW5pdGlhbGl6ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHNoYTIyNF9pbml0KGhhc2hfc3RhdGUgKiBtZCkKIHsKLSAgICBfQVJHQ0hLKG1kICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsobWQgIT0gTlVMTCk7CiAKICAgICBtZC0+c2hhMjU2LmN1cmxlbiA9IDA7CiAgICAgbWQtPnNoYTI1Ni5sZW5ndGggPSAwOwpAQCAtNDIsMjEgKzUwLDM1IEBACiAgICAgbWQtPnNoYTI1Ni5zdGF0ZVs1XSA9IDB4Njg1ODE1MTFVTDsKICAgICBtZC0+c2hhMjU2LnN0YXRlWzZdID0gMHg2NGY5OGZhN1VMOwogICAgIG1kLT5zaGEyNTYuc3RhdGVbN10gPSAweGJlZmE0ZmE0VUw7CisgICAgcmV0dXJuIENSWVBUX09LOwogfQogCi1pbnQgc2hhMjI0X2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKQorLyoqCisgICBUZXJtaW5hdGUgdGhlIGhhc2ggdG8gZ2V0IHRoZSBkaWdlc3QKKyAgIEBwYXJhbSBtZCAgVGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBvdXQgW291dF0gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBoYXNoICgyOCBieXRlcykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBzaGEyMjRfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKm91dCkKIHsKICAgICB1bnNpZ25lZCBjaGFyIGJ1ZlszMl07CiAgICAgaW50IGVycjsKIAorICAgIExUQ19BUkdDSEsobWQgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0ICE9IE5VTEwpOworCiAgICAgZXJyID0gc2hhMjU2X2RvbmUobWQsIGJ1Zik7Ci0gICAgbWVtY3B5KGhhc2gsIGJ1ZiwgMjgpOwotI2lmZGVmIENMRUFOX1NUQUNLCisgICAgWE1FTUNQWShvdXQsIGJ1ZiwgMjgpOworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogICAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7CiAjZW5kaWYgCiAgICAgcmV0dXJuIGVycjsKIH0KIAorLyoqCisgIFNlbGYtdGVzdCB0aGUgaGFzaAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3RzIGhhdmUgYmVlbiBkaXNhYmxlZAorKi8gIAogaW50ICBzaGEyMjRfdGVzdCh2b2lkKQogewogICNpZm5kZWYgTFRDX1RFU1QKQEAgLTk2LDMgKzExOCw3IEBACiAgI2VuZGlmCiB9CiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hhc2hlcy9zaGEyL3NoYTIyNC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjUgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMjMgMDI6NDI6MDcgJCAqLwpkaWZmIC0tZ2l0IGEvc2hhMjU2LmMgYi9zcmMvaGFzaGVzL3NoYTIvc2hhMjU2LmMKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gc2hhMjU2LmMKcmVuYW1lIHRvIHNyYy9oYXNoZXMvc2hhMi9zaGEyNTYuYwppbmRleCBlZjJhZTVlLi5jNDhjMGY2IDEwMDY0NAotLS0gYS9zaGEyNTYuYworKysgYi9zcmMvaGFzaGVzL3NoYTIvc2hhMjU2LmMKQEAgLTYsMjggKzYsMjcgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKLQotLyogU0hBMjU2IGJ5IFRvbSBTdCBEZW5pcyAqLwotCi0jaW5jbHVkZSAibXljcnlwdC5oIgorLyoqCisgIEBmaWxlIHNoYTI1Ni5jCisgIFNIQTI1NiBieSBUb20gU3QgRGVuaXMgCisqLwogCiAjaWZkZWYgU0hBMjU2IAogCi1jb25zdCBzdHJ1Y3QgX2hhc2hfZGVzY3JpcHRvciBzaGEyNTZfZGVzYyA9Citjb25zdCBzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvciBzaGEyNTZfZGVzYyA9CiB7CiAgICAgInNoYTI1NiIsCiAgICAgMCwKICAgICAzMiwKICAgICA2NCwKIAotICAgIC8qIERFUiBpZGVudGlmaWVyICovCi0gICAgeyAweDMwLCAweDMxLCAweDMwLCAweDBELCAweDA2LCAweDA5LCAweDYwLCAweDg2LCAKLSAgICAgIDB4NDgsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDQsIDB4MDIsIDB4MDEsIDB4MDUsIAotICAgICAgMHgwMCwgMHgwNCwgMHgyMCB9LAotICAgIDE5LAorICAgIC8qIE9JRCAqLworICAgeyAyLCAxNiwgODQwLCAxLCAxMDEsIDMsIDQsIDIsIDEsICB9LAorICAgOSwKICAgICAKICAgICAmc2hhMjU2X2luaXQsCiAgICAgJnNoYTI1Nl9wcm9jZXNzLApAQCAtMzUsNyArMzQsNyBAQAogICAgICZzaGEyNTZfdGVzdAogfTsKIAotI2lmZGVmIFNNQUxMX0NPREUKKyNpZmRlZiBMVENfU01BTExfQ09ERQogLyogdGhlIEsgYXJyYXkgKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIEtbNjRdID0gewogICAgIDB4NDI4YTJmOThVTCwgMHg3MTM3NDQ5MVVMLCAweGI1YzBmYmNmVUwsIDB4ZTliNWRiYTVVTCwgMHgzOTU2YzI1YlVMLApAQCAtNTcsNyArNTYsNyBAQAogLyogVmFyaW91cyBsb2dpY2FsIGZ1bmN0aW9ucyAqLwogI2RlZmluZSBDaCh4LHkseikgICAgICAgKHogXiAoeCAmICh5IF4geikpKQogI2RlZmluZSBNYWooeCx5LHopICAgICAgKCgoeCB8IHkpICYgeikgfCAoeCAmIHkpKSAKLSNkZWZpbmUgUyh4LCBuKSAgICAgICAgIFJPUigoeCksKG4pKQorI2RlZmluZSBTKHgsIG4pICAgICAgICAgUk9SYygoeCksKG4pKQogI2RlZmluZSBSKHgsIG4pICAgICAgICAgKCgoeCkmMHhGRkZGRkZGRlVMKT4+KG4pKQogI2RlZmluZSBTaWdtYTAoeCkgICAgICAgKFMoeCwgMikgXiBTKHgsIDEzKSBeIFMoeCwgMjIpKQogI2RlZmluZSBTaWdtYTEoeCkgICAgICAgKFMoeCwgNikgXiBTKHgsIDExKSBeIFMoeCwgMjUpKQpAQCAtNjUsMTQgKzY0LDE0IEBACiAjZGVmaW5lIEdhbW1hMSh4KSAgICAgICAoUyh4LCAxNykgXiBTKHgsIDE5KSBeIFIoeCwgMTApKQogCiAvKiBjb21wcmVzcyA1MTItYml0cyAqLwotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfc2hhMjU2X2NvbXByZXNzKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqYnVmKQorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworc3RhdGljIGludCBfc2hhMjU2X2NvbXByZXNzKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqYnVmKQogI2Vsc2UKLXN0YXRpYyB2b2lkIHNoYTI1Nl9jb21wcmVzcyhoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgIHNoYTI1Nl9jb21wcmVzcyhoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKICNlbmRpZgogewogICAgIHVsb25nMzIgU1s4XSwgV1s2NF0sIHQwLCB0MTsKLSNpZmRlZiBTTUFMTF9DT0RFCisjaWZkZWYgTFRDX1NNQUxMX0NPREUKICAgICB1bG9uZzMyIHQ7CiAjZW5kaWYKICAgICBpbnQgaTsKQEAgLTkzLDcgKzkyLDcgQEAKICAgICB9ICAgICAgICAKIAogICAgIC8qIENvbXByZXNzICovCi0jaWZkZWYgU01BTExfQ09ERSAgIAorI2lmZGVmIExUQ19TTUFMTF9DT0RFICAgCiAjZGVmaW5lIFJORChhLGIsYyxkLGUsZixnLGgsaSkgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB0MCA9IGggKyBTaWdtYTEoZSkgKyBDaChlLCBmLCBnKSArIEtbaV0gKyBXW2ldOyAgIFwKICAgICAgdDEgPSBTaWdtYTAoYSkgKyBNYWooYSwgYiwgYyk7ICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMDQsNyArMTAzLDcgQEAKICAgICAgICAgIFJORChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10saSk7CiAgICAgICAgICB0ID0gU1s3XTsgU1s3XSA9IFNbNl07IFNbNl0gPSBTWzVdOyBTWzVdID0gU1s0XTsgCiAgICAgICAgICBTWzRdID0gU1szXTsgU1szXSA9IFNbMl07IFNbMl0gPSBTWzFdOyBTWzFdID0gU1swXTsgU1swXSA9IHQ7Ci0JICB9ICAKKyAgICAgfSAgCiAjZWxzZSAKICNkZWZpbmUgUk5EKGEsYixjLGQsZSxmLGcsaCxpLGtpKSAgICAgICAgICAgICAgICAgICAgXAogICAgICB0MCA9IGggKyBTaWdtYTEoZSkgKyBDaChlLCBmLCBnKSArIGtpICsgV1tpXTsgICBcCkBAIC0xODUsMjEgKzE4NCwyNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgbWQtPnNoYTI1Ni5zdGF0ZVtpXSA9IG1kLT5zaGEyNTYuc3RhdGVbaV0gKyBTW2ldOwogICAgIH0KLQorICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBzaGEyNTZfY29tcHJlc3MoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpidWYpCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCitzdGF0aWMgaW50IHNoYTI1Nl9jb21wcmVzcyhoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKLSAgICBfc2hhMjU2X2NvbXByZXNzKG1kLCBidWYpOworICAgIGludCBlcnI7CisgICAgZXJyID0gX3NoYTI1Nl9jb21wcmVzcyhtZCwgYnVmKTsKICAgICBidXJuX3N0YWNrKHNpemVvZih1bG9uZzMyKSAqIDc0KTsKKyAgICByZXR1cm4gZXJyOwogfQogI2VuZGlmCiAKLS8qIGluaXQgdGhlIHNoYTI1NiBzdGF0ZSAqLwotdm9pZCBzaGEyNTZfaW5pdChoYXNoX3N0YXRlICogbWQpCisvKioKKyAgIEluaXRpYWxpemUgdGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBtZCAgIFRoZSBoYXNoIHN0YXRlIHlvdSB3aXNoIHRvIGluaXRpYWxpemUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBzaGEyNTZfaW5pdChoYXNoX3N0YXRlICogbWQpCiB7Ci0gICAgX0FSR0NISyhtZCAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOwogCiAgICAgbWQtPnNoYTI1Ni5jdXJsZW4gPSAwOwogICAgIG1kLT5zaGEyNTYubGVuZ3RoID0gMDsKQEAgLTIxMSwxNiArMjE2LDMwIEBACiAgICAgbWQtPnNoYTI1Ni5zdGF0ZVs1XSA9IDB4OUIwNTY4OENVTDsKICAgICBtZC0+c2hhMjU2LnN0YXRlWzZdID0gMHgxRjgzRDlBQlVMOwogICAgIG1kLT5zaGEyNTYuc3RhdGVbN10gPSAweDVCRTBDRDE5VUw7CisgICAgcmV0dXJuIENSWVBUX09LOwogfQogCisvKioKKyAgIFByb2Nlc3MgYSBibG9jayBvZiBtZW1vcnkgdGhvdWdoIHRoZSBoYXNoCisgICBAcGFyYW0gbWQgICAgIFRoZSBoYXNoIHN0YXRlCisgICBAcGFyYW0gaW4gICAgIFRoZSBkYXRhIHRvIGhhc2gKKyAgIEBwYXJhbSBpbmxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAob2N0ZXRzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLwogSEFTSF9QUk9DRVNTKHNoYTI1Nl9wcm9jZXNzLCBzaGEyNTZfY29tcHJlc3MsIHNoYTI1NiwgNjQpCiAKLWludCBzaGEyNTZfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpCisvKioKKyAgIFRlcm1pbmF0ZSB0aGUgaGFzaCB0byBnZXQgdGhlIGRpZ2VzdAorICAgQHBhcmFtIG1kICBUaGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG91dCBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGhhc2ggKDMyIGJ5dGVzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHNoYTI1Nl9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqb3V0KQogewogICAgIGludCBpOwogCi0gICAgX0FSR0NISyhtZCAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKGhhc2ggIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhtZCAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhvdXQgIT0gTlVMTCk7CiAKICAgICBpZiAobWQtPnNoYTI1Ni5jdXJsZW4gPj0gc2l6ZW9mKG1kLT5zaGEyNTYuYnVmKSkgewogICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKQEAgLTI1NiwxNCArMjc1LDE4IEBACiAKICAgICAvKiBjb3B5IG91dHB1dCAqLwogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgU1RPUkUzMkgobWQtPnNoYTI1Ni5zdGF0ZVtpXSwgaGFzaCsoNCppKSk7CisgICAgICAgIFNUT1JFMzJIKG1kLT5zaGEyNTYuc3RhdGVbaV0sIG91dCsoNCppKSk7CiAgICAgfQotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICAgemVyb21lbShtZCwgc2l6ZW9mKGhhc2hfc3RhdGUpKTsKICNlbmRpZgogICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAorLyoqCisgIFNlbGYtdGVzdCB0aGUgaGFzaAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3RzIGhhdmUgYmVlbiBkaXNhYmxlZAorKi8gIAogaW50ICBzaGEyNTZfdGVzdCh2b2lkKQogewogICNpZm5kZWYgTFRDX1RFU1QKQEAgLTMxMCwzICszMzMsNyBAQAogI2VuZGlmCiAKIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvaGFzaGVzL3NoYTIvc2hhMjU2LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8yMyAwMjo0MjowNyAkICovCmRpZmYgLS1naXQgYS9zaGEzODQuYyBiL3NyYy9oYXNoZXMvc2hhMi9zaGEzODQuYwpzaW1pbGFyaXR5IGluZGV4IDcwJQpyZW5hbWUgZnJvbSBzaGEzODQuYwpyZW5hbWUgdG8gc3JjL2hhc2hlcy9zaGEyL3NoYTM4NC5jCmluZGV4IDEyMDI4OWEuLjQzZjhmYjYgMTAwNjQ0Ci0tLSBhL3NoYTM4NC5jCisrKyBiL3NyYy9oYXNoZXMvc2hhMi9zaGEzODQuYwpAQCAtNiwyMyArNiwyMyBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCisvKiogCisgICBAcGFyYW0gc2hhMzg0LmMKKyAgIFNIQTM4NCBoYXNoIGluY2x1ZGVkIGluIHNoYTUxMi5jLCBUb20gU3QgRGVuaXMKKyovCiAKLS8qIGluY2x1ZGVkIGluIHNoYTUxMi5jICovCi0KLWNvbnN0IHN0cnVjdCBfaGFzaF9kZXNjcmlwdG9yIHNoYTM4NF9kZXNjID0KK2NvbnN0IHN0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yIHNoYTM4NF9kZXNjID0KIHsKICAgICAic2hhMzg0IiwKICAgICA0LAogICAgIDQ4LAogICAgIDEyOCwKIAotICAgIC8qIERFUiBpZGVudGlmaWVyICovCi0gICAgeyAweDMwLCAweDQxLCAweDMwLCAweDBELCAweDA2LCAweDA5LCAweDYwLCAweDg2LCAKLSAgICAgIDB4NDgsIDB4MDEsIDB4NjUsIDB4MDMsIDB4MDQsIDB4MDIsIDB4MDIsIDB4MDUsIAotICAgICAgMHgwMCwgMHgwNCwgMHgzMCB9LAotICAgIDE5LAorICAgIC8qIE9JRCAqLworICAgeyAyLCAxNiwgODQwLCAxLCAxMDEsIDMsIDQsIDIsIDIsICB9LAorICAgOSwKIAogICAgICZzaGEzODRfaW5pdCwKICAgICAmc2hhNTEyX3Byb2Nlc3MsCkBAIC0zMCw5ICszMCwxNCBAQAogICAgICZzaGEzODRfdGVzdAogfTsKIAotdm9pZCBzaGEzODRfaW5pdChoYXNoX3N0YXRlICogbWQpCisvKioKKyAgIEluaXRpYWxpemUgdGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBtZCAgIFRoZSBoYXNoIHN0YXRlIHlvdSB3aXNoIHRvIGluaXRpYWxpemUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBzaGEzODRfaW5pdChoYXNoX3N0YXRlICogbWQpCiB7Ci0gICAgX0FSR0NISyhtZCAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOwogCiAgICAgbWQtPnNoYTUxMi5jdXJsZW4gPSAwOwogICAgIG1kLT5zaGE1MTIubGVuZ3RoID0gMDsKQEAgLTQ0LDI3ICs0OSwzOCBAQAogICAgIG1kLT5zaGE1MTIuc3RhdGVbNV0gPSBDT05TVDY0KDB4OGViNDRhODc2ODU4MTUxMSk7CiAgICAgbWQtPnNoYTUxMi5zdGF0ZVs2XSA9IENPTlNUNjQoMHhkYjBjMmUwZDY0Zjk4ZmE3KTsKICAgICBtZC0+c2hhNTEyLnN0YXRlWzddID0gQ09OU1Q2NCgweDQ3YjU0ODFkYmVmYTRmYTQpOworICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAotaW50IHNoYTM4NF9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqaGFzaCkKKy8qKgorICAgVGVybWluYXRlIHRoZSBoYXNoIHRvIGdldCB0aGUgZGlnZXN0CisgICBAcGFyYW0gbWQgIFRoZSBoYXNoIHN0YXRlCisgICBAcGFyYW0gb3V0IFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgaGFzaCAoNDggYnl0ZXMpCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgc2hhMzg0X2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpvdXQpCiB7CiAgICB1bnNpZ25lZCBjaGFyIGJ1Zls2NF07CiAKLSAgIF9BUkdDSEsobWQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGhhc2ggIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG1kICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICE9IE5VTEwpOwogCiAgICAgaWYgKG1kLT5zaGE1MTIuY3VybGVuID49IHNpemVvZihtZC0+c2hhNTEyLmJ1ZikpIHsKICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CiAgICAgfQogCiAgICBzaGE1MTJfZG9uZShtZCwgYnVmKTsKLSAgIG1lbWNweShoYXNoLCBidWYsIDQ4KTsKLSNpZmRlZiBDTEVBTl9TVEFDSworICAgWE1FTUNQWShvdXQsIGJ1ZiwgNDgpOworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogICAgemVyb21lbShidWYsIHNpemVvZihidWYpKTsKICNlbmRpZgogICAgcmV0dXJuIENSWVBUX09LOwogfQogCisvKioKKyAgU2VsZi10ZXN0IHRoZSBoYXNoCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdHMgaGF2ZSBiZWVuIGRpc2FibGVkCisqLyAgCiBpbnQgIHNoYTM4NF90ZXN0KHZvaWQpCiB7CiAgI2lmbmRlZiBMVENfVEVTVApAQCAtMTEyLDMgKzEyOCw3IEBACiAKIAogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oYXNoZXMvc2hhMi9zaGEzODQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzIzIDAyOjQyOjA3ICQgKi8KZGlmZiAtLWdpdCBhL3NoYTUxMi5jIGIvc3JjL2hhc2hlcy9zaGEyL3NoYTUxMi5jCnNpbWlsYXJpdHkgaW5kZXggODMlCnJlbmFtZSBmcm9tIHNoYTUxMi5jCnJlbmFtZSB0byBzcmMvaGFzaGVzL3NoYTIvc2hhNTEyLmMKaW5kZXggOWI1ZGRhZC4uN2I2ODA1YiAxMDA2NDQKLS0tIGEvc2hhNTEyLmMKKysrIGIvc3JjL2hhc2hlcy9zaGEyL3NoYTUxMi5jCkBAIC02LDI3ICs2LDI3IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgogCi0vKiBTSEE1MTIgYnkgVG9tIFN0IERlbmlzICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCisvKioKKyAgIEBwYXJhbSBzaGE1MTIuYworICAgU0hBNTEyIGJ5IFRvbSBTdCBEZW5pcyAKKyovCiAKICNpZmRlZiBTSEE1MTIKIAotY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3Igc2hhNTEyX2Rlc2MgPQorY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3Igc2hhNTEyX2Rlc2MgPQogewogICAgICJzaGE1MTIiLAogICAgIDUsCiAgICAgNjQsCiAgICAgMTI4LAogCi0gICAgLyogREVSIGlkZW50aWZpZXIgKi8KLSAgICB7IDB4MzAsIDB4NTEsIDB4MzAsIDB4MEQsIDB4MDYsIDB4MDksIDB4NjAsIDB4ODYsIAotICAgICAgMHg0OCwgMHgwMSwgMHg2NSwgMHgwMywgMHgwNCwgMHgwMiwgMHgwMywgMHgwNSwgCi0gICAgICAweDAwLCAweDA0LCAweDQwIH0sCi0gICAgMTksCisgICAgLyogT0lEICovCisgICB7IDIsIDE2LCA4NDAsIDEsIDEwMSwgMywgNCwgMiwgMywgIH0sCisgICA5LAogCiAgICAgJnNoYTUxMl9pbml0LAogICAgICZzaGE1MTJfcHJvY2VzcywKQEAgLTgxLDcgKzgxLDcgQEAKIC8qIFZhcmlvdXMgbG9naWNhbCBmdW5jdGlvbnMgKi8KICNkZWZpbmUgQ2goeCx5LHopICAgICAgICh6IF4gKHggJiAoeSBeIHopKSkKICNkZWZpbmUgTWFqKHgseSx6KSAgICAgICgoKHggfCB5KSAmIHopIHwgKHggJiB5KSkgCi0jZGVmaW5lIFMoeCwgbikgICAgICAgICBST1I2NCgoeCksKG4pKQorI2RlZmluZSBTKHgsIG4pICAgICAgICAgUk9SNjRjKHgsIG4pCiAjZGVmaW5lIFIoeCwgbikgICAgICAgICAoKCh4KSZDT05TVDY0KDB4RkZGRkZGRkZGRkZGRkZGRikpPj4oKHVsb25nNjQpbikpCiAjZGVmaW5lIFNpZ21hMCh4KSAgICAgICAoUyh4LCAyOCkgXiBTKHgsIDM0KSBeIFMoeCwgMzkpKQogI2RlZmluZSBTaWdtYTEoeCkgICAgICAgKFMoeCwgMTQpIF4gUyh4LCAxOCkgXiBTKHgsIDQxKSkKQEAgLTg5LDEwICs4OSwxMCBAQAogI2RlZmluZSBHYW1tYTEoeCkgICAgICAgKFMoeCwgMTkpIF4gUyh4LCA2MSkgXiBSKHgsIDYpKQogCiAvKiBjb21wcmVzcyAxMDI0LWJpdHMgKi8KLSNpZmRlZiBDTEVBTl9TVEFDSwotc3RhdGljIHZvaWQgX3NoYTUxMl9jb21wcmVzcyhoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgX3NoYTUxMl9jb21wcmVzcyhoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKICNlbHNlCi1zdGF0aWMgdm9pZCBzaGE1MTJfY29tcHJlc3MoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpidWYpCitzdGF0aWMgaW50ICBzaGE1MTJfY29tcHJlc3MoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiAjZW5kaWYKIHsKICAgICB1bG9uZzY0IFNbOF0sIFdbODBdLCB0MCwgdDE7CkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICB9ICAgICAgICAKIAogICAgIC8qIENvbXByZXNzICovCi0jaWZkZWYgU01BTExfQ09ERQorI2lmZGVmIExUQ19TTUFMTF9DT0RFCiAgICAgZm9yIChpID0gMDsgaSA8IDgwOyBpKyspIHsKICAgICAgICAgdDAgPSBTWzddICsgU2lnbWExKFNbNF0pICsgQ2goU1s0XSwgU1s1XSwgU1s2XSkgKyBLW2ldICsgV1tpXTsKICAgICAgICAgdDEgPSBTaWdtYTAoU1swXSkgKyBNYWooU1swXSwgU1sxXSwgU1syXSk7CkBAIC0xNTEsMjIgKzE1MSwyOSBAQAogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgbWQtPnNoYTUxMi5zdGF0ZVtpXSA9IG1kLT5zaGE1MTIuc3RhdGVbaV0gKyBTW2ldOwogICAgIH0KKworICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAogLyogY29tcHJlc3MgMTAyNC1iaXRzICovCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIHNoYTUxMl9jb21wcmVzcyhoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgc2hhNTEyX2NvbXByZXNzKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqYnVmKQogewotICAgIF9zaGE1MTJfY29tcHJlc3MobWQsIGJ1Zik7CisgICAgaW50IGVycjsKKyAgICBlcnIgPSBfc2hhNTEyX2NvbXByZXNzKG1kLCBidWYpOwogICAgIGJ1cm5fc3RhY2soc2l6ZW9mKHVsb25nNjQpICogOTAgKyBzaXplb2YoaW50KSk7CisgICAgcmV0dXJuIGVycjsKIH0KICNlbmRpZgogCi0vKiBpbml0IHRoZSBzaGE1MTIgc3RhdGUgKi8KLXZvaWQgc2hhNTEyX2luaXQoaGFzaF9zdGF0ZSAqIG1kKQorLyoqCisgICBJbml0aWFsaXplIHRoZSBoYXNoIHN0YXRlCisgICBAcGFyYW0gbWQgICBUaGUgaGFzaCBzdGF0ZSB5b3Ugd2lzaCB0byBpbml0aWFsaXplCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgc2hhNTEyX2luaXQoaGFzaF9zdGF0ZSAqIG1kKQogewotICAgIF9BUkdDSEsobWQgIT0gTlVMTCk7Ci0KKyAgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOwogICAgIG1kLT5zaGE1MTIuY3VybGVuID0gMDsKICAgICBtZC0+c2hhNTEyLmxlbmd0aCA9IDA7CiAgICAgbWQtPnNoYTUxMi5zdGF0ZVswXSA9IENPTlNUNjQoMHg2YTA5ZTY2N2YzYmNjOTA4KTsKQEAgLTE3NywxNiArMTg0LDMwIEBACiAgICAgbWQtPnNoYTUxMi5zdGF0ZVs1XSA9IENPTlNUNjQoMHg5YjA1Njg4YzJiM2U2YzFmKTsKICAgICBtZC0+c2hhNTEyLnN0YXRlWzZdID0gQ09OU1Q2NCgweDFmODNkOWFiZmI0MWJkNmIpOwogICAgIG1kLT5zaGE1MTIuc3RhdGVbN10gPSBDT05TVDY0KDB4NWJlMGNkMTkxMzdlMjE3OSk7CisgICAgcmV0dXJuIENSWVBUX09LOwogfQogCisvKioKKyAgIFByb2Nlc3MgYSBibG9jayBvZiBtZW1vcnkgdGhvdWdoIHRoZSBoYXNoCisgICBAcGFyYW0gbWQgICAgIFRoZSBoYXNoIHN0YXRlCisgICBAcGFyYW0gaW4gICAgIFRoZSBkYXRhIHRvIGhhc2gKKyAgIEBwYXJhbSBpbmxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAob2N0ZXRzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLwogSEFTSF9QUk9DRVNTKHNoYTUxMl9wcm9jZXNzLCBzaGE1MTJfY29tcHJlc3MsIHNoYTUxMiwgMTI4KQogCi1pbnQgc2hhNTEyX2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKQorLyoqCisgICBUZXJtaW5hdGUgdGhlIGhhc2ggdG8gZ2V0IHRoZSBkaWdlc3QKKyAgIEBwYXJhbSBtZCAgVGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBvdXQgW291dF0gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBoYXNoICg2NCBieXRlcykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBzaGE1MTJfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKm91dCkKIHsKICAgICBpbnQgaTsKIAotICAgIF9BUkdDSEsobWQgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhoYXNoICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsobWQgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0ICE9IE5VTEwpOwogCiAgICAgaWYgKG1kLT5zaGE1MTIuY3VybGVuID49IHNpemVvZihtZC0+c2hhNTEyLmJ1ZikpIHsKICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CkBAIC0yMjQsMTQgKzI0NSwxOCBAQAogCiAgICAgLyogY29weSBvdXRwdXQgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgIFNUT1JFNjRIKG1kLT5zaGE1MTIuc3RhdGVbaV0sIGhhc2grKDgqaSkpOworICAgICAgICBTVE9SRTY0SChtZC0+c2hhNTEyLnN0YXRlW2ldLCBvdXQrKDgqaSkpOwogICAgIH0KLSNpZmRlZiBDTEVBTl9TVEFDSworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogICAgIHplcm9tZW0obWQsIHNpemVvZihoYXNoX3N0YXRlKSk7CiAjZW5kaWYKICAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKKy8qKgorICBTZWxmLXRlc3QgdGhlIGhhc2gKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0cyBoYXZlIGJlZW4gZGlzYWJsZWQKKyovICAKIGludCAgc2hhNTEyX3Rlc3Qodm9pZCkKIHsKICAjaWZuZGVmIExUQ19URVNUCkBAIC0yODcsMyArMzEyLDcgQEAKIAogCiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hhc2hlcy9zaGEyL3NoYTUxMi5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjUgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMjMgMDI6NDI6MDcgJCAqLwpkaWZmIC0tZ2l0IGEvdGlnZXIuYyBiL3NyYy9oYXNoZXMvdGlnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSB0aWdlci5jCnJlbmFtZSB0byBzcmMvaGFzaGVzL3RpZ2VyLmMKaW5kZXggMDliYTliMy4uMjUwYzE4NiAxMDA2NDQKLS0tIGEvdGlnZXIuYworKysgYi9zcmMvaGFzaGVzL3RpZ2VyLmMKQEAgLTYsMjUgKzYsMjggQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwogCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgdGlnZXIuYworICAgVGlnZXIgaGFzaCBmdW5jdGlvbiwgVG9tIFN0IERlbmlzCisqLwogCiAjaWZkZWYgVElHRVIKIAotY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3IgdGlnZXJfZGVzYyA9Citjb25zdCBzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvciB0aWdlcl9kZXNjID0KIHsKICAgICAidGlnZXIiLAogICAgIDEsCiAgICAgMjQsCiAgICAgNjQsCiAKLSAgICAvKiBERVIgaWRlbnRpZmllciAqLwotICAgIHsgMHgzMCwgMHgyOSwgMHgzMCwgMHgwRCwgMHgwNiwgMHgwOSwgMHgyQiwgMHgwNiwgCi0gICAgICAweDAxLCAweDA0LCAweDAxLCAweERBLCAweDQ3LCAweDBDLCAweDAyLCAweDA1LCAKLSAgICAgIDB4MDAsIDB4MDQsIDB4MTggfSwKLSAgICAxOSwKKyAgICAvKiBPSUQgKi8KKyAgIHsgMSwgMywgNiwgMSwgNCwgMSwgMTE1OTEsIDEyLCAyLCAgfSwKKyAgIDksCiAKICAgICAmdGlnZXJfaW5pdCwKICAgICAmdGlnZXJfcHJvY2VzcywKQEAgLTU1OCw3ICs1NjEsNyBAQAogI2VuZGlmICAgCiAKIC8qIG9uZSByb3VuZCBvZiB0aGUgaGFzaCBmdW5jdGlvbiAqLwotSU5MSU5FIHN0YXRpYyB2b2lkIHJvdW5kKHVsb25nNjQgKmEsIHVsb25nNjQgKmIsIHVsb25nNjQgKmMsIHVsb25nNjQgeCwgaW50IG11bCkKK0lOTElORSBzdGF0aWMgdm9pZCB0aWdlcl9yb3VuZCh1bG9uZzY0ICphLCB1bG9uZzY0ICpiLCB1bG9uZzY0ICpjLCB1bG9uZzY0IHgsIGludCBtdWwpCiB7CiAgICAgdWxvbmc2NCB0bXA7CiAgICAgdG1wID0gKCpjIF49IHgpOyAKQEAgLTU3NCwxNCArNTc3LDE0IEBACiAvKiBvbmUgY29tcGxldGUgcGFzcyAqLwogc3RhdGljIHZvaWQgcGFzcyh1bG9uZzY0ICphLCB1bG9uZzY0ICpiLCB1bG9uZzY0ICpjLCB1bG9uZzY0ICp4LCBpbnQgbXVsKQogewotICAgcm91bmQoYSxiLGMseFswXSxtdWwpOyAKLSAgIHJvdW5kKGIsYyxhLHhbMV0sbXVsKTsgCi0gICByb3VuZChjLGEsYix4WzJdLG11bCk7IAotICAgcm91bmQoYSxiLGMseFszXSxtdWwpOyAKLSAgIHJvdW5kKGIsYyxhLHhbNF0sbXVsKTsgCi0gICByb3VuZChjLGEsYix4WzVdLG11bCk7IAotICAgcm91bmQoYSxiLGMseFs2XSxtdWwpOyAKLSAgIHJvdW5kKGIsYyxhLHhbN10sbXVsKTsgICAgICAgICAgCisgICB0aWdlcl9yb3VuZChhLGIsYyx4WzBdLG11bCk7IAorICAgdGlnZXJfcm91bmQoYixjLGEseFsxXSxtdWwpOyAKKyAgIHRpZ2VyX3JvdW5kKGMsYSxiLHhbMl0sbXVsKTsgCisgICB0aWdlcl9yb3VuZChhLGIsYyx4WzNdLG11bCk7IAorICAgdGlnZXJfcm91bmQoYixjLGEseFs0XSxtdWwpOyAKKyAgIHRpZ2VyX3JvdW5kKGMsYSxiLHhbNV0sbXVsKTsgCisgICB0aWdlcl9yb3VuZChhLGIsYyx4WzZdLG11bCk7IAorICAgdGlnZXJfcm91bmQoYixjLGEseFs3XSxtdWwpOyAgICAgICAgICAKIH0gICAKIAogLyogVGhlIGtleSBtaXhpbmcgc2NoZWR1bGUgKi8KQEAgLTYwNSwxMCArNjA4LDEwIEBACiAgICAgeFs3XSAtPSB4WzZdIF4gQ09OU1Q2NCgweDAxMjM0NTY3ODlBQkNERUYpOwogfSAgICAKIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCBfdGlnZXJfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgX3RpZ2VyX2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiAjZWxzZQotc3RhdGljIHZvaWQgdGlnZXJfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgIHRpZ2VyX2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiAjZW5kaWYKIHsKICAgICB1bG9uZzY0IGEsIGIsIGMsIHhbOF07CkBAIC02MzIsMzIgKzYzNSw1NSBAQAogICAgIG1kLT50aWdlci5zdGF0ZVswXSA9IGEgXiBtZC0+dGlnZXIuc3RhdGVbMF07CiAgICAgbWQtPnRpZ2VyLnN0YXRlWzFdID0gYiAtIG1kLT50aWdlci5zdGF0ZVsxXTsKICAgICBtZC0+dGlnZXIuc3RhdGVbMl0gPSBjICsgbWQtPnRpZ2VyLnN0YXRlWzJdOworCisgICAgcmV0dXJuIENSWVBUX09LOwogfQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIHRpZ2VyX2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCitzdGF0aWMgaW50IHRpZ2VyX2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiB7Ci0gICBfdGlnZXJfY29tcHJlc3MobWQsIGJ1Zik7CisgICBpbnQgZXJyOworICAgZXJyID0gX3RpZ2VyX2NvbXByZXNzKG1kLCBidWYpOwogICAgYnVybl9zdGFjayhzaXplb2YodWxvbmc2NCkgKiAxMSArIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisgICByZXR1cm4gZXJyOwogfQogI2VuZGlmCiAKLXZvaWQgdGlnZXJfaW5pdChoYXNoX3N0YXRlICptZCkKKy8qKgorICAgSW5pdGlhbGl6ZSB0aGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG1kICAgVGhlIGhhc2ggc3RhdGUgeW91IHdpc2ggdG8gaW5pdGlhbGl6ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHRpZ2VyX2luaXQoaGFzaF9zdGF0ZSAqbWQpCiB7Ci0gICAgX0FSR0NISyhtZCAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOwogICAgIG1kLT50aWdlci5zdGF0ZVswXSA9IENPTlNUNjQoMHgwMTIzNDU2Nzg5QUJDREVGKTsKICAgICBtZC0+dGlnZXIuc3RhdGVbMV0gPSBDT05TVDY0KDB4RkVEQ0JBOTg3NjU0MzIxMCk7CiAgICAgbWQtPnRpZ2VyLnN0YXRlWzJdID0gQ09OU1Q2NCgweEYwOTZBNUI0QzNCMkUxODcpOwogICAgIG1kLT50aWdlci5jdXJsZW4gPSAwOwogICAgIG1kLT50aWdlci5sZW5ndGggPSAwOworICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAorLyoqCisgICBQcm9jZXNzIGEgYmxvY2sgb2YgbWVtb3J5IHRob3VnaCB0aGUgaGFzaAorICAgQHBhcmFtIG1kICAgICBUaGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIGluICAgICBUaGUgZGF0YSB0byBoYXNoCisgICBAcGFyYW0gaW5sZW4gIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKG9jdGV0cykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIEhBU0hfUFJPQ0VTUyh0aWdlcl9wcm9jZXNzLCB0aWdlcl9jb21wcmVzcywgdGlnZXIsIDY0KQogCi1pbnQgdGlnZXJfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpCisvKioKKyAgIFRlcm1pbmF0ZSB0aGUgaGFzaCB0byBnZXQgdGhlIGRpZ2VzdAorICAgQHBhcmFtIG1kICBUaGUgaGFzaCBzdGF0ZQorICAgQHBhcmFtIG91dCBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGhhc2ggKDI0IGJ5dGVzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHRpZ2VyX2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpvdXQpCiB7Ci0gICAgX0FSR0NISyhtZCAgICE9IE5VTEwpOwotICAgIF9BUkdDSEsoaGFzaCAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG1kICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG91dCAhPSBOVUxMKTsKIAogICAgIGlmIChtZC0+dGlnZXIuY3VybGVuID49IHNpemVvZihtZC0+dGlnZXIuYnVmKSkgewogICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKQEAgLTY5MCwxNiArNzE2LDIwIEBACiAgICAgdGlnZXJfY29tcHJlc3MobWQsIG1kLT50aWdlci5idWYpOwogCiAgICAgLyogY29weSBvdXRwdXQgKi8KLSAgICBTVE9SRTY0TChtZC0+dGlnZXIuc3RhdGVbMF0sICZoYXNoWzBdKTsKLSAgICBTVE9SRTY0TChtZC0+dGlnZXIuc3RhdGVbMV0sICZoYXNoWzhdKTsKLSAgICBTVE9SRTY0TChtZC0+dGlnZXIuc3RhdGVbMl0sICZoYXNoWzE2XSk7Ci0jaWZkZWYgQ0xFQU5fU1RBQ0sKKyAgICBTVE9SRTY0TChtZC0+dGlnZXIuc3RhdGVbMF0sICZvdXRbMF0pOworICAgIFNUT1JFNjRMKG1kLT50aWdlci5zdGF0ZVsxXSwgJm91dFs4XSk7CisgICAgU1RPUkU2NEwobWQtPnRpZ2VyLnN0YXRlWzJdLCAmb3V0WzE2XSk7CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICAgemVyb21lbShtZCwgc2l6ZW9mKGhhc2hfc3RhdGUpKTsKICNlbmRpZgogCiAgICAgcmV0dXJuIENSWVBUX09LOwogfQogCisvKioKKyAgU2VsZi10ZXN0IHRoZSBoYXNoCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdHMgaGF2ZSBiZWVuIGRpc2FibGVkCisqLyAgCiBpbnQgIHRpZ2VyX3Rlc3Qodm9pZCkKIHsKICAjaWZuZGVmIExUQ19URVNUCkBAIC03NzcsMyArODA3LDcgQEAKIAogCiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hhc2hlcy90aWdlci5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjUgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMjMgMDI6NDI6MDcgJCAqLwpkaWZmIC0tZ2l0IGEvd2hpcmwuYyBiL3NyYy9oYXNoZXMvd2hpcmwvd2hpcmwuYwpzaW1pbGFyaXR5IGluZGV4IDgyJQpyZW5hbWUgZnJvbSB3aGlybC5jCnJlbmFtZSB0byBzcmMvaGFzaGVzL3doaXJsL3doaXJsLmMKaW5kZXggNTIzM2M0Ny4uMWJkNzk4MyAxMDA2NDQKLS0tIGEvd2hpcmwuYworKysgYi9zcmMvaGFzaGVzL3doaXJsL3doaXJsLmMKQEAgLTYsMjUgKzYsMjggQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwogCi0vKiBXSElSTFBPT0wgKHVzaW5nIHRoZWlyIG5ldyBzYm94KSBoYXNoIGZ1bmN0aW9uIGJ5IFRvbSBTdCBEZW5pcyAqLworLyoqIAorICAgQGZpbGUgd2hpcmwuYworICAgV0hJUkxQT09MICh1c2luZyB0aGVpciBuZXcgc2JveCkgaGFzaCBmdW5jdGlvbiBieSBUb20gU3QgRGVuaXMgCisqLwogCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKICNpZmRlZiBXSElSTFBPT0wKIAotY29uc3Qgc3RydWN0IF9oYXNoX2Rlc2NyaXB0b3Igd2hpcmxwb29sX2Rlc2MgPQorY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3Igd2hpcmxwb29sX2Rlc2MgPQogewogICAgICJ3aGlybHBvb2wiLAogICAgIDExLAogICAgIDY0LAogICAgIDY0LAogCi0gICAgLyogREVSIGVuY29kaW5nIChub3QgeWV0IHN1cHBvcnRlZCkgKi8KLSAgICB7IDB4MDAgfSwKLSAgICAwLAorICAgLyogT0lEICovCisgICB7IDEsIDAsIDEwMTE4LCAzLCAwLCA1NSB9LAorICAgNiwKIAogICAgICZ3aGlybHBvb2xfaW5pdCwKICAgICAmd2hpcmxwb29sX3Byb2Nlc3MsCkBAIC00OSwxMCArNTIsMTAgQEAKICAgICBTQjYoR0IoYSwgaS02LCAxKSkgXiAgICAgICAgICAgICAgICAgXAogICAgIFNCNyhHQihhLCBpLTcsIDApKQogCi0jaWZkZWYgQ0xFQU5fU1RBQ0sKLXN0YXRpYyB2b2lkIF93aGlybHBvb2xfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgX3doaXJscG9vbF9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQogI2Vsc2UKLXN0YXRpYyB2b2lkIHdoaXJscG9vbF9jb21wcmVzcyhoYXNoX3N0YXRlICptZCwgdW5zaWduZWQgY2hhciAqYnVmKQorc3RhdGljIGludCB3aGlybHBvb2xfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKICNlbmRpZgogewogICAgdWxvbmc2NCBLWzJdWzhdLCBUWzNdWzhdOwpAQCAtOTAsNyArOTMsNyBAQAogICAgICAgIC8qIHhvciB0aGUgY29uc3RhbnQgKi8KICAgICAgICBLWzBdWzBdIF49IGNvbnRbeCsxXTsKICAgICAgICAKLSAgICAgICAvKiBhcHBseSBtYWluIHRyYW5zZm9ybSB0byBUWzBdIGludG8gVFsxXSAqLworICAgICAgIC8qIGFwcGx5IG1haW4gdHJhbnNmb3JtIHRvIFRbMV0gaW50byBUWzBdICovCiAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgewogICAgICAgICAgICBUWzBdW3ldID0gdGhldGFfcGlfZ2FtbWEoVFsxXSwgeSkgXiBLWzBdW3ldOwogICAgICAgIH0KQEAgLTEwMCwzMiArMTAzLDU1IEBACiAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7CiAgICAgICBtZC0+d2hpcmxwb29sLnN0YXRlW3hdIF49IFRbMF1beF0gXiBUWzJdW3hdOwogICAgfQorCisgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKIAotI2lmZGVmIENMRUFOX1NUQUNLCi1zdGF0aWMgdm9pZCB3aGlybHBvb2xfY29tcHJlc3MoaGFzaF9zdGF0ZSAqbWQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKK3N0YXRpYyBpbnQgd2hpcmxwb29sX2NvbXByZXNzKGhhc2hfc3RhdGUgKm1kLCB1bnNpZ25lZCBjaGFyICpidWYpCiB7Ci0gICBfd2hpcmxwb29sX2NvbXByZXNzKG1kLCBidWYpOworICAgaW50IGVycjsKKyAgIGVyciA9IF93aGlybHBvb2xfY29tcHJlc3MobWQsIGJ1Zik7CiAgICBidXJuX3N0YWNrKCg1ICogOCAqIHNpemVvZih1bG9uZzY0KSkgKyAoMiAqIHNpemVvZihpbnQpKSk7CisgICByZXR1cm4gZXJyOwogfQogI2VuZGlmCiAKIAotdm9pZCB3aGlybHBvb2xfaW5pdChoYXNoX3N0YXRlICogbWQpCisvKioKKyAgIEluaXRpYWxpemUgdGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBtZCAgIFRoZSBoYXNoIHN0YXRlIHlvdSB3aXNoIHRvIGluaXRpYWxpemUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCB3aGlybHBvb2xfaW5pdChoYXNoX3N0YXRlICogbWQpCiB7Ci0gICBfQVJHQ0hLKG1kICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhtZCAhPSBOVUxMKTsKICAgIHplcm9tZW0oJm1kLT53aGlybHBvb2wsIHNpemVvZihtZC0+d2hpcmxwb29sKSk7CisgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKKy8qKgorICAgUHJvY2VzcyBhIGJsb2NrIG9mIG1lbW9yeSB0aG91Z2ggdGhlIGhhc2gKKyAgIEBwYXJhbSBtZCAgICAgVGhlIGhhc2ggc3RhdGUKKyAgIEBwYXJhbSBpbiAgICAgVGhlIGRhdGEgdG8gaGFzaAorICAgQHBhcmFtIGlubGVuICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIChvY3RldHMpCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCiBIQVNIX1BST0NFU1Mod2hpcmxwb29sX3Byb2Nlc3MsIHdoaXJscG9vbF9jb21wcmVzcywgd2hpcmxwb29sLCA2NCkKIAotaW50IHdoaXJscG9vbF9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqaGFzaCkKKy8qKgorICAgVGVybWluYXRlIHRoZSBoYXNoIHRvIGdldCB0aGUgZGlnZXN0CisgICBAcGFyYW0gbWQgIFRoZSBoYXNoIHN0YXRlCisgICBAcGFyYW0gb3V0IFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgaGFzaCAoNjQgYnl0ZXMpCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgd2hpcmxwb29sX2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpvdXQpCiB7CiAgICAgaW50IGk7CiAKLSAgICBfQVJHQ0hLKG1kICAgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhoYXNoICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsobWQgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0ICE9IE5VTEwpOwogCiAgICAgaWYgKG1kLT53aGlybHBvb2wuY3VybGVuID49IHNpemVvZihtZC0+d2hpcmxwb29sLmJ1ZikpIHsKICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CkBAIC0xNjAsMTUgKzE4NiwxOCBAQAogCiAgICAgLyogY29weSBvdXRwdXQgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgIFNUT1JFNjRIKG1kLT53aGlybHBvb2wuc3RhdGVbaV0sIGhhc2grKDgqaSkpOworICAgICAgICBTVE9SRTY0SChtZC0+d2hpcmxwb29sLnN0YXRlW2ldLCBvdXQrKDgqaSkpOwogICAgIH0KLSNpZmRlZiBDTEVBTl9TVEFDSworI2lmZGVmIExUQ19DTEVBTl9TVEFDSwogICAgIHplcm9tZW0obWQsIHNpemVvZigqbWQpKTsKICNlbmRpZgogICAgIHJldHVybiBDUllQVF9PSzsKIH0KIAotCisvKioKKyAgU2VsZi10ZXN0IHRoZSBoYXNoCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdHMgaGF2ZSBiZWVuIGRpc2FibGVkCisqLyAgCiBpbnQgIHdoaXJscG9vbF90ZXN0KHZvaWQpCiB7CiAgI2lmbmRlZiBMVENfVEVTVApAQCAtMjc4LDMgKzMwNyw3IEBACiAKICNlbmRpZgogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oYXNoZXMvd2hpcmwvd2hpcmwuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzIzIDAyOjQyOjA3ICQgKi8KZGlmZiAtLWdpdCBhL3doaXJsdGFiLmMgYi9zcmMvaGFzaGVzL3doaXJsL3doaXJsdGFiLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gd2hpcmx0YWIuYwpyZW5hbWUgdG8gc3JjL2hhc2hlcy93aGlybC93aGlybHRhYi5jCmluZGV4IDAzMWM2NDMuLmM4M2QwYjIgMTAwNjQ0Ci0tLSBhL3doaXJsdGFiLmMKKysrIGIvc3JjL2hhc2hlcy93aGlybC93aGlybHRhYi5jCkBAIC0xLDMgKzEsNyBAQAorLyoqCisgICBAZmlsZSB3aGlybHRhYi5jCisgICBXSElSTFBPT0wgdGFibGVzLCBUb20gU3QgRGVuaXMKKyovICAgCiBzdGF0aWMgY29uc3QgdWxvbmc2NCBzYm94MFtdID0gewogQ09OU1Q2NCgweDE4MTg2MDE4YzA3ODMwZDgpLCBDT05TVDY0KDB4MjMyMzhjMjMwNWFmNDYyNiksIENPTlNUNjQoMHhjNmM2M2ZjNjdlZjk5MWI4KSwgQ09OU1Q2NCgweGU4ZTg4N2U4MTM2ZmNkZmIpLCAKIENPTlNUNjQoMHg4Nzg3MjY4NzRjYTExM2NiKSwgQ09OU1Q2NCgweGI4YjhkYWI4YTk2MjZkMTEpLCBDT05TVDY0KDB4MDEwMTA0MDEwODA1MDIwOSksIENPTlNUNjQoMHg0ZjRmMjE0ZjQyNmU5ZTBkKSwgCkBAIC02NSwxNiArNjksMTYgQEAKIENPTlNUNjQoMHgyODI4YTAyODVkODg1MDc1KSwgQ09OU1Q2NCgweDVjNWM2ZDVjZGEzMWI4ODYpLCBDT05TVDY0KDB4ZjhmOGM3Zjg5MzNmZWQ2YiksIENPTlNUNjQoMHg4Njg2MjI4NjQ0YTQxMWMyKQogfTsKIAotI2lmZGVmIFNNQUxMX0NPREUKKyNpZmRlZiBMVENfU01BTExfQ09ERQogCiAjZGVmaW5lIFNCMCh4KSBzYm94MFt4XQotI2RlZmluZSBTQjEoeCkgUk9SNjQoc2JveDBbeF0sIDgpCi0jZGVmaW5lIFNCMih4KSBST1I2NChzYm94MFt4XSwgMTYpCi0jZGVmaW5lIFNCMyh4KSBST1I2NChzYm94MFt4XSwgMjQpCi0jZGVmaW5lIFNCNCh4KSBST1I2NChzYm94MFt4XSwgMzIpCi0jZGVmaW5lIFNCNSh4KSBST1I2NChzYm94MFt4XSwgNDApCi0jZGVmaW5lIFNCNih4KSBST1I2NChzYm94MFt4XSwgNDgpCi0jZGVmaW5lIFNCNyh4KSBST1I2NChzYm94MFt4XSwgNTYpCisjZGVmaW5lIFNCMSh4KSBST1I2NGMoc2JveDBbeF0sIDgpCisjZGVmaW5lIFNCMih4KSBST1I2NGMoc2JveDBbeF0sIDE2KQorI2RlZmluZSBTQjMoeCkgUk9SNjRjKHNib3gwW3hdLCAyNCkKKyNkZWZpbmUgU0I0KHgpIFJPUjY0YyhzYm94MFt4XSwgMzIpCisjZGVmaW5lIFNCNSh4KSBST1I2NGMoc2JveDBbeF0sIDQwKQorI2RlZmluZSBTQjYoeCkgUk9SNjRjKHNib3gwW3hdLCA0OCkKKyNkZWZpbmUgU0I3KHgpIFJPUjY0YyhzYm94MFt4XSwgNTYpCiAKICNlbHNlCiAKQEAgLTU3MywzICs1NzcsNyBAQAogQ09OU1Q2NCgweDYzMDJhYTcxYzgxOTQ5ZDkpLAogfTsKIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvaGFzaGVzL3doaXJsL3doaXJsdGFiLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMiAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS90b21tYXRoLmggYi9zcmMvaGVhZGVycy9sdGNfdG9tbWF0aC5oCnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIHRvbW1hdGguaApyZW5hbWUgdG8gc3JjL2hlYWRlcnMvbHRjX3RvbW1hdGguaAppbmRleCBiYzUwY2U5Li4yZDYyYjRlIDEwMDY0NAotLS0gYS90b21tYXRoLmgKKysrIGIvc3JjL2hlYWRlcnMvbHRjX3RvbW1hdGguaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKLSNkZWZpbmUgTk9fTFRNX1RPT00gMQorI2luY2x1ZGUgPHRvbW1hdGhfY2xhc3MuaD4KIAogI3VuZGVmIE1JTgogI2RlZmluZSBNSU4oeCx5KSAoKHgpPCh5KT8oeCk6KHkpKQpAQCAtNDEsNiArNDEsMTQgQEAKIAogI2VuZGlmCiAKKworLyogZGV0ZWN0IDY0LWJpdCBtb2RlIGlmIHBvc3NpYmxlICovCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAKKyAgICNpZiAhKGRlZmluZWQoTVBfNjRCSVQpICYmIGRlZmluZWQoTVBfMTZCSVQpICYmIGRlZmluZWQoTVBfOEJJVCkpCisgICAgICAjZGVmaW5lIE1QXzY0QklUCisgICAjZW5kaWYKKyNlbmRpZgorCiAvKiBzb21lIGRlZmF1bHQgY29uZmlndXJhdGlvbnMuCiAgKgogICogQSAibXBfZGlnaXQiIG11c3QgYmUgYWJsZSB0byBob2xkIERJR0lUX0JJVCArIDEgYml0cwpAQCAtNjIsNyArNzAsNyBAQAogICAgdHlwZWRlZiBzaWduZWQgbG9uZyBsb25nICAgbG9uZzY0OwogI2VuZGlmCiAKLSAgIHR5cGVkZWYgdWxvbmc2NCAgICAgICAgICAgIG1wX2RpZ2l0OworICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgbXBfZGlnaXQ7CiAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICAgICBtcF93b3JkIF9fYXR0cmlidXRlX18gKChtb2RlKFRJKSkpOwogCiAgICAjZGVmaW5lIERJR0lUX0JJVCAgICAgICAgICA2MApAQCAtMTA0LDcgKzExMiw3IEBACiAgICAjZWxzZQogICAgICAgLyogcHJvdG90eXBlcyBmb3Igb3VyIGhlYXAgZnVuY3Rpb25zICovCiAgICAgICBleHRlcm4gdm9pZCAqWE1BTExPQyhzaXplX3Qgbik7Ci0gICAgICBleHRlcm4gdm9pZCAqUkVBTExPQyh2b2lkICpwLCBzaXplX3Qgbik7CisgICAgICBleHRlcm4gdm9pZCAqWFJFQUxMT0Modm9pZCAqcCwgc2l6ZV90IG4pOwogICAgICAgZXh0ZXJuIHZvaWQgKlhDQUxMT0Moc2l6ZV90IG4sIHNpemVfdCBzKTsKICAgICAgIGV4dGVybiB2b2lkIFhGUkVFKHZvaWQgKnApOwogICAgI2VuZGlmCkBAIC0xMzksNyArMTQ3LDYgQEAKIC8qIFByaW1hbGl0eSBnZW5lcmF0aW9uIGZsYWdzICovCiAjZGVmaW5lIExUTV9QUklNRV9CQlMgICAgICAweDAwMDEgLyogQkJTIHN0eWxlIHByaW1lICovCiAjZGVmaW5lIExUTV9QUklNRV9TQUZFICAgICAweDAwMDIgLyogU2FmZSBwcmltZSAocC0xKS8yID09IHByaW1lICovCi0jZGVmaW5lIExUTV9QUklNRV8yTVNCX09GRiAweDAwMDQgLyogZm9yY2UgMm5kIE1TQiB0byAwICovCiAjZGVmaW5lIExUTV9QUklNRV8yTVNCX09OICAweDAwMDggLyogZm9yY2UgMm5kIE1TQiB0byAxICovCiAKIHR5cGVkZWYgaW50ICAgICAgICAgICBtcF9lcnI7CkBAIC0xNTUsNyArMTYyLDcgQEAKIAogLyogZGVmYXVsdCBwcmVjaXNpb24gKi8KICNpZm5kZWYgTVBfUFJFQwotICAgI2lmZGVmIE1QX0xPV19NRU0KKyAgICNpZm5kZWYgTVBfTE9XX01FTQogICAgICAgI2RlZmluZSBNUF9QUkVDICAgICAgICAgICAgICAgICA2NCAgICAgLyogZGVmYXVsdCBkaWdpdHMgb2YgcHJlY2lzaW9uICovCiAgICAjZWxzZQogICAgICAgI2RlZmluZSBNUF9QUkVDICAgICAgICAgICAgICAgICA4ICAgICAgLyogZGVmYXVsdCBkaWdpdHMgb2YgcHJlY2lzaW9uICovCkBAIC00MjEsNiArNDI4LDE1IEBACiAvKiByZWR1Y2VzIGEgbW9kdWxvIGIgd2hlcmUgYiBpcyBvZiB0aGUgZm9ybSAyKipwIC0gayBbMCA8PSBhXSAqLwogaW50IG1wX3JlZHVjZV8yayhtcF9pbnQgKmEsIG1wX2ludCAqbiwgbXBfZGlnaXQgZCk7CiAKKy8qIHJldHVybnMgdHJ1ZSBpZiBhIGNhbiBiZSByZWR1Y2VkIHdpdGggbXBfcmVkdWNlXzJrX2wgKi8KK2ludCBtcF9yZWR1Y2VfaXNfMmtfbChtcF9pbnQgKmEpOworCisvKiBkZXRlcm1pbmVzIGsgdmFsdWUgZm9yIDJrIHJlZHVjdGlvbiAqLworaW50IG1wX3JlZHVjZV8ya19zZXR1cF9sKG1wX2ludCAqYSwgbXBfaW50ICpkKTsKKworLyogcmVkdWNlcyBhIG1vZHVsbyBiIHdoZXJlIGIgaXMgb2YgdGhlIGZvcm0gMioqcCAtIGsgWzAgPD0gYV0gKi8KK2ludCBtcF9yZWR1Y2VfMmtfbChtcF9pbnQgKmEsIG1wX2ludCAqbiwgbXBfaW50ICpkKTsKKwogLyogZCA9IGEqKmIgKG1vZCBjKSAqLwogaW50IG1wX2V4cHRtb2QobXBfaW50ICphLCBtcF9pbnQgKmIsIG1wX2ludCAqYywgbXBfaW50ICpkKTsKIApAQCAtNDM0LDcgKzQ1MCw3IEBACiAjZW5kaWYKIAogLyogdGFibGUgb2YgZmlyc3QgUFJJTUVfU0laRSBwcmltZXMgKi8KLWV4dGVybiBjb25zdCBtcF9kaWdpdCBfX3ByaW1lX3RhYltdOworZXh0ZXJuIGNvbnN0IG1wX2RpZ2l0IGx0bV9wcmltZV90YWJbXTsKIAogLyogcmVzdWx0PTEgaWYgYSBpcyBkaXZpc2libGUgYnkgb25lIG9mIHRoZSBmaXJzdCBQUklNRV9TSVpFIHByaW1lcyAqLwogaW50IG1wX3ByaW1lX2lzX2RpdmlzaWJsZShtcF9pbnQgKmEsIGludCAqcmVzdWx0KTsKQEAgLTUwMSwxNCArNTE3LDE2IEBACiBpbnQgbXBfY291bnRfYml0cyhtcF9pbnQgKmEpOwogCiBpbnQgbXBfdW5zaWduZWRfYmluX3NpemUobXBfaW50ICphKTsKLWludCBtcF9yZWFkX3Vuc2lnbmVkX2JpbihtcF9pbnQgKmEsIHVuc2lnbmVkIGNoYXIgKmIsIGludCBjKTsKK2ludCBtcF9yZWFkX3Vuc2lnbmVkX2JpbihtcF9pbnQgKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmIsIGludCBjKTsKIGludCBtcF90b191bnNpZ25lZF9iaW4obXBfaW50ICphLCB1bnNpZ25lZCBjaGFyICpiKTsKK2ludCBtcF90b191bnNpZ25lZF9iaW5fbiAobXBfaW50ICogYSwgdW5zaWduZWQgY2hhciAqYiwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKIAogaW50IG1wX3NpZ25lZF9iaW5fc2l6ZShtcF9pbnQgKmEpOwotaW50IG1wX3JlYWRfc2lnbmVkX2JpbihtcF9pbnQgKmEsIHVuc2lnbmVkIGNoYXIgKmIsIGludCBjKTsKLWludCBtcF90b19zaWduZWRfYmluKG1wX2ludCAqYSwgdW5zaWduZWQgY2hhciAqYik7CitpbnQgbXBfcmVhZF9zaWduZWRfYmluKG1wX2ludCAqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqYiwgaW50IGMpOworaW50IG1wX3RvX3NpZ25lZF9iaW4obXBfaW50ICphLCAgdW5zaWduZWQgY2hhciAqYik7CitpbnQgbXBfdG9fc2lnbmVkX2Jpbl9uIChtcF9pbnQgKiBhLCB1bnNpZ25lZCBjaGFyICpiLCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwogCi1pbnQgbXBfcmVhZF9yYWRpeChtcF9pbnQgKmEsIGNoYXIgKnN0ciwgaW50IHJhZGl4KTsKK2ludCBtcF9yZWFkX3JhZGl4KG1wX2ludCAqYSwgY29uc3QgY2hhciAqc3RyLCBpbnQgcmFkaXgpOwogaW50IG1wX3RvcmFkaXgobXBfaW50ICphLCBjaGFyICpzdHIsIGludCByYWRpeCk7CiBpbnQgbXBfdG9yYWRpeF9uKG1wX2ludCAqIGEsIGNoYXIgKnN0ciwgaW50IHJhZGl4LCBpbnQgbWF4bGVuKTsKIGludCBtcF9yYWRpeF9zaXplKG1wX2ludCAqYSwgaW50IHJhZGl4LCBpbnQgKnNpemUpOwpAQCAtNTQzLDkgKzU2MSwxMCBAQAogaW50IG1wX2thcmF0c3ViYV9zcXIobXBfaW50ICphLCBtcF9pbnQgKmIpOwogaW50IG1wX3Rvb21fc3FyKG1wX2ludCAqYSwgbXBfaW50ICpiKTsKIGludCBmYXN0X21wX2ludm1vZChtcF9pbnQgKmEsIG1wX2ludCAqYiwgbXBfaW50ICpjKTsKK2ludCBtcF9pbnZtb2Rfc2xvdyAobXBfaW50ICogYSwgbXBfaW50ICogYiwgbXBfaW50ICogYyk7CiBpbnQgZmFzdF9tcF9tb250Z29tZXJ5X3JlZHVjZShtcF9pbnQgKmEsIG1wX2ludCAqbSwgbXBfZGlnaXQgbXApOwogaW50IG1wX2V4cHRtb2RfZmFzdChtcF9pbnQgKkcsIG1wX2ludCAqWCwgbXBfaW50ICpQLCBtcF9pbnQgKlksIGludCBtb2RlKTsKLWludCBzX21wX2V4cHRtb2QgKG1wX2ludCAqIEcsIG1wX2ludCAqIFgsIG1wX2ludCAqIFAsIG1wX2ludCAqIFkpOworaW50IHNfbXBfZXhwdG1vZCAobXBfaW50ICogRywgbXBfaW50ICogWCwgbXBfaW50ICogUCwgbXBfaW50ICogWSwgaW50IG1vZGUpOwogdm9pZCBibl9yZXZlcnNlKHVuc2lnbmVkIGNoYXIgKnMsIGludCBsZW4pOwogCiBleHRlcm4gY29uc3QgY2hhciAqbXBfc19ybWFwOwpAQCAtNTU2LDMgKzU3NSw3IEBACiAKICNlbmRpZgogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oZWFkZXJzL2x0Y190b21tYXRoLmgsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9teWNyeXB0LmggYi9zcmMvaGVhZGVycy90b21jcnlwdC5oCnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIG15Y3J5cHQuaApyZW5hbWUgdG8gc3JjL2hlYWRlcnMvdG9tY3J5cHQuaAppbmRleCA5M2VkNDkyLi40ODA0MTk0IDEwMDY0NAotLS0gYS9teWNyeXB0LmgKKysrIGIvc3JjL2hlYWRlcnMvdG9tY3J5cHQuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgQ1JZUFRfSF8KLSNkZWZpbmUgQ1JZUFRfSF8KKyNpZm5kZWYgVE9NQ1JZUFRfSF8KKyNkZWZpbmUgVE9NQ1JZUFRfSF8KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtOCwxOSArOCwxOSBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKLS8qIGlmIHRoZXJlIGlzIGEgY3VzdG9tIGRlZmluaXRpb24gaGVhZGVyIGZpbGUgdXNlIGl0ICovCi0jaW5jbHVkZSA8bXljcnlwdF9jdXN0b20uaD4KKy8qIHVzZSBjb25maWd1cmF0aW9uIGRhdGEgKi8KKyNpbmNsdWRlIDx0b21jcnlwdF9jdXN0b20uaD4KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCiAvKiB2ZXJzaW9uICovCi0jZGVmaW5lIENSWVBUICAgMHgwMDk2Ci0jZGVmaW5lIFNDUllQVCAgIjAuOTYiCisjZGVmaW5lIENSWVBUICAgMHgwMTA1CisjZGVmaW5lIFNDUllQVCAgIjEuMDUiCiAKIC8qIG1heCBzaXplIG9mIGVpdGhlciBhIGNpcGhlci9oYXNoIGJsb2NrIG9yIHN5bW1ldHJpYyBrZXkgW2xhcmdlc3Qgb2YgdGhlIHR3b10gKi8KLSNkZWZpbmUgTUFYQkxPQ0tTSVpFICAgICAgICAgICAxMjgKKyNkZWZpbmUgTUFYQkxPQ0tTSVpFICAxMjgKIAogLyogZGVzY3JpcHRvciB0YWJsZSBzaXplICovCiAvKiBEcm9wYmVhciBjaGFuZ2UgLSB0aGlzIHNob3VsZCBiZSBzbWFsbGVyLCBzYXZlcyBzb21lIHNpemUgKi8KQEAgLTYzLDE5ICs2MywyNCBAQAogICAgQ1JZUFRfSU5WQUxJRF9QUklNRV9TSVpFLyogSW52YWxpZCBzaXplIG9mIHByaW1lIHJlcXVlc3RlZCAqLwogfTsKIAotI2luY2x1ZGUgPG15Y3J5cHRfY2ZnLmg+Ci0jaW5jbHVkZSA8bXljcnlwdF9tYWNyb3MuaD4KLSNpbmNsdWRlIDxteWNyeXB0X2NpcGhlci5oPgotI2luY2x1ZGUgPG15Y3J5cHRfaGFzaC5oPgotI2luY2x1ZGUgPG15Y3J5cHRfcHJuZy5oPgotI2luY2x1ZGUgPG15Y3J5cHRfcGsuaD4KLSNpbmNsdWRlIDxteWNyeXB0X21pc2MuaD4KLSNpbmNsdWRlIDxteWNyeXB0X2FyZ2Noay5oPgotI2luY2x1ZGUgPG15Y3J5cHRfcGtjcy5oPgorI2luY2x1ZGUgPHRvbWNyeXB0X2NmZy5oPgorI2luY2x1ZGUgPHRvbWNyeXB0X21hY3Jvcy5oPgorI2luY2x1ZGUgPHRvbWNyeXB0X2NpcGhlci5oPgorI2luY2x1ZGUgPHRvbWNyeXB0X2hhc2guaD4KKyNpbmNsdWRlIDx0b21jcnlwdF9tYWMuaD4KKyNpbmNsdWRlIDx0b21jcnlwdF9wcm5nLmg+CisjaW5jbHVkZSA8dG9tY3J5cHRfcGsuaD4KKyNpbmNsdWRlIDx0b21jcnlwdF9taXNjLmg+CisjaW5jbHVkZSA8dG9tY3J5cHRfYXJnY2hrLmg+CisjaW5jbHVkZSA8dG9tY3J5cHRfcGtjcy5oPgogCiAjaWZkZWYgX19jcGx1c3BsdXMKICAgIH0KICNlbmRpZgogCi0jZW5kaWYgLyogQ1JZUFRfSF8gKi8KKyNlbmRpZiAvKiBUT01DUllQVF9IXyAqLwogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oZWFkZXJzL3RvbWNyeXB0LmgsdiAkICovCisvKiAkUmV2aXNpb246IDEuNyAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOSAxODowMzoyNSAkICovCmRpZmYgLS1naXQgYS9zcmMvaGVhZGVycy90b21jcnlwdF9hcmdjaGsuaCBiL3NyYy9oZWFkZXJzL3RvbWNyeXB0X2FyZ2Noay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMzQ0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaGVhZGVycy90b21jcnlwdF9hcmdjaGsuaApAQCAtMCwwICsxLDI1IEBACisvKiBEZWZpbmVzIHRoZSBMVENfQVJHQ0hLIG1hY3JvIHVzZWQgd2l0aGluIHRoZSBsaWJyYXJ5ICovCisvKiBBUkdUWVBFIGlzIGRlZmluZWQgaW4gbXljcnlwdF9jZmcuaCAqLworI2lmIEFSR1RZUEUgPT0gMAorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKy8qIHRoaXMgaXMgdGhlIGRlZmF1bHQgTGliVG9tQ3J5cHQgbWFjcm8gICovCit2b2lkIGNyeXB0X2FyZ2NoayhjaGFyICp2LCBjaGFyICpzLCBpbnQgZCk7CisjZGVmaW5lIExUQ19BUkdDSEsoeCkgaWYgKCEoeCkpIHsgY3J5cHRfYXJnY2hrKCN4LCBfX0ZJTEVfXywgX19MSU5FX18pOyB9CisKKyNlbGlmIEFSR1RZUEUgPT0gMQorCisvKiBmYXRhbCB0eXBlIG9mIGVycm9yICovCisjZGVmaW5lIExUQ19BUkdDSEsoeCkgYXNzZXJ0KCh4KSkKKworI2VsaWYgQVJHVFlQRSA9PSAyCisKKyNkZWZpbmUgTFRDX0FSR0NISyh4KSAKKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hlYWRlcnMvdG9tY3J5cHRfYXJnY2hrLmgsdiAkICovCisvKiAkUmV2aXNpb246IDEuMiAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvaGVhZGVycy90b21jcnlwdF9jZmcuaCBiL3NyYy9oZWFkZXJzL3RvbWNyeXB0X2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNWJjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaGVhZGVycy90b21jcnlwdF9jZmcuaApAQCAtMCwwICsxLDExMiBAQAorLyogVGhpcyBpcyB0aGUgYnVpbGQgY29uZmlnIGZpbGUuCisgKgorICogV2l0aCB0aGlzIHlvdSBjYW4gc2V0dXAgd2hhdCB0byBpbmxjdWRlL2V4Y2x1ZGUgYXV0b21hdGljYWxseSBkdXJpbmcgYW55IGJ1aWxkLiAgSnVzdCBjb21tZW50CisgKiBvdXQgdGhlIGxpbmUgdGhhdCAjZGVmaW5lJ3MgdGhlIHdvcmQgZm9yIHRoZSB0aGluZyB5b3Ugd2FudCB0byByZW1vdmUuICBwaGV3IQorICovCisKKyNpZm5kZWYgVE9NQ1JZUFRfQ0ZHX0gKKyNkZWZpbmUgVE9NQ1JZUFRfQ0ZHX0gKKworLyogeW91IGNhbiBjaGFuZ2UgaG93IG1lbW9yeSBhbGxvY2F0aW9uIHdvcmtzIC4uLiAqLwordm9pZCAqWE1BTExPQyhzaXplX3Qgbik7Cit2b2lkICpYUkVBTExPQyh2b2lkICpwLCBzaXplX3Qgbik7Cit2b2lkICpYQ0FMTE9DKHNpemVfdCBuLCBzaXplX3Qgcyk7Cit2b2lkIFhGUkVFKHZvaWQgKnApOworCisvKiBjaGFuZ2UgdGhlIGNsb2NrIGZ1bmN0aW9uIHRvbyAqLworIGNsb2NrX3QgWENMT0NLKHZvaWQpOworCisvKiB2YXJpb3VzIG90aGVyIGZ1bmN0aW9ucyAqLwordm9pZCAqWE1FTUNQWSh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBuKTsKK2ludCAgIFhNRU1DTVAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3Qgbik7CisKKy8qIHR5cGUgb2YgYXJndW1lbnQgY2hlY2tpbmcsIDA9ZGVmYXVsdCwgMT1mYXRhbCBhbmQgMj1ub25lICovCisjZGVmaW5lIEFSR1RZUEUgIDAKKworLyogQ29udHJvbHMgZW5kaWFuZXNzIGFuZCBzaXplIG9mIHJlZ2lzdGVycy4gIExlYXZlIHVuY29tbWVudGVkIHRvIGdldCBwbGF0Zm9ybSBuZXV0cmFsIFtzbG93ZXJdIGNvZGUgCisgKiAKKyAqIE5vdGU6IGluIG9yZGVyIHRvIHVzZSB0aGUgb3B0aW1pemVkIG1hY3JvcyB5b3VyIHBsYXRmb3JtIG11c3Qgc3VwcG9ydCB1bmFsaWduZWQgMzIgYW5kIDY0IGJpdCByZWFkL3dyaXRlcy4KKyAqIFRoZSB4ODYgcGxhdGZvcm1zIGFsbG93IHRoaXMgYnV0IHNvbWUgb3RoZXJzIFtBUk0gZm9yIGluc3RhbmNlXSBkbyBub3QuICBPbiB0aG9zZSBwbGF0Zm9ybXMgeW91ICoqTVVTVCoqCisgKiB1c2UgdGhlIHBvcnRhYmxlIFtzbG93ZXJdIG1hY3Jvcy4KKyAqLworCisvKiBkZXRlY3QgeDg2LTMyIG1hY2hpbmVzIHNvbWV3aGF0ICovCisjaWYgZGVmaW5lZChJTlRFTF9DQykgfHwgKGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoV0lOMzIpKSB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19ESkdQUF9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pIHx8IGRlZmluZWQoX19pMzg2X18pKSkKKyAgICNkZWZpbmUgRU5ESUFOX0xJVFRMRQorICAgI2RlZmluZSBFTkRJQU5fMzJCSVRXT1JECisgICAjZGVmaW5lIExUQ19GQVNUCisgICAjZGVmaW5lIExUQ19GQVNUX1RZUEUgICAgdW5zaWduZWQgbG9uZworI2VuZGlmCisKKy8qIGRldGVjdHMgTUlQUyBSNTkwMCBwcm9jZXNzb3JzIChQUzIpICovCisjaWYgKGRlZmluZWQoX19SNTkwMCkgfHwgZGVmaW5lZChSNTkwMCkgfHwgZGVmaW5lZChfX1I1OTAwX18pKSAmJiAoZGVmaW5lZChfbWlwcykgfHwgZGVmaW5lZChfX21pcHNfXykgfHwgZGVmaW5lZChtaXBzKSkKKyAgICNkZWZpbmUgRU5ESUFOX0xJVFRMRQorICAgI2RlZmluZSBFTkRJQU5fNjRCSVRXT1JECisjZW5kaWYKKworLyogZGV0ZWN0IGFtZDY0ICovCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorICAgI2RlZmluZSBFTkRJQU5fTElUVExFCisgICAjZGVmaW5lIEVORElBTl82NEJJVFdPUkQKKyAgICNkZWZpbmUgTFRDX0ZBU1QKKyAgICNkZWZpbmUgTFRDX0ZBU1RfVFlQRSAgICB1bnNpZ25lZCBsb25nCisjZW5kaWYKKworI2lmZGVmIExUQ19OT19GQVNUCisgICAjaWZkZWYgTFRDX0ZBU1QKKyAgICAgICN1bmRlZiBMVENfRkFTVAorICAgI2VuZGlmCisjZW5kaWYKKworLyogTm8gYXNtIGlzIGEgcXVpY2sgd2F5IHRvIGRpc2FibGUgYW55dGhpbmcgIm5vdCBwb3J0YWJsZSIgKi8KKyNpZmRlZiBMVENfTk9fQVNNCisgICAjdW5kZWYgRU5ESUFOX0xJVFRMRQorICAgI3VuZGVmIEVORElBTl9CSUcKKyAgICN1bmRlZiBFTkRJQU5fMzJCSVRXT1JECisgICAjdW5kZWYgRU5ESUFOXzY0QklUV09SRAorICAgI3VuZGVmIExUQ19GQVNUCisgICAjdW5kZWYgTFRDX0ZBU1RfVFlQRQorICAgI2RlZmluZSBMVENfTk9fUk9MQworCSNkZWZpbmUgTFRDX05PX0JTV0FQCisjZW5kaWYKKworLyogI2RlZmluZSBFTkRJQU5fTElUVExFICovCisvKiAjZGVmaW5lIEVORElBTl9CSUcgKi8KKworLyogI2RlZmluZSBFTkRJQU5fMzJCSVRXT1JEICovCisvKiAjZGVmaW5lIEVORElBTl82NEJJVFdPUkQgKi8KKworI2lmIChkZWZpbmVkKEVORElBTl9CSUcpIHx8IGRlZmluZWQoRU5ESUFOX0xJVFRMRSkpICYmICEoZGVmaW5lZChFTkRJQU5fMzJCSVRXT1JEKSB8fCBkZWZpbmVkKEVORElBTl82NEJJVFdPUkQpKQorICAgICNlcnJvciBZb3UgbXVzdCBzcGVjaWZ5IGEgd29yZCBzaXplIGFzIHdlbGwgYXMgZW5kaWFuZXNzIGluIG15Y3J5cHRfY2ZnLmgKKyNlbmRpZgorCisjaWYgIShkZWZpbmVkKEVORElBTl9CSUcpIHx8IGRlZmluZWQoRU5ESUFOX0xJVFRMRSkpCisgICAjZGVmaW5lIEVORElBTl9ORVVUUkFMCisjZW5kaWYKKworLyogcGFja2V0IGNvZGUgKi8KKyNpZiBkZWZpbmVkKE1SU0EpIHx8IGRlZmluZWQoTURIKSB8fCBkZWZpbmVkKE1FQ0MpCisgICAgI2RlZmluZSBQQUNLRVQKKworICAgIC8qIHNpemUgb2YgYSBwYWNrZXQgaGVhZGVyIGluIGJ5dGVzICovCisgICAgI2RlZmluZSBQQUNLRVRfU0laRSAgICAgICAgICAgIDQKKworICAgIC8qIFNlY3Rpb24gdGFncyAqLworICAgICNkZWZpbmUgUEFDS0VUX1NFQ1RfUlNBICAgICAgICAwCisgICAgI2RlZmluZSBQQUNLRVRfU0VDVF9ESCAgICAgICAgIDEKKyAgICAjZGVmaW5lIFBBQ0tFVF9TRUNUX0VDQyAgICAgICAgMgorICAgICNkZWZpbmUgUEFDS0VUX1NFQ1RfRFNBICAgICAgICAzCisKKyAgICAvKiBTdWJzZWN0aW9uIFRhZ3MgZm9yIHRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyAqLworICAgICNkZWZpbmUgUEFDS0VUX1NVQl9LRVkgICAgICAgICAwCisgICAgI2RlZmluZSBQQUNLRVRfU1VCX0VOQ1JZUFRFRCAgIDEKKyAgICAjZGVmaW5lIFBBQ0tFVF9TVUJfU0lHTkVEICAgICAgMgorICAgICNkZWZpbmUgUEFDS0VUX1NVQl9FTkNfS0VZICAgICAzCisjZW5kaWYKKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hlYWRlcnMvdG9tY3J5cHRfY2ZnLmgsdiAkICovCisvKiAkUmV2aXNpb246IDEuNyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvaGVhZGVycy90b21jcnlwdF9jaXBoZXIuaCBiL3NyYy9oZWFkZXJzL3RvbWNyeXB0X2NpcGhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDAzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaGVhZGVycy90b21jcnlwdF9jaXBoZXIuaApAQCAtMCwwICsxLDYyOSBAQAorLyogLS0tLSBTWU1NRVRSSUMgS0VZIFNUVUZGIC0tLS0tCisgKgorICogV2UgcHV0IGVhY2ggb2YgdGhlIGNpcGhlcnMgc2NoZWR1bGVkIGtleXMgaW4gdGhlaXIgb3duIHN0cnVjdHMgdGhlbiB3ZSBwdXQgYWxsIG9mIAorICogdGhlIGtleSBmb3JtYXRzIGluIG9uZSB1bmlvbi4gIFRoaXMgbWFrZXMgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgZWFzaWVyIHRvIHVzZS4KKyAqLworI2lmZGVmIEJMT1dGSVNICitzdHJ1Y3QgYmxvd2Zpc2hfa2V5IHsKKyAgIHVsb25nMzIgU1s0XVsyNTZdOworICAgdWxvbmczMiBLWzE4XTsKK307CisjZW5kaWYKKworI2lmZGVmIFJDNQorc3RydWN0IHJjNV9rZXkgeworICAgaW50IHJvdW5kczsKKyAgIHVsb25nMzIgS1s1MF07Cit9OworI2VuZGlmCisKKyNpZmRlZiBSQzYKK3N0cnVjdCByYzZfa2V5IHsKKyAgIHVsb25nMzIgS1s0NF07Cit9OworI2VuZGlmCisKKyNpZmRlZiBTQUZFUlAKK3N0cnVjdCBzYWZlcnBfa2V5IHsKKyAgIHVuc2lnbmVkIGNoYXIgS1szM11bMTZdOworICAgbG9uZyByb3VuZHM7Cit9OworI2VuZGlmCisKKyNpZmRlZiBSSUpOREFFTAorc3RydWN0IHJpam5kYWVsX2tleSB7CisgICB1bG9uZzMyIGVLWzYwXSwgZEtbNjBdOworICAgaW50IE5yOworfTsKKyNlbmRpZgorCisjaWZkZWYgWFRFQQorc3RydWN0IHh0ZWFfa2V5IHsKKyAgIHVuc2lnbmVkIGxvbmcgQVszMl0sIEJbMzJdOworfTsKKyNlbmRpZgorCisjaWZkZWYgVFdPRklTSAorI2lmbmRlZiBUV09GSVNIX1NNQUxMCisgICBzdHJ1Y3QgdHdvZmlzaF9rZXkgeworICAgICAgdWxvbmczMiBTWzRdWzI1Nl0sIEtbNDBdOworICAgfTsKKyNlbHNlCisgICBzdHJ1Y3QgdHdvZmlzaF9rZXkgeworICAgICAgdWxvbmczMiBLWzQwXTsKKyAgICAgIHVuc2lnbmVkIGNoYXIgU1szMl0sIHN0YXJ0OworICAgfTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBTQUZFUgorI2RlZmluZSBTQUZFUl9LNjRfREVGQVVMVF9OT0ZfUk9VTkRTICAgICA2CisjZGVmaW5lIFNBRkVSX0sxMjhfREVGQVVMVF9OT0ZfUk9VTkRTICAgMTAKKyNkZWZpbmUgU0FGRVJfU0s2NF9ERUZBVUxUX05PRl9ST1VORFMgICAgOAorI2RlZmluZSBTQUZFUl9TSzEyOF9ERUZBVUxUX05PRl9ST1VORFMgIDEwCisjZGVmaW5lIFNBRkVSX01BWF9OT0ZfUk9VTkRTICAgICAgICAgICAgMTMKKyNkZWZpbmUgU0FGRVJfQkxPQ0tfTEVOICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBTQUZFUl9LRVlfTEVOICAgICAoMSArIFNBRkVSX0JMT0NLX0xFTiAqICgxICsgMiAqIFNBRkVSX01BWF9OT0ZfUk9VTkRTKSkKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBzYWZlcl9ibG9ja190W1NBRkVSX0JMT0NLX0xFTl07Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgc2FmZXJfa2V5X3RbU0FGRVJfS0VZX0xFTl07CitzdHJ1Y3Qgc2FmZXJfa2V5IHsgc2FmZXJfa2V5X3Qga2V5OyB9OworI2VuZGlmCisKKyNpZmRlZiBSQzIKK3N0cnVjdCByYzJfa2V5IHsgdW5zaWduZWQgeGtleVs2NF07IH07CisjZW5kaWYKKworI2lmZGVmIERFUworc3RydWN0IGRlc19rZXkgeworICAgIHVsb25nMzIgZWtbMzJdLCBka1szMl07Cit9OworCitzdHJ1Y3QgZGVzM19rZXkgeworICAgIHVsb25nMzIgZWtbM11bMzJdLCBka1szXVszMl07Cit9OworI2VuZGlmCisKKyNpZmRlZiBDQVNUNQorc3RydWN0IGNhc3Q1X2tleSB7CisgICAgdWxvbmczMiBLWzMyXSwga2V5bGVuOworfTsKKyNlbmRpZgorCisjaWZkZWYgTk9FS0VPTgorc3RydWN0IG5vZWtlb25fa2V5IHsKKyAgICB1bG9uZzMyIEtbNF0sIGRLWzRdOworfTsKKyNlbmRpZgorCisjaWZkZWYgU0tJUEpBQ0sgCitzdHJ1Y3Qgc2tpcGphY2tfa2V5IHsKKyAgICB1bnNpZ25lZCBjaGFyIGtleVsxMF07Cit9OworI2VuZGlmCisKKyNpZmRlZiBLSEFaQUQKK3N0cnVjdCBraGF6YWRfa2V5IHsKKyAgIHVsb25nNjQgcm91bmRLZXlFbmNbOCArIDFdOyAKKyAgIHVsb25nNjQgcm91bmRLZXlEZWNbOCArIDFdOyAKK307CisjZW5kaWYKKworI2lmZGVmIEFOVUJJUworc3RydWN0IGFudWJpc19rZXkgeyAKKyAgIGludCBrZXlCaXRzOyAKKyAgIGludCBSOyAKKyAgIHVsb25nMzIgcm91bmRLZXlFbmNbMTggKyAxXVs0XTsgCisgICB1bG9uZzMyIHJvdW5kS2V5RGVjWzE4ICsgMV1bNF07IAorfTsgCisjZW5kaWYKKwordHlwZWRlZiB1bmlvbiBTeW1tZXRyaWNfa2V5IHsKKyNpZmRlZiBERVMKKyAgIHN0cnVjdCBkZXNfa2V5IGRlczsKKyAgIHN0cnVjdCBkZXMzX2tleSBkZXMzOworI2VuZGlmCisjaWZkZWYgUkMyCisgICBzdHJ1Y3QgcmMyX2tleSByYzI7CisjZW5kaWYKKyNpZmRlZiBTQUZFUgorICAgc3RydWN0IHNhZmVyX2tleSBzYWZlcjsKKyNlbmRpZgorI2lmZGVmIFRXT0ZJU0gKKyAgIHN0cnVjdCB0d29maXNoX2tleSAgdHdvZmlzaDsKKyNlbmRpZgorI2lmZGVmIEJMT1dGSVNICisgICBzdHJ1Y3QgYmxvd2Zpc2hfa2V5IGJsb3dmaXNoOworI2VuZGlmCisjaWZkZWYgUkM1CisgICBzdHJ1Y3QgcmM1X2tleSAgICAgIHJjNTsKKyNlbmRpZgorI2lmZGVmIFJDNgorICAgc3RydWN0IHJjNl9rZXkgICAgICByYzY7CisjZW5kaWYKKyNpZmRlZiBTQUZFUlAKKyAgIHN0cnVjdCBzYWZlcnBfa2V5ICAgc2FmZXJwOworI2VuZGlmCisjaWZkZWYgUklKTkRBRUwKKyAgIHN0cnVjdCByaWpuZGFlbF9rZXkgcmlqbmRhZWw7CisjZW5kaWYKKyNpZmRlZiBYVEVBCisgICBzdHJ1Y3QgeHRlYV9rZXkgICAgIHh0ZWE7CisjZW5kaWYKKyNpZmRlZiBDQVNUNQorICAgc3RydWN0IGNhc3Q1X2tleSAgICBjYXN0NTsKKyNlbmRpZgorI2lmZGVmIE5PRUtFT04KKyAgIHN0cnVjdCBub2VrZW9uX2tleSAgbm9la2VvbjsKKyNlbmRpZiAgIAorI2lmZGVmIFNLSVBKQUNLCisgICBzdHJ1Y3Qgc2tpcGphY2tfa2V5IHNraXBqYWNrOworI2VuZGlmCisjaWZkZWYgS0hBWkFECisgICBzdHJ1Y3Qga2hhemFkX2tleSAgIGtoYXphZDsKKyNlbmRpZgorI2lmZGVmIEFOVUJJUworICAgc3RydWN0IGFudWJpc19rZXkgICBhbnViaXM7CisjZW5kaWYKKyAgIHZvaWQgICAqZGF0YTsKK30gc3ltbWV0cmljX2tleTsKKworLyogQSBibG9jayBjaXBoZXIgRUNCIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgY2lwaGVyIGNob3NlbiAqLworICAgaW50ICAgICAgICAgICAgICAgICBjaXBoZXIsIAorICAgLyoqIFRoZSBibG9jayBzaXplIG9mIHRoZSBnaXZlbiBjaXBoZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tsZW47CisgICAvKiogVGhlIHNjaGVkdWxlZCBrZXkgKi8gICAgICAgICAgICAgICAgICAgICAgIAorICAgc3ltbWV0cmljX2tleSAgICAgICBrZXk7Cit9IHN5bW1ldHJpY19FQ0I7CisKKy8qIEEgYmxvY2sgY2lwaGVyIENGQiBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIGNpcGhlciBjaG9zZW4gKi8KKyAgIGludCAgICAgICAgICAgICAgICAgY2lwaGVyLCAKKyAgIC8qKiBUaGUgYmxvY2sgc2l6ZSBvZiB0aGUgZ2l2ZW4gY2lwaGVyICovICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrbGVuLCAKKyAgIC8qKiBUaGUgcGFkZGluZyBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcGFkbGVuOworICAgLyoqIFRoZSBjdXJyZW50IElWICovCisgICB1bnNpZ25lZCBjaGFyICAgICAgIElWW01BWEJMT0NLU0laRV0sIAorICAgLyoqIFRoZSBwYWQgdXNlZCB0byBlbmNyeXB0L2RlY3J5cHQgKi8gCisgICAgICAgICAgICAgICAgICAgICAgIHBhZFtNQVhCTE9DS1NJWkVdOworICAgLyoqIFRoZSBzY2hlZHVsZWQga2V5ICovCisgICBzeW1tZXRyaWNfa2V5ICAgICAgIGtleTsKK30gc3ltbWV0cmljX0NGQjsKKworLyogQSBibG9jayBjaXBoZXIgT0ZCIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgY2lwaGVyIGNob3NlbiAqLworICAgaW50ICAgICAgICAgICAgICAgICBjaXBoZXIsIAorICAgLyoqIFRoZSBibG9jayBzaXplIG9mIHRoZSBnaXZlbiBjaXBoZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tsZW4sIAorICAgLyoqIFRoZSBwYWRkaW5nIG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICBwYWRsZW47CisgICAvKiogVGhlIGN1cnJlbnQgSVYgKi8KKyAgIHVuc2lnbmVkIGNoYXIgICAgICAgSVZbTUFYQkxPQ0tTSVpFXTsKKyAgIC8qKiBUaGUgc2NoZWR1bGVkIGtleSAqLworICAgc3ltbWV0cmljX2tleSAgICAgICBrZXk7Cit9IHN5bW1ldHJpY19PRkI7CisKKy8qIEEgYmxvY2sgY2lwaGVyIENCQyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIGNpcGhlciBjaG9zZW4gKi8KKyAgIGludCAgICAgICAgICAgICAgICAgY2lwaGVyLCAKKyAgIC8qKiBUaGUgYmxvY2sgc2l6ZSBvZiB0aGUgZ2l2ZW4gY2lwaGVyICovICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrbGVuOworICAgLyoqIFRoZSBjdXJyZW50IElWICovCisgICB1bnNpZ25lZCBjaGFyICAgICAgIElWW01BWEJMT0NLU0laRV07CisgICAvKiogVGhlIHNjaGVkdWxlZCBrZXkgKi8KKyAgIHN5bW1ldHJpY19rZXkgICAgICAga2V5OworfSBzeW1tZXRyaWNfQ0JDOworCisvKiBBIGJsb2NrIGNpcGhlciBDVFIgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAvKiogVGhlIGluZGV4IG9mIHRoZSBjaXBoZXIgY2hvc2VuICovCisgICBpbnQgICAgICAgICAgICAgICAgIGNpcGhlciwKKyAgIC8qKiBUaGUgYmxvY2sgc2l6ZSBvZiB0aGUgZ2l2ZW4gY2lwaGVyICovICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrbGVuLCAKKyAgIC8qKiBUaGUgcGFkZGluZyBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcGFkbGVuLCAKKyAgIC8qKiBUaGUgbW9kZSAoZW5kaWFuZXNzKSBvZiB0aGUgQ1RSLCAwPT1saXR0bGUsIDE9PWJpZyAqLyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIG1vZGU7CisgICAvKiogVGhlIGNvdW50ZXIgKi8gICAgICAgICAgICAgICAgICAgICAgIAorICAgdW5zaWduZWQgY2hhciAgICAgICBjdHJbTUFYQkxPQ0tTSVpFXSwgCisgICAvKiogVGhlIHBhZCB1c2VkIHRvIGVuY3J5cHQvZGVjcnlwdCAqLyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgIHBhZFtNQVhCTE9DS1NJWkVdOworICAgLyoqIFRoZSBzY2hlZHVsZWQga2V5ICovCisgICBzeW1tZXRyaWNfa2V5ICAgICAgIGtleTsKK30gc3ltbWV0cmljX0NUUjsKKworLyogY2lwaGVyIGRlc2NyaXB0b3IgdGFibGUsIGxhc3QgZW50cnkgaGFzICJuYW1lID09IE5VTEwiIHRvIG1hcmsgdGhlIGVuZCBvZiB0YWJsZSAqLworZXh0ZXJuIHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgeworICAgLyoqIG5hbWUgb2YgY2lwaGVyICovCisgICBjaGFyICpuYW1lOworICAgLyoqIGludGVybmFsIElEICovCisgICB1bnNpZ25lZCBjaGFyIElEOworICAgLyoqIG1pbiBrZXlzaXplIChvY3RldHMpICovCisgICBpbnQgIG1pbl9rZXlfbGVuZ3RoLCAKKyAgIC8qKiBtYXgga2V5c2l6ZSAob2N0ZXRzKSAqLworICAgICAgICBtYXhfa2V5X2xlbmd0aCwgCisgICAvKiogYmxvY2sgc2l6ZSAob2N0ZXRzKSAqLworICAgICAgICBibG9ja19sZW5ndGgsIAorICAgLyoqIGRlZmF1bHQgbnVtYmVyIG9mIHJvdW5kcyAqLworICAgICAgICBkZWZhdWx0X3JvdW5kczsKKyAgIC8qKiBTZXR1cCB0aGUgY2lwaGVyIAorICAgICAgQHBhcmFtIGtleSAgICAgICAgIFRoZSBpbnB1dCBzeW1tZXRyaWMga2V5CisgICAgICBAcGFyYW0ga2V5bGVuICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQga2V5IChvY3RldHMpCisgICAgICBAcGFyYW0gbnVtX3JvdW5kcyAgVGhlIHJlcXVlc3RlZCBudW1iZXIgb2Ygcm91bmRzICgwPT1kZWZhdWx0KQorICAgICAgQHBhcmFtIHNrZXkgICAgICAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgc2NoZWR1bGVkIGtleQorICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgICAqLworICAgaW50ICAoKnNldHVwKShjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKyAgIC8qKiBFbmNyeXB0IGEgYmxvY2sKKyAgICAgIEBwYXJhbSBwdCAgICAgIFRoZSBwbGFpbnRleHQKKyAgICAgIEBwYXJhbSBjdCAgICAgIFtvdXRdIFRoZSBjaXBoZXJ0ZXh0CisgICAgICBAcGFyYW0gc2tleSAgICBUaGUgc2NoZWR1bGVkIGtleQorICAgKi8KKyAgIHZvaWQgKCplY2JfZW5jcnlwdCkoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKyAgIC8qKiBEZWNyeXB0IGEgYmxvY2sKKyAgICAgIEBwYXJhbSBjdCAgICAgIFRoZSBjaXBoZXJ0ZXh0CisgICAgICBAcGFyYW0gcHQgICAgICBbb3V0XSBUaGUgcGxhaW50ZXh0CisgICAgICBAcGFyYW0gc2tleSAgICBUaGUgc2NoZWR1bGVkIGtleQorICAgKi8KKyAgIHZvaWQgKCplY2JfZGVjcnlwdCkoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKyAgIC8qKiBUZXN0IHRoZSBibG9jayBjaXBoZXIKKyAgICAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3RpbmcgaGFzIGJlZW4gZGlzYWJsZWQKKyAgICovCisgICBpbnQgKCp0ZXN0KSh2b2lkKTsKKworICAgLyoqIFRlcm1pbmF0ZSB0aGUgY29udGV4dCAKKyAgICAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5CisgICAqLworICAgdm9pZCAoKmRvbmUpKHN5bW1ldHJpY19rZXkgKnNrZXkpOyAgICAgIAorCisgICAvKiogRGV0ZXJtaW5lIGEga2V5IHNpemUKKyAgICAgICBAcGFyYW0ga2V5c2l6ZSAgICBbaW4vb3V0XSBUaGUgc2l6ZSBvZiB0aGUga2V5IGRlc2lyZWQgYW5kIHRoZSBzdWdnZXN0ZWQgc2l6ZQorICAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICAgKi8KKyAgIGludCAgKCprZXlzaXplKShpbnQgKmtleXNpemUpOworCisvKiogQWNjZWxlcmF0b3JzICoqLworICAgLyoqIEFjY2VsZXJhdGVkIEVDQiBlbmNyeXB0aW9uIAorICAgICAgIEBwYXJhbSBwdCAgICAgIFBsYWludGV4dAorICAgICAgIEBwYXJhbSBjdCAgICAgIENpcGhlcnRleHQKKyAgICAgICBAcGFyYW0gYmxvY2tzICBUaGUgbnVtYmVyIG9mIGNvbXBsZXRlIGJsb2NrcyB0byBwcm9jZXNzCisgICAgICAgQHBhcmFtIHNrZXkgICAgVGhlIHNjaGVkdWxlZCBrZXkgY29udGV4dAorICAgKi8KKyAgIHZvaWQgKCphY2NlbF9lY2JfZW5jcnlwdCkoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBsb25nIGJsb2Nrcywgc3ltbWV0cmljX2tleSAqc2tleSk7CisKKyAgIC8qKiBBY2NlbGVyYXRlZCBFQ0IgZGVjcnlwdGlvbiAKKyAgICAgICBAcGFyYW0gcHQgICAgICBQbGFpbnRleHQKKyAgICAgICBAcGFyYW0gY3QgICAgICBDaXBoZXJ0ZXh0CisgICAgICAgQHBhcmFtIGJsb2NrcyAgVGhlIG51bWJlciBvZiBjb21wbGV0ZSBibG9ja3MgdG8gcHJvY2VzcworICAgICAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5IGNvbnRleHQKKyAgICovCisgICB2b2lkICgqYWNjZWxfZWNiX2RlY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgbG9uZyBibG9ja3MsIHN5bW1ldHJpY19rZXkgKnNrZXkpOworCisgICAvKiogQWNjZWxlcmF0ZWQgQ0JDIGVuY3J5cHRpb24gCisgICAgICAgQHBhcmFtIHB0ICAgICAgUGxhaW50ZXh0CisgICAgICAgQHBhcmFtIGN0ICAgICAgQ2lwaGVydGV4dAorICAgICAgIEBwYXJhbSBibG9ja3MgIFRoZSBudW1iZXIgb2YgY29tcGxldGUgYmxvY2tzIHRvIHByb2Nlc3MKKyAgICAgICBAcGFyYW0gSVYgICAgICBUaGUgaW5pdGlhbCB2YWx1ZSAoaW5wdXQvb3V0cHV0KQorICAgICAgIEBwYXJhbSBza2V5ICAgIFRoZSBzY2hlZHVsZWQga2V5IGNvbnRleHQKKyAgICovCisgICB2b2lkICgqYWNjZWxfY2JjX2VuY3J5cHQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgbG9uZyBibG9ja3MsIHVuc2lnbmVkIGNoYXIgKklWLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKKworICAgLyoqIEFjY2VsZXJhdGVkIENCQyBkZWNyeXB0aW9uIAorICAgICAgIEBwYXJhbSBwdCAgICAgIFBsYWludGV4dAorICAgICAgIEBwYXJhbSBjdCAgICAgIENpcGhlcnRleHQKKyAgICAgICBAcGFyYW0gYmxvY2tzICBUaGUgbnVtYmVyIG9mIGNvbXBsZXRlIGJsb2NrcyB0byBwcm9jZXNzCisgICAgICAgQHBhcmFtIElWICAgICAgVGhlIGluaXRpYWwgdmFsdWUgKGlucHV0L291dHB1dCkKKyAgICAgICBAcGFyYW0gc2tleSAgICBUaGUgc2NoZWR1bGVkIGtleSBjb250ZXh0CisgICAqLworICAgdm9pZCAoKmFjY2VsX2NiY19kZWNyeXB0KShjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgYmxvY2tzLCB1bnNpZ25lZCBjaGFyICpJViwgc3ltbWV0cmljX2tleSAqc2tleSk7CisKKyAgIC8qKiBBY2NlbGVyYXRlZCBDVFIgZW5jcnlwdGlvbiAKKyAgICAgICBAcGFyYW0gcHQgICAgICBQbGFpbnRleHQKKyAgICAgICBAcGFyYW0gY3QgICAgICBDaXBoZXJ0ZXh0CisgICAgICAgQHBhcmFtIGJsb2NrcyAgVGhlIG51bWJlciBvZiBjb21wbGV0ZSBibG9ja3MgdG8gcHJvY2VzcworICAgICAgIEBwYXJhbSBJViAgICAgIFRoZSBpbml0aWFsIHZhbHVlIChpbnB1dC9vdXRwdXQpCisgICAgICAgQHBhcmFtIG1vZGUgICAgbGl0dGxlIG9yIGJpZyBlbmRpYW4gY291bnRlciAobW9kZT0wIG9yIG1vZGU9MSkKKyAgICAgICBAcGFyYW0gc2tleSAgICBUaGUgc2NoZWR1bGVkIGtleSBjb250ZXh0CisgICAqLworICAgdm9pZCAoKmFjY2VsX2N0cl9lbmNyeXB0KShjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGxvbmcgYmxvY2tzLCB1bnNpZ25lZCBjaGFyICpJViwgaW50IG1vZGUsIHN5bW1ldHJpY19rZXkgKnNrZXkpOworCisgICAvKiogQWNjZWxlcmF0ZWQgQ0NNIHBhY2tldCAob25lLXNob3QpCisgICAgICAgQHBhcmFtIGtleSAgICAgICAgVGhlIHNlY3JldCBrZXkgdG8gdXNlCisgICAgICAgQHBhcmFtIGtleWxlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2VjcmV0IGtleSAob2N0ZXRzKQorICAgICAgIEBwYXJhbSBub25jZSAgICAgIFRoZSBzZXNzaW9uIG5vbmNlIFt1c2Ugb25jZV0KKyAgICAgICBAcGFyYW0gbm9uY2VsZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBub25jZQorICAgICAgIEBwYXJhbSBoZWFkZXIgICAgIFRoZSBoZWFkZXIgZm9yIHRoZSBzZXNzaW9uCisgICAgICAgQHBhcmFtIGhlYWRlcmxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgaGVhZGVyIChvY3RldHMpCisgICAgICAgQHBhcmFtIHB0ICAgICAgICAgW291dF0gVGhlIHBsYWludGV4dAorICAgICAgIEBwYXJhbSBwdGxlbiAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHBsYWludGV4dCAob2N0ZXRzKQorICAgICAgIEBwYXJhbSBjdCAgICAgICAgIFtvdXRdIFRoZSBjaXBoZXJ0ZXh0CisgICAgICAgQHBhcmFtIHRhZyAgICAgICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIHRhZworICAgICAgIEBwYXJhbSB0YWdsZW4gICAgIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHRhZworICAgICAgIEBwYXJhbSBkaXJlY3Rpb24gIEVuY3J5cHQgb3IgRGVjcnlwdCBkaXJlY3Rpb24gKDAgb3IgMSkKKyAgICAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAgICovCisgICB2b2lkICgqYWNjZWxfY2NtX21lbW9yeSkoCisgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIHVuc2lnbmVkIGxvbmcgbm9uY2VsZW4sCisgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGVhZGVyLCB1bnNpZ25lZCBsb25nIGhlYWRlcmxlbiwKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwgICAgIHVuc2lnbmVkIGxvbmcgcHRsZW4sCisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsCisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnLCAgICB1bnNpZ25lZCBsb25nICp0YWdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgZGlyZWN0aW9uKTsKKworICAgLyoqIEFjY2VsZXJhdGVkIEdDTSBwYWNrZXQgKG9uZSBzaG90KQorICAgICAgIEBwYXJhbSBrZXkgICAgICAgICAgICAgICBUaGUgc2VjcmV0IGtleQorICAgICAgIEBwYXJhbSBrZXlsZW4gICAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5CisgICAgICAgQHBhcmFtIElWICAgICAgICAgICAgICAgIFRoZSBpbml0aWFsIHZlY3RvciAKKyAgICAgICBAcGFyYW0gSVZsZW4gICAgICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgaW5pdGlhbCB2ZWN0b3IKKyAgICAgICBAcGFyYW0gYWRhdGEgICAgICAgICAgICAgVGhlIGFkZGl0aW9uYWwgYXV0aGVudGljYXRpb24gZGF0YSAoaGVhZGVyKQorICAgICAgIEBwYXJhbSBhZGF0YWxlbiAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBhZGF0YQorICAgICAgIEBwYXJhbSBwdCAgICAgICAgICAgICAgICBUaGUgcGxhaW50ZXh0CisgICAgICAgQHBhcmFtIHB0bGVuICAgICAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHBsYWludGV4dCAoY2lwaGVydGV4dCBsZW5ndGggaXMgdGhlIHNhbWUpCisgICAgICAgQHBhcmFtIGN0ICAgICAgICAgICAgICAgIFRoZSBjaXBoZXJ0ZXh0CisgICAgICAgQHBhcmFtIHRhZyAgICAgICAgICAgICAgIFtvdXRdIFRoZSBNQUMgdGFnCisgICAgICAgQHBhcmFtIHRhZ2xlbiAgICAgICAgICAgIFtpbi9vdXRdIFRoZSBNQUMgdGFnIGxlbmd0aAorICAgICAgIEBwYXJhbSBkaXJlY3Rpb24gICAgICAgICBFbmNyeXB0IG9yIERlY3J5cHQgbW9kZSAoR0NNX0VOQ1JZUFQgb3IgR0NNX0RFQ1JZUFQpCisgICAqLworICAgdm9pZCAoKmFjY2VsX2djbV9tZW1vcnkpKAorICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsICAgICB1bnNpZ25lZCBsb25nIElWbGVuLAorICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkYXRhLCAgdW5zaWduZWQgbG9uZyBhZGF0YWxlbiwKKyAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwgICAgIHVuc2lnbmVkIGxvbmcgcHRsZW4sCisgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqY3QsIAorICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhZywgICAgdW5zaWduZWQgbG9uZyAqdGFnbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKTsKK30gY2lwaGVyX2Rlc2NyaXB0b3JbXTsKKworI2lmZGVmIEJMT1dGSVNICitpbnQgYmxvd2Zpc2hfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIGJsb3dmaXNoX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIGJsb3dmaXNoX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgYmxvd2Zpc2hfdGVzdCh2b2lkKTsKK3ZvaWQgYmxvd2Zpc2hfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCBibG93ZmlzaF9rZXlzaXplKGludCAqa2V5c2l6ZSk7CitleHRlcm4gY29uc3Qgc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvciBibG93ZmlzaF9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBSQzUKK2ludCByYzVfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIHJjNV9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCByYzVfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCByYzVfdGVzdCh2b2lkKTsKK3ZvaWQgcmM1X2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgcmM1X2tleXNpemUoaW50ICprZXlzaXplKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHJjNV9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBSQzYKK2ludCByYzZfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIHJjNl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCByYzZfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCByYzZfdGVzdCh2b2lkKTsKK3ZvaWQgcmM2X2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgcmM2X2tleXNpemUoaW50ICprZXlzaXplKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHJjNl9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBSQzIKK2ludCByYzJfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIHJjMl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCByYzJfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCByYzJfdGVzdCh2b2lkKTsKK3ZvaWQgcmMyX2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgcmMyX2tleXNpemUoaW50ICprZXlzaXplKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHJjMl9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBTQUZFUlAKK2ludCBzYWZlcnBfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIHNhZmVycF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCBzYWZlcnBfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCBzYWZlcnBfdGVzdCh2b2lkKTsKK3ZvaWQgc2FmZXJwX2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgc2FmZXJwX2tleXNpemUoaW50ICprZXlzaXplKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHNhZmVycF9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBTQUZFUgoraW50IHNhZmVyX2s2NF9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCBzYWZlcl9zazY0X3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOworaW50IHNhZmVyX2sxMjhfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgc2FmZXJfc2sxMjhfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIHNhZmVyX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KTsKK3ZvaWQgc2FmZXJfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICprZXkpOworaW50IHNhZmVyX2s2NF90ZXN0KHZvaWQpOworaW50IHNhZmVyX3NrNjRfdGVzdCh2b2lkKTsKK2ludCBzYWZlcl9zazEyOF90ZXN0KHZvaWQpOwordm9pZCBzYWZlcl9kb25lKHN5bW1ldHJpY19rZXkgKnNrZXkpOworaW50IHNhZmVyXzY0X2tleXNpemUoaW50ICprZXlzaXplKTsKK2ludCBzYWZlcl8xMjhfa2V5c2l6ZShpbnQgKmtleXNpemUpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3Igc2FmZXJfazY0X2Rlc2MsIHNhZmVyX2sxMjhfZGVzYywgc2FmZXJfc2s2NF9kZXNjLCBzYWZlcl9zazEyOF9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBSSUpOREFFTAorCisvKiBtYWtlIGFlcyBhbiBhbGlhcyAqLworI2RlZmluZSBhZXNfc2V0dXAgICAgICAgICAgIHJpam5kYWVsX3NldHVwCisjZGVmaW5lIGFlc19lY2JfZW5jcnlwdCAgICAgcmlqbmRhZWxfZWNiX2VuY3J5cHQKKyNkZWZpbmUgYWVzX2VjYl9kZWNyeXB0ICAgICByaWpuZGFlbF9lY2JfZGVjcnlwdAorI2RlZmluZSBhZXNfdGVzdCAgICAgICAgICAgIHJpam5kYWVsX3Rlc3QKKyNkZWZpbmUgYWVzX2RvbmUgICAgICAgICAgICByaWpuZGFlbF9kb25lCisjZGVmaW5lIGFlc19rZXlzaXplICAgICAgICAgcmlqbmRhZWxfa2V5c2l6ZQorCisjZGVmaW5lIGFlc19lbmNfc2V0dXAgICAgICAgICAgIHJpam5kYWVsX2VuY19zZXR1cAorI2RlZmluZSBhZXNfZW5jX2VjYl9lbmNyeXB0ICAgICByaWpuZGFlbF9lbmNfZWNiX2VuY3J5cHQKKyNkZWZpbmUgYWVzX2VuY19rZXlzaXplICAgICAgICAgcmlqbmRhZWxfZW5jX2tleXNpemUKKworaW50IHJpam5kYWVsX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCByaWpuZGFlbF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCByaWpuZGFlbF9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpOworaW50IHJpam5kYWVsX3Rlc3Qodm9pZCk7Cit2b2lkIHJpam5kYWVsX2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgcmlqbmRhZWxfa2V5c2l6ZShpbnQgKmtleXNpemUpOworaW50IHJpam5kYWVsX2VuY19zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK3ZvaWQgcmlqbmRhZWxfZW5jX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIHJpam5kYWVsX2VuY19kb25lKHN5bW1ldHJpY19rZXkgKnNrZXkpOworaW50IHJpam5kYWVsX2VuY19rZXlzaXplKGludCAqa2V5c2l6ZSk7CitleHRlcm4gY29uc3Qgc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvciByaWpuZGFlbF9kZXNjLCBhZXNfZGVzYzsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHJpam5kYWVsX2VuY19kZXNjLCBhZXNfZW5jX2Rlc2M7CisjZW5kaWYKKworI2lmZGVmIFhURUEKK2ludCB4dGVhX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCB4dGVhX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIHh0ZWFfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCB4dGVhX3Rlc3Qodm9pZCk7Cit2b2lkIHh0ZWFfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCB4dGVhX2tleXNpemUoaW50ICprZXlzaXplKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIHh0ZWFfZGVzYzsKKyNlbmRpZgorCisjaWZkZWYgVFdPRklTSAoraW50IHR3b2Zpc2hfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIHR3b2Zpc2hfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK3ZvaWQgdHdvZmlzaF9lY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHN5bW1ldHJpY19rZXkgKnNrZXkpOworaW50IHR3b2Zpc2hfdGVzdCh2b2lkKTsKK3ZvaWQgdHdvZmlzaF9kb25lKHN5bW1ldHJpY19rZXkgKnNrZXkpOworaW50IHR3b2Zpc2hfa2V5c2l6ZShpbnQgKmtleXNpemUpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgdHdvZmlzaF9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBERVMKK2ludCBkZXNfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIGRlc19lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCBkZXNfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCBkZXNfdGVzdCh2b2lkKTsKK3ZvaWQgZGVzX2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgZGVzX2tleXNpemUoaW50ICprZXlzaXplKTsKK2ludCBkZXMzX3NldHVwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCBkZXMzX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIGRlczNfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCBkZXMzX3Rlc3Qodm9pZCk7Cit2b2lkIGRlczNfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCBkZXMzX2tleXNpemUoaW50ICprZXlzaXplKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIGRlc19kZXNjLCBkZXMzX2Rlc2M7CisjZW5kaWYKKworI2lmZGVmIENBU1Q1CitpbnQgY2FzdDVfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIGNhc3Q1X2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIGNhc3Q1X2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgY2FzdDVfdGVzdCh2b2lkKTsKK3ZvaWQgY2FzdDVfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCBjYXN0NV9rZXlzaXplKGludCAqa2V5c2l6ZSk7CitleHRlcm4gY29uc3Qgc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvciBjYXN0NV9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBOT0VLRU9OCitpbnQgbm9la2Vvbl9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK3ZvaWQgbm9la2Vvbl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCBub2VrZW9uX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgbm9la2Vvbl90ZXN0KHZvaWQpOwordm9pZCBub2VrZW9uX2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgbm9la2Vvbl9rZXlzaXplKGludCAqa2V5c2l6ZSk7CitleHRlcm4gY29uc3Qgc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvciBub2VrZW9uX2Rlc2M7CisjZW5kaWYKKworI2lmZGVmIFNLSVBKQUNLCitpbnQgc2tpcGphY2tfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIHNraXBqYWNrX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIHNraXBqYWNrX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgc2tpcGphY2tfdGVzdCh2b2lkKTsKK3ZvaWQgc2tpcGphY2tfZG9uZShzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCBza2lwamFja19rZXlzaXplKGludCAqa2V5c2l6ZSk7CitleHRlcm4gY29uc3Qgc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvciBza2lwamFja19kZXNjOworI2VuZGlmCisKKyNpZmRlZiBLSEFaQUQKK2ludCBraGF6YWRfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIGtoYXphZF9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCBraGF6YWRfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCBraGF6YWRfdGVzdCh2b2lkKTsKK3ZvaWQga2hhemFkX2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQga2hhemFkX2tleXNpemUoaW50ICprZXlzaXplKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIGtoYXphZF9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBBTlVCSVMKK2ludCBhbnViaXNfc2V0dXAoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX2tleSAqc2tleSk7Cit2b2lkIGFudWJpc19lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHN5bW1ldHJpY19rZXkgKnNrZXkpOwordm9pZCBhbnViaXNfZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCBzeW1tZXRyaWNfa2V5ICpza2V5KTsKK2ludCBhbnViaXNfdGVzdCh2b2lkKTsKK3ZvaWQgYW51YmlzX2RvbmUoc3ltbWV0cmljX2tleSAqc2tleSk7CitpbnQgYW51YmlzX2tleXNpemUoaW50ICprZXlzaXplKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yIGFudWJpc19kZXNjOworI2VuZGlmCisKKyNpZmRlZiBFQ0IKK2ludCBlY2Jfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAKKyAgICAgICAgICAgICAgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19FQ0IgKmVjYik7CitpbnQgZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0VDQiAqZWNiKTsKK2ludCBlY2JfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfRUNCICplY2IpOworaW50IGVjYl9kb25lKHN5bW1ldHJpY19FQ0IgKmVjYik7CisjZW5kaWYKKworI2lmZGVmIENGQgoraW50IGNmYl9zdGFydChpbnQgY2lwaGVyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAKKyAgICAgICAgICAgICAgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19DRkIgKmNmYik7CitpbnQgY2ZiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0NGQiAqY2ZiKTsKK2ludCBjZmJfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfQ0ZCICpjZmIpOworaW50IGNmYl9nZXRpdih1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyAqbGVuLCBzeW1tZXRyaWNfQ0ZCICpjZmIpOworaW50IGNmYl9zZXRpdihjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DRkIgKmNmYik7CitpbnQgY2ZiX2RvbmUoc3ltbWV0cmljX0NGQiAqY2ZiKTsKKyNlbmRpZgorCisjaWZkZWYgT0ZCCitpbnQgb2ZiX3N0YXJ0KGludCBjaXBoZXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKklWLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIAorICAgICAgICAgICAgICBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX09GQiAqb2ZiKTsKK2ludCBvZmJfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfT0ZCICpvZmIpOworaW50IG9mYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19PRkIgKm9mYik7CitpbnQgb2ZiX2dldGl2KHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nICpsZW4sIHN5bW1ldHJpY19PRkIgKm9mYik7CitpbnQgb2ZiX3NldGl2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX09GQiAqb2ZiKTsKK2ludCBvZmJfZG9uZShzeW1tZXRyaWNfT0ZCICpvZmIpOworI2VuZGlmCisKKyNpZmRlZiBDQkMKK2ludCBjYmNfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKyAgICAgICAgICAgICAgIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfQ0JDICpjYmMpOworaW50IGNiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DQkMgKmNiYyk7CitpbnQgY2JjX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0NCQyAqY2JjKTsKK2ludCBjYmNfZ2V0aXYodW5zaWduZWQgY2hhciAqSVYsIHVuc2lnbmVkIGxvbmcgKmxlbiwgc3ltbWV0cmljX0NCQyAqY2JjKTsKK2ludCBjYmNfc2V0aXYoY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfQ0JDICpjYmMpOworaW50IGNiY19kb25lKHN5bW1ldHJpY19DQkMgKmNiYyk7CisjZW5kaWYKKworI2lmZGVmIENUUgorCisjZGVmaW5lIENUUl9DT1VOVEVSX0xJVFRMRV9FTkRJQU4gICAgMAorI2RlZmluZSBDVFJfQ09VTlRFUl9CSUdfRU5ESUFOICAgICAgIDEKKworaW50IGN0cl9zdGFydCggICAgICAgICAgICAgICBpbnQgICBjaXBoZXIsCisgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKklWLAorICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksICAgICAgIGludCBrZXlsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbnVtX3JvdW5kcywgaW50IGN0cl9tb2RlLAorICAgICAgICAgICAgICAgICAgIHN5bW1ldHJpY19DVFIgKmN0cik7CitpbnQgY3RyX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0NUUiAqY3RyKTsKK2ludCBjdHJfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfQ1RSICpjdHIpOworaW50IGN0cl9nZXRpdih1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyAqbGVuLCBzeW1tZXRyaWNfQ1RSICpjdHIpOworaW50IGN0cl9zZXRpdihjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DVFIgKmN0cik7CitpbnQgY3RyX2RvbmUoc3ltbWV0cmljX0NUUiAqY3RyKTsKKyNlbmRpZgorICAgIAoraW50IGZpbmRfY2lwaGVyKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGZpbmRfY2lwaGVyX2FueShjb25zdCBjaGFyICpuYW1lLCBpbnQgYmxvY2tsZW4sIGludCBrZXlsZW4pOworaW50IGZpbmRfY2lwaGVyX2lkKHVuc2lnbmVkIGNoYXIgSUQpOworaW50IHJlZ2lzdGVyX2NpcGhlcihjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yICpjaXBoZXIpOworaW50IHVucmVnaXN0ZXJfY2lwaGVyKGNvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgKmNpcGhlcik7CitpbnQgY2lwaGVyX2lzX3ZhbGlkKGludCBpZHgpOworCitMVENfTVVURVhfUFJPVE8obHRjX2NpcGhlcl9tdXRleCk7CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oZWFkZXJzL3RvbWNyeXB0X2NpcGhlci5oLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjE2ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE5IDE4OjAwOjI4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9oZWFkZXJzL3RvbWNyeXB0X2N1c3RvbS5oIGIvc3JjL2hlYWRlcnMvdG9tY3J5cHRfY3VzdG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhOGVkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9oZWFkZXJzL3RvbWNyeXB0X2N1c3RvbS5oCkBAIC0wLDAgKzEsOTMgQEAKKyNpZm5kZWYgVE9NQ1JZUFRfQ1VTVE9NX0hfCisjZGVmaW5lIFRPTUNSWVBUX0NVU1RPTV9IXworCisvKiB0aGlzIHdpbGwgc29ydCBvdXQgd2hpY2ggc3R1ZmYgYmFzZWQgb24gdGhlIHVzZXItY29uZmlnIGluIG9wdGlvbnMuaCAqLworI2luY2x1ZGUgIi4uL29wdGlvbnMuaCIKKworLyogbWFjcm9zIGZvciB2YXJpb3VzIGxpYmMgZnVuY3Rpb25zIHlvdSBjYW4gY2hhbmdlIGZvciBlbWJlZGRlZCB0YXJnZXRzICovCisjZGVmaW5lIFhNQUxMT0MgIG1hbGxvYworI2RlZmluZSBYUkVBTExPQyByZWFsbG9jCisjZGVmaW5lIFhDQUxMT0MgIGNhbGxvYworI2RlZmluZSBYRlJFRSAgICBmcmVlCisKKyNkZWZpbmUgWE1FTVNFVCAgbWVtc2V0CisjZGVmaW5lIFhNRU1DUFkgIG1lbWNweQorCisjZGVmaW5lIFhDTE9DSyAgIGNsb2NrCisjZGVmaW5lIFhDTE9DS1NfUEVSX1NFQyBDTE9DS1NfUEVSX1NFQworCisjaWZkZWYgRFJPUEJFQVJfU01BTExfQ09ERQorI2RlZmluZSBMVENfU01BTExfQ09ERQorI2VuZGlmCisKKy8qIEVuYWJsZSBzZWxmLXRlc3QgdGVzdCB2ZWN0b3IgY2hlY2tpbmcgKi8KKy8qIE5vdCBmb3IgZHJvcGJlYXIgKi8KKy8vI2RlZmluZSBMVENfVEVTVAorCisvKiBjbGVhbiB0aGUgc3RhY2sgb2YgZnVuY3Rpb25zIHdoaWNoIHB1dCBwcml2YXRlIGluZm9ybWF0aW9uIG9uIHN0YWNrICovCisvKiAjZGVmaW5lIExUQ19DTEVBTl9TVEFDSyAqLworCisvKiBkaXNhYmxlIGFsbCBmaWxlIHJlbGF0ZWQgZnVuY3Rpb25zICovCisvKiAjZGVmaW5lIExUQ19OT19GSUxFICovCisKKy8qIGRpc2FibGUgYWxsIGZvcm1zIG9mIEFTTSAqLworLyogI2RlZmluZSBMVENfTk9fQVNNICovCisKKy8qIGRpc2FibGUgRkFTVCBtb2RlICovCisvKiAjZGVmaW5lIExUQ19OT19GQVNUICovCisKKy8qIGRpc2FibGUgQlNXQVAgb24geDg2ICovCisvKiAjZGVmaW5lIExUQ19OT19CU1dBUCAqLworCisKKyNpZmRlZiBEUk9QQkVBUl9CTE9XRklTSF9DQkMKKyNkZWZpbmUgQkxPV0ZJU0gKKyNlbmRpZgorCisjaWZkZWYgRFJPUEJFQVJfQUVTMTI4X0NCQworI2RlZmluZSBSSUpOREFFTAorI2VuZGlmCisKKyNpZmRlZiBEUk9QQkVBUl9UV09GSVNIMTI4X0NCQworI2RlZmluZSBUV09GSVNICisKKy8qIGVuYWJsaW5nIGp1c3QgVFdPRklTSF9TTUFMTCB3aWxsIG1ha2UgdGhlIGJpbmFyeSB+MWtCIHNtYWxsZXIsIHR1cm5pbmcgb24KKyAqIFRXT0ZJU0hfVEFCTEVTIHdpbGwgbWFrZSBpdCBhIGZldyBrQiBiaWdnZXIsIGJ1dCBwZXJoYXBzIHJlZHVjZXMgcnVudGltZQorICogbWVtb3J5IHVzYWdlPyAqLworI2RlZmluZSBUV09GSVNIX1NNQUxMCisvKiNkZWZpbmUgVFdPRklTSF9UQUJMRVMqLworI2VuZGlmCisKKyNpZmRlZiBEUk9QQkVBUl8zREVTX0NCQworI2RlZmluZSBERVMKKyNlbmRpZgorI2RlZmluZSBDQkMKKworI2lmIGRlZmluZWQoRFJPUEJFQVJfRFNTKSAmJiBkZWZpbmVkKERTU19QUk9UT0spCisjZGVmaW5lIFNIQTUxMgorI2VuZGlmCisKKyNkZWZpbmUgU0hBMQorCisjaWZkZWYgRFJPUEJFQVJfTUQ1X0hNQUMKKyNkZWZpbmUgTUQ1CisjZW5kaWYKKworI2RlZmluZSBITUFDCisKKy8qIFZhcmlvdXMgdGlkYml0cyBvZiBtb2Rlcm4gbmVhdG9uZXNzICovCisjZGVmaW5lIEJBU0U2NAorCisvKiBkZWZhdWx0IG5vIGZ1bmN0aW9ucyAqLworI2RlZmluZSBMVENfTVVURVhfR0xPQkFMKHgpCisjZGVmaW5lIExUQ19NVVRFWF9QUk9UTyh4KQorI2RlZmluZSBMVENfTVVURVhfTE9DSyh4KQorI2RlZmluZSBMVENfTVVURVhfVU5MT0NLKHgpCisjZGVmaW5lIEZPUlRVTkFfUE9PTFMgMAorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvaGVhZGVycy90b21jcnlwdF9jdXN0b20uaCx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xNyAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOSAxODowMDoyOCAkICovCmRpZmYgLS1naXQgYS9zcmMvaGVhZGVycy90b21jcnlwdF9oYXNoLmggYi9zcmMvaGVhZGVycy90b21jcnlwdF9oYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1MzRmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9oZWFkZXJzL3RvbWNyeXB0X2hhc2guaApAQCAtMCwwICsxLDMzMSBAQAorLyogLS0tLSBIQVNIIEZVTkNUSU9OUyAtLS0tICovCisjaWZkZWYgU0hBNTEyCitzdHJ1Y3Qgc2hhNTEyX3N0YXRlIHsKKyAgICB1bG9uZzY0ICBsZW5ndGgsIHN0YXRlWzhdOworICAgIHVuc2lnbmVkIGxvbmcgY3VybGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzEyOF07Cit9OworI2VuZGlmCisKKyNpZmRlZiBTSEEyNTYKK3N0cnVjdCBzaGEyNTZfc3RhdGUgeworICAgIHVsb25nNjQgbGVuZ3RoOworICAgIHVsb25nMzIgc3RhdGVbOF0sIGN1cmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls2NF07Cit9OworI2VuZGlmCisKKyNpZmRlZiBTSEExCitzdHJ1Y3Qgc2hhMV9zdGF0ZSB7CisgICAgdWxvbmc2NCBsZW5ndGg7CisgICAgdWxvbmczMiBzdGF0ZVs1XSwgY3VybGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKK307CisjZW5kaWYKKworI2lmZGVmIE1ENQorc3RydWN0IG1kNV9zdGF0ZSB7CisgICAgdWxvbmc2NCBsZW5ndGg7CisgICAgdWxvbmczMiBzdGF0ZVs0XSwgY3VybGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKK307CisjZW5kaWYKKworI2lmZGVmIE1ENAorc3RydWN0IG1kNF9zdGF0ZSB7CisgICAgdWxvbmc2NCBsZW5ndGg7CisgICAgdWxvbmczMiBzdGF0ZVs0XSwgY3VybGVuOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKK307CisjZW5kaWYKKworI2lmZGVmIFRJR0VSCitzdHJ1Y3QgdGlnZXJfc3RhdGUgeworICAgIHVsb25nNjQgc3RhdGVbM10sIGxlbmd0aDsKKyAgICB1bnNpZ25lZCBsb25nIGN1cmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls2NF07Cit9OworI2VuZGlmCisKKyNpZmRlZiBNRDIKK3N0cnVjdCBtZDJfc3RhdGUgeworICAgIHVuc2lnbmVkIGNoYXIgY2hrc3VtWzE2XSwgWFs0OF0sIGJ1ZlsxNl07CisgICAgdW5zaWduZWQgbG9uZyBjdXJsZW47Cit9OworI2VuZGlmCisKKyNpZmRlZiBSSVBFTUQxMjgKK3N0cnVjdCBybWQxMjhfc3RhdGUgeworICAgIHVsb25nNjQgbGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKKyAgICB1bG9uZzMyIGN1cmxlbiwgc3RhdGVbNF07Cit9OworI2VuZGlmCisKKyNpZmRlZiBSSVBFTUQxNjAKK3N0cnVjdCBybWQxNjBfc3RhdGUgeworICAgIHVsb25nNjQgbGVuZ3RoOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzY0XTsKKyAgICB1bG9uZzMyIGN1cmxlbiwgc3RhdGVbNV07Cit9OworI2VuZGlmCisKKyNpZmRlZiBXSElSTFBPT0wKK3N0cnVjdCB3aGlybHBvb2xfc3RhdGUgeworICAgIHVsb25nNjQgbGVuZ3RoLCBzdGF0ZVs4XTsKKyAgICB1bnNpZ25lZCBjaGFyIGJ1Zls2NF07CisgICAgdWxvbmczMiBjdXJsZW47Cit9OworI2VuZGlmCisKKyNpZmRlZiBDSENfSEFTSAorc3RydWN0IGNoY19zdGF0ZSB7CisgICAgdWxvbmc2NCBsZW5ndGg7CisgICAgdW5zaWduZWQgY2hhciBzdGF0ZVtNQVhCTE9DS1NJWkVdLCBidWZbTUFYQkxPQ0tTSVpFXTsKKyAgICB1bG9uZzMyIGN1cmxlbjsKK307CisjZW5kaWYKKwordHlwZWRlZiB1bmlvbiBIYXNoX3N0YXRlIHsKKyNpZmRlZiBDSENfSEFTSAorICAgIHN0cnVjdCBjaGNfc3RhdGUgY2hjOworI2VuZGlmCisjaWZkZWYgV0hJUkxQT09MCisgICAgc3RydWN0IHdoaXJscG9vbF9zdGF0ZSB3aGlybHBvb2w7CisjZW5kaWYKKyNpZmRlZiBTSEE1MTIKKyAgICBzdHJ1Y3Qgc2hhNTEyX3N0YXRlIHNoYTUxMjsKKyNlbmRpZgorI2lmZGVmIFNIQTI1NgorICAgIHN0cnVjdCBzaGEyNTZfc3RhdGUgc2hhMjU2OworI2VuZGlmCisjaWZkZWYgU0hBMQorICAgIHN0cnVjdCBzaGExX3N0YXRlICAgc2hhMTsKKyNlbmRpZgorI2lmZGVmIE1ENQorICAgIHN0cnVjdCBtZDVfc3RhdGUgICAgbWQ1OworI2VuZGlmCisjaWZkZWYgTUQ0CisgICAgc3RydWN0IG1kNF9zdGF0ZSAgICBtZDQ7CisjZW5kaWYKKyNpZmRlZiBNRDIKKyAgICBzdHJ1Y3QgbWQyX3N0YXRlICAgIG1kMjsKKyNlbmRpZgorI2lmZGVmIFRJR0VSCisgICAgc3RydWN0IHRpZ2VyX3N0YXRlICB0aWdlcjsKKyNlbmRpZgorI2lmZGVmIFJJUEVNRDEyOAorICAgIHN0cnVjdCBybWQxMjhfc3RhdGUgcm1kMTI4OworI2VuZGlmCisjaWZkZWYgUklQRU1EMTYwCisgICAgc3RydWN0IHJtZDE2MF9zdGF0ZSBybWQxNjA7CisjZW5kaWYKKyAgICB2b2lkICpkYXRhOworfSBoYXNoX3N0YXRlOworCitleHRlcm4gIHN0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yIHsKKyAgICAvKiogbmFtZSBvZiBoYXNoICovCisgICAgY2hhciAqbmFtZTsKKyAgICAvKiogaW50ZXJuYWwgSUQgKi8KKyAgICB1bnNpZ25lZCBjaGFyIElEOworICAgIC8qKiBTaXplIG9mIGRpZ2VzdCBpbiBvY3RldHMgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhhc2hzaXplOworICAgIC8qKiBJbnB1dCBibG9jayBzaXplIGluIG9jdGV0cyAqLworICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplOworICAgIC8qKiBBU04uMSBPSUQgKi8KKyAgICB1bnNpZ25lZCBsb25nIE9JRFsxNl07CisgICAgLyoqIExlbmd0aCBvZiBERVIgZW5jb2RpbmcgKi8KKyAgICB1bnNpZ25lZCBsb25nIE9JRGxlbjsKKworICAgIC8qKiBJbml0IGEgaGFzaCBzdGF0ZQorICAgICAgQHBhcmFtIGhhc2ggICBUaGUgaGFzaCB0byBpbml0aWFsaXplCisgICAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAgICAqLworICAgIGludCAoKmluaXQpKGhhc2hfc3RhdGUgKmhhc2gpOworICAgIC8qKiBQcm9jZXNzIGEgYmxvY2sgb2YgZGF0YSAKKyAgICAgIEBwYXJhbSBoYXNoICAgVGhlIGhhc2ggc3RhdGUKKyAgICAgIEBwYXJhbSBpbiAgICAgVGhlIGRhdGEgdG8gaGFzaAorICAgICAgQHBhcmFtIGlubGVuICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIChvY3RldHMpCisgICAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAgICAqLworICAgIGludCAoKnByb2Nlc3MpKGhhc2hfc3RhdGUgKmhhc2gsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKTsKKyAgICAvKiogUHJvZHVjZSB0aGUgZGlnZXN0IGFuZCBzdG9yZSBpdAorICAgICAgQHBhcmFtIGhhc2ggICBUaGUgaGFzaCBzdGF0ZQorICAgICAgQHBhcmFtIG91dCAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGRpZ2VzdAorICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgICAgKi8KKyAgICBpbnQgKCpkb25lKShoYXNoX3N0YXRlICpoYXNoLCB1bnNpZ25lZCBjaGFyICpvdXQpOworICAgIC8qKiBTZWxmLXRlc3QKKyAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdHMgaGF2ZSBiZWVuIGRpc2FibGVkCisgICAgKi8KKyAgICBpbnQgKCp0ZXN0KSh2b2lkKTsKK30gaGFzaF9kZXNjcmlwdG9yW107CisKKyNpZmRlZiBDSENfSEFTSAoraW50IGNoY19yZWdpc3RlcihpbnQgY2lwaGVyKTsKK2ludCBjaGNfaW5pdChoYXNoX3N0YXRlICogbWQpOworaW50IGNoY19wcm9jZXNzKGhhc2hfc3RhdGUgKiBtZCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4pOworaW50IGNoY19kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqaGFzaCk7CitpbnQgY2hjX3Rlc3Qodm9pZCk7CitleHRlcm4gY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3IgY2hjX2Rlc2M7CisjZW5kaWYKKworI2lmZGVmIFdISVJMUE9PTAoraW50IHdoaXJscG9vbF9pbml0KGhhc2hfc3RhdGUgKiBtZCk7CitpbnQgd2hpcmxwb29sX3Byb2Nlc3MoaGFzaF9zdGF0ZSAqIG1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CitpbnQgd2hpcmxwb29sX2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKTsKK2ludCB3aGlybHBvb2xfdGVzdCh2b2lkKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvciB3aGlybHBvb2xfZGVzYzsKKyNlbmRpZgorCisjaWZkZWYgU0hBNTEyCitpbnQgc2hhNTEyX2luaXQoaGFzaF9zdGF0ZSAqIG1kKTsKK2ludCBzaGE1MTJfcHJvY2VzcyhoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKTsKK2ludCBzaGE1MTJfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpOworaW50IHNoYTUxMl90ZXN0KHZvaWQpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yIHNoYTUxMl9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBTSEEzODQKKyNpZm5kZWYgU0hBNTEyCisgICAjZXJyb3IgU0hBNTEyIGlzIHJlcXVpcmVkIGZvciBTSEEzODQKKyNlbmRpZgoraW50IHNoYTM4NF9pbml0KGhhc2hfc3RhdGUgKiBtZCk7CisjZGVmaW5lIHNoYTM4NF9wcm9jZXNzIHNoYTUxMl9wcm9jZXNzCitpbnQgc2hhMzg0X2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKTsKK2ludCBzaGEzODRfdGVzdCh2b2lkKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvciBzaGEzODRfZGVzYzsKKyNlbmRpZgorCisjaWZkZWYgU0hBMjU2CitpbnQgc2hhMjU2X2luaXQoaGFzaF9zdGF0ZSAqIG1kKTsKK2ludCBzaGEyNTZfcHJvY2VzcyhoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKTsKK2ludCBzaGEyNTZfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpOworaW50IHNoYTI1Nl90ZXN0KHZvaWQpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yIHNoYTI1Nl9kZXNjOworCisjaWZkZWYgU0hBMjI0CisjaWZuZGVmIFNIQTI1NgorICAgI2Vycm9yIFNIQTI1NiBpcyByZXF1aXJlZCBmb3IgU0hBMjI0CisjZW5kaWYKK2ludCBzaGEyMjRfaW5pdChoYXNoX3N0YXRlICogbWQpOworI2RlZmluZSBzaGEyMjRfcHJvY2VzcyBzaGEyNTZfcHJvY2VzcworaW50IHNoYTIyNF9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqaGFzaCk7CitpbnQgc2hhMjI0X3Rlc3Qodm9pZCk7CitleHRlcm4gY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3Igc2hhMjI0X2Rlc2M7CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgU0hBMQoraW50IHNoYTFfaW5pdChoYXNoX3N0YXRlICogbWQpOworaW50IHNoYTFfcHJvY2VzcyhoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKTsKK2ludCBzaGExX2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKTsKK2ludCBzaGExX3Rlc3Qodm9pZCk7CitleHRlcm4gY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3Igc2hhMV9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBNRDUKK2ludCBtZDVfaW5pdChoYXNoX3N0YXRlICogbWQpOworaW50IG1kNV9wcm9jZXNzKGhhc2hfc3RhdGUgKiBtZCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4pOworaW50IG1kNV9kb25lKGhhc2hfc3RhdGUgKiBtZCwgdW5zaWduZWQgY2hhciAqaGFzaCk7CitpbnQgbWQ1X3Rlc3Qodm9pZCk7CitleHRlcm4gY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3IgbWQ1X2Rlc2M7CisjZW5kaWYKKworI2lmZGVmIE1ENAoraW50IG1kNF9pbml0KGhhc2hfc3RhdGUgKiBtZCk7CitpbnQgbWQ0X3Byb2Nlc3MoaGFzaF9zdGF0ZSAqIG1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CitpbnQgbWQ0X2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKTsKK2ludCBtZDRfdGVzdCh2b2lkKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvciBtZDRfZGVzYzsKKyNlbmRpZgorCisjaWZkZWYgTUQyCitpbnQgbWQyX2luaXQoaGFzaF9zdGF0ZSAqIG1kKTsKK2ludCBtZDJfcHJvY2VzcyhoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKTsKK2ludCBtZDJfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpOworaW50IG1kMl90ZXN0KHZvaWQpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yIG1kMl9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBUSUdFUgoraW50IHRpZ2VyX2luaXQoaGFzaF9zdGF0ZSAqIG1kKTsKK2ludCB0aWdlcl9wcm9jZXNzKGhhc2hfc3RhdGUgKiBtZCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4pOworaW50IHRpZ2VyX2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKTsKK2ludCB0aWdlcl90ZXN0KHZvaWQpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yIHRpZ2VyX2Rlc2M7CisjZW5kaWYKKworI2lmZGVmIFJJUEVNRDEyOAoraW50IHJtZDEyOF9pbml0KGhhc2hfc3RhdGUgKiBtZCk7CitpbnQgcm1kMTI4X3Byb2Nlc3MoaGFzaF9zdGF0ZSAqIG1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CitpbnQgcm1kMTI4X2RvbmUoaGFzaF9zdGF0ZSAqIG1kLCB1bnNpZ25lZCBjaGFyICpoYXNoKTsKK2ludCBybWQxMjhfdGVzdCh2b2lkKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvciBybWQxMjhfZGVzYzsKKyNlbmRpZgorCisjaWZkZWYgUklQRU1EMTYwCitpbnQgcm1kMTYwX2luaXQoaGFzaF9zdGF0ZSAqIG1kKTsKK2ludCBybWQxNjBfcHJvY2VzcyhoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKTsKK2ludCBybWQxNjBfZG9uZShoYXNoX3N0YXRlICogbWQsIHVuc2lnbmVkIGNoYXIgKmhhc2gpOworaW50IHJtZDE2MF90ZXN0KHZvaWQpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yIHJtZDE2MF9kZXNjOworI2VuZGlmCisKK2ludCBmaW5kX2hhc2goY29uc3QgY2hhciAqbmFtZSk7CitpbnQgZmluZF9oYXNoX2lkKHVuc2lnbmVkIGNoYXIgSUQpOworaW50IGZpbmRfaGFzaF9hbnkoY29uc3QgY2hhciAqbmFtZSwgaW50IGRpZ2VzdGxlbik7CitpbnQgcmVnaXN0ZXJfaGFzaChjb25zdCBzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvciAqaGFzaCk7CitpbnQgdW5yZWdpc3Rlcl9oYXNoKGNvbnN0IHN0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yICpoYXNoKTsKK2ludCBoYXNoX2lzX3ZhbGlkKGludCBpZHgpOworCitMVENfTVVURVhfUFJPVE8obHRjX2hhc2hfbXV0ZXgpOworCitpbnQgaGFzaF9tZW1vcnkoaW50IGhhc2gsIAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworaW50IGhhc2hfbWVtb3J5X211bHRpKGludCBoYXNoLCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgLi4uKTsKK2ludCBoYXNoX2ZpbGVoYW5kbGUoaW50IGhhc2gsIEZJTEUgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitpbnQgaGFzaF9maWxlKGludCBoYXNoLCBjb25zdCBjaGFyICpmbmFtZSwgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCisvKiBhIHNpbXBsZSBtYWNybyBmb3IgbWFraW5nIGhhc2ggInByb2Nlc3MiIGZ1bmN0aW9ucyAqLworI2RlZmluZSBIQVNIX1BST0NFU1MoZnVuY19uYW1lLCBjb21wcmVzc19uYW1lLCBzdGF0ZV92YXIsIGJsb2NrX3NpemUpICAgICAgICAgICAgICAgICAgICAgICBcCitpbnQgZnVuY19uYW1lIChoYXNoX3N0YXRlICogbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGxvbmcgbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgICBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMVENfQVJHQ0hLKG1kICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExUQ19BUkdDSEsoaW4gIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG1kLT4gc3RhdGVfdmFyIC5jdXJsZW4gPiBzaXplb2YobWQtPiBzdGF0ZV92YXIgLmJ1ZikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKGlubGVuID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG1kLT4gc3RhdGVfdmFyIC5jdXJsZW4gPT0gMCAmJiBpbmxlbiA+PSBibG9ja19zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBpZiAoKGVyciA9IGNvbXByZXNzX25hbWUgKG1kLCAodW5zaWduZWQgY2hhciAqKWluKSkgIT0gQ1JZUFRfT0spIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBtZC0+IHN0YXRlX3ZhciAubGVuZ3RoICs9IGJsb2NrX3NpemUgKiA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGluICAgICAgICAgICAgICs9IGJsb2NrX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgaW5sZW4gICAgICAgICAgLT0gYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG4gPSBNSU4oaW5sZW4sIChibG9ja19zaXplIC0gbWQtPiBzdGF0ZV92YXIgLmN1cmxlbikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgbWVtY3B5KG1kLT4gc3RhdGVfdmFyIC5idWYgKyBtZC0+IHN0YXRlX3Zhci5jdXJsZW4sIGluLCAoc2l6ZV90KW4pOyAgICAgICAgICAgICAgXAorICAgICAgICAgICBtZC0+IHN0YXRlX3ZhciAuY3VybGVuICs9IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGluICAgICAgICAgICAgICs9IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgaW5sZW4gICAgICAgICAgLT0gbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBpZiAobWQtPiBzdGF0ZV92YXIgLmN1cmxlbiA9PSBibG9ja19zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIGlmICgoZXJyID0gY29tcHJlc3NfbmFtZSAobWQsIG1kLT4gc3RhdGVfdmFyIC5idWYpKSAhPSBDUllQVF9PSykgeyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIG1kLT4gc3RhdGVfdmFyIC5sZW5ndGggKz0gOCpibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgbWQtPiBzdGF0ZV92YXIgLmN1cmxlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDUllQVF9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oZWFkZXJzL3RvbWNyeXB0X2hhc2guaCx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xMiAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOSAxODowMDoyOCAkICovCmRpZmYgLS1naXQgYS9zcmMvaGVhZGVycy90b21jcnlwdF9tYWMuaCBiL3NyYy9oZWFkZXJzL3RvbWNyeXB0X21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMWIxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaGVhZGVycy90b21jcnlwdF9tYWMuaApAQCAtMCwwICsxLDMwMSBAQAorI2lmZGVmIEhNQUMKK3R5cGVkZWYgc3RydWN0IEhtYWNfc3RhdGUgeworICAgICBoYXNoX3N0YXRlICAgICBtZDsKKyAgICAgaW50ICAgICAgICAgICAgaGFzaDsKKyAgICAgaGFzaF9zdGF0ZSAgICAgaGFzaHN0YXRlOworICAgICB1bnNpZ25lZCBjaGFyICAqa2V5OworfSBobWFjX3N0YXRlOworCitpbnQgaG1hY19pbml0KGhtYWNfc3RhdGUgKmhtYWMsIGludCBoYXNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuKTsKK2ludCBobWFjX3Byb2Nlc3MoaG1hY19zdGF0ZSAqaG1hYywgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4pOworaW50IGhtYWNfZG9uZShobWFjX3N0YXRlICpobWFjLCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitpbnQgaG1hY190ZXN0KHZvaWQpOworaW50IGhtYWNfbWVtb3J5KGludCBoYXNoLCAKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworaW50IGhtYWNfbWVtb3J5X211bHRpKGludCBoYXNoLCAKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksICB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpvdXRsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgdW5zaWduZWQgbG9uZyBpbmxlbiwgLi4uKTsKK2ludCBobWFjX2ZpbGUoaW50IGhhc2gsIGNvbnN0IGNoYXIgKmZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcga2V5bGVuLCAKKyAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZHN0LCB1bnNpZ25lZCBsb25nICpkc3RsZW4pOworI2VuZGlmCisKKyNpZmRlZiBPTUFDCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIGludCAgICAgICAgICAgICBjaXBoZXJfaWR4LCAKKyAgICAgICAgICAgICAgICAgICBidWZsZW4sCisgICAgICAgICAgICAgICAgICAgYmxrbGVuOworICAgdW5zaWduZWQgY2hhciAgIGJsb2NrW01BWEJMT0NLU0laRV0sCisgICAgICAgICAgICAgICAgICAgcHJldltNQVhCTE9DS1NJWkVdLAorICAgICAgICAgICAgICAgICAgIEx1WzJdW01BWEJMT0NLU0laRV07CisgICBzeW1tZXRyaWNfa2V5ICAga2V5OworfSBvbWFjX3N0YXRlOworCitpbnQgb21hY19pbml0KG9tYWNfc3RhdGUgKm9tYWMsIGludCBjaXBoZXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4pOworaW50IG9tYWNfcHJvY2VzcyhvbWFjX3N0YXRlICpvbWFjLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CitpbnQgb21hY19kb25lKG9tYWNfc3RhdGUgKm9tYWMsIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK2ludCBvbWFjX21lbW9yeShpbnQgY2lwaGVyLCAKKyAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitpbnQgb21hY19tZW1vcnlfbXVsdGkoaW50IGNpcGhlciwgCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sIC4uLik7CitpbnQgb21hY19maWxlKGludCBjaXBoZXIsIAorICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgICAgICAgICBjb25zdCAgICAgICAgICBjaGFyICpmaWxlbmFtZSwgCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK2ludCBvbWFjX3Rlc3Qodm9pZCk7CisjZW5kaWYgLyogT01BQyAqLworCisjaWZkZWYgUE1BQworCit0eXBlZGVmIHN0cnVjdCB7CisgICB1bnNpZ25lZCBjaGFyICAgICBMc1szMl1bTUFYQkxPQ0tTSVpFXSwgICAgLyogTCBzaGlmdGVkIGJ5IGkgYml0cyB0byB0aGUgbGVmdCAqLworICAgICAgICAgICAgICAgICAgICAgTGlbTUFYQkxPQ0tTSVpFXSwgICAgICAgIC8qIHZhbHVlIG9mIExpIFtjdXJyZW50IHZhbHVlLCB3ZSBjYWxjIGZyb20gcHJldmlvdXMgcmVjYWxsXSAqLworICAgICAgICAgICAgICAgICAgICAgTHJbTUFYQkxPQ0tTSVpFXSwgICAgICAgIC8qIEwgKiB4Xi0xICovCisgICAgICAgICAgICAgICAgICAgICBibG9ja1tNQVhCTE9DS1NJWkVdLCAgICAgLyogY3VycmVudGx5IGFjY3VtdWxhdGVkIGJsb2NrICovCisgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bVtNQVhCTE9DS1NJWkVdOyAgLyogY3VycmVudCBjaGVja3N1bSAqLworCisgICBzeW1tZXRyaWNfa2V5ICAgICBrZXk7ICAgICAgICAgICAgICAgICAgICAgLyogc2NoZWR1bGVkIGtleSBmb3IgY2lwaGVyICovCisgICB1bnNpZ25lZCBsb25nICAgICBibG9ja19pbmRleDsgICAgICAgICAgICAgLyogaW5kZXggIyBmb3IgY3VycmVudCBibG9jayAqLworICAgaW50ICAgICAgICAgICAgICAgY2lwaGVyX2lkeCwgICAgICAgICAgICAgIC8qIGNpcGhlciBpZHggKi8KKyAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2xlbiwgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgIGJ1ZmxlbjsgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciAqLworfSBwbWFjX3N0YXRlOworCitpbnQgcG1hY19pbml0KHBtYWNfc3RhdGUgKnBtYWMsIGludCBjaXBoZXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4pOworaW50IHBtYWNfcHJvY2VzcyhwbWFjX3N0YXRlICpwbWFjLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CitpbnQgcG1hY19kb25lKHBtYWNfc3RhdGUgKnBtYWMsIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKKworaW50IHBtYWNfbWVtb3J5KGludCBjaXBoZXIsIAorICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZywgdW5zaWduZWQgbG9uZyBtc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CisKK2ludCBwbWFjX21lbW9yeV9tdWx0aShpbnQgY2lwaGVyLCAKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCAuLi4pOworCitpbnQgcG1hY19maWxlKGludCBjaXBoZXIsIAorICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgICAgICAgICAgY29uc3QgICAgICAgICAgY2hhciAqZmlsZW5hbWUsIAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKKworaW50IHBtYWNfdGVzdCh2b2lkKTsKKworLyogaW50ZXJuYWwgZnVuY3Rpb25zICovCitpbnQgcG1hY19udHoodW5zaWduZWQgbG9uZyB4KTsKK3ZvaWQgcG1hY19zaGlmdF94b3IocG1hY19zdGF0ZSAqcG1hYyk7CisKKyNlbmRpZiAvKiBQTUFDICovCisKKyNpZmRlZiBFQVhfTU9ERQorCisjaWYgIShkZWZpbmVkKE9NQUMpICYmIGRlZmluZWQoQ1RSKSkKKyAgICNlcnJvciBFQVhfTU9ERSByZXF1aXJlcyBPTUFDIGFuZCBDVFIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICB1bnNpZ25lZCBjaGFyIE5bTUFYQkxPQ0tTSVpFXTsKKyAgIHN5bW1ldHJpY19DVFIgY3RyOworICAgb21hY19zdGF0ZSAgICBoZWFkZXJvbWFjLCBjdG9tYWM7Cit9IGVheF9zdGF0ZTsKKworaW50IGVheF9pbml0KGVheF9zdGF0ZSAqZWF4LCBpbnQgY2lwaGVyLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5vbmNlLCB1bnNpZ25lZCBsb25nIG5vbmNlbGVuLAorICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBoZWFkZXJsZW4pOworCitpbnQgZWF4X2VuY3J5cHQoZWF4X3N0YXRlICplYXgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpOworaW50IGVheF9kZWNyeXB0KGVheF9zdGF0ZSAqZWF4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKK2ludCBlYXhfYWRkaGVhZGVyKGVheF9zdGF0ZSAqZWF4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpoZWFkZXIsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKK2ludCBlYXhfZG9uZShlYXhfc3RhdGUgKmVheCwgdW5zaWduZWQgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nICp0YWdsZW4pOworCitpbnQgZWF4X2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeShpbnQgY2lwaGVyLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbm9uY2UsICB1bnNpZ25lZCBsb25nIG5vbmNlbGVuLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBoZWFkZXJsZW4sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHQsICAgICB1bnNpZ25lZCBsb25nIHB0bGVuLAorICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LAorICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhZywgICAgdW5zaWduZWQgbG9uZyAqdGFnbGVuKTsKKworaW50IGVheF9kZWNyeXB0X3ZlcmlmeV9tZW1vcnkoaW50IGNpcGhlciwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksICAgIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5vbmNlLCAgdW5zaWduZWQgbG9uZyBub25jZWxlbiwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoZWFkZXIsIHVuc2lnbmVkIGxvbmcgaGVhZGVybGVuLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCAgICAgdW5zaWduZWQgbG9uZyBjdGxlbiwKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWcsICAgIHVuc2lnbmVkIGxvbmcgdGFnbGVuLAorICAgICAgICAgIGludCAgICAgICAgICAgKnN0YXQpOworCisgaW50IGVheF90ZXN0KHZvaWQpOworI2VuZGlmIC8qIEVBWCBNT0RFICovCisKKyNpZmRlZiBPQ0JfTU9ERQordHlwZWRlZiBzdHJ1Y3QgeworICAgdW5zaWduZWQgY2hhciAgICAgTFtNQVhCTE9DS1NJWkVdLCAgICAgICAgIC8qIEwgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgIExzWzMyXVtNQVhCTE9DS1NJWkVdLCAgICAvKiBMIHNoaWZ0ZWQgYnkgaSBiaXRzIHRvIHRoZSBsZWZ0ICovCisgICAgICAgICAgICAgICAgICAgICBMaVtNQVhCTE9DS1NJWkVdLCAgICAgICAgLyogdmFsdWUgb2YgTGkgW2N1cnJlbnQgdmFsdWUsIHdlIGNhbGMgZnJvbSBwcmV2aW91cyByZWNhbGxdICovCisgICAgICAgICAgICAgICAgICAgICBMcltNQVhCTE9DS1NJWkVdLCAgICAgICAgLyogTCAqIHheLTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIFJbTUFYQkxPQ0tTSVpFXSwgICAgICAgICAvKiBSIHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bVtNQVhCTE9DS1NJWkVdOyAgLyogY3VycmVudCBjaGVja3N1bSAqLworCisgICBzeW1tZXRyaWNfa2V5ICAgICBrZXk7ICAgICAgICAgICAgICAgICAgICAgLyogc2NoZWR1bGVkIGtleSBmb3IgY2lwaGVyICovCisgICB1bnNpZ25lZCBsb25nICAgICBibG9ja19pbmRleDsgICAgICAgICAgICAgLyogaW5kZXggIyBmb3IgY3VycmVudCBibG9jayAqLworICAgaW50ICAgICAgICAgICAgICAgY2lwaGVyLCAgICAgICAgICAgICAgICAgIC8qIGNpcGhlciBpZHggKi8KKyAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2xlbjsgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgYmxvY2sgKi8KK30gb2NiX3N0YXRlOworCitpbnQgb2NiX2luaXQob2NiX3N0YXRlICpvY2IsIGludCBjaXBoZXIsIAorICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5vbmNlKTsKKworaW50IG9jYl9lbmNyeXB0KG9jYl9zdGF0ZSAqb2NiLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QpOworaW50IG9jYl9kZWNyeXB0KG9jYl9zdGF0ZSAqb2NiLCBjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQpOworCitpbnQgb2NiX2RvbmVfZW5jcnlwdChvY2Jfc3RhdGUgKm9jYiwgCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgIHVuc2lnbmVkIGxvbmcgcHRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWcsIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbik7CisKK2ludCBvY2JfZG9uZV9kZWNyeXB0KG9jYl9zdGF0ZSAqb2NiLCAKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCAgdW5zaWduZWQgbG9uZyBjdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0LCAKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhZywgdW5zaWduZWQgbG9uZyB0YWdsZW4sIGludCAqc3RhdCk7CisKK2ludCBvY2JfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5KGludCBjaXBoZXIsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCAgICAgdW5zaWduZWQgbG9uZyBwdGxlbiwKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWcsICAgIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbik7CisKK2ludCBvY2JfZGVjcnlwdF92ZXJpZnlfbWVtb3J5KGludCBjaXBoZXIsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAgICB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpub25jZSwgIAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCAgICAgdW5zaWduZWQgbG9uZyBjdGxlbiwKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICp0YWcsICAgIHVuc2lnbmVkIGxvbmcgdGFnbGVuLAorICAgICAgICAgIGludCAgICAgICAgICAgKnN0YXQpOworCitpbnQgb2NiX3Rlc3Qodm9pZCk7CisKKy8qIGludGVybmFsIGZ1bmN0aW9ucyAqLwordm9pZCBvY2Jfc2hpZnRfeG9yKG9jYl9zdGF0ZSAqb2NiLCB1bnNpZ25lZCBjaGFyICpaKTsKK2ludCBvY2JfbnR6KHVuc2lnbmVkIGxvbmcgeCk7CitpbnQgc19vY2JfZG9uZShvY2Jfc3RhdGUgKm9jYiwgY29uc3QgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgcHRsZW4sCisgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqdGFnLCB1bnNpZ25lZCBsb25nICp0YWdsZW4sIGludCBtb2RlKTsKKworI2VuZGlmIC8qIE9DQl9NT0RFICovCisKKyNpZmRlZiBDQ01fTU9ERQorCisjZGVmaW5lIENDTV9FTkNSWVBUIDAKKyNkZWZpbmUgQ0NNX0RFQ1JZUFQgMQorCitpbnQgY2NtX21lbW9yeShpbnQgY2lwaGVyLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbm9uY2UsICB1bnNpZ25lZCBsb25nIG5vbmNlbGVuLAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhlYWRlciwgdW5zaWduZWQgbG9uZyBoZWFkZXJsZW4sCisgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHQsICAgICB1bnNpZ25lZCBsb25nIHB0bGVuLAorICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmN0LAorICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnRhZywgICAgdW5zaWduZWQgbG9uZyAqdGFnbGVuLAorICAgICAgICAgICAgICAgICAgICBpbnQgIGRpcmVjdGlvbik7CisKK2ludCBjY21fdGVzdCh2b2lkKTsKKworI2VuZGlmIC8qIENDTV9NT0RFICovCisKKyNpZmRlZiBHQ01fTU9ERQorCisjZGVmaW5lIEdDTV9FTkNSWVBUIDAKKyNkZWZpbmUgR0NNX0RFQ1JZUFQgMQorCisjZGVmaW5lIEdDTV9NT0RFX0lWICAgIDAKKyNkZWZpbmUgR0NNX01PREVfQUFEICAgMQorI2RlZmluZSBHQ01fTU9ERV9URVhUICAyCisKK3R5cGVkZWYgc3RydWN0IHsgCisgICBzeW1tZXRyaWNfa2V5ICAgICAgIEs7CisgICB1bnNpZ25lZCBjaGFyICAgICAgIEhbMTZdLCAgICAgICAgLyogbXVsdGlwbGllciAqLworICAgICAgICAgICAgICAgICAgICAgICBYWzE2XSwgICAgICAgIC8qIGFjY3VtdWxhdG9yICovCisgICAgICAgICAgICAgICAgICAgICAgIFlbMTZdLCAgICAgICAgLyogY291bnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICBZXzBbMTZdLCAgICAgIC8qIGluaXRpYWwgY291bnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICBidWZbMTZdOyAgICAgIC8qIGJ1ZmZlciBmb3Igc3R1ZmYgKi8KKworICAgaW50ICAgICAgICAgICAgICAgICBjaXBoZXIsICAgICAgIC8qIHdoaWNoIGNpcGhlciAqLworICAgICAgICAgICAgICAgICAgICAgICBpdm1vZGUsICAgICAgIC8qIFdoaWNoIG1vZGUgaXMgdGhlIElWIGluPyAqLworICAgICAgICAgICAgICAgICAgICAgICBtb2RlLCAgICAgICAgIC8qIG1vZGUgdGhlIEdDTSBjb2RlIGlzIGluICovCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmxlbjsgICAgICAgLyogbGVuZ3RoIG9mIGRhdGEgaW4gYnVmICovCisKKyAgIHVsb25nNjQgICAgICAgICAgICAgdG90bGVuLCAgICAgICAvKiA2NC1iaXQgY291bnRlciB1c2VkIGZvciBJViBhbmQgQUFEICovCisgICAgICAgICAgICAgICAgICAgICAgIHB0dG90bGVuOyAgICAgLyogNjQtYml0IGNvdW50ZXIgZm9yIHRoZSBQVCAqLworCisjaWZkZWYgR0NNX1RBQkxFUworICAgdW5zaWduZWQgY2hhciAgICAgICBQQ1sxNl1bMjU2XVsxNl07ICAvKiAxNiB0YWJsZXMgb2YgOHgxMjggKi8KKyNlbmRpZiAgCisKK30gZ2NtX3N0YXRlOworCit2b2lkIGdjbV9nZl9tdWx0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmIsIHVuc2lnbmVkIGNoYXIgKmMpOwordm9pZCBnY21fbXVsdF9oKGdjbV9zdGF0ZSAqZ2NtLCB1bnNpZ25lZCBjaGFyICpJKTsKKworaW50IGdjbV9pbml0KGdjbV9zdGF0ZSAqZ2NtLCBpbnQgY2lwaGVyLAorICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbik7CisKK2ludCBnY21fcmVzZXQoZ2NtX3N0YXRlICpnY20pOworCitpbnQgZ2NtX2FkZF9pdihnY21fc3RhdGUgKmdjbSwgCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgICAgIHVuc2lnbmVkIGxvbmcgSVZsZW4pOworCitpbnQgZ2NtX2FkZF9hYWQoZ2NtX3N0YXRlICpnY20sCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGF0YSwgIHVuc2lnbmVkIGxvbmcgYWRhdGFsZW4pOworCitpbnQgZ2NtX3Byb2Nlc3MoZ2NtX3N0YXRlICpnY20sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwgICAgIHVuc2lnbmVkIGxvbmcgcHRsZW4sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pOworCitpbnQgZ2NtX2RvbmUoZ2NtX3N0YXRlICpnY20sIAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqdGFnLCAgICB1bnNpZ25lZCBsb25nICp0YWdsZW4pOworCitpbnQgZ2NtX21lbW9yeSggICAgICBpbnQgICAgICAgICAgIGNpcGhlciwKKyAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgdW5zaWduZWQgbG9uZyBrZXlsZW4sCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgICAgIHVuc2lnbmVkIGxvbmcgSVZsZW4sCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGF0YSwgIHVuc2lnbmVkIGxvbmcgYWRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwdCwgICAgIHVuc2lnbmVkIGxvbmcgcHRsZW4sCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpjdCwgCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICp0YWcsICAgIHVuc2lnbmVkIGxvbmcgKnRhZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKTsKK2ludCBnY21fdGVzdCh2b2lkKTsKKworI2VuZGlmIC8qIEdDTV9NT0RFICovCisKKyNpZmRlZiBQRUxJQ0FOCisKK3R5cGVkZWYgc3RydWN0IHBlbGljYW5fc3RhdGUKK3sKKyAgICBzeW1tZXRyaWNfa2V5IEs7CisgICAgdW5zaWduZWQgY2hhciBzdGF0ZVsxNl07CisgICAgaW50ICAgICAgICAgICBidWZsZW47Cit9IHBlbGljYW5fc3RhdGU7CisKK2ludCBwZWxpY2FuX2luaXQocGVsaWNhbl9zdGF0ZSAqcGVsbWFjLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuKTsKK2ludCBwZWxpY2FuX3Byb2Nlc3MocGVsaWNhbl9zdGF0ZSAqcGVsbWFjLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbik7CitpbnQgcGVsaWNhbl9kb25lKHBlbGljYW5fc3RhdGUgKnBlbG1hYywgdW5zaWduZWQgY2hhciAqb3V0KTsKK2ludCBwZWxpY2FuX3Rlc3Qodm9pZCk7CisKK2ludCBwZWxpY2FuX21lbW9yeShjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCk7CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvaGVhZGVycy90b21jcnlwdF9tYWMuaCx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS43ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL215Y3J5cHRfbWFjcm9zLmggYi9zcmMvaGVhZGVycy90b21jcnlwdF9tYWNyb3MuaApzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSBteWNyeXB0X21hY3Jvcy5oCnJlbmFtZSB0byBzcmMvaGVhZGVycy90b21jcnlwdF9tYWNyb3MuaAppbmRleCA5NjlhOTYxLi40ODg5MzFmIDEwMDY0NAotLS0gYS9teWNyeXB0X21hY3Jvcy5oCisrKyBiL3NyYy9oZWFkZXJzL3RvbWNyeXB0X21hY3Jvcy5oCkBAIC0xMCw3ICsxMCwxMSBAQAogLyogdGhpcyBpcyB0aGUgIjMyLWJpdCBhdCBsZWFzdCIgZGF0YSB0eXBlIAogICogUmUtZGVmaW5lIGl0IHRvIHN1aXQgeW91ciBwbGF0Zm9ybSBidXQgaXQgbXVzdCBiZSBhdCBsZWFzdCAzMi1iaXRzIAogICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxvbmczMjsKKyNpZiBkZWZpbmVkKF9feDg2XzY0X18pCisgICB0eXBlZGVmIHVuc2lnbmVkIHVsb25nMzI7CisjZWxzZQorICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVsb25nMzI7CisjZW5kaWYKIAogLyogLS0tLSBIRUxQRVIgTUFDUk9TIC0tLS0gKi8KICNpZmRlZiBFTkRJQU5fTkVVVFJBTApAQCAtNjMsNiArNjcsMjMgQEAKIAogI2lmZGVmIEVORElBTl9MSVRUTEUKIAorI2lmICFkZWZpbmVkKExUQ19OT19CU1dBUCkgJiYgKGRlZmluZWQoSU5URUxfQ0MpIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX0RKR1BQX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkpKQorCisjZGVmaW5lIFNUT1JFMzJIKHgsIHkpICAgICAgICAgICBcCithc20gX192b2xhdGlsZV9fICggICAgICAgICAgICAgICBcCisgICAiYnN3YXBsICUwICAgICBcblx0IiAgICAgICAgICBcCisgICAibW92bCAgICUwLCglMilcblx0IiAgICAgICAgICBcCisgICAiYnN3YXBsICUwICAgICBcblx0IiAgICAgICAgICBcCisgICAgICA6Ij1yIih4KToiMCIoeCksICJyIih5KSk7CisKKyNkZWZpbmUgTE9BRDMySCh4LCB5KSAgICAgICAgICBcCithc20gX192b2xhdGlsZV9fICggICAgICAgICAgICAgXAorICAgIm1vdmwgKCUyKSwlMFxuXHQiICAgICAgICAgIFwKKyAgICJic3dhcGwgJTBcblx0IiAgICAgICAgICAgICBcCisgICA6Ij1yIih4KTogIjAiKHgpLCAiciIoeSkpOworCisjZWxzZQorCiAjZGVmaW5lIFNUT1JFMzJIKHgsIHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICB7ICh5KVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj4yNCkmMjU1KTsgKHkpWzFdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjE2KSYyNTUpOyAgIFwKICAgICAgICAoeSlbMl0gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+OCkmMjU1KTsgKHkpWzNdID0gKHVuc2lnbmVkIGNoYXIpKCh4KSYyNTUpOyB9CkBAIC03Myw2ICs5NCwyNyBAQAogICAgICAgICAgICAoKHVuc2lnbmVkIGxvbmcpKCh5KVsyXSAmIDI1NSk8PDgpICB8IFwKICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKSgoeSlbM10gJiAyNTUpKTsgfQogCisjZW5kaWYKKworCisvKiB4ODZfNjQgcHJvY2Vzc29yICovCisjaWYgIWRlZmluZWQoTFRDX05PX0JTV0FQKSAmJiAoZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX3g4Nl82NF9fKSkKKworI2RlZmluZSBTVE9SRTY0SCh4LCB5KSAgICAgICAgICAgXAorYXNtIF9fdm9sYXRpbGVfXyAoICAgICAgICAgICAgICAgXAorICAgImJzd2FwcSAlMCAgICAgXG5cdCIgICAgICAgICAgXAorICAgIm1vdnEgICAlMCwoJTIpXG5cdCIgICAgICAgICAgXAorICAgImJzd2FwcSAlMCAgICAgXG5cdCIgICAgICAgICAgXAorICAgICAgOiI9ciIoeCk6IjAiKHgpLCAiciIoeSk6IjAiKTsKKworI2RlZmluZSBMT0FENjRIKHgsIHkpICAgICAgICAgIFwKK2FzbSBfX3ZvbGF0aWxlX18gKCAgICAgICAgICAgICBcCisgICAibW92cSAoJTIpLCUwXG5cdCIgICAgICAgICAgXAorICAgImJzd2FwcSAlMFxuXHQiICAgICAgICAgICAgIFwKKyAgIDoiPXIiKHgpOiAiMCIoeCksICJyIih5KSk7CisKKyNlbHNlCisKICNkZWZpbmUgU1RPUkU2NEgoeCwgeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB7ICh5KVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj41NikmMjU1KTsgKHkpWzFdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjQ4KSYyNTUpOyAgICAgXAogICAgICAoeSlbMl0gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+NDApJjI1NSk7ICh5KVszXSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj4zMikmMjU1KTsgICAgIFwKQEAgLTg1LDEwICsxMjcsMTIgQEAKICAgICAgICAgICgoKHVsb25nNjQpKCh5KVs0XSAmIDI1NSkpPDwyNCl8KCgodWxvbmc2NCkoKHkpWzVdICYgMjU1KSk8PDE2KSB8IFwKICAgICAgICAgICgoKHVsb25nNjQpKCh5KVs2XSAmIDI1NSkpPDw4KXwoKCh1bG9uZzY0KSgoeSlbN10gJiAyNTUpKSk7IH0KIAorI2VuZGlmCisKICNpZmRlZiBFTkRJQU5fMzJCSVRXT1JEIAogCiAjZGVmaW5lIFNUT1JFMzJMKHgsIHkpICAgICAgICBcCi0gICAgIHsgdW5zaWduZWQgbG9uZyBfX3QgPSAoeCk7IG1lbWNweSh5LCAmX190LCA0KTsgfQorICAgICB7IHVsb25nMzIgIF9fdCA9ICh4KTsgbWVtY3B5KHksICZfX3QsIDQpOyB9CiAKICNkZWZpbmUgTE9BRDMyTCh4LCB5KSAgICAgICAgIFwKICAgICAgbWVtY3B5KCYoeCksIHksIDQpOwpAQCAtMTA4LDcgKzE1Miw3IEBACiAjZWxzZSAvKiA2NC1iaXQgd29yZHMgdGhlbiAgKi8KIAogI2RlZmluZSBTVE9SRTMyTCh4LCB5KSAgICAgICAgXAotICAgICB7IHVuc2lnbmVkIGxvbmcgX190ID0gKHgpOyBtZW1jcHkoeSwgJl9fdCwgNCk7IH0KKyAgICAgeyB1bG9uZzMyIF9fdCA9ICh4KTsgbWVtY3B5KHksICZfX3QsIDQpOyB9CiAKICNkZWZpbmUgTE9BRDMyTCh4LCB5KSAgICAgICAgIFwKICAgICAgeyBtZW1jcHkoJih4KSwgeSwgNCk7IHggJj0gMHhGRkZGRkZGRjsgfQpAQCAtMTM1LDQxICsxNzksNDEgQEAKICAgICAgICAgICAgKCh1bnNpZ25lZCBsb25nKSgoeSlbMF0gJiAyNTUpKTsgfQogCiAjZGVmaW5lIFNUT1JFNjRMKHgsIHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7ICh5KVs3XSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj41NikmMjU1KTsgKHkpWzZdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjQ4KSYyNTUpOyAgIFwKLSAgICAgICAoeSlbNV0gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+NDApJjI1NSk7ICh5KVs0XSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj4zMikmMjU1KTsgICBcCi0gICAgICAgKHkpWzNdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjI0KSYyNTUpOyAoeSlbMl0gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+MTYpJjI1NSk7ICAgXAotICAgICAgICh5KVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj44KSYyNTUpOyAoeSlbMF0gPSAodW5zaWduZWQgY2hhcikoKHgpJjI1NSk7IH0KKyAgIHsgKHkpWzddID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjU2KSYyNTUpOyAoeSlbNl0gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+NDgpJjI1NSk7ICAgICBcCisgICAgICh5KVs1XSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj40MCkmMjU1KTsgKHkpWzRdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjMyKSYyNTUpOyAgICAgXAorICAgICAoeSlbM10gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+MjQpJjI1NSk7ICh5KVsyXSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj4xNikmMjU1KTsgICAgIFwKKyAgICAgKHkpWzFdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjgpJjI1NSk7ICh5KVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoeCkmMjU1KTsgfQogCi0jZGVmaW5lIExPQUQ2NEwoeCwgeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB7IHggPSAoKCh1bG9uZzY0KSgoeSlbN10gJiAyNTUpKTw8NTYpfCgoKHVsb25nNjQpKCh5KVs2XSAmIDI1NSkpPDw0OCl8IFwKLSAgICAgICAgICAgKCgodWxvbmc2NCkoKHkpWzVdICYgMjU1KSk8PDQwKXwoKCh1bG9uZzY0KSgoeSlbNF0gJiAyNTUpKTw8MzIpfCBcCi0gICAgICAgICAgICgoKHVsb25nNjQpKCh5KVszXSAmIDI1NSkpPDwyNCl8KCgodWxvbmc2NCkoKHkpWzJdICYgMjU1KSk8PDE2KXwgXAotICAgICAgICAgICAoKCh1bG9uZzY0KSgoeSlbMV0gJiAyNTUpKTw8OCl8KCgodWxvbmc2NCkoKHkpWzBdICYgMjU1KSkpOyB9CisjZGVmaW5lIExPQUQ2NEwoeCwgeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB7IHggPSAoKCh1bG9uZzY0KSgoeSlbN10gJiAyNTUpKTw8NTYpfCgoKHVsb25nNjQpKCh5KVs2XSAmIDI1NSkpPDw0OCkgfCBcCisgICAgICAgICAoKCh1bG9uZzY0KSgoeSlbNV0gJiAyNTUpKTw8NDApfCgoKHVsb25nNjQpKCh5KVs0XSAmIDI1NSkpPDwzMikgfCBcCisgICAgICAgICAoKCh1bG9uZzY0KSgoeSlbM10gJiAyNTUpKTw8MjQpfCgoKHVsb25nNjQpKCh5KVsyXSAmIDI1NSkpPDwxNikgfCBcCisgICAgICAgICAoKCh1bG9uZzY0KSgoeSlbMV0gJiAyNTUpKTw8OCl8KCgodWxvbmc2NCkoKHkpWzBdICYgMjU1KSkpOyB9CiAKICNpZmRlZiBFTkRJQU5fMzJCSVRXT1JEIAogCiAjZGVmaW5lIFNUT1JFMzJIKHgsIHkpICAgICAgICBcCi0gICAgIHsgdW5zaWduZWQgbG9uZyBfX3QgPSAoeCk7IG1lbWNweSh5LCAmX190LCA0KTsgfQorICAgICB7IHVsb25nMzIgX190ID0gKHgpOyBtZW1jcHkoeSwgJl9fdCwgNCk7IH0KIAogI2RlZmluZSBMT0FEMzJIKHgsIHkpICAgICAgICAgXAogICAgICBtZW1jcHkoJih4KSwgeSwgNCk7CiAKICNkZWZpbmUgU1RPUkU2NEgoeCwgeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB7ICh5KVswXSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj41NikmMjU1KTsgKHkpWzFdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjQ4KSYyNTUpOyAgICAgXAotICAgICAoeSlbMl0gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+NDApJjI1NSk7ICh5KVszXSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj4zMikmMjU1KTsgICAgIFwKLSAgICAgKHkpWzRdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjI0KSYyNTUpOyAoeSlbNV0gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+MTYpJjI1NSk7ICAgICBcCi0gICAgICh5KVs2XSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj44KSYyNTUpOyAoeSlbN10gPSAodW5zaWduZWQgY2hhcikoKHgpJjI1NSk7IH0KKyAgICAgeyAoeSlbMF0gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+NTYpJjI1NSk7ICh5KVsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj40OCkmMjU1KTsgICBcCisgICAgICAgKHkpWzJdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjQwKSYyNTUpOyAoeSlbM10gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+MzIpJjI1NSk7ICAgXAorICAgICAgICh5KVs0XSA9ICh1bnNpZ25lZCBjaGFyKSgoKHgpPj4yNCkmMjU1KTsgKHkpWzVdID0gKHVuc2lnbmVkIGNoYXIpKCgoeCk+PjE2KSYyNTUpOyAgIFwKKyAgICAgICAoeSlbNl0gPSAodW5zaWduZWQgY2hhcikoKCh4KT4+OCkmMjU1KTsgICh5KVs3XSA9ICh1bnNpZ25lZCBjaGFyKSgoeCkmMjU1KTsgfQogCi0jZGVmaW5lIExPQUQ2NEgoeCwgeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB7IHggPSAoKCh1bG9uZzY0KSgoeSlbMF0gJiAyNTUpKTw8NTYpfCgoKHVsb25nNjQpKCh5KVsxXSAmIDI1NSkpPDw0OCkgfCBcCi0gICAgICAgICAoKCh1bG9uZzY0KSgoeSlbMl0gJiAyNTUpKTw8NDApfCgoKHVsb25nNjQpKCh5KVszXSAmIDI1NSkpPDwzMikgfCBcCi0gICAgICAgICAoKCh1bG9uZzY0KSgoeSlbNF0gJiAyNTUpKTw8MjQpfCgoKHVsb25nNjQpKCh5KVs1XSAmIDI1NSkpPDwxNikgfCBcCi0gICAgICAgICAoKCh1bG9uZzY0KSgoeSlbNl0gJiAyNTUpKTw8OCl8KCgodWxvbmc2NCkoKHkpWzddICYgMjU1KSkpOyB9CisjZGVmaW5lIExPQUQ2NEgoeCwgeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB7IHggPSAoKCh1bG9uZzY0KSgoeSlbMF0gJiAyNTUpKTw8NTYpfCgoKHVsb25nNjQpKCh5KVsxXSAmIDI1NSkpPDw0OCl8IFwKKyAgICAgICAgICAgKCgodWxvbmc2NCkoKHkpWzJdICYgMjU1KSk8PDQwKXwoKCh1bG9uZzY0KSgoeSlbM10gJiAyNTUpKTw8MzIpfCBcCisgICAgICAgICAgICgoKHVsb25nNjQpKCh5KVs0XSAmIDI1NSkpPDwyNCl8KCgodWxvbmc2NCkoKHkpWzVdICYgMjU1KSk8PDE2KXwgXAorICAgICAgICAgICAoKCh1bG9uZzY0KSgoeSlbNl0gJiAyNTUpKTw8OCl8ICgoKHVsb25nNjQpKCh5KVs3XSAmIDI1NSkpKTsgfQogCiAjZWxzZSAvKiA2NC1iaXQgd29yZHMgdGhlbiAgKi8KIAogI2RlZmluZSBTVE9SRTMySCh4LCB5KSAgICAgICAgXAotICAgICB7IHVuc2lnbmVkIGxvbmcgX190ID0gKHgpOyBtZW1jcHkoeSwgJl9fdCwgNCk7IH0KKyAgICAgeyB1bG9uZzMyIF9fdCA9ICh4KTsgbWVtY3B5KHksICZfX3QsIDQpOyB9CiAKICNkZWZpbmUgTE9BRDMySCh4LCB5KSAgICAgICAgIFwKICAgICAgeyBtZW1jcHkoJih4KSwgeSwgNCk7IHggJj0gMHhGRkZGRkZGRjsgfQpAQCAtMTg2LDQwICsyMzAsMTE4IEBACiAjZGVmaW5lIEJTV0FQKHgpICAoICgoeD4+MjQpJjB4MDAwMDAwRkZVTCkgfCAoKHg8PDI0KSYweEZGMDAwMDAwVUwpICB8IFwKICAgICAgICAgICAgICAgICAgICAgKCh4Pj44KSYweDAwMDBGRjAwVUwpICB8ICgoeDw8OCkmMHgwMEZGMDAwMFVMKSApCiAKLSNpZmRlZiBfTVNDX1ZFUgorCisvKiAzMi1iaXQgUm90YXRlcyAqLworI2lmIGRlZmluZWQoX01TQ19WRVIpCiAKIC8qIGluc3RyaW5zaWMgcm90YXRlICovCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjcHJhZ21hIGludHJpbnNpYyhfbHJvdHIsX2xyb3RsKQogI2RlZmluZSBST1IoeCxuKSBfbHJvdHIoeCxuKQogI2RlZmluZSBST0woeCxuKSBfbHJvdGwoeCxuKQorI2RlZmluZSBST1JjKHgsbikgX2xyb3RyKHgsbikKKyNkZWZpbmUgUk9MYyh4LG4pIF9scm90bCh4LG4pCiAKLSNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKElOVEVMX0NDKQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpICYmICFkZWZpbmVkKElOVEVMX0NDKSAmJiAhZGVmaW5lZChMVENfTk9fQVNNKQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgUk9MKHVuc2lnbmVkIGxvbmcgd29yZCwgaW50IGkpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIFJPTCh1bnNpZ25lZCB3b3JkLCBpbnQgaSkKIHsKLSAgIF9fYXNtX18oInJvbGwgJSVjbCwlMCIKKyAgIGFzbSAoInJvbGwgJSVjbCwlMCIKICAgICAgIDoiPXIiICh3b3JkKQogICAgICAgOiIwIiAod29yZCksImMiIChpKSk7CiAgICByZXR1cm4gd29yZDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIFJPUih1bnNpZ25lZCBsb25nIHdvcmQsIGludCBpKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBST1IodW5zaWduZWQgd29yZCwgaW50IGkpCiB7Ci0gICBfX2FzbV9fKCJyb3JsICUlY2wsJTAiCisgICBhc20gKCJyb3JsICUlY2wsJTAiCiAgICAgICA6Ij1yIiAod29yZCkKICAgICAgIDoiMCIgKHdvcmQpLCJjIiAoaSkpOwogICAgcmV0dXJuIHdvcmQ7CiB9CiAKKyNpZm5kZWYgTFRDX05PX1JPTEMKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBST0xjKHVuc2lnbmVkIHdvcmQsIGNvbnN0IGludCBpKQoreworICAgYXNtICgicm9sbCAlMiwlMCIKKyAgICAgIDoiPXIiICh3b3JkKQorICAgICAgOiIwIiAod29yZCksIkkiIChpKSk7CisgICByZXR1cm4gd29yZDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBST1JjKHVuc2lnbmVkIHdvcmQsIGNvbnN0IGludCBpKQoreworICAgYXNtICgicm9ybCAlMiwlMCIKKyAgICAgIDoiPXIiICh3b3JkKQorICAgICAgOiIwIiAod29yZCksIkkiIChpKSk7CisgICByZXR1cm4gd29yZDsKK30KKworI2Vsc2UKKworI2RlZmluZSBST0xjIFJPTAorI2RlZmluZSBST1JjIFJPUgorCisjZW5kaWYKKwogI2Vsc2UKIAogLyogcm90YXRlcyB0aGUgaGFyZCB3YXkgKi8KICNkZWZpbmUgUk9MKHgsIHkpICggKCgodW5zaWduZWQgbG9uZykoeCk8PCh1bnNpZ25lZCBsb25nKSgoeSkmMzEpKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHgpJjB4RkZGRkZGRkZVTCk+Pih1bnNpZ25lZCBsb25nKSgzMi0oKHkpJjMxKSkpKSAmIDB4RkZGRkZGRkZVTCkKICNkZWZpbmUgUk9SKHgsIHkpICggKCgoKHVuc2lnbmVkIGxvbmcpKHgpJjB4RkZGRkZGRkZVTCk+Pih1bnNpZ25lZCBsb25nKSgoeSkmMzEpKSB8ICgodW5zaWduZWQgbG9uZykoeCk8PCh1bnNpZ25lZCBsb25nKSgzMi0oKHkpJjMxKSkpKSAmIDB4RkZGRkZGRkZVTCkKKyNkZWZpbmUgUk9MYyh4LCB5KSAoICgoKHVuc2lnbmVkIGxvbmcpKHgpPDwodW5zaWduZWQgbG9uZykoKHkpJjMxKSkgfCAoKCh1bnNpZ25lZCBsb25nKSh4KSYweEZGRkZGRkZGVUwpPj4odW5zaWduZWQgbG9uZykoMzItKCh5KSYzMSkpKSkgJiAweEZGRkZGRkZGVUwpCisjZGVmaW5lIFJPUmMoeCwgeSkgKCAoKCgodW5zaWduZWQgbG9uZykoeCkmMHhGRkZGRkZGRlVMKT4+KHVuc2lnbmVkIGxvbmcpKCh5KSYzMSkpIHwgKCh1bnNpZ25lZCBsb25nKSh4KTw8KHVuc2lnbmVkIGxvbmcpKDMyLSgoeSkmMzEpKSkpICYgMHhGRkZGRkZGRlVMKQogCiAjZW5kaWYKIAorCisvKiA2NC1iaXQgUm90YXRlcyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoTFRDX05PX0FTTSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIFJPTDY0KHVuc2lnbmVkIGxvbmcgd29yZCwgaW50IGkpCit7CisgICBhc20oInJvbHEgJSVjbCwlMCIKKyAgICAgIDoiPXIiICh3b3JkKQorICAgICAgOiIwIiAod29yZCksImMiIChpKSk7CisgICByZXR1cm4gd29yZDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIFJPUjY0KHVuc2lnbmVkIGxvbmcgd29yZCwgaW50IGkpCit7CisgICBhc20oInJvcnEgJSVjbCwlMCIKKyAgICAgIDoiPXIiICh3b3JkKQorICAgICAgOiIwIiAod29yZCksImMiIChpKSk7CisgICByZXR1cm4gd29yZDsKK30KKworI2lmbmRlZiBMVENfTk9fUk9MQworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgUk9MNjRjKHVuc2lnbmVkIGxvbmcgd29yZCwgY29uc3QgaW50IGkpCit7CisgICBhc20oInJvbHEgJTIsJTAiCisgICAgICA6Ij1yIiAod29yZCkKKyAgICAgIDoiMCIgKHdvcmQpLCJKIiAoaSkpOworICAgcmV0dXJuIHdvcmQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBST1I2NGModW5zaWduZWQgbG9uZyB3b3JkLCBjb25zdCBpbnQgaSkKK3sKKyAgIGFzbSgicm9ycSAlMiwlMCIKKyAgICAgIDoiPXIiICh3b3JkKQorICAgICAgOiIwIiAod29yZCksIkoiIChpKSk7CisgICByZXR1cm4gd29yZDsKK30KKworI2Vsc2UgLyogTFRDX05PX1JPTEMgKi8KKworI2RlZmluZSBST0w2NGMgUk9MNjQKKyNkZWZpbmUgUk9SNjRjIFJPUjY0CisKKyNlbmRpZgorCisjZWxzZSAvKiBOb3QgeDg2XzY0ICAqLworCiAjZGVmaW5lIFJPTDY0KHgsIHkpIFwKICAgICAoICgoKHgpPDwoKHVsb25nNjQpKHkpJjYzKSkgfCBcCiAgICAgICAoKCh4KSZDT05TVDY0KDB4RkZGRkZGRkZGRkZGRkZGRikpPj4oKHVsb25nNjQpNjQtKCh5KSY2MykpKSkgJiBDT05TVDY0KDB4RkZGRkZGRkZGRkZGRkZGRikpCkBAIC0yMjgsNiArMzUwLDE2IEBACiAgICAgKCAoKCgoeCkmQ09OU1Q2NCgweEZGRkZGRkZGRkZGRkZGRkYpKT4+KCh1bG9uZzY0KSh5KSZDT05TVDY0KDYzKSkpIHwgXAogICAgICAgKCh4KTw8KCh1bG9uZzY0KSg2NC0oKHkpJkNPTlNUNjQoNjMpKSkpKSkgJiBDT05TVDY0KDB4RkZGRkZGRkZGRkZGRkZGRikpCiAKKyNkZWZpbmUgUk9MNjRjKHgsIHkpIFwKKyAgICAoICgoKHgpPDwoKHVsb25nNjQpKHkpJjYzKSkgfCBcCisgICAgICAoKCh4KSZDT05TVDY0KDB4RkZGRkZGRkZGRkZGRkZGRikpPj4oKHVsb25nNjQpNjQtKCh5KSY2MykpKSkgJiBDT05TVDY0KDB4RkZGRkZGRkZGRkZGRkZGRikpCisKKyNkZWZpbmUgUk9SNjRjKHgsIHkpIFwKKyAgICAoICgoKCh4KSZDT05TVDY0KDB4RkZGRkZGRkZGRkZGRkZGRikpPj4oKHVsb25nNjQpKHkpJkNPTlNUNjQoNjMpKSkgfCBcCisgICAgICAoKHgpPDwoKHVsb25nNjQpKDY0LSgoeSkmQ09OU1Q2NCg2MykpKSkpKSAmIENPTlNUNjQoMHhGRkZGRkZGRkZGRkZGRkZGKSkKKworI2VuZGlmCisKICN1bmRlZiBNQVgKICN1bmRlZiBNSU4KICNkZWZpbmUgTUFYKHgsIHkpICggKCh4KT4oeSkpPyh4KTooeSkgKQpAQCAtMjM5LDMgKzM3MSw3IEBACiAjZWxzZQogICAgI2RlZmluZSBieXRlKHgsIG4pICgoKHgpID4+ICg4ICogKG4pKSkgJiAyNTUpCiAjZW5kaWYgICAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hlYWRlcnMvdG9tY3J5cHRfbWFjcm9zLmgsdiAkICovCisvKiAkUmV2aXNpb246IDEuNyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvaGVhZGVycy90b21jcnlwdF9taXNjLmggYi9zcmMvaGVhZGVycy90b21jcnlwdF9taXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0NDc5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9oZWFkZXJzL3RvbWNyeXB0X21pc2MuaApAQCAtMCwwICsxLDIxIEBACisvKiAtLS0tIEJBU0U2NCBSb3V0aW5lcyAtLS0tICovCisjaWZkZWYgQkFTRTY0CitpbnQgYmFzZTY0X2VuY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgbGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKKworaW50IGJhc2U2NF9kZWNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CisjZW5kaWYKKworLyogLS0tLSBNRU0gcm91dGluZXMgLS0tLSAqLwordm9pZCB6ZXJvbWVtKHZvaWQgKmRzdCwgc2l6ZV90IGxlbik7Cit2b2lkIGJ1cm5fc3RhY2sodW5zaWduZWQgbG9uZyBsZW4pOworCitjb25zdCBjaGFyICplcnJvcl90b19zdHJpbmcoaW50IGVycik7CitpbnQgbXBpX3RvX2x0Y19lcnJvcihpbnQgZXJyKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmNyeXB0X2J1aWxkX3NldHRpbmdzOworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvaGVhZGVycy90b21jcnlwdF9taXNjLmgsdiAkICovCisvKiAkUmV2aXNpb246IDEuMiAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvaGVhZGVycy90b21jcnlwdF9way5oIGIvc3JjL2hlYWRlcnMvdG9tY3J5cHRfcGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjA0N2RlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2hlYWRlcnMvdG9tY3J5cHRfcGsuaApAQCAtMCwwICsxLDM4MSBAQAorLyogLS0tLSBOVU1CRVIgVEhFT1JZIC0tLS0gKi8KKyNpZmRlZiBNUEkKKworI2luY2x1ZGUgImx0Y190b21tYXRoLmgiCisKKy8qIGluL291dCBtYWNyb3MgKi8KKyNkZWZpbmUgT1VUUFVUX0JJR05VTShudW0sIG91dCwgeSwgeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoKHkgKyA0KSA+ICpvdXRsZW4pIHsgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHogPSAodW5zaWduZWQgbG9uZyltcF91bnNpZ25lZF9iaW5fc2l6ZShudW0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgU1RPUkUzMkwoeiwgb3V0K3kpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB5ICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICgoeSArIHopID4gKm91dGxlbikgeyByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKChlcnIgPSBtcF90b191bnNpZ25lZF9iaW4obnVtLCBvdXQreSkpICE9IE1QX09LQVkpIHsgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsgfSAgICBcCisgICAgICB5ICs9IHo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElOUFVUX0JJR05VTShudW0sIGluLCB4LCB5LCBpbmxlbikgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAvKiBsb2FkIHZhbHVlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoeSArIDQpID4gaW5sZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZXJyID0gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgTE9BRDMyTCh4LCBpbit5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB5ICs9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgLyogc2FuaXR5IGNoZWNrLi4uICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKHgreSkgPiBpbmxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVyciA9IENSWVBUX0lOVkFMSURfUEFDS0VUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgLyogbG9hZCBpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBpZiAoKGVyciA9IG1wX3JlYWRfdW5zaWduZWRfYmluKG51bSwgKHVuc2lnbmVkIGNoYXIgKilpbit5LCAoaW50KXgpKSAhPSBNUF9PS0FZKSB7XAorICAgICAgICBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICB5ICs9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGlmICgoZXJyID0gbXBfc2hyaW5rKG51bSkpICE9IE1QX09LQVkpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworIGludCBpc19wcmltZShtcF9pbnQgKiwgaW50ICopOworIGludCByYW5kX3ByaW1lKG1wX2ludCAqTiwgbG9uZyBsZW4sIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZyk7CisKKyNlbHNlCisgICAjaWZkZWYgTVJTQQorICAgICAgI2Vycm9yIFJTQSByZXF1aXJlcyB0aGUgYmlnIGludCBsaWJyYXJ5IAorICAgI2VuZGlmCisgICAjaWZkZWYgTUVDQworICAgICAgI2Vycm9yIEVDQyByZXF1aXJlcyB0aGUgYmlnIGludCBsaWJyYXJ5IAorICAgI2VuZGlmCisgICAjaWZkZWYgTURICisgICAgICAjZXJyb3IgREggcmVxdWlyZXMgdGhlIGJpZyBpbnQgbGlicmFyeSAKKyAgICNlbmRpZgorICAgI2lmZGVmIE1EU0EKKyAgICAgICNlcnJvciBEU0EgcmVxdWlyZXMgdGhlIGJpZyBpbnQgbGlicmFyeSAKKyAgICNlbmRpZgorI2VuZGlmIC8qIE1QSSAqLworCisKKy8qIC0tLS0gUFVCTElDIEtFWSBDUllQVE8gLS0tLSAqLworCisjZGVmaW5lIFBLX1BSSVZBVEUgICAgICAgICAgICAwICAgICAgICAvKiBQSyBwcml2YXRlIGtleXMgKi8KKyNkZWZpbmUgUEtfUFVCTElDICAgICAgICAgICAgIDEgICAgICAgIC8qIFBLIHB1YmxpYyBrZXlzICovCisKKy8qIC0tLS0gUEFDS0VUIC0tLS0gKi8KKyNpZmRlZiBQQUNLRVQKKwordm9pZCBwYWNrZXRfc3RvcmVfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IHNlY3Rpb24sIGludCBzdWJzZWN0aW9uKTsKK2ludCBwYWNrZXRfdmFsaWRfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHNlY3Rpb24sIGludCBzdWJzZWN0aW9uKTsKKworI2VuZGlmCisKKworLyogLS0tLSBSU0EgLS0tLSAqLworI2lmZGVmIE1SU0EKKworLyogTWluIGFuZCBNYXggUlNBIGtleSBzaXplcyAoaW4gYml0cykgKi8KKyNkZWZpbmUgTUlOX1JTQV9TSVpFIDEwMjQKKyNkZWZpbmUgTUFYX1JTQV9TSVpFIDQwOTYKKwordHlwZWRlZiBzdHJ1Y3QgUnNhX2tleSB7CisgICAgaW50IHR5cGU7CisgICAgbXBfaW50IGUsIGQsIE4sIHAsIHEsIHFQLCBkUCwgZFE7Cit9IHJzYV9rZXk7CisKK2ludCByc2FfbWFrZV9rZXkocHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBpbnQgc2l6ZSwgbG9uZyBlLCByc2Ffa2V5ICprZXkpOworCitpbnQgcnNhX2V4cHRtb2QoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpvdXRsZW4sIGludCB3aGljaCwKKyAgICAgICAgICAgICAgICAgICAgICByc2Ffa2V5ICprZXkpOworCit2b2lkIHJzYV9mcmVlKHJzYV9rZXkgKmtleSk7CisKKy8qIFRoZXNlIHVzZSBQS0NTICMxIHYyLjAgcGFkZGluZyAqLworaW50IHJzYV9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICAgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpscGFyYW0sIHVuc2lnbmVkIGxvbmcgbHBhcmFtbGVuLAorICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgcHJuZ19pZHgsIGludCBoYXNoX2lkeCwgcnNhX2tleSAqa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK2ludCByc2FfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgICAgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4sIAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpscGFyYW0sICAgdW5zaWduZWQgbG9uZyBscGFyYW1sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhhc2hfaWR4LCBpbnQgKnN0YXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJzYV9rZXkgICAgICAgKmtleSk7CisKK2ludCByc2Ffc2lnbl9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgICAgdW5zaWduZWQgbG9uZyAgaW5sZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAgICAqcHJuZywgICAgIGludCAgICAgICAgICAgIHBybmdfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaGFzaF9pZHgsIHVuc2lnbmVkIGxvbmcgIHNhbHRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICByc2Ffa2V5ICprZXkpOworCitpbnQgcnNhX3ZlcmlmeV9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgICAgICB1bnNpZ25lZCBsb25nIHNpZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaCwgICAgIHVuc2lnbmVkIGxvbmcgaGFzaGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgaGFzaF9pZHgsIHVuc2lnbmVkIGxvbmcgc2FsdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqc3RhdCwgICAgIHJzYV9rZXkgICAgICAqa2V5KTsKKworLyogUEtDUyAjMSBpbXBvcnQvZXhwb3J0ICovCitpbnQgcnNhX2V4cG9ydCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgaW50IHR5cGUsIHJzYV9rZXkgKmtleSk7CitpbnQgcnNhX2ltcG9ydChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgcnNhX2tleSAqa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorI2VuZGlmCisKKy8qIC0tLS0gREggUm91dGluZXMgLS0tLSAqLworI2lmZGVmIE1ESCAKKwordHlwZWRlZiBzdHJ1Y3QgRGhfa2V5IHsKKyAgICBpbnQgaWR4LCB0eXBlOworICAgIG1wX2ludCB4LCB5OworfSBkaF9rZXk7CisKK2ludCBkaF90ZXN0KHZvaWQpOwordm9pZCBkaF9zaXplcyhpbnQgKmxvdywgaW50ICpoaWdoKTsKK2ludCBkaF9nZXRfc2l6ZShkaF9rZXkgKmtleSk7CisKK2ludCBkaF9tYWtlX2tleShwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGludCBrZXlzaXplLCBkaF9rZXkgKmtleSk7Cit2b2lkIGRoX2ZyZWUoZGhfa2V5ICprZXkpOworCitpbnQgZGhfZXhwb3J0KHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBpbnQgdHlwZSwgZGhfa2V5ICprZXkpOworaW50IGRoX2ltcG9ydChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgZGhfa2V5ICprZXkpOworCitpbnQgZGhfc2hhcmVkX3NlY3JldChkaF9rZXkgICAgICAgICpwcml2YXRlX2tleSwgZGhfa2V5ICAgICAgICAqcHVibGljX2tleSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgICAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZGhfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgIHVuc2lnbmVkIGxvbmcgIGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICAgICpwcm5nLCAgaW50IHdwcm5nLCBpbnQgaGFzaCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgZGhfa2V5ICAgICAgICAqa2V5KTsKKworaW50IGRoX2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyAgaW5sZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaF9rZXkgKmtleSk7CisKK2ludCBkaF9zaWduX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgdW5zaWduZWQgbG9uZyAqb3V0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICAgICpwcm5nLCBpbnQgd3BybmcsIGRoX2tleSAqa2V5KTsKKworaW50IGRoX3ZlcmlmeV9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgIHVuc2lnbmVkIGxvbmcgc2lnbGVuLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhc2gsIHVuc2lnbmVkIGxvbmcgaGFzaGxlbiwgCisgICAgICAgICAgICAgICAgICAgaW50ICpzdGF0LCBkaF9rZXkgKmtleSk7CisKKworI2VuZGlmCisKKy8qIC0tLS0gRUNDIFJvdXRpbmVzIC0tLS0gKi8KKyNpZmRlZiBNRUNDCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbXBfaW50IHgsIHksIHo7Cit9IGVjY19wb2ludDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCB0eXBlLCBpZHg7CisgICAgZWNjX3BvaW50IHB1YmtleTsKKyAgICBtcF9pbnQgazsKK30gZWNjX2tleTsKKworaW50IGVjY190ZXN0KHZvaWQpOwordm9pZCBlY2Nfc2l6ZXMoaW50ICpsb3csIGludCAqaGlnaCk7CitpbnQgZWNjX2dldF9zaXplKGVjY19rZXkgKmtleSk7CisKK2ludCBlY2NfbWFrZV9rZXkocHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBpbnQga2V5c2l6ZSwgZWNjX2tleSAqa2V5KTsKK3ZvaWQgZWNjX2ZyZWUoZWNjX2tleSAqa2V5KTsKKworaW50IGVjY19leHBvcnQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIGludCB0eXBlLCBlY2Nfa2V5ICprZXkpOworaW50IGVjY19pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIGVjY19rZXkgKmtleSk7CisKK2ludCBlY2Nfc2hhcmVkX3NlY3JldChlY2Nfa2V5ICpwcml2YXRlX2tleSwgZWNjX2tleSAqcHVibGljX2tleSwgCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZWNjX2VuY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgaW50IGhhc2gsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBlY2Nfa2V5ICprZXkpOworCitpbnQgZWNjX2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyAgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWNjX2tleSAqa2V5KTsKKworaW50IGVjY19zaWduX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGlubGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgZWNjX2tleSAqa2V5KTsKKworaW50IGVjY192ZXJpZnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsICB1bnNpZ25lZCBsb25nIHNpZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaCwgdW5zaWduZWQgbG9uZyBoYXNobGVuLCAKKyAgICAgICAgICAgICAgICAgICAgaW50ICpzdGF0LCBlY2Nfa2V5ICprZXkpOworCisjZW5kaWYKKworI2lmZGVmIE1EU0EKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgaW50IHR5cGUsIHFvcmQ7CisgICBtcF9pbnQgZywgcSwgcCwgeCwgeTsKK30gZHNhX2tleTsKKworaW50IGRzYV9tYWtlX2tleShwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGludCBncm91cF9zaXplLCBpbnQgbW9kdWx1c19zaXplLCBkc2Ffa2V5ICprZXkpOwordm9pZCBkc2FfZnJlZShkc2Ffa2V5ICprZXkpOworCisKK2ludCBkc2Ffc2lnbl9oYXNoX3Jhdyhjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wX2ludCAqciwgICBtcF9pbnQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBkc2Ffa2V5ICprZXkpOworCitpbnQgZHNhX3NpZ25faGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgZHNhX2tleSAqa2V5KTsKKworaW50IGRzYV92ZXJpZnlfaGFzaF9yYXcoICAgICAgICAgbXBfaW50ICpyLCAgICAgICAgICBtcF9pbnQgKnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhc2gsIHVuc2lnbmVkIGxvbmcgaGFzaGxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnN0YXQsICAgICAgZHNhX2tleSAqa2V5KTsKKworaW50IGRzYV92ZXJpZnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsICB1bnNpZ25lZCBsb25nIHNpZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaCwgdW5zaWduZWQgbG9uZyBoYXNobGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAqc3RhdCwgZHNhX2tleSAgICAgICAqa2V5KTsKKworaW50IGRzYV9pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIGRzYV9rZXkgKmtleSk7CisKK2ludCBkc2FfZXhwb3J0KHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBpbnQgdHlwZSwgZHNhX2tleSAqa2V5KTsKKworaW50IGRzYV92ZXJpZnlfa2V5KGRzYV9rZXkgKmtleSwgaW50ICpzdGF0KTsKKworI2VuZGlmCisKKyNpZmRlZiBMVENfREVSCisvKiBERVIgaGFuZGxpbmcgKi8KKworZW51bSB7CisgTFRDX0FTTjFfRU9MLAorIExUQ19BU04xX0lOVEVHRVIsCisgTFRDX0FTTjFfU0hPUlRfSU5URUdFUiwKKyBMVENfQVNOMV9CSVRfU1RSSU5HLAorIExUQ19BU04xX09DVEVUX1NUUklORywKKyBMVENfQVNOMV9OVUxMLAorIExUQ19BU04xX09CSkVDVF9JREVOVElGSUVSLAorIExUQ19BU04xX0lBNV9TVFJJTkcsCisgTFRDX0FTTjFfUFJJTlRBQkxFX1NUUklORywKKyBMVENfQVNOMV9VVENUSU1FLAorCisgTFRDX0FTTjFfQ0hPSUNFLAorIExUQ19BU04xX1NFUVVFTkNFCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgICBpbnQgICAgICAgICAgIHR5cGU7CisgICB2b2lkICAgICAgICAgKmRhdGE7CisgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICBpbnQgICAgICAgICAgIHVzZWQ7Cit9IGx0Y19hc24xX2xpc3Q7CisKKyNkZWZpbmUgTFRDX1NFVF9BU04xKGxpc3QsIGluZGV4LCBUeXBlLCBEYXRhLCBTaXplKSAgXAorICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgTFRDX01BQ1JPX3RlbXAgICAgICAgICAgICA9IChpbmRleCk7ICAgICAgIFwKKyAgICAgIGx0Y19hc24xX2xpc3QgKkxUQ19NQUNST19saXN0ID0gKGxpc3QpOyAgICAgICAgXAorICAgICAgTFRDX01BQ1JPX2xpc3RbTFRDX01BQ1JPX3RlbXBdLnR5cGUgPSAoVHlwZSk7ICBcCisgICAgICBMVENfTUFDUk9fbGlzdFtMVENfTUFDUk9fdGVtcF0uZGF0YSA9IChEYXRhKTsgIFwKKyAgICAgIExUQ19NQUNST19saXN0W0xUQ19NQUNST190ZW1wXS5zaXplID0gKFNpemUpOyAgXAorICAgICAgTFRDX01BQ1JPX2xpc3RbTFRDX01BQ1JPX3RlbXBdLnVzZWQgPSAwOyAgICAgICBcCisgICB9IHdoaWxlICgwKTsKKworLyogU0VRVUVOQ0UgKi8KK2ludCBkZXJfZW5jb2RlX3NlcXVlbmNlKGx0Y19hc24xX2xpc3QgKmxpc3QsIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZGVyX2RlY29kZV9zZXF1ZW5jZShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICB1bnNpZ25lZCBsb25nICBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0Y19hc24xX2xpc3QgKmxpc3QsIHVuc2lnbmVkIGxvbmcgIG91dGxlbik7CisKK2ludCBkZXJfbGVuZ3RoX3NlcXVlbmNlKGx0Y19hc24xX2xpc3QgKmxpc3QsIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCisvKiBWQSBsaXN0IGhhbmR5IGhlbHBlcnMgKi8KK2ludCBkZXJfZW5jb2RlX3NlcXVlbmNlX211bHRpKHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCAuLi4pOworaW50IGRlcl9kZWNvZGVfc2VxdWVuY2VfbXVsdGkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIC4uLik7CisKKy8qIElOVEVHRVIgKi8KK2ludCBkZXJfZW5jb2RlX2ludGVnZXIobXBfaW50ICpudW0sIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK2ludCBkZXJfZGVjb2RlX2ludGVnZXIoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIG1wX2ludCAqbnVtKTsKK2ludCBkZXJfbGVuZ3RoX2ludGVnZXIobXBfaW50ICpudW0sIHVuc2lnbmVkIGxvbmcgKmxlbik7CisKKy8qIElOVEVHRVIgLS0gaGFuZHkgZm9yIDAuLjJeMzItMSB2YWx1ZXMgKi8KK2ludCBkZXJfZGVjb2RlX3Nob3J0X2ludGVnZXIoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHVuc2lnbmVkIGxvbmcgKm51bSk7CitpbnQgZGVyX2VuY29kZV9zaG9ydF9pbnRlZ2VyKHVuc2lnbmVkIGxvbmcgbnVtLCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitpbnQgZGVyX2xlbmd0aF9zaG9ydF9pbnRlZ2VyKHVuc2lnbmVkIGxvbmcgbnVtLCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCisvKiBCSVQgU1RSSU5HICovCitpbnQgZGVyX2VuY29kZV9iaXRfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitpbnQgZGVyX2RlY29kZV9iaXRfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitpbnQgZGVyX2xlbmd0aF9iaXRfc3RyaW5nKHVuc2lnbmVkIGxvbmcgbmJpdHMsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CisKKy8qIE9DVEVUIFNUUklORyAqLworaW50IGRlcl9lbmNvZGVfb2N0ZXRfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK2ludCBkZXJfZGVjb2RlX29jdGV0X3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitpbnQgZGVyX2xlbmd0aF9vY3RldF9zdHJpbmcodW5zaWduZWQgbG9uZyBub2N0ZXRzLCB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCisvKiBPQkpFQ1QgSURFTlRJRklFUiAqLworaW50IGRlcl9lbmNvZGVfb2JqZWN0X2lkZW50aWZpZXIodW5zaWduZWQgbG9uZyAqd29yZHMsIHVuc2lnbmVkIGxvbmcgIG53b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworaW50IGRlcl9kZWNvZGVfb2JqZWN0X2lkZW50aWZpZXIoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgIHVuc2lnbmVkIGxvbmcgIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqd29yZHMsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CitpbnQgZGVyX2xlbmd0aF9vYmplY3RfaWRlbnRpZmllcih1bnNpZ25lZCBsb25nICp3b3JkcywgdW5zaWduZWQgbG9uZyBud29yZHMsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7Cit1bnNpZ25lZCBsb25nIGRlcl9vYmplY3RfaWRlbnRpZmllcl9iaXRzKHVuc2lnbmVkIGxvbmcgeCk7CisKKy8qIElBNSBTVFJJTkcgKi8KK2ludCBkZXJfZW5jb2RlX2lhNV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK2ludCBkZXJfZGVjb2RlX2lhNV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK2ludCBkZXJfbGVuZ3RoX2lhNV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqb2N0ZXRzLCB1bnNpZ25lZCBsb25nIG5vY3RldHMsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CisKK2ludCBkZXJfaWE1X2NoYXJfZW5jb2RlKGludCBjKTsKK2ludCBkZXJfaWE1X3ZhbHVlX2RlY29kZShpbnQgdik7CisKKy8qIFByaW50YWJsZSBTVFJJTkcgKi8KK2ludCBkZXJfZW5jb2RlX3ByaW50YWJsZV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK2ludCBkZXJfZGVjb2RlX3ByaW50YWJsZV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKK2ludCBkZXJfbGVuZ3RoX3ByaW50YWJsZV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqb2N0ZXRzLCB1bnNpZ25lZCBsb25nIG5vY3RldHMsIHVuc2lnbmVkIGxvbmcgKm91dGxlbik7CisKK2ludCBkZXJfcHJpbnRhYmxlX2NoYXJfZW5jb2RlKGludCBjKTsKK2ludCBkZXJfcHJpbnRhYmxlX3ZhbHVlX2RlY29kZShpbnQgdik7CisKKy8qIENIT0lDRSAqLworaW50IGRlcl9kZWNvZGVfY2hvaWNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgIHVuc2lnbmVkIGxvbmcgKmlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0Y19hc24xX2xpc3QgKmxpc3QsIHVuc2lnbmVkIGxvbmcgIG91dGxlbik7CisKKy8qIFVUQ1RpbWUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVuc2lnbmVkIFlZLCAvKiB5ZWFyICovCisgICAgICAgICAgICBNTSwgLyogbW9udGggKi8KKyAgICAgICAgICAgIERELCAvKiBkYXkgKi8KKyAgICAgICAgICAgIGhoLCAvKiBob3VyICovCisgICAgICAgICAgICBtbSwgLyogbWludXRlICovCisgICAgICAgICAgICBzcywgLyogc2Vjb25kICovCisgICAgICAgICAgICBvZmZfZGlyLCAvKiB0aW1lem9uZSBvZmZzZXQgZGlyZWN0aW9uIDAgPT0gKywgMSA9PSAtICovCisgICAgICAgICAgICBvZmZfaGgsIC8qIHRpbWV6b25lIG9mZnNldCBob3VycyAqLworICAgICAgICAgICAgb2ZmX21tOyAvKiB0aW1lem9uZSBvZmZzZXQgbWludXRlcyAqLworfSBsdGNfdXRjdGltZTsKKworaW50IGRlcl9lbmNvZGVfdXRjdGltZShsdGNfdXRjdGltZSAqdXRjdGltZSwgCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pOworCitpbnQgZGVyX2RlY29kZV91dGN0aW1lKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nICppbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHRjX3V0Y3RpbWUgICAqb3V0KTsKKworaW50IGRlcl9sZW5ndGhfdXRjdGltZShsdGNfdXRjdGltZSAqdXRjdGltZSwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKKworCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hlYWRlcnMvdG9tY3J5cHRfcGsuaCx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zMCAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOSAxMToyMzowMyAkICovCmRpZmYgLS1naXQgYS9teWNyeXB0X3BrY3MuaCBiL3NyYy9oZWFkZXJzL3RvbWNyeXB0X3BrY3MuaApzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSBteWNyeXB0X3BrY3MuaApyZW5hbWUgdG8gc3JjL2hlYWRlcnMvdG9tY3J5cHRfcGtjcy5oCmluZGV4IDlmZDA1ODEuLjhkODUwZGUgMTAwNjQ0Ci0tLSBhL215Y3J5cHRfcGtjcy5oCisrKyBiL3NyYy9oZWFkZXJzL3RvbWNyeXB0X3BrY3MuaApAQCAtMTAsNyArMTAsNyBAQAogaW50IHBrY3NfMV9pMm9zcChtcF9pbnQgKm4sIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19sZW4sIHVuc2lnbmVkIGNoYXIgKm91dCk7CiBpbnQgcGtjc18xX29zMmlwKG1wX2ludCAqbiwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4pOwogCi0vKiAqKiogdjIuMCBwYWRkaW5nICovCisvKiAqKiogdjIuMSBwYWRkaW5nICovCiBpbnQgcGtjc18xX29hZXBfZW5jb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZywgICAgdW5zaWduZWQgbG9uZyBtc2dsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxwYXJhbSwgdW5zaWduZWQgbG9uZyBscGFyYW1sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19iaXRsZW4sIHBybmdfc3RhdGUgKnBybmcsCkBAIC0zNCwzMiArMzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2FsdGxlbiwgIGludCAgICAgICAgICAgaGFzaF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBtb2R1bHVzX2JpdGxlbiwgaW50ICAgICpyZXMpOwogCi0vKiAqKiogdjEuNSBwYWRkaW5nICovCi0vKiBlbmNyeXB0aW9uIHBhZGRpbmcgKi8KLWludCBwa2NzXzFfdjE1X2VzX2VuY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICptc2csICAgIHVuc2lnbmVkIGxvbmcgbXNnbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIG1vZHVsdXNfYml0bGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICAgICpwcm5nLCAgIGludCAgICAgICAgICAgcHJuZ19pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pOwotCi0vKiBub3RlICJvdXRsZW4iIGlzIGZpeGVkLCB5b3UgaGF2ZSB0byB0ZWxsIHRoaXMgZGVjb2RlciBob3cgYmlnCi0gKiB0aGUgb3JpZ2luYWwgbWVzc2FnZSB3YXMuICBVbmxpa2UgdGhlIE9BRVAgZGVjb2RlciBpdCBjYW5ub3QgYXV0by1kZXRlY3QgaXQuCi0gKi8KLWludCBwa2NzXzFfdjE1X2VzX2RlY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICptc2csICB1bnNpZ25lZCBsb25nIG1zZ2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG1vZHVsdXNfYml0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgIHVuc2lnbmVkIGxvbmcgb3V0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgKnJlcyk7Ci0KLS8qIHNpZ25hdHVyZSBwYWRkaW5nICovCi1pbnQgcGtjc18xX3YxNV9zYV9lbmNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqbXNnaGFzaCwgIHVuc2lnbmVkIGxvbmcgbXNnaGFzaGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBoYXNoX2lkeCwgdW5zaWduZWQgbG9uZyBtb2R1bHVzX2JpdGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICAgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKLQotaW50IHBrY3NfMV92MTVfc2FfZGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZ2hhc2gsIHVuc2lnbmVkIGxvbmcgbXNnaGFzaGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsICAgICB1bnNpZ25lZCBsb25nIHNpZ2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIGhhc2hfaWR4LCB1bnNpZ25lZCBsb25nIG1vZHVsdXNfYml0bGVuLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgKnJlcyk7Ci0KLQogI2VuZGlmIC8qIFBLQ1NfMSAqLwogCiAvKiA9PT0+IFBLQ1MgIzUgLS0gUGFzc3dvcmQgQmFzZWQgQ3J5cHRvZ3JhcGh5IDw9PT0gKi8KQEAgLTc4LDMgKzUyLDcgQEAKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKTsKIAogI2VuZGlmICAvKiBQS0NTXzUgKi8KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hlYWRlcnMvdG9tY3J5cHRfcGtjcy5oLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTQgMTE6NDY6MDggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2hlYWRlcnMvdG9tY3J5cHRfcHJuZy5oIGIvc3JjL2hlYWRlcnMvdG9tY3J5cHRfcHJuZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NmQ0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaGVhZGVycy90b21jcnlwdF9wcm5nLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qIC0tLS0gUFJORyBTdHVmZiAtLS0tICovCisjaWZkZWYgWUFSUk9XCitzdHJ1Y3QgeWFycm93X3BybmcgeworICAgIGludCAgICAgICAgICAgICAgICAgICBjaXBoZXIsIGhhc2g7CisgICAgdW5zaWduZWQgY2hhciAgICAgICAgIHBvb2xbTUFYQkxPQ0tTSVpFXTsKKyAgICBzeW1tZXRyaWNfQ1RSICAgICAgICAgY3RyOworfTsKKyNlbmRpZgorCisjaWZkZWYgUkM0CitzdHJ1Y3QgcmM0X3BybmcgeworICAgIGludCB4LCB5OworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzI1Nl07Cit9OworI2VuZGlmCisKKyNpZmRlZiBGT1JUVU5BCitzdHJ1Y3QgZm9ydHVuYV9wcm5nIHsKKyAgICBoYXNoX3N0YXRlIHBvb2xbRk9SVFVOQV9QT09MU107ICAgICAvKiB0aGUgIHBvb2xzICovCisKKyAgICBzeW1tZXRyaWNfa2V5IHNrZXk7CisKKyAgICB1bnNpZ25lZCBjaGFyIEtbMzJdLCAgICAgIC8qIHRoZSBjdXJyZW50IGtleSAqLworICAgICAgICAgICAgICAgICAgSVZbMTZdOyAgICAgLyogSVYgZm9yIENUUiBtb2RlICovCisgICAgCisgICAgdW5zaWduZWQgbG9uZyBwb29sX2lkeCwgICAvKiBjdXJyZW50IHBvb2wgd2Ugd2lsbCBhZGQgdG8gKi8KKyAgICAgICAgICAgICAgICAgIHBvb2wwX2xlbiwgIC8qIGxlbmd0aCBvZiAwJ3RoIHBvb2wgKi8KKyAgICAgICAgICAgICAgICAgIHdkOyAgICAgICAgICAgIAorCisgICAgdWxvbmc2NCAgICAgICByZXNldF9jbnQ7ICAvKiBudW1iZXIgb2YgdGltZXMgd2UgaGF2ZSByZXNldCAqLworfTsKKyNlbmRpZgorCisjaWZkZWYgU09CRVIxMjgKK3N0cnVjdCBzb2JlcjEyOF9wcm5nIHsKKyAgICB1bG9uZzMyICAgICAgUlsxN10sICAgICAgICAgIC8qIFdvcmtpbmcgc3RvcmFnZSBmb3IgdGhlIHNoaWZ0IHJlZ2lzdGVyICovCisgICAgICAgICAgICAgICAgIGluaXRSWzE3XSwgICAgICAvKiBzYXZlZCByZWdpc3RlciBjb250ZW50cyAqLyAKKyAgICAgICAgICAgICAgICAga29uc3QsICAgICAgICAgIC8qIGtleSBkZXBlbmRlbnQgY29uc3RhbnQgKi8KKyAgICAgICAgICAgICAgICAgc2J1ZjsgICAgICAgICAgIC8qIHBhcnRpYWwgd29yZCBlbmNyeXB0aW9uIGJ1ZmZlciAqLworCisgICAgaW50ICAgICAgICAgIG5idWYsICAgICAgICAgICAvKiBudW1iZXIgb2YgcGFydC13b3JkIHN0cmVhbSBiaXRzIGJ1ZmZlcmVkICovCisgICAgICAgICAgICAgICAgIGZsYWcsICAgICAgICAgICAvKiBmaXJzdCBhZGRfZW50cm9weSBjYWxsIG9yIG5vdD8gKi8KKyAgICAgICAgICAgICAgICAgc2V0OyAgICAgICAgICAgIC8qIGRpZCB3ZSBjYWxsIGFkZF9lbnRyb3B5IHRvIHNldCBrZXk/ICovCisgICAgCit9OworI2VuZGlmCisKK3R5cGVkZWYgdW5pb24gUHJuZ19zdGF0ZSB7CisjaWZkZWYgWUFSUk9XCisgICAgc3RydWN0IHlhcnJvd19wcm5nICAgIHlhcnJvdzsKKyNlbmRpZgorI2lmZGVmIFJDNAorICAgIHN0cnVjdCByYzRfcHJuZyAgICAgICByYzQ7CisjZW5kaWYKKyNpZmRlZiBGT1JUVU5BCisgICAgc3RydWN0IGZvcnR1bmFfcHJuZyAgIGZvcnR1bmE7CisjZW5kaWYKKyNpZmRlZiBTT0JFUjEyOAorICAgIHN0cnVjdCBzb2JlcjEyOF9wcm5nICBzb2JlcjEyODsKKyNlbmRpZgorfSBwcm5nX3N0YXRlOworCitleHRlcm4gc3RydWN0IGx0Y19wcm5nX2Rlc2NyaXB0b3IgeworICAgIC8qKiBOYW1lIG9mIHRoZSBQUk5HICovCisgICAgY2hhciAqbmFtZTsKKyAgICAvKiogc2l6ZSBpbiBieXRlcyBvZiBleHBvcnRlZCBzdGF0ZSAqLworICAgIGludCAgZXhwb3J0X3NpemU7CisgICAgLyoqIFN0YXJ0IGEgUFJORyBzdGF0ZQorICAgICAgICBAcGFyYW0gcHJuZyAgIFtvdXRdIFRoZSBzdGF0ZSB0byBpbml0aWFsaXplCisgICAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICAgICovCisgICAgaW50ICgqc3RhcnQpKHBybmdfc3RhdGUgKnBybmcpOworICAgIC8qKiBBZGQgZW50cm9weSB0byB0aGUgUFJORworICAgICAgICBAcGFyYW0gaW4gICAgICAgICBUaGUgZW50cm9weQorICAgICAgICBAcGFyYW0gaW5sZW4gICAgICBMZW5ndGggb2YgdGhlIGVudHJvcHkgKG9jdGV0cylcCisgICAgICAgIEBwYXJhbSBwcm5nICAgICAgIFRoZSBQUk5HIHN0YXRlCisgICAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICAgICovCisgICAgaW50ICgqYWRkX2VudHJvcHkpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBwcm5nX3N0YXRlICpwcm5nKTsKKyAgICAvKiogUmVhZHkgYSBQUk5HIHN0YXRlIHRvIHJlYWQgZnJvbQorICAgICAgICBAcGFyYW0gcHJuZyAgICAgICBUaGUgUFJORyBzdGF0ZSB0byByZWFkeQorICAgICAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAgICAqLworICAgIGludCAoKnJlYWR5KShwcm5nX3N0YXRlICpwcm5nKTsKKyAgICAvKiogUmVhZCBmcm9tIHRoZSBQUk5HCisgICAgICAgIEBwYXJhbSBvdXQgICAgIFtvdXRdIFdoZXJlIHRvIHN0b3JlIHRoZSBkYXRhCisgICAgICAgIEBwYXJhbSBvdXRsZW4gIExlbmd0aCBvZiBkYXRhIGRlc2lyZWQgKG9jdGV0cykKKyAgICAgICAgQHBhcmFtIHBybmcgICAgVGhlIFBSTkcgc3RhdGUgdG8gcmVhZCBmcm9tCisgICAgICAgIEByZXR1cm4gTnVtYmVyIG9mIG9jdGV0cyByZWFkCisgICAgKi8KKyAgICB1bnNpZ25lZCBsb25nICgqcmVhZCkodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nIG91dGxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7CisgICAgLyoqIFRlcm1pbmF0ZSBhIFBSTkcgc3RhdGUKKyAgICAgICAgQHBhcmFtIHBybmcgICBUaGUgUFJORyBzdGF0ZSB0byB0ZXJtaW5hdGUKKyAgICAgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisgICAgKi8KKyAgICBpbnQgKCpkb25lKShwcm5nX3N0YXRlICpwcm5nKTsKKyAgICAvKiogRXhwb3J0IGEgUFJORyBzdGF0ZSAgCisgICAgICAgIEBwYXJhbSBvdXQgICAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHN0YXRlCisgICAgICAgIEBwYXJhbSBvdXRsZW4gIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIFBSTkcgc3RhdGUKKyAgICAgICAgQHBhcmFtIHBybmcgICAgVGhlIFBSTkcgdG8gZXhwb3J0CisgICAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorICAgICovCisgICAgaW50ICgqcGV4cG9ydCkodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIHBybmdfc3RhdGUgKnBybmcpOworICAgIC8qKiBJbXBvcnQgYSBQUk5HIHN0YXRlCisgICAgICAgIEBwYXJhbSBpbiAgICAgIFRoZSBkYXRhIHRvIGltcG9ydAorICAgICAgICBAcGFyYW0gaW5sZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGltcG9ydCAob2N0ZXRzKQorICAgICAgICBAcGFyYW0gcHJuZyAgICBUaGUgUFJORyB0byBpbml0aWFsaXplL2ltcG9ydAorICAgICAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyAgICAqLworICAgIGludCAoKnBpbXBvcnQpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBwcm5nX3N0YXRlICpwcm5nKTsKKyAgICAvKiogU2VsZi10ZXN0IHRoZSBQUk5HCisgICAgICAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdGluZyBoYXMgYmVlbiBkaXNhYmxlZAorICAgICovCisgICAgaW50ICgqdGVzdCkodm9pZCk7Cit9IHBybmdfZGVzY3JpcHRvcltdOworCisjaWZkZWYgWUFSUk9XCitpbnQgeWFycm93X3N0YXJ0KHBybmdfc3RhdGUgKnBybmcpOworaW50IHlhcnJvd19hZGRfZW50cm9weShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgeWFycm93X3JlYWR5KHBybmdfc3RhdGUgKnBybmcpOwordW5zaWduZWQgbG9uZyB5YXJyb3dfcmVhZCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgb3V0bGVuLCBwcm5nX3N0YXRlICpwcm5nKTsKK2ludCB5YXJyb3dfZG9uZShwcm5nX3N0YXRlICpwcm5nKTsKK2ludCAgeWFycm93X2V4cG9ydCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgIHlhcnJvd19pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBybmdfc3RhdGUgKnBybmcpOworaW50ICB5YXJyb3dfdGVzdCh2b2lkKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX3BybmdfZGVzY3JpcHRvciB5YXJyb3dfZGVzYzsKKyNlbmRpZgorCisjaWZkZWYgRk9SVFVOQQoraW50IGZvcnR1bmFfc3RhcnQocHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgZm9ydHVuYV9hZGRfZW50cm9weShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgZm9ydHVuYV9yZWFkeShwcm5nX3N0YXRlICpwcm5nKTsKK3Vuc2lnbmVkIGxvbmcgZm9ydHVuYV9yZWFkKHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyBvdXRsZW4sIHBybmdfc3RhdGUgKnBybmcpOworaW50IGZvcnR1bmFfZG9uZShwcm5nX3N0YXRlICpwcm5nKTsKK2ludCAgZm9ydHVuYV9leHBvcnQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIHBybmdfc3RhdGUgKnBybmcpOworaW50ICBmb3J0dW5hX2ltcG9ydChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgIGZvcnR1bmFfdGVzdCh2b2lkKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbHRjX3BybmdfZGVzY3JpcHRvciBmb3J0dW5hX2Rlc2M7CisjZW5kaWYKKworI2lmZGVmIFJDNAoraW50IHJjNF9zdGFydChwcm5nX3N0YXRlICpwcm5nKTsKK2ludCByYzRfYWRkX2VudHJvcHkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBybmdfc3RhdGUgKnBybmcpOworaW50IHJjNF9yZWFkeShwcm5nX3N0YXRlICpwcm5nKTsKK3Vuc2lnbmVkIGxvbmcgcmM0X3JlYWQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nIG91dGxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgIHJjNF9kb25lKHBybmdfc3RhdGUgKnBybmcpOworaW50ICByYzRfZXhwb3J0KHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBwcm5nX3N0YXRlICpwcm5nKTsKK2ludCAgcmM0X2ltcG9ydChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgIHJjNF90ZXN0KHZvaWQpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsdGNfcHJuZ19kZXNjcmlwdG9yIHJjNF9kZXNjOworI2VuZGlmCisKKyNpZmRlZiBTUFJORworaW50IHNwcm5nX3N0YXJ0KHBybmdfc3RhdGUgKnBybmcpOworaW50IHNwcm5nX2FkZF9lbnRyb3B5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBwcm5nX3N0YXRlICpwcm5nKTsKK2ludCBzcHJuZ19yZWFkeShwcm5nX3N0YXRlICpwcm5nKTsKK3Vuc2lnbmVkIGxvbmcgc3BybmdfcmVhZCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgb3V0bGVuLCBwcm5nX3N0YXRlICpwcm5nKTsKK2ludCBzcHJuZ19kb25lKHBybmdfc3RhdGUgKnBybmcpOworaW50ICBzcHJuZ19leHBvcnQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIHBybmdfc3RhdGUgKnBybmcpOworaW50ICBzcHJuZ19pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBybmdfc3RhdGUgKnBybmcpOworaW50ICBzcHJuZ190ZXN0KHZvaWQpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBsdGNfcHJuZ19kZXNjcmlwdG9yIHNwcm5nX2Rlc2M7CisjZW5kaWYKKworI2lmZGVmIFNPQkVSMTI4CitpbnQgc29iZXIxMjhfc3RhcnQocHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgc29iZXIxMjhfYWRkX2VudHJvcHkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBybmdfc3RhdGUgKnBybmcpOworaW50IHNvYmVyMTI4X3JlYWR5KHBybmdfc3RhdGUgKnBybmcpOwordW5zaWduZWQgbG9uZyBzb2JlcjEyOF9yZWFkKHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyBvdXRsZW4sIHBybmdfc3RhdGUgKnBybmcpOworaW50IHNvYmVyMTI4X2RvbmUocHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgIHNvYmVyMTI4X2V4cG9ydCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgIHNvYmVyMTI4X2ltcG9ydChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgcHJuZ19zdGF0ZSAqcHJuZyk7CitpbnQgIHNvYmVyMTI4X3Rlc3Qodm9pZCk7CitleHRlcm4gY29uc3Qgc3RydWN0IGx0Y19wcm5nX2Rlc2NyaXB0b3Igc29iZXIxMjhfZGVzYzsKKyNlbmRpZgorCitpbnQgZmluZF9wcm5nKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHJlZ2lzdGVyX3BybmcoY29uc3Qgc3RydWN0IGx0Y19wcm5nX2Rlc2NyaXB0b3IgKnBybmcpOworaW50IHVucmVnaXN0ZXJfcHJuZyhjb25zdCBzdHJ1Y3QgbHRjX3BybmdfZGVzY3JpcHRvciAqcHJuZyk7CitpbnQgcHJuZ19pc192YWxpZChpbnQgaWR4KTsKK0xUQ19NVVRFWF9QUk9UTyhsdGNfcHJuZ19tdXRleCk7CisKKy8qIFNsb3cgUk5HIHlvdSAqKm1pZ2h0KiogYmUgYWJsZSB0byB1c2UgdG8gc2VlZCBhIFBSTkcgd2l0aC4gIEJlIGNhcmVmdWwgYXMgdGhpcworICogbWlnaHQgbm90IHdvcmsgb24gYWxsIHBsYXRmb3JtcyBhcyBwbGFubmVkCisgKi8KK3Vuc2lnbmVkIGxvbmcgcm5nX2dldF9ieXRlcyh1bnNpZ25lZCBjaGFyICpvdXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb3V0bGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY2FsbGJhY2spKHZvaWQpKTsKKworaW50IHJuZ19tYWtlX3BybmcoaW50IGJpdHMsIGludCB3cHJuZywgcHJuZ19zdGF0ZSAqcHJuZywgdm9pZCAoKmNhbGxiYWNrKSh2b2lkKSk7CisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL2hlYWRlcnMvdG9tY3J5cHRfcHJuZy5oLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTg6MDA6MjggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2hlYWRlcnMvdG9tbWF0aF9jbGFzcy5oIGIvc3JjL2hlYWRlcnMvdG9tbWF0aF9jbGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZGQ3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaGVhZGVycy90b21tYXRoX2NsYXNzLmgKQEAgLTAsMCArMSw5OTggQEAKKyNpZiAhKGRlZmluZWQoTFRNMSkgJiYgZGVmaW5lZChMVE0yKSAmJiBkZWZpbmVkKExUTTMpKQorI2lmIGRlZmluZWQoTFRNMikKKyNkZWZpbmUgTFRNMworI2VuZGlmCisjaWYgZGVmaW5lZChMVE0xKQorI2RlZmluZSBMVE0yCisjZW5kaWYKKyNkZWZpbmUgTFRNMQorCisjaWYgZGVmaW5lZChMVE1fQUxMKQorI2RlZmluZSBCTl9FUlJPUl9DCisjZGVmaW5lIEJOX0ZBU1RfTVBfSU5WTU9EX0MKKyNkZWZpbmUgQk5fRkFTVF9NUF9NT05UR09NRVJZX1JFRFVDRV9DCisjZGVmaW5lIEJOX0ZBU1RfU19NUF9NVUxfRElHU19DCisjZGVmaW5lIEJOX0ZBU1RfU19NUF9NVUxfSElHSF9ESUdTX0MKKyNkZWZpbmUgQk5fRkFTVF9TX01QX1NRUl9DCisjZGVmaW5lIEJOX01QXzJFWFBUX0MKKyNkZWZpbmUgQk5fTVBfQUJTX0MKKyNkZWZpbmUgQk5fTVBfQUREX0MKKyNkZWZpbmUgQk5fTVBfQUREX0RfQworI2RlZmluZSBCTl9NUF9BRERNT0RfQworI2RlZmluZSBCTl9NUF9BTkRfQworI2RlZmluZSBCTl9NUF9DTEFNUF9DCisjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyNkZWZpbmUgQk5fTVBfQ0xFQVJfTVVMVElfQworI2RlZmluZSBCTl9NUF9DTVBfQworI2RlZmluZSBCTl9NUF9DTVBfRF9DCisjZGVmaW5lIEJOX01QX0NNUF9NQUdfQworI2RlZmluZSBCTl9NUF9DTlRfTFNCX0MKKyNkZWZpbmUgQk5fTVBfQ09QWV9DCisjZGVmaW5lIEJOX01QX0NPVU5UX0JJVFNfQworI2RlZmluZSBCTl9NUF9ESVZfQworI2RlZmluZSBCTl9NUF9ESVZfMl9DCisjZGVmaW5lIEJOX01QX0RJVl8yRF9DCisjZGVmaW5lIEJOX01QX0RJVl8zX0MKKyNkZWZpbmUgQk5fTVBfRElWX0RfQworI2RlZmluZSBCTl9NUF9EUl9JU19NT0RVTFVTX0MKKyNkZWZpbmUgQk5fTVBfRFJfUkVEVUNFX0MKKyNkZWZpbmUgQk5fTVBfRFJfU0VUVVBfQworI2RlZmluZSBCTl9NUF9FWENIX0MKKyNkZWZpbmUgQk5fTVBfRVhQVF9EX0MKKyNkZWZpbmUgQk5fTVBfRVhQVE1PRF9DCisjZGVmaW5lIEJOX01QX0VYUFRNT0RfRkFTVF9DCisjZGVmaW5lIEJOX01QX0VYVEVVQ0xJRF9DCisjZGVmaW5lIEJOX01QX0ZSRUFEX0MKKyNkZWZpbmUgQk5fTVBfRldSSVRFX0MKKyNkZWZpbmUgQk5fTVBfR0NEX0MKKyNkZWZpbmUgQk5fTVBfR0VUX0lOVF9DCisjZGVmaW5lIEJOX01QX0dST1dfQworI2RlZmluZSBCTl9NUF9JTklUX0MKKyNkZWZpbmUgQk5fTVBfSU5JVF9DT1BZX0MKKyNkZWZpbmUgQk5fTVBfSU5JVF9NVUxUSV9DCisjZGVmaW5lIEJOX01QX0lOSVRfU0VUX0MKKyNkZWZpbmUgQk5fTVBfSU5JVF9TRVRfSU5UX0MKKyNkZWZpbmUgQk5fTVBfSU5JVF9TSVpFX0MKKyNkZWZpbmUgQk5fTVBfSU5WTU9EX0MKKyNkZWZpbmUgQk5fTVBfSU5WTU9EX1NMT1dfQworI2RlZmluZSBCTl9NUF9JU19TUVVBUkVfQworI2RlZmluZSBCTl9NUF9KQUNPQklfQworI2RlZmluZSBCTl9NUF9LQVJBVFNVQkFfTVVMX0MKKyNkZWZpbmUgQk5fTVBfS0FSQVRTVUJBX1NRUl9DCisjZGVmaW5lIEJOX01QX0xDTV9DCisjZGVmaW5lIEJOX01QX0xTSERfQworI2RlZmluZSBCTl9NUF9NT0RfQworI2RlZmluZSBCTl9NUF9NT0RfMkRfQworI2RlZmluZSBCTl9NUF9NT0RfRF9DCisjZGVmaW5lIEJOX01QX01PTlRHT01FUllfQ0FMQ19OT1JNQUxJWkFUSU9OX0MKKyNkZWZpbmUgQk5fTVBfTU9OVEdPTUVSWV9SRURVQ0VfQworI2RlZmluZSBCTl9NUF9NT05UR09NRVJZX1NFVFVQX0MKKyNkZWZpbmUgQk5fTVBfTVVMX0MKKyNkZWZpbmUgQk5fTVBfTVVMXzJfQworI2RlZmluZSBCTl9NUF9NVUxfMkRfQworI2RlZmluZSBCTl9NUF9NVUxfRF9DCisjZGVmaW5lIEJOX01QX01VTE1PRF9DCisjZGVmaW5lIEJOX01QX05fUk9PVF9DCisjZGVmaW5lIEJOX01QX05FR19DCisjZGVmaW5lIEJOX01QX09SX0MKKyNkZWZpbmUgQk5fTVBfUFJJTUVfRkVSTUFUX0MKKyNkZWZpbmUgQk5fTVBfUFJJTUVfSVNfRElWSVNJQkxFX0MKKyNkZWZpbmUgQk5fTVBfUFJJTUVfSVNfUFJJTUVfQworI2RlZmluZSBCTl9NUF9QUklNRV9NSUxMRVJfUkFCSU5fQworI2RlZmluZSBCTl9NUF9QUklNRV9ORVhUX1BSSU1FX0MKKyNkZWZpbmUgQk5fTVBfUFJJTUVfUkFCSU5fTUlMTEVSX1RSSUFMU19DCisjZGVmaW5lIEJOX01QX1BSSU1FX1JBTkRPTV9FWF9DCisjZGVmaW5lIEJOX01QX1JBRElYX1NJWkVfQworI2RlZmluZSBCTl9NUF9SQURJWF9TTUFQX0MKKyNkZWZpbmUgQk5fTVBfUkFORF9DCisjZGVmaW5lIEJOX01QX1JFQURfUkFESVhfQworI2RlZmluZSBCTl9NUF9SRUFEX1NJR05FRF9CSU5fQworI2RlZmluZSBCTl9NUF9SRUFEX1VOU0lHTkVEX0JJTl9DCisjZGVmaW5lIEJOX01QX1JFRFVDRV9DCisjZGVmaW5lIEJOX01QX1JFRFVDRV8yS19DCisjZGVmaW5lIEJOX01QX1JFRFVDRV8yS19MX0MKKyNkZWZpbmUgQk5fTVBfUkVEVUNFXzJLX1NFVFVQX0MKKyNkZWZpbmUgQk5fTVBfUkVEVUNFXzJLX1NFVFVQX0xfQworI2RlZmluZSBCTl9NUF9SRURVQ0VfSVNfMktfQworI2RlZmluZSBCTl9NUF9SRURVQ0VfSVNfMktfTF9DCisjZGVmaW5lIEJOX01QX1JFRFVDRV9TRVRVUF9DCisjZGVmaW5lIEJOX01QX1JTSERfQworI2RlZmluZSBCTl9NUF9TRVRfQworI2RlZmluZSBCTl9NUF9TRVRfSU5UX0MKKyNkZWZpbmUgQk5fTVBfU0hSSU5LX0MKKyNkZWZpbmUgQk5fTVBfU0lHTkVEX0JJTl9TSVpFX0MKKyNkZWZpbmUgQk5fTVBfU1FSX0MKKyNkZWZpbmUgQk5fTVBfU1FSTU9EX0MKKyNkZWZpbmUgQk5fTVBfU1FSVF9DCisjZGVmaW5lIEJOX01QX1NVQl9DCisjZGVmaW5lIEJOX01QX1NVQl9EX0MKKyNkZWZpbmUgQk5fTVBfU1VCTU9EX0MKKyNkZWZpbmUgQk5fTVBfVE9fU0lHTkVEX0JJTl9DCisjZGVmaW5lIEJOX01QX1RPX1NJR05FRF9CSU5fTl9DCisjZGVmaW5lIEJOX01QX1RPX1VOU0lHTkVEX0JJTl9DCisjZGVmaW5lIEJOX01QX1RPX1VOU0lHTkVEX0JJTl9OX0MKKyNkZWZpbmUgQk5fTVBfVE9PTV9NVUxfQworI2RlZmluZSBCTl9NUF9UT09NX1NRUl9DCisjZGVmaW5lIEJOX01QX1RPUkFESVhfQworI2RlZmluZSBCTl9NUF9UT1JBRElYX05fQworI2RlZmluZSBCTl9NUF9VTlNJR05FRF9CSU5fU0laRV9DCisjZGVmaW5lIEJOX01QX1hPUl9DCisjZGVmaW5lIEJOX01QX1pFUk9fQworI2RlZmluZSBCTl9QUklNRV9UQUJfQworI2RlZmluZSBCTl9SRVZFUlNFX0MKKyNkZWZpbmUgQk5fU19NUF9BRERfQworI2RlZmluZSBCTl9TX01QX0VYUFRNT0RfQworI2RlZmluZSBCTl9TX01QX01VTF9ESUdTX0MKKyNkZWZpbmUgQk5fU19NUF9NVUxfSElHSF9ESUdTX0MKKyNkZWZpbmUgQk5fU19NUF9TUVJfQworI2RlZmluZSBCTl9TX01QX1NVQl9DCisjZGVmaW5lIEJOQ09SRV9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fRVJST1JfQykKKyAgICNkZWZpbmUgQk5fTVBfRVJST1JfVE9fU1RSSU5HX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9GQVNUX01QX0lOVk1PRF9DKQorICAgI2RlZmluZSBCTl9NUF9JU0VWRU5fQworICAgI2RlZmluZSBCTl9NUF9JTklUX01VTFRJX0MKKyAgICNkZWZpbmUgQk5fTVBfQ09QWV9DCisgICAjZGVmaW5lIEJOX01QX01PRF9DCisgICAjZGVmaW5lIEJOX01QX1NFVF9DCisgICAjZGVmaW5lIEJOX01QX0RJVl8yX0MKKyAgICNkZWZpbmUgQk5fTVBfSVNPRERfQworICAgI2RlZmluZSBCTl9NUF9TVUJfQworICAgI2RlZmluZSBCTl9NUF9DTVBfQworICAgI2RlZmluZSBCTl9NUF9JU1pFUk9fQworICAgI2RlZmluZSBCTl9NUF9DTVBfRF9DCisgICAjZGVmaW5lIEJOX01QX0FERF9DCisgICAjZGVmaW5lIEJOX01QX0VYQ0hfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9NVUxUSV9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fRkFTVF9NUF9NT05UR09NRVJZX1JFRFVDRV9DKQorICAgI2RlZmluZSBCTl9NUF9HUk9XX0MKKyAgICNkZWZpbmUgQk5fTVBfUlNIRF9DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyAgICNkZWZpbmUgQk5fTVBfQ01QX01BR19DCisgICAjZGVmaW5lIEJOX1NfTVBfU1VCX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9GQVNUX1NfTVBfTVVMX0RJR1NfQykKKyAgICNkZWZpbmUgQk5fTVBfR1JPV19DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9GQVNUX1NfTVBfTVVMX0hJR0hfRElHU19DKQorICAgI2RlZmluZSBCTl9NUF9HUk9XX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX0ZBU1RfU19NUF9TUVJfQykKKyAgICNkZWZpbmUgQk5fTVBfR1JPV19DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF8yRVhQVF9DKQorICAgI2RlZmluZSBCTl9NUF9aRVJPX0MKKyAgICNkZWZpbmUgQk5fTVBfR1JPV19DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfQUJTX0MpCisgICAjZGVmaW5lIEJOX01QX0NPUFlfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0FERF9DKQorICAgI2RlZmluZSBCTl9TX01QX0FERF9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9NQUdfQworICAgI2RlZmluZSBCTl9TX01QX1NVQl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfQUREX0RfQykKKyAgICNkZWZpbmUgQk5fTVBfR1JPV19DCisgICAjZGVmaW5lIEJOX01QX1NVQl9EX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0FERE1PRF9DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX0MKKyAgICNkZWZpbmUgQk5fTVBfQUREX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworICAgI2RlZmluZSBCTl9NUF9NT0RfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0FORF9DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX0NPUFlfQworICAgI2RlZmluZSBCTl9NUF9DTEFNUF9DCisgICAjZGVmaW5lIEJOX01QX0VYQ0hfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfQ0xBTVBfQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9DTEVBUl9DKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0NMRUFSX01VTFRJX0MpCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9DTVBfQykKKyAgICNkZWZpbmUgQk5fTVBfQ01QX01BR19DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfQ01QX0RfQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9DTVBfTUFHX0MpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfQ05UX0xTQl9DKQorICAgI2RlZmluZSBCTl9NUF9JU1pFUk9fQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0NPUFlfQykKKyAgICNkZWZpbmUgQk5fTVBfR1JPV19DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfQ09VTlRfQklUU19DKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0RJVl9DKQorICAgI2RlZmluZSBCTl9NUF9JU1pFUk9fQworICAgI2RlZmluZSBCTl9NUF9DTVBfTUFHX0MKKyAgICNkZWZpbmUgQk5fTVBfQ09QWV9DCisgICAjZGVmaW5lIEJOX01QX1pFUk9fQworICAgI2RlZmluZSBCTl9NUF9JTklUX01VTFRJX0MKKyAgICNkZWZpbmUgQk5fTVBfU0VUX0MKKyAgICNkZWZpbmUgQk5fTVBfQ09VTlRfQklUU19DCisgICAjZGVmaW5lIEJOX01QX0FCU19DCisgICAjZGVmaW5lIEJOX01QX01VTF8yRF9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9DCisgICAjZGVmaW5lIEJOX01QX1NVQl9DCisgICAjZGVmaW5lIEJOX01QX0FERF9DCisgICAjZGVmaW5lIEJOX01QX0RJVl8yRF9DCisgICAjZGVmaW5lIEJOX01QX0VYQ0hfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9NVUxUSV9DCisgICAjZGVmaW5lIEJOX01QX0lOSVRfU0laRV9DCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQworICAgI2RlZmluZSBCTl9NUF9JTklUX0NPUFlfQworICAgI2RlZmluZSBCTl9NUF9MU0hEX0MKKyAgICNkZWZpbmUgQk5fTVBfUlNIRF9DCisgICAjZGVmaW5lIEJOX01QX01VTF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfRElWXzJfQykKKyAgICNkZWZpbmUgQk5fTVBfR1JPV19DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9ESVZfMkRfQykKKyAgICNkZWZpbmUgQk5fTVBfQ09QWV9DCisgICAjZGVmaW5lIEJOX01QX1pFUk9fQworICAgI2RlZmluZSBCTl9NUF9JTklUX0MKKyAgICNkZWZpbmUgQk5fTVBfTU9EXzJEX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworICAgI2RlZmluZSBCTl9NUF9SU0hEX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworICAgI2RlZmluZSBCTl9NUF9FWENIX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9ESVZfM19DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX1NJWkVfQworICAgI2RlZmluZSBCTl9NUF9DTEFNUF9DCisgICAjZGVmaW5lIEJOX01QX0VYQ0hfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfRElWX0RfQykKKyAgICNkZWZpbmUgQk5fTVBfSVNaRVJPX0MKKyAgICNkZWZpbmUgQk5fTVBfQ09QWV9DCisgICAjZGVmaW5lIEJOX01QX0RJVl8yRF9DCisgICAjZGVmaW5lIEJOX01QX0RJVl8zX0MKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9TSVpFX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworICAgI2RlZmluZSBCTl9NUF9FWENIX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0RSX0lTX01PRFVMVVNfQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9EUl9SRURVQ0VfQykKKyAgICNkZWZpbmUgQk5fTVBfR1JPV19DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyAgICNkZWZpbmUgQk5fTVBfQ01QX01BR19DCisgICAjZGVmaW5lIEJOX1NfTVBfU1VCX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9EUl9TRVRVUF9DKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0VYQ0hfQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9FWFBUX0RfQykKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9DT1BZX0MKKyAgICNkZWZpbmUgQk5fTVBfU0VUX0MKKyAgICNkZWZpbmUgQk5fTVBfU1FSX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworICAgI2RlZmluZSBCTl9NUF9NVUxfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0VYUFRNT0RfQykKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9DCisgICAjZGVmaW5lIEJOX01QX0lOVk1PRF9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyAgICNkZWZpbmUgQk5fTVBfQUJTX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfTVVMVElfQworICAgI2RlZmluZSBCTl9NUF9SRURVQ0VfSVNfMktfTF9DCisgICAjZGVmaW5lIEJOX1NfTVBfRVhQVE1PRF9DCisgICAjZGVmaW5lIEJOX01QX0RSX0lTX01PRFVMVVNfQworICAgI2RlZmluZSBCTl9NUF9SRURVQ0VfSVNfMktfQworICAgI2RlZmluZSBCTl9NUF9JU09ERF9DCisgICAjZGVmaW5lIEJOX01QX0VYUFRNT0RfRkFTVF9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfRVhQVE1PRF9GQVNUX0MpCisgICAjZGVmaW5lIEJOX01QX0NPVU5UX0JJVFNfQworICAgI2RlZmluZSBCTl9NUF9JTklUX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworICAgI2RlZmluZSBCTl9NUF9NT05UR09NRVJZX1NFVFVQX0MKKyAgICNkZWZpbmUgQk5fRkFTVF9NUF9NT05UR09NRVJZX1JFRFVDRV9DCisgICAjZGVmaW5lIEJOX01QX01PTlRHT01FUllfUkVEVUNFX0MKKyAgICNkZWZpbmUgQk5fTVBfRFJfU0VUVVBfQworICAgI2RlZmluZSBCTl9NUF9EUl9SRURVQ0VfQworICAgI2RlZmluZSBCTl9NUF9SRURVQ0VfMktfU0VUVVBfQworICAgI2RlZmluZSBCTl9NUF9SRURVQ0VfMktfQworICAgI2RlZmluZSBCTl9NUF9NT05UR09NRVJZX0NBTENfTk9STUFMSVpBVElPTl9DCisgICAjZGVmaW5lIEJOX01QX01VTE1PRF9DCisgICAjZGVmaW5lIEJOX01QX1NFVF9DCisgICAjZGVmaW5lIEJOX01QX01PRF9DCisgICAjZGVmaW5lIEJOX01QX0NPUFlfQworICAgI2RlZmluZSBCTl9NUF9TUVJfQworICAgI2RlZmluZSBCTl9NUF9NVUxfQworICAgI2RlZmluZSBCTl9NUF9FWENIX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9FWFRFVUNMSURfQykKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9NVUxUSV9DCisgICAjZGVmaW5lIEJOX01QX1NFVF9DCisgICAjZGVmaW5lIEJOX01QX0NPUFlfQworICAgI2RlZmluZSBCTl9NUF9JU1pFUk9fQworICAgI2RlZmluZSBCTl9NUF9ESVZfQworICAgI2RlZmluZSBCTl9NUF9NVUxfQworICAgI2RlZmluZSBCTl9NUF9TVUJfQworICAgI2RlZmluZSBCTl9NUF9ORUdfQworICAgI2RlZmluZSBCTl9NUF9FWENIX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfTVVMVElfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0ZSRUFEX0MpCisgICAjZGVmaW5lIEJOX01QX1pFUk9fQworICAgI2RlZmluZSBCTl9NUF9TX1JNQVBfQworICAgI2RlZmluZSBCTl9NUF9NVUxfRF9DCisgICAjZGVmaW5lIEJOX01QX0FERF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfQ01QX0RfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0ZXUklURV9DKQorICAgI2RlZmluZSBCTl9NUF9SQURJWF9TSVpFX0MKKyAgICNkZWZpbmUgQk5fTVBfVE9SQURJWF9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfR0NEX0MpCisgICAjZGVmaW5lIEJOX01QX0lTWkVST19DCisgICAjZGVmaW5lIEJOX01QX0FCU19DCisgICAjZGVmaW5lIEJOX01QX1pFUk9fQworICAgI2RlZmluZSBCTl9NUF9JTklUX0NPUFlfQworICAgI2RlZmluZSBCTl9NUF9DTlRfTFNCX0MKKyAgICNkZWZpbmUgQk5fTVBfRElWXzJEX0MKKyAgICNkZWZpbmUgQk5fTVBfQ01QX01BR19DCisgICAjZGVmaW5lIEJOX01QX0VYQ0hfQworICAgI2RlZmluZSBCTl9TX01QX1NVQl9DCisgICAjZGVmaW5lIEJOX01QX01VTF8yRF9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9HRVRfSU5UX0MpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfR1JPV19DKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0lOSVRfQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9JTklUX0NPUFlfQykKKyAgICNkZWZpbmUgQk5fTVBfQ09QWV9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfSU5JVF9NVUxUSV9DKQorICAgI2RlZmluZSBCTl9NUF9FUlJfQworICAgI2RlZmluZSBCTl9NUF9JTklUX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0lOSVRfU0VUX0MpCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQworICAgI2RlZmluZSBCTl9NUF9TRVRfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0lOSVRfU0VUX0lOVF9DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX0MKKyAgICNkZWZpbmUgQk5fTVBfU0VUX0lOVF9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfSU5JVF9TSVpFX0MpCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0lOVk1PRF9DKQorICAgI2RlZmluZSBCTl9NUF9JU1pFUk9fQworICAgI2RlZmluZSBCTl9NUF9JU09ERF9DCisgICAjZGVmaW5lIEJOX0ZBU1RfTVBfSU5WTU9EX0MKKyAgICNkZWZpbmUgQk5fTVBfSU5WTU9EX1NMT1dfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0lOVk1PRF9TTE9XX0MpCisgICAjZGVmaW5lIEJOX01QX0lTWkVST19DCisgICAjZGVmaW5lIEJOX01QX0lOSVRfTVVMVElfQworICAgI2RlZmluZSBCTl9NUF9NT0RfQworICAgI2RlZmluZSBCTl9NUF9DT1BZX0MKKyAgICNkZWZpbmUgQk5fTVBfSVNFVkVOX0MKKyAgICNkZWZpbmUgQk5fTVBfU0VUX0MKKyAgICNkZWZpbmUgQk5fTVBfRElWXzJfQworICAgI2RlZmluZSBCTl9NUF9JU09ERF9DCisgICAjZGVmaW5lIEJOX01QX0FERF9DCisgICAjZGVmaW5lIEJOX01QX1NVQl9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfQ01QX01BR19DCisgICAjZGVmaW5lIEJOX01QX0VYQ0hfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9NVUxUSV9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfSVNfU1FVQVJFX0MpCisgICAjZGVmaW5lIEJOX01QX01PRF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9TRVRfSU5UX0MKKyAgICNkZWZpbmUgQk5fTVBfTU9EX0MKKyAgICNkZWZpbmUgQk5fTVBfR0VUX0lOVF9DCisgICAjZGVmaW5lIEJOX01QX1NRUlRfQworICAgI2RlZmluZSBCTl9NUF9TUVJfQworICAgI2RlZmluZSBCTl9NUF9DTVBfTUFHX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX0pBQ09CSV9DKQorICAgI2RlZmluZSBCTl9NUF9DTVBfRF9DCisgICAjZGVmaW5lIEJOX01QX0lTWkVST19DCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQ09QWV9DCisgICAjZGVmaW5lIEJOX01QX0NOVF9MU0JfQworICAgI2RlZmluZSBCTl9NUF9ESVZfMkRfQworICAgI2RlZmluZSBCTl9NUF9NT0RfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfS0FSQVRTVUJBX01VTF9DKQorICAgI2RlZmluZSBCTl9NUF9NVUxfQworICAgI2RlZmluZSBCTl9NUF9JTklUX1NJWkVfQworICAgI2RlZmluZSBCTl9NUF9DTEFNUF9DCisgICAjZGVmaW5lIEJOX01QX1NVQl9DCisgICAjZGVmaW5lIEJOX01QX0FERF9DCisgICAjZGVmaW5lIEJOX01QX0xTSERfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfS0FSQVRTVUJBX1NRUl9DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX1NJWkVfQworICAgI2RlZmluZSBCTl9NUF9DTEFNUF9DCisgICAjZGVmaW5lIEJOX01QX1NRUl9DCisgICAjZGVmaW5lIEJOX01QX1NVQl9DCisgICAjZGVmaW5lIEJOX1NfTVBfQUREX0MKKyAgICNkZWZpbmUgQk5fTVBfTFNIRF9DCisgICAjZGVmaW5lIEJOX01QX0FERF9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9MQ01fQykKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9NVUxUSV9DCisgICAjZGVmaW5lIEJOX01QX0dDRF9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9NQUdfQworICAgI2RlZmluZSBCTl9NUF9ESVZfQworICAgI2RlZmluZSBCTl9NUF9NVUxfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9NVUxUSV9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfTFNIRF9DKQorICAgI2RlZmluZSBCTl9NUF9HUk9XX0MKKyAgICNkZWZpbmUgQk5fTVBfUlNIRF9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfTU9EX0MpCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQworICAgI2RlZmluZSBCTl9NUF9ESVZfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisgICAjZGVmaW5lIEJOX01QX0FERF9DCisgICAjZGVmaW5lIEJOX01QX0VYQ0hfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX01PRF8yRF9DKQorICAgI2RlZmluZSBCTl9NUF9aRVJPX0MKKyAgICNkZWZpbmUgQk5fTVBfQ09QWV9DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9NT0RfRF9DKQorICAgI2RlZmluZSBCTl9NUF9ESVZfRF9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfTU9OVEdPTUVSWV9DQUxDX05PUk1BTElaQVRJT05fQykKKyAgICNkZWZpbmUgQk5fTVBfQ09VTlRfQklUU19DCisgICAjZGVmaW5lIEJOX01QXzJFWFBUX0MKKyAgICNkZWZpbmUgQk5fTVBfU0VUX0MKKyAgICNkZWZpbmUgQk5fTVBfTVVMXzJfQworICAgI2RlZmluZSBCTl9NUF9DTVBfTUFHX0MKKyAgICNkZWZpbmUgQk5fU19NUF9TVUJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX01PTlRHT01FUllfUkVEVUNFX0MpCisgICAjZGVmaW5lIEJOX0ZBU1RfTVBfTU9OVEdPTUVSWV9SRURVQ0VfQworICAgI2RlZmluZSBCTl9NUF9HUk9XX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworICAgI2RlZmluZSBCTl9NUF9SU0hEX0MKKyAgICNkZWZpbmUgQk5fTVBfQ01QX01BR19DCisgICAjZGVmaW5lIEJOX1NfTVBfU1VCX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9NT05UR09NRVJZX1NFVFVQX0MpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfTVVMX0MpCisgICAjZGVmaW5lIEJOX01QX1RPT01fTVVMX0MKKyAgICNkZWZpbmUgQk5fTVBfS0FSQVRTVUJBX01VTF9DCisgICAjZGVmaW5lIEJOX0ZBU1RfU19NUF9NVUxfRElHU19DCisgICAjZGVmaW5lIEJOX1NfTVBfTVVMX0MKKyAgICNkZWZpbmUgQk5fU19NUF9NVUxfRElHU19DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfTVVMXzJfQykKKyAgICNkZWZpbmUgQk5fTVBfR1JPV19DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfTVVMXzJEX0MpCisgICAjZGVmaW5lIEJOX01QX0NPUFlfQworICAgI2RlZmluZSBCTl9NUF9HUk9XX0MKKyAgICNkZWZpbmUgQk5fTVBfTFNIRF9DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9NVUxfRF9DKQorICAgI2RlZmluZSBCTl9NUF9HUk9XX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX01VTE1PRF9DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX0MKKyAgICNkZWZpbmUgQk5fTVBfTVVMX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworICAgI2RlZmluZSBCTl9NUF9NT0RfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX05fUk9PVF9DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX0MKKyAgICNkZWZpbmUgQk5fTVBfU0VUX0MKKyAgICNkZWZpbmUgQk5fTVBfQ09QWV9DCisgICAjZGVmaW5lIEJOX01QX0VYUFRfRF9DCisgICAjZGVmaW5lIEJOX01QX01VTF9DCisgICAjZGVmaW5lIEJOX01QX1NVQl9DCisgICAjZGVmaW5lIEJOX01QX01VTF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfRElWX0MKKyAgICNkZWZpbmUgQk5fTVBfQ01QX0MKKyAgICNkZWZpbmUgQk5fTVBfU1VCX0RfQworICAgI2RlZmluZSBCTl9NUF9FWENIX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX05FR19DKQorICAgI2RlZmluZSBCTl9NUF9DT1BZX0MKKyAgICNkZWZpbmUgQk5fTVBfSVNaRVJPX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9PUl9DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX0NPUFlfQworICAgI2RlZmluZSBCTl9NUF9DTEFNUF9DCisgICAjZGVmaW5lIEJOX01QX0VYQ0hfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfUFJJTUVfRkVSTUFUX0MpCisgICAjZGVmaW5lIEJOX01QX0NNUF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9DCisgICAjZGVmaW5lIEJOX01QX0VYUFRNT0RfQworICAgI2RlZmluZSBCTl9NUF9DTVBfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfUFJJTUVfSVNfRElWSVNJQkxFX0MpCisgICAjZGVmaW5lIEJOX01QX01PRF9EX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9QUklNRV9JU19QUklNRV9DKQorICAgI2RlZmluZSBCTl9NUF9DTVBfRF9DCisgICAjZGVmaW5lIEJOX01QX1BSSU1FX0lTX0RJVklTSUJMRV9DCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQworICAgI2RlZmluZSBCTl9NUF9TRVRfQworICAgI2RlZmluZSBCTl9NUF9QUklNRV9NSUxMRVJfUkFCSU5fQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfUFJJTUVfTUlMTEVSX1JBQklOX0MpCisgICAjZGVmaW5lIEJOX01QX0NNUF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9DT1BZX0MKKyAgICNkZWZpbmUgQk5fTVBfU1VCX0RfQworICAgI2RlZmluZSBCTl9NUF9DTlRfTFNCX0MKKyAgICNkZWZpbmUgQk5fTVBfRElWXzJEX0MKKyAgICNkZWZpbmUgQk5fTVBfRVhQVE1PRF9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9DCisgICAjZGVmaW5lIEJOX01QX1NRUk1PRF9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9QUklNRV9ORVhUX1BSSU1FX0MpCisgICAjZGVmaW5lIEJOX01QX0NNUF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfU0VUX0MKKyAgICNkZWZpbmUgQk5fTVBfU1VCX0RfQworICAgI2RlZmluZSBCTl9NUF9JU0VWRU5fQworICAgI2RlZmluZSBCTl9NUF9NT0RfRF9DCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQworICAgI2RlZmluZSBCTl9NUF9BRERfRF9DCisgICAjZGVmaW5lIEJOX01QX1BSSU1FX01JTExFUl9SQUJJTl9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9QUklNRV9SQUJJTl9NSUxMRVJfVFJJQUxTX0MpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfUFJJTUVfUkFORE9NX0VYX0MpCisgICAjZGVmaW5lIEJOX01QX1JFQURfVU5TSUdORURfQklOX0MKKyAgICNkZWZpbmUgQk5fTVBfUFJJTUVfSVNfUFJJTUVfQworICAgI2RlZmluZSBCTl9NUF9TVUJfRF9DCisgICAjZGVmaW5lIEJOX01QX0RJVl8yX0MKKyAgICNkZWZpbmUgQk5fTVBfTVVMXzJfQworICAgI2RlZmluZSBCTl9NUF9BRERfRF9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfUkFESVhfU0laRV9DKQorICAgI2RlZmluZSBCTl9NUF9DT1VOVF9CSVRTX0MKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9DT1BZX0MKKyAgICNkZWZpbmUgQk5fTVBfSVNaRVJPX0MKKyAgICNkZWZpbmUgQk5fTVBfRElWX0RfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfUkFESVhfU01BUF9DKQorICAgI2RlZmluZSBCTl9NUF9TX1JNQVBfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1JBTkRfQykKKyAgICNkZWZpbmUgQk5fTVBfWkVST19DCisgICAjZGVmaW5lIEJOX01QX0FERF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfTFNIRF9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfUkVBRF9SQURJWF9DKQorICAgI2RlZmluZSBCTl9NUF9aRVJPX0MKKyAgICNkZWZpbmUgQk5fTVBfU19STUFQX0MKKyAgICNkZWZpbmUgQk5fTVBfTVVMX0RfQworICAgI2RlZmluZSBCTl9NUF9BRERfRF9DCisgICAjZGVmaW5lIEJOX01QX0lTWkVST19DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfUkVBRF9TSUdORURfQklOX0MpCisgICAjZGVmaW5lIEJOX01QX1JFQURfVU5TSUdORURfQklOX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9SRUFEX1VOU0lHTkVEX0JJTl9DKQorICAgI2RlZmluZSBCTl9NUF9HUk9XX0MKKyAgICNkZWZpbmUgQk5fTVBfWkVST19DCisgICAjZGVmaW5lIEJOX01QX01VTF8yRF9DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9SRURVQ0VfQykKKyAgICNkZWZpbmUgQk5fTVBfUkVEVUNFX1NFVFVQX0MKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9DT1BZX0MKKyAgICNkZWZpbmUgQk5fTVBfUlNIRF9DCisgICAjZGVmaW5lIEJOX01QX01VTF9DCisgICAjZGVmaW5lIEJOX1NfTVBfTVVMX0hJR0hfRElHU19DCisgICAjZGVmaW5lIEJOX0ZBU1RfU19NUF9NVUxfSElHSF9ESUdTX0MKKyAgICNkZWZpbmUgQk5fTVBfTU9EXzJEX0MKKyAgICNkZWZpbmUgQk5fU19NUF9NVUxfRElHU19DCisgICAjZGVmaW5lIEJOX01QX1NVQl9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfU0VUX0MKKyAgICNkZWZpbmUgQk5fTVBfTFNIRF9DCisgICAjZGVmaW5lIEJOX01QX0FERF9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9DCisgICAjZGVmaW5lIEJOX1NfTVBfU1VCX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1JFRFVDRV8yS19DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX0MKKyAgICNkZWZpbmUgQk5fTVBfQ09VTlRfQklUU19DCisgICAjZGVmaW5lIEJOX01QX0RJVl8yRF9DCisgICAjZGVmaW5lIEJOX01QX01VTF9EX0MKKyAgICNkZWZpbmUgQk5fU19NUF9BRERfQworICAgI2RlZmluZSBCTl9NUF9DTVBfTUFHX0MKKyAgICNkZWZpbmUgQk5fU19NUF9TVUJfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfUkVEVUNFXzJLX0xfQykKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9DCisgICAjZGVmaW5lIEJOX01QX0NPVU5UX0JJVFNfQworICAgI2RlZmluZSBCTl9NUF9ESVZfMkRfQworICAgI2RlZmluZSBCTl9NUF9NVUxfQworICAgI2RlZmluZSBCTl9TX01QX0FERF9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9NQUdfQworICAgI2RlZmluZSBCTl9TX01QX1NVQl9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9SRURVQ0VfMktfU0VUVVBfQykKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9DCisgICAjZGVmaW5lIEJOX01QX0NPVU5UX0JJVFNfQworICAgI2RlZmluZSBCTl9NUF8yRVhQVF9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyAgICNkZWZpbmUgQk5fU19NUF9TVUJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1JFRFVDRV8yS19TRVRVUF9MX0MpCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQworICAgI2RlZmluZSBCTl9NUF8yRVhQVF9DCisgICAjZGVmaW5lIEJOX01QX0NPVU5UX0JJVFNfQworICAgI2RlZmluZSBCTl9TX01QX1NVQl9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9SRURVQ0VfSVNfMktfQykKKyAgICNkZWZpbmUgQk5fTVBfUkVEVUNFXzJLX0MKKyAgICNkZWZpbmUgQk5fTVBfQ09VTlRfQklUU19DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfUkVEVUNFX0lTXzJLX0xfQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9SRURVQ0VfU0VUVVBfQykKKyAgICNkZWZpbmUgQk5fTVBfMkVYUFRfQworICAgI2RlZmluZSBCTl9NUF9ESVZfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1JTSERfQykKKyAgICNkZWZpbmUgQk5fTVBfWkVST19DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfU0VUX0MpCisgICAjZGVmaW5lIEJOX01QX1pFUk9fQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1NFVF9JTlRfQykKKyAgICNkZWZpbmUgQk5fTVBfWkVST19DCisgICAjZGVmaW5lIEJOX01QX01VTF8yRF9DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9TSFJJTktfQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9TSUdORURfQklOX1NJWkVfQykKKyAgICNkZWZpbmUgQk5fTVBfVU5TSUdORURfQklOX1NJWkVfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1NRUl9DKQorICAgI2RlZmluZSBCTl9NUF9UT09NX1NRUl9DCisgICAjZGVmaW5lIEJOX01QX0tBUkFUU1VCQV9TUVJfQworICAgI2RlZmluZSBCTl9GQVNUX1NfTVBfU1FSX0MKKyAgICNkZWZpbmUgQk5fU19NUF9TUVJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1NRUk1PRF9DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX0MKKyAgICNkZWZpbmUgQk5fTVBfU1FSX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworICAgI2RlZmluZSBCTl9NUF9NT0RfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1NRUlRfQykKKyAgICNkZWZpbmUgQk5fTVBfTl9ST09UX0MKKyAgICNkZWZpbmUgQk5fTVBfSVNaRVJPX0MKKyAgICNkZWZpbmUgQk5fTVBfWkVST19DCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQ09QWV9DCisgICAjZGVmaW5lIEJOX01QX1JTSERfQworICAgI2RlZmluZSBCTl9NUF9ESVZfQworICAgI2RlZmluZSBCTl9NUF9BRERfQworICAgI2RlZmluZSBCTl9NUF9ESVZfMl9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9NQUdfQworICAgI2RlZmluZSBCTl9NUF9FWENIX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1NVQl9DKQorICAgI2RlZmluZSBCTl9TX01QX0FERF9DCisgICAjZGVmaW5lIEJOX01QX0NNUF9NQUdfQworICAgI2RlZmluZSBCTl9TX01QX1NVQl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfU1VCX0RfQykKKyAgICNkZWZpbmUgQk5fTVBfR1JPV19DCisgICAjZGVmaW5lIEJOX01QX0FERF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1NVQk1PRF9DKQorICAgI2RlZmluZSBCTl9NUF9JTklUX0MKKyAgICNkZWZpbmUgQk5fTVBfU1VCX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworICAgI2RlZmluZSBCTl9NUF9NT0RfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1RPX1NJR05FRF9CSU5fQykKKyAgICNkZWZpbmUgQk5fTVBfVE9fVU5TSUdORURfQklOX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9UT19TSUdORURfQklOX05fQykKKyAgICNkZWZpbmUgQk5fTVBfU0lHTkVEX0JJTl9TSVpFX0MKKyAgICNkZWZpbmUgQk5fTVBfVE9fU0lHTkVEX0JJTl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfVE9fVU5TSUdORURfQklOX0MpCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQ09QWV9DCisgICAjZGVmaW5lIEJOX01QX0lTWkVST19DCisgICAjZGVmaW5lIEJOX01QX0RJVl8yRF9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9UT19VTlNJR05FRF9CSU5fTl9DKQorICAgI2RlZmluZSBCTl9NUF9VTlNJR05FRF9CSU5fU0laRV9DCisgICAjZGVmaW5lIEJOX01QX1RPX1VOU0lHTkVEX0JJTl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fTVBfVE9PTV9NVUxfQykKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9NVUxUSV9DCisgICAjZGVmaW5lIEJOX01QX01PRF8yRF9DCisgICAjZGVmaW5lIEJOX01QX0NPUFlfQworICAgI2RlZmluZSBCTl9NUF9SU0hEX0MKKyAgICNkZWZpbmUgQk5fTVBfTVVMX0MKKyAgICNkZWZpbmUgQk5fTVBfTVVMXzJfQworICAgI2RlZmluZSBCTl9NUF9BRERfQworICAgI2RlZmluZSBCTl9NUF9TVUJfQworICAgI2RlZmluZSBCTl9NUF9ESVZfMl9DCisgICAjZGVmaW5lIEJOX01QX01VTF8yRF9DCisgICAjZGVmaW5lIEJOX01QX01VTF9EX0MKKyAgICNkZWZpbmUgQk5fTVBfRElWXzNfQworICAgI2RlZmluZSBCTl9NUF9MU0hEX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfTVVMVElfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1RPT01fU1FSX0MpCisgICAjZGVmaW5lIEJOX01QX0lOSVRfTVVMVElfQworICAgI2RlZmluZSBCTl9NUF9NT0RfMkRfQworICAgI2RlZmluZSBCTl9NUF9DT1BZX0MKKyAgICNkZWZpbmUgQk5fTVBfUlNIRF9DCisgICAjZGVmaW5lIEJOX01QX1NRUl9DCisgICAjZGVmaW5lIEJOX01QX01VTF8yX0MKKyAgICNkZWZpbmUgQk5fTVBfQUREX0MKKyAgICNkZWZpbmUgQk5fTVBfU1VCX0MKKyAgICNkZWZpbmUgQk5fTVBfRElWXzJfQworICAgI2RlZmluZSBCTl9NUF9NVUxfMkRfQworICAgI2RlZmluZSBCTl9NUF9NVUxfRF9DCisgICAjZGVmaW5lIEJOX01QX0RJVl8zX0MKKyAgICNkZWZpbmUgQk5fTVBfTFNIRF9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX01VTFRJX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9UT1JBRElYX0MpCisgICAjZGVmaW5lIEJOX01QX0lTWkVST19DCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQ09QWV9DCisgICAjZGVmaW5lIEJOX01QX0RJVl9EX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworICAgI2RlZmluZSBCTl9NUF9TX1JNQVBfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1RPUkFESVhfTl9DKQorICAgI2RlZmluZSBCTl9NUF9JU1pFUk9fQworICAgI2RlZmluZSBCTl9NUF9JTklUX0NPUFlfQworICAgI2RlZmluZSBCTl9NUF9ESVZfRF9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyAgICNkZWZpbmUgQk5fTVBfU19STUFQX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9VTlNJR05FRF9CSU5fU0laRV9DKQorICAgI2RlZmluZSBCTl9NUF9DT1VOVF9CSVRTX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9NUF9YT1JfQykKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9DT1BZX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworICAgI2RlZmluZSBCTl9NUF9FWENIX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX01QX1pFUk9fQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9QUklNRV9UQUJfQykKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9SRVZFUlNFX0MpCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fU19NUF9BRERfQykKKyAgICNkZWZpbmUgQk5fTVBfR1JPV19DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9TX01QX0VYUFRNT0RfQykKKyAgICNkZWZpbmUgQk5fTVBfQ09VTlRfQklUU19DCisgICAjZGVmaW5lIEJOX01QX0lOSVRfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisgICAjZGVmaW5lIEJOX01QX1JFRFVDRV9TRVRVUF9DCisgICAjZGVmaW5lIEJOX01QX1JFRFVDRV9DCisgICAjZGVmaW5lIEJOX01QX1JFRFVDRV8yS19TRVRVUF9MX0MKKyAgICNkZWZpbmUgQk5fTVBfUkVEVUNFXzJLX0xfQworICAgI2RlZmluZSBCTl9NUF9NT0RfQworICAgI2RlZmluZSBCTl9NUF9DT1BZX0MKKyAgICNkZWZpbmUgQk5fTVBfU1FSX0MKKyAgICNkZWZpbmUgQk5fTVBfTVVMX0MKKyAgICNkZWZpbmUgQk5fTVBfU0VUX0MKKyAgICNkZWZpbmUgQk5fTVBfRVhDSF9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fU19NUF9NVUxfRElHU19DKQorICAgI2RlZmluZSBCTl9GQVNUX1NfTVBfTVVMX0RJR1NfQworICAgI2RlZmluZSBCTl9NUF9JTklUX1NJWkVfQworICAgI2RlZmluZSBCTl9NUF9DTEFNUF9DCisgICAjZGVmaW5lIEJOX01QX0VYQ0hfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9DCisjZW5kaWYKKworI2lmIGRlZmluZWQoQk5fU19NUF9NVUxfSElHSF9ESUdTX0MpCisgICAjZGVmaW5lIEJOX0ZBU1RfU19NUF9NVUxfSElHSF9ESUdTX0MKKyAgICNkZWZpbmUgQk5fTVBfSU5JVF9TSVpFX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworICAgI2RlZmluZSBCTl9NUF9FWENIX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xFQVJfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX1NfTVBfU1FSX0MpCisgICAjZGVmaW5lIEJOX01QX0lOSVRfU0laRV9DCisgICAjZGVmaW5lIEJOX01QX0NMQU1QX0MKKyAgICNkZWZpbmUgQk5fTVBfRVhDSF9DCisgICAjZGVmaW5lIEJOX01QX0NMRUFSX0MKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9TX01QX1NVQl9DKQorICAgI2RlZmluZSBCTl9NUF9HUk9XX0MKKyAgICNkZWZpbmUgQk5fTVBfQ0xBTVBfQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOQ09SRV9DKQorI2VuZGlmCisKKyNpZmRlZiBMVE0zCisjZGVmaW5lIExUTV9MQVNUCisjZW5kaWYKKyNpbmNsdWRlIDx0b21tYXRoX3N1cGVyY2xhc3MuaD4KKyNpbmNsdWRlIDx0b21tYXRoX2NsYXNzLmg+CisjZWxzZQorI2RlZmluZSBMVE1fTEFTVAorI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oZWFkZXJzL3RvbW1hdGhfY2xhc3MuaCx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4yICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9oZWFkZXJzL3RvbW1hdGhfc3VwZXJjbGFzcy5oIGIvc3JjL2hlYWRlcnMvdG9tbWF0aF9zdXBlcmNsYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmM2Y1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9oZWFkZXJzL3RvbW1hdGhfc3VwZXJjbGFzcy5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIHN1cGVyIGNsYXNzIGZpbGUgZm9yIFBLIGFsZ29zICovCisKKy8qIGRlZmF1bHQgLi4uIGluY2x1ZGUgYWxsIE1QSSAqLworI2lmbmRlZiBTQ19SU0FfMQorCisjZGVmaW5lIExUTV9BTEwKKworI2VuZGlmCisKKy8qIFJTQSBvbmx5IChkb2VzIG5vdCBzdXBwb3J0IERIL0RTQS9FQ0MpICovCisvKiAjZGVmaW5lIFNDX1JTQV8xICovCisKKy8qIEZvciByZWZlcmVuY2UuLi4uIE9uIGFuIEF0aGxvbjY0IG9wdGltaXppbmcgZm9yIHNwZWVkLi4uCisKKyAgIExUTSdzIG1waS5vIHdpdGggYWxsIGZ1bmN0aW9ucyBbc3RyaXBlZF0gaXMgMTQyS2lCIGluIHNpemUuCisKKyovCisKKy8qIFdvcmtzIGZvciBSU0Egb25seSwgbXBpLm8gaXMgNjhLaUIgKi8KKyNpZmRlZiBTQ19SU0FfMQorICAgI2RlZmluZSBCTl9NUF9TSFJJTktfQworICAgI2RlZmluZSBCTl9NUF9MQ01fQworICAgI2RlZmluZSBCTl9NUF9QUklNRV9SQU5ET01fRVhfQworICAgI2RlZmluZSBCTl9NUF9JTlZNT0RfQworICAgI2RlZmluZSBCTl9NUF9HQ0RfQworICAgI2RlZmluZSBCTl9NUF9NT0RfQworICAgI2RlZmluZSBCTl9NUF9NVUxNT0RfQworICAgI2RlZmluZSBCTl9NUF9BRERNT0RfQworICAgI2RlZmluZSBCTl9NUF9FWFBUTU9EX0MKKyAgICNkZWZpbmUgQk5fTVBfU0VUX0lOVF9DCisgICAjZGVmaW5lIEJOX01QX0lOSVRfTVVMVElfQworICAgI2RlZmluZSBCTl9NUF9DTEVBUl9NVUxUSV9DCisgICAjZGVmaW5lIEJOX01QX1VOU0lHTkVEX0JJTl9TSVpFX0MKKyAgICNkZWZpbmUgQk5fTVBfVE9fVU5TSUdORURfQklOX0MKKyAgICNkZWZpbmUgQk5fTVBfTU9EX0RfQworICAgI2RlZmluZSBCTl9NUF9QUklNRV9SQUJJTl9NSUxMRVJfVFJJQUxTX0MKKyAgICNkZWZpbmUgQk5fUkVWRVJTRV9DCisgICAjZGVmaW5lIEJOX1BSSU1FX1RBQl9DCisKKyAgIC8qIG90aGVyIG1vZGlmaWVycyAqLworICAgI2RlZmluZSBCTl9NUF9ESVZfU01BTEwgICAgICAgICAgICAgICAgICAgIC8qIFNsb3dlciBkaXZpc2lvbiwgbm90IGNyaXRpY2FsICovCisKKyAgIC8qIGhlcmUgd2UgYXJlIG9uIHRoZSBsYXN0IHBhc3Mgc28gd2UgdHVybiB0aGluZ3Mgb2ZmLiAgVGhlIGZ1bmN0aW9ucyBjbGFzc2VzIGFyZSBzdGlsbCB0aGVyZQorICAgICogYnV0IHdlIHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseSBmcm9tIHRoZSBidWlsZC4gIFRoaXMgYWxzbyBpbnZva2VzIHR3ZWFrcyBpbiBmdW5jdGlvbnMKKyAgICAqIGxpa2UgcmVtb3Zpbmcgc3VwcG9ydCBmb3IgZXZlbiBtb2R1bGksIGV0Yy4uLgorICAgICovCisjaWZkZWYgTFRNX0xBU1QKKyAgICN1bmRlZiAgQk5fTVBfVE9PTV9NVUxfQworICAgI3VuZGVmICBCTl9NUF9UT09NX1NRUl9DCisgICAjdW5kZWYgIEJOX01QX0tBUkFUU1VCQV9NVUxfQworICAgI3VuZGVmICBCTl9NUF9LQVJBVFNVQkFfU1FSX0MKKyAgICN1bmRlZiAgQk5fTVBfUkVEVUNFX0MKKyAgICN1bmRlZiAgQk5fTVBfUkVEVUNFX1NFVFVQX0MKKyAgICN1bmRlZiAgQk5fTVBfRFJfSVNfTU9EVUxVU19DCisgICAjdW5kZWYgIEJOX01QX0RSX1NFVFVQX0MKKyAgICN1bmRlZiAgQk5fTVBfRFJfUkVEVUNFX0MKKyAgICN1bmRlZiAgQk5fTVBfUkVEVUNFX0lTXzJLX0MKKyAgICN1bmRlZiAgQk5fTVBfUkVEVUNFXzJLX1NFVFVQX0MKKyAgICN1bmRlZiAgQk5fTVBfUkVEVUNFXzJLX0MKKyAgICN1bmRlZiAgQk5fU19NUF9FWFBUTU9EX0MKKyAgICN1bmRlZiAgQk5fTVBfRElWXzNfQworICAgI3VuZGVmICBCTl9TX01QX01VTF9ISUdIX0RJR1NfQworICAgI3VuZGVmICBCTl9GQVNUX1NfTVBfTVVMX0hJR0hfRElHU19DCisgICAjdW5kZWYgIEJOX0ZBU1RfTVBfSU5WTU9EX0MKKworICAgLyogVG8gc2FmZWx5IHVuZGVmaW5lIHRoZXNlIHlvdSBoYXZlIHRvIG1ha2Ugc3VyZSB5b3VyIFJTQSBrZXkgd29uJ3QgZXhjZWVkIHRoZSBDb21iYSB0aHJlc2hvbGQKKyAgICAqIHdoaWNoIGlzIHJvdWdobHkgMjU1IGRpZ2l0cyBbNzE0MCBiaXRzIGZvciAzMi1iaXQgbWFjaGluZXMsIDE1MzAwIGJpdHMgZm9yIDY0LWJpdCBtYWNoaW5lc10gCisgICAgKiB3aGljaCBtZWFucyByb3VnaGx5IHNwZWFraW5nIHlvdSBjYW4gaGFuZGxlIHVwdG8gMjUzNi1iaXQgUlNBIGtleXMgd2l0aCB0aGVzZSBkZWZpbmVkIHdpdGhvdXQKKyAgICAqIHRyb3VibGUuICAKKyAgICAqLworICAgI3VuZGVmICBCTl9TX01QX01VTF9ESUdTX0MKKyAgICN1bmRlZiAgQk5fU19NUF9TUVJfQworICAgI3VuZGVmICBCTl9NUF9NT05UR09NRVJZX1JFRFVDRV9DCisjZW5kaWYKKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9oZWFkZXJzL3RvbW1hdGhfc3VwZXJjbGFzcy5oLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTQgMTM6Mjc6MjAgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21hYy9obWFjL2htYWNfZG9uZS5jIGIvc3JjL21hYy9obWFjL2htYWNfZG9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NGQwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFjL2htYWMvaG1hY19kb25lLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGhtYWNfZG9uZS5jCisgIEhNQUMgc3VwcG9ydCwgdGVybWluYXRlIHN0cmVhbSwgVG9tIFN0IERlbmlzL0RvYmVzIFZhbmRlcm1lZXIKKyovCisKKyNpZmRlZiBITUFDCisKKyNkZWZpbmUgSE1BQ19CTE9DS1NJWkUgaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmJsb2Nrc2l6ZQorCisvKioKKyAgIFRlcm1pbmF0ZSBhbiBITUFDIHNlc3Npb24KKyAgIEBwYXJhbSBobWFjICAgIFRoZSBITUFDIHN0YXRlCisgICBAcGFyYW0gb3V0ICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIEhNQUMgYXV0aGVudGljYXRpb24gdGFnCisgICBAcGFyYW0gb3V0bGVuICBbaW4vb3V0XSAgVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgSE1BQyBhdXRoZW50aWNhdGlvbiB0YWcKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBobWFjX2RvbmUoaG1hY19zdGF0ZSAqaG1hYywgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICAgdW5zaWduZWQgY2hhciAqYnVmLCAqaXNoYTsKKyAgICB1bnNpZ25lZCBsb25nIGhhc2hzaXplLCBpOworICAgIGludCBoYXNoLCBlcnI7CisKKyAgICBMVENfQVJHQ0hLKGhtYWMgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0ICAgIT0gTlVMTCk7CisKKyAgICAvKiB0ZXN0IGhhc2ggKi8KKyAgICBoYXNoID0gaG1hYy0+aGFzaDsKKyAgICBpZigoZXJyID0gaGFzaF9pc192YWxpZChoYXNoKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIGhhc2ggbWVzc2FnZSBkaWdlc3Qgc2l6ZSAqLworICAgIGhhc2hzaXplID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplOworCisgICAgLyogYWxsb2NhdGUgYnVmZmVycyAqLworICAgIGJ1ZiAgPSBYTUFMTE9DKEhNQUNfQkxPQ0tTSVpFKTsKKyAgICBpc2hhID0gWE1BTExPQyhoYXNoc2l6ZSk7CisgICAgaWYgKGJ1ZiA9PSBOVUxMIHx8IGlzaGEgPT0gTlVMTCkgeyAKKyAgICAgICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICBYRlJFRShidWYpOworICAgICAgIH0gCisgICAgICAgaWYgKGlzaGEgIT0gTlVMTCkgeworICAgICAgICAgIFhGUkVFKGlzaGEpOworICAgICAgIH0gIAorICAgICAgIHJldHVybiBDUllQVF9NRU07CisgICAgfQorCisgICAgLyogR2V0IHRoZSBoYXNoIG9mIHRoZSBmaXJzdCBITUFDIHZlY3RvciBwbHVzIHRoZSBkYXRhICovCisgICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uZG9uZSgmaG1hYy0+bWQsIGlzaGEpKSAhPSBDUllQVF9PSykgeworICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgdGhlIHNlY29uZCBITUFDIHZlY3RvciB2ZWN0b3IgZm9yIHN0ZXAgKDMpICovCisgICAgZm9yKGk9MDsgaSA8IEhNQUNfQkxPQ0tTSVpFOyBpKyspIHsKKyAgICAgICAgYnVmW2ldID0gaG1hYy0+a2V5W2ldIF4gMHg1QzsKKyAgICB9CisKKyAgICAvKiBOb3cgY2FsY3VsYXRlIHRoZSAib3V0ZXIiIGhhc2ggZm9yIHN0ZXAgKDUpLCAoNiksIGFuZCAoNykgKi8KKyAgICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoXS5pbml0KCZobWFjLT5tZCkpICE9IENSWVBUX09LKSB7CisgICAgICAgZ290byBMQkxfRVJSOworICAgIH0KKyAgICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoXS5wcm9jZXNzKCZobWFjLT5tZCwgYnVmLCBITUFDX0JMT0NLU0laRSkpICE9IENSWVBUX09LKSB7CisgICAgICAgZ290byBMQkxfRVJSOworICAgIH0KKyAgICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoXS5wcm9jZXNzKCZobWFjLT5tZCwgaXNoYSwgaGFzaHNpemUpKSAhPSBDUllQVF9PSykgeworICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICB9CisgICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uZG9uZSgmaG1hYy0+bWQsIGJ1ZikpICE9IENSWVBUX09LKSB7CisgICAgICAgZ290byBMQkxfRVJSOworICAgIH0KKworICAgIC8qIGNvcHkgdG8gb3V0cHV0ICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBoYXNoc2l6ZSAmJiBpIDwgKm91dGxlbjsgaSsrKSB7CisgICAgICAgIG91dFtpXSA9IGJ1ZltpXTsKKyAgICB9CisgICAgKm91dGxlbiA9IGk7CisKKyAgICBlcnIgPSBDUllQVF9PSzsKK0xCTF9FUlI6CisgICAgWEZSRUUoaG1hYy0+a2V5KTsKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKKyAgICB6ZXJvbWVtKGlzaGEsIGhhc2hzaXplKTsKKyAgICB6ZXJvbWVtKGJ1ZiwgIGhhc2hzaXplKTsKKyAgICB6ZXJvbWVtKGhtYWMsIHNpemVvZigqaG1hYykpOworI2VuZGlmCisKKyAgICBYRlJFRShpc2hhKTsKKyAgICBYRlJFRShidWYpOworCisgICAgcmV0dXJuIGVycjsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tYWMvaG1hYy9obWFjX2RvbmUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWMvaG1hYy9obWFjX2ZpbGUuYyBiL3NyYy9tYWMvaG1hYy9obWFjX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODhkNjkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21hYy9obWFjL2htYWNfZmlsZS5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGhtYWNfZmlsZS5jCisgIEhNQUMgc3VwcG9ydCwgcHJvY2VzcyBhIGZpbGUsIFRvbSBTdCBEZW5pcy9Eb2JlcyBWYW5kZXJtZWVyCisqLworCisjaWZkZWYgSE1BQworCisvKioKKyAgSE1BQyBhIGZpbGUKKyAgQHBhcmFtIGhhc2ggICAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCB5b3Ugd2lzaCB0byB1c2UKKyAgQHBhcmFtIGZuYW1lICAgIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHlvdSB3aXNoIHRvIEhNQUMKKyAgQHBhcmFtIGtleSAgICAgIFRoZSBzZWNyZXQga2V5CisgIEBwYXJhbSBrZXlsZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5CisgIEBwYXJhbSBvdXQgICAgICBbb3V0XSBUaGUgSE1BQyBhdXRoZW50aWNhdGlvbiB0YWcKKyAgQHBhcmFtIG91dGxlbiAgIFtpbi9vdXRdICBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgZmlsZSBzdXBwb3J0IGhhcyBiZWVuIGRpc2FibGVkCisqLworaW50IGhtYWNfZmlsZShpbnQgaGFzaCwgY29uc3QgY2hhciAqZm5hbWUsIAorICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLCAKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisjaWZkZWYgTFRDX05PX0ZJTEUKKyAgICByZXR1cm4gQ1JZUFRfTk9QOworI2Vsc2UKKyAgIGhtYWNfc3RhdGUgaG1hYzsKKyAgIEZJTEUgKmluOworICAgdW5zaWduZWQgY2hhciBidWZbNTEyXTsKKyAgIHNpemVfdCB4OworICAgaW50IGVycjsKKworICAgTFRDX0FSR0NISyhmbmFtZSAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisgICAKKyAgIGlmKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGhhc2gpKSAhPSBDUllQVF9PSykgeworICAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIGlmICgoZXJyID0gaG1hY19pbml0KCZobWFjLCBoYXNoLCBrZXksIGtleWxlbikpICE9IENSWVBUX09LKSB7CisgICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgaW4gPSBmb3BlbihmbmFtZSwgInJiIik7CisgICBpZiAoaW4gPT0gTlVMTCkgeworICAgICAgcmV0dXJuIENSWVBUX0ZJTEVfTk9URk9VTkQ7CisgICB9CisKKyAgIC8qIHByb2Nlc3MgdGhlIGZpbGUgY29udGVudHMgKi8KKyAgIGRvIHsKKyAgICAgIHggPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCBpbik7CisgICAgICBpZiAoKGVyciA9IGhtYWNfcHJvY2VzcygmaG1hYywgYnVmLCAodW5zaWduZWQgbG9uZyl4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgIC8qIHdlIGRvbid0IHRyYXAgdGhpcyBlcnJvciBzaW5jZSB3ZSdyZSBhbHJlYWR5IHJldHVybmluZyBhbiBlcnJvciEgKi8KKyAgICAgICAgIGZjbG9zZShpbik7CisgICAgICAgICByZXR1cm4gZXJyOworICAgICAgfQorICAgfSB3aGlsZSAoeCA9PSBzaXplb2YoYnVmKSk7CisKKyAgIGlmIChmY2xvc2UoaW4pICE9IDApIHsKKyAgICAgIHJldHVybiBDUllQVF9FUlJPUjsKKyAgIH0KKworICAgLyogZ2V0IGZpbmFsIGhtYWMgKi8KKyAgIGlmICgoZXJyID0gaG1hY19kb25lKCZobWFjLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICAvKiBjbGVhciBtZW1vcnkgKi8KKyAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7CisjZW5kaWYgICAKKyAgIHJldHVybiBDUllQVF9PSzsKKyNlbmRpZgorfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWFjL2htYWMvaG1hY19maWxlLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvbWFjL2htYWMvaG1hY19pbml0LmMgYi9zcmMvbWFjL2htYWMvaG1hY19pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0ZDQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWMvaG1hYy9obWFjX2luaXQuYwpAQCAtMCwwICsxLDExMiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgaG1hY19pbml0LmMKKyAgSE1BQyBzdXBwb3J0LCBpbml0aWFsaXplIHN0YXRlLCBUb20gU3QgRGVuaXMvRG9iZXMgVmFuZGVybWVlciAKKyovCisKKyNpZmRlZiBITUFDCisKKyNkZWZpbmUgSE1BQ19CTE9DS1NJWkUgaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmJsb2Nrc2l6ZQorCisvKioKKyAgIEluaXRpYWxpemUgYW4gSE1BQyBjb250ZXh0LgorICAgQHBhcmFtIGhtYWMgICAgIFRoZSBITUFDIHN0YXRlIAorICAgQHBhcmFtIGhhc2ggICAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCB5b3Ugd2FudCB0byB1c2UgCisgICBAcGFyYW0ga2V5ICAgICAgVGhlIHNlY3JldCBrZXkKKyAgIEBwYXJhbSBrZXlsZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5IChvY3RldHMpCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgaG1hY19pbml0KGhtYWNfc3RhdGUgKmhtYWMsIGludCBoYXNoLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuKQoreworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgICB1bnNpZ25lZCBsb25nIGhhc2hzaXplOworICAgIHVuc2lnbmVkIGxvbmcgaSwgejsKKyAgICBpbnQgZXJyOworCisgICAgTFRDX0FSR0NISyhobWFjICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsoa2V5ICAhPSBOVUxMKTsKKworICAgIC8qIHZhbGlkIGhhc2g/ICovCisgICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGhhc2gpKSAhPSBDUllQVF9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBobWFjLT5oYXNoID0gaGFzaDsKKyAgICBoYXNoc2l6ZSAgID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplOworCisgICAgLyogdmFsaWQga2V5IGxlbmd0aD8gKi8KKyAgICBpZiAoa2V5bGVuID09IDApIHsKKyAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSByYW0gZm9yIGJ1ZiAqLworICAgIGJ1ZiA9IFhNQUxMT0MoSE1BQ19CTE9DS1NJWkUpOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgIHJldHVybiBDUllQVF9NRU07CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBrZXkgKi8KKyAgICBobWFjLT5rZXkgPSBYTUFMTE9DKEhNQUNfQkxPQ0tTSVpFKTsKKyAgICBpZiAoaG1hYy0+a2V5ID09IE5VTEwpIHsKKyAgICAgICBYRlJFRShidWYpOworICAgICAgIHJldHVybiBDUllQVF9NRU07CisgICAgfQorCisgICAgLyogKDEpIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgbGFyZ2UgZW5vdWdoIGtleSAqLworICAgIGlmKGtleWxlbiA+IEhNQUNfQkxPQ0tTSVpFKSB7CisgICAgICAgIHogPSBITUFDX0JMT0NLU0laRTsKKyAgICAgICAgaWYgKChlcnIgPSBoYXNoX21lbW9yeShoYXNoLCBrZXksIGtleWxlbiwgaG1hYy0+a2V5LCAmeikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgfQorICAgICAgICBpZihoYXNoc2l6ZSA8IEhNQUNfQkxPQ0tTSVpFKSB7CisgICAgICAgICAgICB6ZXJvbWVtKChobWFjLT5rZXkpICsgaGFzaHNpemUsIChzaXplX3QpKEhNQUNfQkxPQ0tTSVpFIC0gaGFzaHNpemUpKTsKKyAgICAgICAgfQorICAgICAgICBrZXlsZW4gPSBoYXNoc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBYTUVNQ1BZKGhtYWMtPmtleSwga2V5LCAoc2l6ZV90KWtleWxlbik7CisgICAgICAgIGlmKGtleWxlbiA8IEhNQUNfQkxPQ0tTSVpFKSB7CisgICAgICAgICAgICB6ZXJvbWVtKChobWFjLT5rZXkpICsga2V5bGVuLCAoc2l6ZV90KShITUFDX0JMT0NLU0laRSAtIGtleWxlbikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRoZSBpbml0aWFsIHZlY3RvciBmb3Igc3RlcCAoMykgKi8KKyAgICBmb3IoaT0wOyBpIDwgSE1BQ19CTE9DS1NJWkU7ICAgaSsrKSB7CisgICAgICAgYnVmW2ldID0gaG1hYy0+a2V5W2ldIF4gMHgzNjsKKyAgICB9CisKKyAgICAvKiBQcmUtcGVuZCB0aGF0IHRvIHRoZSBoYXNoIGRhdGEgKi8KKyAgICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoXS5pbml0KCZobWFjLT5tZCkpICE9IENSWVBUX09LKSB7CisgICAgICAgZ290byBMQkxfRVJSOworICAgIH0KKworICAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLnByb2Nlc3MoJmhtYWMtPm1kLCBidWYsIEhNQUNfQkxPQ0tTSVpFKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICBnb3RvIExCTF9FUlI7CisgICAgfQorICAgIGdvdG8gZG9uZTsKK0xCTF9FUlI6CisgICAgLyogZnJlZSB0aGUga2V5IHNpbmNlIHdlIGZhaWxlZCAqLworICAgIFhGUkVFKGhtYWMtPmtleSk7Citkb25lOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShidWYsIEhNQUNfQkxPQ0tTSVpFKTsKKyNlbmRpZgorIAorICAgWEZSRUUoYnVmKTsKKyAgIHJldHVybiBlcnI7ICAgIAorfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9obWFjL2htYWNfaW5pdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21hYy9obWFjL2htYWNfbWVtb3J5LmMgYi9zcmMvbWFjL2htYWMvaG1hY19tZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk1OWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21hYy9obWFjL2htYWNfbWVtb3J5LmMKQEAgLTAsMCArMSw3NyBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgaG1hY19tZW1vcnkuYworICBITUFDIHN1cHBvcnQsIHByb2Nlc3MgYSBibG9jayBvZiBtZW1vcnksIFRvbSBTdCBEZW5pcy9Eb2JlcyBWYW5kZXJtZWVyCisqLworCisjaWZkZWYgSE1BQworCisvKioKKyAgIEhNQUMgYSBibG9jayBvZiBtZW1vcnkgdG8gcHJvZHVjZSB0aGUgYXV0aGVudGljYXRpb24gdGFnCisgICBAcGFyYW0gaGFzaCAgICAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCB0byB1c2UgCisgICBAcGFyYW0ga2V5ICAgICAgIFRoZSBzZWNyZXQga2V5IAorICAgQHBhcmFtIGtleWxlbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5IChvY3RldHMpCisgICBAcGFyYW0gaW4gICAgICAgIFRoZSBkYXRhIHRvIEhNQUMKKyAgIEBwYXJhbSBpbmxlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBITUFDIChvY3RldHMpCisgICBAcGFyYW0gb3V0ICAgICAgIFtvdXRdIERlc3RpbmF0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcKKyAgIEBwYXJhbSBvdXRsZW4gICAgW2luL291dF0gTWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIGF1dGhlbnRpY2F0aW9uIHRhZworICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGhtYWNfbWVtb3J5KGludCBoYXNoLCAKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksICB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICB1bnNpZ25lZCBsb25nIGlubGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICAgaG1hY19zdGF0ZSAqaG1hYzsKKyAgICBpbnQgZXJyOworCisgICAgTFRDX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhpbiAgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOyAKKyAgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKworICAgIC8qIGFsbG9jYXRlIHJhbSBmb3IgaG1hYyBzdGF0ZSAqLworICAgIGhtYWMgPSBYTUFMTE9DKHNpemVvZihobWFjX3N0YXRlKSk7CisgICAgaWYgKGhtYWMgPT0gTlVMTCkgeworICAgICAgIHJldHVybiBDUllQVF9NRU07CisgICAgfQorCisgICAgaWYgKChlcnIgPSBobWFjX2luaXQoaG1hYywgaGFzaCwga2V5LCBrZXlsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IGhtYWNfcHJvY2VzcyhobWFjLCBpbiwgaW5sZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IGhtYWNfZG9uZShobWFjLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7CisgICAgICAgZ290byBMQkxfRVJSOworICAgIH0KKworICAgZXJyID0gQ1JZUFRfT0s7CitMQkxfRVJSOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShobWFjLCBzaXplb2YoaG1hY19zdGF0ZSkpOworI2VuZGlmCisKKyAgIFhGUkVFKGhtYWMpOworICAgcmV0dXJuIGVycjsgICAKK30KKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9obWFjL2htYWNfbWVtb3J5LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvbWFjL2htYWMvaG1hY19tZW1vcnlfbXVsdGkuYyBiL3NyYy9tYWMvaG1hYy9obWFjX21lbW9yeV9tdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTZkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFjL2htYWMvaG1hY19tZW1vcnlfbXVsdGkuYwpAQCAtMCwwICsxLDkyIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qKgorICBAZmlsZSBobWFjX21lbW9yeV9tdWx0aS5jCisgIEhNQUMgc3VwcG9ydCwgcHJvY2VzcyBtdWx0aXBsZSBibG9ja3Mgb2YgbWVtb3J5LCBUb20gU3QgRGVuaXMvRG9iZXMgVmFuZGVybWVlcgorKi8KKworI2lmZGVmIEhNQUMKKworLyoqCisgICBITUFDIG11bHRpcGxlIGJsb2NrcyBvZiBtZW1vcnkgdG8gcHJvZHVjZSB0aGUgYXV0aGVudGljYXRpb24gdGFnCisgICBAcGFyYW0gaGFzaCAgICAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCB0byB1c2UgCisgICBAcGFyYW0ga2V5ICAgICAgIFRoZSBzZWNyZXQga2V5IAorICAgQHBhcmFtIGtleWxlbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5IChvY3RldHMpCisgICBAcGFyYW0gb3V0ICAgICAgIFtvdXRdIERlc3RpbmF0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcKKyAgIEBwYXJhbSBvdXRsZW4gICAgW2luL291dF0gTWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIGF1dGhlbnRpY2F0aW9uIHRhZworICAgQHBhcmFtIGluICAgICAgICBUaGUgZGF0YSB0byBITUFDCisgICBAcGFyYW0gaW5sZW4gICAgIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gSE1BQyAob2N0ZXRzKQorICAgQHBhcmFtIC4uLiAgICAgICB0dXBsZXMgb2YgKGRhdGEsbGVuKSBwYWlycyB0byBITUFDLCB0ZXJtaW5hdGVkIHdpdGggYSAoTlVMTCx4KSAoeD1kb24ndCBjYXJlKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGhtYWNfbWVtb3J5X211bHRpKGludCBoYXNoLCAKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksICB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpvdXRsZW4sCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgdW5zaWduZWQgbG9uZyBpbmxlbiwgLi4uKQorCit7CisgICAgaG1hY19zdGF0ZSAgICAgICAgICAqaG1hYzsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBlcnI7CisgICAgdmFfbGlzdCAgICAgICAgICAgICAgYXJnczsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjdXJwdHI7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgY3VybGVuOworCisgICAgTFRDX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7IAorICAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworCisgICAgLyogYWxsb2NhdGUgcmFtIGZvciBobWFjIHN0YXRlICovCisgICAgaG1hYyA9IFhNQUxMT0Moc2l6ZW9mKGhtYWNfc3RhdGUpKTsKKyAgICBpZiAoaG1hYyA9PSBOVUxMKSB7CisgICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgICB9CisKKyAgICBpZiAoKGVyciA9IGhtYWNfaW5pdChobWFjLCBoYXNoLCBrZXksIGtleWxlbikpICE9IENSWVBUX09LKSB7CisgICAgICAgZ290byBMQkxfRVJSOworICAgIH0KKworICAgIHZhX3N0YXJ0KGFyZ3MsIGlubGVuKTsKKyAgICBjdXJwdHIgPSBpbjsgCisgICAgY3VybGVuID0gaW5sZW47CisgICAgZm9yICg7OykgeworICAgICAgIC8qIHByb2Nlc3MgYnVmICovCisgICAgICAgaWYgKChlcnIgPSBobWFjX3Byb2Nlc3MoaG1hYywgY3VycHRyLCBjdXJsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICB9CisgICAgICAgLyogc3RlcCB0byBuZXh0ICovCisgICAgICAgY3VycHRyID0gdmFfYXJnKGFyZ3MsIGNvbnN0IHVuc2lnbmVkIGNoYXIqKTsKKyAgICAgICBpZiAoY3VycHRyID09IE5VTEwpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgICAgY3VybGVuID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcpOworICAgIH0KKyAgICBpZiAoKGVyciA9IGhtYWNfZG9uZShobWFjLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7CisgICAgICAgZ290byBMQkxfRVJSOworICAgIH0KK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKGhtYWMsIHNpemVvZihobWFjX3N0YXRlKSk7CisjZW5kaWYKKyAgIFhGUkVFKGhtYWMpOworICAgdmFfZW5kKGFyZ3MpOworICAgcmV0dXJuIGVycjsgICAKK30KKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9obWFjL2htYWNfbWVtb3J5X211bHRpLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvbWFjL2htYWMvaG1hY19wcm9jZXNzLmMgYi9zcmMvbWFjL2htYWMvaG1hY19wcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxOTI4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWMvaG1hYy9obWFjX3Byb2Nlc3MuYwpAQCAtMCwwICsxLDQzIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBobWFjX3Byb2Nlc3MuYworICBITUFDIHN1cHBvcnQsIHByb2Nlc3MgZGF0YSwgVG9tIFN0IERlbmlzL0RvYmVzIFZhbmRlcm1lZXIKKyovCisKKyNpZmRlZiBITUFDCisKKy8qKiAKKyAgUHJvY2VzcyBkYXRhIHRocm91Z2ggSE1BQworICBAcGFyYW0gaG1hYyAgICBUaGUgaG1hYyBzdGF0ZQorICBAcGFyYW0gaW4gICAgICBUaGUgZGF0YSB0byBzZW5kIHRocm91Z2ggSE1BQworICBAcGFyYW0gaW5sZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIEhNQUMgKG9jdGV0cykKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGhtYWNfcHJvY2VzcyhobWFjX3N0YXRlICpobWFjLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbikKK3sKKyAgICBpbnQgZXJyOworICAgIExUQ19BUkdDSEsoaG1hYyAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKGluICE9IE5VTEwpOworICAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChobWFjLT5oYXNoKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgcmV0dXJuIGhhc2hfZGVzY3JpcHRvcltobWFjLT5oYXNoXS5wcm9jZXNzKCZobWFjLT5tZCwgaW4sIGlubGVuKTsKK30KKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9obWFjL2htYWNfcHJvY2Vzcy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvaG1hY190ZXN0LmMgYi9zcmMvbWFjL2htYWMvaG1hY190ZXN0LmMKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gaG1hY190ZXN0LmMKcmVuYW1lIHRvIHNyYy9tYWMvaG1hYy9obWFjX3Rlc3QuYwppbmRleCA0ZWM3ZDk0Li44Nzc1OGY1IDEwMDY0NAotLS0gYS9obWFjX3Rlc3QuYworKysgYi9zcmMvbWFjL2htYWMvaG1hY190ZXN0LmMKQEAgLTYsMjcgKzYsMTMgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwotLyogU3VibWl0ZWQgYnkgRG9iZXMgVmFuZGVybWVlciAgKGRvYmVzQHNtYXJ0dC5jb20pICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotLyoKLSAgICAoMSkgYXBwZW5kIHplcm9zIHRvIHRoZSBlbmQgb2YgSyB0byBjcmVhdGUgYSBCIGJ5dGUgc3RyaW5nCi0gICAgICAgIChlLmcuLCBpZiBLIGlzIG9mIGxlbmd0aCAyMCBieXRlcyBhbmQgQj02NCwgdGhlbiBLIHdpbGwgYmUKLSAgICAgICAgIGFwcGVuZGVkIHdpdGggNDQgemVybyBieXRlcyAweDAwKQotICAgICgyKSBYT1IgKGJpdHdpc2UgZXhjbHVzaXZlLU9SKSB0aGUgQiBieXRlIHN0cmluZyBjb21wdXRlZCBpbiBzdGVwCi0gICAgICAgICgxKSB3aXRoIGlwYWQgKGlwYWQgPSB0aGUgYnl0ZSAweDM2IHJlcGVhdGVkIEIgdGltZXMpCi0gICAgKDMpIGFwcGVuZCB0aGUgc3RyZWFtIG9mIGRhdGEgJ3RleHQnIHRvIHRoZSBCIGJ5dGUgc3RyaW5nIHJlc3VsdGluZwotICAgICAgICBmcm9tIHN0ZXAgKDIpCi0gICAgKDQpIGFwcGx5IEggdG8gdGhlIHN0cmVhbSBnZW5lcmF0ZWQgaW4gc3RlcCAoMykKLSAgICAoNSkgWE9SIChiaXR3aXNlIGV4Y2x1c2l2ZS1PUikgdGhlIEIgYnl0ZSBzdHJpbmcgY29tcHV0ZWQgaW4KLSAgICAgICAgc3RlcCAoMSkgd2l0aCBvcGFkIChvcGFkID0gdGhlIGJ5dGUgMHg1QyByZXBlYXRlZCBCIHRpbWVzLikKLSAgICAoNikgYXBwZW5kIHRoZSBIIHJlc3VsdCBmcm9tIHN0ZXAgKDQpIHRvIHRoZSBCIGJ5dGUgc3RyaW5nCi0gICAgICAgIHJlc3VsdGluZyBmcm9tIHN0ZXAgKDUpCi0gICAgKDcpIGFwcGx5IEggdG8gdGhlIHN0cmVhbSBnZW5lcmF0ZWQgaW4gc3RlcCAoNikgYW5kIG91dHB1dAotICAgICAgICB0aGUgcmVzdWx0CisvKioKKyAgQGZpbGUgaG1hY190ZXN0LmMKKyAgSE1BQyBzdXBwb3J0LCBzZWxmLXRlc3QsIFRvbSBTdCBEZW5pcy9Eb2JlcyBWYW5kZXJtZWVyCiAqLwogCiAjaWZkZWYgSE1BQwpAQCAtMzQsNyArMjAsNiBAQAogI2RlZmluZSBITUFDX0JMT0NLU0laRSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uYmxvY2tzaXplCiAKIC8qCi0KICAgICBURVNUIENBU0VTIFNPVVJDRToKIAogTmV0d29yayBXb3JraW5nIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUC4gQ2hlbmcKQEAgLTQyLDExICsyNywxMyBAQAogQ2F0ZWdvcnk6IEluZm9ybWF0aW9uYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi4gR2xlbm4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVNUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXB0ZW1iZXIgMTk5NwotCiAgICAgICAgICAgICAgICAgIFRlc3QgQ2FzZXMgZm9yIEhNQUMtTUQ1IGFuZCBITUFDLVNIQS0xCiAqLwogCi0KKy8qKgorICBITUFDIHNlbGYtdGVzdAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiB0ZXN0cyBoYXZlIGJlZW4gZGlzYWJsZWQuCisqLwogaW50IGhtYWNfdGVzdCh2b2lkKQogewogICNpZm5kZWYgTFRDX1RFU1QKQEAgLTI4NSwxMiArMjcyLDEzIEBACiAgICAgICAgIG91dGxlbiA9IHNpemVvZihkaWdlc3QpOwogICAgICAgICBpZigoZXJyID0gaG1hY19tZW1vcnkoaGFzaCwgY2FzZXNbaV0ua2V5LCBjYXNlc1tpXS5rZXlsZW4sIGNhc2VzW2ldLmRhdGEsIGNhc2VzW2ldLmRhdGFsZW4sIGRpZ2VzdCwgJm91dGxlbikpICE9IENSWVBUX09LKSB7CiAjaWYgMAotICAgICAgICAgICAgcHJpbnRmKCJITUFDLSVzIHRlc3QgIyVkXG4iLCBjYXNlc1tpXS5hbGdvLCBjYXNlc1tpXS5udW0pOworICAgICAgICAgICAgcHJpbnRmKCJITUFDLSVzIHRlc3QgIyVkLCAlc1xuIiwgY2FzZXNbaV0uYWxnbywgY2FzZXNbaV0ubnVtLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CiAjZW5kaWYKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAogICAgICAgICBpZihtZW1jbXAoZGlnZXN0LCBjYXNlc1tpXS5kaWdlc3QsIChzaXplX3QpaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplKSAhPSAwKSAgeworICAgICAgICAgICAgZmFpbGVkKys7CiAjaWYgMAogICAgICAgICAgICAgdW5zaWduZWQgaW50IGo7CiAgICAgICAgICAgICBwcmludGYoIlxuSE1BQy0lcyB0ZXN0ICMlZDpcbiIsIGNhc2VzW2ldLmFsZ28sIGNhc2VzW2ldLm51bSk7CkBAIC0zMDMsOSArMjkxLDggQEAKICAgICAgICAgICAgICAgIHByaW50ZigiJTJ4ICIsIGNhc2VzW2ldLmRpZ2VzdFtqXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICByZXR1cm4gQ1JZUFRfRVJST1I7CiAjZW5kaWYKLSAgICAgICAgICAgIGZhaWxlZCsrOwotICAgICAgICAgICAgLy9yZXR1cm4gQ1JZUFRfRVJST1I7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBwcmludGYoIkhNQUMtJXMgdGVzdCAjJWQ6IFBhc3NlZFxuIiwgY2FzZXNbaV0uYWxnbywgY2FzZXNbaV0ubnVtKTsgKi8KICAgICAgICAgfQpAQCAtMzIzLDMgKzMxMCw3IEBACiAKICNlbmRpZgogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tYWMvaG1hYy9obWFjX3Rlc3QuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWMvb21hYy9vbWFjX2RvbmUuYyBiL3NyYy9tYWMvb21hYy9vbWFjX2RvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzI5MmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21hYy9vbWFjL29tYWNfZG9uZS5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqIAorICBAZmlsZSBvbWFjX2RvbmUuYworICBPTUFDMSBzdXBwb3J0LCB0ZXJtaW5hdGUgYSBzdHJlYW0sIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIE9NQUMKKworLyoqCisgIFRlcm1pbmF0ZSBhbiBPTUFDIHN0cmVhbQorICBAcGFyYW0gb21hYyAgIFRoZSBPTUFDIHN0YXRlCisgIEBwYXJhbSBvdXQgICAgW291dF0gRGVzdGluYXRpb24gZm9yIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcKKyAgQHBhcmFtIG91dGxlbiBbaW4vb3V0XSAgVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgYXV0aGVudGljYXRpb24gdGFnCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBvbWFjX2RvbmUob21hY19zdGF0ZSAqb21hYywgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICBpbnQgICAgICAgZXJyLCBtb2RlOworICAgdW5zaWduZWQgIHg7CisKKyAgIExUQ19BUkdDSEsob21hYyAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKG9tYWMtPmNpcGhlcl9pZHgpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgaWYgKChvbWFjLT5idWZsZW4gPiAoaW50KXNpemVvZihvbWFjLT5ibG9jaykpIHx8IChvbWFjLT5idWZsZW4gPCAwKSB8fAorICAgICAgIChvbWFjLT5ibGtsZW4gPiAoaW50KXNpemVvZihvbWFjLT5ibG9jaykpIHx8IChvbWFjLT5idWZsZW4gPiBvbWFjLT5ibGtsZW4pKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisKKyAgIC8qIGZpZ3VyZSBvdXQgbW9kZSAqLworICAgaWYgKG9tYWMtPmJ1ZmxlbiAhPSBvbWFjLT5ibGtsZW4pIHsKKyAgICAgIC8qIGFkZCB0aGUgMHg4MCBieXRlICovCisgICAgICBvbWFjLT5ibG9ja1tvbWFjLT5idWZsZW4rK10gPSAweDgwOworCisgICAgICAvKiBwYWQgd2l0aCAweDAwICovCisgICAgICB3aGlsZSAob21hYy0+YnVmbGVuIDwgb21hYy0+YmxrbGVuKSB7CisgICAgICAgICBvbWFjLT5ibG9ja1tvbWFjLT5idWZsZW4rK10gPSAweDAwOworICAgICAgfQorICAgICAgbW9kZSA9IDE7CisgICB9IGVsc2UgeworICAgICAgbW9kZSA9IDA7CisgICB9CisKKyAgIC8qIG5vdyB4b3IgcHJldiArIEx1W21vZGVdICovCisgICBmb3IgKHggPSAwOyB4IDwgKHVuc2lnbmVkKW9tYWMtPmJsa2xlbjsgeCsrKSB7CisgICAgICAgb21hYy0+YmxvY2tbeF0gXj0gb21hYy0+cHJldlt4XSBeIG9tYWMtPkx1W21vZGVdW3hdOworICAgfQorCisgICAvKiBlbmNyeXB0IGl0ICovCisgICBjaXBoZXJfZGVzY3JpcHRvcltvbWFjLT5jaXBoZXJfaWR4XS5lY2JfZW5jcnlwdChvbWFjLT5ibG9jaywgb21hYy0+YmxvY2ssICZvbWFjLT5rZXkpOworICAgY2lwaGVyX2Rlc2NyaXB0b3Jbb21hYy0+Y2lwaGVyX2lkeF0uZG9uZSgmb21hYy0+a2V5KTsKKyAKKyAgIC8qIG91dHB1dCBpdCAqLworICAgZm9yICh4ID0gMDsgeCA8ICh1bnNpZ25lZClvbWFjLT5ibGtsZW4gJiYgeCA8ICpvdXRsZW47IHgrKykgeworICAgICAgIG91dFt4XSA9IG9tYWMtPmJsb2NrW3hdOworICAgfQorICAgKm91dGxlbiA9IHg7CisKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKKyAgIHplcm9tZW0ob21hYywgc2l6ZW9mKCpvbWFjKSk7CisjZW5kaWYKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9vbWFjL29tYWNfZG9uZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21hYy9vbWFjL29tYWNfZmlsZS5jIGIvc3JjL21hYy9vbWFjL29tYWNfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzg0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFjL29tYWMvb21hY19maWxlLmMKQEAgLTAsMCArMSw4MyBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKiogCisgIEBmaWxlIG9tYWNfZmlsZS5jCisgIE9NQUMxIHN1cHBvcnQsIHByb2Nlc3MgYSBmaWxlLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBPTUFDCisKKy8qKgorICAgT01BQyBhIGZpbGUKKyAgIEBwYXJhbSBjaXBoZXIgICBUaGUgaW5kZXggb2YgdGhlIGNpcGhlciBkZXNpcmVkCisgICBAcGFyYW0ga2V5ICAgICAgVGhlIHNlY3JldCBrZXkKKyAgIEBwYXJhbSBrZXlsZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5IChvY3RldHMpCisgICBAcGFyYW0gZmlsZW5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgeW91IHdpc2ggdG8gT01BQworICAgQHBhcmFtIG91dCAgICAgIFtvdXRdIFdoZXJlIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcgaXMgdG8gYmUgc3RvcmVkCisgICBAcGFyYW0gb3V0bGVuICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgYXV0aGVudGljYXRpb24gdGFnCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiBmaWxlIHN1cHBvcnQgaGFzIGJlZW4gZGlzYWJsZWQKKyovCitpbnQgb21hY19maWxlKGludCBjaXBoZXIsIAorICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworI2lmZGVmIExUQ19OT19GSUxFCisgICByZXR1cm4gQ1JZUFRfTk9QOworI2Vsc2UKKyAgIGludCBlcnIsIHg7CisgICBvbWFjX3N0YXRlIG9tYWM7CisgICBGSUxFICppbjsKKyAgIHVuc2lnbmVkIGNoYXIgYnVmWzUxMl07CisKKyAgIExUQ19BUkdDSEsoa2V5ICAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGZpbGVuYW1lICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICAgIT0gTlVMTCk7CisKKyAgIGluID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOworICAgaWYgKGluID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBDUllQVF9GSUxFX05PVEZPVU5EOworICAgfQorCisgICBpZiAoKGVyciA9IG9tYWNfaW5pdCgmb21hYywgY2lwaGVyLCBrZXksIGtleWxlbikpICE9IENSWVBUX09LKSB7CisgICAgICBmY2xvc2UoaW4pOworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgZG8geworICAgICAgeCA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGluKTsKKyAgICAgIGlmICgoZXJyID0gb21hY19wcm9jZXNzKCZvbWFjLCBidWYsIHgpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgZmNsb3NlKGluKTsKKyAgICAgICAgIHJldHVybiBlcnI7CisgICAgICB9CisgICB9IHdoaWxlICh4ID09IHNpemVvZihidWYpKTsKKyAgIGZjbG9zZShpbik7CisKKyAgIGlmICgoZXJyID0gb21hY19kb25lKCZvbWFjLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworI2VuZGlmCisKKyAgIHJldHVybiBDUllQVF9PSzsKKyNlbmRpZgorfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9vbWFjL29tYWNfZmlsZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvb21hY19pbml0LmMgYi9zcmMvbWFjL29tYWMvb21hY19pbml0LmMKc2ltaWxhcml0eSBpbmRleCA3MCUKcmVuYW1lIGZyb20gb21hY19pbml0LmMKcmVuYW1lIHRvIHNyYy9tYWMvb21hYy9vbWFjX2luaXQuYwppbmRleCAzOTQ1NjMwLi44ODY2NzcyIDEwMDY0NAotLS0gYS9vbWFjX2luaXQuYworKysgYi9zcmMvbWFjL29tYWMvb21hY19pbml0LmMKQEAgLTYsMjUgKzYsNDQgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwotLyogT01BQzEgU3VwcG9ydCBieSBUb20gU3QgRGVuaXMgKGZvciA2NCBhbmQgMTI4IGJpdCBibG9jayBjaXBoZXJzIG9ubHkpICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKiAKKyAgQGZpbGUgb21hY19pbml0LmMKKyAgT01BQzEgc3VwcG9ydCwgaW5pdGlhbGl6ZSBzdGF0ZSwgYnkgVG9tIFN0IERlbmlzCisqLworCiAKICNpZmRlZiBPTUFDCiAKKy8qKgorICAgSW5pdGlhbGl6ZSBhbiBPTUFDIHN0YXRlCisgICBAcGFyYW0gb21hYyAgICBUaGUgT01BQyBzdGF0ZSB0byBpbml0aWFsaXplCisgICBAcGFyYW0gY2lwaGVyICBUaGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgY2lwaGVyCisgICBAcGFyYW0ga2V5ICAgICBUaGUgc2VjcmV0IGtleQorICAgQHBhcmFtIGtleWxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgc2VjcmV0IGtleSAob2N0ZXRzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLwogaW50IG9tYWNfaW5pdChvbWFjX3N0YXRlICpvbWFjLCBpbnQgY2lwaGVyLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuKQogewogICAgaW50IGVyciwgeCwgeSwgbWFzaywgbXNiLCBsZW47CiAKLSAgIF9BUkdDSEsob21hYyAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob21hYyAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAhPSBOVUxMKTsKIAogICAgLyogc2NoZWR1bGUgdGhlIGtleSAqLwogICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKICAgICAgIHJldHVybiBlcnI7CiAgICB9CiAKKyNpZmRlZiBMVENfRkFTVAorICAgaWYgKGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uYmxvY2tfbGVuZ3RoICUgc2l6ZW9mKExUQ19GQVNUX1RZUEUpKSB7CisgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorI2VuZGlmCisKICAgIC8qIG5vdyBzZXR1cCB0aGUgc3lzdGVtICovCiAgICBzd2l0Y2ggKGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uYmxvY2tfbGVuZ3RoKSB7CiAgICAgICAgY2FzZSA4OiAgbWFzayA9IDB4MUI7CkBAIC01OSw3ICs3OCw3IEBACiAgCiAgICAgICAgLyogY29weSB1cCBhcyByZXF1aXJlICovCiAgICAgICAgaWYgKHggPT0gMCkgewotICAgICAgICAgIG1lbWNweShvbWFjLT5MdVsxXSwgb21hYy0+THVbMF0sIHNpemVvZihvbWFjLT5MdVswXSkpOworICAgICAgICAgIFhNRU1DUFkob21hYy0+THVbMV0sIG9tYWMtPkx1WzBdLCBzaXplb2Yob21hYy0+THVbMF0pKTsKICAgICAgICB9CiAgICB9CiAKQEAgLTc0LDMgKzkzLDcgQEAKIH0KIAogI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tYWMvb21hYy9vbWFjX2luaXQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzA2IDEwOjIyOjQ0ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWMvb21hYy9vbWFjX21lbW9yeS5jIGIvc3JjL21hYy9vbWFjL29tYWNfbWVtb3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxNTIxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWMvb21hYy9vbWFjX21lbW9yeS5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqIAorICBAZmlsZSBvbWFjX21lbW9yeS5jCisgIE9NQUMxIHN1cHBvcnQsIHByb2Nlc3MgYSBibG9jayBvZiBtZW1vcnksIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIE9NQUMKKworLyoqCisgICBPTUFDIGEgYmxvY2sgb2YgbWVtb3J5IAorICAgQHBhcmFtIGNpcGhlciAgICBUaGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgY2lwaGVyCisgICBAcGFyYW0ga2V5ICAgICAgIFRoZSBzZWNyZXQga2V5CisgICBAcGFyYW0ga2V5bGVuICAgIFRoZSBsZW5ndGggb2YgdGhlIHNlY3JldCBrZXkgKG9jdGV0cykKKyAgIEBwYXJhbSBpbiAgICAgICAgVGhlIGRhdGEgdG8gc2VuZCB0aHJvdWdoIE9NQUMKKyAgIEBwYXJhbSBpbmxlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBzZW5kIHRocm91Z2ggT01BQyAob2N0ZXRzKQorICAgQHBhcmFtIG91dCAgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHRhZworICAgQHBhcmFtIG91dGxlbiAgICBbaW4vb3V0XSAgVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgYXV0aGVudGljYXRpb24gdGFnIChvY3RldHMpCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgb21hY19tZW1vcnkoaW50IGNpcGhlciwgCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICBpbnQgZXJyOworICAgb21hY19zdGF0ZSAqb21hYzsKKworICAgTFRDX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKyAgIC8qIGFsbG9jYXRlIHJhbSBmb3Igb21hYyBzdGF0ZSAqLworICAgb21hYyA9IFhNQUxMT0Moc2l6ZW9mKG9tYWNfc3RhdGUpKTsKKyAgIGlmIChvbWFjID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKKyAgIC8qIG9tYWMgcHJvY2VzcyB0aGUgbWVzc2FnZSAqLworICAgaWYgKChlcnIgPSBvbWFjX2luaXQob21hYywgY2lwaGVyLCBrZXksIGtleWxlbikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisgICBpZiAoKGVyciA9IG9tYWNfcHJvY2VzcyhvbWFjLCBpbiwgaW5sZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorICAgaWYgKChlcnIgPSBvbWFjX2RvbmUob21hYywgb3V0LCBvdXRsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICBlcnIgPSBDUllQVF9PSzsKK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKG9tYWMsIHNpemVvZihvbWFjX3N0YXRlKSk7CisjZW5kaWYKKworICAgWEZSRUUob21hYyk7CisgICByZXR1cm4gZXJyOyAgIAorfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9vbWFjL29tYWNfbWVtb3J5LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9zcmMvbWFjL29tYWMvb21hY19tZW1vcnlfbXVsdGkuYyBiL3NyYy9tYWMvb21hYy9vbWFjX21lbW9yeV9tdWx0aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjczMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFjL29tYWMvb21hY19tZW1vcnlfbXVsdGkuYwpAQCAtMCwwICsxLDkwIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qKiAKKyAgQGZpbGUgb21hY19tZW1vcnlfbXVsdGkuYworICBPTUFDMSBzdXBwb3J0LCBwcm9jZXNzIG11bHRpcGxlIGJsb2NrcyBvZiBtZW1vcnksIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIE9NQUMKKworLyoqCisgICBPTUFDIG11bHRpcGxlIGJsb2NrcyBvZiBtZW1vcnkgCisgICBAcGFyYW0gY2lwaGVyICAgIFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBjaXBoZXIKKyAgIEBwYXJhbSBrZXkgICAgICAgVGhlIHNlY3JldCBrZXkKKyAgIEBwYXJhbSBrZXlsZW4gICAgVGhlIGxlbmd0aCBvZiB0aGUgc2VjcmV0IGtleSAob2N0ZXRzKQorICAgQHBhcmFtIG91dCAgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHRhZworICAgQHBhcmFtIG91dGxlbiAgICBbaW4vb3V0XSAgVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgYXV0aGVudGljYXRpb24gdGFnIChvY3RldHMpCisgICBAcGFyYW0gaW4gICAgICAgIFRoZSBkYXRhIHRvIHNlbmQgdGhyb3VnaCBPTUFDCisgICBAcGFyYW0gaW5sZW4gICAgIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gc2VuZCB0aHJvdWdoIE9NQUMgKG9jdGV0cykKKyAgIEBwYXJhbSAuLi4gICAgICAgdHVwbGVzIG9mIChkYXRhLGxlbikgcGFpcnMgdG8gT01BQywgdGVybWluYXRlZCB3aXRoIGEgKE5VTEwseCkgKHg9ZG9uJ3QgY2FyZSkKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBvbWFjX21lbW9yeV9tdWx0aShpbnQgY2lwaGVyLCAKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwgLi4uKQoreworICAgaW50ICAgICAgICAgICAgICAgICAgZXJyOworICAgb21hY19zdGF0ZSAgICAgICAgICAqb21hYzsKKyAgIHZhX2xpc3QgICAgICAgICAgICAgIGFyZ3M7CisgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjdXJwdHI7CisgICB1bnNpZ25lZCBsb25nICAgICAgICBjdXJsZW47CisKKyAgIExUQ19BUkdDSEsoa2V5ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworCisgICAvKiBhbGxvY2F0ZSByYW0gZm9yIG9tYWMgc3RhdGUgKi8KKyAgIG9tYWMgPSBYTUFMTE9DKHNpemVvZihvbWFjX3N0YXRlKSk7CisgICBpZiAob21hYyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICAvKiBvbWFjIHByb2Nlc3MgdGhlIG1lc3NhZ2UgKi8KKyAgIGlmICgoZXJyID0gb21hY19pbml0KG9tYWMsIGNpcGhlciwga2V5LCBrZXlsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorICAgdmFfc3RhcnQoYXJncywgaW5sZW4pOworICAgY3VycHRyID0gaW47IAorICAgY3VybGVuID0gaW5sZW47CisgICBmb3IgKDs7KSB7CisgICAgICAvKiBwcm9jZXNzIGJ1ZiAqLworICAgICAgaWYgKChlcnIgPSBvbWFjX3Byb2Nlc3Mob21hYywgY3VycHRyLCBjdXJsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgfQorICAgICAgLyogc3RlcCB0byBuZXh0ICovCisgICAgICBjdXJwdHIgPSB2YV9hcmcoYXJncywgY29uc3QgdW5zaWduZWQgY2hhciopOworICAgICAgaWYgKGN1cnB0ciA9PSBOVUxMKSB7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGN1cmxlbiA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKyAgIH0KKyAgIGlmICgoZXJyID0gb21hY19kb25lKG9tYWMsIG91dCwgb3V0bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKG9tYWMsIHNpemVvZihvbWFjX3N0YXRlKSk7CisjZW5kaWYKKyAgIFhGUkVFKG9tYWMpOworICAgdmFfZW5kKGFyZ3MpOworICAgcmV0dXJuIGVycjsgICAKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tYWMvb21hYy9vbWFjX21lbW9yeV9tdWx0aS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21hYy9vbWFjL29tYWNfcHJvY2Vzcy5jIGIvc3JjL21hYy9vbWFjL29tYWNfcHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2VjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFjL29tYWMvb21hY19wcm9jZXNzLmMKQEAgLTAsMCArMSw4NCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKiogCisgIEBmaWxlIG9tYWNfcHJvY2Vzcy5jCisgIE9NQUMxIHN1cHBvcnQsIHByb2Nlc3MgZGF0YSwgVG9tIFN0IERlbmlzCisqLworCisKKyNpZmRlZiBPTUFDCisKKy8qKiAKKyAgIFByb2Nlc3MgZGF0YSB0aHJvdWdoIE9NQUMKKyAgIEBwYXJhbSBvbWFjICAgICBUaGUgT01BQyBzdGF0ZQorICAgQHBhcmFtIGluICAgICAgIFRoZSBpbnB1dCBkYXRhIHRvIHNlbmQgdGhyb3VnaCBPTUFDCisgICBAcGFyYW0gaW5sZW4gICAgVGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgKG9jdGV0cykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBvbWFjX3Byb2Nlc3Mob21hY19zdGF0ZSAqb21hYywgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4pCit7CisgICB1bnNpZ25lZCBsb25nIG4sIHg7CisgICBpbnQgICAgICAgICAgIGVycjsKKworICAgTFRDX0FSR0NISyhvbWFjICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoaW4gICAgIT0gTlVMTCk7CisgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChvbWFjLT5jaXBoZXJfaWR4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIGlmICgob21hYy0+YnVmbGVuID4gKGludClzaXplb2Yob21hYy0+YmxvY2spKSB8fCAob21hYy0+YnVmbGVuIDwgMCkgfHwKKyAgICAgICAob21hYy0+YmxrbGVuID4gKGludClzaXplb2Yob21hYy0+YmxvY2spKSB8fCAob21hYy0+YnVmbGVuID4gb21hYy0+YmxrbGVuKSkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisjaWZkZWYgTFRDX0ZBU1QKKyAgIGlmIChvbWFjLT5idWZsZW4gPT0gMCAmJiBpbmxlbiA+IDE2KSB7CisgICAgICBpbnQgeTsKKyAgICAgIGZvciAoeCA9IDA7IHggPCAoaW5sZW4gLSAxNik7IHggKz0gMTYpIHsKKyAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkgKz0gc2l6ZW9mKExUQ19GQVNUX1RZUEUpKSB7CisgICAgICAgICAgICAgICooKExUQ19GQVNUX1RZUEUqKSgmb21hYy0+cHJldlt5XSkpIF49ICooKExUQ19GQVNUX1RZUEUqKSgmaW5beV0pKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaW4gKz0gMTY7CisgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3Jbb21hYy0+Y2lwaGVyX2lkeF0uZWNiX2VuY3J5cHQob21hYy0+cHJldiwgb21hYy0+cHJldiwgJm9tYWMtPmtleSk7CisgICAgICB9CisgICAgICBpbmxlbiAtPSB4OworICAgIH0KKyNlbmRpZgorCisgICB3aGlsZSAoaW5sZW4gIT0gMCkgeyAKKyAgICAgICAvKiBvayBpZiB0aGUgYmxvY2sgaXMgZnVsbCB3ZSB4b3IgaW4gcHJldiwgZW5jcnlwdCBhbmQgcmVwbGFjZSBwcmV2ICovCisgICAgICAgaWYgKG9tYWMtPmJ1ZmxlbiA9PSBvbWFjLT5ibGtsZW4pIHsKKyAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgKHVuc2lnbmVkIGxvbmcpb21hYy0+YmxrbGVuOyB4KyspIHsKKyAgICAgICAgICAgICAgb21hYy0+YmxvY2tbeF0gXj0gb21hYy0+cHJldlt4XTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3Jbb21hYy0+Y2lwaGVyX2lkeF0uZWNiX2VuY3J5cHQob21hYy0+YmxvY2ssIG9tYWMtPnByZXYsICZvbWFjLT5rZXkpOworICAgICAgICAgIG9tYWMtPmJ1ZmxlbiA9IDA7CisgICAgICAgfQorCisgICAgICAgLyogYWRkIGJ5dGVzICovCisgICAgICAgbiA9IE1JTihpbmxlbiwgKHVuc2lnbmVkIGxvbmcpKG9tYWMtPmJsa2xlbiAtIG9tYWMtPmJ1ZmxlbikpOworICAgICAgIFhNRU1DUFkob21hYy0+YmxvY2sgKyBvbWFjLT5idWZsZW4sIGluLCBuKTsKKyAgICAgICBvbWFjLT5idWZsZW4gICs9IG47CisgICAgICAgaW5sZW4gICAgICAgICAtPSBuOworICAgICAgIGluICAgICAgICAgICAgKz0gbjsKKyAgIH0KKworICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWFjL29tYWMvb21hY19wcm9jZXNzLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNiAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OCAkICovCmRpZmYgLS1naXQgYS9vbWFjX3Rlc3QuYyBiL3NyYy9tYWMvb21hYy9vbWFjX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDg3JQpyZW5hbWUgZnJvbSBvbWFjX3Rlc3QuYwpyZW5hbWUgdG8gc3JjL21hYy9vbWFjL29tYWNfdGVzdC5jCmluZGV4IDJkNTBkOWEuLjFiYzllYWQgMTAwNjQ0Ci0tLSBhL29tYWNfdGVzdC5jCisrKyBiL3NyYy9tYWMvb21hYy9vbWFjX3Rlc3QuYwpAQCAtNiwxMyArNiwyMSBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCi0vKiBPTUFDMSBTdXBwb3J0IGJ5IFRvbSBTdCBEZW5pcyAoZm9yIDY0IGFuZCAxMjggYml0IGJsb2NrIGNpcGhlcnMgb25seSkgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqIAorICBAZmlsZSBvbWFjX3Rlc3QuYworICBPTUFDMSBzdXBwb3J0LCBzZWxmLXRlc3QsIGJ5IFRvbSBTdCBEZW5pcworKi8KIAogI2lmZGVmIE9NQUMKIAorLyoqCisgIFRlc3QgdGhlIE9NQUMgc2V0dXAKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgdGVzdHMgaGF2ZSBiZWVuIGRpc2FibGVkCisqLwogaW50IG9tYWNfdGVzdCh2b2lkKQogewogI2lmICFkZWZpbmVkKExUQ19URVNUKQpAQCAtNjUsNyArNzMsNyBAQAogCiAgICAgfTsKICAgICB1bnNpZ25lZCBjaGFyIG91dFsxNl07Ci0gICAgaW50IHgsIHksIGVyciwgaWR4OworICAgIGludCB4LCBlcnIsIGlkeDsKICAgICB1bnNpZ25lZCBsb25nIGxlbjsKIAogCkBAIC04Myw4ICs5MSwxMSBAQAogICAgICAgIH0KIAogICAgICAgIGlmIChtZW1jbXAob3V0LCB0ZXN0c1t4XS50YWcsIDE2KSAhPSAwKSB7CisjaWYgMAorICAgICAgICAgIGludCB5OwogICAgICAgICAgIHByaW50ZigiXG5cblRhZzogIik7CiAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHByaW50ZigiJTAyeCIsIG91dFt5XSk7IHByaW50ZigiXG5cbiIpOworI2VuZGlmCiAgICAgICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKICAgICAgICB9CiAgICAgfQpAQCAtOTMsMyArMTA0LDcgQEAKIH0gICAKIAogI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tYWMvb21hYy9vbWFjX3Rlc3QuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWMvcGVsaWNhbi9wZWxpY2FuLmMgYi9zcmMvbWFjL3BlbGljYW4vcGVsaWNhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YmY5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFjL3BlbGljYW4vcGVsaWNhbi5jCkBAIC0wLDAgKzEsMTY1IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKiAKKyAgIEBmaWxlIHBlbGljYW4uYworICAgUGVsaWNhbiBNQUMsIGluaXRpYWxpemUgc3RhdGUsIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisKKyNpZmRlZiBQRUxJQ0FOCisKKyNkZWZpbmUgRU5DUllQVF9PTkxZCisjaW5jbHVkZSAiLi4vLi4vY2lwaGVycy9hZXMvYWVzX3RhYi5jIgorCisKKy8qKgorICAgSW5pdGlhbGl6ZSBhIFBlbGljYW4gc3RhdGUKKyAgIEBwYXJhbSBwZWxtYWMgICAgVGhlIFBlbGljYW4gc3RhdGUgdG8gaW5pdGlhbGl6ZQorICAgQHBhcmFtIGtleSAgICAgICBUaGUgc2VjcmV0IGtleSAKKyAgIEBwYXJhbSBrZXlsZW4gICAgVGhlIGxlbmd0aCBvZiB0aGUgc2VjcmV0IGtleSAob2N0ZXRzKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHBlbGljYW5faW5pdChwZWxpY2FuX3N0YXRlICpwZWxtYWMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4pCit7CisgICAgaW50IGVycjsKKyAgICAKKyAgICBMVENfQVJHQ0hLKHBlbG1hYyAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKKworI2lmZGVmIExUQ19GQVNUCisgICAgaWYgKDE2ICUgc2l6ZW9mKExUQ19GQVNUX1RZUEUpKSB7CisgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICgoZXJyID0gYWVzX3NldHVwKGtleSwga2V5bGVuLCAwLCAmcGVsbWFjLT5LKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHplcm9tZW0ocGVsbWFjLT5zdGF0ZSwgMTYpOworICAgIGFlc19lY2JfZW5jcnlwdChwZWxtYWMtPnN0YXRlLCBwZWxtYWMtPnN0YXRlLCAmcGVsbWFjLT5LKTsKKyAgICBwZWxtYWMtPmJ1ZmxlbiA9IDA7CisKKyAgICByZXR1cm4gQ1JZUFRfT0s7ICAgIAorfQorCitzdGF0aWMgdm9pZCBmb3VyX3JvdW5kcyhwZWxpY2FuX3N0YXRlICpwZWxtYWMpCit7CisgICAgdWxvbmczMiBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDM7CisgICAgaW50IHI7CisKKyAgICBMT0FEMzJIKHMwLCBwZWxtYWMtPnN0YXRlICAgICAgKTsKKyAgICBMT0FEMzJIKHMxLCBwZWxtYWMtPnN0YXRlICArICA0KTsKKyAgICBMT0FEMzJIKHMyLCBwZWxtYWMtPnN0YXRlICArICA4KTsKKyAgICBMT0FEMzJIKHMzLCBwZWxtYWMtPnN0YXRlICArIDEyKTsKKyAgICBmb3IgKHIgPSAwOyByIDwgNDsgcisrKSB7CisgICAgICAgIHQwID0KKyAgICAgICAgICAgIFRlMChieXRlKHMwLCAzKSkgXgorICAgICAgICAgICAgVGUxKGJ5dGUoczEsIDIpKSBeCisgICAgICAgICAgICBUZTIoYnl0ZShzMiwgMSkpIF4KKyAgICAgICAgICAgIFRlMyhieXRlKHMzLCAwKSk7CisgICAgICAgIHQxID0KKyAgICAgICAgICAgIFRlMChieXRlKHMxLCAzKSkgXgorICAgICAgICAgICAgVGUxKGJ5dGUoczIsIDIpKSBeCisgICAgICAgICAgICBUZTIoYnl0ZShzMywgMSkpIF4KKyAgICAgICAgICAgIFRlMyhieXRlKHMwLCAwKSk7CisgICAgICAgIHQyID0KKyAgICAgICAgICAgIFRlMChieXRlKHMyLCAzKSkgXgorICAgICAgICAgICAgVGUxKGJ5dGUoczMsIDIpKSBeCisgICAgICAgICAgICBUZTIoYnl0ZShzMCwgMSkpIF4KKyAgICAgICAgICAgIFRlMyhieXRlKHMxLCAwKSk7CisgICAgICAgIHQzID0KKyAgICAgICAgICAgIFRlMChieXRlKHMzLCAzKSkgXgorICAgICAgICAgICAgVGUxKGJ5dGUoczAsIDIpKSBeCisgICAgICAgICAgICBUZTIoYnl0ZShzMSwgMSkpIF4KKyAgICAgICAgICAgIFRlMyhieXRlKHMyLCAwKSk7CisgICAgICAgIHMwID0gdDA7IHMxID0gdDE7IHMyID0gdDI7IHMzID0gdDM7CisgICAgfQorICAgIFNUT1JFMzJIKHMwLCBwZWxtYWMtPnN0YXRlICAgICAgKTsKKyAgICBTVE9SRTMySChzMSwgcGVsbWFjLT5zdGF0ZSAgKyAgNCk7CisgICAgU1RPUkUzMkgoczIsIHBlbG1hYy0+c3RhdGUgICsgIDgpOworICAgIFNUT1JFMzJIKHMzLCBwZWxtYWMtPnN0YXRlICArIDEyKTsKK30KKworLyoqIAorICBQcm9jZXNzIGEgYmxvY2sgb2YgdGV4dCB0aHJvdWdoIFBlbGljYW4KKyAgQHBhcmFtIHBlbG1hYyAgICAgICBUaGUgUGVsaWNhbiBNQUMgc3RhdGUKKyAgQHBhcmFtIGluICAgICAgICAgICBUaGUgaW5wdXQKKyAgQHBhcmFtIGlubGVuICAgICAgICBUaGUgbGVuZ3RoIGlucHV0IChvY3RldHMpCisgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjY2VzcworICAqLworaW50IHBlbGljYW5fcHJvY2VzcyhwZWxpY2FuX3N0YXRlICpwZWxtYWMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuKQoreworCisgICBMVENfQVJHQ0hLKHBlbG1hYyAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoaW4gICAgICE9IE5VTEwpOworCisgICAvKiBjaGVjayByYW5nZSAqLworICAgaWYgKHBlbG1hYy0+YnVmbGVuIDwgMCB8fCBwZWxtYWMtPmJ1ZmxlbiA+IDE1KSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisKKyNpZmRlZiBMVENfRkFTVAorICAgaWYgKHBlbG1hYy0+YnVmbGVuID09IDApIHsKKyAgICAgIHdoaWxlIChpbmxlbiAmIH4xNSkgeworICAgICAgICAgaW50IHg7CisgICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gc2l6ZW9mKExUQ19GQVNUX1RZUEUpKSB7CisgICAgICAgICAgICAqKChMVENfRkFTVF9UWVBFKikoKHVuc2lnbmVkIGNoYXIgKilwZWxtYWMtPnN0YXRlICsgeCkpIF49ICooKExUQ19GQVNUX1RZUEUqKSgodW5zaWduZWQgY2hhciAqKWluICsgeCkpOworICAgICAgICAgfQorICAgICAgICAgZm91cl9yb3VuZHMocGVsbWFjKTsKKyAgICAgICAgIGluICAgICs9IDE2OworICAgICAgICAgaW5sZW4gLT0gMTY7CisgICAgICB9CisgICB9CisjZW5kaWYKKworICAgd2hpbGUgKGlubGVuLS0pIHsKKyAgICAgICBwZWxtYWMtPnN0YXRlW3BlbG1hYy0+YnVmbGVuKytdIF49ICppbisrOworICAgICAgIGlmIChwZWxtYWMtPmJ1ZmxlbiA9PSAxNikgeworICAgICAgICAgIGZvdXJfcm91bmRzKHBlbG1hYyk7CisgICAgICAgICAgcGVsbWFjLT5idWZsZW4gPSAwOworICAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworLyoqCisgIFRlcm1pbmF0ZSBQZWxpY2FuIE1BQworICBAcGFyYW0gcGVsbWFjICAgICAgVGhlIFBlbGljYW4gTUFDIHN0YXRlCisgIEBwYXJhbSBvdXQgICAgICAgICBbb3V0XSBUaGUgVEFHCisgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjZXNzCisqLworaW50IHBlbGljYW5fZG9uZShwZWxpY2FuX3N0YXRlICpwZWxtYWMsIHVuc2lnbmVkIGNoYXIgKm91dCkKK3sKKyAgIExUQ19BUkdDSEsocGVsbWFjICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICAhPSBOVUxMKTsKKworICAgLyogY2hlY2sgcmFuZ2UgKi8KKyAgIGlmIChwZWxtYWMtPmJ1ZmxlbiA8IDAgfHwgcGVsbWFjLT5idWZsZW4gPiAxNikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICBpZiAgKHBlbG1hYy0+YnVmbGVuID09IDE2KSB7CisgICAgICAgZm91cl9yb3VuZHMocGVsbWFjKTsKKyAgICAgICBwZWxtYWMtPmJ1ZmxlbiA9IDA7CisgICB9CisgICBwZWxtYWMtPnN0YXRlW3BlbG1hYy0+YnVmbGVuKytdIF49IDB4ODA7CisgICBhZXNfZWNiX2VuY3J5cHQocGVsbWFjLT5zdGF0ZSwgb3V0LCAmcGVsbWFjLT5LKTsKKyAgIGFlc19kb25lKCZwZWxtYWMtPkspOworICAgcmV0dXJuIENSWVBUX09LOworfSAgICAgICAgICAgICAgICAgICAgICAgIAorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9wZWxpY2FuL3BlbGljYW4uYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xNiAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbWFjL3BlbGljYW4vcGVsaWNhbl9tZW1vcnkuYyBiL3NyYy9tYWMvcGVsaWNhbi9wZWxpY2FuX21lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MzM0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFjL3BlbGljYW4vcGVsaWNhbl9tZW1vcnkuYwpAQCAtMCwwICsxLDU5IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKiAKKyAgIEBmaWxlIHBlbGljYW5fbWVtb3J5LmMKKyAgIFBlbGljYW4gTUFDLCBNQUMgYSBibG9jayBvZiBtZW1vcnksIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisKKyNpZmRlZiBQRUxJQ0FOCisKKy8qKgorICBQZWxpY2FuIGJsb2NrIG9mIG1lbW9yeQorICBAcGFyYW0ga2V5ICAgICAgVGhlIGtleSBmb3IgdGhlIE1BQworICBAcGFyYW0ga2V5bGVuICAgVGhlIGxlbmd0aCBvZiB0aGUga2V5IChvY3RldHMpCisgIEBwYXJhbSBpbiAgICAgICBUaGUgaW5wdXQgdG8gTUFDCisgIEBwYXJhbSBpbmxlbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCAob2N0ZXRzKQorICBAcGFyYW0gb3V0ICAgICAgW291dF0gVGhlIG91dHB1dCBUQUcgCisgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjY2VzcworKi8KK2ludCBwZWxpY2FuX21lbW9yeShjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcga2V5bGVuLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQpCit7CisgICBwZWxpY2FuX3N0YXRlICpwZWw7CisgICBpbnQgZXJyOworCisgICBwZWwgPSBYTUFMTE9DKHNpemVvZigqcGVsKSk7CisgICBpZiAocGVsID09IE5VTEwpIHsgCisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICBpZiAoKGVyciA9IHBlbGljYW5faW5pdChwZWwsIGtleSwga2V5bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIFhGUkVFKHBlbCk7CisgICAgICByZXR1cm4gZXJyOworICAgfQorICAgaWYgKChlcnIgPSBwZWxpY2FuX3Byb2Nlc3MocGVsLCBpbiAsaW5sZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgWEZSRUUocGVsKTsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBlcnIgPSBwZWxpY2FuX2RvbmUocGVsLCBvdXQpOworICAgWEZSRUUocGVsKTsgCisgICByZXR1cm4gZXJyOworfQorCisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWFjL3BlbGljYW4vcGVsaWNhbl9tZW1vcnkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWMvcGVsaWNhbi9wZWxpY2FuX3Rlc3QuYyBiL3NyYy9tYWMvcGVsaWNhbi9wZWxpY2FuX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmVjM2YwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21hYy9wZWxpY2FuL3BlbGljYW5fdGVzdC5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKiAKKyAgIEBmaWxlIHBlbGljYW5fdGVzdC5jCisgICBQZWxpY2FuIE1BQywgdGVzdCwgYnkgVG9tIFN0IERlbmlzIAorKi8KKworI2lmZGVmIFBFTElDQU4KKworaW50IHBlbGljYW5fdGVzdCh2b2lkKQoreworI2lmbmRlZiBMVENfVEVTVAorICAgcmV0dXJuIENSWVBUX05PUDsKKyNlbHNlCisgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBLWzMyXSwgTVNHWzY0XSwgVFsxNl07CisJaW50IGtleWxlbiwgcHRsZW47CisgICB9IHRlc3RzW10gPSB7CisvKiBLPTE2LCBNPTAgKi8KK3sKKyAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiB9LAorICAgeyAwIH0sCisgICB7IDB4ZWIsIDB4NTgsIDB4MzcsIDB4MTUsIDB4ZjgsIDB4MzQsIDB4ZGUsIDB4ZTUsIAorICAgICAweGE0LCAweGQxLCAweDZlLCAweGU0LCAweGI5LCAweGQ3LCAweDc2LCAweDBlLCB9LAorICAgMTYsIDAKK30sCisKKy8qIEs9MTYsIE09MyAqLworeworICAgeyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGIH0sCisgICB7IDB4MDAsIDB4MDEsIDB4MDIgfSwKKyAgIHsgMHgxYywgMHg5NywgMHg0MCwgMHg2MCwgMHg2YywgMHg1OCwgMHgxNywgMHgyZCwgCisgICAgIDB4MDMsIDB4OTQsIDB4MTksIDB4NzAsIDB4ODEsIDB4YzQsIDB4MzgsIDB4NTQsIH0sCisgICAxNiwgMworfSwKKworLyogSz0xNiwgTT0xNiAqLworeworICAgeyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGIH0sCisgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYgfSwKKyAgIHsgMHgwMywgMHhjYywgMHg0NiwgMHhiOCwgMHhhYywgMHhhNywgMHg5YywgMHgzNiwgCisgICAgIDB4MWUsIDB4OGMsIDB4NmUsIDB4YTYsIDB4N2IsIDB4ODksIDB4MzIsIDB4NDksIH0sCisgICAxNiwgMTYKK30sCisKKy8qIEs9MTYsIE09MzIgKi8KK3sKKyAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiB9LAorICAgeyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorICAgICAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELCAweDFFLCAweDFGIH0sCisgICB7IDB4ODksIDB4Y2MsIDB4MzYsIDB4NTgsIDB4MWIsIDB4ZGQsIDB4NGQsIDB4YjUsIAorICAgICAweDc4LCAweGJiLCAweGFjLCAweGYwLCAweGZmLCAweDhiLCAweDA4LCAweDE1LCB9LAorICAgMTYsIDMyCit9LAorCisvKiBLPTE2LCBNPTM1ICovCit7CisgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYgfSwKKyAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwRSwgMHgwRiwKKyAgICAgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKKyAgICAgMHgxOCwgMHgxOSwgMHgxQSwgMHgxQiwgMHgxQywgMHgxRCwgMHgxRSwgMHgxRiwKKyAgICAgMHgyMCwgMHgyMSwgMHgyMyB9LAorICAgeyAweDRhLCAweDdkLCAweDQ1LCAweDRkLCAweGNkLCAweGI1LCAweGRhLCAweDhkLCAKKyAgICAgMHg0OCwgMHg3OCwgMHgxNiwgMHg0OCwgMHg1ZCwgMHg0NSwgMHg5NSwgMHg5OSwgfSwKKyAgIDE2LCAzNQorfSwKK307CisgICBpbnQgeCwgZXJyOworICAgdW5zaWduZWQgY2hhciBvdXRbMTZdOworICAgcGVsaWNhbl9zdGF0ZSBwZWw7CisgICAKKyAgIGZvciAoeCA9IDA7IHggPCAoaW50KShzaXplb2YodGVzdHMpL3NpemVvZih0ZXN0c1swXSkpOyB4KyspIHsgCisgICAgICAgaWYgKChlcnIgPSBwZWxpY2FuX2luaXQoJnBlbCwgdGVzdHNbeF0uSywgdGVzdHNbeF0ua2V5bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgIH0KKyAgICAgICBpZiAoKGVyciA9IHBlbGljYW5fcHJvY2VzcygmcGVsLCB0ZXN0c1t4XS5NU0csIHRlc3RzW3hdLnB0bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgIH0KKyAgICAgICBpZiAoKGVyciA9IHBlbGljYW5fZG9uZSgmcGVsLCBvdXQpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgfQorCisgICAgICAgaWYgKG1lbWNtcChvdXQsIHRlc3RzW3hdLlQsIDE2KSkgeworI2lmIDAKKyAgICAgICAgICAgaW50IHk7CisgICAgICAgICAgIHByaW50ZigiXG5GYWlsZWQgdGVzdCAlZFxuIiwgeCk7CisgICAgICAgICAgIHByaW50ZigieyAiKTsgZm9yICh5ID0gMDsgeSA8IDE2OyApIHsgcHJpbnRmKCIweCUwMngsICIsIG91dFt5XSk7IGlmICghKCsreSAmIDcpKSBwcmludGYoIlxuIik7IH0gcHJpbnRmKCIgfVxuIik7CisjZW5kaWYKKyAgICAgICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKKyAgICAgICB9CisgICB9CisgICByZXR1cm4gQ1JZUFRfT0s7CisjZW5kaWYKK30KKworCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9wZWxpY2FuL3BlbGljYW5fdGVzdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjkgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvcG1hY19kb25lLmMgYi9zcmMvbWFjL3BtYWMvcG1hY19kb25lLmMKc2ltaWxhcml0eSBpbmRleCA3NiUKcmVuYW1lIGZyb20gcG1hY19kb25lLmMKcmVuYW1lIHRvIHNyYy9tYWMvcG1hYy9wbWFjX2RvbmUuYwppbmRleCA4MDUxZGE3Li4wOWM0MzBjIDEwMDY0NAotLS0gYS9wbWFjX2RvbmUuYworKysgYi9zcmMvbWFjL3BtYWMvcG1hY19kb25lLmMKQEAgLTYsMTEgKzYsMTQgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKLS8qIFBNQUMgaW1wbGVtZW50YXRpb24gYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorLyoqIAorICBAZmlsZSBwbWFjX2RvbmUuYworICBQTUFDIGltcGxlbWVudGF0aW9uLCB0ZXJtaW5hdGUgYSBzZXNzaW9uLCBieSBUb20gU3QgRGVuaXMgCisqLwogCiAjaWZkZWYgUE1BQwogCkBAIC0xOCw4ICsyMSw4IEBACiB7CiAgICBpbnQgZXJyLCB4OwogCi0gICBfQVJHQ0hLKHN0YXRlICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc3RhdGUgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICE9IE5VTEwpOwogICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoc3RhdGUtPmNpcGhlcl9pZHgpKSAhPSBDUllQVF9PSykgewogICAgICAgcmV0dXJuIGVycjsKICAgIH0KQEAgLTQ3LDYgKzUwLDcgQEAKIAogICAgLyogZW5jcnlwdCBpdCAqLwogICAgY2lwaGVyX2Rlc2NyaXB0b3Jbc3RhdGUtPmNpcGhlcl9pZHhdLmVjYl9lbmNyeXB0KHN0YXRlLT5jaGVja3N1bSwgc3RhdGUtPmNoZWNrc3VtLCAmc3RhdGUtPmtleSk7CisgICBjaXBoZXJfZGVzY3JpcHRvcltzdGF0ZS0+Y2lwaGVyX2lkeF0uZG9uZSgmc3RhdGUtPmtleSk7CiAKICAgIC8qIHN0b3JlIGl0ICovCiAgICBmb3IgKHggPSAwOyB4IDwgc3RhdGUtPmJsb2NrX2xlbiAmJiB4IDw9IChpbnQpKm91dGxlbjsgeCsrKSB7CkBAIC01NCw3ICs1OCw3IEBACiAgICB9CiAgICAqb3V0bGVuID0geDsKIAotI2lmZGVmIENMRUFOX1NUQUNLCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICB6ZXJvbWVtKHN0YXRlLCBzaXplb2YoKnN0YXRlKSk7CiAjZW5kaWYKICAgIHJldHVybiBDUllQVF9PSzsKQEAgLTYyLDMgKzY2LDcgQEAKIAogI2VuZGlmCiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9wbWFjL3BtYWNfZG9uZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21hYy9wbWFjL3BtYWNfZmlsZS5jIGIvc3JjL21hYy9wbWFjL3BtYWNfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMzRjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFjL3BtYWMvcG1hY19maWxlLmMKQEAgLTAsMCArMSw4NCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKiogCisgICBAZmlsZSBwbWFjX2ZpbGUuYworICAgUE1BQyBpbXBsZW1lbnRhdGlvbiwgcHJvY2VzcyBhIGZpbGUsIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisKKyNpZmRlZiBQTUFDCisKKy8qKgorICAgUE1BQyBhIGZpbGUgCisgICBAcGFyYW0gY2lwaGVyICAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2lwaGVyIGRlc2lyZWQKKyAgIEBwYXJhbSBrZXkgICAgICAgICAgVGhlIHNlY3JldCBrZXkKKyAgIEBwYXJhbSBrZXlsZW4gICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2VjcmV0IGtleSAob2N0ZXRzKQorICAgQHBhcmFtIGZpbGVuYW1lICAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byBzZW5kIHRocm91Z2ggUE1BQworICAgQHBhcmFtIG91dCAgICAgICAgICBbb3V0XSBEZXN0aW5hdGlvbiBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIHRhZworICAgQHBhcmFtIG91dGxlbiAgICAgICBbaW4vb3V0XSBNYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHRhZworICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgZmlsZSBzdXBwb3J0IGhhcyBiZWVuIGRpc2FibGVkCisqLworaW50IHBtYWNfZmlsZShpbnQgY2lwaGVyLCAKKyAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKyNpZmRlZiBMVENfTk9fRklMRQorICAgcmV0dXJuIENSWVBUX05PUDsKKyNlbHNlCisgICBpbnQgZXJyLCB4OworICAgcG1hY19zdGF0ZSBwbWFjOworICAgRklMRSAqaW47CisgICB1bnNpZ25lZCBjaGFyIGJ1Zls1MTJdOworCisKKyAgIExUQ19BUkdDSEsoa2V5ICAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGZpbGVuYW1lICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICAgIT0gTlVMTCk7CisKKyAgIGluID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOworICAgaWYgKGluID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBDUllQVF9GSUxFX05PVEZPVU5EOworICAgfQorCisgICBpZiAoKGVyciA9IHBtYWNfaW5pdCgmcG1hYywgY2lwaGVyLCBrZXksIGtleWxlbikpICE9IENSWVBUX09LKSB7CisgICAgICBmY2xvc2UoaW4pOworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgZG8geworICAgICAgeCA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIGluKTsKKyAgICAgIGlmICgoZXJyID0gcG1hY19wcm9jZXNzKCZwbWFjLCBidWYsIHgpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgZmNsb3NlKGluKTsKKyAgICAgICAgIHJldHVybiBlcnI7CisgICAgICB9CisgICB9IHdoaWxlICh4ID09IHNpemVvZihidWYpKTsKKyAgIGZjbG9zZShpbik7CisKKyAgIGlmICgoZXJyID0gcG1hY19kb25lKCZwbWFjLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworI2VuZGlmCisKKyAgIHJldHVybiBDUllQVF9PSzsKKyNlbmRpZgorfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9wbWFjL3BtYWNfZmlsZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvcG1hY19pbml0LmMgYi9zcmMvbWFjL3BtYWMvcG1hY19pbml0LmMKc2ltaWxhcml0eSBpbmRleCA3MyUKcmVuYW1lIGZyb20gcG1hY19pbml0LmMKcmVuYW1lIHRvIHNyYy9tYWMvcG1hYy9wbWFjX2luaXQuYwppbmRleCBiNGVmMTExLi41YmQ5NGEwIDEwMDY0NAotLS0gYS9wbWFjX2luaXQuYworKysgYi9zcmMvbWFjL3BtYWMvcG1hY19pbml0LmMKQEAgLTYsMTEgKzYsMTQgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKLS8qIFBNQUMgaW1wbGVtZW50YXRpb24gYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorLyoqIAorICAgQGZpbGUgcG1hY19pbml0LmMKKyAgIFBNQUMgaW1wbGVtZW50YXRpb24sIGluaXRpYWxpemUgc3RhdGUsIGJ5IFRvbSBTdCBEZW5pcyAKKyovCiAKICNpZmRlZiBQTUFDCiAKQEAgLTMyLDEzICszNSwyMSBAQAogfQogfTsKIAorLyoqCisgICBJbml0aWFsaXplIGEgUE1BQyBzdGF0ZQorICAgQHBhcmFtIHBtYWMgICAgICBUaGUgUE1BQyBzdGF0ZSB0byBpbml0aWFsaXplCisgICBAcGFyYW0gY2lwaGVyICAgIFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBjaXBoZXIKKyAgIEBwYXJhbSBrZXkgICAgICAgVGhlIHNlY3JldCBrZXkgCisgICBAcGFyYW0ga2V5bGVuICAgIFRoZSBsZW5ndGggb2YgdGhlIHNlY3JldCBrZXkgKG9jdGV0cykKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIGludCBwbWFjX2luaXQocG1hY19zdGF0ZSAqcG1hYywgaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbikKIHsKICAgIGludCBwb2x5LCB4LCB5LCBtLCBlcnI7Ci0gICB1bnNpZ25lZCBjaGFyIExbTUFYQkxPQ0tTSVpFXTsKKyAgIHVuc2lnbmVkIGNoYXIgKkw7CiAKLSAgIF9BUkdDSEsocG1hYyAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGtleSAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwbWFjICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAgIT0gTlVMTCk7CiAKICAgIC8qIHZhbGlkIGNpcGhlcj8gKi8KICAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNpcGhlcikpICE9IENSWVBUX09LKSB7CkBAIC01NCwxOSArNjUsMzIgQEAKICAgIH0KICAgIGlmIChwb2x5c1twb2x5XS5sZW4gIT0gcG1hYy0+YmxvY2tfbGVuKSB7CiAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7Ci0gICB9ICAgCisgICB9CisKKyNpZmRlZiBMVENfRkFTVAorICAgaWYgKHBtYWMtPmJsb2NrX2xlbiAlIHNpemVvZihMVENfRkFTVF9UWVBFKSkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorI2VuZGlmCisKIAogICAgLyogc2NoZWR1bGUgdGhlIGtleSAqLwogICAgaWYgKChlcnIgPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLnNldHVwKGtleSwga2V5bGVuLCAwLCAmcG1hYy0+a2V5KSkgIT0gQ1JZUFRfT0spIHsKICAgICAgIHJldHVybiBlcnI7CiAgICB9CiAgCisgICAvKiBhbGxvY2F0ZSBMICovCisgICBMID0gWE1BTExPQyhwbWFjLT5ibG9ja19sZW4pOworICAgaWYgKEwgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKwogICAgLyogZmluZCBMID0gRVswXSAqLwogICAgemVyb21lbShMLCBwbWFjLT5ibG9ja19sZW4pOwogICAgY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5lY2JfZW5jcnlwdChMLCBMLCAmcG1hYy0+a2V5KTsKIAogICAgLyogZmluZCBMc1tpXSA9IEwgPDwgaSBmb3IgaSA9PSAwLi4zMSAqLwotICAgbWVtY3B5KHBtYWMtPkxzWzBdLCBMLCBwbWFjLT5ibG9ja19sZW4pOworICAgWE1FTUNQWShwbWFjLT5Mc1swXSwgTCwgcG1hYy0+YmxvY2tfbGVuKTsKICAgIGZvciAoeCA9IDE7IHggPCAzMjsgeCsrKSB7CiAgICAgICAgbSA9IHBtYWMtPkxzW3gtMV1bMF0gPj4gNzsKICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcG1hYy0+YmxvY2tfbGVuLTE7IHkrKykgewpAQCAtMTA0LDExICsxMjgsMTcgQEAKICAgICB6ZXJvbWVtKHBtYWMtPkxpLCAgICAgICBzaXplb2YocG1hYy0+TGkpKTsKICAgICB6ZXJvbWVtKHBtYWMtPmNoZWNrc3VtLCBzaXplb2YocG1hYy0+Y2hlY2tzdW0pKTsKIAotI2lmZGVmIENMRUFOX1NUQUNLCi0gICAgemVyb21lbShMLCBzaXplb2YoTCkpOworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgIHplcm9tZW0oTCwgcG1hYy0+YmxvY2tfbGVuKTsKICNlbmRpZgogCisgICAgWEZSRUUoTCk7CisKICAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKICNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWFjL3BtYWMvcG1hY19pbml0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbWFjL3BtYWMvcG1hY19tZW1vcnkuYyBiL3NyYy9tYWMvcG1hYy9wbWFjX21lbW9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZGVmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFjL3BtYWMvcG1hY19tZW1vcnkuYwpAQCAtMCwwICsxLDc0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKiAKKyAgIEBmaWxlIHBtYWNfbWVtb3J5LmMKKyAgIFBNQUMgaW1wbGVtZW50YXRpb24sIHByb2Nlc3MgYSBibG9jayBvZiBtZW1vcnksIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisKKyNpZmRlZiBQTUFDCisKKy8qKgorICAgUE1BQyBhIGJsb2NrIG9mIG1lbW9yeQorICAgQHBhcmFtIGNpcGhlciAgIFRoZSBpbmRleCBvZiB0aGUgY2lwaGVyIGRlc2lyZWQKKyAgIEBwYXJhbSBrZXkgICAgICBUaGUgc2VjcmV0IGtleQorICAgQHBhcmFtIGtleWxlbiAgIFRoZSBsZW5ndGggb2YgdGhlIHNlY3JldCBrZXkgKG9jdGV0cykKKyAgIEBwYXJhbSBpbiAgICAgICBUaGUgZGF0YSB5b3Ugd2lzaCB0byBzZW5kIHRocm91Z2ggUE1BQworICAgQHBhcmFtIGlubGVuICAgIFRoZSBsZW5ndGggb2YgZGF0YSB5b3Ugd2lzaCB0byBzZW5kIHRocm91Z2ggUE1BQyAob2N0ZXRzKQorICAgQHBhcmFtIG91dCAgICAgIFtvdXRdIERlc3RpbmF0aW9uIGZvciB0aGUgYXV0aGVudGljYXRpb24gdGFnCisgICBAcGFyYW0gb3V0bGVuICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgYXV0aGVudGljYXRpb24gdGFnCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgcG1hY19tZW1vcnkoaW50IGNpcGhlciwgCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCB1bnNpZ25lZCBsb25nIGtleWxlbiwKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKyAgIGludCBlcnI7CisgICBwbWFjX3N0YXRlICpwbWFjOworCisgICBMVENfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoaW4gICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworCisgICAvKiBhbGxvY2F0ZSByYW0gZm9yIHBtYWMgc3RhdGUgKi8KKyAgIHBtYWMgPSBYTUFMTE9DKHNpemVvZihwbWFjX3N0YXRlKSk7CisgICBpZiAocG1hYyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorICAgCisgICBpZiAoKGVyciA9IHBtYWNfaW5pdChwbWFjLCBjaXBoZXIsIGtleSwga2V5bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKyAgIGlmICgoZXJyID0gcG1hY19wcm9jZXNzKHBtYWMsIGluLCBpbmxlbikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisgICBpZiAoKGVyciA9IHBtYWNfZG9uZShwbWFjLCBvdXQsIG91dGxlbikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisKKyAgIGVyciA9IENSWVBUX09LOworTEJMX0VSUjoKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKKyAgIHplcm9tZW0ocG1hYywgc2l6ZW9mKHBtYWNfc3RhdGUpKTsKKyNlbmRpZgorCisgICBYRlJFRShwbWFjKTsKKyAgIHJldHVybiBlcnI7ICAgCit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWFjL3BtYWMvcG1hY19tZW1vcnkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWMvcG1hYy9wbWFjX21lbW9yeV9tdWx0aS5jIGIvc3JjL21hYy9wbWFjL3BtYWNfbWVtb3J5X211bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjODU3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWMvcG1hYy9wbWFjX21lbW9yeV9tdWx0aS5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyoqIAorICAgQGZpbGUgcG1hY19tZW1vcnlfbXVsdGkuYworICAgUE1BQyBpbXBsZW1lbnRhdGlvbiwgcHJvY2VzcyBtdWx0aXBsZSBibG9ja3Mgb2YgbWVtb3J5LCBieSBUb20gU3QgRGVuaXMgCisqLworCisjaWZkZWYgUE1BQworCisvKioKKyAgIFBNQUMgbXVsdGlwbGUgYmxvY2tzIG9mIG1lbW9yeQorICAgQHBhcmFtIGNpcGhlciAgIFRoZSBpbmRleCBvZiB0aGUgY2lwaGVyIGRlc2lyZWQKKyAgIEBwYXJhbSBrZXkgICAgICBUaGUgc2VjcmV0IGtleQorICAgQHBhcmFtIGtleWxlbiAgIFRoZSBsZW5ndGggb2YgdGhlIHNlY3JldCBrZXkgKG9jdGV0cykKKyAgIEBwYXJhbSBvdXQgICAgICBbb3V0XSBEZXN0aW5hdGlvbiBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIHRhZworICAgQHBhcmFtIG91dGxlbiAgIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIHRhZworICAgQHBhcmFtIGluICAgICAgIFRoZSBkYXRhIHlvdSB3aXNoIHRvIHNlbmQgdGhyb3VnaCBQTUFDCisgICBAcGFyYW0gaW5sZW4gICAgVGhlIGxlbmd0aCBvZiBkYXRhIHlvdSB3aXNoIHRvIHNlbmQgdGhyb3VnaCBQTUFDIChvY3RldHMpCisgICBAcGFyYW0gLi4uICAgICAgdHVwbGVzIG9mIChkYXRhLGxlbikgcGFpcnMgdG8gUE1BQywgdGVybWluYXRlZCB3aXRoIGEgKE5VTEwseCkgKHg9ZG9uJ3QgY2FyZSkKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBwbWFjX21lbW9yeV9tdWx0aShpbnQgY2lwaGVyLCAKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGxvbmcgIGtleWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgIGlubGVuLCAuLi4pCit7CisgICBpbnQgICAgICAgICAgICAgICAgICBlcnI7CisgICBwbWFjX3N0YXRlICAgICAgICAgICpwbWFjOworICAgdmFfbGlzdCAgICAgICAgICAgICAgYXJnczsKKyAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN1cnB0cjsKKyAgIHVuc2lnbmVkIGxvbmcgICAgICAgIGN1cmxlbjsKKworICAgTFRDX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKyAgIC8qIGFsbG9jYXRlIHJhbSBmb3IgcG1hYyBzdGF0ZSAqLworICAgcG1hYyA9IFhNQUxMT0Moc2l6ZW9mKHBtYWNfc3RhdGUpKTsKKyAgIGlmIChwbWFjID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisgICAKKyAgIGlmICgoZXJyID0gcG1hY19pbml0KHBtYWMsIGNpcGhlciwga2V5LCBrZXlsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorICAgdmFfc3RhcnQoYXJncywgaW5sZW4pOworICAgY3VycHRyID0gaW47IAorICAgY3VybGVuID0gaW5sZW47CisgICBmb3IgKDs7KSB7CisgICAgICAvKiBwcm9jZXNzIGJ1ZiAqLworICAgICAgaWYgKChlcnIgPSBwbWFjX3Byb2Nlc3MocG1hYywgY3VycHRyLCBjdXJsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgfQorICAgICAgLyogc3RlcCB0byBuZXh0ICovCisgICAgICBjdXJwdHIgPSB2YV9hcmcoYXJncywgY29uc3QgdW5zaWduZWQgY2hhciopOworICAgICAgaWYgKGN1cnB0ciA9PSBOVUxMKSB7CisgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGN1cmxlbiA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKyAgIH0KKyAgIGlmICgoZXJyID0gcG1hY19kb25lKHBtYWMsIG91dCwgb3V0bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKHBtYWMsIHNpemVvZihwbWFjX3N0YXRlKSk7CisjZW5kaWYKKyAgIFhGUkVFKHBtYWMpOworICAgdmFfZW5kKGFyZ3MpOworICAgcmV0dXJuIGVycjsgICAKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tYWMvcG1hYy9wbWFjX21lbW9yeV9tdWx0aS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21hYy9wbWFjL3BtYWNfbnR6LmMgYi9zcmMvbWFjL3BtYWMvcG1hY19udHouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM0NTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21hYy9wbWFjL3BtYWNfbnR6LmMKQEAgLTAsMCArMSwzOSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKiogCisgICBAZmlsZSBwbWFjX250ei5jCisgICBQTUFDIGltcGxlbWVudGF0aW9uLCBpbnRlcm5hbCBmdW5jdGlvbiwgYnkgVG9tIFN0IERlbmlzIAorKi8KKworI2lmZGVmIFBNQUMKKworLyoqCisgIEludGVybmFsIFBNQUMgZnVuY3Rpb24KKyovCitpbnQgcG1hY19udHoodW5zaWduZWQgbG9uZyB4KQoreworICAgaW50IGM7CisgICB4ICY9IDB4RkZGRkZGRkZVTDsKKyAgIGMgPSAwOworICAgd2hpbGUgKCh4ICYgMSkgPT0gMCkgeworICAgICAgKytjOworICAgICAgeCA+Pj0gMTsKKyAgIH0KKyAgIHJldHVybiBjOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21hYy9wbWFjL3BtYWNfbnR6LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbWFjL3BtYWMvcG1hY19wcm9jZXNzLmMgYi9zcmMvbWFjL3BtYWMvcG1hY19wcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViZDQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWMvcG1hYy9wbWFjX3Byb2Nlc3MuYwpAQCAtMCwwICsxLDk2IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKiAKKyAgIEBmaWxlIHBtYWNfcHJvY2Vzcy5jCisgICBQTUFDIGltcGxlbWVudGF0aW9uLCBwcm9jZXNzIGRhdGEsIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisKKworI2lmZGVmIFBNQUMKKworLyoqCisgIFByb2Nlc3MgZGF0YSBpbiBhIFBNQUMgc3RyZWFtCisgIEBwYXJhbSBwbWFjICAgICBUaGUgUE1BQyBzdGF0ZQorICBAcGFyYW0gaW4gICAgICAgVGhlIGRhdGEgdG8gc2VuZCB0aHJvdWdoIFBNQUMKKyAgQHBhcmFtIGlubGVuICAgIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgdG8gc2VuZCB0aHJvdWdoIFBNQUMKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHBtYWNfcHJvY2VzcyhwbWFjX3N0YXRlICpwbWFjLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbikKK3sKKyAgIGludCBlcnIsIG47CisgICB1bnNpZ25lZCBsb25nIHg7CisgICB1bnNpZ25lZCBjaGFyIFpbTUFYQkxPQ0tTSVpFXTsKKworICAgTFRDX0FSR0NISyhwbWFjICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhpbiAgICE9IE5VTEwpOworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQocG1hYy0+Y2lwaGVyX2lkeCkpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICBpZiAoKHBtYWMtPmJ1ZmxlbiA+IChpbnQpc2l6ZW9mKHBtYWMtPmJsb2NrKSkgfHwgKHBtYWMtPmJ1ZmxlbiA8IDApIHx8CisgICAgICAgKHBtYWMtPmJsb2NrX2xlbiA+IChpbnQpc2l6ZW9mKHBtYWMtPmJsb2NrKSkgfHwgKHBtYWMtPmJ1ZmxlbiA+IHBtYWMtPmJsb2NrX2xlbikpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworI2lmZGVmIExUQ19GQVNUCisgICBpZiAocG1hYy0+YnVmbGVuID09IDAgJiYgaW5sZW4gPiAxNikgeworICAgICAgdW5zaWduZWQgbG9uZyB5OworICAgICAgZm9yICh4ID0gMDsgeCA8IChpbmxlbiAtIDE2KTsgeCArPSAxNikgeworICAgICAgICAgIHBtYWNfc2hpZnRfeG9yKHBtYWMpOworICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSArPSBzaXplb2YoTFRDX0ZBU1RfVFlQRSkpIHsKKyAgICAgICAgICAgICAgKigoTFRDX0ZBU1RfVFlQRSopKCZaW3ldKSkgPSAqKChMVENfRkFTVF9UWVBFKikoJmluW3ldKSkgXiAqKChMVENfRkFTVF9UWVBFKikoJnBtYWMtPkxpW3ldKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW3BtYWMtPmNpcGhlcl9pZHhdLmVjYl9lbmNyeXB0KFosIFosICZwbWFjLT5rZXkpOworICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSArPSBzaXplb2YoTFRDX0ZBU1RfVFlQRSkpIHsKKyAgICAgICAgICAgICAgKigoTFRDX0ZBU1RfVFlQRSopKCZwbWFjLT5jaGVja3N1bVt5XSkpIF49ICooKExUQ19GQVNUX1RZUEUqKSgmWlt5XSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBpbiArPSAxNjsKKyAgICAgIH0KKyAgICAgIGlubGVuIC09IHg7CisgICB9CisjZW5kaWYKKworICAgd2hpbGUgKGlubGVuICE9IDApIHsgCisgICAgICAgLyogb2sgaWYgdGhlIGJsb2NrIGlzIGZ1bGwgd2UgeG9yIGluIHByZXYsIGVuY3J5cHQgYW5kIHJlcGxhY2UgcHJldiAqLworICAgICAgIGlmIChwbWFjLT5idWZsZW4gPT0gcG1hYy0+YmxvY2tfbGVuKSB7CisgICAgICAgICAgcG1hY19zaGlmdF94b3IocG1hYyk7CisgICAgICAgICAgZm9yICh4ID0gMDsgeCA8ICh1bnNpZ25lZCBsb25nKXBtYWMtPmJsb2NrX2xlbjsgeCsrKSB7CisgICAgICAgICAgICAgICBaW3hdID0gcG1hYy0+TGlbeF0gXiBwbWFjLT5ibG9ja1t4XTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbcG1hYy0+Y2lwaGVyX2lkeF0uZWNiX2VuY3J5cHQoWiwgWiwgJnBtYWMtPmtleSk7CisgICAgICAgICAgZm9yICh4ID0gMDsgeCA8ICh1bnNpZ25lZCBsb25nKXBtYWMtPmJsb2NrX2xlbjsgeCsrKSB7CisgICAgICAgICAgICAgIHBtYWMtPmNoZWNrc3VtW3hdIF49IFpbeF07CisgICAgICAgICAgfQorICAgICAgICAgIHBtYWMtPmJ1ZmxlbiA9IDA7CisgICAgICAgfQorCisgICAgICAgLyogYWRkIGJ5dGVzICovCisgICAgICAgbiA9IE1JTihpbmxlbiwgKHVuc2lnbmVkIGxvbmcpKHBtYWMtPmJsb2NrX2xlbiAtIHBtYWMtPmJ1ZmxlbikpOworICAgICAgIFhNRU1DUFkocG1hYy0+YmxvY2sgKyBwbWFjLT5idWZsZW4sIGluLCBuKTsKKyAgICAgICBwbWFjLT5idWZsZW4gICs9IG47CisgICAgICAgaW5sZW4gICAgICAgICAtPSBuOworICAgICAgIGluICAgICAgICAgICAgKz0gbjsKKyAgIH0KKworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShaLCBzaXplb2YoWikpOworI2VuZGlmCisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tYWMvcG1hYy9wbWFjX3Byb2Nlc3MuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWMvcG1hYy9wbWFjX3NoaWZ0X3hvci5jIGIvc3JjL21hYy9wbWFjL3BtYWNfc2hpZnRfeG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI0YzIyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWMvcG1hYy9wbWFjX3NoaWZ0X3hvci5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqIAorICAgQGZpbGUgcG1hY19zaGlmdF94b3IuYworICAgUE1BQyBpbXBsZW1lbnRhdGlvbiwgaW50ZXJuYWwgZnVuY3Rpb24sIGJ5IFRvbSBTdCBEZW5pcyAKKyovCisKKyNpZmRlZiBQTUFDCisKKy8qKgorICBJbnRlcm5hbCBmdW5jdGlvbi4gIFBlcmZvcm1zIHRoZSBzdGF0ZSB1cGRhdGUgKGFkZGluZyBjb3JyZWN0IG11bHRpcGxlKQorICBAcGFyYW0gcG1hYyAgIFRoZSBQTUFDIHN0YXRlLgorKi8KK3ZvaWQgcG1hY19zaGlmdF94b3IocG1hY19zdGF0ZSAqcG1hYykKK3sKKyAgIGludCB4LCB5OworICAgeSA9IHBtYWNfbnR6KHBtYWMtPmJsb2NrX2luZGV4KyspOworI2lmZGVmIExUQ19GQVNUCisgICBmb3IgKHggPSAwOyB4IDwgcG1hYy0+YmxvY2tfbGVuOyB4ICs9IHNpemVvZihMVENfRkFTVF9UWVBFKSkgeworICAgICAgICooKExUQ19GQVNUX1RZUEUqKSgodW5zaWduZWQgY2hhciAqKXBtYWMtPkxpICsgeCkpIF49CisgICAgICAgKigoTFRDX0ZBU1RfVFlQRSopKCh1bnNpZ25lZCBjaGFyICopcG1hYy0+THNbeV0gKyB4KSk7CisgICB9CisjZWxzZQorICAgZm9yICh4ID0gMDsgeCA8IHBtYWMtPmJsb2NrX2xlbjsgeCsrKSB7CisgICAgICAgcG1hYy0+TGlbeF0gXj0gcG1hYy0+THNbeV1beF07CisgICB9CisjZW5kaWYKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tYWMvcG1hYy9wbWFjX3NoaWZ0X3hvci5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvcG1hY190ZXN0LmMgYi9zcmMvbWFjL3BtYWMvcG1hY190ZXN0LmMKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gcG1hY190ZXN0LmMKcmVuYW1lIHRvIHNyYy9tYWMvcG1hYy9wbWFjX3Rlc3QuYwppbmRleCBlODEzZWI1Li42ZDg4NzAzIDEwMDY0NAotLS0gYS9wbWFjX3Rlc3QuYworKysgYi9zcmMvbWFjL3BtYWMvcG1hY190ZXN0LmMKQEAgLTYsMTQgKzYsMjIgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKLS8qIFBNQUMgaW1wbGVtZW50YXRpb24gYnkgVG9tIFN0IERlbmlzICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorLyoqIAorICAgQGZpbGUgcG1hY190ZXN0LmMKKyAgIFBNQUMgaW1wbGVtZW50YXRpb24sIHNlbGYtdGVzdCwgYnkgVG9tIFN0IERlbmlzIAorKi8KKwogCiAjaWZkZWYgUE1BQwogCisvKiogCisgICBUZXN0IHRoZSBPTUFDIGltcGxlbWVudGF0aW9uCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiB0ZXN0aW5nIGhhcyBiZWVuIGRpc2FibGVkCisqLwogaW50IHBtYWNfdGVzdCh2b2lkKQogewogI2lmICFkZWZpbmVkKExUQ19URVNUKQpAQCAtMTUxLDMgKzE1OSw3IEBACiAKIAogIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWFjL3BtYWMvcG1hY190ZXN0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9iYXNlNjRfZGVjb2RlLmMgYi9zcmMvbWlzYy9iYXNlNjQvYmFzZTY0X2RlY29kZS5jCnNpbWlsYXJpdHkgaW5kZXggNjQlCnJlbmFtZSBmcm9tIGJhc2U2NF9kZWNvZGUuYwpyZW5hbWUgdG8gc3JjL21pc2MvYmFzZTY0L2Jhc2U2NF9kZWNvZGUuYwppbmRleCA2NzI5NDgwLi41NTFhZGQxIDEwMDY0NAotLS0gYS9iYXNlNjRfZGVjb2RlLmMKKysrIGIvc3JjL21pc2MvYmFzZTY0L2Jhc2U2NF9kZWNvZGUuYwpAQCAtNiwxMSArNiwxNSBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAotLyogY29tcGxpYW50IGJhc2U2NCBjb2RlIGRvbmF0ZWQgYnkgV2F5bmUgU2NvdHQgKHdzY290dEBiaXRtb3Zlci5jb20pICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorLyoqCisgIEBmaWxlIGJhc2U2NF9kZWNvZGUuYworICBDb21wbGlhbnQgYmFzZTY0IGNvZGUgZG9uYXRlZCBieSBXYXluZSBTY290dCAod3Njb3R0QGJpdG1vdmVyLmNvbSkKKyovCisKIAogI2lmZGVmIEJBU0U2NAogCkBAIC0zOCwyMyArNDIsNDMgQEAKIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCiAyNTUsIDI1NSwgMjU1LCAyNTUgfTsKIAotaW50IGJhc2U2NF9kZWNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGxlbiwgCisvKioKKyAgIGJhc2U2NCBkZWNvZGUgYSBibG9jayBvZiBtZW1vcnkKKyAgIEBwYXJhbSBpbiAgICAgICBUaGUgYmFzZTY0IGRhdGEgdG8gZGVjb2RlCisgICBAcGFyYW0gaW5sZW4gICAgVGhlIGxlbmd0aCBvZiB0aGUgYmFzZTY0IGRhdGEKKyAgIEBwYXJhbSBvdXQgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGJpbmFyeSBkZWNvZGVkIGRhdGEKKyAgIEBwYXJhbSBvdXRsZW4gICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBkZWNvZGVkIGRhdGEKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBiYXNlNjRfZGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKIHsKICAgIHVuc2lnbmVkIGxvbmcgdCwgeCwgeSwgejsKICAgIHVuc2lnbmVkIGNoYXIgYzsKICAgIGludCAgICAgICAgICAgZzsKIAotICAgX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0bGVuICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOwogCiAgICBnID0gMzsKLSAgIGZvciAoeCA9IHkgPSB6ID0gdCA9IDA7IHggPCBsZW47IHgrKykgeworICAgZm9yICh4ID0geSA9IHogPSB0ID0gMDsgeCA8IGlubGVuOyB4KyspIHsKICAgICAgICBjID0gbWFwW2luW3hdJjB4RkZdOwogICAgICAgIGlmIChjID09IDI1NSkgY29udGludWU7Ci0gICAgICAgaWYgKGMgPT0gMjU0KSB7IGMgPSAwOyBnLS07IH0KKyAgICAgICAvKiB0aGUgZmluYWwgPSBzeW1ib2xzIGFyZSByZWFkIGFuZCB1c2VkIHRvIHRyaW0gdGhlIHJlbWFpbmluZyBieXRlcyAqLworICAgICAgIGlmIChjID09IDI1NCkgeyAKKyAgICAgICAgICBjID0gMDsgCisgICAgICAgICAgLyogcHJldmVudCBnIDwgMCB3aGljaCB3b3VsZCBwb3RlbnRpYWxseSBhbGxvdyBhbiBvdmVyZmxvdyBsYXRlciAqLworICAgICAgICAgIGlmICgtLWcgPCAwKSB7CisgICAgICAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgICAgICAgIH0KKyAgICAgICB9IGVsc2UgaWYgKGcgIT0gMykgeworICAgICAgICAgIC8qIHdlIG9ubHkgYWxsb3cgPSB0byBiZSBhdCB0aGUgZW5kICovCisgICAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgICAgIH0KKwogICAgICAgIHQgPSAodDw8Nil8YzsKKwogICAgICAgIGlmICgrK3kgPT0gNCkgewogICAgICAgICAgIGlmICh6ICsgZyA+ICpvdXRsZW4pIHsgCiAgICAgICAgICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsgCkBAIC03NCwzICs5OCw3IEBACiAKICNlbmRpZgogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2Jhc2U2NC9iYXNlNjRfZGVjb2RlLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbWlzYy9iYXNlNjQvYmFzZTY0X2VuY29kZS5jIGIvc3JjL21pc2MvYmFzZTY0L2Jhc2U2NF9lbmNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTc4NjQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21pc2MvYmFzZTY0L2Jhc2U2NF9lbmNvZGUuYwpAQCAtMCwwICsxLDgwIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBiYXNlNjRfZW5jb2RlLmMKKyAgQ29tcGxpYW50IGJhc2U2NCBlbmNvZGVyIGRvbmF0ZWQgYnkgV2F5bmUgU2NvdHQgKHdzY290dEBiaXRtb3Zlci5jb20pCisqLworCisKKyNpZmRlZiBCQVNFNjQKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvZGVzID0gCisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CisKKy8qKgorICAgYmFzZTY0IEVuY29kZSBhIGJ1ZmZlciAoTlVMIHRlcm1pbmF0ZWQpCisgICBAcGFyYW0gaW4gICAgICBUaGUgaW5wdXQgYnVmZmVyIHRvIGVuY29kZQorICAgQHBhcmFtIGlubGVuICAgVGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyCisgICBAcGFyYW0gb3V0ICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEKKyAgIEBwYXJhbSBvdXRsZW4gIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBiYXNlNjRfZW5jb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgaSwgbGVuMiwgbGV2ZW47CisgICB1bnNpZ25lZCBjaGFyICpwOworCisgICBMVENfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKyAgIC8qIHZhbGlkIG91dHB1dCBzaXplID8gKi8KKyAgIGxlbjIgPSA0ICogKChpbmxlbiArIDIpIC8gMyk7CisgICBpZiAoKm91dGxlbiA8IGxlbjIgKyAxKSB7CisgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICAgfQorICAgcCA9IG91dDsKKyAgIGxldmVuID0gMyooaW5sZW4gLyAzKTsKKyAgIGZvciAoaSA9IDA7IGkgPCBsZXZlbjsgaSArPSAzKSB7CisgICAgICAgKnArKyA9IGNvZGVzWyhpblswXSA+PiAyKSAmIDB4M0ZdOworICAgICAgICpwKysgPSBjb2Rlc1soKChpblswXSAmIDMpIDw8IDQpICsgKGluWzFdID4+IDQpKSAmIDB4M0ZdOworICAgICAgICpwKysgPSBjb2Rlc1soKChpblsxXSAmIDB4ZikgPDwgMikgKyAoaW5bMl0gPj4gNikpICYgMHgzRl07CisgICAgICAgKnArKyA9IGNvZGVzW2luWzJdICYgMHgzRl07CisgICAgICAgaW4gKz0gMzsKKyAgIH0KKyAgIC8qIFBhZCBpdCBpZiBuZWNlc3NhcnkuLi4gICovCisgICBpZiAoaSA8IGlubGVuKSB7CisgICAgICAgdW5zaWduZWQgYSA9IGluWzBdOworICAgICAgIHVuc2lnbmVkIGIgPSAoaSsxIDwgaW5sZW4pID8gaW5bMV0gOiAwOworCisgICAgICAgKnArKyA9IGNvZGVzWyhhID4+IDIpICYgMHgzRl07CisgICAgICAgKnArKyA9IGNvZGVzWygoKGEgJiAzKSA8PCA0KSArIChiID4+IDQpKSAmIDB4M0ZdOworICAgICAgICpwKysgPSAoaSsxIDwgaW5sZW4pID8gY29kZXNbKCgoYiAmIDB4ZikgPDwgMikpICYgMHgzRl0gOiAnPSc7CisgICAgICAgKnArKyA9ICc9JzsKKyAgIH0KKworICAgLyogYXBwZW5kIGEgTlVMTCBieXRlICovCisgICAqcCA9ICdcMCc7CisKKyAgIC8qIHJldHVybiBvayAqLworICAgKm91dGxlbiA9IHAgLSBvdXQ7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2Jhc2U2NC9iYXNlNjRfZW5jb2RlLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbWlzYy9idXJuX3N0YWNrLmMgYi9zcmMvbWlzYy9idXJuX3N0YWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjNjUxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9taXNjL2J1cm5fc3RhY2suYwpAQCAtMCwwICsxLDM0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgYnVybl9zdGFjay5jCisgICBCdXJuIHN0YWNrLCBUb20gU3QgRGVuaXMKKyovCisKKy8qKgorICAgQnVybiBzb21lIHN0YWNrIG1lbW9yeQorICAgQHBhcmFtIGxlbiBhbW91bnQgb2Ygc3RhY2sgdG8gYnVybiBpbiBieXRlcworKi8KK3ZvaWQgYnVybl9zdGFjayh1bnNpZ25lZCBsb25nIGxlbikKK3sKKyAgIHVuc2lnbmVkIGNoYXIgYnVmWzMyXTsKKyAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7CisgICBpZiAobGVuID4gKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGJ1ZikpCisgICAgICBidXJuX3N0YWNrKGxlbiAtIHNpemVvZihidWYpKTsKK30KKworCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2J1cm5fc3RhY2suYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL2NyeXB0LmMgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdC5jCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGNyeXB0LmMKcmVuYW1lIHRvIHNyYy9taXNjL2NyeXB0L2NyeXB0LmMKaW5kZXggNjg2MTVjMi4uZWI3NWI4ZCAxMDA2NDQKLS0tIGEvY3J5cHQuYworKysgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdC5jCkBAIC02LDE0ICs2LDIwIEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAotLyogRHJvcGJlYXIgZG9lc24ndCBuZWVkIHRoZXNlIAorLyoqCisgIEBmaWxlIGNyeXB0LmMKKyAgQnVpbGQgc3RyaW5ncywgVG9tIFN0IERlbmlzCisqLyAgCiAKKy8qCiBjb25zdCBjaGFyICpjcnlwdF9idWlsZF9zZXR0aW5ncyA9Ci0gICAiTGliVG9tQ3J5cHQgIiBTQ1JZUFQgIlxuXG4iCisgICAiTGliVG9tQ3J5cHQgIiBTQ1JZUFQgIiAoVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSlcbiIKKyAgICJMaWJUb21DcnlwdCBpcyBwdWJsaWMgZG9tYWluIHNvZnR3YXJlLlxuIgorICAgIkJ1aWx0IG9uICIgX19EQVRFX18gIiBhdCAiIF9fVElNRV9fICJcblxuXG4iCiAgICAiRW5kaWFuZXNzOiAiCiAjaWYgZGVmaW5lZChFTkRJQU5fTkVVVFJBTCkKICAgICJuZXV0cmFsXG4iCkBAIC0zMyw3ICszOSw3IEBACiAgICAjZW5kaWYKICNlbmRpZgogICAgIkNsZWFuIHN0YWNrOiAiCi0jaWYgZGVmaW5lZChDTEVBTl9TVEFDSykKKyNpZiBkZWZpbmVkKExUQ19DTEVBTl9TVEFDSykKICAgICJlbmFibGVkXG4iCiAjZWxzZQogICAgImRpc2FibGVkXG4iCkBAIC02NSwxMiArNzEsMjAgQEAKICNlbmRpZgogI2lmIGRlZmluZWQoVFdPRklTSCkKICAgICIgICBUd29maXNoICIKLSAgICNpZiBkZWZpbmVkKFRXT0ZJU0hfU01BTEwpICYmIGRlZmluZWQoVFdPRklTSF9UQUJMRVMpCisgICAjaWYgZGVmaW5lZChUV09GSVNIX1NNQUxMKSAmJiBkZWZpbmVkKFRXT0ZJU0hfVEFCTEVTKSAmJiBkZWZpbmVkKFRXT0ZJU0hfQUxMX1RBQkxFUykKKyAgICAgICAiKHNtYWxsLCB0YWJsZXMsIGFsbF90YWJsZXMpXG4iCisgICAjZWxpZiBkZWZpbmVkKFRXT0ZJU0hfU01BTEwpICYmIGRlZmluZWQoVFdPRklTSF9UQUJMRVMpCiAgICAgICAgIihzbWFsbCwgdGFibGVzKVxuIgorICAgI2VsaWYgZGVmaW5lZChUV09GSVNIX1NNQUxMKSAmJiBkZWZpbmVkKFRXT0ZJU0hfQUxMX1RBQkxFUykKKyAgICAgICAiKHNtYWxsLCBhbGxfdGFibGVzKVxuIgorICAgI2VsaWYgZGVmaW5lZChUV09GSVNIX1RBQkxFUykgJiYgZGVmaW5lZChUV09GSVNIX0FMTF9UQUJMRVMpCisgICAgICAgIih0YWJsZXMsIGFsbF90YWJsZXMpXG4iCiAgICAjZWxpZiBkZWZpbmVkKFRXT0ZJU0hfU01BTEwpCiAgICAgICAgIihzbWFsbClcbiIKICAgICNlbGlmIGRlZmluZWQoVFdPRklTSF9UQUJMRVMpCiAgICAgICAgIih0YWJsZXMpXG4iCisgICAjZWxpZiBkZWZpbmVkKFRXT0ZJU0hfQUxMX1RBQkxFUykKKyAgICAgICAiKGFsbF90YWJsZXMpXG4iCiAgICAjZWxzZQogICAgICAgICJcbiIKICAgICNlbmRpZgpAQCAtODcsNiArMTAxLDE2IEBACiAjaWYgZGVmaW5lZChTS0lQSkFDSykKICAgICIgICBTa2lwamFja1xuIgogI2VuZGlmCisjaWYgZGVmaW5lZChLSEFaQUQpCisgICAiICAgS2hhemFkXG4iCisjZW5kaWYKKyNpZiBkZWZpbmVkKEFOVUJJUykKKyAgICIgICBBbnViaXMgIgorI2VuZGlmCisjaWYgZGVmaW5lZChBTlVCSVNfVFdFQUspCisgICAiICh0d2Vha2VkKSIKKyNlbmRpZgorICAgIlxuIgogCiAgICAgIlxuSGFzaGVzIGJ1aWx0LWluOlxuIgogI2lmIGRlZmluZWQoU0hBNTEyKQpAQCAtMTI1LDYgKzE0OSw5IEBACiAjaWYgZGVmaW5lZChXSElSTFBPT0wpCiAgICAiICAgV0hJUkxQT09MXG4iCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENIQ19IQVNIKQorICAgIiAgIENIQ19IQVNIIFxuIgorI2VuZGlmCiAKICAgICAiXG5CbG9jayBDaGFpbmluZyBNb2RlczpcbiIKICNpZiBkZWZpbmVkKENGQikKQEAgLTE0Myw2ICsxNzAsMzkgQEAKICAgICAiICAgQ1RSXG4iCiAjZW5kaWYKIAorICAgICJcbk1BQ3M6XG4iCisjaWYgZGVmaW5lZChITUFDKQorICAgICIgICBITUFDXG4iCisjZW5kaWYKKyNpZiBkZWZpbmVkKE9NQUMpCisgICAgIiAgIE9NQUNcbiIKKyNlbmRpZgorI2lmIGRlZmluZWQoUE1BQykKKyAgICAiICAgUE1BQ1xuIgorI2VuZGlmCisjaWYgZGVmaW5lZChQRUxJQ0FOKQorICAgICIgICBQRUxJQ0FOXG4iCisjZW5kaWYKKworICAgICJcbkVOQyArIEFVVEggbW9kZXM6XG4iCisjaWYgZGVmaW5lZChFQVhfTU9ERSkKKyAgICAiICAgRUFYX01PREVcbiIKKyNlbmRpZgorI2lmIGRlZmluZWQoT0NCX01PREUpCisgICAgIiAgIE9DQl9NT0RFXG4iCisjZW5kaWYKKyNpZiBkZWZpbmVkKENDTV9NT0RFKQorICAgICIgICBDQ01fTU9ERVxuIgorI2VuZGlmCisjaWYgZGVmaW5lZChHQ01fTU9ERSkKKyAgICAiICAgR0NNX01PREUgIgorI2VuZGlmCisjaWYgZGVmaW5lZChHQ01fVEFCTEVTKQorICAgICIgKEdDTV9UQUJMRVMpICIKKyNlbmRpZgorICAgIlxuIgorCisKICAgICAiXG5QUk5HOlxuIgogI2lmIGRlZmluZWQoWUFSUk9XKQogICAgICIgICBZYXJyb3dcbiIKQEAgLTE1MywxNCArMjEzLDE2IEBACiAjaWYgZGVmaW5lZChSQzQpCiAgICAgIiAgIFJDNFxuIgogI2VuZGlmCisjaWYgZGVmaW5lZChGT1JUVU5BKQorICAgICIgICBGb3J0dW5hXG4iCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNPQkVSMTI4KQorICAgICIgICBTT0JFUjEyOFxuIgorI2VuZGlmCiAKICAgICAiXG5QSyBBbGdzOlxuIgogI2lmIGRlZmluZWQoTVJTQSkKLSAgICAiICAgUlNBIgotI2lmIGRlZmluZWQoUlNBX1RJTUlORykKLSAgICAiICsgUlNBX1RJTUlORyAiCi0jZW5kaWYKLSAgICAiXG4iCisgICAgIiAgIFJTQSBcbiIKICNlbmRpZgogI2lmIGRlZmluZWQoTURIKQogICAgICIgICBESFxuIgpAQCAtMTc2LDEwICsyMzgsMTAgQEAKICNpZiBkZWZpbmVkKFdJTjMyKQogICAgICIgICBXSU4zMiBwbGF0Zm9ybSBkZXRlY3RlZC5cbiIKICNlbmRpZgotI2lmIGRlZmluZWQoX19DWUdXSU5fXykKKyNpZiBkZWZpbmVkKExCTF9DWUdXSU5fXykKICAgICAiICAgQ1lHV0lOIERldGVjdGVkLlxuIgogI2VuZGlmCi0jaWYgZGVmaW5lZChfX0RKR1BQX18pCisjaWYgZGVmaW5lZChMQkxfREpHUFBfXykKICAgICAiICAgREpHUFAgRGV0ZWN0ZWQuXG4iCiAjZW5kaWYKICNpZiBkZWZpbmVkKF9NU0NfVkVSKQpAQCAtMTkxLDYgKzI1Myw5IEBACiAjaWYgZGVmaW5lZChJTlRFTF9DQykKICAgICAiICAgSW50ZWwgQyBDb21waWxlciBkZXRlY3RlZC5cbiIKICNlbmRpZgorI2lmIGRlZmluZWQoTEJMX3g4Nl82NF9fKQorICAgICIgICB4ODYtNjQgZGV0ZWN0ZWQuXG4iCisjZW5kaWYKIAogICAgICJcblZhcmlvdXMgb3RoZXJzOiAiCiAjaWYgZGVmaW5lZChCQVNFNjQpCkBAIC0xOTksMjEgKzI2NCw2IEBACiAjaWYgZGVmaW5lZChNUEkpCiAgICAgIiBNUEkgIgogI2VuZGlmCi0jaWYgZGVmaW5lZChITUFDKQotICAgICIgSE1BQyAiCi0jZW5kaWYKLSNpZiBkZWZpbmVkKE9NQUMpCi0gICAgIiBPTUFDICIKLSNlbmRpZgotI2lmIGRlZmluZWQoUE1BQykKLSAgICAiIFBNQUMgIgotI2VuZGlmCi0jaWYgZGVmaW5lZChFQVhfTU9ERSkKLSAgICAiIEVBWF9NT0RFICIKLSNlbmRpZgotI2lmIGRlZmluZWQoT0NCX01PREUpCi0gICAgIiBPQ0JfTU9ERSAiCi0jZW5kaWYKICNpZiBkZWZpbmVkKFRSWV9VTlJBTkRPTV9GSVJTVCkKICAgICAiIFRSWV9VTlJBTkRPTV9GSVJTVCAiCiAjZW5kaWYKQEAgLTIyNiwxNyArMjc2LDQyIEBACiAjaWYgZGVmaW5lZChQS0NTXzUpCiAgICAgIiBQS0NTIzUgIgogI2VuZGlmCi0jaWYgZGVmaW5lZChTTUFMTF9DT0RFKQotICAgICIgU01BTExfQ09ERSAiCisjaWYgZGVmaW5lZChMVENfU01BTExfQ09ERSkKKyAgICAiIExUQ19TTUFMTF9DT0RFICIKICNlbmRpZgotI2lmIGRlZmluZWQoTk9fRklMRSkKLSAgICAiIE5PX0ZJTEUgIgorI2lmIGRlZmluZWQoTFRDX05PX0ZJTEUpCisgICAgIiBMVENfTk9fRklMRSAiCiAjZW5kaWYKLSNpZiBkZWZpbmVkKExUQ19URVNUKQotICAgICIgTFRDX1RFU1QgIgorI2lmIGRlZmluZWQoTFRDX0RFUikKKyAgICAiIExUQ19ERVIgIgorI2VuZGlmCisjaWYgZGVmaW5lZChMVENfRkFTVCkKKyAgICAiIExUQ19GQVNUICIKKyNlbmRpZgorI2lmIGRlZmluZWQoTFRDX05PX0ZBU1QpCisgICAgIiBMVENfTk9fRkFTVCAiCisjZW5kaWYKKyNpZiBkZWZpbmVkKExUQ19OT19CU1dBUCkKKyAgICAiIExUQ19OT19CU1dBUCAiCisjZW5kaWYKKyNpZiBkZWZpbmVkKExUQ19OT19BU00pCisgICAgIiBMVENfTk9fQVNNICIKKyNlbmRpZgorI2lmIGRlZmluZWQoTFRDX05PX1RFU1QpCisgICAgIiBMVENfTk9fVEVTVCAiCisjZW5kaWYKKyNpZiBkZWZpbmVkKExUQ19OT19UQUJMRVMpCisgICAgIiBMVENfTk9fVEFCTEVTICIKKyNlbmRpZgorI2lmIGRlZmluZWQoTFRDX1BUSFJFQUQpCisgICAgIiBMVENfUFRIUkVBRCAiCiAjZW5kaWYKICAgICAiXG4iCiAgICAgIlxuXG5cbiIKICAgICA7CiAJKi8KIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWlzYy9jcnlwdC9jcnlwdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjExICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE5IDE4OjAwOjI4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL2NyeXB0L2NyeXB0X2FyZ2Noay5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfYXJnY2hrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5YzZjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X2FyZ2Noay5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKyNpbmNsdWRlIDxzaWduYWwuaD4KKworLyoqCisgIEBmaWxlIGNyeXB0X2FyZ2Noay5jCisgIFBlcmZvcm0gYXJndW1lbnQgY2hlY2tpbmcsIFRvbSBTdCBEZW5pcworKi8gIAorCisjaWYgKEFSR1RZUEUgPT0gMCkKK3ZvaWQgY3J5cHRfYXJnY2hrKGNoYXIgKnYsIGNoYXIgKnMsIGludCBkKQoreworIGZwcmludGYoc3RkZXJyLCAiTFRDX0FSR0NISyAnJXMnIGZhaWx1cmUgb24gbGluZSAlZCBvZiBmaWxlICVzXG4iLAorICAgICAgICAgdiwgZCwgcyk7CisgKHZvaWQpcmFpc2UoU0lHQUJSVCk7Cit9CisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21pc2MvY3J5cHQvY3J5cHRfYXJnY2hrLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbWlzYy9jcnlwdC9jcnlwdF9jaXBoZXJfZGVzY3JpcHRvci5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfY2lwaGVyX2Rlc2NyaXB0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjdlODVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfY2lwaGVyX2Rlc2NyaXB0b3IuYwpAQCAtMCwwICsxLDI3IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBjcnlwdF9jaXBoZXJfZGVzY3JpcHRvci5jCisgIFN0b3JlcyB0aGUgY2lwaGVyIGRlc2NyaXB0b3IgdGFibGUsIFRvbSBTdCBEZW5pcworKi8KKworc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvciBjaXBoZXJfZGVzY3JpcHRvcltUQUJfU0laRV0gPSB7Cit7IE5VTEwsIDAsIDAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfQorIH07CisKK0xUQ19NVVRFWF9HTE9CQUwobHRjX2NpcGhlcl9tdXRleCk7CisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21pc2MvY3J5cHQvY3J5cHRfY2lwaGVyX2Rlc2NyaXB0b3IuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS44ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE5IDE4OjAwOjI4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL2NyeXB0L2NyeXB0X2NpcGhlcl9pc192YWxpZC5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfY2lwaGVyX2lzX3ZhbGlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzMDMwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X2NpcGhlcl9pc192YWxpZC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGNyeXB0X2NpcGhlcl9pc192YWxpZC5jCisgIERldGVybWluZSBpZiBjaXBoZXIgaXMgdmFsaWQsIFRvbSBTdCBEZW5pcworKi8KKworLyoKKyAgIFRlc3QgaWYgYSBjaXBoZXIgaW5kZXggaXMgdmFsaWQKKyAgIEBwYXJhbSBpZHggICBUaGUgaW5kZXggb2YgdGhlIGNpcGhlciB0byBzZWFyY2ggZm9yCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHZhbGlkCisqLworaW50IGNpcGhlcl9pc192YWxpZChpbnQgaWR4KQoreworICAgTFRDX01VVEVYX0xPQ0soJmx0Y19jaXBoZXJfbXV0ZXgpOworICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IFRBQl9TSVpFIHx8IGNpcGhlcl9kZXNjcmlwdG9yW2lkeF0ubmFtZSA9PSBOVUxMKSB7CisgICAgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfY2lwaGVyX211dGV4KTsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0NJUEhFUjsKKyAgIH0KKyAgIExUQ19NVVRFWF9VTkxPQ0soJmx0Y19jaXBoZXJfbXV0ZXgpOworICAgcmV0dXJuIENSWVBUX09LOworfQorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWlzYy9jcnlwdC9jcnlwdF9jaXBoZXJfaXNfdmFsaWQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE5IDE4OjAwOjI4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfY2lwaGVyLmMgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2NpcGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmJhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2NpcGhlci5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGNyeXB0X2ZpbmRfY2lwaGVyLmMKKyAgRmluZCBhIGNpcGhlciBpbiB0aGUgZGVzY3JpcHRvciB0YWJsZXMsIFRvbSBTdCBEZW5pcworKi8KKworLyoqCisgICBGaW5kIGEgcmVnaXN0ZXJlZCBjaXBoZXIgYnkgbmFtZQorICAgQHBhcmFtIG5hbWUgICBUaGUgbmFtZSBvZiB0aGUgY2lwaGVyIHRvIGxvb2sgZm9yCisgICBAcmV0dXJuID49IDAgaWYgZm91bmQsIC0xIGlmIG5vdCBwcmVzZW50CisqLworaW50IGZpbmRfY2lwaGVyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICBpbnQgeDsKKyAgIExUQ19BUkdDSEsobmFtZSAhPSBOVUxMKTsKKyAgIExUQ19NVVRFWF9MT0NLKCZsdGNfY2lwaGVyX211dGV4KTsKKyAgIGZvciAoeCA9IDA7IHggPCBUQUJfU0laRTsgeCsrKSB7CisgICAgICAgaWYgKGNpcGhlcl9kZXNjcmlwdG9yW3hdLm5hbWUgIT0gTlVMTCAmJiAhc3RyY21wKGNpcGhlcl9kZXNjcmlwdG9yW3hdLm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX2NpcGhlcl9tdXRleCk7CisgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgfQorICAgfQorICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX2NpcGhlcl9tdXRleCk7CisgICByZXR1cm4gLTE7Cit9CisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXIuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE5IDE4OjAwOjI4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfY2lwaGVyX2FueS5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXJfYW55LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkMGU2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfY2lwaGVyX2FueS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGNyeXB0X2ZpbmRfY2lwaGVyX2FueS5jCisgIEZpbmQgYSBjaXBoZXIgaW4gdGhlIGRlc2NyaXB0b3IgdGFibGVzLCBUb20gU3QgRGVuaXMKKyovCisKKy8qKgorICAgRmluZCBhIGNpcGhlciBmbGV4aWJseS4gIEZpcnN0IGJ5IG5hbWUgdGhlbiBpZiBub3QgcHJlc2VudCBieSBibG9jayBhbmQga2V5IHNpemUgCisgICBAcGFyYW0gbmFtZSAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNpcGhlciBkZXNpcmVkCisgICBAcGFyYW0gYmxvY2tsZW4gICAgVGhlIG1pbmltdW0gbGVuZ3RoIG9mIHRoZSBibG9jayBjaXBoZXIgZGVzaXJlZCAob2N0ZXRzKQorICAgQHBhcmFtIGtleWxlbiAgICAgIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUga2V5IHNpemUgZGVzaXJlZCAob2N0ZXRzKQorICAgQHJldHVybiA+PSAwIGlmIGZvdW5kLCAtMSBpZiBub3QgcHJlc2VudAorKi8KK2ludCBmaW5kX2NpcGhlcl9hbnkoY29uc3QgY2hhciAqbmFtZSwgaW50IGJsb2NrbGVuLCBpbnQga2V5bGVuKQoreworICAgaW50IHg7CisKKyAgIExUQ19BUkdDSEsobmFtZSAhPSBOVUxMKTsKKworICAgeCA9IGZpbmRfY2lwaGVyKG5hbWUpOworICAgaWYgKHggIT0gLTEpIHJldHVybiB4OworCisgICBMVENfTVVURVhfTE9DSygmbHRjX2NpcGhlcl9tdXRleCk7CisgICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgeworICAgICAgIGlmIChjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICB9CisgICAgICAgaWYgKGJsb2NrbGVuIDw9IChpbnQpY2lwaGVyX2Rlc2NyaXB0b3JbeF0uYmxvY2tfbGVuZ3RoICYmIGtleWxlbiA8PSAoaW50KWNpcGhlcl9kZXNjcmlwdG9yW3hdLm1heF9rZXlfbGVuZ3RoKSB7CisgICAgICAgICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX2NpcGhlcl9tdXRleCk7CisgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgfQorICAgfQorICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX2NpcGhlcl9tdXRleCk7CisgICByZXR1cm4gLTE7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfY2lwaGVyX2FueS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTg6MDA6MjggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9jaXBoZXJfaWQuYyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfY2lwaGVyX2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1Zjg3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfY2lwaGVyX2lkLmMKQEAgLTAsMCArMSw0MCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY3J5cHRfZmluZF9jaXBoZXJfaWQuYworICBGaW5kIGNpcGhlciBieSBJRCwgVG9tIFN0IERlbmlzCisqLworCisvKioKKyAgIEZpbmQgYSBjaXBoZXIgYnkgSUQgbnVtYmVyCisgICBAcGFyYW0gSUQgICAgVGhlIElEIChub3Qgc2FtZSBhcyBpbmRleCkgb2YgdGhlIGNpcGhlciB0byBmaW5kCisgICBAcmV0dXJuID49IDAgaWYgZm91bmQsIC0xIGlmIG5vdCBwcmVzZW50CisqLworaW50IGZpbmRfY2lwaGVyX2lkKHVuc2lnbmVkIGNoYXIgSUQpCit7CisgICBpbnQgeDsKKyAgIExUQ19NVVRFWF9MT0NLKCZsdGNfY2lwaGVyX211dGV4KTsKKyAgIGZvciAoeCA9IDA7IHggPCBUQUJfU0laRTsgeCsrKSB7CisgICAgICAgaWYgKGNpcGhlcl9kZXNjcmlwdG9yW3hdLklEID09IElEKSB7CisgICAgICAgICAgeCA9IChjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lID09IE5VTEwpID8gLTEgOiB4OworICAgICAgICAgIExUQ19NVVRFWF9VTkxPQ0soJmx0Y19jaXBoZXJfbXV0ZXgpOworICAgICAgICAgIHJldHVybiB4OworICAgICAgIH0KKyAgIH0KKyAgIExUQ19NVVRFWF9VTkxPQ0soJmx0Y19jaXBoZXJfbXV0ZXgpOworICAgcmV0dXJuIC0xOworfQorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2NpcGhlcl9pZC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTg6MDA6MjggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9oYXNoLmMgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDJhNDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9oYXNoLmMKQEAgLTAsMCArMSw0MCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY3J5cHRfZmluZF9oYXNoLmMKKyAgRmluZCBhIGhhc2gsIFRvbSBTdCBEZW5pcworKi8KKworLyoqCisgICBGaW5kIGEgcmVnaXN0ZXJlZCBoYXNoIGJ5IG5hbWUKKyAgIEBwYXJhbSBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIGhhc2ggdG8gbG9vayBmb3IKKyAgIEByZXR1cm4gPj0gMCBpZiBmb3VuZCwgLTEgaWYgbm90IHByZXNlbnQKKyovCitpbnQgZmluZF9oYXNoKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICBpbnQgeDsKKyAgIExUQ19BUkdDSEsobmFtZSAhPSBOVUxMKTsKKyAgIExUQ19NVVRFWF9MT0NLKCZsdGNfaGFzaF9tdXRleCk7CisgICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgeworICAgICAgIGlmIChoYXNoX2Rlc2NyaXB0b3JbeF0ubmFtZSAhPSBOVUxMICYmIHN0cmNtcChoYXNoX2Rlc2NyaXB0b3JbeF0ubmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgIExUQ19NVVRFWF9VTkxPQ0soJmx0Y19oYXNoX211dGV4KTsKKyAgICAgICAgICByZXR1cm4geDsKKyAgICAgICB9CisgICB9CisgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfaGFzaF9tdXRleCk7CisgICByZXR1cm4gLTE7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfaGFzaC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTg6MDA6MjggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9oYXNoX2FueS5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9oYXNoX2FueS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzJmMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2hhc2hfYW55LmMKQEAgLTAsMCArMSw0OSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY3J5cHRfZmluZF9oYXNoX2FueS5jCisgIEZpbmQgYSBoYXNoLCBUb20gU3QgRGVuaXMKKyovCisKKy8qKgorICAgRmluZCBhIGhhc2ggZmxleGlibHkuICBGaXJzdCBieSBuYW1lIHRoZW4gaWYgbm90IHByZXNlbnQgYnkgZGlnZXN0IHNpemUgCisgICBAcGFyYW0gbmFtZSAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGhhc2ggZGVzaXJlZAorICAgQHBhcmFtIGRpZ2VzdGxlbiAgIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgZGlnZXN0IHNpemUgKG9jdGV0cykKKyAgIEByZXR1cm4gPj0gMCBpZiBmb3VuZCwgLTEgaWYgbm90IHByZXNlbnQKKyovaW50IGZpbmRfaGFzaF9hbnkoY29uc3QgY2hhciAqbmFtZSwgaW50IGRpZ2VzdGxlbikKK3sKKyAgIGludCB4LCB5LCB6OworICAgTFRDX0FSR0NISyhuYW1lICE9IE5VTEwpOworCisgICB4ID0gZmluZF9oYXNoKG5hbWUpOworICAgaWYgKHggIT0gLTEpIHJldHVybiB4OworCisgICBMVENfTVVURVhfTE9DSygmbHRjX2hhc2hfbXV0ZXgpOworICAgeSA9IE1BWEJMT0NLU0laRSsxOworICAgeiA9IC0xOworICAgZm9yICh4ID0gMDsgeCA8IFRBQl9TSVpFOyB4KyspIHsKKyAgICAgICBpZiAoaGFzaF9kZXNjcmlwdG9yW3hdLm5hbWUgPT0gTlVMTCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgIH0KKyAgICAgICBpZiAoKGludCloYXNoX2Rlc2NyaXB0b3JbeF0uaGFzaHNpemUgPj0gZGlnZXN0bGVuICYmIChpbnQpaGFzaF9kZXNjcmlwdG9yW3hdLmhhc2hzaXplIDwgeSkgeworICAgICAgICAgIHogPSB4OworICAgICAgICAgIHkgPSBoYXNoX2Rlc2NyaXB0b3JbeF0uaGFzaHNpemU7CisgICAgICAgfQorICAgfQorICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX2hhc2hfbXV0ZXgpOworICAgcmV0dXJuIHo7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfaGFzaF9hbnkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE5IDE4OjAwOjI4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfaGFzaF9pZC5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9oYXNoX2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkMGQzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfaGFzaF9pZC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGNyeXB0X2ZpbmRfaGFzaF9pZC5jCisgIEZpbmQgaGFzaCBieSBJRCwgVG9tIFN0IERlbmlzCisqLworCisvKioKKyAgIEZpbmQgYSBoYXNoIGJ5IElEIG51bWJlcgorICAgQHBhcmFtIElEICAgIFRoZSBJRCAobm90IHNhbWUgYXMgaW5kZXgpIG9mIHRoZSBoYXNoIHRvIGZpbmQKKyAgIEByZXR1cm4gPj0gMCBpZiBmb3VuZCwgLTEgaWYgbm90IHByZXNlbnQKKyovCitpbnQgZmluZF9oYXNoX2lkKHVuc2lnbmVkIGNoYXIgSUQpCit7CisgICBpbnQgeDsKKyAgIExUQ19NVVRFWF9MT0NLKCZsdGNfaGFzaF9tdXRleCk7CisgICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgeworICAgICAgaWYgKGhhc2hfZGVzY3JpcHRvclt4XS5JRCA9PSBJRCkgeworICAgICAgICAgIHggPSAoaGFzaF9kZXNjcmlwdG9yW3hdLm5hbWUgPT0gTlVMTCkgPyAtMSA6IHg7CisgICAgICAgICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX2hhc2hfbXV0ZXgpOworICAgICAgICAgIHJldHVybiB4OworICAgICAgfQorICAgfQorICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX2hhc2hfbXV0ZXgpOworICAgcmV0dXJuIC0xOworfQorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWlzYy9jcnlwdC9jcnlwdF9maW5kX2hhc2hfaWQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE5IDE4OjAzOjI1ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfcHJuZy5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9wcm5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzODEzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X2ZpbmRfcHJuZy5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGNyeXB0X2ZpbmRfcHJuZy5jCisgIEZpbmQgYSBQUk5HLCBUb20gU3QgRGVuaXMKKyovCisKKy8qKgorICAgRmluZCBhIHJlZ2lzdGVyZWQgUFJORyBieSBuYW1lCisgICBAcGFyYW0gbmFtZSAgIFRoZSBuYW1lIG9mIHRoZSBQUk5HIHRvIGxvb2sgZm9yCisgICBAcmV0dXJuID49IDAgaWYgZm91bmQsIC0xIGlmIG5vdCBwcmVzZW50CisqLworaW50IGZpbmRfcHJuZyhjb25zdCBjaGFyICpuYW1lKQoreworICAgaW50IHg7CisgICBMVENfQVJHQ0hLKG5hbWUgIT0gTlVMTCk7CisgICBMVENfTVVURVhfTE9DSygmbHRjX3BybmdfbXV0ZXgpOworICAgZm9yICh4ID0gMDsgeCA8IFRBQl9TSVpFOyB4KyspIHsKKyAgICAgICBpZiAoKHBybmdfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEwpICYmIHN0cmNtcChwcm5nX2Rlc2NyaXB0b3JbeF0ubmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgIExUQ19NVVRFWF9VTkxPQ0soJmx0Y19wcm5nX211dGV4KTsKKyAgICAgICAgICByZXR1cm4geDsKKyAgICAgICB9CisgICB9CisgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfcHJuZ19tdXRleCk7CisgICByZXR1cm4gLTE7Cit9CisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21pc2MvY3J5cHQvY3J5cHRfZmluZF9wcm5nLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOSAxODowMDoyOCAkICovCmRpZmYgLS1naXQgYS9zcmMvbWlzYy9jcnlwdC9jcnlwdF9oYXNoX2Rlc2NyaXB0b3IuYyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X2hhc2hfZGVzY3JpcHRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NTgzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF9oYXNoX2Rlc2NyaXB0b3IuYwpAQCAtMCwwICsxLDI3IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBjcnlwdF9oYXNoX2Rlc2NyaXB0b3IuYworICBTdG9yZXMgdGhlIGhhc2ggZGVzY3JpcHRvciB0YWJsZSwgVG9tIFN0IERlbmlzICAKKyovCisKK3N0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yIGhhc2hfZGVzY3JpcHRvcltUQUJfU0laRV0gPSB7Cit7IE5VTEwsIDAsIDAsIDAsIHsgMCB9LCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKK0xUQ19NVVRFWF9HTE9CQUwobHRjX2hhc2hfbXV0ZXgpOworCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X2hhc2hfZGVzY3JpcHRvci5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjYgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTg6MDA6MjggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21pc2MvY3J5cHQvY3J5cHRfaGFzaF9pc192YWxpZC5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfaGFzaF9pc192YWxpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTMwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF9oYXNoX2lzX3ZhbGlkLmMKQEAgLTAsMCArMSwzNiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY3J5cHRfaGFzaF9pc192YWxpZC5jCisgIERldGVybWluZSBpZiBoYXNoIGlzIHZhbGlkLCBUb20gU3QgRGVuaXMKKyovICAKKworLyoKKyAgIFRlc3QgaWYgYSBoYXNoIGluZGV4IGlzIHZhbGlkCisgICBAcGFyYW0gaWR4ICAgVGhlIGluZGV4IG9mIHRoZSBoYXNoIHRvIHNlYXJjaCBmb3IKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgdmFsaWQKKyovCitpbnQgaGFzaF9pc192YWxpZChpbnQgaWR4KQoreworICAgTFRDX01VVEVYX0xPQ0soJmx0Y19oYXNoX211dGV4KTsKKyAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBUQUJfU0laRSB8fCBoYXNoX2Rlc2NyaXB0b3JbaWR4XS5uYW1lID09IE5VTEwpIHsKKyAgICAgIExUQ19NVVRFWF9VTkxPQ0soJmx0Y19oYXNoX211dGV4KTsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0hBU0g7CisgICB9CisgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfaGFzaF9tdXRleCk7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X2hhc2hfaXNfdmFsaWQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE5IDE4OjAwOjI4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL2NyeXB0L2NyeXB0X3BybmdfZGVzY3JpcHRvci5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfcHJuZ19kZXNjcmlwdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzNWY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X3BybmdfZGVzY3JpcHRvci5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGNyeXB0X3BybmdfZGVzY3JpcHRvci5jCisgIFN0b3JlcyB0aGUgUFJORyBkZXNjcmlwdG9ycywgVG9tIFN0IERlbmlzCisqLyAgCitzdHJ1Y3QgbHRjX3BybmdfZGVzY3JpcHRvciBwcm5nX2Rlc2NyaXB0b3JbVEFCX1NJWkVdID0geworeyBOVUxMLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0KK307CisKK0xUQ19NVVRFWF9HTE9CQUwobHRjX3BybmdfbXV0ZXgpOworCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X3BybmdfZGVzY3JpcHRvci5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjUgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTg6MDA6MjggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21pc2MvY3J5cHQvY3J5cHRfcHJuZ19pc192YWxpZC5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfcHJuZ19pc192YWxpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YTdlZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF9wcm5nX2lzX3ZhbGlkLmMKQEAgLTAsMCArMSwzNiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY3J5cHRfcHJuZ19pc192YWxpZC5jCisgIERldGVybWluZSBpZiBQUk5HIGlzIHZhbGlkLCBUb20gU3QgRGVuaXMKKyovCisKKy8qCisgICBUZXN0IGlmIGEgUFJORyBpbmRleCBpcyB2YWxpZAorICAgQHBhcmFtIGlkeCAgIFRoZSBpbmRleCBvZiB0aGUgUFJORyB0byBzZWFyY2ggZm9yCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHZhbGlkCisqLworaW50IHBybmdfaXNfdmFsaWQoaW50IGlkeCkKK3sKKyAgIExUQ19NVVRFWF9MT0NLKCZsdGNfcHJuZ19tdXRleCk7CisgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gVEFCX1NJWkUgfHwgcHJuZ19kZXNjcmlwdG9yW2lkeF0ubmFtZSA9PSBOVUxMKSB7CisgICAgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfcHJuZ19tdXRleCk7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QUk5HOworICAgfQorICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX3BybmdfbXV0ZXgpOworICAgcmV0dXJuIENSWVBUX09LOworfQorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbWlzYy9jcnlwdC9jcnlwdF9wcm5nX2lzX3ZhbGlkLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOSAxODowMDoyOCAkICovCmRpZmYgLS1naXQgYS9zcmMvbWlzYy9jcnlwdC9jcnlwdF9yZWdpc3Rlcl9jaXBoZXIuYyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X3JlZ2lzdGVyX2NpcGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NWQ3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF9yZWdpc3Rlcl9jaXBoZXIuYwpAQCAtMCwwICsxLDU0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBjcnlwdF9yZWdpc3Rlcl9jaXBoZXIuYworICBSZWdpc3RlciBhIGNpcGhlciwgVG9tIFN0IERlbmlzCisqLworCisvKioKKyAgIFJlZ2lzdGVyIGEgY2lwaGVyIHdpdGggdGhlIGRlc2NyaXB0b3IgdGFibGUKKyAgIEBwYXJhbSBjaXBoZXIgICBUaGUgY2lwaGVyIHlvdSB3aXNoIHRvIHJlZ2lzdGVyCisgICBAcmV0dXJuIHZhbHVlID49IDAgaWYgc3VjY2Vzc2Z1bGx5IGFkZGVkIChvciBhbHJlYWR5IHByZXNlbnQpLCAtMSBpZiB1bnN1Y2Nlc3NmdWwKKyovCitpbnQgcmVnaXN0ZXJfY2lwaGVyKGNvbnN0IHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IgKmNpcGhlcikKK3sKKyAgIGludCB4OworCisgICBMVENfQVJHQ0hLKGNpcGhlciAhPSBOVUxMKTsKKworICAgLyogaXMgaXQgYWxyZWFkeSByZWdpc3RlcmVkPyAqLworICAgTFRDX01VVEVYX0xPQ0soJmx0Y19jaXBoZXJfbXV0ZXgpOworICAgZm9yICh4ID0gMDsgeCA8IFRBQl9TSVpFOyB4KyspIHsKKyAgICAgICBpZiAoY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSAhPSBOVUxMICYmIGNpcGhlcl9kZXNjcmlwdG9yW3hdLklEID09IGNpcGhlci0+SUQpIHsKKyAgICAgICAgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfY2lwaGVyX211dGV4KTsKKyAgICAgICAgICByZXR1cm4geDsKKyAgICAgICB9CisgICB9CisKKyAgIC8qIGZpbmQgYSBibGFuayBzcG90ICovCisgICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgeworICAgICAgIGlmIChjaXBoZXJfZGVzY3JpcHRvclt4XS5uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICBYTUVNQ1BZKCZjaXBoZXJfZGVzY3JpcHRvclt4XSwgY2lwaGVyLCBzaXplb2Yoc3RydWN0IGx0Y19jaXBoZXJfZGVzY3JpcHRvcikpOworICAgICAgICAgIExUQ19NVVRFWF9VTkxPQ0soJmx0Y19jaXBoZXJfbXV0ZXgpOworICAgICAgICAgIHJldHVybiB4OworICAgICAgIH0KKyAgIH0KKworICAgLyogbm8gc3BvdCAqLworICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX2NpcGhlcl9tdXRleCk7CisgICByZXR1cm4gLTE7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X3JlZ2lzdGVyX2NpcGhlci5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTg6MDA6MjggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21pc2MvY3J5cHQvY3J5cHRfcmVnaXN0ZXJfaGFzaC5jIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfcmVnaXN0ZXJfaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZjUyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF9yZWdpc3Rlcl9oYXNoLmMKQEAgLTAsMCArMSw1NCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY3J5cHRfcmVnaXN0ZXJfaGFzaC5jCisgIFJlZ2lzdGVyIGEgSEFTSCwgVG9tIFN0IERlbmlzCisqLworCisvKioKKyAgIFJlZ2lzdGVyIGEgaGFzaCB3aXRoIHRoZSBkZXNjcmlwdG9yIHRhYmxlCisgICBAcGFyYW0gaGFzaCAgIFRoZSBoYXNoIHlvdSB3aXNoIHRvIHJlZ2lzdGVyCisgICBAcmV0dXJuIHZhbHVlID49IDAgaWYgc3VjY2Vzc2Z1bGx5IGFkZGVkIChvciBhbHJlYWR5IHByZXNlbnQpLCAtMSBpZiB1bnN1Y2Nlc3NmdWwKKyovCitpbnQgcmVnaXN0ZXJfaGFzaChjb25zdCBzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvciAqaGFzaCkKK3sKKyAgIGludCB4OworCisgICBMVENfQVJHQ0hLKGhhc2ggIT0gTlVMTCk7CisKKyAgIC8qIGlzIGl0IGFscmVhZHkgcmVnaXN0ZXJlZD8gKi8KKyAgIExUQ19NVVRFWF9MT0NLKCZsdGNfaGFzaF9tdXRleCk7CisgICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgeworICAgICAgIGlmIChtZW1jbXAoJmhhc2hfZGVzY3JpcHRvclt4XSwgaGFzaCwgc2l6ZW9mKHN0cnVjdCBsdGNfaGFzaF9kZXNjcmlwdG9yKSkgPT0gMCkgeworICAgICAgICAgIExUQ19NVVRFWF9VTkxPQ0soJmx0Y19oYXNoX211dGV4KTsKKyAgICAgICAgICByZXR1cm4geDsKKyAgICAgICB9CisgICB9CisKKyAgIC8qIGZpbmQgYSBibGFuayBzcG90ICovCisgICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgeworICAgICAgIGlmIChoYXNoX2Rlc2NyaXB0b3JbeF0ubmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgWE1FTUNQWSgmaGFzaF9kZXNjcmlwdG9yW3hdLCBoYXNoLCBzaXplb2Yoc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfaGFzaF9tdXRleCk7CisgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgfQorICAgfQorCisgICAvKiBubyBzcG90ICovCisgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfaGFzaF9tdXRleCk7CisgICByZXR1cm4gLTE7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X3JlZ2lzdGVyX2hhc2guYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE5IDE4OjAwOjI4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL2NyeXB0L2NyeXB0X3JlZ2lzdGVyX3BybmcuYyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X3JlZ2lzdGVyX3BybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWI0YTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfcmVnaXN0ZXJfcHJuZy5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGNyeXB0X3JlZ2lzdGVyX3BybmcuYworICBSZWdpc3RlciBhIFBSTkcsIFRvbSBTdCBEZW5pcworKi8KKyAgCisvKioKKyAgIFJlZ2lzdGVyIGEgUFJORyB3aXRoIHRoZSBkZXNjcmlwdG9yIHRhYmxlCisgICBAcGFyYW0gcHJuZyAgIFRoZSBQUk5HIHlvdSB3aXNoIHRvIHJlZ2lzdGVyCisgICBAcmV0dXJuIHZhbHVlID49IDAgaWYgc3VjY2Vzc2Z1bGx5IGFkZGVkIChvciBhbHJlYWR5IHByZXNlbnQpLCAtMSBpZiB1bnN1Y2Nlc3NmdWwKKyovCitpbnQgcmVnaXN0ZXJfcHJuZyhjb25zdCBzdHJ1Y3QgbHRjX3BybmdfZGVzY3JpcHRvciAqcHJuZykKK3sKKyAgIGludCB4OworCisgICBMVENfQVJHQ0hLKHBybmcgIT0gTlVMTCk7CisKKyAgIC8qIGlzIGl0IGFscmVhZHkgcmVnaXN0ZXJlZD8gKi8KKyAgIExUQ19NVVRFWF9MT0NLKCZsdGNfcHJuZ19tdXRleCk7CisgICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgeworICAgICAgIGlmIChtZW1jbXAoJnBybmdfZGVzY3JpcHRvclt4XSwgcHJuZywgc2l6ZW9mKHN0cnVjdCBsdGNfcHJuZ19kZXNjcmlwdG9yKSkgPT0gMCkgeworICAgICAgICAgIExUQ19NVVRFWF9VTkxPQ0soJmx0Y19wcm5nX211dGV4KTsKKyAgICAgICAgICByZXR1cm4geDsKKyAgICAgICB9CisgICB9CisKKyAgIC8qIGZpbmQgYSBibGFuayBzcG90ICovCisgICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgeworICAgICAgIGlmIChwcm5nX2Rlc2NyaXB0b3JbeF0ubmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgWE1FTUNQWSgmcHJuZ19kZXNjcmlwdG9yW3hdLCBwcm5nLCBzaXplb2Yoc3RydWN0IGx0Y19wcm5nX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfcHJuZ19tdXRleCk7CisgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgfQorICAgfQorCisgICAvKiBubyBzcG90ICovCisgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfcHJuZ19tdXRleCk7CisgICByZXR1cm4gLTE7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X3JlZ2lzdGVyX3BybmcuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE5IDE4OjAwOjI4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL2NyeXB0L2NyeXB0X3VucmVnaXN0ZXJfY2lwaGVyLmMgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF91bnJlZ2lzdGVyX2NpcGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODFjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF91bnJlZ2lzdGVyX2NpcGhlci5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGNyeXB0X3VucmVnaXN0ZXJfY2lwaGVyLmMKKyAgVW5yZWdpc3RlciBhIGNpcGhlciwgVG9tIFN0IERlbmlzCisqLworCisvKioKKyAgVW5yZWdpc3RlciBhIGNpcGhlciBmcm9tIHRoZSBkZXNjcmlwdG9yIHRhYmxlCisgIEBwYXJhbSBjaXBoZXIgICBUaGUgY2lwaGVyIGRlc2NyaXB0b3IgdG8gcmVtb3ZlCisgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjY2VzcworKi8KK2ludCB1bnJlZ2lzdGVyX2NpcGhlcihjb25zdCBzdHJ1Y3QgbHRjX2NpcGhlcl9kZXNjcmlwdG9yICpjaXBoZXIpCit7CisgICBpbnQgeDsKKworICAgTFRDX0FSR0NISyhjaXBoZXIgIT0gTlVMTCk7CisKKyAgIC8qIGlzIGl0IGFscmVhZHkgcmVnaXN0ZXJlZD8gKi8KKyAgIExUQ19NVVRFWF9MT0NLKCZsdGNfY2lwaGVyX211dGV4KTsKKyAgIGZvciAoeCA9IDA7IHggPCBUQUJfU0laRTsgeCsrKSB7CisgICAgICAgaWYgKG1lbWNtcCgmY2lwaGVyX2Rlc2NyaXB0b3JbeF0sIGNpcGhlciwgc2l6ZW9mKHN0cnVjdCBsdGNfY2lwaGVyX2Rlc2NyaXB0b3IpKSA9PSAwKSB7CisgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSA9IE5VTEw7CisgICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbeF0uSUQgICA9IDI1NTsKKyAgICAgICAgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfY2lwaGVyX211dGV4KTsKKyAgICAgICAgICByZXR1cm4gQ1JZUFRfT0s7CisgICAgICAgfQorICAgfQorICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX2NpcGhlcl9tdXRleCk7CisgICByZXR1cm4gQ1JZUFRfRVJST1I7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X3VucmVnaXN0ZXJfY2lwaGVyLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOSAxODowMDoyOCAkICovCmRpZmYgLS1naXQgYS9zcmMvbWlzYy9jcnlwdC9jcnlwdF91bnJlZ2lzdGVyX2hhc2guYyBiL3NyYy9taXNjL2NyeXB0L2NyeXB0X3VucmVnaXN0ZXJfaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDI1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF91bnJlZ2lzdGVyX2hhc2guYwpAQCAtMCwwICsxLDQ0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBjcnlwdF91bnJlZ2lzdGVyX2hhc2guYworICBVbnJlZ2lzdGVyIGEgaGFzaCwgVG9tIFN0IERlbmlzCisqLworCisvKioKKyAgVW5yZWdpc3RlciBhIGhhc2ggZnJvbSB0aGUgZGVzY3JpcHRvciB0YWJsZQorICBAcGFyYW0gaGFzaCAgIFRoZSBoYXNoIGRlc2NyaXB0b3IgdG8gcmVtb3ZlCisgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjY2VzcworKi8KK2ludCB1bnJlZ2lzdGVyX2hhc2goY29uc3Qgc3RydWN0IGx0Y19oYXNoX2Rlc2NyaXB0b3IgKmhhc2gpCit7CisgICBpbnQgeDsKKworICAgTFRDX0FSR0NISyhoYXNoICE9IE5VTEwpOworCisgICAvKiBpcyBpdCBhbHJlYWR5IHJlZ2lzdGVyZWQ/ICovCisgICBMVENfTVVURVhfTE9DSygmbHRjX2hhc2hfbXV0ZXgpOworICAgZm9yICh4ID0gMDsgeCA8IFRBQl9TSVpFOyB4KyspIHsKKyAgICAgICBpZiAobWVtY21wKCZoYXNoX2Rlc2NyaXB0b3JbeF0sIGhhc2gsIHNpemVvZihzdHJ1Y3QgbHRjX2hhc2hfZGVzY3JpcHRvcikpID09IDApIHsKKyAgICAgICAgICBoYXNoX2Rlc2NyaXB0b3JbeF0ubmFtZSA9IE5VTEw7CisgICAgICAgICAgTFRDX01VVEVYX1VOTE9DSygmbHRjX2hhc2hfbXV0ZXgpOworICAgICAgICAgIHJldHVybiBDUllQVF9PSzsKKyAgICAgICB9CisgICB9CisgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfaGFzaF9tdXRleCk7CisgICByZXR1cm4gQ1JZUFRfRVJST1I7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2NyeXB0L2NyeXB0X3VucmVnaXN0ZXJfaGFzaC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTg6MDA6MjggJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21pc2MvY3J5cHQvY3J5cHRfdW5yZWdpc3Rlcl9wcm5nLmMgYi9zcmMvbWlzYy9jcnlwdC9jcnlwdF91bnJlZ2lzdGVyX3BybmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWZmNmRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21pc2MvY3J5cHQvY3J5cHRfdW5yZWdpc3Rlcl9wcm5nLmMKQEAgLTAsMCArMSw0NCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY3J5cHRfdW5yZWdpc3Rlcl9wcm5nLmMKKyAgVW5yZWdpc3RlciBhIFBSTkcsIFRvbSBTdCBEZW5pcworKi8KKworLyoqCisgIFVucmVnaXN0ZXIgYSBQUk5HIGZyb20gdGhlIGRlc2NyaXB0b3IgdGFibGUKKyAgQHBhcmFtIHBybmcgICBUaGUgUFJORyBkZXNjcmlwdG9yIHRvIHJlbW92ZQorICBAcmV0dXJuIENSWVBUX09LIG9uIHN1Y2Nlc3MKKyovCitpbnQgdW5yZWdpc3Rlcl9wcm5nKGNvbnN0IHN0cnVjdCBsdGNfcHJuZ19kZXNjcmlwdG9yICpwcm5nKQoreworICAgaW50IHg7CisKKyAgIExUQ19BUkdDSEsocHJuZyAhPSBOVUxMKTsKKyAKKyAgIC8qIGlzIGl0IGFscmVhZHkgcmVnaXN0ZXJlZD8gKi8KKyAgIExUQ19NVVRFWF9MT0NLKCZsdGNfcHJuZ19tdXRleCk7CisgICBmb3IgKHggPSAwOyB4IDwgVEFCX1NJWkU7IHgrKykgeworICAgICAgIGlmIChtZW1jbXAoJnBybmdfZGVzY3JpcHRvclt4XSwgcHJuZywgc2l6ZW9mKHN0cnVjdCBsdGNfcHJuZ19kZXNjcmlwdG9yKSkgIT0gMCkgeworICAgICAgICAgIHBybmdfZGVzY3JpcHRvclt4XS5uYW1lID0gTlVMTDsKKyAgICAgICAgICBMVENfTVVURVhfVU5MT0NLKCZsdGNfcHJuZ19tdXRleCk7CisgICAgICAgICAgcmV0dXJuIENSWVBUX09LOworICAgICAgIH0KKyAgIH0KKyAgIExUQ19NVVRFWF9VTkxPQ0soJmx0Y19wcm5nX211dGV4KTsKKyAgIHJldHVybiBDUllQVF9FUlJPUjsKK30KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21pc2MvY3J5cHQvY3J5cHRfdW5yZWdpc3Rlcl9wcm5nLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOSAxODowMDoyOCAkICovCmRpZmYgLS1naXQgYS9lcnJvcl90b19zdHJpbmcuYyBiL3NyYy9taXNjL2Vycm9yX3RvX3N0cmluZy5jCnNpbWlsYXJpdHkgaW5kZXggNzElCnJlbmFtZSBmcm9tIGVycm9yX3RvX3N0cmluZy5jCnJlbmFtZSB0byBzcmMvbWlzYy9lcnJvcl90b19zdHJpbmcuYwppbmRleCA5YzM4OGZhLi42MTY3YTcwIDEwMDY0NAotLS0gYS9lcnJvcl90b19zdHJpbmcuYworKysgYi9zcmMvbWlzYy9lcnJvcl90b19zdHJpbmcuYwpAQCAtNiwxMCArNiwxNSBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCiAKLSNpbmNsdWRlICJteWNyeXB0LmgiCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGVycm9yX3RvX3N0cmluZy5jCisgIENvbnZlcnQgZXJyb3IgY29kZXMgdG8gQVNDSUkgc3RyaW5ncywgVG9tIFN0IERlbmlzCisqLwogCiBzdGF0aWMgY29uc3QgY2hhciAqZXJyXzJfc3RyW10gPQogewpAQCAtNDksNiArNTQsMTEgQEAKIAogfTsKIAorLyoqCisgICBDb252ZXJ0IGFuIExUQyBlcnJvciBjb2RlIHRvIEFTQ0lJCisgICBAcGFyYW0gZXJyICAgIFRoZSBlcnJvciBjb2RlCisgICBAcmV0dXJuIEEgcG9pbnRlciB0byB0aGUgQVNDSUkgTlVMIHRlcm1pbmF0ZWQgc3RyaW5nIGZvciB0aGUgZXJyb3Igb3IgIkludmFsaWQgZXJyb3IgY29kZS4iIGlmIHRoZSBlcnIgY29kZSB3YXMgbm90IHZhbGlkLgorKi8KIGNvbnN0IGNoYXIgKmVycm9yX3RvX3N0cmluZyhpbnQgZXJyKQogewogICAgaWYgKGVyciA8IDAgfHwgZXJyID49IChpbnQpKHNpemVvZihlcnJfMl9zdHIpL3NpemVvZihlcnJfMl9zdHJbMF0pKSkgewpAQCAtNTgsMyArNjgsNyBAQAogICAgfSAgIAogfQogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL2Vycm9yX3RvX3N0cmluZy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvaXNfcHJpbWUuYyBiL3NyYy9taXNjL21waS9pc19wcmltZS5jCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGlzX3ByaW1lLmMKcmVuYW1lIHRvIHNyYy9taXNjL21waS9pc19wcmltZS5jCmluZGV4IGQ2ZmM4NGUuLjllZTRlZDIgMTAwNjQ0Ci0tLSBhL2lzX3ByaW1lLmMKKysrIGIvc3JjL21pc2MvbXBpL2lzX3ByaW1lLmMKQEAgLTYsOSArNiwxNCBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBpc19wcmltZS5jCisgIERldGVybWluZXMgaWYgaW50ZWdlciBpcyBwcmltZSBmb3IgTFRDLCBUb20gU3QgRGVuaXMKKyovICAKIAogI2lmZGVmIE1QSQogCkBAIC0xNiw4ICsyMSw4IEBACiBpbnQgaXNfcHJpbWUobXBfaW50ICpOLCBpbnQgKnJlc3VsdCkKIHsKICAgIGludCBlcnI7Ci0gICBfQVJHQ0hLKE4gIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKHJlc3VsdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoTiAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocmVzdWx0ICE9IE5VTEwpOwogICAgaWYgKChlcnIgPSBtcF9wcmltZV9pc19wcmltZShOLCBtcF9wcmltZV9yYWJpbl9taWxsZXJfdHJpYWxzKG1wX2NvdW50X2JpdHMoTikpLCByZXN1bHQpKSAhPSBNUF9PS0FZKSB7CiAgICAgICByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwogICAgfQpAQCAtMjUsMyArMzAsNyBAQAogfQogCiAjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21pc2MvbXBpL2lzX3ByaW1lLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbWlzYy9tcGkvbXBpX3RvX2x0Y19lcnJvci5jIGIvc3JjL21pc2MvbXBpL21waV90b19sdGNfZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzM5ZWExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21pc2MvbXBpL21waV90b19sdGNfZXJyb3IuYwpAQCAtMCwwICsxLDQ4IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBtcGlfdG9fbHRjX2Vycm9yLmMKKyAgQ29udmVydCBNUEkgZXJyb3JzIHRvIExUQywgVG9tIFN0IERlbmlzCisqLyAgCisKKyNpZmRlZiBNUEkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGludCBtcGlfY29kZSwgbHRjX2NvZGU7Cit9IG1waV90b19sdGNfY29kZXNbXSA9IHsKKyAgIHsgTVBfT0tBWSAsICBDUllQVF9PS30sCisgICB7IE1QX01FTSAgLCAgQ1JZUFRfTUVNfSwKKyAgIHsgTVBfVkFMICAsICBDUllQVF9JTlZBTElEX0FSR30sCit9OworCisvKioKKyAgIENvbnZlcnQgYSBNUEkgZXJyb3IgdG8gYSBMVEMgZXJyb3IgKFBvc3NpYmx5IHRoZSBtb3N0IHBvd2VyZnVsIGZ1bmN0aW9uIGV2ZXIhICBPaCB3YWl0Li4uIG5vKSAKKyAgIEBwYXJhbSBlcnIgICAgVGhlIGVycm9yIHRvIGNvbnZlcnQKKyAgIEByZXR1cm4gVGhlIGVxdWl2YWxlbnQgTFRDIGVycm9yIGNvZGUgb3IgQ1JZUFRfRVJST1IgaWYgbm9uZSBmb3VuZAorKi8KK2ludCBtcGlfdG9fbHRjX2Vycm9yKGludCBlcnIpCit7CisgICBpbnQgeDsKKworICAgZm9yICh4ID0gMDsgeCA8IChpbnQpKHNpemVvZihtcGlfdG9fbHRjX2NvZGVzKS9zaXplb2YobXBpX3RvX2x0Y19jb2Rlc1swXSkpOyB4KyspIHsKKyAgICAgICBpZiAoZXJyID09IG1waV90b19sdGNfY29kZXNbeF0ubXBpX2NvZGUpIHsgCisgICAgICAgICAgcmV0dXJuIG1waV90b19sdGNfY29kZXNbeF0ubHRjX2NvZGU7CisgICAgICAgfQorICAgfQorICAgcmV0dXJuIENSWVBUX0VSUk9SOworfQorI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21pc2MvbXBpL21waV90b19sdGNfZXJyb3IuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3JhbmRfcHJpbWUuYyBiL3NyYy9taXNjL21waS9yYW5kX3ByaW1lLmMKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gcmFuZF9wcmltZS5jCnJlbmFtZSB0byBzcmMvbWlzYy9tcGkvcmFuZF9wcmltZS5jCmluZGV4IDRlOWNkYmQuLjljNTkyMWEgMTAwNjQ0Ci0tLSBhL3JhbmRfcHJpbWUuYworKysgYi9zcmMvbWlzYy9tcGkvcmFuZF9wcmltZS5jCkBAIC02LDEwICs2LDE0IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAorLyoqCisgIEBmaWxlIHJhbmRfcHJpbWUuYworICBHZW5lcmF0ZSBhIHJhbmRvbSBwcmltZSwgVG9tIFN0IERlbmlzCisqLyAgCiAjaWZkZWYgTVBJCiAKIHN0cnVjdCBybmdfZGF0YSB7CkBAIC0yNyw3ICszMSw3IEBACiAgICBzdHJ1Y3Qgcm5nX2RhdGEgcm5nOwogICAgaW50ICAgICAgICAgICAgIHR5cGUsIGVycjsKIAotICAgX0FSR0NISyhOICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhOICE9IE5VTEwpOwogCiAgICAvKiBhbGxvdyBzaXplcyBiZXR3ZWVuIDIgYW5kIDI1NiBieXRlcyBmb3IgYSBwcmltZSBzaXplICovCiAgICBpZiAobGVuIDwgMTYgfHwgbGVuID4gNDA5NikgeyAKQEAgLTUwLDYgKzU0LDcgQEAKICAgIH0gZWxzZSB7CiAgICAgICB0eXBlID0gMDsKICAgIH0KKyAgdHlwZSB8PSBMVE1fUFJJTUVfMk1TQl9PTjsKIAogICAgLyogTmV3IHByaW1lIGdlbmVyYXRpb24gbWFrZXMgdGhlIGNvZGUgZXZlbiBtb3JlIGNyeXB0b2lzaC1pbnNhbmUuICBEbyB5b3Uga25vdyB3aGF0IHRoaXMgbWVhbnMhISEKICAgICAgIC0tIEdpcjogIFllYWgsIG9oIHdhaXQsIGVyLCBuby4KQEAgLTU5LDMgKzY0LDcgQEAKICAgICAgIAogI2VuZGlmCiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21pc2MvbXBpL3JhbmRfcHJpbWUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL3BrY3M1L3BrY3NfNV8xLmMgYi9zcmMvbWlzYy9wa2NzNS9wa2NzXzVfMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDExYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWlzYy9wa2NzNS9wa2NzXzVfMS5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgPHRvbWNyeXB0Lmg+CisKKy8qKiAKKyAgIEBmaWxlIHBrY3NfNV8xLmMKKyAgIFBLQ1MgIzUsIEFsZ29yaXRobSAjMSwgVG9tIFN0IERlbmlzCisqLworI2lmZGVmIFBLQ1NfNQorLyoqCisgICBFeGVjdXRlIFBLQ1MgIzUgdjEKKyAgIEBwYXJhbSBwYXNzd29yZCAgICAgICAgIFRoZSBwYXNzd29yZCAob3Iga2V5KQorICAgQHBhcmFtIHBhc3N3b3JkX2xlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgcGFzc3dvcmQgKG9jdGV0KQorICAgQHBhcmFtIHNhbHQgICAgICAgICAgICAgVGhlIHNhbHQgKG9yIG5vbmNlKSB3aGljaCBpcyA4IG9jdGV0cyBsb25nCisgICBAcGFyYW0gaXRlcmF0aW9uX2NvdW50ICBUaGUgUEtDUyAjNSB2MSBpdGVyYXRpb24gY291bnQKKyAgIEBwYXJhbSBoYXNoX2lkeCAgICAgICAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCBkZXNpcmVkCisgICBAcGFyYW0gb3V0ICAgICAgICAgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gZm9yIHRoaXMgYWxnb3JpdGhtCisgICBAcGFyYW0gb3V0bGVuICAgICAgICAgICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBhbGdvcml0aG0gb3V0cHV0CisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgcGtjc181X2FsZzEoY29uc3QgdW5zaWduZWQgY2hhciAqcGFzc3dvcmQsIHVuc2lnbmVkIGxvbmcgcGFzc3dvcmRfbGVuLCAKKyAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LCAKKyAgICAgICAgICAgICAgICBpbnQgaXRlcmF0aW9uX2NvdW50LCAgaW50IGhhc2hfaWR4LAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICBpbnQgZXJyOworICAgdW5zaWduZWQgbG9uZyB4OworICAgaGFzaF9zdGF0ZSAgICAqbWQ7CisgICB1bnNpZ25lZCBjaGFyICpidWY7CisKKyAgIExUQ19BUkdDSEsocGFzc3dvcmQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHNhbHQgICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICAgIT0gTlVMTCk7CisKKyAgIC8qIHRlc3QgaGFzaCBJRFggKi8KKyAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoX2lkeCkpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KKyAgIG1kICA9IFhNQUxMT0Moc2l6ZW9mKGhhc2hfc3RhdGUpKTsKKyAgIGJ1ZiA9IFhNQUxMT0MoTUFYQkxPQ0tTSVpFKTsKKyAgIGlmIChtZCA9PSBOVUxMIHx8IGJ1ZiA9PSBOVUxMKSB7CisgICAgICBpZiAobWQgIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUobWQpOworICAgICAgfQorICAgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7IAorICAgICAgICAgWEZSRUUoYnVmKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9ICAgICAgICAKKworICAgLyogaGFzaCBpbml0aWFsIHBhc3N3b3JkICsgc2FsdCAqLworICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLmluaXQobWQpKSAhPSBDUllQVF9PSykgeworICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKyAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5wcm9jZXNzKG1kLCBwYXNzd29yZCwgcGFzc3dvcmRfbGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisgICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0ucHJvY2VzcyhtZCwgc2FsdCwgOCkpICE9IENSWVBUX09LKSB7CisgICAgICAgZ290byBMQkxfRVJSOworICAgfQorICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLmRvbmUobWQsIGJ1ZikpICE9IENSWVBUX09LKSB7CisgICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICB3aGlsZSAoLS1pdGVyYXRpb25fY291bnQpIHsKKyAgICAgIC8qIGNvZGUgZ29lcyBoZXJlLiAqLworICAgICAgeCA9IE1BWEJMT0NLU0laRTsKKyAgICAgIGlmICgoZXJyID0gaGFzaF9tZW1vcnkoaGFzaF9pZHgsIGJ1ZiwgaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5oYXNoc2l6ZSwgYnVmLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICB9CisgICB9CisKKyAgIC8qIGNvcHkgdXB0byBvdXRsZW4gYnl0ZXMgKi8KKyAgIGZvciAoeCA9IDA7IHggPCBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLmhhc2hzaXplICYmIHggPCAqb3V0bGVuOyB4KyspIHsKKyAgICAgICBvdXRbeF0gPSBidWZbeF07CisgICB9CisgICAqb3V0bGVuID0geDsKKyAgIGVyciA9IENSWVBUX09LOworTEJMX0VSUjoKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sgCisgICB6ZXJvbWVtKGJ1ZiwgTUFYQkxPQ0tTSVpFKTsKKyAgIHplcm9tZW0obWQsIHNpemVvZihoYXNoX3N0YXRlKSk7CisjZW5kaWYKKworICAgWEZSRUUoYnVmKTsKKyAgIFhGUkVFKG1kKTsKKworICAgcmV0dXJuIGVycjsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL3BrY3M1L3BrY3NfNV8xLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbWlzYy9wa2NzNS9wa2NzXzVfMi5jIGIvc3JjL21pc2MvcGtjczUvcGtjc181XzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQ4YTE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21pc2MvcGtjczUvcGtjc181XzIuYwpAQCAtMCwwICsxLDEyOSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlIDx0b21jcnlwdC5oPgorCisvKiogCisgICBAZmlsZSBwa2NzXzVfMi5jCisgICBQS0NTICM1LCBBbGdvcml0aG0gIzIsIFRvbSBTdCBEZW5pcworKi8KKyNpZmRlZiBQS0NTXzUKKworLyoqCisgICBFeGVjdXRlIFBLQ1MgIzUgdjIKKyAgIEBwYXJhbSBwYXNzd29yZCAgICAgICAgICBUaGUgaW5wdXQgcGFzc3dvcmQgKG9yIGtleSkKKyAgIEBwYXJhbSBwYXNzd29yZF9sZW4gICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBwYXNzd29yZCAob2N0ZXRzKQorICAgQHBhcmFtIHNhbHQgICAgICAgICAgICAgIFRoZSBzYWx0IChvciBub25jZSkKKyAgIEBwYXJhbSBzYWx0X2xlbiAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzYWx0IChvY3RldHMpCisgICBAcGFyYW0gaXRlcmF0aW9uX2NvdW50ICAgIyBvZiBpdGVyYXRpb25zIGRlc2lyZWQgZm9yIFBLQ1MgIzUgdjIgW3JlYWQgc3BlY3MgZm9yIG1vcmVdCisgICBAcGFyYW0gaGFzaF9pZHggICAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBoYXNoIGRlc2lyZWQKKyAgIEBwYXJhbSBvdXQgICAgICAgICAgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gZm9yIHRoaXMgYWxnb3JpdGhtCisgICBAcGFyYW0gb3V0bGVuICAgICAgICAgICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgYWxnb3JpdGhtIG91dHB1dAorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHBrY3NfNV9hbGcyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3b3JkLCB1bnNpZ25lZCBsb25nIHBhc3N3b3JkX2xlbiwgCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwgICAgIHVuc2lnbmVkIGxvbmcgc2FsdF9sZW4sCisgICAgICAgICAgICAgICAgaW50IGl0ZXJhdGlvbl9jb3VudCwgICAgICAgICAgIGludCBoYXNoX2lkeCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworICAgaW50IGVyciwgaXR0czsKKyAgIHVsb25nMzIgIGJsa25vOworICAgdW5zaWduZWQgbG9uZyBzdG9yZWQsIGxlZnQsIHgsIHk7CisgICB1bnNpZ25lZCBjaGFyICpidWZbMl07CisgICBobWFjX3N0YXRlICAgICpobWFjOworCisgICBMVENfQVJHQ0hLKHBhc3N3b3JkICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhzYWx0ICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAgICE9IE5VTEwpOworCisgICAvKiB0ZXN0IGhhc2ggSURYICovCisgICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaF9pZHgpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgYnVmWzBdID0gWE1BTExPQyhNQVhCTE9DS1NJWkUgKiAyKTsKKyAgIGhtYWMgICA9IFhNQUxMT0Moc2l6ZW9mKGhtYWNfc3RhdGUpKTsKKyAgIGlmIChobWFjID09IE5VTEwgfHwgYnVmWzBdID09IE5VTEwpIHsKKyAgICAgIGlmIChobWFjICE9IE5VTEwpIHsKKyAgICAgICAgIFhGUkVFKGhtYWMpOworICAgICAgfQorICAgICAgaWYgKGJ1ZlswXSAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShidWZbMF0pOworICAgICAgfQorICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKyAgIC8qIGJ1ZlsxXSBwb2ludHMgdG8gdGhlIHNlY29uZCBibG9jayBvZiBNQVhCTE9DS1NJWkUgYnl0ZXMgKi8KKyAgIGJ1ZlsxXSA9IGJ1ZlswXSArIE1BWEJMT0NLU0laRTsKKworICAgbGVmdCAgID0gKm91dGxlbjsKKyAgIGJsa25vICA9IDE7CisgICBzdG9yZWQgPSAwOworICAgd2hpbGUgKGxlZnQgIT0gMCkgeworICAgICAgIC8qIHByb2Nlc3MgYmxvY2sgbnVtYmVyIGJsa25vICovCisgICAgICAgemVyb21lbShidWZbMF0sIE1BWEJMT0NLU0laRSoyKTsKKyAgICAgICAKKyAgICAgICAvKiBzdG9yZSBjdXJyZW50IGJsb2NrIG51bWJlciBhbmQgaW5jcmVtZW50IGZvciBuZXh0IHBhc3MgKi8KKyAgICAgICBTVE9SRTMySChibGtubywgYnVmWzFdKTsKKyAgICAgICArK2Jsa25vOworCisgICAgICAgLyogZ2V0IFBSRihQLCBTfHxpbnQoYmxrbm8pKSAqLworICAgICAgIGlmICgoZXJyID0gaG1hY19pbml0KGhtYWMsIGhhc2hfaWR4LCBwYXNzd29yZCwgcGFzc3dvcmRfbGVuKSkgIT0gQ1JZUFRfT0spIHsgCisgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgIH0KKyAgICAgICBpZiAoKGVyciA9IGhtYWNfcHJvY2VzcyhobWFjLCBzYWx0LCBzYWx0X2xlbikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgIH0KKyAgICAgICBpZiAoKGVyciA9IGhtYWNfcHJvY2VzcyhobWFjLCBidWZbMV0sIDQpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICB9CisgICAgICAgeCA9IE1BWEJMT0NLU0laRTsKKyAgICAgICBpZiAoKGVyciA9IGhtYWNfZG9uZShobWFjLCBidWZbMF0sICZ4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgfQorCisgICAgICAgLyogbm93IGNvbXB1dGUgcmVwZWF0ZWQgYW5kIFhPUiBpdCBpbiBidWZbMV0gKi8KKyAgICAgICBYTUVNQ1BZKGJ1ZlsxXSwgYnVmWzBdLCB4KTsKKyAgICAgICBmb3IgKGl0dHMgPSAxOyBpdHRzIDwgaXRlcmF0aW9uX2NvdW50OyArK2l0dHMpIHsKKyAgICAgICAgICAgaWYgKChlcnIgPSBobWFjX21lbW9yeShoYXNoX2lkeCwgcGFzc3dvcmQsIHBhc3N3b3JkX2xlbiwgYnVmWzBdLCB4LCBidWZbMF0sICZ4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICB9CisgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCB4OyB5KyspIHsKKyAgICAgICAgICAgICAgIGJ1ZlsxXVt5XSBePSBidWZbMF1beV07CisgICAgICAgICAgIH0KKyAgICAgICB9CisKKyAgICAgICAvKiBub3cgZW1pdCB1cHRvIHggYnl0ZXMgb2YgYnVmWzFdIHRvIG91dHB1dCAqLworICAgICAgIGZvciAoeSA9IDA7IHkgPCB4ICYmIGxlZnQgIT0gMDsgKyt5KSB7CisgICAgICAgICAgIG91dFtzdG9yZWQrK10gPSBidWZbMV1beV07CisgICAgICAgICAgIC0tbGVmdDsKKyAgICAgICB9CisgICB9CisgICAqb3V0bGVuID0gc3RvcmVkOworCisgICBlcnIgPSBDUllQVF9PSzsKK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKGJ1ZlswXSwgTUFYQkxPQ0tTSVpFKjIpOworICAgemVyb21lbShobWFjLCBzaXplb2YoaG1hY19zdGF0ZSkpOworI2VuZGlmCisKKyAgIFhGUkVFKGhtYWMpOworICAgWEZSRUUoYnVmWzBdKTsKKworICAgcmV0dXJuIGVycjsKK30KKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21pc2MvcGtjczUvcGtjc181XzIuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9taXNjL3plcm9tZW0uYyBiL3NyYy9taXNjL3plcm9tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWIwN2RjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21pc2MvemVyb21lbS5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSB6ZXJvbWVtLmMKKyAgIFplcm8gYSBibG9jayBvZiBtZW1vcnksIFRvbSBTdCBEZW5pcworKi8KKworLyoqCisgICBaZXJvIGEgYmxvY2sgb2YgbWVtb3J5CisgICBAcGFyYW0gb3V0ICAgIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgYXJlYSB0byB6ZXJvCisgICBAcGFyYW0gb3V0bGVuIFRoZSBsZW5ndGggb2YgdGhlIGFyZWEgdG8gemVybyAob2N0ZXRzKQorKi8KK3ZvaWQgemVyb21lbSh2b2lkICpvdXQsIHNpemVfdCBvdXRsZW4pCit7CisgICB1bnNpZ25lZCBjaGFyICptZW0gPSBvdXQ7CisgICBMVENfQVJHQ0hLKG91dCAhPSBOVUxMKTsKKyAgIHdoaWxlIChvdXRsZW4tLSA+IDApIHsKKyAgICAgICptZW0rKyA9IDA7CisgICB9Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9taXNjL3plcm9tZW0uYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9jYmMvY2JjX2RlY3J5cHQuYyBiL3NyYy9tb2Rlcy9jYmMvY2JjX2RlY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzNmZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vZGVzL2NiYy9jYmNfZGVjcnlwdC5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBjYmNfZGVjcnlwdC5jCisgICBDQkMgaW1wbGVtZW50YXRpb24sIGVuY3J5cHQgYmxvY2ssIFRvbSBTdCBEZW5pcworKi8KKworCisjaWZkZWYgQ0JDCisKKy8qKgorICBDQkMgZGVjcnlwdAorICBAcGFyYW0gY3QgICAgIENpcGhlcnRleHQKKyAgQHBhcmFtIHB0ICAgICBbb3V0XSBQbGFpbnRleHQKKyAgQHBhcmFtIGxlbiAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHByb2Nlc3MgKG11c3QgYmUgbXVsdGlwbGUgb2YgYmxvY2sgbGVuZ3RoKQorICBAcGFyYW0gY2JjICAgIENCQyBzdGF0ZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgY2JjX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0NCQyAqY2JjKQoreworICAgaW50IHgsIGVycjsKKyAgIHVuc2lnbmVkIGNoYXIgdG1wWzE2XTsKKyNpZmRlZiBMVENfRkFTVAorICAgTFRDX0ZBU1RfVFlQRSB0bXB5OworI2Vsc2UKKyAgIHVuc2lnbmVkIGNoYXIgdG1weTsKKyNlbmRpZiAgICAgICAgIAorCisgICBMVENfQVJHQ0hLKHB0ICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjYmMgIT0gTlVMTCk7CisKKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNiYy0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICByZXR1cm4gZXJyOworICAgfQorICAgCisgICAvKiBpcyBibG9ja2xlbiB2YWxpZD8gKi8KKyAgIGlmIChjYmMtPmJsb2NrbGVuIDwgMCB8fCBjYmMtPmJsb2NrbGVuID4gKGludClzaXplb2YoY2JjLT5JVikpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0gICAgCisKKyAgIGlmIChsZW4gJSBjYmMtPmJsb2NrbGVuKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisjaWZkZWYgTFRDX0ZBU1QKKyAgIGlmIChsZW4gJSBzaXplb2YoTFRDX0ZBU1RfVFlQRSkpIHsgICAKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKyNlbmRpZgorICAgCisgICBpZiAoY2lwaGVyX2Rlc2NyaXB0b3JbY2JjLT5jaXBoZXJdLmFjY2VsX2NiY19kZWNyeXB0ICE9IE5VTEwpIHsKKyAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW2NiYy0+Y2lwaGVyXS5hY2NlbF9jYmNfZGVjcnlwdChjdCwgcHQsIGxlbiAvIGNiYy0+YmxvY2tsZW4sIGNiYy0+SVYsICZjYmMtPmtleSk7CisgICB9IGVsc2UgeworICAgICAgd2hpbGUgKGxlbikgeworICAgICAgICAgLyogZGVjcnlwdCAqLworICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbY2JjLT5jaXBoZXJdLmVjYl9kZWNyeXB0KGN0LCB0bXAsICZjYmMtPmtleSk7CisKKyAgICAgICAgIC8qIHhvciBJViBhZ2FpbnN0IHBsYWludGV4dCAqLworICAgICAgICAgI2lmIGRlZmluZWQoTFRDX0ZBU1QpCisJICAgICBmb3IgKHggPSAwOyB4IDwgY2JjLT5ibG9ja2xlbjsgeCArPSBzaXplb2YoTFRDX0ZBU1RfVFlQRSkpIHsKKwkgICAgICAgICB0bXB5ID0gKigoTFRDX0ZBU1RfVFlQRSopKCh1bnNpZ25lZCBjaGFyICopY2JjLT5JViArIHgpKSBeICooKExUQ19GQVNUX1RZUEUqKSgodW5zaWduZWQgY2hhciAqKXRtcCArIHgpKTsKKwkJICooKExUQ19GQVNUX1RZUEUqKSgodW5zaWduZWQgY2hhciAqKWNiYy0+SVYgKyB4KSkgPSAqKChMVENfRkFTVF9UWVBFKikoKHVuc2lnbmVkIGNoYXIgKiljdCArIHgpKTsKKwkJICooKExUQ19GQVNUX1RZUEUqKSgodW5zaWduZWQgY2hhciAqKXB0ICsgeCkpID0gdG1weTsKKwkgICAgIH0KKwkgI2Vsc2UgCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgY2JjLT5ibG9ja2xlbjsgeCsrKSB7CisgICAgICAgICAgICAgICB0bXB5ICAgICAgID0gdG1wW3hdIF4gY2JjLT5JVlt4XTsKKyAgICAgICAgICAgICAgIGNiYy0+SVZbeF0gPSBjdFt4XTsKKyAgICAgICAgICAgICAgIHB0W3hdICAgICAgPSB0bXB5OworICAgICAgICAgICAgfQorCSAjZW5kaWYKKyAgICAgICAKKyAgICAgICAgIGN0ICArPSBjYmMtPmJsb2NrbGVuOworICAgICAgICAgcHQgICs9IGNiYy0+YmxvY2tsZW47CisgICAgICAgICBsZW4gLT0gY2JjLT5ibG9ja2xlbjsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9jYmMvY2JjX2RlY3J5cHQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS45ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9jYmMvY2JjX2RvbmUuYyBiL3NyYy9tb2Rlcy9jYmMvY2JjX2RvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmFhOWJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vZGVzL2NiYy9jYmNfZG9uZS5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBjYmNfZG9uZS5jCisgICBDQkMgaW1wbGVtZW50YXRpb24sIGZpbmlzaCBjaGFpbiwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgQ0JDCisKKy8qKiBUZXJtaW5hdGUgdGhlIGNoYWluCisgIEBwYXJhbSBjYmMgICAgVGhlIENCQyBjaGFpbiB0byB0ZXJtaW5hdGUKKyAgQHJldHVybiBDUllQVF9PSyBvbiBzdWNjZXNzCisqLworaW50IGNiY19kb25lKHN5bW1ldHJpY19DQkMgKmNiYykKK3sKKyAgIGludCBlcnI7CisgICBMVENfQVJHQ0hLKGNiYyAhPSBOVUxMKTsKKworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2JjLT5jaXBoZXIpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIGNpcGhlcl9kZXNjcmlwdG9yW2NiYy0+Y2lwaGVyXS5kb25lKCZjYmMtPmtleSk7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyAgIAorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21vZGVzL2NiYy9jYmNfZG9uZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21vZGVzL2NiYy9jYmNfZW5jcnlwdC5jIGIvc3JjL21vZGVzL2NiYy9jYmNfZW5jcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YjQxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbW9kZXMvY2JjL2NiY19lbmNyeXB0LmMKQEAgLTAsMCArMSw5NiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgIEBmaWxlIGNiY19lbmNyeXB0LmMKKyAgIENCQyBpbXBsZW1lbnRhdGlvbiwgZW5jcnlwdCBibG9jaywgVG9tIFN0IERlbmlzCisqLworCisKKyNpZmRlZiBDQkMKKworLyoqCisgIENCQyBlbmNyeXB0CisgIEBwYXJhbSBwdCAgICAgUGxhaW50ZXh0CisgIEBwYXJhbSBjdCAgICAgW291dF0gQ2lwaGVydGV4dAorICBAcGFyYW0gbGVuICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcHJvY2VzcyAobXVzdCBiZSBtdWx0aXBsZSBvZiBibG9jayBsZW5ndGgpCisgIEBwYXJhbSBjYmMgICAgQ0JDIHN0YXRlCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBjYmNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfQ0JDICpjYmMpCit7CisgICBpbnQgeCwgZXJyOworCisgICBMVENfQVJHQ0hLKHB0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY2JjICE9IE5VTEwpOworCisgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChjYmMtPmNpcGhlcikpICE9IENSWVBUX09LKSB7CisgICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIAorICAgLyogaXMgYmxvY2tsZW4gdmFsaWQ/ICovCisgICBpZiAoY2JjLT5ibG9ja2xlbiA8IDAgfHwgY2JjLT5ibG9ja2xlbiA+IChpbnQpc2l6ZW9mKGNiYy0+SVYpKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9ICAgIAorCisgICBpZiAobGVuICUgY2JjLT5ibG9ja2xlbikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorI2lmZGVmIExUQ19GQVNUCisgICBpZiAobGVuICUgc2l6ZW9mKExUQ19GQVNUX1RZUEUpKSB7ICAgCisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisjZW5kaWYKKworICAgaWYgKGNpcGhlcl9kZXNjcmlwdG9yW2NiYy0+Y2lwaGVyXS5hY2NlbF9jYmNfZW5jcnlwdCAhPSBOVUxMKSB7CisgICAgICBjaXBoZXJfZGVzY3JpcHRvcltjYmMtPmNpcGhlcl0uYWNjZWxfY2JjX2VuY3J5cHQocHQsIGN0LCBsZW4gLyBjYmMtPmJsb2NrbGVuLCBjYmMtPklWLCAmY2JjLT5rZXkpOworICAgfSBlbHNlIHsKKyAgICAgIHdoaWxlIChsZW4pIHsKKyAgICAgICAgIC8qIHhvciBJViBhZ2FpbnN0IHBsYWludGV4dCAqLworICAgICAgICAgI2lmIGRlZmluZWQoTFRDX0ZBU1QpCisJICAgICBmb3IgKHggPSAwOyB4IDwgY2JjLT5ibG9ja2xlbjsgeCArPSBzaXplb2YoTFRDX0ZBU1RfVFlQRSkpIHsKKwkgICAgICAgICAqKChMVENfRkFTVF9UWVBFKikoKHVuc2lnbmVkIGNoYXIgKiljYmMtPklWICsgeCkpIF49ICooKExUQ19GQVNUX1RZUEUqKSgodW5zaWduZWQgY2hhciAqKXB0ICsgeCkpOworCSAgICAgfQorCSAjZWxzZSAKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBjYmMtPmJsb2NrbGVuOyB4KyspIHsKKyAgICAgICAgICAgICAgIGNiYy0+SVZbeF0gXj0gcHRbeF07CisgICAgICAgICAgICB9CisJICNlbmRpZgorCisgICAgICAgICAvKiBlbmNyeXB0ICovCisgICAgICAgICBjaXBoZXJfZGVzY3JpcHRvcltjYmMtPmNpcGhlcl0uZWNiX2VuY3J5cHQoY2JjLT5JViwgY3QsICZjYmMtPmtleSk7CisKKyAgICAgICAgLyogc3RvcmUgSVYgW2NpcGhlcnRleHRdIGZvciBhIGZ1dHVyZSBibG9jayAqLworICAgICAgICAgI2lmIGRlZmluZWQoTFRDX0ZBU1QpCisJICAgICBmb3IgKHggPSAwOyB4IDwgY2JjLT5ibG9ja2xlbjsgeCArPSBzaXplb2YoTFRDX0ZBU1RfVFlQRSkpIHsKKwkgICAgICAgICAqKChMVENfRkFTVF9UWVBFKikoKHVuc2lnbmVkIGNoYXIgKiljYmMtPklWICsgeCkpID0gKigoTFRDX0ZBU1RfVFlQRSopKCh1bnNpZ25lZCBjaGFyICopY3QgKyB4KSk7CisJICAgICB9CisJICNlbHNlIAorICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBjYmMtPmJsb2NrbGVuOyB4KyspIHsKKyAgICAgICAgICAgICAgICBjYmMtPklWW3hdID0gY3RbeF07CisgICAgICAgICAgICAgfQorCSAjZW5kaWYKKyAgICAgICAgCisgICAgICAgIGN0ICArPSBjYmMtPmJsb2NrbGVuOworICAgICAgICBwdCAgKz0gY2JjLT5ibG9ja2xlbjsKKyAgICAgICAgbGVuIC09IGNiYy0+YmxvY2tsZW47CisgICAgIH0KKyAgIH0KKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9jYmMvY2JjX2VuY3J5cHQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS43ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9jYmMvY2JjX2dldGl2LmMgYi9zcmMvbW9kZXMvY2JjL2NiY19nZXRpdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDE4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbW9kZXMvY2JjL2NiY19nZXRpdi5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBjYmNfZ2V0aXYuYworICAgQ0JDIGltcGxlbWVudGF0aW9uLCBnZXQgSVYsIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIENCQworCisvKioKKyAgIEdldCB0aGUgY3VycmVudCBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIElWICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIGxlbiAgW2luL291dF0gIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIGluaXRpYWwgdmVjdG9yCisgICBAcGFyYW0gY2JjICBUaGUgQ0JDIHN0YXRlCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgY2JjX2dldGl2KHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nICpsZW4sIHN5bW1ldHJpY19DQkMgKmNiYykKK3sKKyAgIExUQ19BUkdDSEsoSVYgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhsZW4gIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGNiYyAhPSBOVUxMKTsKKyAgIGlmICgodW5zaWduZWQgbG9uZyljYmMtPmJsb2NrbGVuID4gKmxlbikgeworICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgIH0KKyAgIFhNRU1DUFkoSVYsIGNiYy0+SVYsIGNiYy0+YmxvY2tsZW4pOworICAgKmxlbiA9IGNiYy0+YmxvY2tsZW47CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9jYmMvY2JjX2dldGl2LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbW9kZXMvY2JjL2NiY19zZXRpdi5jIGIvc3JjL21vZGVzL2NiYy9jYmNfc2V0aXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzhlNzEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vZGVzL2NiYy9jYmNfc2V0aXYuYwpAQCAtMCwwICsxLDQ0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgY2JjX3NldGl2LmMKKyAgIENCQyBpbXBsZW1lbnRhdGlvbiwgc2V0IElWLCBUb20gU3QgRGVuaXMKKyovCisKKworI2lmZGVmIENCQworCisvKioKKyAgIFNldCBhbiBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIElWICAgVGhlIGluaXRpYWwgdmVjdG9yCisgICBAcGFyYW0gbGVuICBUaGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgKGluIG9jdGV0cykKKyAgIEBwYXJhbSBjYmMgIFRoZSBDQkMgc3RhdGUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBjYmNfc2V0aXYoY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfQ0JDICpjYmMpCit7CisgICBMVENfQVJHQ0hLKElWICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY2JjICE9IE5VTEwpOworICAgaWYgKGxlbiAhPSAodW5zaWduZWQgbG9uZyljYmMtPmJsb2NrbGVuKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisgICBYTUVNQ1BZKGNiYy0+SVYsIElWLCBsZW4pOworICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYgCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21vZGVzL2NiYy9jYmNfc2V0aXYuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9jYmMvY2JjX3N0YXJ0LmMgYi9zcmMvbW9kZXMvY2JjL2NiY19zdGFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzM2JiODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbW9kZXMvY2JjL2NiY19zdGFydC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBjYmNfc3RhcnQuYworICAgQ0JDIGltcGxlbWVudGF0aW9uLCBzdGFydCBjaGFpbiwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgQ0JDCisKKy8qKgorICAgSW5pdGlhbGl6ZSBhIENCQyBjb250ZXh0CisgICBAcGFyYW0gY2lwaGVyICAgICAgVGhlIGluZGV4IG9mIHRoZSBjaXBoZXIgZGVzaXJlZAorICAgQHBhcmFtIElWICAgICAgICAgIFRoZSBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIGtleSAgICAgICAgIFRoZSBzZWNyZXQga2V5IAorICAgQHBhcmFtIGtleWxlbiAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHNlY3JldCBrZXkgKG9jdGV0cykKKyAgIEBwYXJhbSBudW1fcm91bmRzICBOdW1iZXIgb2Ygcm91bmRzIGluIHRoZSBjaXBoZXIgZGVzaXJlZCAoMCBmb3IgZGVmYXVsdCkKKyAgIEBwYXJhbSBjYmMgICAgICAgICBUaGUgQ0JDIHN0YXRlIHRvIGluaXRpYWxpemUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBjYmNfc3RhcnQoaW50IGNpcGhlciwgY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgCisgICAgICAgICAgICAgIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfQ0JDICpjYmMpCit7CisgICBpbnQgeCwgZXJyOworIAorICAgTFRDX0FSR0NISyhJViAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjYmMgIT0gTlVMTCk7CisKKyAgIC8qIGJhZCBwYXJhbT8gKi8KKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNpcGhlcikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICAvKiBzZXR1cCBjaXBoZXIgKi8KKyAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5zZXR1cChrZXksIGtleWxlbiwgbnVtX3JvdW5kcywgJmNiYy0+a2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIC8qIGNvcHkgSVYgKi8KKyAgIGNiYy0+YmxvY2tsZW4gPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmJsb2NrX2xlbmd0aDsKKyAgIGNiYy0+Y2lwaGVyICAgPSBjaXBoZXI7CisgICBmb3IgKHggPSAwOyB4IDwgY2JjLT5ibG9ja2xlbjsgeCsrKSB7CisgICAgICAgY2JjLT5JVlt4XSA9IElWW3hdOworICAgfQorICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21vZGVzL2NiYy9jYmNfc3RhcnQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL2NmYl9kZWNyeXB0LmMgYi9zcmMvbW9kZXMvY2ZiL2NmYl9kZWNyeXB0LmMKc2ltaWxhcml0eSBpbmRleCA2NCUKcmVuYW1lIGZyb20gY2ZiX2RlY3J5cHQuYwpyZW5hbWUgdG8gc3JjL21vZGVzL2NmYi9jZmJfZGVjcnlwdC5jCmluZGV4IDFlMWQzYzAuLjNkNTFiYTUgMTAwNjQ0Ci0tLSBhL2NmYl9kZWNyeXB0LmMKKysrIGIvc3JjL21vZGVzL2NmYi9jZmJfZGVjcnlwdC5jCkBAIC02LDE5ICs2LDMyIEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGNmYl9kZWNyeXB0LmMKKyAgQ0ZCIGltcGxlbWVudGF0aW9uLCBkZWNyeXB0IGRhdGEsIFRvbSBTdCBEZW5pcworKi8KIAogI2lmZGVmIENGQgogCisvKioKKyAgIENGQiBkZWNyeXB0CisgICBAcGFyYW0gY3QgICAgICBDaXBoZXJ0ZXh0CisgICBAcGFyYW0gcHQgICAgICBbb3V0XSBQbGFpbnRleHQKKyAgIEBwYXJhbSBsZW4gICAgIExlbmd0aCBvZiBjaXBoZXJ0ZXh0IChvY3RldHMpCisgICBAcGFyYW0gY2ZiICAgICBDRkIgc3RhdGUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIGludCBjZmJfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfQ0ZCICpjZmIpCiB7CiAgICBpbnQgZXJyOwogCi0gICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY2ZiICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGNmYiAhPSBOVUxMKTsKIAogICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2ZiLT5jaXBoZXIpKSAhPSBDUllQVF9PSykgewogICAgICAgIHJldHVybiBlcnI7CkBAIC00NiwzICs1OSw3IEBACiAKICNlbmRpZgogCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9jZmIvY2ZiX2RlY3J5cHQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9jZmIvY2ZiX2RvbmUuYyBiL3NyYy9tb2Rlcy9jZmIvY2ZiX2RvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI0NzYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vZGVzL2NmYi9jZmJfZG9uZS5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBjZmJfZG9uZS5jCisgICBDRkIgaW1wbGVtZW50YXRpb24sIGZpbmlzaCBjaGFpbiwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgQ0ZCCisKKy8qKiBUZXJtaW5hdGUgdGhlIGNoYWluCisgIEBwYXJhbSBjZmIgICAgVGhlIENGQiBjaGFpbiB0byB0ZXJtaW5hdGUKKyAgQHJldHVybiBDUllQVF9PSyBvbiBzdWNjZXNzCisqLworaW50IGNmYl9kb25lKHN5bW1ldHJpY19DRkIgKmNmYikKK3sKKyAgIGludCBlcnI7CisgICBMVENfQVJHQ0hLKGNmYiAhPSBOVUxMKTsKKworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2ZiLT5jaXBoZXIpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIGNpcGhlcl9kZXNjcmlwdG9yW2NmYi0+Y2lwaGVyXS5kb25lKCZjZmItPmtleSk7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyAgIAorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21vZGVzL2NmYi9jZmJfZG9uZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvY2ZiX2VuY3J5cHQuYyBiL3NyYy9tb2Rlcy9jZmIvY2ZiX2VuY3J5cHQuYwpzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSBjZmJfZW5jcnlwdC5jCnJlbmFtZSB0byBzcmMvbW9kZXMvY2ZiL2NmYl9lbmNyeXB0LmMKaW5kZXggODAxNjk1OS4uY2NhMDExNiAxMDA2NDQKLS0tIGEvY2ZiX2VuY3J5cHQuYworKysgYi9zcmMvbW9kZXMvY2ZiL2NmYl9lbmNyeXB0LmMKQEAgLTYsMTkgKzYsMzIgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY2ZiX2VuY3J5cHQuYworICBDRkIgaW1wbGVtZW50YXRpb24sIGVuY3J5cHQgZGF0YSwgVG9tIFN0IERlbmlzCisqLwogCiAjaWZkZWYgQ0ZCCiAKKy8qKgorICBDRkIgZW5jcnlwdAorICBAcGFyYW0gcHQgICAgIFBsYWludGV4dAorICBAcGFyYW0gY3QgICAgIFtvdXRdIENpcGhlcnRleHQKKyAgQHBhcmFtIGxlbiAgICBMZW5ndGggb2YgcGxhaW50ZXh0IChvY3RldHMpCisgIEBwYXJhbSBjZmIgICAgQ0ZCIHN0YXRlCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIGludCBjZmJfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfQ0ZCICpjZmIpCiB7CiAgICBpbnQgZXJyOwogCi0gICBfQVJHQ0hLKHB0ICE9IE5VTEwpOwotICAgX0FSR0NISyhjdCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY2ZiICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGNmYiAhPSBOVUxMKTsKIAogICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2ZiLT5jaXBoZXIpKSAhPSBDUllQVF9PSykgewogICAgICAgIHJldHVybiBlcnI7CkBAIC00NCwzICs1Nyw3IEBACiB9CiAKICNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbW9kZXMvY2ZiL2NmYl9lbmNyeXB0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbW9kZXMvY2ZiL2NmYl9nZXRpdi5jIGIvc3JjL21vZGVzL2NmYi9jZmJfZ2V0aXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzViNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vZGVzL2NmYi9jZmJfZ2V0aXYuYwpAQCAtMCwwICsxLDQ1IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgY2ZiX2dldGl2LmMKKyAgIENGQiBpbXBsZW1lbnRhdGlvbiwgZ2V0IElWLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBDRkIKKworLyoqCisgICBHZXQgdGhlIGN1cnJlbnQgaW5pdGlhbCB2ZWN0b3IKKyAgIEBwYXJhbSBJViAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgaW5pdGlhbCB2ZWN0b3IKKyAgIEBwYXJhbSBsZW4gIFtpbi9vdXRdICBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIGNmYiAgVGhlIENGQiBzdGF0ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGNmYl9nZXRpdih1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyAqbGVuLCBzeW1tZXRyaWNfQ0ZCICpjZmIpCit7CisgICBMVENfQVJHQ0hLKElWICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsobGVuICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjZmIgIT0gTlVMTCk7CisgICBpZiAoKHVuc2lnbmVkIGxvbmcpY2ZiLT5ibG9ja2xlbiA+ICpsZW4pIHsKKyAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICB9CisgICBYTUVNQ1BZKElWLCBjZmItPklWLCBjZmItPmJsb2NrbGVuKTsKKyAgICpsZW4gPSBjZmItPmJsb2NrbGVuOworCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbW9kZXMvY2ZiL2NmYl9nZXRpdi5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21vZGVzL2NmYi9jZmJfc2V0aXYuYyBiL3NyYy9tb2Rlcy9jZmIvY2ZiX3NldGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3NWEwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tb2Rlcy9jZmIvY2ZiX3NldGl2LmMKQEAgLTAsMCArMSw1MyBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY2ZiX3NldGl2LmMKKyAgQ0ZCIGltcGxlbWVudGF0aW9uLCBzZXQgSVYsIFRvbSBTdCBEZW5pcworKi8gIAorI2lmZGVmIENGQgorCisvKioKKyAgIFNldCBhbiBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIElWICAgVGhlIGluaXRpYWwgdmVjdG9yCisgICBAcGFyYW0gbGVuICBUaGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgKGluIG9jdGV0cykKKyAgIEBwYXJhbSBjZmIgIFRoZSBDRkIgc3RhdGUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBjZmJfc2V0aXYoY29uc3QgdW5zaWduZWQgY2hhciAqSVYsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfQ0ZCICpjZmIpCit7CisgICBpbnQgZXJyOworICAgCisgICBMVENfQVJHQ0hLKElWICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY2ZiICE9IE5VTEwpOworCisgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChjZmItPmNpcGhlcikpICE9IENSWVBUX09LKSB7CisgICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIAorICAgaWYgKGxlbiAhPSAodW5zaWduZWQgbG9uZyljZmItPmJsb2NrbGVuKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisgICAgICAKKyAgIC8qIGZvcmNlIG5leHQgYmxvY2sgKi8KKyAgIGNmYi0+cGFkbGVuID0gMDsKKyAgIGNpcGhlcl9kZXNjcmlwdG9yW2NmYi0+Y2lwaGVyXS5lY2JfZW5jcnlwdChJViwgY2ZiLT5JViwgJmNmYi0+a2V5KTsKKworICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYgCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21vZGVzL2NmYi9jZmJfc2V0aXYuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9jZmIvY2ZiX3N0YXJ0LmMgYi9zcmMvbW9kZXMvY2ZiL2NmYl9zdGFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NWUxNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbW9kZXMvY2ZiL2NmYl9zdGFydC5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBjZmJfc3RhcnQuYworICAgQ0ZCIGltcGxlbWVudGF0aW9uLCBzdGFydCBjaGFpbiwgVG9tIFN0IERlbmlzCisqLworCisKKyNpZmRlZiBDRkIKKworLyoqCisgICBJbml0aWFsaXplIGEgQ0ZCIGNvbnRleHQKKyAgIEBwYXJhbSBjaXBoZXIgICAgICBUaGUgaW5kZXggb2YgdGhlIGNpcGhlciBkZXNpcmVkCisgICBAcGFyYW0gSVYgICAgICAgICAgVGhlIGluaXRpYWwgdmVjdG9yCisgICBAcGFyYW0ga2V5ICAgICAgICAgVGhlIHNlY3JldCBrZXkgCisgICBAcGFyYW0ga2V5bGVuICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2VjcmV0IGtleSAob2N0ZXRzKQorICAgQHBhcmFtIG51bV9yb3VuZHMgIE51bWJlciBvZiByb3VuZHMgaW4gdGhlIGNpcGhlciBkZXNpcmVkICgwIGZvciBkZWZhdWx0KQorICAgQHBhcmFtIGNmYiAgICAgICAgIFRoZSBDRkIgc3RhdGUgdG8gaW5pdGlhbGl6ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGNmYl9zdGFydChpbnQgY2lwaGVyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCAKKyAgICAgICAgICAgICAgaW50IGtleWxlbiwgaW50IG51bV9yb3VuZHMsIHN5bW1ldHJpY19DRkIgKmNmYikKK3sKKyAgIGludCB4LCBlcnI7CisKKyAgIExUQ19BUkdDSEsoSVYgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY2ZiICE9IE5VTEwpOworCisgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChjaXBoZXIpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIAorCisgICAvKiBjb3B5IGRhdGEgKi8KKyAgIGNmYi0+Y2lwaGVyID0gY2lwaGVyOworICAgY2ZiLT5ibG9ja2xlbiA9IGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uYmxvY2tfbGVuZ3RoOworICAgZm9yICh4ID0gMDsgeCA8IGNmYi0+YmxvY2tsZW47IHgrKykKKyAgICAgICBjZmItPklWW3hdID0gSVZbeF07CisKKyAgIC8qIGluaXQgdGhlIGNpcGhlciAqLworICAgaWYgKChlcnIgPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLnNldHVwKGtleSwga2V5bGVuLCBudW1fcm91bmRzLCAmY2ZiLT5rZXkpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogZW5jcnlwdCB0aGUgSVYgKi8KKyAgIGNpcGhlcl9kZXNjcmlwdG9yW2NmYi0+Y2lwaGVyXS5lY2JfZW5jcnlwdChjZmItPklWLCBjZmItPklWLCAmY2ZiLT5rZXkpOworICAgY2ZiLT5wYWRsZW4gPSAwOworCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbW9kZXMvY2ZiL2NmYl9zdGFydC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21vZGVzL2N0ci9jdHJfZGVjcnlwdC5jIGIvc3JjL21vZGVzL2N0ci9jdHJfZGVjcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDFkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbW9kZXMvY3RyL2N0cl9kZWNyeXB0LmMKQEAgLTAsMCArMSw0MiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY3RyX2RlY3J5cHQuYworICBDVFIgaW1wbGVtZW50YXRpb24sIGRlY3J5cHQgZGF0YSwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgQ1RSCisKKy8qKgorICAgQ1RSIGRlY3J5cHQKKyAgIEBwYXJhbSBjdCAgICAgIENpcGhlcnRleHQKKyAgIEBwYXJhbSBwdCAgICAgIFtvdXRdIFBsYWludGV4dAorICAgQHBhcmFtIGxlbiAgICAgTGVuZ3RoIG9mIGNpcGhlcnRleHQgKG9jdGV0cykKKyAgIEBwYXJhbSBjdHIgICAgIENUUiBzdGF0ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGN0cl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DVFIgKmN0cikKK3sKKyAgIExUQ19BUkdDSEsocHQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdHIgIT0gTlVMTCk7CisKKyAgIHJldHVybiBjdHJfZW5jcnlwdChjdCwgcHQsIGxlbiwgY3RyKTsKK30KKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21vZGVzL2N0ci9jdHJfZGVjcnlwdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21vZGVzL2N0ci9jdHJfZG9uZS5jIGIvc3JjL21vZGVzL2N0ci9jdHJfZG9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZTc5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbW9kZXMvY3RyL2N0cl9kb25lLmMKQEAgLTAsMCArMSw0MiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgIEBmaWxlIGN0cl9kb25lLmMKKyAgIENUUiBpbXBsZW1lbnRhdGlvbiwgZmluaXNoIGNoYWluLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBDVFIKKworLyoqIFRlcm1pbmF0ZSB0aGUgY2hhaW4KKyAgQHBhcmFtIGN0ciAgICBUaGUgQ1RSIGNoYWluIHRvIHRlcm1pbmF0ZQorICBAcmV0dXJuIENSWVBUX09LIG9uIHN1Y2Nlc3MKKyovCitpbnQgY3RyX2RvbmUoc3ltbWV0cmljX0NUUiAqY3RyKQoreworICAgaW50IGVycjsKKyAgIExUQ19BUkdDSEsoY3RyICE9IE5VTEwpOworCisgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChjdHItPmNpcGhlcikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorICAgY2lwaGVyX2Rlc2NyaXB0b3JbY3RyLT5jaXBoZXJdLmRvbmUoJmN0ci0+a2V5KTsKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworICAgCisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbW9kZXMvY3RyL2N0cl9kb25lLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbW9kZXMvY3RyL2N0cl9lbmNyeXB0LmMgYi9zcmMvbW9kZXMvY3RyL2N0cl9lbmNyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3OTVhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tb2Rlcy9jdHIvY3RyX2VuY3J5cHQuYwpAQCAtMCwwICsxLDEwOCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY3RyX2VuY3J5cHQuYworICBDVFIgaW1wbGVtZW50YXRpb24sIGVuY3J5cHQgZGF0YSwgVG9tIFN0IERlbmlzCisqLworCisKKyNpZmRlZiBDVFIKKworLyoqCisgIENUUiBlbmNyeXB0CisgIEBwYXJhbSBwdCAgICAgUGxhaW50ZXh0CisgIEBwYXJhbSBjdCAgICAgW291dF0gQ2lwaGVydGV4dAorICBAcGFyYW0gbGVuICAgIExlbmd0aCBvZiBwbGFpbnRleHQgKG9jdGV0cykKKyAgQHBhcmFtIGN0ciAgICBDVFIgc3RhdGUKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGN0cl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DVFIgKmN0cikKK3sKKyAgIGludCB4LCBlcnI7CisKKyAgIExUQ19BUkdDSEsocHQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdHIgIT0gTlVMTCk7CisKKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGN0ci0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICByZXR1cm4gZXJyOworICAgfQorICAgCisgICAvKiBpcyBibG9ja2xlbi9wYWRsZW4gdmFsaWQ/ICovCisgICBpZiAoY3RyLT5ibG9ja2xlbiA8IDAgfHwgY3RyLT5ibG9ja2xlbiA+IChpbnQpc2l6ZW9mKGN0ci0+Y3RyKSB8fAorICAgICAgIGN0ci0+cGFkbGVuICAgPCAwIHx8IGN0ci0+cGFkbGVuICAgPiAoaW50KXNpemVvZihjdHItPnBhZCkpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworI2lmZGVmIExUQ19GQVNUCisgICBpZiAoY3RyLT5ibG9ja2xlbiAlIHNpemVvZihMVENfRkFTVF9UWVBFKSkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorI2VuZGlmCisgICAKKyAgIC8qIGhhbmRsZSBhY2NlbGVyYXRpb24gb25seSBpZiBwYWQgaXMgZW1wdHksIGFjY2VsZXJhdG9yIGlzIHByZXNlbnQgYW5kIGxlbmd0aCBpcyA+PSBhIGJsb2NrIHNpemUgKi8KKyAgIGlmICgoY3RyLT5wYWRsZW4gPT0gY3RyLT5ibG9ja2xlbikgJiYgY2lwaGVyX2Rlc2NyaXB0b3JbY3RyLT5jaXBoZXJdLmFjY2VsX2N0cl9lbmNyeXB0ICE9IE5VTEwgJiYgKGxlbiA+PSAodW5zaWduZWQgbG9uZyljdHItPmJsb2NrbGVuKSkgeworICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbY3RyLT5jaXBoZXJdLmFjY2VsX2N0cl9lbmNyeXB0KHB0LCBjdCwgbGVuL2N0ci0+YmxvY2tsZW4sIGN0ci0+Y3RyLCBjdHItPm1vZGUsICZjdHItPmtleSk7CisgICAgICBsZW4gJT0gY3RyLT5ibG9ja2xlbjsKKyAgIH0KKworICAgd2hpbGUgKGxlbikgeworICAgICAgLyogaXMgdGhlIHBhZCBlbXB0eT8gKi8KKyAgICAgIGlmIChjdHItPnBhZGxlbiA9PSBjdHItPmJsb2NrbGVuKSB7CisgICAgICAgICAvKiBpbmNyZW1lbnQgY291bnRlciAqLworICAgICAgICAgaWYgKGN0ci0+bW9kZSA9PSBDVFJfQ09VTlRFUl9MSVRUTEVfRU5ESUFOKSB7CisgICAgICAgICAgICAvKiBsaXR0bGUtZW5kaWFuICovCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgY3RyLT5ibG9ja2xlbjsgeCsrKSB7CisgICAgICAgICAgICAgICBjdHItPmN0clt4XSA9IChjdHItPmN0clt4XSArICh1bnNpZ25lZCBjaGFyKTEpICYgKHVuc2lnbmVkIGNoYXIpMjU1OworICAgICAgICAgICAgICAgaWYgKGN0ci0+Y3RyW3hdICE9ICh1bnNpZ25lZCBjaGFyKTApIHsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gKi8KKyAgICAgICAgICAgIGZvciAoeCA9IGN0ci0+YmxvY2tsZW4tMTsgeCA+PSAwOyB4LS0pIHsKKyAgICAgICAgICAgICAgIGN0ci0+Y3RyW3hdID0gKGN0ci0+Y3RyW3hdICsgKHVuc2lnbmVkIGNoYXIpMSkgJiAodW5zaWduZWQgY2hhcikyNTU7CisgICAgICAgICAgICAgICBpZiAoY3RyLT5jdHJbeF0gIT0gKHVuc2lnbmVkIGNoYXIpMCkgeworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIGVuY3J5cHQgaXQgKi8KKyAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW2N0ci0+Y2lwaGVyXS5lY2JfZW5jcnlwdChjdHItPmN0ciwgY3RyLT5wYWQsICZjdHItPmtleSk7CisgICAgICAgICBjdHItPnBhZGxlbiA9IDA7CisgICAgICB9CisjaWZkZWYgTFRDX0ZBU1QKKyAgICAgIGlmIChjdHItPnBhZGxlbiA9PSAwICYmIGxlbiA+PSAodW5zaWduZWQgbG9uZyljdHItPmJsb2NrbGVuKSB7CisgICAgICAgICBmb3IgKHggPSAwOyB4IDwgY3RyLT5ibG9ja2xlbjsgeCArPSBzaXplb2YoTFRDX0ZBU1RfVFlQRSkpIHsKKyAgICAgICAgICAgICooKExUQ19GQVNUX1RZUEUqKSgodW5zaWduZWQgY2hhciAqKWN0ICsgeCkpID0gKigoTFRDX0ZBU1RfVFlQRSopKCh1bnNpZ25lZCBjaGFyICopcHQgKyB4KSkgXgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChMVENfRkFTVF9UWVBFKikoKHVuc2lnbmVkIGNoYXIgKiljdHItPnBhZCArIHgpKTsKKyAgICAgICAgIH0KKwkgICAgcHQgICAgICAgICArPSBjdHItPmJsb2NrbGVuOworCSAgICBjdCAgICAgICAgICs9IGN0ci0+YmxvY2tsZW47CisJICAgIGxlbiAgICAgICAgLT0gY3RyLT5ibG9ja2xlbjsKKwkgICAgY3RyLT5wYWRsZW4gPSBjdHItPmJsb2NrbGVuOworCSAgICBjb250aW51ZTsKKwkgfQorI2VuZGlmCSAKKyAgICAqY3QrKyA9ICpwdCsrIF4gY3RyLT5wYWRbY3RyLT5wYWRsZW4rK107CisJIC0tbGVuOworICAgfQorICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21vZGVzL2N0ci9jdHJfZW5jcnlwdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEzICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9jdHIvY3RyX2dldGl2LmMgYi9zcmMvbW9kZXMvY3RyL2N0cl9nZXRpdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2U2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbW9kZXMvY3RyL2N0cl9nZXRpdi5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBjdHJfZ2V0aXYuYworICAgQ1RSIGltcGxlbWVudGF0aW9uLCBnZXQgSVYsIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIENUUgorCisvKioKKyAgIEdldCB0aGUgY3VycmVudCBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIElWICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIGxlbiAgW2luL291dF0gIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIGluaXRpYWwgdmVjdG9yCisgICBAcGFyYW0gY3RyICBUaGUgQ1RSIHN0YXRlCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgY3RyX2dldGl2KHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nICpsZW4sIHN5bW1ldHJpY19DVFIgKmN0cikKK3sKKyAgIExUQ19BUkdDSEsoSVYgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhsZW4gIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ciAhPSBOVUxMKTsKKyAgIGlmICgodW5zaWduZWQgbG9uZyljdHItPmJsb2NrbGVuID4gKmxlbikgeworICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgIH0KKyAgIFhNRU1DUFkoSVYsIGN0ci0+Y3RyLCBjdHItPmJsb2NrbGVuKTsKKyAgICpsZW4gPSBjdHItPmJsb2NrbGVuOworCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbW9kZXMvY3RyL2N0cl9nZXRpdi5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21vZGVzL2N0ci9jdHJfc2V0aXYuYyBiL3NyYy9tb2Rlcy9jdHIvY3RyX3NldGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkNGM0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tb2Rlcy9jdHIvY3RyX3NldGl2LmMKQEAgLTAsMCArMSw1OCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgY3RyX3NldGl2LmMKKyAgQ1RSIGltcGxlbWVudGF0aW9uLCBzZXQgSVYsIFRvbSBTdCBEZW5pcworKi8KKyAgCisjaWZkZWYgQ1RSCisKKy8qKgorICAgU2V0IGFuIGluaXRpYWwgdmVjdG9yCisgICBAcGFyYW0gSVYgICBUaGUgaW5pdGlhbCB2ZWN0b3IKKyAgIEBwYXJhbSBsZW4gIFRoZSBsZW5ndGggb2YgdGhlIHZlY3RvciAoaW4gb2N0ZXRzKQorICAgQHBhcmFtIGN0ciAgVGhlIENUUiBzdGF0ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGN0cl9zZXRpdihjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgdW5zaWduZWQgbG9uZyBsZW4sIHN5bW1ldHJpY19DVFIgKmN0cikKK3sKKyAgIGludCBlcnI7CisgICAKKyAgIExUQ19BUkdDSEsoSVYgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdHIgIT0gTlVMTCk7CisKKyAgIC8qIGJhZCBwYXJhbT8gKi8KKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGN0ci0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICAKKyAgIGlmIChsZW4gIT0gKHVuc2lnbmVkIGxvbmcpY3RyLT5ibG9ja2xlbikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICAvKiBzZXQgSVYgKi8KKyAgIFhNRU1DUFkoY3RyLT5jdHIsIElWLCBsZW4pOworICAgCisgICAvKiBmb3JjZSBuZXh0IGJsb2NrICovCisgICBjdHItPnBhZGxlbiA9IDA7CisgICBjaXBoZXJfZGVzY3JpcHRvcltjdHItPmNpcGhlcl0uZWNiX2VuY3J5cHQoSVYsIGN0ci0+cGFkLCAmY3RyLT5rZXkpOworICAgCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZiAKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbW9kZXMvY3RyL2N0cl9zZXRpdi5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21vZGVzL2N0ci9jdHJfc3RhcnQuYyBiL3NyYy9tb2Rlcy9jdHIvY3RyX3N0YXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZWViYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tb2Rlcy9jdHIvY3RyX3N0YXJ0LmMKQEAgLTAsMCArMSw3MCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgIEBmaWxlIGN0cl9zdGFydC5jCisgICBDVFIgaW1wbGVtZW50YXRpb24sIHN0YXJ0IGNoYWluLCBUb20gU3QgRGVuaXMKKyovCisKKworI2lmZGVmIENUUgorCisvKioKKyAgIEluaXRpYWxpemUgYSBDVFIgY29udGV4dAorICAgQHBhcmFtIGNpcGhlciAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2lwaGVyIGRlc2lyZWQKKyAgIEBwYXJhbSBJViAgICAgICAgICBUaGUgaW5pdGlhbCB2ZWN0b3IKKyAgIEBwYXJhbSBrZXkgICAgICAgICBUaGUgc2VjcmV0IGtleSAKKyAgIEBwYXJhbSBrZXlsZW4gICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5IChvY3RldHMpCisgICBAcGFyYW0gbnVtX3JvdW5kcyAgTnVtYmVyIG9mIHJvdW5kcyBpbiB0aGUgY2lwaGVyIGRlc2lyZWQgKDAgZm9yIGRlZmF1bHQpCisgICBAcGFyYW0gY3RyX21vZGUgICAgVGhlIGNvdW50ZXIgbW9kZSAoQ1RSX0NPVU5URVJfTElUVExFX0VORElBTiBvciBDVFJfQ09VTlRFUl9CSUdfRU5ESUFOKQorICAgQHBhcmFtIGN0ciAgICAgICAgIFRoZSBDVFIgc3RhdGUgdG8gaW5pdGlhbGl6ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGN0cl9zdGFydCggICAgICAgICAgICAgICBpbnQgICBjaXBoZXIsIAorICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpJViwgCisgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgICAgICAgaW50IGtleWxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbnVtX3JvdW5kcywgaW50IGN0cl9tb2RlLAorICAgICAgICAgICAgICAgICAgIHN5bW1ldHJpY19DVFIgKmN0cikKK3sKKyAgIGludCB4LCBlcnI7CisKKyAgIExUQ19BUkdDSEsoSVYgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ciAhPSBOVUxMKTsKKworICAgLyogYmFkIHBhcmFtPyAqLworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIC8qIHNldHVwIGNpcGhlciAqLworICAgaWYgKChlcnIgPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLnNldHVwKGtleSwga2V5bGVuLCBudW1fcm91bmRzLCAmY3RyLT5rZXkpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogY29weSBjdHIgKi8KKyAgIGN0ci0+YmxvY2tsZW4gPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmJsb2NrX2xlbmd0aDsKKyAgIGN0ci0+Y2lwaGVyICAgPSBjaXBoZXI7CisgICBjdHItPnBhZGxlbiAgID0gMDsKKyAgIGN0ci0+bW9kZSAgICAgPSBjdHJfbW9kZTsKKyAgIGZvciAoeCA9IDA7IHggPCBjdHItPmJsb2NrbGVuOyB4KyspIHsKKyAgICAgICBjdHItPmN0clt4XSA9IElWW3hdOworICAgfQorICAgY2lwaGVyX2Rlc2NyaXB0b3JbY3RyLT5jaXBoZXJdLmVjYl9lbmNyeXB0KGN0ci0+Y3RyLCBjdHItPnBhZCwgJmN0ci0+a2V5KTsKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9jdHIvY3RyX3N0YXJ0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNiAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbW9kZXMvZWNiL2VjYl9kZWNyeXB0LmMgYi9zcmMvbW9kZXMvZWNiL2VjYl9kZWNyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4MzY2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tb2Rlcy9lY2IvZWNiX2RlY3J5cHQuYwpAQCAtMCwwICsxLDU5IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBlY2JfZGVjcnlwdC5jCisgIEVDQiBpbXBsZW1lbnRhdGlvbiwgZGVjcnlwdCBhIGJsb2NrLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBFQ0IKKworLyoqCisgIEVDQiBkZWNyeXB0CisgIEBwYXJhbSBjdCAgICAgQ2lwaGVydGV4dAorICBAcGFyYW0gcHQgICAgIFtvdXRdIFBsYWludGV4dAorICBAcGFyYW0gbGVuICAgIFRoZSBudW1iZXIgb2Ygb2N0ZXRzIHRvIHByb2Nlc3MgKG11c3QgYmUgbXVsdGlwbGUgb2YgdGhlIGNpcGhlciBibG9jayBzaXplKQorICBAcGFyYW0gZWNiICAgIEVDQiBzdGF0ZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZWNiX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX0VDQiAqZWNiKQoreworICAgaW50IGVycjsKKyAgIExUQ19BUkdDSEsocHQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhlY2IgIT0gTlVMTCk7CisgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChlY2ItPmNpcGhlcikpICE9IENSWVBUX09LKSB7CisgICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIGlmIChsZW4gJSBjaXBoZXJfZGVzY3JpcHRvcltlY2ItPmNpcGhlcl0uYmxvY2tfbGVuZ3RoKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisKKyAgIC8qIGNoZWNrIGZvciBhY2NlbCAqLworICAgaWYgKGNpcGhlcl9kZXNjcmlwdG9yW2VjYi0+Y2lwaGVyXS5hY2NlbF9lY2JfZGVjcnlwdCAhPSBOVUxMKSB7CisgICAgICBjaXBoZXJfZGVzY3JpcHRvcltlY2ItPmNpcGhlcl0uYWNjZWxfZWNiX2RlY3J5cHQoY3QsIHB0LCBsZW4gLyBjaXBoZXJfZGVzY3JpcHRvcltlY2ItPmNpcGhlcl0uYmxvY2tfbGVuZ3RoLCAmZWNiLT5rZXkpOworICAgfSBlbHNlIHsKKyAgICAgIHdoaWxlIChsZW4pIHsKKyAgICAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW2VjYi0+Y2lwaGVyXS5lY2JfZGVjcnlwdChjdCwgcHQsICZlY2ItPmtleSk7CisgICAgICAgICBwdCAgKz0gY2lwaGVyX2Rlc2NyaXB0b3JbZWNiLT5jaXBoZXJdLmJsb2NrX2xlbmd0aDsKKyAgICAgICAgIGN0ICArPSBjaXBoZXJfZGVzY3JpcHRvcltlY2ItPmNpcGhlcl0uYmxvY2tfbGVuZ3RoOworICAgICAgICAgbGVuIC09IGNpcGhlcl9kZXNjcmlwdG9yW2VjYi0+Y2lwaGVyXS5ibG9ja19sZW5ndGg7CisgICAgICB9CisgICB9CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbW9kZXMvZWNiL2VjYl9kZWNyeXB0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbW9kZXMvZWNiL2VjYl9kb25lLmMgYi9zcmMvbW9kZXMvZWNiL2VjYl9kb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3MjYxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tb2Rlcy9lY2IvZWNiX2RvbmUuYwpAQCAtMCwwICsxLDQyIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgZWNiX2RvbmUuYworICAgRUNCIGltcGxlbWVudGF0aW9uLCBmaW5pc2ggY2hhaW4sIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIEVDQgorCisvKiogVGVybWluYXRlIHRoZSBjaGFpbgorICBAcGFyYW0gZWNiICAgIFRoZSBFQ0IgY2hhaW4gdG8gdGVybWluYXRlCisgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjY2VzcworKi8KK2ludCBlY2JfZG9uZShzeW1tZXRyaWNfRUNCICplY2IpCit7CisgICBpbnQgZXJyOworICAgTFRDX0FSR0NISyhlY2IgIT0gTlVMTCk7CisKKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGVjYi0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBjaXBoZXJfZGVzY3JpcHRvcltlY2ItPmNpcGhlcl0uZG9uZSgmZWNiLT5rZXkpOworICAgcmV0dXJuIENSWVBUX09LOworfQorCisgICAKKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9lY2IvZWNiX2RvbmUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9lY2IvZWNiX2VuY3J5cHQuYyBiL3NyYy9tb2Rlcy9lY2IvZWNiX2VuY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWUwMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vZGVzL2VjYi9lY2JfZW5jcnlwdC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGVjYl9lbmNyeXB0LmMKKyAgRUNCIGltcGxlbWVudGF0aW9uLCBlbmNyeXB0IGEgYmxvY2ssIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIEVDQgorCisvKioKKyAgRUNCIGVuY3J5cHQKKyAgQHBhcmFtIHB0ICAgICBQbGFpbnRleHQKKyAgQHBhcmFtIGN0ICAgICBbb3V0XSBDaXBoZXJ0ZXh0CisgIEBwYXJhbSBsZW4gICAgVGhlIG51bWJlciBvZiBvY3RldHMgdG8gcHJvY2VzcyAobXVzdCBiZSBtdWx0aXBsZSBvZiB0aGUgY2lwaGVyIGJsb2NrIHNpemUpCisgIEBwYXJhbSBlY2IgICAgRUNCIHN0YXRlCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBlY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfRUNCICplY2IpCit7CisgICBpbnQgZXJyOworICAgTFRDX0FSR0NISyhwdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoY3QgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGVjYiAhPSBOVUxMKTsKKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGVjYi0+Y2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICByZXR1cm4gZXJyOworICAgfQorICAgaWYgKGxlbiAlIGNpcGhlcl9kZXNjcmlwdG9yW2VjYi0+Y2lwaGVyXS5ibG9ja19sZW5ndGgpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgLyogY2hlY2sgZm9yIGFjY2VsICovCisgICBpZiAoY2lwaGVyX2Rlc2NyaXB0b3JbZWNiLT5jaXBoZXJdLmFjY2VsX2VjYl9lbmNyeXB0ICE9IE5VTEwpIHsKKyAgICAgIGNpcGhlcl9kZXNjcmlwdG9yW2VjYi0+Y2lwaGVyXS5hY2NlbF9lY2JfZW5jcnlwdChwdCwgY3QsIGxlbiAvIGNpcGhlcl9kZXNjcmlwdG9yW2VjYi0+Y2lwaGVyXS5ibG9ja19sZW5ndGgsICZlY2ItPmtleSk7CisgICB9IGVsc2UgeworICAgICAgd2hpbGUgKGxlbikgeworICAgICAgICAgY2lwaGVyX2Rlc2NyaXB0b3JbZWNiLT5jaXBoZXJdLmVjYl9lbmNyeXB0KHB0LCBjdCwgJmVjYi0+a2V5KTsKKyAgICAgICAgIHB0ICArPSBjaXBoZXJfZGVzY3JpcHRvcltlY2ItPmNpcGhlcl0uYmxvY2tfbGVuZ3RoOworICAgICAgICAgY3QgICs9IGNpcGhlcl9kZXNjcmlwdG9yW2VjYi0+Y2lwaGVyXS5ibG9ja19sZW5ndGg7CisgICAgICAgICBsZW4gLT0gY2lwaGVyX2Rlc2NyaXB0b3JbZWNiLT5jaXBoZXJdLmJsb2NrX2xlbmd0aDsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9lY2IvZWNiX2VuY3J5cHQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9lY2IvZWNiX3N0YXJ0LmMgYi9zcmMvbW9kZXMvZWNiL2VjYl9zdGFydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YmFhODEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbW9kZXMvZWNiL2VjYl9zdGFydC5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBlY2Jfc3RhcnQuYworICAgRUNCIGltcGxlbWVudGF0aW9uLCBzdGFydCBjaGFpbiwgVG9tIFN0IERlbmlzCisqLworCisKKyNpZmRlZiBFQ0IKKworLyoqCisgICBJbml0aWFsaXplIGEgRUNCIGNvbnRleHQKKyAgIEBwYXJhbSBjaXBoZXIgICAgICBUaGUgaW5kZXggb2YgdGhlIGNpcGhlciBkZXNpcmVkCisgICBAcGFyYW0ga2V5ICAgICAgICAgVGhlIHNlY3JldCBrZXkgCisgICBAcGFyYW0ga2V5bGVuICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2VjcmV0IGtleSAob2N0ZXRzKQorICAgQHBhcmFtIG51bV9yb3VuZHMgIE51bWJlciBvZiByb3VuZHMgaW4gdGhlIGNpcGhlciBkZXNpcmVkICgwIGZvciBkZWZhdWx0KQorICAgQHBhcmFtIGVjYiAgICAgICAgIFRoZSBFQ0Igc3RhdGUgdG8gaW5pdGlhbGl6ZQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGVjYl9zdGFydChpbnQgY2lwaGVyLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfRUNCICplY2IpCit7CisgICBpbnQgZXJyOworICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGVjYiAhPSBOVUxMKTsKKworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQoY2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBlY2ItPmNpcGhlciA9IGNpcGhlcjsKKyAgIGVjYi0+YmxvY2tsZW4gPSBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLmJsb2NrX2xlbmd0aDsKKyAgIHJldHVybiBjaXBoZXJfZGVzY3JpcHRvcltjaXBoZXJdLnNldHVwKGtleSwga2V5bGVuLCBudW1fcm91bmRzLCAmZWNiLT5rZXkpOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21vZGVzL2VjYi9lY2Jfc3RhcnQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9vZmIvb2ZiX2RlY3J5cHQuYyBiL3NyYy9tb2Rlcy9vZmIvb2ZiX2RlY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjVmMTlkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vZGVzL29mYi9vZmJfZGVjcnlwdC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIG9mYl9kZWNyeXB0LmMKKyAgT0ZCIGltcGxlbWVudGF0aW9uLCBkZWNyeXB0IGRhdGEsIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIE9GQgorCisvKioKKyAgIE9GQiBkZWNyeXB0CisgICBAcGFyYW0gY3QgICAgICBDaXBoZXJ0ZXh0CisgICBAcGFyYW0gcHQgICAgICBbb3V0XSBQbGFpbnRleHQKKyAgIEBwYXJhbSBsZW4gICAgIExlbmd0aCBvZiBjaXBoZXJ0ZXh0IChvY3RldHMpCisgICBAcGFyYW0gb2ZiICAgICBPRkIgc3RhdGUKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBvZmJfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpjdCwgdW5zaWduZWQgY2hhciAqcHQsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfT0ZCICpvZmIpCit7CisgICBMVENfQVJHQ0hLKHB0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhjdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob2ZiICE9IE5VTEwpOworICAgcmV0dXJuIG9mYl9lbmNyeXB0KGN0LCBwdCwgbGVuLCBvZmIpOworfQorCisKKyNlbmRpZgorCisgCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9vZmIvb2ZiX2RlY3J5cHQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9vZmIvb2ZiX2RvbmUuYyBiL3NyYy9tb2Rlcy9vZmIvb2ZiX2RvbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTExNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vZGVzL29mYi9vZmJfZG9uZS5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBvZmJfZG9uZS5jCisgICBPRkIgaW1wbGVtZW50YXRpb24sIGZpbmlzaCBjaGFpbiwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgT0ZCCisKKy8qKiBUZXJtaW5hdGUgdGhlIGNoYWluCisgIEBwYXJhbSBvZmIgICAgVGhlIE9GQiBjaGFpbiB0byB0ZXJtaW5hdGUKKyAgQHJldHVybiBDUllQVF9PSyBvbiBzdWNjZXNzCisqLworaW50IG9mYl9kb25lKHN5bW1ldHJpY19PRkIgKm9mYikKK3sKKyAgIGludCBlcnI7CisgICBMVENfQVJHQ0hLKG9mYiAhPSBOVUxMKTsKKworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQob2ZiLT5jaXBoZXIpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIGNpcGhlcl9kZXNjcmlwdG9yW29mYi0+Y2lwaGVyXS5kb25lKCZvZmItPmtleSk7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyAgIAorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL21vZGVzL29mYi9vZmJfZG9uZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvb2ZiX2VuY3J5cHQuYyBiL3NyYy9tb2Rlcy9vZmIvb2ZiX2VuY3J5cHQuYwpzaW1pbGFyaXR5IGluZGV4IDYzJQpyZW5hbWUgZnJvbSBvZmJfZW5jcnlwdC5jCnJlbmFtZSB0byBzcmMvbW9kZXMvb2ZiL29mYl9lbmNyeXB0LmMKaW5kZXggZDVkMDZmMy4uZDY2OTc5YSAxMDA2NDQKLS0tIGEvb2ZiX2VuY3J5cHQuYworKysgYi9zcmMvbW9kZXMvb2ZiL29mYl9lbmNyeXB0LmMKQEAgLTYsMTggKzYsMzEgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgb2ZiX2VuY3J5cHQuYworICBPRkIgaW1wbGVtZW50YXRpb24sIGVuY3J5cHQgZGF0YSwgVG9tIFN0IERlbmlzCisqLwogCiAjaWZkZWYgT0ZCCiAKKy8qKgorICBPRkIgZW5jcnlwdAorICBAcGFyYW0gcHQgICAgIFBsYWludGV4dAorICBAcGFyYW0gY3QgICAgIFtvdXRdIENpcGhlcnRleHQKKyAgQHBhcmFtIGxlbiAgICBMZW5ndGggb2YgcGxhaW50ZXh0IChvY3RldHMpCisgIEBwYXJhbSBvZmIgICAgT0ZCIHN0YXRlCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIGludCBvZmJfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICpwdCwgdW5zaWduZWQgY2hhciAqY3QsIHVuc2lnbmVkIGxvbmcgbGVuLCBzeW1tZXRyaWNfT0ZCICpvZmIpCiB7CiAgICBpbnQgZXJyOwotICAgX0FSR0NISyhwdCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoY3QgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG9mYiAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGN0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvZmIgIT0gTlVMTCk7CiAgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChvZmItPmNpcGhlcikpICE9IENSWVBUX09LKSB7CiAgICAgICAgcmV0dXJuIGVycjsKICAgIH0KQEAgLTM5LDMgKzUyLDcgQEAKIH0KIAogI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9vZmIvb2ZiX2VuY3J5cHQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9tb2Rlcy9vZmIvb2ZiX2dldGl2LmMgYi9zcmMvbW9kZXMvb2ZiL29mYl9nZXRpdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDVmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbW9kZXMvb2ZiL29mYl9nZXRpdi5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBvZmJfZ2V0aXYuYworICAgT0ZCIGltcGxlbWVudGF0aW9uLCBnZXQgSVYsIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIE9GQgorCisvKioKKyAgIEdldCB0aGUgY3VycmVudCBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIElWICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIGxlbiAgW2luL291dF0gIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIGluaXRpYWwgdmVjdG9yCisgICBAcGFyYW0gb2ZiICBUaGUgT0ZCIHN0YXRlCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgb2ZiX2dldGl2KHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nICpsZW4sIHN5bW1ldHJpY19PRkIgKm9mYikKK3sKKyAgIExUQ19BUkdDSEsoSVYgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhsZW4gIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG9mYiAhPSBOVUxMKTsKKyAgIGlmICgodW5zaWduZWQgbG9uZylvZmItPmJsb2NrbGVuID4gKmxlbikgeworICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgIH0KKyAgIFhNRU1DUFkoSVYsIG9mYi0+SVYsIG9mYi0+YmxvY2tsZW4pOworICAgKmxlbiA9IG9mYi0+YmxvY2tsZW47CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9vZmIvb2ZiX2dldGl2LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvbW9kZXMvb2ZiL29mYl9zZXRpdi5jIGIvc3JjL21vZGVzL29mYi9vZmJfc2V0aXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjc4NjAxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21vZGVzL29mYi9vZmJfc2V0aXYuYwpAQCAtMCwwICsxLDUzIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgb2ZiX3NldGl2LmMKKyAgIE9GQiBpbXBsZW1lbnRhdGlvbiwgc2V0IElWLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBPRkIKKworLyoqCisgICBTZXQgYW4gaW5pdGlhbCB2ZWN0b3IKKyAgIEBwYXJhbSBJViAgIFRoZSBpbml0aWFsIHZlY3RvcgorICAgQHBhcmFtIGxlbiAgVGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yIChpbiBvY3RldHMpCisgICBAcGFyYW0gb2ZiICBUaGUgT0ZCIHN0YXRlCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgb2ZiX3NldGl2KGNvbnN0IHVuc2lnbmVkIGNoYXIgKklWLCB1bnNpZ25lZCBsb25nIGxlbiwgc3ltbWV0cmljX09GQiAqb2ZiKQoreworICAgaW50IGVycjsKKworICAgTFRDX0FSR0NISyhJViAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG9mYiAhPSBOVUxMKTsKKworICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQob2ZiLT5jaXBoZXIpKSAhPSBDUllQVF9PSykgeworICAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIGlmIChsZW4gIT0gKHVuc2lnbmVkIGxvbmcpb2ZiLT5ibG9ja2xlbikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICAvKiBmb3JjZSBuZXh0IGJsb2NrICovCisgICBvZmItPnBhZGxlbiA9IDA7CisgICBjaXBoZXJfZGVzY3JpcHRvcltvZmItPmNpcGhlcl0uZWNiX2VuY3J5cHQoSVYsIG9mYi0+SVYsICZvZmItPmtleSk7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZiAKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvbW9kZXMvb2ZiL29mYl9zZXRpdi5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21vZGVzL29mYi9vZmJfc3RhcnQuYyBiL3NyYy9tb2Rlcy9vZmIvb2ZiX3N0YXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzZTM4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tb2Rlcy9vZmIvb2ZiX3N0YXJ0LmMKQEAgLTAsMCArMSw2MCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgIEBmaWxlIG9mYl9zdGFydC5jCisgICBPRkIgaW1wbGVtZW50YXRpb24sIHN0YXJ0IGNoYWluLCBUb20gU3QgRGVuaXMKKyovCisKKworI2lmZGVmIE9GQgorCisvKioKKyAgIEluaXRpYWxpemUgYSBPRkIgY29udGV4dAorICAgQHBhcmFtIGNpcGhlciAgICAgIFRoZSBpbmRleCBvZiB0aGUgY2lwaGVyIGRlc2lyZWQKKyAgIEBwYXJhbSBJViAgICAgICAgICBUaGUgaW5pdGlhbCB2ZWN0b3IKKyAgIEBwYXJhbSBrZXkgICAgICAgICBUaGUgc2VjcmV0IGtleSAKKyAgIEBwYXJhbSBrZXlsZW4gICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzZWNyZXQga2V5IChvY3RldHMpCisgICBAcGFyYW0gbnVtX3JvdW5kcyAgTnVtYmVyIG9mIHJvdW5kcyBpbiB0aGUgY2lwaGVyIGRlc2lyZWQgKDAgZm9yIGRlZmF1bHQpCisgICBAcGFyYW0gb2ZiICAgICAgICAgVGhlIE9GQiBzdGF0ZSB0byBpbml0aWFsaXplCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgb2ZiX3N0YXJ0KGludCBjaXBoZXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKklWLCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIAorICAgICAgICAgICAgICBpbnQga2V5bGVuLCBpbnQgbnVtX3JvdW5kcywgc3ltbWV0cmljX09GQiAqb2ZiKQoreworICAgaW50IHgsIGVycjsKKworICAgTFRDX0FSR0NISyhJViAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvZmIgIT0gTlVMTCk7CisKKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKGNpcGhlcikpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICAvKiBjb3B5IGRldGFpbHMgKi8KKyAgIG9mYi0+Y2lwaGVyID0gY2lwaGVyOworICAgb2ZiLT5ibG9ja2xlbiA9IGNpcGhlcl9kZXNjcmlwdG9yW2NpcGhlcl0uYmxvY2tfbGVuZ3RoOworICAgZm9yICh4ID0gMDsgeCA8IG9mYi0+YmxvY2tsZW47IHgrKykgeworICAgICAgIG9mYi0+SVZbeF0gPSBJVlt4XTsKKyAgIH0KKworICAgLyogaW5pdCB0aGUgY2lwaGVyICovCisgICBvZmItPnBhZGxlbiA9IG9mYi0+YmxvY2tsZW47CisgICByZXR1cm4gY2lwaGVyX2Rlc2NyaXB0b3JbY2lwaGVyXS5zZXR1cChrZXksIGtleWxlbiwgbnVtX3JvdW5kcywgJm9mYi0+a2V5KTsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9tb2Rlcy9vZmIvb2ZiX3N0YXJ0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvYXNuMS9kZXIvYml0L2Rlcl9kZWNvZGVfYml0X3N0cmluZy5jIGIvc3JjL3BrL2FzbjEvZGVyL2JpdC9kZXJfZGVjb2RlX2JpdF9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTViOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL2JpdC9kZXJfZGVjb2RlX2JpdF9zdHJpbmcuYwpAQCAtMCwwICsxLDEwMSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2RlY29kZV9iaXRfc3RyaW5nLmMKKyAgQVNOLjEgREVSLCBlbmNvZGUgYSBCSVQgU1RSSU5HLCBUb20gU3QgRGVuaXMKKyovCisKKworI2lmZGVmIExUQ19ERVIKKworLyoqCisgIFN0b3JlIGEgQklUIFNUUklORworICBAcGFyYW0gaW4gICAgICBUaGUgREVSIGVuY29kZWQgQklUIFNUUklORworICBAcGFyYW0gaW5sZW4gICBUaGUgc2l6ZSBvZiB0aGUgREVSIEJJVCBTVFJJTkcKKyAgQHBhcmFtIG91dCAgICAgW291dF0gVGhlIGFycmF5IG9mIGJpdHMgc3RvcmVkIChvbmUgcGVyIGNoYXIpCisgIEBwYXJhbSBvdXRsZW4gIFtpbi9vdXRdIFRoZSBudW1iZXIgb2YgYml0cyBzdG9yZWQKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGRlcl9kZWNvZGVfYml0X3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworICAgdW5zaWduZWQgbG9uZyBkbGVuLCBibGVuLCB4LCB5OworCisgICBMVENfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKyAgIC8qIHBhY2tldCBtdXN0IGJlIGF0IGxlYXN0IDQgYnl0ZXMgKi8KKyAgIGlmIChpbmxlbiA8IDQpIHsKKyAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisKKyAgIC8qIGNoZWNrIGZvciAweDAzICovCisgICBpZiAoKGluWzBdJjB4MUYpICE9IDB4MDMpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgIH0KKworICAgIC8qIG9mZnNldCBpbiB0aGUgZGF0YSAqLworICAgIHggPSAxOworCisgICAvKiBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAqLworICAgaWYgKGluW3hdICYgMHg4MCkgeworICAgICAgLyogbG9uZyBmb3JtYXQgZ2V0IG51bWJlciBvZiBsZW5ndGggYnl0ZXMgKi8KKyAgICAgIHkgPSBpblt4KytdICYgMTI3OworCisgICAgICAvKiBpbnZhbGlkIGlmIDAgb3IgPiAyICovCisgICAgICBpZiAoeSA9PSAwIHx8IHkgPiAyKSB7CisgICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICAgICB9CisKKyAgICAgIC8qIHJlYWQgdGhlIGRhdGEgbGVuICovCisgICAgICBkbGVuID0gMDsKKyAgICAgIHdoaWxlICh5LS0pIHsKKyAgICAgICAgIGRsZW4gPSAoZGxlbiA8PCA4KSB8ICh1bnNpZ25lZCBsb25nKWluW3grK107CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgLyogc2hvcnQgZm9ybWF0ICovCisgICAgICBkbGVuID0gaW5beCsrXSAmIDEyNzsKKyAgIH0KKyAgCisgICAvKiBpcyB0aGUgZGF0YSBsZW4gdG9vIGxvbmcgb3IgdG9vIHNob3J0PyAqLworICAgaWYgKChkbGVuID09IDApIHx8IChkbGVuICsgeCA+IGlubGVuKSkgeworICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgIH0KKworICAgLyogZ2V0IHBhZGRpbmcgY291bnQgKi8KKyAgIGJsZW4gPSAoKGRsZW4gLSAxKSA8PCAzKSAtIChpblt4KytdICYgNyk7CisKKyAgIC8qIHRvbyBtYW55IGJpdHM/ICovCisgICBpZiAoYmxlbiA+ICpvdXRsZW4pIHsKKyAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICB9CisKKyAgIC8qIGRlY29kZS9zdG9yZSB0aGUgYml0cyAqLworICAgZm9yICh5ID0gMDsgeSA8IGJsZW47IHkrKykgeworICAgICAgIG91dFt5XSA9IChpblt4XSAmICgxIDw8ICg3IC0gKHkgJiA3KSkpKSA/IDEgOiAwOworICAgICAgIGlmICgoeSAmIDcpID09IDcpIHsKKyAgICAgICAgICArK3g7CisgICAgICAgfQorICAgfQorCisgICAvKiB3ZSBkb25lICovCisgICAqb3V0bGVuID0gYmxlbjsKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci9iaXQvZGVyX2RlY29kZV9iaXRfc3RyaW5nLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8xNiAxNTowODoxMSAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvYXNuMS9kZXIvYml0L2Rlcl9lbmNvZGVfYml0X3N0cmluZy5jIGIvc3JjL3BrL2FzbjEvZGVyL2JpdC9kZXJfZW5jb2RlX2JpdF9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjljMTViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL2JpdC9kZXJfZW5jb2RlX2JpdF9zdHJpbmcuYwpAQCAtMCwwICsxLDg3IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBkZXJfZW5jb2RlX2JpdF9zdHJpbmcuYworICBBU04uMSBERVIsIGVuY29kZSBhIEJJVCBTVFJJTkcsIFRvbSBTdCBEZW5pcworKi8KKworCisjaWZkZWYgTFRDX0RFUgorCisvKioKKyAgU3RvcmUgYSBCSVQgU1RSSU5HCisgIEBwYXJhbSBpbiAgICAgICBUaGUgYXJyYXkgb2YgYml0cyB0byBzdG9yZSAob25lIHBlciBjaGFyKQorICBAcGFyYW0gaW5sZW4gICAgVGhlIG51bWJlciBvZiBiaXRzIHRvc3RvcmUKKyAgQHBhcmFtIG91dCAgICAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIERFUiBlbmNvZGVkIEJJVCBTVFJJTkcKKyAgQHBhcmFtIG91dGxlbiAgIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIERFUiBCSVQgU1RSSU5HCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBkZXJfZW5jb2RlX2JpdF9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworICAgdW5zaWduZWQgbG9uZyBsZW4sIHgsIHksIGJ1ZjsKKyAgIGludCAgICAgICAgICAgZXJyOworCisgICBMVENfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKyAgIC8qIGF2b2lkIG92ZXJmbG93cyAqLworICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX2JpdF9zdHJpbmcoaW5sZW4sICZsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgaWYgKGxlbiA+ICpvdXRsZW4pIHsKKyAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICB9CisKKyAgIC8qIHN0b3JlIGhlYWRlciAoaW5jbHVkZSBiaXQgcGFkZGluZyBjb3VudCBpbiBsZW5ndGgpICovCisgICB4ID0gMDsKKyAgIHkgPSAoaW5sZW4gPj4gMykgKyAoKGlubGVuJjcpID8gMSA6IDApICsgMTsKKworICAgb3V0W3grK10gPSAweDAzOworICAgaWYgKHkgPCAxMjgpIHsKKyAgICAgIG91dFt4KytdID0geTsKKyAgIH0gZWxzZSBpZiAoeSA8IDI1NikgeworICAgICAgb3V0W3grK10gPSAweDgxOworICAgICAgb3V0W3grK10gPSB5OworICAgfSBlbHNlIGlmICh5IDwgNjU1MzYpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MjsKKyAgICAgIG91dFt4KytdID0gKHk+PjgpJjI1NTsKKyAgICAgIG91dFt4KytdID0geSYyNTU7CisgICB9CisKKyAgIC8qIHN0b3JlIG51bWJlciBvZiB6ZXJvIHBhZGRpbmcgYml0cyAqLworICAgb3V0W3grK10gPSAoOCAtIGlubGVuKSAmIDc7CisKKyAgIC8qIHN0b3JlIHRoZSBiaXRzIGluIGJpZyBlbmRpYW4gZm9ybWF0ICovCisgICBmb3IgKHkgPSBidWYgPSAwOyB5IDwgaW5sZW47IHkrKykgeworICAgICAgIGJ1ZiB8PSAoaW5beV0gPyAxIDogMCkgPDwgKDcgLSAoeSAmIDcpKTsKKyAgICAgICBpZiAoKHkgJiA3KSA9PSA3KSB7CisgICAgICAgICAgb3V0W3grK10gPSBidWY7CisgICAgICAgICAgYnVmICAgICAgPSAwOworICAgICAgIH0KKyAgIH0KKyAgIC8qIHN0b3JlIGxhc3QgYnl0ZSAqLworICAgaWYgKGlubGVuICYgNykgeworICAgICAgb3V0W3grK10gPSBidWY7CisgICB9CisgICAqb3V0bGVuID0geDsKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci9iaXQvZGVyX2VuY29kZV9iaXRfc3RyaW5nLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8xNiAxNTowODoxMSAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvYXNuMS9kZXIvYml0L2Rlcl9sZW5ndGhfYml0X3N0cmluZy5jIGIvc3JjL3BrL2FzbjEvZGVyL2JpdC9kZXJfbGVuZ3RoX2JpdF9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDZlYTZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL2JpdC9kZXJfbGVuZ3RoX2JpdF9zdHJpbmcuYwpAQCAtMCwwICsxLDU0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBkZXJfbGVuZ3RoX2JpdF9zdHJpbmcuYworICBBU04uMSBERVIsIGdldCBsZW5ndGggb2YgQklUIFNUUklORywgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgTFRDX0RFUgorLyoqCisgIEdldHMgbGVuZ3RoIG9mIERFUiBlbmNvZGluZyBvZiBCSVQgU1RSSU5HIAorICBAcGFyYW0gbmJpdHMgIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgc3RyaW5nIHRvIGVuY29kZQorICBAcGFyYW0gb3V0bGVuIFtvdXRdIFRoZSBsZW5ndGggb2YgdGhlIERFUiBlbmNvZGluZyBmb3IgdGhlIGdpdmVuIHN0cmluZworICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZGVyX2xlbmd0aF9iaXRfc3RyaW5nKHVuc2lnbmVkIGxvbmcgbmJpdHMsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgbmJ5dGVzOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKyAgIC8qIGdldCB0aGUgbnVtYmVyIG9mIHRoZSBieXRlcyAqLworICAgbmJ5dGVzID0gKG5iaXRzID4+IDMpICsgKChuYml0cyAmIDcpID8gMSA6IDApICsgMTsKKyAKKyAgIGlmIChuYnl0ZXMgPCAxMjgpIHsKKyAgICAgIC8qIDAzIExMIFBQIEREIEREIEREIC4uLiAqLworICAgICAgKm91dGxlbiA9IDIgKyBuYnl0ZXM7CisgICB9IGVsc2UgaWYgKG5ieXRlcyA8IDI1NikgeworICAgICAgLyogMDMgODEgTEwgUFAgREQgREQgREQgLi4uICovCisgICAgICAqb3V0bGVuID0gMyArIG5ieXRlczsKKyAgIH0gZWxzZSBpZiAobmJ5dGVzIDwgNjU1MzYpIHsKKyAgICAgIC8qIDAzIDgyIExMIExMIFBQIEREIEREIEREIC4uLiAqLworICAgICAgKm91dGxlbiA9IDQgKyBuYnl0ZXM7CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci9iaXQvZGVyX2xlbmd0aF9iaXRfc3RyaW5nLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8xNiAxNTowODoxMSAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvYXNuMS9kZXIvY2hvaWNlL2Rlcl9kZWNvZGVfY2hvaWNlLmMgYi9zcmMvcGsvYXNuMS9kZXIvY2hvaWNlL2Rlcl9kZWNvZGVfY2hvaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjYmExMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci9jaG9pY2UvZGVyX2RlY29kZV9jaG9pY2UuYwpAQCAtMCwwICsxLDE2OCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2RlY29kZV9jaG9pY2UuYworICBBU04uMSBERVIsIGRlY29kZSBhIENIT0lDRSwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgTFRDX0RFUgorCisvKioKKyAgIERlY29kZSBhIENIT0lDRQorICAgQHBhcmFtIGluICAgICAgIFRoZSBERVIgZW5jb2RlZCBpbnB1dAorICAgQHBhcmFtIGlubGVuICAgIFtpbi9vdXRdIFRoZSBzaXplIG9mIHRoZSBpbnB1dCBhbmQgcmVzdWx0aW5nIHNpemUgb2YgcmVhZCB0eXBlCisgICBAcGFyYW0gbGlzdCAgICAgVGhlIGxpc3Qgb2YgaXRlbXMgdG8gZGVjb2RlCisgICBAcGFyYW0gb3V0bGVuICAgVGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdAorICAgQHJldHVybiBDUllQVF9PSyBvbiBzdWNjZXNzCisqLworaW50IGRlcl9kZWNvZGVfY2hvaWNlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgIHVuc2lnbmVkIGxvbmcgKmlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0Y19hc24xX2xpc3QgKmxpc3QsIHVuc2lnbmVkIGxvbmcgIG91dGxlbikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgeCwgejsKKyAgIHZvaWQgICAgICAgICAgKmRhdGE7CisKKyAgIExUQ19BUkdDSEsoaW4gICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGlubGVuICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhsaXN0ICAhPSBOVUxMKTsKKworICAgLyogZ2V0IGJsayBzaXplICovCisgICBpZiAoKmlubGVuIDwgMikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgfQorCisgICAvKiBzZXQgYWxsIG9mIHRoZSAidXNlZCIgZmxhZ3MgdG8gemVybyAqLworICAgZm9yICh4ID0gMDsgeCA8IG91dGxlbjsgeCsrKSB7CisgICAgICAgbGlzdFt4XS51c2VkID0gMDsKKyAgIH0KKworICAgLyogbm93IHNjYW4gdW50aWwgd2UgaGF2ZSBhIHdpbm5lciAqLworICAgZm9yICh4ID0gMDsgeCA8IG91dGxlbjsgeCsrKSB7CisgICAgICAgc2l6ZSA9IGxpc3RbeF0uc2l6ZTsKKyAgICAgICBkYXRhID0gbGlzdFt4XS5kYXRhOworCisgICAgICAgc3dpdGNoIChsaXN0W3hdLnR5cGUpIHsKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9JTlRFR0VSOgorICAgICAgICAgICAgICAgaWYgKGRlcl9kZWNvZGVfaW50ZWdlcihpbiwgKmlubGVuLCBkYXRhKSA9PSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgaWYgKGRlcl9sZW5ndGhfaW50ZWdlcihkYXRhLCAmeikgPT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICBsaXN0W3hdLnVzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICppbmxlbiAgICAgICA9IHo7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENSWVBUX09LOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9TSE9SVF9JTlRFR0VSOgorICAgICAgICAgICAgICAgaWYgKGRlcl9kZWNvZGVfc2hvcnRfaW50ZWdlcihpbiwgKmlubGVuLCBkYXRhKSA9PSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgaWYgKGRlcl9sZW5ndGhfc2hvcnRfaW50ZWdlcihzaXplLCAmeikgPT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICBsaXN0W3hdLnVzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICppbmxlbiAgICAgICA9IHo7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENSWVBUX09LOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9CSVRfU1RSSU5HOgorICAgICAgICAgICAgICAgaWYgKGRlcl9kZWNvZGVfYml0X3N0cmluZyhpbiwgKmlubGVuLCBkYXRhLCAmc2l6ZSkgPT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGlmIChkZXJfbGVuZ3RoX2JpdF9zdHJpbmcoc2l6ZSwgJnopID09IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICAgICBsaXN0W3hdLnVzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgbGlzdFt4XS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICppbmxlbiAgICAgICA9IHo7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1JZUFRfT0s7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX09DVEVUX1NUUklORzoKKyAgICAgICAgICAgICAgIGlmIChkZXJfZGVjb2RlX29jdGV0X3N0cmluZyhpbiwgKmlubGVuLCBkYXRhLCAmc2l6ZSkgPT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGlmIChkZXJfbGVuZ3RoX29jdGV0X3N0cmluZyhzaXplLCAmeikgPT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RbeF0udXNlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICBsaXN0W3hdLnNpemUgPSBzaXplOworICAgICAgICAgICAgICAgICAgICAgKmlubGVuICAgICAgID0gejsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDUllQVF9PSzsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfTlVMTDoKKyAgICAgICAgICAgICAgIGlmICgqaW5sZW4gPT0gMiAmJiBpblt4XSA9PSAweDA1ICYmIGluW3grMV0gPT0gMHgwMCkgeworICAgICAgICAgICAgICAgICAgKmlubGVuID0gMjsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBDUllQVF9PSzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfT0JKRUNUX0lERU5USUZJRVI6CisgICAgICAgICAgICAgICBpZiAoZGVyX2RlY29kZV9vYmplY3RfaWRlbnRpZmllcihpbiwgKmlubGVuLCBkYXRhLCAmc2l6ZSkgPT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGlmIChkZXJfbGVuZ3RoX29iamVjdF9pZGVudGlmaWVyKGRhdGEsIHNpemUsICZ6KSA9PSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgICAgbGlzdFt4XS51c2VkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RbeF0uc2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgICAgICAqaW5sZW4gICAgICAgPSB6OworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENSWVBUX09LOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9JQTVfU1RSSU5HOgorICAgICAgICAgICAgICAgaWYgKGRlcl9kZWNvZGVfaWE1X3N0cmluZyhpbiwgKmlubGVuLCBkYXRhLCAmc2l6ZSkgPT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGlmIChkZXJfbGVuZ3RoX2lhNV9zdHJpbmcoZGF0YSwgc2l6ZSwgJnopID09IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICAgICBsaXN0W3hdLnVzZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgbGlzdFt4XS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICppbmxlbiAgICAgICA9IHo7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1JZUFRfT0s7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfUFJJTlRBQkxFX1NUUklORzoKKyAgICAgICAgICAgICAgIGlmIChkZXJfZGVjb2RlX3ByaW50YWJsZV9zdHJpbmcoaW4sICppbmxlbiwgZGF0YSwgJnNpemUpID09IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBpZiAoZGVyX2xlbmd0aF9wcmludGFibGVfc3RyaW5nKGRhdGEsIHNpemUsICZ6KSA9PSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgICAgbGlzdFt4XS51c2VkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RbeF0uc2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgICAgICAqaW5sZW4gICAgICAgPSB6OworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENSWVBUX09LOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9VVENUSU1FOgorICAgICAgICAgICAgICAgeiA9ICppbmxlbjsKKyAgICAgICAgICAgICAgIGlmIChkZXJfZGVjb2RlX3V0Y3RpbWUoaW4sICZ6LCBkYXRhKSA9PSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgbGlzdFt4XS51c2VkID0gMTsKKyAgICAgICAgICAgICAgICAgICppbmxlbiAgICAgICA9IHo7CisgICAgICAgICAgICAgICAgICByZXR1cm4gQ1JZUFRfT0s7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX1NFUVVFTkNFOgorICAgICAgICAgICAgICAgaWYgKGRlcl9kZWNvZGVfc2VxdWVuY2UoaW4sICppbmxlbiwgZGF0YSwgc2l6ZSkgPT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGlmIChkZXJfbGVuZ3RoX3NlcXVlbmNlKGRhdGEsIHNpemUsICZ6KSA9PSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgICAgbGlzdFt4XS51c2VkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICppbmxlbiAgICAgICA9IHo7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1JZUFRfT0s7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgICAgIH0KKyAgIH0KKworICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL2FzbjEvZGVyL2Nob2ljZS9kZXJfZGVjb2RlX2Nob2ljZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTE6MjU6MDEgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL2lhNS9kZXJfZGVjb2RlX2lhNV9zdHJpbmcuYyBiL3NyYy9way9hc24xL2Rlci9pYTUvZGVyX2RlY29kZV9pYTVfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwYTRhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci9pYTUvZGVyX2RlY29kZV9pYTVfc3RyaW5nLmMKQEAgLTAsMCArMSw5NSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2RlY29kZV9pYTVfc3RyaW5nLmMKKyAgQVNOLjEgREVSLCBlbmNvZGUgYSBJQTUgU1RSSU5HLCBUb20gU3QgRGVuaXMKKyovCisKKworI2lmZGVmIExUQ19ERVIKKworLyoqCisgIFN0b3JlIGEgSUE1IFNUUklORworICBAcGFyYW0gaW4gICAgICBUaGUgREVSIGVuY29kZWQgSUE1IFNUUklORworICBAcGFyYW0gaW5sZW4gICBUaGUgc2l6ZSBvZiB0aGUgREVSIElBNSBTVFJJTkcKKyAgQHBhcmFtIG91dCAgICAgW291dF0gVGhlIGFycmF5IG9mIG9jdGV0cyBzdG9yZWQgKG9uZSBwZXIgY2hhcikKKyAgQHBhcmFtIG91dGxlbiAgW2luL291dF0gVGhlIG51bWJlciBvZiBvY3RldHMgc3RvcmVkCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBkZXJfZGVjb2RlX2lhNV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworICAgdW5zaWduZWQgbG9uZyB4LCB5LCBsZW47CisgICBpbnQgICAgICAgICAgIHQ7CisKKyAgIExUQ19BUkdDSEsoaW4gICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKworICAgLyogbXVzdCBoYXZlIGhlYWRlciBhdCBsZWFzdCAqLworICAgaWYgKGlubGVuIDwgMikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgfQorCisgICAvKiBjaGVjayBmb3IgMHgxNiAqLworICAgaWYgKChpblswXSAmIDB4MUYpICE9IDB4MTYpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgIH0KKyAgIHggPSAxOworCisgICAvKiBkZWNvZGUgdGhlIGxlbmd0aCAqLworICAgaWYgKGluW3hdICYgMHg4MCkgeworICAgICAgLyogdmFsaWQgIyBvZiBieXRlcyBpbiBsZW5ndGggYXJlIDEsMiwzICovCisgICAgICB5ID0gaW5beF0gJiAweDdGOworICAgICAgaWYgKCh5ID09IDApIHx8ICh5ID4gMykgfHwgKCh4ICsgeSkgPiBpbmxlbikpIHsKKyAgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgIH0KKworICAgICAgLyogcmVhZCB0aGUgbGVuZ3RoIGluICovCisgICAgICBsZW4gPSAwOworICAgICAgKyt4OworICAgICAgd2hpbGUgKHktLSkgeworICAgICAgICAgbGVuID0gKGxlbiA8PCA4KSB8IGluW3grK107CisgICAgICB9CisgICB9IGVsc2UgeworICAgICAgbGVuID0gaW5beCsrXSAmIDB4N0Y7CisgICB9CisKKyAgIC8qIGlzIGl0IHRvbyBsb25nPyAqLworICAgaWYgKGxlbiA+ICpvdXRsZW4pIHsKKyAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICB9CisKKyAgIGlmIChsZW4gKyB4ID4gaW5sZW4pIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgIH0KKworICAgLyogcmVhZCB0aGUgZGF0YSAqLworICAgZm9yICh5ID0gMDsgeSA8IGxlbjsgeSsrKSB7CisgICAgICAgdCA9IGRlcl9pYTVfdmFsdWVfZGVjb2RlKGluW3grK10pOworICAgICAgIGlmICh0ID09IC0xKSB7CisgICAgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgICAgICB9CisgICAgICAgb3V0W3ldID0gdDsKKyAgIH0KKworICAgKm91dGxlbiA9IHk7CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKyAKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvYXNuMS9kZXIvaWE1L2Rlcl9kZWNvZGVfaWE1X3N0cmluZy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTYgMTU6MDg6MTEgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL2lhNS9kZXJfZW5jb2RlX2lhNV9zdHJpbmcuYyBiL3NyYy9way9hc24xL2Rlci9pYTUvZGVyX2VuY29kZV9pYTVfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5YjQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci9pYTUvZGVyX2VuY29kZV9pYTVfc3RyaW5nLmMKQEAgLTAsMCArMSw4NCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2VuY29kZV9pYTVfc3RyaW5nLmMKKyAgQVNOLjEgREVSLCBlbmNvZGUgYSBJQTUgU1RSSU5HLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBMVENfREVSCisKKy8qKgorICBTdG9yZSBhbiBJQTUgU1RSSU5HCisgIEBwYXJhbSBpbiAgICAgICBUaGUgYXJyYXkgb2YgSUE1IHRvIHN0b3JlIChvbmUgcGVyIGNoYXIpCisgIEBwYXJhbSBpbmxlbiAgICBUaGUgbnVtYmVyIG9mIElBNSB0byBzdG9yZQorICBAcGFyYW0gb3V0ICAgICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgREVSIGVuY29kZWQgSUE1IFNUUklORworICBAcGFyYW0gb3V0bGVuICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgREVSIElBNSBTVFJJTkcKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGRlcl9lbmNvZGVfaWE1X3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICB1bnNpZ25lZCBsb25nIHgsIHksIGxlbjsKKyAgIGludCAgICAgICAgICAgZXJyOworCisgICBMVENfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKyAgIC8qIGdldCB0aGUgc2l6ZSAqLworICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX2lhNV9zdHJpbmcoaW4sIGlubGVuLCAmbGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7IAorICAgfQorCisgICAvKiB0b28gYmlnPyAqLworICAgaWYgKGxlbiA+ICpvdXRsZW4pIHsKKyAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICB9CisKKyAgIC8qIGVuY29kZSB0aGUgaGVhZGVyK2xlbiAqLworICAgeCA9IDA7CisgICBvdXRbeCsrXSA9IDB4MTY7CisgICBpZiAoaW5sZW4gPCAxMjgpIHsKKyAgICAgIG91dFt4KytdID0gaW5sZW47CisgICB9IGVsc2UgaWYgKGlubGVuIDwgMjU2KSB7CisgICAgICBvdXRbeCsrXSA9IDB4ODE7CisgICAgICBvdXRbeCsrXSA9IGlubGVuOworICAgfSBlbHNlIGlmIChpbmxlbiA8IDY1NTM2VUwpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MjsKKyAgICAgIG91dFt4KytdID0gKGlubGVuPj44KSYyNTU7CisgICAgICBvdXRbeCsrXSA9IGlubGVuJjI1NTsKKyAgIH0gZWxzZSBpZiAoaW5sZW4gPCAxNjc3NzIxNlVMKSB7CisgICAgICBvdXRbeCsrXSA9IDB4ODM7CisgICAgICBvdXRbeCsrXSA9IChpbmxlbj4+MTYpJjI1NTsKKyAgICAgIG91dFt4KytdID0gKGlubGVuPj44KSYyNTU7CisgICAgICBvdXRbeCsrXSA9IGlubGVuJjI1NTsKKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisKKyAgIC8qIHN0b3JlIG9jdGV0cyAqLworICAgZm9yICh5ID0gMDsgeSA8IGlubGVuOyB5KyspIHsKKyAgICAgICBvdXRbeCsrXSA9IGRlcl9pYTVfY2hhcl9lbmNvZGUoaW5beV0pOworICAgfQorCisgICAvKiByZXR1biBsZW5ndGggKi8KKyAgICpvdXRsZW4gPSB4OworCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvYXNuMS9kZXIvaWE1L2Rlcl9lbmNvZGVfaWE1X3N0cmluZy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTYgMTU6MDg6MTEgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL2lhNS9kZXJfbGVuZ3RoX2lhNV9zdHJpbmcuYyBiL3NyYy9way9hc24xL2Rlci9pYTUvZGVyX2xlbmd0aF9pYTVfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3ZDYzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci9pYTUvZGVyX2xlbmd0aF9pYTVfc3RyaW5nLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGRlcl9sZW5ndGhfaWE1X3N0cmluZy5jCisgIEFTTi4xIERFUiwgZ2V0IGxlbmd0aCBvZiBJQTUgU1RSSU5HLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBMVENfREVSCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgaW50IGNvZGUsIHZhbHVlOworfSBpYTVfdGFibGVbXSA9IHsKK3sgJ1wwJywgMCB9LAoreyAnXGEnLCA3IH0sIAoreyAnXGInLCA4IH0sIAoreyAnXHQnLCA5IH0sIAoreyAnXG4nLCAxMCB9LCAKK3sgJ1xmJywgMTIgfSwgCit7ICdccicsIDEzIH0sIAoreyAnICcsIDMyIH0sIAoreyAnIScsIDMzIH0sIAoreyAnIicsIDM0IH0sIAoreyAnIycsIDM1IH0sIAoreyAnJCcsIDM2IH0sIAoreyAnJScsIDM3IH0sIAoreyAnJicsIDM4IH0sIAoreyAnXCcnLCAzOSB9LCAKK3sgJygnLCA0MCB9LCAKK3sgJyknLCA0MSB9LCAKK3sgJyonLCA0MiB9LCAKK3sgJysnLCA0MyB9LCAKK3sgJywnLCA0NCB9LCAKK3sgJy0nLCA0NSB9LCAKK3sgJy4nLCA0NiB9LCAKK3sgJy8nLCA0NyB9LCAKK3sgJzAnLCA0OCB9LCAKK3sgJzEnLCA0OSB9LCAKK3sgJzInLCA1MCB9LCAKK3sgJzMnLCA1MSB9LCAKK3sgJzQnLCA1MiB9LCAKK3sgJzUnLCA1MyB9LCAKK3sgJzYnLCA1NCB9LCAKK3sgJzcnLCA1NSB9LCAKK3sgJzgnLCA1NiB9LCAKK3sgJzknLCA1NyB9LCAKK3sgJzonLCA1OCB9LCAKK3sgJzsnLCA1OSB9LCAKK3sgJzwnLCA2MCB9LCAKK3sgJz0nLCA2MSB9LCAKK3sgJz4nLCA2MiB9LCAKK3sgJz8nLCA2MyB9LCAKK3sgJ0AnLCA2NCB9LCAKK3sgJ0EnLCA2NSB9LCAKK3sgJ0InLCA2NiB9LCAKK3sgJ0MnLCA2NyB9LCAKK3sgJ0QnLCA2OCB9LCAKK3sgJ0UnLCA2OSB9LCAKK3sgJ0YnLCA3MCB9LCAKK3sgJ0cnLCA3MSB9LCAKK3sgJ0gnLCA3MiB9LCAKK3sgJ0knLCA3MyB9LCAKK3sgJ0onLCA3NCB9LCAKK3sgJ0snLCA3NSB9LCAKK3sgJ0wnLCA3NiB9LCAKK3sgJ00nLCA3NyB9LCAKK3sgJ04nLCA3OCB9LCAKK3sgJ08nLCA3OSB9LCAKK3sgJ1AnLCA4MCB9LCAKK3sgJ1EnLCA4MSB9LCAKK3sgJ1InLCA4MiB9LCAKK3sgJ1MnLCA4MyB9LCAKK3sgJ1QnLCA4NCB9LCAKK3sgJ1UnLCA4NSB9LCAKK3sgJ1YnLCA4NiB9LCAKK3sgJ1cnLCA4NyB9LCAKK3sgJ1gnLCA4OCB9LCAKK3sgJ1knLCA4OSB9LCAKK3sgJ1onLCA5MCB9LCAKK3sgJ1snLCA5MSB9LCAKK3sgJ1xcJywgOTIgfSwgCit7ICddJywgOTMgfSwgCit7ICdeJywgOTQgfSwgCit7ICdfJywgOTUgfSwgCit7ICdgJywgOTYgfSwgCit7ICdhJywgOTcgfSwgCit7ICdiJywgOTggfSwgCit7ICdjJywgOTkgfSwgCit7ICdkJywgMTAwIH0sIAoreyAnZScsIDEwMSB9LCAKK3sgJ2YnLCAxMDIgfSwgCit7ICdnJywgMTAzIH0sIAoreyAnaCcsIDEwNCB9LCAKK3sgJ2knLCAxMDUgfSwgCit7ICdqJywgMTA2IH0sIAoreyAnaycsIDEwNyB9LCAKK3sgJ2wnLCAxMDggfSwgCit7ICdtJywgMTA5IH0sIAoreyAnbicsIDExMCB9LCAKK3sgJ28nLCAxMTEgfSwgCit7ICdwJywgMTEyIH0sIAoreyAncScsIDExMyB9LCAKK3sgJ3InLCAxMTQgfSwgCit7ICdzJywgMTE1IH0sIAoreyAndCcsIDExNiB9LCAKK3sgJ3UnLCAxMTcgfSwgCit7ICd2JywgMTE4IH0sIAoreyAndycsIDExOSB9LCAKK3sgJ3gnLCAxMjAgfSwgCit7ICd5JywgMTIxIH0sIAoreyAneicsIDEyMiB9LCAKK3sgJ3snLCAxMjMgfSwgCit7ICd8JywgMTI0IH0sIAoreyAnfScsIDEyNSB9LCAKK3sgJ34nLCAxMjYgfQorfTsKKworaW50IGRlcl9pYTVfY2hhcl9lbmNvZGUoaW50IGMpCit7CisgICBpbnQgeDsKKyAgIGZvciAoeCA9IDA7IHggPCAoaW50KShzaXplb2YoaWE1X3RhYmxlKS9zaXplb2YoaWE1X3RhYmxlWzBdKSk7IHgrKykgeworICAgICAgIGlmIChpYTVfdGFibGVbeF0uY29kZSA9PSBjKSB7CisgICAgICAgICAgcmV0dXJuIGlhNV90YWJsZVt4XS52YWx1ZTsKKyAgICAgICB9CisgICB9CisgICByZXR1cm4gLTE7Cit9CisKK2ludCBkZXJfaWE1X3ZhbHVlX2RlY29kZShpbnQgdikKK3sKKyAgIGludCB4OworICAgZm9yICh4ID0gMDsgeCA8IChpbnQpKHNpemVvZihpYTVfdGFibGUpL3NpemVvZihpYTVfdGFibGVbMF0pKTsgeCsrKSB7CisgICAgICAgaWYgKGlhNV90YWJsZVt4XS52YWx1ZSA9PSB2KSB7CisgICAgICAgICAgcmV0dXJuIGlhNV90YWJsZVt4XS5jb2RlOworICAgICAgIH0KKyAgIH0KKyAgIHJldHVybiAtMTsKK30KKyAgIAorLyoqCisgIEdldHMgbGVuZ3RoIG9mIERFUiBlbmNvZGluZyBvZiBJQTUgU1RSSU5HIAorICBAcGFyYW0gb2N0ZXRzICAgVGhlIHZhbHVlcyB5b3Ugd2FudCB0byBlbmNvZGUgCisgIEBwYXJhbSBub2N0ZXRzICBUaGUgbnVtYmVyIG9mIG9jdGV0cyBpbiB0aGUgc3RyaW5nIHRvIGVuY29kZQorICBAcGFyYW0gb3V0bGVuICAgW291dF0gVGhlIGxlbmd0aCBvZiB0aGUgREVSIGVuY29kaW5nIGZvciB0aGUgZ2l2ZW4gc3RyaW5nCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBkZXJfbGVuZ3RoX2lhNV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqb2N0ZXRzLCB1bnNpZ25lZCBsb25nIG5vY3RldHMsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgeDsKKworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG9jdGV0cyAhPSBOVUxMKTsKKworICAgLyogc2NhbiBzdHJpbmcgZm9yIHZhbGlkaXR5ICovCisgICBmb3IgKHggPSAwOyB4IDwgbm9jdGV0czsgeCsrKSB7CisgICAgICAgaWYgKGRlcl9pYTVfY2hhcl9lbmNvZGUob2N0ZXRzW3hdKSA9PSAtMSkgeworICAgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgICAgICB9CisgICB9CisKKyAgIGlmIChub2N0ZXRzIDwgMTI4KSB7CisgICAgICAvKiAxNiBMTCBERCBERCBERCAuLi4gKi8KKyAgICAgICpvdXRsZW4gPSAyICsgbm9jdGV0czsKKyAgIH0gZWxzZSBpZiAobm9jdGV0cyA8IDI1NikgeworICAgICAgLyogMTYgODEgTEwgREQgREQgREQgLi4uICovCisgICAgICAqb3V0bGVuID0gMyArIG5vY3RldHM7CisgICB9IGVsc2UgaWYgKG5vY3RldHMgPCA2NTUzNlVMKSB7CisgICAgICAvKiAxNiA4MiBMTCBMTCBERCBERCBERCAuLi4gKi8KKyAgICAgICpvdXRsZW4gPSA0ICsgbm9jdGV0czsKKyAgIH0gZWxzZSBpZiAobm9jdGV0cyA8IDE2Nzc3MjE2VUwpIHsKKyAgICAgIC8qIDE2IDgzIExMIExMIExMIEREIEREIEREIC4uLiAqLworICAgICAgKm91dGxlbiA9IDUgKyBub2N0ZXRzOworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvYXNuMS9kZXIvaWE1L2Rlcl9sZW5ndGhfaWE1X3N0cmluZy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTYgMTU6MDg6MTEgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2RlY29kZV9pbnRlZ2VyLmMgYi9zcmMvcGsvYXNuMS9kZXIvaW50ZWdlci9kZXJfZGVjb2RlX2ludGVnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhiMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2RlY29kZV9pbnRlZ2VyLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGRlcl9kZWNvZGVfaW50ZWdlci5jCisgIEFTTi4xIERFUiwgZGVjb2RlIGFuIGludGVnZXIsIFRvbSBTdCBEZW5pcworKi8KKworCisjaWZkZWYgTFRDX0RFUgorCisvKioKKyAgUmVhZCBhIG1wX2ludCBpbnRlZ2VyCisgIEBwYXJhbSBpbiAgICAgICBUaGUgREVSIGVuY29kZWQgZGF0YQorICBAcGFyYW0gaW5sZW4gICAgU2l6ZSBvZiBERVIgZW5jb2RlZCBkYXRhCisgIEBwYXJhbSBudW0gICAgICBUaGUgZmlyc3QgbXBfaW50IHRvIGRlY29kZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZGVyX2RlY29kZV9pbnRlZ2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBtcF9pbnQgKm51bSkKK3sKKyAgIHVuc2lnbmVkIGxvbmcgeCwgeSwgejsKKyAgIGludCAgICAgICAgICAgZXJyOworCisgICBMVENfQVJHQ0hLKG51bSAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoaW4gICAgICE9IE5VTEwpOworCisgICAvKiBtaW4gREVSIElOVEVHRVIgaXMgMHgwMiAwMSAwMCA9PSAwICovCisgICBpZiAoaW5sZW4gPCAoMSArIDEgKyAxKSkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgfQorCisgICAvKiBvayBleHBlY3QgMHgwMiB3aGVuIHdlIEFORCB3aXRoIDAwMDEgMTExMSBbMUZdICovCisgICB4ID0gMDsKKyAgIGlmICgoaW5beCsrXSAmIDB4MUYpICE9IDB4MDIpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgIH0KKworICAgLyogbm93IGRlY29kZSB0aGUgbGVuIHN0dWZmICovCisgICB6ID0gaW5beCsrXTsKKworICAgaWYgKCh6ICYgMHg4MCkgPT0gMHgwMCkgeworICAgICAgLyogc2hvcnQgZm9ybSAqLworCisgICAgICAvKiB3aWxsIGl0IG92ZXJmbG93PyAqLworICAgICAgaWYgKHggKyB6ID4gaW5sZW4pIHsKKyAgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgIH0KKyAgICAgCisgICAgICAvKiBubyBzbyByZWFkIGl0ICovCisgICAgICBpZiAoKGVyciA9IG1waV90b19sdGNfZXJyb3IobXBfcmVhZF91bnNpZ25lZF9iaW4obnVtLCAodW5zaWduZWQgY2hhciAqKWluICsgeCwgeikpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICAvKiBsb25nIGZvcm0gKi8KKyAgICAgIHogJj0gMHg3RjsKKyAgICAgIAorICAgICAgLyogd2lsbCBudW1iZXIgb2YgbGVuZ3RoIGJ5dGVzIG92ZXJmbG93PyAob3IgPiA0KSAqLworICAgICAgaWYgKCgoeCArIHopID4gaW5sZW4pIHx8ICh6ID4gNCkgfHwgKHogPT0gMCkpIHsKKyAgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgIH0KKworICAgICAgLyogbm93IHJlYWQgaXQgaW4gKi8KKyAgICAgIHkgPSAwOworICAgICAgd2hpbGUgKHotLSkgeworICAgICAgICAgeSA9ICgodW5zaWduZWQgbG9uZykoaW5beCsrXSkpIHwgKHkgPDwgOCk7CisgICAgICB9CisKKyAgICAgIC8qIG5vdyB3aWxsIHJlYWRpbmcgeSBieXRlcyBvdmVycnVuPyAqLworICAgICAgaWYgKCh4ICsgeSkgPiBpbmxlbikgeworICAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgICAgfQorCisgICAgICAvKiBubyBzbyByZWFkIGl0ICovCisgICAgICBpZiAoKGVyciA9IG1waV90b19sdGNfZXJyb3IobXBfcmVhZF91bnNpZ25lZF9iaW4obnVtLCAodW5zaWduZWQgY2hhciAqKWluICsgeCwgeSkpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIH0KKyAgIH0KKworICAgLyogc2VlIGlmIGl0J3MgbmVnYXRpdmUgKi8KKyAgIGlmIChpblt4XSAmIDB4ODApIHsKKyAgICAgIG1wX2ludCB0bXA7CisgICAgICBpZiAobXBfaW5pdCgmdG1wKSAhPSBNUF9PS0FZKSB7CisgICAgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgICAgfQorCisgICAgICBpZiAobXBfMmV4cHQoJnRtcCwgbXBfY291bnRfYml0cyhudW0pKSAhPSBNUF9PS0FZIHx8IG1wX3N1YihudW0sICZ0bXAsIG51bSkgIT0gTVBfT0tBWSkgeworICAgICAgICAgbXBfY2xlYXIoJnRtcCk7CisgICAgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgICAgfQorICAgICAgbXBfY2xlYXIoJnRtcCk7CisgICB9IAorCisgICByZXR1cm4gQ1JZUFRfT0s7CisKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci9pbnRlZ2VyL2Rlcl9kZWNvZGVfaW50ZWdlci5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjIgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMDEgMDA6MDY6MDUgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2VuY29kZV9pbnRlZ2VyLmMgYi9zcmMvcGsvYXNuMS9kZXIvaW50ZWdlci9kZXJfZW5jb2RlX2ludGVnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGY0MWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2VuY29kZV9pbnRlZ2VyLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGRlcl9lbmNvZGVfaW50ZWdlci5jCisgIEFTTi4xIERFUiwgZW5jb2RlIGFuIGludGVnZXIsIFRvbSBTdCBEZW5pcworKi8KKworCisjaWZkZWYgTFRDX0RFUgorCisvKiBFeHBvcnRzIGEgcG9zaXRpdmUgYmlnbnVtIGFzIERFUiBmb3JtYXQgKHVwdG8gMl4zMiBieXRlcyBpbiBzaXplKSAqLworLyoqCisgIFN0b3JlIGEgbXBfaW50IGludGVnZXIKKyAgQHBhcmFtIG51bSAgICAgIFRoZSBmaXJzdCBtcF9pbnQgdG8gZW5jb2RlCisgIEBwYXJhbSBvdXQgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gZm9yIHRoZSBERVIgZW5jb2RlZCBpbnRlZ2VycworICBAcGFyYW0gb3V0bGVuICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgREVSIGVuY29kZWQgaW50ZWdlcnMKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGRlcl9lbmNvZGVfaW50ZWdlcihtcF9pbnQgKm51bSwgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7ICAKKyAgIHVuc2lnbmVkIGxvbmcgdG1wbGVuLCB5OworICAgaW50ICAgICAgICAgICBlcnIsIGxlYWRpbmdfemVybzsKKworICAgTFRDX0FSR0NISyhudW0gICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworCisgICAvKiBmaW5kIG91dCBob3cgYmlnIHRoaXMgd2lsbCBiZSAqLworICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX2ludGVnZXIobnVtLCAmdG1wbGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIGlmICgqb3V0bGVuIDwgdG1wbGVuKSB7CisgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICAgfQorCisgICBpZiAobXBfY21wX2QobnVtLCAwKSAhPSBNUF9MVCkgeworICAgICAgLyogd2Ugb25seSBuZWVkIGEgbGVhZGluZyB6ZXJvIGlmIHRoZSBtc2Igb2YgdGhlIGZpcnN0IGJ5dGUgaXMgb25lICovCisgICAgICBpZiAoKG1wX2NvdW50X2JpdHMobnVtKSAmIDcpID09IDAgfHwgbXBfaXN6ZXJvKG51bSkgPT0gTVBfWUVTKSB7CisgICAgICAgICBsZWFkaW5nX3plcm8gPSAxOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgIGxlYWRpbmdfemVybyA9IDA7CisgICAgICB9CisKKyAgICAgIC8qIGdldCBsZW5ndGggb2YgbnVtIGluIGJ5dGVzIChwbHVzIDEgc2luY2Ugd2UgZm9yY2UgdGhlIG1zYnl0ZSB0byB6ZXJvKSAqLworICAgICAgeSA9IG1wX3Vuc2lnbmVkX2Jpbl9zaXplKG51bSkgKyBsZWFkaW5nX3plcm87CisgICB9IGVsc2UgeworICAgICAgbGVhZGluZ196ZXJvID0gMDsKKyAgICAgIHkgICAgICAgICAgICA9IG1wX2NvdW50X2JpdHMobnVtKTsKKyAgICAgIHkgICAgICAgICAgICA9IHkgKyAoOCAtICh5ICYgNykpOworICAgICAgeSAgICAgICAgICAgID0geSA+PiAzOworCisgICB9CisKKyAgIC8qIG5vdyBzdG9yZSBpbml0aWFsIGRhdGEgKi8KKyAgICpvdXQrKyA9IDB4MDI7CisgICBpZiAoeSA8IDEyOCkgeworICAgICAgLyogc2hvcnQgZm9ybSAqLworICAgICAgKm91dCsrID0gKHVuc2lnbmVkIGNoYXIpeTsKKyAgIH0gZWxzZSBpZiAoeSA8IDI1NikgeworICAgICAgKm91dCsrID0gMHg4MTsKKyAgICAgICpvdXQrKyA9IHk7CisgICB9IGVsc2UgaWYgKHkgPCA2NTUzNlVMKSB7CisgICAgICAqb3V0KysgPSAweDgyOworICAgICAgKm91dCsrID0gKHk+PjgpJjI1NTsKKyAgICAgICpvdXQrKyA9IHk7CisgICB9IGVsc2UgaWYgKHkgPCAxNjc3NzIxNlVMKSB7CisgICAgICAqb3V0KysgPSAweDgzOworICAgICAgKm91dCsrID0gKHk+PjE2KSYyNTU7CisgICAgICAqb3V0KysgPSAoeT4+OCkmMjU1OworICAgICAgKm91dCsrID0geTsKKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisKKyAgIC8qIG5vdyBzdG9yZSBtc2J5dGUgb2YgemVybyBpZiBudW0gaXMgbm9uLXplcm8gKi8KKyAgIGlmIChsZWFkaW5nX3plcm8pIHsKKyAgICAgICpvdXQrKyA9IDB4MDA7CisgICB9CisKKyAgIC8qIGlmIGl0J3Mgbm90IHplcm8gc3RvcmUgaXQgYXMgYmlnIGVuZGlhbiAqLworICAgaWYgKG1wX2NtcF9kKG51bSwgMCkgPT0gTVBfR1QpIHsKKyAgICAgIC8qIG5vdyBzdG9yZSB0aGUgbXBpbnQgKi8KKyAgICAgIGlmICgoZXJyID0gbXBfdG9fdW5zaWduZWRfYmluKG51bSwgb3V0KSkgIT0gTVBfT0tBWSkgeworICAgICAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7CisgICAgICB9CisgICB9IGVsc2UgaWYgKG1wX2lzemVybyhudW0pICE9IE1QX1lFUykgeworICAgICAgbXBfaW50IHRtcDsKKyAgICAgIC8qIG5lZ2F0aXZlICovCisgICAgICBpZiAobXBfaW5pdCgmdG1wKSAhPSBNUF9PS0FZKSB7CisgICAgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgICAgfQorCisgICAgICAvKiAyXnJvdW5kdXAgYW5kIHN1YnRyYWN0ICovCisgICAgICB5ID0gbXBfY291bnRfYml0cyhudW0pOworICAgICAgeSA9IHkgKyAoOCAtICh5ICYgNykpOworICAgICAgaWYgKG1wXzJleHB0KCZ0bXAsIHkpICE9IE1QX09LQVkgfHwgbXBfYWRkKCZ0bXAsIG51bSwgJnRtcCkgIT0gTVBfT0tBWSkgeworICAgICAgICAgbXBfY2xlYXIoJnRtcCk7CisgICAgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgICAgfQorCisgICAgICBpZiAoKGVyciA9IG1wX3RvX3Vuc2lnbmVkX2JpbigmdG1wLCBvdXQpKSAhPSBNUF9PS0FZKSB7CisgICAgICAgICBtcF9jbGVhcigmdG1wKTsKKyAgICAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7CisgICAgICB9CisgICAgICBtcF9jbGVhcigmdG1wKTsKKyAgIH0KKworICAgLyogd2UgZ29vZCAqLworICAgKm91dGxlbiA9IHRtcGxlbjsgCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvYXNuMS9kZXIvaW50ZWdlci9kZXJfZW5jb2RlX2ludGVnZXIuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzE2IDE1OjA4OjExICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9hc24xL2Rlci9pbnRlZ2VyL2Rlcl9sZW5ndGhfaW50ZWdlci5jIGIvc3JjL3BrL2FzbjEvZGVyL2ludGVnZXIvZGVyX2xlbmd0aF9pbnRlZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmZWU0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci9pbnRlZ2VyL2Rlcl9sZW5ndGhfaW50ZWdlci5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGRlcl9sZW5ndGhfaW50ZWdlci5jCisgIEFTTi4xIERFUiwgZ2V0IGxlbmd0aCBvZiBlbmNvZGluZywgVG9tIFN0IERlbmlzCisqLworCisKKyNpZmRlZiBMVENfREVSCisvKioKKyAgR2V0cyBsZW5ndGggb2YgREVSIGVuY29kaW5nIG9mIG51bSAKKyAgQHBhcmFtIG51bSAgICBUaGUgbXBfaW50IHRvIGdldCB0aGUgc2l6ZSBvZiAKKyAgQHBhcmFtIG91dGxlbiBbb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSBERVIgZW5jb2RpbmcgZm9yIHRoZSBnaXZlbiBpbnRlZ2VyCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBkZXJfbGVuZ3RoX2ludGVnZXIobXBfaW50ICpudW0sIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgeiwgbGVuOworICAgaW50ICAgICAgICAgICBsZWFkaW5nX3plcm87CisKKyAgIExUQ19BUkdDSEsobnVtICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICAhPSBOVUxMKTsKKworICAgaWYgKG1wX2NtcF9kKG51bSwgMCkgIT0gTVBfTFQpIHsKKyAgICAgIC8qIHBvc2l0aXZlICovCisKKyAgICAgIC8qIHdlIG9ubHkgbmVlZCBhIGxlYWRpbmcgemVybyBpZiB0aGUgbXNiIG9mIHRoZSBmaXJzdCBieXRlIGlzIG9uZSAqLworICAgICAgaWYgKChtcF9jb3VudF9iaXRzKG51bSkgJiA3KSA9PSAwIHx8IG1wX2lzemVybyhudW0pID09IE1QX1lFUykgeworICAgICAgICAgbGVhZGluZ196ZXJvID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBsZWFkaW5nX3plcm8gPSAwOworICAgICAgfQorCisgICAgICAvKiBzaXplIGZvciBiaWdudW0gKi8KKyAgICAgIHogPSBsZW4gPSBsZWFkaW5nX3plcm8gKyBtcF91bnNpZ25lZF9iaW5fc2l6ZShudW0pOworICAgfSBlbHNlIHsKKyAgICAgIC8qIGl0J3MgbmVnYXRpdmUgKi8KKyAgICAgIC8qIGZpbmQgcG93ZXIgb2YgMiB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgZWlnaHQgYW5kIGdyZWF0ZXIgdGhhbiBjb3VudCBiaXRzICovCisgICAgICBsZWFkaW5nX3plcm8gPSAwOworICAgICAgeiA9IG1wX2NvdW50X2JpdHMobnVtKTsKKyAgICAgIHogPSB6ICsgKDggLSAoeiAmIDcpKTsKKyAgICAgIGxlbiA9IHogPSB6ID4+IDM7CisgICB9CisKKyAgIC8qIG5vdyB3ZSBuZWVkIGEgbGVuZ3RoICovCisgICBpZiAoeiA8IDEyOCkgeworICAgICAgLyogc2hvcnQgZm9ybSAqLworICAgICAgKytsZW47CisgICB9IGVsc2UgeworICAgICAgLyogbG9uZyBmb3JtIChyZWxpZXMgb24geiAhPSAwKSwgYXNzdW1lcyBsZW5ndGggYnl0ZXMgPCAxMjggKi8KKyAgICAgICsrbGVuOworCisgICAgICB3aGlsZSAoeikgeworICAgICAgICAgKytsZW47CisgICAgICAgICB6ID4+PSA4OworICAgICAgfQorICAgfQorCisgICAvKiB3ZSBuZWVkIGEgMHgwMiB0byBpbmRpY2F0ZSBpdCdzIElOVEVHRVIgKi8KKyAgICsrbGVuOworCisgICAvKiByZXR1cm4gbGVuZ3RoICovCisgICAqb3V0bGVuID0gbGVuOyAKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci9pbnRlZ2VyL2Rlcl9sZW5ndGhfaW50ZWdlci5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTYgMTU6MDg6MTEgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL29iamVjdF9pZGVudGlmaWVyL2Rlcl9kZWNvZGVfb2JqZWN0X2lkZW50aWZpZXIuYyBiL3NyYy9way9hc24xL2Rlci9vYmplY3RfaWRlbnRpZmllci9kZXJfZGVjb2RlX29iamVjdF9pZGVudGlmaWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5YzlhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci9vYmplY3RfaWRlbnRpZmllci9kZXJfZGVjb2RlX29iamVjdF9pZGVudGlmaWVyLmMKQEAgLTAsMCArMSw5OSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2RlY29kZV9vYmplY3RfaWRlbnRpZmllci5jCisgIEFTTi4xIERFUiwgRGVjb2RlIE9iamVjdCBJZGVudGlmaWVyLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBMVENfREVSCisvKioKKyAgRGVjb2RlIE9JRCBkYXRhIGFuZCBzdG9yZSB0aGUgYXJyYXkgb2YgaW50ZWdlcnMgaW4gd29yZHMKKyAgQHBhcmFtIGluICAgICAgVGhlIE9JRCBERVIgZW5jb2RlZCBkYXRhCisgIEBwYXJhbSBpbmxlbiAgIFRoZSBsZW5ndGggb2YgdGhlIE9JRCBkYXRhCisgIEBwYXJhbSB3b3JkcyAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgT0lEIHdvcmRzCisgIEBwYXJhbSBvdXRsZW4gIFtpbi9vdXRdIFRoZSBudW1iZXIgb2YgT0lEIHdvcmRzCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBkZXJfZGVjb2RlX29iamVjdF9pZGVudGlmaWVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgICB1bnNpZ25lZCBsb25nICBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKndvcmRzLCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICB1bnNpZ25lZCBsb25nIHgsIHksIHQsIGxlbjsKKworICAgTFRDX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHdvcmRzICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworCisgICAvKiBoZWFkZXIgaXMgYXQgbGVhc3QgMyBieXRlcyAqLworICAgaWYgKGlubGVuIDwgMykgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgfQorCisgICAvKiBtdXN0IGJlIHJvb20gZm9yIGF0IGxlYXN0IHR3byB3b3JkcyAqLworICAgaWYgKCpvdXRsZW4gPCAyKSB7CisgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICAgfQorCisgICAvKiBkZWNvZGUgdGhlIHBhY2tldCBoZWFkZXIgKi8KKyAgIHggPSAwOworICAgaWYgKChpblt4KytdICYgMHgxRikgIT0gMHgwNikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgfQorICAgCisgICAvKiBnZXQgdGhlIGxlbmd0aCAqLworICAgaWYgKGluW3hdIDwgMTI4KSB7CisgICAgICBsZW4gPSBpblt4KytdOyAKKyAgIH0gZWxzZSB7CisgICAgICAgaWYgKGluW3hdIDwgMHg4MSB8fCBpblt4XSA+IDB4ODIpIHsKKyAgICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICAgICAgfQorICAgICAgIHkgICA9IGluW3grK10gJiAweDdGOworICAgICAgIGxlbiA9IDA7CisgICAgICAgd2hpbGUgKHktLSkgeworICAgICAgICAgIGxlbiA9IChsZW4gPDwgOCkgfCAodW5zaWduZWQgbG9uZylpblt4KytdOworICAgICAgIH0KKyAgIH0KKworICAgaWYgKGxlbiA8IDEgfHwgKGxlbiArIHgpID4gaW5sZW4pIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgIH0KKworICAgLyogZGVjb2RlIHdvcmQxIGFuZCB3b3JkMiAqLworICAgLS1sZW47CisgICB0ID0gaW5beCsrXTsKKyAgIHdvcmRzWzBdID0gdC80MDsKKyAgIHdvcmRzWzFdID0gdCU0MDsKKworICAgLyogZGVjb2RlIHJlc3QgKi8KKyAgIHkgPSAyOworICAgdCA9IDA7CisgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgICB0ID0gKHQgPDwgNykgfCAoaW5beF0gJiAweDdGKTsKKyAgICAgICBpZiAoIShpblt4KytdICYgMHg4MCkpIHsKKyAgICAgICAgICAgLyogc3RvcmUgdCAqLworICAgICAgICAgICBpZiAoeSA+PSAqb3V0bGVuKSB7CisgICAgICAgICAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgd29yZHNbeSsrXSA9IHQ7CisgICAgICAgICAgIHQgICAgICAgICAgPSAwOworICAgICAgIH0KKyAgIH0KKyAgICAgICAKKyAgICpvdXRsZW4gPSB5OworICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL2FzbjEvZGVyL29iamVjdF9pZGVudGlmaWVyL2Rlcl9kZWNvZGVfb2JqZWN0X2lkZW50aWZpZXIuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzE2IDE1OjA4OjExICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9hc24xL2Rlci9vYmplY3RfaWRlbnRpZmllci9kZXJfZW5jb2RlX29iamVjdF9pZGVudGlmaWVyLmMgYi9zcmMvcGsvYXNuMS9kZXIvb2JqZWN0X2lkZW50aWZpZXIvZGVyX2VuY29kZV9vYmplY3RfaWRlbnRpZmllci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZWIxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGsvYXNuMS9kZXIvb2JqZWN0X2lkZW50aWZpZXIvZGVyX2VuY29kZV9vYmplY3RfaWRlbnRpZmllci5jCkBAIC0wLDAgKzEsMTAzIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBkZXJfZW5jb2RlX29iamVjdF9pZGVudGlmaWVyLmMKKyAgQVNOLjEgREVSLCBFbmNvZGUgT2JqZWN0IElkZW50aWZpZXIsIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIExUQ19ERVIKKy8qKgorICBFbmNvZGUgYW4gT0lECisgIEBwYXJhbSB3b3JkcyAgIFRoZSB3b3JkcyB0byBlbmNvZGUgICh1cHRvIDMyLWJpdHMgZWFjaCkKKyAgQHBhcmFtIG53b3JkcyAgVGhlIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgT0lECisgIEBwYXJhbSBvdXQgICAgIFtvdXRdIERlc3RpbmF0aW9uIG9mIE9JRCBkYXRhCisgIEBwYXJhbSBvdXRsZW4gIFtpbi9vdXRdIFRoZSBtYXggYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBPSUQKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGRlcl9lbmNvZGVfb2JqZWN0X2lkZW50aWZpZXIodW5zaWduZWQgbG9uZyAqd29yZHMsIHVuc2lnbmVkIGxvbmcgIG53b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICB1bnNpZ25lZCBsb25nIGksIHgsIHksIHosIHQsIG1hc2s7CisgICBpbnQgICAgICAgICAgIGVycjsKKworICAgTFRDX0FSR0NISyh3b3JkcyAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworCisgICAvKiBjaGVjayBsZW5ndGggKi8KKyAgIGlmICgoZXJyID0gZGVyX2xlbmd0aF9vYmplY3RfaWRlbnRpZmllcih3b3JkcywgbndvcmRzLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorICAgaWYgKHggPiAqb3V0bGVuKSB7CisgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICAgfQorCisgICAvKiBjb21wdXRlIGxlbmd0aCB0byBzdG9yZSBPSUQgZGF0YSAqLworICAgeiA9IDE7CisgICBmb3IgKHkgPSAyOyB5IDwgbndvcmRzOyB5KyspIHsKKyAgICAgICB0ID0gZGVyX29iamVjdF9pZGVudGlmaWVyX2JpdHMod29yZHNbeV0pOworICAgICAgIHogKz0gdC83ICsgKCh0JTcpID8gMSA6IDApOworICAgfQorCisgICAvKiBzdG9yZSBoZWFkZXIgKyBsZW5ndGggKi8KKyAgIHggPSAwOyAKKyAgIG91dFt4KytdID0gMHgwNjsKKyAgIGlmICh6IDwgMTI4KSB7CisgICAgICBvdXRbeCsrXSA9IHo7CisgICB9IGVsc2UgaWYgKHogPCAyNTYpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MTsKKyAgICAgIG91dFt4KytdID0gejsKKyAgIH0gZWxzZSBpZiAoeiA8IDY1NTM2VUwpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MjsKKyAgICAgIG91dFt4KytdID0gKHo+PjgpJjI1NTsKKyAgICAgIG91dFt4KytdID0geiYyNTU7CisgICB9IGVsc2UgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICAvKiBzdG9yZSBmaXJzdCBieXRlICovCisgICBvdXRbeCsrXSA9IHdvcmRzWzBdICogNDAgKyB3b3Jkc1sxXTsgICAKKyAgIAorICAgIGZvciAoaSA9IDI7IGkgPCBud29yZHM7IGkrKykgeworICAgICAgICAvKiBzdG9yZSA3IGJpdCB3b3JkcyBpbiBsaXR0bGUgZW5kaWFuICovCisgICAgICAgIHQgICAgPSB3b3Jkc1tpXSAmIDB4RkZGRkZGRkY7CisgICAgICAgIGlmICh0KSB7CisgICAgICAgICAgIHkgICAgPSB4OworICAgICAgICAgICBtYXNrID0gMDsKKyAgICAgICAgICAgd2hpbGUgKHQpIHsKKyAgICAgICAgICAgICAgIG91dFt4KytdID0gKHQgJiAweDdGKSB8IG1hc2s7CisgICAgICAgICAgICAgICB0ICAgID4+PSA3OworICAgICAgICAgICAgICAgbWFzayAgfD0gMHg4MDsgIC8qIHVwcGVyIGJpdCBpcyBzZXQgb24gYWxsIGJ1dCB0aGUgbGFzdCBieXRlICovCisgICAgICAgICAgIH0KKyAgICAgICAgICAgLyogbm93IHN3YXAgYnl0ZXMgeS4uLngtMSAqLworICAgICAgICAgICB6ID0geCAtIDE7CisgICAgICAgICAgIHdoaWxlICh5IDwgeikgeworICAgICAgICAgICAgICAgdCA9IG91dFt5XTsgb3V0W3ldID0gb3V0W3pdOyBvdXRbel0gPSB0OworICAgICAgICAgICAgICAgKyt5OyAKKyAgICAgICAgICAgICAgIC0tejsKKyAgICAgICAgICAgfQorICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLyogemVybyB3b3JkICovCisgICAgICAgICAgb3V0W3grK10gPSAweDAwOworICAgICAgIH0KKyAgIH0KKworICAgKm91dGxlbiA9IHg7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvYXNuMS9kZXIvb2JqZWN0X2lkZW50aWZpZXIvZGVyX2VuY29kZV9vYmplY3RfaWRlbnRpZmllci5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTYgMTU6MDg6MTEgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL29iamVjdF9pZGVudGlmaWVyL2Rlcl9sZW5ndGhfb2JqZWN0X2lkZW50aWZpZXIuYyBiL3NyYy9way9hc24xL2Rlci9vYmplY3RfaWRlbnRpZmllci9kZXJfbGVuZ3RoX29iamVjdF9pZGVudGlmaWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzZDFhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci9vYmplY3RfaWRlbnRpZmllci9kZXJfbGVuZ3RoX29iamVjdF9pZGVudGlmaWVyLmMKQEAgLTAsMCArMSw4NCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2xlbmd0aF9vYmplY3RfaWRlbnRpZmllci5jCisgIEFTTi4xIERFUiwgZ2V0IGxlbmd0aCBvZiBPYmplY3QgSWRlbnRpZmllciwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgTFRDX0RFUgorCit1bnNpZ25lZCBsb25nIGRlcl9vYmplY3RfaWRlbnRpZmllcl9iaXRzKHVuc2lnbmVkIGxvbmcgeCkKK3sKKyAgIHVuc2lnbmVkIGxvbmcgYzsKKyAgIHggJj0gMHhGRkZGRkZGRjsKKyAgIGMgID0gMDsKKyAgIHdoaWxlICh4KSB7CisgICAgICsrYzsKKyAgICAgeCA+Pj0gMTsKKyAgIH0KKyAgIHJldHVybiBjOworfQorCisKKy8qKgorICBHZXRzIGxlbmd0aCBvZiBERVIgZW5jb2Rpbmcgb2YgT2JqZWN0IElkZW50aWZpZXIKKyAgQHBhcmFtIG53b3JkcyAgIFRoZSBudW1iZXIgb2YgT0lEIHdvcmRzIAorICBAcGFyYW0gd29yZHMgICAgVGhlIGFjdHVhbCBPSUQgd29yZHMgdG8gZ2V0IHRoZSBzaXplIG9mCisgIEBwYXJhbSBvdXRsZW4gICBbb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSBERVIgZW5jb2RpbmcgZm9yIHRoZSBnaXZlbiBzdHJpbmcKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGRlcl9sZW5ndGhfb2JqZWN0X2lkZW50aWZpZXIodW5zaWduZWQgbG9uZyAqd29yZHMsIHVuc2lnbmVkIGxvbmcgbndvcmRzLCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICB1bnNpZ25lZCBsb25nIHksIHosIHQ7ICAgCisKKyAgIExUQ19BUkdDSEsod29yZHMgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKworICAgLyogbXVzdCBiZSA+PSAyIHdvcmRzICovCisgICBpZiAobndvcmRzIDwgMikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgfQorCisgICAvKiB3b3JkMSA9IDAsMSwyIGFuZCB3b3JkMiAwLi4zOSAqLworICAgaWYgKHdvcmRzWzBdID4gMiB8fCB3b3Jkc1sxXSA+IDM5KSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisKKyAgIC8qIGxlYWRpbmcgYnl0ZSBvZiBmaXJzdCB0d28gd29yZHMgKi8KKyAgIHogPSAxOworICAgZm9yICh5ID0gMjsgeSA8IG53b3JkczsgeSsrKSB7CisgICAgICAgdCA9IGRlcl9vYmplY3RfaWRlbnRpZmllcl9iaXRzKHdvcmRzW3ldKTsKKyAgICAgICB6ICs9IHQvNyArICgodCU3KSA/IDEgOiAwKTsKKyAgIH0KKworICAgLyogbm93IGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RoIG91ciBsZW5ndGggZW5jb2RpbmcgY2hhbmdlcyAqLworICAgaWYgKHogPCAxMjgpIHsKKyAgICAgIHogKz0gMjsKKyAgIH0gZWxzZSBpZiAoeiA8IDI1NikgeworICAgICAgeiArPSAzOworICAgfSBlbHNlIGlmICh6IDwgNjU1MzZVTCkgeworICAgICAgeiArPSA0OworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgKm91dGxlbiA9IHo7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvYXNuMS9kZXIvb2JqZWN0X2lkZW50aWZpZXIvZGVyX2xlbmd0aF9vYmplY3RfaWRlbnRpZmllci5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTYgMTU6MDg6MTEgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9kZWNvZGVfb2N0ZXRfc3RyaW5nLmMgYi9zcmMvcGsvYXNuMS9kZXIvb2N0ZXQvZGVyX2RlY29kZV9vY3RldF9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM4MDBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9kZWNvZGVfb2N0ZXRfc3RyaW5nLmMKQEAgLTAsMCArMSw5MCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2RlY29kZV9vY3RldF9zdHJpbmcuYworICBBU04uMSBERVIsIGVuY29kZSBhIE9DVEVUIFNUUklORywgVG9tIFN0IERlbmlzCisqLworCisKKyNpZmRlZiBMVENfREVSCisKKy8qKgorICBTdG9yZSBhIE9DVEVUIFNUUklORworICBAcGFyYW0gaW4gICAgICBUaGUgREVSIGVuY29kZWQgT0NURVQgU1RSSU5HCisgIEBwYXJhbSBpbmxlbiAgIFRoZSBzaXplIG9mIHRoZSBERVIgT0NURVQgU1RSSU5HCisgIEBwYXJhbSBvdXQgICAgIFtvdXRdIFRoZSBhcnJheSBvZiBvY3RldHMgc3RvcmVkIChvbmUgcGVyIGNoYXIpCisgIEBwYXJhbSBvdXRsZW4gIFtpbi9vdXRdIFRoZSBudW1iZXIgb2Ygb2N0ZXRzIHN0b3JlZAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZGVyX2RlY29kZV9vY3RldF9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICB1bnNpZ25lZCBsb25nIHgsIHksIGxlbjsKKworICAgTFRDX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworCisgICAvKiBtdXN0IGhhdmUgaGVhZGVyIGF0IGxlYXN0ICovCisgICBpZiAoaW5sZW4gPCAyKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICB9CisKKyAgIC8qIGNoZWNrIGZvciAweDA0ICovCisgICBpZiAoKGluWzBdICYgMHgxRikgIT0gMHgwNCkgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgfQorICAgeCA9IDE7CisKKyAgIC8qIGRlY29kZSB0aGUgbGVuZ3RoICovCisgICBpZiAoaW5beF0gJiAweDgwKSB7CisgICAgICAvKiB2YWxpZCAjIG9mIGJ5dGVzIGluIGxlbmd0aCBhcmUgMSwyLDMgKi8KKyAgICAgIHkgPSBpblt4XSAmIDB4N0Y7CisgICAgICBpZiAoKHkgPT0gMCkgfHwgKHkgPiAzKSB8fCAoKHggKyB5KSA+IGlubGVuKSkgeworICAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgICAgfQorCisgICAgICAvKiByZWFkIHRoZSBsZW5ndGggaW4gKi8KKyAgICAgIGxlbiA9IDA7CisgICAgICArK3g7CisgICAgICB3aGlsZSAoeS0tKSB7CisgICAgICAgICBsZW4gPSAobGVuIDw8IDgpIHwgaW5beCsrXTsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICBsZW4gPSBpblt4KytdICYgMHg3RjsKKyAgIH0KKworICAgLyogaXMgaXQgdG9vIGxvbmc/ICovCisgICBpZiAobGVuID4gKm91dGxlbikgeworICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgIH0KKworICAgaWYgKGxlbiArIHggPiBpbmxlbikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgfQorCisgICAvKiByZWFkIHRoZSBkYXRhICovCisgICBmb3IgKHkgPSAwOyB5IDwgbGVuOyB5KyspIHsKKyAgICAgICBvdXRbeV0gPSBpblt4KytdOworICAgfQorCisgICAqb3V0bGVuID0geTsKKworICAgcmV0dXJuIENSWVBUX09LOworfQorIAorI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci9vY3RldC9kZXJfZGVjb2RlX29jdGV0X3N0cmluZy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTYgMTU6MDg6MTEgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9lbmNvZGVfb2N0ZXRfc3RyaW5nLmMgYi9zcmMvcGsvYXNuMS9kZXIvb2N0ZXQvZGVyX2VuY29kZV9vY3RldF9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzRiNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9lbmNvZGVfb2N0ZXRfc3RyaW5nLmMKQEAgLTAsMCArMSw4NSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2VuY29kZV9vY3RldF9zdHJpbmcuYworICBBU04uMSBERVIsIGVuY29kZSBhIE9DVEVUIFNUUklORywgVG9tIFN0IERlbmlzCisqLworCisKKyNpZmRlZiBMVENfREVSCisKKy8qKgorICBTdG9yZSBhbiBPQ1RFVCBTVFJJTkcKKyAgQHBhcmFtIGluICAgICAgIFRoZSBhcnJheSBvZiBPQ1RFVFMgdG8gc3RvcmUgKG9uZSBwZXIgY2hhcikKKyAgQHBhcmFtIGlubGVuICAgIFRoZSBudW1iZXIgb2YgT0NURVRTIHRvIHN0b3JlCisgIEBwYXJhbSBvdXQgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gZm9yIHRoZSBERVIgZW5jb2RlZCBPQ1RFVCBTVFJJTkcKKyAgQHBhcmFtIG91dGxlbiAgIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIERFUiBPQ1RFVCBTVFJJTkcKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGRlcl9lbmNvZGVfb2N0ZXRfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworICAgdW5zaWduZWQgbG9uZyB4LCB5LCBsZW47CisgICBpbnQgICAgICAgICAgIGVycjsKKworICAgTFRDX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworCisgICAvKiBnZXQgdGhlIHNpemUgKi8KKyAgIGlmICgoZXJyID0gZGVyX2xlbmd0aF9vY3RldF9zdHJpbmcoaW5sZW4sICZsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsgCisgICB9CisKKyAgIC8qIHRvbyBiaWc/ICovCisgICBpZiAobGVuID4gKm91dGxlbikgeworICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgIH0KKworICAgLyogZW5jb2RlIHRoZSBoZWFkZXIrbGVuICovCisgICB4ID0gMDsKKyAgIG91dFt4KytdID0gMHgwNDsKKyAgIGlmIChpbmxlbiA8IDEyOCkgeworICAgICAgb3V0W3grK10gPSBpbmxlbjsKKyAgIH0gZWxzZSBpZiAoaW5sZW4gPCAyNTYpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MTsKKyAgICAgIG91dFt4KytdID0gaW5sZW47CisgICB9IGVsc2UgaWYgKGlubGVuIDwgNjU1MzZVTCkgeworICAgICAgb3V0W3grK10gPSAweDgyOworICAgICAgb3V0W3grK10gPSAoaW5sZW4+PjgpJjI1NTsKKyAgICAgIG91dFt4KytdID0gaW5sZW4mMjU1OworICAgfSBlbHNlIGlmIChpbmxlbiA8IDE2Nzc3MjE2VUwpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MzsKKyAgICAgIG91dFt4KytdID0gKGlubGVuPj4xNikmMjU1OworICAgICAgb3V0W3grK10gPSAoaW5sZW4+PjgpJjI1NTsKKyAgICAgIG91dFt4KytdID0gaW5sZW4mMjU1OworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgLyogc3RvcmUgb2N0ZXRzICovCisgICBmb3IgKHkgPSAwOyB5IDwgaW5sZW47IHkrKykgeworICAgICAgIG91dFt4KytdID0gaW5beV07CisgICB9CisKKyAgIC8qIHJldHVuIGxlbmd0aCAqLworICAgKm91dGxlbiA9IHg7CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci9vY3RldC9kZXJfZW5jb2RlX29jdGV0X3N0cmluZy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTYgMTU6MDg6MTEgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9sZW5ndGhfb2N0ZXRfc3RyaW5nLmMgYi9zcmMvcGsvYXNuMS9kZXIvb2N0ZXQvZGVyX2xlbmd0aF9vY3RldF9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTBiZWQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL29jdGV0L2Rlcl9sZW5ndGhfb2N0ZXRfc3RyaW5nLmMKQEAgLTAsMCArMSw1MyBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2xlbmd0aF9vY3RldF9zdHJpbmcuYworICBBU04uMSBERVIsIGdldCBsZW5ndGggb2YgT0NURVQgU1RSSU5HLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBMVENfREVSCisvKioKKyAgR2V0cyBsZW5ndGggb2YgREVSIGVuY29kaW5nIG9mIE9DVEVUIFNUUklORyAKKyAgQHBhcmFtIG5vY3RldHMgIFRoZSBudW1iZXIgb2Ygb2N0ZXRzIGluIHRoZSBzdHJpbmcgdG8gZW5jb2RlCisgIEBwYXJhbSBvdXRsZW4gICBbb3V0XSBUaGUgbGVuZ3RoIG9mIHRoZSBERVIgZW5jb2RpbmcgZm9yIHRoZSBnaXZlbiBzdHJpbmcKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGRlcl9sZW5ndGhfb2N0ZXRfc3RyaW5nKHVuc2lnbmVkIGxvbmcgbm9jdGV0cywgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKyAgIGlmIChub2N0ZXRzIDwgMTI4KSB7CisgICAgICAvKiAwNCBMTCBERCBERCBERCAuLi4gKi8KKyAgICAgICpvdXRsZW4gPSAyICsgbm9jdGV0czsKKyAgIH0gZWxzZSBpZiAobm9jdGV0cyA8IDI1NikgeworICAgICAgLyogMDQgODEgTEwgREQgREQgREQgLi4uICovCisgICAgICAqb3V0bGVuID0gMyArIG5vY3RldHM7CisgICB9IGVsc2UgaWYgKG5vY3RldHMgPCA2NTUzNlVMKSB7CisgICAgICAvKiAwNCA4MiBMTCBMTCBERCBERCBERCAuLi4gKi8KKyAgICAgICpvdXRsZW4gPSA0ICsgbm9jdGV0czsKKyAgIH0gZWxzZSBpZiAobm9jdGV0cyA8IDE2Nzc3MjE2VUwpIHsKKyAgICAgIC8qIDA0IDgzIExMIExMIExMIEREIEREIEREIC4uLiAqLworICAgICAgKm91dGxlbiA9IDUgKyBub2N0ZXRzOworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvYXNuMS9kZXIvb2N0ZXQvZGVyX2xlbmd0aF9vY3RldF9zdHJpbmcuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzE2IDE1OjA4OjExICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9hc24xL2Rlci9wcmludGFibGVfc3RyaW5nL2Rlcl9kZWNvZGVfcHJpbnRhYmxlX3N0cmluZy5jIGIvc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2RlY29kZV9wcmludGFibGVfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjOTIzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci9wcmludGFibGVfc3RyaW5nL2Rlcl9kZWNvZGVfcHJpbnRhYmxlX3N0cmluZy5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGRlcl9kZWNvZGVfcHJpbnRhYmxlX3N0cmluZy5jCisgIEFTTi4xIERFUiwgZW5jb2RlIGEgcHJpbnRhYmxlIFNUUklORywgVG9tIFN0IERlbmlzCisqLworCisKKyNpZmRlZiBMVENfREVSCisKKy8qKgorICBTdG9yZSBhIHByaW50YWJsZSBTVFJJTkcKKyAgQHBhcmFtIGluICAgICAgVGhlIERFUiBlbmNvZGVkIHByaW50YWJsZSBTVFJJTkcKKyAgQHBhcmFtIGlubGVuICAgVGhlIHNpemUgb2YgdGhlIERFUiBwcmludGFibGUgU1RSSU5HCisgIEBwYXJhbSBvdXQgICAgIFtvdXRdIFRoZSBhcnJheSBvZiBvY3RldHMgc3RvcmVkIChvbmUgcGVyIGNoYXIpCisgIEBwYXJhbSBvdXRsZW4gIFtpbi9vdXRdIFRoZSBudW1iZXIgb2Ygb2N0ZXRzIHN0b3JlZAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZGVyX2RlY29kZV9wcmludGFibGVfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgeCwgeSwgbGVuOworICAgaW50ICAgICAgICAgICB0OworCisgICBMVENfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKyAgIC8qIG11c3QgaGF2ZSBoZWFkZXIgYXQgbGVhc3QgKi8KKyAgIGlmIChpbmxlbiA8IDIpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgIH0KKworICAgLyogY2hlY2sgZm9yIDB4MTMgKi8KKyAgIGlmICgoaW5bMF0gJiAweDFGKSAhPSAweDEzKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICB9CisgICB4ID0gMTsKKworICAgLyogZGVjb2RlIHRoZSBsZW5ndGggKi8KKyAgIGlmIChpblt4XSAmIDB4ODApIHsKKyAgICAgIC8qIHZhbGlkICMgb2YgYnl0ZXMgaW4gbGVuZ3RoIGFyZSAxLDIsMyAqLworICAgICAgeSA9IGluW3hdICYgMHg3RjsKKyAgICAgIGlmICgoeSA9PSAwKSB8fCAoeSA+IDMpIHx8ICgoeCArIHkpID4gaW5sZW4pKSB7CisgICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICAgICB9CisKKyAgICAgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbiAqLworICAgICAgbGVuID0gMDsKKyAgICAgICsreDsKKyAgICAgIHdoaWxlICh5LS0pIHsKKyAgICAgICAgIGxlbiA9IChsZW4gPDwgOCkgfCBpblt4KytdOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIGxlbiA9IGluW3grK10gJiAweDdGOworICAgfQorCisgICAvKiBpcyBpdCB0b28gbG9uZz8gKi8KKyAgIGlmIChsZW4gPiAqb3V0bGVuKSB7CisgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICAgfQorCisgICBpZiAobGVuICsgeCA+IGlubGVuKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICB9CisKKyAgIC8qIHJlYWQgdGhlIGRhdGEgKi8KKyAgIGZvciAoeSA9IDA7IHkgPCBsZW47IHkrKykgeworICAgICAgIHQgPSBkZXJfcHJpbnRhYmxlX3ZhbHVlX2RlY29kZShpblt4KytdKTsKKyAgICAgICBpZiAodCA9PSAtMSkgeworICAgICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICAgICAgfQorICAgICAgIG91dFt5XSA9IHQ7CisgICB9CisKKyAgICpvdXRsZW4gPSB5OworCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisgCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2RlY29kZV9wcmludGFibGVfc3RyaW5nLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8yMSAwMjoyOTo1NCAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvYXNuMS9kZXIvcHJpbnRhYmxlX3N0cmluZy9kZXJfZW5jb2RlX3ByaW50YWJsZV9zdHJpbmcuYyBiL3NyYy9way9hc24xL2Rlci9wcmludGFibGVfc3RyaW5nL2Rlcl9lbmNvZGVfcHJpbnRhYmxlX3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNGU4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGsvYXNuMS9kZXIvcHJpbnRhYmxlX3N0cmluZy9kZXJfZW5jb2RlX3ByaW50YWJsZV9zdHJpbmcuYwpAQCAtMCwwICsxLDg0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBkZXJfZW5jb2RlX3ByaW50YWJsZV9zdHJpbmcuYworICBBU04uMSBERVIsIGVuY29kZSBhIHByaW50YWJsZSBTVFJJTkcsIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIExUQ19ERVIKKworLyoqCisgIFN0b3JlIGFuIHByaW50YWJsZSBTVFJJTkcKKyAgQHBhcmFtIGluICAgICAgIFRoZSBhcnJheSBvZiBwcmludGFibGUgdG8gc3RvcmUgKG9uZSBwZXIgY2hhcikKKyAgQHBhcmFtIGlubGVuICAgIFRoZSBudW1iZXIgb2YgcHJpbnRhYmxlIHRvIHN0b3JlCisgIEBwYXJhbSBvdXQgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gZm9yIHRoZSBERVIgZW5jb2RlZCBwcmludGFibGUgU1RSSU5HCisgIEBwYXJhbSBvdXRsZW4gICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBERVIgcHJpbnRhYmxlIFNUUklORworICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZGVyX2VuY29kZV9wcmludGFibGVfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgeCwgeSwgbGVuOworICAgaW50ICAgICAgICAgICBlcnI7CisKKyAgIExUQ19BUkdDSEsoaW4gICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKworICAgLyogZ2V0IHRoZSBzaXplICovCisgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfcHJpbnRhYmxlX3N0cmluZyhpbiwgaW5sZW4sICZsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsgCisgICB9CisKKyAgIC8qIHRvbyBiaWc/ICovCisgICBpZiAobGVuID4gKm91dGxlbikgeworICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgIH0KKworICAgLyogZW5jb2RlIHRoZSBoZWFkZXIrbGVuICovCisgICB4ID0gMDsKKyAgIG91dFt4KytdID0gMHgxMzsKKyAgIGlmIChpbmxlbiA8IDEyOCkgeworICAgICAgb3V0W3grK10gPSBpbmxlbjsKKyAgIH0gZWxzZSBpZiAoaW5sZW4gPCAyNTYpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MTsKKyAgICAgIG91dFt4KytdID0gaW5sZW47CisgICB9IGVsc2UgaWYgKGlubGVuIDwgNjU1MzZVTCkgeworICAgICAgb3V0W3grK10gPSAweDgyOworICAgICAgb3V0W3grK10gPSAoaW5sZW4+PjgpJjI1NTsKKyAgICAgIG91dFt4KytdID0gaW5sZW4mMjU1OworICAgfSBlbHNlIGlmIChpbmxlbiA8IDE2Nzc3MjE2VUwpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MzsKKyAgICAgIG91dFt4KytdID0gKGlubGVuPj4xNikmMjU1OworICAgICAgb3V0W3grK10gPSAoaW5sZW4+PjgpJjI1NTsKKyAgICAgIG91dFt4KytdID0gaW5sZW4mMjU1OworICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgLyogc3RvcmUgb2N0ZXRzICovCisgICBmb3IgKHkgPSAwOyB5IDwgaW5sZW47IHkrKykgeworICAgICAgIG91dFt4KytdID0gZGVyX3ByaW50YWJsZV9jaGFyX2VuY29kZShpblt5XSk7CisgICB9CisKKyAgIC8qIHJldHVuIGxlbmd0aCAqLworICAgKm91dGxlbiA9IHg7CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci9wcmludGFibGVfc3RyaW5nL2Rlcl9lbmNvZGVfcHJpbnRhYmxlX3N0cmluZy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMjEgMDI6Mjk6NTQgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2xlbmd0aF9wcmludGFibGVfc3RyaW5nLmMgYi9zcmMvcGsvYXNuMS9kZXIvcHJpbnRhYmxlX3N0cmluZy9kZXJfbGVuZ3RoX3ByaW50YWJsZV9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDA2NWYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2xlbmd0aF9wcmludGFibGVfc3RyaW5nLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIGRlcl9sZW5ndGhfcHJpbnRhYmxlX3N0cmluZy5jCisgIEFTTi4xIERFUiwgZ2V0IGxlbmd0aCBvZiBQcmludGFibGUgU1RSSU5HLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBMVENfREVSCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgaW50IGNvZGUsIHZhbHVlOworfSBwcmludGFibGVfdGFibGVbXSA9IHsKK3sgJyAnLCAzMiB9LCAKK3sgJ1wnJywgMzkgfSwgCit7ICcoJywgNDAgfSwgCit7ICcpJywgNDEgfSwgCit7ICcrJywgNDMgfSwgCit7ICcsJywgNDQgfSwgCit7ICctJywgNDUgfSwgCit7ICcuJywgNDYgfSwgCit7ICcvJywgNDcgfSwgCit7ICcwJywgNDggfSwgCit7ICcxJywgNDkgfSwgCit7ICcyJywgNTAgfSwgCit7ICczJywgNTEgfSwgCit7ICc0JywgNTIgfSwgCit7ICc1JywgNTMgfSwgCit7ICc2JywgNTQgfSwgCit7ICc3JywgNTUgfSwgCit7ICc4JywgNTYgfSwgCit7ICc5JywgNTcgfSwgCit7ICc6JywgNTggfSwgCit7ICc9JywgNjEgfSwgCit7ICc/JywgNjMgfSwgCit7ICdBJywgNjUgfSwgCit7ICdCJywgNjYgfSwgCit7ICdDJywgNjcgfSwgCit7ICdEJywgNjggfSwgCit7ICdFJywgNjkgfSwgCit7ICdGJywgNzAgfSwgCit7ICdHJywgNzEgfSwgCit7ICdIJywgNzIgfSwgCit7ICdJJywgNzMgfSwgCit7ICdKJywgNzQgfSwgCit7ICdLJywgNzUgfSwgCit7ICdMJywgNzYgfSwgCit7ICdNJywgNzcgfSwgCit7ICdOJywgNzggfSwgCit7ICdPJywgNzkgfSwgCit7ICdQJywgODAgfSwgCit7ICdRJywgODEgfSwgCit7ICdSJywgODIgfSwgCit7ICdTJywgODMgfSwgCit7ICdUJywgODQgfSwgCit7ICdVJywgODUgfSwgCit7ICdWJywgODYgfSwgCit7ICdXJywgODcgfSwgCit7ICdYJywgODggfSwgCit7ICdZJywgODkgfSwgCit7ICdaJywgOTAgfSwgCit7ICdhJywgOTcgfSwgCit7ICdiJywgOTggfSwgCit7ICdjJywgOTkgfSwgCit7ICdkJywgMTAwIH0sIAoreyAnZScsIDEwMSB9LCAKK3sgJ2YnLCAxMDIgfSwgCit7ICdnJywgMTAzIH0sIAoreyAnaCcsIDEwNCB9LCAKK3sgJ2knLCAxMDUgfSwgCit7ICdqJywgMTA2IH0sIAoreyAnaycsIDEwNyB9LCAKK3sgJ2wnLCAxMDggfSwgCit7ICdtJywgMTA5IH0sIAoreyAnbicsIDExMCB9LCAKK3sgJ28nLCAxMTEgfSwgCit7ICdwJywgMTEyIH0sIAoreyAncScsIDExMyB9LCAKK3sgJ3InLCAxMTQgfSwgCit7ICdzJywgMTE1IH0sIAoreyAndCcsIDExNiB9LCAKK3sgJ3UnLCAxMTcgfSwgCit7ICd2JywgMTE4IH0sIAoreyAndycsIDExOSB9LCAKK3sgJ3gnLCAxMjAgfSwgCit7ICd5JywgMTIxIH0sIAoreyAneicsIDEyMiB9LCAKK307CisKK2ludCBkZXJfcHJpbnRhYmxlX2NoYXJfZW5jb2RlKGludCBjKQoreworICAgaW50IHg7CisgICBmb3IgKHggPSAwOyB4IDwgKGludCkoc2l6ZW9mKHByaW50YWJsZV90YWJsZSkvc2l6ZW9mKHByaW50YWJsZV90YWJsZVswXSkpOyB4KyspIHsKKyAgICAgICBpZiAocHJpbnRhYmxlX3RhYmxlW3hdLmNvZGUgPT0gYykgeworICAgICAgICAgIHJldHVybiBwcmludGFibGVfdGFibGVbeF0udmFsdWU7CisgICAgICAgfQorICAgfQorICAgcmV0dXJuIC0xOworfQorCitpbnQgZGVyX3ByaW50YWJsZV92YWx1ZV9kZWNvZGUoaW50IHYpCit7CisgICBpbnQgeDsKKyAgIGZvciAoeCA9IDA7IHggPCAoaW50KShzaXplb2YocHJpbnRhYmxlX3RhYmxlKS9zaXplb2YocHJpbnRhYmxlX3RhYmxlWzBdKSk7IHgrKykgeworICAgICAgIGlmIChwcmludGFibGVfdGFibGVbeF0udmFsdWUgPT0gdikgeworICAgICAgICAgIHJldHVybiBwcmludGFibGVfdGFibGVbeF0uY29kZTsKKyAgICAgICB9CisgICB9CisgICByZXR1cm4gLTE7Cit9CisgICAKKy8qKgorICBHZXRzIGxlbmd0aCBvZiBERVIgZW5jb2Rpbmcgb2YgUHJpbnRhYmxlIFNUUklORyAKKyAgQHBhcmFtIG9jdGV0cyAgIFRoZSB2YWx1ZXMgeW91IHdhbnQgdG8gZW5jb2RlIAorICBAcGFyYW0gbm9jdGV0cyAgVGhlIG51bWJlciBvZiBvY3RldHMgaW4gdGhlIHN0cmluZyB0byBlbmNvZGUKKyAgQHBhcmFtIG91dGxlbiAgIFtvdXRdIFRoZSBsZW5ndGggb2YgdGhlIERFUiBlbmNvZGluZyBmb3IgdGhlIGdpdmVuIHN0cmluZworICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZGVyX2xlbmd0aF9wcmludGFibGVfc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9jdGV0cywgdW5zaWduZWQgbG9uZyBub2N0ZXRzLCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICB1bnNpZ25lZCBsb25nIHg7CisKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvY3RldHMgIT0gTlVMTCk7CisKKyAgIC8qIHNjYW4gc3RyaW5nIGZvciB2YWxpZGl0eSAqLworICAgZm9yICh4ID0gMDsgeCA8IG5vY3RldHM7IHgrKykgeworICAgICAgIGlmIChkZXJfcHJpbnRhYmxlX2NoYXJfZW5jb2RlKG9jdGV0c1t4XSkgPT0gLTEpIHsKKyAgICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICAgICAgfQorICAgfQorCisgICBpZiAobm9jdGV0cyA8IDEyOCkgeworICAgICAgLyogMTYgTEwgREQgREQgREQgLi4uICovCisgICAgICAqb3V0bGVuID0gMiArIG5vY3RldHM7CisgICB9IGVsc2UgaWYgKG5vY3RldHMgPCAyNTYpIHsKKyAgICAgIC8qIDE2IDgxIExMIEREIEREIEREIC4uLiAqLworICAgICAgKm91dGxlbiA9IDMgKyBub2N0ZXRzOworICAgfSBlbHNlIGlmIChub2N0ZXRzIDwgNjU1MzZVTCkgeworICAgICAgLyogMTYgODIgTEwgTEwgREQgREQgREQgLi4uICovCisgICAgICAqb3V0bGVuID0gNCArIG5vY3RldHM7CisgICB9IGVsc2UgaWYgKG5vY3RldHMgPCAxNjc3NzIxNlVMKSB7CisgICAgICAvKiAxNiA4MyBMTCBMTCBMTCBERCBERCBERCAuLi4gKi8KKyAgICAgICpvdXRsZW4gPSA1ICsgbm9jdGV0czsKKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL2FzbjEvZGVyL3ByaW50YWJsZV9zdHJpbmcvZGVyX2xlbmd0aF9wcmludGFibGVfc3RyaW5nLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8yMSAwMjoyOTo1NCAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvYXNuMS9kZXIvc2VxdWVuY2UvZGVyX2RlY29kZV9zZXF1ZW5jZS5jIGIvc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9kZWNvZGVfc2VxdWVuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzVhODgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9kZWNvZGVfc2VxdWVuY2UuYwpAQCAtMCwwICsxLDIzNCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisKKy8qKgorICBAZmlsZSBkZXJfZGVjb2RlX3NlcXVlbmNlLmMKKyAgQVNOLjEgREVSLCBkZWNvZGUgYSBTRVFVRU5DRSwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgTFRDX0RFUgorCisvKioKKyAgIERlY29kZSBhIFNFUVVFTkNFCisgICBAcGFyYW0gaW4gICAgICAgVGhlIERFUiBlbmNvZGVkIGlucHV0CisgICBAcGFyYW0gaW5sZW4gICAgVGhlIHNpemUgb2YgdGhlIGlucHV0CisgICBAcGFyYW0gbGlzdCAgICAgVGhlIGxpc3Qgb2YgaXRlbXMgdG8gZGVjb2RlCisgICBAcGFyYW0gb3V0bGVuICAgVGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdAorICAgQHJldHVybiBDUllQVF9PSyBvbiBzdWNjZXNzCisqLworaW50IGRlcl9kZWNvZGVfc2VxdWVuY2UoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgdW5zaWduZWQgbG9uZyAgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdGNfYXNuMV9saXN0ICpsaXN0LCB1bnNpZ25lZCBsb25nICBvdXRsZW4pCit7CisgICBpbnQgICAgICAgICAgIGVyciwgdHlwZTsKKyAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgeCwgeSwgeiwgaSwgYmxrc2l6ZTsKKyAgIHZvaWQgICAgICAgICAgKmRhdGE7CisKKyAgIExUQ19BUkdDSEsoaW4gICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsobGlzdCAhPSBOVUxMKTsKKworICAgLyogZ2V0IGJsayBzaXplICovCisgICBpZiAoaW5sZW4gPCAyKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICB9CisKKyAgIC8qIHNlcXVlbmNlIHR5cGU/ICovCisgICB4ID0gMDsKKyAgIGlmIChpblt4KytdICE9IDB4MzApIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgIH0KKworICAgaWYgKGluW3hdIDwgMTI4KSB7CisgICAgICBibGtzaXplID0gaW5beCsrXTsKKyAgIH0gZWxzZSBpZiAoaW5beF0gJiAweDgwKSB7CisgICAgICBpZiAoaW5beF0gPCAweDgxIHx8IGluW3hdID4gMHg4MykgeworICAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgICAgfQorICAgICAgeSA9IGluW3grK10gJiAweDdGOworCisgICAgICAvKiB3b3VsZCByZWFkaW5nIHRoZSBsZW4gYnl0ZXMgb3ZlcnJ1bj8gKi8KKyAgICAgIGlmICh4ICsgeSA+IGlubGVuKSB7CisgICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICAgICB9CisKKyAgICAgIC8qIHJlYWQgbGVuICovCisgICAgICBibGtzaXplID0gMDsKKyAgICAgIHdoaWxlICh5LS0pIHsKKyAgICAgICAgICBibGtzaXplID0gKGJsa3NpemUgPDwgOCkgfCAodW5zaWduZWQgbG9uZylpblt4KytdOworICAgICAgfQorICB9CisKKyAgLyogd291bGQgdGhpcyBibGtzaXplIG92ZXJmbG93PyAqLworICBpZiAoeCArIGJsa3NpemUgPiBpbmxlbikgeworICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgIH0KKworICAvKiBvayByZWFkIGRhdGEgKi8KKyAgIGlubGVuID0gYmxrc2l6ZTsKKyAgIGZvciAoaSA9IDA7IGkgPCBvdXRsZW47IGkrKykgeworICAgICAgIHR5cGUgPSBsaXN0W2ldLnR5cGU7CisgICAgICAgc2l6ZSA9IGxpc3RbaV0uc2l6ZTsKKyAgICAgICBkYXRhID0gbGlzdFtpXS5kYXRhOworCisgICAgICAgaWYgKHR5cGUgPT0gTFRDX0FTTjFfRU9MKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICBjYXNlIExUQ19BU04xX0lOVEVHRVI6CisgICAgICAgICAgICAgICB6ID0gaW5sZW47CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9kZWNvZGVfaW50ZWdlcihpbiArIHgsIHosIGRhdGEpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX2ludGVnZXIoZGF0YSwgJnopKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeCAgICAgKz0gejsKKyAgICAgICAgICAgICAgIGlubGVuIC09IHo7CisgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfU0hPUlRfSU5URUdFUjoKKyAgICAgICAgICAgICAgIHogPSBpbmxlbjsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2RlY29kZV9zaG9ydF9pbnRlZ2VyKGluICsgeCwgeiwgZGF0YSkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfc2hvcnRfaW50ZWdlcihzaXplLCAmeikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB4ICAgICArPSB6OworICAgICAgICAgICAgICAgaW5sZW4gLT0gejsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfQklUX1NUUklORzoKKyAgICAgICAgICAgICAgIHogPSBpbmxlbjsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2RlY29kZV9iaXRfc3RyaW5nKGluICsgeCwgeiwgZGF0YSwgJnNpemUpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgbGlzdFtpXS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2xlbmd0aF9iaXRfc3RyaW5nKHNpemUsICZ6KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHggICAgICs9IHo7CisgICAgICAgICAgICAgICBpbmxlbiAtPSB6OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9PQ1RFVF9TVFJJTkc6CisgICAgICAgICAgICAgICB6ID0gaW5sZW47CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9kZWNvZGVfb2N0ZXRfc3RyaW5nKGluICsgeCwgeiwgZGF0YSwgJnNpemUpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgbGlzdFtpXS5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2xlbmd0aF9vY3RldF9zdHJpbmcoc2l6ZSwgJnopKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeCAgICAgKz0gejsKKyAgICAgICAgICAgICAgIGlubGVuIC09IHo7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX05VTEw6CisgICAgICAgICAgICAgICBpZiAoaW5sZW4gPCAyIHx8IGluW3hdICE9IDB4MDUgfHwgaW5beCsxXSAhPSAweDAwKSB7CisgICAgICAgICAgICAgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHggICAgICs9IDI7CisgICAgICAgICAgICAgICBpbmxlbiAtPSAyOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9PQkpFQ1RfSURFTlRJRklFUjoKKyAgICAgICAgICAgICAgIHogPSBpbmxlbjsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2RlY29kZV9vYmplY3RfaWRlbnRpZmllcihpbiArIHgsIHosIGRhdGEsICZzaXplKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGxpc3RbaV0uc2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfb2JqZWN0X2lkZW50aWZpZXIoZGF0YSwgc2l6ZSwgJnopKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeCAgICAgKz0gejsKKyAgICAgICAgICAgICAgIGlubGVuIC09IHo7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX0lBNV9TVFJJTkc6CisgICAgICAgICAgICAgICB6ID0gaW5sZW47CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9kZWNvZGVfaWE1X3N0cmluZyhpbiArIHgsIHosIGRhdGEsICZzaXplKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGxpc3RbaV0uc2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfaWE1X3N0cmluZyhkYXRhLCBzaXplLCAmeikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB4ICAgICArPSB6OworICAgICAgICAgICAgICAgaW5sZW4gLT0gejsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9QUklOVEFCTEVfU1RSSU5HOgorICAgICAgICAgICAgICAgeiA9IGlubGVuOworICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfZGVjb2RlX3ByaW50YWJsZV9zdHJpbmcoaW4gKyB4LCB6LCBkYXRhLCAmc2l6ZSkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBsaXN0W2ldLnNpemUgPSBzaXplOworICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX3ByaW50YWJsZV9zdHJpbmcoZGF0YSwgc2l6ZSwgJnopKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeCAgICAgKz0gejsKKyAgICAgICAgICAgICAgIGlubGVuIC09IHo7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX1VUQ1RJTUU6CisgICAgICAgICAgICAgICB6ID0gaW5sZW47CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9kZWNvZGVfdXRjdGltZShpbiArIHgsICZ6LCBkYXRhKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHggICAgICs9IHo7CisgICAgICAgICAgICAgICBpbmxlbiAtPSB6OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9TRVFVRU5DRToKKyAgICAgICAgICAgICAgIHogPSBpbmxlbjsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2RlY29kZV9zZXF1ZW5jZShpbiArIHgsIHosIGRhdGEsIHNpemUpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX3NlcXVlbmNlKGRhdGEsIHNpemUsICZ6KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHggICAgICs9IHo7CisgICAgICAgICAgICAgICBpbmxlbiAtPSB6OworICAgICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX0NIT0lDRToKKyAgICAgICAgICAgICAgIHogPSBpbmxlbjsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2RlY29kZV9jaG9pY2UoaW4gKyB4LCAmeiwgZGF0YSwgc2l6ZSkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB4ICAgICArPSB6OworICAgICAgICAgICAgICAgaW5sZW4gLT0gejsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX0FSRzsKKyAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICB9CisgICB9CisgICBlcnIgPSBDUllQVF9PSzsgICAKKworTEJMX0VSUjoKKyAgIHJldHVybiBlcnI7Cit9ICAKKyAKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvYXNuMS9kZXIvc2VxdWVuY2UvZGVyX2RlY29kZV9zZXF1ZW5jZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjggJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTggMTk6MjA6MjMgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9kZWNvZGVfc2VxdWVuY2VfbXVsdGkuYyBiL3NyYy9way9hc24xL2Rlci9zZXF1ZW5jZS9kZXJfZGVjb2RlX3NlcXVlbmNlX211bHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhMTAzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci9zZXF1ZW5jZS9kZXJfZGVjb2RlX3NlcXVlbmNlX211bHRpLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworCisvKioKKyAgQGZpbGUgZGVyX2RlY29kZV9zZXF1ZW5jZV9tdWx0aS5jCisgIEFTTi4xIERFUiwgZGVjb2RlIGEgU0VRVUVOQ0UsIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIExUQ19ERVIKKworaW50IGRlcl9kZWNvZGVfc2VxdWVuY2VfbXVsdGkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIC4uLikKK3sKKyAgIGludCAgICAgICAgICAgZXJyLCB0eXBlOworICAgdW5zaWduZWQgbG9uZyBzaXplLCB4OworICAgdm9pZCAgICAgICAgICAqZGF0YTsKKyAgIHZhX2xpc3QgICAgICAgYXJnczsKKyAgIGx0Y19hc24xX2xpc3QgKmxpc3Q7CisKKyAgIExUQ19BUkdDSEsoaW4gICAgIT0gTlVMTCk7CisKKyAgIC8qIGdldCBzaXplIG9mIG91dHB1dCB0aGF0IHdpbGwgYmUgcmVxdWlyZWQgKi8KKyAgIHZhX3N0YXJ0KGFyZ3MsIGlubGVuKTsKKyAgIHggPSAwOworICAgZm9yICg7OykgeworICAgICAgIHR5cGUgPSB2YV9hcmcoYXJncywgaW50KTsKKyAgICAgICBzaXplID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcpOworICAgICAgIGRhdGEgPSB2YV9hcmcoYXJncywgdm9pZCopOworCisgICAgICAgaWYgKHR5cGUgPT0gTFRDX0FTTjFfRU9MKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICBjYXNlIExUQ19BU04xX0lOVEVHRVI6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfU0hPUlRfSU5URUdFUjoKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9CSVRfU1RSSU5HOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX09DVEVUX1NUUklORzoKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9OVUxMOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX09CSkVDVF9JREVOVElGSUVSOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX0lBNV9TVFJJTkc6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfUFJJTlRBQkxFX1NUUklORzoKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9VVENUSU1FOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX1NFUVVFTkNFOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX0NIT0lDRToKKyAgICAgICAgICAgICAgICArK3g7IAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgdmFfZW5kKGFyZ3MpOworICAgICAgICAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOworICAgICAgIH0KKyAgIH0KKyAgIHZhX2VuZChhcmdzKTsKKworICAgLyogYWxsb2NhdGUgc3RydWN0dXJlIGZvciB4IGVsZW1lbnRzICovCisgICBpZiAoeCA9PSAwKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTk9QOworICAgfQorCisgICBsaXN0ID0gWENBTExPQyhzaXplb2YoKmxpc3QpLCB4KTsKKyAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKKyAgIC8qIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSAqLworICAgdmFfc3RhcnQoYXJncywgaW5sZW4pOworICAgeCA9IDA7CisgICBmb3IgKDs7KSB7CisgICAgICAgdHlwZSA9IHZhX2FyZyhhcmdzLCBpbnQpOworICAgICAgIHNpemUgPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyk7CisgICAgICAgZGF0YSA9IHZhX2FyZyhhcmdzLCB2b2lkKik7CisKKyAgICAgICBpZiAodHlwZSA9PSBMVENfQVNOMV9FT0wpIHsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfSU5URUdFUjoKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9TSE9SVF9JTlRFR0VSOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX0JJVF9TVFJJTkc6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfT0NURVRfU1RSSU5HOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX05VTEw6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfT0JKRUNUX0lERU5USUZJRVI6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfSUE1X1NUUklORzoKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9QUklOVEFCTEVfU1RSSU5HOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX1VUQ1RJTUU6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfU0VRVUVOQ0U6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfQ0hPSUNFOgorICAgICAgICAgICAgICAgIGxpc3RbeF0udHlwZSAgID0gdHlwZTsKKyAgICAgICAgICAgICAgICBsaXN0W3hdLnNpemUgICA9IHNpemU7CisgICAgICAgICAgICAgICAgbGlzdFt4KytdLmRhdGEgPSBkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgCisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICB2YV9lbmQoYXJncyk7CisgICAgICAgICAgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX0FSRzsKKyAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICB9CisgICB9CisgICB2YV9lbmQoYXJncyk7CisKKyAgIGVyciA9IGRlcl9kZWNvZGVfc2VxdWVuY2UoaW4sIGlubGVuLCBsaXN0LCB4KTsKK0xCTF9FUlI6CisgICBYRlJFRShsaXN0KTsKKyAgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZgorCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci9zZXF1ZW5jZS9kZXJfZGVjb2RlX3NlcXVlbmNlX211bHRpLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNyAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOCAxOToyMDoyMyAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvYXNuMS9kZXIvc2VxdWVuY2UvZGVyX2VuY29kZV9zZXF1ZW5jZS5jIGIvc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9lbmNvZGVfc2VxdWVuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTMxNTNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9lbmNvZGVfc2VxdWVuY2UuYwpAQCAtMCwwICsxLDI4MSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisKKy8qKgorICBAZmlsZSBkZXJfZW5jb2RlX3NlcXVlbmNlLmMKKyAgQVNOLjEgREVSLCBlbmNvZGUgYSBTRVFVRU5DRSwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgTFRDX0RFUgorCisvKioKKyAgIEVuY29kZSBhIFNFUVVFTkNFCisgICBAcGFyYW0gbGlzdCAgICAgIFRoZSBsaXN0IG9mIGl0ZW1zIHRvIGVuY29kZQorICAgQHBhcmFtIGlubGVuICAgICBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBsaXN0CisgICBAcGFyYW0gb3V0ICAgICAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiAKKyAgIEBwYXJhbSBvdXRsZW4gICAgW2luL291dF0gVGhlIHNpemUgb2YgdGhlIG91dHB1dAorICAgQHJldHVybiBDUllQVF9PSyBvbiBzdWNjZXNzCisqLworaW50IGRlcl9lbmNvZGVfc2VxdWVuY2UobHRjX2FzbjFfbGlzdCAqbGlzdCwgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgIHVuc2lnbmVkIGxvbmcgKm91dGxlbikgCit7CisgICBpbnQgICAgICAgICAgIGVyciwgdHlwZTsKKyAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgeCwgeSwgeiwgaTsKKyAgIHZvaWQgICAgICAgICAgKmRhdGE7CisKKyAgIExUQ19BUkdDSEsobGlzdCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICAhPSBOVUxMKTsKKworICAgLyogZ2V0IHNpemUgb2Ygb3V0cHV0IHRoYXQgd2lsbCBiZSByZXF1aXJlZCAqLworICAgeSA9IDA7CisgICBmb3IgKGkgPSAwOyBpIDwgaW5sZW47IGkrKykgeworICAgICAgIHR5cGUgPSBsaXN0W2ldLnR5cGU7CisgICAgICAgc2l6ZSA9IGxpc3RbaV0uc2l6ZTsKKyAgICAgICBkYXRhID0gbGlzdFtpXS5kYXRhOworCisgICAgICAgaWYgKHR5cGUgPT0gTFRDX0FTTjFfRU9MKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICBjYXNlIExUQ19BU04xX0lOVEVHRVI6CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfaW50ZWdlcihkYXRhLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB5ICs9IHg7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX1NIT1JUX0lOVEVHRVI6CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfc2hvcnRfaW50ZWdlcigqKCh1bnNpZ25lZCBsb25nKilkYXRhKSwgJngpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeSArPSB4OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9CSVRfU1RSSU5HOgorICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX2JpdF9zdHJpbmcoc2l6ZSwgJngpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeSArPSB4OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9PQ1RFVF9TVFJJTkc6CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfb2N0ZXRfc3RyaW5nKHNpemUsICZ4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHkgKz0geDsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfTlVMTDoKKyAgICAgICAgICAgICAgIHkgKz0gMjsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfT0JKRUNUX0lERU5USUZJRVI6CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfb2JqZWN0X2lkZW50aWZpZXIoZGF0YSwgc2l6ZSwgJngpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeSArPSB4OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9JQTVfU1RSSU5HOgorICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX2lhNV9zdHJpbmcoZGF0YSwgc2l6ZSwgJngpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeSArPSB4OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9QUklOVEFCTEVfU1RSSU5HOgorICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX3ByaW50YWJsZV9zdHJpbmcoZGF0YSwgc2l6ZSwgJngpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeSArPSB4OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9VVENUSU1FOgorICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX3V0Y3RpbWUoZGF0YSwgJngpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeSArPSB4OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9TRVFVRU5DRToKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2xlbmd0aF9zZXF1ZW5jZShkYXRhLCBzaXplLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB5ICs9IHg7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIAorICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgZXJyID0gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgfQorICAgfQorCisgICAvKiBjYWxjIGhlYWRlciBzaXplICovCisgICB6ID0geTsKKyAgIGlmICh5IDwgMTI4KSB7CisgICAgICB5ICs9IDI7CisgICB9IGVsc2UgaWYgKHkgPCAyNTYpIHsKKyAgICAgIC8qIDB4MzAgMHg4MSBMTCAqLworICAgICAgeSArPSAzOworICAgfSBlbHNlIGlmICh5IDwgNjU1MzZVTCkgeworICAgICAgLyogMHgzMCAweDgyIExMIExMICovCisgICAgICB5ICs9IDQ7CisgICB9IGVsc2UgaWYgKHkgPCAxNjc3NzIxNlVMKSB7CisgICAgICAvKiAweDMwIDB4ODMgTEwgTEwgTEwgKi8KKyAgICAgIHkgKz0gNTsKKyAgIH0gZWxzZSB7CisgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX0FSRzsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogdG9vIGJpZyA/ICovCisgICBpZiAoKm91dGxlbiA8IHkpIHsKKyAgICAgIGVyciA9IENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogc3RvcmUgaGVhZGVyICovCisgICB4ID0gMDsKKyAgIG91dFt4KytdID0gMHgzMDsKKyAgIGlmICh6IDwgMTI4KSB7CisgICAgICBvdXRbeCsrXSA9IHo7CisgICB9IGVsc2UgaWYgKHogPCAyNTYpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MTsKKyAgICAgIG91dFt4KytdID0gejsKKyAgIH0gZWxzZSBpZiAoeiA8IDY1NTM2VUwpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MjsKKyAgICAgIG91dFt4KytdID0gKHo+PjhVTCkmMjU1OworICAgICAgb3V0W3grK10gPSB6JjI1NTsKKyAgIH0gZWxzZSBpZiAoeiA8IDE2Nzc3MjE2VUwpIHsKKyAgICAgIG91dFt4KytdID0gMHg4MzsKKyAgICAgIG91dFt4KytdID0gKHo+PjE2VUwpJjI1NTsKKyAgICAgIG91dFt4KytdID0gKHo+PjhVTCkmMjU1OworICAgICAgb3V0W3grK10gPSB6JjI1NTsKKyAgIH0KKworICAgLyogc3RvcmUgZGF0YSAqLworICAgKm91dGxlbiAtPSB4OworICAgZm9yIChpID0gMDsgaSA8IGlubGVuOyBpKyspIHsKKyAgICAgICB0eXBlID0gbGlzdFtpXS50eXBlOworICAgICAgIHNpemUgPSBsaXN0W2ldLnNpemU7CisgICAgICAgZGF0YSA9IGxpc3RbaV0uZGF0YTsKKworICAgICAgIGlmICh0eXBlID09IExUQ19BU04xX0VPTCkgeyAKKyAgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKyAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9JTlRFR0VSOgorICAgICAgICAgICAgICAgeiA9ICpvdXRsZW47CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9lbmNvZGVfaW50ZWdlcihkYXRhLCBvdXQgKyB4LCAmeikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB4ICAgICAgICs9IHo7CisgICAgICAgICAgICAgICAqb3V0bGVuIC09IHo7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX1NIT1JUX0lOVEVHRVI6CisgICAgICAgICAgICAgICB6ID0gKm91dGxlbjsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2VuY29kZV9zaG9ydF9pbnRlZ2VyKCooKHVuc2lnbmVkIGxvbmcqKWRhdGEpLCBvdXQgKyB4LCAmeikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB4ICAgICAgICs9IHo7CisgICAgICAgICAgICAgICAqb3V0bGVuIC09IHo7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX0JJVF9TVFJJTkc6CisgICAgICAgICAgICAgICB6ID0gKm91dGxlbjsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2VuY29kZV9iaXRfc3RyaW5nKGRhdGEsIHNpemUsIG91dCArIHgsICZ6KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHggICAgICAgKz0gejsKKyAgICAgICAgICAgICAgICpvdXRsZW4gLT0gejsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfT0NURVRfU1RSSU5HOgorICAgICAgICAgICAgICAgeiA9ICpvdXRsZW47CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9lbmNvZGVfb2N0ZXRfc3RyaW5nKGRhdGEsIHNpemUsIG91dCArIHgsICZ6KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHggICAgICAgKz0gejsKKyAgICAgICAgICAgICAgICpvdXRsZW4gLT0gejsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfTlVMTDoKKyAgICAgICAgICAgICAgIG91dFt4KytdID0gMHgwNTsKKyAgICAgICAgICAgICAgIG91dFt4KytdID0gMHgwMDsKKyAgICAgICAgICAgICAgICpvdXRsZW4gLT0gMjsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfT0JKRUNUX0lERU5USUZJRVI6CisgICAgICAgICAgICAgICB6ID0gKm91dGxlbjsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2VuY29kZV9vYmplY3RfaWRlbnRpZmllcihkYXRhLCBzaXplLCBvdXQgKyB4LCAmeikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB4ICAgICAgICs9IHo7CisgICAgICAgICAgICAgICAqb3V0bGVuIC09IHo7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX0lBNV9TVFJJTkc6CisgICAgICAgICAgICAgICB6ID0gKm91dGxlbjsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2VuY29kZV9pYTVfc3RyaW5nKGRhdGEsIHNpemUsIG91dCArIHgsICZ6KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHggICAgICAgKz0gejsKKyAgICAgICAgICAgICAgICpvdXRsZW4gLT0gejsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgICAgICBjYXNlIExUQ19BU04xX1BSSU5UQUJMRV9TVFJJTkc6CisgICAgICAgICAgICAgICB6ID0gKm91dGxlbjsKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2VuY29kZV9wcmludGFibGVfc3RyaW5nKGRhdGEsIHNpemUsIG91dCArIHgsICZ6KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHggICAgICAgKz0gejsKKyAgICAgICAgICAgICAgICpvdXRsZW4gLT0gejsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfVVRDVElNRToKKyAgICAgICAgICAgICAgIHogPSAqb3V0bGVuOworICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfZW5jb2RlX3V0Y3RpbWUoZGF0YSwgb3V0ICsgeCwgJnopKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeCAgICAgICArPSB6OworICAgICAgICAgICAgICAgKm91dGxlbiAtPSB6OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9TRVFVRU5DRToKKyAgICAgICAgICAgICAgIHogPSAqb3V0bGVuOworICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfZW5jb2RlX3NlcXVlbmNlKGRhdGEsIHNpemUsIG91dCArIHgsICZ6KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHggICAgICAgKz0gejsKKyAgICAgICAgICAgICAgICpvdXRsZW4gLT0gejsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX0FSRzsKKyAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICB9CisgICB9CisgICAqb3V0bGVuID0geDsKKyAgIGVyciA9IENSWVBUX09LOyAgIAorCitMQkxfRVJSOgorICAgcmV0dXJuIGVycjsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvcGsvYXNuMS9kZXIvc2VxdWVuY2UvZGVyX2VuY29kZV9zZXF1ZW5jZV9tdWx0aS5jIGIvc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9lbmNvZGVfc2VxdWVuY2VfbXVsdGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmY0OGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9lbmNvZGVfc2VxdWVuY2VfbXVsdGkuYwpAQCAtMCwwICsxLDEyMyBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisKKy8qKgorICBAZmlsZSBkZXJfZW5jb2RlX3NlcXVlbmNlX211bHRpLmMKKyAgQVNOLjEgREVSLCBlbmNvZGUgYSBTRVFVRU5DRSwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgTFRDX0RFUgorCitpbnQgZGVyX2VuY29kZV9zZXF1ZW5jZV9tdWx0aSh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgLi4uKQoreworICAgaW50ICAgICAgICAgICBlcnIsIHR5cGU7CisgICB1bnNpZ25lZCBsb25nIHNpemUsIHg7CisgICB2b2lkICAgICAgICAgICpkYXRhOworICAgdmFfbGlzdCAgICAgICBhcmdzOworICAgbHRjX2FzbjFfbGlzdCAqbGlzdDsKKworICAgTFRDX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKworICAgLyogZ2V0IHNpemUgb2Ygb3V0cHV0IHRoYXQgd2lsbCBiZSByZXF1aXJlZCAqLworICAgdmFfc3RhcnQoYXJncywgb3V0bGVuKTsKKyAgIHggPSAwOworICAgZm9yICg7OykgeworICAgICAgIHR5cGUgPSB2YV9hcmcoYXJncywgaW50KTsKKyAgICAgICBzaXplID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcpOworICAgICAgIGRhdGEgPSB2YV9hcmcoYXJncywgdm9pZCopOworCisgICAgICAgaWYgKHR5cGUgPT0gTFRDX0FTTjFfRU9MKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICBjYXNlIExUQ19BU04xX0lOVEVHRVI6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfU0hPUlRfSU5URUdFUjoKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9CSVRfU1RSSU5HOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX09DVEVUX1NUUklORzoKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9OVUxMOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX09CSkVDVF9JREVOVElGSUVSOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX0lBNV9TVFJJTkc6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfUFJJTlRBQkxFX1NUUklORzoKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9VVENUSU1FOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX1NFUVVFTkNFOgorICAgICAgICAgICAgICAgICsreDsgCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICB2YV9lbmQoYXJncyk7CisgICAgICAgICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICAgICAgfQorICAgfQorICAgdmFfZW5kKGFyZ3MpOworCisgICAvKiBhbGxvY2F0ZSBzdHJ1Y3R1cmUgZm9yIHggZWxlbWVudHMgKi8KKyAgIGlmICh4ID09IDApIHsKKyAgICAgIHJldHVybiBDUllQVF9OT1A7CisgICB9CisKKyAgIGxpc3QgPSBYQ0FMTE9DKHNpemVvZigqbGlzdCksIHgpOworICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKworICAgLyogZmlsbCBpbiB0aGUgc3RydWN0dXJlICovCisgICB2YV9zdGFydChhcmdzLCBvdXRsZW4pOworICAgeCA9IDA7CisgICBmb3IgKDs7KSB7CisgICAgICAgdHlwZSA9IHZhX2FyZyhhcmdzLCBpbnQpOworICAgICAgIHNpemUgPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyk7CisgICAgICAgZGF0YSA9IHZhX2FyZyhhcmdzLCB2b2lkKik7CisKKyAgICAgICBpZiAodHlwZSA9PSBMVENfQVNOMV9FT0wpIHsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfSU5URUdFUjoKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9TSE9SVF9JTlRFR0VSOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX0JJVF9TVFJJTkc6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfT0NURVRfU1RSSU5HOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX05VTEw6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfT0JKRUNUX0lERU5USUZJRVI6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfSUE1X1NUUklORzoKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9QUklOVEFCTEVfU1RSSU5HOgorICAgICAgICAgICBjYXNlIExUQ19BU04xX1VUQ1RJTUU6CisgICAgICAgICAgIGNhc2UgTFRDX0FTTjFfU0VRVUVOQ0U6CisgICAgICAgICAgICAgICAgbGlzdFt4XS50eXBlICAgPSB0eXBlOworICAgICAgICAgICAgICAgIGxpc3RbeF0uc2l6ZSAgID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBsaXN0W3grK10uZGF0YSA9IGRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIHZhX2VuZChhcmdzKTsKKyAgICAgICAgICAgICAgIGVyciA9IENSWVBUX0lOVkFMSURfQVJHOworICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgIH0KKyAgIH0KKyAgIHZhX2VuZChhcmdzKTsKKworICAgZXJyID0gZGVyX2VuY29kZV9zZXF1ZW5jZShsaXN0LCB4LCBvdXQsIG91dGxlbik7ICAgCitMQkxfRVJSOgorICAgWEZSRUUobGlzdCk7CisgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvYXNuMS9kZXIvc2VxdWVuY2UvZGVyX2VuY29kZV9zZXF1ZW5jZV9tdWx0aS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjYgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTggMTk6MjA6MjMgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL3NlcXVlbmNlL2Rlcl9sZW5ndGhfc2VxdWVuY2UuYyBiL3NyYy9way9hc24xL2Rlci9zZXF1ZW5jZS9kZXJfbGVuZ3RoX3NlcXVlbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyMDQ1MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci9zZXF1ZW5jZS9kZXJfbGVuZ3RoX3NlcXVlbmNlLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworCisvKioKKyAgQGZpbGUgZGVyX2xlbmd0aF9zZXF1ZW5jZS5jCisgIEFTTi4xIERFUiwgbGVuZ3RoIGEgU0VRVUVOQ0UsIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIExUQ19ERVIKKworLyoqCisgICBHZXQgdGhlIGxlbmd0aCBvZiBhIERFUiBzZXF1ZW5jZSAKKyAgIEBwYXJhbSBsaXN0ICAgVGhlIHNlcXVlbmNlcyBvZiBpdGVtcyBpbiB0aGUgU0VRVUVOQ0UKKyAgIEBwYXJhbSBpbmxlbiAgVGhlIG51bWJlciBvZiBpdGVtcworICAgQHBhcmFtIG91dGxlbiBbb3V0XSBUaGUgbGVuZ3RoIHJlcXVpcmVkIGluIG9jdGV0cyB0byBzdG9yZSBpdCAKKyAgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjY2VzcworKi8KK2ludCBkZXJfbGVuZ3RoX3NlcXVlbmNlKGx0Y19hc24xX2xpc3QgKmxpc3QsIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4pIAoreworICAgaW50ICAgICAgICAgICBlcnIsIHR5cGU7CisgICB1bnNpZ25lZCBsb25nIHNpemUsIHgsIHksIHosIGk7CisgICB2b2lkICAgICAgICAgICpkYXRhOworCisgICBMVENfQVJHQ0hLKGxpc3QgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAgIT0gTlVMTCk7CisKKyAgIC8qIGdldCBzaXplIG9mIG91dHB1dCB0aGF0IHdpbGwgYmUgcmVxdWlyZWQgKi8KKyAgIHkgPSAwOworICAgZm9yIChpID0gMDsgaSA8IGlubGVuOyBpKyspIHsKKyAgICAgICB0eXBlID0gbGlzdFtpXS50eXBlOworICAgICAgIHNpemUgPSBsaXN0W2ldLnNpemU7CisgICAgICAgZGF0YSA9IGxpc3RbaV0uZGF0YTsKKworICAgICAgIGlmICh0eXBlID09IExUQ19BU04xX0VPTCkgeyAKKyAgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKyAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9JTlRFR0VSOgorICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX2ludGVnZXIoZGF0YSwgJngpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeSArPSB4OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9TSE9SVF9JTlRFR0VSOgorICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX3Nob3J0X2ludGVnZXIoKigodW5zaWduZWQgbG9uZyAqKWRhdGEpLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB5ICs9IHg7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX0JJVF9TVFJJTkc6CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfYml0X3N0cmluZyhzaXplLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB5ICs9IHg7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX09DVEVUX1NUUklORzoKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2xlbmd0aF9vY3RldF9zdHJpbmcoc2l6ZSwgJngpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgeSArPSB4OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9OVUxMOgorICAgICAgICAgICAgICAgeSArPSAyOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSBMVENfQVNOMV9PQkpFQ1RfSURFTlRJRklFUjoKKyAgICAgICAgICAgICAgIGlmICgoZXJyID0gZGVyX2xlbmd0aF9vYmplY3RfaWRlbnRpZmllcihkYXRhLCBzaXplLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB5ICs9IHg7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX0lBNV9TVFJJTkc6CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfaWE1X3N0cmluZyhkYXRhLCBzaXplLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB5ICs9IHg7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX1BSSU5UQUJMRV9TVFJJTkc6CisgICAgICAgICAgICAgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfcHJpbnRhYmxlX3N0cmluZyhkYXRhLCBzaXplLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB5ICs9IHg7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIExUQ19BU04xX1NFUVVFTkNFOgorICAgICAgICAgICAgICAgaWYgKChlcnIgPSBkZXJfbGVuZ3RoX3NlcXVlbmNlKGRhdGEsIHNpemUsICZ4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHkgKz0geDsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgCisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX0FSRzsKKyAgICAgICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICB9CisgICB9CisKKyAgIC8qIGNhbGMgaGVhZGVyIHNpemUgKi8KKyAgIHogPSB5OworICAgaWYgKHkgPCAxMjgpIHsKKyAgICAgIHkgKz0gMjsKKyAgIH0gZWxzZSBpZiAoeSA8IDI1NikgeworICAgICAgLyogMHgzMCAweDgxIExMICovCisgICAgICB5ICs9IDM7CisgICB9IGVsc2UgaWYgKHkgPCA2NTUzNlVMKSB7CisgICAgICAvKiAweDMwIDB4ODIgTEwgTEwgKi8KKyAgICAgIHkgKz0gNDsKKyAgIH0gZWxzZSBpZiAoeSA8IDE2Nzc3MjE2VUwpIHsKKyAgICAgIC8qIDB4MzAgMHg4MyBMTCBMTCBMTCAqLworICAgICAgeSArPSA1OworICAgfSBlbHNlIHsKKyAgICAgIGVyciA9IENSWVBUX0lOVkFMSURfQVJHOworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICAvKiBzdG9yZSBzaXplICovCisgICAqb3V0bGVuID0geTsKKyAgIGVyciAgICAgPSBDUllQVF9PSzsKKworTEJMX0VSUjoKKyAgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL3Nob3J0X2ludGVnZXIvZGVyX2RlY29kZV9zaG9ydF9pbnRlZ2VyLmMgYi9zcmMvcGsvYXNuMS9kZXIvc2hvcnRfaW50ZWdlci9kZXJfZGVjb2RlX3Nob3J0X2ludGVnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDNkM2I3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL3Nob3J0X2ludGVnZXIvZGVyX2RlY29kZV9zaG9ydF9pbnRlZ2VyLmMKQEAgLTAsMCArMSw2OCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2RlY29kZV9zaG9ydF9pbnRlZ2VyLmMKKyAgQVNOLjEgREVSLCBkZWNvZGUgYW4gaW50ZWdlciwgVG9tIFN0IERlbmlzCisqLworCisKKyNpZmRlZiBMVENfREVSCisKKy8qKgorICBSZWFkIGEgbXBfaW50IGludGVnZXIKKyAgQHBhcmFtIGluICAgICAgIFRoZSBERVIgZW5jb2RlZCBkYXRhCisgIEBwYXJhbSBpbmxlbiAgICBTaXplIG9mIGRhdGEKKyAgQHBhcmFtIG51bSAgICAgIFtvdXRdIFRoZSBpbnRlZ2VyIHRvIGRlY29kZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZGVyX2RlY29kZV9zaG9ydF9pbnRlZ2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCB1bnNpZ25lZCBsb25nICpudW0pCit7CisgICB1bnNpZ25lZCBsb25nIGxlbiwgeCwgeTsKKworICAgTFRDX0FSR0NISyhudW0gICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKKworICAgLyogY2hlY2sgbGVuZ3RoICovCisgICBpZiAoaW5sZW4gPCAyKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICB9CisKKyAgIC8qIGNoZWNrIGhlYWRlciAqLworICAgeCA9IDA7CisgICBpZiAoKGluW3grK10gJiAweDFGKSAhPSAweDAyKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICB9CisKKyAgIC8qIGdldCB0aGUgcGFja2V0IGxlbiAqLworICAgbGVuID0gaW5beCsrXTsKKworICAgaWYgKHggKyBsZW4gPiBpbmxlbikgeworICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgfQorCisgICAvKiByZWFkIG51bWJlciAqLworICAgeSA9IDA7CisgICB3aGlsZSAobGVuLS0pIHsKKyAgICAgIHkgPSAoeTw8OCkgfCAodW5zaWduZWQgbG9uZylpblt4KytdOworICAgfQorICAgKm51bSA9IHk7CisKKyAgIHJldHVybiBDUllQVF9PSzsKKworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL2FzbjEvZGVyL3Nob3J0X2ludGVnZXIvZGVyX2RlY29kZV9zaG9ydF9pbnRlZ2VyLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8yMyAwMTowNDoxMyAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvYXNuMS9kZXIvc2hvcnRfaW50ZWdlci9kZXJfZW5jb2RlX3Nob3J0X2ludGVnZXIuYyBiL3NyYy9way9hc24xL2Rlci9zaG9ydF9pbnRlZ2VyL2Rlcl9lbmNvZGVfc2hvcnRfaW50ZWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTRkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGsvYXNuMS9kZXIvc2hvcnRfaW50ZWdlci9kZXJfZW5jb2RlX3Nob3J0X2ludGVnZXIuYwpAQCAtMCwwICsxLDk3IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBkZXJfZW5jb2RlX3Nob3J0X2ludGVnZXIuYworICBBU04uMSBERVIsIGVuY29kZSBhbiBpbnRlZ2VyLCBUb20gU3QgRGVuaXMKKyovCisKKworI2lmZGVmIExUQ19ERVIKKworLyogRXhwb3J0cyBhIHBvc2l0aXZlIGludGVnZXIgYXMgREVSIGZvcm1hdCAodXB0byAzMi1iaXRzIGluIHNpemUpICovCisvKioKKyAgU3RvcmUgYSBtcF9pbnQgaW50ZWdlcgorICBAcGFyYW0gbnVtICAgICAgVGhlIGludGVnZXIgdG8gZW5jb2RlCisgIEBwYXJhbSBvdXQgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gZm9yIHRoZSBERVIgZW5jb2RlZCBpbnRlZ2VycworICBAcGFyYW0gb3V0bGVuICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgREVSIGVuY29kZWQgaW50ZWdlcnMKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGRlcl9lbmNvZGVfc2hvcnRfaW50ZWdlcih1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7ICAKKyAgIHVuc2lnbmVkIGxvbmcgbGVuLCB4LCB5LCB6OworICAgaW50ICAgICAgICAgICBlcnI7CisgICAKKyAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisKKyAgIC8qIGZvcmNlIHRvIDMyIGJpdHMgKi8KKyAgIG51bSAmPSAweEZGRkZGRkZGVUw7CisKKyAgIC8qIGZpbmQgb3V0IGhvdyBiaWcgdGhpcyB3aWxsIGJlICovCisgICBpZiAoKGVyciA9IGRlcl9sZW5ndGhfc2hvcnRfaW50ZWdlcihudW0sICZsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgaWYgKCpvdXRsZW4gPCBsZW4pIHsKKyAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICB9CisKKyAgIC8qIGdldCBsZW4gb2Ygb3V0cHV0ICovCisgICB6ID0gMDsKKyAgIHkgPSBudW07CisgICB3aGlsZSAoeSkgeworICAgICArK3o7CisgICAgIHkgPj49IDg7CisgICB9CisKKyAgIC8qIGhhbmRsZSB6ZXJvICovCisgICBpZiAoeiA9PSAwKSB7CisgICAgICB6ID0gMTsKKyAgIH0KKworICAgLyogc2VlIGlmIG1zYiBpcyBzZXQgKi8KKyAgIHogKz0gKG51bSYoMVVMPDwoKHo8PDMpIC0gMSkpKSA/IDEgOiAwOworCisgICAvKiBhZGp1c3QgdGhlIG51bWJlciBzbyB0aGUgbXNCIGlzIG5vbi16ZXJvICovCisgICBmb3IgKHggPSAwOyAoeiA8PSA0KSAmJiAoeCA8ICg0IC0geikpOyB4KyspIHsKKyAgICAgIG51bSA8PD0gODsKKyAgIH0KKworICAgLyogc3RvcmUgaGVhZGVyICovCisgICB4ID0gMDsKKyAgIG91dFt4KytdID0gMHgwMjsKKyAgIG91dFt4KytdID0gejsKKworICAgLyogaWYgMzFzdCBiaXQgaXMgc2V0IG91dHB1dCBhIGxlYWRpbmcgemVybyBhbmQgZGVjcmVtZW50IGNvdW50ICovCisgICBpZiAoeiA9PSA1KSB7CisgICAgICBvdXRbeCsrXSA9IDA7CisgICAgICAtLXo7CisgICB9CisKKyAgIC8qIHN0b3JlIHZhbHVlcyAqLworICAgZm9yICh5ID0gMDsgeSA8IHo7IHkrKykgeworICAgICAgb3V0W3grK10gPSAobnVtID4+IDI0KSAmIDB4RkY7CisgICAgICBudW0gICAgPDw9IDg7CisgICB9CisKKyAgIC8qIHdlIGdvb2QgKi8KKyAgICpvdXRsZW4gPSB4OworIAorICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL2FzbjEvZGVyL3Nob3J0X2ludGVnZXIvZGVyX2VuY29kZV9zaG9ydF9pbnRlZ2VyLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8yMyAwMToyNzowMyAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvYXNuMS9kZXIvc2hvcnRfaW50ZWdlci9kZXJfbGVuZ3RoX3Nob3J0X2ludGVnZXIuYyBiL3NyYy9way9hc24xL2Rlci9zaG9ydF9pbnRlZ2VyL2Rlcl9sZW5ndGhfc2hvcnRfaW50ZWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjRiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGsvYXNuMS9kZXIvc2hvcnRfaW50ZWdlci9kZXJfbGVuZ3RoX3Nob3J0X2ludGVnZXIuYwpAQCAtMCwwICsxLDY5IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBkZXJfbGVuZ3RoX3Nob3J0X2ludGVnZXIuYworICBBU04uMSBERVIsIGdldCBsZW5ndGggb2YgZW5jb2RpbmcsIFRvbSBTdCBEZW5pcworKi8KKworCisjaWZkZWYgTFRDX0RFUgorLyoqCisgIEdldHMgbGVuZ3RoIG9mIERFUiBlbmNvZGluZyBvZiBudW0gCisgIEBwYXJhbSBudW0gICAgVGhlIGludGVnZXIgdG8gZ2V0IHRoZSBzaXplIG9mIAorICBAcGFyYW0gb3V0bGVuIFtvdXRdIFRoZSBsZW5ndGggb2YgdGhlIERFUiBlbmNvZGluZyBmb3IgdGhlIGdpdmVuIGludGVnZXIKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGRlcl9sZW5ndGhfc2hvcnRfaW50ZWdlcih1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworICAgdW5zaWduZWQgbG9uZyB6LCB5LCBsZW47CisKKyAgIExUQ19BUkdDSEsob3V0bGVuICAhPSBOVUxMKTsKKworICAgLyogZm9yY2UgdG8gMzIgYml0cyAqLworICAgbnVtICY9IDB4RkZGRkZGRkZVTDsKKworICAgLyogZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgKi8KKyAgIHogPSAwOworICAgeSA9IG51bTsKKyAgIHdoaWxlICh5KSB7CisgICAgICsrejsKKyAgICAgeSA+Pj0gODsKKyAgIH0KKworICAgLyogaGFuZGxlIHplcm8gKi8KKyAgIGlmICh6ID09IDApIHsKKyAgICAgIHogPSAxOworICAgfQorCisgICAvKiB3ZSBuZWVkIGEgMHgwMiB0byBpbmRpY2F0ZSBpdCdzIElOVEVHRVIgKi8KKyAgIGxlbiA9IDE7CisKKyAgIC8qIGxlbmd0aCBieXRlICovCisgICArK2xlbjsKKworICAgLyogYnl0ZXMgaW4gdmFsdWUgKi8KKyAgIGxlbiArPSB6OworCisgICAvKiBzZWUgaWYgbXNiIGlzIHNldCAqLworICAgbGVuICs9IChudW0mKDFVTDw8KCh6PDwzKSAtIDEpKSkgPyAxIDogMDsKKworICAgLyogcmV0dXJuIGxlbmd0aCAqLworICAgKm91dGxlbiA9IGxlbjsgCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvYXNuMS9kZXIvc2hvcnRfaW50ZWdlci9kZXJfbGVuZ3RoX3Nob3J0X2ludGVnZXIuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzIzIDAxOjM1OjM4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9kZWNvZGVfdXRjdGltZS5jIGIvc3JjL3BrL2FzbjEvZGVyL3V0Y3RpbWUvZGVyX2RlY29kZV91dGN0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiYTAzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9kZWNvZGVfdXRjdGltZS5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBkZXJfZGVjb2RlX3V0Y3RpbWUuYworICBBU04uMSBERVIsIGRlY29kZSBhICBVVENUSU1FLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBMVENfREVSCisKK3N0YXRpYyBpbnQgY2hhcl90b19pbnQodW5zaWduZWQgY2hhciB4KQoreworICAgc3dpdGNoICh4KSAgeworICAgICAgY2FzZSAnMCc6IHJldHVybiAwOworICAgICAgY2FzZSAnMSc6IHJldHVybiAxOworICAgICAgY2FzZSAnMic6IHJldHVybiAyOworICAgICAgY2FzZSAnMyc6IHJldHVybiAzOworICAgICAgY2FzZSAnNCc6IHJldHVybiA0OworICAgICAgY2FzZSAnNSc6IHJldHVybiA1OworICAgICAgY2FzZSAnNic6IHJldHVybiA2OworICAgICAgY2FzZSAnNyc6IHJldHVybiA3OworICAgICAgY2FzZSAnOCc6IHJldHVybiA4OworICAgICAgY2FzZSAnOSc6IHJldHVybiA5OworICAgfQorICAgcmV0dXJuIDEwMDsKK30KKworI2RlZmluZSBERUNPREVfVih5LCBtYXgpIFwKKyAgIHkgID0gY2hhcl90b19pbnQoYnVmW3hdKSoxMCArIGNoYXJfdG9faW50KGJ1Zlt4KzFdKTsgXAorICAgaWYgKHkgPj0gbWF4KSByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7ICAgICAgICAgICBcCisgICB4ICs9IDI7CisKK2ludCBkZXJfZGVjb2RlX3V0Y3RpbWUoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgKmlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdGNfdXRjdGltZSAgICpvdXQpCit7CisgICB1bnNpZ25lZCBjaGFyIGJ1ZlszMl07CisgICB1bnNpZ25lZCBsb25nIHg7CisgICBpbnQgICAgICAgICAgIHk7CisKKyAgIExUQ19BUkdDSEsoaW4gICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGlubGVuICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAhPSBOVUxMKTsKKworICAgLyogY2hlY2sgaGVhZGVyICovCisgICBpZiAoKmlubGVuIDwgMlVMIHx8IChpblsxXSA+PSBzaXplb2YoYnVmKSkgfHwgKChpblsxXSArIDJVTCkgPiAqaW5sZW4pKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICB9CisKKyAgIC8qIGRlY29kZSB0aGUgc3RyaW5nICovCisgICBmb3IgKHggPSAwOyB4IDwgaW5bMV07IHgrKykgeworICAgICAgIHkgPSBkZXJfaWE1X3ZhbHVlX2RlY29kZShpblt4KzJdKTsKKyAgICAgICBpZiAoeSA9PSAtMSkgeworICAgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgICB9CisgICAgICAgYnVmW3hdID0geTsKKyAgIH0KKyAgICppbmxlbiA9IDIgKyB4OworCisKKyAgIC8qIHBvc3NpYmxlIGVuY29kaW5ncyBhcmUgCitZWU1NRERoaG1tWgorWVlNTUREaGhtbStoaCdtbScKK1lZTU1ERGhobW0taGgnbW0nCitZWU1NRERoaG1tc3NaCitZWU1NRERoaG1tc3MraGgnbW0nCitZWU1NRERoaG1tc3MtaGgnbW0nCisKKyAgICBTbyBsZXQncyBkbyBhIHRyaXZpYWwgZGVjb2RlIHVwdG8gW2luY2x1ZGluZ10gbW0gCisgICAqLworCisgICAgeCA9IDA7CisgICAgREVDT0RFX1Yob3V0LT5ZWSwgMTAwKTsKKyAgICBERUNPREVfVihvdXQtPk1NLCAxMyk7CisgICAgREVDT0RFX1Yob3V0LT5ERCwgMzIpOworICAgIERFQ09ERV9WKG91dC0+aGgsIDI0KTsKKyAgICBERUNPREVfVihvdXQtPm1tLCA2MCk7CisKKyAgICAvKiBjbGVhciB0aW1lem9uZSBhbmQgc2Vjb25kcyBpbmZvICovCisgICAgb3V0LT5vZmZfZGlyID0gb3V0LT5vZmZfaGggPSBvdXQtPm9mZl9tbSA9IG91dC0+c3MgPSAwOworCisgICAgLyogbm93IGlzIGl0IFosICssIC0gb3IgMC05ICovCisgICAgaWYgKGJ1Zlt4XSA9PSAnWicpIHsKKyAgICAgICByZXR1cm4gQ1JZUFRfT0s7CisgICAgfSBlbHNlIGlmIChidWZbeF0gPT0gJysnIHx8IGJ1Zlt4XSA9PSAnLScpIHsKKyAgICAgICBvdXQtPm9mZl9kaXIgPSAoYnVmW3grK10gPT0gJysnKSA/IDAgOiAxOworICAgICAgIERFQ09ERV9WKG91dC0+b2ZmX2hoLCAyNCk7CisgICAgICAgREVDT0RFX1Yob3V0LT5vZmZfbW0sIDYwKTsKKyAgICAgICByZXR1cm4gQ1JZUFRfT0s7CisgICAgfQorCisgICAgLyogZGVjb2RlIHNlY29uZHMgKi8KKyAgICBERUNPREVfVihvdXQtPnNzLCA2MCk7CisKKyAgICAvKiBub3cgaXMgaXQgWiwgKywgLSAqLworICAgIGlmIChidWZbeF0gPT0gJ1onKSB7CisgICAgICAgcmV0dXJuIENSWVBUX09LOworICAgIH0gZWxzZSBpZiAoYnVmW3hdID09ICcrJyB8fCBidWZbeF0gPT0gJy0nKSB7CisgICAgICAgb3V0LT5vZmZfZGlyID0gKGJ1Zlt4KytdID09ICcrJykgPyAwIDogMTsKKyAgICAgICBERUNPREVfVihvdXQtPm9mZl9oaCwgMjQpOworICAgICAgIERFQ09ERV9WKG91dC0+b2ZmX21tLCA2MCk7CisgICAgICAgcmV0dXJuIENSWVBUX09LOworICAgIH0gZWxzZSB7CisgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgIH0KK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9kZWNvZGVfdXRjdGltZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjYgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTI6MDc6MDAgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL3V0Y3RpbWUvZGVyX2VuY29kZV91dGN0aW1lLmMgYi9zcmMvcGsvYXNuMS9kZXIvdXRjdGltZS9kZXJfZW5jb2RlX3V0Y3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQ4Yzg0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL3V0Y3RpbWUvZGVyX2VuY29kZV91dGN0aW1lLmMKQEAgLTAsMCArMSw4MCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2VuY29kZV91dGN0aW1lLmMKKyAgQVNOLjEgREVSLCBlbmNvZGUgYSAgVVRDVElNRSwgVG9tIFN0IERlbmlzCisqLworCisjaWZkZWYgTFRDX0RFUgorCitzdGF0aWMgY29uc3QgY2hhciAqYmFzZXRlbiA9ICIwMTIzNDU2Nzg5IjsKKworI2RlZmluZSBTVE9SRV9WKHkpIFwKKyAgICBvdXRbeCsrXSA9IGRlcl9pYTVfY2hhcl9lbmNvZGUoYmFzZXRlblsoeS8xMCkgJSAxMF0pOyBcCisgICAgb3V0W3grK10gPSBkZXJfaWE1X2NoYXJfZW5jb2RlKGJhc2V0ZW5beSAlIDEwXSk7CisKKy8qKgorICBHZXRzIGxlbmd0aCBvZiBERVIgZW5jb2Rpbmcgb2YgVVRDVElNRQorICBAcGFyYW0gb3V0bGVuIFtvdXRdIFRoZSBsZW5ndGggb2YgdGhlIERFUiBlbmNvZGluZworICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZGVyX2VuY29kZV91dGN0aW1lKGx0Y191dGN0aW1lICp1dGN0aW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKyAgICB1bnNpZ25lZCBsb25nIHgsIHRtcGxlbjsKKyAgICBpbnQgICAgICAgICAgIGVycjsKKyAKKyAgICBMVENfQVJHQ0hLKHV0Y3RpbWUgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhvdXQgICAgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0bGVuICAhPSBOVUxMKTsKKworICAgIGlmICgoZXJyID0gZGVyX2xlbmd0aF91dGN0aW1lKHV0Y3RpbWUsICZ0bXBsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmICh0bXBsZW4gPiAqb3V0bGVuKSB7CisgICAgICAgIHJldHVybiBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgfQorICAgIAorICAgIC8qIHN0b3JlIGhlYWRlciAqLworICAgIG91dFswXSA9IDB4MTc7CisKKyAgICAvKiBzdG9yZSB2YWx1ZXMgKi8KKyAgICB4ID0gMjsKKyAgICBTVE9SRV9WKHV0Y3RpbWUtPllZKTsKKyAgICBTVE9SRV9WKHV0Y3RpbWUtPk1NKTsKKyAgICBTVE9SRV9WKHV0Y3RpbWUtPkREKTsKKyAgICBTVE9SRV9WKHV0Y3RpbWUtPmhoKTsKKyAgICBTVE9SRV9WKHV0Y3RpbWUtPm1tKTsKKyAgICBTVE9SRV9WKHV0Y3RpbWUtPnNzKTsKKworICAgIGlmICh1dGN0aW1lLT5vZmZfbW0gfHwgdXRjdGltZS0+b2ZmX2hoKSB7CisgICAgICAgb3V0W3grK10gPSBkZXJfaWE1X2NoYXJfZW5jb2RlKHV0Y3RpbWUtPm9mZl9kaXIgPyAnLScgOiAnKycpOworICAgICAgIFNUT1JFX1YodXRjdGltZS0+b2ZmX2hoKTsKKyAgICAgICBTVE9SRV9WKHV0Y3RpbWUtPm9mZl9tbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICBvdXRbeCsrXSA9IGRlcl9pYTVfY2hhcl9lbmNvZGUoJ1onKTsKKyAgICB9CisKKyAgICAvKiBzdG9yZSBsZW5ndGggKi8KKyAgICBvdXRbMV0gPSB4IC0gMjsKKyAgIAorICAgIC8qIGFsbCBnb29kIGxldCdzIHJldHVybiAqLworICAgICpvdXRsZW4gPSB4OworICAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9lbmNvZGVfdXRjdGltZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjUgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTI6MDc6MDAgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2FzbjEvZGVyL3V0Y3RpbWUvZGVyX2xlbmd0aF91dGN0aW1lLmMgYi9zcmMvcGsvYXNuMS9kZXIvdXRjdGltZS9kZXJfbGVuZ3RoX3V0Y3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGU2NTRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2FzbjEvZGVyL3V0Y3RpbWUvZGVyX2xlbmd0aF91dGN0aW1lLmMKQEAgLTAsMCArMSw0NSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgZGVyX2xlbmd0aF91dGN0aW1lLmMKKyAgQVNOLjEgREVSLCBnZXQgbGVuZ3RoIG9mIFVUQ1RJTUUsIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIExUQ19ERVIKKworLyoqCisgIEdldHMgbGVuZ3RoIG9mIERFUiBlbmNvZGluZyBvZiBVVENUSU1FCisgIEBwYXJhbSBvdXRsZW4gW291dF0gVGhlIGxlbmd0aCBvZiB0aGUgREVSIGVuY29kaW5nCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBkZXJfbGVuZ3RoX3V0Y3RpbWUobHRjX3V0Y3RpbWUgKnV0Y3RpbWUsIHVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKyAgIExUQ19BUkdDSEsob3V0bGVuICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsodXRjdGltZSAhPSBOVUxMKTsKKworICAgaWYgKHV0Y3RpbWUtPm9mZl9oaCA9PSAwICYmIHV0Y3RpbWUtPm9mZl9tbSA9PSAwKSB7CisgICAgICAvKiB3ZSBlbmNvZGUgYXMgWVlNTUREaGhtbXNzWiAqLworICAgICAgKm91dGxlbiA9IDIgKyAxMzsKKyAgIH0gZWxzZSB7CisgICAgICAvKiB3ZSBlbmNvZGUgYXMgWVlNTUREaGhtbXNzeyt8LX1oaCdtbScgKi8KKyAgICAgICpvdXRsZW4gPSAyICsgMTc7CisgICB9CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9hc24xL2Rlci91dGN0aW1lL2Rlcl9sZW5ndGhfdXRjdGltZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjIgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTkgMTE6MjM6MDQgJCAqLwpkaWZmIC0tZ2l0IGEvZGguYyBiL3NyYy9way9kaC9kaC5jCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIGRoLmMKcmVuYW1lIHRvIHNyYy9way9kaC9kaC5jCmluZGV4IDhjZjU2MzIuLmE1NGYyOWIgMTAwNjQ0Ci0tLSBhL2RoLmMKKysrIGIvc3JjL3BrL2RoL2RoLmMKQEAgLTYsMTIgKzYsMjAgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKKyNpbmNsdWRlICJ0b21jcnlwdC5oIgogCisvKioKKyAgQGZpbGUgZGguYworICBESCBjcnlwdG8sIFRvbSBTdCBEZW5pcworKi8KKyAgCiAjaWZkZWYgTURICiAKKy8qIG1heCBleHBvcnQgc2l6ZSB3ZSdsbCBlbmNvdW50ZXIgKHNtYWxsZXIgdGhhbiB0aGlzIGJ1dCBsZXRzIHJvdW5kIHVwIGEgYml0KSAqLworI2RlZmluZSBESF9CVUZfU0laRSAxMjAwCisKIC8qIFRoaXMgaG9sZHMgdGhlIGtleSBzZXR0aW5ncy4gICoqKk1VU1QqKiogYmUgb3JnYW5pemVkIGJ5IHNpemUgZnJvbSBzbWFsbGVzdCB0byBsYXJnZXN0LiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICAgaW50IHNpemU7CkBAIC0xNTQsNiArMTYyLDEwIEBACiAgICByZXR1cm4gMTsKIH0KIAorLyoqCisgICBUZXN0IHRoZSBESCBzdWItc3lzdGVtIChjYW4gdGFrZSBhIHdoaWxlKQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLwogaW50IGRoX3Rlc3Qodm9pZCkKIHsKICAgICBtcF9pbnQgcCwgZywgdG1wOwpAQCAtMjAxLDExICsyMTMsMTYgQEAKICAgICByZXR1cm4gZXJyOwogfQogCisvKioKKyAgIEdldCB0aGUgbWluIGFuZCBtYXggREgga2V5IHNpemVzIChvY3RldHMpCisgICBAcGFyYW0gbG93ICAgIFtvdXRdIFRoZSBzbWFsbGVzdCBrZXkgc2l6ZSBzdXBwb3J0ZWQKKyAgIEBwYXJhbSBoaWdoICAgW291dF0gVGhlIGxhcmdlc3Qga2V5IHNpemUgc3VwcG9ydGVkCisqLwogdm9pZCBkaF9zaXplcyhpbnQgKmxvdywgaW50ICpoaWdoKQogewogICAgaW50IHg7Ci0gICBfQVJHQ0hLKGxvdyAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoaGlnaCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsobG93ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhoaWdoICE9IE5VTEwpOwogICAgKmxvdyAgPSBJTlRfTUFYOwogICAgKmhpZ2ggPSAwOwogICAgZm9yICh4ID0gMDsgc2V0c1t4XS5zaXplICE9IDA7IHgrKykgewpAQCAtMjE0LDkgKzIzMSwxNCBAQAogICAgfQogfQogCisvKioKKyAgUmV0dXJucyB0aGUga2V5IHNpemUgb2YgYSBnaXZlbiBESCBrZXkgKG9jdGV0cykKKyAgQHBhcmFtIGtleSAgIFRoZSBESCBrZXkgdG8gZ2V0IHRoZSBzaXplIG9mCisgIEByZXR1cm4gVGhlIHNpemUgaWYgdmFsaWQgb3IgSU5UX01BWCBpZiBub3QKKyovCiBpbnQgZGhfZ2V0X3NpemUoZGhfa2V5ICprZXkpCiB7Ci0gICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CiAgICAgaWYgKGlzX3ZhbGlkX2lkeChrZXktPmlkeCkgPT0gMSkgewogICAgICAgICByZXR1cm4gc2V0c1trZXktPmlkeF0uc2l6ZTsKICAgICB9IGVsc2UgewpAQCAtMjI0LDE0ICsyNDYsMjIgQEAKICAgICB9CiB9CiAKKy8qKgorICBNYWtlIGEgREgga2V5IFtwcml2YXRlIGtleSBwYWlyXQorICBAcGFyYW0gcHJuZyAgICAgQW4gYWN0aXZlIFBSTkcgc3RhdGUKKyAgQHBhcmFtIHdwcm5nICAgIFRoZSBpbmRleCBmb3IgdGhlIFBSTkcgeW91IGRlc2lyZSB0byB1c2UKKyAgQHBhcmFtIGtleXNpemUgIFRoZSBrZXkgc2l6ZSAob2N0ZXRzKSBkZXNpcmVkCisgIEBwYXJhbSBrZXkgICAgICBbb3V0XSBXaGVyZSB0aGUgbmV3bHkgY3JlYXRlZCBESCBrZXkgd2lsbCBiZSBzdG9yZWQKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBub3RlOiBvbiBlcnJvciBhbGwgYWxsb2NhdGVkIG1lbW9yeSB3aWxsIGJlIGZyZWVkIGF1dG9tYXRpY2FsbHkuCisqLwogaW50IGRoX21ha2Vfa2V5KHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgaW50IGtleXNpemUsIGRoX2tleSAqa2V5KQogewotICAgdW5zaWduZWQgY2hhciBidWZbNTEyXTsKKyAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKICAgIHVuc2lnbmVkIGxvbmcgeDsKICAgIG1wX2ludCBwLCBnOwogICAgaW50IGVycjsKIAotICAgX0FSR0NISyhrZXkgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICE9IE5VTEwpOwogCiAgICAvKiBnb29kIHBybmc/ICovCiAgICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQod3BybmcpKSAhPSBDUllQVF9PSykgewpAQCAtMjUxLDE0ICsyODEsMjEgQEAKICAgIH0KICAgIGtleS0+aWR4ID0geDsKIAorICAgLyogYWxsb2NhdGUgYnVmZmVyICovCisgICBidWYgPSBYTUFMTE9DKGtleXNpemUpOworICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCiAgICAvKiBtYWtlIHVwIHJhbmRvbSBzdHJpbmcgKi8KICAgIGlmIChwcm5nX2Rlc2NyaXB0b3Jbd3BybmddLnJlYWQoYnVmLCBrZXlzaXplLCBwcm5nKSAhPSAodW5zaWduZWQgbG9uZylrZXlzaXplKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfRVJST1JfUkVBRFBSTkc7CisgICAgICBlcnIgPSBDUllQVF9FUlJPUl9SRUFEUFJORzsgCisgICAgICBnb3RvIGVycm9yMjsKICAgIH0KIAogICAgLyogaW5pdCBwYXJhbWV0ZXJzICovCiAgICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJmcsICZwLCAma2V5LT54LCAma2V5LT55LCBOVUxMKSkgIT0gTVBfT0tBWSkgewotICAgICAgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsKKyAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAgICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJmcsIHNldHNba2V5LT5pZHhdLmJhc2UsIDY0KSkgIT0gTVBfT0tBWSkgICAgICB7IGdvdG8gZXJyb3I7IH0KICAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmcCwgc2V0c1trZXktPmlkeF0ucHJpbWUsIDY0KSkgIT0gTVBfT0tBWSkgICAgIHsgZ290byBlcnJvcjsgfQpAQCAtMjc2LDI3ICszMTMsNDMgQEAKICAgIGdvdG8gZG9uZTsKIGVycm9yOgogICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworZXJyb3IyOgogICAgbXBfY2xlYXJfbXVsdGkoJmtleS0+eCwgJmtleS0+eSwgTlVMTCk7CiBkb25lOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShidWYsIGtleXNpemUpOworI2VuZGlmCiAgICBtcF9jbGVhcl9tdWx0aSgmcCwgJmcsIE5VTEwpOwotICAgemVyb21lbShidWYsIHNpemVvZihidWYpKTsKKyAgIFhGUkVFKGJ1Zik7CiAgICByZXR1cm4gZXJyOwogfQogCisvKioKKyAgRnJlZSB0aGUgYWxsb2NhdGVkIHJhbSBmb3IgYSBESCBrZXkKKyAgQHBhcmFtIGtleSAgIFRoZSBrZXkgd2hpY2ggeW91IHdpc2ggdG8gZnJlZQorKi8gCiB2b2lkIGRoX2ZyZWUoZGhfa2V5ICprZXkpCiB7Ci0gICBfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICE9IE5VTEwpOwogICAgbXBfY2xlYXJfbXVsdGkoJmtleS0+eCwgJmtleS0+eSwgTlVMTCk7CiB9CiAKKy8qKgorICBFeHBvcnQgYSBESCBrZXkgdG8gYSBiaW5hcnkgcGFja2V0CisgIEBwYXJhbSBvdXQgICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIGZvciB0aGUga2V5CisgIEBwYXJhbSBvdXRsZW4gW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgREgga2V5CisgIEBwYXJhbSB0eXBlICAgV2hpY2ggdHlwZSBvZiBrZXkgKFBLX1BSSVZBVEUgb3IgUEtfUFVCTElDKQorICBAcGFyYW0ga2V5ICAgIFRoZSBrZXkgeW91IHdpc2ggdG8gZXhwb3J0CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIGludCBkaF9leHBvcnQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIGludCB0eXBlLCBkaF9rZXkgKmtleSkKIHsKICAgIHVuc2lnbmVkIGxvbmcgeSwgejsKICAgIGludCBlcnI7CiAKLSAgIF9BUkdDSEsob3V0ICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKIAogICAgLyogY2FuIHdlIHN0b3JlIHRoZSBzdGF0aWMgaGVhZGVyPyAgKi8KICAgIGlmICgqb3V0bGVuIDwgKFBBQ0tFVF9TSVpFICsgMikpIHsKQEAgLTMzMCwxMyArMzgzLDIwIEBACiAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKKy8qKgorICBJbXBvcnQgYSBESCBrZXkgZnJvbSBhIGJpbmFyeSBwYWNrZXQKKyAgQHBhcmFtIGluICAgICBUaGUgcGFja2V0IHRvIHJlYWQKKyAgQHBhcmFtIGlubGVuICBUaGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBwYWNrZXQKKyAgQHBhcmFtIGtleSAgICBbb3V0XSBXaGVyZSB0byBpbXBvcnQgdGhlIGtleSB0bworICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIG9uIGVycm9yIGFsbCBhbGxvY2F0ZWQgbWVtb3J5IGlzIGZyZWVkIGF1dG9tYXRpY2FsbHkKKyovCiBpbnQgZGhfaW1wb3J0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBkaF9rZXkgKmtleSkKIHsKICAgIHVuc2lnbmVkIGxvbmcgeCwgeSwgczsKICAgIGludCBlcnI7CiAKLSAgIF9BUkdDSEsoaW4gICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGluICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICE9IE5VTEwpOwogCiAgICAvKiBtYWtlIHN1cmUgdmFsaWQgbGVuZ3RoICovCiAgICBpZiAoKDIrUEFDS0VUX1NJWkUpID4gaW5sZW4pIHsKQEAgLTM5OSw2ICs0NTksMTQgQEAKICAgIHJldHVybiBlcnI7CiB9CiAKKy8qKgorICAgQ3JlYXRlIGEgREggc2hhcmVkIHNlY3JldC4KKyAgIEBwYXJhbSBwcml2YXRlX2tleSAgICAgVGhlIHByaXZhdGUgREgga2V5IGluIHRoZSBwYWlyCisgICBAcGFyYW0gcHVibGljX2tleSAgICAgIFRoZSBwdWJsaWMgREgga2V5IGluIHRoZSBwYWlyIAorICAgQHBhcmFtIG91dCAgICAgICAgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIHNoYXJlZCBkYXRhCisgICBAcGFyYW0gb3V0bGVuICAgICAgICAgIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIHNoYXJlZCBkYXRhLgorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLwogaW50IGRoX3NoYXJlZF9zZWNyZXQoZGhfa2V5ICpwcml2YXRlX2tleSwgZGhfa2V5ICpwdWJsaWNfa2V5LAogICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCiB7CkBAIC00MDYsMTAgKzQ3NCwxMCBAQAogICAgdW5zaWduZWQgbG9uZyB4OwogICAgaW50IGVycjsKIAotICAgX0FSR0NISyhwcml2YXRlX2tleSAhPSBOVUxMKTsKLSAgIF9BUkdDSEsocHVibGljX2tleSAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dCAgICAgICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXRsZW4gICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHJpdmF0ZV9rZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHB1YmxpY19rZXkgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAgICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICAgICAgIT0gTlVMTCk7CiAKICAgIC8qIHR5cGVzIHZhbGlkPyAqLwogICAgaWYgKHByaXZhdGVfa2V5LT50eXBlICE9IFBLX1BSSVZBVEUpIHsKQEAgLTQ1MCwzICs1MTgsNyBAQAogCiAjZW5kaWYKIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvZGgvZGguYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL2RoX3N5cy5jIGIvc3JjL3BrL2RoL2RoX3N5cy5jCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGRoX3N5cy5jCnJlbmFtZSB0byBzcmMvcGsvZGgvZGhfc3lzLmMKaW5kZXggZmIwNWFhMy4uNGYxMDU1NiAxMDA2NDQKLS0tIGEvZGhfc3lzLmMKKysrIGIvc3JjL3BrL2RoL2RoX3N5cy5jCkBAIC02LDIyICs2LDQwIEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLWludCBkaF9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbmtleSwgdW5zaWduZWQgbG9uZyBrZXlsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgdW5zaWduZWQgbG9uZyAqbGVuLAorCisvKioKKyAgQGZpbGUgZGhfc3lzLmMKKyAgREggQ3J5cHRvLCBUb20gU3QgRGVuaXMKKyovCisgIAorLyoqCisgIEVuY3J5cHQgYSBzaG9ydCBzeW1tZXRyaWMga2V5IHdpdGggYSBwdWJsaWMgREgga2V5CisgIEBwYXJhbSBpbiAgICAgICAgVGhlIHN5bW1ldHJpYyBrZXkgdG8gZW5jcnlwdAorICBAcGFyYW0gaW5sZW4gICAgIFRoZSBsZW5ndGggb2YgdGhlIGtleSAob2N0ZXRzKQorICBAcGFyYW0gb3V0ICAgICAgIFtvdXRdIFRoZSBjaXBoZXJ0ZXh0CisgIEBwYXJhbSBvdXRsZW4gICAgW2luL291dF0gIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIGNpcGhlcnRleHQKKyAgQHBhcmFtIHBybmcgICAgICBBbiBhY3RpdmUgUFJORyBzdGF0ZQorICBAcGFyYW0gd3BybmcgICAgIFRoZSBpbmRleCBvZiB0aGUgUFJORyBkZXNpcmVkCisgIEBwYXJhbSBoYXNoICAgICAgVGhlIGluZGV4IG9mIHRoZSBoYXNoIGRlc2lyZWQgKG11c3QgcHJvZHVjZSBhIGRpZ2VzdCBvZiBzaXplID49IHRoZSBzaXplIG9mIHRoZSBwbGFpbnRleHQpCisgIEBwYXJhbSBrZXkgICAgICAgVGhlIHB1YmxpYyBrZXkgeW91IHdpc2ggdG8gZW5jcnlwdCB3aXRoLgorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZGhfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICAgdW5zaWduZWQgbG9uZyBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpvdXRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBpbnQgaGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkaF9rZXkgKmtleSkKIHsKLSAgICB1bnNpZ25lZCBjaGFyIHB1Yl9leHB0Wzc2OF0sIGRoX3NoYXJlZFs3NjhdLCBza2V5W01BWEJMT0NLU0laRV07Ci0gICAgZGhfa2V5IHB1YmtleTsKKyAgICB1bnNpZ25lZCBjaGFyICpwdWJfZXhwdCwgKmRoX3NoYXJlZCwgKnNrZXk7CisgICAgZGhfa2V5ICAgICAgICBwdWJrZXk7CiAgICAgdW5zaWduZWQgbG9uZyB4LCB5LCB6LCBoYXNoc2l6ZSwgcHVia2V5c2l6ZTsKLSAgICBpbnQgZXJyOworICAgIGludCAgICAgICAgICAgZXJyOwogCi0gICAgX0FSR0NISyhpbmtleSAhPSBOVUxMKTsKLSAgICBfQVJHQ0hLKG91dCAgICE9IE5VTEwpOwotICAgIF9BUkdDSEsobGVuICAgIT0gTlVMTCk7Ci0gICAgX0FSR0NISyhrZXkgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKGluICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0ICAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhvdXRsZW4gICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKGtleSAgICE9IE5VTEwpOwogCiAgICAgLyogY2hlY2sgdGhhdCB3cHJuZy9oYXNoIGFyZSBub3QgaW52YWxpZCAqLwogICAgIGlmICgoZXJyID0gcHJuZ19pc192YWxpZCh3cHJuZykpICE9IENSWVBUX09LKSB7CkBAIC0zMiw0MCArNTAsNTggQEAKICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGlmIChrZXlsZW4gPiBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uaGFzaHNpemUpICB7CisgICAgaWYgKGlubGVuID4gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplKSAgewogICAgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9IQVNIOwogICAgIH0KIAorICAgIC8qIGFsbG9jYXRlIG1lbW9yeSAqLworICAgIHB1Yl9leHB0ICA9IFhNQUxMT0MoREhfQlVGX1NJWkUpOworICAgIGRoX3NoYXJlZCA9IFhNQUxMT0MoREhfQlVGX1NJWkUpOworICAgIHNrZXkgICAgICA9IFhNQUxMT0MoTUFYQkxPQ0tTSVpFKTsKKyAgICBpZiAocHViX2V4cHQgPT0gTlVMTCB8fCBkaF9zaGFyZWQgPT0gTlVMTCB8fCBza2V5ID09IE5VTEwpIHsKKyAgICAgICBpZiAocHViX2V4cHQgIT0gTlVMTCkgeworICAgICAgICAgIFhGUkVFKHB1Yl9leHB0KTsKKyAgICAgICB9CisgICAgICAgaWYgKGRoX3NoYXJlZCAhPSBOVUxMKSB7CisgICAgICAgICAgWEZSRUUoZGhfc2hhcmVkKTsKKyAgICAgICB9CisgICAgICAgaWYgKHNrZXkgIT0gTlVMTCkgeworICAgICAgICAgIFhGUkVFKHNrZXkpOworICAgICAgIH0KKyAgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgIH0KKwogICAgIC8qIG1ha2UgYSByYW5kb20ga2V5IGFuZCBleHBvcnQgdGhlIHB1YmxpYyBjb3B5ICovCiAgICAgaWYgKChlcnIgPSBkaF9tYWtlX2tleShwcm5nLCB3cHJuZywgZGhfZ2V0X3NpemUoa2V5KSwgJnB1YmtleSkpICE9IENSWVBUX09LKSB7Ci0gICAgICAgcmV0dXJuIGVycjsKKyAgICAgICBnb3RvIExCTF9FUlI7CiAgICAgfQogCi0gICAgcHVia2V5c2l6ZSA9IHNpemVvZihwdWJfZXhwdCk7CisgICAgcHVia2V5c2l6ZSA9IERIX0JVRl9TSVpFOwogICAgIGlmICgoZXJyID0gZGhfZXhwb3J0KHB1Yl9leHB0LCAmcHVia2V5c2l6ZSwgUEtfUFVCTElDLCAmcHVia2V5KSkgIT0gQ1JZUFRfT0spIHsKICAgICAgICBkaF9mcmVlKCZwdWJrZXkpOwotICAgICAgIHJldHVybiBlcnI7CisgICAgICAgZ290byBMQkxfRVJSOwogICAgIH0KIAogICAgIC8qIG5vdyBjaGVjayBpZiB0aGUgb3V0IGJ1ZmZlciBpcyBiaWcgZW5vdWdoICovCi0gICAgaWYgKCpsZW4gPCAoMSArIDQgKyA0ICsgUEFDS0VUX1NJWkUgKyBwdWJrZXlzaXplICsga2V5bGVuKSkgeworICAgIGlmICgqb3V0bGVuIDwgKDEgKyA0ICsgNCArIFBBQ0tFVF9TSVpFICsgcHVia2V5c2l6ZSArIGlubGVuKSkgewogICAgICAgIGRoX2ZyZWUoJnB1YmtleSk7Ci0gICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgICBlcnIgPSBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7CisgICAgICAgZ290byBMQkxfRVJSOwogICAgIH0KIAogICAgIC8qIG1ha2UgcmFuZG9tIGtleSAqLwogICAgIGhhc2hzaXplICA9IGhhc2hfZGVzY3JpcHRvcltoYXNoXS5oYXNoc2l6ZTsKIAotICAgIHggPSAodW5zaWduZWQgbG9uZylzaXplb2YoZGhfc2hhcmVkKTsKKyAgICB4ID0gREhfQlVGX1NJWkU7CiAgICAgaWYgKChlcnIgPSBkaF9zaGFyZWRfc2VjcmV0KCZwdWJrZXksIGtleSwgZGhfc2hhcmVkLCAmeCkpICE9IENSWVBUX09LKSB7CiAgICAgICAgZGhfZnJlZSgmcHVia2V5KTsKLSAgICAgICByZXR1cm4gZXJyOworICAgICAgIGdvdG8gTEJMX0VSUjsKICAgICB9CiAgICAgZGhfZnJlZSgmcHVia2V5KTsKIAotICAgIHogPSBzaXplb2Yoc2tleSk7CisgICAgeiA9IE1BWEJMT0NLU0laRTsKICAgICBpZiAoKGVyciA9IGhhc2hfbWVtb3J5KGhhc2gsIGRoX3NoYXJlZCwgeCwgc2tleSwgJnopKSAhPSBDUllQVF9PSykgewotICAgICAgIHJldHVybiBlcnI7CisgICAgICAgZ290byBMQkxfRVJSOwogICAgIH0KIAogICAgIC8qIHN0b3JlIGhlYWRlciAqLwpAQCAtODUsNjAgKzEyMSw4OSBAQAogICAgIH0KIAogICAgIC8qIFN0b3JlIHRoZSBlbmNyeXB0ZWQga2V5ICovCi0gICAgU1RPUkUzMkwoa2V5bGVuLCBvdXQreSk7CisgICAgU1RPUkUzMkwoaW5sZW4sIG91dCt5KTsKICAgICB5ICs9IDQ7CiAKLSAgICBmb3IgKHggPSAwOyB4IDwga2V5bGVuOyB4KyssIHkrKykgewotICAgICAgb3V0W3ldID0gc2tleVt4XSBeIGlua2V5W3hdOworICAgIGZvciAoeCA9IDA7IHggPCBpbmxlbjsgeCsrLCB5KyspIHsKKyAgICAgIG91dFt5XSA9IHNrZXlbeF0gXiBpblt4XTsKICAgICB9Ci0gICAgKmxlbiA9IHk7CisgICAgKm91dGxlbiA9IHk7CiAKLSNpZmRlZiBDTEVBTl9TVEFDSworICAgIGVyciA9IENSWVBUX09LOworTEJMX0VSUjoKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKICAgICAvKiBjbGVhbiB1cCAqLwotICAgIHplcm9tZW0ocHViX2V4cHQsIHNpemVvZihwdWJfZXhwdCkpOwotICAgIHplcm9tZW0oZGhfc2hhcmVkLCBzaXplb2YoZGhfc2hhcmVkKSk7Ci0gICAgemVyb21lbShza2V5LCBzaXplb2Yoc2tleSkpOworICAgIHplcm9tZW0ocHViX2V4cHQsICBESF9CVUZfU0laRSk7CisgICAgemVyb21lbShkaF9zaGFyZWQsIERIX0JVRl9TSVpFKTsKKyAgICB6ZXJvbWVtKHNrZXksICAgICAgTUFYQkxPQ0tTSVpFKTsKICNlbmRpZgorICAgIFhGUkVFKHNrZXkpOworICAgIFhGUkVFKGRoX3NoYXJlZCk7CisgICAgWEZSRUUocHViX2V4cHQpOwogCi0gICAgcmV0dXJuIENSWVBUX09LOworICAgIHJldHVybiBlcnI7CiB9CiAKKy8qKgorICAgRGVjcnlwdCBhIERIIGVuY3J5cHRlZCBzeW1tZXRyaWMga2V5CisgICBAcGFyYW0gaW4gICAgICAgVGhlIERIIGVuY3J5cHRlZCBwYWNrZXQKKyAgIEBwYXJhbSBpbmxlbiAgICBUaGUgbGVuZ3RoIG9mIHRoZSBESCBlbmNyeXB0ZWQgcGFja2V0CisgICBAcGFyYW0gb3V0ICAgICAgVGhlIHBsYWludGV4dAorICAgQHBhcmFtIG91dGxlbiAgIFtpbi9vdXRdICBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBwbGFpbnRleHQKKyAgIEBwYXJhbSBrZXkgICAgICBUaGUgcHJpdmF0ZSBESCBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgcHVibGljIGtleSB0aGF0IGVuY3J5cHRlZCB0aGUgcGxhaW50ZXh0CisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCiBpbnQgZGhfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0a2V5LCB1bnNpZ25lZCBsb25nICprZXlsZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkaF9rZXkgKmtleSkKIHsKLSAgIHVuc2lnbmVkIGNoYXIgc2hhcmVkX3NlY3JldFs3NjhdLCBza2V5W01BWEJMT0NLU0laRV07Ci0gICB1bnNpZ25lZCBsb25nIHgsIHksIHosaGFzaHNpemUsIGtleXNpemU7Ci0gICBpbnQgIGhhc2gsIGVycjsKLSAgIGRoX2tleSBwdWJrZXk7CisgICB1bnNpZ25lZCBjaGFyICpzaGFyZWRfc2VjcmV0LCAqc2tleTsKKyAgIHVuc2lnbmVkIGxvbmcgIHgsIHksIHosIGhhc2hzaXplLCBrZXlzaXplOworICAgaW50ICAgICAgICAgICAgaGFzaCwgZXJyOworICAgZGhfa2V5ICAgICAgICAgcHVia2V5OwogCi0gICBfQVJHQ0hLKGluICAgICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsob3V0a2V5ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXlsZW4gIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGtleSAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoaW4gICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAgICE9IE5VTEwpOwogCiAgICAvKiByaWdodCBrZXkgdHlwZT8gKi8KICAgIGlmIChrZXktPnR5cGUgIT0gUEtfUFJJVkFURSkgewogICAgICAgcmV0dXJuIENSWVBUX1BLX05PVF9QUklWQVRFOwogICAgfQogCisgICAvKiBhbGxvY2F0ZSByYW0gKi8KKyAgIHNoYXJlZF9zZWNyZXQgPSBYTUFMTE9DKERIX0JVRl9TSVpFKTsKKyAgIHNrZXkgICAgICAgICAgPSBYTUFMTE9DKE1BWEJMT0NLU0laRSk7CisgICBpZiAoc2hhcmVkX3NlY3JldCA9PSBOVUxMIHx8IHNrZXkgPT0gTlVMTCkgeworICAgICAgaWYgKHNoYXJlZF9zZWNyZXQgIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUoc2hhcmVkX3NlY3JldCk7CisgICAgICB9CisgICAgICBpZiAoc2tleSAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShza2V5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKICAgIC8qIGNoZWNrIGlmIGluaXRpYWwgaGVhZGVyIHNob3VsZCBmaXQgKi8KICAgIGlmIChpbmxlbiA8IFBBQ0tFVF9TSVpFKzErNCs0KSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICAgICBlcnIgPSAgQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICAgICBnb3RvIExCTF9FUlI7CiAgICB9IGVsc2UgewogICAgICAgaW5sZW4gLT0gUEFDS0VUX1NJWkUrMSs0KzQ7CiAgICB9CiAKICAgIC8qIGlzIGhlYWRlciBjb3JyZWN0PyAqLwogICAgaWYgKChlcnIgPSBwYWNrZXRfdmFsaWRfaGVhZGVyKCh1bnNpZ25lZCBjaGFyICopaW4sIFBBQ0tFVF9TRUNUX0RILCBQQUNLRVRfU1VCX0VOQ19LRVkpKSAhPSBDUllQVF9PSykgIHsKLSAgICAgIHJldHVybiBlcnI7CisgICAgICBnb3RvIExCTF9FUlI7CiAgICB9CiAKICAgIC8qIG5vdyBsZXRzIGdldCB0aGUgaGFzaCBuYW1lICovCiAgICB5ID0gUEFDS0VUX1NJWkU7CiAgICBoYXNoID0gZmluZF9oYXNoX2lkKGluW3krK10pOwogICAgaWYgKGhhc2ggPT0gLTEpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0hBU0g7CisgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX0hBU0g7CisgICAgICBnb3RvIExCTF9FUlI7CiAgICB9CiAKICAgIC8qIGNvbW1vbiB2YWx1ZXMgKi8KQEAgLTE0OSw1OCArMjE0LDY0IEBACiAgICAKICAgIC8qIG5vdyBjaGVjayBpZiB0aGUgaW1wb3J0ZWQga2V5IHdpbGwgZml0ICovCiAgICBpZiAoaW5sZW4gPCB4KSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgIGdvdG8gTEJMX0VSUjsKICAgIH0gZWxzZSB7CiAgICAgICBpbmxlbiAtPSB4OwogICAgfQogICAgCiAgICB5ICs9IDQ7CiAgICBpZiAoKGVyciA9IGRoX2ltcG9ydChpbit5LCB4LCAmcHVia2V5KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7CisgICAgICBnb3RvIExCTF9FUlI7CiAgICB9CiAgICB5ICs9IHg7CiAKICAgIC8qIG1ha2Ugc2hhcmVkIGtleSAqLwotICAgeCA9ICh1bnNpZ25lZCBsb25nKXNpemVvZihzaGFyZWRfc2VjcmV0KTsKKyAgIHggPSBESF9CVUZfU0laRTsKICAgIGlmICgoZXJyID0gZGhfc2hhcmVkX3NlY3JldChrZXksICZwdWJrZXksIHNoYXJlZF9zZWNyZXQsICZ4KSkgIT0gQ1JZUFRfT0spIHsKICAgICAgIGRoX2ZyZWUoJnB1YmtleSk7Ci0gICAgICByZXR1cm4gZXJyOworICAgICAgZ290byBMQkxfRVJSOwogICAgfQogICAgZGhfZnJlZSgmcHVia2V5KTsKIAotICAgeiA9IHNpemVvZihza2V5KTsKKyAgIHogPSBNQVhCTE9DS1NJWkU7CiAgICBpZiAoKGVyciA9IGhhc2hfbWVtb3J5KGhhc2gsIHNoYXJlZF9zZWNyZXQsIHgsIHNrZXksICZ6KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7CisgICAgICBnb3RvIExCTF9FUlI7CiAgICB9CiAKICAgIC8qIGxvYWQgaW4gdGhlIGVuY3J5cHRlZCBrZXkgKi8KICAgIExPQUQzMkwoa2V5c2l6ZSwgaW4reSk7CiAgICAKLSAgIC8qIHdpbGwgdGhlIG91dGtleSBmaXQgYXMgcGFydCBvZiB0aGUgaW5wdXQgKi8KKyAgIC8qIHdpbGwgdGhlIG91dCBmaXQgYXMgcGFydCBvZiB0aGUgaW5wdXQgKi8KICAgIGlmIChpbmxlbiA8IGtleXNpemUpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgIGVyciA9IENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgICAgZ290byBMQkxfRVJSOwogICAgfSBlbHNlIHsKICAgICAgIGlubGVuIC09IGtleXNpemU7CiAgICB9CiAgICAKLSAgIGlmIChrZXlzaXplID4gKmtleWxlbikgeworICAgaWYgKGtleXNpemUgPiAqb3V0bGVuKSB7CiAgICAgICAgZXJyID0gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICBnb3RvIExCTF9FUlI7CiAgICB9CiAgICB5ICs9IDQ7CiAKLSAgICprZXlsZW4gPSBrZXlzaXplOworICAgKm91dGxlbiA9IGtleXNpemU7CiAKICAgIGZvciAoeCA9IDA7IHggPCBrZXlzaXplOyB4KyssIHkrKykgewotICAgICAgb3V0a2V5W3hdID0gc2tleVt4XSBeIGluW3ldOworICAgICAgb3V0W3hdID0gc2tleVt4XSBeIGluW3ldOwogICAgfQogCiAgICBlcnIgPSBDUllQVF9PSzsKLWRvbmU6Ci0jaWZkZWYgQ0xFQU5fU1RBQ0sKLSAgIHplcm9tZW0oc2hhcmVkX3NlY3JldCwgc2l6ZW9mKHNoYXJlZF9zZWNyZXQpKTsKLSAgIHplcm9tZW0oc2tleSwgc2l6ZW9mKHNrZXkpKTsKK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKHNoYXJlZF9zZWNyZXQsIERIX0JVRl9TSVpFKTsKKyAgIHplcm9tZW0oc2tleSwgICAgICAgICAgTUFYQkxPQ0tTSVpFKTsKICNlbmRpZgorCisgICBYRlJFRShza2V5KTsKKyAgIFhGUkVFKHNoYXJlZF9zZWNyZXQpOworCiAgICByZXR1cm4gZXJyOwogfQogCkBAIC0yMjIsMTkgKzI5MywzMSBAQAogIDIuICBDb21wYXJlIGFnYWluc3QgZ15NIG1vZCBwIFtiYXNlZCBvbiBpbnB1dCBoYXNoXS4KICAzLiAgSWYgcmVzdWx0IG9mICMyID09IHJlc3VsdCBvZiAjMSB0aGVuIHNpZ25hdHVyZSB2YWxpZCAKICovCisKKy8qKgorICBTaWduIGEgbWVzc2FnZSBkaWdlc3QgdXNpbmcgYSBESCBwcml2YXRlIGtleSAKKyAgQHBhcmFtIGluICAgICAgVGhlIGRhdGEgdG8gc2lnbgorICBAcGFyYW0gaW5sZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCAob2N0ZXRzKQorICBAcGFyYW0gb3V0ICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gb2YgdGhlIHNpZ25hdHVyZQorICBAcGFyYW0gb3V0bGVuICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBvdXRwdXQKKyAgQHBhcmFtIHBybmcgICAgQW4gYWN0aXZlIFBSTkcgc3RhdGUKKyAgQHBhcmFtIHdwcm5nICAgVGhlIGluZGV4IG9mIHRoZSBQUk5HIGRlc2lyZWQKKyAgQHBhcmFtIGtleSAgICAgQSBwcml2YXRlIERIIGtleQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCiBpbnQgZGhfc2lnbl9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgdW5zaWduZWQgbG9uZyBpbmxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgZGhfa2V5ICprZXkpCiB7Ci0gICBtcF9pbnQgYSwgYiwgaywgbSwgZywgcCwgcDEsIHRtcDsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzUyMF07Ci0gICB1bnNpZ25lZCBsb25nIHgsIHk7Ci0gICBpbnQgZXJyOworICAgbXBfaW50ICAgICAgICAgYSwgYiwgaywgbSwgZywgcCwgcDEsIHRtcDsKKyAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKyAgIHVuc2lnbmVkIGxvbmcgIHgsIHk7CisgICBpbnQgICAgICAgICAgICBlcnI7CiAKLSAgIF9BUkdDSEsoaW4gICAgICE9IE5VTEwpOwotICAgX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoa2V5ICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7CiAKICAgIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KICAgIGlmIChrZXktPnR5cGUgIT0gUEtfUFJJVkFURSkgewpAQCAtMjUwLDI3ICszMzMsMjggQEAKICAgICAgIHJldHVybiBDUllQVF9QS19JTlZBTElEX1RZUEU7CiAgICB9CiAKKyAgIC8qIGFsbG9jYXRlIHJhbSBmb3IgYnVmICovCisgICBidWYgPSBYTUFMTE9DKDUyMCk7CisKICAgIC8qIG1ha2UgdXAgYSByYW5kb20gdmFsdWUgaywKICAgICAqIHNpbmNlIHRoZSBvcmRlciBvZiB0aGUgZ3JvdXAgaXMgcHJpbWUKICAgICAqIHdlIG5lZWQgbm90IGNoZWNrIGlmIGdjZChrLCByKSBpcyAxIAogICAgICovCiAgICBpZiAocHJuZ19kZXNjcmlwdG9yW3dwcm5nXS5yZWFkKGJ1Ziwgc2V0c1trZXktPmlkeF0uc2l6ZSwgcHJuZykgIT0gCiAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHNldHNba2V5LT5pZHhdLnNpemUpKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfRVJST1JfUkVBRFBSTkc7CisgICAgICBlcnIgPSBDUllQVF9FUlJPUl9SRUFEUFJORzsKKyAgICAgIGdvdG8gTEJMX0VSUjsKICAgIH0KIAogICAgLyogaW5pdCBiaWdudW1zICovCiAgICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJmEsICZiLCAmaywgJm0sICZwLCAmZywgJnAxLCAmdG1wLCBOVUxMKSkgIT0gTVBfT0tBWSkgeyAKLSAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7CisgICAgICBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7CisgICAgICBnb3RvIExCTF9FUlI7CiAgICB9CiAKICAgIC8qIGxvYWQgayBhbmQgbSAqLwogICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbigmbSwgKHVuc2lnbmVkIGNoYXIgKilpbiwgaW5sZW4pKSAhPSBNUF9PS0FZKSAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0jaWZkZWYgRkFTVF9QSyAgIAotICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbigmaywgYnVmLCBNSU4oMzIsc2V0c1trZXktPmlkeF0uc2l6ZSkpKSAhPSBNUF9PS0FZKSAgeyBnb3RvIGVycm9yOyB9Ci0jZWxzZSAgIAogICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbigmaywgYnVmLCBzZXRzW2tleS0+aWR4XS5zaXplKSkgIT0gTVBfT0tBWSkgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0jZW5kaWYgIAogCiAgICAvKiBsb2FkIGcsIHAgYW5kIHAxICovCiAgICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJmcsIHNldHNba2V5LT5pZHhdLmJhc2UsIDY0KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KQEAgLTI5MCw3ICszNzQsNyBAQAogICAgLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCiAgICBpZiAoKHVuc2lnbmVkIGxvbmcpKFBBQ0tFVF9TSVpFICsgNCArIDQgKyBtcF91bnNpZ25lZF9iaW5fc2l6ZSgmYSkgKyBtcF91bnNpZ25lZF9iaW5fc2l6ZSgmYikpID4gKm91dGxlbikgewogICAgICAgZXJyID0gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOwotICAgICAgZ290byBkb25lOworICAgICAgZ290byBMQkxfRVJSOwogICAgfQogICAgCiAgICAvKiBzdG9yZSBoZWFkZXIgICovCkBAIC0zMTAsNyArMzk0LDcgQEAKICAgIC8qIGNoZWNrIGlmIHNpemUgdG9vIGJpZyAqLwogICAgaWYgKCpvdXRsZW4gPCB5KSB7CiAgICAgICBlcnIgPSBDUllQVF9CVUZGRVJfT1ZFUkZMT1c7Ci0gICAgICBnb3RvIGRvbmU7CisgICAgICBnb3RvIExCTF9FUlI7CiAgICB9CiAKICAgIC8qIHN0b3JlIGhlYWRlciAqLwpAQCAtMzE4LDI4ICs0MDIsNDAgQEAKICAgICpvdXRsZW4gPSB5OwogCiAgICBlcnIgPSBDUllQVF9PSzsKLSAgIGdvdG8gZG9uZTsKKyAgIGdvdG8gTEJMX0VSUjsKIGVycm9yOgogICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwotZG9uZToKK0xCTF9FUlI6CiAgICBtcF9jbGVhcl9tdWx0aSgmdG1wLCAmcDEsICZnLCAmcCwgJm0sICZrLCAmYiwgJmEsIE5VTEwpOworCisgICBYRlJFRShidWYpOworCiAgICByZXR1cm4gZXJyOwogfQogCiAKLS8qIHZlcmlmeSB0aGUgc2lnbmF0dXJlIGluIHNpZyBvZiB0aGUgZ2l2ZW4gaGFzaCAqLworLyoqCisgICBWZXJpZnkgdGhlIHNpZ25hdHVyZSBnaXZlbgorICAgQHBhcmFtIHNpZyAgICAgICAgVGhlIHNpZ25hdHVyZQorICAgQHBhcmFtIHNpZ2xlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2lnbmF0dXJlIChvY3RldHMpCisgICBAcGFyYW0gaGFzaCAgICAgICBUaGUgaGFzaCB0aGF0IHdhcyBzaWduZWQKKyAgIEBwYXJhbSBoYXNobGVuICAgIFRoZSBsZW5ndGggb2YgdGhlIGhhc2ggKG9jdGV0cykKKyAgIEBwYXJhbSBzdGF0ICAgICAgIFtvdXRdIFJlc3VsdCBvZiBzaWduYXR1cmUgY29tcGFyaXNvbiwgMT09dmFsaWQsIDA9PWludmFsaWQKKyAgIEBwYXJhbSBrZXkgICAgICAgIFRoZSBwdWJsaWMgREgga2V5IHRoYXQgc2lnbmVkIHRoZSBoYXNoCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2NzZXNzZnVsIChldmVuIGlmIHNpZ25hdHVyZSBpcyBpbnZhbGlkKQorKi8KIGludCBkaF92ZXJpZnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIHVuc2lnbmVkIGxvbmcgc2lnbGVuLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhc2gsIHVuc2lnbmVkIGxvbmcgaGFzaGxlbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzdGF0LCBkaF9rZXkgKmtleSkKIHsKLSAgIG1wX2ludCBhLCBiLCBwLCBnLCBtLCB0bXA7CisgICBtcF9pbnQgICAgICAgIGEsIGIsIHAsIGcsIG0sIHRtcDsKICAgIHVuc2lnbmVkIGxvbmcgeCwgeTsKLSAgIGludCBlcnI7CisgICBpbnQgICAgICAgICAgIGVycjsKIAotICAgX0FSR0NISyhzaWcgICE9IE5VTEwpOwotICAgX0FSR0NISyhoYXNoICE9IE5VTEwpOwotICAgX0FSR0NISyhzdGF0ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhzaWcgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhoYXNoICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhzdGF0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICE9IE5VTEwpOwogCiAgICAvKiBkZWZhdWx0IHRvIGludmFsaWQgKi8KICAgICpzdGF0ID0gMDsKQEAgLTM5NywzICs0OTMsNyBAQAogICAgcmV0dXJuIGVycjsKIH0KIAorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvZGgvZGhfc3lzLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvZHNhL2RzYV9leHBvcnQuYyBiL3NyYy9way9kc2EvZHNhX2V4cG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDkzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGsvZHNhL2RzYV9leHBvcnQuYwpAQCAtMCwwICsxLDcyIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgZHNhX2V4cG9ydC5jCisgICBEU0EgaW1wbGVtZW50YXRpb24sIGV4cG9ydCBrZXksIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIE1EU0EKKworLyoqCisgIEV4cG9ydCBhIERTQSBrZXkgdG8gYSBiaW5hcnkgcGFja2V0CisgIEBwYXJhbSBvdXQgICAgW291dF0gV2hlcmUgdG8gc3RvcmUgdGhlIHBhY2tldAorICBAcGFyYW0gb3V0bGVuIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIHBhY2tldAorICBAcGFyYW0gdHlwZSAgIFRoZSB0eXBlIG9mIGtleSB0byBleHBvcnQgKFBLX1BSSVZBVEUgb3IgUEtfUFVCTElDKQorICBAcGFyYW0ga2V5ICAgIFRoZSBrZXkgdG8gZXhwb3J0CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBkc2FfZXhwb3J0KHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBpbnQgdHlwZSwgZHNhX2tleSAqa2V5KQoreworICAgdW5zaWduZWQgY2hhciBmbGFnc1sxXTsKKworICAgTFRDX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAgICE9IE5VTEwpOworCisgICAvKiBjYW4gd2Ugc3RvcmUgdGhlIHN0YXRpYyBoZWFkZXI/ICAqLworICAgaWYgKHR5cGUgPT0gUEtfUFJJVkFURSAmJiBrZXktPnR5cGUgIT0gUEtfUFJJVkFURSkgeworICAgICAgcmV0dXJuIENSWVBUX1BLX1RZUEVfTUlTTUFUQ0g7CisgICB9CisKKyAgIGlmICh0eXBlICE9IFBLX1BVQkxJQyAmJiB0eXBlICE9IFBLX1BSSVZBVEUpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgZmxhZ3NbMF0gPSAodHlwZSAhPSBQS19QVUJMSUMpID8gMSA6IDA7CisKKyAgIGlmICh0eXBlID09IFBLX1BSSVZBVEUpIHsKKyAgICAgIHJldHVybiBkZXJfZW5jb2RlX3NlcXVlbmNlX211bHRpKG91dCwgb3V0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfQklUX1NUUklORywgICAxVUwsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAxVUwsICZrZXktPmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAgICAgIDFVTCwgJmtleS0+cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsICAgICAgMVVMLCAma2V5LT5xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAxVUwsICZrZXktPnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAgICAgIDFVTCwgJmtleS0+eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0VPTCwgICAgICAgICAgMFVMLCBOVUxMKTsKKyAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZGVyX2VuY29kZV9zZXF1ZW5jZV9tdWx0aShvdXQsIG91dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0JJVF9TVFJJTkcsICAgMVVMLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsICAgICAgMVVMLCAma2V5LT5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAxVUwsICZrZXktPnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAgICAgIDFVTCwgJmtleS0+cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsICAgICAgMVVMLCAma2V5LT55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfRU9MLCAgICAgICAgICAwVUwsIE5VTEwpOworICAgfQorfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvZHNhL2RzYV9leHBvcnQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS42ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzAzIDE5OjI0OjMxICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9kc2EvZHNhX2ZyZWUuYyBiL3NyYy9way9kc2EvZHNhX2ZyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTU3YWNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL2RzYS9kc2FfZnJlZS5jCkBAIC0wLDAgKzEsMzQgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBkc2FfZnJlZS5jCisgICBEU0EgaW1wbGVtZW50YXRpb24sIGZyZWUgYSBEU0Ega2V5LCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBNRFNBCisKKy8qKgorICAgRnJlZSBhIERTQSBrZXkKKyAgIEBwYXJhbSBrZXkgICBUaGUga2V5IHRvIGZyZWUgZnJvbSBtZW1vcnkKKyovCit2b2lkIGRzYV9mcmVlKGRzYV9rZXkgKmtleSkKK3sKKyAgIExUQ19BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgbXBfY2xlYXJfbXVsdGkoJmtleS0+ZywgJmtleS0+cSwgJmtleS0+cCwgJmtleS0+eCwgJmtleS0+eSwgTlVMTCk7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvZHNhL2RzYV9mcmVlLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvZHNhL2RzYV9pbXBvcnQuYyBiL3NyYy9way9kc2EvZHNhX2ltcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MWJhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGsvZHNhL2RzYV9pbXBvcnQuYwpAQCAtMCwwICsxLDg5IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgZHNhX2ltcG9ydC5jCisgICBEU0EgaW1wbGVtZW50YXRpb24sIGltcG9ydCBhIERTQSBrZXksIFRvbSBTdCBEZW5pcworKi8KKworI2lmZGVmIE1EU0EKKworLyoqCisgICBJbXBvcnQgYSBEU0Ega2V5IAorICAgQHBhcmFtIGluICAgICAgIFRoZSBiaW5hcnkgcGFja2V0IHRvIGltcG9ydCBmcm9tCisgICBAcGFyYW0gaW5sZW4gICAgVGhlIGxlbmd0aCBvZiB0aGUgYmluYXJ5IHBhY2tldAorICAgQHBhcmFtIGtleSAgICAgIFtvdXRdIFdoZXJlIHRvIHN0b3JlIHRoZSBpbXBvcnRlZCBrZXkKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgdXBvbiBlcnJvciB0aGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhbGwgYWxsb2NhdGVkIG1lbW9yeQorKi8KK2ludCBkc2FfaW1wb3J0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBkc2Ffa2V5ICprZXkpCit7CisgICB1bnNpZ25lZCBjaGFyIGZsYWdzWzFdOworICAgaW50ICAgICAgICAgICBlcnI7CisKKyAgIExUQ19BUkdDSEsoaW4gICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CisKKyAgIC8qIGluaXQga2V5ICovCisgICBpZiAobXBfaW5pdF9tdWx0aSgma2V5LT5wLCAma2V5LT5nLCAma2V5LT5xLCAma2V5LT54LCAma2V5LT55LCBOVUxMKSAhPSBNUF9PS0FZKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICAvKiBnZXQga2V5IHR5cGUgKi8KKyAgIGlmICgoZXJyID0gZGVyX2RlY29kZV9zZXF1ZW5jZV9tdWx0aShpbiwgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfQklUX1NUUklORywgMVVMLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9FT0wsIDBVTCwgTlVMTCkpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIGVycm9yOworICAgfQorCisgICBpZiAoZmxhZ3NbMF0gPT0gMSkgeworICAgICAgaWYgKChlcnIgPSBkZXJfZGVjb2RlX3NlcXVlbmNlX211bHRpKGluLCBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0JJVF9TVFJJTkcsICAgMVVMLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsICAgICAgMVVMLCAma2V5LT5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAxVUwsICZrZXktPnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAgICAgIDFVTCwgJmtleS0+cSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsICAgICAgMVVMLCAma2V5LT55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAxVUwsICZrZXktPngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9FT0wsICAgICAgICAgIDBVTCwgTlVMTCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgICAga2V5LT50eXBlID0gUEtfUFJJVkFURTsKKyAgIH0gZWxzZSB7CisgICAgICBpZiAoKGVyciA9IGRlcl9kZWNvZGVfc2VxdWVuY2VfbXVsdGkoaW4sIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfQklUX1NUUklORywgICAxVUwsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAxVUwsICZrZXktPmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAgICAgIDFVTCwgJmtleS0+cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsICAgICAgMVVMLCAma2V5LT5xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAxVUwsICZrZXktPnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9FT0wsICAgICAgICAgIDBVTCwgTlVMTCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICBnb3RvIGVycm9yOworICAgICAgfQorICAgICAga2V5LT50eXBlID0gUEtfUFVCTElDOworICB9CisgIGtleS0+cW9yZCA9IG1wX3Vuc2lnbmVkX2Jpbl9zaXplKCZrZXktPnEpOworCisgIGlmIChrZXktPnFvcmQgPj0gTURTQV9NQVhfR1JPVVAgfHwga2V5LT5xb3JkIDw9IDE1IHx8CisgICAgICBrZXktPnFvcmQgPj0gbXBfdW5zaWduZWRfYmluX3NpemUoJmtleS0+cCkgfHwgKG1wX3Vuc2lnbmVkX2Jpbl9zaXplKCZrZXktPnApIC0ga2V5LT5xb3JkKSA+PSBNRFNBX0RFTFRBKSB7CisgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgIGdvdG8gZXJyb3I7CisgICB9CisKKyAgcmV0dXJuIENSWVBUX09LOworZXJyb3I6IAorICAgbXBfY2xlYXJfbXVsdGkoJmtleS0+cCwgJmtleS0+ZywgJmtleS0+cSwgJmtleS0+eCwgJmtleS0+eSwgTlVMTCk7CisgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL2RzYS9kc2FfaW1wb3J0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNyAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8wOCAyMzozMToxNyAkICovCmRpZmYgLS1naXQgYS9kc2FfbWFrZV9rZXkuYyBiL3NyYy9way9kc2EvZHNhX21ha2Vfa2V5LmMKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gZHNhX21ha2Vfa2V5LmMKcmVuYW1lIHRvIHNyYy9way9kc2EvZHNhX21ha2Vfa2V5LmMKaW5kZXggNGQyYWYyNC4uMDJmNjllMCAxMDA2NDQKLS0tIGEvZHNhX21ha2Vfa2V5LmMKKysrIGIvc3JjL3BrL2RzYS9kc2FfbWFrZV9rZXkuYwpAQCAtNiwxOSArNiwzMyBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgZHNhX21ha2Vfa2V5LmMKKyAgIERTQSBpbXBsZW1lbnRhdGlvbiwgZ2VuZXJhdGUgYSBEU0Ega2V5LCBUb20gU3QgRGVuaXMKKyovCiAKICNpZmRlZiBNRFNBCiAKKy8qKgorICBDcmVhdGUgYSBEU0Ega2V5CisgIEBwYXJhbSBwcm5nICAgICAgICAgIEFuIGFjdGl2ZSBQUk5HIHN0YXRlCisgIEBwYXJhbSB3cHJuZyAgICAgICAgIFRoZSBpbmRleCBvZiB0aGUgUFJORyBkZXNpcmVkCisgIEBwYXJhbSBncm91cF9zaXplICAgIFNpemUgb2YgdGhlIG11bHRpcGxpY2F0aXZlIGdyb3VwIChvY3RldHMpCisgIEBwYXJhbSBtb2R1bHVzX3NpemUgIFNpemUgb2YgdGhlIG1vZHVsdXMgKG9jdGV0cykKKyAgQHBhcmFtIGtleSAgICAgICAgICAgW291dF0gV2hlcmUgdG8gc3RvcmUgdGhlIGNyZWF0ZWQga2V5CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgdXBvbiBlcnJvciB0aGlzIGZ1bmN0aW9uIHdpbGwgZnJlZSBhbGwgYWxsb2NhdGVkIG1lbW9yeQorKi8KIGludCBkc2FfbWFrZV9rZXkocHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBpbnQgZ3JvdXBfc2l6ZSwgaW50IG1vZHVsdXNfc2l6ZSwgZHNhX2tleSAqa2V5KQogewotICAgbXBfaW50IHRtcCwgdG1wMjsKLSAgIGludCBlcnIsIHJlczsKLSAgIHVuc2lnbmVkIGNoYXIgYnVmWzUxMl07CisgICBtcF9pbnQgICAgICAgICB0bXAsIHRtcDI7CisgICBpbnQgICAgICAgICAgICBlcnIsIHJlczsKKyAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAotICAgX0FSR0NISyhrZXkgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICE9IE5VTEwpOwogCiAgICAvKiBjaGVjayBwcm5nICovCiAgICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQod3BybmcpKSAhPSBDUllQVF9PSykgewpAQCAtMjYsNDEgKzQwLDQ4IEBACiAgICB9CiAKICAgIC8qIGNoZWNrIHNpemUgKi8KLSAgIGlmIChncm91cF9zaXplID49IDEwMjQgfHwgZ3JvdXBfc2l6ZSA8PSAxNSB8fCAKLSAgICAgICBncm91cF9zaXplID49IG1vZHVsdXNfc2l6ZSB8fCAobW9kdWx1c19zaXplIC0gZ3JvdXBfc2l6ZSkgPj0gKGludClzaXplb2YoYnVmKSkgeworICAgaWYgKGdyb3VwX3NpemUgPj0gTURTQV9NQVhfR1JPVVAgfHwgZ3JvdXBfc2l6ZSA8PSAxNSB8fCAKKyAgICAgICBncm91cF9zaXplID49IG1vZHVsdXNfc2l6ZSB8fCAobW9kdWx1c19zaXplIC0gZ3JvdXBfc2l6ZSkgPj0gTURTQV9ERUxUQSkgewogICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfQVJHOwogICAgfQogCisgICAvKiBhbGxvY2F0ZSByYW0gKi8KKyAgIGJ1ZiA9IFhNQUxMT0MoTURTQV9ERUxUQSk7CisgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKICAgIC8qIGluaXQgbXBfaW50cyAgKi8KICAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgmdG1wLCAmdG1wMiwgJmtleS0+ZywgJmtleS0+cSwgJmtleS0+cCwgJmtleS0+eCwgJmtleS0+eSwgTlVMTCkpICE9IE1QX09LQVkpIHsKLSAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7CisgICAgICBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7CisgICAgICBnb3RvIExCTF9FUlI7CiAgICB9CiAKICAgIC8qIG1ha2Ugb3VyIHByaW1lIHEgKi8KLSAgIGlmICgoZXJyID0gcmFuZF9wcmltZSgma2V5LT5xLCBncm91cF9zaXplKjgsIHBybmcsIHdwcm5nKSkgIT0gQ1JZUFRfT0spICAgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0KKyAgIGlmICgoZXJyID0gcmFuZF9wcmltZSgma2V5LT5xLCBncm91cF9zaXplKjgsIHBybmcsIHdwcm5nKSkgIT0gQ1JZUFRfT0spICAgICAgICAgICAgIHsgZ290byBMQkxfRVJSOyB9CiAKICAgIC8qIGRvdWJsZSBxICAqLwotICAgaWYgKChlcnIgPSBtcF9tdWxfMigma2V5LT5xLCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tdWxfMigma2V5LT5xLCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CiAKICAgIC8qIG5vdyBtYWtlIGEgcmFuZG9tIHN0cmluZyBhbmQgbXVsdHBseSBpdCBhZ2FpbnN0IHEgKi8KICAgIGlmIChwcm5nX2Rlc2NyaXB0b3Jbd3BybmddLnJlYWQoYnVmKzEsIG1vZHVsdXNfc2l6ZSAtIGdyb3VwX3NpemUsIHBybmcpICE9ICh1bnNpZ25lZCBsb25nKShtb2R1bHVzX3NpemUgLSBncm91cF9zaXplKSkgewogICAgICAgZXJyID0gQ1JZUFRfRVJST1JfUkVBRFBSTkc7Ci0gICAgICBnb3RvIGVycm9yMjsKKyAgICAgIGdvdG8gTEJMX0VSUjsKICAgIH0KIAogICAgLyogZm9yY2UgbWFnbml0dWRlICovCi0gICBidWZbMF0gPSAxOworICAgYnVmWzBdIHw9IDB4QzA7CiAKICAgIC8qIGZvcmNlIGV2ZW4gKi8KLSAgIGJ1Zlttb2R1bHVzX3NpemUgLSBncm91cF9zaXplXSAmPSB+MTsKKyAgIGJ1Zlttb2R1bHVzX3NpemUgLSBncm91cF9zaXplIC0gMV0gJj0gfjE7CiAKLSAgIGlmICgoZXJyID0gbXBfcmVhZF91bnNpZ25lZF9iaW4oJnRtcDIsIGJ1ZiwgbW9kdWx1c19zaXplIC0gZ3JvdXBfc2l6ZSsxKSkgIT0gTVBfT0tBWSkgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX3JlYWRfdW5zaWduZWRfYmluKCZ0bXAyLCBidWYsIG1vZHVsdXNfc2l6ZSAtIGdyb3VwX3NpemUpKSAhPSBNUF9PS0FZKSB7IGdvdG8gZXJyb3I7IH0KICAgIGlmICgoZXJyID0gbXBfbXVsKCZrZXktPnEsICZ0bXAyLCAma2V5LT5wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQogICAgaWYgKChlcnIgPSBtcF9hZGRfZCgma2V5LT5wLCAxLCAma2V5LT5wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9Ci0gICAKKwogICAgLyogbm93IGxvb3AgdW50aWwgcCBpcyBwcmltZSAqLwogICAgZm9yICg7OykgewotICAgICAgIGlmICgoZXJyID0gaXNfcHJpbWUoJmtleS0+cCwgJnJlcykpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfQorICAgICAgIGlmICgoZXJyID0gaXNfcHJpbWUoJmtleS0+cCwgJnJlcykpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIExCTF9FUlI7IH0KICAgICAgICBpZiAocmVzID09IE1QX1lFUykgYnJlYWs7CiAKICAgICAgICAvKiBhZGQgMnEgdG8gcCBhbmQgMiB0byB0bXAyICovCkBAIC04NSw3ICsxMDYsNyBAQAogICAgZG8gewogICAgICAgaWYgKHBybmdfZGVzY3JpcHRvclt3cHJuZ10ucmVhZChidWYsIGdyb3VwX3NpemUsIHBybmcpICE9ICh1bnNpZ25lZCBsb25nKWdyb3VwX3NpemUpIHsKICAgICAgICAgIGVyciA9IENSWVBUX0VSUk9SX1JFQURQUk5HOwotICAgICAgICAgZ290byBlcnJvcjI7CisgICAgICAgICBnb3RvIExCTF9FUlI7CiAgICAgICB9CiAgICAgICBpZiAoKGVyciA9IG1wX3JlYWRfdW5zaWduZWRfYmluKCZrZXktPngsIGJ1ZiwgZ3JvdXBfc2l6ZSkpICE9IE1QX09LQVkpICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KICAgIH0gd2hpbGUgKG1wX2NtcF9kKCZrZXktPngsIDEpICE9IE1QX0dUKTsKQEAgLTEwMSwxNyArMTIyLDI1IEBACiAgICBpZiAoKGVyciA9IG1wX3Nocmluaygma2V5LT54KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KICAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQogCi0gICBlcnIgPSBDUllQVF9PSzsKLQotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShidWYsIE1EU0FfREVMVEEpOwogI2VuZGlmCiAKKyAgIGVyciA9IENSWVBUX09LOwogICAgZ290byBkb25lOwotZXJyb3IgOiBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7Ci1lcnJvcjI6IG1wX2NsZWFyX211bHRpKCZrZXktPmcsICZrZXktPnEsICZrZXktPnAsICZrZXktPngsICZrZXktPnksIE5VTEwpOwotZG9uZSAgOiBtcF9jbGVhcl9tdWx0aSgmdG1wLCAmdG1wMiwgTlVMTCk7Ci0gICByZXR1cm4gZXJyOworZXJyb3I6IAorICAgIGVyciA9IG1waV90b19sdGNfZXJyb3IoZXJyKTsKK0xCTF9FUlI6IAorICAgIG1wX2NsZWFyX211bHRpKCZrZXktPmcsICZrZXktPnEsICZrZXktPnAsICZrZXktPngsICZrZXktPnksIE5VTEwpOworZG9uZTogCisgICAgbXBfY2xlYXJfbXVsdGkoJnRtcCwgJnRtcDIsIE5VTEwpOworCisgICAgWEZSRUUoYnVmKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiAjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL2RzYS9kc2FfbWFrZV9rZXkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzExIDA1OjQ1OjM1ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9kc2EvZHNhX3NpZ25faGFzaC5jIGIvc3JjL3BrL2RzYS9kc2Ffc2lnbl9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkMjlhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9kc2EvZHNhX3NpZ25faGFzaC5jCkBAIC0wLDAgKzEsMTU5IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgZHNhX3NpZ25faGFzaC5jCisgICBEU0EgaW1wbGVtZW50YXRpb24sIHNpZ24gYSBoYXNoLCBUb20gU3QgRGVuaXMKKyovCisKKyNpZmRlZiBNRFNBCisKKy8qKgorICBTaWduIGEgaGFzaCB3aXRoIERTQQorICBAcGFyYW0gaW4gICAgICAgVGhlIGhhc2ggdG8gc2lnbgorICBAcGFyYW0gaW5sZW4gICAgVGhlIGxlbmd0aCBvZiB0aGUgaGFzaCB0byBzaWduCisgIEBwYXJhbSByICAgICAgICBUaGUgInIiIGludGVnZXIgb2YgdGhlIHNpZ25hdHVyZSAoY2FsbGVyIG11c3QgaW5pdGlhbGl6ZSB3aXRoIG1wX2luaXQoKSBmaXJzdCkKKyAgQHBhcmFtIHMgICAgICAgIFRoZSAicyIgaW50ZWdlciBvZiB0aGUgc2lnbmF0dXJlIChjYWxsZXIgbXVzdCBpbml0aWFsaXplIHdpdGggbXBfaW5pdCgpIGZpcnN0KQorICBAcGFyYW0gcHJuZyAgICAgQW4gYWN0aXZlIFBSTkcgc3RhdGUKKyAgQHBhcmFtIHdwcm5nICAgIFRoZSBpbmRleCBvZiB0aGUgUFJORyBkZXNpcmVkCisgIEBwYXJhbSBrZXkgICAgICBBIHByaXZhdGUgRFNBIGtleQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZHNhX3NpZ25faGFzaF9yYXcoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcF9pbnQgKnIsICAgbXBfaW50ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgZHNhX2tleSAqa2V5KQoreworICAgbXBfaW50ICAgICAgICAgaywga2ludiwgdG1wOworICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgaW50ICAgICAgICAgICAgZXJyOworCisgICBMVENfQVJHQ0hLKGluICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsociAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhzICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKworICAgaWYgKChlcnIgPSBwcm5nX2lzX3ZhbGlkKHdwcm5nKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBpZiAoa2V5LT50eXBlICE9IFBLX1BSSVZBVEUpIHsKKyAgICAgIHJldHVybiBDUllQVF9QS19OT1RfUFJJVkFURTsKKyAgIH0KKworICAgLyogY2hlY2sgZ3JvdXAgb3JkZXIgc2l6ZSAgKi8KKyAgIGlmIChrZXktPnFvcmQgPj0gTURTQV9NQVhfR1JPVVApIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgYnVmID0gWE1BTExPQyhNRFNBX01BWF9HUk9VUCk7CisgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKKyAgIC8qIEluaXQgb3VyIHRlbXBzICovCisgICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJmssICZraW52LCAmdG1wLCBOVUxMKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworcmV0cnk6CisKKyAgIGRvIHsKKyAgICAgIC8qIGdlbiByYW5kb20gayAqLworICAgICAgaWYgKHBybmdfZGVzY3JpcHRvclt3cHJuZ10ucmVhZChidWYsIGtleS0+cW9yZCwgcHJuZykgIT0gKHVuc2lnbmVkIGxvbmcpa2V5LT5xb3JkKSB7CisgICAgICAgICBlcnIgPSBDUllQVF9FUlJPUl9SRUFEUFJORzsKKyAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgIH0KKworICAgICAgLyogcmVhZCBrICovCisgICAgICBpZiAoKGVyciA9IG1wX3JlYWRfdW5zaWduZWRfYmluKCZrLCBidWYsIGtleS0+cW9yZCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICAgICAvKiBrID4gMSA/ICovCisgICAgICBpZiAobXBfY21wX2QoJmssIDEpICE9IE1QX0dUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byByZXRyeTsgfQorCisgICAgICAvKiB0ZXN0IGdjZCAqLworICAgICAgaWYgKChlcnIgPSBtcF9nY2QoJmssICZrZXktPnEsICZ0bXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0gd2hpbGUgKG1wX2NtcF9kKCZ0bXAsIDEpICE9IE1QX0VRKTsKKworICAgLyogbm93IGZpbmQgMS9rIG1vZCBxICovCisgICBpZiAoKGVyciA9IG1wX2ludm1vZCgmaywgJmtleS0+cSwgJmtpbnYpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICAvKiBub3cgZmluZCByID0gZ15rIG1vZCBwIG1vZCBxICovCisgICBpZiAoKGVyciA9IG1wX2V4cHRtb2QoJmtleS0+ZywgJmssICZrZXktPnAsIHIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tb2QociwgJmtleS0+cSwgcikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgaWYgKG1wX2lzemVybyhyKSA9PSBNUF9ZRVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gcmV0cnk7IH0KKworICAgLyogbm93IGZpbmQgcyA9IChpbiArIHhyKS9rIG1vZCBxICovCisgICBpZiAoKGVyciA9IG1wX3JlYWRfdW5zaWduZWRfYmluKCZ0bXAsICh1bnNpZ25lZCBjaGFyICopaW4sIGlubGVuKSkgIT0gTVBfT0tBWSkgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tdWwoJmtleS0+eCwgciwgcykpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfYWRkKHMsICZ0bXAsIHMpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX211bG1vZChzLCAma2ludiwgJmtleS0+cSwgcykpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICBpZiAobXBfaXN6ZXJvKHMpID09IE1QX1lFUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byByZXRyeTsgfQorCisgICBlcnIgPSBDUllQVF9PSzsKKyAgIGdvdG8gTEJMX0VSUjsKKworZXJyb3I6IAorICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworTEJMX0VSUjogCisgICBtcF9jbGVhcl9tdWx0aSgmaywgJmtpbnYsICZ0bXAsIE5VTEwpOworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShidWYsIE1EU0FfTUFYX0dST1VQKTsKKyNlbmRpZgorICAgWEZSRUUoYnVmKTsKKyAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICBTaWduIGEgaGFzaCB3aXRoIERTQQorICBAcGFyYW0gaW4gICAgICAgVGhlIGhhc2ggdG8gc2lnbgorICBAcGFyYW0gaW5sZW4gICAgVGhlIGxlbmd0aCBvZiB0aGUgaGFzaCB0byBzaWduCisgIEBwYXJhbSBvdXQgICAgICBbb3V0XSBXaGVyZSB0byBzdG9yZSB0aGUgc2lnbmF0dXJlCisgIEBwYXJhbSBvdXRsZW4gICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBzaWduYXR1cmUKKyAgQHBhcmFtIHBybmcgICAgIEFuIGFjdGl2ZSBQUk5HIHN0YXRlCisgIEBwYXJhbSB3cHJuZyAgICBUaGUgaW5kZXggb2YgdGhlIFBSTkcgZGVzaXJlZAorICBAcGFyYW0ga2V5ICAgICAgQSBwcml2YXRlIERTQSBrZXkKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGRzYV9zaWduX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGRzYV9rZXkgKmtleSkKK3sKKyAgIG1wX2ludCAgICAgICAgciwgczsKKyAgIGludCAgICAgICAgICAgZXJyOworCisgICBMVENfQVJHQ0hLKGluICAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKGtleSAgICAgIT0gTlVMTCk7CisKKyAgIGlmIChtcF9pbml0X211bHRpKCZyLCAmcywgTlVMTCkgIT0gTVBfT0tBWSkgeworICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKworICAgaWYgKChlcnIgPSBkc2Ffc2lnbl9oYXNoX3JhdyhpbiwgaW5sZW4sICZyLCAmcywgcHJuZywgd3BybmcsIGtleSkpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisKKyAgIGVyciA9IGRlcl9lbmNvZGVfc2VxdWVuY2VfbXVsdGkob3V0LCBvdXRsZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAmcywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0VPTCwgICAgIDBVTCwgTlVMTCk7CisKK0xCTF9FUlI6CisgICBtcF9jbGVhcl9tdWx0aSgmciwgJnMsIE5VTEwpOworICAgcmV0dXJuIGVycjsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9kc2EvZHNhX3NpZ25faGFzaC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjYgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMTUgMjE6NDg6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2RzYS9kc2FfdmVyaWZ5X2hhc2guYyBiL3NyYy9way9kc2EvZHNhX3ZlcmlmeV9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlNWMzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9kc2EvZHNhX3ZlcmlmeV9oYXNoLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgICBAZmlsZSBkc2FfdmVyaWZ5X2hhc2guYworICAgRFNBIGltcGxlbWVudGF0aW9uLCB2ZXJpZnkgYSBzaWduYXR1cmUsIFRvbSBTdCBEZW5pcworKi8KKworCisjaWZkZWYgTURTQQorCisvKioKKyAgVmVyaWZ5IGEgRFNBIHNpZ25hdHVyZQorICBAcGFyYW0gciAgICAgICAgRFNBICJyIiBwYXJhbWV0ZXIKKyAgQHBhcmFtIHMgICAgICAgIERTQSAicyIgcGFyYW1ldGVyCisgIEBwYXJhbSBoYXNoICAgICBUaGUgaGFzaCB0aGF0IHdhcyBzaWduZWQKKyAgQHBhcmFtIGhhc2hsZW4gIFRoZSBsZW5ndGggb2YgdGhlIGhhc2ggdGhhdCB3YXMgc2lnbmVkCisgIEBwYXJhbSBzdGF0ICAgICBbb3V0XSBUaGUgcmVzdWx0IG9mIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCAxPT12YWxpZCwgMD09aW52YWxpZAorICBAcGFyYW0ga2V5ICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgcHVibGljIERIIGtleQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwgKGV2ZW4gaWYgdGhlIHNpZ25hdHVyZSBpcyBpbnZhbGlkKQorKi8KK2ludCBkc2FfdmVyaWZ5X2hhc2hfcmF3KCAgICAgICAgIG1wX2ludCAqciwgICAgICAgICAgbXBfaW50ICpzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoYXNoLCB1bnNpZ25lZCBsb25nIGhhc2hsZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzdGF0LCAgICAgIGRzYV9rZXkgKmtleSkKK3sKKyAgIG1wX2ludCAgICAgICAgdywgdiwgdTEsIHUyOworICAgaW50ICAgICAgICAgICBlcnI7CisKKyAgIExUQ19BUkdDSEsociAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocyAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc3RhdCAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAhPSBOVUxMKTsKKworICAgLyogZGVmYXVsdCB0byBpbnZhbGlkIHNpZ25hdHVyZSAqLworICAgKnN0YXQgPSAwOworCisgICAvKiBpbml0IG91ciB2YXJpYWJsZXMgKi8KKyAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgmdywgJnYsICZ1MSwgJnUyLCBOVUxMKSkgIT0gTVBfT0tBWSkgeworICAgICAgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsKKyAgIH0KKworICAgLyogbmVpdGhlciByIG9yIHMgY2FuIGJlIG51bGwgb3IgPnEqLworICAgaWYgKG1wX2lzemVybyhyKSA9PSBNUF9ZRVMgfHwgbXBfaXN6ZXJvKHMpID09IE1QX1lFUyB8fCBtcF9jbXAociwgJmtleS0+cSkgIT0gTVBfTFQgfHwgbXBfY21wKHMsICZrZXktPnEpICE9IE1QX0xUKSB7CisgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgIGdvdG8gZG9uZTsKKyAgIH0KKyAgIAorICAgLyogdyA9IDEvcyBtb2QgcSAqLworICAgaWYgKChlcnIgPSBtcF9pbnZtb2QocywgJmtleS0+cSwgJncpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisKKyAgIC8qIHUxID0gbSAqIHcgbW9kIHEgKi8KKyAgIGlmICgoZXJyID0gbXBfcmVhZF91bnNpZ25lZF9iaW4oJnUxLCAodW5zaWduZWQgY2hhciAqKWhhc2gsIGhhc2hsZW4pKSAhPSBNUF9PS0FZKSAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfbXVsbW9kKCZ1MSwgJncsICZrZXktPnEsICZ1MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgLyogdTIgPSByKncgbW9kIHEgKi8KKyAgIGlmICgoZXJyID0gbXBfbXVsbW9kKHIsICZ3LCAma2V5LT5xLCAmdTIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAKKworICAgLyogdiA9IGdedTEgKiB5XnUyIG1vZCBwIG1vZCBxICovCisgICBpZiAoKGVyciA9IG1wX2V4cHRtb2QoJmtleS0+ZywgJnUxLCAma2V5LT5wLCAmdTEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX2V4cHRtb2QoJmtleS0+eSwgJnUyLCAma2V5LT5wLCAmdTIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX211bG1vZCgmdTEsICZ1MiwgJmtleS0+cCwgJnYpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vZCgmdiwgJmtleS0+cSwgJnYpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisKKyAgIC8qIGlmIHIgPSB2IHRoZW4gd2UncmUgc2V0ICovCisgICBpZiAobXBfY21wKHIsICZ2KSA9PSBNUF9FUSkgeworICAgICAgKnN0YXQgPSAxOworICAgfQorCisgICBlcnIgPSBDUllQVF9PSzsKKyAgIGdvdG8gZG9uZTsKKworZXJyb3IgOiBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7Citkb25lICA6IG1wX2NsZWFyX211bHRpKCZ3LCAmdiwgJnUxLCAmdTIsIE5VTEwpOworICAgcmV0dXJuIGVycjsKK30KKworLyoqCisgIFZlcmlmeSBhIERTQSBzaWduYXR1cmUKKyAgQHBhcmFtIHNpZyAgICAgIFRoZSBzaWduYXR1cmUKKyAgQHBhcmFtIHNpZ2xlbiAgIFRoZSBsZW5ndGggb2YgdGhlIHNpZ25hdHVyZSAob2N0ZXRzKQorICBAcGFyYW0gaGFzaCAgICAgVGhlIGhhc2ggdGhhdCB3YXMgc2lnbmVkCisgIEBwYXJhbSBoYXNobGVuICBUaGUgbGVuZ3RoIG9mIHRoZSBoYXNoIHRoYXQgd2FzIHNpZ25lZAorICBAcGFyYW0gc3RhdCAgICAgW291dF0gVGhlIHJlc3VsdCBvZiB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgMT09dmFsaWQsIDA9PWludmFsaWQKKyAgQHBhcmFtIGtleSAgICAgIFRoZSBjb3JyZXNwb25kaW5nIHB1YmxpYyBESCBrZXkKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsIChldmVuIGlmIHRoZSBzaWduYXR1cmUgaXMgaW52YWxpZCkKKyovCitpbnQgZHNhX3ZlcmlmeV9oYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgdW5zaWduZWQgbG9uZyBzaWdsZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhc2gsIHVuc2lnbmVkIGxvbmcgaGFzaGxlbiwgCisgICAgICAgICAgICAgICAgICAgIGludCAqc3RhdCwgZHNhX2tleSAqa2V5KQoreworICAgaW50ICAgIGVycjsKKyAgIG1wX2ludCByLCBzOworCisgICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJnIsICZzLCBOVUxMKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKKyAgIC8qIGRlY29kZSB0aGUgc2VxdWVuY2UgKi8KKyAgIGlmICgoZXJyID0gZGVyX2RlY29kZV9zZXF1ZW5jZV9tdWx0aShzaWcsIHNpZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9FT0wsICAgICAwVUwsIE5VTEwpKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICAvKiBkbyB0aGUgb3AgKi8KKyAgIGVyciA9IGRzYV92ZXJpZnlfaGFzaF9yYXcoJnIsICZzLCBoYXNoLCBoYXNobGVuLCBzdGF0LCBrZXkpOworCitMQkxfRVJSOgorICAgbXBfY2xlYXJfbXVsdGkoJnIsICZzLCBOVUxMKTsKKyAgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZgorCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9kc2EvZHNhX3ZlcmlmeV9oYXNoLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuOCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8xNSAyMTo0ODo1OSAkICovCmRpZmYgLS1naXQgYS9kc2FfdmVyaWZ5X2tleS5jIGIvc3JjL3BrL2RzYS9kc2FfdmVyaWZ5X2tleS5jCnNpbWlsYXJpdHkgaW5kZXggNzglCnJlbmFtZSBmcm9tIGRzYV92ZXJpZnlfa2V5LmMKcmVuYW1lIHRvIHNyYy9way9kc2EvZHNhX3ZlcmlmeV9rZXkuYwppbmRleCBjMTdiYWI4Li5iN2JlMTAzIDEwMDY0NAotLS0gYS9kc2FfdmVyaWZ5X2tleS5jCisrKyBiL3NyYy9way9kc2EvZHNhX3ZlcmlmeV9rZXkuYwpAQCAtNiwyMCArNiwzMiBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgZHNhX3ZlcmlmeV9rZXkuYworICAgRFNBIGltcGxlbWVudGF0aW9uLCB2ZXJpZnkgYSBrZXksIFRvbSBTdCBEZW5pcworKi8KIAogI2lmZGVmIE1EU0EKIAorLyoqCisgICBWZXJpZnkgYSBEU0Ega2V5IGZvciB2YWxpZGl0eQorICAgQHBhcmFtIGtleSAgIFRoZSBrZXkgdG8gdmVyaWZ5CisgICBAcGFyYW0gc3RhdCAgW291dF0gIFJlc3VsdCBvZiB0ZXN0LCAxPT12YWxpZCwgMD09aW52YWxpZAorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLwogaW50IGRzYV92ZXJpZnlfa2V5KGRzYV9rZXkgKmtleSwgaW50ICpzdGF0KQogewogICAgbXBfaW50IHRtcCwgdG1wMjsKLSAgIGludCByZXMsIGVycjsKKyAgIGludCAgICByZXMsIGVycjsKIAotICAgX0FSR0NISyhrZXkgICE9IE5VTEwpOwotICAgX0FSR0NISyhzdGF0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhzdGF0ICE9IE5VTEwpOwogCisgICAvKiBkZWZhdWx0IHRvIGFuIGludmFsaWQga2V5ICovCiAgICAqc3RhdCA9IDA7CiAKICAgIC8qIGZpcnN0IG1ha2Ugc3VyZSBrZXktPnEgYW5kIGtleS0+cCBhcmUgcHJpbWUgKi8KQEAgLTg0LDMgKzk2LDcgQEAKICAgIHJldHVybiBlcnI7CiB9CiAjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL2RzYS9kc2FfdmVyaWZ5X2tleS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL2VjYy9lY2MuYyBiL3NyYy9way9lY2MvZWNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5ZDU2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9lY2MvZWNjLmMKQEAgLTAsMCArMSwxMDM2IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworCisvKiBJbXBsZW1lbnRzIEVDQyBvdmVyIFovcFogZm9yIGN1cnZlIHleMiA9IHheMyAtIDN4ICsgYgorICoKKyAqIEFsbCBjdXJ2ZXMgdGFrZW4gZnJvbSBOSVNUIHJlY29tbWVuZGF0aW9uIHBhcGVyIG9mIEp1bHkgMTk5OQorICogQXZhaWxhYmxlIGF0IGh0dHA6Ly9jc3JjLm5pc3QuZ292L2NyeXB0dmFsL2Rzcy5odG0KKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBlY2MuYworICBFQ0MgQ3J5cHRvLCBUb20gU3QgRGVuaXMKKyovICAKKworI2lmZGVmIE1FQ0MKKworLyogc2l6ZSBvZiBvdXIgdGVtcCBidWZmZXJzIGZvciBleHBvcnRlZCBrZXlzICovCisjZGVmaW5lIEVDQ19CVUZfU0laRSAyNTYKKworLyogbWF4IHByaXZhdGUga2V5IHNpemUgKi8KKyNkZWZpbmUgRUNDX01BWFNJWkUgIDY2CisKKy8qIFRoaXMgaG9sZHMgdGhlIGtleSBzZXR0aW5ncy4gICoqKk1VU1QqKiogYmUgb3JnYW5pemVkIGJ5IHNpemUgZnJvbSBzbWFsbGVzdCB0byBsYXJnZXN0LiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICBpbnQgc2l6ZTsKKyAgIGNoYXIgKm5hbWUsICpwcmltZSwgKkIsICpvcmRlciwgKkd4LCAqR3k7Cit9IHNldHNbXSA9IHsKKyNpZmRlZiBFQ0MxOTIKK3sKKyAgICAyNCwKKyAgICJFQ0MtMTkyIiwKKyAgIC8qIHByaW1lICovCisgICAiLy8vLy8vLy8vLy8vLy8vLy8vLy8vbC8vLy8vLy8vLy8iLAorCisgICAvKiBCICovCisgICAiUDI0NTZVTVNXRVNGZitjaFNZR21JVnd1dGtwMUhoY24iLAorCisgICAvKiBvcmRlciAqLworICAgIi8vLy8vLy8vLy8vLy8vLy9jVHh1RFhIaG9SNnFxWVduIiwKKworICAgLyogR3ggKi8KKyAgICI2OHNlM2gwbWFGUHlsbzNoR3c2ODBGSi8ybHMyL24wSSIsCisKKyAgIC8qIEd5ICovCisgICAiMW5haGJWLzhzZFhaNDE3alFvSkRyTkZ2VHc0VVVLV0giCit9LAorI2VuZGlmCisjaWZkZWYgRUNDMjI0Cit7CisgICAyOCwKKyAgICJFQ0MtMjI0IiwKKworICAgLyogcHJpbWUgKi8KKyAgICIzLy8vLy8vLy8vLy8vLy8vLy8vLy8vMDAwMDAwMDAwMDAwMDAwMSIsCisKKyAgIC8qIEIgKi8KKyAgICIycTFHZzUzMElwZy9MMUNiUEdIQjJ0cngvT2tZU0JFS0NaTFYrcSIsCisKKyAgIC8qIG9yZGVyICovCisgICAiMy8vLy8vLy8vLy8vLy8vLy8vL25RWXVCWm1GWEZUQUtMU04yZXoiLAorCisgICAvKiBHeCAqLworICAgIjJ0M1dvelF4SS9WcDhKYUJiQTB5N0pMaThIOFpHb1dET0hOMXFYIiwKKworCisgICAvKiBHeSAqLworICAgIjJ6RHNFOGpWU1orcW1ZdCtSREd0TVdNV1Q3UDRKTFdQYzUwN3VxIiwKK30sCisjZW5kaWYKKyNpZmRlZiBFQ0MyNTYKK3sKKyAgIDMyLAorICAgIkVDQy0yNTYiLAorICAgLyogUHJpbWUgKi8KKyAgICJGLy8vL3kwMDAwMTAwMDAwMDAwMDAwMDAwMDAvLy8vLy8vLy8vLy8vLy8vIiwKKworICAgLyogQiAqLworICAgIjVoNkRUWWdFZkZkaStrekxOUU9YaG5iN0dRbXA1RW16WmxFRjN1ZHFjMUIiLAorCisgICAvKiBPcmRlciAqLworICAgIkYvLy8veTAwMDAwLy8vLy8vLy8vLyt5dmxnamZuVVVYRkV2b2lCeU9vTEgiLAorCisgICAvKiBHeCAqLworICAgIjZpTnFWQlhCNDk3K0JwY3ZNRWFHRjl0MHRzMUJVaXBlRklYRUtOT2NDQU0iLAorCisgICAvKiBHeSAqLworICAgIjQvWkdrQis2ZCtSWmtWaElkbUZkWE9ocFpETlFwNVVwaWtzRzZXdGxyN3IiCit9LAorI2VuZGlmCisjaWZkZWYgRUNDMzg0Cit7CisgICA0OCwKKyAgICJFQ0MtMzg0IiwKKyAgIC8qIHByaW1lICovCisgICAiLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8veC8vLy8vMDAwMDAwMDAwMDMvIgorICAgIi8vLy8iLAorCisgICAvKiBCICovCisgICAiaXA0bGYrOCt2K0lPWldMaHUvV2o2SFdUZDZ4K1dLNEkwbkc4WnIwSlhyaDZMWmNEWVl4SGRJZzVvRXRKIgorICAgIngyaGwiLAorCisgICAvKiBPcmRlciAqLworICAgIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vbnNERFdWR3RCVHpPNldzb0lCMmRVa3BpNk1oQyIKKyAgICJuSWJwIiwKKworICAgLyogR3ggYW5kIEd5ICovCisgICAiZ2VWQThod0IxSlVFaVNTVXlvMmpUNnVURXNBQmZ2a09NVlQxdTg5S0FaWEwwbDlUbHJLZlIzZktOWlhvIgorICAgIlRXZ3QiLAorCisgICAiRFhWVUlmT2NCNnpUZGZZL2FmQlNBVlpxN1JxZWNYSHl3VGVuNHhObWtDMEFPQjdFN053MWROZjM3Tm9HIgorICAgIndXdlYiCit9LAorI2VuZGlmCisjaWZkZWYgRUNDNTIxCit7CisgICA2NSwKKyAgICJFQ0MtNTIxIiwKKyAgIC8qIHByaW1lICovCisgICAiVi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIgorICAgIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyIsCisKKyAgIC8qIEIgKi8KKyAgICI1NkxGaGJYWlhvUTd2QVE4UTJzWEsza2VqZm9NdmNwNVZFdWo4Y0habDQ5dUxPUEVMN2lWZkR4NWJCMGwiCisgICAiSmtubG1TclN6KzhGSW1xeVV6NTd6SGhLM3kwIiwKKworICAgLyogT3JkZXIgKi8KKyAgICJWLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vK2I2Nlh1RS9CdlBoVnltMUkiCisgICAiRlM5ZlQweGpTY3VZUG43aGhqbGpud0hFNkc5IiwKKworICAgLyogR3ggYW5kIEd5ICovCisgICAiQ1E1WldRdDEwSmZwUHUrb3NPWmJSSDJkNkkxRUdLL2pJN3VBQXpXUXFxemtnNUJOZFZsdnJhZS9YdDE5IgorICAgIndCL2dEdXBJQkYxWE1mMmMvYitWWjcydlJyYyIsCisKKyAgICJIV3ZBTWZ1Y1psMDE1b0FOeEdpVkhsUGNGTDRJTFVSSDZXTmh4cU45cHZjQjlWa1NmYlV6MlAwbkwydjAiCisgICAiSitqMXM0ckY3MjZlZEIyRzhZK2I3UVZxTVBHIiwKK30sCisjZW5kaWYKK3sKKyAgIDAsCisgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCit9Cit9OworCitzdGF0aWMgaW50IGlzX3ZhbGlkX2lkeChpbnQgbikKK3sKKyAgIGludCB4OworCisgICBmb3IgKHggPSAwOyBzZXRzW3hdLnNpemUgIT0gMDsgeCsrKTsKKyAgIGlmICgobiA8IDApIHx8IChuID49IHgpKSB7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIHJldHVybiAxOworfQorCitzdGF0aWMgZWNjX3BvaW50ICpuZXdfcG9pbnQodm9pZCkKK3sKKyAgIGVjY19wb2ludCAqcDsKKyAgIHAgPSBYTUFMTE9DKHNpemVvZihlY2NfcG9pbnQpKTsKKyAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgfQorICAgaWYgKG1wX2luaXRfbXVsdGkoJnAtPngsICZwLT55LCAmcC0+eiwgTlVMTCkgIT0gTVBfT0tBWSkgeworICAgICAgWEZSRUUocCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgIH0KKyAgIHJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBkZWxfcG9pbnQoZWNjX3BvaW50ICpwKQoreworICAgLyogcHJldmVudHMgZnJlZSdpbmcgbnVsbCBhcmd1bWVudHMgKi8KKyAgIGlmIChwICE9IE5VTEwpIHsKKyAgICAgIG1wX2NsZWFyX211bHRpKCZwLT54LCAmcC0+eSwgJnAtPnosIE5VTEwpOworICAgICAgWEZSRUUocCk7CisgICB9Cit9CisKK3N0YXRpYyBpbnQgZWNjX21hcChlY2NfcG9pbnQgKlAsIG1wX2ludCAqbW9kdWx1cywgbXBfZGlnaXQgbXApCit7CisgICBtcF9pbnQgdDEsIHQyOworICAgaW50IGVycjsKKworICAgaWYgKChlcnIgPSBtcF9pbml0X211bHRpKCZ0MSwgJnQyLCBOVUxMKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKKyAgIC8qIGZpcnN0IG1hcCB6IGJhY2sgdG8gbm9ybWFsICovCisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZQLT56LCBtb2R1bHVzLCBtcCkpICE9IE1QX09LQVkpICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgLyogZ2V0IDEveiAqLworICAgaWYgKChlcnIgPSBtcF9pbnZtb2QoJlAtPnosIG1vZHVsdXMsICZ0MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgCisgICAvKiBnZXQgMS96XjIgYW5kIDEvel4zICovCisgICBpZiAoKGVyciA9IG1wX3NxcigmdDEsICZ0MikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfbW9kKCZ0MiwgbW9kdWx1cywgJnQyKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tdWwoJnQxLCAmdDIsICZ0MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vZCgmdDEsIG1vZHVsdXMsICZ0MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgLyogbXVsdGlwbHkgYWdhaW5zdCB4L3kgKi8KKyAgIGlmICgoZXJyID0gbXBfbXVsKCZQLT54LCAmdDIsICZQLT54KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3JlZHVjZSgmUC0+eCwgbW9kdWx1cywgbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX211bCgmUC0+eSwgJnQxLCAmUC0+eSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfbW9udGdvbWVyeV9yZWR1Y2UoJlAtPnksIG1vZHVsdXMsIG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgbXBfc2V0KCZQLT56LCAxKTsKKworICAgZXJyID0gQ1JZUFRfT0s7CisgICBnb3RvIGRvbmU7CitlcnJvcjoKKyAgIGVyciA9IG1waV90b19sdGNfZXJyb3IoZXJyKTsKK2RvbmU6CisgICBtcF9jbGVhcl9tdWx0aSgmdDEsICZ0MiwgTlVMTCk7CisgICByZXR1cm4gZXJyOworCit9CisKKy8qIGRvdWJsZSBhIHBvaW50IFIgPSAyUCwgUiBjYW4gYmUgUCovCitzdGF0aWMgaW50IGRibF9wb2ludChlY2NfcG9pbnQgKlAsIGVjY19wb2ludCAqUiwgbXBfaW50ICptb2R1bHVzLCBtcF9kaWdpdCBtcCkKK3sKKyAgIG1wX2ludCB0MSwgdDI7CisgICBpbnQgZXJyOworCisgICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJnQxLCAmdDIsIE5VTEwpKSAhPSBNUF9PS0FZKSB7CisgICAgICByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworICAgfQorCisgICBpZiAoKGVyciA9IG1wX2NvcHkoJlAtPngsICZSLT54KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9jb3B5KCZQLT55LCAmUi0+eSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfY29weSgmUC0+eiwgJlItPnopKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisKKyAgIC8qIHQxID0gWiAqIFogKi8KKyAgIGlmICgoZXJyID0gbXBfc3FyKCZSLT56LCAmdDEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZ0MSwgbW9kdWx1cywgbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgLyogWiA9IFkgKiBaICovCisgICBpZiAoKGVyciA9IG1wX211bCgmUi0+eiwgJlItPnksICZSLT56KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3JlZHVjZSgmUi0+eiwgbW9kdWx1cywgbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIC8qIFogPSAyWiAqLworICAgaWYgKChlcnIgPSBtcF9tdWxfMigmUi0+eiwgJlItPnopKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmIChtcF9jbXAoJlItPnosIG1vZHVsdXMpICE9IE1QX0xUKSB7CisgICAgICBpZiAoKGVyciA9IG1wX3N1YigmUi0+eiwgbW9kdWx1cywgJlItPnopKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgfQorCisgICAvKiBUMiA9IFggLSBUMSAqLworICAgaWYgKChlcnIgPSBtcF9zdWIoJlItPngsICZ0MSwgJnQyKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmIChtcF9jbXBfZCgmdDIsIDApID09IE1QX0xUKSB7CisgICAgICBpZiAoKGVyciA9IG1wX2FkZCgmdDIsIG1vZHVsdXMsICZ0MikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgfQorICAgLyogVDEgPSBYICsgVDEgKi8KKyAgIGlmICgoZXJyID0gbXBfYWRkKCZ0MSwgJlItPngsICZ0MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAobXBfY21wKCZ0MSwgbW9kdWx1cykgIT0gTVBfTFQpIHsKKyAgICAgIGlmICgoZXJyID0gbXBfc3ViKCZ0MSwgbW9kdWx1cywgJnQxKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICB9CisgICAvKiBUMiA9IFQxICogVDIgKi8KKyAgIGlmICgoZXJyID0gbXBfbXVsKCZ0MSwgJnQyLCAmdDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZ0MiwgbW9kdWx1cywgbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgLyogVDEgPSAyVDIgKi8KKyAgIGlmICgoZXJyID0gbXBfbXVsXzIoJnQyLCAmdDEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAobXBfY21wKCZ0MSwgbW9kdWx1cykgIT0gTVBfTFQpIHsKKyAgICAgIGlmICgoZXJyID0gbXBfc3ViKCZ0MSwgbW9kdWx1cywgJnQxKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICB9CisgICAvKiBUMSA9IFQxICsgVDIgKi8KKyAgIGlmICgoZXJyID0gbXBfYWRkKCZ0MSwgJnQyLCAmdDEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAobXBfY21wKCZ0MSwgbW9kdWx1cykgIT0gTVBfTFQpIHsKKyAgICAgIGlmICgoZXJyID0gbXBfc3ViKCZ0MSwgbW9kdWx1cywgJnQxKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICB9CisKKyAgIC8qIFkgPSAyWSAqLworICAgaWYgKChlcnIgPSBtcF9tdWxfMigmUi0+eSwgJlItPnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmIChtcF9jbXAoJlItPnksIG1vZHVsdXMpICE9IE1QX0xUKSB7CisgICAgICBpZiAoKGVyciA9IG1wX3N1YigmUi0+eSwgbW9kdWx1cywgJlItPnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgfQorICAgLyogWSA9IFkgKiBZICovCisgICBpZiAoKGVyciA9IG1wX3NxcigmUi0+eSwgJlItPnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3JlZHVjZSgmUi0+eSwgbW9kdWx1cywgbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIC8qIFQyID0gWSAqIFkgKi8KKyAgIGlmICgoZXJyID0gbXBfc3FyKCZSLT55LCAmdDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZ0MiwgbW9kdWx1cywgbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgLyogVDIgPSBUMi8yICovCisgICBpZiAobXBfaXNvZGQoJnQyKSkgeworICAgICAgaWYgKChlcnIgPSBtcF9hZGQoJnQyLCBtb2R1bHVzLCAmdDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0KKyAgIGlmICgoZXJyID0gbXBfZGl2XzIoJnQyLCAmdDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICAvKiBZID0gWSAqIFggKi8KKyAgIGlmICgoZXJyID0gbXBfbXVsKCZSLT55LCAmUi0+eCwgJlItPnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZSLT55LCBtb2R1bHVzLCBtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICAvKiBYICA9IFQxICogVDEgKi8KKyAgIGlmICgoZXJyID0gbXBfc3FyKCZ0MSwgJlItPngpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZSLT54LCBtb2R1bHVzLCBtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgLyogWCA9IFggLSBZICovCisgICBpZiAoKGVyciA9IG1wX3N1YigmUi0+eCwgJlItPnksICZSLT54KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKG1wX2NtcF9kKCZSLT54LCAwKSA9PSBNUF9MVCkgeworICAgICAgaWYgKChlcnIgPSBtcF9hZGQoJlItPngsIG1vZHVsdXMsICZSLT54KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0KKyAgIC8qIFggPSBYIC0gWSAqLworICAgaWYgKChlcnIgPSBtcF9zdWIoJlItPngsICZSLT55LCAmUi0+eCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmIChtcF9jbXBfZCgmUi0+eCwgMCkgPT0gTVBfTFQpIHsKKyAgICAgIGlmICgoZXJyID0gbXBfYWRkKCZSLT54LCBtb2R1bHVzLCAmUi0+eCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICB9CisKKyAgIC8qIFkgPSBZIC0gWCAqLyAgICAgCisgICBpZiAoKGVyciA9IG1wX3N1YigmUi0+eSwgJlItPngsICZSLT55KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKG1wX2NtcF9kKCZSLT55LCAwKSA9PSBNUF9MVCkgeworICAgICAgaWYgKChlcnIgPSBtcF9hZGQoJlItPnksIG1vZHVsdXMsICZSLT55KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0KKyAgIC8qIFkgPSBZICogVDEgKi8KKyAgIGlmICgoZXJyID0gbXBfbXVsKCZSLT55LCAmdDEsICZSLT55KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZSLT55LCBtb2R1bHVzLCBtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgLyogWSA9IFkgLSBUMiAqLworICAgaWYgKChlcnIgPSBtcF9zdWIoJlItPnksICZ0MiwgJlItPnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmIChtcF9jbXBfZCgmUi0+eSwgMCkgPT0gTVBfTFQpIHsKKyAgICAgIGlmICgoZXJyID0gbXBfYWRkKCZSLT55LCBtb2R1bHVzLCAmUi0+eSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICB9CisgCisgICBlcnIgPSBDUllQVF9PSzsKKyAgIGdvdG8gZG9uZTsKK2Vycm9yOgorICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworZG9uZToKKyAgIG1wX2NsZWFyX211bHRpKCZ0MSwgJnQyLCBOVUxMKTsKKyAgIHJldHVybiBlcnI7Cit9CisKKy8qIGFkZCB0d28gZGlmZmVyZW50IHBvaW50cyBvdmVyIFovcFosIFIgPSBQICsgUSwgbm90ZSBSIGNhbiBlcXVhbCBlaXRoZXIgUCBvciBRICovCitzdGF0aWMgaW50IGFkZF9wb2ludChlY2NfcG9pbnQgKlAsIGVjY19wb2ludCAqUSwgZWNjX3BvaW50ICpSLCBtcF9pbnQgKm1vZHVsdXMsIG1wX2RpZ2l0IG1wKQoreworICAgbXBfaW50IHQxLCB0MiwgeCwgeSwgejsKKyAgIGludCBlcnI7CisKKyAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgmdDEsICZ0MiwgJngsICZ5LCAmeiwgTlVMTCkpICE9IE1QX09LQVkpIHsKKyAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7CisgICB9CisKKyAgIGlmICgoZXJyID0gbXBfY29weSgmUC0+eCwgJngpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX2NvcHkoJlAtPnksICZ5KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9jb3B5KCZQLT56LCAmeikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgICAgLyogVDEgPSBaJyAqIFonICovCisgICAgICBpZiAoKGVyciA9IG1wX3NxcigmUS0+eiwgJnQxKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3JlZHVjZSgmdDEsIG1vZHVsdXMsIG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgICAgIC8qIFggPSBYICogVDEgKi8KKyAgICAgIGlmICgoZXJyID0gbXBfbXVsKCZ0MSwgJngsICZ4KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICAgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZ4LCBtb2R1bHVzLCBtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgICAgLyogVDEgPSBaJyAqIFQxICovCisgICAgICBpZiAoKGVyciA9IG1wX211bCgmUS0+eiwgJnQxLCAmdDEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3JlZHVjZSgmdDEsIG1vZHVsdXMsIG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgICAgIC8qIFkgPSBZICogVDEgKi8KKyAgICAgIGlmICgoZXJyID0gbXBfbXVsKCZ0MSwgJnksICZ5KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICAgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZ5LCBtb2R1bHVzLCBtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICAvKiBUMSA9IFoqWiAqLworICAgaWYgKChlcnIgPSBtcF9zcXIoJnosICZ0MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfbW9udGdvbWVyeV9yZWR1Y2UoJnQxLCBtb2R1bHVzLCBtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICAvKiBUMiA9IFgnICogVDEgKi8KKyAgIGlmICgoZXJyID0gbXBfbXVsKCZRLT54LCAmdDEsICZ0MikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZ0MiwgbW9kdWx1cywgbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgLyogVDEgPSBaICogVDEgKi8KKyAgIGlmICgoZXJyID0gbXBfbXVsKCZ6LCAmdDEsICZ0MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZ0MSwgbW9kdWx1cywgbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgLyogVDEgPSBZJyAqIFQxICovCisgICBpZiAoKGVyciA9IG1wX211bCgmUS0+eSwgJnQxLCAmdDEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3JlZHVjZSgmdDEsIG1vZHVsdXMsIG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgLyogWSA9IFkgLSBUMSAqLworICAgaWYgKChlcnIgPSBtcF9zdWIoJnksICZ0MSwgJnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmIChtcF9jbXBfZCgmeSwgMCkgPT0gTVBfTFQpIHsKKyAgICAgIGlmICgoZXJyID0gbXBfYWRkKCZ5LCBtb2R1bHVzLCAmeSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICB9CisgICAvKiBUMSA9IDJUMSAqLworICAgaWYgKChlcnIgPSBtcF9tdWxfMigmdDEsICZ0MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmIChtcF9jbXAoJnQxLCBtb2R1bHVzKSAhPSBNUF9MVCkgeworICAgICAgaWYgKChlcnIgPSBtcF9zdWIoJnQxLCBtb2R1bHVzLCAmdDEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0KKyAgIC8qIFQxID0gWSArIFQxICovCisgICBpZiAoKGVyciA9IG1wX2FkZCgmdDEsICZ5LCAmdDEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKG1wX2NtcCgmdDEsIG1vZHVsdXMpICE9IE1QX0xUKSB7CisgICAgICBpZiAoKGVyciA9IG1wX3N1YigmdDEsIG1vZHVsdXMsICZ0MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgfQorICAgLyogWCA9IFggLSBUMiAqLworICAgaWYgKChlcnIgPSBtcF9zdWIoJngsICZ0MiwgJngpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmIChtcF9jbXBfZCgmeCwgMCkgPT0gTVBfTFQpIHsKKyAgICAgIGlmICgoZXJyID0gbXBfYWRkKCZ4LCBtb2R1bHVzLCAmeCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICB9CisgICAvKiBUMiA9IDJUMiAqLworICAgaWYgKChlcnIgPSBtcF9tdWxfMigmdDIsICZ0MikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmIChtcF9jbXAoJnQyLCBtb2R1bHVzKSAhPSBNUF9MVCkgeworICAgICAgaWYgKChlcnIgPSBtcF9zdWIoJnQyLCBtb2R1bHVzLCAmdDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0KKyAgIC8qIFQyID0gWCArIFQyICovCisgICBpZiAoKGVyciA9IG1wX2FkZCgmdDIsICZ4LCAmdDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKG1wX2NtcCgmdDIsIG1vZHVsdXMpICE9IE1QX0xUKSB7CisgICAgICBpZiAoKGVyciA9IG1wX3N1YigmdDIsIG1vZHVsdXMsICZ0MikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgfQorCisgICAvKiBpZiBaJyAhPSAxICovCisgICBpZiAobXBfY21wX2QoJlEtPnosIDEpICE9IE1QX0VRKSB7CisgICAgICAvKiBaID0gWiAqIFonICovCisgICAgICBpZiAoKGVyciA9IG1wX211bCgmeiwgJlEtPnosICZ6KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3JlZHVjZSgmeiwgbW9kdWx1cywgbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0KKyAgIC8qIFogPSBaICogWCAqLworICAgaWYgKChlcnIgPSBtcF9tdWwoJnosICZ4LCAmeikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfbW9udGdvbWVyeV9yZWR1Y2UoJnosIG1vZHVsdXMsIG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisKKyAgIC8qIFQxID0gVDEgKiBYICAqLworICAgaWYgKChlcnIgPSBtcF9tdWwoJnQxLCAmeCwgJnQxKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfbW9udGdvbWVyeV9yZWR1Y2UoJnQxLCBtb2R1bHVzLCBtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICAvKiBYID0gWCAqIFggKi8KKyAgIGlmICgoZXJyID0gbXBfc3FyKCZ4LCAmeCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZ4LCBtb2R1bHVzLCBtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgLyogVDIgPSBUMiAqIHggKi8KKyAgIGlmICgoZXJyID0gbXBfbXVsKCZ0MiwgJngsICZ0MikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZ0MiwgbW9kdWx1cywgbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgLyogVDEgPSBUMSAqIFggICovCisgICBpZiAoKGVyciA9IG1wX211bCgmdDEsICZ4LCAmdDEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3JlZHVjZSgmdDEsIG1vZHVsdXMsIG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAKKyAgIC8qIFggPSBZKlkgKi8KKyAgIGlmICgoZXJyID0gbXBfc3FyKCZ5LCAmeCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX21vbnRnb21lcnlfcmVkdWNlKCZ4LCBtb2R1bHVzLCBtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgLyogWCA9IFggLSBUMiAqLworICAgaWYgKChlcnIgPSBtcF9zdWIoJngsICZ0MiwgJngpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmIChtcF9jbXBfZCgmeCwgMCkgPT0gTVBfTFQpIHsKKyAgICAgIGlmICgoZXJyID0gbXBfYWRkKCZ4LCBtb2R1bHVzLCAmeCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICB9CisKKyAgIC8qIFQyID0gVDIgLSBYICovCisgICBpZiAoKGVyciA9IG1wX3N1YigmdDIsICZ4LCAmdDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKG1wX2NtcF9kKCZ0MiwgMCkgPT0gTVBfTFQpIHsKKyAgICAgIGlmICgoZXJyID0gbXBfYWRkKCZ0MiwgbW9kdWx1cywgJnQyKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICB9IAorICAgLyogVDIgPSBUMiAtIFggKi8KKyAgIGlmICgoZXJyID0gbXBfc3ViKCZ0MiwgJngsICZ0MikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAobXBfY21wX2QoJnQyLCAwKSA9PSBNUF9MVCkgeworICAgICAgaWYgKChlcnIgPSBtcF9hZGQoJnQyLCBtb2R1bHVzLCAmdDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0KKyAgIC8qIFQyID0gVDIgKiBZICovCisgICBpZiAoKGVyciA9IG1wX211bCgmdDIsICZ5LCAmdDIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3JlZHVjZSgmdDIsIG1vZHVsdXMsIG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIC8qIFkgPSBUMiAtIFQxICovCisgICBpZiAoKGVyciA9IG1wX3N1YigmdDIsICZ0MSwgJnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKG1wX2NtcF9kKCZ5LCAwKSA9PSBNUF9MVCkgeworICAgICAgaWYgKChlcnIgPSBtcF9hZGQoJnksIG1vZHVsdXMsICZ5KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0KKyAgIC8qIFkgPSBZLzIgKi8KKyAgIGlmIChtcF9pc29kZCgmeSkpIHsKKyAgICAgIGlmICgoZXJyID0gbXBfYWRkKCZ5LCBtb2R1bHVzLCAmeSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICB9CisgICBpZiAoKGVyciA9IG1wX2Rpdl8yKCZ5LCAmeSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICBpZiAoKGVyciA9IG1wX2NvcHkoJngsICZSLT54KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9jb3B5KCZ5LCAmUi0+eSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfY29weSgmeiwgJlItPnopKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisKKyAgIGVyciA9IENSWVBUX09LOworICAgZ290byBkb25lOworZXJyb3I6CisgICBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7Citkb25lOgorICAgbXBfY2xlYXJfbXVsdGkoJnQxLCAmdDIsICZ4LCAmeSwgJnosIE5VTEwpOworICAgcmV0dXJuIGVycjsKK30KKworLyogc2l6ZSBvZiBzbGlkaW5nIHdpbmRvdywgZG9uJ3QgY2hhbmdlIHRoaXMhICovCisjZGVmaW5lIFdJTlNJWkUgNAorCisvKiBwZXJmb3JtIFIgPSBrRyB3aGVyZSBrID09IGludGVnZXIgYW5kIEcgPT0gZWNjX3BvaW50ICovCitzdGF0aWMgaW50IGVjY19tdWxtb2QobXBfaW50ICprLCBlY2NfcG9pbnQgKkcsIGVjY19wb2ludCAqUiwgbXBfaW50ICptb2R1bHVzLCBpbnQgbWFwKQoreworICAgZWNjX3BvaW50ICp0RywgKk1bOF07CisgICBpbnQgICAgICAgIGksIGosIGVycjsKKyAgIG1wX2ludCAgICAgbXU7CisgICBtcF9kaWdpdCAgIGJ1ZiwgbXA7CisgICBpbnQgICAgICAgIGZpcnN0LCBiaXRidWYsIGJpdGNweSwgYml0Y250LCBtb2RlLCBkaWdpZHg7CisKKyAgIC8qIGluaXQgbW9udGdvbWVyeSByZWR1Y3Rpb24gKi8KKyAgIGlmICgoZXJyID0gbXBfbW9udGdvbWVyeV9zZXR1cChtb2R1bHVzLCAmbXApKSAhPSBNUF9PS0FZKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisgICBpZiAoKGVyciA9IG1wX2luaXQoJm11KSkgIT0gTVBfT0tBWSkgeworICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKyAgIGlmICgoZXJyID0gbXBfbW9udGdvbWVyeV9jYWxjX25vcm1hbGl6YXRpb24oJm11LCBtb2R1bHVzKSkgIT0gTVBfT0tBWSkgeworICAgICAgbXBfY2xlYXIoJm11KTsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAvKiBhbGxvYyByYW0gZm9yIHdpbmRvdyB0ZW1wcyAqLworICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICBNW2ldID0gbmV3X3BvaW50KCk7CisgICAgICBpZiAoTVtpXSA9PSBOVUxMKSB7CisgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgZGVsX3BvaW50KE1bal0pOworICAgICAgICAgfQorICAgICAgICAgbXBfY2xlYXIoJm11KTsKKyAgICAgICAgIHJldHVybiBDUllQVF9NRU07CisgICAgICB9CisgIH0KKworICAgLyogbWFrZSBhIGNvcHkgb2YgRyBpbmNhc2UgUj09RyAqLworICAgdEcgPSBuZXdfcG9pbnQoKTsKKyAgIGlmICh0RyA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZXJyID0gQ1JZUFRfTUVNOyBnb3RvIGRvbmU7IH0KKworICAgLyogdEcgPSBHICBhbmQgY29udmVydCB0byBtb250Z29tZXJ5ICovCisgICBpZiAoKGVyciA9IG1wX211bG1vZCgmRy0+eCwgJm11LCBtb2R1bHVzLCAmdEctPngpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfbXVsbW9kKCZHLT55LCAmbXUsIG1vZHVsdXMsICZ0Ry0+eSkpICE9IE1QX09LQVkpICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9tdWxtb2QoJkctPnosICZtdSwgbW9kdWx1cywgJnRHLT56KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBtcF9jbGVhcigmbXUpOworICAgCisgICAvKiBjYWxjIHRoZSBNIHRhYiwgd2hpY2ggaG9sZHMga0cgZm9yIGs9PTguLjE1ICovCisgICAvKiBNWzBdID09IDhHICovCisgICBpZiAoKGVyciA9IGRibF9wb2ludCh0RywgICBNWzBdLCBtb2R1bHVzLCBtcCkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgIHsgZ290byBkb25lOyB9CisgICBpZiAoKGVyciA9IGRibF9wb2ludChNWzBdLCBNWzBdLCBtb2R1bHVzLCBtcCkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgIHsgZ290byBkb25lOyB9CisgICBpZiAoKGVyciA9IGRibF9wb2ludChNWzBdLCBNWzBdLCBtb2R1bHVzLCBtcCkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgIHsgZ290byBkb25lOyB9CisKKyAgIC8qIG5vdyBmaW5kICg4K2spRyBmb3Igaz0xLi43ICovCisgICBmb3IgKGogPSA5OyBqIDwgMTY7IGorKykgeworICAgICAgIGlmICgoZXJyID0gYWRkX3BvaW50KE1bai05XSwgdEcsIE1bai04XSwgbW9kdWx1cywgbXApKSAhPSBDUllQVF9PSykgICB7IGdvdG8gZG9uZTsgfQorICAgfQorCisgICAvKiBzZXR1cCBzbGlkaW5nIHdpbmRvdyAqLworICAgbW9kZSAgID0gMDsKKyAgIGJpdGNudCA9IDE7CisgICBidWYgICAgPSAwOworICAgZGlnaWR4ID0gay0+dXNlZCAtIDE7CisgICBiaXRjcHkgPSBiaXRidWYgPSAwOworICAgZmlyc3QgID0gMTsKKworICAgLyogcGVyZm9ybSBvcHMgKi8KKyAgIGZvciAoOzspIHsKKyAgICAgLyogZ3JhYiBuZXh0IGRpZ2l0IGFzIHJlcXVpcmVkICovCisgICAgIGlmICgtLWJpdGNudCA9PSAwKSB7CisgICAgICAgaWYgKGRpZ2lkeCA9PSAtMSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgICAgICBidWYgPSBrLT5kcFtkaWdpZHgtLV07CisgICAgICAgYml0Y250ID0gKGludCkgRElHSVRfQklUOworICAgICB9CisKKyAgICAgLyogZ3JhYiB0aGUgbmV4dCBtc2IgZnJvbSB0aGUgbHRpcGxpY2FuZCAqLworICAgICBpID0gKGJ1ZiA+PiAoRElHSVRfQklUIC0gMSkpICYgMTsKKyAgICAgYnVmIDw8PSAxOworCisgICAgIC8qIHNraXAgbGVhZGluZyB6ZXJvIGJpdHMgKi8KKyAgICAgaWYgKG1vZGUgPT0gMCAmJiBpID09IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgIH0KKworICAgICAvKiBpZiB0aGUgYml0IGlzIHplcm8gYW5kIG1vZGUgPT0gMSB0aGVuIHdlIGRvdWJsZSAqLworICAgICBpZiAobW9kZSA9PSAxICYmIGkgPT0gMCkgeworICAgICAgICBpZiAoKGVyciA9IGRibF9wb2ludChSLCBSLCBtb2R1bHVzLCBtcCkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgICB7IGdvdG8gZG9uZTsgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgfQorCisgICAgIC8qIGVsc2Ugd2UgYWRkIGl0IHRvIHRoZSB3aW5kb3cgKi8KKyAgICAgYml0YnVmIHw9IChpIDw8IChXSU5TSVpFIC0gKytiaXRjcHkpKTsKKyAgICAgbW9kZSA9IDI7CisKKyAgICAgaWYgKGJpdGNweSA9PSBXSU5TSVpFKSB7CisgICAgICAgLyogaWYgdGhpcyBpcyB0aGUgZmlyc3Qgd2luZG93IHdlIGRvIGEgc2ltcGxlIGNvcHkgKi8KKyAgICAgICBpZiAoZmlyc3QgPT0gMSkgeworICAgICAgICAgIC8qIFIgPSBrRyBbayA9IGZpcnN0IHdpbmRvd10gKi8KKyAgICAgICAgICBpZiAoKGVyciA9IG1wX2NvcHkoJk1bYml0YnVmLThdLT54LCAmUi0+eCkpICE9IE1QX09LQVkpICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgICAgICAgIGlmICgoZXJyID0gbXBfY29weSgmTVtiaXRidWYtOF0tPnksICZSLT55KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICAgICAgICAgaWYgKChlcnIgPSBtcF9jb3B5KCZNW2JpdGJ1Zi04XS0+eiwgJlItPnopKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgIC8qIG5vcm1hbCB3aW5kb3cgKi8KKyAgICAgICAgIC8qIG9rIHdpbmRvdyBpcyBmaWxsZWQgc28gZG91YmxlIGFzIHJlcXVpcmVkIGFuZCBhZGQgICovCisgICAgICAgICAvKiBkb3VibGUgZmlyc3QgKi8KKyAgICAgICAgIGZvciAoaiA9IDA7IGogPCBXSU5TSVpFOyBqKyspIHsKKyAgICAgICAgICAgaWYgKChlcnIgPSBkYmxfcG9pbnQoUiwgUiwgbW9kdWx1cywgbXApKSAhPSBDUllQVF9PSykgICAgICAgICAgICAgeyBnb3RvIGRvbmU7IH0KKyAgICAgICAgIH0KKworICAgICAgICAgLyogdGhlbiBhZGQsIGJpdGJ1ZiB3aWxsIGJlIDguLjE1IFs4Li4yXldJTlNJWkVdIGd1YXJhbnRlZWQgKi8KKyAgICAgICAgIGlmICgoZXJyID0gYWRkX3BvaW50KFIsIE1bYml0YnVmLThdLCBSLCBtb2R1bHVzLCBtcCkpICE9IENSWVBUX09LKSAgeyBnb3RvIGRvbmU7IH0KKyAgICAgICB9CisgICAgICAgLyogZW1wdHkgd2luZG93IGFuZCByZXNldCAqLworICAgICAgIGJpdGNweSA9IGJpdGJ1ZiA9IDA7CisgICAgICAgbW9kZSA9IDE7CisgICAgfQorICB9CisKKyAgIC8qIGlmIGJpdHMgcmVtYWluIHRoZW4gZG91YmxlL2FkZCAqLworICAgaWYgKG1vZGUgPT0gMiAmJiBiaXRjcHkgPiAwKSB7CisgICAgIC8qIGRvdWJsZSB0aGVuIGFkZCAqLworICAgICBmb3IgKGogPSAwOyBqIDwgYml0Y3B5OyBqKyspIHsKKyAgICAgICAvKiBvbmx5IGRvdWJsZSBpZiB3ZSBoYXZlIGhhZCBhdCBsZWFzdCBvbmUgYWRkIGZpcnN0ICovCisgICAgICAgaWYgKGZpcnN0ID09IDApIHsKKyAgICAgICAgICBpZiAoKGVyciA9IGRibF9wb2ludChSLCBSLCBtb2R1bHVzLCBtcCkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgIHsgZ290byBkb25lOyB9CisgICAgICAgfQorCisgICAgICAgYml0YnVmIDw8PSAxOworICAgICAgIGlmICgoYml0YnVmICYgKDEgPDwgV0lOU0laRSkpICE9IDApIHsKKyAgICAgICAgIGlmIChmaXJzdCA9PSAxKXsKKyAgICAgICAgICAgIC8qIGZpcnN0IGFkZCwgc28gY29weSAqLworICAgICAgICAgICAgaWYgKChlcnIgPSBtcF9jb3B5KCZ0Ry0+eCwgJlItPngpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgICAgICAgICAgaWYgKChlcnIgPSBtcF9jb3B5KCZ0Ry0+eSwgJlItPnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgICAgICAgICAgaWYgKChlcnIgPSBtcF9jb3B5KCZ0Ry0+eiwgJlItPnopKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHRoZW4gYWRkICovCisgICAgICAgICAgICBpZiAoKGVyciA9IGFkZF9wb2ludChSLCB0RywgUiwgbW9kdWx1cywgbXApKSAhPSBDUllQVF9PSykgICAgICAgICB7IGdvdG8gZG9uZTsgfQorICAgICAgICAgfQorICAgICAgIH0KKyAgICAgfQorICAgfQorCisgICAvKiBtYXAgUiBiYWNrIGZyb20gcHJvamVjdGl2ZSBzcGFjZSAqLworICAgaWYgKG1hcCkgeworICAgICAgZXJyID0gZWNjX21hcChSLCBtb2R1bHVzLCBtcCk7CisgICB9IGVsc2UgeworICAgICAgZXJyID0gQ1JZUFRfT0s7CisgICB9CisKKyAgIGdvdG8gZG9uZTsKK2Vycm9yOgorICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworZG9uZToKKyAgIGRlbF9wb2ludCh0Ryk7CisgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgZGVsX3BvaW50KE1baV0pOworICAgfQorICAgcmV0dXJuIGVycjsKK30KKworI3VuZGVmIFdJTlNJWkUKKworLyoqCisgIFBlcmZvcm0gb24gdGhlIEVDQyBzeXN0ZW0KKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGVjY190ZXN0KHZvaWQpCit7CisgICBtcF9pbnQgICAgIG1vZHVsdXMsIG9yZGVyOworICAgZWNjX3BvaW50ICAqRywgKkdHOworICAgaW50IGksIGVyciwgcHJpbWFsaXR5OworCisgICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJm1vZHVsdXMsICZvcmRlciwgTlVMTCkpICE9IE1QX09LQVkpIHsKKyAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7CisgICB9CisKKyAgIEcgICA9IG5ld19wb2ludCgpOworICAgR0cgID0gbmV3X3BvaW50KCk7CisgICBpZiAoRyA9PSBOVUxMIHx8IEdHID09IE5VTEwpIHsKKyAgICAgIG1wX2NsZWFyX211bHRpKCZtb2R1bHVzLCAmb3JkZXIsIE5VTEwpOworICAgICAgZGVsX3BvaW50KEcpOworICAgICAgZGVsX3BvaW50KEdHKTsKKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKKyAgIGZvciAoaSA9IDA7IHNldHNbaV0uc2l6ZTsgaSsrKSB7CisgICAgICAgI2lmIDAKKyAgICAgICAgICBwcmludGYoIlRlc3RpbmcgJWRcbiIsIHNldHNbaV0uc2l6ZSk7CisgICAgICAgI2VuZGlmCisgICAgICAgaWYgKChlcnIgPSBtcF9yZWFkX3JhZGl4KCZtb2R1bHVzLCAoY2hhciAqKXNldHNbaV0ucHJpbWUsIDY0KSkgIT0gTVBfT0tBWSkgICB7IGdvdG8gZXJyb3I7IH0KKyAgICAgICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJm9yZGVyLCAoY2hhciAqKXNldHNbaV0ub3JkZXIsIDY0KSkgIT0gTVBfT0tBWSkgICAgIHsgZ290byBlcnJvcjsgfQorCisgICAgICAgLyogaXMgcHJpbWUgYWN0dWFsbHkgcHJpbWU/ICovCisgICAgICAgaWYgKChlcnIgPSBpc19wcmltZSgmbW9kdWx1cywgJnByaW1hbGl0eSkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZG9uZTsgfQorICAgICAgIGlmIChwcmltYWxpdHkgPT0gMCkgeworICAgICAgICAgIGVyciA9IENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgfQorCisgICAgICAgLyogaXMgb3JkZXIgcHJpbWUgPyAqLworICAgICAgIGlmICgoZXJyID0gaXNfcHJpbWUoJm9yZGVyLCAmcHJpbWFsaXR5KSkgIT0gQ1JZUFRfT0spICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGRvbmU7IH0KKyAgICAgICBpZiAocHJpbWFsaXR5ID09IDApIHsKKyAgICAgICAgICBlcnIgPSBDUllQVF9GQUlMX1RFU1RWRUNUT1I7CisgICAgICAgICAgZ290byBkb25lOworICAgICAgIH0KKworICAgICAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmRy0+eCwgKGNoYXIgKilzZXRzW2ldLkd4LCA2NCkpICE9IE1QX09LQVkpICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICAgICAgaWYgKChlcnIgPSBtcF9yZWFkX3JhZGl4KCZHLT55LCAoY2hhciAqKXNldHNbaV0uR3ksIDY0KSkgIT0gTVBfT0tBWSkgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgICAgICBtcF9zZXQoJkctPnosIDEpOworCisgICAgICAgLyogdGhlbiB3ZSBzaG91bGQgaGF2ZSBHID09IChvcmRlciArIDEpRyAqLworICAgICAgIGlmICgoZXJyID0gbXBfYWRkX2QoJm9yZGVyLCAxLCAmb3JkZXIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICAgICAgaWYgKChlcnIgPSBlY2NfbXVsbW9kKCZvcmRlciwgRywgR0csICZtb2R1bHVzLCAxKSkgIT0gQ1JZUFRfT0spICAgICAgICAgICAgICB7IGdvdG8gZG9uZTsgfQorICAgICAgIGlmIChtcF9jbXAoJkctPngsICZHRy0+eCkgIT0gMCB8fCBtcF9jbXAoJkctPnksICZHRy0+eSkgIT0gMCkgeworICAgICAgICAgIGVyciA9IENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKKyAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgfQorICAgfQorICAgZXJyID0gQ1JZUFRfT0s7CisgICBnb3RvIGRvbmU7CitlcnJvcjoKKyAgIGVyciA9IG1waV90b19sdGNfZXJyb3IoZXJyKTsKK2RvbmU6CisgICBkZWxfcG9pbnQoR0cpOworICAgZGVsX3BvaW50KEcpOworICAgbXBfY2xlYXJfbXVsdGkoJm9yZGVyLCAmbW9kdWx1cywgTlVMTCk7CisgICByZXR1cm4gZXJyOworfQorCit2b2lkIGVjY19zaXplcyhpbnQgKmxvdywgaW50ICpoaWdoKQoreworIGludCBpOworIExUQ19BUkdDSEsobG93ICAhPSBOVUxMKTsKKyBMVENfQVJHQ0hLKGhpZ2ggIT0gTlVMTCk7CisKKyAqbG93ID0gSU5UX01BWDsKKyAqaGlnaCA9IDA7CisgZm9yIChpID0gMDsgc2V0c1tpXS5zaXplICE9IDA7IGkrKykgeworICAgICBpZiAoc2V0c1tpXS5zaXplIDwgKmxvdykgIHsKKyAgICAgICAgKmxvdyAgPSBzZXRzW2ldLnNpemU7CisgICAgIH0KKyAgICAgaWYgKHNldHNbaV0uc2l6ZSA+ICpoaWdoKSB7CisgICAgICAgICpoaWdoID0gc2V0c1tpXS5zaXplOworICAgICB9CisgfQorfQorCisvKioKKyAgTWFrZSBhIG5ldyBFQ0Mga2V5IAorICBAcGFyYW0gcHJuZyAgICAgICAgIEFuIGFjdGl2ZSBQUk5HIHN0YXRlCisgIEBwYXJhbSB3cHJuZyAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBQUk5HIHlvdSB3aXNoIHRvIHVzZQorICBAcGFyYW0ga2V5c2l6ZSAgICAgIFRoZSBrZXlzaXplIGZvciB0aGUgbmV3IGtleSAoaW4gb2N0ZXRzIGZyb20gMjAgdG8gNjUgYnl0ZXMpCisgIEBwYXJhbSBrZXkgICAgICAgICAgW291dF0gRGVzdGluYXRpb24gb2YgdGhlIG5ld2x5IGNyZWF0ZWQga2V5CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgdXBvbiBlcnJvciBhbGwgYWxsb2NhdGVkIG1lbW9yeSB3aWxsIGJlIGZyZWVkCisqLworaW50IGVjY19tYWtlX2tleShwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGludCBrZXlzaXplLCBlY2Nfa2V5ICprZXkpCit7CisgICBpbnQgICAgICAgICAgICB4LCBlcnI7CisgICBlY2NfcG9pbnQgICAgICpiYXNlOworICAgbXBfaW50ICAgICAgICAgcHJpbWU7CisgICB1bnNpZ25lZCBjaGFyICpidWY7CisKKyAgIExUQ19BUkdDSEsoa2V5ICE9IE5VTEwpOworCisgICAvKiBnb29kIHBybmc/ICovCisgICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQod3BybmcpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogZmluZCBrZXkgc2l6ZSAqLworICAgZm9yICh4ID0gMDsgKGtleXNpemUgPiBzZXRzW3hdLnNpemUpICYmIChzZXRzW3hdLnNpemUgIT0gMCk7IHgrKyk7CisgICBrZXlzaXplID0gc2V0c1t4XS5zaXplOworCisgICBpZiAoa2V5c2l6ZSA+IEVDQ19NQVhTSVpFIHx8IHNldHNbeF0uc2l6ZSA9PSAwKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOworICAgfQorICAga2V5LT5pZHggPSB4OworCisgICAvKiBhbGxvY2F0ZSByYW0gKi8KKyAgIGJhc2UgPSBOVUxMOworICAgYnVmICA9IFhNQUxMT0MoRUNDX01BWFNJWkUpOworICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICAvKiBtYWtlIHVwIHJhbmRvbSBzdHJpbmcgKi8KKyAgIGlmIChwcm5nX2Rlc2NyaXB0b3Jbd3BybmddLnJlYWQoYnVmLCAodW5zaWduZWQgbG9uZylrZXlzaXplLCBwcm5nKSAhPSAodW5zaWduZWQgbG9uZylrZXlzaXplKSB7CisgICAgICBlcnIgPSBDUllQVF9FUlJPUl9SRUFEUFJORzsKKyAgICAgIGdvdG8gTEJMX0VSUjI7CisgICB9CisKKyAgIC8qIHNldHVwIHRoZSBrZXkgdmFyaWFibGVzICovCisgICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJmtleS0+cHVia2V5LngsICZrZXktPnB1YmtleS55LCAma2V5LT5wdWJrZXkueiwgJmtleS0+aywgJnByaW1lLCBOVUxMKSkgIT0gTVBfT0tBWSkgeworICAgICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworICAgICAgZ290byBMQkxfRVJSOworICAgfQorICAgYmFzZSA9IG5ld19wb2ludCgpOworICAgaWYgKGJhc2UgPT0gTlVMTCkgeworICAgICAgbXBfY2xlYXJfbXVsdGkoJmtleS0+cHVia2V5LngsICZrZXktPnB1YmtleS55LCAma2V5LT5wdWJrZXkueiwgJmtleS0+aywgJnByaW1lLCBOVUxMKTsKKyAgICAgIGVyciA9IENSWVBUX01FTTsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogcmVhZCBpbiB0aGUgc3BlY3MgZm9yIHRoaXMga2V5ICovCisgICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJnByaW1lLCAoY2hhciAqKXNldHNba2V5LT5pZHhdLnByaW1lLCA2NCkpICE9IE1QX09LQVkpICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJmJhc2UtPngsIChjaGFyICopc2V0c1trZXktPmlkeF0uR3gsIDY0KSkgIT0gTVBfT0tBWSkgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJmJhc2UtPnksIChjaGFyICopc2V0c1trZXktPmlkeF0uR3ksIDY0KSkgIT0gTVBfT0tBWSkgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBtcF9zZXQoJmJhc2UtPnosIDEpOworICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2Jpbigma2V5LT5rLCAodW5zaWduZWQgY2hhciAqKWJ1Ziwga2V5c2l6ZSkpICE9IE1QX09LQVkpIHsgZ290byBlcnJvcjsgfQorCisgICAvKiBtYWtlIHRoZSBwdWJsaWMga2V5ICovCisgICBpZiAoKGVyciA9IGVjY19tdWxtb2QoJmtleS0+aywgYmFzZSwgJmtleS0+cHVia2V5LCAmcHJpbWUsIDEpKSAhPSBDUllQVF9PSykgICAgICAgICAgeyBnb3RvIExCTF9FUlI7IH0KKyAgIGtleS0+dHlwZSA9IFBLX1BSSVZBVEU7CisKKyAgIC8qIHNocmluayBrZXkgKi8KKyAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPmspKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPnB1YmtleS54KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPnB1YmtleS55KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPnB1YmtleS56KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgLyogZnJlZSB1cCByYW0gKi8KKyAgIGVyciA9IENSWVBUX09LOworICAgZ290byBMQkxfRVJSOworZXJyb3I6CisgICBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7CitMQkxfRVJSOgorICAgZGVsX3BvaW50KGJhc2UpOworICAgbXBfY2xlYXIoJnByaW1lKTsKK0xCTF9FUlIyOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShidWYsIEVDQ19NQVhTSVpFKTsKKyNlbmRpZgorCisgICBYRlJFRShidWYpOworCisgICByZXR1cm4gZXJyOworfQorCisvKioKKyAgRnJlZSBhbiBFQ0Mga2V5IGZyb20gbWVtb3J5CisgIEBwYXJhbSBrZXkgICBUaGUga2V5IHlvdSB3aXNoIHRvIGZyZWUKKyovCit2b2lkIGVjY19mcmVlKGVjY19rZXkgKmtleSkKK3sKKyAgIExUQ19BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgbXBfY2xlYXJfbXVsdGkoJmtleS0+cHVia2V5LngsICZrZXktPnB1YmtleS55LCAma2V5LT5wdWJrZXkueiwgJmtleS0+aywgTlVMTCk7Cit9CisKKy8qKgorICBFeHBvcnQgYW4gRUNDIGtleSBhcyBhIGJpbmFyeSBwYWNrZXQKKyAgQHBhcmFtIG91dCAgICAgW291dF0gRGVzdGluYXRpb24gZm9yIHRoZSBrZXkKKyAgQHBhcmFtIG91dGxlbiAgW2luL291dF0gTWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBleHBvcnRlZCBrZXkKKyAgQHBhcmFtIHR5cGUgICAgVGhlIHR5cGUgb2Yga2V5IHlvdSB3YW50IHRvIGV4cG9ydCAoUEtfUFJJVkFURSBvciBQS19QVUJMSUMpCisgIEBwYXJhbSBrZXkgICAgIFRoZSBrZXkgdG8gZXhwb3J0CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBlY2NfZXhwb3J0KHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBpbnQgdHlwZSwgZWNjX2tleSAqa2V5KQoreworICAgaW50ICAgICAgICAgICBlcnI7CisgICB1bnNpZ25lZCBjaGFyIGZsYWdzWzFdOworICAgdW5zaWduZWQgbG9uZyBrZXlfc2l6ZTsKKworICAgTFRDX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAgICE9IE5VTEwpOworICAgCisgICAvKiB0eXBlIHZhbGlkPyAqLworICAgaWYgKGtleS0+dHlwZSAhPSBQS19QUklWQVRFICYmIHR5cGUgPT0gUEtfUFJJVkFURSkgeworICAgICAgcmV0dXJuIENSWVBUX1BLX1RZUEVfTUlTTUFUQ0g7CisgICB9CisKKyAgIGlmIChpc192YWxpZF9pZHgoa2V5LT5pZHgpID09IDApIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgLyogd2Ugc3RvcmUgdGhlIE5JU1QgYnl0ZSBzaXplICovCisgICBrZXlfc2l6ZSA9IHNldHNba2V5LT5pZHhdLnNpemU7CisKKyAgIGlmICh0eXBlID09IFBLX1BSSVZBVEUpIHsKKyAgICAgICBmbGFnc1swXSA9IDE7CisgICAgICAgZXJyID0gZGVyX2VuY29kZV9zZXF1ZW5jZV9tdWx0aShvdXQsIG91dGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0JJVF9TVFJJTkcsICAgICAgMVVMLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX1NIT1JUX0lOVEVHRVIsICAgMVVMLCAma2V5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAgICAgICAgIDFVTCwgJmtleS0+cHVia2V5LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAgICAgICAgIDFVTCwgJmtleS0+cHVia2V5LnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAgICAgICAgIDFVTCwgJmtleS0+aywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0VPTCwgICAgICAgICAgICAgMFVMLCBOVUxMKTsKKyAgIH0gZWxzZSB7CisgICAgICAgZmxhZ3NbMF0gPSAwOworICAgICAgIGVyciA9IGRlcl9lbmNvZGVfc2VxdWVuY2VfbXVsdGkob3V0LCBvdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9CSVRfU1RSSU5HLCAgICAgIDFVTCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9TSE9SVF9JTlRFR0VSLCAgIDFVTCwgJmtleV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAgICAxVUwsICZrZXktPnB1YmtleS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAgICAxVUwsICZrZXktPnB1YmtleS55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfRU9MLCAgICAgICAgICAgICAwVUwsIE5VTEwpOworICAgfQorCisgICByZXR1cm4gZXJyOworfQorCisvKioKKyAgSW1wb3J0IGFuIEVDQyBrZXkgZnJvbSBhIGJpbmFyeSBwYWNrZXQKKyAgQHBhcmFtIGluICAgICAgVGhlIHBhY2tldCB0byBpbXBvcnQKKyAgQHBhcmFtIGlubGVuICAgVGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0CisgIEBwYXJhbSBrZXkgICAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgaW1wb3J0CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgdXBvbiBlcnJvciBhbGwgYWxsb2NhdGVkIG1lbW9yeSB3aWxsIGJlIGZyZWVkCisqLworaW50IGVjY19pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIGVjY19rZXkgKmtleSkKK3sKKyAgIHVuc2lnbmVkIGxvbmcga2V5X3NpemU7CisgICB1bnNpZ25lZCBjaGFyIGZsYWdzWzFdOworICAgaW50ICAgICAgICAgICBlcnI7CisKKyAgIExUQ19BUkdDSEsoaW4gICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CisKKyAgIC8qIGluaXQga2V5ICovCisgICBpZiAobXBfaW5pdF9tdWx0aSgma2V5LT5wdWJrZXkueCwgJmtleS0+cHVia2V5LnksICZrZXktPnB1YmtleS56LCAma2V5LT5rLCBOVUxMKSAhPSBNUF9PS0FZKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICAvKiBmaW5kIG91dCB3aGF0IHR5cGUgb2Yga2V5IGl0IGlzICovCisgICBpZiAoKGVyciA9IGRlcl9kZWNvZGVfc2VxdWVuY2VfbXVsdGkoaW4sIGlubGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9CSVRfU1RSSU5HLCAxVUwsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9FT0wsICAgICAgICAwVUwsIE5VTEwpKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBlcnJvcjsKKyAgIH0KKworCisgICBpZiAoZmxhZ3NbMF0gPT0gMSkgeworICAgICAgLyogcHJpdmF0ZSBrZXkgKi8KKyAgICAgIGtleS0+dHlwZSA9IFBLX1BSSVZBVEU7CisgICAgICBpZiAoKGVyciA9IGRlcl9kZWNvZGVfc2VxdWVuY2VfbXVsdGkoaW4sIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0JJVF9TVFJJTkcsICAgICAgMVVMLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9TSE9SVF9JTlRFR0VSLCAgIDFVTCwgJmtleV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsICAgICAgICAgMVVMLCAma2V5LT5wdWJrZXkueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAgICAgICAgIDFVTCwgJmtleS0+cHVia2V5LnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAgICAxVUwsICZrZXktPmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfRU9MLCAgICAgICAgICAgICAwVUwsIE5VTEwpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICAvKiBwdWJsaWMga2V5ICovCisgICAgICAvKiBwcml2YXRlIGtleSAqLworICAgICAga2V5LT50eXBlID0gUEtfUFVCTElDOworICAgICAgaWYgKChlcnIgPSBkZXJfZGVjb2RlX3NlcXVlbmNlX211bHRpKGluLCBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9CSVRfU1RSSU5HLCAgICAgIDFVTCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfU0hPUlRfSU5URUdFUiwgICAxVUwsICZrZXlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAgICAgICAgIDFVTCwgJmtleS0+cHVia2V5LngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgICAgICAgICAxVUwsICZrZXktPnB1YmtleS55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0VPTCwgICAgICAgICAgICAgMFVMLCBOVUxMKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICB9CisgICB9CisKKyAgIC8qIGZpbmQgdGhlIGlkeCAqLworICAgZm9yIChrZXktPmlkeCA9IDA7IHNldHNba2V5LT5pZHhdLnNpemUgJiYgKHVuc2lnbmVkIGxvbmcpc2V0c1trZXktPmlkeF0uc2l6ZSAhPSBrZXlfc2l6ZTsgKytrZXktPmlkeCk7CisgICBpZiAoc2V0c1trZXktPmlkeF0uc2l6ZSA9PSAwKSB7CisgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgIGdvdG8gZXJyb3I7CisgICB9CisKKyAgIC8qIHNldCB6ICovCisgICBtcF9zZXQoJmtleS0+cHVia2V5LnosIDEpOworCisgICAvKiB3ZSdyZSBnb29kICovCisgICByZXR1cm4gQ1JZUFRfT0s7CitlcnJvcjoKKyAgIG1wX2NsZWFyX211bHRpKCZrZXktPnB1YmtleS54LCAma2V5LT5wdWJrZXkueSwgJmtleS0+cHVia2V5LnosICZrZXktPmssIE5VTEwpOworICAgcmV0dXJuIGVycjsKK30KKworLyoqCisgIENyZWF0ZSBhbiBFQ0Mgc2hhcmVkIHNlY3JldCBiZXR3ZWVuIHR3byBrZXlzCisgIEBwYXJhbSBwcml2YXRlX2tleSAgICAgIFRoZSBwcml2YXRlIEVDQyBrZXkKKyAgQHBhcmFtIHB1YmxpY19rZXkgICAgICAgVGhlIHB1YmxpYyBrZXkKKyAgQHBhcmFtIG91dCAgICAgICAgICAgICAgW291dF0gRGVzdGluYXRpb24gb2YgdGhlIHNoYXJlZCBzZWNyZXQgKENvbmZvcm1zIHRvIEVDLURIIGZyb20gQU5TSSBYOS42MykKKyAgQHBhcmFtIG91dGxlbiAgICAgICAgICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgc2hhcmVkIHNlY3JldAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgZWNjX3NoYXJlZF9zZWNyZXQoZWNjX2tleSAqcHJpdmF0ZV9rZXksIGVjY19rZXkgKnB1YmxpY19rZXksCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4pCit7CisgICB1bnNpZ25lZCBsb25nIHg7CisgICBlY2NfcG9pbnQgKnJlc3VsdDsKKyAgIG1wX2ludCBwcmltZTsKKyAgIGludCBlcnI7CisKKyAgIExUQ19BUkdDSEsocHJpdmF0ZV9rZXkgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHB1YmxpY19rZXkgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAgICAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICAgICAgIT0gTlVMTCk7CisKKyAgIC8qIHR5cGUgdmFsaWQ/ICovCisgICBpZiAocHJpdmF0ZV9rZXktPnR5cGUgIT0gUEtfUFJJVkFURSkgeworICAgICAgcmV0dXJuIENSWVBUX1BLX05PVF9QUklWQVRFOworICAgfQorCisgICBpZiAoaXNfdmFsaWRfaWR4KHByaXZhdGVfa2V5LT5pZHgpID09IDApIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgaWYgKHByaXZhdGVfa2V5LT5pZHggIT0gcHVibGljX2tleS0+aWR4KSB7CisgICAgICByZXR1cm4gQ1JZUFRfUEtfVFlQRV9NSVNNQVRDSDsKKyAgIH0KKworICAgLyogbWFrZSBuZXcgcG9pbnQgKi8KKyAgIHJlc3VsdCA9IG5ld19wb2ludCgpOworICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICBpZiAoKGVyciA9IG1wX2luaXQoJnByaW1lKSkgIT0gTVBfT0tBWSkgeworICAgICAgZGVsX3BvaW50KHJlc3VsdCk7CisgICAgICByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworICAgfQorCisgICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJnByaW1lLCAoY2hhciAqKXNldHNbcHJpdmF0ZV9rZXktPmlkeF0ucHJpbWUsIDY0KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gZWNjX211bG1vZCgmcHJpdmF0ZV9rZXktPmssICZwdWJsaWNfa2V5LT5wdWJrZXksIHJlc3VsdCwgJnByaW1lLCAxKSkgIT0gQ1JZUFRfT0spICAgICAgIHsgZ290byBkb25lMTsgfQorCisgICB4ID0gKHVuc2lnbmVkIGxvbmcpbXBfdW5zaWduZWRfYmluX3NpemUoJnByaW1lKTsKKyAgIGlmICgqb3V0bGVuIDwgeCkgeworICAgICAgZXJyID0gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICAgICAgZ290byBkb25lMTsKKyAgIH0KKyAgIHplcm9tZW0ob3V0LCB4KTsKKyAgIGlmICgoZXJyID0gbXBfdG9fdW5zaWduZWRfYmluKCZyZXN1bHQtPngsIG91dCArICh4IC0gbXBfdW5zaWduZWRfYmluX3NpemUoJnJlc3VsdC0+eCkpKSkgICAhPSBNUF9PS0FZKSAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgZXJyICAgICA9IENSWVBUX09LOworICAgKm91dGxlbiA9IHg7CisgICBnb3RvIGRvbmUxOworZXJyb3I6CisgICBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7Citkb25lMToKKyAgIG1wX2NsZWFyKCZwcmltZSk7CisgICBkZWxfcG9pbnQocmVzdWx0KTsKKyAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICBHZXQgdGhlIHNpemUgb2YgYW4gRUNDIGtleQorICBAcGFyYW0ga2V5ICAgIFRoZSBrZXkgdG8gZ2V0IHRoZSBzaXplIG9mIAorICBAcmV0dXJuIFRoZSBzaXplIChvY3RldHMpIG9mIHRoZSBrZXkgb3IgSU5UX01BWCBvbiBlcnJvcgorKi8KK2ludCBlY2NfZ2V0X3NpemUoZWNjX2tleSAqa2V5KQoreworICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CisgICBpZiAoaXNfdmFsaWRfaWR4KGtleS0+aWR4KSkKKyAgICAgIHJldHVybiBzZXRzW2tleS0+aWR4XS5zaXplOworICAgZWxzZQorICAgICAgcmV0dXJuIElOVF9NQVg7IC8qIGxhcmdlIHZhbHVlIGtub3duIHRvIGNhdXNlIGl0IHRvIGZhaWwgd2hlbiBwYXNzZWQgdG8gZWNjX21ha2Vfa2V5KCkgKi8KK30KKworI2luY2x1ZGUgImVjY19zeXMuYyIKKworI2VuZGlmCisKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvZWNjL2VjYy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjIwICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzE0IDIwOjQyOjI4ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9lY2MvZWNjX3N5cy5jIGIvc3JjL3BrL2VjYy9lY2Nfc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlYWQzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9lY2MvZWNjX3N5cy5jCkBAIC0wLDAgKzEsNDYyIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworCisvKioKKyAgQGZpbGUgZWNjX3N5cy5jCisgIEVDQyBDcnlwdG8sIFRvbSBTdCBEZW5pcworKi8KKyAgCisvKioKKyAgRW5jcnlwdCBhIHN5bW1ldHJpYyBrZXkgd2l0aCBFQ0MgCisgIEBwYXJhbSBpbiAgICAgICAgIFRoZSBzeW1tZXRyaWMga2V5IHlvdSB3YW50IHRvIGVuY3J5cHQKKyAgQHBhcmFtIGlubGVuICAgICAgVGhlIGxlbmd0aCBvZiB0aGUga2V5IHRvIGVuY3J5cHQgKG9jdGV0cykKKyAgQHBhcmFtIG91dCAgICAgICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgY2lwaGVydGV4dAorICBAcGFyYW0gb3V0bGVuICAgICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBjaXBoZXJ0ZXh0CisgIEBwYXJhbSBwcm5nICAgICAgIEFuIGFjdGl2ZSBQUk5HIHN0YXRlCisgIEBwYXJhbSB3cHJuZyAgICAgIFRoZSBpbmRleCBvZiB0aGUgUFJORyB5b3Ugd2lzaCB0byB1c2UgCisgIEBwYXJhbSBoYXNoICAgICAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCB5b3Ugd2FudCB0byB1c2UgCisgIEBwYXJhbSBrZXkgICAgICAgIFRoZSBFQ0Mga2V5IHlvdSB3YW50IHRvIGVuY3J5cHQgdG8KKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGVjY19lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICB1bnNpZ25lZCBsb25nIGlubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsICB1bnNpZ25lZCBsb25nICpvdXRsZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgd3BybmcsIGludCBoYXNoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWNjX2tleSAqa2V5KQoreworICAgIHVuc2lnbmVkIGNoYXIgKnB1Yl9leHB0LCAqZWNjX3NoYXJlZCwgKnNrZXk7CisgICAgZWNjX2tleSAgICAgICAgcHVia2V5OworICAgIHVuc2lnbmVkIGxvbmcgIHgsIHksIHB1YmtleXNpemU7CisgICAgaW50ICAgICAgICAgICAgZXJyOworCisgICAgTFRDX0FSR0NISyhpbiAgICAgICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsob3V0ICAgICAhPSBOVUxMKTsKKyAgICBMVENfQVJHQ0hLKG91dGxlbiAgIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhrZXkgICAgICE9IE5VTEwpOworCisgICAgLyogY2hlY2sgdGhhdCB3cHJuZy9jaXBoZXIvaGFzaCBhcmUgbm90IGludmFsaWQgKi8KKyAgICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQod3BybmcpKSAhPSBDUllQVF9PSykgeworICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGhhc2gpKSAhPSBDUllQVF9PSykgeworICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKGlubGVuID4gaGFzaF9kZXNjcmlwdG9yW2hhc2hdLmhhc2hzaXplKSB7CisgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfSEFTSDsKKyAgICB9CisKKyAgICAvKiBtYWtlIGEgcmFuZG9tIGtleSBhbmQgZXhwb3J0IHRoZSBwdWJsaWMgY29weSAqLworICAgIGlmICgoZXJyID0gZWNjX21ha2Vfa2V5KHBybmcsIHdwcm5nLCBlY2NfZ2V0X3NpemUoa2V5KSwgJnB1YmtleSkpICE9IENSWVBUX09LKSB7CisgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBwdWJfZXhwdCAgID0gWE1BTExPQyhFQ0NfQlVGX1NJWkUpOworICAgIGVjY19zaGFyZWQgPSBYTUFMTE9DKEVDQ19CVUZfU0laRSk7CisgICAgc2tleSAgICAgICA9IFhNQUxMT0MoTUFYQkxPQ0tTSVpFKTsKKyAgICBpZiAocHViX2V4cHQgPT0gTlVMTCB8fCBlY2Nfc2hhcmVkID09IE5VTEwgfHwgc2tleSA9PSBOVUxMKSB7CisgICAgICAgaWYgKHB1Yl9leHB0ICE9IE5VTEwpIHsKKyAgICAgICAgICBYRlJFRShwdWJfZXhwdCk7CisgICAgICAgfQorICAgICAgIGlmIChlY2Nfc2hhcmVkICE9IE5VTEwpIHsKKyAgICAgICAgICBYRlJFRShlY2Nfc2hhcmVkKTsKKyAgICAgICB9CisgICAgICAgaWYgKHNrZXkgIT0gTlVMTCkgeworICAgICAgICAgIFhGUkVFKHNrZXkpOworICAgICAgIH0KKyAgICAgICBlY2NfZnJlZSgmcHVia2V5KTsKKyAgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgIH0KKworICAgIHB1YmtleXNpemUgPSBFQ0NfQlVGX1NJWkU7CisgICAgaWYgKChlcnIgPSBlY2NfZXhwb3J0KHB1Yl9leHB0LCAmcHVia2V5c2l6ZSwgUEtfUFVCTElDLCAmcHVia2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICBlY2NfZnJlZSgmcHVia2V5KTsKKyAgICAgICBnb3RvIExCTF9FUlI7CisgICAgfQorICAgIAorICAgIC8qIG1ha2UgcmFuZG9tIGtleSAqLworICAgIHggICAgICAgID0gRUNDX0JVRl9TSVpFOworICAgIGlmICgoZXJyID0gZWNjX3NoYXJlZF9zZWNyZXQoJnB1YmtleSwga2V5LCBlY2Nfc2hhcmVkLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICAgZWNjX2ZyZWUoJnB1YmtleSk7CisgICAgICAgZ290byBMQkxfRVJSOworICAgIH0KKyAgICBlY2NfZnJlZSgmcHVia2V5KTsKKyAgICB5ID0gTUFYQkxPQ0tTSVpFOworICAgIGlmICgoZXJyID0gaGFzaF9tZW1vcnkoaGFzaCwgZWNjX3NoYXJlZCwgeCwgc2tleSwgJnkpKSAhPSBDUllQVF9PSykgeworICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICB9CisgICAgCisgICAgLyogRW5jcnlwdCBrZXkgKi8KKyAgICBmb3IgKHggPSAwOyB4IDwgaW5sZW47IHgrKykgeworICAgICAgc2tleVt4XSBePSBpblt4XTsKKyAgICB9CisKKyAgICBlcnIgPSBkZXJfZW5jb2RlX3NlcXVlbmNlX211bHRpKG91dCwgb3V0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfT0JKRUNUX0lERU5USUZJRVIsICBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uT0lEbGVuLCAgIGhhc2hfZGVzY3JpcHRvcltoYXNoXS5PSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9PQ1RFVF9TVFJJTkcsICAgICAgIHB1YmtleXNpemUsICAgICAgICAgICAgICAgICAgICAgcHViX2V4cHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9PQ1RFVF9TVFJJTkcsICAgICAgIGlubGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgc2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0VPTCwgICAgICAgICAgICAgICAgMFVMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworTEJMX0VSUjoKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHplcm9tZW0ocHViX2V4cHQsICAgRUNDX0JVRl9TSVpFKTsKKyAgICB6ZXJvbWVtKGVjY19zaGFyZWQsIEVDQ19CVUZfU0laRSk7CisgICAgemVyb21lbShza2V5LCAgICAgICBNQVhCTE9DS1NJWkUpOworI2VuZGlmCisKKyAgICBYRlJFRShza2V5KTsKKyAgICBYRlJFRShlY2Nfc2hhcmVkKTsKKyAgICBYRlJFRShwdWJfZXhwdCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCisvKioKKyAgRGVjcnlwdCBhbiBFQ0MgZW5jcnlwdGVkIGtleQorICBAcGFyYW0gaW4gICAgICAgVGhlIGNpcGhlcnRleHQKKyAgQHBhcmFtIGlubGVuICAgIFRoZSBsZW5ndGggb2YgdGhlIGNpcGhlcnRleHQgKG9jdGV0cykKKyAgQHBhcmFtIG91dCAgICAgIFtvdXRdIFRoZSBwbGFpbnRleHQKKyAgQHBhcmFtIG91dGxlbiAgIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIHBsYWludGV4dAorICBAcGFyYW0ga2V5ICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgcHJpdmF0ZSBFQ0Mga2V5CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KK2ludCBlY2NfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nICBpbmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICBlY2Nfa2V5ICprZXkpCit7CisgICB1bnNpZ25lZCBjaGFyICplY2Nfc2hhcmVkLCAqc2tleSwgKnB1Yl9leHB0OworICAgdW5zaWduZWQgbG9uZyAgeCwgeSwgaGFzaE9JRFszMl07CisgICBpbnQgICAgICAgICAgICBoYXNoLCBlcnI7CisgICBlY2Nfa2V5ICAgICAgICBwdWJrZXk7CisgICBsdGNfYXNuMV9saXN0ICBkZWNvZGVbM107CisKKyAgIExUQ19BUkdDSEsoaW4gICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAgICE9IE5VTEwpOworCisgICAvKiByaWdodCBrZXkgdHlwZT8gKi8KKyAgIGlmIChrZXktPnR5cGUgIT0gUEtfUFJJVkFURSkgeworICAgICAgcmV0dXJuIENSWVBUX1BLX05PVF9QUklWQVRFOworICAgfQorICAgCisgICAvKiBkZWNvZGUgdG8gZmluZCBvdXQgaGFzaCAqLworICAgTFRDX1NFVF9BU04xKGRlY29kZSwgMCwgTFRDX0FTTjFfT0JKRUNUX0lERU5USUZJRVIsIGhhc2hPSUQsIHNpemVvZihoYXNoT0lEKS9zaXplb2YoaGFzaE9JRFswXSkpOworIAorICAgaWYgKChlcnIgPSBkZXJfZGVjb2RlX3NlcXVlbmNlKGluLCBpbmxlbiwgZGVjb2RlLCAxKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBmb3IgKGhhc2ggPSAwOyBoYXNoX2Rlc2NyaXB0b3JbaGFzaF0ubmFtZSAgICE9IE5VTEwgICAgICAgICAgICAgJiYgCisgICAgICAgICAgICAgICAgICAoaGFzaF9kZXNjcmlwdG9yW2hhc2hdLk9JRGxlbiAhPSBkZWNvZGVbMF0uc2l6ZSAgIHx8IAorICAgICAgICAgICAgICAgICAgIG1lbWNtcChoYXNoX2Rlc2NyaXB0b3JbaGFzaF0uT0lELCBoYXNoT0lELCBzaXplb2YodW5zaWduZWQgbG9uZykqZGVjb2RlWzBdLnNpemUpKTsgaGFzaCsrKTsKKworICAgaWYgKGhhc2hfZGVzY3JpcHRvcltoYXNoXS5uYW1lID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgIH0KKworICAgLyogd2Ugbm93IGhhdmUgdGhlIGhhc2ghICovCisKKyAgIC8qIGFsbG9jYXRlIG1lbW9yeSAqLworICAgcHViX2V4cHQgICA9IFhNQUxMT0MoRUNDX0JVRl9TSVpFKTsKKyAgIGVjY19zaGFyZWQgPSBYTUFMTE9DKEVDQ19CVUZfU0laRSk7CisgICBza2V5ICAgICAgID0gWE1BTExPQyhNQVhCTE9DS1NJWkUpOworICAgaWYgKHB1Yl9leHB0ID09IE5VTEwgfHwgZWNjX3NoYXJlZCA9PSBOVUxMIHx8IHNrZXkgPT0gTlVMTCkgeworICAgICAgaWYgKHB1Yl9leHB0ICE9IE5VTEwpIHsKKyAgICAgICAgIFhGUkVFKHB1Yl9leHB0KTsKKyAgICAgIH0KKyAgICAgIGlmIChlY2Nfc2hhcmVkICE9IE5VTEwpIHsKKyAgICAgICAgIFhGUkVFKGVjY19zaGFyZWQpOworICAgICAgfQorICAgICAgaWYgKHNrZXkgIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUoc2tleSk7CisgICAgICB9CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorICAgTFRDX1NFVF9BU04xKGRlY29kZSwgMSwgTFRDX0FTTjFfT0NURVRfU1RSSU5HLCAgICAgIHB1Yl9leHB0LCAgRUNDX0JVRl9TSVpFKTsKKyAgIExUQ19TRVRfQVNOMShkZWNvZGUsIDIsIExUQ19BU04xX09DVEVUX1NUUklORywgICAgICBza2V5LCAgICAgIE1BWEJMT0NLU0laRSk7CisKKyAgIC8qIHJlYWQgdGhlIHN0cnVjdHVyZSBpbiBub3cgKi8KKyAgIGlmICgoZXJyID0gZGVyX2RlY29kZV9zZXF1ZW5jZShpbiwgaW5sZW4sIGRlY29kZSwgMykpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisKKyAgIC8qIGltcG9ydCBFQ0Mga2V5IGZyb20gcGFja2V0ICovCisgICBpZiAoKGVyciA9IGVjY19pbXBvcnQoZGVjb2RlWzFdLmRhdGEsIGRlY29kZVsxXS5zaXplLCAmcHVia2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogbWFrZSBzaGFyZWQga2V5ICovCisgICB4ID0gRUNDX0JVRl9TSVpFOworICAgaWYgKChlcnIgPSBlY2Nfc2hhcmVkX3NlY3JldChrZXksICZwdWJrZXksIGVjY19zaGFyZWQsICZ4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGVjY19mcmVlKCZwdWJrZXkpOworICAgICAgZ290byBMQkxfRVJSOworICAgfQorICAgZWNjX2ZyZWUoJnB1YmtleSk7CisKKyAgIHkgPSBNQVhCTE9DS1NJWkU7CisgICBpZiAoKGVyciA9IGhhc2hfbWVtb3J5KGhhc2gsIGVjY19zaGFyZWQsIHgsIGVjY19zaGFyZWQsICZ5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogZW5zdXJlIHRoZSBoYXNoIG9mIHRoZSBzaGFyZWQgc2VjcmV0IGlzIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUgZW5jcnlwdCBpdHNlbGYgKi8KKyAgIGlmIChkZWNvZGVbMl0uc2l6ZSA+IHkpIHsKKyAgICAgIGVyciA9IENSWVBUX0lOVkFMSURfUEFDS0VUOworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICAvKiBhdm9pZCBidWZmZXIgb3ZlcmZsb3cgKi8KKyAgIGlmICgqb3V0bGVuIDwgZGVjb2RlWzJdLnNpemUpIHsKKyAgICAgIGVyciA9IENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogRGVjcnlwdCB0aGUga2V5ICovCisgICBmb3IgKHggPSAwOyB4IDwgZGVjb2RlWzJdLnNpemU7IHgrKykgeworICAgICBvdXRbeF0gPSBza2V5W3hdIF4gZWNjX3NoYXJlZFt4XTsKKyAgIH0KKyAgICpvdXRsZW4gPSB4OworCisgICBlcnIgPSBDUllQVF9PSzsKK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKHB1Yl9leHB0LCAgIEVDQ19CVUZfU0laRSk7CisgICB6ZXJvbWVtKGVjY19zaGFyZWQsIEVDQ19CVUZfU0laRSk7CisgICB6ZXJvbWVtKHNrZXksICAgICAgIE1BWEJMT0NLU0laRSk7CisjZW5kaWYKKworICAgWEZSRUUocHViX2V4cHQpOworICAgWEZSRUUoZWNjX3NoYXJlZCk7CisgICBYRlJFRShza2V5KTsKKworICAgcmV0dXJuIGVycjsKK30KKworLyoqCisgIFNpZ24gYSBtZXNzYWdlIGRpZ2VzdAorICBAcGFyYW0gaW4gICAgICAgIFRoZSBtZXNzYWdlIGRpZ2VzdCB0byBzaWduCisgIEBwYXJhbSBpbmxlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgZGlnZXN0CisgIEBwYXJhbSBvdXQgICAgICAgW291dF0gVGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgc2lnbmF0dXJlCisgIEBwYXJhbSBvdXRsZW4gICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgc2lnbmF0dXJlCisgIEBwYXJhbSBwcm5nICAgICAgQW4gYWN0aXZlIFBSTkcgc3RhdGUKKyAgQHBhcmFtIHdwcm5nICAgICBUaGUgaW5kZXggb2YgdGhlIFBSTkcgeW91IHdpc2ggdG8gdXNlCisgIEBwYXJhbSBrZXkgICAgICAgQSBwcml2YXRlIEVDQyBrZXkKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IGVjY19zaWduX2hhc2goY29uc3QgdW5zaWduZWQgY2hhciAqaW4sICB1bnNpZ25lZCBsb25nIGlubGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBybmdfc3RhdGUgKnBybmcsIGludCB3cHJuZywgZWNjX2tleSAqa2V5KQoreworICAgZWNjX2tleSAgICAgICBwdWJrZXk7CisgICBtcF9pbnQgICAgICAgIHIsIHMsIGUsIHA7CisgICBpbnQgICAgICAgICAgIGVycjsKKworICAgTFRDX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7CisKKyAgIC8qIGlzIHRoaXMgYSBwcml2YXRlIGtleT8gKi8KKyAgIGlmIChrZXktPnR5cGUgIT0gUEtfUFJJVkFURSkgeworICAgICAgcmV0dXJuIENSWVBUX1BLX05PVF9QUklWQVRFOworICAgfQorICAgCisgICAvKiBpcyB0aGUgSURYIHZhbGlkID8gICovCisgICBpZiAoaXNfdmFsaWRfaWR4KGtleS0+aWR4KSAhPSAxKSB7CisgICAgICByZXR1cm4gQ1JZUFRfUEtfSU5WQUxJRF9UWVBFOworICAgfQorICAgCisgICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQod3BybmcpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogZ2V0IHRoZSBoYXNoIGFuZCBsb2FkIGl0IGFzIGEgYmlnbnVtIGludG8gJ2UnICovCisgICAvKiBpbml0IHRoZSBiaWdudW1zICovCisgICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJnIsICZzLCAmcCwgJmUsIE5VTEwpKSAhPSBNUF9PS0FZKSB7IAorICAgICAgZWNjX2ZyZWUoJnB1YmtleSk7CisgICAgICBlcnIgPSBtcGlfdG9fbHRjX2Vycm9yKGVycik7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisgICBpZiAoKGVyciA9IG1wX3JlYWRfcmFkaXgoJnAsIChjaGFyICopc2V0c1trZXktPmlkeF0ub3JkZXIsIDY0KSkgIT0gTVBfT0tBWSkgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbigmZSwgKHVuc2lnbmVkIGNoYXIgKilpbiwgKGludClpbmxlbikpICE9IE1QX09LQVkpICB7IGdvdG8gZXJyb3I7IH0KKworICAgLyogbWFrZSB1cCBhIGtleSBhbmQgZXhwb3J0IHRoZSBwdWJsaWMgY29weSAqLworICAgZm9yICg7OykgeworICAgICAgaWYgKChlcnIgPSBlY2NfbWFrZV9rZXkocHJuZywgd3BybmcsIGVjY19nZXRfc2l6ZShrZXkpLCAmcHVia2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgIHJldHVybiBlcnI7CisgICAgICB9CisKKyAgICAgIC8qIGZpbmQgciA9IHgxIG1vZCBuICovCisgICAgICBpZiAoKGVyciA9IG1wX21vZCgmcHVia2V5LnB1YmtleS54LCAmcCwgJnIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICAgICBpZiAobXBfaXN6ZXJvKCZyKSkgeworICAgICAgICAgZWNjX2ZyZWUoJnB1YmtleSk7CisgICAgICB9IGVsc2UgeyAKKyAgICAgICAgLyogZmluZCBzID0gKGUgKyB4cikvayAqLworICAgICAgICBpZiAoKGVyciA9IG1wX2ludm1vZCgmcHVia2V5LmssICZwLCAmcHVia2V5LmspKSAhPSBNUF9PS0FZKSAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiBrID0gMS9rICovCisgICAgICAgIGlmICgoZXJyID0gbXBfbXVsbW9kKCZrZXktPmssICZyLCAmcCwgJnMpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9IC8qIHMgPSB4ciAqLworICAgICAgICBpZiAoKGVyciA9IG1wX2FkZG1vZCgmZSwgJnMsICZwLCAmcykpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiBzID0gZSArICB4ciAqLworICAgICAgICBpZiAoKGVyciA9IG1wX211bG1vZCgmcywgJnB1YmtleS5rLCAmcCwgJnMpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfSAvKiBzID0gKGUgKyB4cikvayAqLworCisgICAgICAgIGlmIChtcF9pc3plcm8oJnMpKSB7CisgICAgICAgICAgIGVjY19mcmVlKCZwdWJrZXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgfQorCisgICAvKiBzdG9yZSBhcyBTRVFVRU5DRSB7IHIsIHMgLS0gaW50ZWdlciB9ICovCisgICBlcnIgPSBkZXJfZW5jb2RlX3NlcXVlbmNlX211bHRpKG91dCwgb3V0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9FT0wsIDBVTCwgTlVMTCk7CisgICBnb3RvIExCTF9FUlI7CitlcnJvcjoKKyAgIGVyciA9IG1waV90b19sdGNfZXJyb3IoZXJyKTsKK0xCTF9FUlI6CisgICBtcF9jbGVhcl9tdWx0aSgmciwgJnMsICZwLCAmZSwgTlVMTCk7CisgICBlY2NfZnJlZSgmcHVia2V5KTsKKworICAgcmV0dXJuIGVycjsgICAKK30KKworLyogdmVyaWZ5IAorICoKKyAqIHcgID0gc14tMSBtb2QgbgorICogdTEgPSB4dyAKKyAqIHUyID0gcncKKyAqIFggPSB1MSpHICsgdTIqUQorICogdiA9IFhfeDEgbW9kIG4KKyAqIGFjY2VwdCBpZiB2ID09IHIKKyAqLworCisvKioKKyAgIFZlcmlmeSBhbiBFQ0Mgc2lnbmF0dXJlCisgICBAcGFyYW0gc2lnICAgICAgICAgVGhlIHNpZ25hdHVyZSB0byB2ZXJpZnkKKyAgIEBwYXJhbSBzaWdsZW4gICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzaWduYXR1cmUgKG9jdGV0cykKKyAgIEBwYXJhbSBoYXNoICAgICAgICBUaGUgaGFzaCAobWVzc2FnZSBkaWdlc3QpIHRoYXQgd2FzIHNpZ25lZAorICAgQHBhcmFtIGhhc2hsZW4gICAgIFRoZSBsZW5ndGggb2YgdGhlIGhhc2ggKG9jdGV0cykKKyAgIEBwYXJhbSBzdGF0ICAgICAgICBSZXN1bHQgb2Ygc2lnbmF0dXJlLCAxPT12YWxpZCwgMD09aW52YWxpZAorICAgQHBhcmFtIGtleSAgICAgICAgIFRoZSBjb3JyZXNwb25kaW5nIHB1YmxpYyBFQ0Mga2V5CisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwgKGV2ZW4gaWYgdGhlIHNpZ25hdHVyZSBpcyBub3QgdmFsaWQpCisqLworaW50IGVjY192ZXJpZnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsICB1bnNpZ25lZCBsb25nIHNpZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaGFzaCwgdW5zaWduZWQgbG9uZyBoYXNobGVuLCAKKyAgICAgICAgICAgICAgICAgICAgaW50ICpzdGF0LCBlY2Nfa2V5ICprZXkpCit7CisgICBlY2NfcG9pbnQgICAgKm1HLCAqbVE7CisgICBtcF9pbnQgICAgICAgIHIsIHMsIHYsIHcsIHUxLCB1MiwgZSwgcCwgbTsKKyAgIG1wX2RpZ2l0ICAgICAgbXA7CisgICBpbnQgICAgICAgICAgIGVycjsKKworICAgTFRDX0FSR0NISyhzaWcgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhoYXNoICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhzdGF0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICE9IE5VTEwpOworCisgICAvKiBkZWZhdWx0IHRvIGludmFsaWQgc2lnbmF0dXJlICovCisgICAqc3RhdCA9IDA7CisKKyAgIC8qIGlzIHRoZSBJRFggdmFsaWQgPyAgKi8KKyAgIGlmIChpc192YWxpZF9pZHgoa2V5LT5pZHgpICE9IDEpIHsKKyAgICAgIHJldHVybiBDUllQVF9QS19JTlZBTElEX1RZUEU7CisgICB9CisKKyAgIC8qIGFsbG9jYXRlIGludHMgKi8KKyAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgmciwgJnMsICZ2LCAmdywgJnUxLCAmdTIsICZwLCAmZSwgJm0sIE5VTEwpKSAhPSBNUF9PS0FZKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICAvKiBhbGxvY2F0ZSBwb2ludHMgKi8KKyAgIG1HID0gbmV3X3BvaW50KCk7CisgICBtUSA9IG5ld19wb2ludCgpOworICAgaWYgKG1RICA9PSBOVUxMIHx8IG1HID09IE5VTEwpIHsKKyAgICAgIGVyciA9IENSWVBUX01FTTsKKyAgICAgIGdvdG8gZG9uZTsKKyAgIH0KKworICAgLyogcGFyc2UgaGVhZGVyICovCisgICBpZiAoKGVyciA9IGRlcl9kZWNvZGVfc2VxdWVuY2VfbXVsdGkoc2lnLCBzaWdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0VPTCwgMFVMLCBOVUxMKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gZG9uZTsKKyAgIH0KKworICAgLyogZ2V0IHRoZSBvcmRlciAqLworICAgaWYgKChlcnIgPSBtcF9yZWFkX3JhZGl4KCZwLCAoY2hhciAqKXNldHNba2V5LT5pZHhdLm9yZGVyLCA2NCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisKKyAgIC8qIGdldCB0aGUgbW9kdWx1cyAqLworICAgaWYgKChlcnIgPSBtcF9yZWFkX3JhZGl4KCZtLCAoY2hhciAqKXNldHNba2V5LT5pZHhdLnByaW1lLCA2NCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisKKyAgIC8qIGNoZWNrIGZvciB6ZXJvICovCisgICBpZiAobXBfaXN6ZXJvKCZyKSB8fCBtcF9pc3plcm8oJnMpIHx8IG1wX2NtcCgmciwgJnApICE9IE1QX0xUIHx8IG1wX2NtcCgmcywgJnApICE9IE1QX0xUKSB7CisgICAgICBlcnIgPSBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgICAgIGdvdG8gZG9uZTsKKyAgIH0KKworICAgLyogcmVhZCBoYXNoICovCisgICBpZiAoKGVyciA9IG1wX3JlYWRfdW5zaWduZWRfYmluKCZlLCAodW5zaWduZWQgY2hhciAqKWhhc2gsIChpbnQpaGFzaGxlbikpICE9IE1QX09LQVkpICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgLyogIHcgID0gc14tMSBtb2QgbiAqLworICAgaWYgKChlcnIgPSBtcF9pbnZtb2QoJnMsICZwLCAmdykpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisKKyAgIC8qIHUxID0gZXcgKi8KKyAgIGlmICgoZXJyID0gbXBfbXVsbW9kKCZlLCAmdywgJnAsICZ1MSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICAvKiB1MiA9IHJ3ICovCisgICBpZiAoKGVyciA9IG1wX211bG1vZCgmciwgJncsICZwLCAmdTIpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgLyogZmluZCBtRyA9IHUxKkcgKi8KKyAgIGlmICgoZXJyID0gbXBfcmVhZF9yYWRpeCgmbUctPngsIChjaGFyICopc2V0c1trZXktPmlkeF0uR3gsIDY0KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9yZWFkX3JhZGl4KCZtRy0+eSwgKGNoYXIgKilzZXRzW2tleS0+aWR4XS5HeSwgNjQpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBtcF9zZXQoJm1HLT56LCAxKTsgIAorICAgaWYgKChlcnIgPSBlY2NfbXVsbW9kKCZ1MSwgbUcsIG1HLCAmbSwgMCkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGRvbmU7IH0KKworICAgLyogZmluZCBtUSA9IHUyKlEgKi8KKyAgIGlmICgoZXJyID0gbXBfY29weSgma2V5LT5wdWJrZXkueCwgJm1RLT54KSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorICAgaWYgKChlcnIgPSBtcF9jb3B5KCZrZXktPnB1YmtleS55LCAmbVEtPnkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICBpZiAoKGVyciA9IG1wX2NvcHkoJmtleS0+cHVia2V5LnosICZtUS0+eikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIGlmICgoZXJyID0gZWNjX211bG1vZCgmdTIsIG1RLCBtUSwgJm0sIDApKSAhPSBDUllQVF9PSykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBkb25lOyB9CisgIAorICAgLyogZmluZCB0aGUgbW9udGdvbWVyeSBtcCAqLworICAgaWYgKChlcnIgPSBtcF9tb250Z29tZXJ5X3NldHVwKCZtLCAmbXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICAvKiBhZGQgdGhlbSAqLworICAgaWYgKChlcnIgPSBhZGRfcG9pbnQobVEsIG1HLCBtRywgJm0sIG1wKSkgIT0gQ1JZUFRfT0spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGRvbmU7IH0KKyAgIAorICAgLyogcmVkdWNlICovCisgICBpZiAoKGVyciA9IGVjY19tYXAobUcsICZtLCBtcCkpICE9IENSWVBUX09LKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZG9uZTsgfQorCisgICAvKiB2ID0gWF94MSBtb2QgbiAqLworICAgaWYgKChlcnIgPSBtcF9tb2QoJm1HLT54LCAmcCwgJnYpKSAhPSBDUllQVF9PSykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGRvbmU7IH0KKworICAgLyogZG9lcyB2ID09IHIgKi8KKyAgIGlmIChtcF9jbXAoJnYsICZyKSA9PSBNUF9FUSkgeworICAgICAgKnN0YXQgPSAxOworICAgfQorCisgICAvKiBjbGVhciB1cCBhbmQgcmV0dXJuICovCisgICBlcnIgPSBDUllQVF9PSzsKKyAgIGdvdG8gZG9uZTsKK2Vycm9yOgorICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworZG9uZToKKyAgIGRlbF9wb2ludChtRyk7CisgICBkZWxfcG9pbnQobVEpOworICAgbXBfY2xlYXJfbXVsdGkoJnIsICZzLCAmdiwgJncsICZ1MSwgJnUyLCAmcCwgJmUsICZtLCBOVUxMKTsKKyAgIHJldHVybiBlcnI7Cit9CisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL2VjYy9lY2Nfc3lzLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMTggJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTQgMjA6NDc6NTUgJCAqLwpkaWZmIC0tZ2l0IGEvcGFja2V0X3N0b3JlX2hlYWRlci5jIGIvc3JjL3BrL3BhY2tldF9zdG9yZV9oZWFkZXIuYwpzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSBwYWNrZXRfc3RvcmVfaGVhZGVyLmMKcmVuYW1lIHRvIHNyYy9way9wYWNrZXRfc3RvcmVfaGVhZGVyLmMKaW5kZXggZDc1MDcxOC4uODU1Y2E3MCAxMDA2NDQKLS0tIGEvcGFja2V0X3N0b3JlX2hlYWRlci5jCisrKyBiL3NyYy9way9wYWNrZXRfc3RvcmVfaGVhZGVyLmMKQEAgLTYsMTUgKzYsMTUgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKKyNpbmNsdWRlICJ0b21jcnlwdC5oIgogCiAjaWZkZWYgUEFDS0VUCiAKIHZvaWQgcGFja2V0X3N0b3JlX2hlYWRlcih1bnNpZ25lZCBjaGFyICpkc3QsIGludCBzZWN0aW9uLCBpbnQgc3Vic2VjdGlvbikKIHsKLSAgIF9BUkdDSEsoZHN0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhkc3QgIT0gTlVMTCk7CiAKICAgIC8qIHN0b3JlIHZlcnNpb24gbnVtYmVyICovCiAgICBkc3RbMF0gPSAodW5zaWduZWQgY2hhcikoQ1JZUFQmMjU1KTsKQEAgLTI3LDMgKzI3LDcgQEAKIH0KIAogI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9wYWNrZXRfc3RvcmVfaGVhZGVyLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9wYWNrZXRfdmFsaWRfaGVhZGVyLmMgYi9zcmMvcGsvcGFja2V0X3ZhbGlkX2hlYWRlci5jCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIHBhY2tldF92YWxpZF9oZWFkZXIuYwpyZW5hbWUgdG8gc3JjL3BrL3BhY2tldF92YWxpZF9oZWFkZXIuYwppbmRleCA3ZmRhNTA3Li41OWRiMGY3IDEwMDY0NAotLS0gYS9wYWNrZXRfdmFsaWRfaGVhZGVyLmMKKysrIGIvc3JjL3BrL3BhY2tldF92YWxpZF9oZWFkZXIuYwpAQCAtNiw5ICs2LDkgQEAKICAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCiAgKiBndWFyYW50ZWUgaXQgd29ya3MuCiAgKgotICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGlhaHUuY2EsIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKICAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKKyNpbmNsdWRlICJ0b21jcnlwdC5oIgogCiAjaWZkZWYgUEFDS0VUCiAKQEAgLTE2LDcgKzE2LDcgQEAKIHsKICAgIHVuc2lnbmVkIGxvbmcgdmVyOwogCi0gICBfQVJHQ0hLKHNyYyAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoc3JjICE9IE5VTEwpOwogCiAgICAvKiBjaGVjayB2ZXJzaW9uICovCiAgICB2ZXIgPSAoKHVuc2lnbmVkIGxvbmcpc3JjWzBdKSB8ICgodW5zaWduZWQgbG9uZylzcmNbMV0gPDwgOFUpOwpAQCAtMzUsMyArMzUsNyBAQAogI2VuZGlmCiAKICAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL3BhY2tldF92YWxpZF9oZWFkZXIuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3BrY3NfMV9pMm9zcC5jIGIvc3JjL3BrL3BrY3MxL3BrY3NfMV9pMm9zcC5jCnNpbWlsYXJpdHkgaW5kZXggNjAlCnJlbmFtZSBmcm9tIHBrY3NfMV9pMm9zcC5jCnJlbmFtZSB0byBzcmMvcGsvcGtjczEvcGtjc18xX2kyb3NwLmMKaW5kZXggMWE3ZmFkZC4uM2U2OGViOCAxMDA2NDQKLS0tIGEvcGtjc18xX2kyb3NwLmMKKysrIGIvc3JjL3BrL3BrY3MxL3BrY3NfMV9pMm9zcC5jCkBAIC02LDE3ICs2LDI4IEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKIAotLyogSW50ZWdlciB0byBPY3RldCBJMk9TUCAtLSBUb20gU3QgRGVuaXMgKi8KKy8qKiAKKyAgQGZpbGUgcGtjc18xX2kyb3NwLmMKKyAgSW50ZWdlciB0byBPY3RldCBJMk9TUCwgVG9tIFN0IERlbmlzIAorKi8KIAogI2lmZGVmIFBLQ1NfMQogCiAvKiBhbHdheXMgc3RvcmVzIHRoZSBzYW1lICMgb2YgYnl0ZXMsIHBhZHMgd2l0aCBsZWFkaW5nIHplcm8gYnl0ZXMKICAgIGFzIHJlcXVpcmVkCiAgKi8KKworLyoqCisgICBQS0NTICMxIEludGVnZXIgdG8gYmluYXJ5CisgICBAcGFyYW0gbiAgICAgICAgICAgICBUaGUgaW50ZWdlciB0byBzdG9yZQorICAgQHBhcmFtIG1vZHVsdXNfbGVuICAgVGhlIGxlbmd0aCBvZiB0aGUgUlNBIG1vZHVsdXMKKyAgIEBwYXJhbSBvdXQgICAgICAgICAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGludGVnZXIKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8KIGludCBwa2NzXzFfaTJvc3AobXBfaW50ICpuLCB1bnNpZ25lZCBsb25nIG1vZHVsdXNfbGVuLCB1bnNpZ25lZCBjaGFyICpvdXQpCiB7CiAgICBpbnQgZXJyOwpAQCAtMzgsMyArNDksNyBAQAogCiAjZW5kaWYgLyogUEtDU18xICovCiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL3BrY3MxL3BrY3NfMV9pMm9zcC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL3BrY3MxL3BrY3NfMV9tZ2YxLmMgYi9zcmMvcGsvcGtjczEvcGtjc18xX21nZjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWM3NDk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL3BrY3MxL3BrY3NfMV9tZ2YxLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqIAorICBAZmlsZSBwa2NzXzFfbWdmMS5jCisgIFRoZSBNYXNrIEdlbmVyYXRpb24gRnVuY3Rpb24gKE1HRjEpIGZvciBQS0NTICMxLCBUb20gU3QgRGVuaXMgCisqLworCisjaWZkZWYgUEtDU18xCisKKy8qKgorICAgUGVyZm9ybSBQS0NTICMxIE1HRjEgKGludGVybmFsKQorICAgQHBhcmFtIHNlZWQgICAgICAgIFRoZSBzZWVkIGZvciBNR0YxCisgICBAcGFyYW0gc2VlZGxlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2VlZAorICAgQHBhcmFtIGhhc2hfaWR4ICAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCBkZXNpcmVkCisgICBAcGFyYW0gbWFzayAgICAgICAgW291dF0gVGhlIGRlc3RpbmF0aW9uCisgICBAcGFyYW0gbWFza2xlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgbWFzayBkZXNpcmVkCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgcGtjc18xX21nZjEoY29uc3QgdW5zaWduZWQgY2hhciAqc2VlZCwgdW5zaWduZWQgbG9uZyBzZWVkbGVuLAorICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhhc2hfaWR4LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm1hc2ssIHVuc2lnbmVkIGxvbmcgbWFza2xlbikKK3sKKyAgIHVuc2lnbmVkIGxvbmcgaExlbiwgeDsKKyAgIHVsb25nMzIgICAgICAgY291bnRlcjsKKyAgIGludCAgICAgICAgICAgZXJyOworICAgaGFzaF9zdGF0ZSAgICAqbWQ7CisgICB1bnNpZ25lZCBjaGFyICpidWY7CisgCisgICBMVENfQVJHQ0hLKHNlZWQgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG1hc2sgIT0gTlVMTCk7CisKKyAgIC8qIGVuc3VyZSB2YWxpZCBoYXNoICovCisgICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaF9pZHgpKSAhPSBDUllQVF9PSykgeyAKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIC8qIGdldCBoYXNoIG91dHB1dCBzaXplICovCisgICBoTGVuID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5oYXNoc2l6ZTsKKworICAgLyogYWxsb2NhdGUgbWVtb3J5ICovCisgICBtZCAgPSBYTUFMTE9DKHNpemVvZihoYXNoX3N0YXRlKSk7CisgICBidWYgPSBYTUFMTE9DKGhMZW4pOworICAgaWYgKG1kID09IE5VTEwgfHwgYnVmID09IE5VTEwpIHsKKyAgICAgIGlmIChtZCAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShtZCk7CisgICAgICB9CisgICAgICBpZiAoYnVmICE9IE5VTEwpIHsKKyAgICAgICAgIFhGUkVFKGJ1Zik7CisgICAgICB9CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICAvKiBzdGFydCBjb3VudGVyICovCisgICBjb3VudGVyID0gMDsKKworICAgd2hpbGUgKG1hc2tsZW4gPiAwKSB7CisgICAgICAgLyogaGFuZGxlIGNvdW50ZXIgKi8KKyAgICAgICBTVE9SRTMySChjb3VudGVyLCBidWYpOworICAgICAgICsrY291bnRlcjsKKworICAgICAgIC8qIGdldCBoYXNoIG9mIHNlZWQgfHwgY291bnRlciAqLworICAgICAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5pbml0KG1kKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgfQorICAgICAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5wcm9jZXNzKG1kLCBzZWVkLCBzZWVkbGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICAgfQorICAgICAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5wcm9jZXNzKG1kLCBidWYsIDQpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgICB9CisgICAgICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLmRvbmUobWQsIGJ1ZikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgIH0KKworICAgICAgIC8qIHN0b3JlIGl0ICovCisgICAgICAgZm9yICh4ID0gMDsgeCA8IGhMZW4gJiYgbWFza2xlbiA+IDA7IHgrKywgbWFza2xlbi0tKSB7CisgICAgICAgICAgKm1hc2srKyA9IGJ1Zlt4XTsKKyAgICAgICB9CisgICB9CisKKyAgIGVyciA9IENSWVBUX09LOworTEJMX0VSUjoKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKKyAgIHplcm9tZW0oYnVmLCBoTGVuKTsKKyAgIHplcm9tZW0obWQsICBzaXplb2YoaGFzaF9zdGF0ZSkpOworI2VuZGlmCisKKyAgIFhGUkVFKGJ1Zik7CisgICBYRlJFRShtZCk7CisKKyAgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvKiBQS0NTXzEgKi8KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL3BrY3MxL3BrY3NfMV9tZ2YxLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvcGtjczEvcGtjc18xX29hZXBfZGVjb2RlLmMgYi9zcmMvcGsvcGtjczEvcGtjc18xX29hZXBfZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0OTMxYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9wa2NzMS9wa2NzXzFfb2FlcF9kZWNvZGUuYwpAQCAtMCwwICsxLDE4OCBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKiogCisgIEBmaWxlIHBrY3NfMV9vYWVwX2RlY29kZS5jCisgIE9BRVAgUGFkZGluZyBmb3IgUEtDUyAjMSwgVG9tIFN0IERlbmlzIAorKi8KKworI2lmZGVmIFBLQ1NfMQorCisvKioKKyAgIFBLQ1MgIzEgdjIuMDAgT0FFUCBkZWNvZGUKKyAgIEBwYXJhbSBtc2cgICAgICAgICAgICAgIFRoZSBlbmNvZGVkIGRhdGEgdG8gZGVjb2RlCisgICBAcGFyYW0gbXNnbGVuICAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBlbmNvZGVkIGRhdGEgKG9jdGV0cykKKyAgIEBwYXJhbSBscGFyYW0gICAgICAgICAgIFRoZSBzZXNzaW9uIG9yIHN5c3RlbSBkYXRhIChjYW4gYmUgTlVMTCkKKyAgIEBwYXJhbSBscGFyYW1sZW4gICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGxwYXJhbQorICAgQHBhcmFtIG1vZHVsdXNfYml0bGVuICAgVGhlIGJpdCBsZW5ndGggb2YgdGhlIFJTQSBtb2R1bHVzCisgICBAcGFyYW0gaGFzaF9pZHggICAgICAgICBUaGUgaW5kZXggb2YgdGhlIGhhc2ggZGVzaXJlZAorICAgQHBhcmFtIG91dCAgICAgICAgICAgICAgW291dF0gRGVzdGluYXRpb24gb2YgZGVjb2RpbmcKKyAgIEBwYXJhbSBvdXRsZW4gICAgICAgICAgIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIGRlY29kaW5nCisgICBAcGFyYW0gcmVzICAgICAgICAgICAgICBbb3V0XSBSZXN1bHQgb2YgZGVjb2RpbmcsIDE9PXZhbGlkLCAwPT1pbnZhbGlkCisgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwgKGV2ZW4gaWYgaW52YWxpZCkKKyovCitpbnQgcGtjc18xX29hZXBfZGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZywgICAgdW5zaWduZWQgbG9uZyBtc2dsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxwYXJhbSwgdW5zaWduZWQgbG9uZyBscGFyYW1sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19iaXRsZW4sIGludCBoYXNoX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgKnJlcykKK3sKKyAgIHVuc2lnbmVkIGNoYXIgKkRCLCAqc2VlZCwgKm1hc2s7CisgICB1bnNpZ25lZCBsb25nIGhMZW4sIHgsIHksIG1vZHVsdXNfbGVuOworICAgaW50ICAgICAgICAgICBlcnI7CisKKyAgIExUQ19BUkdDSEsobXNnICAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocmVzICAgICE9IE5VTEwpOworCisgICAvKiBkZWZhdWx0IHRvIGludmFsaWQgcGFja2V0ICovCisgICAqcmVzID0gMDsKKyAgIAorICAgLyogdGVzdCB2YWxpZCBoYXNoICovCisgICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaF9pZHgpKSAhPSBDUllQVF9PSykgeyAKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBoTGVuICAgICAgICA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0uaGFzaHNpemU7CisgICBtb2R1bHVzX2xlbiA9IChtb2R1bHVzX2JpdGxlbiA+PiAzKSArIChtb2R1bHVzX2JpdGxlbiAmIDcgPyAxIDogMCk7CisKKyAgIC8qIHRlc3QgaGFzaC9tZXNzYWdlIHNpemUgKi8KKyAgIGlmICgoMipoTGVuID49IChtb2R1bHVzX2xlbiAtIDIpKSB8fCAobXNnbGVuICE9IG1vZHVsdXNfbGVuKSkgeworICAgICAgcmV0dXJuIENSWVBUX1BLX0lOVkFMSURfU0laRTsKKyAgIH0KKworICAgLyogYWxsb2NhdGUgcmFtIGZvciBEQi9tYXNrL3NhbHQgb2Ygc2l6ZSBtb2R1bHVzX2xlbiAqLworICAgREIgICA9IFhNQUxMT0MobW9kdWx1c19sZW4pOworICAgbWFzayA9IFhNQUxMT0MobW9kdWx1c19sZW4pOworICAgc2VlZCA9IFhNQUxMT0MoaExlbik7CisgICBpZiAoREIgPT0gTlVMTCB8fCBtYXNrID09IE5VTEwgfHwgc2VlZCA9PSBOVUxMKSB7CisgICAgICBpZiAoREIgIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUoREIpOworICAgICAgfQorICAgICAgaWYgKG1hc2sgIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUobWFzayk7CisgICAgICB9CisgICAgICBpZiAoc2VlZCAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShzZWVkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDUllQVF9NRU07CisgICB9CisKKyAgIC8qIG9rIHNvIGl0J3Mgbm93IGluIHRoZSBmb3JtCisgIAorICAgICAgMHgwMCAgfHwgbWFza2Vkc2VlZCB8fCBtYXNrZWREQiAKKyAgCisgICAgICAgMSAgICB8fCAgIGhMZW4gICAgIHx8ICBtb2R1bHVzX2xlbiAtIGhMZW4gLSAxCisgICAKKyAgICAqLworCisgICAvKiBtdXN0IGhhdmUgbGVhZGluZyAweDAwIGJ5dGUgKi8KKyAgIGlmIChtc2dbMF0gIT0gMHgwMCkgeworICAgICAgZXJyID0gQ1JZUFRfT0s7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisKKyAgIC8qIG5vdyByZWFkIHRoZSBtYXNrZWQgc2VlZCAqLworICAgeCA9IDE7CisgICBYTUVNQ1BZKHNlZWQsIG1zZyArIHgsIGhMZW4pOworICAgeCArPSBoTGVuOworCisgICAvKiBub3cgcmVhZCB0aGUgbWFza2VkIERCICovCisgICBYTUVNQ1BZKERCLCBtc2cgKyB4LCBtb2R1bHVzX2xlbiAtIGhMZW4gLSAxKTsKKyAgIHggKz0gbW9kdWx1c19sZW4gLSBoTGVuIC0gMTsKKworICAgLyogY29tcHV0ZSBNR0YxIG9mIG1hc2tlZERCIChoTGVuKSAqLyAKKyAgIGlmICgoZXJyID0gcGtjc18xX21nZjEoREIsIG1vZHVsdXNfbGVuIC0gaExlbiAtIDEsIGhhc2hfaWR4LCBtYXNrLCBoTGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogWE9SIGFnYWluc3Qgc2VlZCAqLworICAgZm9yICh5ID0gMDsgeSA8IGhMZW47IHkrKykgeworICAgICAgc2VlZFt5XSBePSBtYXNrW3ldOworICAgfQorCisgICAvKiBjb21wdXRlIE1HRjEgb2Ygc2VlZCAoayAtIGhsZW4gLSAxKSAqLworICAgaWYgKChlcnIgPSBwa2NzXzFfbWdmMShzZWVkLCBoTGVuLCBoYXNoX2lkeCwgbWFzaywgbW9kdWx1c19sZW4gLSBoTGVuIC0gMSkpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisKKyAgIC8qIHhvciBhZ2FpbnN0IERCICovCisgICBmb3IgKHkgPSAwOyB5IDwgKG1vZHVsdXNfbGVuIC0gaExlbiAtIDEpOyB5KyspIHsKKyAgICAgICBEQlt5XSBePSBtYXNrW3ldOyAKKyAgIH0KKworICAgLyogbm93IERCID09IGxoYXNoIHx8IFBTIHx8IDB4MDEgfHwgTSwgUFMgPT0gayAtIG1sZW4gLSAyaGxlbiAtIDIgemVyb2VzICovCisKKyAgIC8qIGNvbXB1dGUgbGhhc2ggYW5kIHN0b3JlIGl0IGluIHNlZWQgW3JldXNlIHRlbXBzIV0gKi8KKyAgIHggPSBtb2R1bHVzX2xlbjsKKyAgIGlmIChscGFyYW0gIT0gTlVMTCkgeworICAgICAgaWYgKChlcnIgPSBoYXNoX21lbW9yeShoYXNoX2lkeCwgbHBhcmFtLCBscGFyYW1sZW4sIHNlZWQsICZ4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICAvKiBjYW4ndCBwYXNzIGhhc2hfbWVtb3J5IGEgTlVMTCBzbyB1c2UgREIgd2l0aCB6ZXJvIGxlbmd0aCAqLworICAgICAgaWYgKChlcnIgPSBoYXNoX21lbW9yeShoYXNoX2lkeCwgREIsIDAsIHNlZWQsICZ4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgIH0KKyAgIH0KKworICAgLyogY29tcGFyZSB0aGUgbGhhc2gnZXMgKi8KKyAgIGlmIChtZW1jbXAoc2VlZCwgREIsIGhMZW4pICE9IDApIHsKKyAgICAgIGVyciA9IENSWVBUX09LOworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICAvKiBub3cgemVyb2VzIGJlZm9yZSBhIDB4MDEgKi8KKyAgIGZvciAoeCA9IGhMZW47IHggPCAobW9kdWx1c19sZW4gLSBoTGVuIC0gMSkgJiYgREJbeF0gPT0gMHgwMDsgeCsrKSB7CisgICAgICAvKiBzdGVwLi4uICovCisgICB9CisKKyAgIC8qIGVycm9yIG91dCBpZiB3YXNuJ3QgMHgwMSAqLworICAgaWYgKHggPT0gKG1vZHVsdXNfbGVuIC0gaExlbiAtIDEpIHx8IERCW3hdICE9IDB4MDEpIHsKKyAgICAgIGVyciA9IENSWVBUX09LOworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICAvKiByZXN0IGlzIHRoZSBtZXNzYWdlIChhbmQgc2tpcCAweDAxKSAqLworICAgaWYgKChtb2R1bHVzX2xlbiAtIGhMZW4gLSAxKSAtICsreCA+ICpvdXRsZW4pIHsKKyAgICAgIGVyciA9IENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogY29weSBtZXNzYWdlICovCisgICAqb3V0bGVuID0gKG1vZHVsdXNfbGVuIC0gaExlbiAtIDEpIC0geDsKKyAgIFhNRU1DUFkob3V0LCBEQiArIHgsIG1vZHVsdXNfbGVuIC0gaExlbiAtIDEgLSB4KTsKKyAgIHggKz0gbW9kdWx1c19sZW4gLSBoTGVuIC0gMTsKKworICAgLyogdmFsaWQgcGFja2V0ICovCisgICAqcmVzID0gMTsKKworICAgZXJyID0gQ1JZUFRfT0s7CitMQkxfRVJSOgorI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbShEQiwgICBtb2R1bHVzX2xlbik7CisgICB6ZXJvbWVtKHNlZWQsIGhMZW4pOworICAgemVyb21lbShtYXNrLCBtb2R1bHVzX2xlbik7CisjZW5kaWYKKworICAgWEZSRUUoc2VlZCk7CisgICBYRlJFRShtYXNrKTsKKyAgIFhGUkVFKERCKTsKKworICAgcmV0dXJuIGVycjsKK30KKworI2VuZGlmIC8qIFBLQ1NfMSAqLworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvcGtjczEvcGtjc18xX29hZXBfZGVjb2RlLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNSAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xOCAwMjozNzowNiAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvcGtjczEvcGtjc18xX29hZXBfZW5jb2RlLmMgYi9zcmMvcGsvcGtjczEvcGtjc18xX29hZXBfZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2NzBiNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9wa2NzMS9wa2NzXzFfb2FlcF9lbmNvZGUuYwpAQCAtMCwwICsxLDE3MiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgcGtjc18xX29hZXBfZW5jb2RlLmMKKyAgT0FFUCBQYWRkaW5nIGZvciBQS0NTICMxLCBUb20gU3QgRGVuaXMgCisqLworCisjaWZkZWYgUEtDU18xCisKKy8qKgorICBQS0NTICMxIHYyLjAwIE9BRVAgZW5jb2RlCisgIEBwYXJhbSBtc2cgICAgICAgICAgICAgVGhlIGRhdGEgdG8gZW5jb2RlCisgIEBwYXJhbSBtc2dsZW4gICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBlbmNvZGUgKG9jdGV0cykKKyAgQHBhcmFtIGxwYXJhbSAgICAgICAgICBBIHNlc3Npb24gb3Igc3lzdGVtIHBhcmFtZXRlciAoY2FuIGJlIE5VTEwpCisgIEBwYXJhbSBscGFyYW1sZW4gICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgbHBhcmFtIGRhdGEKKyAgQHBhcmFtIG1vZHVsdXNfYml0bGVuICBUaGUgYml0IGxlbmd0aCBvZiB0aGUgUlNBIG1vZHVsdXMKKyAgQHBhcmFtIHBybmcgICAgICAgICAgICBBbiBhY3RpdmUgUFJORyBzdGF0ZQorICBAcGFyYW0gcHJuZ19pZHggICAgICAgIFRoZSBpbmRleCBvZiB0aGUgUFJORyBkZXNpcmVkCisgIEBwYXJhbSBoYXNoX2lkeCAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBoYXNoIGRlc2lyZWQKKyAgQHBhcmFtIG91dCAgICAgICAgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gZm9yIHRoZSBlbmNvZGVkIGRhdGEKKyAgQHBhcmFtIG91dGxlbiAgICAgICAgICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBlbmNvZGVkIGRhdGEKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHBrY3NfMV9vYWVwX2VuY29kZShjb25zdCB1bnNpZ25lZCBjaGFyICptc2csICAgIHVuc2lnbmVkIGxvbmcgbXNnbGVuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpscGFyYW0sIHVuc2lnbmVkIGxvbmcgbHBhcmFtbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG1vZHVsdXNfYml0bGVuLCBwcm5nX3N0YXRlICpwcm5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHBybmdfaWR4LCAgICAgICAgIGludCAgaGFzaF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworICAgdW5zaWduZWQgY2hhciAqREIsICpzZWVkLCAqbWFzazsKKyAgIHVuc2lnbmVkIGxvbmcgaExlbiwgeCwgeSwgbW9kdWx1c19sZW47CisgICBpbnQgICAgICAgICAgIGVycjsKKworICAgTFRDX0FSR0NISyhtc2cgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworCisgICAvKiB0ZXN0IHZhbGlkIGhhc2ggKi8KKyAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChoYXNoX2lkeCkpICE9IENSWVBUX09LKSB7IAorICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogdmFsaWQgcHJuZyAqLworICAgaWYgKChlcnIgPSBwcm5nX2lzX3ZhbGlkKHBybmdfaWR4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIGhMZW4gICAgICAgID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5oYXNoc2l6ZTsKKyAgIG1vZHVsdXNfbGVuID0gKG1vZHVsdXNfYml0bGVuID4+IDMpICsgKG1vZHVsdXNfYml0bGVuICYgNyA/IDEgOiAwKTsKKworICAgLyogdGVzdCBtZXNzYWdlIHNpemUgKi8KKyAgIGlmICgoMipoTGVuID49IChtb2R1bHVzX2xlbiAtIDIpKSB8fCAobXNnbGVuID4gKG1vZHVsdXNfbGVuIC0gMipoTGVuIC0gMikpKSB7CisgICAgICByZXR1cm4gQ1JZUFRfUEtfSU5WQUxJRF9TSVpFOworICAgfQorCisgICAvKiBhbGxvY2F0ZSByYW0gZm9yIERCL21hc2svc2FsdCBvZiBzaXplIG1vZHVsdXNfbGVuICovCisgICBEQiAgID0gWE1BTExPQyhtb2R1bHVzX2xlbik7CisgICBtYXNrID0gWE1BTExPQyhtb2R1bHVzX2xlbik7CisgICBzZWVkID0gWE1BTExPQyhoTGVuKTsKKyAgIGlmIChEQiA9PSBOVUxMIHx8IG1hc2sgPT0gTlVMTCB8fCBzZWVkID09IE5VTEwpIHsKKyAgICAgIGlmIChEQiAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShEQik7CisgICAgICB9CisgICAgICBpZiAobWFzayAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShtYXNrKTsKKyAgICAgIH0KKyAgICAgIGlmIChzZWVkICE9IE5VTEwpIHsKKyAgICAgICAgIFhGUkVFKHNlZWQpOworICAgICAgfQorICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKworICAgLyogZ2V0IGxoYXNoICovCisgICAvKiBEQiA9PSBsaGFzaCB8fCBQUyB8fCAweDAxIHx8IE0sIFBTID09IGsgLSBtbGVuIC0gMmhsZW4gLSAyIHplcm9lcyAqLworICAgeCA9IG1vZHVsdXNfbGVuOworICAgaWYgKGxwYXJhbSAhPSBOVUxMKSB7CisgICAgICBpZiAoKGVyciA9IGhhc2hfbWVtb3J5KGhhc2hfaWR4LCBscGFyYW0sIGxwYXJhbWxlbiwgREIsICZ4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICAvKiBjYW4ndCBwYXNzIGhhc2hfbWVtb3J5IGEgTlVMTCBzbyB1c2UgREIgd2l0aCB6ZXJvIGxlbmd0aCAqLworICAgICAgaWYgKChlcnIgPSBoYXNoX21lbW9yeShoYXNoX2lkeCwgREIsIDAsIERCLCAmeCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICB9CisgICB9CisKKyAgIC8qIGFwcGVuZCBQUyB0aGVuIDB4MDEgKHRvIGxoYXNoKSAgKi8KKyAgIHggPSBoTGVuOworICAgeSA9IG1vZHVsdXNfbGVuIC0gbXNnbGVuIC0gMipoTGVuIC0gMjsKKyAgIFhNRU1TRVQoREIreCwgMCwgeSk7CisgICB4ICs9IHk7CisKKyAgIC8qIDB4MDEgYnl0ZSAqLworICAgREJbeCsrXSA9IDB4MDE7CisKKyAgIC8qIG1lc3NhZ2UgKGxlbmd0aCA9IG1zZ2xlbikgKi8KKyAgIFhNRU1DUFkoREIreCwgbXNnLCBtc2dsZW4pOworICAgeCArPSBtc2dsZW47CisKKyAgIC8qIG5vdyBjaG9vc2UgYSByYW5kb20gc2VlZCAqLworICAgaWYgKHBybmdfZGVzY3JpcHRvcltwcm5nX2lkeF0ucmVhZChzZWVkLCBoTGVuLCBwcm5nKSAhPSBoTGVuKSB7CisgICAgICBlcnIgPSBDUllQVF9FUlJPUl9SRUFEUFJORzsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogY29tcHV0ZSBNR0YxIG9mIHNlZWQgKGsgLSBobGVuIC0gMSkgKi8KKyAgIGlmICgoZXJyID0gcGtjc18xX21nZjEoc2VlZCwgaExlbiwgaGFzaF9pZHgsIG1hc2ssIG1vZHVsdXNfbGVuIC0gaExlbiAtIDEpKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICAvKiB4b3IgYWdhaW5zdCBEQiAqLworICAgZm9yICh5ID0gMDsgeSA8IChtb2R1bHVzX2xlbiAtIGhMZW4gLSAxKTsgeSsrKSB7CisgICAgICAgREJbeV0gXj0gbWFza1t5XTsgCisgICB9CisKKyAgIC8qIGNvbXB1dGUgTUdGMSBvZiBtYXNrZWREQiAoaExlbikgKi8gCisgICBpZiAoKGVyciA9IHBrY3NfMV9tZ2YxKERCLCBtb2R1bHVzX2xlbiAtIGhMZW4gLSAxLCBoYXNoX2lkeCwgbWFzaywgaExlbikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisKKyAgIC8qIFhPUiBhZ2FpbnN0IHNlZWQgKi8KKyAgIGZvciAoeSA9IDA7IHkgPCBoTGVuOyB5KyspIHsKKyAgICAgIHNlZWRbeV0gXj0gbWFza1t5XTsKKyAgIH0KKworICAgLyogY3JlYXRlIHN0cmluZyBvZiBsZW5ndGggbW9kdWx1c19sZW4gKi8KKyAgIGlmICgqb3V0bGVuIDwgbW9kdWx1c19sZW4pIHsKKyAgICAgIGVyciA9IENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogc3RhcnQgb3V0cHV0IHdoaWNoIGlzIDB4MDAgfHwgbWFza2VkU2VlZCB8fCBtYXNrZWREQiAqLworICAgeCA9IDA7CisgICBvdXRbeCsrXSA9IDB4MDA7CisgICBYTUVNQ1BZKG91dCt4LCBzZWVkLCBoTGVuKTsKKyAgIHggKz0gaExlbjsKKyAgIFhNRU1DUFkob3V0K3gsIERCLCBtb2R1bHVzX2xlbiAtIGhMZW4gLSAxKTsKKyAgIHggKz0gbW9kdWx1c19sZW4gLSBoTGVuIC0gMTsKKworICAgKm91dGxlbiA9IHg7CisgICAgCisgICBlcnIgPSBDUllQVF9PSzsKK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKERCLCAgIG1vZHVsdXNfbGVuKTsKKyAgIHplcm9tZW0oc2VlZCwgaExlbik7CisgICB6ZXJvbWVtKG1hc2ssIG1vZHVsdXNfbGVuKTsKKyNlbmRpZgorCisgICBYRlJFRShzZWVkKTsKKyAgIFhGUkVFKG1hc2spOworICAgWEZSRUUoREIpOworCisgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYgLyogUEtDU18xICovCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL3BrY3MxL3BrY3NfMV9vYWVwX2VuY29kZS5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL3BrY3MxL3BrY3NfMV9vczJpcC5jIGIvc3JjL3BrL3BrY3MxL3BrY3NfMV9vczJpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTE4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGsvcGtjczEvcGtjc18xX29zMmlwLmMKQEAgLTAsMCArMSw0MSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKiogCisgIEBmaWxlIHBrY3NfMV9vczJpcC5jCisgIE9jdGV0IHRvIEludGVnZXIgT1MySVAsIFRvbSBTdCBEZW5pcyAKKyovCisjaWZkZWYgUEtDU18xCisKKy8qKgorICBSZWFkIGEgYmluYXJ5IHN0cmluZyBpbnRvIGFuIG1wX2ludAorICBAcGFyYW0gbiAgICAgICAgICBbb3V0XSBUaGUgbXBfaW50IGRlc3RpbmF0aW9uCisgIEBwYXJhbSBpbiAgICAgICAgIFRoZSBiaW5hcnkgc3RyaW5nIHRvIHJlYWQKKyAgQHBhcmFtIGlubGVuICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgYmluYXJ5IHN0cmluZworICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgcGtjc18xX29zMmlwKG1wX2ludCAqbiwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4pCit7CisgICBpbnQgZXJyOworICAgLyogcmVhZCBpdCAqLworICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbihuLCBpbiwgaW5sZW4pKSAhPSBNUF9PS0FZKSB7CisgICAgICByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworICAgfQorICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYgLyogUEtDU18xICovCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL3BrY3MxL3BrY3NfMV9vczJpcC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL3BrY3MxL3BrY3NfMV9wc3NfZGVjb2RlLmMgYi9zcmMvcGsvcGtjczEvcGtjc18xX3Bzc19kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjFjMzNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL3BrY3MxL3BrY3NfMV9wc3NfZGVjb2RlLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqIAorICBAZmlsZSBwa2NzXzFfcHNzX2RlY29kZS5jCisgIFBLQ1MgIzEgUFNTIFNpZ25hdHVyZSBQYWRkaW5nLCBUb20gU3QgRGVuaXMgCisqLworCisjaWZkZWYgUEtDU18xCisKKy8qKgorICAgUEtDUyAjMSB2Mi4wMCBQU1MgZGVjb2RlCisgICBAcGFyYW0gIG1zZ2hhc2ggICAgICAgICBUaGUgaGFzaCB0byB2ZXJpZnkKKyAgIEBwYXJhbSAgbXNnaGFzaGxlbiAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGhhc2ggKG9jdGV0cykKKyAgIEBwYXJhbSAgc2lnICAgICAgICAgICAgIFRoZSBzaWduYXR1cmUgZGF0YSAoZW5jb2RlZCBkYXRhKQorICAgQHBhcmFtICBzaWdsZW4gICAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc2lnbmF0dXJlIGRhdGEgKG9jdGV0cykKKyAgIEBwYXJhbSAgc2FsdGxlbiAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHNhbHQgdXNlZCAob2N0ZXRzKQorICAgQHBhcmFtICBoYXNoX2lkeCAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBoYXNoIGRlc2lyZWQKKyAgIEBwYXJhbSAgbW9kdWx1c19iaXRsZW4gIFRoZSBiaXQgbGVuZ3RoIG9mIHRoZSBSU0EgbW9kdWx1cworICAgQHBhcmFtICByZXMgICAgICAgICAgICAgW291dF0gVGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiwgMT09dmFsaWQsIDA9PWludmFsaWQKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCAoZXZlbiBpZiB0aGUgY29tcGFyaXNvbiBmYWlsZWQpCisqLworaW50IHBrY3NfMV9wc3NfZGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZ2hhc2gsIHVuc2lnbmVkIGxvbmcgbXNnaGFzaGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsICAgICB1bnNpZ25lZCBsb25nIHNpZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNhbHRsZW4sICBpbnQgICAgICAgICAgIGhhc2hfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19iaXRsZW4sIGludCAgICAqcmVzKQoreworICAgdW5zaWduZWQgY2hhciAqREIsICptYXNrLCAqc2FsdCwgKmhhc2g7CisgICB1bnNpZ25lZCBsb25nIHgsIHksIGhMZW4sIG1vZHVsdXNfbGVuOworICAgaW50ICAgICAgICAgICBlcnI7CisgICBoYXNoX3N0YXRlICAgIG1kOworCisgICBMVENfQVJHQ0hLKG1zZ2hhc2ggIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHJlcyAgICAgIT0gTlVMTCk7CisKKyAgIC8qIGRlZmF1bHQgdG8gaW52YWxpZCAqLworICAgKnJlcyA9IDA7CisKKyAgIC8qIGVuc3VyZSBoYXNoIGlzIHZhbGlkICovCisgICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaF9pZHgpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgaExlbiAgICAgICAgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLmhhc2hzaXplOworICAgbW9kdWx1c19sZW4gPSAobW9kdWx1c19iaXRsZW4+PjMpICsgKG1vZHVsdXNfYml0bGVuICYgNyA/IDEgOiAwKTsKKworICAgLyogY2hlY2sgc2l6ZXMgKi8KKyAgIGlmICgoc2FsdGxlbiA+IG1vZHVsdXNfbGVuKSB8fCAKKyAgICAgICAobW9kdWx1c19sZW4gPCBoTGVuICsgc2FsdGxlbiArIDIpIHx8IChzaWdsZW4gIT0gbW9kdWx1c19sZW4pKSB7CisgICAgICByZXR1cm4gQ1JZUFRfUEtfSU5WQUxJRF9TSVpFOworICAgfQorCisgICAvKiBhbGxvY2F0ZSByYW0gZm9yIERCL21hc2svc2FsdC9oYXNoIG9mIHNpemUgbW9kdWx1c19sZW4gKi8KKyAgIERCICAgPSBYTUFMTE9DKG1vZHVsdXNfbGVuKTsKKyAgIG1hc2sgPSBYTUFMTE9DKG1vZHVsdXNfbGVuKTsKKyAgIHNhbHQgPSBYTUFMTE9DKG1vZHVsdXNfbGVuKTsKKyAgIGhhc2ggPSBYTUFMTE9DKG1vZHVsdXNfbGVuKTsKKyAgIGlmIChEQiA9PSBOVUxMIHx8IG1hc2sgPT0gTlVMTCB8fCBzYWx0ID09IE5VTEwgfHwgaGFzaCA9PSBOVUxMKSB7CisgICAgICBpZiAoREIgIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUoREIpOworICAgICAgfQorICAgICAgaWYgKG1hc2sgIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUobWFzayk7CisgICAgICB9CisgICAgICBpZiAoc2FsdCAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShzYWx0KTsKKyAgICAgIH0KKyAgICAgIGlmIChoYXNoICE9IE5VTEwpIHsKKyAgICAgICAgIFhGUkVFKGhhc2gpOworICAgICAgfQorICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKworICAgLyogZW5zdXJlIHRoZSAweEJDIGJ5dGUgKi8KKyAgIGlmIChzaWdbc2lnbGVuLTFdICE9IDB4QkMpIHsKKyAgICAgIGVyciA9IENSWVBUX09LOworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICAvKiBjb3B5IG91dCB0aGUgREIgKi8KKyAgIHggPSAwOworICAgWE1FTUNQWShEQiwgc2lnICsgeCwgbW9kdWx1c19sZW4gLSBoTGVuIC0gMSk7CisgICB4ICs9IG1vZHVsdXNfbGVuIC0gaExlbiAtIDE7CisKKyAgIC8qIGNvcHkgb3V0IHRoZSBoYXNoICovCisgICBYTUVNQ1BZKGhhc2gsIHNpZyArIHgsIGhMZW4pOworICAgeCArPSBoTGVuOworCisgICAvKiBjaGVjayB0aGUgTVNCICovCisgICBpZiAoKHNpZ1swXSAmIH4oMHhGRiA+PiAoKG1vZHVsdXNfbGVuPDwzKSAtIChtb2R1bHVzX2JpdGxlbi0xKSkpKSAhPSAwKSB7CisgICAgICBlcnIgPSBDUllQVF9PSzsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogZ2VuZXJhdGUgbWFzayBvZiBsZW5ndGggbW9kdWx1c19sZW4gLSBoTGVuIC0gMSBmcm9tIGhhc2ggKi8KKyAgIGlmICgoZXJyID0gcGtjc18xX21nZjEoaGFzaCwgaExlbiwgaGFzaF9pZHgsIG1hc2ssIG1vZHVsdXNfbGVuIC0gaExlbiAtIDEpKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICAvKiB4b3IgYWdhaW5zdCBEQiAqLworICAgZm9yICh5ID0gMDsgeSA8IChtb2R1bHVzX2xlbiAtIGhMZW4gLSAxKTsgeSsrKSB7CisgICAgICBEQlt5XSBePSBtYXNrW3ldOworICAgfQorICAgCisgICAvKiBub3cgY2xlYXIgdGhlIGZpcnN0IGJ5dGUgW21ha2Ugc3VyZSBzbWFsbGVyIHRoYW4gbW9kdWx1c10gKi8KKyAgIERCWzBdICY9IDB4RkYgPj4gKChtb2R1bHVzX2xlbjw8MykgLSAobW9kdWx1c19iaXRsZW4tMSkpOworCisgICAvKiBEQiA9IFBTIHx8IDB4MDEgfHwgc2FsdCwgUFMgPT0gbW9kdWx1c19sZW4gLSBzYWx0bGVuIC0gaExlbiAtIDIgemVybyBieXRlcyAqLworCisgICAvKiBjaGVjayBmb3IgemVyb2VzIGFuZCAweDAxICovCisgICBmb3IgKHggPSAwOyB4IDwgbW9kdWx1c19sZW4gLSBzYWx0bGVuIC0gaExlbiAtIDI7IHgrKykgeworICAgICAgIGlmIChEQlt4XSAhPSAweDAwKSB7CisgICAgICAgICAgZXJyID0gQ1JZUFRfT0s7CisgICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgIH0KKyAgIH0KKworICAgLyogY2hlY2sgZm9yIHRoZSAweDAxICovCisgICBpZiAoREJbeCsrXSAhPSAweDAxKSB7CisgICAgICBlcnIgPSBDUllQVF9PSzsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogTSA9IChlaWdodCkgMHgwMCB8fCBtc2doYXNoIHx8IHNhbHQsIG1hc2sgPSBIKE0pICovCisgICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0uaW5pdCgmbWQpKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorICAgemVyb21lbShtYXNrLCA4KTsKKyAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5wcm9jZXNzKCZtZCwgbWFzaywgOCkpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisgICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0ucHJvY2VzcygmbWQsIG1zZ2hhc2gsIG1zZ2hhc2hsZW4pKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLnByb2Nlc3MoJm1kLCBEQit4LCBzYWx0bGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKyAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5kb25lKCZtZCwgbWFzaykpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisKKyAgIC8qIG1hc2sgPT0gaGFzaCBtZWFucyB2YWxpZCBzaWduYXR1cmUgKi8KKyAgIGlmIChtZW1jbXAobWFzaywgaGFzaCwgaExlbikgPT0gMCkgeworICAgICAgKnJlcyA9IDE7CisgICB9CisKKyAgIGVyciA9IENSWVBUX09LOworTEJMX0VSUjoKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKKyAgIHplcm9tZW0oREIsICAgbW9kdWx1c19sZW4pOyAgIAorICAgemVyb21lbShtYXNrLCBtb2R1bHVzX2xlbik7ICAgCisgICB6ZXJvbWVtKHNhbHQsIG1vZHVsdXNfbGVuKTsgICAKKyAgIHplcm9tZW0oaGFzaCwgbW9kdWx1c19sZW4pOyAgIAorI2VuZGlmCisKKyAgIFhGUkVFKGhhc2gpOworICAgWEZSRUUoc2FsdCk7CisgICBYRlJFRShtYXNrKTsKKyAgIFhGUkVFKERCKTsKKworICAgcmV0dXJuIGVycjsKK30KKworI2VuZGlmIC8qIFBLQ1NfMSAqLworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvcGtjczEvcGtjc18xX3Bzc19kZWNvZGUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS40ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9wa2NzMS9wa2NzXzFfcHNzX2VuY29kZS5jIGIvc3JjL3BrL3BrY3MxL3BrY3NfMV9wc3NfZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5NjA1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9wa2NzMS9wa2NzXzFfcHNzX2VuY29kZS5jCkBAIC0wLDAgKzEsMTc0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKiAKKyAgQGZpbGUgcGtjc18xX3Bzc19lbmNvZGUuYworICBQS0NTICMxIFBTUyBTaWduYXR1cmUgUGFkZGluZywgVG9tIFN0IERlbmlzIAorKi8KKworI2lmZGVmIFBLQ1NfMQorCisvKioKKyAgIFBLQ1MgIzEgdjIuMDAgU2lnbmF0dXJlIEVuY29kaW5nCisgICBAcGFyYW0gbXNnaGFzaCAgICAgICAgICBUaGUgaGFzaCB0byBlbmNvZGUKKyAgIEBwYXJhbSBtc2doYXNobGVuICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGhhc2ggKG9jdGV0cykKKyAgIEBwYXJhbSBzYWx0bGVuICAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHNhbHQgZGVzaXJlZCAob2N0ZXRzKQorICAgQHBhcmFtIHBybmcgICAgICAgICAgICAgQW4gYWN0aXZlIFBSTkcgY29udGV4dAorICAgQHBhcmFtIHBybmdfaWR4ICAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBQUk5HIGRlc2lyZWQKKyAgIEBwYXJhbSBoYXNoX2lkeCAgICAgICAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCBkZXNpcmVkCisgICBAcGFyYW0gbW9kdWx1c19iaXRsZW4gICBUaGUgYml0IGxlbmd0aCBvZiB0aGUgUlNBIG1vZHVsdXMKKyAgIEBwYXJhbSBvdXQgICAgICAgICAgICAgIFtvdXRdIFRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgZW5jb2RpbmcKKyAgIEBwYXJhbSBvdXRsZW4gICAgICAgICAgIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIGVuY29kZWQgZGF0YQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLworaW50IHBrY3NfMV9wc3NfZW5jb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1zZ2hhc2gsIHVuc2lnbmVkIGxvbmcgbXNnaGFzaGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNhbHRsZW4sICBwcm5nX3N0YXRlICAgKnBybmcsICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHBybmdfaWR4LCBpbnQgICAgICAgICAgIGhhc2hfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19iaXRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuKQoreworICAgdW5zaWduZWQgY2hhciAqREIsICptYXNrLCAqc2FsdCwgKmhhc2g7CisgICB1bnNpZ25lZCBsb25nIHgsIHksIGhMZW4sIG1vZHVsdXNfbGVuOworICAgaW50ICAgICAgICAgICBlcnI7CisgICBoYXNoX3N0YXRlICAgIG1kOworCisgICBMVENfQVJHQ0hLKG1zZ2hhc2ggIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAgIT0gTlVMTCk7CisKKyAgIC8qIGVuc3VyZSBoYXNoIGFuZCBQUk5HIGFyZSB2YWxpZCAqLworICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKGhhc2hfaWR4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBpZiAoKGVyciA9IHBybmdfaXNfdmFsaWQocHJuZ19pZHgpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgaExlbiAgICAgICAgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLmhhc2hzaXplOworICAgbW9kdWx1c19sZW4gPSAobW9kdWx1c19iaXRsZW4+PjMpICsgKG1vZHVsdXNfYml0bGVuICYgNyA/IDEgOiAwKTsKKworICAgLyogY2hlY2sgc2l6ZXMgKi8KKyAgIGlmICgoc2FsdGxlbiA+IG1vZHVsdXNfbGVuKSB8fCAobW9kdWx1c19sZW4gPCBoTGVuICsgc2FsdGxlbiArIDIpKSB7CisgICAgICByZXR1cm4gQ1JZUFRfUEtfSU5WQUxJRF9TSVpFOworICAgfQorCisgICAvKiBhbGxvY2F0ZSByYW0gZm9yIERCL21hc2svc2FsdC9oYXNoIG9mIHNpemUgbW9kdWx1c19sZW4gKi8KKyAgIERCICAgPSBYTUFMTE9DKG1vZHVsdXNfbGVuKTsKKyAgIG1hc2sgPSBYTUFMTE9DKG1vZHVsdXNfbGVuKTsKKyAgIHNhbHQgPSBYTUFMTE9DKG1vZHVsdXNfbGVuKTsKKyAgIGhhc2ggPSBYTUFMTE9DKG1vZHVsdXNfbGVuKTsKKyAgIGlmIChEQiA9PSBOVUxMIHx8IG1hc2sgPT0gTlVMTCB8fCBzYWx0ID09IE5VTEwgfHwgaGFzaCA9PSBOVUxMKSB7CisgICAgICBpZiAoREIgIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUoREIpOworICAgICAgfQorICAgICAgaWYgKG1hc2sgIT0gTlVMTCkgeworICAgICAgICAgWEZSRUUobWFzayk7CisgICAgICB9CisgICAgICBpZiAoc2FsdCAhPSBOVUxMKSB7CisgICAgICAgICBYRlJFRShzYWx0KTsKKyAgICAgIH0KKyAgICAgIGlmIChoYXNoICE9IE5VTEwpIHsKKyAgICAgICAgIFhGUkVFKGhhc2gpOworICAgICAgfQorICAgICAgcmV0dXJuIENSWVBUX01FTTsKKyAgIH0KKworCisgICAvKiBnZW5lcmF0ZSByYW5kb20gc2FsdCAqLworICAgaWYgKHNhbHRsZW4gPiAwKSB7CisgICAgICBpZiAocHJuZ19kZXNjcmlwdG9yW3BybmdfaWR4XS5yZWFkKHNhbHQsIHNhbHRsZW4sIHBybmcpICE9IHNhbHRsZW4pIHsKKyAgICAgICAgIGVyciA9IENSWVBUX0VSUk9SX1JFQURQUk5HOworICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgfQorICAgfQorCisgICAvKiBNID0gKGVpZ2h0KSAweDAwIHx8IG1zZ2hhc2ggfHwgc2FsdCwgaGFzaCA9IEgoTSkgKi8KKyAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5pbml0KCZtZCkpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisgICB6ZXJvbWVtKERCLCA4KTsKKyAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5wcm9jZXNzKCZtZCwgREIsIDgpKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbaGFzaF9pZHhdLnByb2Nlc3MoJm1kLCBtc2doYXNoLCBtc2doYXNobGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKyAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW2hhc2hfaWR4XS5wcm9jZXNzKCZtZCwgc2FsdCwgc2FsdGxlbikpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisgICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltoYXNoX2lkeF0uZG9uZSgmbWQsIGhhc2gpKSAhPSBDUllQVF9PSykgeworICAgICAgZ290byBMQkxfRVJSOworICAgfQorCisgICAvKiBnZW5lcmF0ZSBEQiA9IFBTIHx8IDB4MDEgfHwgc2FsdCwgUFMgPT0gbW9kdWx1c19sZW4gLSBzYWx0bGVuIC0gaExlbiAtIDIgemVybyBieXRlcyAqLworICAgeCA9IDA7CisgICBYTUVNU0VUKERCICsgeCwgMCwgbW9kdWx1c19sZW4gLSBzYWx0bGVuIC0gaExlbiAtIDIpOworICAgeCArPSBtb2R1bHVzX2xlbiAtIHNhbHRsZW4gLSBoTGVuIC0gMjsKKyAgIERCW3grK10gPSAweDAxOworICAgWE1FTUNQWShEQiArIHgsIHNhbHQsIHNhbHRsZW4pOworICAgeCArPSBzYWx0bGVuOworCisgICAvKiBnZW5lcmF0ZSBtYXNrIG9mIGxlbmd0aCBtb2R1bHVzX2xlbiAtIGhMZW4gLSAxIGZyb20gaGFzaCAqLworICAgaWYgKChlcnIgPSBwa2NzXzFfbWdmMShoYXNoLCBoTGVuLCBoYXNoX2lkeCwgbWFzaywgbW9kdWx1c19sZW4gLSBoTGVuIC0gMSkpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisKKyAgIC8qIHhvciBhZ2FpbnN0IERCICovCisgICBmb3IgKHkgPSAwOyB5IDwgKG1vZHVsdXNfbGVuIC0gaExlbiAtIDEpOyB5KyspIHsKKyAgICAgIERCW3ldIF49IG1hc2tbeV07CisgICB9CisKKyAgIC8qIG91dHB1dCBpcyBEQiB8fCBoYXNoIHx8IDB4QkMgKi8KKyAgIGlmICgqb3V0bGVuIDwgbW9kdWx1c19sZW4pIHsKKyAgICAgIGVyciA9IENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgIGdvdG8gTEJMX0VSUjsKKyAgIH0KKworICAgLyogREIgbGVuID0gbW9kdWx1c19sZW4gLSBoTGVuIC0gMSAqLworICAgeSA9IDA7CisgICBYTUVNQ1BZKG91dCArIHksIERCLCBtb2R1bHVzX2xlbiAtIGhMZW4gLSAxKTsKKyAgIHkgKz0gbW9kdWx1c19sZW4gLSBoTGVuIC0gMTsKKworICAgLyogaGFzaCAqLworICAgWE1FTUNQWShvdXQgKyB5LCBoYXNoLCBoTGVuKTsKKyAgIHkgKz0gaExlbjsKKworICAgLyogMHhCQyAqLworICAgb3V0W3ldID0gMHhCQzsKKworICAgLyogbm93IGNsZWFyIHRoZSA4Km1vZHVsdXNfbGVuIC0gbW9kdWx1c19iaXRsZW4gbW9zdCBzaWduaWZpY2FudCBiaXRzICovCisgICBvdXRbMF0gJj0gMHhGRiA+PiAoKG1vZHVsdXNfbGVuPDwzKSAtIChtb2R1bHVzX2JpdGxlbi0xKSk7CisKKyAgIC8qIHN0b3JlIG91dHB1dCBzaXplICovCisgICAqb3V0bGVuID0gbW9kdWx1c19sZW47CisgICBlcnIgPSBDUllQVF9PSzsKK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKERCLCAgIG1vZHVsdXNfbGVuKTsgICAKKyAgIHplcm9tZW0obWFzaywgbW9kdWx1c19sZW4pOyAgIAorICAgemVyb21lbShzYWx0LCBtb2R1bHVzX2xlbik7ICAgCisgICB6ZXJvbWVtKGhhc2gsIG1vZHVsdXNfbGVuKTsgICAKKyNlbmRpZgorCisgICBYRlJFRShoYXNoKTsKKyAgIFhGUkVFKHNhbHQpOworICAgWEZSRUUobWFzayk7CisgICBYRlJFRShEQik7CisKKyAgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvKiBQS0NTXzEgKi8KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL3BrY3MxL3BrY3NfMV9wc3NfZW5jb2RlLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNCAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvcnNhL3JzYV9kZWNyeXB0X2tleS5jIGIvc3JjL3BrL3JzYS9yc2FfZGVjcnlwdF9rZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2VhODA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BrL3JzYS9yc2FfZGVjcnlwdF9rZXkuYwpAQCAtMCwwICsxLDkzIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSByc2FfZGVjcnlwdF9rZXkuYworICBSU0EgUEtDUyAjMSBPQUVQIERlY3J5cHRpb24sIFRvbSBTdCBEZW5pcworKi8gIAorCisjaWZkZWYgTVJTQQorCisvKioKKyAgIChQS0NTICMxIHYyLjApIGRlY3J5cHQgdGhlbiBPQUVQIGRlcGFkICAKKyAgIEBwYXJhbSBpbiAgICAgICAgICBUaGUgY2lwaGVydGV4dAorICAgQHBhcmFtIGlubGVuICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGNpcGhlcnRleHQgKG9jdGV0cykKKyAgIEBwYXJhbSBvdXQgICAgICAgICBbb3V0XSBUaGUgcGxhaW50ZXh0CisgICBAcGFyYW0gb3V0bGVuICAgICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgcGxhaW50ZXh0IChvY3RldHMpCisgICBAcGFyYW0gbHBhcmFtICAgICAgVGhlIHN5c3RlbSAibHBhcmFtIiB2YWx1ZQorICAgQHBhcmFtIGxwYXJhbWxlbiAgIFRoZSBsZW5ndGggb2YgdGhlIGxwYXJhbSB2YWx1ZSAob2N0ZXRzKQorICAgQHBhcmFtIGhhc2hfaWR4ICAgIFRoZSBpbmRleCBvZiB0aGUgaGFzaCBkZXNpcmVkCisgICBAcGFyYW0gc3RhdCAgICAgICAgW291dF0gUmVzdWx0IG9mIHRoZSBkZWNyeXB0aW9uLCAxPT12YWxpZCwgMD09aW52YWxpZAorICAgQHBhcmFtIGtleSAgICAgICAgIFRoZSBjb3JyZXNwb25kaW5nIHByaXZhdGUgUlNBIGtleQorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjY2Vzc3VsIChldmVuIGlmIGludmFsaWQpCisqLworaW50IHJzYV9kZWNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICAgICAgdW5zaWduZWQgbG9uZyAgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgICB1bnNpZ25lZCBsb25nICpvdXRsZW4sIAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpscGFyYW0sICAgdW5zaWduZWQgbG9uZyAgbHBhcmFtbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBoYXNoX2lkeCwgaW50ICAgICAgICAgICAqc3RhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcnNhX2tleSAgICAgICAqa2V5KQoreworICB1bnNpZ25lZCBsb25nIG1vZHVsdXNfYml0bGVuLCBtb2R1bHVzX2J5dGVsZW4sIHg7CisgIGludCAgICAgICAgICAgZXJyOworICB1bnNpZ25lZCBjaGFyICp0bXA7CisgIAorICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisgIExUQ19BUkdDSEsoa2V5ICAgICE9IE5VTEwpOworICBMVENfQVJHQ0hLKHN0YXQgICAhPSBOVUxMKTsKKworICAvKiBkZWZhdWx0IHRvIGludmFsaWQgKi8KKyAgKnN0YXQgPSAwOworCisgIC8qIHZhbGlkIGhhc2ggPyAqLworICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaF9pZHgpKSAhPSBDUllQVF9PSykgeworICAgICByZXR1cm4gZXJyOworICB9CisgIAorICAvKiBnZXQgbW9kdWx1cyBsZW4gaW4gYml0cyAqLworICBtb2R1bHVzX2JpdGxlbiA9IG1wX2NvdW50X2JpdHMoJihrZXktPk4pKTsKKworICAvKiBvdXRsZW4gbXVzdCBiZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgbW9kdWx1cyAqLworICBtb2R1bHVzX2J5dGVsZW4gPSBtcF91bnNpZ25lZF9iaW5fc2l6ZSgmKGtleS0+TikpOworICBpZiAobW9kdWx1c19ieXRlbGVuICE9IGlubGVuKSB7CisgICAgIHJldHVybiBDUllQVF9JTlZBTElEX1BBQ0tFVDsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHJhbSAqLworICB0bXAgPSBYTUFMTE9DKGlubGVuKTsKKyAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgIHJldHVybiBDUllQVF9NRU07CisgIH0KKworICAvKiByc2EgZGVjb2RlIHRoZSBwYWNrZXQgKi8KKyAgeCA9IGlubGVuOworICBpZiAoKGVyciA9IHJzYV9leHB0bW9kKGluLCBpbmxlbiwgdG1wLCAmeCwgUEtfUFJJVkFURSwga2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgWEZSRUUodG1wKTsKKyAgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIC8qIG5vdyBPQUVQIGRlY29kZSB0aGUgcGFja2V0ICovCisgIGVyciA9IHBrY3NfMV9vYWVwX2RlY29kZSh0bXAsIHgsIGxwYXJhbSwgbHBhcmFtbGVuLCBtb2R1bHVzX2JpdGxlbiwgaGFzaF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQsIG91dGxlbiwgc3RhdCk7CisgIFhGUkVFKHRtcCk7CisgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvKiBNUlNBICovCisKKworCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL3JzYS9yc2FfZGVjcnlwdF9rZXkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9yc2EvcnNhX2VuY3J5cHRfa2V5LmMgYi9zcmMvcGsvcnNhL3JzYV9lbmNyeXB0X2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOWFhODMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGsvcnNhL3JzYV9lbmNyeXB0X2tleS5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIHJzYV9lbmNyeXB0X2tleS5jCisgIFJTQSBQS0NTIE9BRVAgZW5jcnlwdGlvbiwgVG9tIFN0IERlbmlzCisqLyAgCisKKyNpZmRlZiBNUlNBCisKKy8qKgorICAgIChQS0NTICMxIHYyLjApIE9BRVAgcGFkIHRoZW4gZW5jcnlwdAorICAgIEBwYXJhbSBpbiAgICAgICAgICBUaGUgcGxhaW50ZXh0CisgICAgQHBhcmFtIGlubGVuICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHBsYWludGV4dCAob2N0ZXRzKQorICAgIEBwYXJhbSBvdXQgICAgICAgICBbb3V0XSBUaGUgY2lwaGVydGV4dAorICAgIEBwYXJhbSBvdXRsZW4gICAgICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBjaXBoZXJ0ZXh0CisgICAgQHBhcmFtIGxwYXJhbSAgICAgIFRoZSBzeXN0ZW0gImxwYXJhbSIgZm9yIHRoZSBlbmNyeXB0aW9uCisgICAgQHBhcmFtIGxwYXJhbWxlbiAgIFRoZSBsZW5ndGggb2YgbHBhcmFtIChvY3RldHMpCisgICAgQHBhcmFtIHBybmcgICAgICAgIEFuIGFjdGl2ZSBQUk5HCisgICAgQHBhcmFtIHBybmdfaWR4ICAgIFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBwcm5nCisgICAgQHBhcmFtIGhhc2hfaWR4ICAgIFRoZSBpbmRleCBvZiB0aGUgZGVzaXJlZCBoYXNoCisgICAgQHBhcmFtIGtleSAgICAgICAgIFRoZSBSU0Ega2V5IHRvIGVuY3J5cHQgdG8KKyAgICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAgIAoraW50IHJzYV9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICAgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dCwgICAgdW5zaWduZWQgbG9uZyAqb3V0bGVuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpscGFyYW0sIHVuc2lnbmVkIGxvbmcgbHBhcmFtbGVuLAorICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICpwcm5nLCBpbnQgcHJuZ19pZHgsIGludCBoYXNoX2lkeCwgcnNhX2tleSAqa2V5KQoreworICB1bnNpZ25lZCBsb25nIG1vZHVsdXNfYml0bGVuLCBtb2R1bHVzX2J5dGVsZW4sIHg7CisgIGludCAgICAgICAgICAgZXJyOworICAKKyAgTFRDX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7CisgIExUQ19BUkdDSEsob3V0ICAgICE9IE5VTEwpOworICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKyAgTFRDX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7CisgIAorICAvKiB2YWxpZCBwcm5nIGFuZCBoYXNoID8gKi8KKyAgaWYgKChlcnIgPSBwcm5nX2lzX3ZhbGlkKHBybmdfaWR4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaF9pZHgpKSAhPSBDUllQVF9PSykgeworICAgICByZXR1cm4gZXJyOworICB9CisgIAorICAvKiBnZXQgbW9kdWx1cyBsZW4gaW4gYml0cyAqLworICBtb2R1bHVzX2JpdGxlbiA9IG1wX2NvdW50X2JpdHMoJihrZXktPk4pKTsKKworICAvKiBvdXRsZW4gbXVzdCBiZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgbW9kdWx1cyAqLworICBtb2R1bHVzX2J5dGVsZW4gPSBtcF91bnNpZ25lZF9iaW5fc2l6ZSgmKGtleS0+TikpOworICBpZiAobW9kdWx1c19ieXRlbGVuID4gKm91dGxlbikgeworICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICB9CisgICAgICAKKyAgLyogT0FFUCBwYWQgdGhlIGtleSAqLworICB4ID0gKm91dGxlbjsKKyAgaWYgKChlcnIgPSBwa2NzXzFfb2FlcF9lbmNvZGUoaW4sIGlubGVuLCBscGFyYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscGFyYW1sZW4sIG1vZHVsdXNfYml0bGVuLCBwcm5nLCBwcm5nX2lkeCwgaGFzaF9pZHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQsICZ4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgcmV0dXJuIGVycjsKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgLyogcnNhIGV4cHRtb2QgdGhlIE9BRVAgcGFkICovCisgIHJldHVybiByc2FfZXhwdG1vZChvdXQsIHgsIG91dCwgb3V0bGVuLCBQS19QVUJMSUMsIGtleSk7Cit9CisKKyNlbmRpZiAvKiBNUlNBICovCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9yc2EvcnNhX2VuY3J5cHRfa2V5LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvcnNhL3JzYV9leHBvcnQuYyBiL3NyYy9way9yc2EvcnNhX2V4cG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZTMyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGsvcnNhL3JzYV9leHBvcnQuYwpAQCAtMCwwICsxLDc2IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSByc2FfZXhwb3J0LmMKKyAgRXhwb3J0IFJTQSBQS0NTIGtleXMsIFRvbSBTdCBEZW5pcworKi8gIAorCisjaWZkZWYgTVJTQQorCisvKioKKyAgICBUaGlzIHdpbGwgZXhwb3J0IGVpdGhlciBhbiBSU0FQdWJsaWNLZXkgb3IgUlNBUHJpdmF0ZUtleSBbZGVmaW5lZCBpbiBQS0NTICMxIHYyLjFdIAorICAgIEBwYXJhbSBvdXQgICAgICAgW291dF0gRGVzdGluYXRpb24gb2YgdGhlIHBhY2tldAorICAgIEBwYXJhbSBvdXRsZW4gICAgW2luL291dF0gVGhlIG1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgcGFja2V0CisgICAgQHBhcmFtIHR5cGUgICAgICBUaGUgdHlwZSBvZiBleHBvcnRlZCBrZXkgKFBLX1BSSVZBVEUgb3IgUEtfUFVCTElDKQorICAgIEBwYXJhbSBrZXkgICAgICAgVGhlIFJTQSBrZXkgdG8gZXhwb3J0CisgICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgICAKK2ludCByc2FfZXhwb3J0KHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBpbnQgdHlwZSwgcnNhX2tleSAqa2V5KQoreworICAgaW50ICAgICAgICAgICBlcnI7CisgICB1bnNpZ25lZCBsb25nIHplcm89MDsKKworICAgTFRDX0FSR0NISyhvdXQgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsoa2V5ICAgICE9IE5VTEwpOworCisgICAvKiB0eXBlIHZhbGlkPyAqLworICAgaWYgKCEoa2V5LT50eXBlID09IFBLX1BSSVZBVEUpICYmICh0eXBlID09IFBLX1BSSVZBVEUpKSB7CisgICAgICByZXR1cm4gQ1JZUFRfUEtfSU5WQUxJRF9UWVBFOworICAgfQorCisgICBpZiAodHlwZSA9PSBQS19QUklWQVRFKSB7CisgICAgICAvKiBwcml2YXRlIGtleSAqLworICAgICAgLyogb3V0cHV0IGlzIAorICAgICAgICAgICAgVmVyc2lvbiwgbiwgZSwgZCwgcCwgcSwgZCBtb2QgKHAtMSksIGQgbW9kIChxIC0gMSksIDEvcSBtb2QgcAorICAgICAgICovCisgICAgICBpZiAoKGVyciA9IGRlcl9lbmNvZGVfc2VxdWVuY2VfbXVsdGkob3V0LCBvdXRsZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9TSE9SVF9JTlRFR0VSLCAxVUwsICZ6ZXJvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAma2V5LT5OLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAma2V5LT5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZrZXktPmQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZrZXktPnAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZrZXktPnEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZrZXktPmRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZrZXktPmRRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAma2V5LT5xUCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0VPTCwgICAgIDBVTCwgTlVMTCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICByZXR1cm4gZXJyOworICAgICAgfQorIAorICAgICAgLyogY2xlYXIgemVybyBhbmQgcmV0dXJuICovCisgICAgICByZXR1cm4gQ1JZUFRfT0s7CisgICB9IGVsc2UgeworICAgICAgLyogcHVibGljIGtleSAqLworICAgICAgcmV0dXJuIGRlcl9lbmNvZGVfc2VxdWVuY2VfbXVsdGkob3V0LCBvdXRsZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAma2V5LT5OLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsIDFVTCwgJmtleS0+ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9FT0wsICAgICAwVUwsIE5VTEwpOworICAgfQorfQorCisjZW5kaWYgLyogTVJTQSAqLworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcGsvcnNhL3JzYV9leHBvcnQuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xMSAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8wNCAwMTo0Mjo0OCAkICovCmRpZmYgLS1naXQgYS9zcmMvcGsvcnNhL3JzYV9leHB0bW9kLmMgYi9zcmMvcGsvcnNhL3JzYV9leHB0bW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5NDA0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9yc2EvcnNhX2V4cHRtb2QuYwpAQCAtMCwwICsxLDExNSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgcnNhX2V4cHRtb2QuYworICBSU0EgUEtDUyBleHB0bW9kLCBUb20gU3QgRGVuaXMKKyovICAKKworI2lmZGVmIE1SU0EKKworLyoqIAorICAgQ29tcHV0ZSBhbiBSU0EgbW9kdWxhciBleHBvbmVudGlhdGlvbiAKKyAgIEBwYXJhbSBpbiAgICAgICAgIFRoZSBpbnB1dCBkYXRhIHRvIHNlbmQgaW50byBSU0EKKyAgIEBwYXJhbSBpbmxlbiAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGlucHV0IChvY3RldHMpCisgICBAcGFyYW0gb3V0ICAgICAgICBbb3V0XSBUaGUgZGVzdGluYXRpb24gCisgICBAcGFyYW0gb3V0bGVuICAgICBbaW4vb3V0XSBUaGUgbWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBvdXRwdXQKKyAgIEBwYXJhbSB3aGljaCAgICAgIFdoaWNoIGV4cG9uZW50IHRvIHVzZSwgZS5nLiBQS19QUklWQVRFIG9yIFBLX1BVQkxJQworICAgQHBhcmFtIGtleSAgICAgICAgVGhlIFJTQSBrZXkgdG8gdXNlIAorICAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgIAoraW50IHJzYV9leHB0bW9kKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCAgIHVuc2lnbmVkIGxvbmcgaW5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBpbnQgd2hpY2gsCisgICAgICAgICAgICAgICAgICAgICAgcnNhX2tleSAqa2V5KQoreworICAgbXBfaW50ICAgICAgICB0bXAsIHRtcGEsIHRtcGI7CisgICB1bnNpZ25lZCBsb25nIHg7CisgICBpbnQgICAgICAgICAgIGVycjsKKworICAgTFRDX0FSR0NISyhpbiAgICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgICAgIT0gTlVMTCk7CisgICAKKyAgIC8qIGlzIHRoZSBrZXkgb2YgdGhlIHJpZ2h0IHR5cGUgZm9yIHRoZSBvcGVyYXRpb24/ICovCisgICBpZiAod2hpY2ggPT0gUEtfUFJJVkFURSAmJiAoa2V5LT50eXBlICE9IFBLX1BSSVZBVEUpKSB7CisgICAgICByZXR1cm4gQ1JZUFRfUEtfTk9UX1BSSVZBVEU7CisgICB9CisKKyAgIC8qIG11c3QgYmUgYSBwcml2YXRlIG9yIHB1YmxpYyBvcGVyYXRpb24gKi8KKyAgIGlmICh3aGljaCAhPSBQS19QUklWQVRFICYmIHdoaWNoICE9IFBLX1BVQkxJQykgeworICAgICAgcmV0dXJuIENSWVBUX1BLX0lOVkFMSURfVFlQRTsKKyAgIH0KKworICAgLyogaW5pdCBhbmQgY29weSBpbnRvIHRtcCAqLworICAgaWYgKChlcnIgPSBtcF9pbml0X211bHRpKCZ0bXAsICZ0bXBhLCAmdG1wYiwgTlVMTCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOyB9CisgICBpZiAoKGVyciA9IG1wX3JlYWRfdW5zaWduZWRfYmluKCZ0bXAsICh1bnNpZ25lZCBjaGFyICopaW4sIChpbnQpaW5sZW4pKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgLyogc2FuaXR5IGNoZWNrIG9uIHRoZSBpbnB1dCAqLworICAgaWYgKG1wX2NtcCgma2V5LT5OLCAmdG1wKSA9PSBNUF9MVCkgeworICAgICAgZXJyID0gQ1JZUFRfUEtfSU5WQUxJRF9TSVpFOworICAgICAgZ290byBkb25lOworICAgfQorCisgICAvKiBhcmUgd2UgdXNpbmcgdGhlIHByaXZhdGUgZXhwb25lbnQgYW5kIGlzIHRoZSBrZXkgb3B0aW1pemVkPyAqLworICAgaWYgKHdoaWNoID09IFBLX1BSSVZBVEUpIHsKKyAgICAgIC8qIHRtcGEgPSB0bXBeZFAgbW9kIHAgKi8KKyAgICAgIGlmICgoZXJyID0gbXBfZXhwdG1vZCgmdG1wLCAma2V5LT5kUCwgJmtleS0+cCwgJnRtcGEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKworICAgICAgLyogdG1wYiA9IHRtcF5kUSBtb2QgcSAqLworICAgICAgaWYgKChlcnIgPSBtcF9leHB0bW9kKCZ0bXAsICZrZXktPmRRLCAma2V5LT5xLCAmdG1wYikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICAgICAvKiB0bXAgPSAodG1wYSAtIHRtcGIpICogcUludiAobW9kIHApICovCisgICAgICBpZiAoKGVyciA9IG1wX3N1YigmdG1wYSwgJnRtcGIsICZ0bXApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgICAgIGlmICgoZXJyID0gbXBfbXVsbW9kKCZ0bXAsICZrZXktPnFQLCAma2V5LT5wLCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICAgICAvKiB0bXAgPSB0bXBiICsgcSAqIHRtcCAqLworICAgICAgaWYgKChlcnIgPSBtcF9tdWwoJnRtcCwgJmtleS0+cSwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yOyB9CisgICAgICBpZiAoKGVyciA9IG1wX2FkZCgmdG1wLCAmdG1wYiwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0gZWxzZSB7CisgICAgICAvKiBleHB0bW9kIGl0ICovCisgICAgICBpZiAoKGVyciA9IG1wX2V4cHRtb2QoJnRtcCwgJmtleS0+ZSwgJmtleS0+TiwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3I7IH0KKyAgIH0KKworICAgLyogcmVhZCBpdCBiYWNrICovCisgICB4ID0gKHVuc2lnbmVkIGxvbmcpbXBfdW5zaWduZWRfYmluX3NpemUoJmtleS0+Tik7CisgICBpZiAoeCA+ICpvdXRsZW4pIHsKKyAgICAgIGVyciA9IENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgICAgIGdvdG8gZG9uZTsKKyAgIH0KKworICAgLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIC4uLiAqLworICAgaWYgKG1wX3Vuc2lnbmVkX2Jpbl9zaXplKCZ0bXApID4gbXBfdW5zaWduZWRfYmluX3NpemUoJmtleS0+TikpIHsKKyAgICAgIGVyciA9IENSWVBUX0VSUk9SOworICAgICAgZ290byBkb25lOworICAgfQorICAgKm91dGxlbiA9IHg7CisKKyAgIC8qIGNvbnZlcnQgaXQgKi8KKyAgIHplcm9tZW0ob3V0LCB4KTsKKyAgIGlmICgoZXJyID0gbXBfdG9fdW5zaWduZWRfYmluKCZ0bXAsIG91dCsoeC1tcF91bnNpZ25lZF9iaW5fc2l6ZSgmdG1wKSkpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjsgfQorCisgICAvKiBjbGVhbiB1cCBhbmQgcmV0dXJuICovCisgICBlcnIgPSBDUllQVF9PSzsKKyAgIGdvdG8gZG9uZTsKK2Vycm9yOgorICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworZG9uZToKKyAgIG1wX2NsZWFyX211bHRpKCZ0bXAsICZ0bXBhLCAmdG1wYiwgTlVMTCk7CisgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL3JzYS9yc2FfZXhwdG1vZC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjQgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMjMgMDI6MTA6MjIgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL3JzYS9yc2FfZnJlZS5jIGIvc3JjL3BrL3JzYS9yc2FfZnJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZWVhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcGsvcnNhL3JzYV9mcmVlLmMKQEAgLTAsMCArMSwzNSBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgcnNhX2ZyZWUuYworICBGcmVlIGFuIFJTQSBrZXksIFRvbSBTdCBEZW5pcworKi8gIAorCisjaWZkZWYgTVJTQQorCisvKioKKyAgRnJlZSBhbiBSU0Ega2V5IGZyb20gbWVtb3J5CisgIEBwYXJhbSBrZXkgICBUaGUgUlNBIGtleSB0byBmcmVlCisqLwordm9pZCByc2FfZnJlZShyc2Ffa2V5ICprZXkpCit7CisgICBMVENfQVJHQ0hLKGtleSAhPSBOVUxMKTsKKyAgIG1wX2NsZWFyX211bHRpKCZrZXktPmUsICZrZXktPmQsICZrZXktPk4sICZrZXktPmRRLCAma2V5LT5kUCwKKyAgICAgICAgICAgICAgICAgICZrZXktPnFQLCAma2V5LT5wLCAma2V5LT5xLCBOVUxMKTsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9yc2EvcnNhX2ZyZWUuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9yc2EvcnNhX2ltcG9ydC5jIGIvc3JjL3BrL3JzYS9yc2FfaW1wb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwNjEzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9yc2EvcnNhX2ltcG9ydC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIHJzYV9pbXBvcnQuYworICBJbXBvcnQgYSBQS0NTIFJTQSBrZXksIFRvbSBTdCBEZW5pcworKi8gIAorCisjaWZkZWYgTVJTQQorCisvKioKKyAgSW1wb3J0IGFuIFJTQVB1YmxpY0tleSBvciBSU0FQcml2YXRlS2V5IFt0d28tcHJpbWUgb25seSwgb25seSBzdXBwb3J0ID49IDEwMjQtYml0IGtleXMsIGRlZmluZWQgaW4gUEtDUyAjMSB2Mi4xXQorICBAcGFyYW0gaW4gICAgICBUaGUgcGFja2V0IHRvIGltcG9ydCBmcm9tCisgIEBwYXJhbSBpbmxlbiAgIEl0J3MgbGVuZ3RoIChvY3RldHMpCisgIEBwYXJhbSBrZXkgICAgIFtvdXRdIERlc3RpbmF0aW9uIGZvciBuZXdseSBpbXBvcnRlZCBrZXkKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCB1cG9uIGVycm9yIGFsbG9jYXRlZCBtZW1vcnkgaXMgZnJlZWQKKyovCitpbnQgcnNhX2ltcG9ydChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgcnNhX2tleSAqa2V5KQoreworICAgaW50ICAgICAgICAgICBlcnI7CisgICBtcF9pbnQgICAgICAgIHplcm87CisKKyAgIExUQ19BUkdDSEsoaW4gICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CisKKyAgIC8qIGluaXQga2V5ICovCisgICBpZiAoKGVyciA9IG1wX2luaXRfbXVsdGkoJnplcm8sICZrZXktPmUsICZrZXktPmQsICZrZXktPk4sICZrZXktPmRRLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LT5kUCwgJmtleS0+cVAsICZrZXktPnAsICZrZXktPnEsIE5VTEwpKSAhPSBNUF9PS0FZKSB7CisgICAgICByZXR1cm4gbXBpX3RvX2x0Y19lcnJvcihlcnIpOworICAgfQorCisgICBpZiAoKGVyciA9IGRlcl9kZWNvZGVfc2VxdWVuY2VfbXVsdGkoaW4sIGlubGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZrZXktPk4sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0VPTCwgICAgIDBVTCwgTlVMTCkpICE9IENSWVBUX09LKSB7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9CisKKyAgIGlmIChtcF9jbXBfZCgma2V5LT5OLCAwKSA9PSBNUF9FUSkgeworICAgICAgLyogaXQncyBhIHByaXZhdGUga2V5ICovCisgICAgICBpZiAoKGVyciA9IGRlcl9kZWNvZGVfc2VxdWVuY2VfbXVsdGkoaW4sIGlubGVuLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAmemVybywgCisgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsIDFVTCwgJmtleS0+TiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsIDFVTCwgJmtleS0+ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAma2V5LT5kLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAma2V5LT5wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAma2V5LT5xLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAma2V5LT5kUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAma2V5LT5kUSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0lOVEVHRVIsIDFVTCwgJmtleS0+cVAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9FT0wsICAgICAwVUwsIE5VTEwpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgfQorICAgICAga2V5LT50eXBlID0gUEtfUFJJVkFURTsKKyAgIH0gZWxzZSBpZiAobXBfY21wX2QoJmtleS0+TiwgMSkgPT0gTVBfRVEpIHsKKyAgICAgIC8qIHdlIGRvbid0IHN1cHBvcnQgbXVsdGktcHJpbWUgUlNBICovCisgICAgICBlcnIgPSBDUllQVF9QS19JTlZBTElEX1RZUEU7CisgICAgICBnb3RvIExCTF9FUlI7CisgICB9IGVsc2UgeworICAgICAgLyogaXQncyBhIHB1YmxpYyBrZXkgYW5kIHdlIGxhY2sgZSAqLworICAgICAgaWYgKChlcnIgPSBkZXJfZGVjb2RlX3NlcXVlbmNlX211bHRpKGluLCBpbmxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFRDX0FTTjFfSU5URUdFUiwgMVVMLCAma2V5LT5OLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVENfQVNOMV9JTlRFR0VSLCAxVUwsICZrZXktPmUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUQ19BU04xX0VPTCwgICAgIDBVTCwgTlVMTCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICBnb3RvIExCTF9FUlI7CisgICAgICB9CisKKyAgICAgIC8qIGZyZWUgdXAgc29tZSByYW0gKi8KKyAgICAgIG1wX2NsZWFyX211bHRpKCZrZXktPnAsICZrZXktPnEsICZrZXktPnFQLCAma2V5LT5kUCwgJmtleS0+ZFEsIE5VTEwpOworICAgICAga2V5LT50eXBlID0gUEtfUFVCTElDOworICAgfQorICAgcmV0dXJuIENSWVBUX09LOworTEJMX0VSUjoKKyAgIG1wX2NsZWFyX211bHRpKCZ6ZXJvLCAma2V5LT5kLCAma2V5LT5lLCAma2V5LT5OLCAma2V5LT5kUSwgJmtleS0+ZFAsCisgICAgICAgICAgICAgICAgICAma2V5LT5xUCwgJmtleS0+cCwgJmtleS0+cSwgTlVMTCk7CisgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYgLyogTVJTQSAqLworCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9yc2EvcnNhX2ltcG9ydC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjEwICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzAzIDE4OjQ4OjI4ICQgKi8KZGlmZiAtLWdpdCBhL3JzYV9tYWtlX2tleS5jIGIvc3JjL3BrL3JzYS9yc2FfbWFrZV9rZXkuYwpzaW1pbGFyaXR5IGluZGV4IDY5JQpyZW5hbWUgZnJvbSByc2FfbWFrZV9rZXkuYwpyZW5hbWUgdG8gc3JjL3BrL3JzYS9yc2FfbWFrZV9rZXkuYwppbmRleCAzYTA2Y2E3Li5kODc0MTA2IDEwMDY0NAotLS0gYS9yc2FfbWFrZV9rZXkuYworKysgYi9zcmMvcGsvcnNhL3JzYV9tYWtlX2tleS5jCkBAIC02LDIwICs2LDMyIEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgogCi0vKiBSU0EgQ29kZSBieSBUb20gU3QgRGVuaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCisvKioKKyAgQGZpbGUgcnNhX21ha2Vfa2V5LmMKKyAgUlNBIGtleSBnZW5lcmF0aW9uLCBUb20gU3QgRGVuaXMKKyovICAKIAogI2lmZGVmIE1SU0EKIAorLyoqIAorICAgQ3JlYXRlIGFuIFJTQSBrZXkKKyAgIEBwYXJhbSBwcm5nICAgICBBbiBhY3RpdmUgUFJORyBzdGF0ZQorICAgQHBhcmFtIHdwcm5nICAgIFRoZSBpbmRleCBvZiB0aGUgUFJORyBkZXNpcmVkCisgICBAcGFyYW0gc2l6ZSAgICAgVGhlIHNpemUgb2YgdGhlIG1vZHVsdXMgKGtleSBzaXplKSBkZXNpcmVkIChvY3RldHMpCisgICBAcGFyYW0gZSAgICAgICAgVGhlICJlIiB2YWx1ZSAocHVibGljIGtleSkuICBlPT02NTUzNyBpcyBhIGdvb2QgY2hvaWNlCisgICBAcGFyYW0ga2V5ICAgICAgW291dF0gRGVzdGluYXRpb24gb2YgYSBuZXdseSBjcmVhdGVkIHByaXZhdGUga2V5IHBhaXIKKyAgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgdXBvbiBlcnJvciBhbGwgYWxsb2NhdGVkIHJhbSBpcyBmcmVlZAorKi8KIGludCByc2FfbWFrZV9rZXkocHJuZ19zdGF0ZSAqcHJuZywgaW50IHdwcm5nLCBpbnQgc2l6ZSwgbG9uZyBlLCByc2Ffa2V5ICprZXkpCiB7CiAgICBtcF9pbnQgcCwgcSwgdG1wMSwgdG1wMiwgdG1wMzsKICAgIGludCAgICBlcnI7CiAKLSAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhrZXkgIT0gTlVMTCk7CiAKICAgIGlmICgoc2l6ZSA8IChNSU5fUlNBX1NJWkUvOCkpIHx8IChzaXplID4gKE1BWF9SU0FfU0laRS84KSkpIHsKICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0tFWVNJWkU7CkBAIC02MSw0OCArNzMsNDQgQEAKIAogICAgLyogbWFrZSBrZXkgKi8KICAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgma2V5LT5lLCAma2V5LT5kLCAma2V5LT5OLCAma2V5LT5kUSwgJmtleS0+ZFAsCi0gICAgICAgICAgICAgICAgICAgICAma2V5LT5xUCwgJmtleS0+cFEsICZrZXktPnAsICZrZXktPnEsIE5VTEwpKSAhPSBNUF9PS0FZKSB7CisgICAgICAgICAgICAgICAgICAgICAma2V5LT5xUCwgJmtleS0+cCwgJmtleS0+cSwgTlVMTCkpICE9IE1QX09LQVkpIHsKICAgICAgIGdvdG8gZXJyb3I7CiAgICB9CiAKLSAgIGlmICgoZXJyID0gbXBfc2V0X2ludCgma2V5LT5lLCBlKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3IyOyB9IC8qIGtleS0+ZSA9ICBlICovCi0gICBpZiAoKGVyciA9IG1wX2ludm1vZCgma2V5LT5lLCAmdG1wMSwgJmtleS0+ZCkpICE9IE1QX09LQVkpICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiBrZXktPmQgPSAxL2UgbW9kIGxjbShwLTEscS0xKSAqLwotICAgaWYgKChlcnIgPSBtcF9tdWwoJnAsICZxLCAma2V5LT5OKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0gLyoga2V5LT5OID0gcHEgKi8KKyAgIGlmICgoZXJyID0gbXBfc2V0X2ludCgma2V5LT5lLCBlKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3IyOyB9IC8qIGtleS0+ZSA9ICBlICovCisgICBpZiAoKGVyciA9IG1wX2ludm1vZCgma2V5LT5lLCAmdG1wMSwgJmtleS0+ZCkpICE9IE1QX09LQVkpICAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiBrZXktPmQgPSAxL2UgbW9kIGxjbShwLTEscS0xKSAqLworICAgaWYgKChlcnIgPSBtcF9tdWwoJnAsICZxLCAma2V5LT5OKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0gLyoga2V5LT5OID0gcHEgKi8KIAotLyogb3B0aW1pemUgZm9yIENSVCBub3cgKi8KKyAgIC8qIG9wdGltaXplIGZvciBDUlQgbm93ICovCiAgICAvKiBmaW5kIGQgbW9kIHEtMSBhbmQgZCBtb2QgcC0xICovCi0gICBpZiAoKGVyciA9IG1wX3N1Yl9kKCZwLCAxLCAmdG1wMSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiB0bXAxID0gcS0xICovCi0gICBpZiAoKGVyciA9IG1wX3N1Yl9kKCZxLCAxLCAmdG1wMikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiB0bXAyID0gcC0xICovCisgICBpZiAoKGVyciA9IG1wX3N1Yl9kKCZwLCAxLCAmdG1wMSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiB0bXAxID0gcS0xICovCisgICBpZiAoKGVyciA9IG1wX3N1Yl9kKCZxLCAxLCAmdG1wMikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiB0bXAyID0gcC0xICovCisgICBpZiAoKGVyciA9IG1wX21vZCgma2V5LT5kLCAmdG1wMSwgJmtleS0+ZFApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiBkUCA9IGQgbW9kIHAtMSAqLworICAgaWYgKChlcnIgPSBtcF9tb2QoJmtleS0+ZCwgJnRtcDIsICZrZXktPmRRKSkgIT0gTVBfT0tBWSkgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0gLyogZFEgPSBkIG1vZCBxLTEgKi8KKyAgIGlmICgoZXJyID0gbXBfaW52bW9kKCZxLCAmcCwgJmtleS0+cVApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3IyOyB9IC8qIHFQID0gMS9xIG1vZCBwICovCiAKLSAgIGlmICgoZXJyID0gbXBfbW9kKCZrZXktPmQsICZ0bXAxLCAma2V5LT5kUCkpICE9IE1QX09LQVkpICAgICAgICB7IGdvdG8gZXJyb3IyOyB9IC8qIGRQID0gZCBtb2QgcC0xICovCi0gICBpZiAoKGVyciA9IG1wX21vZCgma2V5LT5kLCAmdG1wMiwgJmtleS0+ZFEpKSAhPSBNUF9PS0FZKSAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiBkUSA9IGQgbW9kIHEtMSAqLwotCi0gICBpZiAoKGVyciA9IG1wX2ludm1vZCgmcSwgJnAsICZrZXktPnFQKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiBxUCA9IDEvcSBtb2QgcCAqLwotICAgaWYgKChlcnIgPSBtcF9tdWxtb2QoJmtleS0+cVAsICZxLCAma2V5LT5OLCAma2V5LT5xUCkpICE9IE1QX09LQVkpICAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiBxUCA9IHEgKiAoMS9xIG1vZCBwKSBtb2QgTiAqLwotCi0gICBpZiAoKGVyciA9IG1wX2ludm1vZCgmcCwgJnEsICZrZXktPnBRKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiBwUSA9IDEvcCBtb2QgcSAqLwotICAgaWYgKChlcnIgPSBtcF9tdWxtb2QoJmtleS0+cFEsICZwLCAma2V5LT5OLCAma2V5LT5wUSkpICE9IE1QX09LQVkpICAgICAgICAgeyBnb3RvIGVycm9yMjsgfSAvKiBwUSA9IHAgKiAoMS9wIG1vZCBxKSBtb2QgTiAqLwotCi0gICBpZiAoKGVyciA9IG1wX2NvcHkoJnAsICZrZXktPnApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfQotICAgaWYgKChlcnIgPSBtcF9jb3B5KCZxLCAma2V5LT5xKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0KKyAgIGlmICgoZXJyID0gbXBfY29weSgmcCwgJmtleS0+cCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3IyOyB9CisgICBpZiAoKGVyciA9IG1wX2NvcHkoJnEsICZrZXktPnEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfQogCiAgICAvKiBzaHJpbmsgcmFtIHJlcXVpcmVkICAqLwotICAgaWYgKChlcnIgPSBtcF9zaHJpbmsoJmtleS0+ZSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0KLSAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPmQpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3IyOyB9Ci0gICBpZiAoKGVyciA9IG1wX3Nocmluaygma2V5LT5OKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfQotICAgaWYgKChlcnIgPSBtcF9zaHJpbmsoJmtleS0+ZFEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0KLSAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPmRQKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3IyOyB9Ci0gICBpZiAoKGVyciA9IG1wX3Nocmluaygma2V5LT5xUCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfQotICAgaWYgKChlcnIgPSBtcF9zaHJpbmsoJmtleS0+cFEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0KLSAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPnApKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3IyOyB9Ci0gICBpZiAoKGVyciA9IG1wX3Nocmluaygma2V5LT5xKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfQorICAgaWYgKChlcnIgPSBtcF9zaHJpbmsoJmtleS0+ZSkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0KKyAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPmQpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3IyOyB9CisgICBpZiAoKGVyciA9IG1wX3Nocmluaygma2V5LT5OKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfQorICAgaWYgKChlcnIgPSBtcF9zaHJpbmsoJmtleS0+ZFEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0KKyAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPmRQKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3IyOyB9CisgICBpZiAoKGVyciA9IG1wX3Nocmluaygma2V5LT5xUCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIGVycm9yMjsgfQorICAgaWYgKChlcnIgPSBtcF9zaHJpbmsoJmtleS0+cCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBlcnJvcjI7IH0KKyAgIGlmICgoZXJyID0gbXBfc2hyaW5rKCZrZXktPnEpKSAhPSBNUF9PS0FZKSAgICAgICAgICAgICAgICAgICAgICAgICB7IGdvdG8gZXJyb3IyOyB9CiAKLSAgIGVyciA9IENSWVBUX09LOwotICAga2V5LT50eXBlID0gUEtfUFJJVkFURV9PUFRJTUlaRUQ7CisgICAvKiBzZXQga2V5IHR5cGUgKGluIHRoaXMgY2FzZSBpdCdzIENSVCBvcHRpbWl6ZWQpICovCisgICBrZXktPnR5cGUgPSBQS19QUklWQVRFOworCisgICAvKiByZXR1cm4gb2sgYW5kIGZyZWUgdGVtcHMgKi8KKyAgIGVyciAgICAgICA9IENSWVBUX09LOwogICAgZ290byBkb25lOwogZXJyb3IyOgogICAgbXBfY2xlYXJfbXVsdGkoJmtleS0+ZCwgJmtleS0+ZSwgJmtleS0+TiwgJmtleS0+ZFEsICZrZXktPmRQLAotICAgICAgICAgICAgICAgICAgJmtleS0+cVAsICZrZXktPnBRLCAma2V5LT5wLCAma2V5LT5xLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICZrZXktPnFQLCAma2V5LT5wLCAma2V5LT5xLCBOVUxMKTsKIGVycm9yOgogICAgZXJyID0gbXBpX3RvX2x0Y19lcnJvcihlcnIpOwogZG9uZToKQEAgLTExMSwzICsxMTksNyBAQAogfQogCiAjZW5kaWYKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL3JzYS9yc2FfbWFrZV9rZXkuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9way9yc2EvcnNhX3NpZ25faGFzaC5jIGIvc3JjL3BrL3JzYS9yc2Ffc2lnbl9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMxYmRhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9yc2EvcnNhX3NpZ25faGFzaC5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIHJzYV9zaWduX2hhc2guYworICBSU0EgUEtDUyB2MiBQU1Mgc2lnbiBoYXNoLCBUb20gU3QgRGVuaXMKKyovICAKKworI2lmZGVmIE1SU0EKKworLyoqCisgIChQS0NTICMxLCB2Mi4wKSBQU1MgcGFkIHRoZW4gc2lnbiAKKyAgQHBhcmFtIGluICAgICAgICBUaGUgaGFzaCB0byBzaWduCisgIEBwYXJhbSBpbmxlbiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgaGFzaCB0byBzaWduIChvY3RldHMpCisgIEBwYXJhbSBvdXQgICAgICAgW291dF0gVGhlIHNpZ25hdHVyZQorICBAcGFyYW0gb3V0bGVuICAgIFtpbi9vdXRdIFRoZSBtYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIHNpZ25hdHVyZSAKKyAgQHBhcmFtIHBybmcgICAgICBBbiBhY3RpdmUgUFJORyBzdGF0ZQorICBAcGFyYW0gcHJuZ19pZHggIFRoZSBpbmRleCBvZiB0aGUgUFJORyBkZXNpcmVkCisgIEBwYXJhbSBoYXNoX2lkeCAgVGhlIGluZGV4IG9mIHRoZSBoYXNoIGRlc2lyZWQKKyAgQHBhcmFtIHNhbHRsZW4gICBUaGUgbGVuZ3RoIG9mIHRoZSBzYWx0IGRlc2lyZWQgKG9jdGV0cykKKyAgQHBhcmFtIGtleSAgICAgICBUaGUgcHJpdmF0ZSBSU0Ega2V5IHRvIHVzZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovCitpbnQgcnNhX3NpZ25faGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgICAgICAgdW5zaWduZWQgbG9uZyAgaW5sZW4sIAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCAgICAgIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICBwcm5nX3N0YXRlICAgICpwcm5nLCAgICAgaW50ICAgICAgICAgICAgcHJuZ19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBoYXNoX2lkeCwgdW5zaWduZWQgbG9uZyAgc2FsdGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJzYV9rZXkgKmtleSkKK3sKKyAgIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19iaXRsZW4sIG1vZHVsdXNfYnl0ZWxlbiwgeDsKKyAgIGludCAgICAgICAgICAgZXJyOworICAgCisgIExUQ19BUkdDSEsoaW4gICAgICAgIT0gTlVMTCk7CisgIExUQ19BUkdDSEsob3V0ICAgICAgIT0gTlVMTCk7CisgIExUQ19BUkdDSEsob3V0bGVuICAgIT0gTlVMTCk7CisgIExUQ19BUkdDSEsoa2V5ICAgICAgIT0gTlVMTCk7CisgIAorICAvKiB2YWxpZCBwcm5nIGFuZCBoYXNoID8gKi8KKyAgaWYgKChlcnIgPSBwcm5nX2lzX3ZhbGlkKHBybmdfaWR4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgcmV0dXJuIGVycjsKKyAgfQorICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaF9pZHgpKSAhPSBDUllQVF9PSykgeworICAgICByZXR1cm4gZXJyOworICB9CisgIAorICAvKiBnZXQgbW9kdWx1cyBsZW4gaW4gYml0cyAqLworICBtb2R1bHVzX2JpdGxlbiA9IG1wX2NvdW50X2JpdHMoJihrZXktPk4pKTsKKworICAvKiBvdXRsZW4gbXVzdCBiZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgbW9kdWx1cyAqLworICBtb2R1bHVzX2J5dGVsZW4gPSBtcF91bnNpZ25lZF9iaW5fc2l6ZSgmKGtleS0+TikpOworICBpZiAobW9kdWx1c19ieXRlbGVuID4gKm91dGxlbikgeworICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICB9CisgICAgICAKKyAgLyogUFNTIHBhZCB0aGUga2V5ICovCisgIHggPSAqb3V0bGVuOworICBpZiAoKGVyciA9IHBrY3NfMV9wc3NfZW5jb2RlKGluLCBpbmxlbiwgc2FsdGxlbiwgcHJuZywgcHJuZ19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9pZHgsIG1vZHVsdXNfYml0bGVuLCBvdXQsICZ4KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIC8qIFJTQSBlbmNvZGUgaXQgKi8KKyAgcmV0dXJuIHJzYV9leHB0bW9kKG91dCwgeCwgb3V0LCBvdXRsZW4sIFBLX1BSSVZBVEUsIGtleSk7Cit9CisKKyNlbmRpZiAvKiBNUlNBICovCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9way9yc2EvcnNhX3NpZ25faGFzaC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BrL3JzYS9yc2FfdmVyaWZ5X2hhc2guYyBiL3NyYy9way9yc2EvcnNhX3ZlcmlmeV9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwMzY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9way9yc2EvcnNhX3ZlcmlmeV9oYXNoLmMKQEAgLTAsMCArMSw4NiBAQAorLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcworICoKKyAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYworICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCisgKgorICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKKyAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KKyAqCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKi8KKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKioKKyAgQGZpbGUgcnNhX3ZlcmlmeV9oYXNoLmMKKyAgUlNBIFBLQ1MgdjIgUFNTIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24sIFRvbSBTdCBEZW5pcworKi8gIAorCisjaWZkZWYgTVJTQQorCisvKioKKyAgKFBLQ1MgIzEsIHYyLjApIGRlLXNpZ24gdGhlbiBQU1MgZGVwYWQKKyAgQHBhcmFtIHNpZyAgICAgICAgICAgICAgVGhlIHNpZ25hdHVyZSBkYXRhCisgIEBwYXJhbSBzaWdsZW4gICAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHNpZ25hdHVyZSBkYXRhIChvY3RldHMpCisgIEBwYXJhbSBoYXNoICAgICAgICAgICAgIFRoZSBoYXNoIG9mIHRoZSBtZXNzYWdlIHRoYXQgd2FzIHNpZ25lZAorICBAcGFyYW0gaGFzaGxlbiAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBoYXNoIG9mIHRoZSBtZXNzYWdlIHRoYXQgd2FzIHNpZ25lZCAob2N0ZXRzKQorICBAcGFyYW0gaGFzaF9pZHggICAgICAgICBUaGUgaW5kZXggb2YgdGhlIGRlc2lyZWQgaGFzaAorICBAcGFyYW0gc2FsdGxlbiAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzYWx0IHVzZWQgZHVyaW5nIHNpZ25hdHVyZQorICBAcGFyYW0gc3RhdCAgICAgICAgICAgICBbb3V0XSBUaGUgcmVzdWx0IG9mIHRoZSBzaWduYXR1cmUgY29tcGFyaXNvbiwgMT09dmFsaWQsIDA9PWludmFsaWQKKyAgQHBhcmFtIGtleSAgICAgICAgICAgICAgVGhlIHB1YmxpYyBSU0Ega2V5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleSB0aGF0IHBlcmZvcm1lZCB0aGUgc2lnbmF0dXJlCisgIEByZXR1cm4gQ1JZUFRfT0sgb24gc3VjY2VzcyAoZXZlbiBpZiB0aGUgc2lnbmF0dXJlIGlzIGludmFsaWQpCisqLworaW50IHJzYV92ZXJpZnlfaGFzaChjb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsICAgICAgdW5zaWduZWQgbG9uZyBzaWdsZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhhc2gsICAgICB1bnNpZ25lZCBsb25nIGhhc2hsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGhhc2hfaWR4LCB1bnNpZ25lZCBsb25nIHNhbHRsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgKnN0YXQsICAgICByc2Ffa2V5ICAgICAgKmtleSkKK3sKKyAgIHVuc2lnbmVkIGxvbmcgbW9kdWx1c19iaXRsZW4sIG1vZHVsdXNfYnl0ZWxlbiwgeDsKKyAgIGludCAgICAgICAgICAgZXJyOworICAgdW5zaWduZWQgY2hhciAqdG1wYnVmOworICAgCisgIExUQ19BUkdDSEsoaGFzaCAgIT0gTlVMTCk7CisgIExUQ19BUkdDSEsoc2lnICAgICAgIT0gTlVMTCk7CisgIExUQ19BUkdDSEsoc3RhdCAgICAgIT0gTlVMTCk7CisgIExUQ19BUkdDSEsoa2V5ICAgICAgIT0gTlVMTCk7CisKKyAgLyogZGVmYXVsdCB0byBpbnZhbGlkICovCisgICpzdGF0ID0gMDsKKyAgCisgIC8qIHZhbGlkIGhhc2ggPyAqLworICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQoaGFzaF9pZHgpKSAhPSBDUllQVF9PSykgeworICAgICByZXR1cm4gZXJyOworICB9CisgIAorICAvKiBnZXQgbW9kdWx1cyBsZW4gaW4gYml0cyAqLworICBtb2R1bHVzX2JpdGxlbiA9IG1wX2NvdW50X2JpdHMoJihrZXktPk4pKTsKKworICAvKiBvdXRsZW4gbXVzdCBiZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiB0aGUgbW9kdWx1cyAqLworICBtb2R1bHVzX2J5dGVsZW4gPSBtcF91bnNpZ25lZF9iaW5fc2l6ZSgmKGtleS0+TikpOworICBpZiAobW9kdWx1c19ieXRlbGVuICE9IHNpZ2xlbikgeworICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9QQUNLRVQ7CisgIH0KKyAgCisgIC8qIGFsbG9jYXRlIHRlbXAgYnVmZmVyIGZvciBkZWNvZGVkIHNpZyAqLworICB0bXBidWYgPSBYTUFMTE9DKHNpZ2xlbik7CisgIGlmICh0bXBidWYgPT0gTlVMTCkgeworICAgICByZXR1cm4gQ1JZUFRfTUVNOworICB9CisgICAgICAKKyAgLyogUlNBIGRlY29kZSBpdCAgKi8KKyAgeCA9IHNpZ2xlbjsKKyAgaWYgKChlcnIgPSByc2FfZXhwdG1vZChzaWcsIHNpZ2xlbiwgdG1wYnVmLCAmeCwgUEtfUFVCTElDLCBrZXkpKSAhPSBDUllQVF9PSykgeworICAgICBYRlJFRSh0bXBidWYpOworICAgICByZXR1cm4gZXJyOworICB9CisgIAorICAvKiBQU1MgZGVjb2RlIGl0ICovCisgIGVyciA9IHBrY3NfMV9wc3NfZGVjb2RlKGhhc2gsIGhhc2hsZW4sIHRtcGJ1ZiwgeCwgc2FsdGxlbiwgaGFzaF9pZHgsIG1vZHVsdXNfYml0bGVuLCBzdGF0KTsKKyAgWEZSRUUodG1wYnVmKTsKKyAgcmV0dXJuIGVycjsKK30KKworI2VuZGlmIC8qIE1SU0EgKi8KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BrL3JzYS9yc2FfdmVyaWZ5X2hhc2guYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm5ncy9mb3J0dW5hLmMgYi9zcmMvcHJuZ3MvZm9ydHVuYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhM2I4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJuZ3MvZm9ydHVuYS5jCkBAIC0wLDAgKzEsMzkwIEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSBmb3J0dW5hLmMKKyAgRm9ydHVuYSBQUk5HLCBUb20gU3QgRGVuaXMKKyovCisgIAorLyogSW1wbGVtZW50YXRpb24gb2YgRm9ydHVuYSBieSBUb20gU3QgRGVuaXMgCisKK1dlIGRldmlhdGUgc2xpZ2h0bHkgaGVyZSBmb3IgcmVhc29ucyBvZiBzaW1wbGljaXR5IFthbmQgdG8gZml0IGluIHRoZSBBUEldLiAgRmlyc3QgYWxsICJzb3VyY2VzIgoraW4gdGhlIEFkZEVudHJvcHkgZnVuY3Rpb24gYXJlIGZpeGVkIHRvIDAuICBTZWNvbmQgc2luY2Ugbm8gcmVsaWFibGUgdGltZXIgaXMgcHJvdmlkZWQgCit3ZSByZXNlZWQgYXV0b21hdGljYWxseSB3aGVuIGxlbihwb29sMCkgPj0gNjQgb3IgZXZlcnkgRk9SVFVOQV9XRCBjYWxscyB0byB0aGUgcmVhZCBmdW5jdGlvbiAqLworCisjaWZkZWYgRk9SVFVOQSAKKworLyogcmVxdXJpZXMgU0hBMjU2IGFuZCBBRVMgICovCisjaWYgIShkZWZpbmVkKFJJSk5EQUVMKSAmJiBkZWZpbmVkKFNIQTI1NikpCisgICAjZXJyb3IgRk9SVFVOQSByZXF1aXJlcyBTSEEyNTYgYW5kIFJJSk5EQUVMIChBRVMpCisjZW5kaWYKKworI2lmbmRlZiBGT1JUVU5BX1BPT0xTCisgICAjd2FybmluZyBGT1JUVU5BX1BPT0xTIHdhcyBub3QgcHJldmlvdXNseSBkZWZpbmVkIChvbGQgaGVhZGVycz8pCisgICAjZGVmaW5lIEZPUlRVTkFfUE9PTFMgMzIKKyNlbmRpZgorCisjaWYgRk9SVFVOQV9QT09MUyA8IDQgfHwgRk9SVFVOQV9QT09MUyA+IDMyCisgICAjZXJyb3IgRk9SVFVOQV9QT09MUyBtdXN0IGJlIGluIFs0Li4zMl0KKyNlbmRpZgorCitjb25zdCBzdHJ1Y3QgbHRjX3BybmdfZGVzY3JpcHRvciBmb3J0dW5hX2Rlc2MgPSB7CisgICAgImZvcnR1bmEiLCAxMDI0LAorICAgICZmb3J0dW5hX3N0YXJ0LAorICAgICZmb3J0dW5hX2FkZF9lbnRyb3B5LAorICAgICZmb3J0dW5hX3JlYWR5LAorICAgICZmb3J0dW5hX3JlYWQsCisgICAgJmZvcnR1bmFfZG9uZSwKKyAgICAmZm9ydHVuYV9leHBvcnQsCisgICAgJmZvcnR1bmFfaW1wb3J0LAorICAgICZmb3J0dW5hX3Rlc3QKK307CisKKy8qIHVwZGF0ZSB0aGUgSVYgKi8KK3N0YXRpYyB2b2lkIGZvcnR1bmFfdXBkYXRlX2l2KHBybmdfc3RhdGUgKnBybmcpCit7CisgICBpbnQgICAgICAgICAgICB4OworICAgdW5zaWduZWQgY2hhciAqSVY7CisgICAvKiB1cGRhdGUgSVYgKi8KKyAgIElWID0gcHJuZy0+Zm9ydHVuYS5JVjsKKyAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKSB7CisgICAgICBJVlt4XSA9IChJVlt4XSArIDEpICYgMjU1OworICAgICAgaWYgKElWW3hdICE9IDApIGJyZWFrOworICAgfQorfQorCisvKiByZXNlZWQgdGhlIFBSTkcgKi8KK3N0YXRpYyBpbnQgZm9ydHVuYV9yZXNlZWQocHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgIHVuc2lnbmVkIGNoYXIgdG1wW01BWEJMT0NLU0laRV07CisgICBoYXNoX3N0YXRlICAgIG1kOworICAgaW50ICAgICAgICAgICBlcnIsIHg7CisKKyAgICsrcHJuZy0+Zm9ydHVuYS5yZXNldF9jbnQ7CisKKyAgIC8qIG5ldyBLID09IFNIQTI1NihLIHx8IHMpIHdoZXJlIHMgPT0gU0hBMjU2KFAwKSB8fCBTSEEyNTYoUDEpIC4uLiAqLworICAgc2hhMjU2X2luaXQoJm1kKTsKKyAgIGlmICgoZXJyID0gc2hhMjU2X3Byb2Nlc3MoJm1kLCBwcm5nLT5mb3J0dW5hLkssIDMyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIGZvciAoeCA9IDA7IHggPCBGT1JUVU5BX1BPT0xTOyB4KyspIHsKKyAgICAgICBpZiAoeCA9PSAwIHx8ICgocHJuZy0+Zm9ydHVuYS5yZXNldF9jbnQgPj4gKHgtMSkpICYgMSkgPT0gMCkgeyAKKyAgICAgICAgICAvKiB0ZXJtaW5hdGUgdGhpcyBoYXNoICovCisgICAgICAgICAgaWYgKChlcnIgPSBzaGEyNTZfZG9uZSgmcHJuZy0+Zm9ydHVuYS5wb29sW3hdLCB0bXApKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgIHJldHVybiBlcnI7IAorICAgICAgICAgIH0KKyAgICAgICAgICAvKiBhZGQgaXQgdG8gdGhlIHN0cmluZyAqLworICAgICAgICAgIGlmICgoZXJyID0gc2hhMjU2X3Byb2Nlc3MoJm1kLCB0bXAsIDMyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiByZXNldCB0aGlzIHBvb2wgKi8KKyAgICAgICAgICBzaGEyNTZfaW5pdCgmcHJuZy0+Zm9ydHVuYS5wb29sW3hdKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKyAgIH0KKworICAgLyogZmluaXNoIGtleSAqLworICAgaWYgKChlcnIgPSBzaGEyNTZfZG9uZSgmbWQsIHBybmctPmZvcnR1bmEuSykpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOyAKKyAgIH0KKyAgIGlmICgoZXJyID0gcmlqbmRhZWxfc2V0dXAocHJuZy0+Zm9ydHVuYS5LLCAzMiwgMCwgJnBybmctPmZvcnR1bmEuc2tleSkpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorICAgZm9ydHVuYV91cGRhdGVfaXYocHJuZyk7CisKKyAgIC8qIHJlc2V0IHBvb2wgbGVuICovCisgICBwcm5nLT5mb3J0dW5hLnBvb2wwX2xlbiA9IDA7CisgICBwcm5nLT5mb3J0dW5hLndkICAgICAgICA9IDA7CisKKworI2lmZGVmIExUQ19DTEVBTl9TVEFDSworICAgemVyb21lbSgmbWQsIHNpemVvZihtZCkpOworICAgemVyb21lbSh0bXAsIHNpemVvZih0bXApKTsKKyNlbmRpZgorCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKy8qKgorICBTdGFydCB0aGUgUFJORworICBAcGFyYW0gcHJuZyAgICAgW291dF0gVGhlIFBSTkcgc3RhdGUgdG8gaW5pdGlhbGl6ZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCBmb3J0dW5hX3N0YXJ0KHBybmdfc3RhdGUgKnBybmcpCit7CisgICBpbnQgZXJyLCB4OworCisgICBMVENfQVJHQ0hLKHBybmcgIT0gTlVMTCk7CisgICAKKyAgIC8qIGluaXRpYWxpemUgdGhlIHBvb2xzICovCisgICBmb3IgKHggPSAwOyB4IDwgRk9SVFVOQV9QT09MUzsgeCsrKSB7CisgICAgICAgc2hhMjU2X2luaXQoJnBybmctPmZvcnR1bmEucG9vbFt4XSk7CisgICB9CisgICBwcm5nLT5mb3J0dW5hLnBvb2xfaWR4ID0gcHJuZy0+Zm9ydHVuYS5wb29sMF9sZW4gPSBwcm5nLT5mb3J0dW5hLnJlc2V0X2NudCA9IAorICAgcHJuZy0+Zm9ydHVuYS53ZCA9IDA7CisKKyAgIC8qIHJlc2V0IGJ1ZnMgKi8KKyAgIHplcm9tZW0ocHJuZy0+Zm9ydHVuYS5LLCAzMik7CisgICBpZiAoKGVyciA9IHJpam5kYWVsX3NldHVwKHBybmctPmZvcnR1bmEuSywgMzIsIDAsICZwcm5nLT5mb3J0dW5hLnNrZXkpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIHplcm9tZW0ocHJuZy0+Zm9ydHVuYS5JViwgMTYpOworCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKy8qKgorICBBZGQgZW50cm9weSB0byB0aGUgUFJORyBzdGF0ZQorICBAcGFyYW0gaW4gICAgICAgVGhlIGRhdGEgdG8gYWRkCisgIEBwYXJhbSBpbmxlbiAgICBMZW5ndGggb2YgdGhlIGRhdGEgdG8gYWRkCisgIEBwYXJhbSBwcm5nICAgICBQUk5HIHN0YXRlIHRvIHVwZGF0ZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCBmb3J0dW5hX2FkZF9lbnRyb3B5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBwcm5nX3N0YXRlICpwcm5nKQoreworICAgdW5zaWduZWQgY2hhciB0bXBbMl07CisgICBpbnQgICAgICAgICAgIGVycjsKKworICAgTFRDX0FSR0NISyhpbiAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHBybmcgIT0gTlVMTCk7CisKKyAgIC8qIGVuc3VyZSBpbmxlbiA8PSAzMiAqLworICAgaWYgKGlubGVuID4gMzIpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgLyogYWRkIHMgfHwgbGVuZ3RoKGluKSB8fCBpbiB0byBwb29sW3Bvb2xfaWR4XSAqLworICAgdG1wWzBdID0gMDsKKyAgIHRtcFsxXSA9IGlubGVuOworICAgaWYgKChlcnIgPSBzaGEyNTZfcHJvY2VzcygmcHJuZy0+Zm9ydHVuYS5wb29sW3BybmctPmZvcnR1bmEucG9vbF9pZHhdLCB0bXAsIDIpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIGlmICgoZXJyID0gc2hhMjU2X3Byb2Nlc3MoJnBybmctPmZvcnR1bmEucG9vbFtwcm5nLT5mb3J0dW5hLnBvb2xfaWR4XSwgaW4sIGlubGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBpZiAocHJuZy0+Zm9ydHVuYS5wb29sX2lkeCA9PSAwKSB7CisgICAgICBwcm5nLT5mb3J0dW5hLnBvb2wwX2xlbiArPSBpbmxlbjsKKyAgIH0KKyAgIGlmICgrKyhwcm5nLT5mb3J0dW5hLnBvb2xfaWR4KSA9PSBGT1JUVU5BX1BPT0xTKSB7CisgICAgICBwcm5nLT5mb3J0dW5hLnBvb2xfaWR4ID0gMDsKKyAgIH0KKworICAgcmV0dXJuIENSWVBUX09LOworfQorCisvKioKKyAgTWFrZSB0aGUgUFJORyByZWFkeSB0byByZWFkIGZyb20KKyAgQHBhcmFtIHBybmcgICBUaGUgUFJORyB0byBtYWtlIGFjdGl2ZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCBmb3J0dW5hX3JlYWR5KHBybmdfc3RhdGUgKnBybmcpCit7CisgICByZXR1cm4gZm9ydHVuYV9yZXNlZWQocHJuZyk7Cit9CisKKy8qKgorICBSZWFkIGZyb20gdGhlIFBSTkcKKyAgQHBhcmFtIG91dCAgICAgIERlc3RpbmF0aW9uCisgIEBwYXJhbSBvdXRsZW4gICBMZW5ndGggb2Ygb3V0cHV0CisgIEBwYXJhbSBwcm5nICAgICBUaGUgYWN0aXZlIFBSTkcgdG8gcmVhZCBmcm9tCisgIEByZXR1cm4gTnVtYmVyIG9mIG9jdGV0cyByZWFkCisqLyAgCit1bnNpZ25lZCBsb25nIGZvcnR1bmFfcmVhZCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgb3V0bGVuLCBwcm5nX3N0YXRlICpwcm5nKQoreworICAgdW5zaWduZWQgY2hhciB0bXBbMTZdOworICAgaW50ICAgICAgICAgICBlcnI7CisgICB1bnNpZ25lZCBsb25nIHRsZW47CisKKyAgIExUQ19BUkdDSEsob3V0ICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHJuZyAhPSBOVUxMKTsKKworICAgLyogZG8gd2UgaGF2ZSB0byByZXNlZWQ/ICovCisgICBpZiAoKytwcm5nLT5mb3J0dW5hLndkID09IEZPUlRVTkFfV0QgfHwgcHJuZy0+Zm9ydHVuYS5wb29sMF9sZW4gPj0gNjQpIHsKKyAgICAgIGlmICgoZXJyID0gZm9ydHVuYV9yZXNlZWQocHJuZykpICE9IENSWVBUX09LKSB7CisgICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgIH0KKworICAgLyogbm93IGdlbmVyYXRlIHRoZSBibG9ja3MgcmVxdWlyZWQgKi8KKyAgIHRsZW4gPSBvdXRsZW47CisKKyAgIC8qIGhhbmRsZSB3aG9sZSBibG9ja3Mgd2l0aG91dCB0aGUgZXh0cmEgbWVtY3B5ICovCisgICB3aGlsZSAob3V0bGVuID49IDE2KSB7CisgICAgICAvKiBlbmNyeXB0IHRoZSBJViBhbmQgc3RvcmUgaXQgKi8KKyAgICAgIHJpam5kYWVsX2VjYl9lbmNyeXB0KHBybmctPmZvcnR1bmEuSVYsIG91dCwgJnBybmctPmZvcnR1bmEuc2tleSk7CisgICAgICBvdXQgKz0gMTY7CisgICAgICBvdXRsZW4gLT0gMTY7CisgICAgICBmb3J0dW5hX3VwZGF0ZV9pdihwcm5nKTsKKyAgIH0KKworICAgLyogbGVmdCBvdmVyIGJ5dGVzPyAqLworICAgaWYgKG91dGxlbiA+IDApIHsKKyAgICAgIHJpam5kYWVsX2VjYl9lbmNyeXB0KHBybmctPmZvcnR1bmEuSVYsIHRtcCwgJnBybmctPmZvcnR1bmEuc2tleSk7CisgICAgICBYTUVNQ1BZKG91dCwgdG1wLCBvdXRsZW4pOworICAgICAgZm9ydHVuYV91cGRhdGVfaXYocHJuZyk7CisgICB9CisgICAgICAgCisgICAvKiBnZW5lcmF0ZSBuZXcga2V5ICovCisgICByaWpuZGFlbF9lY2JfZW5jcnlwdChwcm5nLT5mb3J0dW5hLklWLCBwcm5nLT5mb3J0dW5hLksgICAsICZwcm5nLT5mb3J0dW5hLnNrZXkpOyBmb3J0dW5hX3VwZGF0ZV9pdihwcm5nKTsKKyAgIHJpam5kYWVsX2VjYl9lbmNyeXB0KHBybmctPmZvcnR1bmEuSVYsIHBybmctPmZvcnR1bmEuSysxNiwgJnBybmctPmZvcnR1bmEuc2tleSk7IGZvcnR1bmFfdXBkYXRlX2l2KHBybmcpOworICAgaWYgKChlcnIgPSByaWpuZGFlbF9zZXR1cChwcm5nLT5mb3J0dW5hLkssIDMyLCAwLCAmcHJuZy0+Zm9ydHVuYS5za2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiAwOworICAgfQorCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKHRtcCwgc2l6ZW9mKHRtcCkpOworI2VuZGlmCisgICByZXR1cm4gdGxlbjsKK30gICAKKworLyoqCisgIFRlcm1pbmF0ZSB0aGUgUFJORworICBAcGFyYW0gcHJuZyAgIFRoZSBQUk5HIHRvIHRlcm1pbmF0ZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCBmb3J0dW5hX2RvbmUocHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgIGludCAgICAgICAgICAgZXJyLCB4OworICAgdW5zaWduZWQgY2hhciB0bXBbMzJdOworCisgICBMVENfQVJHQ0hLKHBybmcgIT0gTlVMTCk7CisKKyAgIC8qIHRlcm1pbmF0ZSBhbGwgdGhlIGhhc2hlcyAqLworICAgZm9yICh4ID0gMDsgeCA8IEZPUlRVTkFfUE9PTFM7IHgrKykgeworICAgICAgIGlmICgoZXJyID0gc2hhMjU2X2RvbmUoJihwcm5nLT5mb3J0dW5hLnBvb2xbeF0pLCB0bXApKSAhPSBDUllQVF9PSykgeworICAgICAgICAgIHJldHVybiBlcnI7IAorICAgICAgIH0KKyAgIH0KKyAgIC8qIGNhbGwgY2lwaGVyIGRvbmUgd2hlbiB3ZSBpbnZlbnQgb25lIDstKSAqLworCisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKHRtcCwgc2l6ZW9mKHRtcCkpOworI2VuZGlmCisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworLyoqCisgIEV4cG9ydCB0aGUgUFJORyBzdGF0ZQorICBAcGFyYW0gb3V0ICAgICAgIFtvdXRdIERlc3RpbmF0aW9uCisgIEBwYXJhbSBvdXRsZW4gICAgW2luL291dF0gTWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBzdGF0ZQorICBAcGFyYW0gcHJuZyAgICAgIFRoZSBQUk5HIHRvIGV4cG9ydAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCBmb3J0dW5hX2V4cG9ydCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGxvbmcgKm91dGxlbiwgcHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgIGludCAgICAgICAgIHgsIGVycjsKKyAgIGhhc2hfc3RhdGUgKm1kOworCisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwcm5nICAgIT0gTlVMTCk7CisKKyAgIC8qIHdlJ2xsIHdyaXRlIGJ5dGVzIGZvciBzJmcncyAqLworICAgaWYgKCpvdXRsZW4gPCAzMipGT1JUVU5BX1BPT0xTKSB7CisgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICAgfQorCisgICBtZCA9IFhNQUxMT0Moc2l6ZW9mKGhhc2hfc3RhdGUpKTsKKyAgIGlmIChtZCA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gQ1JZUFRfTUVNOworICAgfQorCisgICAvKiB0byBlbWl0IHRoZSBzdGF0ZSB3ZSBjb3B5IGVhY2ggcG9vbCwgdGVybWluYXRlIGl0IHRoZW4gaGFzaCBpdCBhZ2FpbiBzbyAKKyAgICAqIGFuIGF0dGFja2VyIHdobyBzZWVzIHRoZSBzdGF0ZSBjYW4ndCBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFBSTkcgCisgICAgKi8gICAKKyAgIGZvciAoeCA9IDA7IHggPCBGT1JUVU5BX1BPT0xTOyB4KyspIHsKKyAgICAgIC8qIGNvcHkgdGhlIFBSTkcgKi8KKyAgICAgIFhNRU1DUFkobWQsICYocHJuZy0+Zm9ydHVuYS5wb29sW3hdKSwgc2l6ZW9mKCptZCkpOworCisgICAgICAvKiB0ZXJtaW5hdGUgaXQgKi8KKyAgICAgIGlmICgoZXJyID0gc2hhMjU2X2RvbmUobWQsIG91dCt4KjMyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgIH0KKworICAgICAgLyogbm93IGhhc2ggaXQgKi8KKyAgICAgIGlmICgoZXJyID0gc2hhMjU2X2luaXQobWQpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgZ290byBMQkxfRVJSOworICAgICAgfQorICAgICAgaWYgKChlcnIgPSBzaGEyNTZfcHJvY2VzcyhtZCwgb3V0K3gqMzIsIDMyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgIH0KKyAgICAgIGlmICgoZXJyID0gc2hhMjU2X2RvbmUobWQsIG91dCt4KjMyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgIGdvdG8gTEJMX0VSUjsKKyAgICAgIH0KKyAgIH0KKyAgICpvdXRsZW4gPSAzMipGT1JUVU5BX1BPT0xTOworICAgZXJyID0gQ1JZUFRfT0s7CisKK0xCTF9FUlI6CisjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCisgICB6ZXJvbWVtKG1kLCBzaXplb2YoKm1kKSk7CisjZW5kaWYKKyAgIFhGUkVFKG1kKTsKKyAgIHJldHVybiBlcnI7Cit9CisgCisvKioKKyAgSW1wb3J0IGEgUFJORyBzdGF0ZQorICBAcGFyYW0gaW4gICAgICAgVGhlIFBSTkcgc3RhdGUKKyAgQHBhcmFtIGlubGVuICAgIFNpemUgb2YgdGhlIHN0YXRlCisgIEBwYXJhbSBwcm5nICAgICBUaGUgUFJORyB0byBpbXBvcnQKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgZm9ydHVuYV9pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBybmdfc3RhdGUgKnBybmcpCit7CisgICBpbnQgZXJyLCB4OworCisgICBMVENfQVJHQ0hLKGluICAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHBybmcgIT0gTlVMTCk7CisKKyAgIGlmIChpbmxlbiAhPSAzMipGT1JUVU5BX1BPT0xTKSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisKKyAgIGlmICgoZXJyID0gZm9ydHVuYV9zdGFydChwcm5nKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICBmb3IgKHggPSAwOyB4IDwgRk9SVFVOQV9QT09MUzsgeCsrKSB7CisgICAgICBpZiAoKGVyciA9IGZvcnR1bmFfYWRkX2VudHJvcHkoaW4reCozMiwgMzIsIHBybmcpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBlcnI7Cit9CisKKy8qKgorICBQUk5HIHNlbGYtdGVzdAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwsIENSWVBUX05PUCBpZiBzZWxmLXRlc3RpbmcgaGFzIGJlZW4gZGlzYWJsZWQKKyovICAKK2ludCBmb3J0dW5hX3Rlc3Qodm9pZCkKK3sKKyNpZm5kZWYgTFRDX1RFU1QKKyAgIHJldHVybiBDUllQVF9OT1A7CisjZWxzZQorICAgaW50IGVycjsKKworICAgaWYgKChlcnIgPSBzaGEyNTZfdGVzdCgpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIHJldHVybiByaWpuZGFlbF90ZXN0KCk7CisjZW5kaWYKK30KKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BybmdzL2ZvcnR1bmEuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm5ncy9yYzQuYyBiL3NyYy9wcm5ncy9yYzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDI5ZDlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BybmdzL3JjNC5jCkBAIC0wLDAgKzEsMjY0IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICBAZmlsZSByYzQuYworICBSQzQgUFJORywgVG9tIFN0IERlbmlzCisqLyAgCisKKyNpZmRlZiBSQzQKKworY29uc3Qgc3RydWN0IGx0Y19wcm5nX2Rlc2NyaXB0b3IgcmM0X2Rlc2MgPSAKK3sKKyAgICJyYzQiLCAzMiwKKyAgICAmcmM0X3N0YXJ0LAorICAgICZyYzRfYWRkX2VudHJvcHksCisgICAgJnJjNF9yZWFkeSwKKyAgICAmcmM0X3JlYWQsCisgICAgJnJjNF9kb25lLAorICAgICZyYzRfZXhwb3J0LAorICAgICZyYzRfaW1wb3J0LAorICAgICZyYzRfdGVzdAorfTsKKworLyoqCisgIFN0YXJ0IHRoZSBQUk5HCisgIEBwYXJhbSBwcm5nICAgICBbb3V0XSBUaGUgUFJORyBzdGF0ZSB0byBpbml0aWFsaXplCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8gIAoraW50IHJjNF9zdGFydChwcm5nX3N0YXRlICpwcm5nKQoreworICAgIExUQ19BUkdDSEsocHJuZyAhPSBOVUxMKTsKKworICAgIC8qIHNldCBrZXlzaXplIHRvIHplcm8gKi8KKyAgICBwcm5nLT5yYzQueCA9IDA7CisgICAgCisgICAgcmV0dXJuIENSWVBUX09LOworfQorCisvKioKKyAgQWRkIGVudHJvcHkgdG8gdGhlIFBSTkcgc3RhdGUKKyAgQHBhcmFtIGluICAgICAgIFRoZSBkYXRhIHRvIGFkZAorICBAcGFyYW0gaW5sZW4gICAgTGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGFkZAorICBAcGFyYW0gcHJuZyAgICAgUFJORyBzdGF0ZSB0byB1cGRhdGUKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgcmM0X2FkZF9lbnRyb3B5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBwcm5nX3N0YXRlICpwcm5nKQoreworICAgIExUQ19BUkdDSEsoaW4gICE9IE5VTEwpOworICAgIExUQ19BUkdDSEsocHJuZyAhPSBOVUxMKTsKKyAKKyAgICAvKiB0cmltIGFzIHJlcXVpcmVkICovCisgICAgaWYgKHBybmctPnJjNC54ICsgaW5sZW4gPiAyNTYpIHsKKyAgICAgICBpZiAocHJuZy0+cmM0LnggPT0gMjU2KSB7CisgICAgICAgICAgLyogSSBjYW4ndCBwb3NzaWJseSBhY2NlcHQgYW5vdGhlciBieXRlLCBvayBtYXliZSBhIG1pbnQgd2FmZXIuLi4gKi8KKyAgICAgICAgICByZXR1cm4gQ1JZUFRfT0s7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBvbmx5IGFjY2VwdCBwYXJ0IG9mIGl0ICovCisgICAgICAgICAgaW5sZW4gPSAyNTYgLSBwcm5nLT5yYzQueDsKKyAgICAgICB9ICAgICAgIAorICAgIH0KKworICAgIHdoaWxlIChpbmxlbi0tKSB7CisgICAgICAgcHJuZy0+cmM0LmJ1Zltwcm5nLT5yYzQueCsrXSA9ICppbisrOworICAgIH0KKworICAgIHJldHVybiBDUllQVF9PSzsKKyAgICAKK30KKworLyoqCisgIE1ha2UgdGhlIFBSTkcgcmVhZHkgdG8gcmVhZCBmcm9tCisgIEBwYXJhbSBwcm5nICAgVGhlIFBSTkcgdG8gbWFrZSBhY3RpdmUKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgcmM0X3JlYWR5KHBybmdfc3RhdGUgKnBybmcpCit7CisgICAgdW5zaWduZWQgY2hhciBrZXlbMjU2XSwgdG1wLCAqczsKKyAgICBpbnQga2V5bGVuLCB4LCB5LCBqOworCisgICAgTFRDX0FSR0NISyhwcm5nICE9IE5VTEwpOworCisgICAgLyogZXh0cmFjdCB0aGUga2V5ICovCisgICAgcyA9IHBybmctPnJjNC5idWY7CisgICAgWE1FTUNQWShrZXksIHMsIDI1Nik7CisgICAga2V5bGVuID0gcHJuZy0+cmM0Lng7CisKKyAgICAvKiBtYWtlIFJDNCBwZXJtIGFuZCBzaHVmZmxlICovCisgICAgZm9yICh4ID0gMDsgeCA8IDI1NjsgeCsrKSB7CisgICAgICAgIHNbeF0gPSB4OworICAgIH0KKworICAgIGZvciAoaiA9IHggPSB5ID0gMDsgeCA8IDI1NjsgeCsrKSB7CisgICAgICAgIHkgPSAoeSArIHBybmctPnJjNC5idWZbeF0gKyBrZXlbaisrXSkgJiAyNTU7CisgICAgICAgIGlmIChqID09IGtleWxlbikgeworICAgICAgICAgICBqID0gMDsgCisgICAgICAgIH0KKyAgICAgICAgdG1wID0gc1t4XTsgc1t4XSA9IHNbeV07IHNbeV0gPSB0bXA7CisgICAgfQorICAgIHBybmctPnJjNC54ID0gMDsKKyAgICBwcm5nLT5yYzQueSA9IDA7CisKKyNpZmRlZiBMVENfQ0xFQU5fU1RBQ0sKKyAgICB6ZXJvbWVtKGtleSwgc2l6ZW9mKGtleSkpOworI2VuZGlmCisKKyAgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKy8qKgorICBSZWFkIGZyb20gdGhlIFBSTkcKKyAgQHBhcmFtIG91dCAgICAgIERlc3RpbmF0aW9uCisgIEBwYXJhbSBvdXRsZW4gICBMZW5ndGggb2Ygb3V0cHV0CisgIEBwYXJhbSBwcm5nICAgICBUaGUgYWN0aXZlIFBSTkcgdG8gcmVhZCBmcm9tCisgIEByZXR1cm4gTnVtYmVyIG9mIG9jdGV0cyByZWFkCisqLyAgCit1bnNpZ25lZCBsb25nIHJjNF9yZWFkKHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyBvdXRsZW4sIHBybmdfc3RhdGUgKnBybmcpCit7CisgICB1bnNpZ25lZCBjaGFyIHgsIHksICpzLCB0bXA7CisgICB1bnNpZ25lZCBsb25nIG47CisKKyAgIExUQ19BUkdDSEsob3V0ICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwcm5nICE9IE5VTEwpOworCisgICBuID0gb3V0bGVuOworICAgeCA9IHBybmctPnJjNC54OworICAgeSA9IHBybmctPnJjNC55OworICAgcyA9IHBybmctPnJjNC5idWY7CisgICB3aGlsZSAob3V0bGVuLS0pIHsKKyAgICAgIHggPSAoeCArIDEpICYgMjU1OworICAgICAgeSA9ICh5ICsgc1t4XSkgJiAyNTU7CisgICAgICB0bXAgPSBzW3hdOyBzW3hdID0gc1t5XTsgc1t5XSA9IHRtcDsKKyAgICAgIHRtcCA9IChzW3hdICsgc1t5XSkgJiAyNTU7CisgICAgICAqb3V0KysgXj0gc1t0bXBdOworICAgfQorICAgcHJuZy0+cmM0LnggPSB4OworICAgcHJuZy0+cmM0LnkgPSB5OworICAgcmV0dXJuIG47Cit9CisKKy8qKgorICBUZXJtaW5hdGUgdGhlIFBSTkcKKyAgQHBhcmFtIHBybmcgICBUaGUgUFJORyB0byB0ZXJtaW5hdGUKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgcmM0X2RvbmUocHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgIExUQ19BUkdDSEsocHJuZyAhPSBOVUxMKTsKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworLyoqCisgIEV4cG9ydCB0aGUgUFJORyBzdGF0ZQorICBAcGFyYW0gb3V0ICAgICAgIFtvdXRdIERlc3RpbmF0aW9uCisgIEBwYXJhbSBvdXRsZW4gICAgW2luL291dF0gTWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBzdGF0ZQorICBAcGFyYW0gcHJuZyAgICAgIFRoZSBQUk5HIHRvIGV4cG9ydAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCByYzRfZXhwb3J0KHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBwcm5nX3N0YXRlICpwcm5nKQoreworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHJuZyAgICE9IE5VTEwpOworCisgICBpZiAoKm91dGxlbiA8IDMyKSB7CisgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICAgfQorCisgICBpZiAocmM0X3JlYWQob3V0LCAzMiwgcHJuZykgIT0gMzIpIHsKKyAgICAgIHJldHVybiBDUllQVF9FUlJPUl9SRUFEUFJORzsKKyAgIH0KKyAgICpvdXRsZW4gPSAzMjsKKworICAgcmV0dXJuIENSWVBUX09LOworfQorIAorLyoqCisgIEltcG9ydCBhIFBSTkcgc3RhdGUKKyAgQHBhcmFtIGluICAgICAgIFRoZSBQUk5HIHN0YXRlCisgIEBwYXJhbSBpbmxlbiAgICBTaXplIG9mIHRoZSBzdGF0ZQorICBAcGFyYW0gcHJuZyAgICAgVGhlIFBSTkcgdG8gaW1wb3J0CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8gIAoraW50IHJjNF9pbXBvcnQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBybmdfc3RhdGUgKnBybmcpCit7CisgICBpbnQgZXJyOworICAgTFRDX0FSR0NISyhpbiAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwcm5nICE9IE5VTEwpOworCisgICBpZiAoaW5sZW4gIT0gMzIpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKyAgIAorICAgaWYgKChlcnIgPSByYzRfc3RhcnQocHJuZykpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorICAgcmV0dXJuIHJjNF9hZGRfZW50cm9weShpbiwgMzIsIHBybmcpOworfQorCisvKioKKyAgUFJORyBzZWxmLXRlc3QKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0aW5nIGhhcyBiZWVuIGRpc2FibGVkCisqLyAgCitpbnQgcmM0X3Rlc3Qodm9pZCkKK3sKKyNpZm5kZWYgTFRDX1RFU1QKKyAgIHJldHVybiBDUllQVF9OT1A7CisjZWxzZQorICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICB1bnNpZ25lZCBjaGFyIGtleVs4XSwgcHRbOF0sIGN0WzhdOworICAgfSB0ZXN0c1tdID0geworeworICAgeyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmIH0sCisgICB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYgfSwKKyAgIHsgMHg3NSwgMHhiNywgMHg4NywgMHg4MCwgMHg5OSwgMHhlMCwgMHhjNSwgMHg5NiB9Cit9Cit9OworICAgcHJuZ19zdGF0ZSBwcm5nOworICAgdW5zaWduZWQgY2hhciBkc3RbOF07CisgICBpbnQgZXJyLCB4OworCisgICBmb3IgKHggPSAwOyB4IDwgKGludCkoc2l6ZW9mKHRlc3RzKS9zaXplb2YodGVzdHNbMF0pKTsgeCsrKSB7CisgICAgICAgaWYgKChlcnIgPSByYzRfc3RhcnQoJnBybmcpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgfQorICAgICAgIGlmICgoZXJyID0gcmM0X2FkZF9lbnRyb3B5KHRlc3RzW3hdLmtleSwgOCwgJnBybmcpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgfQorICAgICAgIGlmICgoZXJyID0gcmM0X3JlYWR5KCZwcm5nKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgIH0KKyAgICAgICBYTUVNQ1BZKGRzdCwgdGVzdHNbeF0ucHQsIDgpOworICAgICAgIGlmIChyYzRfcmVhZChkc3QsIDgsICZwcm5nKSAhPSA4KSB7CisgICAgICAgICAgcmV0dXJuIENSWVBUX0VSUk9SX1JFQURQUk5HOworICAgICAgIH0KKyAgICAgICByYzRfZG9uZSgmcHJuZyk7CisgICAgICAgaWYgKG1lbWNtcChkc3QsIHRlc3RzW3hdLmN0LCA4KSkgeworI2lmIDAKKyAgICAgICAgICBpbnQgeTsKKyAgICAgICAgICBwcmludGYoIlxuXG5SQzQgZmFpbGVkLCBJIGdvdDpcbiIpOyAKKyAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSBwcmludGYoIiUwMnggIiwgZHN0W3ldKTsKKyAgICAgICAgICBwcmludGYoIlxuIik7CisjZW5kaWYKKyAgICAgICAgICByZXR1cm4gQ1JZUFRfRkFJTF9URVNUVkVDVE9SOworICAgICAgIH0KKyAgIH0KKyAgIHJldHVybiBDUllQVF9PSzsKKyNlbmRpZgorfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcHJuZ3MvcmM0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9ybmdfZ2V0X2J5dGVzLmMgYi9zcmMvcHJuZ3Mvcm5nX2dldF9ieXRlcy5jCnNpbWlsYXJpdHkgaW5kZXggNzQlCnJlbmFtZSBmcm9tIHJuZ19nZXRfYnl0ZXMuYwpyZW5hbWUgdG8gc3JjL3BybmdzL3JuZ19nZXRfYnl0ZXMuYwppbmRleCBmMzAyN2NkLi5hNzExZGZhIDEwMDY0NAotLS0gYS9ybmdfZ2V0X2J5dGVzLmMKKysrIGIvc3JjL3BybmdzL3JuZ19nZXRfYnl0ZXMuYwpAQCAtNiwxNyArNiwyMSBAQAogICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKICAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KICAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwogICovCi0vKiBwb3J0YWJsZSB3YXkgdG8gZ2V0IHNlY3VyZSByYW5kb20gYml0cyB0byBmZWVkIGEgUFJORyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKKyNpbmNsdWRlICJ0b21jcnlwdC5oIgorCisvKiogCisgICBAZmlsZSBybmdfZ2V0X2J5dGVzLmMKKyAgIHBvcnRhYmxlIHdheSB0byBnZXQgc2VjdXJlIHJhbmRvbSBiaXRzIHRvIGZlZWQgYSBQUk5HIChUb20gU3QgRGVuaXMpCisqLwogCiAjaWZkZWYgREVWUkFORE9NCiAvKiBvbiAqTklYIHJlYWQgL2Rldi9yYW5kb20gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJuZ19uaXgodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCkpCiB7Ci0jaWZkZWYgTk9fRklMRQorI2lmZGVmIExUQ19OT19GSUxFCiAgICAgcmV0dXJuIDA7CiAjZWxzZQogICAgIEZJTEUgKmY7CkBAIC00MCw3ICs0NCw3IEBACiAgICAgeCA9ICh1bnNpZ25lZCBsb25nKWZyZWFkKGJ1ZiwgMSwgKHNpemVfdClsZW4sIGYpOwogICAgIGZjbG9zZShmKTsKICAgICByZXR1cm4geDsKLSNlbmRpZiAvKiBOT19GSUxFICovCisjZW5kaWYgLyogTFRDX05PX0ZJTEUgKi8KIH0KIAogI2VuZGlmIC8qIERFVlJBTkRPTSAqLwpAQCAtMTA5LDIxICsxMTMsMzIgQEAKIAogI2VuZGlmIC8qIFdJTjMyICovCiAKLXVuc2lnbmVkIGxvbmcgcm5nX2dldF9ieXRlcyh1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuLCAKKy8qKgorICBSZWFkIHRoZSBzeXN0ZW0gUk5HCisgIEBwYXJhbSBvdXQgICAgICAgRGVzdGluYXRpb24KKyAgQHBhcmFtIG91dGxlbiAgICBMZW5ndGggZGVzaXJlZCAob2N0ZXRzKQorICBAcGFyYW0gY2FsbGJhY2sgIFBvaW50ZXIgdG8gdm9pZCBmdW5jdGlvbiB0byBhY3QgYXMgImNhbGxiYWNrIiB3aGVuIFJORyBpcyBzbG93LiAgVGhpcyBjYW4gYmUgTlVMTAorICBAcmV0dXJuIE51bWJlciBvZiBvY3RldHMgcmVhZAorKi8gICAgIAordW5zaWduZWQgbG9uZyBybmdfZ2V0X2J5dGVzKHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyBvdXRsZW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCkpCiB7CiAgICB1bnNpZ25lZCBsb25nIHg7CiAKLSAgIF9BUkdDSEsoYnVmICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhvdXQgIT0gTlVMTCk7CiAKICNpZiBkZWZpbmVkKERFVlJBTkRPTSkKLSAgIHggPSBybmdfbml4KGJ1ZiwgbGVuLCBjYWxsYmFjayk7ICAgaWYgKHggIT0gMCkgeyByZXR1cm4geDsgfQorICAgeCA9IHJuZ19uaXgob3V0LCBvdXRsZW4sIGNhbGxiYWNrKTsgICBpZiAoeCAhPSAwKSB7IHJldHVybiB4OyB9CiAjZW5kaWYKICNpZmRlZiBXSU4zMgotICAgeCA9IHJuZ193aW4zMihidWYsIGxlbiwgY2FsbGJhY2spOyBpZiAoeCAhPSAwKSB7IHJldHVybiB4OyB9CisgICB4ID0gcm5nX3dpbjMyKG91dCwgb3V0bGVuLCBjYWxsYmFjayk7IGlmICh4ICE9IDApIHsgcmV0dXJuIHg7IH0KICNlbmRpZgogI2lmZGVmIEFOU0lfUk5HCi0gICB4ID0gcm5nX2Fuc2ljKGJ1ZiwgbGVuLCBjYWxsYmFjayk7IGlmICh4ICE9IDApIHsgcmV0dXJuIHg7IH0KKyAgIHggPSBybmdfYW5zaWMob3V0LCBvdXRsZW4sIGNhbGxiYWNrKTsgaWYgKHggIT0gMCkgeyByZXR1cm4geDsgfQogI2VuZGlmCiAgICByZXR1cm4gMDsKIH0KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BybmdzL3JuZ19nZXRfYnl0ZXMuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3JuZ19tYWtlX3BybmcuYyBiL3NyYy9wcm5ncy9ybmdfbWFrZV9wcm5nLmMKc2ltaWxhcml0eSBpbmRleCA2MSUKcmVuYW1lIGZyb20gcm5nX21ha2VfcHJuZy5jCnJlbmFtZSB0byBzcmMvcHJuZ3Mvcm5nX21ha2VfcHJuZy5jCmluZGV4IDRjMzBlNjkuLjUxYjZlNmMgMTAwNjQ0Ci0tLSBhL3JuZ19tYWtlX3BybmcuYworKysgYi9zcmMvcHJuZ3Mvcm5nX21ha2VfcHJuZy5jCkBAIC02LDE4ICs2LDMwIEBACiAgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwogICogZ3VhcmFudGVlIGl0IHdvcmtzLgogICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCisgKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAZ21haWwuY29tLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCiAgKi8KLS8qIHBvcnRhYmxlIHdheSB0byBnZXQgc2VjdXJlIHJhbmRvbSBiaXRzIHRvIGZlZWQgYSBQUk5HICovCi0jaW5jbHVkZSAibXljcnlwdC5oIgorI2luY2x1ZGUgInRvbWNyeXB0LmgiCiAKKy8qKiAKKyAgQGZpbGUgcm5nX21ha2VfcHJuZy5jCisgIHBvcnRhYmxlIHdheSB0byBnZXQgc2VjdXJlIHJhbmRvbSBiaXRzIHRvIGZlZWQgYSBQUk5HICAoVG9tIFN0IERlbmlzKQorKi8KKworLyoqCisgIENyZWF0ZSBhIFBSTkcgZnJvbSBhIFJORworICBAcGFyYW0gYml0cyAgICAgTnVtYmVyIG9mIGJpdHMgb2YgZW50cm9weSBkZXNpcmVkICg2NCAuLi4gMTAyNCkKKyAgQHBhcmFtIHdwcm5nICAgIEluZGV4IG9mIHdoaWNoIFBSTkcgdG8gc2V0dXAKKyAgQHBhcmFtIHBybmcgICAgIFtvdXRdIFBSTkcgc3RhdGUgdG8gaW5pdGlhbGl6ZQorICBAcGFyYW0gY2FsbGJhY2sgQSBwb2ludGVyIHRvIGEgdm9pZCBmdW5jdGlvbiBmb3Igd2hlbiB0aGUgUk5HIGlzIHNsb3csIHRoaXMgY2FuIGJlIE5VTEwKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCiBpbnQgcm5nX21ha2VfcHJuZyhpbnQgYml0cywgaW50IHdwcm5nLCBwcm5nX3N0YXRlICpwcm5nLCAKICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjYWxsYmFjaykodm9pZCkpCiB7CiAgICB1bnNpZ25lZCBjaGFyIGJ1ZlsyNTZdOwogICAgaW50IGVycjsKICAgIAotICAgX0FSR0NISyhwcm5nICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwcm5nICE9IE5VTEwpOwogCiAgICAvKiBjaGVjayBwYXJhbWV0ZXIgKi8KICAgIGlmICgoZXJyID0gcHJuZ19pc192YWxpZCh3cHJuZykpICE9IENSWVBUX09LKSB7CkBAIC00NSw5ICs1NywxMyBAQAogICAgICAgcmV0dXJuIGVycjsKICAgIH0KIAotICAgI2lmZGVmIENMRUFOX1NUQUNLCisgICAjaWZkZWYgTFRDX0NMRUFOX1NUQUNLCiAgICAgICB6ZXJvbWVtKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogICAgI2VuZGlmCiAgICByZXR1cm4gQ1JZUFRfT0s7CiB9CiAKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BybmdzL3JuZ19tYWtlX3BybmcuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm5ncy9zb2JlcjEyOC5jIGIvc3JjL3BybmdzL3NvYmVyMTI4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5ZjAxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm5ncy9zb2JlcjEyOC5jCkBAIC0wLDAgKzEsNDk1IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorIEBmaWxlIHNvYmVyMTI4LmMKKyBJbXBsZW1lbnRhdGlvbiBvZiBTT0JFUi0xMjggYnkgVG9tIFN0IERlbmlzLgorIEJhc2VkIG9uIHMxMjhmYXN0LmMgcmVmZXJlbmNlIGNvZGUgc3VwcGxpZWQgYnkgR3JlZyBSb3NlIG9mIFFVQUxDT01NLgorKi8KKworI2lmZGVmIFNPQkVSMTI4CisKKyNpbmNsdWRlICJzb2JlcjEyOHRhYi5jIgorCitjb25zdCBzdHJ1Y3QgbHRjX3BybmdfZGVzY3JpcHRvciBzb2JlcjEyOF9kZXNjID0gCit7CisgICAic29iZXIxMjgiLCA2NCwKKyAgICAmc29iZXIxMjhfc3RhcnQsCisgICAgJnNvYmVyMTI4X2FkZF9lbnRyb3B5LAorICAgICZzb2JlcjEyOF9yZWFkeSwKKyAgICAmc29iZXIxMjhfcmVhZCwKKyAgICAmc29iZXIxMjhfZG9uZSwKKyAgICAmc29iZXIxMjhfZXhwb3J0LAorICAgICZzb2JlcjEyOF9pbXBvcnQsCisgICAgJnNvYmVyMTI4X3Rlc3QKK307CisKKy8qIGRvbid0IGNoYW5nZSB0aGVzZS4uLiAqLworI2RlZmluZSBOICAgICAgICAgICAgICAgICAgICAgICAgMTcKKyNkZWZpbmUgRk9MRCAgICAgICAgICAgICAgICAgICAgICBOIC8qIGhvdyBtYW55IGl0ZXJhdGlvbnMgb2YgZm9sZGluZyB0byBkbyAqLworI2RlZmluZSBJTklUS09OU1QgICAgICAgIDB4Njk5NmM1M2EgLyogdmFsdWUgb2YgS09OU1QgdG8gdXNlIGR1cmluZyBrZXkgbG9hZGluZyAqLworI2RlZmluZSBLRVlQICAgICAgICAgICAgICAgICAgICAgMTUgLyogd2hlcmUgdG8gaW5zZXJ0IGtleSB3b3JkcyAqLworI2RlZmluZSBGT0xEUCAgICAgICAgICAgICAgICAgICAgIDQgLyogd2hlcmUgdG8gaW5zZXJ0IG5vbi1saW5lYXIgZmVlZGJhY2sgKi8KKworI2RlZmluZSBCKHgsaSkgKCh1bnNpZ25lZCBjaGFyKSgoKHgpID4+ICg4KmkpKSAmIDB4RkYpKQorCitzdGF0aWMgdWxvbmczMiBCWVRFMldPUkQodW5zaWduZWQgY2hhciAqYikKK3sKKyAgIHVsb25nMzIgdDsKKyAgIExPQUQzMkwodCwgYik7CisgICByZXR1cm4gdDsKK30KKworI2RlZmluZSBXT1JEMkJZVEUodywgYikgU1RPUkUzMkwoYiwgdykKKworc3RhdGljIHZvaWQgWE9SV09SRCh1bG9uZzMyIHcsIHVuc2lnbmVkIGNoYXIgKmIpCit7CisgICB1bG9uZzMyIHQ7CisgICBMT0FEMzJMKHQsIGIpOworICAgdCBePSB3OworICAgU1RPUkUzMkwodCwgYik7Cit9CisKKy8qIGdpdmUgY29ycmVjdCBvZmZzZXQgZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSByZWdpc3RlciwKKyAqIHdoZXJlIGxvZ2ljYWxseSBSWzBdIGlzIGF0IHBvc2l0aW9uICJ6ZXJvIi4KKyAqLworI2RlZmluZSBPRkYoemVybywgaSkgKCgoemVybykrKGkpKSAlIE4pCisKKy8qIHN0ZXAgdGhlIExGU1IgKi8KKy8qIEFmdGVyIHN0ZXBwaW5nLCAiemVybyIgbW92ZXMgcmlnaHQgb25lIHBsYWNlICovCisjZGVmaW5lIFNURVAoUix6KSBcCisgICAgUltPRkYoeiwwKV0gPSBSW09GRih6LDE1KV0gXiBSW09GRih6LDQpXSBeIChSW09GRih6LDApXSA8PCA4KSBeIE11bHRhYlsoUltPRkYoeiwwKV0gPj4gMjQpICYgMHhGRl07CisKK3N0YXRpYyB2b2lkIGN5Y2xlKHVsb25nMzIgKlIpCit7CisgICAgdWxvbmczMiB0OworICAgIGludCAgICAgaTsKKworICAgIFNURVAoUiwwKTsKKyAgICB0ID0gUlswXTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgTjsgKytpKSB7CisgICAgICAgIFJbaS0xXSA9IFJbaV07CisgICAgfQorICAgIFJbTi0xXSA9IHQ7Cit9CisKKy8qIFJldHVybiBhIG5vbi1saW5lYXIgZnVuY3Rpb24gb2Ygc29tZSBwYXJ0cyBvZiB0aGUgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgTkxGVU5DKGMseikgXAoreyBcCisgICAgdCA9IGMtPlJbT0ZGKHosMCldICsgYy0+UltPRkYoeiwxNildOyBcCisgICAgdCBePSBTYm94Wyh0ID4+IDI0KSAmIDB4RkZdOyBcCisgICAgdCA9IFJPUmModCwgOCk7IFwKKyAgICB0ID0gKCh0ICsgYy0+UltPRkYoeiwxKV0pIF4gYy0+a29uc3QpICsgYy0+UltPRkYoeiw2KV07IFwKKyAgICB0IF49IFNib3hbKHQgPj4gMjQpICYgMHhGRl07IFwKKyAgICB0ID0gdCArIGMtPlJbT0ZGKHosMTMpXTsgXAorfQorCitzdGF0aWMgdWxvbmczMiBubHRhcChzdHJ1Y3Qgc29iZXIxMjhfcHJuZyAqYykKK3sKKyAgICB1bG9uZzMyIHQ7CisgICAgTkxGVU5DKGMsIDApOworICAgIHJldHVybiB0OworfQorCisvKioKKyAgU3RhcnQgdGhlIFBSTkcKKyAgQHBhcmFtIHBybmcgICAgIFtvdXRdIFRoZSBQUk5HIHN0YXRlIHRvIGluaXRpYWxpemUKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgc29iZXIxMjhfc3RhcnQocHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgaTsKKyAgICBzdHJ1Y3Qgc29iZXIxMjhfcHJuZyAqYzsKKworICAgIExUQ19BUkdDSEsocHJuZyAhPSBOVUxMKTsKKworICAgIGMgPSAmKHBybmctPnNvYmVyMTI4KTsKKyAgICAKKyAgICAvKiBSZWdpc3RlciBpbml0aWFsaXNlZCB0byBGaWJvbmFjY2kgbnVtYmVycyAqLworICAgIGMtPlJbMF0gPSAxOworICAgIGMtPlJbMV0gPSAxOworICAgIGZvciAoaSA9IDI7IGkgPCBOOyArK2kpIHsKKyAgICAgICBjLT5SW2ldID0gYy0+UltpLTFdICsgYy0+UltpLTJdOworICAgIH0KKyAgICBjLT5rb25zdCA9IElOSVRLT05TVDsKKworICAgIC8qIG5leHQgYWRkX2VudHJvcHkgd2lsbCBiZSB0aGUga2V5ICovCisgICAgYy0+ZmxhZyAgPSAxOworICAgIGMtPnNldCAgID0gMDsKKworICAgIHJldHVybiBDUllQVF9PSzsKK30KKworLyogU2F2ZSB0aGUgY3VycmVudCByZWdpc3RlciBzdGF0ZQorICovCitzdGF0aWMgdm9pZCBzMTI4X3NhdmVzdGF0ZShzdHJ1Y3Qgc29iZXIxMjhfcHJuZyAqYykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTjsgKytpKSB7CisgICAgICAgIGMtPmluaXRSW2ldID0gYy0+UltpXTsKKyAgICB9Cit9CisKKy8qIGluaXRpYWxpc2UgdG8gcHJldmlvdXNseSBzYXZlZCByZWdpc3RlciBzdGF0ZQorICovCitzdGF0aWMgdm9pZCBzMTI4X3JlbG9hZHN0YXRlKHN0cnVjdCBzb2JlcjEyOF9wcm5nICpjKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE47ICsraSkgeworICAgICAgICBjLT5SW2ldID0gYy0+aW5pdFJbaV07CisgICAgfQorfQorCisvKiBJbml0aWFsaXNlICJrb25zdCIKKyAqLworc3RhdGljIHZvaWQgczEyOF9nZW5rb25zdChzdHJ1Y3Qgc29iZXIxMjhfcHJuZyAqYykKK3sKKyAgICB1bG9uZzMyIG5ld2tvbnN0OworCisgICAgZG8geworICAgICAgIGN5Y2xlKGMtPlIpOworICAgICAgIG5ld2tvbnN0ID0gbmx0YXAoYyk7CisgICAgfSB3aGlsZSAoKG5ld2tvbnN0ICYgMHhGRjAwMDAwMCkgPT0gMCk7CisgICAgYy0+a29uc3QgPSBuZXdrb25zdDsKK30KKworLyogTG9hZCBrZXkgbWF0ZXJpYWwgaW50byB0aGUgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBBRERLRVkoaykgXAorICAgYy0+UltLRVlQXSArPSAoayk7CisKKyNkZWZpbmUgWE9STkwobmwpIFwKKyAgIGMtPlJbRk9MRFBdIF49IChubCk7CisKKy8qIG5vbmxpbmVhciBkaWZmdXNpb24gb2YgcmVnaXN0ZXIgZm9yIGtleSAqLworI2RlZmluZSBEUk9VTkQoeikgU1RFUChjLT5SLHopOyBOTEZVTkMoYywoeisxKSk7IGMtPlJbT0ZGKCh6KzEpLEZPTERQKV0gXj0gdDsgCitzdGF0aWMgdm9pZCBzMTI4X2RpZmZ1c2Uoc3RydWN0IHNvYmVyMTI4X3BybmcgKmMpCit7CisgICAgdWxvbmczMiB0OworICAgIC8qIHJlbGllcyBvbiBGT0xEID09IE4gPT0gMTchICovCisgICAgRFJPVU5EKDApOworICAgIERST1VORCgxKTsKKyAgICBEUk9VTkQoMik7CisgICAgRFJPVU5EKDMpOworICAgIERST1VORCg0KTsKKyAgICBEUk9VTkQoNSk7CisgICAgRFJPVU5EKDYpOworICAgIERST1VORCg3KTsKKyAgICBEUk9VTkQoOCk7CisgICAgRFJPVU5EKDkpOworICAgIERST1VORCgxMCk7CisgICAgRFJPVU5EKDExKTsKKyAgICBEUk9VTkQoMTIpOworICAgIERST1VORCgxMyk7CisgICAgRFJPVU5EKDE0KTsKKyAgICBEUk9VTkQoMTUpOworICAgIERST1VORCgxNik7Cit9CisKKy8qKgorICBBZGQgZW50cm9weSB0byB0aGUgUFJORyBzdGF0ZQorICBAcGFyYW0gaW4gICAgICAgVGhlIGRhdGEgdG8gYWRkCisgIEBwYXJhbSBpbmxlbiAgICBMZW5ndGggb2YgdGhlIGRhdGEgdG8gYWRkCisgIEBwYXJhbSBwcm5nICAgICBQUk5HIHN0YXRlIHRvIHVwZGF0ZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCBzb2JlcjEyOF9hZGRfZW50cm9weShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgbG9uZyBpbmxlbiwgcHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgICBzdHJ1Y3Qgc29iZXIxMjhfcHJuZyAqYzsKKyAgICB1bG9uZzMyICAgICAgICAgICAgICAgaSwgazsKKworICAgIExUQ19BUkdDSEsoaW4gIT0gTlVMTCk7CisgICAgTFRDX0FSR0NISyhwcm5nICE9IE5VTEwpOworICAgIGMgPSAmKHBybmctPnNvYmVyMTI4KTsKKworICAgIGlmIChjLT5mbGFnID09IDEpIHsKKyAgICAgICAvKiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIHRvIHRoZSBhZGRfZW50cm9weSBzbyB0aGlzIGlucHV0IGlzIHRoZSBrZXkgKi8KKyAgICAgICAvKiBpbmxlbiBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMgKi8KKyAgICAgICBpZiAoKGlubGVuICYgMykgIT0gMCkgeworICAgICAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0tFWVNJWkU7CisgICAgICAgfQorICAgIAorICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmxlbjsgaSArPSA0KSB7CisgICAgICAgICAgIGsgPSBCWVRFMldPUkQoKHVuc2lnbmVkIGNoYXIgKikmaW5baV0pOworICAgICAgICAgIEFEREtFWShrKTsKKyAgICAgICAgICBjeWNsZShjLT5SKTsKKyAgICAgICAgICBYT1JOTChubHRhcChjKSk7CisgICAgICAgfQorCisgICAgICAgLyogYWxzbyBmb2xkIGluIHRoZSBsZW5ndGggb2YgdGhlIGtleSAqLworICAgICAgIEFEREtFWShpbmxlbik7CisKKyAgICAgICAvKiBub3cgZGlmZnVzZSAqLworICAgICAgIHMxMjhfZGlmZnVzZShjKTsKKworICAgICAgIHMxMjhfZ2Vua29uc3QoYyk7CisgICAgICAgczEyOF9zYXZlc3RhdGUoYyk7CisgICAgICAgYy0+bmJ1ZiA9IDA7CisgICAgICAgYy0+ZmxhZyA9IDA7ICAgICAgIAorICAgICAgIGMtPnNldCAgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgLyogb2sgd2UgYXJlIGFkZGluZyBhbiBJViB0aGVuLi4uICovCisgICAgICAgczEyOF9yZWxvYWRzdGF0ZShjKTsKKworICAgICAgIC8qIGlubGVuIG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcyAqLworICAgICAgIGlmICgoaW5sZW4gJiAzKSAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfS0VZU0laRTsKKyAgICAgICB9CisgICAgCisgICAgICAgZm9yIChpID0gMDsgaSA8IGlubGVuOyBpICs9IDQpIHsKKyAgICAgICAgICAgayA9IEJZVEUyV09SRCgodW5zaWduZWQgY2hhciAqKSZpbltpXSk7CisgICAgICAgICAgQURES0VZKGspOworICAgICAgICAgIGN5Y2xlKGMtPlIpOworICAgICAgICAgIFhPUk5MKG5sdGFwKGMpKTsKKyAgICAgICB9CisKKyAgICAgICAvKiBhbHNvIGZvbGQgaW4gdGhlIGxlbmd0aCBvZiB0aGUga2V5ICovCisgICAgICAgQURES0VZKGlubGVuKTsKKworICAgICAgIC8qIG5vdyBkaWZmdXNlICovCisgICAgICAgczEyOF9kaWZmdXNlKGMpOworICAgICAgIGMtPm5idWYgPSAwOworICAgIH0KKworICAgIHJldHVybiBDUllQVF9PSzsKK30KKworLyoqCisgIE1ha2UgdGhlIFBSTkcgcmVhZHkgdG8gcmVhZCBmcm9tCisgIEBwYXJhbSBwcm5nICAgVGhlIFBSTkcgdG8gbWFrZSBhY3RpdmUKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgc29iZXIxMjhfcmVhZHkocHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgIHJldHVybiBwcm5nLT5zb2JlcjEyOC5zZXQgPT0gMSA/IENSWVBUX09LIDogQ1JZUFRfRVJST1I7Cit9CisKKy8qIFhPUiBwc2V1ZG8tcmFuZG9tIGJ5dGVzIGludG8gYnVmZmVyCisgKi8KKyNkZWZpbmUgU1JPVU5EKHopIFNURVAoYy0+Uix6KTsgTkxGVU5DKGMsKHorMSkpOyBYT1JXT1JEKHQsIG91dCsoeio0KSk7CisKKy8qKgorICBSZWFkIGZyb20gdGhlIFBSTkcKKyAgQHBhcmFtIG91dCAgICAgIERlc3RpbmF0aW9uCisgIEBwYXJhbSBvdXRsZW4gICBMZW5ndGggb2Ygb3V0cHV0CisgIEBwYXJhbSBwcm5nICAgICBUaGUgYWN0aXZlIFBSTkcgdG8gcmVhZCBmcm9tCisgIEByZXR1cm4gTnVtYmVyIG9mIG9jdGV0cyByZWFkCisqLyAgCit1bnNpZ25lZCBsb25nIHNvYmVyMTI4X3JlYWQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nIG91dGxlbiwgcHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgIHN0cnVjdCBzb2JlcjEyOF9wcm5nICpjOworICAgdWxvbmczMiAgICAgICAgICAgICAgIHQsIHRsZW47CisKKyAgIExUQ19BUkdDSEsob3V0ICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHJuZyAhPSBOVUxMKTsKKworICAgYyA9ICYocHJuZy0+c29iZXIxMjgpOworICAgdCA9IDA7CisgICB0bGVuID0gb3V0bGVuOworICAgCisgICAvKiBoYW5kbGUgYW55IHByZXZpb3VzbHkgYnVmZmVyZWQgYnl0ZXMgKi8KKyAgIHdoaWxlIChjLT5uYnVmICE9IDAgJiYgb3V0bGVuICE9IDApIHsKKyAgICAgICpvdXQrKyBePSBjLT5zYnVmICYgMHhGRjsKKyAgICAgICBjLT5zYnVmID4+PSA4OworICAgICAgIGMtPm5idWYgLT0gODsKKyAgICAgICAtLW91dGxlbjsKKyAgIH0KKworI2lmbmRlZiBMVENfU01BTExfQ09ERQorICAgIC8qIGRvIGxvdHMgYXQgYSB0aW1lLCBpZiB0aGVyZSdzIGVub3VnaCB0byBkbyAqLworICAgIHdoaWxlIChvdXRsZW4gPj0gTio0KSB7CisgICAgICBTUk9VTkQoMCk7CisgICAgICBTUk9VTkQoMSk7CisgICAgICBTUk9VTkQoMik7CisgICAgICBTUk9VTkQoMyk7CisgICAgICBTUk9VTkQoNCk7CisgICAgICBTUk9VTkQoNSk7CisgICAgICBTUk9VTkQoNik7CisgICAgICBTUk9VTkQoNyk7CisgICAgICBTUk9VTkQoOCk7CisgICAgICBTUk9VTkQoOSk7CisgICAgICBTUk9VTkQoMTApOworICAgICAgU1JPVU5EKDExKTsKKyAgICAgIFNST1VORCgxMik7CisgICAgICBTUk9VTkQoMTMpOworICAgICAgU1JPVU5EKDE0KTsKKyAgICAgIFNST1VORCgxNSk7CisgICAgICBTUk9VTkQoMTYpOworICAgICAgb3V0ICAgICs9IDQqTjsKKyAgICAgIG91dGxlbiAtPSA0Kk47CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBkbyBzbWFsbCBvciBvZGQgc2l6ZSBidWZmZXJzIHRoZSBzbG93IHdheSAqLworICAgIHdoaWxlICg0IDw9IG91dGxlbikgeworICAgICAgY3ljbGUoYy0+Uik7CisgICAgICB0ID0gbmx0YXAoYyk7CisgICAgICBYT1JXT1JEKHQsIG91dCk7CisgICAgICBvdXQgICAgKz0gNDsKKyAgICAgIG91dGxlbiAtPSA0OworICAgIH0KKworICAgIC8qIGhhbmRsZSBhbnkgdHJhaWxpbmcgYnl0ZXMgKi8KKyAgICBpZiAob3V0bGVuICE9IDApIHsKKyAgICAgIGN5Y2xlKGMtPlIpOworICAgICAgYy0+c2J1ZiA9IG5sdGFwKGMpOworICAgICAgYy0+bmJ1ZiA9IDMyOworICAgICAgd2hpbGUgKGMtPm5idWYgIT0gMCAmJiBvdXRsZW4gIT0gMCkgeworICAgICAgICAgICpvdXQrKyBePSBjLT5zYnVmICYgMHhGRjsKKyAgICAgICAgICBjLT5zYnVmID4+PSA4OworICAgICAgICAgIGMtPm5idWYgLT0gODsKKyAgICAgICAgICAtLW91dGxlbjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGxlbjsKK30KKworLyoqCisgIFRlcm1pbmF0ZSB0aGUgUFJORworICBAcGFyYW0gcHJuZyAgIFRoZSBQUk5HIHRvIHRlcm1pbmF0ZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCBzb2JlcjEyOF9kb25lKHBybmdfc3RhdGUgKnBybmcpCit7CisgICBMVENfQVJHQ0hLKHBybmcgIT0gTlVMTCk7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKy8qKgorICBFeHBvcnQgdGhlIFBSTkcgc3RhdGUKKyAgQHBhcmFtIG91dCAgICAgICBbb3V0XSBEZXN0aW5hdGlvbgorICBAcGFyYW0gb3V0bGVuICAgIFtpbi9vdXRdIE1heCBzaXplIGFuZCByZXN1bHRpbmcgc2l6ZSBvZiB0aGUgc3RhdGUKKyAgQHBhcmFtIHBybmcgICAgICBUaGUgUFJORyB0byBleHBvcnQKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgc29iZXIxMjhfZXhwb3J0KHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgbG9uZyAqb3V0bGVuLCBwcm5nX3N0YXRlICpwcm5nKQoreworICAgTFRDX0FSR0NISyhvdXRsZW4gIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHJuZyAgICE9IE5VTEwpOworCisgICBpZiAoKm91dGxlbiA8IDY0KSB7CisgICAgICByZXR1cm4gQ1JZUFRfQlVGRkVSX09WRVJGTE9XOworICAgfQorCisgICBpZiAoc29iZXIxMjhfcmVhZChvdXQsIDY0LCBwcm5nKSAhPSA2NCkgeworICAgICAgcmV0dXJuIENSWVBUX0VSUk9SX1JFQURQUk5HOworICAgfQorICAgKm91dGxlbiA9IDY0OworCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisgCisvKioKKyAgSW1wb3J0IGEgUFJORyBzdGF0ZQorICBAcGFyYW0gaW4gICAgICAgVGhlIFBSTkcgc3RhdGUKKyAgQHBhcmFtIGlubGVuICAgIFNpemUgb2YgdGhlIHN0YXRlCisgIEBwYXJhbSBwcm5nICAgICBUaGUgUFJORyB0byBpbXBvcnQKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgc29iZXIxMjhfaW1wb3J0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBwcm5nX3N0YXRlICpwcm5nKQoreworICAgaW50IGVycjsKKyAgIExUQ19BUkdDSEsoaW4gICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHJuZyAhPSBOVUxMKTsKKworICAgaWYgKGlubGVuICE9IDY0KSB7CisgICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9BUkc7CisgICB9CisgICAKKyAgIGlmICgoZXJyID0gc29iZXIxMjhfc3RhcnQocHJuZykpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorICAgaWYgKChlcnIgPSBzb2JlcjEyOF9hZGRfZW50cm9weShpbiwgNjQsIHBybmcpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIHJldHVybiBzb2JlcjEyOF9yZWFkeShwcm5nKTsKK30KKworLyoqCisgIFBSTkcgc2VsZi10ZXN0CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bCwgQ1JZUFRfTk9QIGlmIHNlbGYtdGVzdGluZyBoYXMgYmVlbiBkaXNhYmxlZAorKi8gIAoraW50IHNvYmVyMTI4X3Rlc3Qodm9pZCkKK3sKKyNpZm5kZWYgTFRDX1RFU1QKKyAgIHJldHVybiBDUllQVF9OT1A7CisjZWxzZQorICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7IAorICAgICBpbnQga2V5bGVuLCBpdmxlbiwgbGVuOworICAgICB1bnNpZ25lZCBjaGFyIGtleVsxNl0sIGl2WzRdLCBvdXRbMjBdOworICAgfSB0ZXN0c1tdID0geworCit7CisgICAxNiwgNCwgMjAsCisKKyAgIC8qIGtleSAqLworICAgeyAndCcsICdlJywgJ3MnLCAndCcsICcgJywgJ2snLCAnZScsICd5JywgCisgICAgICcgJywgJzEnLCAnMicsICc4JywgJ2InLCAnaScsICd0JywgJ3MnIH0sCisKKyAgIC8qIElWICovCisgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MCB9LAorCisgICAvKiBleHBlY3RlZCBvdXRwdXQgKi8KKyAgIHsgMHg0MywgMHg1MCwgMHgwYywgMHhjZiwgMHg4OSwgMHg5MSwgMHg5ZiwgMHgxZCwKKyAgICAgMHhhYSwgMHgzNywgMHg3NCwgMHg5NSwgMHhmNCwgMHhiNCwgMHg1OCwgMHhjMiwgCisgICAgIDB4NDAsIDB4MzcsIDB4OGIsIDB4YmIgfQorfQorCit9OworICAgcHJuZ19zdGF0ZSAgICBwcm5nOworICAgdW5zaWduZWQgY2hhciBkc3RbMjBdOworICAgaW50ICAgICAgICAgICBlcnIsIHg7CisKKyAgIGZvciAoeCA9IDA7IHggPCAoaW50KShzaXplb2YodGVzdHMpL3NpemVvZih0ZXN0c1swXSkpOyB4KyspIHsKKyAgICAgICBpZiAoKGVyciA9IHNvYmVyMTI4X3N0YXJ0KCZwcm5nKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgIH0KKyAgICAgICBpZiAoKGVyciA9IHNvYmVyMTI4X2FkZF9lbnRyb3B5KHRlc3RzW3hdLmtleSwgdGVzdHNbeF0ua2V5bGVuLCAmcHJuZykpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICB9CisgICAgICAgLyogYWRkIElWICovCisgICAgICAgaWYgKChlcnIgPSBzb2JlcjEyOF9hZGRfZW50cm9weSh0ZXN0c1t4XS5pdiwgdGVzdHNbeF0uaXZsZW4sICZwcm5nKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgIH0KKworICAgICAgIC8qIHJlYWR5IHVwICovCisgICAgICAgaWYgKChlcnIgPSBzb2JlcjEyOF9yZWFkeSgmcHJuZykpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICB9CisgICAgICAgbWVtc2V0KGRzdCwgMCwgdGVzdHNbeF0ubGVuKTsKKyAgICAgICBpZiAoc29iZXIxMjhfcmVhZChkc3QsIHRlc3RzW3hdLmxlbiwgJnBybmcpICE9ICh1bnNpZ25lZCBsb25nKXRlc3RzW3hdLmxlbikgeworICAgICAgICAgIHJldHVybiBDUllQVF9FUlJPUl9SRUFEUFJORzsKKyAgICAgICB9CisgICAgICAgc29iZXIxMjhfZG9uZSgmcHJuZyk7CisgICAgICAgaWYgKG1lbWNtcChkc3QsIHRlc3RzW3hdLm91dCwgdGVzdHNbeF0ubGVuKSkgeworI2lmIDAKKyAgICAgICAgICBwcmludGYoIlxuXG5TT0JFUjEyOCBmYWlsZWQsIEkgZ290OlxuIik7IAorICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCB0ZXN0c1t4XS5sZW47IHkrKykgcHJpbnRmKCIlMDJ4ICIsIGRzdFt5XSk7CisgICAgICAgICAgcHJpbnRmKCJcbiIpOworI2VuZGlmCisgICAgICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKKyAgICAgICB9CisgICB9CisgICByZXR1cm4gQ1JZUFRfT0s7CisjZW5kaWYKK30KKworI2VuZGlmCisKKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvc3JjL3BybmdzL3NvYmVyMTI4LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zcmMvcHJuZ3Mvc29iZXIxMjh0YWIuYyBiL3NyYy9wcm5ncy9zb2JlcjEyOHRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGM3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJuZ3Mvc29iZXIxMjh0YWIuYwpAQCAtMCwwICsxLDE2MiBAQAorLyoqIAorICAgQGZpbGUgc29iZXIxMjh0YWIuYworICAgU09CRVItMTI4IFRhYmxlcworKi8gICAKKy8qICRJZDogc29iZXIxMjh0YWIuYyx2IDEuMiAyMDA1LzA1LzA1IDE0OjM1OjU5IHRvbSBFeHAgJCAqLworLyogQCgjKVR1cmluZ011bHRhYi5oICAgMS4zIChRVUFMQ09NTSkgMDIvMDkvMDMgKi8KKy8qIE11bHRpcGxpY2F0aW9uIHRhYmxlIGZvciBUdXJpbmcgdXNpbmcgMHhEMDJCNDM2NyAqLworc3RhdGljIGNvbnN0IHVsb25nMzIgTXVsdGFiWzI1Nl0gPSB7CisgICAgMHgwMDAwMDAwMCwgMHhEMDJCNDM2NywgMHhFRDU2ODZDRSwgMHgzRDdEQzVBOSwKKyAgICAweDk3QUM0MUQxLCAweDQ3ODcwMkI2LCAweDdBRkFDNzFGLCAweEFBRDE4NDc4LAorICAgIDB4NjMxNTgyRUYsIDB4QjMzRUMxODgsIDB4OEU0MzA0MjEsIDB4NUU2ODQ3NDYsCisgICAgMHhGNEI5QzMzRSwgMHgyNDkyODA1OSwgMHgxOUVGNDVGMCwgMHhDOUM0MDY5NywKKyAgICAweEM2MkE0OTkzLCAweDE2MDEwQUY0LCAweDJCN0NDRjVELCAweEZCNTc4QzNBLAorICAgIDB4NTE4NjA4NDIsIDB4ODFBRDRCMjUsIDB4QkNEMDhFOEMsIDB4NkNGQkNERUIsCisgICAgMHhBNTNGQ0I3QywgMHg3NTE0ODgxQiwgMHg0ODY5NERCMiwgMHg5ODQyMEVENSwKKyAgICAweDMyOTM4QUFELCAweEUyQjhDOUNBLCAweERGQzUwQzYzLCAweDBGRUU0RjA0LAorICAgIDB4QzE1NDkyNkIsIDB4MTE3RkQxMEMsIDB4MkMwMjE0QTUsIDB4RkMyOTU3QzIsCisgICAgMHg1NkY4RDNCQSwgMHg4NkQzOTBERCwgMHhCQkFFNTU3NCwgMHg2Qjg1MTYxMywKKyAgICAweEEyNDExMDg0LCAweDcyNkE1M0UzLCAweDRGMTc5NjRBLCAweDlGM0NENTJELAorICAgIDB4MzVFRDUxNTUsIDB4RTVDNjEyMzIsIDB4RDhCQkQ3OUIsIDB4MDg5MDk0RkMsCisgICAgMHgwNzdFREJGOCwgMHhENzU1OTg5RiwgMHhFQTI4NUQzNiwgMHgzQTAzMUU1MSwKKyAgICAweDkwRDI5QTI5LCAweDQwRjlEOTRFLCAweDdEODQxQ0U3LCAweEFEQUY1RjgwLAorICAgIDB4NjQ2QjU5MTcsIDB4QjQ0MDFBNzAsIDB4ODkzRERGRDksIDB4NTkxNjlDQkUsCisgICAgMHhGM0M3MThDNiwgMHgyM0VDNUJBMSwgMHgxRTkxOUUwOCwgMHhDRUJBREQ2RiwKKyAgICAweENGQTg2OUQ2LCAweDFGODMyQUIxLCAweDIyRkVFRjE4LCAweEYyRDVBQzdGLAorICAgIDB4NTgwNDI4MDcsIDB4ODgyRjZCNjAsIDB4QjU1MkFFQzksIDB4NjU3OUVEQUUsCisgICAgMHhBQ0JERUIzOSwgMHg3Qzk2QTg1RSwgMHg0MUVCNkRGNywgMHg5MUMwMkU5MCwKKyAgICAweDNCMTFBQUU4LCAweEVCM0FFOThGLCAweEQ2NDcyQzI2LCAweDA2NkM2RjQxLAorICAgIDB4MDk4MjIwNDUsIDB4RDlBOTYzMjIsIDB4RTRENEE2OEIsIDB4MzRGRkU1RUMsCisgICAgMHg5RTJFNjE5NCwgMHg0RTA1MjJGMywgMHg3Mzc4RTc1QSwgMHhBMzUzQTQzRCwKKyAgICAweDZBOTdBMkFBLCAweEJBQkNFMUNELCAweDg3QzEyNDY0LCAweDU3RUE2NzAzLAorICAgIDB4RkQzQkUzN0IsIDB4MkQxMEEwMUMsIDB4MTA2RDY1QjUsIDB4QzA0NjI2RDIsCisgICAgMHgwRUZDRkJCRCwgMHhERUQ3QjhEQSwgMHhFM0FBN0Q3MywgMHgzMzgxM0UxNCwKKyAgICAweDk5NTBCQTZDLCAweDQ5N0JGOTBCLCAweDc0MDYzQ0EyLCAweEE0MkQ3RkM1LAorICAgIDB4NkRFOTc5NTIsIDB4QkRDMjNBMzUsIDB4ODBCRkZGOUMsIDB4NTA5NEJDRkIsCisgICAgMHhGQTQ1Mzg4MywgMHgyQTZFN0JFNCwgMHgxNzEzQkU0RCwgMHhDNzM4RkQyQSwKKyAgICAweEM4RDZCMjJFLCAweDE4RkRGMTQ5LCAweDI1ODAzNEUwLCAweEY1QUI3Nzg3LAorICAgIDB4NUY3QUYzRkYsIDB4OEY1MUIwOTgsIDB4QjIyQzc1MzEsIDB4NjIwNzM2NTYsCisgICAgMHhBQkMzMzBDMSwgMHg3QkU4NzNBNiwgMHg0Njk1QjYwRiwgMHg5NkJFRjU2OCwKKyAgICAweDNDNkY3MTEwLCAweEVDNDQzMjc3LCAweEQxMzlGN0RFLCAweDAxMTJCNEI5LAorICAgIDB4RDMxREQyRTEsIDB4MDMzNjkxODYsIDB4M0U0QjU0MkYsIDB4RUU2MDE3NDgsCisgICAgMHg0NEIxOTMzMCwgMHg5NDlBRDA1NywgMHhBOUU3MTVGRSwgMHg3OUNDNTY5OSwKKyAgICAweEIwMDg1MDBFLCAweDYwMjMxMzY5LCAweDVENUVENkMwLCAweDhENzU5NUE3LAorICAgIDB4MjdBNDExREYsIDB4Rjc4RjUyQjgsIDB4Q0FGMjk3MTEsIDB4MUFEOUQ0NzYsCisgICAgMHgxNTM3OUI3MiwgMHhDNTFDRDgxNSwgMHhGODYxMURCQywgMHgyODRBNUVEQiwKKyAgICAweDgyOUJEQUEzLCAweDUyQjA5OUM0LCAweDZGQ0Q1QzZELCAweEJGRTYxRjBBLAorICAgIDB4NzYyMjE5OUQsIDB4QTYwOTVBRkEsIDB4OUI3NDlGNTMsIDB4NEI1RkRDMzQsCisgICAgMHhFMThFNTg0QywgMHgzMUE1MUIyQiwgMHgwQ0Q4REU4MiwgMHhEQ0YzOURFNSwKKyAgICAweDEyNDk0MDhBLCAweEMyNjIwM0VELCAweEZGMUZDNjQ0LCAweDJGMzQ4NTIzLAorICAgIDB4ODVFNTAxNUIsIDB4NTVDRTQyM0MsIDB4NjhCMzg3OTUsIDB4Qjg5OEM0RjIsCisgICAgMHg3MTVDQzI2NSwgMHhBMTc3ODEwMiwgMHg5QzBBNDRBQiwgMHg0QzIxMDdDQywKKyAgICAweEU2RjA4M0I0LCAweDM2REJDMEQzLCAweDBCQTYwNTdBLCAweERCOEQ0NjFELAorICAgIDB4RDQ2MzA5MTksIDB4MDQ0ODRBN0UsIDB4MzkzNThGRDcsIDB4RTkxRUNDQjAsCisgICAgMHg0M0NGNDhDOCwgMHg5M0U0MEJBRiwgMHhBRTk5Q0UwNiwgMHg3RUIyOEQ2MSwKKyAgICAweEI3NzY4QkY2LCAweDY3NURDODkxLCAweDVBMjAwRDM4LCAweDhBMEI0RTVGLAorICAgIDB4MjBEQUNBMjcsIDB4RjBGMTg5NDAsIDB4Q0Q4QzRDRTksIDB4MURBNzBGOEUsCisgICAgMHgxQ0I1QkIzNywgMHhDQzlFRjg1MCwgMHhGMUUzM0RGOSwgMHgyMUM4N0U5RSwKKyAgICAweDhCMTlGQUU2LCAweDVCMzJCOTgxLCAweDY2NEY3QzI4LCAweEI2NjQzRjRGLAorICAgIDB4N0ZBMDM5RDgsIDB4QUY4QjdBQkYsIDB4OTJGNkJGMTYsIDB4NDJEREZDNzEsCisgICAgMHhFODBDNzgwOSwgMHgzODI3M0I2RSwgMHgwNTVBRkVDNywgMHhENTcxQkRBMCwKKyAgICAweERBOUZGMkE0LCAweDBBQjRCMUMzLCAweDM3Qzk3NDZBLCAweEU3RTIzNzBELAorICAgIDB4NEQzM0IzNzUsIDB4OUQxOEYwMTIsIDB4QTA2NTM1QkIsIDB4NzA0RTc2REMsCisgICAgMHhCOThBNzA0QiwgMHg2OUExMzMyQywgMHg1NERDRjY4NSwgMHg4NEY3QjVFMiwKKyAgICAweDJFMjYzMTlBLCAweEZFMEQ3MkZELCAweEMzNzBCNzU0LCAweDEzNUJGNDMzLAorICAgIDB4RERFMTI5NUMsIDB4MERDQTZBM0IsIDB4MzBCN0FGOTIsIDB4RTA5Q0VDRjUsCisgICAgMHg0QTRENjg4RCwgMHg5QTY2MkJFQSwgMHhBNzFCRUU0MywgMHg3NzMwQUQyNCwKKyAgICAweEJFRjRBQkIzLCAweDZFREZFOEQ0LCAweDUzQTIyRDdELCAweDgzODk2RTFBLAorICAgIDB4Mjk1OEVBNjIsIDB4Rjk3M0E5MDUsIDB4QzQwRTZDQUMsIDB4MTQyNTJGQ0IsCisgICAgMHgxQkNCNjBDRiwgMHhDQkUwMjNBOCwgMHhGNjlERTYwMSwgMHgyNkI2QTU2NiwKKyAgICAweDhDNjcyMTFFLCAweDVDNEM2Mjc5LCAweDYxMzFBN0QwLCAweEIxMUFFNEI3LAorICAgIDB4NzhERUUyMjAsIDB4QThGNUExNDcsIDB4OTU4ODY0RUUsIDB4NDVBMzI3ODksCisgICAgMHhFRjcyQTNGMSwgMHgzRjU5RTA5NiwgMHgwMjI0MjUzRiwgMHhEMjBGNjY1OCwKK307CisKKy8qICRJZDogc29iZXIxMjh0YWIuYyx2IDEuMiAyMDA1LzA1LzA1IDE0OjM1OjU5IHRvbSBFeHAgJCAqLworLyogU2JveCBmb3IgU09CRVItMTI4ICovCisvKgorICogVGhpcyBpcyByZWFsbHkgdGhlIGNvbWJpbmF0aW9uIG9mIHR3byBTQm94ZXM7IHRoZSBsZWFzdCBzaWduaWZpY2FudAorICogMjQgYml0cyBjb21lcyBmcm9tOgorICogOC0+MzIgU2JveCBnZW5lcmF0ZWQgYnkgTWlsbGFuIGV0LiBhbC4gYXQgUXVlZW5zbGFuZCBVbml2ZXJzaXR5IG9mCisgKiBUZWNobm9sb2d5LiBTZWU6IEUuIERhd3NvbiwgVy4gTWlsbGFuLCBMLiBCdXJuZXR0LCBHLiBDYXJ0ZXIsCisgKiAiT24gdGhlIERlc2lnbiBvZiA4KjMyIFMtYm94ZXMiLiBVbnB1Ymxpc2hlZCByZXBvcnQsIGJ5IHRoZQorICogSW5mb3JtYXRpb24gU3lzdGVtcyBSZXNlYXJjaCBDZW50cmUsCisgKiBRdWVlbnNsYW5kIFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neSwgMTk5OS4KKyAqIAorICogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgOCBiaXRzIGFyZSB0aGUgU2tpcGphY2sgIkYgdGFibGUiLCB3aGljaCBjYW4gYmUKKyAqIGZvdW5kIGF0IGh0dHA6Ly9jc3JjLm5pc3QuZ292L0NyeXB0b1Rvb2xraXQvc2tpcGphY2svc2tpcGphY2sucGRmIC4KKyAqIEluIHRoaXMgb3B0aW1pc2VkIHRhYmxlLCB0aG91Z2gsIHRoZSBpbnRlbnQgaXMgdG8gWE9SIHRoZSB3b3JkIGZyb20KKyAqIHRoZSB0YWJsZSBzZWxlY3RlZCBieSB0aGUgaGlnaCBieXRlIHdpdGggdGhlIGlucHV0IHdvcmQuIFRodXMsIHRoZQorICogaGlnaCBieXRlIGlzIGFjdHVhbGx5IHRoZSBTa2lwamFjayBGLXRhYmxlIGVudHJ5IFhPUkVEIHdpdGggaXRzCisgKiB0YWJsZSBpbmRleC4KKyAqLworc3RhdGljIGNvbnN0IHVsb25nMzIgU2JveFsyNTZdID0geworICAgIDB4YTNhYTE4ODcsIDB4ZDY1ZTQzNWMsIDB4MGI2NWMwNDIsIDB4ODAwZTZlZjQsCisgICAgMHhmYzU3ZWUyMCwgMHg0ZDg0ZmVkMywgMHhmMDY2YzUwMiwgMHhmMzU0ZThhZSwKKyAgICAweGJiMmVlOWQ5LCAweDI4MWYzOGQ0LCAweDFmODI5YjVkLCAweDczNWNkZjNjLAorICAgIDB4OTU4NjQyNDksIDB4YmMyZTM5NjMsIDB4YTFmNDQyOWYsIDB4ZjY0MzJjMzUsCisgICAgMHhmN2Y0MDMyNSwgMHgzY2MwZGQ3MCwgMHg1Zjk3M2RlZCwgMHg5OTAyZGM1ZSwKKyAgICAweGRhMTc1YjQyLCAweDU5MDAxMmJmLCAweGRjOTRkNzhjLCAweDM5YWFiMjZiLAorICAgIDB4NGFjMTFiOWEsIDB4OGMxNjgxNDYsIDB4YzNlYThlYzUsIDB4MDU4YWMyOGYsCisgICAgMHg1MmVkNWMwZiwgMHgyNWI0MTAxYywgMHg1YTJkYjA4MiwgMHgzNzA5MjllMSwKKyAgICAweDJhMTg0M2RlLCAweGZlODI5OWZjLCAweDIwMmZiYzRiLCAweDgzMzkxNWRkLAorICAgIDB4MzNhODAzZmEsIDB4ZDQ0NmIyZGUsIDB4NDYyMzMzNDIsIDB4NGZjZWU3YzMsCisgICAgMHgzYWQ2MDdlZiwgMHg5ZTk3ZWJhYiwgMHg1MDdmODU5YiwgMHhlODFmMmUyZiwKKyAgICAweGM1NWI3MWRhLCAweGQ3ZTIyNjlhLCAweDEzMzljM2QxLCAweDdjYTU2YjM2LAorICAgIDB4YTZjOWRlZjIsIDB4YjVjOWZjNWYsIDB4NTkyN2IzYTMsIDB4ODlhNTZkZGYsCisgICAgMHhjNjI1YjUxMCwgMHg1NjBmODVhNywgMHhhY2U4MmU3MSwgMHgyZWNiODgxNiwKKyAgICAweDQ0OTUxZTJhLCAweDk3ZjVmNmFmLCAweGRmY2JjMmIzLCAweGNlNGZmNTVkLAorICAgIDB4Y2I2YjYyMTQsIDB4MmIwYjgzZTMsIDB4NTQ5ZWE2ZjUsIDB4OWRlMDQxYWYsCisgICAgMHg3OTJmMWYxNywgMHhmNzNiOTllZSwgMHgzOWE2NWVjMCwgMHg0YzcwMTZjNiwKKyAgICAweDg1NzcwOWE0LCAweGQ2MzI2ZTAxLCAweGM3YjI4MGQ5LCAweDVjZmIxNDE4LAorICAgIDB4YTZhZmYyMjcsIDB4ZmQ1NDgyMDMsIDB4NTA2YjlkOTYsIDB4YTExN2E4YzAsCisgICAgMHg5Y2Q1YmY2ZSwgMHhkY2VlNzg4OCwgMHg2MWZjZmU2NCwgMHhmN2ExOTNjZCwKKyAgICAweDA1MGQwMTg0LCAweGU4YWU0OTMwLCAweDg4MDE0ZjM2LCAweGQ2YTg3MDg4LAorICAgIDB4NmJhZDZjMmEsIDB4MTQyMmM2NzgsIDB4ZTkyMDRkZTcsIDB4YjdjMmU3NTksCisgICAgMHgwMjAwMjQ4ZSwgMHgwMTNiNDQ2YiwgMHhkYTBkOWZjMiwgMHgwNDE0YTg5NSwKKyAgICAweDNhNmNjM2ExLCAweDU2ZmVmMTcwLCAweDg2YzE5MTU1LCAweGNmN2I4YTY2LAorICAgIDB4NTUxYjVlNjksIDB4YjRhODYyM2UsIDB4YTJiZGZhMzUsIDB4YzRmMDY4Y2MsCisgICAgMHg1NzNhNmFjZCwgMHg2MzU1ZTkzNiwgMHgwMzYwMmRiOSwgMHgwZWRmMTNjMSwKKyAgICAweDJkMGJiMTZkLCAweDY5ODBiODNjLCAweGZlYjIzNzYzLCAweDNkZDhhOTExLAorICAgIDB4MDFiNmJjMTMsIDB4ZjU1NTc5ZDcsIDB4ZjU1YzJmYTgsIDB4MTlmNDE5NmUsCisgICAgMHhlN2RiNTQ3NiwgMHg4ZDY0YTg2NiwgMHhjMDZlMTZhZCwgMHhiMTdmYzUxNSwKKyAgICAweGM0NmZlYjNjLCAweDhiYzhhMzA2LCAweGFkNjc5OWQ5LCAweDU3MWE5MTMzLAorICAgIDB4OTkyNDY2ZGQsIDB4OTJlYjVkY2QsIDB4YWMxMThmNTAsIDB4OWZhZmIyMjYsCisgICAgMHhhMWI5Y2VmMywgMHgzYWIzNjE4OSwgMHgzNDdhMTliMSwgMHg2MmM3MzA4NCwKKyAgICAweGMyN2RlZDVjLCAweDZjOGJjNThmLCAweDFjZGRlNDIxLCAweGVkMWU0N2ZiLAorICAgIDB4Y2RjYzcxNWUsIDB4YjljMGZmOTksIDB4NGIxMjJmMGYsIDB4YzRkMjUxODQsCisgICAgMHhhZjdhNWU2YywgMHg1YmJmMThiYywgMHg4ZGQ3YzZlMCwgMHg1ZmI3ZTQyMCwKKyAgICAweDUyMWY1MjNmLCAweDRhZDliOGEyLCAweGU5ZGExYTZiLCAweDk3ODg4YzAyLAorICAgIDB4MTlkMWUzNTQsIDB4NWFiYTdkNzksIDB4YTJjYzc3NTMsIDB4OGMyZDk2NTUsCisgICAgMHgxOTgyOWRhMSwgMHg1MzE1OTBhNywgMHgxOWMxYzE0OSwgMHgzZDUzN2YxYywKKyAgICAweDUwNzc5YjY5LCAweGVkNzFmMmI3LCAweDQ2M2M1OGZhLCAweDUyZGM0NDE4LAorICAgIDB4YzE4YzhjNzYsIDB4YzEyMGQ5ZjAsIDB4YWZhODBkNGQsIDB4M2I3NGM0NzMsCisgICAgMHhkMDk0MTBlOSwgMHgyOTBlNDIxMSwgMHhjM2M4MDgyYiwgMHg4ZjZiMzM0YSwKKyAgICAweDNiZjY4ZWQyLCAweGE4NDNjYzFiLCAweDhkM2MwZmYzLCAweDIwZTU2NGEwLAorICAgIDB4ZjhmNTVhNGYsIDB4MmI0MGY4ZTcsIDB4ZmVhN2YxNWYsIDB4Y2YwMGZlMjEsCisgICAgMHg4YTZkMzdkNiwgMHhkMGQ1MDZmMSwgMHhhZGUwMDk3MywgMHhlZmJiZGUzNiwKKyAgICAweDg0NjcwZmE4LCAweGZhMzFhYjllLCAweGFlZGFiNjE4LCAweGMwMWY1MmY1LAorICAgIDB4NjU1OGViNGYsIDB4NzFiOWUzNDMsIDB4NGI4ZDc3ZGQsIDB4OGNiOTNkYTYsCisgICAgMHg3NDBmZDUyZCwgMHg0MjU0MTJmOCwgMHhjNWE2MzM2MCwgMHgxMGU1M2FkMCwKKyAgICAweDVhNzAwZjFjLCAweDgzMjRlZDBiLCAweGU1M2RjMWVjLCAweDFhMzY2Nzk1LAorICAgIDB4NmQ1NDlkMTUsIDB4YzVjZTQ2ZDcsIDB4ZTE3YWJlNzYsIDB4NWY0OGUwYTAsCisgICAgMHhkMGYwN2MwMiwgMHg5NDEyNDliNywgMHhlNDllZDZiYSwgMHgzN2E0N2Y3OCwKKyAgICAweGUxY2ZmZmJkLCAweGIwMDdjYTg0LCAweGJiNjVmNGRhLCAweGI1OWYzNWRhLAorICAgIDB4MzNkMmFhNDQsIDB4NDE3NDUyYWMsIDB4YzBkNjc0YTcsIDB4MmQ2MWE0NmEsCisgICAgMHhkYzYzMTUyYSwgMHgzZTEyYjdhYSwgMHg2ZTYxNTkyNywgMHhhMTRmYjExOCwKKyAgICAweGExNTE3NThkLCAweGJhODE2ODdiLCAweGUxNTJmMGIzLCAweDc2NDI1NGVkLAorICAgIDB4MzRjNzcyNzEsIDB4MGEzMWFjYWIsIDB4NTRmOTRhZWMsIDB4YjllOTk0Y2QsCisgICAgMHg1NzRkOWU4MSwgMHg1YjYyMzczMCwgMHhjZThhMjFlOCwgMHgzNzkxN2YwYiwKKyAgICAweGU4YTliNWQ2LCAweDk2OTdhZGY4LCAweGYzZDMwNDMxLCAweDVkY2FjOTIxLAorICAgIDB4NzZiMzVkNDYsIDB4YWE0MzBhMzYsIDB4YzIxOTQwMjIsIDB4MjJiY2E2NWUsCisgICAgMHhkYWVjNzBiYSwgMHhkZmFlYThjYywgMHg3NzdiYWU4YiwgMHgyNDI5MjRkNSwKKyAgICAweDFmMDk4YTVhLCAweDRiMzk2YjgxLCAweDU1ZGUyNTIyLCAweDQzNWMxY2I4LAorICAgIDB4YWViOGZlMWQsIDB4OWRiM2M2OTcsIDB4NWIxNjRmODMsIDB4ZTBjMTYzNzYsCisgICAgMHhhMzE5MjI0YywgMHhkMDIwM2IzNSwgMHg0MzNhYzBmZSwgMHgxNDY2YTE5YSwKKyAgICAweDQ1ZjBiMjRmLCAweDUxZmRhOTk4LCAweGMwZDUyZDcxLCAweGZhMDg5NmE4LAorICAgIDB4ZjllNjA1M2YsIDB4YTRiMGQzMDAsIDB4ZDQ5OWNiY2MsIDB4Yjk1ZTNkNDAsCit9OworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcHJuZ3Mvc29iZXIxMjh0YWIuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4yICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wcm5ncy9zcHJuZy5jIGIvc3JjL3BybmdzL3Nwcm5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2NTdkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wcm5ncy9zcHJuZy5jCkBAIC0wLDAgKzEsMTM2IEBACisvKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCisgKgorICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCisgKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KKyAqCisgKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcworICogZ3VhcmFudGVlIGl0IHdvcmtzLgorICoKKyAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BnbWFpbC5jb20sIGh0dHA6Ly9saWJ0b21jcnlwdC5vcmcKKyAqLworI2luY2x1ZGUgInRvbWNyeXB0LmgiCisKKy8qKgorICAgQGZpbGUgc3BybmcuYworICAgU2VjdXJlIFBSTkcsIFRvbSBTdCBEZW5pcworKi8KKyAgIAorLyogQSBzZWN1cmUgUFJORyB1c2luZyB0aGUgUk5HIGZ1bmN0aW9ucy4gIEJhc2ljYWxseSB0aGlzIGlzIGEKKyAqIHdyYXBwZXIgdGhhdCBhbGxvd3MgeW91IHRvIHVzZSBhIHNlY3VyZSBSTkcgYXMgYSBQUk5HCisgKiBpbiB0aGUgdmFyaW91cyBvdGhlciBmdW5jdGlvbnMuCisgKi8KKworI2lmZGVmIFNQUk5HCisKK2NvbnN0IHN0cnVjdCBsdGNfcHJuZ19kZXNjcmlwdG9yIHNwcm5nX2Rlc2MgPQoreworICAgICJzcHJuZyIsIDAsCisgICAgJnNwcm5nX3N0YXJ0LAorICAgICZzcHJuZ19hZGRfZW50cm9weSwKKyAgICAmc3BybmdfcmVhZHksCisgICAgJnNwcm5nX3JlYWQsCisgICAgJnNwcm5nX2RvbmUsCisgICAgJnNwcm5nX2V4cG9ydCwKKyAgICAmc3BybmdfaW1wb3J0LAorICAgICZzcHJuZ190ZXN0Cit9OworCisvKioKKyAgU3RhcnQgdGhlIFBSTkcKKyAgQHBhcmFtIHBybmcgICAgIFtvdXRdIFRoZSBQUk5HIHN0YXRlIHRvIGluaXRpYWxpemUKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgc3Bybmdfc3RhcnQocHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgIHJldHVybiBDUllQVF9PSzsgIAorfQorCisvKioKKyAgQWRkIGVudHJvcHkgdG8gdGhlIFBSTkcgc3RhdGUKKyAgQHBhcmFtIGluICAgICAgIFRoZSBkYXRhIHRvIGFkZAorICBAcGFyYW0gaW5sZW4gICAgTGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGFkZAorICBAcGFyYW0gcHJuZyAgICAgUFJORyBzdGF0ZSB0byB1cGRhdGUKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgc3BybmdfYWRkX2VudHJvcHkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBybmdfc3RhdGUgKnBybmcpCit7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKy8qKgorICBNYWtlIHRoZSBQUk5HIHJlYWR5IHRvIHJlYWQgZnJvbQorICBAcGFyYW0gcHJuZyAgIFRoZSBQUk5HIHRvIG1ha2UgYWN0aXZlCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8gIAoraW50IHNwcm5nX3JlYWR5KHBybmdfc3RhdGUgKnBybmcpCit7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKy8qKgorICBSZWFkIGZyb20gdGhlIFBSTkcKKyAgQHBhcmFtIG91dCAgICAgIERlc3RpbmF0aW9uCisgIEBwYXJhbSBvdXRsZW4gICBMZW5ndGggb2Ygb3V0cHV0CisgIEBwYXJhbSBwcm5nICAgICBUaGUgYWN0aXZlIFBSTkcgdG8gcmVhZCBmcm9tCisgIEByZXR1cm4gTnVtYmVyIG9mIG9jdGV0cyByZWFkCisqLyAgCit1bnNpZ25lZCBsb25nIHNwcm5nX3JlYWQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nIG91dGxlbiwgcHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgIExUQ19BUkdDSEsob3V0ICE9IE5VTEwpOworICAgcmV0dXJuIHJuZ19nZXRfYnl0ZXMob3V0LCBvdXRsZW4sIE5VTEwpOworfQorCisvKioKKyAgVGVybWluYXRlIHRoZSBQUk5HCisgIEBwYXJhbSBwcm5nICAgVGhlIFBSTkcgdG8gdGVybWluYXRlCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8gIAoraW50IHNwcm5nX2RvbmUocHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworLyoqCisgIEV4cG9ydCB0aGUgUFJORyBzdGF0ZQorICBAcGFyYW0gb3V0ICAgICAgIFtvdXRdIERlc3RpbmF0aW9uCisgIEBwYXJhbSBvdXRsZW4gICAgW2luL291dF0gTWF4IHNpemUgYW5kIHJlc3VsdGluZyBzaXplIG9mIHRoZSBzdGF0ZQorICBAcGFyYW0gcHJuZyAgICAgIFRoZSBQUk5HIHRvIGV4cG9ydAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCBzcHJuZ19leHBvcnQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIHBybmdfc3RhdGUgKnBybmcpCit7CisgICBMVENfQVJHQ0hLKG91dGxlbiAhPSBOVUxMKTsKKworICAgKm91dGxlbiA9IDA7CisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisgCisvKioKKyAgSW1wb3J0IGEgUFJORyBzdGF0ZQorICBAcGFyYW0gaW4gICAgICAgVGhlIFBSTkcgc3RhdGUKKyAgQHBhcmFtIGlubGVuICAgIFNpemUgb2YgdGhlIHN0YXRlCisgIEBwYXJhbSBwcm5nICAgICBUaGUgUFJORyB0byBpbXBvcnQKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgc3BybmdfaW1wb3J0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBwcm5nX3N0YXRlICpwcm5nKQoreworICAgcmV0dXJuIENSWVBUX09LOworfQorCisvKioKKyAgUFJORyBzZWxmLXRlc3QKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0aW5nIGhhcyBiZWVuIGRpc2FibGVkCisqLyAgCitpbnQgc3BybmdfdGVzdCh2b2lkKQoreworICAgcmV0dXJuIENSWVBUX09LOworfQorCisjZW5kaWYKKworCisgCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3NyYy9wcm5ncy9zcHJuZy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjMgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMDUgMTQ6MzU6NTkgJCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BybmdzL3lhcnJvdy5jIGIvc3JjL3BybmdzL3lhcnJvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNTljMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcHJuZ3MveWFycm93LmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qIExpYlRvbUNyeXB0LCBtb2R1bGFyIGNyeXB0b2dyYXBoaWMgbGlicmFyeSAtLSBUb20gU3QgRGVuaXMKKyAqCisgKiBMaWJUb21DcnlwdCBpcyBhIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGNyeXB0b2dyYXBoaWMKKyAqIGFsZ29yaXRobXMgaW4gYSBoaWdobHkgbW9kdWxhciBhbmQgZmxleGlibGUgbWFubmVyLgorICoKKyAqIFRoZSBsaWJyYXJ5IGlzIGZyZWUgZm9yIGFsbCBwdXJwb3NlcyB3aXRob3V0IGFueSBleHByZXNzCisgKiBndWFyYW50ZWUgaXQgd29ya3MuCisgKgorICogVG9tIFN0IERlbmlzLCB0b21zdGRlbmlzQGdtYWlsLmNvbSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZworICovCisjaW5jbHVkZSAidG9tY3J5cHQuaCIKKworLyoqCisgIEBmaWxlIHlhcnJvdy5jCisgIFlhcnJvdyBQUk5HLCBUb20gU3QgRGVuaXMKKyovICAKKworI2lmZGVmIFlBUlJPVworCitjb25zdCBzdHJ1Y3QgbHRjX3BybmdfZGVzY3JpcHRvciB5YXJyb3dfZGVzYyA9Cit7CisgICAgInlhcnJvdyIsIDY0LAorICAgICZ5YXJyb3dfc3RhcnQsCisgICAgJnlhcnJvd19hZGRfZW50cm9weSwKKyAgICAmeWFycm93X3JlYWR5LAorICAgICZ5YXJyb3dfcmVhZCwKKyAgICAmeWFycm93X2RvbmUsCisgICAgJnlhcnJvd19leHBvcnQsCisgICAgJnlhcnJvd19pbXBvcnQsCisgICAgJnlhcnJvd190ZXN0Cit9OworCisvKioKKyAgU3RhcnQgdGhlIFBSTkcKKyAgQHBhcmFtIHBybmcgICAgIFtvdXRdIFRoZSBQUk5HIHN0YXRlIHRvIGluaXRpYWxpemUKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsCisqLyAgCitpbnQgeWFycm93X3N0YXJ0KHBybmdfc3RhdGUgKnBybmcpCit7CisgICBpbnQgZXJyOworICAgCisgICBMVENfQVJHQ0hLKHBybmcgIT0gTlVMTCk7CisKKyAgIC8qIHRoZXNlIGFyZSB0aGUgZGVmYXVsdCBoYXNoL2NpcGhlciBjb21ibyB1c2VkICovCisjaWZkZWYgUklKTkRBRUwKKyNpZiAgICBZQVJST1dfQUVTPT0wCisgICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZyaWpuZGFlbF9lbmNfZGVzYyk7CisjZWxpZiAgWUFSUk9XX0FFUz09MQorICAgcHJuZy0+eWFycm93LmNpcGhlciA9IHJlZ2lzdGVyX2NpcGhlcigmYWVzX2VuY19kZXNjKTsKKyNlbGlmICBZQVJST1dfQUVTPT0yCisgICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZyaWpuZGFlbF9kZXNjKTsKKyNlbGlmICBZQVJST1dfQUVTPT0zCisgICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZhZXNfZGVzYyk7CisjZW5kaWYKKyNlbGlmIGRlZmluZWQoQkxPV0ZJU0gpCisgICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZibG93ZmlzaF9kZXNjKTsKKyNlbGlmIGRlZmluZWQoVFdPRklTSCkKKyAgIHBybmctPnlhcnJvdy5jaXBoZXIgPSByZWdpc3Rlcl9jaXBoZXIoJnR3b2Zpc2hfZGVzYyk7CisjZWxpZiBkZWZpbmVkKFJDNikKKyAgIHBybmctPnlhcnJvdy5jaXBoZXIgPSByZWdpc3Rlcl9jaXBoZXIoJnJjNl9kZXNjKTsKKyNlbGlmIGRlZmluZWQoUkM1KQorICAgcHJuZy0+eWFycm93LmNpcGhlciA9IHJlZ2lzdGVyX2NpcGhlcigmcmM1X2Rlc2MpOworI2VsaWYgZGVmaW5lZChTQUZFUlApCisgICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZzYWZlcnBfZGVzYyk7CisjZWxpZiBkZWZpbmVkKFJDMikKKyAgIHBybmctPnlhcnJvdy5jaXBoZXIgPSByZWdpc3Rlcl9jaXBoZXIoJnJjMl9kZXNjKTsKKyNlbGlmIGRlZmluZWQoTk9FS0VPTikgICAKKyAgIHBybmctPnlhcnJvdy5jaXBoZXIgPSByZWdpc3Rlcl9jaXBoZXIoJm5vZWtlb25fZGVzYyk7CisjZWxpZiBkZWZpbmVkKENBU1Q1KQorICAgcHJuZy0+eWFycm93LmNpcGhlciA9IHJlZ2lzdGVyX2NpcGhlcigmY2FzdDVfZGVzYyk7CisjZWxpZiBkZWZpbmVkKFhURUEpCisgICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZ4dGVhX2Rlc2MpOworI2VsaWYgZGVmaW5lZChTQUZFUikKKyAgIHBybmctPnlhcnJvdy5jaXBoZXIgPSByZWdpc3Rlcl9jaXBoZXIoJnNhZmVyX3NrMTI4X2Rlc2MpOworI2VsaWYgZGVmaW5lZChERVMpCisgICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZkZXMzX2Rlc2MpOworI2Vsc2UKKyAgICNlcnJvciBZQVJST1cgbmVlZHMgYXQgbGVhc3Qgb25lIENJUEhFUgorI2VuZGlmCisgICBpZiAoKGVyciA9IGNpcGhlcl9pc192YWxpZChwcm5nLT55YXJyb3cuY2lwaGVyKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyNpZmRlZiBTSEEyNTYKKyAgIHBybmctPnlhcnJvdy5oYXNoICAgPSByZWdpc3Rlcl9oYXNoKCZzaGEyNTZfZGVzYyk7CisjZWxpZiBkZWZpbmVkKFNIQTUxMikKKyAgIHBybmctPnlhcnJvdy5oYXNoICAgPSByZWdpc3Rlcl9oYXNoKCZzaGE1MTJfZGVzYyk7CisjZWxpZiBkZWZpbmVkKFRJR0VSKQorICAgcHJuZy0+eWFycm93Lmhhc2ggICA9IHJlZ2lzdGVyX2hhc2goJnRpZ2VyX2Rlc2MpOworI2VsaWYgZGVmaW5lZChTSEExKQorICAgcHJuZy0+eWFycm93Lmhhc2ggICA9IHJlZ2lzdGVyX2hhc2goJnNoYTFfZGVzYyk7CisjZWxpZiBkZWZpbmVkKFJJUEVNRDE2MCkKKyAgIHBybmctPnlhcnJvdy5oYXNoICAgPSByZWdpc3Rlcl9oYXNoKCZybWQxNjBfZGVzYyk7CisjZWxpZiBkZWZpbmVkKFJJUEVNRDEyOCkKKyAgIHBybmctPnlhcnJvdy5oYXNoICAgPSByZWdpc3Rlcl9oYXNoKCZybWQxMjhfZGVzYyk7CisjZWxpZiBkZWZpbmVkKE1ENSkKKyAgIHBybmctPnlhcnJvdy5oYXNoICAgPSByZWdpc3Rlcl9oYXNoKCZtZDVfZGVzYyk7CisjZWxpZiBkZWZpbmVkKE1ENCkKKyAgIHBybmctPnlhcnJvdy5oYXNoICAgPSByZWdpc3Rlcl9oYXNoKCZtZDRfZGVzYyk7CisjZWxpZiBkZWZpbmVkKE1EMikKKyAgIHBybmctPnlhcnJvdy5oYXNoICAgPSByZWdpc3Rlcl9oYXNoKCZtZDJfZGVzYyk7CisjZWxpZiBkZWZpbmVkKFdISVJMUE9PTCkKKyAgIHBybmctPnlhcnJvdy5oYXNoICAgPSByZWdpc3Rlcl9oYXNoKCZ3aGlybHBvb2xfZGVzYyk7CisjZWxzZQorICAgI2Vycm9yIFlBUlJPVyBuZWVkcyBhdCBsZWFzdCBvbmUgSEFTSAorI2VuZGlmCisgICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQocHJuZy0+eWFycm93Lmhhc2gpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogemVybyB0aGUgbWVtb3J5IHVzZWQgKi8KKyAgIHplcm9tZW0ocHJuZy0+eWFycm93LnBvb2wsIHNpemVvZihwcm5nLT55YXJyb3cucG9vbCkpOworCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKy8qKgorICBBZGQgZW50cm9weSB0byB0aGUgUFJORyBzdGF0ZQorICBAcGFyYW0gaW4gICAgICAgVGhlIGRhdGEgdG8gYWRkCisgIEBwYXJhbSBpbmxlbiAgICBMZW5ndGggb2YgdGhlIGRhdGEgdG8gYWRkCisgIEBwYXJhbSBwcm5nICAgICBQUk5HIHN0YXRlIHRvIHVwZGF0ZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCB5YXJyb3dfYWRkX2VudHJvcHkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGxvbmcgaW5sZW4sIHBybmdfc3RhdGUgKnBybmcpCit7CisgICBoYXNoX3N0YXRlIG1kOworICAgaW50IGVycjsKKworICAgTFRDX0FSR0NISyhpbiAgIT0gTlVMTCk7CisgICBMVENfQVJHQ0hLKHBybmcgIT0gTlVMTCk7CisKKyAgIGlmICgoZXJyID0gaGFzaF9pc192YWxpZChwcm5nLT55YXJyb3cuaGFzaCkpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICAvKiBzdGFydCB0aGUgaGFzaCAqLworICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbcHJuZy0+eWFycm93Lmhhc2hdLmluaXQoJm1kKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7IAorICAgfQorCisgICAvKiBoYXNoIHRoZSBjdXJyZW50IHBvb2wgKi8KKyAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW3BybmctPnlhcnJvdy5oYXNoXS5wcm9jZXNzKCZtZCwgcHJuZy0+eWFycm93LnBvb2wsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Rlc2NyaXB0b3JbcHJuZy0+eWFycm93Lmhhc2hdLmhhc2hzaXplKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIC8qIGFkZCB0aGUgbmV3IGVudHJvcHkgKi8KKyAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW3BybmctPnlhcnJvdy5oYXNoXS5wcm9jZXNzKCZtZCwgaW4sIGlubGVuKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisKKyAgIC8qIHN0b3JlIHJlc3VsdCAqLworICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbcHJuZy0+eWFycm93Lmhhc2hdLmRvbmUoJm1kLCBwcm5nLT55YXJyb3cucG9vbCkpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorCisgICByZXR1cm4gQ1JZUFRfT0s7Cit9CisKKy8qKgorICBNYWtlIHRoZSBQUk5HIHJlYWR5IHRvIHJlYWQgZnJvbQorICBAcGFyYW0gcHJuZyAgIFRoZSBQUk5HIHRvIG1ha2UgYWN0aXZlCisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8gIAoraW50IHlhcnJvd19yZWFkeShwcm5nX3N0YXRlICpwcm5nKQoreworICAgaW50IGtzLCBlcnI7CisKKyAgIExUQ19BUkdDSEsocHJuZyAhPSBOVUxMKTsKKworICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKHBybmctPnlhcnJvdy5oYXNoKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7CisgICB9CisgICAKKyAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKHBybmctPnlhcnJvdy5jaXBoZXIpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgLyogc2V0dXAgQ1RSIG1vZGUgdXNpbmcgdGhlICJwb29sIiBhcyB0aGUga2V5ICovCisgICBrcyA9IChpbnQpaGFzaF9kZXNjcmlwdG9yW3BybmctPnlhcnJvdy5oYXNoXS5oYXNoc2l6ZTsKKyAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbcHJuZy0+eWFycm93LmNpcGhlcl0ua2V5c2l6ZSgma3MpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKworICAgaWYgKChlcnIgPSBjdHJfc3RhcnQocHJuZy0+eWFycm93LmNpcGhlciwgICAgIC8qIHdoYXQgY2lwaGVyIHRvIHVzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgcHJuZy0+eWFycm93LnBvb2wsICAgICAgIC8qIElWICovCisgICAgICAgICAgICAgICAgICAgICAgICBwcm5nLT55YXJyb3cucG9vbCwga3MsICAgLyogS0VZIGFuZCBrZXkgc2l6ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByb3VuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIENUUl9DT1VOVEVSX0xJVFRMRV9FTkRJQU4sIC8qIGxpdHRsZSBlbmRpYW4gY291bnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgJnBybmctPnlhcnJvdy5jdHIpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIHJldHVybiBDUllQVF9PSzsKK30KKworLyoqCisgIFJlYWQgZnJvbSB0aGUgUFJORworICBAcGFyYW0gb3V0ICAgICAgRGVzdGluYXRpb24KKyAgQHBhcmFtIG91dGxlbiAgIExlbmd0aCBvZiBvdXRwdXQKKyAgQHBhcmFtIHBybmcgICAgIFRoZSBhY3RpdmUgUFJORyB0byByZWFkIGZyb20KKyAgQHJldHVybiBOdW1iZXIgb2Ygb2N0ZXRzIHJlYWQKKyovICAKK3Vuc2lnbmVkIGxvbmcgeWFycm93X3JlYWQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nIG91dGxlbiwgcHJuZ19zdGF0ZSAqcHJuZykKK3sKKyAgIExUQ19BUkdDSEsob3V0ICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsocHJuZyAhPSBOVUxMKTsKKworICAgLyogcHV0IG91dCBpbiBwcmVkaWN0YWJsZSBzdGF0ZSBmaXJzdCAqLworICAgemVyb21lbShvdXQsIG91dGxlbik7CisgICAKKyAgIC8qIG5vdyByYW5kb21pemUgaXQgKi8KKyAgIGlmIChjdHJfZW5jcnlwdChvdXQsIG91dCwgb3V0bGVuLCAmcHJuZy0+eWFycm93LmN0cikgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiAwOworICAgfQorICAgcmV0dXJuIG91dGxlbjsKK30KKworLyoqCisgIFRlcm1pbmF0ZSB0aGUgUFJORworICBAcGFyYW0gcHJuZyAgIFRoZSBQUk5HIHRvIHRlcm1pbmF0ZQorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCB5YXJyb3dfZG9uZShwcm5nX3N0YXRlICpwcm5nKQoreworICAgTFRDX0FSR0NISyhwcm5nICE9IE5VTEwpOworCisgICAvKiBjYWxsIGNpcGhlciBkb25lIHdoZW4gd2UgaW52ZW50IG9uZSA7LSkgKi8KKworICAgLyogd2UgaW52ZW50ZWQgb25lICovCisgICByZXR1cm4gY3RyX2RvbmUoJnBybmctPnlhcnJvdy5jdHIpOworfQorCisvKioKKyAgRXhwb3J0IHRoZSBQUk5HIHN0YXRlCisgIEBwYXJhbSBvdXQgICAgICAgW291dF0gRGVzdGluYXRpb24KKyAgQHBhcmFtIG91dGxlbiAgICBbaW4vb3V0XSBNYXggc2l6ZSBhbmQgcmVzdWx0aW5nIHNpemUgb2YgdGhlIHN0YXRlCisgIEBwYXJhbSBwcm5nICAgICAgVGhlIFBSTkcgdG8gZXhwb3J0CisgIEByZXR1cm4gQ1JZUFRfT0sgaWYgc3VjY2Vzc2Z1bAorKi8gIAoraW50IHlhcnJvd19leHBvcnQodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBsb25nICpvdXRsZW4sIHBybmdfc3RhdGUgKnBybmcpCit7CisgICBMVENfQVJHQ0hLKG91dCAgICAhPSBOVUxMKTsKKyAgIExUQ19BUkdDSEsob3V0bGVuICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwcm5nICAgIT0gTlVMTCk7CisKKyAgIC8qIHdlJ2xsIHdyaXRlIDY0IGJ5dGVzIGZvciBzJmcncyAqLworICAgaWYgKCpvdXRsZW4gPCA2NCkgeworICAgICAgcmV0dXJuIENSWVBUX0JVRkZFUl9PVkVSRkxPVzsKKyAgIH0KKworICAgaWYgKHlhcnJvd19yZWFkKG91dCwgNjQsIHBybmcpICE9IDY0KSB7CisgICAgICByZXR1cm4gQ1JZUFRfRVJST1JfUkVBRFBSTkc7CisgICB9CisgICAqb3V0bGVuID0gNjQ7CisKKyAgIHJldHVybiBDUllQVF9PSzsKK30KKyAKKy8qKgorICBJbXBvcnQgYSBQUk5HIHN0YXRlCisgIEBwYXJhbSBpbiAgICAgICBUaGUgUFJORyBzdGF0ZQorICBAcGFyYW0gaW5sZW4gICAgU2l6ZSBvZiB0aGUgc3RhdGUKKyAgQHBhcmFtIHBybmcgICAgIFRoZSBQUk5HIHRvIGltcG9ydAorICBAcmV0dXJuIENSWVBUX09LIGlmIHN1Y2Nlc3NmdWwKKyovICAKK2ludCB5YXJyb3dfaW1wb3J0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBsb25nIGlubGVuLCBwcm5nX3N0YXRlICpwcm5nKQoreworICAgaW50IGVycjsKKworICAgTFRDX0FSR0NISyhpbiAgICE9IE5VTEwpOworICAgTFRDX0FSR0NISyhwcm5nICE9IE5VTEwpOworCisgICBpZiAoaW5sZW4gIT0gNjQpIHsKKyAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0FSRzsKKyAgIH0KKworICAgaWYgKChlcnIgPSB5YXJyb3dfc3RhcnQocHJuZykpICE9IENSWVBUX09LKSB7CisgICAgICByZXR1cm4gZXJyOworICAgfQorICAgcmV0dXJuIHlhcnJvd19hZGRfZW50cm9weShpbiwgNjQsIHBybmcpOworfQorCisvKioKKyAgUFJORyBzZWxmLXRlc3QKKyAgQHJldHVybiBDUllQVF9PSyBpZiBzdWNjZXNzZnVsLCBDUllQVF9OT1AgaWYgc2VsZi10ZXN0aW5nIGhhcyBiZWVuIGRpc2FibGVkCisqLyAgCitpbnQgeWFycm93X3Rlc3Qodm9pZCkKK3sKKyNpZm5kZWYgTFRDX1RFU1QKKyAgIHJldHVybiBDUllQVF9OT1A7CisjZWxzZQorICAgaW50IGVycjsKKyAgIHBybmdfc3RhdGUgcHJuZzsKKworICAgaWYgKChlcnIgPSB5YXJyb3dfc3RhcnQoJnBybmcpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsKKyAgIH0KKyAgIAorICAgLyogbm93IGxldCdzIHRlc3QgdGhlIGhhc2gvY2lwaGVyIHRoYXQgd2FzIGNob3NlbiAqLworICAgaWYgKChlcnIgPSBjaXBoZXJfZGVzY3JpcHRvcltwcm5nLnlhcnJvdy5jaXBoZXJdLnRlc3QoKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgIHJldHVybiBlcnI7IAorICAgfQorICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbcHJuZy55YXJyb3cuaGFzaF0udGVzdCgpKSAhPSBDUllQVF9PSykgeworICAgICAgcmV0dXJuIGVycjsgCisgICB9CisKKyAgIHlhcnJvd19kb25lKCZwcm5nKTsKKyAgIHJldHVybiBDUllQVF9PSzsKKyNlbmRpZgorfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC9zcmMvcHJuZ3MveWFycm93LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS9zdHJpbmdzLmMgYi9zdHJpbmdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGNiNjMuLjAwMDAwMDAKLS0tIGEvc3RyaW5ncy5jCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLS8qIEZ1dHVyZSByZWxlYXNlcyB3aWxsIG1ha2UgdXNlIG9mIHRoaXMgKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICplcnJfMl9zdHJbXSA9Ci17Ci0gICAiQ1JZUFRfT0siLAotICAgIkNSWVBUX0VSUk9SIiwKLSAgICJOb24tZmF0YWwgJ25vLW9wZXJhdGlvbicgcmVxdWVzdGVkLiIsCi0KLSAgICJJbnZhbGlkIGtleXNpemUgZm9yIGJsb2NrIGNpcGhlci4iLAotICAgIkludmFsaWQgbnVtYmVyIG9mIHJvdW5kcyBmb3IgYmxvY2sgY2lwaGVyLiIsCi0gICAiQWxnb3JpdGhtIGZhaWxlZCB0ZXN0IHZlY3RvcnMuIiwKLQotICAgIkJ1ZmZlciBvdmVyZmxvdy4iLAotICAgIkludmFsaWQgaW5wdXQgcGFja2V0LiIsCi0KLSAgICJJbnZhbGlkIG51bWJlciBvZiBiaXRzIGZvciBhIFBSTkcuIiwKLSAgICJFcnJvciByZWFkaW5nIHRoZSBQUk5HLiIsCi0KLSAgICJJbnZhbGlkIGNpcGhlciBzcGVjaWZpZWQuIiwKLSAgICJJbnZhbGlkIGhhc2ggc3BlY2lmaWVkLiIsCi0gICAiSW52YWxpZCBQUk5HIHNwZWNpZmllZC4iLAotCi0gICAiT3V0IG9mIG1lbW9yeS4iLAotCi0gICAiSW52YWxpZCBQSyBrZXkgb3Iga2V5IHR5cGUgc3BlY2lmaWVkIGZvciBmdW5jdGlvbi4iLAotICAgIkEgcHJpdmF0ZSBQSyBrZXkgaXMgcmVxdWlyZWQuIiwKLQotICAgIkludmFsaWQgYXJndW1lbnQgcHJvdmlkZWQuIiwKLSAgICJGaWxlIE5vdCBGb3VuZCIsCi0KLSAgICJJbnZhbGlkIFBLIHR5cGUuIiwKLSAgICJJbnZhbGlkIFBLIHN5c3RlbS4iLAotICAgIkR1cGxpY2F0ZSBQSyBrZXkgZm91bmQgb24ga2V5cmluZy4iLAotICAgIktleSBub3QgZm91bmQgaW4ga2V5cmluZy4iLAotICAgIkludmFsaWQgc2l6ZWQgcGFyYW1ldGVyLiIsCi0KLSAgICJJbnZhbGlkIHNpemUgZm9yIHByaW1lLiIsCi0KLX07Ci0KLSNpZmRlZiBNUEkKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgIGludCBtcGlfY29kZSwgbHRjX2NvZGU7Ci19IG1waV90b19sdGNfY29kZXNbXSA9IHsKLSAgIHsgTVBfT0tBWSAsICBDUllQVF9PS30sCi0gICB7IE1QX01FTSAgLCAgQ1JZUFRfTUVNfSwKLSAgIHsgTVBfVkFMICAsICBDUllQVF9JTlZBTElEX0FSR30sCi19OwotI2VuZGlmCi0KLWNvbnN0IGNoYXIgKmVycm9yX3RvX3N0cmluZyhpbnQgZXJyKQotewotICAgaWYgKGVyciA8IDAgfHwgZXJyID49IChpbnQpKHNpemVvZihlcnJfMl9zdHIpL3NpemVvZihlcnJfMl9zdHJbMF0pKSkgewotICAgICAgcmV0dXJuICJJbnZhbGlkIGVycm9yIGNvZGUuIjsKLSAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZXJyXzJfc3RyW2Vycl07Ci0gICB9ICAgCi19Ci0KLSNpZmRlZiBNUEkKLS8qIGNvbnZlcnQgYSBNUEkgZXJyb3IgdG8gYSBMVEMgZXJyb3IgKFBvc3NpYmx5IHRoZSBtb3N0IHBvd2VyZnVsIGZ1bmN0aW9uIGV2ZXIhICBPaCB3YWl0Li4uIG5vKSAqLwotaW50IG1waV90b19sdGNfZXJyb3IoaW50IGVycikKLXsKLSAgIGludCB4OwotCi0gICBmb3IgKHggPSAwOyB4IDwgKGludCkoc2l6ZW9mKG1waV90b19sdGNfY29kZXMpL3NpemVvZihtcGlfdG9fbHRjX2NvZGVzWzBdKSk7IHgrKykgewotICAgICAgIGlmIChlcnIgPT0gbXBpX3RvX2x0Y19jb2Rlc1t4XS5tcGlfY29kZSkgeyAKLSAgICAgICAgICByZXR1cm4gbXBpX3RvX2x0Y19jb2Rlc1t4XS5sdGNfY29kZTsKLSAgICAgICB9Ci0gICB9Ci0gICByZXR1cm4gQ1JZUFRfRVJST1I7Ci19Ci0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvdGVzdGJ1aWxkLnNoIGIvdGVzdGJ1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2M2NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0YnVpbGQuc2gKQEAgLTAsMCArMSwxMSBAQAorIyEvYmluL2Jhc2gKK2VjaG8gIiQxIChCdWlsZCBPbmx5LCAkMiwgJDMpLi4uIgorbWFrZSBjbGVhbiAxPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAorZWNobyAtbiAiYnVpbGRpbmcuLi4iCit0b3VjaCB0ZXN0b2sudHh0CitDRkxBR1M9IiQyIiBtYWtlIC1mICQzIHRlc3QgdHZfZ2VuIDE+Z2NjXzEudHh0IDI+Z2NjXzIudHh0IHx8IChlY2hvICJidWlsZCAkMSBmYWlsZWQgc2VlIGdjY18yLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbiIgJiYgY2F0IGdjY18yLnR4dCAmJiBybSAtZiB0ZXN0b2sudHh0ICYmIGV4aXQgMSkKK2lmIGZpbmQgdGVzdG9rLnR4dCAtdHlwZSBmIDE+L2Rldi9udWxsIDI+L2Rldi9udWxsIDsgdGhlbgorICAgZWNobyAic3VjY2Vzc2Z1bCIKKyAgIGV4aXQgMAorZmkKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvdGVzdG1lLnNoIGIvdGVzdG1lLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGY5N2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0bWUuc2gKQEAgLTAsMCArMSw1MiBAQAorIyEvYmluL2Jhc2gKKworIyBkYXRlCitlY2hvICJkYXRlPSJgZGF0ZWAKKworIyBvdXRwdXQgdmVyc2lvbgorZWNobyAiVGVzdGluZyB2ZXJpb24iIGBncmVwICJeVkVSU0lPTj0iIG1ha2VmaWxlIHwgc2VkICJzLy4qPS8vImAKKyNncmVwICJWRVJTSU9OPSIgbWFrZWZpbGUgfCBwZXJsIC1lICJAYSA9IHNwbGl0KCc9JywgPD4pOyBwcmludCBAYVsxXTsiYAorCisjIGdldCB1bmFtZSAKK2VjaG8gInVuYW1lPSJgdW5hbWUgLWFgCitlY2hvCisKKyMgc3RvY2sgYnVpbGQKK2Jhc2ggcnVuLnNoICJTVE9DSyIgIiAiICQxIHx8IGV4aXQgMQorCisjIFNNQUxMIGNvZGUKK2Jhc2ggcnVuLnNoICJTTUFMTCIgIi1ETFRDX1NNQUxMX0NPREUiICQxIHx8IGV4aXQgMQorCisjIE5PVEFCTEVTCitiYXNoIHJ1bi5zaCAiTk9UQUJMRVMiICItRExUQ19OT19UQUJMRVMiICQxIHx8IGV4aXQgMQorCisjIFNNQUxMK05PVEFCTEVTCitiYXNoIHJ1bi5zaCAiU01BTEwrTk9UQUJMRVMiICItRExUQ19TTUFMTF9DT0RFIC1ETFRDX05PX1RBQkxFUyIgJDEgfHwgZXhpdCAxCisKKyMgQ0xFQU5TVEFDSworYmFzaCBydW4uc2ggIkNMRUFOU1RBQ0siICItRExUQ19DTEVBTl9TVEFDSyIgJDEgfHwgZXhpdCAxCisKKyMgQ0xFQU5TVEFDSyArIFNNQUxMCitiYXNoIHJ1bi5zaCAiQ0xFQU5TVEFDSytTTUFMTCIgIi1ETFRDX1NNQUxMX0NPREUgLURMVENfQ0xFQU5fU1RBQ0siICQxIHx8IGV4aXQgMQorCisjIENMRUFOU1RBQ0sgKyBOT1RBQkxFUworYmFzaCBydW4uc2ggIkNMRUFOU1RBQ0srTk9UQUJMRVMiICItRExUQ19OT19UQUJMRVMgLURMVENfQ0xFQU5fU1RBQ0siICQxIHx8IGV4aXQgMQorCisjIENMRUFOU1RBQ0sgKyBOT1RBQkxFUyArIFNNQUxMCitiYXNoIHJ1bi5zaCAiQ0xFQU5TVEFDSytOT1RBQkxFUytTTUFMTCIgIi1ETFRDX05PX1RBQkxFUyAtRExUQ19DTEVBTl9TVEFDSyAtRExUQ19TTUFMTF9DT0RFIiAkMSB8fCBleGl0IDEKKworIyBOT19GQVNUCitiYXNoIHJ1bi5zaCAiTk9fRkFTVCIgIi1ETFRDX05PX0ZBU1QiICQxIHx8IGV4aXQgMQorCisjIE5PX0FTTQorYmFzaCBydW4uc2ggIk5PX0FTTSIgIi1ETFRDX05PX0FTTSIgJDEgfHwgZXhpdCAxCisKKyMgdGVzdCBidWlsZCB3aXRoIG5vIHRlc3RpbmcKK2Jhc2ggdGVzdGJ1aWxkLnNoICJOT1RFU1QiICItRExUQ19OT19URVNUIiAkMSB8fCBleGl0IDEKKworIyB0ZXN0IGJ1aWxkIHdpdGggbm8gZmlsZSByb3V0aW5lcworYmFzaCB0ZXN0YnVpbGQuc2ggIk5PRklMRSIgIi1ETFRDX05PX0ZJTEUiICQxIHx8IGV4aXQgMQorCisjICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3Rlc3RtZS5zaCx2ICQgICAKKyMgJFJldmlzaW9uOiAxLjE2ICQgICAKKyMgJERhdGU6IDIwMDUvMDUvMTEgMTg6NTk6NTMgJCAKZGlmZiAtLWdpdCBhL3Rlc3Rwcm9mL2Jhc2U2NF90ZXN0LmMgYi90ZXN0cHJvZi9iYXNlNjRfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjBhNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cHJvZi9iYXNlNjRfdGVzdC5jCkBAIC0wLDAgKzEsMjQgQEAKKyNpbmNsdWRlICA8dG9tY3J5cHRfdGVzdC5oPgorCitpbnQgYmFzZTY0X3Rlc3Qodm9pZCkKK3sKKyAgIHVuc2lnbmVkIGNoYXIgaW5bNjRdLCBvdXRbMjU2XSwgdG1wWzY0XTsKKyAgIHVuc2lnbmVkIGxvbmcgeCwgbDEsIGwyOworICAgCisgICBmb3IgICh4ID0gMDsgeCA8IDY0OyB4KyspIHsKKyAgICAgICB5YXJyb3dfcmVhZChpbiwgeCwgJnlhcnJvd19wcm5nKTsKKyAgICAgICBsMSA9IHNpemVvZihvdXQpOworICAgICAgIERPKGJhc2U2NF9lbmNvZGUoaW4sIHgsIG91dCwgJmwxKSk7CisgICAgICAgbDIgPSBzaXplb2YodG1wKTsKKyAgICAgICBETyhiYXNlNjRfZGVjb2RlKG91dCwgbDEsIHRtcCwgJmwyKSk7CisgICAgICAgaWYgKGwyICE9IHggfHwgbWVtY21wKHRtcCwgaW4sIHgpKSB7CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFzZTY0ICBmYWlsZWQgJWx1ICVsdSAlbHUiLCB4LCBsMSwgbDIpOworICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICB9CisgICB9CisgICByZXR1cm4gMDsKK30KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvdGVzdHByb2YvYmFzZTY0X3Rlc3QuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS41ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzIxIDEyOjUxOjI1ICQgKi8KZGlmZiAtLWdpdCBhL3Rlc3Rwcm9mL2NpcGhlcl9oYXNoX3Rlc3QuYyBiL3Rlc3Rwcm9mL2NpcGhlcl9oYXNoX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzIzMmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHByb2YvY2lwaGVyX2hhc2hfdGVzdC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIHRlc3QgdGhlIGNpcGhlcnMgYW5kIGhhc2hlcyB1c2luZyB0aGVpciBidWlsdC1pbiBzZWxmLXRlc3RzICovCisKKyNpbmNsdWRlIDx0b21jcnlwdF90ZXN0Lmg+CisKK2ludCBjaXBoZXJfaGFzaF90ZXN0KHZvaWQpCit7CisgICBpbnQgICAgICAgICAgIHg7CisgICB1bnNpZ25lZCBjaGFyIGJ1Zls0MDk2XTsKKyAgIHVuc2lnbmVkIGxvbmcgbjsKKyAgIHBybmdfc3RhdGUgICAgbnBybmc7CisgICAKKyAgIC8qIHRlc3QgY2lwaGVycyAqLworICAgZm9yICh4ID0gMDsgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSAhPSBOVUxMOyB4KyspIHsKKyAgICAgIERPKGNpcGhlcl9kZXNjcmlwdG9yW3hdLnRlc3QoKSk7CisgICB9CisgICAKKyAgIC8qIHRlc3QgaGFzaGVzICovCisgICBmb3IgKHggPSAwOyBoYXNoX2Rlc2NyaXB0b3JbeF0ubmFtZSAhPSBOVUxMOyB4KyspIHsKKyAgICAgIERPKGhhc2hfZGVzY3JpcHRvclt4XS50ZXN0KCkpOworICAgfQorIAorICAgLyogdGVzdCBwcm5ncyAodGVzdCwgaW1wb3J0L2V4cG9ydCAqLworICAgZm9yICh4ID0gMDsgcHJuZ19kZXNjcmlwdG9yW3hdLm5hbWUgIT0gTlVMTDsgeCsrKSB7CisgICAgICBETyhwcm5nX2Rlc2NyaXB0b3JbeF0udGVzdCgpKTsKKyAgICAgIERPKHBybmdfZGVzY3JpcHRvclt4XS5zdGFydCgmbnBybmcpKTsKKyAgICAgIERPKHBybmdfZGVzY3JpcHRvclt4XS5hZGRfZW50cm9weSgodW5zaWduZWQgY2hhciAqKSJoZWxsb3dvcmxkMTIiLCAxMiwgJm5wcm5nKSk7CisgICAgICBETyhwcm5nX2Rlc2NyaXB0b3JbeF0ucmVhZHkoJm5wcm5nKSk7CisgICAgICBuID0gc2l6ZW9mKGJ1Zik7CisgICAgICBETyhwcm5nX2Rlc2NyaXB0b3JbeF0ucGV4cG9ydChidWYsICZuLCAmbnBybmcpKTsKKyAgICAgIHBybmdfZGVzY3JpcHRvclt4XS5kb25lKCZucHJuZyk7CisgICAgICBETyhwcm5nX2Rlc2NyaXB0b3JbeF0ucGltcG9ydChidWYsIG4sICZucHJuZykpOworICAgICAgRE8ocHJuZ19kZXNjcmlwdG9yW3hdLnJlYWR5KCZucHJuZykpOworICAgICAgaWYgKHBybmdfZGVzY3JpcHRvclt4XS5yZWFkKGJ1ZiwgMTAwLCAmbnBybmcpICE9IDEwMCkgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciByZWFkaW5nIGZyb20gaW1wb3J0ZWQgUFJORyFcbiIpOworICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgfQorICAgICAgcHJuZ19kZXNjcmlwdG9yW3hdLmRvbmUoJm5wcm5nKTsKKyAgIH0KKyAgIAorICAgcmV0dXJuIDA7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3Rlc3Rwcm9mL2NpcGhlcl9oYXNoX3Rlc3QuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4zICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3Rlc3Rwcm9mL2Rlcl90ZXN0cy5jIGIvdGVzdHByb2YvZGVyX3Rlc3RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExOTM1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rwcm9mL2Rlcl90ZXN0cy5jCkBAIC0wLDAgKzEsMzcwIEBACisjaW5jbHVkZSA8dG9tY3J5cHRfdGVzdC5oPgorCisjaWZuZGVmIExUQ19ERVIKKworaW50IGRlcl90ZXN0cyh2b2lkKQoreworICAgZnByaW50ZihzdGRlcnIsICJOT1AiKTsKKyAgIHJldHVybiAwOworfQorCisjZWxzZQorCitzdGF0aWMgaW50IGRlcl9jaG9pY2VfdGVzdCh2b2lkKQoreworICAgbHRjX2FzbjFfbGlzdCB0eXBlc1s3XSwgaG9zdFsxXTsKKyAgIHVuc2lnbmVkIGNoYXIgYml0YnVmWzEwXSwgb2N0ZXRidWZbMTBdLCBpYTVidWZbMTBdLCBwcmludGJ1ZlsxMF0sIG91dGJ1ZlsyNTZdOworICAgdW5zaWduZWQgbG9uZyBpbnRlZ2VyLCBvaWRidWZbMTBdLCBvdXRsZW4sIGlubGVuLCB4LCB5OworICAgbXBfaW50ICAgICAgICBtcGludGVnZXI7CisgICBsdGNfdXRjdGltZSAgIHV0Y3RpbWUgPSB7IDkxLCA1LCA2LCAxNiwgNDUsIDQwLCAxLCA3LCAwIH07CisKKyAgIC8qIHNldHVwIHZhcmlhYmxlcyAqLworICAgZm9yICh4ID0gMDsgeCA8IHNpemVvZihiaXRidWYpOyB4KyspICAgeyBiaXRidWZbeF0gICA9IHggJiAxOyB9CisgICBmb3IgKHggPSAwOyB4IDwgc2l6ZW9mKG9jdGV0YnVmKTsgeCsrKSB7IG9jdGV0YnVmW3hdID0geDsgICAgIH0KKyAgIGZvciAoeCA9IDA7IHggPCBzaXplb2YoaWE1YnVmKTsgeCsrKSAgIHsgaWE1YnVmW3hdICAgPSAnYSc7ICAgfQorICAgZm9yICh4ID0gMDsgeCA8IHNpemVvZihwcmludGJ1Zik7IHgrKykgeyBwcmludGJ1Zlt4XSA9ICdhJzsgICB9CisgICBpbnRlZ2VyID0gMTsKKyAgIGZvciAoeCA9IDA7IHggPCBzaXplb2Yob2lkYnVmKS9zaXplb2Yob2lkYnVmWzBdKTsgeCsrKSAgIHsgb2lkYnVmW3hdID0geCArIDE7ICAgfQorICAgRE8obXBpX3RvX2x0Y19lcnJvcihtcF9pbml0KCZtcGludGVnZXIpKSk7CisKKyAgIGZvciAoeCA9IDA7IHggPCAxNDsgeCsrKSB7CisgICAgICAgLyogc2V0dXAgbGlzdCAqLworICAgICAgIExUQ19TRVRfQVNOMSh0eXBlcywgMCwgTFRDX0FTTjFfUFJJTlRBQkxFX1NUUklORywgcHJpbnRidWYsIHNpemVvZihwcmludGJ1ZikpOworICAgICAgIExUQ19TRVRfQVNOMSh0eXBlcywgMSwgTFRDX0FTTjFfQklUX1NUUklORywgYml0YnVmLCBzaXplb2YoYml0YnVmKSk7CisgICAgICAgTFRDX1NFVF9BU04xKHR5cGVzLCAyLCBMVENfQVNOMV9PQ1RFVF9TVFJJTkcsIG9jdGV0YnVmLCBzaXplb2Yob2N0ZXRidWYpKTsKKyAgICAgICBMVENfU0VUX0FTTjEodHlwZXMsIDMsIExUQ19BU04xX0lBNV9TVFJJTkcsIGlhNWJ1Ziwgc2l6ZW9mKGlhNWJ1ZikpOworICAgICAgIGlmICh4ID4gNykgeworICAgICAgICAgIExUQ19TRVRfQVNOMSh0eXBlcywgNCwgTFRDX0FTTjFfU0hPUlRfSU5URUdFUiwgJmludGVnZXIsIDEpOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTFRDX1NFVF9BU04xKHR5cGVzLCA0LCBMVENfQVNOMV9JTlRFR0VSLCAmbXBpbnRlZ2VyLCAxKTsKKyAgICAgICB9CisgICAgICAgTFRDX1NFVF9BU04xKHR5cGVzLCA1LCBMVENfQVNOMV9PQkpFQ1RfSURFTlRJRklFUiwgb2lkYnVmLCBzaXplb2Yob2lkYnVmKS9zaXplb2Yob2lkYnVmWzBdKSk7CisgICAgICAgTFRDX1NFVF9BU04xKHR5cGVzLCA2LCBMVENfQVNOMV9VVENUSU1FLCAmdXRjdGltZSwgMSk7CisKKyAgICAgICBMVENfU0VUX0FTTjEoaG9zdCwgMCwgTFRDX0FTTjFfQ0hPSUNFLCB0eXBlcywgNyk7CisKKyAgICAgICAKKyAgICAgICAvKiBlbmNvZGUgKi8KKyAgICAgICBvdXRsZW4gPSBzaXplb2Yob3V0YnVmKTsKKyAgICAgICBETyhkZXJfZW5jb2RlX3NlcXVlbmNlKCZ0eXBlc1t4PjY/eC03OnhdLCAxLCBvdXRidWYsICZvdXRsZW4pKTsKKworICAgICAgIC8qIGRlY29kZSBpdCAqLworICAgICAgIGlubGVuID0gb3V0bGVuOworICAgICAgIERPKGRlcl9kZWNvZGVfc2VxdWVuY2Uob3V0YnVmLCBpbmxlbiwgJmhvc3QsIDEpKTsKKworICAgICAgIGZvciAoeSA9IDA7IHkgPCA3OyB5KyspIHsKKyAgICAgICAgICAgaWYgKHR5cGVzW3ldLnVzZWQgJiYgeSAhPSAoeD42P3gtNzp4KSkgeworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDSE9JQ0UsIGZsYWcgJWx1IGluIHRyaWFsICVsdSB3YXMgaW5jb3JyZWN0bHkgc2V0IHRvIG9uZVxuIiwgeSwgeCk7CisgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAoIXR5cGVzW3ldLnVzZWQgJiYgeSA9PSAoeD42P3gtNzp4KSkgeworICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDSE9JQ0UsIGZsYWcgJWx1IGluIHRyaWFsICVsdSB3YXMgaW5jb3JyZWN0bHkgc2V0IHRvIHplcm9cbiIsIHksIHgpOworICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgIH0KKyAgICAgIH0KKyAgfQorICBtcF9jbGVhcigmbXBpbnRlZ2VyKTsKKyAgcmV0dXJuIDA7Cit9CisgICAKKworaW50IGRlcl90ZXN0cyh2b2lkKQoreworICAgdW5zaWduZWQgbG9uZyB4LCB5LCB6LCB6eiwgb2lkWzJdWzMyXTsKKyAgIHVuc2lnbmVkIGNoYXIgYnVmWzNdWzIwNDhdOworICAgbXBfaW50IGEsIGIsIGMsIGQsIGUsIGYsIGc7CisKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJzYV9vaWRfZGVyW10gPSB7IDB4MDYsIDB4MDYsIDB4MmEsIDB4ODYsIDB4NDgsIDB4ODYsIDB4ZjcsIDB4MGQgfTsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHJzYV9vaWRbXSAgICAgPSB7IDEsIDIsIDg0MCwgMTEzNTQ5IH07CisKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJzYV9pYTVbXSAgICAgPSAidGVzdDFAcnNhLmNvbSI7CisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciByc2FfaWE1X2RlcltdID0geyAweDE2LCAweDBkLCAweDc0LCAweDY1LCAweDczLCAweDc0LCAweDMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MCwgMHg3MiwgMHg3MywgMHg2MSwgMHgyZSwgMHg2MywgMHg2ZiwgMHg2ZCB9OworCisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciByc2FfcHJpbnRhYmxlW10gPSAiVGVzdCBVc2VyIDEiOworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcnNhX3ByaW50YWJsZV9kZXJbXSA9IHsgMHgxMywgMHgwYiwgMHg1NCwgMHg2NSwgMHg3MywgMHg3NCwgMHgyMCwgMHg1NSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDczLCAweDY1LCAweDcyLCAweDIwLCAweDMxIH07CisKKyAgIHN0YXRpYyBjb25zdCBsdGNfdXRjdGltZSAgIHJzYV90aW1lMSA9IHsgOTEsIDUsIDYsIDE2LCA0NSwgNDAsIDEsIDcsIDAgfTsKKyAgIHN0YXRpYyBjb25zdCBsdGNfdXRjdGltZSAgIHJzYV90aW1lMiA9IHsgOTEsIDUsIDYsIDIzLCA0NSwgNDAsIDAsIDAsIDAgfTsKKyAgIGx0Y191dGN0aW1lICAgICAgICAgICAgICAgIHRtcF90aW1lOworCisgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciByc2FfdGltZTFfZGVyW10gPSB7IDB4MTcsIDB4MTEsIDB4MzksIDB4MzEsIDB4MzAsIDB4MzUsIDB4MzAsIDB4MzYsIDB4MzEsIDB4MzYsIDB4MzQsIDB4MzUsIDB4MzQsIDB4MzAsIDB4MkQsIDB4MzAsIDB4MzcsIDB4MzAsIDB4MzAgfTsKKyAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHJzYV90aW1lMl9kZXJbXSA9IHsgMHgxNywgMHgwZCwgMHgzOSwgMHgzMSwgMHgzMCwgMHgzNSwgMHgzMCwgMHgzNiwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNCwgMHgzMCwgMHg1YSB9OworCisgICBETyhtcGlfdG9fbHRjX2Vycm9yKG1wX2luaXRfbXVsdGkoJmEsICZiLCAmYywgJmQsICZlLCAmZiwgJmcsIE5VTEwpKSk7CisgICBmb3IgKHp6ID0gMDsgenogPCAxNjsgenorKykgeworICAgICAgZm9yICh6ID0gMDsgeiA8IDEwMjQ7IHorKykgeworICAgICAgICAgaWYgKHlhcnJvd19yZWFkKGJ1ZlswXSwgeiwgJnlhcnJvd19wcm5nKSAhPSB6KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZWFkICVsdSBieXRlcyBmcm9tIHlhcnJvd1xuIiwgeik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgICAgIERPKG1waV90b19sdGNfZXJyb3IobXBfcmVhZF91bnNpZ25lZF9iaW4oJmEsIGJ1ZlswXSwgeikpKTsKKyAgICAgICAgIGlmIChtcF9pc3plcm8oJmEpID09IE1QX05PKSB7IGEuc2lnbiA9IGJ1ZlswXVswXSAmIDEgPyBNUF9aUE9TIDogTVBfTkVHOyB9CisgICAgICAgICB4ID0gc2l6ZW9mKGJ1ZlswXSk7CisgICAgICAgICBETyhkZXJfZW5jb2RlX2ludGVnZXIoJmEsIGJ1ZlswXSwgJngpKTsKKyAgICAgICAgIERPKGRlcl9sZW5ndGhfaW50ZWdlcigmYSwgJnkpKTsKKyAgICAgICAgIGlmICh5ICE9IHgpIHsgZnByaW50ZihzdGRlcnIsICJERVIgSU5URUdFUiBzaXplIG1pc21hdGNoXG4iKTsgcmV0dXJuIDE7IH0KKyAgICAgICAgIG1wX3plcm8oJmIpOworICAgICAgICAgRE8oZGVyX2RlY29kZV9pbnRlZ2VyKGJ1ZlswXSwgeSwgJmIpKTsKKyAgICAgICAgIGlmICh5ICE9IHggfHwgbXBfY21wKCZhLCAmYikgIT0gTVBfRVEpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWx1OiAlbHUgdnMgJWx1XG4iLCB6LCB4LCB5KTsKKyNpZmRlZiBCTl9NUF9UT1JBRElYX0MKKyAgICAgICAgICAgIG1wX3RvZGVjaW1hbCgmYSwgYnVmWzBdKTsKKyAgICAgICAgICAgIG1wX3RvZGVjaW1hbCgmYiwgYnVmWzFdKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYSA9PSAlc1xuYiA9PSAlc1xuIiwgYnVmWzBdLCBidWZbMV0pOworI2VuZGlmCisgICAgICAgICAgICBtcF9jbGVhcl9tdWx0aSgmYSwgJmIsICZjLCAmZCwgJmUsICZmLCAmZywgTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIH0KKworLyogdGVzdCBzaG9ydCBpbnRlZ2VyICovCisgICBmb3IgKHp6ID0gMDsgenogPCAyNTY7IHp6KyspIHsKKyAgICAgIGZvciAoeiA9IDE7IHogPCA0OyB6KyspIHsKKyAgICAgICAgIGlmICh5YXJyb3dfcmVhZChidWZbMF0sIHosICZ5YXJyb3dfcHJuZykgIT0geikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcmVhZCAlbHUgYnl0ZXMgZnJvbSB5YXJyb3dcbiIsIHopOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisgICAgICAgICAvKiBlbmNvZGUgd2l0aCBub3JtYWwgKi8KKyAgICAgICAgIERPKG1waV90b19sdGNfZXJyb3IobXBfcmVhZF91bnNpZ25lZF9iaW4oJmEsIGJ1ZlswXSwgeikpKTsKKworICAgICAgICAgeCA9IHNpemVvZihidWZbMF0pOworICAgICAgICAgRE8oZGVyX2VuY29kZV9pbnRlZ2VyKCZhLCBidWZbMF0sICZ4KSk7CisKKyAgICAgICAgIC8qIGVuY29kZSB3aXRoIHNob3J0ICovCisgICAgICAgICB5ID0gc2l6ZW9mKGJ1ZlsxXSk7CisgICAgICAgICBETyhkZXJfZW5jb2RlX3Nob3J0X2ludGVnZXIobXBfZ2V0X2ludCgmYSksIGJ1ZlsxXSwgJnkpKTsKKyAgICAgICAgIGlmICh4ICE9IHkgfHwgbWVtY21wKGJ1ZlswXSwgYnVmWzFdLCB4KSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJERVIgSU5URUdFUiBzaG9ydCBlbmNvZGluZyBmYWlsZWQsICVsdSwgJWx1XG4iLCB4LCB5KTsKKyAgICAgICAgICAgIGZvciAoeiA9IDA7IHogPCB4OyB6KyspIGZwcmludGYoc3RkZXJyLCAiJTAyeCAiLCBidWZbMF1bel0pOyBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgeTsgeisrKSBmcHJpbnRmKHN0ZGVyciwgIiUwMnggIiwgYnVmWzFdW3pdKTsgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgICAgICAgbXBfY2xlYXJfbXVsdGkoJmEsICZiLCAmYywgJmQsICZlLCAmZiwgJmcsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisKKyAgICAgICAgIC8qIGRlY29kZSBpdCAqLworICAgICAgICAgeCA9IDA7CisgICAgICAgICBETyhkZXJfZGVjb2RlX3Nob3J0X2ludGVnZXIoYnVmWzFdLCB5LCAmeCkpOworICAgICAgICAgaWYgKHggIT0gbXBfZ2V0X2ludCgmYSkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiREVSIElOVEVHRVIgc2hvcnQgZGVjb2RpbmcgZmFpbGVkLCAlbHUsICVsdVxuIiwgeCwgbXBfZ2V0X2ludCgmYSkpOworICAgICAgICAgICAgbXBfY2xlYXJfbXVsdGkoJmEsICZiLCAmYywgJmQsICZlLCAmZiwgJmcsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICB9CisgICAgICB9CisgICB9IAorICAgbXBfY2xlYXJfbXVsdGkoJmEsICZiLCAmYywgJmQsICZlLCAmZiwgJmcsIE5VTEwpOworCisgICAKKy8qIFRlc3QgYml0IHN0cmluZyAqLworICAgZm9yICh6eiA9IDE7IHp6IDwgMTUzNjsgenorKykgeworICAgICAgIHlhcnJvd19yZWFkKGJ1ZlswXSwgenosICZ5YXJyb3dfcHJuZyk7CisgICAgICAgZm9yICh6ID0gMDsgeiA8IHp6OyB6KyspIHsKKyAgICAgICAgICAgYnVmWzBdW3pdICY9IDB4MDE7CisgICAgICAgfQorICAgICAgIHggPSBzaXplb2YoYnVmWzFdKTsKKyAgICAgICBETyhkZXJfZW5jb2RlX2JpdF9zdHJpbmcoYnVmWzBdLCB6eiwgYnVmWzFdLCAmeCkpOworICAgICAgIERPKGRlcl9sZW5ndGhfYml0X3N0cmluZyh6eiwgJnkpKTsKKyAgICAgICBpZiAoeSAhPSB4KSB7IAorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5ERVIgQklUIFNUUklORyBsZW5ndGggb2YgZW5jb2RlZCBub3QgbWF0Y2ggZXhwZWN0ZWQgOiAlbHUsICVsdSwgJWx1XG4iLCB6LCB4LCB5KTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICB9CisKKyAgICAgICB5ID0gc2l6ZW9mKGJ1ZlsyXSk7CisgICAgICAgRE8oZGVyX2RlY29kZV9iaXRfc3RyaW5nKGJ1ZlsxXSwgeCwgYnVmWzJdLCAmeSkpOworICAgICAgIGlmICh5ICE9IHp6IHx8IG1lbWNtcChidWZbMF0sIGJ1ZlsyXSwgenopKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlbHUsICVsdSwgJWRcbiIsIHksIHp6LCBtZW1jbXAoYnVmWzBdLCBidWZbMl0sIHp6KSk7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgfQorICAgfQorCisvKiBUZXN0IG9jdGV0IHN0cmluZyAqLworICAgZm9yICh6eiA9IDE7IHp6IDwgMTUzNjsgenorKykgeworICAgICAgIHlhcnJvd19yZWFkKGJ1ZlswXSwgenosICZ5YXJyb3dfcHJuZyk7CisgICAgICAgeCA9IHNpemVvZihidWZbMV0pOworICAgICAgIERPKGRlcl9lbmNvZGVfb2N0ZXRfc3RyaW5nKGJ1ZlswXSwgenosIGJ1ZlsxXSwgJngpKTsKKyAgICAgICBETyhkZXJfbGVuZ3RoX29jdGV0X3N0cmluZyh6eiwgJnkpKTsKKyAgICAgICBpZiAoeSAhPSB4KSB7IAorICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5ERVIgT0NURVQgU1RSSU5HIGxlbmd0aCBvZiBlbmNvZGVkIG5vdCBtYXRjaCBleHBlY3RlZCA6ICVsdSwgJWx1LCAlbHVcbiIsIHosIHgsIHkpOworICAgICAgICAgIHJldHVybiAxOworICAgICAgIH0KKyAgICAgICB5ID0gc2l6ZW9mKGJ1ZlsyXSk7CisgICAgICAgRE8oZGVyX2RlY29kZV9vY3RldF9zdHJpbmcoYnVmWzFdLCB4LCBidWZbMl0sICZ5KSk7CisgICAgICAgaWYgKHkgIT0genogfHwgbWVtY21wKGJ1ZlswXSwgYnVmWzJdLCB6eikpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVsdSwgJWx1LCAlZFxuIiwgeSwgenosIG1lbWNtcChidWZbMF0sIGJ1ZlsyXSwgenopKTsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICB9CisgICB9CisKKy8qIHRlc3QgT0lEICovCisgICB4ID0gc2l6ZW9mKGJ1ZlswXSk7CisgICBETyhkZXJfZW5jb2RlX29iamVjdF9pZGVudGlmaWVyKHJzYV9vaWQsIHNpemVvZihyc2Ffb2lkKS9zaXplb2YocnNhX29pZFswXSksIGJ1ZlswXSwgJngpKTsKKyAgIGlmICh4ICE9IHNpemVvZihyc2Ffb2lkX2RlcikgfHwgbWVtY21wKHJzYV9vaWRfZGVyLCBidWZbMF0sIHgpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInJzYV9vaWRfZGVyIGVuY29kZSBmYWlsZWQgdG8gbWF0Y2gsICVsdSwgIiwgeCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgeDsgeSsrKSBmcHJpbnRmKHN0ZGVyciwgIiUwMnggIiwgYnVmWzBdW3ldKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgfQorCisgICB5ID0gc2l6ZW9mKG9pZFswXSkvc2l6ZW9mKG9pZFswXVswXSk7CisgICBETyhkZXJfZGVjb2RlX29iamVjdF9pZGVudGlmaWVyKGJ1ZlswXSwgeCwgb2lkWzBdLCAmeSkpOworICAgaWYgKHkgIT0gc2l6ZW9mKHJzYV9vaWQpL3NpemVvZihyc2Ffb2lkWzBdKSB8fCBtZW1jbXAocnNhX29pZCwgb2lkWzBdLCBzaXplb2YocnNhX29pZCkpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInJzYV9vaWRfZGVyIGRlY29kZSBmYWlsZWQgdG8gbWF0Y2gsICVsdSwgIiwgeSk7CisgICAgICBmb3IgKHogPSAwOyB6IDwgeTsgeisrKSBmcHJpbnRmKHN0ZGVyciwgIiVsdSAiLCBvaWRbMF1bel0pOworICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIC8qIGRvIHJhbmRvbSBzdHJpbmdzICovCisgICBmb3IgKHp6ID0gMDsgenogPCA1MDAwOyB6eisrKSB7CisgICAgICAgLyogcGljayBhIHJhbmRvbSBudW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICB5YXJyb3dfcmVhZChidWZbMF0sIDQsICZ5YXJyb3dfcHJuZyk7CisgICAgICAgTE9BRDMyTCh6LCBidWZbMF0pOworICAgICAgIHogPSAyICsgKHogJSAoKHNpemVvZihvaWRbMF0pL3NpemVvZihvaWRbMF1bMF0pKSAtIDIpKTsKKyAgICAgICAKKyAgICAgICAvKiBmaWxsIHRoZW0gaW4gKi8KKyAgICAgICBvaWRbMF1bMF0gPSBidWZbMF1bMF0gJSAzOworICAgICAgIG9pZFswXVsxXSA9IGJ1ZlswXVsxXSAlIDQwOworCisgICAgICAgZm9yICh5ID0gMjsgeSA8IHo7IHkrKykgeworICAgICAgICAgIHlhcnJvd19yZWFkKGJ1ZlswXSwgNCwgJnlhcnJvd19wcm5nKTsKKyAgICAgICAgICBMT0FEMzJMKG9pZFswXVt5XSwgYnVmWzBdKTsKKyAgICAgICB9CisKKyAgICAgICAvKiBlbmNvZGUgaXQgKi8KKyAgICAgICB4ID0gc2l6ZW9mKGJ1ZlswXSk7CisgICAgICAgRE8oZGVyX2VuY29kZV9vYmplY3RfaWRlbnRpZmllcihvaWRbMF0sIHosIGJ1ZlswXSwgJngpKTsKKyAgICAgICBETyhkZXJfbGVuZ3RoX29iamVjdF9pZGVudGlmaWVyKG9pZFswXSwgeiwgJnkpKTsKKyAgICAgICBpZiAoeCAhPSB5KSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJSYW5kb20gT0lEICVsdSB0ZXN0IGZhaWxlZCwgbGVuZ3RoIG1pc21hdGNoOiAlbHUsICVsdVxuIiwgeiwgeCwgeSk7CisgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHo7IHgrKykgZnByaW50ZihzdGRlcnIsICIlbHVcbiIsIG9pZFswXVt4XSk7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgfQorICAgICAgIAorICAgICAgIC8qIGRlY29kZSBpdCAqLworICAgICAgIHkgPSBzaXplb2Yob2lkWzBdKS9zaXplb2Yob2lkWzBdWzBdKTsKKyAgICAgICBETyhkZXJfZGVjb2RlX29iamVjdF9pZGVudGlmaWVyKGJ1ZlswXSwgeCwgb2lkWzFdLCAmeSkpOworICAgICAgIGlmICh5ICE9IHopIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJhbmRvbSBPSUQgJWx1IHRlc3QgZmFpbGVkLCBkZWNvZGUgbGVuZ3RoIG1pc21hdGNoOiAlbHUsICVsdVxuIiwgeiwgeCwgeSk7CisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgfQorICAgICAgIGlmIChtZW1jbXAob2lkWzBdLCBvaWRbMV0sIHNpemVvZihvaWRbMF1bMF0pICogeikpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJhbmRvbSBPSUQgJWx1IHRlc3QgZmFpbGVkLCBkZWNvZGVkIHZhbHVlcyB3cm9uZ1xuIiwgeik7CisgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHo7IHgrKykgZnByaW50ZihzdGRlcnIsICIlbHVcbiIsIG9pZFswXVt4XSk7IGZwcmludGYoc3RkZXJyLCAiXG5cbiBHb3QgXG5cbiIpOworICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB6OyB4KyspIGZwcmludGYoc3RkZXJyLCAiJWx1XG4iLCBvaWRbMV1beF0pOworICAgICAgICAgIHJldHVybiAxOworICAgICAgIH0KKyAgIH0KKworLyogSUE1IHN0cmluZyAqLworICAgeCA9IHNpemVvZihidWZbMF0pOworICAgRE8oZGVyX2VuY29kZV9pYTVfc3RyaW5nKHJzYV9pYTUsIHN0cmxlbihyc2FfaWE1KSwgYnVmWzBdLCAmeCkpOworICAgaWYgKHggIT0gc2l6ZW9mKHJzYV9pYTVfZGVyKSB8fCBtZW1jbXAoYnVmWzBdLCByc2FfaWE1X2RlciwgeCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiSUE1IGVuY29kZSBmYWlsZWQ6ICVsdSwgJWx1XG4iLCB4LCAodW5zaWduZWQgbG9uZylzaXplb2YocnNhX2lhNV9kZXIpKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgRE8oZGVyX2xlbmd0aF9pYTVfc3RyaW5nKHJzYV9pYTUsIHN0cmxlbihyc2FfaWE1KSwgJnkpKTsKKyAgIGlmICh5ICE9IHgpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiSUE1IGxlbmd0aCBmYWlsZWQgdG8gbWF0Y2g6ICVsdSwgJWx1XG4iLCB4LCB5KTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgeSA9IHNpemVvZihidWZbMV0pOworICAgRE8oZGVyX2RlY29kZV9pYTVfc3RyaW5nKGJ1ZlswXSwgeCwgYnVmWzFdLCAmeSkpOworICAgaWYgKHkgIT0gc3RybGVuKHJzYV9pYTUpIHx8IG1lbWNtcChidWZbMV0sIHJzYV9pYTUsIHN0cmxlbihyc2FfaWE1KSkpIHsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRFUiBJQTUgZmFpbGVkIHRlc3QgdmVjdG9yXG4iKTsKKyAgICAgICByZXR1cm4gMTsKKyAgIH0KKworLyogUHJpbnRhYmxlIHN0cmluZyAqLworICAgeCA9IHNpemVvZihidWZbMF0pOworICAgRE8oZGVyX2VuY29kZV9wcmludGFibGVfc3RyaW5nKHJzYV9wcmludGFibGUsIHN0cmxlbihyc2FfcHJpbnRhYmxlKSwgYnVmWzBdLCAmeCkpOworICAgaWYgKHggIT0gc2l6ZW9mKHJzYV9wcmludGFibGVfZGVyKSB8fCBtZW1jbXAoYnVmWzBdLCByc2FfcHJpbnRhYmxlX2RlciwgeCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUFJJTlRBQkxFIGVuY29kZSBmYWlsZWQ6ICVsdSwgJWx1XG4iLCB4LCAodW5zaWduZWQgbG9uZylzaXplb2YocnNhX3ByaW50YWJsZV9kZXIpKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgRE8oZGVyX2xlbmd0aF9wcmludGFibGVfc3RyaW5nKHJzYV9wcmludGFibGUsIHN0cmxlbihyc2FfcHJpbnRhYmxlKSwgJnkpKTsKKyAgIGlmICh5ICE9IHgpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAicHJpbnRhYmxlIGxlbmd0aCBmYWlsZWQgdG8gbWF0Y2g6ICVsdSwgJWx1XG4iLCB4LCB5KTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgeSA9IHNpemVvZihidWZbMV0pOworICAgRE8oZGVyX2RlY29kZV9wcmludGFibGVfc3RyaW5nKGJ1ZlswXSwgeCwgYnVmWzFdLCAmeSkpOworICAgaWYgKHkgIT0gc3RybGVuKHJzYV9wcmludGFibGUpIHx8IG1lbWNtcChidWZbMV0sIHJzYV9wcmludGFibGUsIHN0cmxlbihyc2FfcHJpbnRhYmxlKSkpIHsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRFUiBwcmludGFibGUgZmFpbGVkIHRlc3QgdmVjdG9yXG4iKTsKKyAgICAgICByZXR1cm4gMTsKKyAgIH0KKworLyogVGVzdCBVVEMgdGltZSAqLworICAgeCA9IHNpemVvZihidWZbMF0pOworICAgRE8oZGVyX2VuY29kZV91dGN0aW1lKCZyc2FfdGltZTEsIGJ1ZlswXSwgJngpKTsKKyAgIGlmICh4ICE9IHNpemVvZihyc2FfdGltZTFfZGVyKSB8fCBtZW1jbXAoYnVmWzBdLCByc2FfdGltZTFfZGVyLCB4KSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJVVENUSU1FIGVuY29kZSBvZiByc2FfdGltZTEgZmFpbGVkOiAlbHUsICVsdVxuIiwgeCwgKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKHJzYV90aW1lMV9kZXIpKTsKK2ZwcmludGYoc3RkZXJyLCAiXG5cbiIpOworZm9yICh5ID0gMDsgeSA8IHg7IHkrKykgZnByaW50ZihzdGRlcnIsICIlMDJ4ICIsIGJ1ZlswXVt5XSk7IHByaW50ZigiXG4iKTsKKworICAgICAgcmV0dXJuIDE7CisgICB9CisgICBETyhkZXJfbGVuZ3RoX3V0Y3RpbWUoJnJzYV90aW1lMSwgJnkpKTsKKyAgIGlmICh5ICE9IHgpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVVRDVElNRSBsZW5ndGggZmFpbGVkIHRvIG1hdGNoIGZvciByc2FfdGltZTE6ICVsdSwgJWx1XG4iLCB4LCB5KTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgRE8oZGVyX2RlY29kZV91dGN0aW1lKGJ1ZlswXSwgJnksICZ0bXBfdGltZSkpOworICAgaWYgKHkgIT0geCB8fCBtZW1jbXAoJnJzYV90aW1lMSwgJnRtcF90aW1lLCBzaXplb2YobHRjX3V0Y3RpbWUpKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJVVENUSU1FIGRlY29kZSBmYWlsZWQgZm9yIHJzYV90aW1lMTogJWx1ICVsdVxuIiwgeCwgeSk7CitmcHJpbnRmKHN0ZGVyciwgIlxuXG4ldSAldSAldSAldSAldSAldSAldSAldSAldVxuXG4iLCAKK3RtcF90aW1lLllZLAordG1wX3RpbWUuTU0sCit0bXBfdGltZS5ERCwKK3RtcF90aW1lLmhoLAordG1wX3RpbWUubW0sCit0bXBfdGltZS5zcywKK3RtcF90aW1lLm9mZl9kaXIsCit0bXBfdGltZS5vZmZfbW0sCit0bXBfdGltZS5vZmZfaGgpOworICAgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIHggPSBzaXplb2YoYnVmWzBdKTsKKyAgIERPKGRlcl9lbmNvZGVfdXRjdGltZSgmcnNhX3RpbWUyLCBidWZbMF0sICZ4KSk7CisgICBpZiAoeCAhPSBzaXplb2YocnNhX3RpbWUyX2RlcikgfHwgbWVtY21wKGJ1ZlswXSwgcnNhX3RpbWUyX2RlciwgeCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVVRDVElNRSBlbmNvZGUgb2YgcnNhX3RpbWUyIGZhaWxlZDogJWx1LCAlbHVcbiIsIHgsICh1bnNpZ25lZCBsb25nKXNpemVvZihyc2FfdGltZTFfZGVyKSk7CitmcHJpbnRmKHN0ZGVyciwgIlxuXG4iKTsKK2ZvciAoeSA9IDA7IHkgPCB4OyB5KyspIGZwcmludGYoc3RkZXJyLCAiJTAyeCAiLCBidWZbMF1beV0pOyBwcmludGYoIlxuIik7CisKKyAgICAgIHJldHVybiAxOworICAgfQorICAgRE8oZGVyX2xlbmd0aF91dGN0aW1lKCZyc2FfdGltZTIsICZ5KSk7CisgICBpZiAoeSAhPSB4KSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVUQ1RJTUUgbGVuZ3RoIGZhaWxlZCB0byBtYXRjaCBmb3IgcnNhX3RpbWUyOiAlbHUsICVsdVxuIiwgeCwgeSk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIERPKGRlcl9kZWNvZGVfdXRjdGltZShidWZbMF0sICZ5LCAmdG1wX3RpbWUpKTsKKyAgIGlmICh5ICE9IHggfHwgbWVtY21wKCZyc2FfdGltZTIsICZ0bXBfdGltZSwgc2l6ZW9mKGx0Y191dGN0aW1lKSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVVRDVElNRSBkZWNvZGUgZmFpbGVkIGZvciByc2FfdGltZTI6ICVsdSAlbHVcbiIsIHgsIHkpOworZnByaW50ZihzdGRlcnIsICJcblxuJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXVcblxuIiwgCit0bXBfdGltZS5ZWSwKK3RtcF90aW1lLk1NLAordG1wX3RpbWUuREQsCit0bXBfdGltZS5oaCwKK3RtcF90aW1lLm1tLAordG1wX3RpbWUuc3MsCit0bXBfdGltZS5vZmZfZGlyLAordG1wX3RpbWUub2ZmX21tLAordG1wX3RpbWUub2ZmX2hoKTsKKworCisgICAgICByZXR1cm4gMTsKKyAgIH0KKworCisKKyAgIHJldHVybiBkZXJfY2hvaWNlX3Rlc3QoKTsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3Rlc3Rwcm9mL2Rlcl90ZXN0cy5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjI1ICQgKi8KKy8qICREYXRlOiAyMDA1LzA2LzIwIDIwOjM3OjQ1ICQgKi8KZGlmZiAtLWdpdCBhL2RlbW9zL3Rlc3QvZGhfdGVzdHMuYyBiL3Rlc3Rwcm9mL2RoX3Rlc3RzLmMKc2ltaWxhcml0eSBpbmRleCA2MSUKcmVuYW1lIGZyb20gZGVtb3MvdGVzdC9kaF90ZXN0cy5jCnJlbmFtZSB0byB0ZXN0cHJvZi9kaF90ZXN0cy5jCmluZGV4IGMyYjZmMGEuLjM4NTJlNDcgMTAwNjQ0Ci0tLSBhL2RlbW9zL3Rlc3QvZGhfdGVzdHMuYworKysgYi90ZXN0cHJvZi9kaF90ZXN0cy5jCkBAIC0xLDQgKzEsNiBAQAotI2luY2x1ZGUgInRlc3QuaCIKKyNpbmNsdWRlIDx0b21jcnlwdF90ZXN0Lmg+CisKKyNpZmRlZiBNREgKIAogaW50IGRoX3Rlc3RzICh2b2lkKQogewpAQCAtMTAsOCArMTIsOCBAQAogICBETyhkaF90ZXN0KCkpOwogCiAgIC8qIG1ha2UgdXAgdHdvIGtleXMgKi8KLSAgRE8oZGhfbWFrZV9rZXkgKCZ0ZXN0X3lhcnJvdywgZmluZF9wcm5nICgieWFycm93IiksIDk2LCAmdXNlcmEpKTsKLSAgRE8oZGhfbWFrZV9rZXkgKCZ0ZXN0X3lhcnJvdywgZmluZF9wcm5nICgieWFycm93IiksIDk2LCAmdXNlcmIpKTsKKyAgRE8oZGhfbWFrZV9rZXkgKCZ5YXJyb3dfcHJuZywgZmluZF9wcm5nICgieWFycm93IiksIDUxMiwgJnVzZXJhKSk7CisgIERPKGRoX21ha2Vfa2V5ICgmeWFycm93X3BybmcsIGZpbmRfcHJuZyAoInlhcnJvdyIpLCA1MTIsICZ1c2VyYikpOwogCiAgIC8qIG1ha2UgdGhlIHNoYXJlZCBzZWNyZXQgKi8KICAgeCA9IDQwOTY7CkBAIC0yMCwxMSArMjIsMTEgQEAKICAgeSA9IDQwOTY7CiAgIERPKGRoX3NoYXJlZF9zZWNyZXQgKCZ1c2VyYiwgJnVzZXJhLCBidWZbMV0sICZ5KSk7CiAgIGlmICh5ICE9IHgpIHsKLSAgICBwcmludGYgKCJESCBTaGFyZWQga2V5cyBhcmUgbm90IHNhbWUgc2l6ZS5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiREggU2hhcmVkIGtleXMgYXJlIG5vdCBzYW1lIHNpemUuXG4iKTsKICAgICByZXR1cm4gMTsKICAgfQogICBpZiAobWVtY21wIChidWZbMF0sIGJ1ZlsxXSwgeCkpIHsKLSAgICBwcmludGYgKCJESCBTaGFyZWQga2V5cyBub3Qgc2FtZSBjb250ZW50cy5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiREggU2hhcmVkIGtleXMgbm90IHNhbWUgY29udGVudHMuXG4iKTsKICAgICByZXR1cm4gMTsKICAgfQogCkBAIC0zOSwzMyArNDEsMzMgQEAKICAgRE8oZGhfc2hhcmVkX3NlY3JldCAoJnVzZXJhLCAmdXNlcmIsIGJ1ZlsyXSwgJnopKTsKIAogICBpZiAoeiAhPSB4KSB7Ci0gICAgcHJpbnRmICgiZmFpbGVkLiAgU2l6ZSBkb24ndCBtYXRjaD9cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkLiAgU2l6ZSBkb24ndCBtYXRjaD9cbiIpOwogICAgIHJldHVybiAxOwogICB9CiAgIGlmIChtZW1jbXAgKGJ1ZlswXSwgYnVmWzJdLCB4KSkgewotICAgIHByaW50ZiAoIkZhaWxlZC4gIENvbnRlbnQgZGlkbid0IG1hdGNoLlxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQuICBDb250ZW50IGRpZG4ndCBtYXRjaC5cbiIpOwogICAgIHJldHVybiAxOwogICB9CiAgIGRoX2ZyZWUgKCZ1c2VyYSk7CiAgIGRoX2ZyZWUgKCZ1c2VyYik7CiAKIC8qIHRlc3QgZW5jcnlwdF9rZXkgKi8KLSAgZGhfbWFrZV9rZXkgKCZ0ZXN0X3lhcnJvdywgZmluZF9wcm5nICgieWFycm93IiksIDEyOCwgJnVzZXJhKTsKKyAgZGhfbWFrZV9rZXkgKCZ5YXJyb3dfcHJuZywgZmluZF9wcm5nICgieWFycm93IiksIDUxMiwgJnVzZXJhKTsKICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspIHsKICAgICBidWZbMF1beF0gPSB4OwogICB9CiAgIHkgPSBzaXplb2YgKGJ1ZlsxXSk7Ci0gIERPKGRoX2VuY3J5cHRfa2V5IChidWZbMF0sIDE2LCBidWZbMV0sICZ5LCAmdGVzdF95YXJyb3csIGZpbmRfcHJuZyAoInlhcnJvdyIpLCBmaW5kX2hhc2ggKCJtZDUiKSwgJnVzZXJhKSk7CisgIERPKGRoX2VuY3J5cHRfa2V5IChidWZbMF0sIDE2LCBidWZbMV0sICZ5LCAmeWFycm93X3BybmcsIGZpbmRfcHJuZyAoInlhcnJvdyIpLCBmaW5kX2hhc2ggKCJtZDUiKSwgJnVzZXJhKSk7CiAgIHplcm9tZW0gKGJ1ZlswXSwgc2l6ZW9mIChidWZbMF0pKTsKICAgeCA9IHNpemVvZiAoYnVmWzBdKTsKICAgRE8oZGhfZGVjcnlwdF9rZXkgKGJ1ZlsxXSwgeSwgYnVmWzBdLCAmeCwgJnVzZXJhKSk7CiAgIGlmICh4ICE9IDE2KSB7Ci0gICAgcHJpbnRmICgiRmFpbGVkIChsZW5ndGgpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCAobGVuZ3RoKVxuIik7CiAgICAgcmV0dXJuIDE7CiAgIH0KICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCiAgICAgaWYgKGJ1ZlswXVt4XSAhPSB4KSB7Ci0gICAgICBwcmludGYgKCJGYWlsZWQgKGNvbnRlbnRzKVxuIik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCAoY29udGVudHMpXG4iKTsKICAgICAgIHJldHVybiAxOwogICAgIH0KIApAQCAtNzQsMTQgKzc2LDI4IEBACiAgICAgIGJ1ZlswXVt4XSA9IHg7CiAgIH0KICAgeCA9IHNpemVvZiAoYnVmWzFdKTsKLSAgRE8oZGhfc2lnbl9oYXNoIChidWZbMF0sIDE2LCBidWZbMV0sICZ4LCAmdGVzdF95YXJyb3cJCSwgZmluZF9wcm5nICgieWFycm93IiksICZ1c2VyYSkpOworICBETyhkaF9zaWduX2hhc2ggKGJ1ZlswXSwgMTYsIGJ1ZlsxXSwgJngsICZ5YXJyb3dfcHJuZwkJLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgJnVzZXJhKSk7CiAgIERPKGRoX3ZlcmlmeV9oYXNoIChidWZbMV0sIHgsIGJ1ZlswXSwgMTYsICZzdGF0LCAmdXNlcmEpKTsKICAgYnVmWzBdWzBdIF49IDE7CiAgIERPKGRoX3ZlcmlmeV9oYXNoIChidWZbMV0sIHgsIGJ1ZlswXSwgMTYsICZzdGF0MiwgJnVzZXJhKSk7CiAgIGlmICghKHN0YXQgPT0gMSAmJiBzdGF0MiA9PSAwKSkgeyAKLSAgICAgcHJpbnRmKCJkaF9zaWduL3ZlcmlmeV9oYXNoICVkICVkIiwgc3RhdCwgc3RhdDIpOworICAgICBmcHJpbnRmKHN0ZGVyciwgImRoX3NpZ24vdmVyaWZ5X2hhc2ggJWQgJWQiLCBzdGF0LCBzdGF0Mik7CiAgICAgIHJldHVybiAxOwogICB9CiAgIGRoX2ZyZWUgKCZ1c2VyYSk7CiAgIHJldHVybiAwOwogfQorCisjZWxzZQorCitpbnQgZGhfdGVzdHModm9pZCkKK3sKKyAgIGZwcmludGYoc3RkZXJyLCAiTk9QIik7CisgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3Rlc3Rwcm9mL2RoX3Rlc3RzLmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNSAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8yMSAxMjo1MToyNSAkICovCmRpZmYgLS1naXQgYS90ZXN0cHJvZi9kc2FfdGVzdC5jIGIvdGVzdHByb2YvZHNhX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTQ5ODhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHByb2YvZHNhX3Rlc3QuYwpAQCAtMCwwICsxLDY4IEBACisjaW5jbHVkZSA8dG9tY3J5cHRfdGVzdC5oPgorCisjaWZkZWYgTURTQQorCitpbnQgZHNhX3Rlc3Qodm9pZCkKK3sKKyAgIHVuc2lnbmVkIGNoYXIgbXNnWzE2XSwgb3V0WzEwMjRdLCBvdXQyWzEwMjRdOworICAgdW5zaWduZWQgbG9uZyB4OworICAgaW50IHN0YXQxLCBzdGF0MjsKKyAgIGRzYV9rZXkga2V5LCBrZXkyOworCisgICAvKiBtYWtlIGEgcmFuZG9tIGtleSAqLworICAgRE8oZHNhX21ha2Vfa2V5KCZ5YXJyb3dfcHJuZywgZmluZF9wcm5nKCJ5YXJyb3ciKSwgMjAsIDEyOCwgJmtleSkpOworCisgICAvKiB2ZXJpZnkgaXQgKi8KKyAgIERPKGRzYV92ZXJpZnlfa2V5KCZrZXksICZzdGF0MSkpOworICAgaWYgKHN0YXQxID09IDApIHsgZnByaW50ZihzdGRlcnIsICJkc2FfdmVyaWZ5X2tleSAiKTsgcmV0dXJuIDE7IH0KKworICAgLyogc2lnbiB0aGUgbWVzc2FnZSAqLworICAgeCA9IHNpemVvZihvdXQpOworICAgRE8oZHNhX3NpZ25faGFzaChtc2csIHNpemVvZihtc2cpLCBvdXQsICZ4LCAmeWFycm93X3BybmcsIGZpbmRfcHJuZygieWFycm93IiksICZrZXkpKTsKKworICAgLyogdmVyaWZ5IGl0IG9uY2UgKi8KKyAgIERPKGRzYV92ZXJpZnlfaGFzaChvdXQsIHgsIG1zZywgc2l6ZW9mKG1zZyksICZzdGF0MSwgJmtleSkpOworCisgICAvKiBNb2RpZnkgYW5kIHZlcmlmeSBhZ2FpbiAqLworICAgbXNnWzBdIF49IDE7CisgICBETyhkc2FfdmVyaWZ5X2hhc2gob3V0LCB4LCBtc2csIHNpemVvZihtc2cpLCAmc3RhdDIsICZrZXkpKTsKKyAgIG1zZ1swXSBePSAxOworICAgaWYgKCEoc3RhdDEgPT0gMSAmJiBzdGF0MiA9PSAwKSkgeyBmcHJpbnRmKHN0ZGVyciwgImRzYV92ZXJpZnkgJWQgJWQiLCBzdGF0MSwgc3RhdDIpOyByZXR1cm4gMTsgfQorCisgICAvKiB0ZXN0IGV4cG9ydGluZyBpdCAqLworICAgeCA9IHNpemVvZihvdXQyKTsKKyAgIERPKGRzYV9leHBvcnQob3V0MiwgJngsIFBLX1BSSVZBVEUsICZrZXkpKTsKKyAgIERPKGRzYV9pbXBvcnQob3V0MiwgeCwgJmtleTIpKTsKKworICAgLyogdmVyaWZ5IGEgc2lnbmF0dXJlIHdpdGggaXQgKi8KKyAgIERPKGRzYV92ZXJpZnlfaGFzaChvdXQsIHgsIG1zZywgc2l6ZW9mKG1zZyksICZzdGF0MSwgJmtleTIpKTsKKyAgIGlmIChzdGF0MSA9PSAwKSB7IGZwcmludGYoc3RkZXJyLCAiZHNhX3ZlcmlmeSAoaW1wb3J0IHByaXZhdGUpICVkICIsIHN0YXQxKTsgcmV0dXJuIDE7IH0KKyAgIGRzYV9mcmVlKCZrZXkyKTsKKworICAgLyogZXhwb3J0IGFzIHB1YmxpYyBub3cgKi8KKyAgIHggPSBzaXplb2Yob3V0Mik7CisgICBETyhkc2FfZXhwb3J0KG91dDIsICZ4LCBQS19QVUJMSUMsICZrZXkpKTsKKworICAgRE8oZHNhX2ltcG9ydChvdXQyLCB4LCAma2V5MikpOworICAgLyogdmVyaWZ5IGEgc2lnbmF0dXJlIHdpdGggaXQgKi8KKyAgIERPKGRzYV92ZXJpZnlfaGFzaChvdXQsIHgsIG1zZywgc2l6ZW9mKG1zZyksICZzdGF0MSwgJmtleTIpKTsKKyAgIGlmIChzdGF0MSA9PSAwKSB7IGZwcmludGYoc3RkZXJyLCAiZHNhX3ZlcmlmeSAoaW1wb3J0IHB1YmxpYykgJWQgIiwgc3RhdDEpOyByZXR1cm4gMTsgfQorICAgZHNhX2ZyZWUoJmtleTIpOworICAgZHNhX2ZyZWUoJmtleSk7CisKKyAgIHJldHVybiAwOworfQorCisjZWxzZQorCitpbnQgZHNhX3Rlc3Qodm9pZCkKK3sKKyAgZnByaW50ZihzdGRlcnIsICJOT1AiKTsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC90ZXN0cHJvZi9kc2FfdGVzdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjggJCAqLworLyogJERhdGU6IDIwMDUvMDYvMDMgMTk6MjQ6MzIgJCAqLwpkaWZmIC0tZ2l0IGEvdGVzdHByb2YvZWNjX3Rlc3QuYyBiL3Rlc3Rwcm9mL2VjY190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmODhhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rwcm9mL2VjY190ZXN0LmMKQEAgLTAsMCArMSwxMzcgQEAKKyNpbmNsdWRlIDx0b21jcnlwdF90ZXN0Lmg+CisKKyNpZmRlZiBNRUNDCisKK3N0YXRpYyBpbnQgc2l6ZXNbXSA9IHsKKyNpZmRlZiBFQ0MxOTIKKzI0LAorI2VuZGlmCisjaWZkZWYgRUNDMjI0CisyOCwKKyNlbmRpZgorI2lmZGVmIEVDQzI1NgorMzIsCisjZW5kaWYKKyNpZmRlZiBFQ0MzODQKKzQ4LAorI2VuZGlmCisjaWZkZWYgRUNDNTEyCis2NQorI2VuZGlmCit9OworCitpbnQgZWNjX3Rlc3RzICh2b2lkKQoreworICB1bnNpZ25lZCBjaGFyIGJ1Zls0XVs0MDk2XTsKKyAgdW5zaWduZWQgbG9uZyB4LCB5LCB6LCBzOworICBpbnQgICAgICAgICAgIHN0YXQsIHN0YXQyOworICBlY2Nfa2V5IHVzZXJhLCB1c2VyYiwgcHViS2V5LCBwcml2S2V5OworCQorICBETyhlY2NfdGVzdCAoKSk7CisKKyAgZm9yIChzID0gMDsgcyA8IChpbnQpKHNpemVvZihzaXplcykvc2l6ZW9mKHNpemVzWzBdKSk7IHMrKykgeworICAgICAvKiBtYWtlIHVwIHR3byBrZXlzICovCisgICAgIERPKGVjY19tYWtlX2tleSAoJnlhcnJvd19wcm5nLCBmaW5kX3BybmcgKCJ5YXJyb3ciKSwgc2l6ZXNbc10sICZ1c2VyYSkpOworICAgICBETyhlY2NfbWFrZV9rZXkgKCZ5YXJyb3dfcHJuZywgZmluZF9wcm5nICgieWFycm93IiksIHNpemVzW3NdLCAmdXNlcmIpKTsKKworICAgICAvKiBtYWtlIHRoZSBzaGFyZWQgc2VjcmV0ICovCisgICAgIHggPSA0MDk2OworICAgICBETyhlY2Nfc2hhcmVkX3NlY3JldCAoJnVzZXJhLCAmdXNlcmIsIGJ1ZlswXSwgJngpKTsKKworICAgICB5ID0gNDA5NjsKKyAgICAgRE8oZWNjX3NoYXJlZF9zZWNyZXQgKCZ1c2VyYiwgJnVzZXJhLCBidWZbMV0sICZ5KSk7CisKKyAgICAgaWYgKHkgIT0geCkgeworICAgICAgIGZwcmludGYoc3RkZXJyLCAiZWNjIFNoYXJlZCBrZXlzIGFyZSBub3Qgc2FtZSBzaXplLiIpOworICAgICAgIHJldHVybiAxOworICAgICB9CisKKyAgICAgaWYgKG1lbWNtcCAoYnVmWzBdLCBidWZbMV0sIHgpKSB7CisgICAgICAgZnByaW50ZihzdGRlcnIsICJlY2MgU2hhcmVkIGtleXMgbm90IHNhbWUgY29udGVudHMuIik7CisgICAgICAgcmV0dXJuIDE7CisgICAgIH0KKworICAgICAvKiBub3cgZXhwb3J0IHVzZXJiICovCisgICAgIHkgPSA0MDk2OworICAgICBETyhlY2NfZXhwb3J0IChidWZbMV0sICZ5LCBQS19QVUJMSUMsICZ1c2VyYikpOworICAgICBlY2NfZnJlZSAoJnVzZXJiKTsKKworICAgICAvKiBpbXBvcnQgYW5kIG1ha2UgdGhlIHNoYXJlZCBzZWNyZXQgYWdhaW4gKi8KKyAgICAgRE8oZWNjX2ltcG9ydCAoYnVmWzFdLCB5LCAmdXNlcmIpKTsKKworICAgICB6ID0gNDA5NjsKKyAgICAgRE8oZWNjX3NoYXJlZF9zZWNyZXQgKCZ1c2VyYSwgJnVzZXJiLCBidWZbMl0sICZ6KSk7CisKKyAgICAgaWYgKHogIT0geCkgeworICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkLiAgU2l6ZSBkb24ndCBtYXRjaD8iKTsKKyAgICAgICByZXR1cm4gMTsKKyAgICAgfQorICAgICBpZiAobWVtY21wIChidWZbMF0sIGJ1ZlsyXSwgeCkpIHsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZC4gIENvbnRlbnRzIGRpZG4ndCBtYXRjaC4iKTsKKyAgICAgICByZXR1cm4gMTsKKyAgICAgfQorICAgICBlY2NfZnJlZSAoJnVzZXJhKTsKKyAgICAgZWNjX2ZyZWUgKCZ1c2VyYik7CisKKyAgICAgLyogdGVzdCBlbmNyeXB0X2tleSAqLworICAgICBETyhlY2NfbWFrZV9rZXkgKCZ5YXJyb3dfcHJuZywgZmluZF9wcm5nICgieWFycm93IiksIHNpemVzW3NdLCAmdXNlcmEpKTsKKworICAgICAvKiBleHBvcnQga2V5ICovCisgICAgIHggPSBzaXplb2YoYnVmWzBdKTsKKyAgICAgRE8oZWNjX2V4cG9ydChidWZbMF0sICZ4LCBQS19QVUJMSUMsICZ1c2VyYSkpOworICAgICBETyhlY2NfaW1wb3J0KGJ1ZlswXSwgeCwgJnB1YktleSkpOworICAgICB4ID0gc2l6ZW9mKGJ1ZlswXSk7CisgICAgIERPKGVjY19leHBvcnQoYnVmWzBdLCAmeCwgUEtfUFJJVkFURSwgJnVzZXJhKSk7CisgICAgIERPKGVjY19pbXBvcnQoYnVmWzBdLCB4LCAmcHJpdktleSkpOworCisgICAgIGZvciAoeCA9IDA7IHggPCAzMjsgeCsrKSB7CisgICAgICAgIGJ1ZlswXVt4XSA9IHg7CisgICAgIH0KKyAgICAgeSA9IHNpemVvZiAoYnVmWzFdKTsKKyAgICAgRE8oZWNjX2VuY3J5cHRfa2V5IChidWZbMF0sIDMyLCBidWZbMV0sICZ5LCAmeWFycm93X3BybmcsIGZpbmRfcHJuZyAoInlhcnJvdyIpLCBmaW5kX2hhc2ggKCJzaGEyNTYiKSwgJnB1YktleSkpOworICAgICB6ZXJvbWVtIChidWZbMF0sIHNpemVvZiAoYnVmWzBdKSk7CisgICAgIHggPSBzaXplb2YgKGJ1ZlswXSk7CisgICAgIERPKGVjY19kZWNyeXB0X2tleSAoYnVmWzFdLCB5LCBidWZbMF0sICZ4LCAmcHJpdktleSkpOworICAgICBpZiAoeCAhPSAzMikgeworICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIChsZW5ndGgpIik7CisgICAgICAgcmV0dXJuIDE7CisgICAgIH0KKyAgICAgZm9yICh4ID0gMDsgeCA8IDMyOyB4KyspIHsKKyAgICAgICAgaWYgKGJ1ZlswXVt4XSAhPSB4KSB7CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIChjb250ZW50cykiKTsKKyAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgfQorICAgICAvKiB0ZXN0IHNpZ25faGFzaCAqLworICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykgeworICAgICAgICBidWZbMF1beF0gPSB4OworICAgICB9CisgICAgIHggPSBzaXplb2YgKGJ1ZlsxXSk7CisgICAgIERPKGVjY19zaWduX2hhc2ggKGJ1ZlswXSwgMTYsIGJ1ZlsxXSwgJngsICZ5YXJyb3dfcHJuZywgZmluZF9wcm5nICgieWFycm93IiksICZwcml2S2V5KSk7CisgICAgIERPKGVjY192ZXJpZnlfaGFzaCAoYnVmWzFdLCB4LCBidWZbMF0sIDE2LCAmc3RhdCwgJnB1YktleSkpOworICAgICBidWZbMF1bMF0gXj0gMTsKKyAgICAgRE8oZWNjX3ZlcmlmeV9oYXNoIChidWZbMV0sIHgsIGJ1ZlswXSwgMTYsICZzdGF0MiwgJnByaXZLZXkpKTsKKyAgICAgaWYgKCEoc3RhdCA9PSAxICYmIHN0YXQyID09IDApKSB7IAorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVjY192ZXJpZnlfaGFzaCBmYWlsZWQgJWQsICVkLCAiLCBzdGF0LCBzdGF0Mik7CisgICAgICAgIHJldHVybiAxOworICAgICB9CisgICAgIGVjY19mcmVlICgmdXNlcmEpOyAKKyAgICAgZWNjX2ZyZWUgKCZwdWJLZXkpOworICAgICBlY2NfZnJlZSAoJnByaXZLZXkpOworICB9CisgIHJldHVybiAwOworfQorCisjZWxzZQorCitpbnQgZWNjX3Rlc3RzKHZvaWQpCit7CisgICBmcHJpbnRmKHN0ZGVyciwgIk5PUCIpOworICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC90ZXN0cHJvZi9lY2NfdGVzdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjkgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMTQgMTk6NDM6MjkgJCAqLwpkaWZmIC0tZ2l0IGEvdGVzdHByb2YvbWFjX3Rlc3QuYyBiL3Rlc3Rwcm9mL21hY190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5ZTkwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rwcm9mL21hY190ZXN0LmMKQEAgLTAsMCArMSwzNSBAQAorLyogdGVzdCBwbWFjL29tYWMvaG1hYyAqLworI2luY2x1ZGUgPHRvbWNyeXB0X3Rlc3QuaD4KKworaW50IG1hY190ZXN0KHZvaWQpCit7CisjaWZkZWYgSE1BQworICAgRE8oaG1hY190ZXN0KCkpOyAKKyNlbmRpZgorI2lmZGVmIFBNQUMKKyAgIERPKHBtYWNfdGVzdCgpKTsgCisjZW5kaWYKKyNpZmRlZiBPTUFDCisgICBETyhvbWFjX3Rlc3QoKSk7IAorI2VuZGlmCisjaWZkZWYgRUFYX01PREUKKyAgIERPKGVheF90ZXN0KCkpOyAgCisjZW5kaWYKKyNpZmRlZiBPQ0JfTU9ERQorICAgRE8ob2NiX3Rlc3QoKSk7ICAKKyNlbmRpZgorI2lmZGVmIENDTV9NT0RFCisgICBETyhjY21fdGVzdCgpKTsKKyNlbmRpZgorI2lmZGVmIEdDTV9NT0RFCisgICBETyhnY21fdGVzdCgpKTsKKyNlbmRpZgorI2lmZGVmIFBFTElDQU4KKyAgIERPKHBlbGljYW5fdGVzdCgpKTsKKyNlbmRpZgorICAgcmV0dXJuIDA7Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3Rlc3Rwcm9mL21hY190ZXN0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMyAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS90ZXN0cHJvZi9tYWtlZmlsZSBiL3Rlc3Rwcm9mL21ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YmU1NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cHJvZi9tYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACitDRkxBR1MgKz0gLUkuLi9zcmMvaGVhZGVycyAtSS4vIC1XYWxsIC1XCisKK09CSkVDVFMgPSBiYXNlNjRfdGVzdC5vIGNpcGhlcl9oYXNoX3Rlc3QubyBkZXJfdGVzdHMubyBkaF90ZXN0cy5vICAgICAgICAgICAgICAgICAgICAgICAgXAorZHNhX3Rlc3QubyBlY2NfdGVzdC5vIG1hY190ZXN0Lm8gbW9kZXNfdGVzdC5vIHBrY3NfMV90ZXN0Lm8gcnNhX3Rlc3QubyAgICAgICAgICAgICAgICAgICBcCitzdG9yZV90ZXN0Lm8gdGVzdC5vIHg4Nl9wcm9mLm8KKworZGVmYXVsdDogbGlidG9tY3J5cHRfcHJvZi5hCisKK2xpYnRvbWNyeXB0X3Byb2YuYTogJChPQkpFQ1RTKQorCSQoQVIpICQoQVJGTEFHUykgbGlidG9tY3J5cHRfcHJvZi5hICQoT0JKRUNUUykKKwlyYW5saWIgbGlidG9tY3J5cHRfcHJvZi5hCisKK2NsZWFuOgorCXJtIC1mICoubyAqLmEKKwpkaWZmIC0tZ2l0IGEvdGVzdHByb2YvbWFrZWZpbGUuaWNjIGIvdGVzdHByb2YvbWFrZWZpbGUuaWNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODc2NjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cHJvZi9tYWtlZmlsZS5pY2MKQEAgLTAsMCArMSwxNSBAQAorQ0ZMQUdTICs9IC1JLi4vc3JjL2hlYWRlcnMgLUkuLyAKK0NDPWljYworCitPQkpFQ1RTID0gYmFzZTY0X3Rlc3QubyBjaXBoZXJfaGFzaF90ZXN0Lm8gZGVyX3Rlc3RzLm8gZGhfdGVzdHMubyAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RzYV90ZXN0Lm8gZWNjX3Rlc3QubyBtYWNfdGVzdC5vIG1vZGVzX3Rlc3QubyBwa2NzXzFfdGVzdC5vIHJzYV90ZXN0Lm8gICAgICAgICAgICAgICAgICAgXAorc3RvcmVfdGVzdC5vIHRlc3QubyB4ODZfcHJvZi5vCisKK2RlZmF1bHQ6IGxpYnRvbWNyeXB0X3Byb2YuYQorCitsaWJ0b21jcnlwdF9wcm9mLmE6ICQoT0JKRUNUUykKKwkkKEFSKSAkKEFSRkxBR1MpIGxpYnRvbWNyeXB0X3Byb2YuYSAkKE9CSkVDVFMpCisKK2NsZWFuOgorCXJtIC1mICoubyAqLmEKKwpkaWZmIC0tZ2l0IGEvdGVzdHByb2YvbWFrZWZpbGUubXN2YyBiL3Rlc3Rwcm9mL21ha2VmaWxlLm1zdmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxNWZmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rwcm9mL21ha2VmaWxlLm1zdmMKQEAgLTAsMCArMSwxMCBAQAorQ0ZMQUdTID0gL0kuLi9zcmMvaGVhZGVycy8gL0kuLyAvT3ggL0RXSU4zMiAvVzMgL0ZvJEAKKworT0JKRUNUUz1iYXNlNjRfdGVzdC5vYmogY2lwaGVyX2hhc2hfdGVzdC5vYmogZGVyX3Rlc3RzLm9iaiBkaF90ZXN0cy5vYmogXAorZHNhX3Rlc3Qub2JqIGVjY190ZXN0Lm9iaiBtYWNfdGVzdC5vYmogbW9kZXNfdGVzdC5vYmogcGtjc18xX3Rlc3Qub2JqIFwKK3JzYV90ZXN0Lm9iaiBzdG9yZV90ZXN0Lm9iaiB0ZXN0Lm9iaiB4ODZfcHJvZi5vYmoKKwordG9tY3J5cHRfcHJvZi5saWI6ICQoT0JKRUNUUykKKwlsaWIgL291dDp0b21jcnlwdF9wcm9mLmxpYiAkKE9CSkVDVFMpCisKKwpkaWZmIC0tZ2l0IGEvdGVzdHByb2YvbWFrZWZpbGUuc2hhcmVkIGIvdGVzdHByb2YvbWFrZWZpbGUuc2hhcmVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MjE5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cHJvZi9tYWtlZmlsZS5zaGFyZWQKQEAgLTAsMCArMSwxNSBAQAorQ0M9bGlidG9vbCAtLW1vZGU9Y29tcGlsZSBnY2MKKworQ0ZMQUdTICs9IC1JLi4vc3JjL2hlYWRlcnMgLUkuLyAtTzMgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZ1bnJvbGwtbG9vcHMgLVdhbGwgLVcKKworT0JKRUNUUyA9IGJhc2U2NF90ZXN0Lm8gY2lwaGVyX2hhc2hfdGVzdC5vIGRlcl90ZXN0cy5vIGRoX3Rlc3RzLm8gICAgICAgICAgICAgICAgICAgICAgICBcCitkc2FfdGVzdC5vIGVjY190ZXN0Lm8gbWFjX3Rlc3QubyBtb2Rlc190ZXN0Lm8gcGtjc18xX3Rlc3QubyByc2FfdGVzdC5vICAgICAgICAgICAgICAgICAgIFwKK3N0b3JlX3Rlc3QubyB0ZXN0Lm8geDg2X3Byb2YubworCitkZWZhdWx0OiAkKExJQk5BTUUpCisKKyQoTElCTkFNRSk6ICQoT0JKRUNUUykKKwlsaWJ0b29sIC0tc2lsZW50IC0tbW9kZT1saW5rIGdjYyAkKENGTEFHUykgYGZpbmQgLiAtdHlwZSBmIHwgZ3JlcCAiWy5dbG8iIHwgIHhhcmdzYCAtbyBsaWJ0b21jcnlwdF9wcm9mLmxhIC1ycGF0aCAkKExJQlBBVEgpIC12ZXJzaW9uLWluZm8gJChWRVJTSU9OKQorCWxpYnRvb2wgLS1zaWxlbnQgLS1tb2RlPWxpbmsgZ2NjICQoQ0ZMQUdTKSBgZmluZCAuIC10eXBlIGYgfCBncmVwICJbLl1vIiB8IHhhcmdzYCAgLW8gbGlidG9tY3J5cHRfcHJvZi5hCisJcmFubGliIGxpYnRvbWNyeXB0X3Byb2YuYQorCWxpYnRvb2wgLS1zaWxlbnQgLS1tb2RlPWluc3RhbGwgaW5zdGFsbCAtYyBsaWJ0b21jcnlwdF9wcm9mLmxhICQoTElCUEFUSCkvbGlidG9tY3J5cHRfcHJvZi5sYQpkaWZmIC0tZ2l0IGEvZGVtb3MvdGVzdC9tb2Rlc190ZXN0LmMgYi90ZXN0cHJvZi9tb2Rlc190ZXN0LmMKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gZGVtb3MvdGVzdC9tb2Rlc190ZXN0LmMKcmVuYW1lIHRvIHRlc3Rwcm9mL21vZGVzX3Rlc3QuYwppbmRleCA3NDk0YjRkLi5kMzk0MjY3IDEwMDY0NAotLS0gYS9kZW1vcy90ZXN0L21vZGVzX3Rlc3QuYworKysgYi90ZXN0cHJvZi9tb2Rlc190ZXN0LmMKQEAgLTEsMTAgKzEsMTAgQEAKIC8qIHRlc3QgQ0ZCL09GQi9DQkMgbW9kZXMgKi8KLSNpbmNsdWRlICJ0ZXN0LmgiCisjaW5jbHVkZSA8dG9tY3J5cHRfdGVzdC5oPgogCiBpbnQgbW9kZXNfdGVzdCh2b2lkKQogewogICAgdW5zaWduZWQgY2hhciBwdFs2NF0sIGN0WzY0XSwgdG1wWzY0XSwga2V5WzE2XSwgaXZbMTZdLCBpdjJbMTZdOwotICAgaW50IHgsIGNpcGhlcl9pZHg7CisgICBpbnQgY2lwaGVyX2lkeDsKICAgIHN5bW1ldHJpY19DQkMgY2JjOwogICAgc3ltbWV0cmljX0NGQiBjZmI7CiAgICBzeW1tZXRyaWNfT0ZCIG9mYjsKQEAgLTEyLDQxICsxMiw0MCBAQAogICAgdW5zaWduZWQgbG9uZyBsOwogICAgCiAgICAvKiBtYWtlIGEgcmFuZG9tIHB0LCBrZXkgYW5kIGl2ICovCi0gICB5YXJyb3dfcmVhZChwdCwgIDY0LCAmdGVzdF95YXJyb3cpOwotICAgeWFycm93X3JlYWQoa2V5LCAxNiwgJnRlc3RfeWFycm93KTsKLSAgIHlhcnJvd19yZWFkKGl2LCAgMTYsICZ0ZXN0X3lhcnJvdyk7CisgICB5YXJyb3dfcmVhZChwdCwgIDY0LCAmeWFycm93X3BybmcpOworICAgeWFycm93X3JlYWQoa2V5LCAxNiwgJnlhcnJvd19wcm5nKTsKKyAgIHlhcnJvd19yZWFkKGl2LCAgMTYsICZ5YXJyb3dfcHJuZyk7CiAgICAKICAgIC8qIGdldCBpZHggb2YgQUVTIGhhbmR5ICovCiAgICBjaXBoZXJfaWR4ID0gZmluZF9jaXBoZXIoImFlcyIpOwogICAgaWYgKGNpcGhlcl9pZHggPT0gLTEpIHsKLSAgICAgIHByaW50ZigidGVzdCByZXF1aXJlcyBBRVMiKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAidGVzdCByZXF1aXJlcyBBRVMiKTsKICAgICAgIHJldHVybiAxOwogICAgfQogICAgCisjaWZkZWYgQ0JDCiAgICAvKiB0ZXN0IENCQyBtb2RlICovCiAgICAvKiBlbmNvZGUgdGhlIGJsb2NrICovCiAgICBETyhjYmNfc3RhcnQoY2lwaGVyX2lkeCwgaXYsIGtleSwgMTYsIDAsICZjYmMpKTsKICAgIGwgPSBzaXplb2YoaXYyKTsKICAgIERPKGNiY19nZXRpdihpdjIsICZsLCAmY2JjKSk7CiAgICBpZiAobCAhPSAxNiB8fCBtZW1jbXAoaXYyLCBpdiwgMTYpKSB7Ci0gICAgICBwcmludGYoImNiY19nZXRpdiBmYWlsZWQiKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiY2JjX2dldGl2IGZhaWxlZCIpOwogICAgICAgcmV0dXJuIDE7CiAgICB9Ci0gICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7Ci0gICAgICBETyhjYmNfZW5jcnlwdChwdCt4KjE2LCBjdCt4KjE2LCAmY2JjKSk7Ci0gICB9CisgICBETyhjYmNfZW5jcnlwdChwdCwgY3QsIDY0LCAmY2JjKSk7CiAgICAKICAgIC8qIGRlY29kZSB0aGUgYmxvY2sgKi8KICAgIERPKGNiY19zZXRpdihpdjIsIGwsICZjYmMpKTsKICAgIHplcm9tZW0odG1wLCBzaXplb2YodG1wKSk7Ci0gICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7Ci0gICAgICBETyhjYmNfZGVjcnlwdChjdCt4KjE2LCB0bXAreCoxNiwgJmNiYykpOwotICAgfQorICAgRE8oY2JjX2RlY3J5cHQoY3QsIHRtcCwgNjQsICZjYmMpKTsKICAgIGlmIChtZW1jbXAodG1wLCBwdCwgNjQpICE9IDApIHsKLSAgICAgIHByaW50ZigiQ0JDIGZhaWxlZCIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJDQkMgZmFpbGVkIik7CiAgICAgICByZXR1cm4gMTsKICAgIH0KLSAgIAorI2VuZGlmCisKKyNpZmRlZiBDRkIgICAKICAgIC8qIHRlc3QgQ0ZCIG1vZGUgKi8KICAgIC8qIGVuY29kZSB0aGUgYmxvY2sgKi8KICAgIERPKGNmYl9zdGFydChjaXBoZXJfaWR4LCBpdiwga2V5LCAxNiwgMCwgJmNmYikpOwpAQCAtNTQsNyArNTMsNyBAQAogICAgRE8oY2ZiX2dldGl2KGl2MiwgJmwsICZjZmIpKTsKICAgIC8qIG5vdGUgd2UgZG9uJ3QgbWVtY21wIGl2Mi9pdiBzaW5jZSBjZmJfc3RhcnQgcHJvY2Vzc2VzIHRoZSBJViBmb3IgdGhlIGZpcnN0IGJsb2NrICovCiAgICBpZiAobCAhPSAxNikgewotICAgICAgcHJpbnRmKCJjZmJfZ2V0aXYgZmFpbGVkIik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImNmYl9nZXRpdiBmYWlsZWQiKTsKICAgICAgIHJldHVybiAxOwogICAgfQogICAgRE8oY2ZiX2VuY3J5cHQocHQsIGN0LCA2NCwgJmNmYikpOwpAQCAtNjQsMTcgKzYzLDE5IEBACiAgICB6ZXJvbWVtKHRtcCwgc2l6ZW9mKHRtcCkpOwogICAgRE8oY2ZiX2RlY3J5cHQoY3QsIHRtcCwgNjQsICZjZmIpKTsKICAgIGlmIChtZW1jbXAodG1wLCBwdCwgNjQpICE9IDApIHsKLSAgICAgIHByaW50ZigiQ0ZCIGZhaWxlZCIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJDRkIgZmFpbGVkIik7CiAgICAgICByZXR1cm4gMTsKICAgIH0KKyNlbmRpZgogICAgCisjaWZkZWYgT0ZCCiAgICAvKiB0ZXN0IE9GQiBtb2RlICovCiAgICAvKiBlbmNvZGUgdGhlIGJsb2NrICovCiAgICBETyhvZmJfc3RhcnQoY2lwaGVyX2lkeCwgaXYsIGtleSwgMTYsIDAsICZvZmIpKTsKICAgIGwgPSBzaXplb2YoaXYyKTsKICAgIERPKG9mYl9nZXRpdihpdjIsICZsLCAmb2ZiKSk7CiAgICBpZiAobCAhPSAxNiB8fCBtZW1jbXAoaXYyLCBpdiwgMTYpKSB7Ci0gICAgICBwcmludGYoIm9mYl9nZXRpdiBmYWlsZWQiKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAib2ZiX2dldGl2IGZhaWxlZCIpOwogICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBETyhvZmJfZW5jcnlwdChwdCwgY3QsIDY0LCAmb2ZiKSk7CkBAIC04NCwyOSArODUsMzYgQEAKICAgIHplcm9tZW0odG1wLCBzaXplb2YodG1wKSk7CiAgICBETyhvZmJfZGVjcnlwdChjdCwgdG1wLCA2NCwgJm9mYikpOwogICAgaWYgKG1lbWNtcCh0bXAsIHB0LCA2NCkgIT0gMCkgewotICAgICAgcHJpbnRmKCJPRkIgZmFpbGVkIik7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk9GQiBmYWlsZWQiKTsKICAgICAgIHJldHVybiAxOwogICAgfQotICAgCisjZW5kaWYKKworI2lmZGVmIENUUiAgIAogICAgLyogdGVzdCBDVFIgbW9kZSAqLwogICAgLyogZW5jb2RlIHRoZSBibG9jayAqLwotICAgRE8oY3RyX3N0YXJ0KGNpcGhlcl9pZHgsIGl2LCBrZXksIDE2LCAwLCAmY3RyKSk7CisgICBETyhjdHJfc3RhcnQoY2lwaGVyX2lkeCwgaXYsIGtleSwgMTYsIDAsIENUUl9DT1VOVEVSX0xJVFRMRV9FTkRJQU4sICZjdHIpKTsKICAgIGwgPSBzaXplb2YoaXYyKTsKICAgIERPKGN0cl9nZXRpdihpdjIsICZsLCAmY3RyKSk7CiAgICBpZiAobCAhPSAxNiB8fCBtZW1jbXAoaXYyLCBpdiwgMTYpKSB7Ci0gICAgICBwcmludGYoImN0cl9nZXRpdiBmYWlsZWQiKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiY3RyX2dldGl2IGZhaWxlZCIpOwogICAgICAgcmV0dXJuIDE7CiAgICB9Ci0gICBETyhjdHJfZW5jcnlwdChwdCwgY3QsIDY0LCAmY3RyKSk7CisgICBETyhjdHJfZW5jcnlwdChwdCwgY3QsIDU3LCAmY3RyKSk7CiAgICAKICAgIC8qIGRlY29kZSB0aGUgYmxvY2sgKi8KICAgIERPKGN0cl9zZXRpdihpdjIsIGwsICZjdHIpKTsKICAgIHplcm9tZW0odG1wLCBzaXplb2YodG1wKSk7Ci0gICBETyhjdHJfZGVjcnlwdChjdCwgdG1wLCA2NCwgJmN0cikpOwotICAgaWYgKG1lbWNtcCh0bXAsIHB0LCA2NCkgIT0gMCkgewotICAgICAgcHJpbnRmKCJDVFIgZmFpbGVkIik7CisgICBETyhjdHJfZGVjcnlwdChjdCwgdG1wLCA1NywgJmN0cikpOworICAgaWYgKG1lbWNtcCh0bXAsIHB0LCA1NykgIT0gMCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJDVFIgZmFpbGVkIik7CiAgICAgICByZXR1cm4gMTsKICAgIH0KKyNlbmRpZgogICAgICAgICAgCiAgICByZXR1cm4gMDsKIH0KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvdGVzdHByb2YvbW9kZXNfdGVzdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjYgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMjEgMTI6NTE6MjUgJCAqLwpkaWZmIC0tZ2l0IGEvdGVzdHByb2YvcGtjc18xX3Rlc3QuYyBiL3Rlc3Rwcm9mL3BrY3NfMV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0N2Q4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rwcm9mL3BrY3NfMV90ZXN0LmMKQEAgLTAsMCArMSw5NiBAQAorI2luY2x1ZGUgPHRvbWNyeXB0X3Rlc3QuaD4KKworI2lmZGVmIFBLQ1NfMQorCitpbnQgcGtjc18xX3Rlc3Qodm9pZCkKK3sKKyAgIHVuc2lnbmVkIGNoYXIgYnVmWzNdWzEyOF07CisgICBpbnQgcmVzMSwgcmVzMiwgcmVzMywgcHJuZ19pZHgsIGhhc2hfaWR4OworICAgdW5zaWduZWQgbG9uZyB4LCB5LCBsMSwgbDIsIGwzLCBpMSwgaTIsIGxwYXJhbWxlbiwgc2FsdGxlbiwgbW9kbGVuOworICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbHBhcmFtW10gPSB7IDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2IH07CisKKyAgIC8qIGdldCBoYXNoL3BybmcgICovCisgICBoYXNoX2lkeCA9IGZpbmRfaGFzaCgic2hhMSIpOworICAgcHJuZ19pZHggPSBmaW5kX3BybmcoInlhcnJvdyIpOworICAgCisgICBpZiAoaGFzaF9pZHggPT0gLTEgfHwgcHJuZ19pZHggPT0gLTEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAicGtjc18xIHRlc3RzIHJlcXVpcmUgc2hhMS95YXJyb3ciKTsKKyAgICAgIHJldHVybiAxOworICAgfSAgIAorCisgICAvKiBkbyBtYW55IHRlc3RzICovCisgICBmb3IgKHggPSAwOyB4IDwgMTAwOyB4KyspIHsKKyAgICAgIHplcm9tZW0oYnVmLCBzaXplb2YoYnVmKSk7CisKKyAgICAgIC8qIG1ha2UgYSBkdW1teSBtZXNzYWdlIChvZiByYW5kb20gbGVuZ3RoKSAqLworICAgICAgbDMgPSAocmFuZCgpICYgMzEpICsgODsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBsMzsgeSsrKSBidWZbMF1beV0gPSByYW5kKCkgJiAyNTU7CisKKyAgICAgIC8qIHJhbmRvbSBtb2R1bHVzIGxlbiAodjEuNSBtdXN0IGJlIG11bHRpcGxlIG9mIDggdGhvdWdoIGFyYml0cmFyeSBzaXplcyBzZWVtIHRvIHdvcmspICovCisgICAgICBtb2RsZW4gPSA4MDAgKyA4ICogKGFicyhyYW5kKCkpICUgMjgpOworCisgICAgICAvKiBwaWNrIGEgcmFuZG9tIGxwYXJhbSBsZW4gWzAuLjE2XSAqLworICAgICAgbHBhcmFtbGVuID0gYWJzKHJhbmQoKSkgJSAxNzsKKworICAgICAgLyogcGljayBhIHJhbmRvbSBzYWx0bGVuIDAuLjE2ICovCisgICAgICBzYWx0bGVuICAgPSBhYnMocmFuZCgpKSAlIDE3OworCisgICAgICAvKiBQS0NTICMxIHYyLjAgc3VwcG9ydHMgbW9kbGVucyBub3QgbXVsdGlwbGUgb2YgOCAqLworICAgICAgbW9kbGVuID0gODAwICsgKGFicyhyYW5kKCkpICUgMjI0KTsKKworICAgICAgLyogZW5jb2RlIGl0ICovCisgICAgICBsMSA9IHNpemVvZihidWZbMV0pOworICAgICAgRE8ocGtjc18xX29hZXBfZW5jb2RlKGJ1ZlswXSwgbDMsIGxwYXJhbSwgbHBhcmFtbGVuLCBtb2RsZW4sICZ5YXJyb3dfcHJuZywgcHJuZ19pZHgsIGhhc2hfaWR4LCBidWZbMV0sICZsMSkpOworCisgICAgICAvKiBkZWNvZGUgaXQgKi8KKyAgICAgIGwyID0gc2l6ZW9mKGJ1ZlsyXSk7CisgICAgICBETyhwa2NzXzFfb2FlcF9kZWNvZGUoYnVmWzFdLCBsMSwgbHBhcmFtLCBscGFyYW1sZW4sIG1vZGxlbiwgaGFzaF9pZHgsIGJ1ZlsyXSwgJmwyLCAmcmVzMSkpOworCisgICAgICBpZiAocmVzMSAhPSAxIHx8IGwyICE9IGwzIHx8IG1lbWNtcChidWZbMl0sIGJ1ZlswXSwgbDMpICE9IDApIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0c2l6ZSA9PSAlbHUsIHNob3VsZCBoYXZlIGJlZW4gJWx1LCByZXMxID0gJWQsIGxwYXJhbWxlbiA9ICVsdSwgbXNnIGNvbnRlbnRzIGZvbGxvdy5cbiIsIGwyLCBsMywgcmVzMSwgbHBhcmFtbGVuKTsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiT1JJR0lOQUw6XG4iKTsKKyAgICAgICAgIGZvciAoeCA9IDA7IHggPCBsMzsgeCsrKSB7CisgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlMDJ4ICIsIGJ1ZlswXVt4XSk7CisgICAgICAgICB9CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuUkVTVUxUOlxuIik7CisgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbDI7IHgrKykgeworICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJTAyeCAiLCBidWZbMl1beF0pOworICAgICAgICAgfQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcblxuIik7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgLyogdGVzdCBQU1MgKi8KKyAgICAgIGwxID0gc2l6ZW9mKGJ1ZlsxXSk7CisgICAgICBETyhwa2NzXzFfcHNzX2VuY29kZShidWZbMF0sIGwzLCBzYWx0bGVuLCAmeWFycm93X3BybmcsIHBybmdfaWR4LCBoYXNoX2lkeCwgbW9kbGVuLCBidWZbMV0sICZsMSkpOworICAgICAgRE8ocGtjc18xX3Bzc19kZWNvZGUoYnVmWzBdLCBsMywgYnVmWzFdLCBsMSwgc2FsdGxlbiwgaGFzaF9pZHgsIG1vZGxlbiwgJnJlczEpKTsKKyAgICAgIAorICAgICAgYnVmWzBdW2kxID0gYWJzKHJhbmQoKSkgJSBsM10gXj0gMTsKKyAgICAgIERPKHBrY3NfMV9wc3NfZGVjb2RlKGJ1ZlswXSwgbDMsIGJ1ZlsxXSwgbDEsIHNhbHRsZW4sIGhhc2hfaWR4LCBtb2RsZW4sICZyZXMyKSk7CisKKyAgICAgIGJ1ZlswXVtpMV0gXj0gMTsKKyAgICAgIGJ1ZlsxXVtpMiA9IGFicyhyYW5kKCkpICUgbDFdIF49IDE7CisgICAgICBETyhwa2NzXzFfcHNzX2RlY29kZShidWZbMF0sIGwzLCBidWZbMV0sIGwxLCBzYWx0bGVuLCBoYXNoX2lkeCwgbW9kbGVuLCAmcmVzMykpOworCisgICAgICBpZiAoIShyZXMxID09IDEgJiYgcmVzMiA9PSAwICYmIHJlczMgPT0gMCkpIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUFNTIGZhaWxlZDogJWQsICVkLCAlZCwgJWx1LCAlbHVcbiIsIHJlczEsIHJlczIsIHJlczMsIGwzLCBzYWx0bGVuKTsKKyAgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgfQorICAgcmV0dXJuIDA7Cit9CisKKyNlbHNlCisKK2ludCBwa2NzXzFfdGVzdCh2b2lkKQoreworICAgZnByaW50ZihzdGRlcnIsICJOT1AiKTsKKyAgIHJldHVybiAwOworfQorCisjZW5kaWYKKworCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC90ZXN0cHJvZi9wa2NzXzFfdGVzdC5jLHYgJCAqLworLyogJFJldmlzaW9uOiAxLjYgJCAqLworLyogJERhdGU6IDIwMDUvMDUvMjEgMTI6NTE6MjUgJCAqLwpkaWZmIC0tZ2l0IGEvdGVzdHByb2YvcnNhX3Rlc3QuYyBiL3Rlc3Rwcm9mL3JzYV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhY2RjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rwcm9mL3JzYV90ZXN0LmMKQEAgLTAsMCArMSwzMzggQEAKKyNpbmNsdWRlIDx0b21jcnlwdF90ZXN0Lmg+CisKKyNpZmRlZiBNUlNBIAorCisjZGVmaW5lIFJTQV9NU0dTSVpFIDc4CisKKy8qIFRoZXNlIGFyZSB0ZXN0IGtleXMgW3NlZSBmaWxlIHRlc3Qua2V5XSB0aGF0IEkgdXNlIHRvIHRlc3QgbXkgaW1wb3J0L2V4cG9ydCBhZ2FpbnN0ICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvcGVuc3NsX3ByaXZhdGVfcnNhW10gPSB7CisgICAweDMwLCAweDgyLCAweDAyLCAweDVlLCAweDAyLCAweDAxLCAweDAwLCAweDAyLCAweDgxLCAweDgxLCAweDAwLCAweGNmLCAweDlhLCAweGRlLCAweDY0LCAweDhhLCAKKyAgIDB4ZGEsIDB4YzgsIDB4MzMsIDB4MjAsIDB4YTksIDB4ZDcsIDB4ODMsIDB4MzEsIDB4MTksIDB4NTQsIDB4YjIsIDB4OWEsIDB4ODUsIDB4YTcsIDB4YTEsIDB4YjcsIAorICAgMHg3NSwgMHgzMywgMHhiNiwgMHhhOSwgMHhhYywgMHg4NCwgMHgyNCwgMHhiMywgMHhkZSwgMHhkYiwgMHg3ZCwgMHg4NSwgMHgyZCwgMHg5NiwgMHg2NSwgMHhlNSwgCisgICAweDNmLCAweDcyLCAweDk1LCAweDI0LCAweDlmLCAweDI4LCAweDY4LCAweGNhLCAweDRmLCAweGRiLCAweDQ0LCAweDFjLCAweDNlLCAweDYwLCAweDEyLCAweDhhLCAKKyAgIDB4ZGQsIDB4MjYsIDB4YTUsIDB4ZWIsIDB4ZmYsIDB4MGIsIDB4NWUsIDB4ZDQsIDB4ODgsIDB4MzgsIDB4NDksIDB4MmEsIDB4NmUsIDB4NWIsIDB4YmYsIDB4MTIsIAorICAgMHgzNywgMHg0NywgMHhiZCwgMHgwNSwgMHg2YiwgMHhiYywgMHhkYiwgMHhmMywgMHhlZSwgMHhlNCwgMHgxMSwgMHg4ZSwgMHg0MSwgMHg2OCwgMHg3YywgMHg2MSwgCisgICAweDEzLCAweGQ3LCAweDQyLCAweGM4LCAweDgwLCAweGJlLCAweDM2LCAweDhmLCAweGRjLCAweDA4LCAweDhiLCAweDRmLCAweGFjLCAweGE0LCAweGUyLCAweDc2LCAKKyAgIDB4MGMsIDB4YzksIDB4NjMsIDB4NmMsIDB4NDksIDB4NTgsIDB4OTMsIDB4ZWQsIDB4Y2MsIDB4YWEsIDB4ZGMsIDB4MjUsIDB4M2IsIDB4MGEsIDB4NjAsIDB4M2YsIAorICAgMHg4YiwgMHg1NCwgMHgzYSwgMHhjMywgMHg0ZCwgMHgzMSwgMHhlNywgMHg5NCwgMHhhNCwgMHg0NCwgMHhmZCwgMHgwMiwgMHgwMywgMHgwMSwgMHgwMCwgMHgwMSwgCisgICAweDAyLCAweDgxLCAweDgxLCAweDAwLCAweGM4LCAweDYyLCAweGI5LCAweGVhLCAweGRlLCAweDQ0LCAweDUzLCAweDFkLCAweDU2LCAweDk3LCAweGQ5LCAweDk3LCAKKyAgIDB4OWUsIDB4MWEsIDB4Y2YsIDB4MzAsIDB4MWUsIDB4MGEsIDB4ODgsIDB4NDUsIDB4ODYsIDB4MjksIDB4MzAsIDB4YTMsIDB4NGQsIDB4OWYsIDB4NjEsIDB4NjUsIAorICAgMHg3MywgMHhlMCwgMHhkNiwgMHg4NywgMHg4ZiwgMHhiNiwgMHhmMywgMHgwNiwgMHhhMywgMHg4MiwgMHhkYywgMHg3YywgMHhhYywgMHhmZSwgMHg5YiwgMHgyOCwgCisgICAweDlhLCAweGFlLCAweGZkLCAweGZiLCAweGZlLCAweDJmLCAweDBlLCAweGQ4LCAweDk3LCAweDA0LCAweGUzLCAweGJiLCAweDFmLCAweGQxLCAweGVjLCAweDBkLCAKKyAgIDB4YmEsIDB4YTMsIDB4NDksIDB4N2YsIDB4NDcsIDB4YWMsIDB4OGEsIDB4NDQsIDB4MDQsIDB4N2UsIDB4ODYsIDB4YjcsIDB4MzksIDB4NDIsIDB4M2YsIDB4YWQsIAorICAgMHgxZSwgMHhiNywgMHgwZSwgMHhhNSwgMHg1MSwgMHhmNCwgMHg0MCwgMHg2MywgMHgxZSwgMHhmZCwgMHhiZCwgMHhlYSwgMHg5ZiwgMHg0MSwgMHg5ZiwgMHhhOCwgCisgICAweDkwLCAweDFkLCAweDZmLCAweDBhLCAweDVhLCAweDk1LCAweDEzLCAweDExLCAweDBkLCAweDgwLCAweGFmLCAweDVmLCAweDY0LCAweDk4LCAweDhhLCAweDJjLCAKKyAgIDB4NzgsIDB4NjgsIDB4NjUsIDB4YjAsIDB4MmIsIDB4OGIsIDB4YTIsIDB4NTMsIDB4ODcsIDB4Y2EsIDB4ZjEsIDB4NjQsIDB4MDQsIDB4YWIsIDB4ZjIsIDB4N2IsIAorICAgMHhkYiwgMHg4MywgMHhjOCwgMHg4MSwgMHgwMiwgMHg0MSwgMHgwMCwgMHhmNywgMHhiZSwgMHg1ZSwgMHgyMywgMHhjMywgMHgzMiwgMHgzZiwgMHhiZiwgMHg4YiwgCisgICAweDhlLCAweDNhLCAweGVlLCAweGZjLCAweGZjLCAweGNiLCAweGU1LCAweGY3LCAweGYxLCAweDBiLCAweGJjLCAweDQyLCAweDgyLCAweGFlLCAweGQ1LCAweDdhLCAKKyAgIDB4M2UsIDB4Y2EsIDB4ZjcsIDB4ZDUsIDB4NjksIDB4M2YsIDB4NjQsIDB4MjUsIDB4YTIsIDB4MWYsIDB4YjcsIDB4NzUsIDB4NzUsIDB4MDUsIDB4OTIsIDB4NDIsIAorICAgMHhlYiwgMHhiOCwgMHhmMSwgMHhmMywgMHgwYSwgMHgwNSwgMHhlMywgMHg5NCwgMHhkMSwgMHg1NSwgMHg3OCwgMHgzNSwgMHhhMCwgMHgzNiwgMHhhMCwgMHg5YiwgCisgICAweDdjLCAweDkyLCAweDg0LCAweDZjLCAweGRkLCAweGRjLCAweDRkLCAweDAyLCAweDQxLCAweDAwLCAweGQ2LCAweDg2LCAweDBlLCAweDg1LCAweDQyLCAweDBiLCAKKyAgIDB4MDQsIDB4MDgsIDB4ODQsIDB4MjEsIDB4NjAsIDB4ZjAsIDB4MGUsIDB4MGQsIDB4ODgsIDB4ZmQsIDB4MWUsIDB4MzYsIDB4MTAsIDB4NjUsIDB4NGYsIDB4MWUsIAorICAgMHg1MywgMHhiNCwgMHgwOCwgMHg3MiwgMHg4MCwgMHg1YywgMHgzZiwgMHg1OSwgMHg2NiwgMHgxNywgMHhlNiwgMHg5OCwgMHhmMiwgMHhlOSwgMHg2YywgMHg3YSwgCisgICAweDA2LCAweDRjLCAweGFjLCAweDc2LCAweDNkLCAweGVkLCAweDhjLCAweGExLCAweGNlLCAweGFkLCAweDFiLCAweGJkLCAweGI0LCAweDdkLCAweDI4LCAweGJjLCAKKyAgIDB4ZTMsIDB4MGUsIDB4MzgsIDB4OGQsIDB4OTksIDB4ZDgsIDB4MDUsIDB4YjUsIDB4YTMsIDB4NzEsIDB4MDIsIDB4NDAsIDB4NmQsIDB4ZWIsIDB4YzMsIDB4MmQsIAorICAgMHgyZSwgMHhmMCwgMHg1ZSwgMHhhNCwgMHg4OCwgMHgzMSwgMHgwNSwgMHgyOSwgMHgwMCwgMHg4YSwgMHhkMSwgMHg5NSwgMHgyOSwgMHg5YiwgMHg4MywgMHhjZiwgCisgICAweDc1LCAweGRiLCAweDMxLCAweGUzLCAweDdhLCAweDI3LCAweGRlLCAweDNhLCAweDc0LCAweDMwLCAweDBjLCAweDc2LCAweDRjLCAweGQ0LCAweDUwLCAweDJhLCAKKyAgIDB4NDAsIDB4MmQsIDB4MzksIDB4ZDksIDB4OTksIDB4NjMsIDB4YTksIDB4NWQsIDB4ODAsIDB4YWUsIDB4NTMsIDB4Y2EsIDB4OTQsIDB4M2YsIDB4MDUsIDB4MjMsIAorICAgMHgxZSwgMHhmOCwgMHgwNSwgMHgwNCwgMHhlMSwgMHhiOCwgMHgzNSwgMHhmMiwgMHgxNywgMHhiMywgMHhhMCwgMHg4OSwgMHgwMiwgMHg0MSwgMHgwMCwgMHhhYiwgCisgICAweDkwLCAweDg4LCAweGZhLCAweDYwLCAweDA4LCAweDI5LCAweDUwLCAweDlhLCAweDQzLCAweDhiLCAweGEwLCAweDUwLCAweGNjLCAweGQ4LCAweDVhLCAweGZlLCAKKyAgIDB4OTcsIDB4NjQsIDB4NjMsIDB4NzEsIDB4NzQsIDB4MjIsIDB4YTMsIDB4MjAsIDB4MDIsIDB4NWEsIDB4Y2YsIDB4ZWIsIDB4YzYsIDB4MTYsIDB4OTUsIDB4NTQsIAorICAgMHhkMSwgMHhjYiwgMHhhYiwgMHg4ZCwgMHgxYSwgMHhjNiwgMHgwMCwgMHhmYSwgMHgwOCwgMHg5MiwgMHg5YywgMHg3MSwgMHhkNSwgMHg1MiwgMHg1MiwgMHgzNSwgCisgICAweDk2LCAweDcxLCAweDRiLCAweDhiLCAweDkyLCAweDBjLCAweGQwLCAweGU5LCAweGJmLCAweGFkLCAweDYzLCAweDBiLCAweGE1LCAweGU5LCAweGIxLCAweDAyLCAKKyAgIDB4NDEsIDB4MDAsIDB4ZGMsIDB4Y2MsIDB4MjcsIDB4YzgsIDB4ZTQsIDB4ZGMsIDB4NjIsIDB4NDgsIDB4ZDUsIDB4OWIsIDB4YWYsIDB4ZjUsIDB4YWIsIDB4NjAsIAorICAgMHhmNiwgMHgyMSwgMHhmZCwgMHg1MywgMHhlMiwgMHhiNywgMHg1ZCwgMHgwOSwgMHhjOSwgMHgxYSwgMHhhMSwgMHgwNCwgMHhhOSwgMHhmYywgMHg2MSwgMHgyYywgCisgICAweDVkLCAweDA0LCAweDU4LCAweDNhLCAweDVhLCAweDM5LCAweGYxLCAweDRhLCAweDIxLCAweDU2LCAweDY3LCAweGZkLCAweGNjLCAweDIwLCAweGEzLCAweDhmLCAKKyAgIDB4NzgsIDB4MTgsIDB4NWEsIDB4NzksIDB4M2QsIDB4MmUsIDB4OGUsIDB4N2UsIDB4ODYsIDB4MGEsIDB4ZTYsIDB4YTgsIDB4MzMsIDB4YzEsIDB4MDQsIDB4MTcsIAorICAgMHg0YSwgMHg5ZiwgIH07CisKKworLyoqKiBOT1RFOiAgT3BlblNTTCBzZWVtcyB0byBoYXZlIG1vcmUgdG8gdGhlaXIgcHVibGljIGtleSBmb3JtYXQuICBJJ3ZlIHN0cmlwcGVkIHRoZSBleHRyYSBoZWFkZXJzLi4uICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvcGVuc3NsX3B1YmxpY19yc2FbXSA9IHsKKyAgIDB4MzAsIDB4ODEsIDB4ODksIDB4MDIsIDB4ODEsIDB4ODEsIDB4MDAsIDB4Y2YsIDB4OWEsIDB4ZGUsIAorICAgMHg2NCwgMHg4YSwgMHhkYSwgMHhjOCwgMHgzMywgMHgyMCwgMHhhOSwgMHhkNywgMHg4MywgMHgzMSwgMHgxOSwgMHg1NCwgMHhiMiwgMHg5YSwgMHg4NSwgMHhhNywgCisgICAweGExLCAweGI3LCAweDc1LCAweDMzLCAweGI2LCAweGE5LCAweGFjLCAweDg0LCAweDI0LCAweGIzLCAweGRlLCAweGRiLCAweDdkLCAweDg1LCAweDJkLCAweDk2LCAKKyAgIDB4NjUsIDB4ZTUsIDB4M2YsIDB4NzIsIDB4OTUsIDB4MjQsIDB4OWYsIDB4MjgsIDB4NjgsIDB4Y2EsIDB4NGYsIDB4ZGIsIDB4NDQsIDB4MWMsIDB4M2UsIDB4NjAsIAorICAgMHgxMiwgMHg4YSwgMHhkZCwgMHgyNiwgMHhhNSwgMHhlYiwgMHhmZiwgMHgwYiwgMHg1ZSwgMHhkNCwgMHg4OCwgMHgzOCwgMHg0OSwgMHgyYSwgMHg2ZSwgMHg1YiwgCisgICAweGJmLCAweDEyLCAweDM3LCAweDQ3LCAweGJkLCAweDA1LCAweDZiLCAweGJjLCAweGRiLCAweGYzLCAweGVlLCAweGU0LCAweDExLCAweDhlLCAweDQxLCAweDY4LCAKKyAgIDB4N2MsIDB4NjEsIDB4MTMsIDB4ZDcsIDB4NDIsIDB4YzgsIDB4ODAsIDB4YmUsIDB4MzYsIDB4OGYsIDB4ZGMsIDB4MDgsIDB4OGIsIDB4NGYsIDB4YWMsIDB4YTQsIAorICAgMHhlMiwgMHg3NiwgMHgwYywgMHhjOSwgMHg2MywgMHg2YywgMHg0OSwgMHg1OCwgMHg5MywgMHhlZCwgMHhjYywgMHhhYSwgMHhkYywgMHgyNSwgMHgzYiwgMHgwYSwgCisgICAweDYwLCAweDNmLCAweDhiLCAweDU0LCAweDNhLCAweGMzLCAweDRkLCAweDMxLCAweGU3LCAweDk0LCAweGE0LCAweDQ0LCAweGZkLCAweDAyLCAweDAzLCAweDAxLCAKKyAgIDB4MDAsIDB4MDEsICB9OworCitzdGF0aWMgaW50IHJzYV9jb21wYXRfdGVzdCh2b2lkKQoreworICAgcnNhX2tleSBrZXk7CisgICB1bnNpZ25lZCBjaGFyIGJ1ZlsxMDI0XTsKKyAgIHVuc2lnbmVkIGxvbmcgbGVuOworCisgICAvKiB0cnkgcmVhZGluZyB0aGUga2V5ICovCisgICBETyhyc2FfaW1wb3J0KG9wZW5zc2xfcHJpdmF0ZV9yc2EsIHNpemVvZihvcGVuc3NsX3ByaXZhdGVfcnNhKSwgJmtleSkpOworCisgICAvKiBub3cgdHJ5IHRvIGV4cG9ydCBwcml2YXRlL3B1YmxpYyBhbmQgY29tcGFyZSAqLworICAgbGVuID0gc2l6ZW9mKGJ1Zik7CisgICBETyhyc2FfZXhwb3J0KGJ1ZiwgJmxlbiwgUEtfUFJJVkFURSwgJmtleSkpOworICAgaWYgKGxlbiAhPSBzaXplb2Yob3BlbnNzbF9wcml2YXRlX3JzYSkgfHwgbWVtY21wKGJ1Ziwgb3BlbnNzbF9wcml2YXRlX3JzYSwgbGVuKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJSU0EgcHJpdmF0ZSBleHBvcnQgZmFpbGVkIHRvIG1hdGNoIE9wZW5TU0wgb3V0cHV0LCAlbHUsICVsdVxuIiwgbGVuLCBzaXplb2Yob3BlbnNzbF9wcml2YXRlX3JzYSkpOworCisKK3sKK2ludCB4OworcHJpbnRmKCJcblxuIik7Citmb3IgKHggPSAwOyB4IDwgbGVuOyApIHsgaWYgKGJ1Zlt4XSA9PSBvcGVuc3NsX3ByaXZhdGVfcnNhW3hdKSBwcmludGYoIi0tICIpOyBlbHNlIHByaW50ZigiJTAyeCAiLCBidWZbeF1eb3BlbnNzbF9wcml2YXRlX3JzYVt4XSk7IGlmICghKCsreCAmIDE1KSkgcHJpbnRmKCJcbiIpOyB9Cit9CitwcmludGYoIlxuXG4iKTsKKworICAgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIGxlbiA9IHNpemVvZihidWYpOworICAgRE8ocnNhX2V4cG9ydChidWYsICZsZW4sIFBLX1BVQkxJQywgJmtleSkpOworICAgaWYgKGxlbiAhPSBzaXplb2Yob3BlbnNzbF9wdWJsaWNfcnNhKSB8fCBtZW1jbXAoYnVmLCBvcGVuc3NsX3B1YmxpY19yc2EsIGxlbikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBKHByaXZhdGUpIHB1YmxpYyBleHBvcnQgZmFpbGVkIHRvIG1hdGNoIE9wZW5TU0wgb3V0cHV0XG4iKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgcnNhX2ZyZWUoJmtleSk7CisKKyAgIC8qIHRyeSByZWFkaW5nIHRoZSBwdWJsaWMga2V5ICovCisgICBETyhyc2FfaW1wb3J0KG9wZW5zc2xfcHVibGljX3JzYSwgc2l6ZW9mKG9wZW5zc2xfcHVibGljX3JzYSksICZrZXkpKTsKKyAgIGxlbiA9IHNpemVvZihidWYpOworICAgRE8ocnNhX2V4cG9ydChidWYsICZsZW4sIFBLX1BVQkxJQywgJmtleSkpOworICAgaWYgKGxlbiAhPSBzaXplb2Yob3BlbnNzbF9wdWJsaWNfcnNhKSB8fCBtZW1jbXAoYnVmLCBvcGVuc3NsX3B1YmxpY19yc2EsIGxlbikpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUlNBKHB1YmxpYykgcHVibGljIGV4cG9ydCBmYWlsZWQgdG8gbWF0Y2ggT3BlblNTTCBvdXRwdXRcbiIpOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICByc2FfZnJlZSgma2V5KTsKKworICAgcmV0dXJuIDA7Cit9ICAgCisKK2ludCByc2FfdGVzdCh2b2lkKQoreworICAgdW5zaWduZWQgY2hhciBpblsxMDI0XSwgb3V0WzEwMjRdLCB0bXBbMTAyNF07CisgICByc2Ffa2V5ICAgICAgIGtleSwgcHJpdktleSwgcHViS2V5OworICAgaW50ICAgICAgICAgICBoYXNoX2lkeCwgcHJuZ19pZHgsIHN0YXQsIHN0YXQyOworICAgdW5zaWduZWQgbG9uZyByc2FfbXNnc2l6ZSwgbGVuLCBsZW4yLCBjbnQ7CisgICBzdGF0aWMgdW5zaWduZWQgY2hhciBscGFyYW1bXSA9IHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCB9OworCisgICBpZiAocnNhX2NvbXBhdF90ZXN0KCkgIT0gMCkgeworICAgICAgcmV0dXJuIDE7CisgICB9CisgICAgICAKKyAgIGhhc2hfaWR4ID0gZmluZF9oYXNoKCJzaGExIik7CisgICBwcm5nX2lkeCA9IGZpbmRfcHJuZygieWFycm93Iik7CisgICBpZiAoaGFzaF9pZHggPT0gLTEgfHwgcHJuZ19pZHggPT0gLTEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAicnNhX3Rlc3QgcmVxdWlyZXMgU0hBMSBhbmQgeWFycm93Iik7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIAorICAgLyogbWFrZSAxMCByYW5kb20ga2V5ICovCisgICBmb3IgKGNudCA9IDA7IGNudCA8IDEwOyBjbnQrKykgeworICAgICAgRE8ocnNhX21ha2Vfa2V5KCZ5YXJyb3dfcHJuZywgcHJuZ19pZHgsIDEwMjQvOCwgNjU1MzcsICZrZXkpKTsKKyAgICAgIGlmIChtcF9jb3VudF9iaXRzKCZrZXkuTikgIT0gMTAyNCkgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyc2FfMTAyNCBrZXkgbW9kdWx1cyBoYXMgJWQgYml0c1xuIiwgbXBfY291bnRfYml0cygma2V5Lk4pKTsKKworbGVuID0gbXBfdW5zaWduZWRfYmluX3NpemUoJmtleS5OKTsKK21wX3RvX3Vuc2lnbmVkX2Jpbigma2V5Lk4sIHRtcCk7CisgZnByaW50ZihzdGRlcnIsICJOID09IFxuIik7Citmb3IgKGNudCA9IDA7IGNudCA8IGxlbjsgKSB7CisgICBmcHJpbnRmKHN0ZGVyciwgIiUwMnggIiwgdG1wW2NudF0pOworICAgaWYgKCEoKytjbnQgJiAxNSkpIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworbGVuID0gbXBfdW5zaWduZWRfYmluX3NpemUoJmtleS5wKTsKK21wX3RvX3Vuc2lnbmVkX2Jpbigma2V5LnAsIHRtcCk7CisgZnByaW50ZihzdGRlcnIsICJwID09IFxuIik7Citmb3IgKGNudCA9IDA7IGNudCA8IGxlbjsgKSB7CisgICBmcHJpbnRmKHN0ZGVyciwgIiUwMnggIiwgdG1wW2NudF0pOworICAgaWYgKCEoKytjbnQgJiAxNSkpIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworbGVuID0gbXBfdW5zaWduZWRfYmluX3NpemUoJmtleS5xKTsKK21wX3RvX3Vuc2lnbmVkX2Jpbigma2V5LnEsIHRtcCk7CisgZnByaW50ZihzdGRlcnIsICJcbnEgPT0gXG4iKTsKK2ZvciAoY250ID0gMDsgY250IDwgbGVuOyApIHsKKyAgIGZwcmludGYoc3RkZXJyLCAiJTAyeCAiLCB0bXBbY250XSk7CisgICBpZiAoISgrK2NudCAmIDE1KSkgZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKworCisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGlmIChjbnQgIT0gOSkgeworICAgICAgICAgcnNhX2ZyZWUoJmtleSk7CisgICAgICB9CisgICB9CisgICAgCisgICAvKiBlbmNyeXB0IHRoZSBrZXkgKHdpdGhvdXQgbHBhcmFtKSAqLworICAgZm9yIChjbnQgPSAwOyBjbnQgPCA0OyBjbnQrKykgeworICAgZm9yIChyc2FfbXNnc2l6ZSA9IDE7IHJzYV9tc2dzaXplIDw9IDg2OyByc2FfbXNnc2l6ZSsrKSB7CisgICAgICAvKiBtYWtlIGEgcmFuZG9tIGtleS9tc2cgKi8KKyAgICAgIHlhcnJvd19yZWFkKGluLCByc2FfbXNnc2l6ZSwgJnlhcnJvd19wcm5nKTsKKworICAgICAgbGVuICA9IHNpemVvZihvdXQpOworICAgICAgbGVuMiA9IHJzYV9tc2dzaXplOworICAgCisgICAgICBETyhyc2FfZW5jcnlwdF9rZXkoaW4sIHJzYV9tc2dzaXplLCBvdXQsICZsZW4sIE5VTEwsIDAsICZ5YXJyb3dfcHJuZywgcHJuZ19pZHgsIGhhc2hfaWR4LCAma2V5KSk7CisgICAgICAvKiBjaGFuZ2UgYSBieXRlICovCisgICAgICBvdXRbOF0gXj0gMTsKKyAgICAgIERPKHJzYV9kZWNyeXB0X2tleShvdXQsIGxlbiwgdG1wLCAmbGVuMiwgTlVMTCwgMCwgaGFzaF9pZHgsICZzdGF0MiwgJmtleSkpOworICAgICAgLyogY2hhbmdlIGEgYnl0ZSBiYWNrICovCisgICAgICBvdXRbOF0gXj0gMTsKKyAgICAgIGlmIChsZW4yICE9IHJzYV9tc2dzaXplKSB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxucnNhX2RlY3J5cHRfa2V5IG1pc21hdGNoIGxlbiAlbHUgKGZpcnN0IGRlY3J5cHQpIiwgbGVuMik7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgbGVuMiA9IHJzYV9tc2dzaXplOworICAgICAgRE8ocnNhX2RlY3J5cHRfa2V5KG91dCwgbGVuLCB0bXAsICZsZW4yLCBOVUxMLCAwLCBoYXNoX2lkeCwgJnN0YXQsICZrZXkpKTsKKyAgICAgIGlmICghKHN0YXQgPT0gMSAmJiBzdGF0MiA9PSAwKSkgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJyc2FfZGVjcnlwdF9rZXkgZmFpbGVkIik7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIGlmIChsZW4yICE9IHJzYV9tc2dzaXplIHx8IG1lbWNtcCh0bXAsIGluLCByc2FfbXNnc2l6ZSkpIHsKKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5yc2FfZGVjcnlwdF9rZXkgbWlzbWF0Y2gsIGxlbiAlbHUgKHNlY29uZCBkZWNyeXB0KVxuIiwgbGVuMik7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk9yaWdpbmFsIGNvbnRlbnRzOiBcbiIpOyAKKyAgICAgICAgIGZvciAoeCA9IDA7IHggPCByc2FfbXNnc2l6ZTsgKSB7CisgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlMDJ4ICIsIGluW3hdKTsKKyAgICAgICAgICAgICBpZiAoISgrK3ggJSAxNikpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgY29udGVudHM6IFxuIik7IAorICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHJzYV9tc2dzaXplOyApIHsKKyAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUwMnggIiwgb3V0W3hdKTsKKyAgICAgICAgICAgICBpZiAoISgrK3ggJSAxNikpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICAgICAgICAgfQorICAgICAgICAgfSAgICAgCisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgIH0KKyAgIH0KKworICAgLyogZW5jcnlwdCB0aGUga2V5ICh3aXRoIGxwYXJhbSkgKi8KKyAgIGZvciAocnNhX21zZ3NpemUgPSAxOyByc2FfbXNnc2l6ZSA8PSA4NjsgcnNhX21zZ3NpemUrKykgeworICAgICAgbGVuICA9IHNpemVvZihvdXQpOworICAgICAgbGVuMiA9IHJzYV9tc2dzaXplOworICAgICAgRE8ocnNhX2VuY3J5cHRfa2V5KGluLCByc2FfbXNnc2l6ZSwgb3V0LCAmbGVuLCBscGFyYW0sIHNpemVvZihscGFyYW0pLCAmeWFycm93X3BybmcsIHBybmdfaWR4LCBoYXNoX2lkeCwgJmtleSkpOworICAgICAgLyogY2hhbmdlIGEgYnl0ZSAqLworICAgICAgb3V0WzhdIF49IDE7CisgICAgICBETyhyc2FfZGVjcnlwdF9rZXkob3V0LCBsZW4sIHRtcCwgJmxlbjIsIGxwYXJhbSwgc2l6ZW9mKGxwYXJhbSksIGhhc2hfaWR4LCAmc3RhdDIsICZrZXkpKTsKKyAgICAgIGlmIChsZW4yICE9IHJzYV9tc2dzaXplKSB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxucnNhX2RlY3J5cHRfa2V5IG1pc21hdGNoIGxlbiAlbHUgKGZpcnN0IGRlY3J5cHQpIiwgbGVuMik7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIC8qIGNoYW5nZSBhIGJ5dGUgYmFjayAqLworICAgICAgb3V0WzhdIF49IDE7CisKKyAgICAgIGxlbjIgPSByc2FfbXNnc2l6ZTsKKyAgICAgIERPKHJzYV9kZWNyeXB0X2tleShvdXQsIGxlbiwgdG1wLCAmbGVuMiwgbHBhcmFtLCBzaXplb2YobHBhcmFtKSwgaGFzaF9pZHgsICZzdGF0LCAma2V5KSk7CisgICAgICBpZiAoIShzdGF0ID09IDEgJiYgc3RhdDIgPT0gMCkpIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAicnNhX2RlY3J5cHRfa2V5IGZhaWxlZCIpOworICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgICBpZiAobGVuMiAhPSByc2FfbXNnc2l6ZSB8fCBtZW1jbXAodG1wLCBpbiwgcnNhX21zZ3NpemUpKSB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInJzYV9kZWNyeXB0X2tleSBtaXNtYXRjaCBsZW4gJWx1IiwgbGVuMik7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgIH0KKworICAgLyogc2lnbiBhIG1lc3NhZ2UgKHVuc2FsdGVkLCBsb3dlciBjaG9sZXN0b3JvbCBhbmQgQXRraW5zIGFwcHJvdmVkKSBub3cgKi8KKyAgIGxlbiA9IHNpemVvZihvdXQpOworICAgRE8ocnNhX3NpZ25faGFzaChpbiwgMjAsIG91dCwgJmxlbiwgJnlhcnJvd19wcm5nLCBwcm5nX2lkeCwgaGFzaF9pZHgsIDAsICZrZXkpKTsKKworLyogZXhwb3J0IGtleSBhbmQgaW1wb3J0IGFzIGJvdGggcHJpdmF0ZSBhbmQgcHVibGljICovCisgICBsZW4yID0gc2l6ZW9mKHRtcCk7CisgICBETyhyc2FfZXhwb3J0KHRtcCwgJmxlbjIsIFBLX1BSSVZBVEUsICZrZXkpKTsgCisgICBETyhyc2FfaW1wb3J0KHRtcCwgbGVuMiwgJnByaXZLZXkpKTsgCisgICBsZW4yID0gc2l6ZW9mKHRtcCk7CisgICBETyhyc2FfZXhwb3J0KHRtcCwgJmxlbjIsIFBLX1BVQkxJQywgJmtleSkpOworICAgRE8ocnNhX2ltcG9ydCh0bXAsIGxlbjIsICZwdWJLZXkpKTsKKworICAgLyogdmVyaWZ5IHdpdGggb3JpZ2luYWwgKi8KKyAgIERPKHJzYV92ZXJpZnlfaGFzaChvdXQsIGxlbiwgaW4sIDIwLCBoYXNoX2lkeCwgMCwgJnN0YXQsICZrZXkpKTsKKyAgIC8qIGNoYW5nZSBhIGJ5dGUgKi8KKyAgIGluWzBdIF49IDE7CisgICBETyhyc2FfdmVyaWZ5X2hhc2gob3V0LCBsZW4sIGluLCAyMCwgaGFzaF9pZHgsIDAsICZzdGF0MiwgJmtleSkpOworICAgCisgICBpZiAoIShzdGF0ID09IDEgJiYgc3RhdDIgPT0gMCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAicnNhX3ZlcmlmeV9oYXNoICh1bnNhbHRlZCwgb3JpZ0tleSkgZmFpbGVkLCAlZCwgJWQiLCBzdGF0LCBzdGF0Mik7CisgICAgICByc2FfZnJlZSgma2V5KTsKKyAgICAgIHJzYV9mcmVlKCZwdWJLZXkpOworICAgICAgcnNhX2ZyZWUoJnByaXZLZXkpOworICAgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIC8qIHZlcmlmeSB3aXRoIHByaXZLZXkgKi8KKyAgIC8qIGNoYW5nZSBhIGJ5dGUgKi8KKyAgIGluWzBdIF49IDE7CisgICBETyhyc2FfdmVyaWZ5X2hhc2gob3V0LCBsZW4sIGluLCAyMCwgaGFzaF9pZHgsIDAsICZzdGF0LCAmcHJpdktleSkpOworICAgLyogY2hhbmdlIGEgYnl0ZSAqLworICAgaW5bMF0gXj0gMTsKKyAgIERPKHJzYV92ZXJpZnlfaGFzaChvdXQsIGxlbiwgaW4sIDIwLCBoYXNoX2lkeCwgMCwgJnN0YXQyLCAmcHJpdktleSkpOworICAgCisgICBpZiAoIShzdGF0ID09IDEgJiYgc3RhdDIgPT0gMCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAicnNhX3ZlcmlmeV9oYXNoICh1bnNhbHRlZCwgcHJpdktleSkgZmFpbGVkLCAlZCwgJWQiLCBzdGF0LCBzdGF0Mik7CisgICAgICByc2FfZnJlZSgma2V5KTsKKyAgICAgIHJzYV9mcmVlKCZwdWJLZXkpOworICAgICAgcnNhX2ZyZWUoJnByaXZLZXkpOworICAgICAgcmV0dXJuIDE7CisgICB9CisKKyAgIC8qIHZlcmlmeSB3aXRoIHB1YktleSAqLworICAgLyogY2hhbmdlIGEgYnl0ZSAqLworICAgaW5bMF0gXj0gMTsKKyAgIERPKHJzYV92ZXJpZnlfaGFzaChvdXQsIGxlbiwgaW4sIDIwLCBoYXNoX2lkeCwgMCwgJnN0YXQsICZwdWJLZXkpKTsKKyAgIC8qIGNoYW5nZSBhIGJ5dGUgKi8KKyAgIGluWzBdIF49IDE7CisgICBETyhyc2FfdmVyaWZ5X2hhc2gob3V0LCBsZW4sIGluLCAyMCwgaGFzaF9pZHgsIDAsICZzdGF0MiwgJnB1YktleSkpOworICAgCisgICBpZiAoIShzdGF0ID09IDEgJiYgc3RhdDIgPT0gMCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAicnNhX3ZlcmlmeV9oYXNoICh1bnNhbHRlZCwgcHVia2V5KSBmYWlsZWQsICVkLCAlZCIsIHN0YXQsIHN0YXQyKTsKKyAgICAgIHJzYV9mcmVlKCZrZXkpOworICAgICAgcnNhX2ZyZWUoJnB1YktleSk7CisgICAgICByc2FfZnJlZSgmcHJpdktleSk7CisgICAgICByZXR1cm4gMTsKKyAgIH0KKworICAgLyogc2lnbiBhIG1lc3NhZ2UgKHNhbHRlZCkgbm93ICh1c2UgcHJpdktleSB0byBtYWtlLCBwdWJLZXkgdG8gdmVyaWZ5KSAqLworICAgbGVuID0gc2l6ZW9mKG91dCk7CisgICBETyhyc2Ffc2lnbl9oYXNoKGluLCAyMCwgb3V0LCAmbGVuLCAmeWFycm93X3BybmcsIHBybmdfaWR4LCBoYXNoX2lkeCwgOCwgJnByaXZLZXkpKTsKKyAgIERPKHJzYV92ZXJpZnlfaGFzaChvdXQsIGxlbiwgaW4sIDIwLCBoYXNoX2lkeCwgOCwgJnN0YXQsICZwdWJLZXkpKTsKKyAgIC8qIGNoYW5nZSBhIGJ5dGUgKi8KKyAgIGluWzBdIF49IDE7CisgICBETyhyc2FfdmVyaWZ5X2hhc2gob3V0LCBsZW4sIGluLCAyMCwgaGFzaF9pZHgsIDgsICZzdGF0MiwgJnB1YktleSkpOworICAgCisgICBpZiAoIShzdGF0ID09IDEgJiYgc3RhdDIgPT0gMCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAicnNhX3ZlcmlmeV9oYXNoIChzYWx0ZWQpIGZhaWxlZCwgJWQsICVkIiwgc3RhdCwgc3RhdDIpOworICAgICAgcnNhX2ZyZWUoJmtleSk7CisgICAgICByc2FfZnJlZSgmcHViS2V5KTsKKyAgICAgIHJzYV9mcmVlKCZwcml2S2V5KTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgCisgICAvKiBmcmVlIHRoZSBrZXkgYW5kIHJldHVybiAqLworICAgcnNhX2ZyZWUoJmtleSk7CisgICByc2FfZnJlZSgmcHViS2V5KTsKKyAgIHJzYV9mcmVlKCZwcml2S2V5KTsKKyAgIHJldHVybiAwOworfQorCisjZWxzZQorCitpbnQgcnNhX3Rlc3Qodm9pZCkKK3sKKyAgIGZwcmludGYoc3RkZXJyLCAiTk9QIik7CisgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3Rlc3Rwcm9mL3JzYV90ZXN0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuMTAgJCAqLworLyogJERhdGU6IDIwMDUvMDYvMDMgMTk6MTg6MzMgJCAqLwpkaWZmIC0tZ2l0IGEvdGVzdHByb2Yvc3RvcmVfdGVzdC5jIGIvdGVzdHByb2Yvc3RvcmVfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMzhkNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cHJvZi9zdG9yZV90ZXN0LmMKQEAgLTAsMCArMSw3OCBAQAorI2luY2x1ZGUgPHRvbWNyeXB0X3Rlc3QuaD4KKworLyogVGVzdCBzdG9yZS9sb2FkIG1hY3JvcyB3aXRoIG9mZnNldHMgKi8KK2ludCBzdG9yZV90ZXN0KHZvaWQpCit7CisgIHVuc2lnbmVkIGNoYXIgYnVmWzI1Nl07CisgIGludCB5OworICB1bG9uZzMyIEwsIEwxOworICB1bG9uZzY0IExMLCBMTDE7CisjaWZkZWYgTFRDX0ZBU1QKKyAgaW50IHgsIHo7CisjZW5kaWYKKworICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKSB7CisgICAgICBMICA9IDB4MTIzNDU2NzhVTDsKKyAgICAgIEwxID0gMDsKKyAgICAgIFNUT1JFMzJMKEwsIGJ1ZiArIHkpOworICAgICAgTE9BRDMyTChMMSwgYnVmICsgeSk7CisgICAgICBpZiAoTDEgIT0gTCkgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbjMyTCBmYWlsZWQgYXQgb2Zmc2V0ICVkXG4iLCB5KTsKKyAgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgU1RPUkUzMkgoTCwgYnVmICsgeSk7CisgICAgICBMT0FEMzJIKEwxLCBidWYgKyB5KTsKKyAgICAgIGlmIChMMSAhPSBMKSB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuMzJIIGZhaWxlZCBhdCBvZmZzZXQgJWRcbiIsIHkpOworICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgIH0KKworICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICBMTCA9IENPTlNUNjQgKDB4MDEwMjAzMDQwNTA2MDcpOworICAgICAgTEwxID0gMDsKKyAgICAgIFNUT1JFNjRMKExMLCBidWYgKyB5KTsKKyAgICAgIExPQUQ2NEwoTEwxLCBidWYgKyB5KTsKKyAgICAgIGlmIChMTDEgIT0gTEwpIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG42NEwgZmFpbGVkIGF0IG9mZnNldCAlZFxuIiwgeSk7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIFNUT1JFNjRIKExMLCBidWYgKyB5KTsKKyAgICAgIExPQUQ2NEgoTEwxLCBidWYgKyB5KTsKKyAgICAgIGlmIChMTDEgIT0gTEwpIHsKKyAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG42NEggZmFpbGVkIGF0IG9mZnNldCAlZFxuIiwgeSk7CisgICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgfQorCisvKiB0ZXN0IExUQ19GQVNUICovCisjaWZkZWYgTFRDX0ZBU1QKKyAgeSA9IDE2OworCisgIGZvciAoeiA9IDA7IHogPCB5OyB6KyspIHsKKyAgICAgLyogZmlsbCB5IGJ5dGVzIHdpdGggcmFuZG9tICovCisgICAgIHlhcnJvd19yZWFkKGJ1Zit6LCAgIHksICZ5YXJyb3dfcHJuZyk7CisgICAgIHlhcnJvd19yZWFkKGJ1Zit6K3ksIHksICZ5YXJyb3dfcHJuZyk7CisKKyAgICAgLyogbm93IFhPUiBpdCBieXRlIGZvciBieXRlICovCisgICAgIGZvciAoeCA9IDA7IHggPCB5OyB4KyspIHsKKyAgICAgICAgIGJ1ZlsyKnkreit4XSA9IGJ1Zlt6K3hdIF4gYnVmW3oreSt4XTsKKyAgICAgfQorCisgICAgIC8qIG5vdyBYT1IgaXQgd29yZCBmb3Igd29yZCAqLworICAgICBmb3IgKHggPSAwOyB4IDwgeTsgeCArPSBzaXplb2YoTFRDX0ZBU1RfVFlQRSkpIHsKKyAgICAgICAgKigoTFRDX0ZBU1RfVFlQRSopKCZidWZbMyp5K3oreF0pKSA9ICooKExUQ19GQVNUX1RZUEUqKSgmYnVmW3oreF0pKSBeICooKExUQ19GQVNUX1RZUEUqKSgmYnVmW3oreSt4XSkpOworICAgICB9CisKKyAgICAgaWYgKG1lbWNtcCgmYnVmWzIqeSt6XSwgJmJ1ZlszKnkrel0sIHkpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5MVENfRkFTVCBmYWlsZWQgYXQgb2Zmc2V0ICVkXG4iLCB6KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgIH0KKyAgfQorI2VuZGlmCisgIHJldHVybiAwOworfQorCisvKiAkU291cmNlOiAvY3ZzL2xpYnRvbS9saWJ0b21jcnlwdC90ZXN0cHJvZi9zdG9yZV90ZXN0LmMsdiAkICovCisvKiAkUmV2aXNpb246IDEuNiAkICovCisvKiAkRGF0ZTogMjAwNS8wNS8wNSAxNDozNTo1OSAkICovCmRpZmYgLS1naXQgYS90ZXN0cHJvZi90ZXN0LmMgYi90ZXN0cHJvZi90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzODQyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rwcm9mL3Rlc3QuYwpAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSA8dG9tY3J5cHRfdGVzdC5oPgorCit2b2lkIHJ1bl9jbWQoaW50IHJlcywgaW50IGxpbmUsIGNoYXIgKmZpbGUsIGNoYXIgKmNtZCkKK3sKKyAgIGlmIChyZXMgIT0gQ1JZUFRfT0spIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgKCVkKVxuJXM6JWQ6JXNcbiIsIGVycm9yX3RvX3N0cmluZyhyZXMpLCByZXMsIGZpbGUsIGxpbmUsIGNtZCk7CisgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICB9Cit9CisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3Rlc3Rwcm9mL3Rlc3QuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS42ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3Rlc3Rwcm9mL3Rlc3Qua2V5IGIvdGVzdHByb2YvdGVzdC5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5OTZjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Rwcm9mL3Rlc3Qua2V5CkBAIC0wLDAgKzEsMTUgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUNYZ0lCQUFLQmdRRFBtdDVraXRySU15Q3AxNE14R1ZTeW1vV25vYmQxTTdhcHJJUWtzOTdiZllVdGxtWGwKK1AzS1ZKSjhvYU1wUDIwUWNQbUFTaXQwbXBldi9DMTdVaURoSkttNWJ2eEkzUjcwRmE3emI4KzdrRVk1QmFIeGgKK0U5ZEN5SUMrTm8vY0NJdFByS1RpZGd6SlkyeEpXSlB0ektyY0pUc0tZRCtMVkRyRFRUSG5sS1JFL1FJREFRQUIKK0FvR0JBTWhpdWVyZVJGTWRWcGZabDU0YXp6QWVDb2hGaGlrd28wMmZZV1Z6NE5hSGo3YnpCcU9DM0h5cy9wc28KK21xNzkrLzR2RHRpWEJPTzdIOUhzRGJxalNYOUhySXBFQkg2R3R6bENQNjBldHc2bFVmUkFZeDc5dmVxZlFaK28KK2tCMXZDbHFWRXhFTmdLOWZaSmlLTEhob1piQXJpNkpUaDhyeFpBU3I4bnZiZzhpQkFrRUE5NzVlSThNeVA3K0wKK2pqcnUvUHpMNWZmeEM3eENncTdWZWo3Szk5VnBQMlFsb2grM2RYVUZra0xydVBIekNnWGpsTkZWZURXZ05xQ2IKK2ZKS0ViTjNjVFFKQkFOYUdEb1ZDQ3dRSWhDRmc4QTROaVAwZU5oQmxUeDVUdEFoeWdGdy9XV1lYNXBqeTZXeDYKK0JreXNkajN0aktIT3JSdTl0SDBvdk9NT09JMloyQVcxbzNFQ1FHM3J3eTB1OEY2a2lERUZLUUNLMFpVcG00UFAKK2Rkc3g0M29uM2pwME1BeDJUTlJRS2tBdE9kbVpZNmxkZ0s1VHlwUS9CU01lK0FVRTRiZzE4aGV6b0lrQ1FRQ3IKK2tJajZZQWdwVUpwRGk2QlF6TmhhL3Bka1kzRjBJcU1nQWxyUDY4WVdsVlRSeTZ1TkdzWUErZ2lTbkhIVlVsSTEKK2xuRkxpNUlNME9tL3JXTUxwZW14QWtFQTNNd255T1RjWWtqVm02LzFxMkQySWYxVDRyZGRDY2thb1FTcC9HRXMKK1hRUllPbG81OFVvaFZtZjl6Q0NqajNnWVduazlMbzUraGdybXFEUEJCQmRLbnc9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Rwcm9mL3RvbWNyeXB0X3Rlc3QuaCBiL3Rlc3Rwcm9mL3RvbWNyeXB0X3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY2YmFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHByb2YvdG9tY3J5cHRfdGVzdC5oCkBAIC0wLDAgKzEsNzcgQEAKKworI2lmbmRlZiBfX1RFU1RfSF8KKyNkZWZpbmUgX19URVNUX0hfCisKKyNpbmNsdWRlIDx0b21jcnlwdC5oPgorCisvKiBlbmFibGUgc3RhY2sgdGVzdGluZyAqLworLy8gI2RlZmluZSBTVEFDS19URVNUCisKKy8qIHN0YWNrIHRlc3RpbmcsIGRlZmluZSB0aGlzIGlmIHN0YWNrIHVzYWdlIGdvZXMgZG93bndhcmRzIFtlLmcuIHg4Nl0gKi8KKyNkZWZpbmUgU1RBQ0tfRE9XTgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2hhciAqbmFtZSwgKnByb3YsICpyZXE7CisgICAgaW50ICAoKmVudHJ5KSh2b2lkKTsKK30gdGVzdF9lbnRyeTsKKworZXh0ZXJuIHBybmdfc3RhdGUgeWFycm93X3Bybmc7CisKK3ZvaWQgcnVuX2NtZChpbnQgcmVzLCBpbnQgbGluZSwgY2hhciAqZmlsZSwgY2hhciAqY21kKTsKKyNkZWZpbmUgRE8oeCkgeyBydW5fY21kKCh4KSwgX19MSU5FX18sIF9fRklMRV9fLCAjeCk7IH0KKworLyogVEVTVFMgKi8KK2ludCBjaXBoZXJfaGFzaF90ZXN0KHZvaWQpOworaW50IG1vZGVzX3Rlc3Qodm9pZCk7CitpbnQgbWFjX3Rlc3Qodm9pZCk7CitpbnQgcGtjc18xX3Rlc3Qodm9pZCk7CitpbnQgc3RvcmVfdGVzdCh2b2lkKTsKK2ludCByc2FfdGVzdCh2b2lkKTsKK2ludCBlY2NfdGVzdHModm9pZCk7CitpbnQgZHNhX3Rlc3Qodm9pZCk7CitpbnQgZGhfdGVzdHModm9pZCk7CitpbnQgZGVyX3Rlc3RzKHZvaWQpOworCisvKiB0aW1pbmcgKi8KKyNkZWZpbmUgS1RJTUVTICAyNQorI2RlZmluZSBUSU1FUyAgIDEwMDAwMAorCitleHRlcm4gc3RydWN0IGxpc3QgeworICAgIGludCBpZDsKKyAgICB1bnNpZ25lZCBsb25nIHNwZDEsIHNwZDIsIGF2ZzsKK30gcmVzdWx0c1tdOworCitleHRlcm4gaW50IG5vX3Jlc3VsdHM7CisKK2ludCBzb3J0ZXIoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7Cit2b2lkIHRhbGx5X3Jlc3VsdHMoaW50IHR5cGUpOwordWxvbmc2NCByZHRzYyAodm9pZCk7CisKK3ZvaWQgdF9zdGFydCh2b2lkKTsKK3Vsb25nNjQgdF9yZWFkKHZvaWQpOwordm9pZCBpbml0X3RpbWVyKHZvaWQpOworCisvKiByZWdpc3RlciBkZWZhdWx0IGFsZ3MgKi8KK3ZvaWQgcmVnX2FsZ3Modm9pZCk7CitpbnQgdGltZV9rZXlzY2hlZCh2b2lkKTsKK2ludCB0aW1lX2NpcGhlcih2b2lkKTsKK2ludCB0aW1lX2NpcGhlcjIodm9pZCk7CitpbnQgdGltZV9jaXBoZXIzKHZvaWQpOworaW50IHRpbWVfaGFzaCh2b2lkKTsKK3ZvaWQgdGltZV9tdWx0KHZvaWQpOwordm9pZCB0aW1lX3Nxcih2b2lkKTsKK3ZvaWQgdGltZV9wcm5nKHZvaWQpOwordm9pZCB0aW1lX3JzYSh2b2lkKTsKK3ZvaWQgdGltZV9lY2Modm9pZCk7Cit2b2lkIHRpbWVfZGgodm9pZCk7Cit2b2lkIHRpbWVfbWFjc18odW5zaWduZWQgbG9uZyBNQUNfU0laRSk7Cit2b2lkIHRpbWVfbWFjcyh2b2lkKTsKK3ZvaWQgdGltZV9lbmNtYWNzKHZvaWQpOworCisKKworI2VuZGlmCisKKy8qICRTb3VyY2U6IC9jdnMvbGlidG9tL2xpYnRvbWNyeXB0L3Rlc3Rwcm9mL3RvbWNyeXB0X3Rlc3QuaCx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS44ICQgKi8KKy8qICREYXRlOiAyMDA1LzA1LzA1IDE0OjM1OjU5ICQgKi8KZGlmZiAtLWdpdCBhL3Rlc3Rwcm9mL3g4Nl9wcm9mLmMgYi90ZXN0cHJvZi94ODZfcHJvZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzE4MGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cHJvZi94ODZfcHJvZi5jCkBAIC0wLDAgKzEsMTA1MCBAQAorI2luY2x1ZGUgPHRvbWNyeXB0X3Rlc3QuaD4KKworcHJuZ19zdGF0ZSB5YXJyb3dfcHJuZzsKKworc3RydWN0IGxpc3QgcmVzdWx0c1sxMDBdOworaW50IG5vX3Jlc3VsdHM7CitpbnQgc29ydGVyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICBjb25zdCBzdHJ1Y3QgbGlzdCAqQSwgKkI7CisgICBBID0gYTsKKyAgIEIgPSBiOworICAgaWYgKEEtPmF2ZyA8IEItPmF2ZykgcmV0dXJuIC0xOworICAgaWYgKEEtPmF2ZyA+IEItPmF2ZykgcmV0dXJuIDE7CisgICByZXR1cm4gMDsKK30KKwordm9pZCB0YWxseV9yZXN1bHRzKGludCB0eXBlKQoreworICAgaW50IHg7CisKKyAgIC8vIHFzb3J0IHRoZSByZXN1bHRzCisgICBxc29ydChyZXN1bHRzLCBub19yZXN1bHRzLCBzaXplb2Yoc3RydWN0IGxpc3QpLCAmc29ydGVyKTsKKworICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgaWYgKHR5cGUgPT0gMCkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IG5vX3Jlc3VsdHM7IHgrKykgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlLTIwczogU2NoZWR1bGUgYXQgJTZsdVxuIiwgY2lwaGVyX2Rlc2NyaXB0b3JbcmVzdWx0c1t4XS5pZF0ubmFtZSwgKHVuc2lnbmVkIGxvbmcpcmVzdWx0c1t4XS5zcGQxKTsKKyAgICAgIH0gCisgICB9IGVsc2UgaWYgKHR5cGUgPT0gMSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IG5vX3Jlc3VsdHM7IHgrKykgeworICAgICAgICBwcmludGYKKyAgICAgICAgICAoIiUtMjBzWyUzZF06IEVuY3J5cHQgYXQgJTVsdSwgRGVjcnlwdCBhdCAlNWx1XG4iLCBjaXBoZXJfZGVzY3JpcHRvcltyZXN1bHRzW3hdLmlkXS5uYW1lLCBjaXBoZXJfZGVzY3JpcHRvcltyZXN1bHRzW3hdLmlkXS5JRCwgcmVzdWx0c1t4XS5zcGQxLCByZXN1bHRzW3hdLnNwZDIpOworICAgICAgfQorICAgfSBlbHNlIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCBub19yZXN1bHRzOyB4KyspIHsKKyAgICAgICAgcHJpbnRmCisgICAgICAgICAgKCIlLTIwczogUHJvY2VzcyBhdCAlNWx1XG4iLCBoYXNoX2Rlc2NyaXB0b3JbcmVzdWx0c1t4XS5pZF0ubmFtZSwgcmVzdWx0c1t4XS5zcGQxIC8gMTAwMCk7CisgICAgICB9CisgICB9Cit9CisKKy8qIFJEVFNDIGZyb20gU2NvdHQgRHVwbGljaGFuICovCit1bG9uZzY0IHJkdHNjICh2b2lkKQorICAgeworICAgI2lmIGRlZmluZWQgX19HTlVDX18gJiYgIWRlZmluZWQoTFRDX05PX0FTTSkKKyAgICAgICNpZmRlZiBJTlRFTF9DQworCQkJdWxvbmc2NCBhOworCQkJYXNtICggIiByZHRzYyAiOiI9QSIoYSkpOworICAgICAgICAgcmV0dXJuIGE7CisgICAgICAjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisgICAgICAgICB1bG9uZzY0IGE7CisgICAgICAgICBhc20gX192b2xhdGlsZV9fICgicmR0c2Ncbm1vdmwgJSVlYXgsKCUwKVxubW92bCAlJWVkeCw0KCUwKVxuIjo6InIiKCZhKToiJWVheCIsIiVlZHgiKTsKKyAgICAgICAgIHJldHVybiBhOworICAgICAgI2VsaWYgZGVmaW5lZChfX2lhNjRfXykgIC8qIGdjYy1JQTY0IHZlcnNpb24gKi8KKyAgICAgICAgIHVuc2lnbmVkIGxvbmcgcmVzdWx0OworICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdiAlMD1hci5pdGMiIDogIj1yIihyZXN1bHQpIDo6ICJtZW1vcnkiKTsKKyAgICAgICAgIHdoaWxlIChfX2J1aWx0aW5fZXhwZWN0ICgoaW50KSByZXN1bHQgPT0gLTEsIDApKQorICAgICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1vdiAlMD1hci5pdGMiIDogIj1yIihyZXN1bHQpIDo6ICJtZW1vcnkiKTsKKyAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAjZWxzZSAKKyAgICAgICAgIHJldHVybiBYQ0xPQ0soKTsKKyAgICAgICNlbmRpZgorCisgICAvLyBNaWNyb3NvZnQgYW5kIEludGVsIFdpbmRvd3MgY29tcGlsZXJzCisgICAjZWxpZiBkZWZpbmVkIF9NX0lYODYgJiYgIWRlZmluZWQoTFRDX05PX0FTTSkKKyAgICAgX19hc20gcmR0c2MKKyAgICNlbGlmIGRlZmluZWQgX01fQU1ENjQgJiYgIWRlZmluZWQoTFRDX05PX0FTTSkKKyAgICAgcmV0dXJuIF9fcmR0c2MgKCk7CisgICAjZWxpZiBkZWZpbmVkIF9NX0lBNjQgJiYgIWRlZmluZWQoTFRDX05PX0FTTSkKKyAgICAgI2lmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgorICAgICAgICNpbmNsdWRlIDxpYTY0aW50cmluLmg+CisgICAgICNlbmRpZgorICAgICAgcmV0dXJuIF9fZ2V0UmVnICgzMTE2KTsKKyAgICNlbHNlCisgICAgIHJldHVybiBYQ0xPQ0soKTsKKyAgICNlbmRpZgorICAgfQorCitzdGF0aWMgdWxvbmc2NCB0aW1lciwgc2tldyA9IDA7CisKK3ZvaWQgdF9zdGFydCh2b2lkKQoreworICAgdGltZXIgPSByZHRzYygpOworfQorCit1bG9uZzY0IHRfcmVhZCh2b2lkKQoreworICAgcmV0dXJuIHJkdHNjKCkgLSB0aW1lcjsKK30KKwordm9pZCBpbml0X3RpbWVyKHZvaWQpCit7CisgICB1bG9uZzY0IGMxLCBjMiwgdDEsIHQyLCB0MzsKKyAgIHVuc2lnbmVkIGxvbmcgeTE7CisKKyAgIGMxID0gYzIgPSAodWxvbmc2NCktMTsKKyAgIGZvciAoeTEgPSAwOyB5MSA8IFRJTUVTKjEwMDsgeTErKykgeworICAgICAgdF9zdGFydCgpOworICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgIHQzID0gdF9yZWFkKCk7CisgICAgICB0MiA9ICh0X3JlYWQoKSAtIHQxKT4+MTsKKworICAgICAgYzEgPSAodDEgPiBjMSkgPyB0MSA6IGMxOworICAgICAgYzIgPSAodDIgPiBjMikgPyB0MiA6IGMyOworICAgfQorICAgc2tldyA9IGMyIC0gYzE7CisgICBmcHJpbnRmKHN0ZGVyciwgIkNsb2NrIFNrZXc6ICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpc2tldyk7Cit9CisKK3ZvaWQgcmVnX2FsZ3Modm9pZCkKK3sKKyAgaW50IGVycjsKKyNpZmRlZiBSSUpOREFFTAorICByZWdpc3Rlcl9jaXBoZXIgKCZhZXNfZGVzYyk7CisjZW5kaWYKKyNpZmRlZiBCTE9XRklTSAorICByZWdpc3Rlcl9jaXBoZXIgKCZibG93ZmlzaF9kZXNjKTsKKyNlbmRpZgorI2lmZGVmIFhURUEKKyAgcmVnaXN0ZXJfY2lwaGVyICgmeHRlYV9kZXNjKTsKKyNlbmRpZgorI2lmZGVmIFJDNQorICByZWdpc3Rlcl9jaXBoZXIgKCZyYzVfZGVzYyk7CisjZW5kaWYKKyNpZmRlZiBSQzYKKyAgcmVnaXN0ZXJfY2lwaGVyICgmcmM2X2Rlc2MpOworI2VuZGlmCisjaWZkZWYgU0FGRVJQCisgIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVycF9kZXNjKTsKKyNlbmRpZgorI2lmZGVmIFRXT0ZJU0gKKyAgcmVnaXN0ZXJfY2lwaGVyICgmdHdvZmlzaF9kZXNjKTsKKyNlbmRpZgorI2lmZGVmIFNBRkVSCisgIHJlZ2lzdGVyX2NpcGhlciAoJnNhZmVyX2s2NF9kZXNjKTsKKyAgcmVnaXN0ZXJfY2lwaGVyICgmc2FmZXJfc2s2NF9kZXNjKTsKKyAgcmVnaXN0ZXJfY2lwaGVyICgmc2FmZXJfazEyOF9kZXNjKTsKKyAgcmVnaXN0ZXJfY2lwaGVyICgmc2FmZXJfc2sxMjhfZGVzYyk7CisjZW5kaWYKKyNpZmRlZiBSQzIKKyAgcmVnaXN0ZXJfY2lwaGVyICgmcmMyX2Rlc2MpOworI2VuZGlmCisjaWZkZWYgREVTCisgIHJlZ2lzdGVyX2NpcGhlciAoJmRlc19kZXNjKTsKKyAgcmVnaXN0ZXJfY2lwaGVyICgmZGVzM19kZXNjKTsKKyNlbmRpZgorI2lmZGVmIENBU1Q1CisgIHJlZ2lzdGVyX2NpcGhlciAoJmNhc3Q1X2Rlc2MpOworI2VuZGlmCisjaWZkZWYgTk9FS0VPTgorICByZWdpc3Rlcl9jaXBoZXIgKCZub2VrZW9uX2Rlc2MpOworI2VuZGlmCisjaWZkZWYgU0tJUEpBQ0sKKyAgcmVnaXN0ZXJfY2lwaGVyICgmc2tpcGphY2tfZGVzYyk7CisjZW5kaWYKKyNpZmRlZiBLSEFaQUQKKyAgcmVnaXN0ZXJfY2lwaGVyICgma2hhemFkX2Rlc2MpOworI2VuZGlmCisjaWZkZWYgQU5VQklTCisgIHJlZ2lzdGVyX2NpcGhlciAoJmFudWJpc19kZXNjKTsKKyNlbmRpZgorCisjaWZkZWYgVElHRVIKKyAgcmVnaXN0ZXJfaGFzaCAoJnRpZ2VyX2Rlc2MpOworI2VuZGlmCisjaWZkZWYgTUQyCisgIHJlZ2lzdGVyX2hhc2ggKCZtZDJfZGVzYyk7CisjZW5kaWYKKyNpZmRlZiBNRDQKKyAgcmVnaXN0ZXJfaGFzaCAoJm1kNF9kZXNjKTsKKyNlbmRpZgorI2lmZGVmIE1ENQorICByZWdpc3Rlcl9oYXNoICgmbWQ1X2Rlc2MpOworI2VuZGlmCisjaWZkZWYgU0hBMQorICByZWdpc3Rlcl9oYXNoICgmc2hhMV9kZXNjKTsKKyNlbmRpZgorI2lmZGVmIFNIQTIyNAorICByZWdpc3Rlcl9oYXNoICgmc2hhMjI0X2Rlc2MpOworI2VuZGlmCisjaWZkZWYgU0hBMjU2CisgIHJlZ2lzdGVyX2hhc2ggKCZzaGEyNTZfZGVzYyk7CisjZW5kaWYKKyNpZmRlZiBTSEEzODQKKyAgcmVnaXN0ZXJfaGFzaCAoJnNoYTM4NF9kZXNjKTsKKyNlbmRpZgorI2lmZGVmIFNIQTUxMgorICByZWdpc3Rlcl9oYXNoICgmc2hhNTEyX2Rlc2MpOworI2VuZGlmCisjaWZkZWYgUklQRU1EMTI4CisgIHJlZ2lzdGVyX2hhc2ggKCZybWQxMjhfZGVzYyk7CisjZW5kaWYKKyNpZmRlZiBSSVBFTUQxNjAKKyAgcmVnaXN0ZXJfaGFzaCAoJnJtZDE2MF9kZXNjKTsKKyNlbmRpZgorI2lmZGVmIFdISVJMUE9PTAorICByZWdpc3Rlcl9oYXNoICgmd2hpcmxwb29sX2Rlc2MpOworI2VuZGlmCisjaWZkZWYgQ0hDX0hBU0gKKyAgcmVnaXN0ZXJfaGFzaCgmY2hjX2Rlc2MpOworICBpZiAoKGVyciA9IGNoY19yZWdpc3RlcihyZWdpc3Rlcl9jaXBoZXIoJmFlc19kZXNjKSkpICE9IENSWVBUX09LKSB7CisgICAgIGZwcmludGYoc3RkZXJyLCAiY2hjX3JlZ2lzdGVyIGVycm9yOiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgIH0KKyNlbmRpZgorCisKKyNpZm5kZWYgWUFSUk9XIAorICAgI2Vycm9yIFRoaXMgZGVtbyByZXF1aXJlcyBZYXJyb3cuCisjZW5kaWYKK3JlZ2lzdGVyX3BybmcoJnlhcnJvd19kZXNjKTsKKyNpZmRlZiBGT1JUVU5BCityZWdpc3Rlcl9wcm5nKCZmb3J0dW5hX2Rlc2MpOworI2VuZGlmCisjaWZkZWYgUkM0CityZWdpc3Rlcl9wcm5nKCZyYzRfZGVzYyk7CisjZW5kaWYKKyNpZmRlZiBTT0JFUjEyOAorcmVnaXN0ZXJfcHJuZygmc29iZXIxMjhfZGVzYyk7CisjZW5kaWYKKworcm5nX21ha2VfcHJuZygxMjgsIGZpbmRfcHJuZygieWFycm93IiksICZ5YXJyb3dfcHJuZywgTlVMTCk7Cit9CisKK2ludCB0aW1lX2tleXNjaGVkKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgeCwgeTE7CisgIHVsb25nNjQgdDEsIGMxOworICBzeW1tZXRyaWNfa2V5IHNrZXk7CisgIGludCBrbDsKKyAgaW50ICAgICgqZnVuYykgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50ICwgaW50ICwgc3ltbWV0cmljX2tleSAqKTsKKyAgdW5zaWduZWQgY2hhciBrZXlbTUFYQkxPQ0tTSVpFXTsKKworICBmcHJpbnRmKHN0ZGVyciwgIlxuXG5LZXkgU2NoZWR1bGUgVGltZSBUcmlhbHMgZm9yIHRoZSBTeW1tZXRyaWMgQ2lwaGVyczpcbihUaW1lcyBhcmUgY3ljbGVzIHBlciBrZXkpXG4iKTsKKyAgbm9fcmVzdWx0cyA9IDA7IAorIGZvciAoeCA9IDA7IGNpcGhlcl9kZXNjcmlwdG9yW3hdLm5hbWUgIT0gTlVMTDsgeCsrKSB7CisjZGVmaW5lIERPMShrKSAgIGZ1bmMoaywga2wsIDAsICZza2V5KTsKKworICAgIGZ1bmMgPSBjaXBoZXJfZGVzY3JpcHRvclt4XS5zZXR1cDsKKyAgICBrbCAgID0gY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubWluX2tleV9sZW5ndGg7CisgICAgYzEgPSAodWxvbmc2NCktMTsKKyAgICBmb3IgKHkxID0gMDsgeTEgPCBLVElNRVM7IHkxKyspIHsKKyAgICAgICB5YXJyb3dfcmVhZChrZXksIGtsLCAmeWFycm93X3BybmcpOworICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICBETzEoa2V5KTsKKyAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgIGMxID0gKHQxID4gYzEpID8gYzEgOiB0MTsKKyAgICB9CisgICAgdDEgPSBjMSAtIHNrZXc7CisgICAgcmVzdWx0c1tub19yZXN1bHRzXS5zcGQxID0gcmVzdWx0c1tub19yZXN1bHRzXS5hdmcgPSB0MTsKKyAgICByZXN1bHRzW25vX3Jlc3VsdHMrK10uaWQgPSB4OworICAgIGZwcmludGYoc3RkZXJyLCAiLiIpOyBmZmx1c2goc3Rkb3V0KTsKKworI3VuZGVmIERPMQorICAgfQorICAgdGFsbHlfcmVzdWx0cygwKTsKKworICAgcmV0dXJuIDA7Cit9CisKK2ludCB0aW1lX2NpcGhlcih2b2lkKQoreworICB1bnNpZ25lZCBsb25nIHgsIHkxOworICB1bG9uZzY0ICB0MSwgdDIsIGMxLCBjMiwgYTEsIGEyOworICBzeW1tZXRyaWNfRUNCIGVjYjsKKyAgdW5zaWduZWQgY2hhciBrZXlbTUFYQkxPQ0tTSVpFXSwgcHRbNDA5Nl07CisgIGludCBlcnI7CisKKyAgZnByaW50ZihzdGRlcnIsICJcblxuRUNCIFRpbWUgVHJpYWxzIGZvciB0aGUgU3ltbWV0cmljIENpcGhlcnM6XG4iKTsKKyAgbm9fcmVzdWx0cyA9IDA7CisgIGZvciAoeCA9IDA7IGNpcGhlcl9kZXNjcmlwdG9yW3hdLm5hbWUgIT0gTlVMTDsgeCsrKSB7CisgICAgZWNiX3N0YXJ0KHgsIGtleSwgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubWluX2tleV9sZW5ndGgsIDAsICZlY2IpOworCisgICAgLyogc2FuaXR5IGNoZWNrIG9uIGNpcGhlciAqLworICAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbeF0udGVzdCgpKSAhPSBDUllQVF9PSykgeworICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5cbkVSUk9SOiBDaXBoZXIgJXMgZmFpbGVkIHNlbGYtdGVzdCAlc1xuIiwgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSwgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyNkZWZpbmUgRE8xICAgZWNiX2VuY3J5cHQocHQsIHB0LCBzaXplb2YocHQpLCAmZWNiKTsKKyNkZWZpbmUgRE8yICAgRE8xIERPMQorCisgICAgYzEgPSBjMiA9ICh1bG9uZzY0KS0xOworICAgIGZvciAoeTEgPSAwOyB5MSA8IDEwMDsgeTErKykgeworICAgICAgICB0X3N0YXJ0KCk7CisgICAgICAgIERPMTsKKyAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgRE8yOworICAgICAgICB0MiA9IHRfcmVhZCgpOworICAgICAgICB0MiAtPSB0MTsKKworICAgICAgICBjMSA9ICh0MSA+IGMxID8gYzEgOiB0MSk7CisgICAgICAgIGMyID0gKHQyID4gYzIgPyBjMiA6IHQyKTsKKyAgICB9CisgICAgYTEgPSBjMiAtIGMxIC0gc2tldzsKKworI3VuZGVmIERPMQorI3VuZGVmIERPMgorI2RlZmluZSBETzEgICBlY2JfZGVjcnlwdChwdCwgcHQsIHNpemVvZihwdCksICZlY2IpOworI2RlZmluZSBETzIgICBETzEgRE8xCisKKyAgICBjMSA9IGMyID0gKHVsb25nNjQpLTE7CisgICAgZm9yICh5MSA9IDA7IHkxIDwgMTAwOyB5MSsrKSB7CisgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgRE8xOworICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICBETzI7CisgICAgICAgIHQyID0gdF9yZWFkKCk7CisgICAgICAgIHQyIC09IHQxOworCisgICAgICAgIGMxID0gKHQxID4gYzEgPyBjMSA6IHQxKTsKKyAgICAgICAgYzIgPSAodDIgPiBjMiA/IGMyIDogdDIpOworICAgIH0KKyAgICBhMiA9IGMyIC0gYzEgLSBza2V3OworICAgIAorICAgIHJlc3VsdHNbbm9fcmVzdWx0c10uaWQgPSB4OworICAgIHJlc3VsdHNbbm9fcmVzdWx0c10uc3BkMSA9IGExLyhzaXplb2YocHQpL2NpcGhlcl9kZXNjcmlwdG9yW3hdLmJsb2NrX2xlbmd0aCk7CisgICAgcmVzdWx0c1tub19yZXN1bHRzXS5zcGQyID0gYTIvKHNpemVvZihwdCkvY2lwaGVyX2Rlc2NyaXB0b3JbeF0uYmxvY2tfbGVuZ3RoKTsKKyAgICByZXN1bHRzW25vX3Jlc3VsdHNdLmF2ZyA9IChyZXN1bHRzW25vX3Jlc3VsdHNdLnNwZDEgKyByZXN1bHRzW25vX3Jlc3VsdHNdLnNwZDIrMSkvMjsKKyAgICArK25vX3Jlc3VsdHM7CisgICAgZnByaW50ZihzdGRlcnIsICIuIik7IGZmbHVzaChzdGRvdXQpOworICAgIAorI3VuZGVmIERPMgorI3VuZGVmIERPMQorICAgfQorICAgdGFsbHlfcmVzdWx0cygxKTsKKworICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDQkMgCitpbnQgdGltZV9jaXBoZXIyKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgeCwgeTE7CisgIHVsb25nNjQgIHQxLCB0MiwgYzEsIGMyLCBhMSwgYTI7CisgIHN5bW1ldHJpY19DQkMgY2JjOworICB1bnNpZ25lZCBjaGFyIGtleVtNQVhCTE9DS1NJWkVdLCBwdFs0MDk2XTsKKyAgaW50IGVycjsKKworICBmcHJpbnRmKHN0ZGVyciwgIlxuXG5DQkMgVGltZSBUcmlhbHMgZm9yIHRoZSBTeW1tZXRyaWMgQ2lwaGVyczpcbiIpOworICBub19yZXN1bHRzID0gMDsKKyAgZm9yICh4ID0gMDsgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSAhPSBOVUxMOyB4KyspIHsKKyAgICBjYmNfc3RhcnQoeCwgcHQsIGtleSwgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubWluX2tleV9sZW5ndGgsIDAsICZjYmMpOworCisgICAgLyogc2FuaXR5IGNoZWNrIG9uIGNpcGhlciAqLworICAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbeF0udGVzdCgpKSAhPSBDUllQVF9PSykgeworICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5cbkVSUk9SOiBDaXBoZXIgJXMgZmFpbGVkIHNlbGYtdGVzdCAlc1xuIiwgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSwgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyNkZWZpbmUgRE8xICAgY2JjX2VuY3J5cHQocHQsIHB0LCBzaXplb2YocHQpLCAmY2JjKTsKKyNkZWZpbmUgRE8yICAgRE8xIERPMQorCisgICAgYzEgPSBjMiA9ICh1bG9uZzY0KS0xOworICAgIGZvciAoeTEgPSAwOyB5MSA8IDEwMDsgeTErKykgeworICAgICAgICB0X3N0YXJ0KCk7CisgICAgICAgIERPMTsKKyAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgRE8yOworICAgICAgICB0MiA9IHRfcmVhZCgpOworICAgICAgICB0MiAtPSB0MTsKKworICAgICAgICBjMSA9ICh0MSA+IGMxID8gYzEgOiB0MSk7CisgICAgICAgIGMyID0gKHQyID4gYzIgPyBjMiA6IHQyKTsKKyAgICB9CisgICAgYTEgPSBjMiAtIGMxIC0gc2tldzsKKworI3VuZGVmIERPMQorI3VuZGVmIERPMgorI2RlZmluZSBETzEgICBjYmNfZGVjcnlwdChwdCwgcHQsIHNpemVvZihwdCksICZjYmMpOworI2RlZmluZSBETzIgICBETzEgRE8xCisKKyAgICBjMSA9IGMyID0gKHVsb25nNjQpLTE7CisgICAgZm9yICh5MSA9IDA7IHkxIDwgMTAwOyB5MSsrKSB7CisgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgRE8xOworICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICBETzI7CisgICAgICAgIHQyID0gdF9yZWFkKCk7CisgICAgICAgIHQyIC09IHQxOworCisgICAgICAgIGMxID0gKHQxID4gYzEgPyBjMSA6IHQxKTsKKyAgICAgICAgYzIgPSAodDIgPiBjMiA/IGMyIDogdDIpOworICAgIH0KKyAgICBhMiA9IGMyIC0gYzEgLSBza2V3OworICAgIAorICAgIHJlc3VsdHNbbm9fcmVzdWx0c10uaWQgPSB4OworICAgIHJlc3VsdHNbbm9fcmVzdWx0c10uc3BkMSA9IGExLyhzaXplb2YocHQpL2NpcGhlcl9kZXNjcmlwdG9yW3hdLmJsb2NrX2xlbmd0aCk7CisgICAgcmVzdWx0c1tub19yZXN1bHRzXS5zcGQyID0gYTIvKHNpemVvZihwdCkvY2lwaGVyX2Rlc2NyaXB0b3JbeF0uYmxvY2tfbGVuZ3RoKTsKKyAgICByZXN1bHRzW25vX3Jlc3VsdHNdLmF2ZyA9IChyZXN1bHRzW25vX3Jlc3VsdHNdLnNwZDEgKyByZXN1bHRzW25vX3Jlc3VsdHNdLnNwZDIrMSkvMjsKKyAgICArK25vX3Jlc3VsdHM7CisgICAgZnByaW50ZihzdGRlcnIsICIuIik7IGZmbHVzaChzdGRvdXQpOworICAgIAorI3VuZGVmIERPMgorI3VuZGVmIERPMQorICAgfQorICAgdGFsbHlfcmVzdWx0cygxKTsKKworICAgcmV0dXJuIDA7Cit9CisjZWxzZQoraW50IHRpbWVfY2lwaGVyMih2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiTk8gQ0JDXG4iKTsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCisjaWZkZWYgQ1RSCitpbnQgdGltZV9jaXBoZXIzKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgeCwgeTE7CisgIHVsb25nNjQgIHQxLCB0MiwgYzEsIGMyLCBhMSwgYTI7CisgIHN5bW1ldHJpY19DVFIgY3RyOworICB1bnNpZ25lZCBjaGFyIGtleVtNQVhCTE9DS1NJWkVdLCBwdFs0MDk2XTsKKyAgaW50IGVycjsKKworICBmcHJpbnRmKHN0ZGVyciwgIlxuXG5DVFIgVGltZSBUcmlhbHMgZm9yIHRoZSBTeW1tZXRyaWMgQ2lwaGVyczpcbiIpOworICBub19yZXN1bHRzID0gMDsKKyAgZm9yICh4ID0gMDsgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSAhPSBOVUxMOyB4KyspIHsKKyAgICBjdHJfc3RhcnQoeCwgcHQsIGtleSwgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubWluX2tleV9sZW5ndGgsIDAsIENUUl9DT1VOVEVSX0xJVFRMRV9FTkRJQU4sICZjdHIpOworCisgICAgLyogc2FuaXR5IGNoZWNrIG9uIGNpcGhlciAqLworICAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbeF0udGVzdCgpKSAhPSBDUllQVF9PSykgeworICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5cbkVSUk9SOiBDaXBoZXIgJXMgZmFpbGVkIHNlbGYtdGVzdCAlc1xuIiwgY2lwaGVyX2Rlc2NyaXB0b3JbeF0ubmFtZSwgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyNkZWZpbmUgRE8xICAgY3RyX2VuY3J5cHQocHQsIHB0LCBzaXplb2YocHQpLCAmY3RyKTsKKyNkZWZpbmUgRE8yICAgRE8xIERPMQorCisgICAgYzEgPSBjMiA9ICh1bG9uZzY0KS0xOworICAgIGZvciAoeTEgPSAwOyB5MSA8IDEwMDsgeTErKykgeworICAgICAgICB0X3N0YXJ0KCk7CisgICAgICAgIERPMTsKKyAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgRE8yOworICAgICAgICB0MiA9IHRfcmVhZCgpOworICAgICAgICB0MiAtPSB0MTsKKworICAgICAgICBjMSA9ICh0MSA+IGMxID8gYzEgOiB0MSk7CisgICAgICAgIGMyID0gKHQyID4gYzIgPyBjMiA6IHQyKTsKKyAgICB9CisgICAgYTEgPSBjMiAtIGMxIC0gc2tldzsKKworI3VuZGVmIERPMQorI3VuZGVmIERPMgorI2RlZmluZSBETzEgICBjdHJfZGVjcnlwdChwdCwgcHQsIHNpemVvZihwdCksICZjdHIpOworI2RlZmluZSBETzIgICBETzEgRE8xCisKKyAgICBjMSA9IGMyID0gKHVsb25nNjQpLTE7CisgICAgZm9yICh5MSA9IDA7IHkxIDwgMTAwOyB5MSsrKSB7CisgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgRE8xOworICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICBETzI7CisgICAgICAgIHQyID0gdF9yZWFkKCk7CisgICAgICAgIHQyIC09IHQxOworCisgICAgICAgIGMxID0gKHQxID4gYzEgPyBjMSA6IHQxKTsKKyAgICAgICAgYzIgPSAodDIgPiBjMiA/IGMyIDogdDIpOworICAgIH0KKyAgICBhMiA9IGMyIC0gYzEgLSBza2V3OworICAgIAorICAgIHJlc3VsdHNbbm9fcmVzdWx0c10uaWQgPSB4OworICAgIHJlc3VsdHNbbm9fcmVzdWx0c10uc3BkMSA9IGExLyhzaXplb2YocHQpL2NpcGhlcl9kZXNjcmlwdG9yW3hdLmJsb2NrX2xlbmd0aCk7CisgICAgcmVzdWx0c1tub19yZXN1bHRzXS5zcGQyID0gYTIvKHNpemVvZihwdCkvY2lwaGVyX2Rlc2NyaXB0b3JbeF0uYmxvY2tfbGVuZ3RoKTsKKyAgICByZXN1bHRzW25vX3Jlc3VsdHNdLmF2ZyA9IChyZXN1bHRzW25vX3Jlc3VsdHNdLnNwZDEgKyByZXN1bHRzW25vX3Jlc3VsdHNdLnNwZDIrMSkvMjsKKyAgICArK25vX3Jlc3VsdHM7CisgICAgZnByaW50ZihzdGRlcnIsICIuIik7IGZmbHVzaChzdGRvdXQpOworICAgIAorI3VuZGVmIERPMgorI3VuZGVmIERPMQorICAgfQorICAgdGFsbHlfcmVzdWx0cygxKTsKKworICAgcmV0dXJuIDA7Cit9CisjZWxzZQoraW50IHRpbWVfY2lwaGVyMyh2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiTk8gQ1RSXG4iKTsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCitpbnQgdGltZV9oYXNoKHZvaWQpCit7CisgIHVuc2lnbmVkIGxvbmcgeCwgeTEsIGxlbjsKKyAgdWxvbmc2NCB0MSwgdDIsIGMxLCBjMjsKKyAgaGFzaF9zdGF0ZSBtZDsKKyAgaW50ICAgICgqZnVuYykoaGFzaF9zdGF0ZSAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcpLCBlcnI7CisgIHVuc2lnbmVkIGNoYXIgcHRbTUFYQkxPQ0tTSVpFXTsKKworCisgIGZwcmludGYoc3RkZXJyLCAiXG5cbkhBU0ggVGltZSBUcmlhbHMgZm9yOlxuIik7CisgIG5vX3Jlc3VsdHMgPSAwOworICBmb3IgKHggPSAwOyBoYXNoX2Rlc2NyaXB0b3JbeF0ubmFtZSAhPSBOVUxMOyB4KyspIHsKKworICAgIC8qIHNhbml0eSBjaGVjayBvbiBoYXNoICovCisgICAgaWYgKChlcnIgPSBoYXNoX2Rlc2NyaXB0b3JbeF0udGVzdCgpKSAhPSBDUllQVF9PSykgeworICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5cbkVSUk9SOiBIYXNoICVzIGZhaWxlZCBzZWxmLXRlc3QgJXNcbiIsIGhhc2hfZGVzY3JpcHRvclt4XS5uYW1lLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICAgIGhhc2hfZGVzY3JpcHRvclt4XS5pbml0KCZtZCk7CisKKyNkZWZpbmUgRE8xICAgZnVuYygmbWQscHQsbGVuKTsKKyNkZWZpbmUgRE8yICAgRE8xIERPMQorCisgICAgZnVuYyA9IGhhc2hfZGVzY3JpcHRvclt4XS5wcm9jZXNzOworICAgIGxlbiAgPSBoYXNoX2Rlc2NyaXB0b3JbeF0uYmxvY2tzaXplOworCisgICAgYzEgPSBjMiA9ICh1bG9uZzY0KS0xOworICAgIGZvciAoeTEgPSAwOyB5MSA8IFRJTUVTOyB5MSsrKSB7CisgICAgICAgdF9zdGFydCgpOworICAgICAgIERPMTsKKyAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgIERPMjsKKyAgICAgICB0MiA9IHRfcmVhZCgpIC0gdDE7CisgICAgICAgYzEgPSAodDEgPiBjMSkgPyBjMSA6IHQxOworICAgICAgIGMyID0gKHQyID4gYzIpID8gYzIgOiB0MjsKKyAgICB9CisgICAgdDEgPSBjMiAtIGMxIC0gc2tldzsKKyAgICB0MSA9ICgodDEgKiBDT05TVDY0KDEwMDApKSkgLyAoKHVsb25nNjQpaGFzaF9kZXNjcmlwdG9yW3hdLmJsb2Nrc2l6ZSk7CisgICAgcmVzdWx0c1tub19yZXN1bHRzXS5pZCA9IHg7CisgICAgcmVzdWx0c1tub19yZXN1bHRzXS5zcGQxID0gcmVzdWx0c1tub19yZXN1bHRzXS5hdmcgPSB0MTsKKyAgICArK25vX3Jlc3VsdHM7CisgICAgZnByaW50ZihzdGRlcnIsICIuIik7IGZmbHVzaChzdGRvdXQpOworI3VuZGVmIERPMgorI3VuZGVmIERPMQorICAgfQorICAgdGFsbHlfcmVzdWx0cygyKTsKKworICAgcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBNUEkKK3ZvaWQgdGltZV9tdWx0KHZvaWQpCit7CisgICB1bG9uZzY0IHQxLCB0MjsKKyAgIHVuc2lnbmVkIGxvbmcgeCwgeTsKKyAgIG1wX2ludCAgYSwgYiwgYzsKKworICAgZnByaW50ZihzdGRlcnIsICJUaW1pbmcgTXVsdGlwbHlpbmc6XG4iKTsKKyAgIG1wX2luaXRfbXVsdGkoJmEsJmIsJmMsTlVMTCk7CisgICBmb3IgKHggPSAxMjgvRElHSVRfQklUOyB4IDw9IDE1MzYvRElHSVRfQklUOyB4ICs9IDEyOC9ESUdJVF9CSVQpIHsKKyAgICAgICBtcF9yYW5kKCZhLCB4KTsKKyAgICAgICBtcF9yYW5kKCZiLCB4KTsKKworI2RlZmluZSBETzEgbXBfbXVsKCZhLCAmYiwgJmMpOworI2RlZmluZSBETzIgRE8xOyBETzE7CisKKyAgICAgICB0MiA9IC0xOworICAgICAgIGZvciAoeSA9IDA7IHkgPCBUSU1FUzsgeSsrKSB7CisgICAgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgICAgRE8yOworICAgICAgICAgICB0MSA9ICh0X3JlYWQoKSAtIHQxKT4+MTsKKyAgICAgICAgICAgaWYgKHQxIDwgdDIpIHQyID0gdDE7CisgICAgICAgfQorICAgICAgIGZwcmludGYoc3RkZXJyLCAiJTRsdSBiaXRzOiAlOWxsdSBjeWNsZXNcbiIsIHgqRElHSVRfQklULCB0Mik7CisgICB9CisgICBtcF9jbGVhcl9tdWx0aSgmYSwmYiwmYyxOVUxMKTsKKworI3VuZGVmIERPMQorI3VuZGVmIERPMgorfSAKKwordm9pZCB0aW1lX3Nxcih2b2lkKQoreworICAgdWxvbmc2NCB0MSwgdDI7CisgICB1bnNpZ25lZCBsb25nIHgsIHk7CisgICBtcF9pbnQgIGEsIGI7CisKKyAgIGZwcmludGYoc3RkZXJyLCAiVGltaW5nIFNxdWFyaW5nOlxuIik7CisgICBtcF9pbml0X211bHRpKCZhLCZiLE5VTEwpOworICAgZm9yICh4ID0gMTI4L0RJR0lUX0JJVDsgeCA8PSAxNTM2L0RJR0lUX0JJVDsgeCArPSAxMjgvRElHSVRfQklUKSB7CisgICAgICAgbXBfcmFuZCgmYSwgeCk7CisKKyNkZWZpbmUgRE8xIG1wX3NxcigmYSwgJmIpOworI2RlZmluZSBETzIgRE8xOyBETzE7CisKKyAgICAgICB0MiA9IC0xOworICAgICAgIGZvciAoeSA9IDA7IHkgPCBUSU1FUzsgeSsrKSB7CisgICAgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgICAgRE8yOworICAgICAgICAgICB0MSA9ICh0X3JlYWQoKSAtIHQxKT4+MTsKKyAgICAgICAgICAgaWYgKHQxIDwgdDIpIHQyID0gdDE7CisgICAgICAgfQorICAgICAgIGZwcmludGYoc3RkZXJyLCAiJTRsdSBiaXRzOiAlOWxsdSBjeWNsZXNcbiIsIHgqRElHSVRfQklULCB0Mik7CisgICB9CisgICBtcF9jbGVhcl9tdWx0aSgmYSwmYixOVUxMKTsKKworI3VuZGVmIERPMQorI3VuZGVmIERPMgorfQorI2Vsc2UKK3ZvaWQgdGltZV9tdWx0KHZvaWQpIHsgZnByaW50ZihzdGRlcnIsICJOTyBNVUxUXG4iKTsgfQordm9pZCB0aW1lX3Nxcih2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiTk8gU1FSXG4iKTsgfQorI2VuZGlmCisgICAKK3ZvaWQgdGltZV9wcm5nKHZvaWQpCit7CisgICB1bG9uZzY0IHQxLCB0MjsKKyAgIHVuc2lnbmVkIGNoYXIgYnVmWzQwOTZdOworICAgcHJuZ19zdGF0ZSB0cHJuZzsKKyAgIHVuc2lnbmVkIGxvbmcgeCwgeTsKKyAgIGludCAgICAgICAgICAgZXJyOworCisgICBmcHJpbnRmKHN0ZGVyciwgIlRpbWluZyBQUk5HcyAoY3ljbGVzL2J5dGUgb3V0cHV0LCBjeWNsZXMgYWRkX2VudHJvcHkgKDMyIGJ5dGVzKSA6XG4iKTsKKyAgIGZvciAoeCA9IDA7IHBybmdfZGVzY3JpcHRvclt4XS5uYW1lICE9IE5VTEw7IHgrKykgeworCisgICAgICAvKiBzYW5pdHkgY2hlY2sgb24gcHJuZyAqLworICAgICAgaWYgKChlcnIgPSBwcm5nX2Rlc2NyaXB0b3JbeF0udGVzdCgpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcblxuRVJST1I6IFBSTkcgJXMgZmFpbGVkIHNlbGYtdGVzdCAlc1xuIiwgcHJuZ19kZXNjcmlwdG9yW3hdLm5hbWUsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKKyAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgIH0KKworICAgICAgcHJuZ19kZXNjcmlwdG9yW3hdLnN0YXJ0KCZ0cHJuZyk7CisgICAgICB6ZXJvbWVtKGJ1ZiwgMjU2KTsKKyAgICAgIHBybmdfZGVzY3JpcHRvclt4XS5hZGRfZW50cm9weShidWYsIDI1NiwgJnRwcm5nKTsKKyAgICAgIHBybmdfZGVzY3JpcHRvclt4XS5yZWFkeSgmdHBybmcpOworICAgICAgdDIgPSAtMTsKKworI2RlZmluZSBETzEgaWYgKHBybmdfZGVzY3JpcHRvclt4XS5yZWFkKGJ1ZiwgNDA5NiwgJnRwcm5nKSAhPSA0MDk2KSB7IGZwcmludGYoc3RkZXJyLCAiXG5cbkVSUk9SIFJFQUQgIT0gNDA5NlxuXG4iKTsgZXhpdChFWElUX0ZBSUxVUkUpOyB9CisjZGVmaW5lIERPMiBETzEgRE8xCisgICAgICBmb3IgKHkgPSAwOyB5IDwgMTAwMDA7IHkrKykgeworICAgICAgICAgdF9zdGFydCgpOworICAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgIERPMjsKKyAgICAgICAgIHQxID0gKHRfcmVhZCgpIC0gdDEpPj4xOworICAgICAgICAgaWYgKHQxIDwgdDIpIHQyID0gdDE7CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUyMHM6ICU1bGx1ICIsIHBybmdfZGVzY3JpcHRvclt4XS5uYW1lLCB0Mj4+MTIpOworI3VuZGVmIERPMgorI3VuZGVmIERPMQorCisjZGVmaW5lIERPMSBwcm5nX2Rlc2NyaXB0b3JbeF0uc3RhcnQoJnRwcm5nKTsgcHJuZ19kZXNjcmlwdG9yW3hdLmFkZF9lbnRyb3B5KGJ1ZiwgMzIsICZ0cHJuZyk7IHBybmdfZGVzY3JpcHRvclt4XS5yZWFkeSgmdHBybmcpOyBwcm5nX2Rlc2NyaXB0b3JbeF0uZG9uZSgmdHBybmcpOworI2RlZmluZSBETzIgRE8xIERPMQorICAgICAgZm9yICh5ID0gMDsgeSA8IDEwMDAwOyB5KyspIHsKKyAgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgIHQxID0gdF9yZWFkKCk7CisgICAgICAgICBETzI7CisgICAgICAgICB0MSA9ICh0X3JlYWQoKSAtIHQxKT4+MTsKKyAgICAgICAgIGlmICh0MSA8IHQyKSB0MiA9IHQxOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICIlNWxsdVxuIiwgdDIpOworI3VuZGVmIERPMgorI3VuZGVmIERPMQorCisgICB9Cit9CisKKyNpZmRlZiBNUlNBICAgICAgCisvKiB0aW1lIHZhcmlvdXMgUlNBIG9wZXJhdGlvbnMgKi8KK3ZvaWQgdGltZV9yc2Eodm9pZCkKK3sKKyAgIHJzYV9rZXkga2V5OworICAgdWxvbmc2NCB0MSwgdDI7CisgICB1bnNpZ25lZCBjaGFyIGJ1ZlsyXVs0MDk2XTsKKyAgIHVuc2lnbmVkIGxvbmcgeCwgeSwgeiwgenp6OworICAgaW50ICAgICAgICAgICBlcnIsIHp6OworCisgICBmb3IgKHggPSAxMDI0OyB4IDw9IDIwNDg7IHggKz0gNTEyKSB7CisgICAgICAgdDIgPSAwOworICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgICAgaWYgKChlcnIgPSByc2FfbWFrZV9rZXkoJnlhcnJvd19wcm5nLCBmaW5kX3BybmcoInlhcnJvdyIpLCB4LzgsIDY1NTM3LCAma2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcblxucnNhX21ha2Vfa2V5IHNheXMgJXMsIHdhaXQuLi5ubyBpdCBzaG91bGQgc2F5ICVzLi4uZGFtbiB5b3UhXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSwgZXJyb3JfdG9fc3RyaW5nKENSWVBUX09LKSk7CisgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICB0MSA9IHRfcmVhZCgpIC0gdDE7CisgICAgICAgICAgIHQyICs9IHQxOworCisgICAgICAgICAgIGlmICh5IDwgMTUpIHsKKyAgICAgICAgICAgICAgcnNhX2ZyZWUoJmtleSk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgdDIgPj49IDQ7CisgICAgICAgZnByaW50ZihzdGRlcnIsICJSU0EtJWx1IG1ha2Vfa2V5ICAgIHRvb2sgJTE1bGx1IGN5Y2xlc1xuIiwgeCwgdDIpOworCisgICAgICAgdDIgPSAwOworICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgICAgeiA9IHNpemVvZihidWZbMV0pOworICAgICAgICAgICBpZiAoKGVyciA9IHJzYV9lbmNyeXB0X2tleShidWZbMF0sIDMyLCBidWZbMV0sICZ6LCAidGVzdHByb2ciLCA4LCAmeWFycm93X3BybmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfcHJuZygieWFycm93IiksIGZpbmRfaGFzaCgic2hhMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcblxucnNhX2VuY3J5cHRfa2V5IHNheXMgJXMsIHdhaXQuLi5ubyBpdCBzaG91bGQgc2F5ICVzLi4uZGFtbiB5b3UhXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSwgZXJyb3JfdG9fc3RyaW5nKENSWVBUX09LKSk7CisgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICB0MSA9IHRfcmVhZCgpIC0gdDE7CisgICAgICAgICAgIHQyICs9IHQxOworICAgICAgIH0KKyAgICAgICB0MiA+Pj0gNDsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlJTQS0lbHUgZW5jcnlwdF9rZXkgdG9vayAlMTVsbHUgY3ljbGVzXG4iLCB4LCB0Mik7CisKKyAgICAgICB0MiA9IDA7CisgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgICAgdF9zdGFydCgpOworICAgICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICAgICB6enogPSBzaXplb2YoYnVmWzBdKTsKKyAgICAgICAgICAgaWYgKChlcnIgPSByc2FfZGVjcnlwdF9rZXkoYnVmWzFdLCB6LCBidWZbMF0sICZ6enosICJ0ZXN0cHJvZyIsIDgsICBmaW5kX2hhc2goInNoYTEiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ6eiwgJmtleSkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5cbnJzYV9kZWNyeXB0X2tleSBzYXlzICVzLCB3YWl0Li4ubm8gaXQgc2hvdWxkIHNheSAlcy4uLmRhbW4geW91IVxuIiwgZXJyb3JfdG9fc3RyaW5nKGVyciksIGVycm9yX3RvX3N0cmluZyhDUllQVF9PSykpOworICAgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgdDEgPSB0X3JlYWQoKSAtIHQxOworICAgICAgICAgICB0MiArPSB0MTsKKyAgICAgICB9CisgICAgICAgdDIgPj49IDQ7CisgICAgICAgZnByaW50ZihzdGRlcnIsICJSU0EtJWx1IGRlY3J5cHRfa2V5IHRvb2sgJTE1bGx1IGN5Y2xlc1xuIiwgeCwgdDIpOworCisKKyAgICAgICByc2FfZnJlZSgma2V5KTsKKyAgfQorfQorI2Vsc2UKK3ZvaWQgdGltZV9yc2Eodm9pZCkgeyBmcHJpbnRmKHN0ZGVyciwgIk5PIFJTQVxuIik7IH0KKyNlbmRpZgorCisjaWZkZWYgTUVDQworLyogdGltZSB2YXJpb3VzIEVDQyBvcGVyYXRpb25zICovCit2b2lkIHRpbWVfZWNjKHZvaWQpCit7CisgICBlY2Nfa2V5IGtleTsKKyAgIHVsb25nNjQgdDEsIHQyOworICAgdW5zaWduZWQgY2hhciBidWZbMl1bNDA5Nl07CisgICB1bnNpZ25lZCBsb25nIGksIHgsIHksIHo7CisgICBpbnQgICAgICAgICAgIGVycjsKKyAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNpemVzW10gPSB7MTkyLzgsIDI1Ni84LCAzODQvOCwgNTIxLzgsIDEwMDAwMH07CisKKyAgIGZvciAoeCA9IHNpemVzW2k9MF07IHggPCAxMDAwMDA7IHggPSBzaXplc1srK2ldKSB7CisgICAgICAgdDIgPSAwOworICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKSB7CisgICAgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgICAgaWYgKChlcnIgPSBlY2NfbWFrZV9rZXkoJnlhcnJvd19wcm5nLCBmaW5kX3BybmcoInlhcnJvdyIpLCB4LCAma2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcblxuZWNjX21ha2Vfa2V5IHNheXMgJXMsIHdhaXQuLi5ubyBpdCBzaG91bGQgc2F5ICVzLi4uZGFtbiB5b3UhXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSwgZXJyb3JfdG9fc3RyaW5nKENSWVBUX09LKSk7CisgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICB0MSA9IHRfcmVhZCgpIC0gdDE7CisgICAgICAgICAgIHQyICs9IHQxOworCisgICAgICAgICAgIGlmICh5IDwgMTUpIHsKKyAgICAgICAgICAgICAgZWNjX2ZyZWUoJmtleSk7CisgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgdDIgPj49IDQ7CisgICAgICAgZnByaW50ZihzdGRlcnIsICJFQ0MtJWx1IG1ha2Vfa2V5ICAgIHRvb2sgJTE1bGx1IGN5Y2xlc1xuIiwgeCo4LCB0Mik7CisKKyAgICAgICB0MiA9IDA7CisgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgICAgdF9zdGFydCgpOworICAgICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICAgICB6ID0gc2l6ZW9mKGJ1ZlsxXSk7CisgICAgICAgICAgIGlmICgoZXJyID0gZWNjX2VuY3J5cHRfa2V5KGJ1ZlswXSwgMjAsIGJ1ZlsxXSwgJnosICZ5YXJyb3dfcHJuZywgZmluZF9wcm5nKCJ5YXJyb3ciKSwgZmluZF9oYXNoKCJzaGExIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXkpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuXG5lY2NfZW5jcnlwdF9rZXkgc2F5cyAlcywgd2FpdC4uLm5vIGl0IHNob3VsZCBzYXkgJXMuLi5kYW1uIHlvdSFcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpLCBlcnJvcl90b19zdHJpbmcoQ1JZUFRfT0spKTsKKyAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICB9CisgICAgICAgICAgIHQxID0gdF9yZWFkKCkgLSB0MTsKKyAgICAgICAgICAgdDIgKz0gdDE7CisgICAgICAgfQorICAgICAgIHQyID4+PSA0OworICAgICAgIGZwcmludGYoc3RkZXJyLCAiRUNDLSVsdSBlbmNyeXB0X2tleSB0b29rICUxNWxsdSBjeWNsZXNcbiIsIHgqOCwgdDIpOworICAgICAgIGVjY19mcmVlKCZrZXkpOworICB9Cit9CisjZWxzZQordm9pZCB0aW1lX2VjYyh2b2lkKSB7IGZwcmludGYoc3RkZXJyLCAiTk8gRUNDXG4iKTsgfQorI2VuZGlmCisKKyNpZmRlZiBNREgKKy8qIHRpbWUgdmFyaW91cyBESCBvcGVyYXRpb25zICovCit2b2lkIHRpbWVfZGgodm9pZCkKK3sKKyAgIGRoX2tleSBrZXk7CisgICB1bG9uZzY0IHQxLCB0MjsKKyAgIHVuc2lnbmVkIGNoYXIgYnVmWzJdWzQwOTZdOworICAgdW5zaWduZWQgbG9uZyBpLCB4LCB5LCB6OworICAgaW50ICAgICAgICAgICBlcnI7CisgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBzaXplc1tdID0gezc2OC84LCAxMDI0LzgsIDE1MzYvOCwgMjA0OC84LCAzMDcyLzgsIDQwOTYvOCwgMTAwMDAwfTsKKworICAgZm9yICh4ID0gc2l6ZXNbaT0wXTsgeCA8IDEwMDAwMDsgeCA9IHNpemVzWysraV0pIHsKKyAgICAgICB0MiA9IDA7CisgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspIHsKKyAgICAgICAgICAgdF9zdGFydCgpOworICAgICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICAgICBpZiAoKGVyciA9IGRoX21ha2Vfa2V5KCZ5YXJyb3dfcHJuZywgZmluZF9wcm5nKCJ5YXJyb3ciKSwgeCwgJmtleSkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5cbmRoX21ha2Vfa2V5IHNheXMgJXMsIHdhaXQuLi5ubyBpdCBzaG91bGQgc2F5ICVzLi4uZGFtbiB5b3UhXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSwgZXJyb3JfdG9fc3RyaW5nKENSWVBUX09LKSk7CisgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICB0MSA9IHRfcmVhZCgpIC0gdDE7CisgICAgICAgICAgIHQyICs9IHQxOworCisgICAgICAgICAgIGlmICh5IDwgMTUpIHsKKyAgICAgICAgICAgICAgZGhfZnJlZSgma2V5KTsKKyAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICB0MiA+Pj0gNDsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkRILSU0bHUgbWFrZV9rZXkgICAgdG9vayAlMTVsbHUgY3ljbGVzXG4iLCB4KjgsIHQyKTsKKworICAgICAgIHQyID0gMDsKKyAgICAgICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkrKykgeworICAgICAgICAgICB0X3N0YXJ0KCk7CisgICAgICAgICAgIHQxID0gdF9yZWFkKCk7CisgICAgICAgICAgIHogPSBzaXplb2YoYnVmWzFdKTsKKyAgICAgICAgICAgaWYgKChlcnIgPSBkaF9lbmNyeXB0X2tleShidWZbMF0sIDIwLCBidWZbMV0sICZ6LCAmeWFycm93X3BybmcsIGZpbmRfcHJuZygieWFycm93IiksIGZpbmRfaGFzaCgic2hhMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcblxuZGhfZW5jcnlwdF9rZXkgc2F5cyAlcywgd2FpdC4uLm5vIGl0IHNob3VsZCBzYXkgJXMuLi5kYW1uIHlvdSFcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpLCBlcnJvcl90b19zdHJpbmcoQ1JZUFRfT0spKTsKKyAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICAgICB9CisgICAgICAgICAgIHQxID0gdF9yZWFkKCkgLSB0MTsKKyAgICAgICAgICAgdDIgKz0gdDE7CisgICAgICAgfQorICAgICAgIHQyID4+PSA0OworICAgICAgIGZwcmludGYoc3RkZXJyLCAiREgtJTRsdSBlbmNyeXB0X2tleSB0b29rICUxNWxsdSBjeWNsZXNcbiIsIHgqOCwgdDIpOworICAgICAgIGRoX2ZyZWUoJmtleSk7CisgIH0KK30KKyNlbHNlCit2b2lkIHRpbWVfZGgodm9pZCkgeyBmcHJpbnRmKHN0ZGVyciwgIk5PIERIXG4iKTsgfQorI2VuZGlmCisKK3ZvaWQgdGltZV9tYWNzXyh1bnNpZ25lZCBsb25nIE1BQ19TSVpFKQoreworICAgdW5zaWduZWQgY2hhciAqYnVmLCBrZXlbMTZdLCB0YWdbMTZdOworICAgdWxvbmc2NCB0MSwgdDI7CisgICB1bnNpZ25lZCBsb25nIHgsIHo7CisgICBpbnQgZXJyLCBjaXBoZXJfaWR4LCBoYXNoX2lkeDsKKworICAgZnByaW50ZihzdGRlcnIsICJcbk1BQyBUaW1pbmdzIChjeWNsZXMvYnl0ZSBvbiAlbHVLQiBibG9ja3MpOlxuIiwgTUFDX1NJWkUpOworCisgICBidWYgPSBYTUFMTE9DKE1BQ19TSVpFKjEwMjQpOworICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuXG5vdXQgb2YgaGVhcCB5b1xuXG4iKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgIH0KKworICAgY2lwaGVyX2lkeCA9IGZpbmRfY2lwaGVyKCJhZXMiKTsKKyAgIGhhc2hfaWR4ICAgPSBmaW5kX2hhc2goIm1kNSIpOworCisgICB5YXJyb3dfcmVhZChidWYsIE1BQ19TSVpFKjEwMjQsICZ5YXJyb3dfcHJuZyk7CisgICB5YXJyb3dfcmVhZChrZXksIDE2LCAmeWFycm93X3BybmcpOworCisjaWZkZWYgT01BQworICAgdDIgPSAtMTsKKyAgIGZvciAoeCA9IDA7IHggPCAxMDAwMDsgeCsrKSB7CisgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgeiA9IDE2OworICAgICAgICBpZiAoKGVyciA9IG9tYWNfbWVtb3J5KGNpcGhlcl9pZHgsIGtleSwgMTYsIGJ1ZiwgTUFDX1NJWkUqMTAyNCwgdGFnLCAmeikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5cbm9tYWMgZXJyb3IuLi4gJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHQxID0gdF9yZWFkKCkgLSB0MTsKKyAgICAgICAgaWYgKHQxIDwgdDIpIHQyID0gdDE7CisgICB9CisgICBmcHJpbnRmKHN0ZGVyciwgIk9NQUMtQUVTXHRcdCU5bGx1XG4iLCB0Mi8odWxvbmc2NCkoTUFDX1NJWkUqMTAyNCkpOworI2VuZGlmCisKKyNpZmRlZiBQTUFDCisgICB0MiA9IC0xOworICAgZm9yICh4ID0gMDsgeCA8IDEwMDAwOyB4KyspIHsKKyAgICAgICAgdF9zdGFydCgpOworICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICB6ID0gMTY7CisgICAgICAgIGlmICgoZXJyID0gcG1hY19tZW1vcnkoY2lwaGVyX2lkeCwga2V5LCAxNiwgYnVmLCBNQUNfU0laRSoxMDI0LCB0YWcsICZ6KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcblxucG1hYyBlcnJvci4uLiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgdDEgPSB0X3JlYWQoKSAtIHQxOworICAgICAgICBpZiAodDEgPCB0MikgdDIgPSB0MTsKKyAgIH0KKyAgIGZwcmludGYoc3RkZXJyLCAiUE1BQy1BRVNcdFx0JTlsbHVcbiIsIHQyLyh1bG9uZzY0KShNQUNfU0laRSoxMDI0KSk7CisjZW5kaWYKKworI2lmZGVmIFBFTElDQU4KKyAgIHQyID0gLTE7CisgICBmb3IgKHggPSAwOyB4IDwgMTAwMDA7IHgrKykgeworICAgICAgICB0X3N0YXJ0KCk7CisgICAgICAgIHQxID0gdF9yZWFkKCk7CisgICAgICAgIHogPSAxNjsKKyAgICAgICAgaWYgKChlcnIgPSBwZWxpY2FuX21lbW9yeShrZXksIDE2LCBidWYsIE1BQ19TSVpFKjEwMjQsIHRhZykpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5cbnBlbGljYW4gZXJyb3IuLi4gJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHQxID0gdF9yZWFkKCkgLSB0MTsKKyAgICAgICAgaWYgKHQxIDwgdDIpIHQyID0gdDE7CisgICB9CisgICBmcHJpbnRmKHN0ZGVyciwgIlBFTElDQU4gXHRcdCU5bGx1XG4iLCB0Mi8odWxvbmc2NCkoTUFDX1NJWkUqMTAyNCkpOworI2VuZGlmCisKKyNpZmRlZiBITUFDCisgICB0MiA9IC0xOworICAgZm9yICh4ID0gMDsgeCA8IDEwMDAwOyB4KyspIHsKKyAgICAgICAgdF9zdGFydCgpOworICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICB6ID0gMTY7CisgICAgICAgIGlmICgoZXJyID0gaG1hY19tZW1vcnkoaGFzaF9pZHgsIGtleSwgMTYsIGJ1ZiwgTUFDX1NJWkUqMTAyNCwgdGFnLCAmeikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5cbmhtYWMgZXJyb3IuLi4gJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHQxID0gdF9yZWFkKCkgLSB0MTsKKyAgICAgICAgaWYgKHQxIDwgdDIpIHQyID0gdDE7CisgICB9CisgICBmcHJpbnRmKHN0ZGVyciwgIkhNQUMtTUQ1XHRcdCU5bGx1XG4iLCB0Mi8odWxvbmc2NCkoTUFDX1NJWkUqMTAyNCkpOworI2VuZGlmCisKKyAgIFhGUkVFKGJ1Zik7Cit9CisKK3ZvaWQgdGltZV9tYWNzKHZvaWQpCit7CisgICB0aW1lX21hY3NfKDEpOworICAgdGltZV9tYWNzXyg0KTsKKyAgIHRpbWVfbWFjc18oMzIpOworfQorCit2b2lkIHRpbWVfZW5jbWFjc18odW5zaWduZWQgbG9uZyBNQUNfU0laRSkKK3sKKyAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgSVZbMTZdLCBrZXlbMTZdLCB0YWdbMTZdOworICAgdWxvbmc2NCB0MSwgdDI7CisgICB1bnNpZ25lZCBsb25nIHgsIHo7CisgICBpbnQgZXJyLCBjaXBoZXJfaWR4OworCisgICBmcHJpbnRmKHN0ZGVyciwgIlxuRU5DK01BQyBUaW1pbmdzICh6ZXJvIGJ5dGUgQUFELCAxNiBieXRlIElWLCBjeWNsZXMvYnl0ZSBvbiAlbHVLQiBibG9ja3MpOlxuIiwgTUFDX1NJWkUpOworCisgICBidWYgPSBYTUFMTE9DKE1BQ19TSVpFKjEwMjQpOworICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuXG5vdXQgb2YgaGVhcCB5b1xuXG4iKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgIH0KKworICAgY2lwaGVyX2lkeCA9IGZpbmRfY2lwaGVyKCJhZXMiKTsKKworICAgeWFycm93X3JlYWQoYnVmLCBNQUNfU0laRSoxMDI0LCAmeWFycm93X3BybmcpOworICAgeWFycm93X3JlYWQoa2V5LCAxNiwgJnlhcnJvd19wcm5nKTsKKyAgIHlhcnJvd19yZWFkKElWLCAxNiwgJnlhcnJvd19wcm5nKTsKKworI2lmZGVmIEVBWF9NT0RFCisgICB0MiA9IC0xOworICAgZm9yICh4ID0gMDsgeCA8IDEwMDAwOyB4KyspIHsKKyAgICAgICAgdF9zdGFydCgpOworICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICB6ID0gMTY7CisgICAgICAgIGlmICgoZXJyID0gZWF4X2VuY3J5cHRfYXV0aGVudGljYXRlX21lbW9yeShjaXBoZXJfaWR4LCBrZXksIDE2LCBJViwgMTYsIE5VTEwsIDAsIGJ1ZiwgTUFDX1NJWkUqMTAyNCwgYnVmLCB0YWcsICZ6KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbkVBWCBlcnJvci4uLiAlc1xuIiwgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgdDEgPSB0X3JlYWQoKSAtIHQxOworICAgICAgICBpZiAodDEgPCB0MikgdDIgPSB0MTsKKyAgIH0KKyAgIGZwcmludGYoc3RkZXJyLCAiRUFYIFx0XHQlOWxsdVxuIiwgdDIvKHVsb25nNjQpKE1BQ19TSVpFKjEwMjQpKTsKKyNlbmRpZgorCisjaWZkZWYgT0NCX01PREUKKyAgIHQyID0gLTE7CisgICBmb3IgKHggPSAwOyB4IDwgMTAwMDA7IHgrKykgeworICAgICAgICB0X3N0YXJ0KCk7CisgICAgICAgIHQxID0gdF9yZWFkKCk7CisgICAgICAgIHogPSAxNjsKKyAgICAgICAgaWYgKChlcnIgPSBvY2JfZW5jcnlwdF9hdXRoZW50aWNhdGVfbWVtb3J5KGNpcGhlcl9pZHgsIGtleSwgMTYsIElWLCBidWYsIE1BQ19TSVpFKjEwMjQsIGJ1ZiwgdGFnLCAmeikpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5PQ0IgZXJyb3IuLi4gJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHQxID0gdF9yZWFkKCkgLSB0MTsKKyAgICAgICAgaWYgKHQxIDwgdDIpIHQyID0gdDE7CisgICB9CisgICBmcHJpbnRmKHN0ZGVyciwgIk9DQiBcdFx0JTlsbHVcbiIsIHQyLyh1bG9uZzY0KShNQUNfU0laRSoxMDI0KSk7CisjZW5kaWYKKworI2lmZGVmIENDTV9NT0RFCisgICB0MiA9IC0xOworICAgZm9yICh4ID0gMDsgeCA8IDEwMDAwOyB4KyspIHsKKyAgICAgICAgdF9zdGFydCgpOworICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICB6ID0gMTY7CisgICAgICAgIGlmICgoZXJyID0gY2NtX21lbW9yeShjaXBoZXJfaWR4LCBrZXksIDE2LCBJViwgMTYsIE5VTEwsIDAsIGJ1ZiwgTUFDX1NJWkUqMTAyNCwgYnVmLCB0YWcsICZ6LCBDQ01fRU5DUllQVCkpICE9IENSWVBUX09LKSB7CisgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5DQ00gZXJyb3IuLi4gJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHQxID0gdF9yZWFkKCkgLSB0MTsKKyAgICAgICAgaWYgKHQxIDwgdDIpIHQyID0gdDE7CisgICB9CisgICBmcHJpbnRmKHN0ZGVyciwgIkNDTSBcdFx0JTlsbHVcbiIsIHQyLyh1bG9uZzY0KShNQUNfU0laRSoxMDI0KSk7CisjZW5kaWYKKworI2lmZGVmIEdDTV9NT0RFCisgICB0MiA9IC0xOworICAgZm9yICh4ID0gMDsgeCA8IDEwMDsgeCsrKSB7CisgICAgICAgIHRfc3RhcnQoKTsKKyAgICAgICAgdDEgPSB0X3JlYWQoKTsKKyAgICAgICAgeiA9IDE2OworICAgICAgICBpZiAoKGVyciA9IGdjbV9tZW1vcnkoY2lwaGVyX2lkeCwga2V5LCAxNiwgSVYsIDE2LCBOVUxMLCAwLCBidWYsIE1BQ19TSVpFKjEwMjQsIGJ1ZiwgdGFnLCAmeiwgR0NNX0VOQ1JZUFQpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuR0NNIGVycm9yLi4uICVzXG4iLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICB0MSA9IHRfcmVhZCgpIC0gdDE7CisgICAgICAgIGlmICh0MSA8IHQyKSB0MiA9IHQxOworICAgfQorICAgZnByaW50ZihzdGRlcnIsICJHQ00gKG5vLXByZWNvbXApXHQlOWxsdVxuIiwgdDIvKHVsb25nNjQpKE1BQ19TSVpFKjEwMjQpKTsKKworICAgeworICAgZ2NtX3N0YXRlIGdjbTsKKworICAgaWYgKChlcnIgPSBnY21faW5pdCgmZ2NtLCBjaXBoZXJfaWR4LCBrZXksIDE2KSkgIT0gQ1JZUFRfT0spIHsgZnByaW50ZihzdGRlcnIsICJnY21faW5pdDogJXNcbiIsIGVycm9yX3RvX3N0cmluZyhlcnIpKTsgZXhpdChFWElUX0ZBSUxVUkUpOyB9CisgICB0MiA9IC0xOworICAgZm9yICh4ID0gMDsgeCA8IDEwMDAwOyB4KyspIHsKKyAgICAgICAgdF9zdGFydCgpOworICAgICAgICB0MSA9IHRfcmVhZCgpOworICAgICAgICB6ID0gMTY7CisgICAgICAgIGlmICgoZXJyID0gZ2NtX3Jlc2V0KCZnY20pKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbkdDTSBlcnJvclslZF0uLi4gJXNcbiIsIF9fTElORV9fLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGVyciA9IGdjbV9hZGRfaXYoJmdjbSwgSVYsIDE2KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5HQ00gZXJyb3JbJWRdLi4uICVzXG4iLCBfX0xJTkVfXywgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnIgPSBnY21fYWRkX2FhZCgmZ2NtLCBOVUxMLCAwKSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5HQ00gZXJyb3JbJWRdLi4uICVzXG4iLCBfX0xJTkVfXywgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnIgPSBnY21fcHJvY2VzcygmZ2NtLCBidWYsIE1BQ19TSVpFKjEwMjQsIGJ1ZiwgR0NNX0VOQ1JZUFQpKSAhPSBDUllQVF9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbkdDTSBlcnJvclslZF0uLi4gJXNcbiIsIF9fTElORV9fLCBlcnJvcl90b19zdHJpbmcoZXJyKSk7CisgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKChlcnIgPSBnY21fZG9uZSgmZ2NtLCB0YWcsICZ6KSkgIT0gQ1JZUFRfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5HQ00gZXJyb3JbJWRdLi4uICVzXG4iLCBfX0xJTkVfXywgZXJyb3JfdG9fc3RyaW5nKGVycikpOworICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgdDEgPSB0X3JlYWQoKSAtIHQxOworICAgICAgICBpZiAodDEgPCB0MikgdDIgPSB0MTsKKyAgIH0KKyAgIGZwcmludGYoc3RkZXJyLCAiR0NNIChwcmVjb21wKVx0JTlsbHVcbiIsIHQyLyh1bG9uZzY0KShNQUNfU0laRSoxMDI0KSk7CisgICB9CisKKyNlbmRpZgorCit9IAorCit2b2lkIHRpbWVfZW5jbWFjcyh2b2lkKQoreworICAgdGltZV9lbmNtYWNzXygxKTsKKyAgIHRpbWVfZW5jbWFjc18oNCk7CisgICB0aW1lX2VuY21hY3NfKDMyKTsKK30KKworLyogJFNvdXJjZTogL2N2cy9saWJ0b20vbGlidG9tY3J5cHQvdGVzdHByb2YveDg2X3Byb2YuYyx2ICQgKi8KKy8qICRSZXZpc2lvbjogMS4xNiAkICovCisvKiAkRGF0ZTogMjAwNS8wNi8xNCAyMDo0NDoyMyAkICovCmRpZmYgLS1naXQgYS90aW1fZXhwdG1vZC5jIGIvdGltX2V4cHRtb2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1ZDQ1OC4uMDAwMDAwMAotLS0gYS90aW1fZXhwdG1vZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLS8qIFJTQSBDb2RlIGJ5IFRvbSBTdCBEZW5pcyAqLwotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIFJTQV9USU1JTkcKLQotLyogZGVjcnlwdHMgYyBpbnRvIG0gKi8KLWludCB0aW1fZXhwdG1vZChwcm5nX3N0YXRlICpwcm5nLCBpbnQgcHJuZ19pZHgsIAotICAgICAgICAgICAgICAgIG1wX2ludCAqYywgbXBfaW50ICplLCBtcF9pbnQgKmQsIG1wX2ludCAqbiwgbXBfaW50ICptKQotewotICAgaW50ICAgICAgICAgICBlcnI7Ci0gICBtcF9pbnQgICAgICAgIHIsIHRtcCwgdG1wMjsKLSAgIHVuc2lnbmVkIGNoYXIgKnJ0bXA7Ci0gICB1bnNpZ25lZCBsb25nIHJsZW47Ci0KLSAgIF9BUkdDSEsoYyAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoZSAhPSBOVUxMKTsKLSAgIF9BUkdDSEsoZCAhPSBOVUxMKTsKLSAgIF9BUkdDSEsobiAhPSBOVUxMKTsKLSAgIF9BUkdDSEsobSAhPSBOVUxMKTsKLQotICAgaWYgKChlcnIgPSBwcm5nX2lzX3ZhbGlkKHBybmdfaWR4KSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIHBpY2sgcmFuZG9tIHIgKi8gCi0gICBydG1wID0gWE1BTExPQyhNQVhfUlNBX1NJWkUvOCk7Ci0gICBpZiAocnRtcCA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfTUVNOwotICAgfQotCi0KLSAgIHJsZW4gPSBtcF91bnNpZ25lZF9iaW5fc2l6ZShuKTsKLSAgIGlmIChwcm5nX2Rlc2NyaXB0b3JbcHJuZ19pZHhdLnJlYWQocnRtcCwgcmxlbiwgcHJuZykgIT0gcmxlbikgewotICAgICAgWEZSRUUocnRtcCk7Ci0gICAgICByZXR1cm4gQ1JZUFRfRVJST1JfUkVBRFBSTkc7Ci0gICB9Ci0KLSAgIGlmICgoZXJyID0gbXBfaW5pdF9tdWx0aSgmciwgJnRtcCwgJnRtcDIsIE5VTEwpKSAhPSBNUF9PS0FZKSB7Ci0gICAgICBYRlJFRShydG1wKTsKLSAgICAgIHJldHVybiBtcGlfdG9fbHRjX2Vycm9yKGVycik7Ci0gICB9Ci0KLSAgIC8qIHJlYWQgaW4gciAqLwotICAgaWYgKChlcnIgPSBtcF9yZWFkX3Vuc2lnbmVkX2JpbigmciwgcnRtcCwgcmxlbikpICE9IE1QX09LQVkpICAgICAgICAgICAgICB7IGdvdG8gX19FUlI7IH0KLQotICAgLyogY29tcHV0ZSB0bXAgPSByXmUgKi8KLSAgIGlmICgoZXJyID0gbXBfZXhwdG1vZCgmciwgZSwgbiwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIF9fRVJSOyB9Ci0KLSAgIC8qIG11bHRpcGx5IEMgaW50byB0aGUgbWl4ICovCi0gICBpZiAoKGVyciA9IG1wX211bG1vZChjLCAmdG1wLCBuLCAmdG1wKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBfX0VSUjsgfQotCi0gICAvKiByYWlzZSB0byBkICovCi0gICBpZiAoKGVyciA9IG1wX2V4cHRtb2QoJnRtcCwgZCwgbiwgJnRtcCkpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgIHsgZ290byBfX0VSUjsgfQotICAgCi0gICAvKiBpbnZlcnQgciBhbmQgbXVsdGlwbHkgKi8KLSAgIGlmICgoZXJyID0gbXBfaW52bW9kKCZyLCBuLCAmdG1wMikpICE9IE1QX09LQVkpICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIF9fRVJSOyB9Ci0KLSAgIC8qIG11bHRpcGx5IGFuZCB3ZSBhcmUgdG90YWxseSBzZXQgKi8KLSAgIGlmICgoZXJyID0gbXBfbXVsbW9kKCZ0bXAsICZ0bXAyLCBuLCBtKSkgIT0gTVBfT0tBWSkgICAgICAgICAgICAgICAgICAgICAgeyBnb3RvIF9fRVJSOyB9Ci0KLV9fRVJSOiAgbXBfY2xlYXJfbXVsdGkoJnIsICZ0bXAsICZ0bXAyLCBOVUxMKTsKLSAgIFhGUkVFKHJ0bXApOwotICAgcmV0dXJuIG1waV90b19sdGNfZXJyb3IoZXJyKTsKLX0KLQotI2VuZGlmIApkaWZmIC0tZ2l0IGEveHRlYS5jIGIveHRlYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDM0MTQ5Li4wMDAwMDAwCi0tLSBhL3h0ZWEuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLQotI2luY2x1ZGUgIm15Y3J5cHQuaCIKLQotI2lmZGVmIFhURUEKLQotY29uc3Qgc3RydWN0IF9jaXBoZXJfZGVzY3JpcHRvciB4dGVhX2Rlc2MgPQotewotICAgICJ4dGVhIiwKLSAgICAxLAotICAgIDE2LCAxNiwgOCwgMzIsCi0gICAgJnh0ZWFfc2V0dXAsCi0gICAgJnh0ZWFfZWNiX2VuY3J5cHQsCi0gICAgJnh0ZWFfZWNiX2RlY3J5cHQsCi0gICAgJnh0ZWFfdGVzdCwKLSAgICAmeHRlYV9rZXlzaXplCi19OwotCi1pbnQgeHRlYV9zZXR1cChjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4sIGludCBudW1fcm91bmRzLCBzeW1tZXRyaWNfa2V5ICpza2V5KQotewotICAgdW5zaWduZWQgbG9uZyB4LCBzdW0sIEtbNF07Ci0gICAKLSAgIF9BUkdDSEsoa2V5ICE9IE5VTEwpOwotICAgX0FSR0NISyhza2V5ICE9IE5VTEwpOwotCi0gICAvKiBjaGVjayBhcmd1bWVudHMgKi8KLSAgIGlmIChrZXlsZW4gIT0gMTYpIHsKLSAgICAgIHJldHVybiBDUllQVF9JTlZBTElEX0tFWVNJWkU7Ci0gICB9Ci0KLSAgIGlmIChudW1fcm91bmRzICE9IDAgJiYgbnVtX3JvdW5kcyAhPSAzMikgewotICAgICAgcmV0dXJuIENSWVBUX0lOVkFMSURfUk9VTkRTOwotICAgfQotCi0gICAvKiBsb2FkIGtleSAqLwotICAgTE9BRDMyTChLWzBdLCBrZXkrMCk7Ci0gICBMT0FEMzJMKEtbMV0sIGtleSs0KTsKLSAgIExPQUQzMkwoS1syXSwga2V5KzgpOwotICAgTE9BRDMyTChLWzNdLCBrZXkrMTIpOwotICAgCi0gICBmb3IgKHggPSBzdW0gPSAwOyB4IDwgMzI7IHgrKykgewotICAgICAgIHNrZXktPnh0ZWEuQVt4XSA9IChzdW0gKyBLW3N1bSYzXSkgJiAweEZGRkZGRkZGVUw7Ci0gICAgICAgc3VtID0gKHN1bSArIDB4OUUzNzc5QjlVTCkgJiAweEZGRkZGRkZGVUw7Ci0gICAgICAgc2tleS0+eHRlYS5CW3hdID0gKHN1bSArIEtbKHN1bT4+MTEpJjNdKSAmIDB4RkZGRkZGRkZVTDsKLSAgIH0KLSAgIAotI2lmZGVmIENMRUFOX1NUQUNLCi0gICB6ZXJvbWVtKCZLLCBzaXplb2YoSykpOwotI2VuZGlmICAgCi0gICAKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotdm9pZCB4dGVhX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0LCB1bnNpZ25lZCBjaGFyICpjdCwgc3ltbWV0cmljX2tleSAqa2V5KQotewotICAgdW5zaWduZWQgbG9uZyB5LCB6OwotICAgaW50IHI7Ci0KLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0KLSAgIExPQUQzMkwoeSwgJnB0WzBdKTsKLSAgIExPQUQzMkwoeiwgJnB0WzRdKTsKLSAgIGZvciAociA9IDA7IHIgPCAzMjsgciArPSA0KSB7Ci0gICAgICAgeSA9ICh5ICsgKCgoKHo8PDQpXih6Pj41KSkgKyB6KSBeIGtleS0+eHRlYS5BW3JdKSkgJiAweEZGRkZGRkZGVUw7Ci0gICAgICAgeiA9ICh6ICsgKCgoKHk8PDQpXih5Pj41KSkgKyB5KSBeIGtleS0+eHRlYS5CW3JdKSkgJiAweEZGRkZGRkZGVUw7Ci0KLSAgICAgICB5ID0gKHkgKyAoKCgoejw8NCleKHo+PjUpKSArIHopIF4ga2V5LT54dGVhLkFbcisxXSkpICYgMHhGRkZGRkZGRlVMOwotICAgICAgIHogPSAoeiArICgoKCh5PDw0KV4oeT4+NSkpICsgeSkgXiBrZXktPnh0ZWEuQltyKzFdKSkgJiAweEZGRkZGRkZGVUw7Ci0KLSAgICAgICB5ID0gKHkgKyAoKCgoejw8NCleKHo+PjUpKSArIHopIF4ga2V5LT54dGVhLkFbcisyXSkpICYgMHhGRkZGRkZGRlVMOwotICAgICAgIHogPSAoeiArICgoKCh5PDw0KV4oeT4+NSkpICsgeSkgXiBrZXktPnh0ZWEuQltyKzJdKSkgJiAweEZGRkZGRkZGVUw7Ci0KLSAgICAgICB5ID0gKHkgKyAoKCgoejw8NCleKHo+PjUpKSArIHopIF4ga2V5LT54dGVhLkFbciszXSkpICYgMHhGRkZGRkZGRlVMOwotICAgICAgIHogPSAoeiArICgoKCh5PDw0KV4oeT4+NSkpICsgeSkgXiBrZXktPnh0ZWEuQltyKzNdKSkgJiAweEZGRkZGRkZGVUw7Ci0gICB9Ci0gICBTVE9SRTMyTCh5LCAmY3RbMF0pOwotICAgU1RPUkUzMkwoeiwgJmN0WzRdKTsKLX0KLQotdm9pZCB4dGVhX2VjYl9kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN0LCB1bnNpZ25lZCBjaGFyICpwdCwgc3ltbWV0cmljX2tleSAqa2V5KQotewotICAgdW5zaWduZWQgbG9uZyB5LCB6OwotICAgaW50IHI7Ci0KLSAgIF9BUkdDSEsocHQgIT0gTlVMTCk7Ci0gICBfQVJHQ0hLKGN0ICE9IE5VTEwpOwotICAgX0FSR0NISyhrZXkgIT0gTlVMTCk7Ci0KLSAgIExPQUQzMkwoeSwgJmN0WzBdKTsKLSAgIExPQUQzMkwoeiwgJmN0WzRdKTsKLSAgIGZvciAociA9IDMxOyByID49IDA7IHIgLT0gNCkgewotICAgICAgIHogPSAoeiAtICgoKCh5PDw0KV4oeT4+NSkpICsgeSkgXiBrZXktPnh0ZWEuQltyXSkpICYgMHhGRkZGRkZGRlVMOwotICAgICAgIHkgPSAoeSAtICgoKCh6PDw0KV4oej4+NSkpICsgeikgXiBrZXktPnh0ZWEuQVtyXSkpICYgMHhGRkZGRkZGRlVMOwotCi0gICAgICAgeiA9ICh6IC0gKCgoKHk8PDQpXih5Pj41KSkgKyB5KSBeIGtleS0+eHRlYS5CW3ItMV0pKSAmIDB4RkZGRkZGRkZVTDsKLSAgICAgICB5ID0gKHkgLSAoKCgoejw8NCleKHo+PjUpKSArIHopIF4ga2V5LT54dGVhLkFbci0xXSkpICYgMHhGRkZGRkZGRlVMOwotCi0gICAgICAgeiA9ICh6IC0gKCgoKHk8PDQpXih5Pj41KSkgKyB5KSBeIGtleS0+eHRlYS5CW3ItMl0pKSAmIDB4RkZGRkZGRkZVTDsKLSAgICAgICB5ID0gKHkgLSAoKCgoejw8NCleKHo+PjUpKSArIHopIF4ga2V5LT54dGVhLkFbci0yXSkpICYgMHhGRkZGRkZGRlVMOwotCi0gICAgICAgeiA9ICh6IC0gKCgoKHk8PDQpXih5Pj41KSkgKyB5KSBeIGtleS0+eHRlYS5CW3ItM10pKSAmIDB4RkZGRkZGRkZVTDsKLSAgICAgICB5ID0gKHkgLSAoKCgoejw8NCleKHo+PjUpKSArIHopIF4ga2V5LT54dGVhLkFbci0zXSkpICYgMHhGRkZGRkZGRlVMOwotICAgfQotICAgU1RPUkUzMkwoeSwgJnB0WzBdKTsKLSAgIFNUT1JFMzJMKHosICZwdFs0XSk7Ci19Ci0KLWludCB4dGVhX3Rlc3Qodm9pZCkKLXsKLSAjaWZuZGVmIExUQ19URVNUCi0gICAgcmV0dXJuIENSWVBUX05PUDsKLSAjZWxzZSAgICAKLSAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtleVsxNl0gPSAKLSAgICAgIHsgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiwgMHhmMCwgMHhjZCwgMHhjYiwgMHg5YSwKLSAgICAgICAgMHg0OCwgMHgzNywgMHgyNiwgMHgxNSwgMHhjMCwgMHhiZiwgMHhhZSwgMHg5ZCB9OwotICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcHRbOF0gPSAKLSAgICAgIHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCB9OwotICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY3RbOF0gPSAKLSAgICAgIHsgMHg3NSwgMHhkNywgMHhjNSwgMHhiZiwgMHhjZiwgMHg1OCwgMHhjOSwgMHgzZiB9OwotICAgdW5zaWduZWQgY2hhciB0bXBbMl1bOF07Ci0gICBzeW1tZXRyaWNfa2V5IHNrZXk7Ci0gICBpbnQgZXJyLCB5OwotCi0gICBpZiAoKGVyciA9IHh0ZWFfc2V0dXAoa2V5LCAxNiwgMCwgJnNrZXkpKSAhPSBDUllQVF9PSykgIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICB4dGVhX2VjYl9lbmNyeXB0KHB0LCB0bXBbMF0sICZza2V5KTsKLSAgIHh0ZWFfZWNiX2RlY3J5cHQodG1wWzBdLCB0bXBbMV0sICZza2V5KTsKLQotICAgaWYgKG1lbWNtcCh0bXBbMF0sIGN0LCA4KSAhPSAwIHx8IG1lbWNtcCh0bXBbMV0sIHB0LCA4KSAhPSAwKSB7IAotICAgICAgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKLSAgIH0KLQotICAgICAgLyogbm93IHNlZSBpZiB3ZSBjYW4gZW5jcnlwdCBhbGwgemVybyBieXRlcyAxMDAwIHRpbWVzLCBkZWNyeXB0IGFuZCBjb21lIGJhY2sgd2hlcmUgd2Ugc3RhcnRlZCAqLwotICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgdG1wWzBdW3ldID0gMDsKLSAgICAgIGZvciAoeSA9IDA7IHkgPCAxMDAwOyB5KyspIHh0ZWFfZWNiX2VuY3J5cHQodG1wWzBdLCB0bXBbMF0sICZza2V5KTsKLSAgICAgIGZvciAoeSA9IDA7IHkgPCAxMDAwOyB5KyspIHh0ZWFfZWNiX2RlY3J5cHQodG1wWzBdLCB0bXBbMF0sICZza2V5KTsKLSAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIGlmICh0bXBbMF1beV0gIT0gMCkgcmV0dXJuIENSWVBUX0ZBSUxfVEVTVFZFQ1RPUjsKLQotICAgcmV0dXJuIENSWVBUX09LOwotICNlbmRpZgotfQotCi1pbnQgeHRlYV9rZXlzaXplKGludCAqZGVzaXJlZF9rZXlzaXplKQotewotICAgX0FSR0NISyhkZXNpcmVkX2tleXNpemUgIT0gTlVMTCk7Ci0gICBpZiAoKmRlc2lyZWRfa2V5c2l6ZSA8IDE2KSB7Ci0gICAgICByZXR1cm4gQ1JZUFRfSU5WQUxJRF9LRVlTSVpFOyAKLSAgIH0KLSAgICpkZXNpcmVkX2tleXNpemUgPSAxNjsKLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotCi0jZW5kaWYKLQotCi0KZGlmZiAtLWdpdCBhL3lhcnJvdy5jIGIveWFycm93LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTVmNzguLjAwMDAwMDAKLS0tIGEveWFycm93LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyogTGliVG9tQ3J5cHQsIG1vZHVsYXIgY3J5cHRvZ3JhcGhpYyBsaWJyYXJ5IC0tIFRvbSBTdCBEZW5pcwotICoKLSAqIExpYlRvbUNyeXB0IGlzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHZhcmlvdXMgY3J5cHRvZ3JhcGhpYwotICogYWxnb3JpdGhtcyBpbiBhIGhpZ2hseSBtb2R1bGFyIGFuZCBmbGV4aWJsZSBtYW5uZXIuCi0gKgotICogVGhlIGxpYnJhcnkgaXMgZnJlZSBmb3IgYWxsIHB1cnBvc2VzIHdpdGhvdXQgYW55IGV4cHJlc3MKLSAqIGd1YXJhbnRlZSBpdCB3b3Jrcy4KLSAqCi0gKiBUb20gU3QgRGVuaXMsIHRvbXN0ZGVuaXNAaWFodS5jYSwgaHR0cDovL2xpYnRvbWNyeXB0Lm9yZwotICovCi0KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLSNpZmRlZiBZQVJST1cKLQotY29uc3Qgc3RydWN0IF9wcm5nX2Rlc2NyaXB0b3IgeWFycm93X2Rlc2MgPQotewotICAgICJ5YXJyb3ciLAotICAgICZ5YXJyb3dfc3RhcnQsCi0gICAgJnlhcnJvd19hZGRfZW50cm9weSwKLSAgICAmeWFycm93X3JlYWR5LAotICAgICZ5YXJyb3dfcmVhZAotfTsKLQotaW50IHlhcnJvd19zdGFydChwcm5nX3N0YXRlICpwcm5nKQotewotICAgaW50IGVycjsKLSAgIAotICAgX0FSR0NISyhwcm5nICE9IE5VTEwpOwotCi0gICAvKiB0aGVzZSBhcmUgdGhlIGRlZmF1bHQgaGFzaC9jaXBoZXIgY29tYm8gdXNlZCAqLwotI2lmZGVmIFJJSk5EQUVMCi0jaWYgICAgWUFSUk9XX0FFUz09MAotICAgcHJuZy0+eWFycm93LmNpcGhlciA9IHJlZ2lzdGVyX2NpcGhlcigmcmlqbmRhZWxfZW5jX2Rlc2MpOwotI2VsaWYgIFlBUlJPV19BRVM9PTEKLSAgIHBybmctPnlhcnJvdy5jaXBoZXIgPSByZWdpc3Rlcl9jaXBoZXIoJmFlc19lbmNfZGVzYyk7Ci0jZWxpZiAgWUFSUk9XX0FFUz09MgotICAgcHJuZy0+eWFycm93LmNpcGhlciA9IHJlZ2lzdGVyX2NpcGhlcigmcmlqbmRhZWxfZGVzYyk7Ci0jZWxpZiAgWUFSUk9XX0FFUz09MwotICAgcHJuZy0+eWFycm93LmNpcGhlciA9IHJlZ2lzdGVyX2NpcGhlcigmYWVzX2Rlc2MpOwotI2VuZGlmCi0jZWxpZiBkZWZpbmVkKEJMT1dGSVNIKQotICAgcHJuZy0+eWFycm93LmNpcGhlciA9IHJlZ2lzdGVyX2NpcGhlcigmYmxvd2Zpc2hfZGVzYyk7Ci0jZWxpZiBkZWZpbmVkKFRXT0ZJU0gpCi0gICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZ0d29maXNoX2Rlc2MpOwotI2VsaWYgZGVmaW5lZChSQzYpCi0gICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZyYzZfZGVzYyk7Ci0jZWxpZiBkZWZpbmVkKFJDNSkKLSAgIHBybmctPnlhcnJvdy5jaXBoZXIgPSByZWdpc3Rlcl9jaXBoZXIoJnJjNV9kZXNjKTsKLSNlbGlmIGRlZmluZWQoU0FGRVJQKQotICAgcHJuZy0+eWFycm93LmNpcGhlciA9IHJlZ2lzdGVyX2NpcGhlcigmc2FmZXJwX2Rlc2MpOwotI2VsaWYgZGVmaW5lZChSQzIpCi0gICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZyYzJfZGVzYyk7Ci0jZWxpZiBkZWZpbmVkKE5PRUtFT04pICAgCi0gICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZub2VrZW9uX2Rlc2MpOwotI2VsaWYgZGVmaW5lZChDQVNUNSkKLSAgIHBybmctPnlhcnJvdy5jaXBoZXIgPSByZWdpc3Rlcl9jaXBoZXIoJmNhc3Q1X2Rlc2MpOwotI2VsaWYgZGVmaW5lZChYVEVBKQotICAgcHJuZy0+eWFycm93LmNpcGhlciA9IHJlZ2lzdGVyX2NpcGhlcigmeHRlYV9kZXNjKTsKLSNlbGlmIGRlZmluZWQoU0FGRVIpCi0gICBwcm5nLT55YXJyb3cuY2lwaGVyID0gcmVnaXN0ZXJfY2lwaGVyKCZzYWZlcl9zazEyOF9kZXNjKTsKLSNlbGlmIGRlZmluZWQoREVTKQotICAgcHJuZy0+eWFycm93LmNpcGhlciA9IHJlZ2lzdGVyX2NpcGhlcigmZGVzM19kZXNjKTsKLSNlbGlmCi0gICAjZXJyb3IgWUFSUk9XIG5lZWRzIGF0IGxlYXN0IG9uZSBDSVBIRVIKLSNlbmRpZgotICAgaWYgKChlcnIgPSBjaXBoZXJfaXNfdmFsaWQocHJuZy0+eWFycm93LmNpcGhlcikpICE9IENSWVBUX09LKSB7Ci0gICAgICByZXR1cm4gZXJyOwotICAgfQotCi0jaWZkZWYgU0hBMjU2Ci0gICBwcm5nLT55YXJyb3cuaGFzaCAgID0gcmVnaXN0ZXJfaGFzaCgmc2hhMjU2X2Rlc2MpOwotI2VsaWYgZGVmaW5lZChTSEE1MTIpCi0gICBwcm5nLT55YXJyb3cuaGFzaCAgID0gcmVnaXN0ZXJfaGFzaCgmc2hhNTEyX2Rlc2MpOwotI2VsaWYgZGVmaW5lZChUSUdFUikKLSAgIHBybmctPnlhcnJvdy5oYXNoICAgPSByZWdpc3Rlcl9oYXNoKCZ0aWdlcl9kZXNjKTsKLSNlbGlmIGRlZmluZWQoU0hBMSkKLSAgIHBybmctPnlhcnJvdy5oYXNoICAgPSByZWdpc3Rlcl9oYXNoKCZzaGExX2Rlc2MpOwotI2VsaWYgZGVmaW5lZChSSVBFTUQxNjApCi0gICBwcm5nLT55YXJyb3cuaGFzaCAgID0gcmVnaXN0ZXJfaGFzaCgmcm1kMTYwX2Rlc2MpOwotI2VsaWYgZGVmaW5lZChSSVBFTUQxMjgpCi0gICBwcm5nLT55YXJyb3cuaGFzaCAgID0gcmVnaXN0ZXJfaGFzaCgmcm1kMTI4X2Rlc2MpOwotI2VsaWYgZGVmaW5lZChNRDUpCi0gICBwcm5nLT55YXJyb3cuaGFzaCAgID0gcmVnaXN0ZXJfaGFzaCgmbWQ1X2Rlc2MpOwotI2VsaWYgZGVmaW5lZChNRDQpCi0gICBwcm5nLT55YXJyb3cuaGFzaCAgID0gcmVnaXN0ZXJfaGFzaCgmbWQ0X2Rlc2MpOwotI2VsaWYgZGVmaW5lZChNRDIpCi0gICBwcm5nLT55YXJyb3cuaGFzaCAgID0gcmVnaXN0ZXJfaGFzaCgmbWQyX2Rlc2MpOwotI2VsaWYgZGVmaW5lZChXSElSTFBPT0wpCi0gICBwcm5nLT55YXJyb3cuaGFzaCAgID0gcmVnaXN0ZXJfaGFzaCgmd2hpcmxwb29sX2Rlc2MpOwotI2Vsc2UKLSAgICNlcnJvciBZQVJST1cgbmVlZHMgYXQgbGVhc3Qgb25lIEhBU0gKLSNlbmRpZgotICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKHBybmctPnlhcnJvdy5oYXNoKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIHplcm8gdGhlIG1lbW9yeSB1c2VkICovCi0gICB6ZXJvbWVtKHBybmctPnlhcnJvdy5wb29sLCBzaXplb2YocHJuZy0+eWFycm93LnBvb2wpKTsKLQotICAgcmV0dXJuIENSWVBUX09LOwotfQotCi1pbnQgeWFycm93X2FkZF9lbnRyb3B5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBsZW4sIHBybmdfc3RhdGUgKnBybmcpCi17Ci0gICBoYXNoX3N0YXRlIG1kOwotICAgaW50IGVycjsKLQotICAgX0FSR0NISyhidWYgICE9IE5VTEwpOwotICAgX0FSR0NISyhwcm5nICE9IE5VTEwpOwotCi0gICBpZiAoKGVyciA9IGhhc2hfaXNfdmFsaWQocHJuZy0+eWFycm93Lmhhc2gpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogc3RhcnQgdGhlIGhhc2ggKi8KLSAgIGhhc2hfZGVzY3JpcHRvcltwcm5nLT55YXJyb3cuaGFzaF0uaW5pdCgmbWQpOwotCi0gICAvKiBoYXNoIHRoZSBjdXJyZW50IHBvb2wgKi8KLSAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW3BybmctPnlhcnJvdy5oYXNoXS5wcm9jZXNzKCZtZCwgcHJuZy0+eWFycm93LnBvb2wsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Rlc2NyaXB0b3JbcHJuZy0+eWFycm93Lmhhc2hdLmhhc2hzaXplKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIC8qIGFkZCB0aGUgbmV3IGVudHJvcHkgKi8KLSAgIGlmICgoZXJyID0gaGFzaF9kZXNjcmlwdG9yW3BybmctPnlhcnJvdy5oYXNoXS5wcm9jZXNzKCZtZCwgYnVmLCBsZW4pKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogc3RvcmUgcmVzdWx0ICovCi0gICBpZiAoKGVyciA9IGhhc2hfZGVzY3JpcHRvcltwcm5nLT55YXJyb3cuaGFzaF0uZG9uZSgmbWQsIHBybmctPnlhcnJvdy5wb29sKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0KLSAgIHJldHVybiBDUllQVF9PSzsKLX0KLQotaW50IHlhcnJvd19yZWFkeShwcm5nX3N0YXRlICpwcm5nKQotewotICAgaW50IGtzLCBlcnI7Ci0KLSAgIF9BUkdDSEsocHJuZyAhPSBOVUxMKTsKLQotICAgaWYgKChlcnIgPSBoYXNoX2lzX3ZhbGlkKHBybmctPnlhcnJvdy5oYXNoKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICAKLSAgIGlmICgoZXJyID0gY2lwaGVyX2lzX3ZhbGlkKHBybmctPnlhcnJvdy5jaXBoZXIpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgLyogc2V0dXAgQ1RSIG1vZGUgdXNpbmcgdGhlICJwb29sIiBhcyB0aGUga2V5ICovCi0gICBrcyA9IChpbnQpaGFzaF9kZXNjcmlwdG9yW3BybmctPnlhcnJvdy5oYXNoXS5oYXNoc2l6ZTsKLSAgIGlmICgoZXJyID0gY2lwaGVyX2Rlc2NyaXB0b3JbcHJuZy0+eWFycm93LmNpcGhlcl0ua2V5c2l6ZSgma3MpKSAhPSBDUllQVF9PSykgewotICAgICAgcmV0dXJuIGVycjsKLSAgIH0KLQotICAgaWYgKChlcnIgPSBjdHJfc3RhcnQocHJuZy0+eWFycm93LmNpcGhlciwgICAgIC8qIHdoYXQgY2lwaGVyIHRvIHVzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHJuZy0+eWFycm93LnBvb2wsICAgICAgIC8qIElWICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm5nLT55YXJyb3cucG9vbCwga3MsICAgLyogS0VZIGFuZCBrZXkgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByb3VuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICZwcm5nLT55YXJyb3cuY3RyKSkgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiBlcnI7Ci0gICB9Ci0gICByZXR1cm4gQ1JZUFRfT0s7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgeWFycm93X3JlYWQodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbiwgcHJuZ19zdGF0ZSAqcHJuZykKLXsKLSAgIF9BUkdDSEsoYnVmICAhPSBOVUxMKTsKLSAgIF9BUkdDSEsocHJuZyAhPSBOVUxMKTsKLQotICAgLyogcHV0IGJ1ZiBpbiBwcmVkaWN0YWJsZSBzdGF0ZSBmaXJzdCAqLwotICAgemVyb21lbShidWYsIGxlbik7Ci0gICAKLSAgIC8qIG5vdyByYW5kb21pemUgaXQgKi8KLSAgIGlmIChjdHJfZW5jcnlwdChidWYsIGJ1ZiwgbGVuLCAmcHJuZy0+eWFycm93LmN0cikgIT0gQ1JZUFRfT0spIHsKLSAgICAgIHJldHVybiAwOwotICAgfQotICAgcmV0dXJuIGxlbjsKLX0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL3plcm9tZW0uYyBiL3plcm9tZW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxODFhYy4uMDAwMDAwMAotLS0gYS96ZXJvbWVtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBMaWJUb21DcnlwdCwgbW9kdWxhciBjcnlwdG9ncmFwaGljIGxpYnJhcnkgLS0gVG9tIFN0IERlbmlzCi0gKgotICogTGliVG9tQ3J5cHQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgdmFyaW91cyBjcnlwdG9ncmFwaGljCi0gKiBhbGdvcml0aG1zIGluIGEgaGlnaGx5IG1vZHVsYXIgYW5kIGZsZXhpYmxlIG1hbm5lci4KLSAqCi0gKiBUaGUgbGlicmFyeSBpcyBmcmVlIGZvciBhbGwgcHVycG9zZXMgd2l0aG91dCBhbnkgZXhwcmVzcwotICogZ3VhcmFudGVlIGl0IHdvcmtzLgotICoKLSAqIFRvbSBTdCBEZW5pcywgdG9tc3RkZW5pc0BpYWh1LmNhLCBodHRwOi8vbGlidG9tY3J5cHQub3JnCi0gKi8KLSNpbmNsdWRlICJteWNyeXB0LmgiCi0KLXZvaWQgemVyb21lbSh2b2lkICpkc3QsIHNpemVfdCBsZW4pCi17Ci0gdW5zaWduZWQgY2hhciAqbWVtID0gKHVuc2lnbmVkIGNoYXIgKilkc3Q7Ci0gX0FSR0NISyhkc3QgIT0gTlVMTCk7Ci0gd2hpbGUgKGxlbi0tID4gMCkKLSAgICAqbWVtKysgPSAwOwotfQo=