ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggOTNjN2IyNC4uM2YyYzM1OSAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTYgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzExMzAgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NzEyMjEgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MTEzMDogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBCZXR0ZXIgV2luMzJzIHN1cHBvcnQuCi0JLSBMb3RzIG9mIG5ldyBXaW4zMiBmdW5jdGlvbnMuCi0JLSBESUIgaGFuZGxpbmcgaW1wcm92ZW1lbnRzLgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTcxMjIxOiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIFByZWxpbWluYXJ5IEdESSBwYXRocyBzdXBwb3J0LgorCS0gRHJhd0ZyYW1lQ29udHJvbCBpbXBsZW1lbnRhdGlvbi4KKwktIE11bHRpbWVkaWEgc3VwcG9ydCBmb3IgdGltZSBhbmQgam95c3RpY2sgZnVuY3Rpb25zLgorCS0gV2luMzIgc3BlYyBmaWxlcyBub3cgZ2VuZXJhdGUgQyBjb2RlIGZvciBXaW5lbGliLgorCS0gVG9ucyBvZiBuZXcgV2luMzIgZnVuY3Rpb25zIGFuZCBzdHVicy4KIAktIExvdHMgb2YgYnVnIGZpeGVzLgogCiBTZWUgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCkBAIC0xNywxMCArMTksMTAgQEAKIHRoZSByZWxlYXNlIGlzIGF2YWlsYWJsZSBhdCB0aGUgZnRwIHNpdGVzLiAgVGhlIHNvdXJjZXMgd2lsbCBiZSBhdmFpbGFibGUKIGZyb20gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6CiAKLSAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcxMTMwLnRhci5negotICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTEzMC50YXIuZ3oKLSAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTEzMC50YXIuZ3oKLSAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTEzMC50YXIuZ3oKKyAgZnRwOi8vc3Vuc2l0ZS51bmMuZWR1L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcxMjIxLnRhci5negorICBmdHA6Ly90c3gtMTEubWl0LmVkdS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTIyMS50YXIuZ3oKKyAgZnRwOi8vZnRwLmluZm9tYWdpYy5jb20vcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTIyMS50YXIuZ3oKKyAgZnRwOi8vZnRwLnByb2dzb2MudXRzLmVkdS5hdS9wdWIvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MTIyMS50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9BVVRIT1JTIGIvQVVUSE9SUwppbmRleCBjZDE4OTQwLi42MTZhMmU2IDEwMDY0NAotLS0gYS9BVVRIT1JTCisrKyBiL0FVVEhPUlMKQEAgLTEwMiw2ICsxMDIsNyBAQAogV2lsbGlhbSBTbWl0aCwKIERvbWluaWsgU3RyYXNzZXIsCiBWYWRpbSBTdHJpemhldnNreSwKK0JlcnRobyBTdHVsdGllbnMsCiBFcmlrIFN2ZW5kc2VuLAogVHJpc3RhbiBUYXJyYW50LAogQW5kcmV3IFRheWxvciwKZGlmZiAtLWdpdCBhL0JVR1MgYi9CVUdTCmluZGV4IGNjOWI4YzAuLjhlMzM5YjIgMTAwNjQ0Ci0tLSBhL0JVR1MKKysrIGIvQlVHUwpAQCAtNSw3ICs1LDcgQEAKIGFkZCBuZXcgZW50cmllcyBhbmQsIG1vcmUgaW1wb3J0YW50bHksIHJlbW92ZSB0aG9zZSBmb3IgdGhlIAogYnVncyB5b3UgZml4ZWQgOy0pCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFzIG9mIE5vdiAxOTk3IC0KK0FzIG9mIERlYyAxOTk3IC0KIAogR2VuZXJhbDoKIApAQCAtMzIsMTMgKzMyLDE1IEBACiAKIE1pc2NlbGxhbmVvdXM6CiAKLSAqIEludmlzaWJsZSBjb250cm9scyBpbiBCQ1cgZGlhbG9ncy4KKyAqIDE2LWJpdCBFdWRvcmEgMS41LjIgZ29lcyBpbnRvIHJlY3Vyc2lvbiB0cnlpbmcgdG8gZGlzcGxheQorICAgYSBob3Jpem9udGFsIHNjcm9sbGJhciAoU2V0U2Nyb2xsUG9zKCkgYXJ0aWZhY3QpLgogCiAgKiBtSVJDICdjb21tYW5kcycgbWVudSBzdGF5cyBvbiB0b3AgYW5kIHdpbGwgbm90IHJlZnJlc2guCiAKICAqIG1JUkMgaXMgdW5hYmxlIHRvIHNob3cgJ09wdGlvbnMnIGRpYWxvZy4KIAotICogVGFiIHN3aXRjaGluZyBpbiBtSVJDICdTZXR1cCcgZGlhbG9nIGxlYWtzIG1lbW9yeS4KKyAqIFRhYiBzd2l0Y2hpbmcgaW4gbUlSQyAnU2V0dXAnIGRpYWxvZyBzdG9wcyBlcmFzaW5nIGJhY2tncm91bmQKKyAgIGFmdGVyIGEgcmFuZG9tIG51bWJlciBvZiByZXBldGl0aW9ucy4KIAogICogbkJ5dGVzV2lkdGggaW4gQ1VSU09SSUNPTklORk8gaXMgYm9ndXMgZm9yIHNvbWUgYnBwCiAgICAoZG9lc24ndCByZWZsZWN0IHRoZSBmYWN0IHRoYXQgYml0cyBhcmUgcGFja2VkIGFuZCAxNi1iaXQgYWxpZ25lZCkuCkBAIC00Nyw3ICs0OSw3IEBACiAgICAocHJvYmFibHkgYmVjYXVzZSBvZiBieXRlcyB3aWR0aCBzdHVmZikuCiAKICAqIE5ldHNjYXBlIGRpc3BsYXlzIHBhcnRpYWxseSBkb3dubG9hZGVkIGlubGluZSBncmFwaGljcyB3aXRoCi0gICB3cm9uZyBvZmZzZXRzLiBCaXRtYXAgaXMgbWlzc2luZyBpbiB0aGUgc3BsYXNoLXdpbmRvdy4KKyAgIHdyb25nIG9mZnNldHMuIAogCiAgKiBUZXh0IGFsaWdubWVudCBwcm9ibGVtcyBpbiBXb3JkIGFuZCBXcml0ZSAodmFyaWFibGUgcGl0Y2ggZm9udHMpLgogCkBAIC02Miw2ICs2NCw4IEBACiAgKiBBbGxvY0NTVG9EU0FsaWFzKCkgc2hvdWxkbid0IGFsbG9jIGFsaWFzIGZvciB0aGUgc2FtZSBzZWdtZW50IG11bHRpcGxlCiAgICB0aW1lcy4KIAorICogWDExRFJWX1BhaW50UmduIGRvZXNuJ3QgcmVzcGVjdCBtYXBwaW5nIG1vZGVzCisKIFdoZXJlIHRvIGxvb2sgaW4gc291cmNlIGZpbGVzOgogCiAgKiBncmVwIGZvciBGSVhNRSBpbiB0aGUgc291cmNlIGZpbGVzLgpkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IDc2YWM0YmEuLmFhZDY0N2QgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSwyNjYgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZyaSBEZWMgMTkgMTA6NTA6NDYgMTk5NyAgRG91Z2xhcyBSaWRnd2F5ICA8cmlkZ3dheUB3aW5laHEuY29tPgorCisJKiBbTWFrZS5ydWxlcy5pbl0gW01ha2VmaWxlLmluXSBbZG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5pbl0KKyAJICBbZG9jdW1lbnRhdGlvbi9SRUFETUUuZG9jdW1lbnRhdGlvbl0KKwlGaXJzdCBjdXQgYXQgV2luZSBBUEkgZG9jdW1lbnRhdGlvbi4gTm8gbG9uZ2VyIGluc3RhbGwgcmVmZXJlbmNlCisJbWFudWFsIGJ5IGRlZmF1bHQuCisKK1dlZCBEZWMgMTcgMjE6MzI6MjMgMTk5NyAgQW5kcmVhcyBNb2hyIDwxMDAuMzA5MzZAZ2VybWFueS5uZXQ+CisKKwkqIFtmaWxlcy9maWxlLmNdCisJRml4ZWQgR2V0VGVtcEZpbGVOYW1lMTYoKSB0byB1c2UgY3VycmVudCBwYXRoIG9mIHJlcXVlc3RlZCBkcml2ZQorCWFzIG5lZWRlZC4KKworCSogW2lmMTYzMi9NYWtlZmlsZS5pbl0gW2lmMTYzMi9idWlsdGluLmNdIFtpZjE2MzIvZGNpbWFuMzIuc3BlY10KKwkgIFtpZjE2MzIvbXN2ZnczMi5zcGVjXSBbaWYxNjMyL3RhcGkzMi5zcGVjXSBbaWYxNjMyL3dvdzMyLnNwZWNdCisJQWRkZWQgbWlzYyBETExzIG5lZWRlZCBieSB2YXJpb3VzIGFwcHMuCisKK1dlZCBEZWMgMTcgMTI6MDE6NTAgMTk5NyAgTW9ydGVuIEVyaWtzZW4gPG1vcnRlbmVAc2ltLm5vPgorCisJKiBbaWYxNjMyL2dkaTMyLnNwZWNdIFtpbmNsdWRlL3dpbmRvd3MuaF0gW29iamVjdHMvcGFsZXR0ZS5jXQorCUluc2VydGVkIGVtcHR5IHN0dWIgZm9yIENyZWF0ZUhhbGZ0b25lUGFsZXR0ZS4KKworVHVlIERlYyAxNiAyMjowODowNiAxOTk3ICBIdXcgRCBNIERhdmllcyA8aC5kYXZpZXMxQHBoeXNpY3Mub3hmb3JkLmFjLnVrPgorCisJKiBbd2luZG93cy9tZGkuY10KKwlVc2UgVktfVEFCIGluc3RlYWQgb2YgVktfU0VQQVJBVE9SIGluIFRyYW5zbGF0ZU1ESVN5c0FjY2VsKCkuCisKKwkqIFtncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmNdCisJRGVsZXRlREMoKSBvbiBhIE1ldGFEQyBkb2Vzbid0IGRvIGFueXRoaW5nIC0gaXQgc2hvdWxkbid0LiBUaGVyZWZvcmUKKwlmaXggY2xlYW51cCBvZiBNZXRhRENzIGluIENsb3NlTWV0YUZpbGUoKTsgdGhleSBub3cgYWN0dWFsbHkgZ2V0CisJcmVtb3ZlZCBmcm9tIHRoZSBHREkgaGVhcCEKKworCSogW2dyYXBoaWNzL3gxMWRydi94Zm9udC5jXQorCVByZXNlcnZlIEZPX01BVENIX1hZSU5ERVAgZmxhZyBpbiBYRk9OVF9NYXRjaEZJTGlzdCgpLiBTaG91bGQgcmVkdWNlCisJdGhlIG51bWJlciBvZiBib2xkLWl0YWxpYyBtYXRjaGVzLgorCitUdWUgRGVjIDE2IDIwOjExOjQzIDE5OTcgIEJlcnRobyBTdHVsdGllbnMgPGJlcnRob0BwYW50ZXIuc29jaS5hYXUuZGs+CisKKwkqIFtncmFwaGljcy9wYWludGluZy5jXQorCUluY2x1ZGVkIGFuIGltcGxlbWVudGF0aW9uIG9mIERyYXdTdGF0ZQorCisJKiBbaWYxNjMyL3RodW5rLmNdCisJQ2hhbmdlZCBtYW55IGZwcmludGZzIGludG8gZHByaW50Zl90aHVuaworCisJKiBbaW5jbHVkZS9jYWNoZS5oXSBbZ3JhcGhpY3MvY2FjaGUuY10KKwlOZXcgZmlsZXMgdG8gaG9sZCBjYWNoZWQgaGFuZGxlcyB0byByZWd1bGFyeSB1c2VkIEdESSBvYmplY3QuCisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwlBZGRlZCBEUkFXU1RBVEV4eCB0eXBlZGVmcworCUFkZGVkIERTU19ERUZBVUxUIGRlZmluZSBmb3IgRHJhd1N0YXRlCisKKwkqIFtvYmplY3RzL3RleHQuY10KKwlOZXcgaW1wbGVtZW50YXRpb24gb2YgR3JheVN0cmluZygpCisKKwkqIFtjb250cm9scy91aXRvb2xzLmNdCisJSW1wbGVtZW50ZWQgRHJhd0ZyYW1lQ29udHJvbCgpIGZ1bmN0aW9ucworCUNoYW5nZWQgRHJhd0VkZ2UoKSBiZWhhdmlvdXIgdG8gd2luOTUgaW1wbGVtZW50YXRpb24KKworTW9uIERlYyAxNSAyMzo0MzowMSAxOTk3ICBNYXJ0aW4gQm9laG1lIDxib2VobWVAaW5mb3JtYXRpay5tdS1sdWViZWNrLmRlPgorCisJKiBbZ3JhcGhpY3MvcGF0aC5jXSBbaW5jbHVkZS9wYXRoLmhdIFtncmFwaGljcy9wYWludGluZy5jXQorCSAgW2lmMTYzMi9nZGkzMi5zcGVjXSBbaW5jbHVkZS9nZGkuaF0gW2luY2x1ZGUvd2luZG93cy5oXQorCSAgW29iamVjdHMvZGMuY10KKyAgICAgICAgQWRkZWQgcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgR0RJIHBhdGhzLgorCisJKiBbb2JqZWN0cy9kYy5jXQorCUFkZGVkIERDX0luaXRfRENfSU5GTyBmdW5jdGlvbiBmb3IgaW5pdGlhbGl6aW5nIFdJTl9EQ19JTkZPCisJc3RydWN0dXJlLgorCisJKiBbaW5jbHVkZS93aW5kb3dzLmhdIFtpbmNsdWRlL2dkaS5oXSBbb2JqZWN0cy9nZGlvYmouY10KKwlBZGRlZCBERUZBVUxUX0dVSV9GT05ULgorCisJKiBbaW5jbHVkZS93aW5lcnJvci5oXQorCUFkZGVkIGEgZmV3IGVycm9yIGNvZGVzLgorCisJKiBbbWVtb3J5L2hlYXAuY10KKwlDaGFuZ2VkIEhlYXBBbGxvYyB0byBtYWtlIHRoZSBjb3JyZWN0IGNhbGxzIHRvIFNldExhc3RFcnJvcgorCShub3cgY29uZm9ybXMgdG8gTlQncyBiZWhhdmlvdXIpLgorCisJKiBbd2luZG93cy93aW4uY10KKwlDaGFuZ2VkIFdJTl9DcmVhdGVXaW5kb3dFeCB0byBhbGxvdyBjaGlsZCB3aW5kb3dzIHdpdGggemVybworCXdpZHRoIC8gaGVpZ2h0LgorCitTdW4gRGVjIDE0IDEyOjAxOjA3IDE5OTcgIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQGxyYy5lcGZsLmNoPgorCisJKiBbaWYxNjMyLypdIFtyZWxheTMyLypdCisJTW92ZWQgYWxsIDMyLWJpdCByZWxheSBzdHVmZiB0byByZWxheTMyLworCisJKiBbZmkxNjMyL3RodW5rLmNdIFt3aW4zMi9rZXJuZWwzMi5jXQorCU1vdmVkIGFsbCBLRVJORUwzMiBvcmRpbmFsIGZ1bmN0aW9ucyB0byBrZXJuZWwzMi5jCisKKwkqIFttZW1vcnkvc2VsZWN0b3IuY10KKwlJbml0aWFsaXplIHNlbGVjdG9ycyBpbiBBbGxvY1NlbGVjdG9yQXJyYXkuCisKKwkqIFt0b29scy9idWlsZC5jXQorCUdlbmVyYXRlIEMgaW5zdGVhZCBvZiBhc3NlbWJseSBmb3IgV2luMzIgcmVsYXlzLgorCUZpeGVkIHN0YWNrIGNvcnJ1cHRpb24gaW4gQ2FsbFRvMTYgZnVuY3Rpb25zLCBmb3VuZCBieSBCZXJ0aG8KKwlTdHVsdGllbnMuCisJCitTdW4gRGVjIDE0IDEwOjU1OjAwIDE5OTcgIEFuZHJlYXMgTW9ociA8MTAwLjMwOTM2QGdlcm1hbnkubmV0PgorCisJKiBbaWYxNjMyL01ha2VmaWxlLmluXSBbaWYxNjMyL2J1aWx0aW4uY10gW2lmMTYzMi9vbGUydGhrLnNwZWNdCisJQWRkZWQgYnVpbHQtaW4gT0xFMlRISy5ETEwuIAorCisJKiBbaWYxNjMyL3Rvb2xoZWxwLnNwZWNdIFtpbmNsdWRlL3Rvb2xoZWxwLmhdIFttZW1vcnkvc2VsZWN0b3IuY10KKwkgIFttaXNjL3Rvb2xoZWxwLmNdCisJQWRkZWQgc3R1YnMgZm9yIFN0YWNrVHJhY2VGaXJzdCgpLCBTdGFja1RyYWNlQ1NJUEZpcnN0KCksCisJU3RhY2tUcmFjZU5leHQoKSwgVVRTZWxlY3Rvck9mZnNldFRvTGluZWFyKCkKKwlhbmQgVVRMaW5lYXJUb1NlbGVjdG9yT2Zmc2V0KCkuCisKK1NhdCBEZWMgMTMgMTc6MjY6NDEgMTk5NyAgQWxleCBLb3JvYmthICA8YWxleEB0cmFudG9yLnBoYXJtLnN1bnlzYi5lZHU+CisKKwkqIFttaXNjL3dpbnNvY2suY10KKwkzMi1iaXQgQVBJIGZpeGVzIGZvciByZXBvcnRlZCBwcm9ibGVtcyAodGhhbmtzIHRvIE1hcmN1cworCWFuZCBEYXZpZCkuCisKKwkqIFtncmFwaGljcy94MTFkcnYveGZvbnQuY10KKwlMaXR0bGUgdHdlYWsgaW4gcG9pbnQgc2l6ZSBjYWxjdWxhdGlvbi4KKworCSogW3dpbmRvd3MvZGVmd25kLmNdIFt3aW5kb3dzL2RjZS5jXSBbd2luZG93cy93aW5oZWxwLmNdCisJICBbd2luZG93cy93aW5wcm9jLmNdIFt3aW5kb3dzL3dpbi5jXQorCUJ1ZyBmaXhlcy4KKworU2F0IERlYyAxMyAxNjozNToxNCAxOTk3ICBLYWkgTW9yaWNoIDxrYWkubW9yaWNoQHJoZWluLW5lY2thci5uZXRzdXJmLmRlPgorCisJKiBbZmlsZXMvZG9zX2ZzLmNdCisJT3BlbkZpbGUgd2l0aCBlbXB0eSBmaWxlbmFtZSBhbmQgT0ZfUEFSU0UgcmV0dXJucyBjdXJyZW50IGRpci4KKworCSogW21pc2MvY29tbWRsZy5jXQorCUlnbm9yZSBpbml0aWFsIGRpciBpZiBib2d1cy4KKworCSogW2ZpbGVzL2ZpbGUuY10KKwlMb2NraW5nIGFuIGlkZW50aWMgcmVnaW9uIGluIGEgZmlsZSBtdXN0IG5vdCBiZSBhbiBlcnJvci4KKworCSogW21pc2MvbHN0ci5jXQorCVVzZSB3aWRlIGNoYXIgY3R5cGUgZnVuY3Rpb25zLgorCitGcmkgRGVjIDEyIDIzOjQ2OjIyIDE5OTcgIFV3ZSBCb25uZXMgIDxib25AZWxla3Ryb24uaWtwLnBoeXNpay50dS1kYXJtc3RhZHQuZGU+CisKKwkqIFtmaWxlL2RyaXZlLmNdCisJRmlyc3QgYXR0ZW1wdCBmb3IgR2V0RGlza0ZyZWVTcGFjZUV4LgorCitGcmkgRGVjIDEyIDIzOjE4OjQxIDE5OTcgIE1hcmN1cyBNZWlzc25lciAgPG1zbWVpc3NuQGNpcC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKworCSogW2xvYWRlci9wZV9yZXNvdXJjZS5jXQkKKwlGaXhlZCB3cm9uZ2x5IGFwcGVhcmluZyBtZW51cyBwcm9ibGVtIChvbmx5IHVzZSBkZWZhdWx0IGxvb2t1cHMgaW4KKwlsYXN0IHJlc291cmNlIHN1YnRyZWUpLgorCisJKiBbbXVsdGltZWRpYS8qLmNdCisJQWRkZWQgd2luMzIgc3VwcG9ydCBmb3IgdGltZSogYW5kIGpveSogbG93bGV2ZWwgZHJpdmVycywKKwkobm90IGV4Y2Vzc2l2ZWx5IHRlc3RlZCksIHNvbWUgbWlzYyBmaXhlcyBhbmQgY2xlYW51cHMuCisKKwkqIFttaXNjL3NoZWxsb3JkLmNdW21pc2Mvc2hlbGwuY11bb2xlL2ZvbGRlcnMuY11bb2xlL2lmcy5jXQorCSAgW2luY2x1ZGUvaW50ZXJmYWNlcy5oXVtpbmNsdWRlL3NobG9iai5oXQorCUFkZGVkIHNvbWUgbW9yZSB1bmRvY3VtZW50ZWQgU0hFTEwzMiBmdW5jdGlvbnMsIHNvbWUgc2hlbGwgZm9sZGVyCisgCWludGVyZmFjZSBzdHVicyBhZGRlZCwgU0hHZXRNYWxsb2MsIFNIR2V0RGVza3RvcEZvbGRlciwKKwlTSEdldFNwZWNpYWxGb2xkZXJMb2NhdGlvbiwgU0hHZXRQYXRoRnJvbUlETGlzdCBzdHVicyBhZGRlZCwKKwlJTWFsbG9jLCBJVW5rbm93biBpbXBsZW1lbnRlZC4KKworCSogW3dpbmRvd3MvbXNnYm94LmNdCisJSW1wbGVtZW50ZWQgTWVzc2FnZUJveEluZGlyZWN0Kiwgc29tZSBpbnRlcm5hbCBjaGFuZ2VzLgorCisJKiBbaWYxNjMyL3RodW5rLmNdCisJS0VSTkVMXzQzMSBpbXBsZW1lbnRlZC4KKworCSogW29iamVjdHMvZ2Rpb2JqLmNdCisJR2V0Q3VycmVudE9iamVjdCBpbXBsZW1lbnRlZC4KKworV2VkIERlYyAgMyAwMTowOToxNyAxOTk3ICBHb3Jkb24gQ2hhZmZlZSAgPGNoYWZmZWVAYXB1LmNzLmJlcmtlbGV5LmVkdT4KKworCSogW29iamVjdHMvZGliLmNdCisJRml4IGEgY291cGxlIHNtYWxsIERJQiBwcm9ibGVtcy4KKworCSogW2NvbnRyb2xzL2VkaXQuY10KKwlGaXggYSB0eXBvLgorCisJKiBbZmlsZXMvZG9zX2ZzLmNdCisJVHJ5IG5vcm1hbCByZWFkZGlyIGluIGNhc2UgZnMgaXMgc3BlY2lmaWVkIGFzIHZmYXQgYnV0IGlzbid0LgorCisJKiBbZmlsZXMvcHJvZmlsZS5jXQorCUltcGxlbWVudGF0aW9uIG9mIFdyaXRlUHJpdmF0ZVByb2ZpbGVTZWN0aW9uMzJBIGZyb20gVXdlIEJvbm5lcy4KKworCSogW21pc2MvcHJpbnRkcnYuY10KKwlPcGVuUHJpbnRlcjMyQSBzdHViLCBoZWxwcyBXb3JkOTcgc3RhcnQuCisKKwkqIFtvYmplY3RzL3RleHQuY10KKwlGaXh1cCBpbXBsZW1lbnRhdGlvbiBvZiBHZXRUZXh0Q2hhcnNldEluZm8uCisKKwkqIFtzY2hlZHVsZXIvcHJvY2Vzcy5jXQorCUZpeCBlbnZpcm9ubWVudCB2YXJpYWJsZSBleHBhbnNpb24uCisKKwkqIFt3aW4zMi9jb2RlX3BhZ2UuY10KKwlNYWtlIE11bHRpQnl0ZVRvV2lkZUNoYXIgYW5kIFdpZGVDaGFyVG9NdWx0aUJ5dGUgY29uZm9ybSBpbiByZXR1cm4KKwl2YWx1ZXMgYW5kIGVycm9yIGNvbmRpdGlvbnMgdG8gdGhvc2UgaW4gV2luZG93cyBOVCA0LjAuCisKKwkqIFt3aW5kb3dzL21lc3NhZ2UuY10KKwlGaXggYnJvYWRjYXN0aW5nIHByb2JsZW1zIGluIFdpbjMyLiAgVGhlIFdpbjMyIGRvY3Mgc2F5IHRvIHVzZQorCUhXTkRfVE9QTU9TVCB0byBicm9hZGNhc3QgdG8gYWxsIFdpbjMyIFdpbmRvd3MuCisKKwkqIFttZW1vcnkvdmlydHVhbC5jXSBbbG9hZGVyL3BlX2ltYWdlLmNdCisJRG8gbm90IG1hcCBpbiBWaXJ0dWFsQWxsb2MgaWYgYWRkcmVzcyBpcyBzcGVjaWZpZWQgYW5kIHNwYWNlIGlzCisJbm90IGF2YWlsYWJsZS4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgV2luMzIuCisKKwkqIFtpbmNsdWRlL3Blbi5oXSBbaW5jbHVkZS94MTFkcnYuaF0gW29iamVjdHMvZGMuY10KKwkgIFtvYmplY3RzL3Blbi5jXSBbZ3JhcGhpY3MveDExZHJ2L3Blbi5jXQorCVN1cHBvcnQgZm9yIEV4dENyZWF0ZVBlbi4KKworVHVlIERlYyAgMiAyMDoyMjowNiAxOTk3ICBNb3J0ZW4gV2VsaW5kZXIgIDx0ZXJyYUBkaWt1LmRrPgorCisJKiBbKi8qLmNdIFsqLyouaF0KKwlBZGQgbG90cyBvZiBwcm90b3R5cGVzLgorCisJKiBbaWYxNjMyL2tlcm5lbDMyLnNwZWNdW2luY2x1ZGUvd2luZG93cy5oXVtpbmNsdWRlL3dpbm50LmhdCisJICBbbWlzYy9jcHUuY10KKwlEZWZpbmUgSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudC4KKworCSogW21pc2MvY3J0ZGxsLmNdCisgCShDUlRETExfX2dldGN3ZCk6IEFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIHRoZSB0ZXJtaW5hdGluZyB6ZXJvLgorCisJKiBbbWlzYy92ZXIuY10KKwlJbXByb3ZlIGNoZWNrIGZvciBudWxsIGNvbXBvbmVudCBpbiBfZmluZF9kYXRhW0FXXS4gIFBsdWcgbGVha3MKKwlpbiBWZXJRdWVyeVZhbHVlKi4KKworCSogW3dpbjMyL2NvbnNvbGUuY11baWYxNjMyL2tlcm5lbDMyLnNwZWNdCisJQWRkIHN0dWJzIGZvciBHZXRDb25zb2xlQ3Vyc29ySW5mbzMyLCBTZXRDb25zb2xlQ3Vyc29ySW5mbzMyLgorCisJKiBbd2luZG93cy9tZXNzYWdlLmNdW2lmMTYzMi91c2VyMzIuc3BlY11baW5jbHVkZS93aW5kb3dzLmhdCisJRGVmaW5lIFNlbmRNZXNzYWdlVGltZW91dCouCisKKwkqIFtncmFwaGljcy94MTFkcnYveGZvbnQuY10KKwlDaGFuZ2UgYWxnb3JpdGhtIG9mIF9fZ2VuZXJpY0NoZWNrU3VtIHRvIGJlIGFsaWdubWVudCBzYWZlLgorCisJKiBbbWlzYy9tYWluLmNdIFttaXNjL3dpbnNvY2suY10gW21pc2Mvd2luc29ja19kbnMuY10KKwlJbmNsdWRlIHdpbnNvY2suaCBlYXJseSB0byBhdm9pZCBTb2xhcmlzIHByb2JsZW0uCisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF0KKwlVbmRlZiBGU0hJRlQgYmVmb3JlIHdlIGRlZmluZSBpdC4KKworCSogW3JjL3dpbmVyYy5jXQorCUluY2x1ZGUgPGZjbnRsLmg+IGluc3RlYWQgb2YgPHN5cy9mY250bC5oPi4KKworCSogW2ZpbGVzL2ZpbGUuY10KKwlVc2Ugc3RyZXJyb3IgaW4gRklMRV9TZXREb3NFcnJvciBpZiBhdmFpbGFibGUuCisKKwkqIFtpbmNsdWRlL2NvbmZpZy5oLmluXSBbY29uZmlndXJlLmluXQorCUNoZWNrIGZvciBzdHJlcnJvci4KKworCSogW29iamVjdHMvZ2Rpb2JqLmNdCisJTWFrZSBzdGF0aWMgZm9udCBzdHJ1Y3R1cmVzIGFsaWduZWQuCisKK01vbiBEZWMgIDEgMTA6MTA6MjEgMTk5NyAgS2FybCBHYXJyaXNvbiAgPGthcmxvc0Blem5ldC5uZXQ+CisKKwkqIFt3aW4zMi9jb25zb2xlLmNdIFtpZjE2MzIva2VybmVsMzIuc3BlY10gW2luY2x1ZGUvd2luZG93cy5oXQorCUFkZGVkIHN0dWIgZm9yIEdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9ucy4KKwlBZGRlZCBzdHViIGZvciBQZWVrQ29uc29sZUlucHV0KEEsVykuCisJRml4ZWQgcGFyYW1ldGVyIGxpc3QgZm9yIFdyaXRlQ29uc29sZShBLFcpLgorCUdldE51bWJlck9mQ29uc29sZUlucHV0RXZlbnRzIG5vdyByZXR1cm5zIDAgZXZlbnRzIGluc3RlYWQgb2YgMQorCShzaW5jZSBsb3ctbGV2ZWwgY29uc29sZSBmdW5jdGlvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkKS4KKwlHZXRDb25zb2xlTW9kZSBubyBsb25nZXIgcmV0dXJucyBFTkFCTEVfV0lORE9XX0lOUFVUIGFuZAorCUVOQUJMRV9NT1VTRV9JTlBVVCBzaW5jZSB0aGVzZSBhcmUgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU2F0IE5vdiAyOSAxMjozNToyNiAxOTk3ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KIAogCSogW2lmMTYzMi9idWlsdGluLmNdCmRpZmYgLS1naXQgYS9NYWtlLnJ1bGVzLmluIGIvTWFrZS5ydWxlcy5pbgppbmRleCBlMjdlODhiLi43YjFlN2Q3IDEwMDY0NAotLS0gYS9NYWtlLnJ1bGVzLmluCisrKyBiL01ha2UucnVsZXMuaW4KQEAgLTM2LDYgKzM2LDcgQEAKIEFSICAgICAgICA9IGFyIHJjCiBSTSAgICAgICAgPSBybSAtZgogTUtESVIgICAgID0gbWtkaXIKK0MyTUFOICAgICA9IGMybWFuCiBCVUlMRCAgICAgPSAkKFRPUE9CSkRJUikvdG9vbHMvYnVpbGRAUFJPR0VYVEAKIE1BS0VERVAgICA9ICQoVE9QT0JKRElSKS90b29scy9tYWtlZGVwQFBST0dFWFRACiBXSU5FUkMgICAgPSAkKFRPUE9CSkRJUikvcmMvd2luZXJjQFBST0dFWFRACkBAIC0xMDgsNiArMTA5LDEwIEBACiAkKE1PRFVMRSkubzogJChPQkpTKQogCSQoTERDT01CSU5FKSAkKE9CSlMpIC1vICQoTU9EVUxFKS5vCiAKKyMgUnVsZSBmb3IgbWFuIHBhZ2VzCisKK21hbjogJChDX1NSQ1MpCisJZm9yIGkgaW4gJChDX1NSQ1MpOyBkbyAkKEMyTUFOKSAtTCAtbyQoVE9QT0JKRElSKS9kb2N1bWVudGF0aW9uL21hbjN3IC1TM3cgJChESVZJTkNMKSAkJGk7IGRvbmUKIAogIyBNaXNjLiBydWxlcwogCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCmluZGV4IGMzMjY3NTYuLmMzNGMzYjYgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLmluCisrKyBiL01ha2VmaWxlLmluCkBAIC03LDYgKzcsNyBAQAogIyBpbnN0YWxsOiAgICAgICAgICAgICAgaW5zdGFsbCBldmVyeXRoaW5nCiAjIGRlcGVuZDoJCWNyZWF0ZSB0aGUgZGVwZW5kZW5jaWVzCiAjIGV0YWdzOgkJY3JlYXRlIGEgVEFHUyBmaWxlIGZvciBFbWFjcy4KKyMgbWFucGFnZXM6CQljb21waWxlIG1hbnBhZ2VzIGZvciBXaW5lIEFQSQogIwogCiAjIE1haW4gdGFyZ2V0IHRvIGJ1aWxkCkBAIC0yNCw2ICsyNSw3IEBACiAKIExJQlNVQkRJUlMgPSBcCiAJcmMgXAorCXRvb2xzIFwKIAljb250cm9scyBcCiAJZmlsZXMgXAogCWdyYXBoaWNzIFwKQEAgLTQ0LDExICs0NiwxMSBAQAogCXdpbmRvd3MKIAogRU1VU1VCRElSUyA9IFwKLQl0b29scyBcCiAJZGVidWdnZXIgXAogCWdyYXBoaWNzL3dpbjE2ZHJ2IFwKIAlpZjE2MzIgXAotCW1pc2NlbXUKKwltaXNjZW11IFwKKwlyZWxheTMyCiAKIFBST0dTVUJESVJTID0gbGlidGVzdCBwcm9ncmFtcwogCkBAIC05MCw3ICs5Miw4IEBACiAJZGVidWdnZXIvZGVidWdnZXIubyBcCiAJZ3JhcGhpY3Mvd2luMTZkcnYvd2luMTZkcnYubyBcCiAJaWYxNjMyL2lmMTYzMi5vIFwKLQltaXNjZW11L21pc2NlbXUubworCW1pc2NlbXUvbWlzY2VtdS5vIFwKKwlyZWxheTMyL3JlbGF5MzIubwogCiBhbGw6ICQoTUFJTl9UQVJHRVQpCiAKQEAgLTEzOSw2ICsxNDIsMTAgQEAKIFRBR1MgZXRhZ3M6CiAJZXRhZ3MgYGZpbmQgJChUT1BTUkNESVIpIC1uYW1lICcqLltjaFNdJyAtcHJpbnQgfCBncmVwIC12IGRiZ21haW5gCiAKK21hbnBhZ2VzOgorCS0kKE1LRElSKSAkKFRPUE9CSkRJUikvZG9jdW1lbnRhdGlvbi9tYW4zdworCWZvciBpIGluICQoTElCU1VCRElSUyk7IGRvIChjZCAkJGkgJiYgJChNQUtFKSBtYW4pOyBkb25lCisKIGNsZWFuOjoKIAlmb3IgaSBpbiAkKEFMTFNVQkRJUlMpOyBkbyAoY2QgJCRpOyAkKE1BS0UpIGNsZWFuKSB8fCBleGl0IDE7IGRvbmUKIAlmb3IgaSBpbiBpbmNsdWRlOyBkbyAoY2QgJCRpOyAkKFJNKSAqLm8gXCMqXCMgKn4gKi5iYWsgKi5vcmlnICoucmVqICouZmxjKTsgZG9uZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDU2OTk0NjQuLjEwMzJmZjIgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTIwNzAsNyArMjA3MCw3IEBACiAKIAogCi1mb3IgYWNfZnVuYyBpbiBtZW1tb3ZlIHRjZ2V0YXR0ciB1c2xlZXAgd2FpdDQgd2FpdHBpZAorZm9yIGFjX2Z1bmMgaW4gbWVtbW92ZSBzdHJlcnJvciB0Y2dldGF0dHIgdXNsZWVwIHdhaXQ0IHdhaXRwaWQKIGRvCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgogZWNobyAiY29uZmlndXJlOjIwNzc6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1CkBAIC0yNTIzLDEwICsyNTIzLDEyIEBACiBvYmplY3RzL01ha2VmaWxlCiBvbGUvTWFrZWZpbGUKIHByb2dyYW1zL01ha2VmaWxlCitwcm9ncmFtcy9ub3RlcGFkL01ha2VmaWxlCiBwcm9ncmFtcy9wcm9nbWFuL01ha2VmaWxlCiBwcm9ncmFtcy93aW5oZWxwL01ha2VmaWxlCiBwcm9ncmFtcy93aW52ZXIvTWFrZWZpbGUKIHJjL01ha2VmaWxlCityZWxheTMyL01ha2VmaWxlCiByZXNvdXJjZXMvTWFrZWZpbGUKIHNjaGVkdWxlci9NYWtlZmlsZQogdG9vbHMvTWFrZWZpbGUKQEAgLTI2NDcsMTAgKzI2NDksMTIgQEAKIG9iamVjdHMvTWFrZWZpbGUKIG9sZS9NYWtlZmlsZQogcHJvZ3JhbXMvTWFrZWZpbGUKK3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUKIHByb2dyYW1zL3Byb2dtYW4vTWFrZWZpbGUKIHByb2dyYW1zL3dpbmhlbHAvTWFrZWZpbGUKIHByb2dyYW1zL3dpbnZlci9NYWtlZmlsZQogcmMvTWFrZWZpbGUKK3JlbGF5MzIvTWFrZWZpbGUKIHJlc291cmNlcy9NYWtlZmlsZQogc2NoZWR1bGVyL01ha2VmaWxlCiB0b29scy9NYWtlZmlsZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmluZGV4IDhjMTE4NmMuLjExYjI2YWIgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5pbgorKysgYi9jb25maWd1cmUuaW4KQEAgLTExNCw3ICsxMTQsNyBAQAogCiBkbmwgKioqKiBDaGVjayBmb3IgZnVuY3Rpb25zIGFuZCBoZWFkZXIgZmlsZXMgKioqKgogCi1BQ19DSEVDS19GVU5DUyhtZW1tb3ZlIHRjZ2V0YXR0ciB1c2xlZXAgd2FpdDQgd2FpdHBpZCkKK0FDX0NIRUNLX0ZVTkNTKG1lbW1vdmUgc3RyZXJyb3IgdGNnZXRhdHRyIHVzbGVlcCB3YWl0NCB3YWl0cGlkKQogQUNfSEVBREVSX1NUQVQoKQogQUNfQ19DT05TVCgpCiBBQ19UWVBFX1NJWkVfVCgpCkBAIC0xNDgsMTAgKzE0OCwxMiBAQAogb2JqZWN0cy9NYWtlZmlsZQogb2xlL01ha2VmaWxlCiBwcm9ncmFtcy9NYWtlZmlsZQorcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZQogcHJvZ3JhbXMvcHJvZ21hbi9NYWtlZmlsZQogcHJvZ3JhbXMvd2luaGVscC9NYWtlZmlsZQogcHJvZ3JhbXMvd2ludmVyL01ha2VmaWxlCiByYy9NYWtlZmlsZQorcmVsYXkzMi9NYWtlZmlsZQogcmVzb3VyY2VzL01ha2VmaWxlCiBzY2hlZHVsZXIvTWFrZWZpbGUKIHRvb2xzL01ha2VmaWxlCmRpZmYgLS1naXQgYS9jb250cm9scy9lZGl0LmMgYi9jb250cm9scy9lZGl0LmMKaW5kZXggYjRjZDNhYy4uMzAzZDJmMSAxMDA2NDQKLS0tIGEvY29udHJvbHMvZWRpdC5jCisrKyBiL2NvbnRyb2xzL2VkaXQuYwpAQCAtMzQ5NCw3ICszNDk0LDcgQEAKIAllID0gRURJVF9DaGFyRnJvbVBvcyh3bmQsIGVzLCB4LCB5LCAmYWZ0ZXJfd3JhcCk7CiAJRURJVF9FTV9TZXRTZWwod25kLCBlcywgKGtleXMgJiBNS19TSElGVCkgPyBlcy0+c2VsZWN0aW9uX3N0YXJ0IDogZSwgZSwgYWZ0ZXJfd3JhcCk7CiAJRURJVF9FTV9TY3JvbGxDYXJldCh3bmQsIGVzKTsKLQllcy0+cmVnaW9uX3Bvc3ggPSBlcy0+cmVnaW9uX3Bvc3ggPSAwOworCWVzLT5yZWdpb25fcG9zeCA9IGVzLT5yZWdpb25fcG9zeSA9IDA7CiAJU2V0VGltZXIzMih3bmQtPmh3bmRTZWxmLCAwLCAxMDAsIE5VTEwpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvY29udHJvbHMvbWVudS5jIGIvY29udHJvbHMvbWVudS5jCmluZGV4IDM1YTg5ZjEuLjhjMmU5ODQgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL21lbnUuYworKysgYi9jb250cm9scy9tZW51LmMKQEAgLTM4NzgsNyArMzg3OCw3IEBACiBCT09MMzIgV0lOQVBJIEluc2VydE1lbnVJdGVtMzJBKEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB1SXRlbSwgQk9PTDMyIGJ5cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRU5VSVRFTUlORk8zMkEgKmxwbWlpKQogewotICAgIE1FTlVJVEVNICppdGVtID0gTUVOVV9JbnNlcnRJdGVtKGhNZW51LCB1SXRlbSwgYnlwb3MpOworICAgIE1FTlVJVEVNICppdGVtID0gTUVOVV9JbnNlcnRJdGVtKGhNZW51LCB1SXRlbSwgYnlwb3MgPyBNRl9CWVBPU0lUSU9OIDogMCApOwogICAgIHJldHVybiBTZXRNZW51SXRlbUluZm8zMl9jb21tb24oaXRlbSwgbHBtaWksIEZBTFNFKTsKIH0KIApAQCAtMzg4OSw3ICszODg5LDcgQEAKIEJPT0wzMiBXSU5BUEkgSW5zZXJ0TWVudUl0ZW0zMlcoSE1FTlUzMiBoTWVudSwgVUlOVDMyIHVJdGVtLCBCT09MMzIgYnlwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1FTlVJVEVNSU5GTzMyVyAqbHBtaWkpCiB7Ci0gICAgTUVOVUlURU0gKml0ZW0gPSBNRU5VX0luc2VydEl0ZW0oaE1lbnUsIHVJdGVtLCBieXBvcyk7CisgICAgTUVOVUlURU0gKml0ZW0gPSBNRU5VX0luc2VydEl0ZW0oaE1lbnUsIHVJdGVtLCBieXBvcyA/IE1GX0JZUE9TSVRJT04gOiAwICk7CiAgICAgcmV0dXJuIFNldE1lbnVJdGVtSW5mbzMyX2NvbW1vbihpdGVtLCAoY29uc3QgTUVOVUlURU1JTkZPMzJBKilscG1paSwgVFJVRSk7CiB9CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3VpdG9vbHMuYyBiL2NvbnRyb2xzL3VpdG9vbHMuYwppbmRleCBiMjQ1ZWJjLi5lM2M2NGRlIDEwMDY0NAotLS0gYS9jb250cm9scy91aXRvb2xzLmMKKysrIGIvY29udHJvbHMvdWl0b29scy5jCkBAIC0yLDEyICsyLDkzIEBACiAgKiBVc2VyIEludGVyZmFjZSBGdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgMTk5NyBEaW1pdHJpZSBPLiBQYXVuCisgKiBDb3B5cmlnaHQgMTk5NyBCZXJ0aG8gQS4gU3R1bHRpZW5zCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKK3N0YXRpYyBjb25zdCBXT1JEIHdQYXR0ZXJuX0FBNTVbOF0gPSB7IDB4YWFhYSwgMHg1NTU1LCAweGFhYWEsIDB4NTU1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YWFhYSwgMHg1NTU1LCAweGFhYWEsIDB4NTU1NSB9OworCisvKiBUaGVzZSB0YWJsZXMgYXJlIHVzZWQgaW46CisgKiBVSVRPT0xTX0RyYXdEaWFnRWRnZSgpCisgKiBVSVRPT0xTX0RyYXdSZWN0RWRnZSgpCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIExUSW5uZXJOb3JtYWxbXSA9IHsKKyAgICAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgICAtMSwKKyAgICAtMSwgICAgICAgICAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfQlROSElHSExJR0hULCAtMSwKKyAgICAtMSwgICAgICAgICAgIENPTE9SXzNEREtTSEFET1csICAgQ09MT1JfM0RES1NIQURPVywgICAtMSwKKyAgICAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgICAtMQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgTFRPdXRlck5vcm1hbFtdID0geworICAgIC0xLCAgICAgICAgICAgICAgICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SX0JUTlNIQURPVywgLTEsCisgICAgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRExJR0hULCAgICAgQ09MT1JfQlROU0hBRE9XLCAtMSwKKyAgICBDT0xPUl8zRERLU0hBRE9XLCAgIENPTE9SXzNETElHSFQsICAgICBDT0xPUl9CVE5TSEFET1csIC0xLAorICAgIC0xLCAgICAgICAgICAgICAgICAgQ09MT1JfM0RMSUdIVCwgICAgIENPTE9SX0JUTlNIQURPVywgLTEKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIFJCSW5uZXJOb3JtYWxbXSA9IHsKKyAgICAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgIC0xLAorICAgIC0xLCAgICAgICAgICAgQ09MT1JfQlROU0hBRE9XLCAgIENPTE9SX0JUTlNIQURPVywgLTEsCisgICAgLTEsICAgICAgICAgICBDT0xPUl8zRExJR0hULCAgICAgQ09MT1JfM0RMSUdIVCwgICAtMSwKKyAgICAtMSwgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgIC0xCit9OworCitzdGF0aWMgY29uc3QgY2hhciBSQk91dGVyTm9ybWFsW10gPSB7CisgICAgLTEsICAgICAgICAgICAgICBDT0xPUl8zRERLU0hBRE9XLCAgQ09MT1JfQlROSElHSExJR0hULCAtMSwKKyAgICBDT0xPUl9CVE5TSEFET1csIENPTE9SXzNEREtTSEFET1csICBDT0xPUl9CVE5ISUdITElHSFQsIC0xLAorICAgIENPTE9SXzNETElHSFQsICAgQ09MT1JfM0RES1NIQURPVywgIENPTE9SX0JUTkhJR0hMSUdIVCwgLTEsCisgICAgLTEsICAgICAgICAgICAgICBDT0xPUl8zRERLU0hBRE9XLCAgQ09MT1JfQlROSElHSExJR0hULCAtMQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgTFRJbm5lclNvZnRbXSA9IHsKKyAgICAtMSwgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAtMSwKKyAgICAtMSwgICAgICAgICAgICAgICAgICBDT0xPUl8zRExJR0hULCAgICAgQ09MT1JfM0RMSUdIVCwgICAtMSwKKyAgICAtMSwgICAgICAgICAgICAgICAgICBDT0xPUl9CVE5TSEFET1csICAgQ09MT1JfQlROU0hBRE9XLCAtMSwKKyAgICAtMSwgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgICAgLTEsICAgICAgICAgICAgICAtMQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgTFRPdXRlclNvZnRbXSA9IHsKKyAgICAtMSwgICAgICAgICAgICAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfM0RES1NIQURPVywgLTEsCisgICAgQ09MT1JfM0RMSUdIVCwgICBDT0xPUl9CVE5ISUdITElHSFQsIENPTE9SXzNEREtTSEFET1csIC0xLAorICAgIENPTE9SX0JUTlNIQURPVywgQ09MT1JfQlROSElHSExJR0hULCBDT0xPUl8zRERLU0hBRE9XLCAtMSwKKyAgICAtMSwgICAgICAgICAgICAgIENPTE9SX0JUTkhJR0hMSUdIVCwgQ09MT1JfM0RES1NIQURPVywgLTEKK307CisKKyNkZWZpbmUgUkJJbm5lclNvZnQgUkJJbm5lck5vcm1hbCAgIC8qIFRoZXNlIGFyZSB0aGUgc2FtZSAqLworI2RlZmluZSBSQk91dGVyU29mdCBSQk91dGVyTm9ybWFsCisKK3N0YXRpYyBjb25zdCBjaGFyIExUUkJPdXRlck1vbm9bXSA9IHsKKyAgICAtMSwgICAgICAgICAgIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsCisgICAgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAorICAgIENPTE9SX1dJTkRPVywgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwKKyAgICBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPV0ZSQU1FLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsCit9OworCitzdGF0aWMgY29uc3QgY2hhciBMVFJCSW5uZXJNb25vW10gPSB7CisgICAgLTEsIC0xLCAgICAgICAgICAgLTEsICAgICAgICAgICAtMSwKKyAgICAtMSwgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywKKyAgICAtMSwgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywKKyAgICAtMSwgQ09MT1JfV0lORE9XLCBDT0xPUl9XSU5ET1csIENPTE9SX1dJTkRPVywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIExUUkJPdXRlckZsYXRbXSA9IHsKKyAgICAtMSwgICAgICAgICAgICAgICAgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywKKyAgICBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywKKyAgICBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywKKyAgICBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfQlROU0hBRE9XLCBDT0xPUl9CVE5TSEFET1csIENPTE9SX0JUTlNIQURPVywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIExUUkJJbm5lckZsYXRbXSA9IHsKKyAgICAtMSwgLTEsICAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgIC0xLAorICAgIC0xLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAorICAgIC0xLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAorICAgIC0xLCBDT0xPUl9XSU5ET1dGUkFNRSwgQ09MT1JfV0lORE9XRlJBTUUsIENPTE9SX1dJTkRPV0ZSQU1FLAorfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVUlUT09MU19EcmF3RGlhZ0VkZ2UKICAqCkBAIC0xOSwxNDMgKzEwMCwyNTIgQEAKICAqIHVzaW5nIHRoZSBicnVzaGVzIHJldHVybmVkIGJ5IEdldFN5c0NvbG9yQnJ1c2ggZnVuYywgYnV0IEkgZGlkIG5vdCBoYXZlCiAgKiB0aGUgcGF0aWVuY2UgdG8gaW1wbGVtZW50IHRoYXQgeWV0LgogICovCi1zdGF0aWMgQk9PTDMyIFVJVE9PTFNfRHJhd0RpYWdFZGdlKEhEQzMyIGhkYywgUkVDVDMyICpyZWN0LCBVSU5UMzIgZWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGZsYWdzKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogMDMtRGVjLTE5OTc6IENoYW5nZWQgYnkgQmVydGhvIFN0dWx0aWVucworICoKKyAqIFNlZSBhbHNvIGNvbW1lbnRzIHdpdGggVUlUT09MU19EcmF3UmVjdEVkZ2UoKQorICovCitzdGF0aWMgQk9PTDMyIFVJVE9PTFNfRHJhd0RpYWdFZGdlKEhEQzMyIGhkYywgTFBSRUNUMzIgcmMsIFVJTlQzMiB1VHlwZSwgVUlOVDMyIHVGbGFncykKIHsKLSAgSFBFTjMyIGZhY2VQZW4sIHNoYWRvd1BlbiwgbGlnaHRQZW4sIGJsYWNrUGVuLCBncmF5UGVuLCBudWxsUGVuOwotICBIUEVOMzIgaVBlbiwgb1Blbiwgb2xkUGVuOwotICBIQlJVU0gzMiBvbGRCcnVzaCwgZmFjZUJydXNoOwotICBpbnQgY2wsIGNyLCBjdCwgY2I7Ci0gIEJPT0wzMiBtYWluRGlhZzsKLSAgUE9JTlQzMiB0cDsKLSAgUkVDVDMyIHI7CisgICAgUE9JTlQzMiBQb2ludHNbNF07CisgICAgY2hhciBJbm5lckksIE91dGVySTsKKyAgICBIUEVOMzIgSW5uZXJQZW4sIE91dGVyUGVuOworICAgIFBPSU5UMzIgU2F2ZVBvaW50OworICAgIEhQRU4zMiBTYXZlUGVuOworICAgIGludCBzcHgsIHNweTsKKyAgICBpbnQgZXB4LCBlcHk7CisgICAgaW50IFdpZHRoID0gcmMtPnJpZ2h0IC0gcmMtPmxlZnQ7CisgICAgaW50IEhlaWdodD0gcmMtPmJvdHRvbSAtIHJjLT50b3A7CisgICAgaW50IFNtYWxsRGlhbSA9IFdpZHRoID4gSGVpZ2h0ID8gSGVpZ2h0IDogV2lkdGg7CisgICAgQk9PTDMyIHJldHZhbCA9ICEoICAgKCh1VHlwZSAmIEJEUl9JTk5FUikgPT0gQkRSX0lOTkVSCisgICAgICAgICAgICAgICAgICAgICAgIHx8ICh1VHlwZSAmIEJEUl9PVVRFUikgPT0gQkRSX09VVEVSKQorICAgICAgICAgICAgICAgICAgICAgICYmICEodUZsYWdzICYgKEJGX0ZMQVR8QkZfTU9OTykpICk7CisgICAgaW50IGFkZCA9IChMVFJCSW5uZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXSAhPSAtMSA/IDEgOiAwKQorICAgICAgICAgICAgKyAoTFRSQk91dGVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV0gIT0gLTEgPyAxIDogMCk7CiAKLSAgLyogSWYgYm90aCByYXNpZWQgYW5kIHN1bmtlbiBpcyBzcGVjaWZpZWQsIHRoZXkgYW5paGlsYXRlIG9uZSBhbm90aGVyICovCi0gIGlmKCAhKChmbGFncyAmIEJGX01PTk8pIHx8IChmbGFncyAmIEJGX0ZMQVQpKSApewotICAgIGlmKCAoZWRnZSAmIEJEUl9SQUlTRURPVVRFUikgJiYgKGVkZ2UgJiBCRFJfU1VOS0VOT1VURVIpICkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICBpZiggKGVkZ2UgJiBCRFJfUkFJU0VESU5ORVIpICYmIChlZGdlICYgQkRSX1NVTktFTklOTkVSKSApCi0gICAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBDcmVhdGUvZ2V0IHRoZSB0b29scyBvZiB0aGUgdHJhZGUuLi4gKi8KLSAgZmFjZVBlbiA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SX0JUTkZBQ0UpKTsKLSAgc2hhZG93UGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfQlROU0hBRE9XKSk7Ci0gIGxpZ2h0UGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfQlROSElMSUdIVCkpOwotICBncmF5UGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIFJHQigxNjgsIDE1MiwgMTQ0KSk7Ci0gIGJsYWNrUGVuID0gR2V0U3RvY2tPYmplY3QzMihCTEFDS19QRU4pOwotICBudWxsUGVuID0gR2V0U3RvY2tPYmplY3QzMihOVUxMX1BFTik7Ci0gIGZhY2VCcnVzaCA9IEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5GQUNFKTsKLSAgb2xkUGVuID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBudWxsUGVuKTsKLSAgb2xkQnJ1c2ggPSBTZWxlY3RPYmplY3QzMihoZGMsIGZhY2VCcnVzaCk7Ci0KLSAgLyogdGhpcyBpcyBteSB3b3JraW5nIHJlY3RhbmdsZSAqLwotICByID0gKnJlY3Q7Ci0KLSAgaWYoZmxhZ3MgJiBCRl9NT05PKXsKLSAgICBvUGVuID0gYmxhY2tQZW47Ci0gICAgaVBlbiA9IG51bGxQZW47Ci0gIH1lbHNlIGlmKGZsYWdzICYgQkZfRkxBVCl7Ci0gICAgb1BlbiA9IHNoYWRvd1BlbjsKLSAgICBpUGVuID0gZmFjZVBlbjsKLSAgfWVsc2UgewotICAgIGlmKGZsYWdzICYgQkZfU09GVCl7Ci0gICAgICBpZihmbGFncyAmIEJGX0JPVFRPTSl7Ci0Jb1BlbiA9IChlZGdlICYgQkRSX1JBSVNFRE9VVEVSKSA/IGJsYWNrUGVuIDogbGlnaHRQZW47Ci0JaVBlbiA9IChlZGdlICYgQkRSX1JBSVNFRElOTkVSKSA/IHNoYWRvd1BlbiA6IGdyYXlQZW47Ci0gICAgICB9Ci0gICAgICBlbHNlewotCW9QZW4gPSAoZWRnZSAmIEJEUl9SQUlTRURPVVRFUikgPyBsaWdodFBlbiA6IGJsYWNrUGVuOwotCWlQZW4gPSAoZWRnZSAmIEJEUl9SQUlTRURJTk5FUikgPyBncmF5UGVuIDogc2hhZG93UGVuOwotICAgICAgfQorICAgIC8qIEluaXQgc29tZSB2YXJzICovCisgICAgT3V0ZXJQZW4gPSBJbm5lclBlbiA9IChIUEVOMzIpR2V0U3RvY2tPYmplY3QzMihOVUxMX1BFTik7CisgICAgU2F2ZVBlbiA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoaGRjLCBJbm5lclBlbik7CisgICAgc3B4ID0gc3B5ID0gZXB4ID0gZXB5ID0gMDsgLyogU2F0aXNmeSB0aGUgY29tcGlsZXIuLi4gKi8KKyAgICAKKyAgICAvKiBEZXRlcm1pbmUgdGhlIGNvbG9ycyBvZiB0aGUgZWRnZXMgKi8KKyAgICBpZih1RmxhZ3MgJiBCRl9NT05PKQorICAgIHsKKyAgICAgICAgSW5uZXJJID0gTFRSQklubmVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CisgICAgICAgIE91dGVySSA9IExUUkJPdXRlck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOwogICAgIH0KLSAgICBlbHNlewotICAgICAgaWYoZmxhZ3MgJiBCRl9CT1RUT00pewotCW9QZW4gPSAoZWRnZSAmIEJEUl9SQUlTRURPVVRFUikgPyBibGFja1BlbiA6IGxpZ2h0UGVuOwotCWlQZW4gPSAoZWRnZSAmIEJEUl9SQUlTRURJTk5FUikgPyBzaGFkb3dQZW4gOiBncmF5UGVuOwotICAgICAgfQotICAgICAgZWxzZXsKLQlvUGVuID0gKGVkZ2UgJiBCRFJfUkFJU0VET1VURVIpID8gZ3JheVBlbiA6IHNoYWRvd1BlbjsKLQlpUGVuID0gKGVkZ2UgJiBCRFJfUkFJU0VESU5ORVIpID8gbGlnaHRQZW4gOiBibGFja1BlbjsKLSAgICAgIH0KKyAgICBlbHNlIGlmKHVGbGFncyAmIEJGX0ZMQVQpCisgICAgeworICAgICAgICBJbm5lckkgPSBMVFJCSW5uZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgT3V0ZXJJID0gTFRSQk91dGVyRmxhdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CiAgICAgfQotICB9Ci0KLSAgaWYoZmxhZ3MgJiBCRl9CT1RUT00pewotICAgIGlmKGZsYWdzICYgQkZfTEVGVCl7Ci0gICAgICBjciA9IC0xOyBjbCA9ICAwOwotICAgICAgY3QgPSAgMDsgY2IgPSAtMTsKLSAgICAgIG1haW5EaWFnID0gVFJVRTsKLSAgICAgIHRwLnggPSByLmxlZnQ7IHRwLnkgPSByLnRvcDsKKyAgICBlbHNlIGlmKHVGbGFncyAmIEJGX1NPRlQpCisgICAgeworICAgICAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pCisgICAgICAgIHsKKyAgICAgICAgICAgIElubmVySSA9IFJCSW5uZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgICAgIE91dGVySSA9IFJCT3V0ZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIElubmVySSA9IExUSW5uZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgICAgIE91dGVySSA9IExUT3V0ZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgfQogICAgIH0KLSAgICBlbHNleyAvKiBSSUdIVCAqLwotICAgICAgY3IgPSAtMTsgY2wgPSAgMDsKLSAgICAgIGN0ID0gIDE7IGNiID0gIDA7Ci0gICAgICB0cC54ID0gci5sZWZ0OyB0cC55ID0gci5ib3R0b20tMTsKLSAgICAgIG1haW5EaWFnID0gRkFMU0U7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYodUZsYWdzICYgQkZfQk9UVE9NKQorICAgICAgICB7CisgICAgICAgICAgICBJbm5lckkgPSBSQklubmVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgICAgIE91dGVySSA9IFJCT3V0ZXJOb3JtYWxbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgSW5uZXJJID0gTFRJbm5lck5vcm1hbFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CisgICAgICAgICAgICBPdXRlckkgPSBMVE91dGVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgfQogICAgIH0KLSAgfQotICBlbHNleyAgLyogVE9QICovCi0gICAgaWYoZmxhZ3MgJiBCRl9MRUZUKXsKLSAgICAgIGNyID0gIDA7IGNsID0gIDE7Ci0gICAgICBjdCA9ICAwOyBjYiA9IC0xOwotICAgICAgbWFpbkRpYWcgPSBGQUxTRTsKLSAgICAgIHRwLnggPSByLnJpZ2h0OyB0cC55ID0gci50b3A7CisKKyAgICBpZihJbm5lckkgIT0gLTEpIElubmVyUGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoKGludClJbm5lckkpKTsKKyAgICBpZihPdXRlckkgIT0gLTEpIE91dGVyUGVuID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoKGludClPdXRlckkpKTsKKworICAgIE1vdmVUb0V4MzIoaGRjLCAwLCAwLCAmU2F2ZVBvaW50KTsKKworICAgIC8qIERvbid0IGFzayBtZSB3aHksIGJ1dCB0aGlzIGlzIHdoYXQgaXMgdmlzaWJsZS4uLiAqLworICAgIC8qIFRoaXMgbXVzdCBiZSBwb3NzaWJsZSB0byBkbyBtdWNoIHNpbXBsZXIsIGJ1dCBJIGZhaWwgdG8gKi8KKyAgICAvKiBzZWUgdGhlIGxvZ2ljIGluIHRoZSBNUyBpbXBsZW1lbnRhdGlvbiAoc2lnaC4uLikuICovCisgICAgLyogU28sIHRoaXMgbWlnaHQgbG9vayBhIGJpdCBicnV0ZSBmb3JjZSBoZXJlIChhbmQgaXQgaXMpLCBidXQgKi8KKyAgICAvKiBpdCBnZXRzIHRoZSBqb2IgZG9uZTspICovCisKKyAgICBzd2l0Y2godUZsYWdzICYgQkZfUkVDVCkKKyAgICB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgQkZfTEVGVDoKKyAgICBjYXNlIEJGX0JPVFRPTToKKyAgICBjYXNlIEJGX0JPVFRPTUxFRlQ6CisgICAgICAgIC8qIExlZnQgYm90dG9tIGVuZHBvaW50ICovCisgICAgICAgIGVweCA9IHJjLT5sZWZ0LTE7CisgICAgICAgIHNweCA9IGVweCArIFNtYWxsRGlhbTsKKyAgICAgICAgZXB5ID0gcmMtPmJvdHRvbTsKKyAgICAgICAgc3B5ID0gZXB5IC0gU21hbGxEaWFtOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQkZfVE9QTEVGVDoKKyAgICBjYXNlIEJGX0JPVFRPTVJJR0hUOgorICAgICAgICAvKiBMZWZ0IHRvcCBlbmRwb2ludCAqLworICAgICAgICBlcHggPSByYy0+bGVmdC0xOworICAgICAgICBzcHggPSBlcHggKyBTbWFsbERpYW07CisgICAgICAgIGVweSA9IHJjLT50b3AtMTsKKyAgICAgICAgc3B5ID0gZXB5ICsgU21hbGxEaWFtOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQkZfVE9QOgorICAgIGNhc2UgQkZfUklHSFQ6CisgICAgY2FzZSBCRl9UT1BSSUdIVDoKKyAgICBjYXNlIEJGX1JJR0hUfEJGX0xFRlQ6CisgICAgY2FzZSBCRl9SSUdIVHxCRl9MRUZUfEJGX1RPUDoKKyAgICBjYXNlIEJGX0JPVFRPTXxCRl9UT1A6CisgICAgY2FzZSBCRl9CT1RUT018QkZfVE9QfEJGX0xFRlQ6CisgICAgY2FzZSBCRl9CT1RUT01SSUdIVHxCRl9MRUZUOgorICAgIGNhc2UgQkZfQk9UVE9NUklHSFR8QkZfVE9QOgorICAgIGNhc2UgQkZfUkVDVDoKKyAgICAgICAgLyogUmlnaHQgdG9wIGVuZHBvaW50ICovCisgICAgICAgIHNweCA9IHJjLT5sZWZ0OworICAgICAgICBlcHggPSBzcHggKyBTbWFsbERpYW07CisgICAgICAgIHNweSA9IHJjLT5ib3R0b20tMTsKKyAgICAgICAgZXB5ID0gc3B5IC0gU21hbGxEaWFtOworICAgICAgICBicmVhazsKICAgICB9Ci0gICAgZWxzZXsgLyogUklHSFQgKi8KLSAgICAgIGNyID0gIDA7IGNsID0gIDE7Ci0gICAgICBjdCA9ICAxOyBjYiA9ICAwOwotICAgICAgdHAueCA9IHIucmlnaHQ7IHRwLnkgPSByLmJvdHRvbS0xOwotICAgICAgbWFpbkRpYWcgPSBUUlVFOworCisgICAgTW92ZVRvRXgzMihoZGMsIHNweCwgc3B5LCBOVUxMKTsKKyAgICBTZWxlY3RPYmplY3QzMihoZGMsIE91dGVyUGVuKTsKKyAgICBMaW5lVG8zMihoZGMsIGVweCwgZXB5KTsKKworICAgIFNlbGVjdE9iamVjdDMyKGhkYywgSW5uZXJQZW4pOworCisgICAgc3dpdGNoKHVGbGFncyAmIChCRl9SRUNUfEJGX0RJQUdPTkFMKSkKKyAgICB7CisgICAgY2FzZSBCRl9ESUFHT05BTF9FTkRCT1RUT01MRUZUOgorICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX0JPVFRPTSk6CisgICAgY2FzZSBCRl9ESUFHT05BTDoKKyAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9MRUZUKToKKyAgICAgICAgTW92ZVRvRXgzMihoZGMsIHNweC0xLCBzcHksIE5VTEwpOworICAgICAgICBMaW5lVG8zMihoZGMsIGVweCwgZXB5LTEpOworICAgICAgICBQb2ludHNbMF0ueCA9IHNweC1hZGQ7CisgICAgICAgIFBvaW50c1swXS55ID0gc3B5OworICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5sZWZ0OworICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT50b3A7CisgICAgICAgIFBvaW50c1syXS54ID0gZXB4KzE7CisgICAgICAgIFBvaW50c1syXS55ID0gZXB5LTEtYWRkOworICAgICAgICBQb2ludHNbM10gPSBQb2ludHNbMl07CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBCRl9ESUFHT05BTF9FTkRCT1RUT01SSUdIVDoKKyAgICAgICAgTW92ZVRvRXgzMihoZGMsIHNweC0xLCBzcHksIE5VTEwpOworICAgICAgICBMaW5lVG8zMihoZGMsIGVweCwgZXB5KzEpOworICAgICAgICBQb2ludHNbMF0ueCA9IHNweC1hZGQ7CisgICAgICAgIFBvaW50c1swXS55ID0gc3B5OworICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5sZWZ0OworICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT5ib3R0b20tMTsKKyAgICAgICAgUG9pbnRzWzJdLnggPSBlcHgrMTsKKyAgICAgICAgUG9pbnRzWzJdLnkgPSBlcHkrMSthZGQ7CisgICAgICAgIFBvaW50c1szXSA9IFBvaW50c1syXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9CT1RUT018QkZfUklHSFR8QkZfVE9QKToKKyAgICBjYXNlIChCRl9ESUFHT05BTHxCRl9CT1RUT018QkZfUklHSFR8QkZfVE9QfEJGX0xFRlQpOgorICAgIGNhc2UgQkZfRElBR09OQUxfRU5EVE9QUklHSFQ6CisgICAgY2FzZSAoQkZfRElBR09OQUx8QkZfUklHSFR8QkZfVE9QfEJGX0xFRlQpOgorICAgICAgICBNb3ZlVG9FeDMyKGhkYywgc3B4KzEsIHNweSwgTlVMTCk7CisgICAgICAgIExpbmVUbzMyKGhkYywgZXB4LCBlcHkrMSk7CisgICAgICAgIFBvaW50c1swXS54ID0gZXB4LTE7CisgICAgICAgIFBvaW50c1swXS55ID0gZXB5KzErYWRkOworICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOworICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT50b3ArYWRkOworICAgICAgICBQb2ludHNbMl0ueCA9IHJjLT5yaWdodC0xOworICAgICAgICBQb2ludHNbMl0ueSA9IHJjLT5ib3R0b20tMTsKKyAgICAgICAgUG9pbnRzWzNdLnggPSBzcHgrYWRkOworICAgICAgICBQb2ludHNbM10ueSA9IHNweTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEJGX0RJQUdPTkFMX0VORFRPUExFRlQ6CisgICAgICAgIE1vdmVUb0V4MzIoaGRjLCBzcHgsIHNweS0xLCBOVUxMKTsKKyAgICAgICAgTGluZVRvMzIoaGRjLCBlcHgrMSwgZXB5KTsKKyAgICAgICAgUG9pbnRzWzBdLnggPSBlcHgrMSthZGQ7CisgICAgICAgIFBvaW50c1swXS55ID0gZXB5KzE7CisgICAgICAgIFBvaW50c1sxXS54ID0gcmMtPnJpZ2h0LTE7CisgICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcDsKKyAgICAgICAgUG9pbnRzWzJdLnggPSByYy0+cmlnaHQtMTsKKyAgICAgICAgUG9pbnRzWzJdLnkgPSByYy0+Ym90dG9tLTEtYWRkOworICAgICAgICBQb2ludHNbM10ueCA9IHNweDsKKyAgICAgICAgUG9pbnRzWzNdLnkgPSBzcHktYWRkOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1RPUCk6CisgICAgY2FzZSAoQkZfRElBR09OQUx8QkZfQk9UVE9NfEJGX1RPUCk6CisgICAgY2FzZSAoQkZfRElBR09OQUx8QkZfQk9UVE9NfEJGX1RPUHxCRl9MRUZUKToKKyAgICAgICAgTW92ZVRvRXgzMihoZGMsIHNweCsxLCBzcHktMSwgTlVMTCk7CisgICAgICAgIExpbmVUbzMyKGhkYywgZXB4LCBlcHkpOworICAgICAgICBQb2ludHNbMF0ueCA9IGVweC0xOworICAgICAgICBQb2ludHNbMF0ueSA9IGVweSsxOworICAgICAgICBQb2ludHNbMV0ueCA9IHJjLT5yaWdodC0xOworICAgICAgICBQb2ludHNbMV0ueSA9IHJjLT50b3A7CisgICAgICAgIFBvaW50c1syXS54ID0gcmMtPnJpZ2h0LTE7CisgICAgICAgIFBvaW50c1syXS55ID0gcmMtPmJvdHRvbS0xLWFkZDsKKyAgICAgICAgUG9pbnRzWzNdLnggPSBzcHgrYWRkOworICAgICAgICBQb2ludHNbM10ueSA9IHNweS1hZGQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAoQkZfRElBR09OQUx8QkZfUklHSFQpOgorICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1JJR0hUfEJGX0xFRlQpOgorICAgIGNhc2UgKEJGX0RJQUdPTkFMfEJGX1JJR0hUfEJGX0xFRlR8QkZfQk9UVE9NKToKKyAgICAgICAgTW92ZVRvRXgzMihoZGMsIHNweCwgc3B5LCBOVUxMKTsKKyAgICAgICAgTGluZVRvMzIoaGRjLCBlcHgtMSwgZXB5KzEpOworICAgICAgICBQb2ludHNbMF0ueCA9IHNweDsKKyAgICAgICAgUG9pbnRzWzBdLnkgPSBzcHk7CisgICAgICAgIFBvaW50c1sxXS54ID0gcmMtPmxlZnQ7CisgICAgICAgIFBvaW50c1sxXS55ID0gcmMtPnRvcCthZGQ7CisgICAgICAgIFBvaW50c1syXS54ID0gZXB4LTEtYWRkOworICAgICAgICBQb2ludHNbMl0ueSA9IGVweSsxK2FkZDsKKyAgICAgICAgUG9pbnRzWzNdID0gUG9pbnRzWzJdOworICAgICAgICBicmVhazsKICAgICB9Ci0gIH0KIAotICAvKiBpZiBpdCBoYXMgZXh0ZXJuYWwgZWRnZSwgZHJhdyBpdCAqLwotICBpZihlZGdlICYgQkRSX09VVEVSKXsKLSAgICBTZWxlY3RPYmplY3QzMihoZGMsIG9QZW4pOwotICAgIE1vdmVUb0V4MzIoaGRjLCByLmxlZnQsIG1haW5EaWFnID8gci5ib3R0b20tMSA6IHIudG9wLCAwKTsKLSAgICBMaW5lVG8zMihoZGMsIHIucmlnaHQsIG1haW5EaWFnID8gci50b3AtMSA6IHIuYm90dG9tKTsKLSAgICByLmxlZnQgKz0gY2w7IHIucmlnaHQgKz0gY3I7IHIudG9wICs9IGN0OyByLmJvdHRvbSArPSBjYjsKLSAgfQorICAgIC8qIEZpbGwgdGhlIGludGVyaW9yIGlmIGFza2VkICovCisgICAgaWYoKHVGbGFncyAmIEJGX01JRERMRSkgJiYgcmV0dmFsKQorICAgIHsKKyAgICAgICAgSEJSVVNIMzIgaGJzYXZlOworICAgICAgICBIQlJVU0gzMiBoYiA9IHVGbGFncyAmIEJGX01PTk8gPyBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfV0lORE9XKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlRORkFDRSk7CisgICAgICAgIEhQRU4zMiBocHNhdmU7CisgICAgICAgIEhQRU4zMiBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCB1RmxhZ3MgJiBCRl9NT05PID8gR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR2V0U3lzQ29sb3IzMihDT0xPUl9CVE5GQUNFKSk7CisgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihoZGMsIGhiKTsKKyAgICAgICAgaHBzYXZlID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihoZGMsIGhwKTsKKyAgICAgICAgUG9seWdvbjMyKGhkYywgUG9pbnRzLCA0KTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBoYnNhdmUpOworICAgICAgICBTZWxlY3RPYmplY3QzMihoZGMsIGhwc2F2ZSk7CisgICAgICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKKyAgICB9CiAKLSAgLyogaWYgaXQgaGFzIGludGVybmFsIGVkZ2UsIGRyYXcgaXQgKi8KLSAgaWYoZWRnZSAmIEJEUl9JTk5FUil7Ci0gICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBpUGVuKTsKLSAgICBNb3ZlVG9FeDMyKGhkYywgci5sZWZ0LCBtYWluRGlhZyA/IHIuYm90dG9tLTEgOiByLnRvcCwgMCk7Ci0gICAgTGluZVRvMzIoaGRjLCByLnJpZ2h0LCBtYWluRGlhZyA/IHIudG9wLTEgOiByLmJvdHRvbSk7Ci0gICAgci5sZWZ0ICs9IGNsOyByLnJpZ2h0ICs9IGNyOyByLnRvcCArPSBjdDsgci5ib3R0b20gKz0gY2I7Ci0gIH0KKyAgICAvKiBBZGp1c3QgcmVjdGFuZ2xlIGlmIGFza2VkICovCisgICAgaWYodUZsYWdzICYgQkZfQURKVVNUKQorICAgIHsKKyAgICAgICAgaWYodUZsYWdzICYgQkZfTEVGVCkgICByYy0+bGVmdCAgICs9IGFkZDsKKyAgICAgICAgaWYodUZsYWdzICYgQkZfUklHSFQpICByYy0+cmlnaHQgIC09IGFkZDsKKyAgICAgICAgaWYodUZsYWdzICYgQkZfVE9QKSAgICByYy0+dG9wICAgICs9IGFkZDsKKyAgICAgICAgaWYodUZsYWdzICYgQkZfQk9UVE9NKSByYy0+Ym90dG9tIC09IGFkZDsKKyAgICB9CiAKLSAgaWYoKGZsYWdzICYgQkZfTUlERExFKSAmJiAhKGZsYWdzICYgQkZfTU9OTykpewotICAgIFBPSU5UMzIgcFszXTsKLSAgICBwWzBdLnggPSBtYWluRGlhZyA/IHIucmlnaHQ6IHIubGVmdDsKLSAgICBwWzBdLnkgPSByLnRvcDsKLSAgICBwWzFdLnggPSBtYWluRGlhZyA/IHIubGVmdCA6IHIucmlnaHQ7Ci0gICAgcFsxXS55ID0gci5ib3R0b207Ci0gICAgcFsyXS54ID0gdHAueDsKLSAgICBwWzJdLnkgPSB0cC55OwotICAgIFNlbGVjdE9iamVjdDMyKGhkYywgbnVsbFBlbik7Ci0gICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBmYWNlQnJ1c2gpOwotICAgIFBvbHlnb24zMihoZGMsIHAsIDMpOwotICB9CisgICAgLyogQ2xlYW51cCAqLworICAgIFNlbGVjdE9iamVjdDMyKGhkYywgU2F2ZVBlbik7CisgICAgaWYoSW5uZXJJICE9IC0xKSBEZWxldGVPYmplY3QzMihJbm5lclBlbik7CisgICAgaWYoT3V0ZXJJICE9IC0xKSBEZWxldGVPYmplY3QzMihPdXRlclBlbik7CisgICAgTW92ZVRvRXgzMihoZGMsIFNhdmVQb2ludC54LCBTYXZlUG9pbnQueSwgTlVMTCk7CiAKLSAgaWYoZmxhZ3MgJiBCRl9BREpVU1QpCi0gICAgKnJlY3QgPSByOwotCi0gIC8qIFJlc3RvcmUgdGhlIERDICovCi0gIFNlbGVjdE9iamVjdDMyKGhkYywgb2xkUGVuKTsKLSAgU2VsZWN0T2JqZWN0MzIoaGRjLCBvbGRCcnVzaCk7Ci0KLSAgLyogQ2xlYW4tdXAgKi8KLSAgRGVsZXRlT2JqZWN0MzIoZmFjZVBlbik7Ci0gIERlbGV0ZU9iamVjdDMyKHNoYWRvd1Blbik7Ci0gIERlbGV0ZU9iamVjdDMyKGxpZ2h0UGVuKTsKLSAgRGVsZXRlT2JqZWN0MzIoZ3JheVBlbik7Ci0KLSAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBVSVRPT0xTX0RyYXdSZWN0RWRnZQogICoKQEAgLTE2NywxMTUgKzM1NywyMDggQEAKICAqIG9uZSBnZW5lcmF0ZWQgYnkgdGhlIG5hdGl2ZSBEcmF3RWRnZSBhbmQgaXQgaXMgaWRlbnRpY2FsIG9uIGFsbCBjYXNlcyB0aGF0CiAgKiBJIHRyaWVkLCBhbmQgSSB0cmllZCBxdWl0ZSBhIGZldy4KICAqLwotc3RhdGljIEJPT0wzMiBVSVRPT0xTX0RyYXdSZWN0RWRnZShIREMzMiBoZGMsIFJFQ1QzMiAqcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGVkZ2UsIFVJTlQzMiBmbGFncykKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIDIzLU5vdi0xOTk3OiBDaGFuZ2VkIGJ5IEJlcnRobyBTdHVsdGllbnMKKyAqCisgKiBXZWxsLCBJIHN0YXJ0ZWQgdGVzdGluZyB0aGlzIGFuZCBmb3VuZCBvdXQgdGhhdCB0aGVyZSBhcmUgYSBmZXcgdGhpbmdzCisgKiB0aGF0IHdlcmVuJ3QgcXVpdGUgYXMgd2luOTUuIFRoZSBmb2xsb3dpbmcgcmV3cml0ZSBzaG91bGQgcmVwcm9kdWNlCisgKiB3aW45NSByZXN1bHRzIGNvbXBsZXRlbHkuCisgKiBUaGUgY29sb3JzZWxlY3Rpb24gaXMgdGFibGUtZHJpdmVuIHRvIGF2b2lkIGF3ZnVsbCBpZi1zdGF0ZW1lbnRzLgorICogVGhlIHRhYmxlIGJlbG93IHNob3cgdGhlIGNvbG9yIHNldHRpbmdzLgorICoKKyAqIFBlbiBzZWxlY3Rpb24gdGFibGUgZm9yIHVGbGFncyA9IDAKKyAqCisgKiB1VHlwZSB8ICBMVEkgIHwgIExUTyAgfCAgUkJJICB8ICBSQk8KKyAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCisgKiAgMDAwMCB8ICAgeCAgIHwgICB4ICAgfCAgIHggICB8ICAgeAorICogIDAwMDEgfCAgIHggICB8ICAyMiAgIHwgICB4ICAgfCAgMjEKKyAqICAwMDEwIHwgICB4ICAgfCAgMTYgICB8ICAgeCAgIHwgIDIwCisgKiAgMDAxMSB8ICAgeCAgIHwgICB4ICAgfCAgIHggICB8ICAgeAorICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KKyAqICAwMTAwIHwgICB4ICAgfCAgMjAgICB8ICAgeCAgIHwgIDE2CisgKiAgMDEwMSB8ICAyMCAgIHwgIDIyICAgfCAgMTYgICB8ICAyMQorICogIDAxMTAgfCAgMjAgICB8ICAxNiAgIHwgIDE2ICAgfCAgMjAKKyAqICAwMTExIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CisgKiAtLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLQorICogIDEwMDAgfCAgIHggICB8ICAyMSAgIHwgICB4ICAgfCAgMjIKKyAqICAxMDAxIHwgIDIxICAgfCAgMjIgICB8ICAyMiAgIHwgIDIxCisgKiAgMTAxMCB8ICAyMSAgIHwgIDE2ICAgfCAgMjIgICB8ICAyMAorICogIDEwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKKyAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCisgKiAgMTEwMCB8ICAgeCAgIHwgICB4ICAgfCAgIHggICB8ICAgeAorICogIDExMDEgfCAgIHggICB8IHggKDIyKXwgICB4ICAgfCB4ICgyMSkKKyAqICAxMTEwIHwgICB4ICAgfCB4ICgxNil8ICAgeCAgIHwgeCAoMjApCisgKiAgMTExMSB8ICAgeCAgIHwgICB4ICAgfCAgIHggICB8ICAgeAorICoKKyAqIFBlbiBzZWxlY3Rpb24gdGFibGUgZm9yIHVGbGFncyA9IEJGX1NPRlQKKyAqCisgKiB1VHlwZSB8ICBMVEkgIHwgIExUTyAgfCAgUkJJICB8ICBSQk8KKyAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCisgKiAgMDAwMCB8ICAgeCAgIHwgICB4ICAgfCAgIHggICB8ICAgeAorICogIDAwMDEgfCAgIHggICB8ICAyMCAgIHwgICB4ICAgfCAgMjEKKyAqICAwMDEwIHwgICB4ICAgfCAgMjEgICB8ICAgeCAgIHwgIDIwCisgKiAgMDAxMSB8ICAgeCAgIHwgICB4ICAgfCAgIHggICB8ICAgeAorICogLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0KKyAqICAwMTAwIHwgICB4ICAgfCAgMjIgICB8ICAgeCAgIHwgIDE2CisgKiAgMDEwMSB8ICAyMiAgIHwgIDIwICAgfCAgMTYgICB8ICAyMQorICogIDAxMTAgfCAgMjIgICB8ICAyMSAgIHwgIDE2ICAgfCAgMjAKKyAqICAwMTExIHwgICB4ICAgfCAgIHggICB8ICAgeCAgIHwgICB4CisgKiAtLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLQorICogIDEwMDAgfCAgIHggICB8ICAxNiAgIHwgICB4ICAgfCAgMjIKKyAqICAxMDAxIHwgIDE2ICAgfCAgMjAgICB8ICAyMiAgIHwgIDIxCisgKiAgMTAxMCB8ICAxNiAgIHwgIDIxICAgfCAgMjIgICB8ICAyMAorICogIDEwMTEgfCAgIHggICB8ICAgeCAgIHwgICB4ICAgfCAgIHgKKyAqIC0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tCisgKiAgMTEwMCB8ICAgeCAgIHwgICB4ICAgfCAgIHggICB8ICAgeAorICogIDExMDEgfCAgIHggICB8IHggKDIwKXwgICB4ICAgfCB4ICgyMSkKKyAqICAxMTEwIHwgICB4ICAgfCB4ICgyMSl8ICAgeCAgIHwgeCAoMjApCisgKiAgMTExMSB8ICAgeCAgIHwgICB4ICAgfCAgIHggICB8ICAgeAorICoKKyAqIHggPSBkb24ndCBjYXJlOyAobikgPSBpcyB3aGF0IHdpbjk1IGFjdHVhbGx5IHVzZXMKKyAqIExUSSA9IGxlZnQgVG9wIElubmVyIGxpbmUKKyAqIExUTyA9IGxlZnQgVG9wIE91dGVyIGxpbmUKKyAqIFJCSSA9IFJpZ2h0IEJvdHRvbSBJbm5lciBsaW5lCisgKiBSQk8gPSBSaWdodCBCb3R0b20gT3V0ZXIgbGluZQorICogMTUgPSBDT0xPUl9CVE5GQUNFCisgKiAxNiA9IENPTE9SX0JUTlNIQURPVworICogMjAgPSBDT0xPUl9CVE5ISUdITElHSFQKKyAqIDIxID0gQ09MT1JfM0RES1NIQURPVworICogMjIgPSBDT0xPUl8zRExJR0hUCisgKi8KKworCitzdGF0aWMgQk9PTDMyIFVJVE9PTFNfRHJhd1JlY3RFZGdlKEhEQzMyIGhkYywgTFBSRUNUMzIgcmMsIFVJTlQzMiB1VHlwZSwgVUlOVDMyIHVGbGFncykKIHsKLSAgSEJSVVNIMzIgZmFjZUJydXNoLCBzaGFkb3dCcnVzaCwgbGlnaHRCcnVzaCwgYmxhY2tCcnVzaCwgZ3JheUJydXNoLCBudWxsQnJ1c2g7Ci0gIEhCUlVTSDMyIGlOQnJ1c2gsIGlTQnJ1c2gsIGlFQnJ1c2gsIGlXQnJ1c2g7Ci0gIEhCUlVTSDMyIG9OQnJ1c2gsIG9TQnJ1c2gsIG9FQnJ1c2gsIG9XQnJ1c2g7Ci0gIEhCUlVTSDMyIG9sZEJydXNoOwotICBSRUNUMzIgcjsKKyAgICBjaGFyIExUSW5uZXJJLCBMVE91dGVySTsKKyAgICBjaGFyIFJCSW5uZXJJLCBSQk91dGVySTsKKyAgICBIUEVOMzIgTFRJbm5lclBlbiwgTFRPdXRlclBlbjsKKyAgICBIUEVOMzIgUkJJbm5lclBlbiwgUkJPdXRlclBlbjsKKyAgICBSRUNUMzIgSW5uZXJSZWN0ID0gKnJjOworICAgIFBPSU5UMzIgU2F2ZVBvaW50OworICAgIEhQRU4zMiBTYXZlUGVuOworICAgIGludCBMQnBlbnBsdXMgPSAwOworICAgIGludCBMVHBlbnBsdXMgPSAwOworICAgIGludCBSVHBlbnBsdXMgPSAwOworICAgIGludCBSQnBlbnBsdXMgPSAwOworICAgIEJPT0wzMiByZXR2YWwgPSAhKCAgICgodVR5cGUgJiBCRFJfSU5ORVIpID09IEJEUl9JTk5FUgorICAgICAgICAgICAgICAgICAgICAgICB8fCAodVR5cGUgJiBCRFJfT1VURVIpID09IEJEUl9PVVRFUikKKyAgICAgICAgICAgICAgICAgICAgICAmJiAhKHVGbGFncyAmIChCRl9GTEFUfEJGX01PTk8pKSApOworICAgICAgICAKKyAgICAvKiBJbml0IHNvbWUgdmFycyAqLworICAgIExUSW5uZXJQZW4gPSBMVE91dGVyUGVuID0gUkJJbm5lclBlbiA9IFJCT3V0ZXJQZW4gPSAoSFBFTjMyKUdldFN0b2NrT2JqZWN0MzIoTlVMTF9QRU4pOworICAgIFNhdmVQZW4gPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGhkYywgTFRJbm5lclBlbik7CiAKLSAgLyogSWYgYm90aCByYXNpZWQgYW5kIHN1bmtlbiBpcyBzcGVjaWZpZWQsIHRoZXkgYW5paGlsYXRlIG9uZSBhbm90aGVyICovCi0gIGlmKCAhKChmbGFncyAmIEJGX01PTk8pIHx8IChmbGFncyAmIEJGX0ZMQVQpKSApewotICAgIGlmKCAoZWRnZSAmIEJEUl9SQUlTRURPVVRFUikgJiYgKGVkZ2UgJiBCRFJfU1VOS0VOT1VURVIpICkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICBpZiggKGVkZ2UgJiBCRFJfUkFJU0VESU5ORVIpICYmIChlZGdlICYgQkRSX1NVTktFTklOTkVSKSApCi0gICAgICByZXR1cm4gRkFMU0U7Ci0gIH0KKyAgICAvKiBEZXRlcm1pbmUgdGhlIGNvbG9ycyBvZiB0aGUgZWRnZXMgKi8KKyAgICBpZih1RmxhZ3MgJiBCRl9NT05PKQorICAgIHsKKyAgICAgICAgTFRJbm5lckkgPSBSQklubmVySSA9IExUUkJJbm5lck1vbm9bdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOworICAgICAgICBMVE91dGVySSA9IFJCT3V0ZXJJID0gTFRSQk91dGVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CisgICAgfQorICAgIGVsc2UgaWYodUZsYWdzICYgQkZfRkxBVCkKKyAgICB7CisgICAgICAgIExUSW5uZXJJID0gUkJJbm5lckkgPSBMVFJCSW5uZXJGbGF0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgTFRPdXRlckkgPSBSQk91dGVySSA9IExUUkJPdXRlckZsYXRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOworICAgIH0KKyAgICBlbHNlIGlmKHVGbGFncyAmIEJGX1NPRlQpCisgICAgeworICAgICAgICBMVElubmVySSA9IExUSW5uZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgTFRPdXRlckkgPSBMVE91dGVyU29mdFt1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV07CisgICAgICAgIFJCSW5uZXJJID0gUkJJbm5lclNvZnRbdVR5cGUgJiAoQkRSX0lOTkVSfEJEUl9PVVRFUildOworICAgICAgICBSQk91dGVySSA9IFJCT3V0ZXJTb2Z0W3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFRJbm5lckkgPSBMVElubmVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgTFRPdXRlckkgPSBMVE91dGVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgUkJJbm5lckkgPSBSQklubmVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICAgICAgUkJPdXRlckkgPSBSQk91dGVyTm9ybWFsW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXTsKKyAgICB9CiAKLSAgZmFjZUJydXNoID0gR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkZBQ0UpOwotICBzaGFkb3dCcnVzaCA9IEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5TSEFET1cpOwotICBsaWdodEJydXNoID0gR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkhJTElHSFQpOwotICBibGFja0JydXNoID0gR2V0U3RvY2tPYmplY3QzMihCTEFDS19CUlVTSCk7Ci0gIGdyYXlCcnVzaCA9IEdldFN0b2NrT2JqZWN0MzIoTFRHUkFZX0JSVVNIKTsKLSAgbnVsbEJydXNoID0gR2V0U3RvY2tPYmplY3QzMihOVUxMX0JSVVNIKTsKLSAgb2xkQnJ1c2ggPSBTZWxlY3RPYmplY3QzMihoZGMsIG51bGxCcnVzaCk7CisgICAgaWYoKHVGbGFncyAmIEJGX0JPVFRPTUxFRlQpID09IEJGX0JPVFRPTUxFRlQpICAgTEJwZW5wbHVzID0gMTsKKyAgICBpZigodUZsYWdzICYgQkZfVE9QUklHSFQpID09IEJGX1RPUFJJR0hUKSAgICAgICBSVHBlbnBsdXMgPSAxOworICAgIGlmKCh1RmxhZ3MgJiBCRl9CT1RUT01SSUdIVCkgPT0gQkZfQk9UVE9NUklHSFQpIFJCcGVucGx1cyA9IDE7CisgICAgaWYoKHVGbGFncyAmIEJGX1RPUExFRlQpID09IEJGX1RPUExFRlQpICAgICAgICAgTFRwZW5wbHVzID0gMTsKIAotICAvKiB0aGlzIGlzIG15IHdvcmtpbmcgcmVjdGFuZ2xlICovCi0gIHIgPSAqcmVjdDsKKyAgICBpZihMVElubmVySSAhPSAtMSkgTFRJbm5lclBlbiA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKChpbnQpTFRJbm5lckkpKTsKKyAgICBpZihMVE91dGVySSAhPSAtMSkgTFRPdXRlclBlbiA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKChpbnQpTFRPdXRlckkpKTsKKyAgICBpZihSQklubmVySSAhPSAtMSkgUkJJbm5lclBlbiA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKChpbnQpUkJJbm5lckkpKTsKKyAgICBpZihSQk91dGVySSAhPSAtMSkgUkJPdXRlclBlbiA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKChpbnQpUkJPdXRlckkpKTsKIAotICBpZihmbGFncyAmIEJGX01PTk8pewotICAgIG9OQnJ1c2ggPSBvU0JydXNoID0gb0VCcnVzaCA9IG9XQnJ1c2ggPSBibGFja0JydXNoOwotICAgIGlOQnJ1c2ggPSBpU0JydXNoID0gaUVCcnVzaCA9IGlXQnJ1c2ggPSBudWxsQnJ1c2g7Ci0gIH1lbHNlIGlmKGZsYWdzICYgQkZfRkxBVCl7Ci0gICAgb05CcnVzaCA9IG9TQnJ1c2ggPSBvRUJydXNoID0gb1dCcnVzaCA9IHNoYWRvd0JydXNoOwotICAgIGlOQnJ1c2ggPSBpU0JydXNoID0gaUVCcnVzaCA9IGlXQnJ1c2ggPSBmYWNlQnJ1c2g7Ci0gIH1lbHNlIHsKLSAgICBpZihmbGFncyAmIEJGX1NPRlQpewotICAgICAgb05CcnVzaCA9IG9XQnJ1c2ggPSAoZWRnZSAmIEJEUl9SQUlTRURPVVRFUikgPyBsaWdodEJydXNoICA6IGJsYWNrQnJ1c2g7Ci0gICAgICBvU0JydXNoID0gb0VCcnVzaCA9IChlZGdlICYgQkRSX1JBSVNFRE9VVEVSKSA/IGJsYWNrQnJ1c2ggIDogbGlnaHRCcnVzaDsKLSAgICAgIGlOQnJ1c2ggPSBpV0JydXNoID0gKGVkZ2UgJiBCRFJfUkFJU0VESU5ORVIpID8gZ3JheUJydXNoICAgOiBzaGFkb3dCcnVzaDsKLSAgICAgIGlTQnJ1c2ggPSBpRUJydXNoID0gKGVkZ2UgJiBCRFJfUkFJU0VESU5ORVIpID8gc2hhZG93QnJ1c2ggOiBncmF5QnJ1c2g7CisgICAgaWYoKHVGbGFncyAmIEJGX01JRERMRSkgJiYgcmV0dmFsKQorICAgIHsKKyAgICAgICAgRmlsbFJlY3QzMihoZGMsICZJbm5lclJlY3QsICh1RmxhZ3MgJiBCRl9NT05PKSA/IEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9XSU5ET1cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlRORkFDRSkpOwogICAgIH0KLSAgICBlbHNlewotICAgICAgb05CcnVzaCA9IG9XQnJ1c2ggPSAoZWRnZSAmIEJEUl9SQUlTRURPVVRFUikgPyBncmF5QnJ1c2ggICA6IHNoYWRvd0JydXNoOwotICAgICAgb1NCcnVzaCA9IG9FQnJ1c2ggPSAoZWRnZSAmIEJEUl9SQUlTRURPVVRFUikgPyBibGFja0JydXNoICA6IGxpZ2h0QnJ1c2g7Ci0gICAgICBpTkJydXNoID0gaVdCcnVzaCA9IChlZGdlICYgQkRSX1JBSVNFRElOTkVSKSA/IGxpZ2h0QnJ1c2ggIDogYmxhY2tCcnVzaDsKLSAgICAgIGlTQnJ1c2ggPSBpRUJydXNoID0gKGVkZ2UgJiBCRFJfUkFJU0VESU5ORVIpID8gc2hhZG93QnJ1c2ggOiBncmF5QnJ1c2g7Ci0gICAgfQotICB9CiAKLSAgLyogaWYgaXQgaGFzIGV4dGVybmFsIGVkZ2UsIGRyYXcgaXQgKi8KLSAgaWYoZWRnZSAmIEJEUl9PVVRFUil7Ci0gICAgaWYoZmxhZ3MgJiBCRl9SSUdIVCl7Ci0gICAgICBTZWxlY3RPYmplY3QzMihoZGMsIG9FQnJ1c2gpOwotICAgICAgUGF0Qmx0MzIoaGRjLCByLnJpZ2h0LTEsIHIudG9wLCAxLCByLmJvdHRvbSAtIHIudG9wLCBQQVRDT1BZKTsKLSAgICAgIHIucmlnaHQtLTsKLSAgICB9Ci0gICAgaWYoZmxhZ3MgJiBCRl9CT1RUT00pewotICAgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBvU0JydXNoKTsKLSAgICAgIFBhdEJsdDMyKGhkYywgci5sZWZ0LCByLmJvdHRvbS0xLCByLnJpZ2h0LXIubGVmdCwgMSwgUEFUQ09QWSk7Ci0gICAgICByLmJvdHRvbS0tOwotICAgIH0KLSAgICBpZihmbGFncyAmIEJGX0xFRlQpewotICAgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBvV0JydXNoKTsKLSAgICAgIFBhdEJsdDMyKGhkYywgci5sZWZ0LCByLnRvcCwgMSwgci5ib3R0b20gLSByLnRvcCwgUEFUQ09QWSk7Ci0gICAgICByLmxlZnQrKzsKLSAgICB9Ci0gICAgaWYoZmxhZ3MgJiBCRl9UT1ApewotICAgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBvTkJydXNoKTsKLSAgICAgIFBhdEJsdDMyKGhkYywgci5sZWZ0LCByLnRvcCwgci5yaWdodC1yLmxlZnQsIDEsIFBBVENPUFkpOwotICAgICAgci50b3ArKzsKLSAgICB9Ci0gIH0KKyAgICBNb3ZlVG9FeDMyKGhkYywgMCwgMCwgJlNhdmVQb2ludCk7CiAKLSAgLyogaWYgaXQgaGFzIGludGVybmFsIGVkZ2UsIGRyYXcgaXQgKi8KLSAgaWYoZWRnZSAmIEJEUl9JTk5FUil7Ci0gICAgaWYoZmxhZ3MgJiBCRl9SSUdIVCl7Ci0gICAgICBTZWxlY3RPYmplY3QzMihoZGMsIGlFQnJ1c2gpOwotICAgICAgUGF0Qmx0MzIoaGRjLCByLnJpZ2h0LTEsIHIudG9wLCAxLCByLmJvdHRvbSAtIHIudG9wLCBQQVRDT1BZKTsKLSAgICAgIHIucmlnaHQtLTsKKyAgICAvKiBEcmF3IHRoZSBvdXRlciBlZGdlICovCisgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBMVE91dGVyUGVuKTsKKyAgICBpZih1RmxhZ3MgJiBCRl9UT1ApCisgICAgeworICAgICAgICBNb3ZlVG9FeDMyKGhkYywgSW5uZXJSZWN0LmxlZnQsIElubmVyUmVjdC50b3AsIE5VTEwpOworICAgICAgICBMaW5lVG8zMihoZGMsIElubmVyUmVjdC5yaWdodCwgSW5uZXJSZWN0LnRvcCk7CiAgICAgfQotICAgIGlmKGZsYWdzICYgQkZfQk9UVE9NKXsKLSAgICAgIFNlbGVjdE9iamVjdDMyKGhkYywgaVNCcnVzaCk7Ci0gICAgICBQYXRCbHQzMihoZGMsIHIubGVmdCwgci5ib3R0b20tMSwgci5yaWdodC1yLmxlZnQsIDEsIFBBVENPUFkpOwotICAgICAgci5ib3R0b20tLTsKKyAgICBpZih1RmxhZ3MgJiBCRl9MRUZUKQorICAgIHsKKyAgICAgICAgTW92ZVRvRXgzMihoZGMsIElubmVyUmVjdC5sZWZ0LCBJbm5lclJlY3QudG9wLCBOVUxMKTsKKyAgICAgICAgTGluZVRvMzIoaGRjLCBJbm5lclJlY3QubGVmdCwgSW5uZXJSZWN0LmJvdHRvbSk7CiAgICAgfQotICAgIGlmKGZsYWdzICYgQkZfTEVGVCl7Ci0gICAgICBTZWxlY3RPYmplY3QzMihoZGMsIGlXQnJ1c2gpOwotICAgICAgUGF0Qmx0MzIoaGRjLCByLmxlZnQsIHIudG9wLCAxLCByLmJvdHRvbSAtIHIudG9wLCBQQVRDT1BZKTsKLSAgICAgIHIubGVmdCsrOworICAgIFNlbGVjdE9iamVjdDMyKGhkYywgUkJPdXRlclBlbik7CisgICAgaWYodUZsYWdzICYgQkZfQk9UVE9NKQorICAgIHsKKyAgICAgICAgTW92ZVRvRXgzMihoZGMsIElubmVyUmVjdC5yaWdodC0xLCBJbm5lclJlY3QuYm90dG9tLTEsIE5VTEwpOworICAgICAgICBMaW5lVG8zMihoZGMsIElubmVyUmVjdC5sZWZ0LTEsIElubmVyUmVjdC5ib3R0b20tMSk7CiAgICAgfQotICAgIGlmKGZsYWdzICYgQkZfVE9QKXsKLSAgICAgIFNlbGVjdE9iamVjdDMyKGhkYywgaU5CcnVzaCk7Ci0gICAgICBQYXRCbHQzMihoZGMsIHIubGVmdCwgci50b3AsIHIucmlnaHQtci5sZWZ0LCAxLCBQQVRDT1BZKTsKLSAgICAgIHIudG9wKys7CisgICAgaWYodUZsYWdzICYgQkZfUklHSFQpCisgICAgeworICAgICAgICBNb3ZlVG9FeDMyKGhkYywgSW5uZXJSZWN0LnJpZ2h0LTEsIElubmVyUmVjdC5ib3R0b20tMSwgTlVMTCk7CisgICAgICAgIExpbmVUbzMyKGhkYywgSW5uZXJSZWN0LnJpZ2h0LTEsIElubmVyUmVjdC50b3AtMSk7CiAgICAgfQotICB9CiAKLSAgLyogaWYgd2UgZ290IHRvIGZpbGwgdGhlIG1pZGRsZSwgdG8gaXQgbm93ICovCi0gIGlmKChmbGFncyAmIEJGX01JRERMRSkgJiYgIShmbGFncyAmIEJGX01PTk8pKQotICAgIEZpbGxSZWN0MzIoaGRjLCAmciwgZmFjZUJydXNoKTsKKyAgICAvKiBEcmF3IHRoZSBpbm5lciBlZGdlICovCisgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBMVElubmVyUGVuKTsKKyAgICBpZih1RmxhZ3MgJiBCRl9UT1ApCisgICAgeworICAgICAgICBNb3ZlVG9FeDMyKGhkYywgSW5uZXJSZWN0LmxlZnQrTFRwZW5wbHVzLCBJbm5lclJlY3QudG9wKzEsIE5VTEwpOworICAgICAgICBMaW5lVG8zMihoZGMsIElubmVyUmVjdC5yaWdodC1SVHBlbnBsdXMsIElubmVyUmVjdC50b3ArMSk7CisgICAgfQorICAgIGlmKHVGbGFncyAmIEJGX0xFRlQpCisgICAgeworICAgICAgICBNb3ZlVG9FeDMyKGhkYywgSW5uZXJSZWN0LmxlZnQrMSwgSW5uZXJSZWN0LnRvcCtMVHBlbnBsdXMsIE5VTEwpOworICAgICAgICBMaW5lVG8zMihoZGMsIElubmVyUmVjdC5sZWZ0KzEsIElubmVyUmVjdC5ib3R0b20tTEJwZW5wbHVzKTsKKyAgICB9CisgICAgU2VsZWN0T2JqZWN0MzIoaGRjLCBSQklubmVyUGVuKTsKKyAgICBpZih1RmxhZ3MgJiBCRl9CT1RUT00pCisgICAgeworICAgICAgICBNb3ZlVG9FeDMyKGhkYywgSW5uZXJSZWN0LnJpZ2h0LTEtUkJwZW5wbHVzLCBJbm5lclJlY3QuYm90dG9tLTIsIE5VTEwpOworICAgICAgICBMaW5lVG8zMihoZGMsIElubmVyUmVjdC5sZWZ0LTErTEJwZW5wbHVzLCBJbm5lclJlY3QuYm90dG9tLTIpOworICAgIH0KKyAgICBpZih1RmxhZ3MgJiBCRl9SSUdIVCkKKyAgICB7CisgICAgICAgIE1vdmVUb0V4MzIoaGRjLCBJbm5lclJlY3QucmlnaHQtMiwgSW5uZXJSZWN0LmJvdHRvbS0xLVJCcGVucGx1cywgTlVMTCk7CisgICAgICAgIExpbmVUbzMyKGhkYywgSW5uZXJSZWN0LnJpZ2h0LTIsIElubmVyUmVjdC50b3AtMStSVHBlbnBsdXMpOworICAgIH0KIAotICAvKiBhZGp1c3QgdGhlIHJlY3RhbmdsZSBpZiByZXF1aXJlZCAqLwotICBpZihmbGFncyAmIEJGX0FESlVTVCkKLSAgICAqcmVjdCA9IHI7CisgICAgLyogQWRqdXN0IHJlY3RhbmdsZSBpZiBhc2tlZCAqLworICAgIGlmKHVGbGFncyAmIEJGX0FESlVTVCkKKyAgICB7CisgICAgICAgIGludCBhZGQgPSAoTFRSQklubmVyTW9ub1t1VHlwZSAmIChCRFJfSU5ORVJ8QkRSX09VVEVSKV0gIT0gLTEgPyAxIDogMCkKKyAgICAgICAgICAgICAgICArIChMVFJCT3V0ZXJNb25vW3VUeXBlICYgKEJEUl9JTk5FUnxCRFJfT1VURVIpXSAhPSAtMSA/IDEgOiAwKTsKKyAgICAgICAgaWYodUZsYWdzICYgQkZfTEVGVCkgICByYy0+bGVmdCAgICs9IGFkZDsKKyAgICAgICAgaWYodUZsYWdzICYgQkZfUklHSFQpICByYy0+cmlnaHQgIC09IGFkZDsKKyAgICAgICAgaWYodUZsYWdzICYgQkZfVE9QKSAgICByYy0+dG9wICAgICs9IGFkZDsKKyAgICAgICAgaWYodUZsYWdzICYgQkZfQk9UVE9NKSByYy0+Ym90dG9tIC09IGFkZDsKKyAgICB9CiAKLSAgLyogUmVzdG9yZSB0aGUgREMgKi8KLSAgU2VsZWN0T2JqZWN0MzIoaGRjLCBvbGRCcnVzaCk7Ci0KLSAgcmV0dXJuIFRSVUU7CisgICAgLyogQ2xlYW51cCAqLworICAgIFNlbGVjdE9iamVjdDMyKGhkYywgU2F2ZVBlbik7CisgICAgaWYoTFRJbm5lckkgIT0gLTEpIERlbGV0ZU9iamVjdDMyKExUSW5uZXJQZW4pOworICAgIGlmKExUT3V0ZXJJICE9IC0xKSBEZWxldGVPYmplY3QzMihMVE91dGVyUGVuKTsKKyAgICBpZihSQklubmVySSAhPSAtMSkgRGVsZXRlT2JqZWN0MzIoUkJJbm5lclBlbik7CisgICAgaWYoUkJPdXRlckkgIT0gLTEpIERlbGV0ZU9iamVjdDMyKFJCT3V0ZXJQZW4pOworICAgIE1vdmVUb0V4MzIoaGRjLCBTYXZlUG9pbnQueCwgU2F2ZVBvaW50LnksIE5VTEwpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIApAQCAtMzA5LDQ0ICs1OTIsODIzIEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJVUlUT09MU19NYWtlU3F1YXJlUmVjdAorICoKKyAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgc3F1YXJlIHJlY3RhbmdsZSBhbmQgcmV0dXJuaW5nIHRoZSB3aWR0aAorICovCitzdGF0aWMgaW50IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QoTFBSRUNUMzIgc3JjLCBMUFJFQ1QzMiBkc3QpCit7CisgICAgaW50IFdpZHRoICA9IHNyYy0+cmlnaHQgLSBzcmMtPmxlZnQ7CisgICAgaW50IEhlaWdodCA9IHNyYy0+Ym90dG9tIC0gc3JjLT50b3A7CisgICAgaW50IFNtYWxsRGlhbSA9IFdpZHRoID4gSGVpZ2h0ID8gSGVpZ2h0IDogV2lkdGg7CisKKyAgICAqZHN0ID0gKnNyYzsKKworICAgIC8qIE1ha2UgaXQgYSBzcXVhcmUgYm94ICovCisgICAgaWYoV2lkdGggPCBIZWlnaHQpICAgICAgLyogU21hbGxEaWFtID09IFdpZHRoICovCisgICAgeworICAgICAgICBkc3QtPnRvcCArPSAoSGVpZ2h0LVdpZHRoKS8yOworICAgICAgICBkc3QtPmJvdHRvbSA9IGRzdC0+dG9wICsgU21hbGxEaWFtOworICAgIH0KKyAgICBlbHNlIGlmKFdpZHRoID4gSGVpZ2h0KSAvKiBTbWFsbERpYW0gPT0gSGVpZ2h0ICovCisgICAgeworICAgICAgICBkc3QtPmxlZnQgKz0gKFdpZHRoLUhlaWdodCkvMjsKKyAgICAgICAgZHN0LT5yaWdodCA9IGRzdC0+bGVmdCArIFNtYWxsRGlhbTsKKyAgICB9CisKKyAgIHJldHVybiBTbWFsbERpYW07Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJVUlUT09MU19ERkNfQnV0dG9uUHVzaAorICoKKyAqIERyYXcgYSBwdXNoIGJ1dHRvbiBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKKyAqCisgKiBEb2VzIGEgcHJldHR5IGdvb2Qgam9iIGluIGVtdWxhdGluZyBNUyBiZWhhdmlvci4gU29tZSBxdWlya3MgYXJlCisgKiBob3dldmVyIHRoZXJlIGJlY2F1c2UgTVMgdXNlcyBhIFRydWVUeXBlIGZvbnQgKE1hcmxldHQpIHRvIGRyYXcKKyAqIHRoZSBidXR0b25zLgorICovCitzdGF0aWMgQk9PTDMyIFVJVE9PTFNfREZDX0J1dHRvblB1c2goSERDMzIgZGMsIExQUkVDVDMyIHIsIFVJTlQzMiB1RmxhZ3MpCit7CisgICAgVUlOVDMyIGVkZ2U7CisgICAgUkVDVDMyIG15ciA9ICpyOworCisgICAgaWYodUZsYWdzICYgKERGQ1NfUFVTSEVEIHwgREZDU19DSEVDS0VEIHwgREZDU19GTEFUKSkKKyAgICAgICAgZWRnZSA9IEVER0VfU1VOS0VOOworICAgIGVsc2UKKyAgICAgICAgZWRnZSA9IEVER0VfUkFJU0VEOworCisgICAgaWYodUZsYWdzICYgREZDU19DSEVDS0VEKQorICAgIHsKKyAgICAgICAgaWYodUZsYWdzICYgREZDU19NT05PKQorICAgICAgICAgICAgVUlUT09MU19EcmF3UmVjdEVkZ2UoZGMsICZteXIsIGVkZ2UsIEJGX01PTk98QkZfUkVDVHxCRl9BREpVU1QpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBVSVRPT0xTX0RyYXdSZWN0RWRnZShkYywgJm15ciwgZWRnZSwgKHVGbGFncyZERkNTX0ZMQVQpfEJGX1JFQ1R8QkZfU09GVHxCRl9BREpVU1QpOworCisgICAgICAgIGlmKEdldFN5c0NvbG9yMzIoQ09MT1JfQlROSElHSExJR0hUKSA9PSBSR0IoMjU1LCAyNTUsIDI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEhCSVRNQVAzMiBoYm0gPSBDcmVhdGVCaXRtYXAzMig4LCA4LCAxLCAxLCB3UGF0dGVybl9BQTU1KTsKKyAgICAgICAgICAgIEhCUlVTSDMyIGhic2F2ZTsKKyAgICAgICAgICAgIEhCUlVTSDMyIGhiID0gQ3JlYXRlUGF0dGVybkJydXNoMzIoaGJtKTsKKworICAgICAgICAgICAgRmlsbFJlY3QzMihkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkZBQ0UpKTsKKyAgICAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgaGIpOworICAgICAgICAgICAgUGF0Qmx0MzIoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQtbXlyLmxlZnQsIG15ci5ib3R0b20tbXlyLnRvcCwgMHgwMEZBMDA4OSk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyKGhiKTsKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyKGhibSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGaWxsUmVjdDMyKGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROSElHSExJR0hUKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYodUZsYWdzICYgREZDU19NT05PKQorICAgICAgICB7CisgICAgICAgICAgICBVSVRPT0xTX0RyYXdSZWN0RWRnZShkYywgJm15ciwgZWRnZSwgQkZfTU9OT3xCRl9SRUNUfEJGX0FESlVTVCk7CisgICAgICAgICAgICBGaWxsUmVjdDMyKGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlRORkFDRSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVUlUT09MU19EcmF3UmVjdEVkZ2UoZGMsIHIsIGVkZ2UsICh1RmxhZ3MmREZDU19GTEFUKSB8IEJGX01JRERMRSB8QkZfU09GVHwgQkZfUkVDVCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBZGp1c3QgcmVjdGFuZ2xlIGlmIGFza2VkICovCisgICAgaWYodUZsYWdzICYgREZDU19BREpVU1RSRUNUKQorICAgIHsKKyAgICAgICAgci0+bGVmdCAgICs9IDI7CisgICAgICAgIHItPnJpZ2h0ICAtPSAyOworICAgICAgICByLT50b3AgICAgKz0gMjsKKyAgICAgICAgci0+Ym90dG9tIC09IDI7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJVUlUT09MU19ERkNfQnV0dG9uQ2hjZWsKKyAqCisgKiBEcmF3IGEgY2hlY2svM3N0YXRlIGJ1dHRvbiBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKKyAqCisgKiBEb2VzIGEgcHJldHR5IGdvb2Qgam9iIGluIGVtdWxhdGluZyBNUyBiZWhhdmlvci4gU29tZSBxdWlya3MgYXJlCisgKiBob3dldmVyIHRoZXJlIGJlY2F1c2UgTVMgdXNlcyBhIFRydWVUeXBlIGZvbnQgKE1hcmxldHQpIHRvIGRyYXcKKyAqIHRoZSBidXR0b25zLgorICovCisjZGVmaW5lIERGQ19DSEVDS1BPSU5UU01BWCAgICAgIDYKKworc3RhdGljIEJPT0wzMiBVSVRPT0xTX0RGQ19CdXR0b25DaGVjayhIREMzMiBkYywgTFBSRUNUMzIgciwgVUlOVDMyIHVGbGFncykKK3sKKyAgICBSRUNUMzIgbXlyOworICAgIGludCBTbWFsbERpYW0gPSBVSVRPT0xTX01ha2VTcXVhcmVSZWN0KHIsICZteXIpOworICAgIGludCBCb3JkZXJTaHJpbmsgPSBTbWFsbERpYW0gLyAxNjsKKworICAgIGlmKEJvcmRlclNocmluayA8IDEpIEJvcmRlclNocmluayA9IDE7CisKKyAgICAvKiBGSVhNRTogVGhlIEZpbGxSZWN0KCkgc2VxdWVuY2UgZG9lc24ndCB3b3JrIGZvciBzaXplcyBsZXNzIHRoYW4gKi8KKyAgICAvKiA0IHBpeGVscyBpbiBkaWFtZXRlci4gTm90IHJlYWxseSBhIHByb2JsZW0gYnV0IGl0IGlzbid0IE0kJ3MgKi8KKyAgICAvKiAxMDAlIGVxdWl2YWxlbnQuICovCisgICAgaWYodUZsYWdzICYgKERGQ1NfRkxBVHxERkNTX01PTk8pKQorICAgIHsKKyAgICAgICAgRmlsbFJlY3QzMihkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX1dJTkRPV0ZSQU1FKSk7CisgICAgICAgIG15ci5sZWZ0ICAgKz0gMiAqIEJvcmRlclNocmluazsKKyAgICAgICAgbXlyLnJpZ2h0ICAtPSAyICogQm9yZGVyU2hyaW5rOworICAgICAgICBteXIudG9wICAgICs9IDIgKiBCb3JkZXJTaHJpbms7CisgICAgICAgIG15ci5ib3R0b20gLT0gMiAqIEJvcmRlclNocmluazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRmlsbFJlY3QzMihkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkhJR0hMSUdIVCkpOworICAgICAgICBteXIucmlnaHQgIC09IEJvcmRlclNocmluazsKKyAgICAgICAgbXlyLmJvdHRvbSAtPSBCb3JkZXJTaHJpbms7CisgICAgICAgIEZpbGxSZWN0MzIoZGMsICZteXIsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5TSEFET1cpKTsKKyAgICAgICAgbXlyLmxlZnQgICArPSBCb3JkZXJTaHJpbms7CisgICAgICAgIG15ci50b3AgICAgKz0gQm9yZGVyU2hyaW5rOworICAgICAgICBGaWxsUmVjdDMyKGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfM0RMSUdIVCkpOworICAgICAgICBteXIucmlnaHQgIC09IEJvcmRlclNocmluazsKKyAgICAgICAgbXlyLmJvdHRvbSAtPSBCb3JkZXJTaHJpbms7CisgICAgICAgIEZpbGxSZWN0MzIoZGMsICZteXIsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl8zRERLU0hBRE9XKSk7CisgICAgICAgIG15ci5sZWZ0ICAgKz0gQm9yZGVyU2hyaW5rOworICAgICAgICBteXIudG9wICAgICs9IEJvcmRlclNocmluazsKKyAgICB9CisKKyAgICBpZih1RmxhZ3MgJiAoREZDU19JTkFDVElWRXxERkNTX1BVU0hFRCkpCisgICAgeworICAgICAgICBGaWxsUmVjdDMyKGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlRORkFDRSkpOworICAgIH0KKyAgICBlbHNlIGlmKHVGbGFncyAmIERGQ1NfQ0hFQ0tFRCkKKyAgICB7CisgICAgICAgIGlmKEdldFN5c0NvbG9yMzIoQ09MT1JfQlROSElHSExJR0hUKSA9PSBSR0IoMjU1LCAyNTUsIDI1NSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEhCSVRNQVAzMiBoYm0gPSBDcmVhdGVCaXRtYXAzMig4LCA4LCAxLCAxLCB3UGF0dGVybl9BQTU1KTsKKyAgICAgICAgICAgIEhCUlVTSDMyIGhic2F2ZTsKKyAgICAgICAgICAgIEhCUlVTSDMyIGhiID0gQ3JlYXRlUGF0dGVybkJydXNoMzIoaGJtKTsKKworICAgICAgICAgICAgRmlsbFJlY3QzMihkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkZBQ0UpKTsKKyAgICAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgaGIpOworICAgICAgICAgICAgUGF0Qmx0MzIoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQtbXlyLmxlZnQsIG15ci5ib3R0b20tbXlyLnRvcCwgMHgwMEZBMDA4OSk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyKGhiKTsKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyKGhibSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBGaWxsUmVjdDMyKGRjLCAmbXlyLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROSElHSExJR0hUKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRmlsbFJlY3QzMihkYywgJm15ciwgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX1dJTkRPVykpOworICAgIH0KKworICAgIGlmKHVGbGFncyAmIERGQ1NfQ0hFQ0tFRCkKKyAgICB7CisgICAgICAgIFBPSU5UMzIgQ2hlY2tQb2ludHNbREZDX0NIRUNLUE9JTlRTTUFYXTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIEhCUlVTSDMyIGhic2F2ZTsKKyAgICAgICAgSFBFTjMyIGhwLCBocHNhdmU7CisKKyAgICAgICAgLyogRklYTUU6IFRoaXMgY29tZXMgdmVyeSBjbG9zZSB0byBNJCdzIGNoZWNrbWFyaywgYnV0IG5vdCAqLworICAgICAgICAvKiBleGFjdGx5Li4uIFdoZW4gc21hbGwgb3IgbGFyZ2UgdGhlcmUgaXMgYSBmZXcgcGl4ZWxzICovCisgICAgICAgIC8qIHNoaWZ0LiBOb3QgYmFkLCBidXQgY291bGQgYmUgYmV0dGVyIDopICovCisgICAgICAgIFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CisgICAgICAgIENoZWNrUG9pbnRzWzBdLnggPSBteXIubGVmdCArIDI1MypTbWFsbERpYW0vMTAwMDsKKyAgICAgICAgQ2hlY2tQb2ludHNbMF0ueSA9IG15ci50b3AgICsgMzQ1KlNtYWxsRGlhbS8xMDAwOworICAgICAgICBDaGVja1BvaW50c1sxXS54ID0gbXlyLmxlZnQgKyA0MDkqU21hbGxEaWFtLzEwMDA7CisgICAgICAgIENoZWNrUG9pbnRzWzFdLnkgPSBDaGVja1BvaW50c1swXS55ICsgKENoZWNrUG9pbnRzWzFdLngtQ2hlY2tQb2ludHNbMF0ueCk7CisgICAgICAgIENoZWNrUG9pbnRzWzJdLnggPSBteXIubGVmdCArIDY5MCpTbWFsbERpYW0vMTAwMDsKKyAgICAgICAgQ2hlY2tQb2ludHNbMl0ueSA9IENoZWNrUG9pbnRzWzFdLnkgLSAoQ2hlY2tQb2ludHNbMl0ueC1DaGVja1BvaW50c1sxXS54KTsKKyAgICAgICAgQ2hlY2tQb2ludHNbM10ueCA9IENoZWNrUG9pbnRzWzJdLng7CisgICAgICAgIENoZWNrUG9pbnRzWzNdLnkgPSBDaGVja1BvaW50c1syXS55ICsgMypTbWFsbERpYW0vMTY7CisgICAgICAgIENoZWNrUG9pbnRzWzRdLnggPSBDaGVja1BvaW50c1sxXS54OworICAgICAgICBDaGVja1BvaW50c1s0XS55ID0gQ2hlY2tQb2ludHNbMV0ueSArIDMqU21hbGxEaWFtLzE2OworICAgICAgICBDaGVja1BvaW50c1s1XS54ID0gQ2hlY2tQb2ludHNbMF0ueDsKKyAgICAgICAgQ2hlY2tQb2ludHNbNV0ueSA9IENoZWNrUG9pbnRzWzBdLnkgKyAzKlNtYWxsRGlhbS8xNjsKKworICAgICAgICBpID0gKHVGbGFncyAmIERGQ1NfSU5BQ1RJVkUpIHx8ICh1RmxhZ3MgJiAweGZmKSA9PSBERkNTX0JVVFRPTjNTVEFURSA/IENPTE9SX0JUTlNIQURPVyA6IENPTE9SX1dJTkRPV1RFWFQ7CisgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKGkpKTsKKyAgICAgICAgaHAgPSBDcmVhdGVQZW4zMihQU19TT0xJRCwgMCwgR2V0U3lzQ29sb3IzMihpKSk7CisgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKKyAgICAgICAgUG9seWdvbjMyKGRjLCBDaGVja1BvaW50cywgREZDX0NIRUNLUE9JTlRTTUFYKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYnNhdmUpOworICAgICAgICBEZWxldGVPYmplY3QzMihocCk7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCVVJVE9PTFNfREZDX0J1dHRvblJhZGlvCisgKgorICogRHJhdyBhIHJhZGlvL3JhZGlvaW1hZ2UvcmFkaW9tYXNrIGJ1dHRvbiBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKKyAqCisgKiBEb2VzIGEgcHJldHR5IGdvb2Qgam9iIGluIGVtdWxhdGluZyBNUyBiZWhhdmlvci4gU29tZSBxdWlya3MgYXJlCisgKiBob3dldmVyIHRoZXJlIGJlY2F1c2UgTVMgdXNlcyBhIFRydWVUeXBlIGZvbnQgKE1hcmxldHQpIHRvIGRyYXcKKyAqIHRoZSBidXR0b25zLgorICovCitzdGF0aWMgQk9PTDMyIFVJVE9PTFNfREZDX0J1dHRvblJhZGlvKEhEQzMyIGRjLCBMUFJFQ1QzMiByLCBVSU5UMzIgdUZsYWdzKQoreworICAgIFJFQ1QzMiBteXI7CisgICAgaW50IGk7CisgICAgaW50IFNtYWxsRGlhbSA9IFVJVE9PTFNfTWFrZVNxdWFyZVJlY3QociwgJm15cik7CisgICAgaW50IEJvcmRlclNocmluayA9IFNtYWxsRGlhbSAvIDE2OworICAgIEhQRU4zMiBocHNhdmUsIGhwOworICAgIEhCUlVTSDMyIGhic2F2ZTsKKyAgICBpbnQgeGUsIHllOworICAgIGludCB4YywgeWM7CisKKyAgICBpZihCb3JkZXJTaHJpbmsgPCAxKSBCb3JkZXJTaHJpbmsgPSAxOworCisgICAgaWYoKHVGbGFncyAmIDB4ZmYpID09IERGQ1NfQlVUVE9OUkFESU9JTUFHRSkKKyAgICB7CisgICAgICAgIEZpbGxSZWN0MzIoZGMsIHIsIChIQlJVU0gzMilHZXRTdG9ja09iamVjdDMyKEJMQUNLX0JSVVNIKSk7CisgICAgfQorCisgICAgeGUgPSBteXIubGVmdDsKKyAgICB5ZSA9IG15ci50b3AgICsgU21hbGxEaWFtIC0gU21hbGxEaWFtLzI7CisKKyAgICB4YyA9IG15ci5sZWZ0ICsgU21hbGxEaWFtIC0gU21hbGxEaWFtLzI7CisgICAgeWMgPSBteXIudG9wICArIFNtYWxsRGlhbSAtIFNtYWxsRGlhbS8yOworCisgICAgLyogRGVmaW5lIGJvdW5kaW5nIGJveCAqLworICAgIGkgPSAxNCpTbWFsbERpYW0vMTY7CisgICAgbXlyLmxlZnQgICA9IHhjIC0gaStpLzI7CisgICAgbXlyLnJpZ2h0ICA9IHhjICsgaS8yOworICAgIG15ci50b3AgICAgPSB5YyAtIGkraS8yOworICAgIG15ci5ib3R0b20gPSB5YyArIGkvMjsKKworICAgIGlmKCh1RmxhZ3MgJiAweGZmKSA9PSBERkNTX0JVVFRPTlJBRElPTUFTSykKKyAgICB7CisgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3RvY2tPYmplY3QzMihCTEFDS19CUlVTSCkpOworICAgICAgICBQaWUzMihkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOworICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYodUZsYWdzICYgKERGQ1NfRkxBVHxERkNTX01PTk8pKQorICAgICAgICB7CisgICAgICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SX1dJTkRPV0ZSQU1FKSk7CisgICAgICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBocCk7CisgICAgICAgICAgICBoYnNhdmUgPSAoSEJSVVNIMzIpU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9XSU5ET1dGUkFNRSkpOworICAgICAgICAgICAgUGllMzIoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQsIG15ci5ib3R0b20sIHhlLCB5ZSwgeGUsIHllKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYnNhdmUpOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7CisgICAgICAgICAgICBEZWxldGVPYmplY3QzMihocCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SX0JUTkhJR0hMSUdIVCkpOworICAgICAgICAgICAgaHBzYXZlID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihkYywgaHApOworICAgICAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROSElHSExJR0hUKSk7CisgICAgICAgICAgICBQaWUzMihkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgbXlyLmxlZnQtMSwgbXlyLmJvdHRvbSwgbXlyLnJpZ2h0LTEsIG15ci50b3ApOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhic2F2ZSk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaHBzYXZlKTsKKyAgICAgICAgICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKKworICAgICAgICAgICAgaHAgPSBDcmVhdGVQZW4zMihQU19TT0xJRCwgMCwgR2V0U3lzQ29sb3IzMihDT0xPUl9CVE5TSEFET1cpKTsKKyAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKKyAgICAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTlNIQURPVykpOworICAgICAgICAgICAgUGllMzIoZGMsIG15ci5sZWZ0LCBteXIudG9wLCBteXIucmlnaHQsIG15ci5ib3R0b20sIG15ci5yaWdodCsxLCBteXIudG9wLCBteXIubGVmdCsxLCBteXIuYm90dG9tKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYnNhdmUpOworICAgICAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7CisgICAgICAgICAgICBEZWxldGVPYmplY3QzMihocCk7CisKKyAgICAgICAgICAgIG15ci5sZWZ0ICAgKz0gQm9yZGVyU2hyaW5rOworICAgICAgICAgICAgbXlyLnJpZ2h0ICAtPSBCb3JkZXJTaHJpbms7CisgICAgICAgICAgICBteXIudG9wICAgICs9IEJvcmRlclNocmluazsKKyAgICAgICAgICAgIG15ci5ib3R0b20gLT0gQm9yZGVyU2hyaW5rOworCisgICAgICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SXzNETElHSFQpKTsKKyAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKKyAgICAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SXzNETElHSFQpKTsKKyAgICAgICAgICAgIFBpZTMyKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCBteXIubGVmdC0xLCBteXIuYm90dG9tLCBteXIucmlnaHQtMSwgbXlyLnRvcCk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBocHNhdmUpOworICAgICAgICAgICAgRGVsZXRlT2JqZWN0MzIoaHApOworCisgICAgICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SXzNEREtTSEFET1cpKTsKKyAgICAgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKKyAgICAgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SXzNEREtTSEFET1cpKTsKKyAgICAgICAgICAgIFBpZTMyKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCBteXIucmlnaHQrMSwgbXlyLnRvcCwgbXlyLmxlZnQrMSwgbXlyLmJvdHRvbSk7CisgICAgICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKKyAgICAgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBocHNhdmUpOworICAgICAgICAgICAgRGVsZXRlT2JqZWN0MzIoaHApOworICAgICAgICB9CisKKyAgICAgICAgaSA9IDEwKlNtYWxsRGlhbS8xNjsKKyAgICAgICAgbXlyLmxlZnQgICA9IHhjIC0gaStpLzI7CisgICAgICAgIG15ci5yaWdodCAgPSB4YyArIGkvMjsKKyAgICAgICAgbXlyLnRvcCAgICA9IHljIC0gaStpLzI7CisgICAgICAgIG15ci5ib3R0b20gPSB5YyArIGkvMjsKKyAgICAgICAgaT0gISh1RmxhZ3MgJiAoREZDU19JTkFDVElWRXxERkNTX1BVU0hFRCkpID8gQ09MT1JfV0lORE9XIDogQ09MT1JfQlRORkFDRTsKKyAgICAgICAgaHAgPSBDcmVhdGVQZW4zMihQU19TT0xJRCwgMCwgR2V0U3lzQ29sb3IzMihpKSk7CisgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKKyAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoaSkpOworICAgICAgICBQaWUzMihkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOworICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7CisgICAgICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKKyAgICB9CisKKyAgICBpZih1RmxhZ3MgJiBERkNTX0NIRUNLRUQpCisgICAgeworICAgICAgICBpID0gNipTbWFsbERpYW0vMTY7CisgICAgICAgIGkgPSBpIDwgMSA/IDEgOiBpOworICAgICAgICBteXIubGVmdCAgID0geGMgLSBpK2kvMjsKKyAgICAgICAgbXlyLnJpZ2h0ICA9IHhjICsgaS8yOworICAgICAgICBteXIudG9wICAgID0geWMgLSBpK2kvMjsKKyAgICAgICAgbXlyLmJvdHRvbSA9IHljICsgaS8yOworCisgICAgICAgIGkgPSB1RmxhZ3MgJiBERkNTX0lOQUNUSVZFID8gQ09MT1JfQlROU0hBRE9XIDogQ09MT1JfV0lORE9XVEVYVDsKKyAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoaSkpOworICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKGkpKTsKKyAgICAgICAgaHBzYXZlID0gKEhQRU4zMilTZWxlY3RPYmplY3QzMihkYywgaHApOworICAgICAgICBQaWUzMihkYywgbXlyLmxlZnQsIG15ci50b3AsIG15ci5yaWdodCwgbXlyLmJvdHRvbSwgeGUsIHllLCB4ZSwgeWUpOworICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaHBzYXZlKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhic2F2ZSk7CisgICAgICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKKyAgICB9CisKKyAgICAvKiBGSVhNRTogTSQgaGFzIGEgcG9seWdvbiBpbiB0aGUgY2VudGVyIGF0IHJlbGF0aXZlIHBvaW50czogKi8KKyAgICAvKiAwLjQ3NiwgMC40NzYgKHRpbWVzIFNtYWxsRGlhbSwgU21hbGxEaWFtKSAqLworICAgIC8qIDAuNDc2LCAwLjUyNSAqLworICAgIC8qIDAuNTAwLCAwLjUwMCAqLworICAgIC8qIDAuNTAwLCAwLjQ5OSAqLworICAgIC8qIHdoZW4gdGhlIGJ1dHRvbiBpcyB1bmNoZWNrZWQuIFRoZSByZWFzb24gZm9yIGl0IGlzIHVua25vd24uIFRoZSAqLworICAgIC8qIGNvbG9yIGlzIENPTE9SX0JUTkhJR0hMSUdIVCwgYWx0aG91Z2ggdGhlIHBvbHlnb24gZ2V0cyBwYWludGVkIGF0ICovCisgICAgLyogbGVhc3QgMyB0aW1lcyAoaXQgbG9va3MgbGlrZSBhIGNsaXAtcmVnaW9uIHdoZW4geW91IHNlZSBpdCBoYXBwZW4pLiAqLworICAgIC8qIEkgZG8gbm90IHJlYWxseSBzZWUgYSByZWFzb24gd2h5IHRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkLiBJZiB5b3UgKi8KKyAgICAvKiBoYXZlIGEgZ29vZCByZWFzb24sIGxldCBtZSBrbm93LiBNYXliZSB0aGlzIGlzIGEgcXVpcmsgaW4gdGhlIE1hcmxldHQgKi8KKyAgICAvKiBmb250LiAqLworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFVJVE9PTFNfRHJhd0ZyYW1lQnV0dG9uCiAgKi8KIHN0YXRpYyBCT09MMzIgVUlUT09MU19EcmF3RnJhbWVCdXR0b24oSERDMzIgaGRjLCBMUFJFQ1QzMiByYywgVUlOVDMyIHVTdGF0ZSkKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCJEcmF3RnJhbWVCdXR0b24oJXgsJXAsJXgpLCBlbXB0eSBzdHViIVxuIiwKLSAgICAgICAgICAgICBoZGMscmMsdVN0YXRlICk7CisgICAgc3dpdGNoKHVTdGF0ZSAmIDB4ZmYpCisgICAgeworICAgIGNhc2UgREZDU19CVVRUT05QVVNIOgorICAgICAgICByZXR1cm4gVUlUT09MU19ERkNfQnV0dG9uUHVzaChoZGMsIHJjLCB1U3RhdGUpOworCisgICAgY2FzZSBERkNTX0JVVFRPTkNIRUNLOgorICAgIGNhc2UgREZDU19CVVRUT04zU1RBVEU6CisgICAgICAgIHJldHVybiBVSVRPT0xTX0RGQ19CdXR0b25DaGVjayhoZGMsIHJjLCB1U3RhdGUpOworCisgICAgY2FzZSBERkNTX0JVVFRPTlJBRElPSU1BR0U6CisgICAgY2FzZSBERkNTX0JVVFRPTlJBRElPTUFTSzoKKyAgICBjYXNlIERGQ1NfQlVUVE9OUkFESU86CisgICAgICAgIHJldHVybiBVSVRPT0xTX0RGQ19CdXR0b25SYWRpbyhoZGMsIHJjLCB1U3RhdGUpOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRuaW1wLCAiVUlUT09MU19EcmF3RnJhbWVCdXR0b246IFJlcG9ydCB0aGlzOiBJbnZhbGlkIGJ1dHRvbiBzdGF0ZTogMHglMDR4XG4iLCB1U3RhdGUpOworICAgIH0KKwogICAgIHJldHVybiBGQUxTRTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgVUlUT09MU19EcmF3RnJhbWVDYXB0aW9uCisgKgorICogRHJhdyBjYXB0aW9uIGJ1dHRvbnMgKHdpbjk1KSwgY29taW5nIGZyb20gRHJhd0ZyYW1lQ29udHJvbCgpCiAgKi8KLXN0YXRpYyBCT09MMzIgVUlUT09MU19EcmF3RnJhbWVDYXB0aW9uKEhEQzMyIGhkYywgTFBSRUNUMzIgcmMsIFVJTlQzMiB1U3RhdGUpCisKK3N0YXRpYyBCT09MMzIgVUlUT09MU19EcmF3RnJhbWVDYXB0aW9uKEhEQzMyIGRjLCBMUFJFQ1QzMiByLCBVSU5UMzIgdUZsYWdzKQogewotICAgIGZwcmludGYoIHN0ZG5pbXAsIkRyYXdGcmFtZUNhcHRpb24oJXgsJXAsJXgpLCBlbXB0eSBzdHViIVxuIiwKLSAgICAgICAgICAgICBoZGMscmMsdVN0YXRlICk7Ci0gICAgcmV0dXJuIEZBTFNFOworICAgIFBPSU5UMzIgTGluZTFbMTBdOworICAgIFBPSU5UMzIgTGluZTJbMTBdOworICAgIGludCBMaW5lMU47CisgICAgaW50IExpbmUyTjsKKyAgICBSRUNUMzIgbXlyOworICAgIGludCBTbWFsbERpYW0gPSBVSVRPT0xTX01ha2VTcXVhcmVSZWN0KHIsICZteXIpLTI7CisgICAgaW50IGk7CisgICAgSEJSVVNIMzIgaGJzYXZlOworICAgIEhQRU4zMiBocHNhdmUsIGhwOworICAgIEhGT05UMzIgaGZzYXZlLCBoZjsKKyAgICBpbnQgeGMgPSAobXlyLmxlZnQrbXlyLnJpZ2h0KS8yOworICAgIGludCB5YyA9IChteXIudG9wK215ci5ib3R0b20pLzI7CisgICAgaW50IGVkZ2UsIG1vdmU7CisgICAgY2hhciBzdHJbMl0gPSAiPyI7CisgICAgVUlOVDMyIGFsaWduc2F2ZTsKKyAgICBpbnQgYmtzYXZlOworICAgIENPTE9SUkVGIGNscnNhdmU7CisgICAgU0laRTMyIHNpemU7CisKKyAgICBVSVRPT0xTX0RGQ19CdXR0b25QdXNoKGRjLCByLCB1RmxhZ3MgJiAweGZmMDApOworCisgICAgc3dpdGNoKHVGbGFncyAmIDB4ZmYpCisgICAgeworICAgIGNhc2UgREZDU19DQVBUSU9OQ0xPU0U6CisgICAgICAgIGVkZ2UgPSAzMjgqU21hbGxEaWFtLzEwMDA7CisgICAgICAgIG1vdmUgPSA5NSpTbWFsbERpYW0vMTAwMDsKKyAgICAgICAgTGluZTFbMF0ueCA9IExpbmUyWzBdLnggPSBMaW5lMVsxXS54ID0gTGluZTJbMV0ueCA9IHhjIC0gZWRnZTsKKyAgICAgICAgTGluZTFbMl0ueSA9IExpbmUyWzVdLnkgPSBMaW5lMVsxXS55ID0gTGluZTJbNF0ueSA9IHljIC0gZWRnZTsKKyAgICAgICAgTGluZTFbM10ueCA9IExpbmUyWzNdLnggPSBMaW5lMVs0XS54ID0gTGluZTJbNF0ueCA9IHhjICsgZWRnZTsKKyAgICAgICAgTGluZTFbNV0ueSA9IExpbmUyWzJdLnkgPSBMaW5lMVs0XS55ID0gTGluZTJbMV0ueSA9IHljICsgZWRnZTsKKyAgICAgICAgTGluZTFbMl0ueCA9IExpbmUyWzJdLnggPSBMaW5lMVsxXS54ICsgbW92ZTsKKyAgICAgICAgTGluZTFbMF0ueSA9IExpbmUyWzNdLnkgPSBMaW5lMVsxXS55ICsgbW92ZTsKKyAgICAgICAgTGluZTFbNV0ueCA9IExpbmUyWzVdLnggPSBMaW5lMVs0XS54IC0gbW92ZTsKKyAgICAgICAgTGluZTFbM10ueSA9IExpbmUyWzBdLnkgPSBMaW5lMVs0XS55IC0gbW92ZTsKKyAgICAgICAgTGluZTFOID0gNjsKKyAgICAgICAgTGluZTJOID0gNjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERGQ1NfQ0FQVElPTkhFTFA6CisgICAgICAgIC8qIFRoaXMgb25lIGJyZWFrcyB0aGUgZmxvdyAqLworICAgICAgICAvKiBGSVhNRTogV2UgbmVlZCB0aGUgTWFybGV0dCBmb250IGluIG9yZGVyIHRvIGdldCB0aGlzIHJpZ2h0LiAqLworCisgICAgICAgIGhmID0gQ3JlYXRlRm9udDMyQSgtU21hbGxEaWFtLCAwLCAwLCAwLCBGV19OT1JNQUwsIEZBTFNFLCBGQUxTRSwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICBBTlNJX0NIQVJTRVQsIE9VVF9ERUZBVUxUX1BSRUNJUywgQ0xJUF9ERUZBVUxUX1BSRUNJUywKKyAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUVVBTElUWSwgRklYRURfUElUQ0h8RkZfRE9OVENBUkUsICJTeXN0ZW0iKTsKKyAgICAgICAgYWxpZ25zYXZlID0gU2V0VGV4dEFsaWduMzIoZGMsIFRBX1RPUHxUQV9MRUZUKTsKKyAgICAgICAgYmtzYXZlID0gU2V0QmtNb2RlMzIoZGMsIFRSQU5TUEFSRU5UKTsKKyAgICAgICAgY2xyc2F2ZSA9IEdldFRleHRDb2xvcjMyKGRjKTsKKyAgICAgICAgaGZzYXZlID0gKEhGT05UMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhmKTsKKyAgICAgICAgR2V0VGV4dEV4dGVudFBvaW50MzJBKGRjLCBzdHIsIDEsICZzaXplKTsKKworICAgICAgICBpZih1RmxhZ3MgJiBERkNTX0lOQUNUSVZFKQorICAgICAgICB7CisgICAgICAgICAgICBTZXRUZXh0Q29sb3IzMihkYywgR2V0U3lzQ29sb3IzMihDT0xPUl9CVE5ISUdITElHSFQpKTsKKyAgICAgICAgICAgIFRleHRPdXQzMkEoZGMsIHhjLXNpemUuY3gvMisxLCB5Yy1zaXplLmN5LzIrMSwgc3RyLCAxKTsKKyAgICAgICAgfQorICAgICAgICBTZXRUZXh0Q29sb3IzMihkYywgR2V0U3lzQ29sb3IzMih1RmxhZ3MgJiBERkNTX0lOQUNUSVZFID8gQ09MT1JfQlROU0hBRE9XIDogQ09MT1JfQlROVEVYVCkpOworICAgICAgICBUZXh0T3V0MzJBKGRjLCB4Yy1zaXplLmN4LzIsIHljLXNpemUuY3kvMiwgc3RyLCAxKTsKKworICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGZzYXZlKTsKKyAgICAgICAgU2V0VGV4dENvbG9yMzIoZGMsIGNscnNhdmUpOworICAgICAgICBTZXRCa01vZGUzMihkYywgYmtzYXZlKTsKKyAgICAgICAgU2V0VGV4dEFsaWduMzIoZGMsIGFsaWduc2F2ZSk7CisgICAgICAgIERlbGV0ZU9iamVjdDMyKGhmKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjYXNlIERGQ1NfQ0FQVElPTk1JTjoKKyAgICAgICAgTGluZTFbMF0ueCA9IExpbmUxWzNdLnggPSBteXIubGVmdCAgICsgIDk2KlNtYWxsRGlhbS83NTArMjsKKyAgICAgICAgTGluZTFbMV0ueCA9IExpbmUxWzJdLnggPSBMaW5lMVswXS54ICsgMzcyKlNtYWxsRGlhbS83NTA7CisgICAgICAgIExpbmUxWzBdLnkgPSBMaW5lMVsxXS55ID0gbXlyLnRvcCAgICArIDU2MypTbWFsbERpYW0vNzUwKzE7CisgICAgICAgIExpbmUxWzJdLnkgPSBMaW5lMVszXS55ID0gTGluZTFbMF0ueSArICA5MipTbWFsbERpYW0vNzUwOworICAgICAgICBMaW5lMU4gPSA0OworICAgICAgICBMaW5lMk4gPSAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgREZDU19DQVBUSU9OTUFYOgorICAgICAgICBlZGdlID0gNDcqU21hbGxEaWFtLzc1MDsKKyAgICAgICAgTGluZTFbMF0ueCA9IExpbmUxWzVdLnggPSBteXIubGVmdCArICA1NypTbWFsbERpYW0vNzUwKzM7CisgICAgICAgIExpbmUxWzBdLnkgPSBMaW5lMVsxXS55ID0gbXlyLnRvcCAgKyAxNDMqU21hbGxEaWFtLzc1MCsxOworICAgICAgICBMaW5lMVsxXS54ID0gTGluZTFbMl0ueCA9IExpbmUxWzBdLnggKyA1NjIqU21hbGxEaWFtLzc1MDsKKyAgICAgICAgTGluZTFbNV0ueSA9IExpbmUxWzRdLnkgPSBMaW5lMVswXS55ICsgIDkzKlNtYWxsRGlhbS83NTA7CisgICAgICAgIExpbmUxWzJdLnkgPSBMaW5lMVszXS55ID0gTGluZTFbMF0ueSArIDUxMypTbWFsbERpYW0vNzUwOworICAgICAgICBMaW5lMVszXS54ID0gTGluZTFbNF0ueCA9IExpbmUxWzFdLnggLSAgZWRnZTsKKworICAgICAgICBMaW5lMlswXS54ID0gTGluZTJbNV0ueCA9IExpbmUxWzBdLng7CisgICAgICAgIExpbmUyWzNdLnggPSBMaW5lMls0XS54ID0gTGluZTFbMV0ueDsKKyAgICAgICAgTGluZTJbMV0ueCA9IExpbmUyWzJdLnggPSBMaW5lMVswXS54ICsgZWRnZTsKKyAgICAgICAgTGluZTJbMF0ueSA9IExpbmUyWzFdLnkgPSBMaW5lMVswXS55OworICAgICAgICBMaW5lMls0XS55ID0gTGluZTJbNV0ueSA9IExpbmUxWzJdLnk7CisgICAgICAgIExpbmUyWzJdLnkgPSBMaW5lMlszXS55ID0gTGluZTFbMl0ueSAtIGVkZ2U7CisgICAgICAgIExpbmUxTiA9IDY7CisgICAgICAgIExpbmUyTiA9IDY7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBERkNTX0NBUFRJT05SRVNUT1JFOgorICAgICAgICAvKiBGSVhNRTogdGhpcyBvbmUgbG9va3MgYmFkIGF0IHNtYWxsIHNpemVzIDwgMTV4MTUgOiggKi8KKyAgICAgICAgZWRnZSA9IDQ3KlNtYWxsRGlhbS83NTA7CisgICAgICAgIG1vdmUgPSA0MjAqU21hbGxEaWFtLzc1MDsKKyAgICAgICAgTGluZTFbMF0ueCA9IExpbmUxWzldLnggPSBteXIubGVmdCArIDE5OCpTbWFsbERpYW0vNzUwKzI7CisgICAgICAgIExpbmUxWzBdLnkgPSBMaW5lMVsxXS55ID0gbXlyLnRvcCAgKyAxNjkqU21hbGxEaWFtLzc1MCsxOworICAgICAgICBMaW5lMVs2XS55ID0gTGluZTFbN10ueSA9IExpbmUxWzBdLnkgKyA5MypTbWFsbERpYW0vNzUwOworICAgICAgICBMaW5lMVs3XS54ID0gTGluZTFbOF0ueCA9IExpbmUxWzBdLnggKyBlZGdlOworICAgICAgICBMaW5lMVsxXS54ID0gTGluZTFbMl0ueCA9IExpbmUxWzBdLnggKyBtb3ZlOworICAgICAgICBMaW5lMVs1XS54ID0gTGluZTFbNl0ueCA9IExpbmUxWzFdLnggLSBlZGdlOworICAgICAgICBMaW5lMVs5XS55ID0gTGluZTFbOF0ueSA9IExpbmUxWzBdLnkgKyAxODcqU21hbGxEaWFtLzc1MDsKKyAgICAgICAgTGluZTFbMl0ueSA9IExpbmUxWzNdLnkgPSBMaW5lMVswXS55ICsgMzI3KlNtYWxsRGlhbS83NTA7CisgICAgICAgIExpbmUxWzRdLnkgPSBMaW5lMVs1XS55ID0gTGluZTFbMl0ueSAtIGVkZ2U7CisgICAgICAgIExpbmUxWzNdLnggPSBMaW5lMVs0XS54ID0gTGluZTFbMl0ueCAtIDE0MCpTbWFsbERpYW0vNzUwOworCisgICAgICAgIExpbmUyWzFdLnggPSBMaW5lMlsyXS54ID0gTGluZTFbM10ueDsKKyAgICAgICAgTGluZTJbN10ueCA9IExpbmUyWzhdLnggPSBMaW5lMlsxXS54IC0gZWRnZTsKKyAgICAgICAgTGluZTJbMF0ueCA9IExpbmUyWzldLnggPSBMaW5lMlszXS54ID0gTGluZTJbNF0ueCA9IExpbmUyWzFdLnggLSBtb3ZlOworICAgICAgICBMaW5lMls1XS54ID0gTGluZTJbNl0ueCA9IExpbmUyWzBdLnggKyBlZGdlOworICAgICAgICBMaW5lMlswXS55ID0gTGluZTJbMV0ueSA9IExpbmUxWzldLnk7CisgICAgICAgIExpbmUyWzRdLnkgPSBMaW5lMls1XS55ID0gTGluZTJbOF0ueSA9IExpbmUyWzldLnkgPSBMaW5lMlswXS55ICsgOTMqU21hbGxEaWFtLzc1MDsKKyAgICAgICAgTGluZTJbMl0ueSA9IExpbmUyWzNdLnkgPSBMaW5lMlswXS55ICsgMzI3KlNtYWxsRGlhbS83NTA7CisgICAgICAgIExpbmUyWzZdLnkgPSBMaW5lMls3XS55ID0gTGluZTJbMl0ueSAtIGVkZ2U7CisgICAgICAgIExpbmUxTiA9IDEwOworICAgICAgICBMaW5lMk4gPSAxMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsICJVSVRPT0xTX0RyYXdGcmFtZUNhcHRpb246IFJlcG9ydCB0aGlzOiBJbnZhbGlkIGNhcHRpb247IGZsYWdzOiAweCUwNHhcbiIsIHVGbGFncyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvKiBIZXJlIHRoZSBkcmF3aW5nIHRha2VzIHBsYWNlICovCisgICAgaWYodUZsYWdzICYgREZDU19JTkFDVElWRSkKKyAgICB7CisgICAgICAgIC8qIElmIHdlIGhhdmUgYW4gaW5hY3RpdmUgYnV0dG9uLCB0aGVuIHlvdSBzZWUgYSBzaGFkb3cgKi8KKyAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROSElHSExJR0hUKSk7CisgICAgICAgIGhwID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfQlROSElHSExJR0hUKSk7CisgICAgICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKKyAgICAgICAgUG9seWdvbjMyKGRjLCBMaW5lMSwgTGluZTFOKTsKKyAgICAgICAgaWYoTGluZTJOID4gMCkKKyAgICAgICAgICAgIFBvbHlnb24zMihkYywgTGluZTIsIExpbmUyTik7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBocHNhdmUpOworICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIoaHApOworICAgIH0KKworICAgIC8qIENvcnJlY3QgZm9yIHRoZSBzaGFkb3cgc2hpZnQgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBMaW5lMU47IGkrKykKKyAgICB7CisgICAgICAgIExpbmUxW2ldLngtLTsKKyAgICAgICAgTGluZTFbaV0ueS0tOworICAgIH0KKyAgICBmb3IoaSA9IDA7IGkgPCBMaW5lMk47IGkrKykKKyAgICB7CisgICAgICAgIExpbmUyW2ldLngtLTsKKyAgICAgICAgTGluZTJbaV0ueS0tOworICAgIH0KKworICAgIC8qIE1ha2UgdGhlIGZpbmFsIHBpY3R1cmUgKi8KKyAgICBpZih1RmxhZ3MgJiBERkNTX0lOQUNUSVZFKQorICAgIHsKKyAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROU0hBRE9XKSk7CisgICAgICAgIGhwID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfQlROU0hBRE9XKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTlRFWFQpKTsKKyAgICAgICAgaHAgPSBDcmVhdGVQZW4zMihQU19TT0xJRCwgMCwgR2V0U3lzQ29sb3IzMihDT0xPUl9CVE5URVhUKSk7CisgICAgfQorICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKKyAgICBQb2x5Z29uMzIoZGMsIExpbmUxLCBMaW5lMU4pOworICAgIGlmKExpbmUyTiA+IDApCisgICAgICAgIFBvbHlnb24zMihkYywgTGluZTIsIExpbmUyTik7CisgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7CisgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhic2F2ZSk7CisgICAgRGVsZXRlT2JqZWN0MzIoaHApOworCisgICAgcmV0dXJuIFRSVUU7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFVJVE9PTFNfRHJhd0ZyYW1lTWVudQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIFVJVE9PTFNfRHJhd0ZyYW1lU2Nyb2xsCisgKgorICogRHJhdyBhIHNjcm9sbC1iYXIgY29udHJvbCBjb21pbmcgZnJvbSBEcmF3RnJhbWVDb250cm9sKCkKICAqLwotc3RhdGljIEJPT0wzMiBVSVRPT0xTX0RyYXdGcmFtZU1lbnUoSERDMzIgaGRjLCBMUFJFQ1QzMiByYywgVUlOVDMyIHVTdGF0ZSkKK3N0YXRpYyBCT09MMzIgVUlUT09MU19EcmF3RnJhbWVTY3JvbGwoSERDMzIgZGMsIExQUkVDVDMyIHIsIFVJTlQzMiB1RmxhZ3MpCiB7Ci0gICAgZnByaW50Ziggc3RkbmltcCwiRHJhd0ZyYW1lTWVudTMyKCV4LCVwLCV4KSwgZW1wdHkgc3R1YiFcbiIsCi0gICAgICAgICAgICAgaGRjLHJjLHVTdGF0ZSApOwotICAgIHJldHVybiBGQUxTRTsKKyAgICBQT0lOVDMyIExpbmVbNF07CisgICAgUkVDVDMyIG15cjsKKyAgICBpbnQgU21hbGxEaWFtID0gVUlUT09MU19NYWtlU3F1YXJlUmVjdChyLCAmbXlyKSAtIDI7CisgICAgaW50IGk7CisgICAgSEJSVVNIMzIgaGJzYXZlLCBoYiwgaGIyOworICAgIEhQRU4zMiBocHNhdmUsIGhwLCBocDI7CisgICAgaW50IHRyaSA9IDMxMCpTbWFsbERpYW0vMTAwMDsKKyAgICBpbnQgZDQ2LCBkOTM7CisKKyAgICBzd2l0Y2godUZsYWdzICYgMHhmZikKKyAgICB7CisgICAgY2FzZSBERkNTX1NDUk9MTENPTUJPQk9YOgorICAgIGNhc2UgREZDU19TQ1JPTExET1dOOgorICAgICAgICBMaW5lWzJdLnggPSBteXIubGVmdCArIDQ3MCpTbWFsbERpYW0vMTAwMCArIDI7CisgICAgICAgIExpbmVbMl0ueSA9IG15ci50b3AgICsgNjg3KlNtYWxsRGlhbS8xMDAwICsgMTsKKyAgICAgICAgTGluZVswXS54ID0gTGluZVsyXS54IC0gdHJpOworICAgICAgICBMaW5lWzFdLnggPSBMaW5lWzJdLnggKyB0cmk7CisgICAgICAgIExpbmVbMF0ueSA9IExpbmVbMV0ueSA9IExpbmVbMl0ueSAtIHRyaTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERGQ1NfU0NST0xMVVA6CisgICAgICAgIExpbmVbMl0ueCA9IG15ci5sZWZ0ICsgNDcwKlNtYWxsRGlhbS8xMDAwICsgMjsKKyAgICAgICAgTGluZVsyXS55ID0gbXlyLnRvcCAgKyAzMTMqU21hbGxEaWFtLzEwMDAgKyAxOworICAgICAgICBMaW5lWzBdLnggPSBMaW5lWzJdLnggLSB0cmk7CisgICAgICAgIExpbmVbMV0ueCA9IExpbmVbMl0ueCArIHRyaTsKKyAgICAgICAgTGluZVswXS55ID0gTGluZVsxXS55ID0gTGluZVsyXS55ICsgdHJpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgREZDU19TQ1JPTExMRUZUOgorICAgICAgICBMaW5lWzJdLnggPSBteXIubGVmdCArIDMxMypTbWFsbERpYW0vMTAwMCArIDE7CisgICAgICAgIExpbmVbMl0ueSA9IG15ci50b3AgICsgNDcwKlNtYWxsRGlhbS8xMDAwICsgMjsKKyAgICAgICAgTGluZVswXS55ID0gTGluZVsyXS55IC0gdHJpOworICAgICAgICBMaW5lWzFdLnkgPSBMaW5lWzJdLnkgKyB0cmk7CisgICAgICAgIExpbmVbMF0ueCA9IExpbmVbMV0ueCA9IExpbmVbMl0ueCArIHRyaTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIERGQ1NfU0NST0xMUklHSFQ6CisgICAgICAgIExpbmVbMl0ueCA9IG15ci5sZWZ0ICsgNjg3KlNtYWxsRGlhbS8xMDAwICsgMTsKKyAgICAgICAgTGluZVsyXS55ID0gbXlyLnRvcCAgKyA0NzAqU21hbGxEaWFtLzEwMDAgKyAyOworICAgICAgICBMaW5lWzBdLnkgPSBMaW5lWzJdLnkgLSB0cmk7CisgICAgICAgIExpbmVbMV0ueSA9IExpbmVbMl0ueSArIHRyaTsKKyAgICAgICAgTGluZVswXS54ID0gTGluZVsxXS54ID0gTGluZVsyXS54IC0gdHJpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgREZDU19TQ1JPTExTSVpFR1JJUDoKKyAgICAgICAgLyogVGhpcyBvbmUgYnJlYWtzIHRoZSBmbG93Li4uICovCisgICAgICAgIFVJVE9PTFNfRHJhd1JlY3RFZGdlKGRjLCByLCBFREdFX0JVTVAsIEJGX01JRERMRSB8ICgodUZsYWdzJihERkNTX01PTk98REZDU19GTEFUKSkgPyBCRl9NT05PIDogMCkpOworICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTdG9ja09iamVjdDMyKE5VTExfUEVOKSk7CisgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3RvY2tPYmplY3QzMihOVUxMX0JSVVNIKSk7CisgICAgICAgIGlmKHVGbGFncyAmIChERkNTX01PTk98REZDU19GTEFUKSkKKyAgICAgICAgeworICAgICAgICAgICAgaHAgPSBocDIgPSBDcmVhdGVQZW4zMihQU19TT0xJRCwgMCwgR2V0U3lzQ29sb3IzMihDT0xPUl9XSU5ET1dGUkFNRSkpOworICAgICAgICAgICAgaGIgPSBoYjIgPSBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfV0lORE9XRlJBTUUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaHAgID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfQlROSElHSExJR0hUKSk7CisgICAgICAgICAgICBocDIgPSBDcmVhdGVQZW4zMihQU19TT0xJRCwgMCwgR2V0U3lzQ29sb3IzMihDT0xPUl9CVE5TSEFET1cpKTsKKyAgICAgICAgICAgIGhiICA9IEdldFN5c0NvbG9yQnJ1c2gzMihDT0xPUl9CVE5ISUdITElHSFQpOworICAgICAgICAgICAgaGIyID0gR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTlNIQURPVyk7CisgICAgICAgIH0KKyAgICAgICAgTGluZVswXS54ID0gTGluZVsxXS54ID0gci0+cmlnaHQtMTsKKyAgICAgICAgTGluZVsyXS55ID0gTGluZVszXS55ID0gci0+Ym90dG9tLTE7CisgICAgICAgIGQ0NiA9IDQ2KlNtYWxsRGlhbS83NTA7CisgICAgICAgIGQ5MyA9IDkzKlNtYWxsRGlhbS83NTA7CisKKyAgICAgICAgaSA9IDU4NipTbWFsbERpYW0vNzUwOworICAgICAgICBMaW5lWzBdLnkgPSByLT5ib3R0b20gLSBpIC0gMTsKKyAgICAgICAgTGluZVszXS54ID0gci0+cmlnaHQgLSBpIC0gMTsKKyAgICAgICAgTGluZVsxXS55ID0gTGluZVswXS55ICsgZDQ2OworICAgICAgICBMaW5lWzJdLnggPSBMaW5lWzNdLnggKyBkNDY7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYik7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBocCk7CisgICAgICAgIFBvbHlnb24zMihkYywgTGluZSwgNCk7CisKKyAgICAgICAgTGluZVsxXS55Kys7IExpbmVbMl0ueCsrOworICAgICAgICBMaW5lWzBdLnkgPSBMaW5lWzFdLnkgKyBkOTM7CisgICAgICAgIExpbmVbM10ueCA9IExpbmVbMl0ueCArIGQ5MzsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhiMik7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBocDIpOworICAgICAgICBQb2x5Z29uMzIoZGMsIExpbmUsIDQpOworCisgICAgICAgIGkgPSAzOTgqU21hbGxEaWFtLzc1MDsKKyAgICAgICAgTGluZVswXS55ID0gci0+Ym90dG9tIC0gaSAtIDE7CisgICAgICAgIExpbmVbM10ueCA9IHItPnJpZ2h0IC0gaSAtIDE7CisgICAgICAgIExpbmVbMV0ueSA9IExpbmVbMF0ueSArIGQ0NjsKKyAgICAgICAgTGluZVsyXS54ID0gTGluZVszXS54ICsgZDQ2OworICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGIpOworICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaHApOworICAgICAgICBQb2x5Z29uMzIoZGMsIExpbmUsIDQpOworCisgICAgICAgIExpbmVbMV0ueSsrOyBMaW5lWzJdLngrKzsKKyAgICAgICAgTGluZVswXS55ID0gTGluZVsxXS55ICsgZDkzOworICAgICAgICBMaW5lWzNdLnggPSBMaW5lWzJdLnggKyBkOTM7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYjIpOworICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaHAyKTsKKyAgICAgICAgUG9seWdvbjMyKGRjLCBMaW5lLCA0KTsKKworICAgICAgICBpID0gMjEwKlNtYWxsRGlhbS83NTA7CisgICAgICAgIExpbmVbMF0ueSA9IHItPmJvdHRvbSAtIGkgLSAxOworICAgICAgICBMaW5lWzNdLnggPSByLT5yaWdodCAtIGkgLSAxOworICAgICAgICBMaW5lWzFdLnkgPSBMaW5lWzBdLnkgKyBkNDY7CisgICAgICAgIExpbmVbMl0ueCA9IExpbmVbM10ueCArIGQ0NjsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhiKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKKyAgICAgICAgUG9seWdvbjMyKGRjLCBMaW5lLCA0KTsKKworICAgICAgICBMaW5lWzFdLnkrKzsgTGluZVsyXS54Kys7CisgICAgICAgIExpbmVbMF0ueSA9IExpbmVbMV0ueSArIGQ5MzsKKyAgICAgICAgTGluZVszXS54ID0gTGluZVsyXS54ICsgZDkzOworICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGIyKTsKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwMik7CisgICAgICAgIFBvbHlnb24zMihkYywgTGluZSwgNCk7CisKKyAgICAgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYnNhdmUpOworICAgICAgICBEZWxldGVPYmplY3QzMihocCk7CisgICAgICAgIERlbGV0ZU9iamVjdDMyKGhwMik7CisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRuaW1wLCAiVUlUT09MU19EcmF3RnJhbWVTY3JvbGw6IFJlcG9ydCB0aGlzOiBJbnZhbGlkIHNjcm9sbDsgZmxhZ3M6IDB4JTA0eFxuIiwgdUZsYWdzKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8qIEhlcmUgZG8gdGhlIHJlYWwgc2Nyb2xsLWJhciBjb250cm9scyBlbmQgdXAgKi8KKyAgICBVSVRPT0xTX0RGQ19CdXR0b25QdXNoKGRjLCByLCB1RmxhZ3MgJiAweGZmMDApOworCisgICAgaWYodUZsYWdzICYgREZDU19JTkFDVElWRSkKKyAgICB7CisgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTkhJR0hMSUdIVCkpOworICAgICAgICBocCA9IENyZWF0ZVBlbjMyKFBTX1NPTElELCAwLCBHZXRTeXNDb2xvcjMyKENPTE9SX0JUTkhJR0hMSUdIVCkpOworICAgICAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBocCk7CisgICAgICAgIFBvbHlnb24zMihkYywgTGluZSwgMyk7CisgICAgICAgIFNlbGVjdE9iamVjdDMyKGRjLCBocHNhdmUpOworICAgICAgICBTZWxlY3RPYmplY3QzMihkYywgaGJzYXZlKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0MzIoaHApOworICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IDM7IGkrKykKKyAgICB7CisgICAgICAgIExpbmVbaV0ueC0tOworICAgICAgICBMaW5lW2ldLnktLTsKKyAgICB9CisKKyAgICBpZih1RmxhZ3MgJiBERkNTX0lOQUNUSVZFKQorICAgIHsKKyAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTeXNDb2xvckJydXNoMzIoQ09MT1JfQlROU0hBRE9XKSk7CisgICAgICAgIGhwID0gQ3JlYXRlUGVuMzIoUFNfU09MSUQsIDAsIEdldFN5c0NvbG9yMzIoQ09MT1JfQlROU0hBRE9XKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhic2F2ZSA9IChIQlJVU0gzMilTZWxlY3RPYmplY3QzMihkYywgR2V0U3lzQ29sb3JCcnVzaDMyKENPTE9SX0JUTlRFWFQpKTsKKyAgICAgICAgaHAgPSBDcmVhdGVQZW4zMihQU19TT0xJRCwgMCwgR2V0U3lzQ29sb3IzMihDT0xPUl9CVE5URVhUKSk7CisgICAgfQorICAgIGhwc2F2ZSA9IChIUEVOMzIpU2VsZWN0T2JqZWN0MzIoZGMsIGhwKTsKKyAgICBQb2x5Z29uMzIoZGMsIExpbmUsIDMpOworICAgIFNlbGVjdE9iamVjdDMyKGRjLCBocHNhdmUpOworICAgIFNlbGVjdE9iamVjdDMyKGRjLCBoYnNhdmUpOworICAgIERlbGV0ZU9iamVjdDMyKGhwKTsKKworICAgIHJldHVybiBUUlVFOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBVSVRPT0xTX0RyYXdGcmFtZVNjcm9sbAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICBVSVRPT0xTX0RyYXdGcmFtZU1lbnUKKyAqCisgKiBEcmF3IGEgbWVudSBjb250cm9sIGNvbWluZyBmcm9tIERyYXdGcmFtZUNvbnRyb2woKQogICovCi1zdGF0aWMgQk9PTDMyIFVJVE9PTFNfRHJhd0ZyYW1lU2Nyb2xsKEhEQzMyIGhkYywgTFBSRUNUMzIgcmMsIFVJTlQzMiB1U3RhdGUpCitzdGF0aWMgQk9PTDMyIFVJVE9PTFNfRHJhd0ZyYW1lTWVudShIREMzMiBkYywgTFBSRUNUMzIgciwgVUlOVDMyIHVGbGFncykKIHsKLSAgICBmcHJpbnRmKCBzdGRuaW1wLCJEcmF3RnJhbWVTY3JvbGwzMigleCwlcCwleCksIGVtcHR5IHN0dWIhXG4iLAotICAgICAgICAgICAgIGhkYyxyYyx1U3RhdGUgKTsKLSAgICByZXR1cm4gRkFMU0U7CisgICAgUE9JTlQzMiBQb2ludHNbNl07CisgICAgUkVDVDMyIG15cjsKKyAgICBpbnQgU21hbGxEaWFtID0gVUlUT09MU19NYWtlU3F1YXJlUmVjdChyLCAmbXlyKTsKKyAgICBpbnQgaTsKKyAgICBIQlJVU0gzMiBoYnNhdmU7CisgICAgSFBFTjMyIGhwc2F2ZTsKKyAgICBpbnQgeGUsIHllOworICAgIGludCB4YywgeWM7CisgICAgQk9PTDMyIHJldHZhbCA9IFRSVUU7CisKKyAgICAvKiBVc2luZyBibGFjayBhbmQgd2hpdGUgc2VlbXMgdG8gYmUgdXR0ZXJseSB3cm9uZywgYnV0IHdpbjk1IGRvZXNuJ3QgKi8KKyAgICAvKiB1c2UgYW55dGhpbmcgZWxzZS4gSSB0aGluayBJIHRyaWVkIGFsbCBzeXMtY29sb3JzIHRvIGNoYW5nZSB0aGluZ3MgKi8KKyAgICAvKiB3aXRob3V0IGx1Y2suIEl0IHNlZW1zIGFzIGlmIHRoaXMgYmVoYXZpb3IgaXMgaW5oZXJpdGVkIGZyb20gdGhlICovCisgICAgLyogd2luMzEgREZDKCkgaW1wbGVtZW50YXRpb24uLi4gKHlvdSByZW1lbWJlciwgQi9XIG1lbnVzKS4gKi8KKworICAgIEZpbGxSZWN0MzIoZGMsIHIsIChIQlJVU0gzMilHZXRTdG9ja09iamVjdDMyKFdISVRFX0JSVVNIKSk7CisKKyAgICBoYnNhdmUgPSAoSEJSVVNIMzIpU2VsZWN0T2JqZWN0MzIoZGMsIEdldFN0b2NrT2JqZWN0MzIoQkxBQ0tfQlJVU0gpKTsKKyAgICBocHNhdmUgPSAoSFBFTjMyKVNlbGVjdE9iamVjdDMyKGRjLCBHZXRTdG9ja09iamVjdDMyKEJMQUNLX1BFTikpOworCisgICAgc3dpdGNoKHVGbGFncyAmIDB4ZmYpCisgICAgeworICAgIGNhc2UgREZDU19NRU5VQVJST1c6CisgICAgICAgIGkgPSAxODcqU21hbGxEaWFtLzc1MDsKKyAgICAgICAgUG9pbnRzWzJdLnggPSBteXIubGVmdCArIDQ2OCpTbWFsbERpYW0vNzUwOworICAgICAgICBQb2ludHNbMl0ueSA9IG15ci50b3AgICsgMzUyKlNtYWxsRGlhbS83NTArMTsKKyAgICAgICAgUG9pbnRzWzBdLnkgPSBQb2ludHNbMl0ueSAtIGk7CisgICAgICAgIFBvaW50c1sxXS55ID0gUG9pbnRzWzJdLnkgKyBpOworICAgICAgICBQb2ludHNbMF0ueCA9IFBvaW50c1sxXS54ID0gUG9pbnRzWzJdLnggLSBpOworICAgICAgICBQb2x5Z29uMzIoZGMsIFBvaW50cywgMyk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBERkNTX01FTlVCVUxMRVQ6CisgICAgICAgIHhlID0gbXlyLmxlZnQ7CisgICAgICAgIHllID0gbXlyLnRvcCAgKyBTbWFsbERpYW0gLSBTbWFsbERpYW0vMjsKKyAgICAgICAgeGMgPSBteXIubGVmdCArIFNtYWxsRGlhbSAtIFNtYWxsRGlhbS8yOworICAgICAgICB5YyA9IG15ci50b3AgICsgU21hbGxEaWFtIC0gU21hbGxEaWFtLzI7CisgICAgICAgIGkgPSAyMzQqU21hbGxEaWFtLzc1MDsKKyAgICAgICAgaSA9IGkgPCAxID8gMSA6IGk7CisgICAgICAgIG15ci5sZWZ0ICAgPSB4YyAtIGkraS8yOworICAgICAgICBteXIucmlnaHQgID0geGMgKyBpLzI7CisgICAgICAgIG15ci50b3AgICAgPSB5YyAtIGkraS8yOworICAgICAgICBteXIuYm90dG9tID0geWMgKyBpLzI7CisgICAgICAgIFBpZTMyKGRjLCBteXIubGVmdCwgbXlyLnRvcCwgbXlyLnJpZ2h0LCBteXIuYm90dG9tLCB4ZSwgeWUsIHhlLCB5ZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBERkNTX01FTlVDSEVDSzoKKyAgICAgICAgUG9pbnRzWzBdLnggPSBteXIubGVmdCArIDI1MypTbWFsbERpYW0vMTAwMDsKKyAgICAgICAgUG9pbnRzWzBdLnkgPSBteXIudG9wICArIDQ0NSpTbWFsbERpYW0vMTAwMDsKKyAgICAgICAgUG9pbnRzWzFdLnggPSBteXIubGVmdCArIDQwOSpTbWFsbERpYW0vMTAwMDsKKyAgICAgICAgUG9pbnRzWzFdLnkgPSBQb2ludHNbMF0ueSArIChQb2ludHNbMV0ueC1Qb2ludHNbMF0ueCk7CisgICAgICAgIFBvaW50c1syXS54ID0gbXlyLmxlZnQgKyA2OTAqU21hbGxEaWFtLzEwMDA7CisgICAgICAgIFBvaW50c1syXS55ID0gUG9pbnRzWzFdLnkgLSAoUG9pbnRzWzJdLngtUG9pbnRzWzFdLngpOworICAgICAgICBQb2ludHNbM10ueCA9IFBvaW50c1syXS54OworICAgICAgICBQb2ludHNbM10ueSA9IFBvaW50c1syXS55ICsgMypTbWFsbERpYW0vMTY7CisgICAgICAgIFBvaW50c1s0XS54ID0gUG9pbnRzWzFdLng7CisgICAgICAgIFBvaW50c1s0XS55ID0gUG9pbnRzWzFdLnkgKyAzKlNtYWxsRGlhbS8xNjsKKyAgICAgICAgUG9pbnRzWzVdLnggPSBQb2ludHNbMF0ueDsKKyAgICAgICAgUG9pbnRzWzVdLnkgPSBQb2ludHNbMF0ueSArIDMqU21hbGxEaWFtLzE2OworICAgICAgICBQb2x5Z29uMzIoZGMsIFBvaW50cywgNik7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRuaW1wLCAiVUlUT09MU19EcmF3RnJhbWVNZW51OiBSZXBvcnQgdGhpczogSW52YWxpZCBtZW51OyBmbGFnczogMHglMDR4XG4iLCB1RmxhZ3MpOworICAgICAgICByZXR2YWwgPSBGQUxTRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhwc2F2ZSk7CisgICAgU2VsZWN0T2JqZWN0MzIoZGMsIGhic2F2ZSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogCkBAIC0zNzIsNiArMTQzNCwxMCBAQAogQk9PTDMyIFdJTkFQSSBEcmF3RnJhbWVDb250cm9sMzIoIEhEQzMyIGhkYywgTFBSRUNUMzIgcmMsIFVJTlQzMiB1VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgdVN0YXRlICkKIHsKKyAgICAvKiBXaW45NSBkb2Vzbid0IHN1cHBvcnQgZHJhd2luZyBpbiBvdGhlciBtYXBwaW5nIG1vZGVzICovCisgICAgaWYoR2V0TWFwTW9kZTMyKGhkYykgIT0gTU1fVEVYVCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAKICAgICBzd2l0Y2godVR5cGUpCiAgICAgewogICAgIGNhc2UgREZDX0JVVFRPTjoKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2luZm8uYyBiL2RlYnVnZ2VyL2luZm8uYwppbmRleCBmNWM0ZDRjLi5hMWNiMzc4IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9pbmZvLmMKKysrIGIvZGVidWdnZXIvaW5mby5jCkBAIC0xNDEsNyArMTQxLDcgQEAKICIgIGRlbGV0ZSBkaXNwbGF5IDxkaXNudW0+XG4iLAogCiAiV2luZS1zcGVjaWZpYyBjb21tYW5kczoiLAotIiAgbW9kZSBbMTYsMzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsayBbd25kLGNsYXNzLHF1ZXVlXSA8aGFuZGxlPiIsCisiICBtb2RlIFsxNiwzMl0gICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrIFt3bmQsY2xhc3MscXVldWUsbW9kdWxlXSIsCiAiICBpbmZvIChzZWUgJ2hlbHAgaW5mbycgZm9yIG9wdGlvbnMpXG4iLAogCiAiVGhlICd4JyBjb21tYW5kIGFjY2VwdHMgcmVwZWF0IGNvdW50cyBhbmQgZm9ybWF0cyAoaW5jbHVkaW5nICdpJykgaW4gdGhlIiwKQEAgLTE3NiwxMyArMTc2LDEzIEBACiAiICBpbmZvIGRpc3BsYXkgICAgICAgICBTaG93cyBhdXRvLWRpc3BsYXkgZXhwcmVzc2lvbnMgaW4gdXNlIiwKICIgIGluZm8gbG9jYWxzICAgICAgICAgIERpc3BsYXlzIHZhbHVlcyBvZiBhbGwgbG9jYWwgdmFycyBmb3IgY3VycmVudCBmcmFtZSIsCiAiICBpbmZvIG1hcHMgICAgICAgICAgICBEdW1wcyBhbGwgdmlydHVhbCBtZW1vcnkgbWFwcGluZ3MiLAotIiAgaW5mbyBtb2R1bGUgICAgICAgICAgRGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIG1vZHVsZXMiLAotIiAgaW5mbyBxdWV1ZSA8aGFuZGxlPiAgRHVtcHMgcXVldWUgaW5mb3JtYXRpb24iLAorIiAgaW5mbyBtb2R1bGUgPGhhbmRsZT4gRGlzcGxheXMgaW50ZXJuYWwgbW9kdWxlIHN0YXRlIiwKKyIgIGluZm8gcXVldWUgPGhhbmRsZT4gIERpc3BsYXlzIGludGVybmFsIHF1ZXVlIHN0YXRlIiwKICIgIGluZm8gcmVnICAgICAgICAgICAgIERpc3BsYXlzIHZhbHVlcyBpbiBhbGwgcmVnaXN0ZXJzIGF0IHRvcCBvZiBzdGFjayIsCiAiICBpbmZvIHNlZ21lbnRzICAgICAgICBEdW1wcyBpbmZvcm1hdGlvbiBhYm91dCBhbGwga25vd24gc2VnbWVudHMiLAogIiAgaW5mbyBzaGFyZSAgICAgICAgICAgRHVtcHMgaW5mb3JtYXRpb24gYWJvdXQgc2hhcmVkIGxpYnJhcmllcyIsCiAiICBpbmZvIHN0YWNrICAgICAgICAgICBEdW1wcyBpbmZvcm1hdGlvbiBhYm91dCB0b3Agb2Ygc3RhY2siLAotIiAgaW5mbyB3bmQgPGhhbmRsZT4gICAgRHVtcHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHdpbmRvd3MiLAorIiAgaW5mbyB3bmQgPGhhbmRsZT4gICAgRGlzcGxheXMgaW50ZXJuYWwgd2luZG93IHN0YXRlIiwKICIiLAogTlVMTAogfTsKZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vTWFrZWZpbGUuaW4gYi9kb2N1bWVudGF0aW9uL01ha2VmaWxlLmluCmluZGV4IGZlMWJlMmIuLjYwMjYxNTggMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vTWFrZWZpbGUuaW4KKysrIGIvZG9jdW1lbnRhdGlvbi9NYWtlZmlsZS5pbgpAQCAtMjIsNiArMjIsMTAgQEAKIAogYWxsOiAkKElORk9GSUxFUykgJChEVklGSUxFUykKIAoraW5mbzogJChJTkZPRklMRVMpCisKK2R2aTogJChEVklGSUxFUykKKwogQE1BS0VfUlVMRVNACiAKICQoSU5GT0ZJTEVTKTogJChTT1VSQ0VTKQpAQCAtMzQsMTMgKzM4LDE3IEBACiAJJChSTSkgJChJTkNMVURFUykKIAlmb3IgaSBpbiAkKElOQ0xVREVTKTsgZG8gJChMTl9TKSAkKFRPUFNSQ0RJUikvJCRpICQkaSB8fCBleGl0IDE7IGRvbmUKIAotaW5zdGFsbDo6ICQoSU5GT0ZJTEVTKQotCWZvciBpIGluICQoSU5GT0ZJTEVTKTsgZG8gJChJTlNUQUxMX0RBVEEpICQkaSAkKGluZm9kaXIpLyQkaTsgZG9uZQoraW5zdGFsbDo6IAogCSQoSU5TVEFMTF9EQVRBKSAkKFNSQ0RJUikvd2luZS5tYW4gJChtYW5kaXIpL3dpbmUkKG1hbmV4dCkKIAorIyBOb3QgZG9uZSBieSBkZWZhdWx0IGJlY2F1c2Ugb2YgbWFrZWluZm8gYnVncworaW5zdGFsbF9pbmZvOiAkKElORk9GSUxFUykKKwlmb3IgaSBpbiAkKElORk9GSUxFUyk7IGRvICQoSU5TVEFMTF9EQVRBKSAkJGkgJChpbmZvZGlyKS8kJGk7IGRvbmUKKwogY2xlYW46OgogCSQoUk0pICQoSU5GT0ZJTEVTKSAkKERWSUZJTEVTKSAkKElOQ0xVREVTKQogCSQoUk0pIHdpbmUuYXV4IHdpbmUuY3Agd2luZS5jcHMgd2luZS5mbiB3aW5lLmZucyB3aW5lLmt5IHdpbmUubG9nIFwKIAkJd2luZS5wZyB3aW5lLnRvYyB3aW5lLnRwIHdpbmUudHBzIHdpbmUudnIgd2luZS52cnMKKwkkKFJNKSAtciBtYW4zdwogCiAjIyMgRGVwZW5kZW5jaWVzOgpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9SRUFETUUuZG9jdW1lbnRhdGlvbiBiL2RvY3VtZW50YXRpb24vUkVBRE1FLmRvY3VtZW50YXRpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5MWRjNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3VtZW50YXRpb24vUkVBRE1FLmRvY3VtZW50YXRpb24KQEAgLTAsMCArMSwxMjIgQEAKKworCQkJV2luZSBEb2N1bWVudGF0aW9uIFJFQURNRQorCisKK1dpbmUgTWFuIFBhZ2UKKworICBUaGUgbWFuIHBhZ2UgZm9yIHRoZSB3aW5lIGVtdWxhdG9yIGlzIGluIHRoaXMgZGlyZWN0b3J5LiBJdCBpcyBpbnN0YWxsZWQgCitieSAnbWFrZSBpbnN0YWxsJy4KKworV2luZSBSZWZlcmVuY2UgTWFudWFsCisKKyAgVGV4aW5mbyBzb3VyY2UgZm9yIHByZWxpbWluYXJ5IGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlvbiBpcyBpbgordGhpcyBkaXJlY3RvcnkuICBVc2UgJ21ha2UgaW5mbycgaW4gdGhpcyBkaXJlY3RvcnkgdG8gZ2VuZXJhdGUgdGhlIEdOVQoraW5mbyB2ZXJzaW9uLCAnbWFrZSBkdmknIHRvIGdlbmVyYXRlIHRoZSBEVkkgdmVyc2lvbiAoaGl0ICdyJyB0bworaWdub3JlIGVycm9ycyksIG9yICdtYWtlIGFsbCcgZm9yIGJvdGguIEl0IGlzIG5vIGxvbmdlciBpbnN0YWxsZWQgYnkKK2RlZmF1bHQuCisKK1dpbmUgQVBJIGRvY3VtZW50YXRpb24KKworICBEbyBhICdtYWtlIG1hbnBhZ2VzJyBpbiB0aGUgV2luZSB0b3BsZXZlbCBkaXJlY3RvcnkgdG8gZ2VuZXJhdGUgdGhlCitBUEkgbWFucGFnZXMgZnJvbSB0aGUgV2luZSBzb3VyY2UsIG9yICdtYWtlIG1hbicgaW4gYW55IHNvdXJjZQorc3ViZGlyZWN0b3J5IHRvIGdlbmVyYXRlIG1hbnBhZ2VzIGZyb20gb25seSB0aGF0IGRpcmVjdG9yeS4gVGhlCittYW5wYWdlcyB3aWxsIGJlIGRlcG9zaXRlZCBpbiBbZG9jdW1lbnRhdGlvbi9tYW4zd10uICBZb3Ugd2lsbCBuZWVkCitjMm1hbiwgYXZhaWxhYmxlIGFzIHNvdXJjZSBmcm9tIGh0dHA6Ly93d3cuZGViaWFuLm9yZy8gYW5kIG90aGVyCitwbGFjZXMuIEFwcGx5IHRoZSBwYXRjaCBpbmNsdWRlZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgaW1wcm92ZWQKK3RlcnNlIGRlc2NyaXB0aW9uIGZvcm1hdHRpbmcuICBUaGUgbWFuIHBhZ2VzIGFyZSBub3QgaW5zdGFsbGVkCithdXRvbWF0aWNhbGx5LgorCitPdGhlciBSRUFETUVzCisKKyAgT3RoZXIgaW5mb3JtYXRpb25hbCBmaWxlcyBhcmUgaW4gdGhpcyBkaXJlY3RvcnkgYXMgd2VsbCBhcyBzY2F0dGVyZWQKK3Rocm91Z2ggdGhlIHNvdXJjZSB0cmVlLgorCitPdGhlciByZXNvdXJjZXM6CisKKyAgVXNlbmV0OiBuZXdzOmNvbXAuZW11bGF0b3JzLm1zLXdpbmRvd3Mud2luZQorICBXV1c6ICAgIGh0dHA6Ly93d3cud2luZWhxLmNvbS8KKworCitXcml0aW5nIFdpbmUgQVBJIERvY3VtZW50YXRpb24KKworVG8gaW1wcm92ZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgV2luZSBBUEksIGp1c3QgYWRkIGNvbW1lbnRzIHRvIHRoZQorZXhpc3Rpbmcgc291cmNlLiBGb3IgZXhhbXBsZSwKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBQbGF5TWV0YUZpbGUzMiAoR0RJMzIuMjY1KSBSZW5kZXIgbWV0YWZpbGUgdG8gZGV2aWNlCisgKgorICogICAgVGhlIG1ldGFmaWxlIGlzIHJlbmRlcmVkIGluIHRoZSBkZXZpY2UgY29udGV4dCBzcGVjaWZpZWQgYnkgaGRjLgorICoKKyAqICBSRVRVUk5TCisgKgorICogICAgQWx3YXlzIHJldHVybnMgVFJVRS4KKyAqCisgKiBGSVhNRQorICogICAgV2luZSBtZXRhZmlsZXMgYXJlIG5vdCAxMDAlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggTWljcm9zb2Z0IFdpbmRvd3MKKyAqICAgIG1ldGFmaWxlcy4KKyAqLworQk9PTDMyIFdJTkFQSSBQbGF5TWV0YUZpbGUzMigKKyAgICAgICAgSERDMzIgaGRjLCAvKiBoYW5kbGUgb2YgZGV2aWNlIGNvbnRleHQgaW4gd2hpY2ggdG8gcmVuZGVyIG1ldGFmaWxlICovCisgICAgICAgIEhNRVRBRklMRTMyIGhtZiAvKiBtZXRhZmlsZSBoYW5kbGUgKi8KKykgeworCitiZWNvbWVzLCBhZnRlciBwcm9jZXNzaW5nIHdpdGggYzJtYW4gYW5kIG5yb2ZmIC1tYW4sCisKKworUGxheU1ldGFGaWxlMzIoM3cpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF5TWV0YUZpbGUzMigzdykKKworCitOQU1FCisgICAgICAgUGxheU1ldGFGaWxlMzIgICAtICAgUGxheU1ldGFGaWxlMzIgICAoR0RJMzIuMjY1KSAgIFJlbmRlcgorICAgICAgIG1ldGFmaWxlIHRvIGRldmljZQorCitTWU5PUFNJUworICAgICAgIEJPT0wzMiBQbGF5TWV0YUZpbGUzMgorICAgICAgICgKKyAgICAgICAgICAgIEhEQzMyIGhkYywKKyAgICAgICAgICAgIEhNRVRBRklMRTMyIGhtZgorICAgICAgICk7CisKK1BBUkFNRVRFUlMKKyAgICAgICBIREMzMiBoZGMKKyAgICAgICAgICAgICAgSGFuZGxlICBvZiAgZGV2aWNlICBjb250ZXh0ICBpbiAgd2hpY2ggIHRvICAgcmVuZGVyCisgICAgICAgICAgICAgIG1ldGFmaWxlLgorCisgICAgICAgSE1FVEFGSUxFMzIgaG1mCisgICAgICAgICAgICAgIE1ldGFmaWxlIGhhbmRsZS4KKworREVTQ1JJUFRJT04KKyAgICAgICBUaGUgIG1ldGFmaWxlICBpcyByZW5kZXJlZCBpbiB0aGUgZGV2aWNlIGNvbnRleHQgc3BlY2lmaWVkCisgICAgICAgYnkgaGRjLgorCitSRVRVUk5TCisgICAgICAgQWx3YXlzIHJldHVybnMgVFJVRS4KKworRklYTUUKKyAgICAgICBXaW5lICBtZXRhZmlsZXMgIGFyZSAgbm90ICAxMDAlICBiaW5hcnkgIGNvbXBhdGlibGUgICB3aXRoCisgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgbWV0YWZpbGVzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQYXRjaCBmb3IgYzJtYW46CisKK2RpZmYgLXUgYzJtYW4tMi40MS5vcmlnL21hbnBhZ2UuYyBjMm1hbi0yLjQxL21hbnBhZ2UuYworLS0tIGMybWFuLTIuNDEub3JpZy9tYW5wYWdlLmMJVHVlIEFwciAyMyAyMToxMzo0NCAxOTk2CisrKysgYzJtYW4tMi40MS9tYW5wYWdlLmMJVGh1IERlYyAxOCAxMzoyMDowOCAxOTk3CitAQCAtNTg1LDEwICs1ODUsMTUgQEAKKyAJCSAgICBjb25zdCBjaGFyICplbmR0ZXJzZSwgKmFmdGVyZGFzaCA9IHNraXBkYXNoKHN0YXJ0X2xpbmUpOworIAorIAkJICAgIC8qIGZpbmQgdGhlIGVuZCBvZiB0aGUgdGVyc2UgY29tbWVudCAqLworLQkJICAgIHdoaWxlICgqYyAmJiAqYyAhPSAnLicgJiYgKmMgIT0gJ1xuJykKKysJCSAgICB3aGlsZSAoKmMgJiYgKmMgIT0gJ1xuJykKKysJCSAgICB7CisgCQkJYysrOworKwkJICAgICAgLyogJy4nIGVuZHMgdGVyc2UgZGVzY3JpcHRpb24gb25seSBpZiBpdCBlbmRzIHNlbnRlbmNlICovCisrCQkJaWYgKCooYy0xKT09Jy4nICYmICpjICYmIGlzc3BhY2UoKmMpKSAKKysJCQkgIGJyZWFrOworKwkJICAgIH0KKyAKKy0JCSAgICBlbmR0ZXJzZSA9ICpjID09ICcuJyA/IGMrMSA6IGM7CisrCQkgICAgZW5kdGVyc2UgPSBjOworIAkJICAgICp0ZXJzZSA9IGFsbG9jX3N0cmluZygKKyAJCQlhZnRlcmRhc2ggPCBlbmR0ZXJzZSA/IGFmdGVyZGFzaCA6IHN0YXJ0X2xpbmUsCisgCQkJZW5kdGVyc2UpOwpkaWZmIC0tZ2l0IGEvZG9jdW1lbnRhdGlvbi9ob3ctdG8tcG9ydCBiL2RvY3VtZW50YXRpb24vaG93LXRvLXBvcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMGY5MgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3VtZW50YXRpb24vaG93LXRvLXBvcnQKQEAgLTAsMCArMSwxMzUgQEAKK1doYXQgaXMgdGhpcz8KKy0tLS0tLS0tLS0tLQorCitUaGlzIG5vdGUgaXMgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZgorCisqIEhvdyB0byBwb3J0IFdpbmUgdG8geW91ciBmYXZvdXJpdGUgb3BlcmF0aW5nIHN5c3RlbQorKiBXaHkgeW91IHByb2JhYmx5IHNob3VsZG4ndCB1c2UgIiNpZmRlZiBNeU9TIgorKiBXaGF0IHRvIGRvIGluc3RlYWQuCisKK1RoaXMgZG9jdW1lbnQgZG9lcyBub3Qgc2F5IGEgdGhpbmcgYWJvdXQgaG93IHRvIHBvcnQgV2luZSB0byBub24tMzg2CitvcGVyYXRpbmcgc3lzdGVtcywgdGhvdWdoLiAgWW91IHdvdWxkIG5lZWQgYSBDUFUgZW11bGF0b3IuICBMZXQncyBnZXQKK1dpbmUgaW50byBhIGJldHRlciBzaGFwZSBvbiAzODYgZmlyc3QsIE9LPworCisKKworCitXaHkgIiNpZmRlZiBNeU9TIiBpcyBwcm9iYWJseSBhIG1pc3Rha2UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworT3BlcmF0aW5nIHN5c3RlbXMgY2hhbmdlLiAgTWF5YmUgeW91cnMgZG9lc24ndCBoYXZlIHRoZSAiZm9vLmgiCitoZWFkZXIsIGJ1dCBtYXliZSBhIGZ1dHVyZSB2ZXJzaW9uIHdpbGwgaGF2ZSBpdC4gIElmIHlvdSB3YW50Cit0byAiI2luY2x1ZGUgPGZvby5oPiIsIGl0IGRvZXNuJ3QgbWF0dGVyIHdoYXQgb3BlcmF0aW5nIHN5c3RlbQoreW91IGFyZSB1c2luZzsgaXQgb25seSBtYXR0ZXJzIHdoZXRoZXIgImZvby5oIiBpcyB0aGVyZS4KKworRnVydGhlcm1vcmUsIG9wZXJhdGluZyBzeXN0ZW1zIGNoYW5nZSBuYW1lcyBvciAiZm9yayIgaW50bworc2V2ZXJhbCBvbmVzLiAgQW4gIiNpZmRlZiBNeU9zIiB3aWxsIGJyZWFrIG92ZXIgdGltZS4KKworSWYgeW91IHVzZSB0aGUgZmVhdHVyZSBvZiBBdXRvY29uZiwgdGhlIEdudSBhdXRvLWNvbmZpZ3VyYXRpb24KK3V0aWxpdHkgd2lzZWx5LCB5b3Ugd2lsbCBoZWxwIGZ1dHVyZSBwb3J0ZXJzIGF1dG9tYXRpY2FsbHkKK2JlY2F1c2UgeW91ciBjaGFuZ2VzIHdpbGwgdGVzdCBmb3IgX2ZlYXR1cmVzXywgbm90IG5hbWVzIG9mCitvcGVyYXRpbmcgc3lzdGVtcy4gIEEgZmVhdHVyZSBjYW4gYmUgbWFueSB0aGluZ3M6CisKKyogZXhpc3RhbmNlIG9mIGEgaGVhZGVyIGZpbGUKKyogZXhpc3RhbmNlIG9mIGEgbGlicmFyeSBmdW5jdGlvbgorKiBleGlzdGFuY2Ugb2YgbGlicmFyaWVzCisqIGJ1Z3MgaW4gaGVhZGVyIGZpbGVzLCBsaWJyYXJ5IGZ1bmN0aW9ucywgdGhlIGNvbXBpbGVyLCAuLi4KKyogKHlvdSBuYW1lIGl0KQorCitZb3Ugd2lsbCBuZWVkIEdudSBBdXRvY29uZiwgd2hpY2ggeW91IGNhbiBnZXQgZnJvbSB5b3VyCitmcmllbmRseSBHbnUgbWlycm9yLiAgVGhpcyBwcm9ncmFtIHRha2VzIFdpbmUncyAiY29uZmlndXJlLmluIgorZmlsZSBhbmQgcHJvZHVjZXMgYSAiY29uZmlndXJlIiBzaGVsbCBzY3JpcHQgdGhhdCB1c2VycyB1c2UgdG8KK2NvbmZpZ3VyZSBXaW5lIHRvIHRoZWlyIHN5c3RlbS4KKworVGhlcmUgX2FyZV8gZXhjZXB0aW9ucyB0byB0aGUgImF2b2lkICNpZmRlZiBNeU9TIiBydWxlLiAgV2luZSwKK2ZvciBleGFtcGxlLCBuZWVkcyB0aGUgaW50ZXJuYWxzIG9mIHRoZSBzaWduYWwgc3RhY2sgLS0gdGhhdAorY2Fubm90IGVhc2lseSBiZSBkZXNjcmliZWQgaW4gdGVybXMgb2YgZmVhdHVyZXMuCisKK0xldCdzIG5vdyB0dXJuIHRvIHNwZWNpZmljIHBvcnRpbmcgcHJvYmxlbXMgYW5kIGhvdyB0byBzb2x2ZQordGhlbS4KKworCisKK015T1MgZG9lc24ndCBoYXZlIHRoZSBgZm9vLmgnIGhlYWRlciEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGZpcnN0IHN0ZXAgaXMgdG8gbWFrZSBBdXRvY29uZiBjaGVjayBmb3IgdGhpcyBoZWFkZXIuCitJbiBjb25maWd1cmUuaW4geW91IGFkZCBhIHNlZ21lbnQgbGlrZSB0aGlzIGluIHRoZSBzZWN0aW9uCit0aGF0IGNoZWNrcyBmb3IgaGVhZGVyIGZpbGVzIChzZWFyY2ggZm9yICJoZWFkZXIgZmlsZXMiKToKKworICBBQ19DSEVDS19IRUFERVIoZm9vLmgsIEFDX0RFRklORShIQVZFX0ZPT19IKSkKKworSWYgeW91ciBvcGVyYXRpbmcgc3lzdGVtIHN1cHBvcnRzIGEgaGVhZGVyIGZpbGUgd2l0aCB0aGUKK3NhbWUgY29udGVudHMgYnV0IGEgZGlmZmVyZW50IG5hbWUsIHNheSBiYXIuaCwgYWRkIGEgY2hlY2sKK2ZvciB0aGF0IGFsc28uCisKK05vdyB5b3UgY2FuIGNoYW5nZQorCisgICNpbmNsdWRlIDxmb28uaD4KKwordG8KKworICAjaWZkZWYgSEFWRV9GT09fSAorICAjaW5jbHVkZSA8Zm9vLmg+CisgICNlbGlmIGRlZmluZWQgKEhBVkVfQkFSX0gpCisgICNpbmNsdWRlIDxiYXQuaD4KKyAgI2VuZGlmCisKK0lmIHlvdXIgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaGVhZGVyIGZpbGUgZXZlbgordGhvdWdoIGl0IGhhcyB0aGUgbGlicmFyeSBmdW5jdGlvbnMgYmVpbmcgdXNlZCwgeW91IG1pZ2h0CitoYXZlIHRvIGFkZCBhbiAiI2Vsc2UiIHNlY3Rpb24gdG8gdGhlIGNvbmRpdGlvbmFsLiAgQXZvaWQKK3RoaXMgaWYgeW91IGNhbi4KKworWW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCAiI3VuZGVmIEhBVkVfRk9PX0giIChldGMuKSB0bworaW5jbHVkZS9jb25maWcuaC5pbgorCitGaW5pc2ggdXAgd2l0aCAibWFrZSBjb25maWd1cmUiIGFuZCAiLi9jb25maWd1cmUiLgorCisKK015T1MgZG9lc24ndCBoYXZlIHRoZSBgYmFyJyBmdW5jdGlvbiEKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIHR5cGljYWwgZXhhbXBsZSBvZiB0aGlzIGlzIHRoZSBgbWVtbW92ZScuICBUbyBzb2x2ZSB0aGlzCitwcm9ibGVtIHlvdSB3b3VsZCBhZGQgYG1lbW1vdmUnIHRvIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucwordGhhdCBBdXRvY29uZiBjaGVja3MgZm9yLiAgSW4gY29uZmlndXJlLmluIHlvdSBzZWFyY2ggZm9yCitBQ19DSEVDS19GVU5DUyBhbmQgYWRkIGBtZW1tb3ZlJy4gIChZb3Ugd2lsbCBub3RpY2UgdGhhdAorc29tZW9uZSBhbHJlYWR5IGRpZCB0aGlzIGZvciB0aGlzIHBhcnRpY3VsYXIgZnVuY3Rpb24uKQorCitTZWNvbmRseSwgeW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCAiI3VuZGVmIEhBVkVfQkFSIgordG8gaW5jbHVkZS9jb25maWcuaC5pbgorCitUaGUgbmV4dCBzdGVwIGRlcGVuZHMgb24gdGhlIG5hdHVyZSBvZiB0aGUgbWlzc2luZyBmdW5jdGlvbi4KKworQ2FzZSAxOiBJdCdzIGVhc3kgdG8gd3JpdGUgYSBjb21wbGV0ZSBlbXVsYXRpb24gb2YgdGhlCisgIGZ1bmN0aW9uLiAgKGBtZW1tb3ZlJyBiZWxvbmdzIHRvIHRoaXMgY2FzZS4pCisKKyAgWW91IGFkZCB5b3VyIGVtdWxhdGlvbiBpbiBtaXNjL3BvcnQuYyBzdXJyb3VuZGVkIGJ5CisgICIjaWZuZGVmIEhBVkVfTUVNTU9WRSIgYW5kICIjZW5kaWYiLgorCisgIFlvdSBtaWdodCBoYXZlIHRvIGFkZCBhIHByb3RvdHlwZSBmb3IgeW91ciBmdW5jdGlvbi4gIElmIHNvLAorICBpbmNsdWRlL21pc2NlbXUuaCBtaWdodCBiZSB0aGUgcGxhY2UuICBEb24ndCBmb3JnZXQgdG8gcHJvdGVjdAorICB0aGF0IGRlZmluaXRpb24gYnkgIiNpZm5kZWYgSEFWRV9NRU1NT1ZFIiBhbmQgIiNlbmRpZiIgYWxzbyEKKworQ2FzZSAyOiBBIGdlbmVyYWwgZW11bGF0aW9uIGlzIGhhcmQsIGJ1dCBXaW5lIGlzIG9ubHkgdXNpbmcKKyAgYSBzcGVjaWFsIGNhc2UuCisKKyAgQW4gZXhhbXBsZSBpcyB0aGUgdmFyaW91cyAid2FpdCIgY2FsbHMgdXNlZCBpbiBTSUdOQUxfY2hpbGQKKyAgZnJvbSBsb2FkZXIvc2lnbmFsLmMuICBIZXJlIHdlIGhhdmUgYSBtdWx0aS1icmFuY2ggY2FzZSBvbgorICBmZWF0dXJlczoKKworICAgICNpZmRlZiBIQVZFX1RISVMKKyAgICAuLi4KKyAgICAjZWxpZiBkZWZpbmVkIChIQVZFX1RIQVQpCisgICAgLi4uCisgICAgI2VsaWYgZGVmaW5lZCAoSEFWRV9TT01FVEhJTkdfRUxTRSkKKyAgICAuLi4KKyAgICAjZW5kaWYKKworICBOb3RlIHRoYXQgdGhpcyBpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIHRlc3Rpbmcgb24gb3BlcmF0aW5nCisgIHN5c3RlbXMuICBJZiBhIG5ldyB2ZXJzaW9uIG9mIHlvdXIgb3BlcmF0aW5nIHN5c3RlbXMgY29tZXMKKyAgb3V0IGFuZCBhZGRzIGEgbmV3IGZ1bmN0aW9uLCB0aGlzIGNvZGUgd2lsbCBtYWdpY2FsbHkgc3RhcnQKKyAgdXNpbmcgaXQuCisKK0ZpbmlzaCB1cCB3aXRoICJtYWtlIGNvbmZpZ3VyZSIgYW5kICIuL2NvbmZpZ3VyZSIuCisKKwpkaWZmIC0tZ2l0IGEvZmlsZXMvZG9zX2ZzLmMgYi9maWxlcy9kb3NfZnMuYwppbmRleCAyYWNlNGUwLi41Y2Q4ZTc2IDEwMDY0NAotLS0gYS9maWxlcy9kb3NfZnMuYworKysgYi9maWxlcy9kb3NfZnMuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTM3MywxNSArMzc0LDE1IEBACiAjaWZkZWYgVkZBVF9JT0NUTF9SRUFERElSX0JPVEgKICAgICBpZiAoZGlyLT5mZCAhPSAtMSkKICAgICB7Ci0gICAgICAgIGlmIChpb2N0bCggZGlyLT5mZCwgVkZBVF9JT0NUTF9SRUFERElSX0JPVEgsIChsb25nKWRpci0+ZGlyZW50ICkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghZGlyLT5kaXJlbnRbMF0uZF9yZWNsZW4pIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFET1NGU19Ub0Rvc0ZDQkZvcm1hdCggZGlyLT5kaXJlbnRbMF0uZF9uYW1lLCBkaXItPnNob3J0X25hbWUgKSkKLSAgICAgICAgICAgIGRpci0+c2hvcnRfbmFtZVswXSA9ICdcMCc7Ci0gICAgICAgICpzaG9ydF9uYW1lID0gZGlyLT5zaG9ydF9uYW1lOwotICAgICAgICBpZiAoZGlyLT5kaXJlbnRbMV0uZF9uYW1lWzBdKSAqbG9uZ19uYW1lID0gZGlyLT5kaXJlbnRbMV0uZF9uYW1lOwotICAgICAgICBlbHNlICpsb25nX25hbWUgPSBkaXItPmRpcmVudFswXS5kX25hbWU7Ci0gICAgICAgIHJldHVybiBUUlVFOworICAgICAgICBpZiAoaW9jdGwoIGRpci0+ZmQsIFZGQVRfSU9DVExfUkVBRERJUl9CT1RILCAobG9uZylkaXItPmRpcmVudCApICE9IC0xKSB7CisJICAgIGlmICghZGlyLT5kaXJlbnRbMF0uZF9yZWNsZW4pIHJldHVybiBGQUxTRTsKKwkgICAgaWYgKCFET1NGU19Ub0Rvc0ZDQkZvcm1hdCggZGlyLT5kaXJlbnRbMF0uZF9uYW1lLCBkaXItPnNob3J0X25hbWUgKSkKKwkJZGlyLT5zaG9ydF9uYW1lWzBdID0gJ1wwJzsKKwkgICAgKnNob3J0X25hbWUgPSBkaXItPnNob3J0X25hbWU7CisJICAgIGlmIChkaXItPmRpcmVudFsxXS5kX25hbWVbMF0pICpsb25nX25hbWUgPSBkaXItPmRpcmVudFsxXS5kX25hbWU7CisJICAgIGVsc2UgKmxvbmdfbmFtZSA9IGRpci0+ZGlyZW50WzBdLmRfbmFtZTsKKwkgICAgcmV0dXJuIFRSVUU7CisJfQogICAgIH0KICNlbmRpZiAgLyogVkZBVF9JT0NUTF9SRUFERElSX0JPVEggKi8KIApAQCAtNTE4LDggKzUxOSw4IEBACiAKICAgICBpZiAoIShkaXIgPSBET1NGU19PcGVuRGlyKCBwYXRoICkpKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRE9TRlNfRmluZFVuaXhOYW1lKCVzLCVzKTogY2FuJ3Qgb3BlbiBkaXJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIG5hbWUgKTsKKyAgICAgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRE9TRlNfRmluZFVuaXhOYW1lKCVzLCVzKTogY2FuJ3Qgb3BlbiBkaXI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBuYW1lLCBzdHJlcnJvcihlcnJubykgKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIApAQCAtODUzLDE2ICs4NTQsMTggQEAKICAgICBwID0gYnVmZmVyOwogICAgICpwKysgPSAnQScgKyBkcml2ZTsKICAgICAqcCsrID0gJzonOwotICAgIGlmIChJU19FTkRfT0ZfTkFNRSgqbmFtZSkpICAvKiBBYnNvbHV0ZSBwYXRoICovCisgICAgaWYgKElTX0VORF9PRl9OQU1FKCpuYW1lKSAmJiAoKm5hbWUpKSAgLyogQWJzb2x1dGUgcGF0aCAqLwogICAgIHsKICAgICAgICAgd2hpbGUgKCgqbmFtZSA9PSAnXFwnKSB8fCAoKm5hbWUgPT0gJy8nKSkgbmFtZSsrOwogICAgIH0KLSAgICBlbHNlICAvKiBSZWxhdGl2ZSBwYXRoICovCisgICAgZWxzZSAgLyogUmVsYXRpdmUgcGF0aCBvciBlbXB0eSBwYXRoICovCiAgICAgewogICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgbHN0cmNweW4zMkEoIHAsIERSSVZFX0dldERvc0N3ZChkcml2ZSksIHNpemVvZihidWZmZXIpIC0gMyApOwogICAgICAgICBpZiAoKnApIHAgKz0gc3RybGVuKHApOyBlbHNlIHAtLTsKICAgICB9CisgICAgaWYgKCEqbmFtZSkgLyogZW1wdHkgcGF0aCAqLworICAgICAgKnArKyA9ICdcXCc7CiAgICAgKnAgPSAnXDAnOwogCiAgICAgd2hpbGUgKCpuYW1lKQpkaWZmIC0tZ2l0IGEvZmlsZXMvZHJpdmUuYyBiL2ZpbGVzL2RyaXZlLmMKaW5kZXggZjg3NGRmOC4uMGZkNTgyZCAxMDA2NDQKLS0tIGEvZmlsZXMvZHJpdmUuYworKysgYi9maWxlcy9kcml2ZS5jCkBAIC02NTMsNiArNjUzLDU3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0RGlza0ZyZWVTcGFjZUV4MzJBICAgKEtFUk5FTDMyLjg3MSkKKyAqLworQk9PTDMyIFdJTkFQSSBHZXREaXNrRnJlZVNwYWNlRXgzMkEoIExQQ1NUUiByb290LAorCQkJCSAgICAgTFBVTEFSR0VfSU5URUdFUiBhdmFpbCwKKwkJCQkgICAgIExQVUxBUkdFX0lOVEVHRVIgdG90YWwsCisJCQkJICAgICBMUFVMQVJHRV9JTlRFR0VSIHRvdGFsZnJlZSkKK3sKKyAgICBpbnQJZHJpdmU7CisgICAgRFdPUkQgc2l6ZSxhdmFpbGFibGU7CisKKyAgICBpZiAoIXJvb3QpIGRyaXZlID0gRFJJVkVfR2V0Q3VycmVudERyaXZlKCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKChyb290WzFdKSAmJiAoKHJvb3RbMV0gIT0gJzonKSB8fCAocm9vdFsyXSAhPSAnXFwnKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkdldERpc2tGcmVlU3BhY2VFeEE6IGludmFsaWQgcm9vdCAnJXMnXG4iLAorCQkgICAgIHJvb3QgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBkcml2ZSA9IHRvdXBwZXIocm9vdFswXSkgLSAnQSc7CisgICAgfQorICAgIGlmICghRFJJVkVfR2V0RnJlZVNwYWNlKGRyaXZlLCAmc2l6ZSwgJmF2YWlsYWJsZSkpIHJldHVybiBGQUxTRTsKKyAgICAvKkZJWE1FOiBEbyB3ZSBoYXZlIHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIHRvIHRoZSB1c2VyPyAqLworICAgIGF2YWlsLT5IaWdoUGFydCA9IHRvdGFsLT5IaWdoUGFydCA9IDA7CisgICAgYXZhaWwtPkxvd1BhcnQgPSBhdmFpbGFibGU7CisgICAgdG90YWwtPkxvd1BhcnQgPSBzaXplOworICAgIGlmKHRvdGFsZnJlZSkKKyAgICAgIHsKKwl0b3RhbGZyZWUtPkhpZ2hQYXJ0ID0wOworCXRvdGFsZnJlZS0+TG93UGFydD0gIGF2YWlsYWJsZTsKKyAgICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0RGlza0ZyZWVTcGFjZUV4MzJXICAgKEtFUk5FTDMyLjg3MykKKyAqLworQk9PTDMyIFdJTkFQSSBHZXREaXNrRnJlZVNwYWNlRXgzMlcoIExQQ1dTVFIgcm9vdCwgTFBVTEFSR0VfSU5URUdFUiBhdmFpbCwKKwkJCQkgICAgIExQVUxBUkdFX0lOVEVHRVIgdG90YWwsCisJCQkJICAgICBMUFVMQVJHRV9JTlRFR0VSICB0b3RhbGZyZWUpCit7CisgICAgTFBTVFIgeHJvb3Q7CisgICAgQk9PTDMyIHJldDsKKworICAgIHhyb290ID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCByb290KTsKKyAgICByZXQgPSBHZXREaXNrRnJlZVNwYWNlRXgzMkEoIHhyb290LCBhdmFpbCwgdG90YWwsIHRvdGFsZnJlZSk7CisgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHhyb290ICk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0RHJpdmVUeXBlMTYgICAoS0VSTkVMLjEzNikKICAqLwogVUlOVDE2IFdJTkFQSSBHZXREcml2ZVR5cGUxNiggVUlOVDE2IGRyaXZlICkKZGlmZiAtLWdpdCBhL2ZpbGVzL2ZpbGUuYyBiL2ZpbGVzL2ZpbGUuYwppbmRleCBjZGJiZTU1Li4xMDM4MGU4IDEwMDY0NAotLS0gYS9maWxlcy9maWxlLmMKKysrIGIvZmlsZXMvZmlsZS5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOyAvKiBlcnJubyBnZXRzIG92ZXJ3cml0dGVuIGJ5IHByaW50ZiAqLwogCiAgICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIkZJTEVfU2V0RG9zRXJyb3I6IGVycm5vID0gJWQgJXNcbiIsIGVycm5vLAotCQkgc3lzX2Vycmxpc3RbZXJybm9dICk7CisJCSBzdHJlcnJvcihlcnJubykgKTsKICAgICBzd2l0Y2ggKHNhdmVfZXJybm8pCiAgICAgewogICAgIGNhc2UgRUFHQUlOOgpAQCAtNTMxLDcgKzUzMSw3IEBACiAgICAgY2hhciB0ZW1wcGF0aFsxNDRdOwogCiAgICAgaWYgKCEoZHJpdmUgJiB+VEZfRk9SQ0VEUklWRSkpIC8qIGRyaXZlIDAgbWVhbnMgY3VycmVudCBkZWZhdWx0IGRyaXZlICovCi0gICAgICAgIGRyaXZlIHw9IERSSVZFX0dldEN1cnJlbnREcml2ZSgpOworICAgICAgICBkcml2ZSB8PSBEUklWRV9HZXRDdXJyZW50RHJpdmUoKSArICdBJzsKIAogICAgIGlmICgoZHJpdmUgJiBURl9GT1JDRURSSVZFKSAmJgogICAgICAgICAhRFJJVkVfSXNWYWxpZCggdG91cHBlcihkcml2ZSAmIH5URl9GT1JDRURSSVZFKSAtICdBJyApKQpAQCAtNTQyLDEyICs1NDIsMTcgQEAKICAgICB9CiAKICAgICBpZiAoZHJpdmUgJiBURl9GT1JDRURSSVZFKQotICAgICAgICBzcHJpbnRmKHRlbXBwYXRoLCIlYzoiLCBkcml2ZSAmIH5URl9GT1JDRURSSVZFICk7CisgICAgeworICAgICAgICBzcHJpbnRmKCB0ZW1wcGF0aCwgIiVjOlxcIiwgZHJpdmUgJiB+VEZfRk9SQ0VEUklWRSApOworCWxzdHJjcHluMzJBKCB0ZW1wcGF0aCArIDMsCisgICAgICAgICAgICAgICAgICAgICBEUklWRV9HZXREb3NDd2QoIHRvdXBwZXIoZHJpdmUgJiB+VEZfRk9SQ0VEUklWRSkgLSAnQScpLAorICAgICAgICAgICAgICAgICAgICAgMTI5ICk7CisgICAgfQogICAgIGVsc2UKICAgICB7CiAgICAgICAgIEdldFRlbXBQYXRoMzJBKCAxMzIsIHRlbXBwYXRoICk7Ci0gICAgICAgIHN0cmNhdCggdGVtcHBhdGgsICJcXCIgKTsKICAgICB9CisgICAgc3RyY2F0KCB0ZW1wcGF0aCwgIlxcIiApOwogICAgIHJldHVybiAoVUlOVDE2KUdldFRlbXBGaWxlTmFtZTMyQSggdGVtcHBhdGgsIHByZWZpeCwgdW5pcXVlLCBidWZmZXIgKTsKIH0KIApAQCAtMTYwMyw2ICsxNjA4LDggQEAKICAgLyogY2hlY2sgaWYgbG9jayBvdmVybGFwcyBhIGN1cnJlbnQgbG9jayBmb3IgdGhlIHNhbWUgZmlsZSAqLwogICBmb3IgKGN1cnIgPSBsb2NrczsgY3VycjsgY3VyciA9IGN1cnItPm5leHQpIHsKICAgICBpZiAoc3RyY21wKGN1cnItPnVuaXhfbmFtZSwgZmlsZS0+dW5peF9uYW1lKSA9PSAwKSB7CisgICAgICBpZiAoKGYtPmxfc3RhcnQgPT0gY3Vyci0+YmFzZSkgJiYgKGYtPmxfbGVuID09IGN1cnItPmxlbikpCisJcmV0dXJuIFRSVUU7LyogcmVnaW9uIGlzIGlkZW50aWMgKi8KICAgICAgIGlmICgoZi0+bF9zdGFydCA8IChjdXJyLT5iYXNlICsgY3Vyci0+bGVuKSkgJiYKIAkgICgoZi0+bF9zdGFydCArIGYtPmxfbGVuKSA+IGN1cnItPmJhc2UpKSB7CiAJLyogcmVnaW9uIG92ZXJsYXBzICovCmRpZmYgLS1naXQgYS9maWxlcy9wcm9maWxlLmMgYi9maWxlcy9wcm9maWxlLmMKaW5kZXggODc1YTU5MC4uNTQ1MDQ5ZCAxMDA2NDQKLS0tIGEvZmlsZXMvcHJvZmlsZS5jCisrKyBiL2ZpbGVzL3Byb2ZpbGUuYwpAQCAtOTQyLDYgKzk0Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBkZWZfdmFsLCBMUFNUUiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGxlbiwgTFBDU1RSIGZpbGVuYW1lICkKIHsKKyAgICBpZiAoIWZpbGVuYW1lKSAKKwlmaWxlbmFtZSA9ICJ3aW4uaW5pIjsKICAgICBpZiAoUFJPRklMRV9PcGVuKCBmaWxlbmFtZSApKQogICAgICAgICByZXR1cm4gUFJPRklMRV9HZXRTdHJpbmcoIHNlY3Rpb24sIGVudHJ5LCBkZWZfdmFsLCBidWZmZXIsIGxlbiApOwogICAgIGxzdHJjcHluMzJBKCBidWZmZXIsIGRlZl92YWwsIGxlbiApOwpAQCAtMTAyMSw2ICsxMDIzLDI3IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb24zMkEgICAoS0VSTkVMMzIpCisgKi8KK0JPT0wzMiBXSU5BUEkgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb24zMkEoIExQQ1NUUiBzZWN0aW9uLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHN0cmluZywgTFBDU1RSIGZpbGVuYW1lICkKK3sKKyAgICBjaGFyICpwID0oY2hhciopc3RyaW5nOworCisgICAgZnByaW50Ziggc3RkbmltcCwiV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb24zMkEgZW1wdHkgc3R1cFxuIik7CisgICAgaWYgKGRlYnVnZ2luZ19wcm9maWxlKSB7CisgICAgICBmcHJpbnRmKHN0ZGRlYiwiZmlsZSglcykgPT4gWyVzXVxuIiwgZmlsZW5hbWUsc2VjdGlvbik7CisgICAgICB3aGlsZSAoKihwKzEpKSB7CisJZnByaW50ZihzdGRkZWIsIiVzXG4iLHApOworICAgICAgICBwICs9IHN0cmxlbihwKTsKKwlwICs9IDE7CisgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBGQUxTRTsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXcml0ZU91dFByb2ZpbGVzICAgKEtFUk5FTC4zMTUpCmRpZmYgLS1naXQgYS9ncmFwaGljcy9NYWtlZmlsZS5pbiBiL2dyYXBoaWNzL01ha2VmaWxlLmluCmluZGV4IDU5MTJkOTAuLjM3ODRjNTIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL01ha2VmaWxlLmluCisrKyBiL2dyYXBoaWNzL01ha2VmaWxlLmluCkBAIC03LDEyICs3LDE0IEBACiAKIENfU1JDUyA9IFwKIAliaXRibHQuYyBcCisJY2FjaGUuYyBcCiAJZHJpdmVyLmMgXAogCWVudi5jIFwKIAllc2NhcGUuYyBcCiAJZm9udGVuZ2luZS5jIFwKIAltYXBwaW5nLmMgXAogCXBhaW50aW5nLmMgXAorCXBhdGguYyBcCiAJd2luZy5jCiAKIGFsbDogJChNT0RVTEUpLm8KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL2NhY2hlLmMgYi9ncmFwaGljcy9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMGYxODQKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9jYWNoZS5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBXaW5lIGludGVybmFsbHkgY2FjaGVkIG9iamVjdHMgdG8gc3BlZWR1cCBzb21lIHRoaW5ncyBhbmQgcHJldmVudCAKKyAqIGluZmluaXRlIGR1cGxpY2F0aW9uIG9mIHRyaXZpYWwgY29kZSBhbmQgZGF0YS4gCisgKiAKKyAqIENvcHlyaWdodCAxOTk3IEJlcnRobyBBLiBTdHVsdGllbnMKKyAqCisgKi8KKworI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCitzdGF0aWMgY29uc3QgV09SRCB3UGF0dGVybjU1QUFbXSA9Cit7IAorICAgIDB4NTU1NSwgMHhhYWFhLCAweDU1NTUsIDB4YWFhYSwKKyAgICAweDU1NTUsIDB4YWFhYSwgMHg1NTU1LCAweGFhYWEKK307CisKK3N0YXRpYyBIQlJVU0gzMiAgaFBhdHRlcm41NUFBQnJ1c2ggPSAwOworc3RhdGljIEhCSVRNQVAzMiBoUGF0dGVybjU1QUFCaXRtYXAgPSAwOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUNBQ0hFX0dldFBhdHRlcm41NUFBQnJ1c2gKKyAqLworSEJSVVNIMzIgQ0FDSEVfR2V0UGF0dGVybjU1QUFCcnVzaCh2b2lkKQoreworICAgIGlmICghaFBhdHRlcm41NUFBQnJ1c2gpCisgICAgICAgIGhQYXR0ZXJuNTVBQUJydXNoID0gQ3JlYXRlUGF0dGVybkJydXNoMzIoQ0FDSEVfR2V0UGF0dGVybjU1QUFCaXRtYXAoKSk7CisgICAgcmV0dXJuIGhQYXR0ZXJuNTVBQUJydXNoOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUNBQ0hFX0dldFBhdHRlcm41NUFBQml0bWFwCisgKi8KK0hCSVRNQVAzMiBDQUNIRV9HZXRQYXR0ZXJuNTVBQUJpdG1hcCh2b2lkKQoreworICAgIGlmICghaFBhdHRlcm41NUFBQml0bWFwKQorICAgICAgICBoUGF0dGVybjU1QUFCaXRtYXAgPSBDcmVhdGVCaXRtYXAzMiggOCwgOCwgMSwgMSwgd1BhdHRlcm41NUFBICk7CisgICAgcmV0dXJuIGhQYXR0ZXJuNTVBQUJpdG1hcDsKK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYwppbmRleCBiMTg3YmNlLi5mNjBmZTA4IDEwMDY0NAotLS0gYS9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jCkBAIC0xMiwxNSArMTIsMTMgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLXN0YXRpYyBCT09MMzIgTUZEUlZfRGVsZXRlREMoIERDICpkYyApOwotCiBzdGF0aWMgY29uc3QgRENfRlVOQ1RJT05TIE1GRFJWX0Z1bmNzID0KIHsKICAgICBNRkRSVl9BcmMsICAgICAgICAgICAgICAgICAgICAgICAvKiBwQXJjICovCiAgICAgTUZEUlZfQml0Qmx0LCAgICAgICAgICAgICAgICAgICAgLyogcEJpdEJsdCAqLwogICAgIE1GRFJWX0Nob3JkLCAgICAgICAgICAgICAgICAgICAgIC8qIHBDaG9yZCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBDcmVhdGVEQyAqLwotICAgIE1GRFJWX0RlbGV0ZURDLCAgICAgICAgICAgICAgICAgIC8qIHBEZWxldGVEQyAqLworICAgIE5VTEwsIC8qIG5vIGltcGxlbWVudGF0aW9uICovICAgIC8qIHBDcmVhdGVEQyAqLworICAgIE5VTEwsIC8qIG5vIGltcGxlbWVudGF0aW9uICovICAgIC8qIHBEZWxldGVEQyAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBEZWxldGVPYmplY3QgKi8KICAgICBNRkRSVl9FbGxpcHNlLCAgICAgICAgICAgICAgICAgICAvKiBwRWxsaXBzZSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBFbnVtRGV2aWNlRm9udHMgKi8KQEAgLTMwLDcgKzI4LDcgQEAKICAgICBNRkRSVl9FeHRGbG9vZEZpbGwsICAgICAgICAgICAgICAvKiBwRXh0Rmxvb2RGaWxsICovCiAgICAgTUZEUlZfRXh0VGV4dE91dCwgICAgICAgICAgICAgICAgLyogcEV4dFRleHRPdXQgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwR2V0Q2hhcldpZHRoICovCi0gICAgTlVMTCAvKiBubyBpbXBsZW1lbnRhdGlvbiAqLywgICAgLyogcEdldFBpeGVsICovCisgICAgTlVMTCwgLyogbm8gaW1wbGVtZW50YXRpb24gKi8gICAgLyogcEdldFBpeGVsICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEdldFRleHRFeHRlbnRQb2ludCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBHZXRUZXh0TWV0cmljcyAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBJbnRlcnNlY3RDbGlwUmVjdCAqLwpAQCAtMTMxLDYgKzEyOSw3IEBACiAgICAgaWYgKHBoeXNEZXYtPm1oKSBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgcGh5c0Rldi0+bWggKTsKICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgcGh5c0RldiApOwogICAgIGRjLT5waHlzRGV2ID0gTlVMTDsKKyAgICBHRElfRnJlZU9iamVjdChkYy0+aFNlbGYpOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0xNTQsMTMgKzE1MywxMyBAQAogICAgICAgICBwaHlzRGV2LT5taC0+bXRUeXBlID0gTUVUQUZJTEVfRElTSzsKICAgICAgICAgaWYgKChoRmlsZSA9IF9sY3JlYXQzMiggZmlsZW5hbWUsIDAgKSkgPT0gSEZJTEVfRVJST1IzMikKICAgICAgICAgewotICAgICAgICAgICAgRGVsZXRlREMzMiggZGMtPmhTZWxmICk7CisgICAgICAgICAgICBNRkRSVl9EZWxldGVEQyggZGMgKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIGlmIChfbHdyaXRlMzIoIGhGaWxlLCAoTFBTVFIpcGh5c0Rldi0+bWgsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcGh5c0Rldi0+bWgpKSA9PSBIRklMRV9FUlJPUjMyKQogCXsKLSAgICAgICAgICAgIERlbGV0ZURDMzIoIGRjLT5oU2VsZiApOworICAgICAgICAgICAgTUZEUlZfRGVsZXRlREMoIGRjICk7CiAgICAgICAgICAgICByZXR1cm4gMDsKIAl9CiAJcGh5c0Rldi0+bWgtPm10Tm9QYXJhbWV0ZXJzID0gaEZpbGU7IC8qIHN0b3JlIGZpbGUgZGVzY3JpcHRvciBoZXJlICovCkBAIC0xODYsNyArMTg1LDcgQEAKICAgICAKICAgICBkcHJpbnRmX21ldGFmaWxlKCBzdGRkZWIsICJDbG9zZU1ldGFGaWxlKCUwNHgpXG4iLCBoZGMgKTsKIAotICAgIGlmICghKGRjID0gRENfR2V0RENQdHIoIGhkYyApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBNRVRBRklMRV9EQ19NQUdJQyApKSkgcmV0dXJuIDA7CiAgICAgcGh5c0RldiA9IChNRVRBRklMRURSVl9QREVWSUNFICopZGMtPnBoeXNEZXY7CiAKICAgICAvKiBDb25zdHJ1Y3QgdGhlIGVuZCBvZiBtZXRhZmlsZSByZWNvcmQgLSB0aGlzIGlzIGRvY3VtZW50ZWQKQEAgLTE5NSw3ICsxOTQsNyBAQAogCiAgICAgaWYgKCFNRl9NZXRhUGFyYW0wKGRjLCBNRVRBX0VPRikpCiAgICAgewotICAgICAgICBEZWxldGVEQzMyKCBoZGMgKTsKKyAgICAgICAgTUZEUlZfRGVsZXRlREMoIGRjICk7CiAJcmV0dXJuIDA7CiAgICAgfQkKIApAQCAtMjA1LDEzICsyMDQsMTMgQEAKIAlwaHlzRGV2LT5taC0+bXROb1BhcmFtZXRlcnMgPSAwOwogICAgICAgICBpZiAoX2xsc2VlazMyKGhGaWxlLCAwTCwgMCkgPT0gSEZJTEVfRVJST1IzMikKICAgICAgICAgewotICAgICAgICAgICAgRGVsZXRlREMzMiggaGRjICk7CisgICAgICAgICAgICBNRkRSVl9EZWxldGVEQyggZGMgKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIGlmIChfbHdyaXRlMzIoIGhGaWxlLCAoTFBTVFIpcGh5c0Rldi0+bWgsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcGh5c0Rldi0+bWgpKSA9PSBIRklMRV9FUlJPUjMyKQogICAgICAgICB7Ci0gICAgICAgICAgICBEZWxldGVEQzMyKCBoZGMgKTsKKyAgICAgICAgICAgIE1GRFJWX0RlbGV0ZURDKCBkYyApOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgX2xjbG9zZTMyKGhGaWxlKTsKQEAgLTIyMyw3ICsyMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c0Rldi0+bWgtPm10U2l6ZSAqIHNpemVvZihXT1JEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQREIoKSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApOwogICAgIHBoeXNEZXYtPm1oID0gTlVMTDsgIC8qIFNvIGl0IHdvbid0IGJlIGRlbGV0ZWQgKi8KLSAgICBEZWxldGVEQzMyKCBoZGMgKTsKKyAgICBNRkRSVl9EZWxldGVEQyggZGMgKTsKICAgICByZXR1cm4gaG1mOwogfQogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9wYWludGluZy5jIGIvZ3JhcGhpY3MvcGFpbnRpbmcuYwppbmRleCAxNWNiODQxLi45YjE2OWU0IDEwMDY0NAotLS0gYS9ncmFwaGljcy9wYWludGluZy5jCisrKyBiL2dyYXBoaWNzL3BhaW50aW5nLmMKQEAgLTIsNiArMiw3IEBACiAgKiBNaXNjLiBncmFwaGljcyBvcGVyYXRpb25zCiAgKgogICogQ29weXJpZ2h0IDE5OTMsIDE5OTQgQWxleGFuZHJlIEp1bGxpYXJkCisgKiBDb3B5cmlnaHQgMTk5NyBCZXJ0aG8gQS4gU3R1bHRpZW5zCiAgKi8KIAogI2luY2x1ZGUgPG1hdGguaD4KQEAgLTIwLDE4ICsyMSwxMyBAQAogI2luY2x1ZGUgIm1ldGFmaWxlLmgiCiAjaW5jbHVkZSAic3lzY29sb3IuaCIKICNpbmNsdWRlICJwYWxldHRlLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKICNpbmNsdWRlICJjb2xvci5oIgogI2luY2x1ZGUgInJlZ2lvbi5oIgorI2luY2x1ZGUgInBhdGguaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLUJPT0wzMiBEcmF3RGlhZ0VkZ2UzMihIREMzMiBoZGMsIFJFQ1QzMiAqcmVjdCwgVUlOVDMyIGVkZ2UsIFVJTlQzMiBmbGFncyk7Ci1CT09MMzIgRHJhd1JlY3RFZGdlMzIoSERDMzIgaGRjLCBSRUNUMzIgKnJlY3QsIFVJTlQzMiBlZGdlLCBVSU5UMzIgZmxhZ3MpOwotQk9PTDMyIERyYXdGcmFtZUJ1dHRvbjMyKEhEQzMyIGhkYywgTFBSRUNUMzIgcmMsIFVJTlQzMiB1U3RhdGUpOwotQk9PTDMyIERyYXdGcmFtZUNhcHRpb24zMihIREMzMiBoZGMsIExQUkVDVDMyIHJjLCBVSU5UMzIgdVN0YXRlKTsKLUJPT0wzMiBEcmF3RnJhbWVNZW51MzIoSERDMzIgaGRjLCBMUFJFQ1QzMiByYywgVUlOVDMyIHVTdGF0ZSk7Ci1CT09MMzIgRHJhd0ZyYW1lU2Nyb2xsMzIoSERDMzIgaGRjLCBMUFJFQ1QzMiByYywgVUlOVDMyIHVTdGF0ZSk7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIExpbmVUbzE2ICAgIChHREkuMTkpCiAgKi8KQEAgLTQ4LDYgKzQ0LDEwIEBACiB7CiAgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKIAorICAgIGlmKGRjICYmIFBBVEhfSXNQYXRoT3BlbihkYy0+dy5wYXRoKSkKKyAgICAgICAgaWYoIVBBVEhfTGluZVRvKGhkYywgeCwgeSkpCisJICAgcmV0dXJuIEZBTFNFOworICAgIAogICAgIHJldHVybiBkYyAmJiBkYy0+ZnVuY3MtPnBMaW5lVG8gJiYKICAgICAJICAgZGMtPmZ1bmNzLT5wTGluZVRvKGRjLHgseSk7CiB9CkBAIC04Nyw2ICs4NywxMCBAQAogewogICAgIERDICogZGMgPSBEQ19HZXREQ1B0ciggaGRjICk7CiAgIAorICAgIGlmKGRjICYmIFBBVEhfSXNQYXRoT3BlbihkYy0+dy5wYXRoKSkKKyAgICAgICAgaWYoIVBBVEhfTW92ZVRvKGhkYykpCisJICAgIHJldHVybiBGQUxTRTsKKwogICAgIHJldHVybiBkYyAmJiBkYy0+ZnVuY3MtPnBNb3ZlVG9FeCAmJgogICAgIAkgICBkYy0+ZnVuY3MtPnBNb3ZlVG9FeChkYyx4LHkscHQpOwogfQpAQCAtNjgwLDcgKzY4NCw3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIERyYXdGcmFtZUNvbnRyb2wzMiAgKFVTRVIzMi4xNTIpCisgKiAgICAgICAgICBEcmF3QW5pbWF0ZWRSZWN0czMyICAoVVNFUjMyLjE1MykKICAqLwogQk9PTDMyIFdJTkFQSSBEcmF3QW5pbWF0ZWRSZWN0czMyKCBIV05EMzIgaHduZCwgaW50IGlkQW5pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMUFJFQ1QzMiBscHJjRnJvbSwKQEAgLTY5MSwxMyArNjk1LDIzOCBAQAogICAgIHJldHVybiBUUlVFOwogfQogCi1CT09MMzIgV0lOQVBJIERyYXdTdGF0ZTMyQSgKLQlIREMzMiBoZGMsSEJSVVNIMzIgaGJydXNoLERSQVdTVEFURVBST0MgZHJhd3N0YXRlcHJvYywKLQlMUEFSQU0gbHBhcmFtLFdQQVJBTTMyIHdwYXJhbSxJTlQzMiB4LElOVDMyIHksSU5UMzIgeixJTlQzMiBhLFVJTlQzMiBiCi0pIHsKLQlmcHJpbnRmKHN0ZGVyciwiRHJhd1N0YXRlQSgleCwleCwlcCwweCUwOGx4LDB4JTA4eCwlZCwlZCwlZCwlZCwlZCksc3R1YlxuIiwKLQkJaGRjLGhicnVzaCxkcmF3c3RhdGVwcm9jLGxwYXJhbSx3cGFyYW0seCx5LHosYSxiCi0JKTsKLQlyZXR1cm4gVFJVRTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIFBBSU5USU5HX0RyYXdTdGF0ZUphbQorICoKKyAqIEphbXMgaW4gdGhlIHJlcXVlc3RlZCB0eXBlIGluIHRoZSBkYworICovCitzdGF0aWMgQk9PTDMyIFBBSU5USU5HX0RyYXdTdGF0ZUphbShIREMzMiBoZGMsIFVJTlQzMiBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUkFXU1RBVEVQUk9DMzIgZnVuYywgTFBBUkFNIGxwLCBXUEFSQU0zMiB3cCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJFQ1QzMiByYywgVUlOVDMyIGR0ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgdW5pY29kZSwgQk9PTDMyIF8zMmJpdCkKK3sKKyAgICBIREMzMiBtZW1kYzsKKyAgICBIQklUTUFQMzIgaGJtc2F2ZTsKKyAgICBCT09MMzIgcmV0dmFsOworICAgIElOVDMyIGN4ID0gcmMtPnJpZ2h0IC0gcmMtPmxlZnQ7CisgICAgSU5UMzIgY3kgPSByYy0+Ym90dG9tIC0gcmMtPnRvcDsKKyAgICAKKyAgICBzd2l0Y2gob3Bjb2RlKQorICAgIHsKKyAgICBjYXNlIERTVF9URVhUOgorICAgIGNhc2UgRFNUX1BSRUZJWFRFWFQ6CisgICAgICAgIGlmKHVuaWNvZGUpCisgICAgICAgICAgICByZXR1cm4gRHJhd1RleHQzMlcoaGRjLCAoTFBXU1RSKWxwLCAoSU5UMzIpd3AsIHJjLCBkdGZsYWdzKTsKKyAgICAgICAgZWxzZSBpZihfMzJiaXQpCisgICAgICAgICAgICByZXR1cm4gRHJhd1RleHQzMkEoaGRjLCAoTFBTVFIpbHAsIChJTlQzMil3cCwgcmMsIGR0ZmxhZ3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gRHJhd1RleHQzMkEoaGRjLCAoTFBTVFIpUFRSX1NFR19UT19MSU4obHApLCAoSU5UMzIpd3AsIHJjLCBkdGZsYWdzKTsKKworICAgIGNhc2UgRFNUX0lDT046CisgICAgICAgIHJldHVybiBEcmF3SWNvbjMyKGhkYywgcmMtPmxlZnQsIHJjLT50b3AsIChISUNPTjMyKWxwKTsKKworICAgIGNhc2UgRFNUX0JJVE1BUDoKKyAgICAgICAgbWVtZGMgPSBDcmVhdGVDb21wYXRpYmxlREMzMihoZGMpOworICAgICAgICBpZighbWVtZGMpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaGJtc2F2ZSA9IChIQklUTUFQMzIpU2VsZWN0T2JqZWN0MzIobWVtZGMsIChIQklUTUFQMzIpbHApOworICAgICAgICBpZighaGJtc2F2ZSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbGV0ZURDMzIobWVtZGMpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IEJpdEJsdDMyKGhkYywgcmMtPmxlZnQsIHJjLT50b3AsIGN4LCBjeSwgbWVtZGMsIDAsIDAsIFNSQ0NPUFkpOworICAgICAgICBTZWxlY3RPYmplY3QzMihtZW1kYywgaGJtc2F2ZSk7CisgICAgICAgIERlbGV0ZURDMzIobWVtZGMpOworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgCisgICAgY2FzZSBEU1RfQ09NUExFWDoKKyAgICAgICAgaWYoZnVuYykKKyAgICAgICAgICAgIGlmKF8zMmJpdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuYyhoZGMsIGxwLCB3cCwgY3gsIGN5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gKEJPT0wzMikoKERSQVdTVEFURVBST0MxNilmdW5jKSgoSERDMTYpaGRjLCAoTFBBUkFNKWxwLCAoV1BBUkFNMTYpd3AsIChJTlQxNiljeCwgKElOVDE2KWN5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIFBBSU5USU5HX0RyYXdTdGF0ZTMyKCkKKyAqLworc3RhdGljIEJPT0wzMiBQQUlOVElOR19EcmF3U3RhdGUzMihIREMzMiBoZGMsIEhCUlVTSDMyIGhiciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSQVdTVEFURVBST0MzMiBmdW5jLCBMUEFSQU0gbHAsIFdQQVJBTTMyIHdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB4LCBJTlQzMiB5LCBJTlQzMiBjeCwgSU5UMzIgY3ksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgZmxhZ3MsIEJPT0wzMiB1bmljb2RlLCBCT09MMzIgXzMyYml0KQoreworICAgIEhCSVRNQVAzMiBoYm0sIGhibXNhdmU7CisgICAgSEZPTlQzMiBoZnNhdmU7CisgICAgSEJSVVNIMzIgaGJzYXZlOworICAgIEhEQzMyIG1lbWRjOworICAgIFJFQ1QzMiByYzsKKyAgICBVSU5UMzIgZHRmbGFncyA9IERUX05PQ0xJUDsKKyAgICBDT0xPUlJFRiBmZywgYmc7CisgICAgVUlOVDMyIG9wY29kZSA9IGZsYWdzICYgMHhmOworICAgIElOVDMyIGxlbiA9IHdwOworICAgIEJPT0wzMiByZXR2YWwsIHRtcDsKKworICAgIGlmKChvcGNvZGUgPT0gRFNUX1RFWFQgfHwgb3Bjb2RlID09IERTVF9QUkVGSVhURVhUKSAmJiAhbGVuKSAgICAvKiBUaGUgc3RyaW5nIGlzICdcMCcgdGVybWluYXRlZCAqLworICAgIHsKKyAgICAgICAgaWYodW5pY29kZSkKKyAgICAgICAgICAgIGxlbiA9IGxzdHJsZW4zMlcoKExQV1NUUilscCk7CisgICAgICAgIGVsc2UgaWYoXzMyYml0KQorICAgICAgICAgICAgbGVuID0gbHN0cmxlbjMyQSgoTFBTVFIpbHApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsZW4gPSBsc3RybGVuMzJBKChMUFNUUilQVFJfU0VHX1RPX0xJTihscCkpOworICAgIH0KKworICAgIC8qIEZpbmQgb3V0IHdoYXQgc2l6ZSB0aGUgaW1hZ2UgaGFzIGlmIG5vdCBnaXZlbiBieSBjYWxsZXIgKi8KKyAgICBpZighY3ggfHwgIWN5KQorICAgIHsKKyAgICAgICAgU0laRTMyIHM7CisgICAgICAgIENVUlNPUklDT05JTkZPICppY2k7CisgICAgICAgIEJJVE1BUE9CSiAqYm1wOworCisgICAgICAgIHN3aXRjaChvcGNvZGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBEU1RfVEVYVDoKKyAgICAgICAgY2FzZSBEU1RfUFJFRklYVEVYVDoKKyAgICAgICAgICAgIGlmKHVuaWNvZGUpCisgICAgICAgICAgICAgICAgcmV0dmFsID0gR2V0VGV4dEV4dGVudFBvaW50MzJXKGhkYywgKExQV1NUUilscCwgbGVuLCAmcyk7CisgICAgICAgICAgICBlbHNlIGlmKF8zMmJpdCkKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBHZXRUZXh0RXh0ZW50UG9pbnQzMkEoaGRjLCAoTFBTVFIpbHAsIGxlbiwgJnMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHZhbCA9IEdldFRleHRFeHRlbnRQb2ludDMyQShoZGMsIFBUUl9TRUdfVE9fTElOKGxwKSwgbGVuLCAmcyk7CisgICAgICAgICAgICBpZighcmV0dmFsKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIAorICAgICAgICBjYXNlIERTVF9JQ09OOgorICAgICAgICAgICAgaWNpID0gKENVUlNPUklDT05JTkZPICopR2xvYmFsTG9jazE2KChIR0xPQkFMMTYpbHApOworICAgICAgICAgICAgaWYoIWljaSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcy5jeCA9IGljaS0+bldpZHRoOworICAgICAgICAgICAgcy5jeSA9IGljaS0+bkhlaWdodDsKKyAgICAgICAgICAgIEdsb2JhbFVubG9jazE2KChIR0xPQkFMMTYpbHApOworICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgCisKKyAgICAgICAgY2FzZSBEU1RfQklUTUFQOgorICAgICAgICAgICAgYm1wID0gKEJJVE1BUE9CSiAqKUdESV9HZXRPYmpQdHIoKEhCSVRNQVAxNilscCwgQklUTUFQX01BR0lDKTsKKyAgICAgICAgICAgIGlmKCFibXApIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIHMuY3ggPSBibXAtPmJpdG1hcC5ibVdpZHRoOworICAgICAgICAgICAgcy5jeSA9IGJtcC0+Yml0bWFwLmJtSGVpZ2h0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBEU1RfQ09NUExFWDogLyogY3ggYW5kIGN5IG11c3QgYmUgc2V0IGluIHRoaXMgbW9kZSAqLworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCX0KKwkgICAgICAgICAgICAKKyAgICAgICAgaWYoIWN4KSBjeCA9IHMuY3g7CisgICAgICAgIGlmKCFjeSkgY3kgPSBzLmN5OworICAgIH0KKworICAgIHJjLmxlZnQgICA9IHg7CisgICAgcmMudG9wICAgID0geTsKKyAgICByYy5yaWdodCAgPSB4ICsgY3g7CisgICAgcmMuYm90dG9tID0geSArIGN5OworCisgICAgaWYoZmxhZ3MgJiBEU1NfUklHSFQpICAgIC8qIFRoaXMgb25lIGlzIG5vdCBkb2N1bWVudGVkIGluIHRoZSB3aW4zMi5obHAgZmlsZSAqLworICAgICAgICBkdGZsYWdzIHw9IERUX1JJR0hUOworICAgIGlmKG9wY29kZSA9PSBEU1RfVEVYVCkKKyAgICAgICAgZHRmbGFncyB8PSBEVF9OT1BSRUZJWDsKKworICAgIC8qIEZvciBEU1NfTk9STUFMIHdlIGp1c3QgamFtIGluIHRoZSBpbWFnZSBhbmQgcmV0dXJuICovCisgICAgaWYoKGZsYWdzICYgMHg3ZmYwKSA9PSBEU1NfTk9STUFMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBBSU5USU5HX0RyYXdTdGF0ZUphbShoZGMsIG9wY29kZSwgZnVuYywgbHAsIGxlbiwgJnJjLCBkdGZsYWdzLCB1bmljb2RlLCBfMzJiaXQpOworICAgIH0KKworICAgIC8qIEZvciBhbGwgb3RoZXIgc3RhdGVzIHdlIG5lZWQgdG8gY29udmVydCB0aGUgaW1hZ2UgdG8gQi9XIGluIGEgbG9jYWwgYml0bWFwICovCisgICAgLyogYmVmb3JlIGl0IGlzIGRpc3BsYXllZCAqLworICAgIGZnID0gU2V0VGV4dENvbG9yMzIoaGRjLCBSR0IoMCwgMCwgMCkpOworICAgIGJnID0gU2V0QmtDb2xvcjMyKGhkYywgUkdCKDI1NSwgMjU1LCAyNTUpKTsKKyAgICBoYm0gPSBOVUxMOyBoYm1zYXZlID0gTlVMTDsgbWVtZGMgPSBOVUxMOyBtZW1kYyA9IE5VTEw7IGhic2F2ZSA9IE5VTEw7CisgICAgcmV0dmFsID0gRkFMU0U7IC8qIGFzc3VtZSBmYWlsdXJlICovCisgICAgCisgICAgLyogRnJvbSBoZXJlIG9uIHdlIG11c3QgdXNlICJnb3RvIGNsZWFudXAiIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcgKi8KKyAgICBoYm0gICAgID0gQ3JlYXRlQml0bWFwMzIoY3gsIGN5LCAxLCAxLCBOVUxMKTsKKyAgICBpZighaGJtKSBnb3RvIGNsZWFudXA7CisgICAgbWVtZGMgICA9IENyZWF0ZUNvbXBhdGlibGVEQzMyKGhkYyk7CisgICAgaWYoIW1lbWRjKSBnb3RvIGNsZWFudXA7CisgICAgaGJtc2F2ZSA9IChIQklUTUFQMzIpU2VsZWN0T2JqZWN0MzIobWVtZGMsIGhibSk7CisgICAgaWYoIWhibXNhdmUpIGdvdG8gY2xlYW51cDsKKyAgICByYy5sZWZ0ID0gcmMudG9wID0gMDsKKyAgICByYy5yaWdodCA9IGN4OworICAgIHJjLmJvdHRvbSA9IGN5OworICAgIGlmKCFGaWxsUmVjdDMyKG1lbWRjLCAmcmMsIChIQlJVU0gzMilHZXRTdG9ja09iamVjdDMyKFdISVRFX0JSVVNIKSkpIGdvdG8gY2xlYW51cDsKKyAgICBTZXRCa0NvbG9yMzIobWVtZGMsIFJHQigyNTUsIDI1NSwgMjU1KSk7CisgICAgU2V0VGV4dENvbG9yMzIobWVtZGMsIFJHQigwLCAwLCAwKSk7CisgICAgaGZzYXZlICA9IChIRk9OVDMyKVNlbGVjdE9iamVjdDMyKG1lbWRjLCBHZXRDdXJyZW50T2JqZWN0KGhkYywgT0JKX0ZPTlQpKTsKKyAgICBpZighaGZzYXZlICYmIChvcGNvZGUgPT0gRFNUX1RFWFQgfHwgb3Bjb2RlID09IERTVF9QUkVGSVhURVhUKSkgZ290byBjbGVhbnVwOworICAgIHRtcCA9IFBBSU5USU5HX0RyYXdTdGF0ZUphbShtZW1kYywgb3Bjb2RlLCBmdW5jLCBscCwgbGVuLCAmcmMsIGR0ZmxhZ3MsIHVuaWNvZGUsIF8zMmJpdCk7CisgICAgaWYoaGZzYXZlKSBTZWxlY3RPYmplY3QzMihtZW1kYywgaGZzYXZlKTsKKyAgICBpZighdG1wKSBnb3RvIGNsZWFudXA7CisgICAgCisgICAgLyogVGhlc2Ugc3RhdGVzIGNhdXNlIHRoZSBpbWFnZSB0byBiZSBkaXRoZXJlZCAqLworICAgIGlmKGZsYWdzICYgKERTU19VTklPTnxEU1NfRElTQUJMRUQpKQorICAgIHsKKyAgICAgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKG1lbWRjLCBDQUNIRV9HZXRQYXR0ZXJuNTVBQUJydXNoKCkpOworICAgICAgICBpZighaGJzYXZlKSBnb3RvIGNsZWFudXA7CisgICAgICAgIHRtcCA9IFBhdEJsdDMyKG1lbWRjLCAwLCAwLCBjeCwgY3ksIDB4MDBGQTAwODkpOworICAgICAgICBpZihoYnNhdmUpIFNlbGVjdE9iamVjdDMyKG1lbWRjLCBoYnNhdmUpOworICAgICAgICBpZighdG1wKSBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGhkYywgaGJyID8gaGJyIDogR2V0U3RvY2tPYmplY3QzMihXSElURV9CUlVTSCkpOworICAgIGlmKCFoYnNhdmUpIGdvdG8gY2xlYW51cDsKKyAgICAKKyAgICBpZighQml0Qmx0MzIoaGRjLCB4LCB5LCBjeCwgY3ksIG1lbWRjLCAwLCAwLCAweDAwQjgwNzRBKSkgZ290byBjbGVhbnVwOworICAgIAorICAgIC8qIERTU19ERUZBVUxUIG1ha2VzIHRoZSBpbWFnZSBib2xkZmFjZSAqLworICAgIGlmKGZsYWdzICYgRFNTX0RFRkFVTFQpCisgICAgeworICAgICAgICBpZighQml0Qmx0MzIoaGRjLCB4KzEsIHksIGN4LCBjeSwgbWVtZGMsIDAsIDAsIDB4MDBCODA3NEEpKSBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgcmV0dmFsID0gVFJVRTsgLyogV2Ugc3VjY2VlZGVkICovCisgICAgCitjbGVhbnVwOiAgICAKKyAgICBTZXRUZXh0Q29sb3IzMihoZGMsIGZnKTsKKyAgICBTZXRCa0NvbG9yMzIoaGRjLCBiZyk7CisKKyAgICBpZihoYnNhdmUpICBTZWxlY3RPYmplY3QzMihoZGMsIGhic2F2ZSk7CisgICAgaWYoaGJtc2F2ZSkgU2VsZWN0T2JqZWN0MzIobWVtZGMsIGhibXNhdmUpOworICAgIGlmKGhibSkgICAgIERlbGV0ZU9iamVjdDMyKGhibSk7CisgICAgaWYobWVtZGMpICAgRGVsZXRlREMzMihtZW1kYyk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICBEcmF3U3RhdGUzMkEoKSAgIChVU0VSMzIuMTYyKQorICovCitCT09MMzIgV0lOQVBJIERyYXdTdGF0ZTMyQShIREMzMiBoZGMsIEhCUlVTSDMyIGhiciwKKyAgICAgICAgICAgICAgICAgICBEUkFXU1RBVEVQUk9DMzIgZnVuYywgTFBBUkFNIGxkYXRhLCBXUEFSQU0zMiB3ZGF0YSwKKyAgICAgICAgICAgICAgICAgICBJTlQzMiB4LCBJTlQzMiB5LCBJTlQzMiBjeCwgSU5UMzIgY3ksIFVJTlQzMiBmbGFncykKK3sKKyAgICByZXR1cm4gUEFJTlRJTkdfRHJhd1N0YXRlMzIoaGRjLCBoYnIsIGZ1bmMsIGxkYXRhLCB3ZGF0YSwgeCwgeSwgY3gsIGN5LCBmbGFncywgRkFMU0UsIFRSVUUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICBEcmF3U3RhdGUzMlcoKSAgIChVU0VSMzIuMTYzKQorICovCitCT09MMzIgV0lOQVBJIERyYXdTdGF0ZTMyVyhIREMzMiBoZGMsIEhCUlVTSDMyIGhiciwKKyAgICAgICAgICAgICAgICAgICBEUkFXU1RBVEVQUk9DMzIgZnVuYywgTFBBUkFNIGxkYXRhLCBXUEFSQU0zMiB3ZGF0YSwKKyAgICAgICAgICAgICAgICAgICBJTlQzMiB4LCBJTlQzMiB5LCBJTlQzMiBjeCwgSU5UMzIgY3ksIFVJTlQzMiBmbGFncykKK3sKKyAgICByZXR1cm4gUEFJTlRJTkdfRHJhd1N0YXRlMzIoaGRjLCBoYnIsIGZ1bmMsIGxkYXRhLCB3ZGF0YSwgeCwgeSwgY3gsIGN5LCBmbGFncywgVFJVRSwgVFJVRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIERyYXdTdGF0ZTE2KCkgICAoVVNFUi40NDkpCisgKi8KK0JPT0wxNiBXSU5BUEkgRHJhd1N0YXRlMTYoSERDMTYgaGRjLCBIQlJVU0gxNiBoYnIsCisgICAgICAgICAgICAgICAgICAgRFJBV1NUQVRFUFJPQzE2IGZ1bmMsIExQQVJBTSBsZGF0YSwgV1BBUkFNMTYgd2RhdGEsCisgICAgICAgICAgICAgICAgICAgSU5UMTYgeCwgSU5UMTYgeSwgSU5UMTYgY3gsIElOVDE2IGN5LCBVSU5UMTYgZmxhZ3MpCit7CisgICAgcmV0dXJuIFBBSU5USU5HX0RyYXdTdGF0ZTMyKGhkYywgaGJyLCAoRFJBV1NUQVRFUFJPQzMyKWZ1bmMsIGxkYXRhLCB3ZGF0YSwgeCwgeSwgY3gsIGN5LCBmbGFncywgRkFMU0UsIEZBTFNFKTsKK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3BhdGguYyBiL2dyYXBoaWNzL3BhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU0MDEzCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvcGF0aC5jCkBAIC0wLDAgKzEsNzA0IEBACisvKgorICogR3JhcGhpY3MgcGF0aHMgKEJlZ2luUGF0aCwgRW5kUGF0aCBldGMuKQorICoKKyAqIENvcHlyaWdodCAxOTk3IE1hcnRpbiBCb2VobWUKKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2luZXJyb3IuaCIKKworI2luY2x1ZGUgImRjLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJwYXRoLmgiCisKKy8qIE5vdGVzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBkeW5hbWljYWxseSByZXNpemFibGUgYXJyYXlzIG9mIHBvaW50cyBhbmQKKyAqIGZsYWdzLiBJIGRpdGhlcmVkIGZvciBhIGJpdCBiZWZvcmUgZGVjaWRpbmcgb24gdGhpcyBpbXBsZW1lbnRhdGlvbiwgYW5kCisgKiBJIGhhZCBldmVuIGRvbmUgYSBiaXQgb2Ygd29yayBvbiBhIGxpbmtlZCBsaXN0IHZlcnNpb24gYmVmb3JlIHN3aXRjaGluZworICogdG8gYXJyYXlzLiBJdCdzIGEgYml0IG9mIGEgdHJhZGVvZmYuIFdoZW4geW91IHVzZSBsaW5rZWQgbGlzdHMsIHRoZQorICogaW1wbGVtZW50YXRpb24gb2YgRmxhdHRlblBhdGggaXMgZWFzaWVyLCBiZWNhdXNlIHlvdSBjYW4gcmlwIHRoZQorICogUFRfQkVaSUVSVE8gZW50cmllcyBvdXQgb2YgdGhlIG1pZGRsZSBvZiB0aGUgbGlzdCBhbmQgbGluayB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgUFRfTElORVRPIGVudHJpZXMgaW4uIEhvd2V2ZXIsIHdoZW4geW91IHVzZSBhcnJheXMsCisgKiBQYXRoVG9SZWdpb24gYmVjb21lcyBlYXNpZXIsIHNpbmNlIHlvdSBjYW4gZXNzZW50aWFsbHkganVzdCBwYXNzIHlvdXIgYXJyYXkKKyAqIG9mIHBvaW50cyB0byBDcmVhdGVQb2x5UG9seWdvblJnbi4gQWxzbywgaWYgSSdkIHVzZWQgbGlua2VkIGxpc3RzLCBJIHdvdWxkCisgKiBoYXZlIGhhZCB0aGUgZXh0cmEgZWZmb3J0IG9mIGNyZWF0aW5nIGEgY2h1bmstYmFzZWQgYWxsb2NhdGlvbiBzY2hlbWUKKyAqIGluIG9yZGVyIHRvIHVzZSBtZW1vcnkgZWZmZWN0aXZlbHkuIFRoYXQncyB3aHkgSSBmaW5hbGx5IGRlY2lkZWQgdG8gdXNlCisgKiBhcnJheXMuIE5vdGUgYnkgdGhlIHdheSB0aGF0IHRoZSBhcnJheSBiYXNlZCBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIHNhbWUKKyAqIGxpbmVhciB0aW1lIGNvbXBsZXhpdHkgdGhhdCBsaW5rZWQgbGlzdHMgd291bGQgaGF2ZSBzaW5jZSB0aGUgYXJyYXlzIGdyb3cKKyAqIGV4cG9uZW50aWFsbHkuCisgKgorICogVGhlIHBvaW50cyBhcmUgc3RvcmVkIGluIHRoZSBwYXRoIGluIGRldmljZSBjb29yZGluYXRlcy4gVGhpcyBpcworICogY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgV2luZG93cyBkb2VzIHRoaW5ncyAoZm9yIGluc3RhbmNlLCBzZWUgdGhlIFdpbjMyCisgKiBTREsgZG9jdW1lbnRhdGlvbiBmb3IgR2V0UGF0aCkuCisgKgorICogVGhlIHdvcmQgInN0cm9rZSIgYXBwZWFycyBpbiBzZXZlcmFsIHBsYWNlcyAoZS5nLiBpbiB0aGUgZmxhZworICogR2RpUGF0aC5uZXdTdHJva2UpLiBBIHN0cm9rZSBjb25zaXN0cyBvZiBhIFBUX01PVkVUTyBmb2xsb3dlZCBieSBvbmUgb3IKKyAqIG1vcmUgUFRfTElORVRPcyBvciBQVF9CRVpJRVJUT3MsIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIG5leHQKKyAqIFBUX01PVkVUTy4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBkZWZpbml0aW9uIG9mIGEgZmlndXJlOworICogYSBmaWd1cmUgY2FuIGNvbnRhaW4gc2V2ZXJhbCBzdHJva2VzLgorICoKKyAqIEkgbW9kaWZpZWQgdGhlIGRyYXdpbmcgZnVuY3Rpb25zIChNb3ZlVG8sIExpbmVUbyBldGMuKSB0byB0ZXN0IHdoZXRoZXIKKyAqIHRoZSBwYXRoIGlzIG9wZW4gYW5kIHRvIGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gaW4gcGF0aC5jIGlmIHRoaXMKKyAqIGlzIHRoZSBjYXNlLiBBIG1vcmUgZWxlZ2FudCBhcHByb2FjaCB3b3VsZCBiZSB0byBtb2RpZnkgdGhlIGZ1bmN0aW9uCisgKiBwb2ludGVycyBpbiB0aGUgRENfRlVOQ1RJT05TIHN0cnVjdHVyZTsgaG93ZXZlciwgdGhpcyB3b3VsZCBiZSBhIGxvdCBtb3JlCisgKiBjb21wbGV4LiBBbHNvLCB0aGUgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gY2F1c2VkIGJ5IG15IGFwcHJvYWNoIGluIHRoZQorICogY2FzZSB3aGVyZSBubyBwYXRoIGlzIG9wZW4gaXMgc28gc21hbGwgdGhhdCBpdCBjYW5ub3QgYmUgbWVhc3VyZWQuCisgKgorICogTWFydGluIEJvZWhtZQorICovCisKKy8qIEZJWE1FOiBBIGxvdCBvZiBzdHVmZiBpc24ndCBpbXBsZW1lbnRlZCB5ZXQuIFRoZXJlIGlzIG11Y2ggbW9yZSB0byBjb21lLiAqLworCisjZGVmaW5lIE5VTV9FTlRSSUVTX0lOSVRJQUwgMTYgIC8qIEluaXRpYWwgc2l6ZSBvZiBwb2ludHMgLyBmbGFncyBhcnJheXMgICovCisjZGVmaW5lIEdST1dfRkFDVE9SX05VTUVSICAgIDIgIC8qIE51bWVyYXRvciBvZiBncm93IGZhY3RvciBmb3IgdGhlIGFycmF5ICovCisjZGVmaW5lIEdST1dfRkFDVE9SX0RFTk9NICAgIDEgIC8qIERlbm9taW5hdG9yIG9mIGdyb3cgZmFjdG9yICAgICAgICAgICAgICovCisKKworc3RhdGljIEJPT0wzMiBQQVRIX1BhdGhUb1JlZ2lvbihjb25zdCBHZGlQYXRoICpwUGF0aCwgSU5UMzIgblBvbHlGaWxsTW9kZSwKKyAgIEhSR04zMiAqcEhyZ24pOworc3RhdGljIHZvaWQgICBQQVRIX0VtcHR5UGF0aChHZGlQYXRoICpwUGF0aCk7CitzdGF0aWMgQk9PTDMyIFBBVEhfQWRkRW50cnkoR2RpUGF0aCAqcFBhdGgsIFBPSU5UMzIgcG9pbnQsIEJZVEUgZmxhZ3MpOworc3RhdGljIEJPT0wzMiBQQVRIX1Jlc2VydmVFbnRyaWVzKEdkaVBhdGggKnBQYXRoLCBJTlQzMiBudW1FbnRyaWVzKTsKK3N0YXRpYyBCT09MMzIgUEFUSF9HZXRQYXRoRnJvbUhEQyhIREMzMiBoZGMsIEdkaVBhdGggKipwcFBhdGgpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBCZWdpblBhdGgzMiAgICAoR0RJMzIuOSkKKyAqLworQk9PTDMyIFdJTkFQSSBCZWdpblBhdGgzMihIREMzMiBoZGMpCit7CisgICBHZGlQYXRoICpwUGF0aDsKKyAgIAorICAgLyogR2V0IHBvaW50ZXIgdG8gcGF0aCAqLworICAgaWYoIVBBVEhfR2V0UGF0aEZyb21IREMoaGRjLCAmcFBhdGgpKQorICAgeworICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIH0KKyAgIAorICAgLyogSWYgcGF0aCBpcyBhbHJlYWR5IG9wZW4sIGRvIG5vdGhpbmcgKi8KKyAgIGlmKHBQYXRoLT5zdGF0ZT09UEFUSF9PcGVuKQorICAgICAgcmV0dXJuIFRSVUU7CisKKyAgIC8qIE1ha2Ugc3VyZSB0aGF0IHBhdGggaXMgZW1wdHkgKi8KKyAgIFBBVEhfRW1wdHlQYXRoKHBQYXRoKTsKKworICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgZm9yIG5ldyBwYXRoICovCisgICBwUGF0aC0+bmV3U3Ryb2tlPVRSVUU7CisgICBwUGF0aC0+c3RhdGU9UEFUSF9PcGVuOworICAgCisgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFbmRQYXRoMzIgICAgKEdESTMyLjc4KQorICovCitCT09MMzIgV0lOQVBJIEVuZFBhdGgzMihIREMzMiBoZGMpCit7CisgICBHZGlQYXRoICpwUGF0aDsKKyAgIAorICAgLyogR2V0IHBvaW50ZXIgdG8gcGF0aCAqLworICAgaWYoIVBBVEhfR2V0UGF0aEZyb21IREMoaGRjLCAmcFBhdGgpKQorICAgeworICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfSEFORExFKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIH0KKyAgIAorICAgLyogQ2hlY2sgdGhhdCBwYXRoIGlzIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZCAqLworICAgaWYocFBhdGgtPnN0YXRlIT1QQVRIX09wZW4pCisgICB7CisgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FOX05PVF9DT01QTEVURSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICB9CisgICAKKyAgIC8qIFNldCBmbGFnIHRvIGluZGljYXRlIHRoYXQgcGF0aCBpcyBmaW5pc2hlZCAqLworICAgcFBhdGgtPnN0YXRlPVBBVEhfQ2xvc2VkOworICAgCisgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBBYm9ydFBhdGgzMiAgICAoR0RJMzIuMSkKKyAqLworQk9PTDMyIFdJTkFQSSBBYm9ydFBhdGgzMihIREMzMiBoZGMpCisvKiBGSVhNRTogQ2hlY2sgdGhhdCBTZXRMYXN0RXJyb3IgaXMgYmVpbmcgY2FsbGVkIGNvcnJlY3RseSAqLworeworICAgR2RpUGF0aCAqcFBhdGg7CisgICAKKyAgIC8qIEdldCBwb2ludGVyIHRvIHBhdGggKi8KKyAgIGlmKCFQQVRIX0dldFBhdGhGcm9tSERDKGhkYywgJnBQYXRoKSkKKyAgIHsKKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICB9CisgICAKKyAgIC8qIFJlbW92ZSBhbGwgZW50cmllcyBmcm9tIHRoZSBwYXRoICovCisgICBQQVRIX0VtcHR5UGF0aChwUGF0aCk7CisKKyAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENsb3NlRmlndXJlMzIgICAgKEdESTMyLjE2KQorICovCitCT09MMzIgV0lOQVBJIENsb3NlRmlndXJlMzIoSERDMzIgaGRjKQorLyogRklYTUU6IENoZWNrIHRoYXQgU2V0TGFzdEVycm9yIGlzIGJlaW5nIGNhbGxlZCBjb3JyZWN0bHkgKi8KK3sKKyAgIEdkaVBhdGggKnBQYXRoOworICAgCisgICAvKiBHZXQgcG9pbnRlciB0byBwYXRoICovCisgICBpZighUEFUSF9HZXRQYXRoRnJvbUhEQyhoZGMsICZwUGF0aCkpCisgICB7CisgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgfQorICAgCisgICAvKiBDaGVjayB0aGF0IHBhdGggaXMgb3BlbiAqLworICAgaWYocFBhdGgtPnN0YXRlIT1QQVRIX09wZW4pCisgICB7CisgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FOX05PVF9DT01QTEVURSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICB9CisgICAKKyAgIC8qIFNldCBQVF9DTE9TRUZJR1VSRSBvbiB0aGUgbGFzdCBlbnRyeSBhbmQgc3RhcnQgYSBuZXcgc3Ryb2tlICovCisgICBpZihwUGF0aC0+bnVtRW50cmllc1VzZWQpCisgICB7CisgICAgICBwUGF0aC0+cEZsYWdzW3BQYXRoLT5udW1FbnRyaWVzVXNlZC0xXXw9UFRfQ0xPU0VGSUdVUkU7CisgICAgICBwUGF0aC0+bmV3U3Ryb2tlPVRSVUU7CisgICB9CisKKyAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFBhdGgzMiAgICAoR0RJMzIuMjEwKQorICovCitJTlQzMiBXSU5BUEkgR2V0UGF0aDMyKEhEQzMyIGhkYywgTFBQT0lOVDMyIHBQb2ludHMsIExQQllURSBwVHlwZXMsCisgICBJTlQzMiBuU2l6ZSkKK3sKKyAgIEdkaVBhdGggKnBQYXRoOworICAgQk9PTDMyICB0ZW1wX2ZsYWc7CisgICAKKyAgIC8qIEdldCBwb2ludGVyIHRvIHBhdGggKi8KKyAgIGlmKCFQQVRIX0dldFBhdGhGcm9tSERDKGhkYywgJnBQYXRoKSkKKyAgIHsKKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CisgICAgICByZXR1cm4gLTE7CisgICB9CisgICAKKyAgIC8qIENoZWNrIHRoYXQgcGF0aCBpcyBjbG9zZWQgKi8KKyAgIGlmKHBQYXRoLT5zdGF0ZSE9UEFUSF9DbG9zZWQpCisgICB7CisgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FOX05PVF9DT01QTEVURSk7CisgICAgICByZXR1cm4gLTE7CisgICB9CisgICAKKyAgIGlmKG5TaXplPT0wKQorICAgICAgcmV0dXJuIHBQYXRoLT5udW1FbnRyaWVzVXNlZDsKKyAgIGVsc2UgaWYoblNpemU8cFBhdGgtPm51bUVudHJpZXNVc2VkKQorICAgeworICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyAgICAgIHJldHVybiAtMTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIG1lbWNweShwUG9pbnRzLCBwUGF0aC0+cFBvaW50cywgc2l6ZW9mKFBPSU5UMzIpKnBQYXRoLT5udW1FbnRyaWVzVXNlZCk7CisgICAgICBtZW1jcHkocFR5cGVzLCBwUGF0aC0+cEZsYWdzLCBzaXplb2YoQllURSkqcFBhdGgtPm51bUVudHJpZXNVc2VkKTsKKworICAgICAgLyogQ29udmVydCB0aGUgcG9pbnRzIHRvIGxvZ2ljYWwgY29vcmRpbmF0ZXMgKi8KKyAgICAgIHRlbXBfZmxhZz1EUHRvTFAzMihoZGMsIHBQb2ludHMsIHBQYXRoLT5udW1FbnRyaWVzVXNlZCk7CisKKyAgICAgIC8qIFNpbmNlIGhkYyBpcyB2YWxpZCwgY29udmVyc2lvbiBzaG91bGQgbmV2ZXIgZmFpbCAqLworICAgICAgYXNzZXJ0KHRlbXBfZmxhZyk7CisgICAgICAKKyAgICAgIHJldHVybiBwUGF0aC0+bnVtRW50cmllc1VzZWQ7CisgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUGF0aFRvUmVnaW9uMzIgICAgKEdESTMyLjI2MSkKKyAqLworSFJHTjMyIFdJTkFQSSBQYXRoVG9SZWdpb24zMihIREMzMiBoZGMpCisvKiBGSVhNRTogQ2hlY2sgdGhhdCBTZXRMYXN0RXJyb3IgaXMgYmVpbmcgY2FsbGVkIGNvcnJlY3RseSAqLworLyogVGhlIGRvY3VtZW50YXRpb24gZG9lcyBub3Qgc3RhdGUgdGhpcyBleHBsaWNpdGx5LCBidXQgYSB0ZXN0IHVuZGVyIFdpbmRvd3MKKyAqIHNob3dzIHRoYXQgdGhlIHJlZ2lvbiB3aGljaCBpcyByZXR1cm5lZCBzaG91bGQgYmUgaW4gZGV2aWNlIGNvb3JkaW5hdGVzLgorICovCit7CisgICBHZGlQYXRoICpwUGF0aDsKKyAgIEhSR04zMiAgaHJnblJ2YWw7CisKKyAgIC8qIEdldCBwb2ludGVyIHRvIHBhdGggKi8KKyAgIGlmKCFQQVRIX0dldFBhdGhGcm9tSERDKGhkYywgJnBQYXRoKSkKKyAgIHsKKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CisgICAgICByZXR1cm4gMDsKKyAgIH0KKyAgIAorICAgLyogQ2hlY2sgdGhhdCBwYXRoIGlzIGNsb3NlZCAqLworICAgaWYocFBhdGgtPnN0YXRlIT1QQVRIX0Nsb3NlZCkKKyAgIHsKKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQU5fTk9UX0NPTVBMRVRFKTsKKyAgICAgIHJldHVybiAwOworICAgfQorICAgCisgICAvKiBGSVhNRTogU2hvdWxkIHdlIGVtcHR5IHRoZSBwYXRoIGV2ZW4gaWYgY29udmVyc2lvbiBmYWlsZWQ/ICovCisgICBpZihQQVRIX1BhdGhUb1JlZ2lvbihwUGF0aCwgR2V0UG9seUZpbGxNb2RlMzIoaGRjKSwgJmhyZ25SdmFsKSkKKyAgICAgIFBBVEhfRW1wdHlQYXRoKHBQYXRoKTsKKyAgIGVsc2UKKyAgICAgIGhyZ25SdmFsPTA7CisKKyAgIHJldHVybiBocmduUnZhbDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBGaWxsUGF0aDMyICAgIChHREkzMi4xMDApCisgKi8KK0JPT0wzMiBXSU5BUEkgRmlsbFBhdGgzMihIREMzMiBoZGMpCisvKiBGSVhNRTogQ2hlY2sgdGhhdCBTZXRMYXN0RXJyb3IgaXMgYmVpbmcgY2FsbGVkIGNvcnJlY3RseSAqLworeworICAgR2RpUGF0aCAqcFBhdGg7CisgICBJTlQzMiAgIG1hcE1vZGU7CisgICBQT0lOVDMyIHB0Vmlld3BvcnRFeHQsIHB0Vmlld3BvcnRPcmcsIHB0V2luZG93RXh0LCBwdFdpbmRvd09yZzsKKyAgIEhSR04zMiAgaHJnbjsKKyAgIAorICAgLyogR2V0IHBvaW50ZXIgdG8gcGF0aCAqLworICAgaWYoIVBBVEhfR2V0UGF0aEZyb21IREMoaGRjLCAmcFBhdGgpKQorICAgeworICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIH0KKyAgIAorICAgLyogQ2hlY2sgdGhhdCBwYXRoIGlzIGNsb3NlZCAqLworICAgaWYocFBhdGgtPnN0YXRlIT1QQVRIX0Nsb3NlZCkKKyAgIHsKKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQU5fTk9UX0NPTVBMRVRFKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIH0KKyAgIAorICAgLyogQ29uc3RydWN0IGEgcmVnaW9uIGZyb20gdGhlIHBhdGggYW5kIGZpbGwgaXQgKi8KKyAgIGlmKFBBVEhfUGF0aFRvUmVnaW9uKHBQYXRoLCBHZXRQb2x5RmlsbE1vZGUzMihoZGMpLCAmaHJnbikpCisgICB7CisgICAgICAvKiBTaW5jZSBQYWludFJnbiBpbnRlcnByZXRzIHRoZSByZWdpb24gYXMgYmVpbmcgaW4gbG9naWNhbCBjb29yZGluYXRlcworICAgICAgICogYnV0IHRoZSBwb2ludHMgd2Ugc3RvcmUgZm9yIHRoZSBwYXRoIGFyZSBhbHJlYWR5IGluIGRldmljZQorICAgICAgICogY29vcmRpbmF0ZXMsIHdlIGhhdmUgdG8gc2V0IHRoZSBtYXBwaW5nIG1vZGUgdG8gTU1fVEVYVCB0ZW1wb3JhcmlseS4KKyAgICAgICAqLworICAgICAgIAorICAgICAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9sZCBtYXBwaW5nIG1vZGUgKi8KKyAgICAgIG1hcE1vZGU9R2V0TWFwTW9kZTMyKGhkYyk7CisgICAgICBHZXRWaWV3cG9ydEV4dEV4MzIoaGRjLCAmcHRWaWV3cG9ydEV4dCk7CisgICAgICBHZXRWaWV3cG9ydE9yZ0V4MzIoaGRjLCAmcHRWaWV3cG9ydE9yZyk7CisgICAgICBHZXRXaW5kb3dFeHRFeDMyKGhkYywgJnB0V2luZG93RXh0KTsKKyAgICAgIEdldFdpbmRvd09yZ0V4MzIoaGRjLCAmcHRXaW5kb3dPcmcpOworICAgICAgCisgICAgICAvKiBGSVhNRTogT25jZSB3b3JsZCB0cmFuc2Zvcm1zIGJlY29tZSBhdmFpbGFibGUsIHdlIHdpbGwgaGF2ZSB0byBkbworICAgICAgICogYSBHZXRXb3JsZFRyYW5zZm9ybSwgdG9vIChhbG9uZyB3aXRoIGEgU2V0V29ybGRUcmFuc2Zvcm0gbGF0ZXIgb24pLgorICAgICAgICogTW9yYWw6IFBlcmhhcHMgSSBzaG91bGQgaGF2ZSB1c2VkIFNhdmVEQyByaWdodCBhd2F5LiBUaGUgcmVhc29uIHdoeQorICAgICAgICogSSBkaWRuJ3QgaXMgdGhhdCBJIHdhbnRlZCB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgYSBmdWxsIFNhdmVEQworICAgICAgICogKGVzcGVjaWFsbHkgc2luY2UgU2F2ZURDIG5vdyBzYXZlcyB0aGUgY3VycmVudCBwYXRoIGFzIHdlbGwpLgorICAgICAgICovCisKKyAgICAgIC8qIFNldCBNTV9URVhUICovCisgICAgICBTZXRNYXBNb2RlMzIoaGRjLCBNTV9URVhUKTsKKyAgICAgIAorICAgICAgLyogUGFpbnQgdGhlIHJlZ2lvbiAqLworICAgICAgUGFpbnRSZ24zMihoZGMsIGhyZ24pOworCisgICAgICAvKiBSZXN0b3JlIHRoZSBvbGQgbWFwcGluZyBtb2RlICovCisgICAgICBTZXRNYXBNb2RlMzIoaGRjLCBtYXBNb2RlKTsKKyAgICAgIFNldFZpZXdwb3J0RXh0RXgzMihoZGMsIHB0Vmlld3BvcnRFeHQueCwgcHRWaWV3cG9ydEV4dC55LCBOVUxMKTsKKyAgICAgIFNldFZpZXdwb3J0T3JnRXgzMihoZGMsIHB0Vmlld3BvcnRPcmcueCwgcHRWaWV3cG9ydE9yZy55LCBOVUxMKTsKKyAgICAgIFNldFdpbmRvd0V4dEV4MzIoaGRjLCBwdFdpbmRvd0V4dC54LCBwdFdpbmRvd0V4dC55LCBOVUxMKTsKKyAgICAgIFNldFdpbmRvd09yZ0V4MzIoaGRjLCBwdFdpbmRvd09yZy54LCBwdFdpbmRvd09yZy55LCBOVUxMKTsKKworICAgICAgLyogRW1wdHkgdGhlIHBhdGggKi8KKyAgICAgIFBBVEhfRW1wdHlQYXRoKHBQYXRoKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgfQorICAgZWxzZQorICAgeworICAgICAgLyogRklYTUU6IFNob3VsZCB0aGUgcGF0aCBiZSBlbXB0aWVkIGV2ZW4gaWYgY29udmVyc2lvbiBmYWlsZWQ/ICovCisgICAgICAvKiBQQVRIX0VtcHR5UGF0aChwUGF0aCk7ICovCisgICAgICByZXR1cm4gRkFMU0U7CisgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2VsZWN0Q2xpcFBhdGgzMiAgICAoR0RJMzIuMjk2KQorICovCitCT09MMzIgV0lOQVBJIFNlbGVjdENsaXBQYXRoMzIoSERDMzIgaGRjLCBpbnQgaU1vZGUpCisvKiBGSVhNRTogQ2hlY2sgdGhhdCBTZXRMYXN0RXJyb3IgaXMgYmVpbmcgY2FsbGVkIGNvcnJlY3RseSAqLworeworICAgR2RpUGF0aCAqcFBhdGg7CisgICBIUkdOMzIgIGhyZ25QYXRoLCBocmduQ2xpcDsKKyAgIEJPT0wzMiAgc3VjY2VzcyA9IEZBTFNFOworICAgCisgICAvKiBHZXQgcG9pbnRlciB0byBwYXRoICovCisgICBpZighUEFUSF9HZXRQYXRoRnJvbUhEQyhoZGMsICZwUGF0aCkpCisgICB7CisgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgfQorICAgCisgICAvKiBDaGVjayB0aGF0IHBhdGggaXMgY2xvc2VkICovCisgICBpZihwUGF0aC0+c3RhdGUhPVBBVEhfQ2xvc2VkKQorICAgeworICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTl9OT1RfQ09NUExFVEUpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgfQorICAgCisgICAvKiBDb25zdHJ1Y3QgYSByZWdpb24gZnJvbSB0aGUgcGF0aCAqLworICAgaWYoUEFUSF9QYXRoVG9SZWdpb24ocFBhdGgsIEdldFBvbHlGaWxsTW9kZTMyKGhkYyksICZocmduUGF0aCkpCisgICB7CisgICAgICBocmduQ2xpcD1DcmVhdGVSZWN0UmduMzIoMCwgMCwgMCwgMCk7CisgICAgICBpZihocmduQ2xpcCE9TlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHN1Y2Nlc3M9KEdldENsaXBSZ24zMihoZGMsIGhyZ25DbGlwKSE9LTEpICYmCisJICAgIChDb21iaW5lUmduMzIoaHJnbkNsaXAsIGhyZ25DbGlwLCBocmduUGF0aCwgaU1vZGUpIT1FUlJPUikgJiYKKwkgICAgKFNlbGVjdENsaXBSZ24zMihoZGMsIGhyZ25DbGlwKSE9RVJST1IpOworCSBEZWxldGVPYmplY3QzMihocmduQ2xpcCk7CisgICAgICB9CisKKyAgICAgIERlbGV0ZU9iamVjdDMyKGhyZ25QYXRoKTsKKworICAgICAgLyogRW1wdHkgdGhlIHBhdGggKi8KKyAgICAgIGlmKHN1Y2Nlc3MpCisgICAgICAgICBQQVRIX0VtcHR5UGF0aChwUGF0aCk7CisgICAgICAvKiBGSVhNRTogU2hvdWxkIHRoaXMgZnVuY3Rpb24gZGVsZXRlIHRoZSBwYXRoIGV2ZW4gaWYgaXQgZmFpbGVkPyAqLworCisgICAgICByZXR1cm4gc3VjY2VzczsKKyAgIH0KKyAgIGVsc2UKKyAgICAgIHJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEV4cG9ydGVkIGZ1bmN0aW9ucworICovCisKKy8qIFBBVEhfSW5pdEdkaVBhdGgKKyAqCisgKiBJbml0aWFsaXplcyB0aGUgR2RpUGF0aCBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQgUEFUSF9Jbml0R2RpUGF0aChHZGlQYXRoICpwUGF0aCkKK3sKKyAgIGFzc2VydChwUGF0aCE9TlVMTCk7CisKKyAgIHBQYXRoLT5zdGF0ZT1QQVRIX051bGw7CisgICBwUGF0aC0+cFBvaW50cz1OVUxMOworICAgcFBhdGgtPnBGbGFncz1OVUxMOworICAgcFBhdGgtPm51bUVudHJpZXNVc2VkPTA7CisgICBwUGF0aC0+bnVtRW50cmllc0FsbG9jYXRlZD0wOworfQorCisvKiBQQVRIX0Rlc3Ryb3lHZGlQYXRoCisgKgorICogRGVzdHJveXMgYSBHZGlQYXRoIHN0cnVjdHVyZSAoZnJlZXMgdGhlIG1lbW9yeSBpbiB0aGUgYXJyYXlzKS4KKyAqLwordm9pZCBQQVRIX0Rlc3Ryb3lHZGlQYXRoKEdkaVBhdGggKnBQYXRoKQoreworICAgYXNzZXJ0KHBQYXRoIT1OVUxMKTsKKworICAgZnJlZShwUGF0aC0+cFBvaW50cyk7CisgICBmcmVlKHBQYXRoLT5wRmxhZ3MpOworfQorCisvKiBQQVRIX0Fzc2lnbkdkaVBhdGgKKyAqCisgKiBDb3BpZXMgdGhlIEdkaVBhdGggc3RydWN0dXJlICJwUGF0aFNyYyIgdG8gInBQYXRoRGVzdCIuIEEgZGVlcCBjb3B5IGlzCisgKiBwZXJmb3JtZWQsIGkuZS4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwUG9pbnRzIGFuZCBwRmxhZ3MgYXJyYXlzIGFyZSBjb3BpZWQsCisgKiBub3QganVzdCB0aGUgcG9pbnRlcnMuIFNpbmNlIHRoaXMgbWVhbnMgdGhhdCB0aGUgYXJyYXlzIGluIHBQYXRoRGVzdCBtYXkKKyAqIG5lZWQgdG8gYmUgcmVzaXplZCwgcFBhdGhEZXN0IHNob3VsZCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgdXNpbmcKKyAqIFBBVEhfSW5pdEdkaVBhdGggKGluIEMrKywgdGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBhbiBhc3NpZ25tZW50IG9wZXJhdG9yLAorICogbm90IGEgY29weSBjb25zdHJ1Y3RvcikuCisgKiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCwgZWxzZSBGQUxTRS4KKyAqLworQk9PTDMyIFBBVEhfQXNzaWduR2RpUGF0aChHZGlQYXRoICpwUGF0aERlc3QsIGNvbnN0IEdkaVBhdGggKnBQYXRoU3JjKQoreworICAgYXNzZXJ0KHBQYXRoRGVzdCE9TlVMTCAmJiBwUGF0aFNyYyE9TlVMTCk7CisKKyAgIC8qIE1ha2Ugc3VyZSBkZXN0aW5hdGlvbiBhcnJheXMgYXJlIGJpZyBlbm91Z2ggKi8KKyAgIGlmKCFQQVRIX1Jlc2VydmVFbnRyaWVzKHBQYXRoRGVzdCwgcFBhdGhTcmMtPm51bUVudHJpZXNVc2VkKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgLyogUGVyZm9ybSB0aGUgY29weSBvcGVyYXRpb24gKi8KKyAgIG1lbWNweShwUGF0aERlc3QtPnBQb2ludHMsIHBQYXRoU3JjLT5wUG9pbnRzLAorICAgICAgc2l6ZW9mKFBPSU5UMzIpKnBQYXRoU3JjLT5udW1FbnRyaWVzVXNlZCk7CisgICBtZW1jcHkocFBhdGhEZXN0LT5wRmxhZ3MsIHBQYXRoU3JjLT5wRmxhZ3MsCisgICAgICBzaXplb2YoSU5UMzIpKnBQYXRoU3JjLT5udW1FbnRyaWVzVXNlZCk7CisgICBwUGF0aERlc3QtPnN0YXRlPXBQYXRoU3JjLT5zdGF0ZTsKKyAgIHBQYXRoRGVzdC0+bnVtRW50cmllc1VzZWQ9cFBhdGhTcmMtPm51bUVudHJpZXNVc2VkOworICAgcFBhdGhEZXN0LT5uZXdTdHJva2U9cFBhdGhTcmMtPm5ld1N0cm9rZTsKKworICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFBBVEhfTW92ZVRvCisgKgorICogU2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgTW92ZVRvIGlzIHBlcmZvcm1lZCBvbiBhIERDIHRoYXQgaGFzIGFuCisgKiBvcGVuIHBhdGguIFRoaXMgc3RhcnRzIGEgbmV3IHN0cm9rZS4gUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIGVsc2UKKyAqIEZBTFNFLgorICovCitCT09MMzIgUEFUSF9Nb3ZlVG8oSERDMzIgaGRjKQoreworICAgR2RpUGF0aCAqcFBhdGg7CisgICAKKyAgIC8qIEdldCBwb2ludGVyIHRvIHBhdGggKi8KKyAgIGlmKCFQQVRIX0dldFBhdGhGcm9tSERDKGhkYywgJnBQYXRoKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIAorICAgLyogQ2hlY2sgdGhhdCBwYXRoIGlzIG9wZW4gKi8KKyAgIGlmKHBQYXRoLT5zdGF0ZSE9UEFUSF9PcGVuKQorICAgICAgLyogRklYTUU6IERvIHdlIGhhdmUgdG8gY2FsbCBTZXRMYXN0RXJyb3I/ICovCisgICAgICByZXR1cm4gRkFMU0U7CisKKyAgIC8qIFN0YXJ0IGEgbmV3IHN0cm9rZSAqLworICAgcFBhdGgtPm5ld1N0cm9rZT1UUlVFOworCisgICByZXR1cm4gVFJVRTsKK30KKworLyogUEFUSF9MaW5lVG8KKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBMaW5lVG8gaXMgcGVyZm9ybWVkIG9uIGEgREMgdGhhdCBoYXMgYW4KKyAqIG9wZW4gcGF0aC4gVGhpcyBhZGRzIGEgUFRfTElORVRPIGVudHJ5IHRvIHRoZSBwYXRoIChhbmQgcG9zc2libHkKKyAqIGEgUFRfTU9WRVRPIGVudHJ5LCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBMaW5lVG8gaW4gYSBzdHJva2UpLgorICogUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwsIGVsc2UgRkFMU0UuCisgKi8KK0JPT0wzMiBQQVRIX0xpbmVUbyhIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHkpCit7CisgICBHZGlQYXRoICpwUGF0aDsKKyAgIFBPSU5UMzIgcG9pbnQsIHBvaW50Q3VyUG9zOworICAgCisgICAvKiBHZXQgcG9pbnRlciB0byBwYXRoICovCisgICBpZighUEFUSF9HZXRQYXRoRnJvbUhEQyhoZGMsICZwUGF0aCkpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAKKyAgIC8qIENoZWNrIHRoYXQgcGF0aCBpcyBvcGVuICovCisgICBpZihwUGF0aC0+c3RhdGUhPVBBVEhfT3BlbikKKyAgICAgIC8qIEZJWE1FOiBEbyB3ZSBoYXZlIHRvIGNhbGwgU2V0TGFzdEVycm9yPyAqLworICAgICAgcmV0dXJuIEZBTFNFOworCisgICAvKiBDb252ZXJ0IHBvaW50IHRvIGRldmljZSBjb29yZGluYXRlcyAqLworICAgcG9pbnQueD14OworICAgcG9pbnQueT15OworICAgaWYoIUxQdG9EUDMyKGhkYywgJnBvaW50LCAxKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgIAorICAgLyogQWRkIGEgUFRfTU9WRVRPIGlmIG5lY2Vzc2FyeSAqLworICAgaWYocFBhdGgtPm5ld1N0cm9rZSkKKyAgIHsKKyAgICAgIHBQYXRoLT5uZXdTdHJva2U9RkFMU0U7CisgICAgICBpZighR2V0Q3VycmVudFBvc2l0aW9uRXgzMihoZGMsICZwb2ludEN1clBvcykgfHwKKyAgICAgICAgICFMUHRvRFAzMihoZGMsICZwb2ludEN1clBvcywgMSkpCisgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBpZighUEFUSF9BZGRFbnRyeShwUGF0aCwgcG9pbnRDdXJQb3MsIFBUX01PVkVUTykpCisgICAgICAgICByZXR1cm4gRkFMU0U7CisgICB9CisgICAKKyAgIC8qIEFkZCBhIFBUX0xJTkVUTyBlbnRyeSAqLworICAgcmV0dXJuIFBBVEhfQWRkRW50cnkocFBhdGgsIHBvaW50LCBQVF9MSU5FVE8pOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW50ZXJuYWwgZnVuY3Rpb25zCisgKi8KKworLyogUEFUSF9QYXRoVG9SZWdpb24KKyAqCisgKiBDcmVhdGVzIGEgcmVnaW9uIGZyb20gdGhlIHNwZWNpZmllZCBwYXRoIHVzaW5nIHRoZSBzcGVjaWZpZWQgcG9seWdvbgorICogZmlsbGluZyBtb2RlLiBUaGUgcGF0aCBpcyBsZWZ0IHVuY2hhbmdlZC4gQSBoYW5kbGUgdG8gdGhlIHJlZ2lvbiB0aGF0CisgKiB3YXMgY3JlYXRlZCBpcyBzdG9yZWQgaW4gKnBIcmduLiBJZiBzdWNjZXNzZnVsLCBUUlVFIGlzIHJldHVybmVkOyBpZiBhbgorICogZXJyb3Igb2NjdXJzLCBTZXRMYXN0RXJyb3IgaXMgY2FsbGVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGFuZAorICogRkFMU0UgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBCT09MMzIgUEFUSF9QYXRoVG9SZWdpb24oY29uc3QgR2RpUGF0aCAqcFBhdGgsIElOVDMyIG5Qb2x5RmlsbE1vZGUsCisgICBIUkdOMzIgKnBIcmduKQoreworICAgaW50ICAgIG51bVN0cm9rZXMsIGlTdHJva2UsIGk7CisgICBJTlQzMiAgKnBOdW1Qb2ludHNJblN0cm9rZTsKKyAgIEhSR04zMiBocmduOworCisgICBhc3NlcnQocFBhdGghPU5VTEwpOworICAgYXNzZXJ0KHBIcmduIT1OVUxMKTsKKyAgIAorICAgLyogRklYTUU6IFdoYXQgaGFwcGVucyB3aGVuIG51bWJlciBvZiBwb2ludHMgaXMgemVybz8gKi8KKyAgIAorICAgLyogRmlyc3QgcGFzczogRmluZCBvdXQgaG93IG1hbnkgc3Ryb2tlcyB0aGVyZSBhcmUgaW4gdGhlIHBhdGggKi8KKyAgIC8qIEZJWE1FOiBXZSBjb3VsZCBlbGltaW5hdGUgdGhpcyB3aXRoIHNvbWUgYm9va2tlZXBpbmcgaW4gR2RpUGF0aCAqLworICAgbnVtU3Ryb2tlcz0wOworICAgZm9yKGk9MDsgaTxwUGF0aC0+bnVtRW50cmllc1VzZWQ7IGkrKykKKyAgICAgIGlmKChwUGF0aC0+cEZsYWdzW2ldICYgflBUX0NMT1NFRklHVVJFKSA9PSBQVF9NT1ZFVE8pCisgICAgICAgICBudW1TdHJva2VzKys7CisKKyAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgbnVtYmVyLW9mLXBvaW50cy1pbi1zdHJva2UgYXJyYXkgKi8KKyAgIHBOdW1Qb2ludHNJblN0cm9rZT0oaW50ICopbWFsbG9jKHNpemVvZihpbnQpKm51bVN0cm9rZXMpOworICAgaWYoIXBOdW1Qb2ludHNJblN0cm9rZSkKKyAgIHsKKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICB9CisgICAKKyAgIC8qIFNlY29uZCBwYXNzOiByZW1lbWJlciBudW1iZXIgb2YgcG9pbnRzIGluIGVhY2ggcG9seWdvbiAqLworICAgaVN0cm9rZT0tMTsgIC8qIFdpbGwgZ2V0IGluY3JlbWVudGVkIHRvIDAgYXQgYmVnaW5uaW5nIG9mIGZpcnN0IHN0cm9rZSAqLworICAgZm9yKGk9MDsgaTxwUGF0aC0+bnVtRW50cmllc1VzZWQ7IGkrKykKKyAgIHsKKyAgICAgIC8qIElzIHRoaXMgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBzdHJva2U/ICovCisgICAgICBpZigocFBhdGgtPnBGbGFnc1tpXSAmIH5QVF9DTE9TRUZJR1VSRSkgPT0gUFRfTU9WRVRPKQorICAgICAgeworICAgICAgICAgaVN0cm9rZSsrOworCSBwTnVtUG9pbnRzSW5TdHJva2VbaVN0cm9rZV09MDsKKyAgICAgIH0KKworICAgICAgcE51bVBvaW50c0luU3Ryb2tlW2lTdHJva2VdKys7CisgICB9CisKKyAgIC8qIENyZWF0ZSBhIHJlZ2lvbiBmcm9tIHRoZSBzdHJva2VzICovCisgICBocmduPUNyZWF0ZVBvbHlQb2x5Z29uUmduMzIocFBhdGgtPnBQb2ludHMsIHBOdW1Qb2ludHNJblN0cm9rZSwKKyAgICAgIG51bVN0cm9rZXMsIG5Qb2x5RmlsbE1vZGUpOworICAgaWYoaHJnbj09TlVMTCkKKyAgIHsKKyAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICB9CisKKyAgIC8qIEZyZWUgbWVtb3J5IGZvciBudW1iZXItb2YtcG9pbnRzLWluLXN0cm9rZSBhcnJheSAqLworICAgZnJlZShwTnVtUG9pbnRzSW5TdHJva2UpOworCisgICAvKiBTdWNjZXNzISAqLworICAgKnBIcmduPWhyZ247CisgICByZXR1cm4gVFJVRTsKK30KKworLyogUEFUSF9FbXB0eVBhdGgKKyAqCisgKiBSZW1vdmVzIGFsbCBlbnRyaWVzIGZyb20gdGhlIHBhdGggYW5kIHNldHMgdGhlIHBhdGggc3RhdGUgdG8gUEFUSF9OdWxsLgorICovCitzdGF0aWMgdm9pZCBQQVRIX0VtcHR5UGF0aChHZGlQYXRoICpwUGF0aCkKK3sKKyAgIGFzc2VydChwUGF0aCE9TlVMTCk7CisKKyAgIHBQYXRoLT5zdGF0ZT1QQVRIX051bGw7CisgICBwUGF0aC0+bnVtRW50cmllc1VzZWQ9MDsKK30KKworLyogUEFUSF9BZGRFbnRyeQorICoKKyAqIEFkZHMgYW4gZW50cnkgdG8gdGhlIHBhdGguIEZvciAiZmxhZ3MiLCBwYXNzIGVpdGhlciBQVF9NT1ZFVE8sIFBUX0xJTkVUTworICogb3IgUFRfQkVaSUVSVE8sIG9wdGlvbmFsbHkgT1JlZCB3aXRoIFBUX0NMT1NFRklHVVJFLiBSZXR1cm5zIFRSVUUgaWYKKyAqIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZSAoZS5nLiBpZiBub3QgZW5vdWdoIG1lbW9yeSB3YXMgYXZhaWxhYmxlKS4KKyAqLworQk9PTDMyIFBBVEhfQWRkRW50cnkoR2RpUGF0aCAqcFBhdGgsIFBPSU5UMzIgcG9pbnQsIEJZVEUgZmxhZ3MpCit7CisgICBhc3NlcnQocFBhdGghPU5VTEwpOworICAgCisgICAvKiBDaGVjayB0aGF0IHBhdGggaXMgb3BlbiAqLworICAgaWYocFBhdGgtPnN0YXRlIT1QQVRIX09wZW4pCisgICAgICByZXR1cm4gRkFMU0U7CisgICAKKyAgIC8qIFJlc2VydmUgZW5vdWdoIG1lbW9yeSBmb3IgYW4gZXh0cmEgcGF0aCBlbnRyeSAqLworICAgaWYoIVBBVEhfUmVzZXJ2ZUVudHJpZXMocFBhdGgsIHBQYXRoLT5udW1FbnRyaWVzVXNlZCsxKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKworICAgLyogU3RvcmUgaW5mb3JtYXRpb24gaW4gcGF0aCBlbnRyeSAqLworICAgcFBhdGgtPnBQb2ludHNbcFBhdGgtPm51bUVudHJpZXNVc2VkXT1wb2ludDsKKyAgIHBQYXRoLT5wRmxhZ3NbcFBhdGgtPm51bUVudHJpZXNVc2VkXT1mbGFnczsKKworICAgLyogSW5jcmVtZW50IGVudHJ5IGNvdW50ICovCisgICBwUGF0aC0+bnVtRW50cmllc1VzZWQrKzsKKworICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIFBBVEhfUmVzZXJ2ZUVudHJpZXMKKyAqCisgKiBFbnN1cmVzIHRoYXQgYXQgbGVhc3QgIm51bUVudHJpZXMiIGVudHJpZXMgKGZvciBwb2ludHMgYW5kIGZsYWdzKSBoYXZlCisgKiBiZWVuIGFsbG9jYXRlZDsgYWxsb2NhdGVzIGxhcmdlciBhcnJheXMgYW5kIGNvcGllcyB0aGUgZXhpc3RpbmcgZW50cmllcworICogdG8gdGhvc2UgYXJyYXlzLCBpZiBuZWNlc3NhcnkuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBlbHNlIEZBTFNFLgorICovCitzdGF0aWMgQk9PTDMyIFBBVEhfUmVzZXJ2ZUVudHJpZXMoR2RpUGF0aCAqcFBhdGgsIElOVDMyIG51bUVudHJpZXMpCit7CisgICBJTlQzMiAgIG51bUVudHJpZXNUb0FsbG9jYXRlOworICAgUE9JTlQzMiAqcFBvaW50c05ldzsKKyAgIEJZVEUgICAgKnBGbGFnc05ldzsKKyAgIAorICAgYXNzZXJ0KHBQYXRoIT1OVUxMKTsKKyAgIGFzc2VydChudW1FbnRyaWVzPj0wKTsKKworICAgLyogRG8gd2UgaGF2ZSB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeT8gKi8KKyAgIGlmKG51bUVudHJpZXMgPiBwUGF0aC0+bnVtRW50cmllc0FsbG9jYXRlZCkKKyAgIHsKKyAgICAgIC8qIEZpbmQgbnVtYmVyIG9mIGVudHJpZXMgdG8gYWxsb2NhdGUuIFdlIGxldCB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkKKyAgICAgICAqIGdyb3cgZXhwb25lbnRpYWxseSwgc2luY2UgdGhhdCB3aWxsIGd1YXJhbnRlZSBsaW5lYXIgdGltZQorICAgICAgICogY29tcGxleGl0eS4gKi8KKyAgICAgIGlmKHBQYXRoLT5udW1FbnRyaWVzQWxsb2NhdGVkKQorICAgICAgeworCSBudW1FbnRyaWVzVG9BbGxvY2F0ZT1wUGF0aC0+bnVtRW50cmllc0FsbG9jYXRlZDsKKwkgd2hpbGUobnVtRW50cmllc1RvQWxsb2NhdGU8bnVtRW50cmllcykKKwkgICAgbnVtRW50cmllc1RvQWxsb2NhdGU9bnVtRW50cmllc1RvQWxsb2NhdGUqR1JPV19GQUNUT1JfTlVNRVIvCisJICAgICAgIEdST1dfRkFDVE9SX0RFTk9NOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICAgbnVtRW50cmllc1RvQWxsb2NhdGU9TlVNX0VOVFJJRVNfSU5JVElBTDsKKworICAgICAgLyogQWxsb2NhdGUgbmV3IGFycmF5cyAqLworICAgICAgcFBvaW50c05ldz0oUE9JTlQzMiAqKW1hbGxvYyhudW1FbnRyaWVzVG9BbGxvY2F0ZSAqIHNpemVvZihQT0lOVDMyKSk7CisgICAgICBpZighcFBvaW50c05ldykKKyAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIHBGbGFnc05ldz0oQllURSAqKW1hbGxvYyhudW1FbnRyaWVzVG9BbGxvY2F0ZSAqIHNpemVvZihCWVRFKSk7CisgICAgICBpZighcEZsYWdzTmV3KQorICAgICAgeworICAgICAgICAgZnJlZShwUG9pbnRzTmV3KTsKKwkgcmV0dXJuIEZBTFNFOworICAgICAgfQorCisgICAgICAvKiBDb3B5IG9sZCBhcnJheXMgdG8gbmV3IGFycmF5cyBhbmQgZGlzY2FyZCBvbGQgYXJyYXlzICovCisgICAgICBpZihwUGF0aC0+cFBvaW50cykKKyAgICAgIHsKKyAgICAgICAgIGFzc2VydChwUGF0aC0+cEZsYWdzKTsKKworCSBtZW1jcHkocFBvaW50c05ldywgcFBhdGgtPnBQb2ludHMsCisJICAgICBzaXplb2YoUE9JTlQzMikqcFBhdGgtPm51bUVudHJpZXNVc2VkKTsKKwkgbWVtY3B5KHBGbGFnc05ldywgcFBhdGgtPnBGbGFncywKKwkgICAgIHNpemVvZihCWVRFKSpwUGF0aC0+bnVtRW50cmllc1VzZWQpOworCisJIGZyZWUocFBhdGgtPnBQb2ludHMpOworCSBmcmVlKHBQYXRoLT5wRmxhZ3MpOworICAgICAgfQorICAgICAgcFBhdGgtPnBQb2ludHM9cFBvaW50c05ldzsKKyAgICAgIHBQYXRoLT5wRmxhZ3M9cEZsYWdzTmV3OworICAgICAgcFBhdGgtPm51bUVudHJpZXNBbGxvY2F0ZWQ9bnVtRW50cmllc1RvQWxsb2NhdGU7CisgICB9CisKKyAgIHJldHVybiBUUlVFOworfQorCisvKiBQQVRIX0dldFBhdGhGcm9tSERDCisgKgorICogUmV0cmlldmVzIGEgcG9pbnRlciB0byB0aGUgR2RpUGF0aCBzdHJ1Y3R1cmUgY29udGFpbmVkIGluIGFuIEhEQyBhbmQKKyAqIHBsYWNlcyBpdCBpbiAqcHBQYXRoLiBUUlVFIGlzIHJldHVybmVkIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIG90aGVyd2lzZS4KKyAqLworc3RhdGljIEJPT0wzMiBQQVRIX0dldFBhdGhGcm9tSERDKEhEQzMyIGhkYywgR2RpUGF0aCAqKnBwUGF0aCkKK3sKKyAgIERDICpwREM7CisKKyAgIHBEQz1EQ19HZXREQ1B0cihoZGMpOworICAgaWYocERDKQorICAgeworICAgICAgKnBwUGF0aD0mcERDLT53LnBhdGg7CisgICAgICByZXR1cm4gVFJVRTsKKyAgIH0KKyAgIGVsc2UKKyAgICAgIHJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2dyYXBoaWNzLmMgYi9ncmFwaGljcy93aW4xNmRydi9ncmFwaGljcy5jCmluZGV4IGVjMmE3MmUuLjI0NTI1NDIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2dyYXBoaWNzLmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvZ3JhcGhpY3MuYwpAQCAtNCw4ICs0LDExIEBACiAgKiBDb3B5cmlnaHQgMTk5NyBKb2huIEhhcnZleQogICovCiAKKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJ3aW4xNmRydi5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICAgV0lOMTZEUlZfTW92ZVRvRXgKQEAgLTU3LDkgKzYwLDkgQEAKICAgICBXSU4xNkRSVl9QREVWSUNFICpwaHlzRGV2ID0gKFdJTjE2RFJWX1BERVZJQ0UgKilkYy0+cGh5c0RldjsKICAgICBCT09MMzIgYlJldCA9IDA7CiAgICAgUE9JTlQxNiBwb2ludHNbMl07Ci0gICAgcHJpbnRmKCJJbiBXSU4xNmRydl9SZWN0YW5nbGUsIHggJWQgeSAlZCBEQ09yZ1ggJWQgeSAlZFxuIiwKKyAgICBkcHJpbnRmX3dpbjE2ZHJ2KHN0ZGRlYiwgIkluIFdJTjE2RFJWX1JlY3RhbmdsZSwgeCAlZCB5ICVkIERDT3JnWCAlZCB5ICVkXG4iLAogICAgICAgICAgICBsZWZ0LCB0b3AsIGRjLT53LkRDT3JnWCwgZGMtPncuRENPcmdZKTsKLSAgICBwcmludGYoIkluIFdJTjE2ZHJ2X1JlY3RhbmdsZSwgVlBvcnRPcmdYICVkIHkgJWRcbiIsCisgICAgZHByaW50Zl93aW4xNmRydihzdGRkZWIsICJJbiBXSU4xNkRSVl9SZWN0YW5nbGUsIFZQb3J0T3JnWCAlZCB5ICVkXG4iLAogICAgICAgICAgICBkYy0+dnBvcnRPcmdYLCBkYy0+dnBvcnRPcmdZKTsKICAgICBwb2ludHNbMF0ueCA9IFhMUFRPRFAoZGMsIGxlZnQpOwogICAgIHBvaW50c1swXS55ID0gWUxQVE9EUChkYywgdG9wKTsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYwppbmRleCA2MjgxMTg2Li5lMDBlNjM4IDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCkBAIC0zODYsOCArMzg2LDggQEAKICAgICByZXR1cm4gVFJVRTsKIH0KIAotZXh0ZXJuIEJPT0wzMiBXSU4xNkRSVl9QYXRCbHQoIHN0cnVjdCB0YWdEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgd2lkdGgsIElOVDMyIGhlaWdodCwgRFdPUkQgcm9wICkKK0JPT0wzMiBXSU4xNkRSVl9QYXRCbHQoIHN0cnVjdCB0YWdEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwKKwkJCUlOVDMyIHdpZHRoLCBJTlQzMiBoZWlnaHQsIERXT1JEIHJvcCApCiB7CiAgIAogICAgIFdJTjE2RFJWX1BERVZJQ0UgKnBoeXNEZXYgPSAoV0lOMTZEUlZfUERFVklDRSAqKWRjLT5waHlzRGV2OwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3Mvd2luZy5jIGIvZ3JhcGhpY3Mvd2luZy5jCmluZGV4IDU4YmU1NTQuLmYyYjcxZGQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3dpbmcuYworKysgYi9ncmFwaGljcy93aW5nLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogc3RhdGljIEJJVE1BUElORk9IRUFERVIgX19ibXBpV2luRyA9IHsgMCwgMSwgLTEsIDEsIDgsIEJJX1JHQiwgMSwgMCwgMCwgMCwgMCB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXRXaW5HKCkKK3N0YXRpYyB2b2lkIF9faW5pdFdpbkcodm9pZCkKIHsKICAgaWYoIF9fV2luR09LIDwgMCApCiAgIHsKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jIGIvZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmMKaW5kZXggZWM4MDMxMi4uOTM0OGQ5MSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2dyYXBoaWNzLmMKQEAgLTI1MCwxMSArMjUwLDE0IEBACiAgICAgICAgIGJvdHRvbSAtPSAod2lkdGggKyAxKSAvIDI7CiAgICAgfQogCi0gICAgaWYgKERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSkKLQlYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLQkJICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0ICsgKHdpZHRoICsgMSkgLyAyLAotCQkgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCArICh3aWR0aCArIDEpIC8gMiwKLQkJICAgICAgICByaWdodC1sZWZ0LXdpZHRoLTEsIGJvdHRvbS10b3Atd2lkdGgtMSk7CisgICAgaWYgKChyaWdodCA+IGxlZnQgKyB3aWR0aCkgJiYgKGJvdHRvbSA+IHRvcCArIHdpZHRoKSkKKyAgICB7CisgICAgICAgIGlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjICkpCisgICAgICAgICAgICBYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0ICsgKHdpZHRoICsgMSkgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCArICh3aWR0aCArIDEpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodC1sZWZ0LXdpZHRoLTEsIGJvdHRvbS10b3Atd2lkdGgtMSk7CisgICAgfQogICAgIGlmIChEQ19TZXR1cEdDRm9yUGVuKCBkYyApKQogCVhEcmF3UmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAogCQkgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3gxMWRydi9pbml0LmMgYi9ncmFwaGljcy94MTFkcnYvaW5pdC5jCmluZGV4IDZjZmQ1YTEuLmU0MTUxMDQgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3MveDExZHJ2L2luaXQuYwpAQCAtMTA4LDggKzEwOCw2IEBACiAgKi8KIEJPT0wzMiBYMTFEUlZfSW5pdCh2b2lkKQogewotICAgIGV4dGVybiBCT09MMzIgQ09MT1JfSW5pdCgpOwotCiAgICAgLyogRklYTUU6IGNvbG9ybWFwIG1hbmFnZW1lbnQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBYMTFEUlYgKi8KIAogICAgIGlmKCAhQ09MT1JfSW5pdCgpICkgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3Blbi5jIGIvZ3JhcGhpY3MveDExZHJ2L3Blbi5jCmluZGV4IDg1MTY1NjkuLjNhNDI0Y2YgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9wZW4uYworKysgYi9ncmFwaGljcy94MTFkcnYvcGVuLmMKQEAgLTEzLDYgKzEzLDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyIFBFTl9kb3RbXSAgICAgICAgPSB7IDEsMSB9OyAgICAgIC8qIC0tICAtLSAgLS0gIC0tICAtLSAgLS0gKi8KIHN0YXRpYyBjb25zdCBjaGFyIFBFTl9kYXNoZG90W10gICAgPSB7IDQsMywyLDMgfTsgIC8qIC0tLS0gICAtLSAgIC0tLS0gICAtLSAgKi8KIHN0YXRpYyBjb25zdCBjaGFyIFBFTl9kYXNoZG90ZG90W10gPSB7IDQsMiwyLDIsMiwyIH07IC8qIC0tLS0gIC0tICAtLSAgLS0tLSAgKi8KK3N0YXRpYyBjb25zdCBjaGFyIFBFTl9hbHRlcm5hdGVbXSAgPSB7IDEsMSB9OyAgICAgIC8qIEZJWE1FICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFBFTl9TZWxlY3RPYmplY3QKQEAgLTIyLDEyICsyMywxNSBAQAogICAgIEhQRU4zMiBwcmV2SGFuZGxlID0gZGMtPncuaFBlbjsKIAogICAgIGRjLT53LmhQZW4gPSBocGVuOwotICAgIGRjLT51LngucGVuLnN0eWxlID0gcGVuLT5sb2dwZW4ubG9wblN0eWxlOworICAgIGRjLT51LngucGVuLnN0eWxlID0gcGVuLT5sb2dwZW4ubG9wblN0eWxlICYgUFNfU1RZTEVfTUFTSzsKKyAgICBkYy0+dS54LnBlbi5lbmRjYXAgPSBwZW4tPmxvZ3Blbi5sb3BuU3R5bGUgJiBQU19FTkRDQVBfTUFTSzsKKyAgICBkYy0+dS54LnBlbi5saW5lam9pbiA9IHBlbi0+bG9ncGVuLmxvcG5TdHlsZSAmIFBTX0pPSU5fTUFTSzsKKwogICAgIGRjLT51LngucGVuLndpZHRoID0gcGVuLT5sb2dwZW4ubG9wbldpZHRoLnggKiBkYy0+dnBvcnRFeHRYIC8gZGMtPnduZEV4dFg7CiAgICAgaWYgKGRjLT51LngucGVuLndpZHRoIDwgMCkgZGMtPnUueC5wZW4ud2lkdGggPSAtZGMtPnUueC5wZW4ud2lkdGg7CiAgICAgaWYgKGRjLT51LngucGVuLndpZHRoID09IDEpIGRjLT51LngucGVuLndpZHRoID0gMDsgIC8qIEZhc3RlciAqLwogICAgIGRjLT51LngucGVuLnBpeGVsID0gQ09MT1JfVG9QaHlzaWNhbCggZGMsIHBlbi0+bG9ncGVuLmxvcG5Db2xvciApOyAgICAKLSAgICBzd2l0Y2gocGVuLT5sb2dwZW4ubG9wblN0eWxlKQorICAgIHN3aXRjaChwZW4tPmxvZ3Blbi5sb3BuU3R5bGUgJiBQU19TVFlMRV9NQVNLKQogICAgIHsKICAgICAgIGNhc2UgUFNfREFTSDoKIAlkYy0+dS54LnBlbi5kYXNoZXMgPSAoY2hhciAqKVBFTl9kYXNoOwpAQCAtNDUsNiArNDksMTQgQEAKIAlkYy0+dS54LnBlbi5kYXNoZXMgPSAoY2hhciAqKVBFTl9kYXNoZG90ZG90OwogCWRjLT51LngucGVuLmRhc2hfbGVuID0gNjsKIAlicmVhazsKKyAgICAgIGNhc2UgUFNfQUxURVJOQVRFOgorCS8qIEZJWE1FOiBzaG91bGQgYmUgYWx0ZXJuYXRpbmcgX3BpeGVsc18gdGhhdCBhcmUgc2V0ICovCisJZGMtPnUueC5wZW4uZGFzaGVzID0gKGNoYXIgKilQRU5fYWx0ZXJuYXRlOworCWRjLT51LngucGVuLmRhc2hfbGVuID0gMjsKKwlicmVhazsKKyAgICAgIGNhc2UgUFNfVVNFUlNUWUxFOgorCS8qIEZJWE1FICovCisJYnJlYWs7CiAgICAgfQogICAgIAogICAgIHJldHVybiBwcmV2SGFuZGxlOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3hmb250LmMgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwppbmRleCA5Yjk4OGNmLi5iZTNiYjY2IDEwMDY0NAotLS0gYS9ncmFwaGljcy94MTFkcnYveGZvbnQuYworKysgYi9ncmFwaGljcy94MTFkcnYveGZvbnQuYwpAQCAtMTcwLDEzICsxNzAsMTQgQEAKICAgIHJldHVybiBjaGVja3N1bTsKIH0KIAotc3RhdGljIFVJTlQxNiAgIF9fZ2VuZXJpY0NoZWNrU3VtKCBVSU5UMTYqIHB0ciwgaW50IHNpemUgKQorc3RhdGljIFVJTlQxNiAgIF9fZ2VuZXJpY0NoZWNrU3VtKCBjb25zdCB2b2lkICpwdHIsIGludCBzaXplICkKIHsKLSAgIFVJTlQxNgljaGVja3N1bSA9IDA7Ci0gICB1bnNpZ25lZAlpOworICAgdW5zaWduZWQgaW50IGNoZWNrc3VtID0gMDsKKyAgIGNvbnN0IGNoYXIgKnAgPSAoY29uc3QgY2hhciAqKXB0cjsKKyAgIHdoaWxlIChzaXplLS0gPiAwKQorICAgICBjaGVja3N1bSBePSAoY2hlY2tzdW0gPDwgMykgKyAoY2hlY2tzdW0gPj4gMjkpICsgKnArKzsKIAotICAgZm9yKCBpID0gMCwgc2l6ZSA+Pj0gMTsgaSA8IHNpemU7IGkrKyApIGNoZWNrc3VtIF49ICpwdHIrKzsKLSAgIHJldHVybiBjaGVja3N1bTsKKyAgIHJldHVybiBjaGVja3N1bSAmIDB4ZmZmZjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYxMyw3ICs2MTQsNyBAQAogICAgIGZpLT5kZi5kZkV4dGVybmFsTGVhZGluZyA9IChJTlQxNillbDsKIAogICAgIGZpLT5kZi5kZlBvaW50cyA9IChJTlQxNikoKChJTlQzMikoZmktPmRmLmRmUGl4SGVpZ2h0IC0gCi0JCQkJICAgICAgIGZpLT5kZi5kZkludGVybmFsTGVhZGluZykgKiA3MikgLyBmaS0+ZGYuZGZWZXJ0UmVzKTsKKwkgICAgICAgZmktPmRmLmRmSW50ZXJuYWxMZWFkaW5nKSAqIDcyICsgKGZpLT5kZi5kZlZlcnRSZXMgPj4gMSkpIC8gZmktPmRmLmRmVmVydFJlcyk7CiAKICAgICBpZiggeGZzLT5taW5fYm91bmRzLndpZHRoICE9IHhmcy0+bWF4X2JvdW5kcy53aWR0aCApCiAgICAgICAgIGZpLT5kZi5kZlBpdGNoQW5kRmFtaWx5IHw9IFRNUEZfRklYRURfUElUQ0g7IC8qIGF1IGNvbnRyYWlyZSEgKi8KQEAgLTgzMSwyNSArODMyLDI1IEBACiAgICAgfQogCiAgICAgZm9yKCB1cCA9IDA7IHJlbG9jVGFibGVbdXBdOyB1cCsrICkKLSAgICAgIGlmKCBQUk9GSUxFX0dldFdpbmVJbmlTdHJpbmcoIElOSUZvbnRTZWN0aW9uLCByZWxvY1RhYmxlW3VwXSwgIiIsIGJ1ZmZlciwgMTI4ICkgKQotICAgICAgewotCXdoaWxlKCAqYnVmZmVyICYmIGlzc3BhY2UoKmJ1ZmZlcikgKSBidWZmZXIrKzsKLQlmb3IoIGZyID0gTlVMTCwgcGZyID0gZm9udExpc3Q7IHBmcjsgcGZyID0gcGZyLT5uZXh0ICkKKwlpZiggUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCBJTklGb250U2VjdGlvbiwgcmVsb2NUYWJsZVt1cF0sICIiLCBidWZmZXIsIDEyOCApICkKIAl7Ci0JICAgICBpID0gbHN0cmxlbjMyQSggcGZyLT5yZXNvdXJjZSApOwotCSAgICAgaWYoICFsc3RybmNtcGkzMkEoIHBmci0+cmVzb3VyY2UsIGJ1ZmZlciwgaSkgKQotCSAgICAgewotCQkgaWYoIGZyICkKLQkJIHsKLQkJICAgICBmci0+bmV4dCA9IHBmci0+bmV4dDsKLQkJICAgICBwZnItPm5leHQgPSBmb250TGlzdDsKLQkJICAgICBmb250TGlzdCA9IHBmcjsKLQkJIH0KLQkJIGJyZWFrOwotCSAgICAgfQotCSAgICAgZnIgPSBwZnI7CisJICAgIHdoaWxlKCAqYnVmZmVyICYmIGlzc3BhY2UoKmJ1ZmZlcikgKSBidWZmZXIrKzsKKwkgICAgZm9yKCBmciA9IE5VTEwsIHBmciA9IGZvbnRMaXN0OyBwZnI7IHBmciA9IHBmci0+bmV4dCApCisJICAgIHsKKwkJaSA9IGxzdHJsZW4zMkEoIHBmci0+cmVzb3VyY2UgKTsKKwkJaWYoICFsc3RybmNtcGkzMkEoIHBmci0+cmVzb3VyY2UsIGJ1ZmZlciwgaSkgKQorCQl7CisJCSAgICBpZiggZnIgKQorCQkgICAgeworCQkJZnItPm5leHQgPSBwZnItPm5leHQ7CisJCQlwZnItPm5leHQgPSBmb250TGlzdDsKKwkJCWZvbnRMaXN0ID0gcGZyOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCX0KKwkJZnIgPSBwZnI7CisJICAgIH0KIAl9Ci0gICAgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA3OCw3ICsxMDc5LDcgQEAKIAkJCSAgIHBmaS0+ZGYuZGZGYWNlID0gcGZyLT5sZkZhY2VOYW1lOwogCQkJICAgcGZpLT5kZi5kZkhvcml6UmVzID0gcGZpLT5kZi5kZlZlcnRSZXMgPSByZXM7CiAJCQkgICBwZmktPmRmLmRmUG9pbnRzID0gKElOVDE2KSgoKElOVDMyKShwZmktPmRmLmRmUGl4SGVpZ2h0IC0KLQkJCQkJcGZpLT5kZi5kZkludGVybmFsTGVhZGluZykgKiA3MikgLyByZXMgKTsKKwkJCQlwZmktPmRmLmRmSW50ZXJuYWxMZWFkaW5nKSAqIDcyICsgKHJlcyA+PiAxKSkgLyByZXMgKTsKIAkJCSAgIHBmaS0+bmV4dCA9IHBmaSArIDE7CiAKIAkJCSAgIGlmKCBqID4gcGZyLT5jb3VudCApIGJyZWFrOwpAQCAtMTI0NCw5ICsxMjQ1LDEwIEBACiAKICAgICAvKiBNYWtlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIGtleSAqLwogICAgIGlmKChzdHJuY2FzZWNtcChrZXksIElOSVN1YlNlY3Rpb24sIDUpID09IDApIHx8Ci0gICAgICAgKHN0cmNhc2VjbXAoa2V5LCBJTklEZWZhdWx0KSA9PSAwKSB8fAotICAgICAgIChzdHJjYXNlY21wKGtleSwgSU5JR2xvYmFsTWV0cmljcykgPT0gMCkgfHwKLSAgICAgICAoc3RyY2FzZWNtcChrZXksIElOSVJlc29sdXRpb24pID09IDApICkgCisgICAgICAgKHN0cmNhc2VjbXAoIGtleSwgSU5JRGVmYXVsdCkgPT0gMCkgfHwKKyAgICAgICAoc3RyY2FzZWNtcCgga2V5LCBJTklEZWZhdWx0Rml4ZWQpID09IDApIHx8CisgICAgICAgKHN0cmNhc2VjbXAoIGtleSwgSU5JR2xvYmFsTWV0cmljcykgPT0gMCkgfHwKKyAgICAgICAoc3RyY2FzZWNtcCgga2V5LCBJTklSZXNvbHV0aW9uKSA9PSAwKSApIAogICAgIHsKIAkvKiBWYWxpZCBrZXk7IG1ha2Ugc3VyZSB0aGUgdmFsdWUgZG9lc24ndCBjb250YWluIGEgd2lsZGNhcmQgKi8KIAlpZihzdHJjaHIodmFsdWUsICcqJykpIHsKQEAgLTEzMzEsNyArMTMzMyw3IEBACiAjZW5kaWYKIAogICAgICBqID0gbHN0cmxlbjMyQSggeF9wYXR0ZXJuW2ldICk7Ci0gICAgIGlmKCBqICkgeF9jaGVja3N1bSBePSBfX2dlbmVyaWNDaGVja1N1bSggKFVJTlQxNiopKHhfcGF0dGVybltpXSksIGogKTsKKyAgICAgaWYoIGogKSB4X2NoZWNrc3VtIF49IF9fZ2VuZXJpY0NoZWNrU3VtKCB4X3BhdHRlcm5baV0sIGogKTsKICAgfQogICB4X2NoZWNrc3VtIHw9IFhfUEZPTlRfTUFHSUM7CiAKQEAgLTE1NTcsNyArMTU1OSw4IEBACiAKICAgIGlmKCBwbGYtPmxmQ2hhclNldCA9PSBERUZBVUxUX0NIQVJTRVQgKQogICAgewotICAgICAgIGlmKCAocGZpLT5kZi5kZkNoYXJTZXQhPSBBTlNJX0NIQVJTRVQpICYmIChwZmktPmRmLmRmQ2hhclNldCE9REVGQVVMVF9DSEFSU0VUKSApIHBlbmFsdHkgKz0gMHgyMDA7CisgICAgICAgaWYoIChwZmktPmRmLmRmQ2hhclNldCE9IEFOU0lfQ0hBUlNFVCkgJiYgKHBmaS0+ZGYuZGZDaGFyU2V0IT1ERUZBVUxUX0NIQVJTRVQpICkgCisJICAgIHBlbmFsdHkgKz0gMHgyMDA7CiAgICB9CiAgICBlbHNlIGlmIChwbGYtPmxmQ2hhclNldCAhPSBwZmktPmRmLmRmQ2hhclNldCkgcGVuYWx0eSArPSAweDIwMDsKIApAQCAtMTY1MCw5ICsxNjUzLDExIEBACiB7CiAgIEJPT0wzMiAgICAgICAgc2tpcFJhc3RlciA9IChwZm0tPmZsYWdzICYgRk9fTUFUQ0hfTk9SQVNURVIpOwogICBVSU5UMzIgICAgICAgIGN1cnJlbnRfc2NvcmUsIHNjb3JlID0gKFVJTlQzMikoLTEpOworICBVSU5UMTYgICAgICAgIG9yaWdmbGFncyA9IHBmbS0+ZmxhZ3M7IC8qIFByZXNlcnZlIEZPX01BVENIX1hZSU5ERVAgKi8KICAgZm9udE1hdGNoICAgICBmbSA9ICpwZm07CiAKLSAgZm9yKCBmbS5wZmkgPSBwZm0tPnBmci0+Zmk7IGZtLnBmaSAmJiBzY29yZTsgZm0ucGZpID0gZm0ucGZpLT5uZXh0ICkKKyAgZm9yKCBmbS5wZmkgPSBwZm0tPnBmci0+Zmk7IGZtLnBmaSAmJiBzY29yZTsgZm0ucGZpID0gZm0ucGZpLT5uZXh0LAorICAgICAgZm0uZmxhZ3MgPSBvcmlnZmxhZ3MgKQogICB7CiAgICAgIGlmKCBza2lwUmFzdGVyICYmICEoZm0ucGZpLT5maV9mbGFncyAmIEZJX1NDQUxBQkxFKSApCiAgICAgICAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL2lmMTYzMi9NYWtlZmlsZS5pbiBiL2lmMTYzMi9NYWtlZmlsZS5pbgppbmRleCA2M2ZiMzAzLi4yNmUxZTdhIDEwMDY0NAotLS0gYS9pZjE2MzIvTWFrZWZpbGUuaW4KKysrIGIvaWYxNjMyL01ha2VmaWxlLmluCkBAIC02LDU2ICs2LDM5IEBACiBNT0RVTEUgICAgPSBpZjE2MzIKIAogRExMUyA9IFwKLQlhZHZhcGkzMi5zcGVjIFwKLQljb21jdGwzMi5zcGVjIFwKLQljb21kbGczMi5zcGVjIFwKIAljb21tZGxnLnNwZWMgXAogCWNvbXBvYmouc3BlYyBcCi0JY3J0ZGxsLnNwZWMgXAogCWRkZW1sLnNwZWMgXAogCWdkaS5zcGVjIFwKLQlnZGkzMi5zcGVjIFwKIAlrZXJuZWwuc3BlYyBcCi0Ja2VybmVsMzIuc3BlYyBcCiAJa2V5Ym9hcmQuc3BlYyBcCi0JbHozMi5zcGVjIFwKIAlsemV4cGFuZC5zcGVjIFwKIAltbXN5c3RlbS5zcGVjIFwKIAltb3VzZS5zcGVjIFwKLQltcHIuc3BlYyBcCi0JbnRkbGwuc3BlYyBcCiAJb2xlMi5zcGVjIFwKIAlvbGUyY29udi5zcGVjIFwKIAlvbGUyZGlzcC5zcGVjIFwKIAlvbGUybmxzLnNwZWMgXAogCW9sZTJwcm94LnNwZWMgXAotCW9sZTMyLnNwZWMgXAorCW9sZTJ0aGsuc3BlYyBcCiAJb2xlY2xpLnNwZWMgXAotCW9sZWNsaTMyLnNwZWMgXAogCW9sZXN2ci5zcGVjIFwKLQlvbGVzdnIzMi5zcGVjIFwKIAlzaGVsbC5zcGVjIFwKLQlzaGVsbDMyLnNwZWMgXAogCXNvdW5kLnNwZWMgXAogCXN0b3JhZ2Uuc3BlYyBcCiAJc3RyZXNzLnNwZWMgXAogCXN5c3RlbS5zcGVjIFwKIAl0b29saGVscC5zcGVjIFwKIAl1c2VyLnNwZWMgXAotCXVzZXIzMi5zcGVjIFwKIAl2ZXIuc3BlYyBcCi0JdmVyc2lvbi5zcGVjIFwKLQl3MzJza3JubC5zcGVjIFwKIAl3MzJzeXMuc3BlYyBcCiAJd2luMzJzMTYuc3BlYyBcCiAJd2luODdlbS5zcGVjIFwKIAl3aW5hc3BpLnNwZWMgXAorCXdpbmRlYnVnLnNwZWMgXAogCXdpbmcuc3BlYyBcCi0Jd2lubW0uc3BlYyBcCiAJd2luc29jay5zcGVjIFwKLQl3aW5zcG9vbC5zcGVjIFwKLQl3cHJvY3Muc3BlYyBcCi0Jd3NvY2szMi5zcGVjCisJd3Byb2NzLnNwZWMKIAogU1BFQ19GSUxFUyA9ICQoRExMUzouc3BlYz0ucykKIApAQCAtNjgsNyArNTEsNiBAQAogCiBHRU5fQVNNX1NSQ1MgPSBcCiAJJChTUEVDX0ZJTEVTKSBcCi0JY2FsbDMyLnMgXAogCWNhbGxmcm9tMTYucyBcCiAJY2FsbHRvMTYucwogCkBAIC04Niw5ICs2OCw2IEBACiBjYWxsZnJvbTE2LnM6ICQoU1BFQ19GSUxFUykKIAkkKEJVSUxEKSAtbyAkQCAtY2FsbGZyb20xNiBgY2F0ICQoU1BFQ19GSUxFUykgfCBncmVwIENhbGxGcm9tMTZfIHwgc2VkICdzLy4qQ2FsbEZyb20xNl9cKC4qXCkvXDEvJyB8IHNvcnQgfCB1bmlxYAogCi1jYWxsMzIuczogJChCVUlMRCkKLQkkKEJVSUxEKSAtbyAkQCAtY2FsbDMyCi0KIGNhbGx0bzE2LnM6ICQoU1JDRElSKS90aHVuay5jICQoQlVJTEQpCiAJJChCVUlMRCkgLW8gJEAgLWNhbGx0bzE2ICQoU1JDRElSKS90aHVuay5jCiAKZGlmZiAtLWdpdCBhL2lmMTYzMi9idWlsdGluLmMgYi9pZjE2MzIvYnVpbHRpbi5jCmluZGV4IGY1MTQwMDQuLjI3MzkwOGEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9idWlsdGluLmMKKysrIGIvaWYxNjMyL2J1aWx0aW4uYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJidWlsdGluMzIuaCIKICNpbmNsdWRlICJnZGkuaCIKICNpbmNsdWRlICJnbG9iYWwuaCIKICNpbmNsdWRlICJoZWFwLmgiCkBAIC0zNCwxNTggKzM1LDg5IEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgY29uc3QgY2hhciAgICAgICAgICpuYW1lOyAgICAgICAvKiBETEwgbmFtZSAqLwotICAgIGludCAgICAgICAgICAgICAgICAgYmFzZTsgICAgICAgLyogT3JkaW5hbCBiYXNlICovCi0gICAgaW50ICAgICAgICAgICAgICAgICBuYl9mdW5jczsgICAvKiBOdW1iZXIgb2YgZnVuY3Rpb25zICovCi0gICAgaW50ICAgICAgICAgICAgICAgICBuYl9uYW1lczsgICAvKiBOdW1iZXIgb2YgZnVuY3Rpb24gbmFtZXMgKi8KLSAgICBjb25zdCB2b2lkICAgICAgICAqKmZ1bmN0aW9uczsgIC8qIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGFibGUgKi8KLSAgICBjb25zdCBjaGFyICogY29uc3QgKm5hbWVzOyAgICAgIC8qIFBvaW50ZXIgdG8gbmFtZXMgdGFibGUgKi8KLSAgICBjb25zdCBXT1JEICAgICAgICAgKm9yZGluYWxzOyAgIC8qIFBvaW50ZXIgdG8gb3JkaW5hbHMgdGFibGUgKi8KLSAgICBjb25zdCBCWVRFICAgICAgICAgKmFyZ3M7ICAgICAgIC8qIFBvaW50ZXIgdG8gYXJndW1lbnQgbGVuZ3RocyAqLwotICAgIGNvbnN0IERXT1JEICAgICAgICAqYXJndHlwZXM7ICAgLyogUG9pbnRlciB0byBhcmd1bWVudCB0eXBlcyBiaXRtYXNrICovCi19IFdJTjMyX0RFU0NSSVBUT1I7Ci0KLXR5cGVkZWYgdW5pb24KLXsKLSAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgIC8qIERMTCBuYW1lICovCi0gICAgV0lOMTZfREVTQ1JJUFRPUiB3aW4xNjsgICAgICAgICAvKiBEZXNjcmlwdG9yIGZvciBXaW4xNiBETEwgKi8KLSAgICBXSU4zMl9ERVNDUklQVE9SIHdpbjMyOyAgICAgICAgIC8qIERlc2NyaXB0b3IgZm9yIFdpbjMyIERMTCAqLwotfSBETExfREVTQ1JJUFRPUjsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBCWVRFICBjYWxsOyAgICAgICAgICAgICAgICAgICAgLyogMHhlOCBjYWxsIGNhbGxmcm9tMzIgKHJlbGF0aXZlKSAqLwotICAgIERXT1JEIGNhbGxmcm9tMzIgV0lORV9QQUNLRUQ7ICAvKiBSRUxBWV9DYWxsRnJvbTMyIHJlbGF0aXZlIGFkZHIgKi8KLSAgICBCWVRFICByZXQ7ICAgICAgICAgICAgICAgICAgICAgLyogMHhjMiByZXQgJG4gIG9yICAweGMzIHJldCAqLwotICAgIFdPUkQgIGFyZ3M7ICAgICAgICAgICAgICAgICAgICAvKiBuYiBvZiBhcmdzIHRvIHJlbW92ZSBmcm9tIHRoZSBzdGFjayAqLwotfSBERUJVR19FTlRSWV9QT0lOVDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBjb25zdCBETExfREVTQ1JJUFRPUiAqZGVzY3I7ICAgICAvKiBETEwgZGVzY3JpcHRvciAqLwotICAgIERFQlVHX0VOVFJZX1BPSU5UICAgICpkYmdfZnVuY3M7IC8qIFJlbGF5IGRlYnVnZ2luZyBmdW5jdGlvbnMgdGFibGUgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAvKiBmbGFncyAoc2VlIGJlbG93KSAqLwotfSBCVUlMVElOX0RMTDsKKyAgICBjb25zdCBXSU4xNl9ERVNDUklQVE9SICpkZXNjcjsgICAgIC8qIERMTCBkZXNjcmlwdG9yICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7ICAgICAvKiBmbGFncyAoc2VlIGJlbG93KSAqLworfSBCVUlMVElOMTZfRExMOwogCiAvKiBETEwgZmxhZ3MgKi8KICNkZWZpbmUgRExMX0ZMQUdfTk9UX1VTRUQgICAgMHgwMSAgLyogVXNlIG9yaWdpbmFsIFdpbmRvd3MgRExMIGlmIHBvc3NpYmxlICovCiAjZGVmaW5lIERMTF9GTEFHX0FMV0FZU19VU0VEIDB4MDIgIC8qIEFsd2F5cyB1c2UgYnVpbHQtaW4gRExMICovCi0jZGVmaW5lIERMTF9GTEFHX1dJTjMyICAgICAgIDB4MDQgIC8qIERMTCBpcyBhIFdpbjMyIERMTCAqLwogCiAvKiAxNi1iaXQgRExMcyAqLwogCi1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgS0VSTkVMX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgVVNFUl9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIEdESV9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFdJTjg3RU1fRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBNTVNZU1RFTV9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFNIRUxMX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgU09VTkRfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBLRVlCT0FSRF9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFdJTlNPQ0tfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBTVFJFU1NfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBTWVNURU1fRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBUT09MSEVMUF9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIE1PVVNFX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgQ09NTURMR19EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIE9MRTJfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBPTEUyQ09OVl9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIE9MRTJESVNQX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgT0xFMk5MU19EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIE9MRTJQUk9YX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgT0xFQ0xJX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgT0xFU1ZSX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgQ09NUE9CSl9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFNUT1JBR0VfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBXUFJPQ1NfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBEREVNTF9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIExaRVhQQU5EX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgVkVSX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgVzMyU1lTX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgV0lOMzJTMTZfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBXSU5HX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgV0lOQVNQSV9EZXNjcmlwdG9yOwotCi0vKiAzMi1iaXQgRExMcyAqLwotCi1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgQURWQVBJMzJfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBDT01DVEwzMl9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIENPTURMRzMyX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgQ1JURExMX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgR0RJMzJfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBLRVJORUwzMl9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIExaMzJfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBNUFJfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBOVERMTF9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIE9MRTMyX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgT0xFQ0xJMzJfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBPTEVTVlIzMl9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFNIRUxMMzJfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBVU0VSMzJfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBWRVJTSU9OX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgVzMyU0tSTkxfRGVzY3JpcHRvcjsKLWV4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBXSU5NTV9EZXNjcmlwdG9yOwotZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFdJTlNQT09MX0Rlc2NyaXB0b3I7Ci1leHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgV1NPQ0szMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgQ09NTURMR19EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgQ09NUE9CSl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgRERFTUxfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIEdESV9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgS0VSTkVMX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBLRVlCT0FSRF9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgTFpFWFBBTkRfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIE1NU1lTVEVNX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBNT1VTRV9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgT0xFMkNPTlZfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIE9MRTJESVNQX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBPTEUyTkxTX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBPTEUyUFJPWF9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgT0xFMlRIS19EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgT0xFMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgT0xFQ0xJX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBPTEVTVlJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIFNIRUxMX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBTT1VORF9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgU1RPUkFHRV9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgU1RSRVNTX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBTWVNURU1fRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIFRPT0xIRUxQX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBVU0VSX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBWRVJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIFczMlNZU19EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IFdJTjE2X0RFU0NSSVBUT1IgV0lOMzJTMTZfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIFdJTjg3RU1fRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIFdJTkFTUElfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBXSU4xNl9ERVNDUklQVE9SIFdJTkRFQlVHX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBXSU5HX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBXSU5TT0NLX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgV0lOMTZfREVTQ1JJUFRPUiBXUFJPQ1NfRGVzY3JpcHRvcjsKIAogLyogVGFibGUgb2YgYWxsIGJ1aWx0LWluIERMTHMgKi8KIAotc3RhdGljIEJVSUxUSU5fRExMIEJ1aWx0aW5ETExzW10gPQorc3RhdGljIEJVSUxUSU4xNl9ETEwgQnVpbHRpbkRMTHNbXSA9CiB7Ci0gICAgLyogV2luMTYgRExMcyAqLwotICAgIHsgJktFUk5FTF9EZXNjcmlwdG9yLCAgIE5VTEwsIERMTF9GTEFHX0FMV0FZU19VU0VEIH0sCi0gICAgeyAmVVNFUl9EZXNjcmlwdG9yLCAgICAgTlVMTCwgRExMX0ZMQUdfQUxXQVlTX1VTRUQgfSwKLSAgICB7ICZHRElfRGVzY3JpcHRvciwgICAgICBOVUxMLCBETExfRkxBR19BTFdBWVNfVVNFRCB9LAotICAgIHsgJlNZU1RFTV9EZXNjcmlwdG9yLCAgIE5VTEwsIERMTF9GTEFHX0FMV0FZU19VU0VEIH0sCi0gICAgeyAmV0lOODdFTV9EZXNjcmlwdG9yLCAgTlVMTCwgRExMX0ZMQUdfTk9UX1VTRUQgfSwKLSAgICB7ICZTSEVMTF9EZXNjcmlwdG9yLCAgICBOVUxMLCAwIH0sCi0gICAgeyAmU09VTkRfRGVzY3JpcHRvciwgICAgTlVMTCwgMCB9LAotICAgIHsgJktFWUJPQVJEX0Rlc2NyaXB0b3IsIE5VTEwsIDAgfSwKLSAgICB7ICZXSU5TT0NLX0Rlc2NyaXB0b3IsICBOVUxMLCAwIH0sCi0gICAgeyAmU1RSRVNTX0Rlc2NyaXB0b3IsICAgTlVMTCwgMCB9LAotICAgIHsgJk1NU1lTVEVNX0Rlc2NyaXB0b3IsIE5VTEwsIDAgfSwKLSAgICB7ICZUT09MSEVMUF9EZXNjcmlwdG9yLCBOVUxMLCAwIH0sCi0gICAgeyAmTU9VU0VfRGVzY3JpcHRvciwgICAgTlVMTCwgMCB9LAotICAgIHsgJkNPTU1ETEdfRGVzY3JpcHRvciwgIE5VTEwsIERMTF9GTEFHX05PVF9VU0VEIH0sCi0gICAgeyAmT0xFMl9EZXNjcmlwdG9yLCAgICAgTlVMTCwgRExMX0ZMQUdfTk9UX1VTRUQgfSwKLSAgICB7ICZPTEUyQ09OVl9EZXNjcmlwdG9yLCBOVUxMLCBETExfRkxBR19OT1RfVVNFRCB9LAotICAgIHsgJk9MRTJESVNQX0Rlc2NyaXB0b3IsIE5VTEwsIERMTF9GTEFHX05PVF9VU0VEIH0sCi0gICAgeyAmT0xFMk5MU19EZXNjcmlwdG9yLCAgTlVMTCwgRExMX0ZMQUdfTk9UX1VTRUQgfSwKLSAgICB7ICZPTEUyUFJPWF9EZXNjcmlwdG9yLCBOVUxMLCBETExfRkxBR19OT1RfVVNFRCB9LAotICAgIHsgJk9MRUNMSV9EZXNjcmlwdG9yLCAgIE5VTEwsIERMTF9GTEFHX05PVF9VU0VEIH0sCi0gICAgeyAmT0xFU1ZSX0Rlc2NyaXB0b3IsICAgTlVMTCwgRExMX0ZMQUdfTk9UX1VTRUQgfSwKLSAgICB7ICZDT01QT0JKX0Rlc2NyaXB0b3IsICBOVUxMLCBETExfRkxBR19OT1RfVVNFRCB9LAotICAgIHsgJlNUT1JBR0VfRGVzY3JpcHRvciwgIE5VTEwsIERMTF9GTEFHX05PVF9VU0VEIH0sCi0gICAgeyAmV1BST0NTX0Rlc2NyaXB0b3IsICAgTlVMTCwgRExMX0ZMQUdfQUxXQVlTX1VTRUQgfSwKLSAgICB7ICZEREVNTF9EZXNjcmlwdG9yLCAgICBOVUxMLCBETExfRkxBR19OT1RfVVNFRCB9LAotICAgIHsgJkxaRVhQQU5EX0Rlc2NyaXB0b3IsIE5VTEwsIDAgfSwKLSAgICB7ICZWRVJfRGVzY3JpcHRvciwgICAgICBOVUxMLCAwIH0sCi0gICAgeyAmVzMyU1lTX0Rlc2NyaXB0b3IsICAgTlVMTCwgMCB9LAotICAgIHsgJldJTjMyUzE2X0Rlc2NyaXB0b3IsIE5VTEwsIDAgfSwKLSAgICB7ICZXSU5HX0Rlc2NyaXB0b3IsICAgICBOVUxMLCAwIH0sCi0gICAgeyAmV0lOQVNQSV9EZXNjcmlwdG9yLCAgTlVMTCwgMCB9LAotICAgIC8qIFdpbjMyIERMTHMgKi8KLSAgICB7ICZBRFZBUEkzMl9EZXNjcmlwdG9yLCBOVUxMLCBETExfRkxBR19XSU4zMiB9LAotICAgIHsgJkNPTUNUTDMyX0Rlc2NyaXB0b3IsIE5VTEwsIERMTF9GTEFHX1dJTjMyIHwgRExMX0ZMQUdfTk9UX1VTRUQgfSwKLSAgICB7ICZDT01ETEczMl9EZXNjcmlwdG9yLCBOVUxMLCBETExfRkxBR19XSU4zMiB9LAotICAgIHsgJkNSVERMTF9EZXNjcmlwdG9yLCAgIE5VTEwsIERMTF9GTEFHX1dJTjMyIH0sCi0gICAgeyAmR0RJMzJfRGVzY3JpcHRvciwgICAgTlVMTCwgRExMX0ZMQUdfV0lOMzIgfSwKLSAgICB7ICZLRVJORUwzMl9EZXNjcmlwdG9yLCBOVUxMLCBETExfRkxBR19XSU4zMiB9LAotICAgIHsgJkxaMzJfRGVzY3JpcHRvciwgICAgIE5VTEwsIERMTF9GTEFHX1dJTjMyIH0sCi0gICAgeyAmTVBSX0Rlc2NyaXB0b3IsICAgICAgTlVMTCwgRExMX0ZMQUdfV0lOMzIgfSwKLSAgICB7ICZOVERMTF9EZXNjcmlwdG9yLCAgICBOVUxMLCBETExfRkxBR19XSU4zMiB9LAotICAgIHsgJk9MRTMyX0Rlc2NyaXB0b3IsICAgIE5VTEwsIERMTF9GTEFHX1dJTjMyIHwgRExMX0ZMQUdfTk9UX1VTRUQgfSwKLSAgICB7ICZPTEVDTEkzMl9EZXNjcmlwdG9yLCBOVUxMLCBETExfRkxBR19XSU4zMiB8IERMTF9GTEFHX05PVF9VU0VEIH0sCi0gICAgeyAmT0xFU1ZSMzJfRGVzY3JpcHRvciwgTlVMTCwgRExMX0ZMQUdfV0lOMzIgfCBETExfRkxBR19OT1RfVVNFRCB9LAotICAgIHsgJlNIRUxMMzJfRGVzY3JpcHRvciwgIE5VTEwsIERMTF9GTEFHX1dJTjMyIH0sCi0gICAgeyAmVVNFUjMyX0Rlc2NyaXB0b3IsICAgTlVMTCwgRExMX0ZMQUdfV0lOMzIgfSwKLSAgICB7ICZWRVJTSU9OX0Rlc2NyaXB0b3IsICBOVUxMLCBETExfRkxBR19XSU4zMiB9LAotICAgIHsgJlczMlNLUk5MX0Rlc2NyaXB0b3IsIE5VTEwsIERMTF9GTEFHX1dJTjMyIH0sCi0gICAgeyAmV0lOTU1fRGVzY3JpcHRvciwgICAgTlVMTCwgRExMX0ZMQUdfV0lOMzIgfSwKLSAgICB7ICZXSU5TUE9PTF9EZXNjcmlwdG9yLCBOVUxMLCBETExfRkxBR19XSU4zMiB9LAotICAgIHsgJldTT0NLMzJfRGVzY3JpcHRvciwgIE5VTEwsIERMTF9GTEFHX1dJTjMyIH0sCisgICAgeyAmS0VSTkVMX0Rlc2NyaXB0b3IsICAgRExMX0ZMQUdfQUxXQVlTX1VTRUQgfSwKKyAgICB7ICZVU0VSX0Rlc2NyaXB0b3IsICAgICBETExfRkxBR19BTFdBWVNfVVNFRCB9LAorICAgIHsgJkdESV9EZXNjcmlwdG9yLCAgICAgIERMTF9GTEFHX0FMV0FZU19VU0VEIH0sCisgICAgeyAmU1lTVEVNX0Rlc2NyaXB0b3IsICAgRExMX0ZMQUdfQUxXQVlTX1VTRUQgfSwKKyAgICB7ICZXUFJPQ1NfRGVzY3JpcHRvciwgICBETExfRkxBR19BTFdBWVNfVVNFRCB9LAorICAgIHsgJldJTkRFQlVHX0Rlc2NyaXB0b3IsIERMTF9GTEFHX0FMV0FZU19VU0VEIH0sCisgICAgeyAmQ09NTURMR19EZXNjcmlwdG9yLCAgRExMX0ZMQUdfTk9UX1VTRUQgfSwKKyAgICB7ICZDT01QT0JKX0Rlc2NyaXB0b3IsICBETExfRkxBR19OT1RfVVNFRCB9LAorICAgIHsgJkRERU1MX0Rlc2NyaXB0b3IsICAgIERMTF9GTEFHX05PVF9VU0VEIH0sCisgICAgeyAmS0VZQk9BUkRfRGVzY3JpcHRvciwgMCB9LAorICAgIHsgJkxaRVhQQU5EX0Rlc2NyaXB0b3IsIDAgfSwKKyAgICB7ICZNTVNZU1RFTV9EZXNjcmlwdG9yLCAwIH0sCisgICAgeyAmTU9VU0VfRGVzY3JpcHRvciwgICAgMCB9LAorICAgIHsgJk9MRTJDT05WX0Rlc2NyaXB0b3IsIERMTF9GTEFHX05PVF9VU0VEIH0sCisgICAgeyAmT0xFMkRJU1BfRGVzY3JpcHRvciwgRExMX0ZMQUdfTk9UX1VTRUQgfSwKKyAgICB7ICZPTEUyTkxTX0Rlc2NyaXB0b3IsICBETExfRkxBR19OT1RfVVNFRCB9LAorICAgIHsgJk9MRTJQUk9YX0Rlc2NyaXB0b3IsIERMTF9GTEFHX05PVF9VU0VEIH0sCisgICAgeyAmT0xFMlRIS19EZXNjcmlwdG9yLCAgRExMX0ZMQUdfTk9UX1VTRUQgfSwKKyAgICB7ICZPTEUyX0Rlc2NyaXB0b3IsICAgICBETExfRkxBR19OT1RfVVNFRCB9LAorICAgIHsgJk9MRUNMSV9EZXNjcmlwdG9yLCAgIERMTF9GTEFHX05PVF9VU0VEIH0sCisgICAgeyAmT0xFU1ZSX0Rlc2NyaXB0b3IsICAgRExMX0ZMQUdfTk9UX1VTRUQgfSwKKyAgICB7ICZTSEVMTF9EZXNjcmlwdG9yLCAgICAwIH0sCisgICAgeyAmU09VTkRfRGVzY3JpcHRvciwgICAgMCB9LAorICAgIHsgJlNUT1JBR0VfRGVzY3JpcHRvciwgIERMTF9GTEFHX05PVF9VU0VEIH0sCisgICAgeyAmU1RSRVNTX0Rlc2NyaXB0b3IsICAgMCB9LAorICAgIHsgJlRPT0xIRUxQX0Rlc2NyaXB0b3IsIDAgfSwKKyAgICB7ICZWRVJfRGVzY3JpcHRvciwgICAgICAwIH0sCisgICAgeyAmVzMyU1lTX0Rlc2NyaXB0b3IsICAgMCB9LAorICAgIHsgJldJTjMyUzE2X0Rlc2NyaXB0b3IsIDAgfSwKKyAgICB7ICZXSU44N0VNX0Rlc2NyaXB0b3IsICBETExfRkxBR19OT1RfVVNFRCB9LAorICAgIHsgJldJTkFTUElfRGVzY3JpcHRvciwgIDAgfSwKKyAgICB7ICZXSU5HX0Rlc2NyaXB0b3IsICAgICAwIH0sCisgICAgeyAmV0lOU09DS19EZXNjcmlwdG9yLCAgMCB9LAogICAgIC8qIExhc3QgZW50cnkgKi8KLSAgICB7IE5VTEwsIE5VTEwsIDAgfQorICAgIHsgTlVMTCwgMCB9CiB9OwogCiAgIC8qIE9yZGluYWwgbnVtYmVyIGZvciBpbnRlcnJ1cHQgMCBoYW5kbGVyIGluIFdQUk9DUy5ETEwgKi8KQEAgLTI0MywyMTAgKzE3NSwyMSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEJVSUxUSU5fRG9Mb2FkTW9kdWxlMzIKLSAqCi0gKiBMb2FkIGEgYnVpbHQtaW4gV2luMzIgbW9kdWxlLiBIZWxwZXIgZnVuY3Rpb24gZm9yIEJVSUxUSU5fTG9hZE1vZHVsZQotICogYW5kIEJVSUxUSU5fSW5pdC4KLSAqLwotc3RhdGljIEhNT0RVTEUzMiBCVUlMVElOX0RvTG9hZE1vZHVsZTMyKCBCVUlMVElOX0RMTCAqZGxsICkKLXsKLSAgICBleHRlcm4gdm9pZCBSRUxBWV9DYWxsRnJvbTMyKCk7Ci0KLSAgICBITU9EVUxFMTYgaE1vZHVsZTsKLSAgICBORV9NT0RVTEUgKnBNb2R1bGU7Ci0gICAgT0ZTVFJVQ1Qgb2ZzOwotICAgIElNQUdFX0RBVEFfRElSRUNUT1JZICpkaXI7Ci0gICAgSU1BR0VfRE9TX0hFQURFUiAqZG9zOwotICAgIElNQUdFX05UX0hFQURFUlMgKm50OwotICAgIElNQUdFX1NFQ1RJT05fSEVBREVSICpzZWM7Ci0gICAgSU1BR0VfRVhQT1JUX0RJUkVDVE9SWSAqZXhwOwotICAgIExQVk9JRCAqZnVuY3M7Ci0gICAgTFBTVFIgKm5hbWVzOwotICAgIERFQlVHX0VOVFJZX1BPSU5UICplbnRyeTsKLSAgICBQRV9NT0RSRUYgKnBlbTsKLSAgICBJTlQzMiBpLCBzaXplOwotICAgIEJZVEUgKmFkZHI7Ci0KLSAgICAvKiBBbGxvY2F0ZSB0aGUgbW9kdWxlICovCi0KLSAgICBzaXplID0gKHNpemVvZihJTUFHRV9ET1NfSEVBREVSKQotICAgICAgICAgICAgKyBzaXplb2YoSU1BR0VfTlRfSEVBREVSUykKLSAgICAgICAgICAgICsgMiAqIHNpemVvZihJTUFHRV9TRUNUSU9OX0hFQURFUikKLSAgICAgICAgICAgICsgc2l6ZW9mKElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkpCi0gICAgICAgICAgICArIGRsbC0+ZGVzY3ItPndpbjMyLm5iX2Z1bmNzICogc2l6ZW9mKExQVk9JRCkKLSAgICAgICAgICAgICsgZGxsLT5kZXNjci0+d2luMzIubmJfbmFtZXMgKiBzaXplb2YoTFBTVFIpKTsKLSAgICBpZiAoZGVidWdnaW5nX3JlbGF5KQotICAgICAgICBzaXplICs9IGRsbC0+ZGVzY3ItPndpbjMyLm5iX2Z1bmNzICogc2l6ZW9mKERFQlVHX0VOVFJZX1BPSU5UKTsKLSAgICBhZGRyICA9IFZpcnR1YWxBbGxvYyggTlVMTCwgc2l6ZSwgTUVNX0NPTU1JVCwgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOwotICAgIGlmICghYWRkcikgcmV0dXJuIDA7Ci0gICAgZG9zICAgPSAoSU1BR0VfRE9TX0hFQURFUiAqKWFkZHI7Ci0gICAgbnQgICAgPSAoSU1BR0VfTlRfSEVBREVSUyAqKShkb3MgKyAxKTsKLSAgICBzZWMgICA9IChJTUFHRV9TRUNUSU9OX0hFQURFUiAqKShudCArIDEpOwotICAgIGV4cCAgID0gKElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkgKikoc2VjICsgMik7Ci0gICAgZnVuY3MgPSAoTFBWT0lEICopKGV4cCArIDEpOwotICAgIG5hbWVzID0gKExQU1RSICopKGZ1bmNzICsgZGxsLT5kZXNjci0+d2luMzIubmJfZnVuY3MpOwotICAgIGVudHJ5ID0gKERFQlVHX0VOVFJZX1BPSU5UICopKG5hbWVzICsgZGxsLT5kZXNjci0+d2luMzIubmJfbmFtZXMpOwotCi0gICAgLyogQnVpbGQgdGhlIERPUyBhbmQgTlQgaGVhZGVycyAqLwotCi0gICAgZG9zLT5lX21hZ2ljICA9IElNQUdFX0RPU19TSUdOQVRVUkU7Ci0gICAgZG9zLT5lX2xmYW5ldyA9IHNpemVvZigqZG9zKTsKLQotICAgIG50LT5TaWduYXR1cmUgICAgICAgICAgICAgICAgICAgICAgID0gSU1BR0VfTlRfU0lHTkFUVVJFOwotICAgIG50LT5GaWxlSGVhZGVyLk1hY2hpbmUgICAgICAgICAgICAgID0gSU1BR0VfRklMRV9NQUNISU5FX0kzODY7Ci0gICAgbnQtPkZpbGVIZWFkZXIuTnVtYmVyT2ZTZWN0aW9ucyAgICAgPSAyOyAgLyogZXhwb3J0cyArIGNvZGUgKi8KLSAgICBudC0+RmlsZUhlYWRlci5TaXplT2ZPcHRpb25hbEhlYWRlciA9IHNpemVvZihudC0+T3B0aW9uYWxIZWFkZXIpOwotICAgIG50LT5GaWxlSGVhZGVyLkNoYXJhY3RlcmlzdGljcyAgICAgID0gSU1BR0VfRklMRV9ETEw7Ci0KLSAgICBudC0+T3B0aW9uYWxIZWFkZXIuTWFnaWMgPSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUM7Ci0gICAgbnQtPk9wdGlvbmFsSGVhZGVyLlNpemVPZkNvZGUgICAgICAgICAgICAgICAgICA9IDB4MTAwMDsKLSAgICBudC0+T3B0aW9uYWxIZWFkZXIuU2l6ZU9mSW5pdGlhbGl6ZWREYXRhICAgICAgID0gMDsKLSAgICBudC0+T3B0aW9uYWxIZWFkZXIuU2l6ZU9mVW5pbml0aWFsaXplZERhdGEgICAgID0gMDsKLSAgICBudC0+T3B0aW9uYWxIZWFkZXIuSW1hZ2VCYXNlICAgICAgICAgICAgICAgICAgID0gKERXT1JEKWFkZHI7Ci0gICAgbnQtPk9wdGlvbmFsSGVhZGVyLlNlY3Rpb25BbGlnbm1lbnQgICAgICAgICAgICA9IDB4MTAwMDsKLSAgICBudC0+T3B0aW9uYWxIZWFkZXIuRmlsZUFsaWdubWVudCAgICAgICAgICAgICAgID0gMHgxMDAwOwotICAgIG50LT5PcHRpb25hbEhlYWRlci5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPSAxOwotICAgIG50LT5PcHRpb25hbEhlYWRlci5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPSAwOwotICAgIG50LT5PcHRpb25hbEhlYWRlci5NYWpvclN1YnN5c3RlbVZlcnNpb24gICAgICAgPSA0OwotICAgIG50LT5PcHRpb25hbEhlYWRlci5NaW5vclN1YnN5c3RlbVZlcnNpb24gICAgICAgPSAwOwotICAgIG50LT5PcHRpb25hbEhlYWRlci5TaXplT2ZJbWFnZSAgICAgICAgICAgICAgICAgPSBzaXplOwotICAgIG50LT5PcHRpb25hbEhlYWRlci5TaXplT2ZIZWFkZXJzICAgICAgICAgICAgICAgPSAoQllURSAqKWV4cCAtIGFkZHI7Ci0gICAgbnQtPk9wdGlvbmFsSGVhZGVyLk51bWJlck9mUnZhQW5kU2l6ZXMgPSBJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFUzsKLQotICAgIC8qIEJ1aWxkIHRoZSBleHBvcnQgZGlyZWN0b3J5ICovCi0KLSAgICBkaXIgPSAmbnQtPk9wdGlvbmFsSGVhZGVyLkRhdGFEaXJlY3RvcnlbSU1BR0VfRklMRV9FWFBPUlRfRElSRUNUT1JZXTsKLSAgICBkaXItPlZpcnR1YWxBZGRyZXNzID0gKEJZVEUgKilleHAgLSBhZGRyOwotICAgIGRpci0+U2l6ZSA9IHNpemVvZigqZXhwKQotICAgICAgICAgICAgICAgICsgZGxsLT5kZXNjci0+d2luMzIubmJfZnVuY3MgKiBzaXplb2YoTFBWT0lEKQotICAgICAgICAgICAgICAgICsgZGxsLT5kZXNjci0+d2luMzIubmJfbmFtZXMgKiBzaXplb2YoTFBTVFIpOwotCi0gICAgLyogQnVpbGQgdGhlIGV4cG9ydHMgc2VjdGlvbiAqLwotCi0gICAgc3RyY3B5KCBzZWMtPk5hbWUsICIuZWRhdGEiICk7Ci0gICAgc2VjLT5NaXNjLlZpcnR1YWxTaXplID0gZGlyLT5TaXplOwotICAgIHNlYy0+VmlydHVhbEFkZHJlc3MgICA9IChCWVRFICopZXhwIC0gYWRkcjsKLSAgICBzZWMtPlNpemVPZlJhd0RhdGEgICAgPSBkaXItPlNpemU7Ci0gICAgc2VjLT5Qb2ludGVyVG9SYXdEYXRhID0gKEJZVEUgKilleHAgLSBhZGRyOwotICAgIHNlYy0+Q2hhcmFjdGVyaXN0aWNzICA9IChJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgfCBJTUFHRV9TQ05fTUVNX1JFQUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9TQ05fTUVNX1dSSVRFKTsKLQotICAgIC8qIEJ1aWxkIHRoZSBjb2RlIHNlY3Rpb24gKi8KLQotICAgIHNlYysrOwotICAgIHN0cmNweSggc2VjLT5OYW1lLCAiLmNvZGUiICk7Ci0gICAgaWYgKGRlYnVnZ2luZ19yZWxheSkKLSAgICAgICAgc2VjLT5TaXplT2ZSYXdEYXRhID0gZGxsLT5kZXNjci0+d2luMzIubmJfZnVuY3MgKiBzaXplb2YoREVCVUdfRU5UUllfUE9JTlQpOwotICAgIGVsc2UKLSAgICAgICAgc2VjLT5TaXplT2ZSYXdEYXRhID0gMTsKLSAgICBzZWMtPk1pc2MuVmlydHVhbFNpemUgPSBzZWMtPlNpemVPZlJhd0RhdGE7Ci0gICAgc2VjLT5WaXJ0dWFsQWRkcmVzcyAgID0gKEJZVEUgKillbnRyeSAtIGFkZHI7Ci0gICAgc2VjLT5Qb2ludGVyVG9SYXdEYXRhID0gKEJZVEUgKillbnRyeSAtIGFkZHI7Ci0gICAgc2VjLT5DaGFyYWN0ZXJpc3RpY3MgID0gKElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX1NDTl9NRU1fRVhFQ1VURSB8IElNQUdFX1NDTl9NRU1fUkVBRCk7Ci0KLSAgICAvKiBCdWlsZCB0aGUgZXhwb3J0cyBzZWN0aW9uIGRhdGEgKi8KLQotICAgIGV4cC0+TmFtZSAgICAgICAgICAgICAgICAgID0gKEJZVEUgKilkbGwtPmRlc2NyLT5uYW1lIC0gYWRkcjsgIC8qPz8qLwotICAgIGV4cC0+QmFzZSAgICAgICAgICAgICAgICAgID0gZGxsLT5kZXNjci0+d2luMzIuYmFzZTsKLSAgICBleHAtPk51bWJlck9mRnVuY3Rpb25zICAgICA9IGRsbC0+ZGVzY3ItPndpbjMyLm5iX2Z1bmNzOwotICAgIGV4cC0+TnVtYmVyT2ZOYW1lcyAgICAgICAgID0gZGxsLT5kZXNjci0+d2luMzIubmJfbmFtZXM7Ci0gICAgZXhwLT5BZGRyZXNzT2ZGdW5jdGlvbnMgICAgPSAoTFBEV09SRCAqKSgoQllURSAqKWZ1bmNzIC0gYWRkcik7Ci0gICAgZXhwLT5BZGRyZXNzT2ZOYW1lcyAgICAgICAgPSAoTFBEV09SRCAqKSgoQllURSAqKW5hbWVzIC0gYWRkcik7Ci0gICAgZXhwLT5BZGRyZXNzT2ZOYW1lT3JkaW5hbHMgPSAoTFBXT1JEICopKChCWVRFICopZGxsLT5kZXNjci0+d2luMzIub3JkaW5hbHMgLSBhZGRyKTsKLQotICAgIC8qIEJ1aWxkIHRoZSBmdW5jcyB0YWJsZSAqLwotCi0gICAgaWYgKGRlYnVnZ2luZ19yZWxheSkKLSAgICB7Ci0gICAgICAgIGRsbC0+ZGJnX2Z1bmNzID0gZW50cnk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBkbGwtPmRlc2NyLT53aW4zMi5uYl9mdW5jczsgaSsrLCBmdW5jcysrLCBlbnRyeSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBCWVRFIGFyZ3MgPSBkbGwtPmRlc2NyLT53aW4zMi5hcmdzW2ldOwotICAgICAgICAgICAgZW50cnktPmNhbGwgPSAweGU4OyAgLyogY2FsbCAqLwotICAgICAgICAgICAgc3dpdGNoKGFyZ3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDB4ZmU6ICAvKiByZWdpc3RlciBmdW5jICovCi0gICAgICAgICAgICAgICAgZW50cnktPmNhbGxmcm9tMzIgPSAoRFdPUkQpZGxsLT5kZXNjci0+d2luMzIuZnVuY3Rpb25zW2ldIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRCkmZW50cnktPnJldDsKLSAgICAgICAgICAgICAgICBlbnRyeS0+cmV0ICAgICAgICA9IDB4OTA7ICAvKiBub3AgKi8KLSAgICAgICAgICAgICAgICBlbnRyeS0+YXJncyAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgKmZ1bmNzID0gKExQVk9JRCkoKEJZVEUgKillbnRyeSAtIGFkZHIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAweGZmOiAgLyogc3R1YiBvciBleHRlcm4gKi8KLSAgICAgICAgICAgICAgICBpZiAoZGxsLT5kZXNjci0+d2luMzIuZnVuY3Rpb25zW2ldKQotICAgICAgICAgICAgICAgICAgICAqZnVuY3MgPSAoTFBWT0lEKSgoQllURSAqKWRsbC0+ZGVzY3ItPndpbjMyLmZ1bmN0aW9uc1tpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gYWRkcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgLyogbm9ybWFsIGZ1bmN0aW9uIChzdGRjYWxsIG9yIGNkZWNsKSAqLwotICAgICAgICAgICAgICAgIGVudHJ5LT5jYWxsZnJvbTMyID0gKERXT1JEKVJFTEFZX0NhbGxGcm9tMzIgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKSZlbnRyeS0+cmV0OwotICAgICAgICAgICAgICAgIGVudHJ5LT5yZXQgICAgICAgID0gKGFyZ3MgJiAweDgwKSA/IDB4YzMgOiAweGMyOyAvKnJldC9yZXQgJG4qLwotICAgICAgICAgICAgICAgIGVudHJ5LT5hcmdzICAgICAgID0gKGFyZ3MgJiAweDdmKSAqIHNpemVvZihpbnQpOwotICAgICAgICAgICAgICAgICpmdW5jcyA9IChMUFZPSUQpKChCWVRFICopZW50cnkgLSBhZGRyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGxsLT5kZXNjci0+d2luMzIubmJfZnVuY3M7IGkrKywgZnVuY3MrKykKLSAgICAgICAgICAgIGlmIChkbGwtPmRlc2NyLT53aW4zMi5mdW5jdGlvbnNbaV0pCi0gICAgICAgICAgICAgICAgKmZ1bmNzID0gKExQVk9JRCkoKEJZVEUgKilkbGwtPmRlc2NyLT53aW4zMi5mdW5jdGlvbnNbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGFkZHIpOwotICAgIH0KLQotICAgIC8qIEJ1aWxkIHRoZSBuYW1lcyB0YWJsZSAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IGV4cC0+TnVtYmVyT2ZOYW1lczsgaSsrLCBuYW1lcysrKQotICAgICAgICBpZiAoZGxsLT5kZXNjci0+d2luMzIubmFtZXNbaV0pCi0gICAgICAgICAgICAqbmFtZXMgPSAoTFBTVFIpKChCWVRFICopZGxsLT5kZXNjci0+d2luMzIubmFtZXNbaV0gLSBhZGRyKTsKLQotICAgIC8qIENyZWF0ZSBhIG1vZHJlZiAqLwotCi0gICAgcGVtID0gKFBFX01PRFJFRiAqKUhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnBlbSkgKTsKLSAgICBwZW0tPm1vZHVsZSA9IChITU9EVUxFMzIpYWRkcjsKLSAgICBwZW0tPnBlX2V4cG9ydCA9IGV4cDsKLSAgICBwZW0tPm5leHQgPSBwQ3VycmVudFByb2Nlc3MtPm1vZHJlZl9saXN0OwotICAgIHBDdXJyZW50UHJvY2Vzcy0+bW9kcmVmX2xpc3QgPSBwZW07Ci0KLSAgICAvKiBDcmVhdGUgYSBXaW4xNiBkdW1teSBtb2R1bGUgKi8KLQotICAgIHNwcmludGYoIG9mcy5zelBhdGhOYW1lLCAiJXMuRExMIiwgZGxsLT5kZXNjci0+bmFtZSApOwotICAgIGhNb2R1bGUgPSBNT0RVTEVfQ3JlYXRlRHVtbXlNb2R1bGUoICZvZnMgKTsKLSAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2sxNiggaE1vZHVsZSApOwotICAgIHBNb2R1bGUtPmZsYWdzID0gTkVfRkZMQUdTX1NJTkdMRURBVEEgfCBORV9GRkxBR1NfQlVJTFRJTiB8Ci0gICAgICAgICAgICAgICAgICAgICBORV9GRkxBR1NfTElCTU9EVUxFIHwgTkVfRkZMQUdTX1dJTjMyOwotICAgIHBNb2R1bGUtPm1vZHVsZTMyID0gKEhNT0RVTEUzMilhZGRyOwotICAgIHJldHVybiBwTW9kdWxlLT5tb2R1bGUzMjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBCVUlMVElOX0luaXQKICAqCiAgKiBMb2FkIGFsbCBidWlsdC1pbiBtb2R1bGVzIG1hcmtlZCBhcyAnYWx3YXlzIHVzZWQnLgogICovCiBCT09MMzIgQlVJTFRJTl9Jbml0KHZvaWQpCiB7Ci0gICAgQlVJTFRJTl9ETEwgKmRsbDsKKyAgICBCVUlMVElOMTZfRExMICpkbGw7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogICAgIFdPUkQgdmVjdG9yOwogICAgIEhNT0RVTEUxNiBoTW9kdWxlOwogCiAgICAgZm9yIChkbGwgPSBCdWlsdGluRExMczsgZGxsLT5kZXNjcjsgZGxsKyspCiAgICAgewotICAgICAgICBpZiAoIShkbGwtPmZsYWdzICYgRExMX0ZMQUdfQUxXQVlTX1VTRUQpKSBjb250aW51ZTsKLSAgICAgICAgaWYgKGRsbC0+ZmxhZ3MgJiBETExfRkxBR19XSU4zMikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFCVUlMVElOX0RvTG9hZE1vZHVsZTMyKCBkbGwgKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFCVUlMVElOX0RvTG9hZE1vZHVsZTE2KCAmZGxsLT5kZXNjci0+d2luMTYgKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9CisgICAgICAgIGlmIChkbGwtPmZsYWdzICYgRExMX0ZMQUdfQUxXQVlTX1VTRUQpCisgICAgICAgICAgICBpZiAoIUJVSUxUSU5fRG9Mb2FkTW9kdWxlMTYoIGRsbC0+ZGVzY3IgKSkgcmV0dXJuIEZBTFNFOwogICAgIH0KIAogICAgIC8qIFNldCB0aGUgVVNFUiBhbmQgR0RJIGhlYXAgc2VsZWN0b3JzICovCkBAIC00ODgsNyArMjMxLDcgQEAKICAqLwogSE1PRFVMRTMyIEJVSUxUSU5fTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIEJPT0wzMiBmb3JjZSApCiB7Ci0gICAgQlVJTFRJTl9ETEwgKnRhYmxlOworICAgIEJVSUxUSU4xNl9ETEwgKnRhYmxlOwogICAgIGNoYXIgZGxsbmFtZVsxNl0sICpwOwogCiAgICAgLyogRml4IHRoZSBuYW1lIGluIGNhc2Ugd2UgaGF2ZSBhIGZ1bGwgcGF0aCBhbmQgZXh0ZW5zaW9uICovCkBAIC00OTksMTMgKzI0MiwxMCBAQAogCiAgICAgZm9yICh0YWJsZSA9IEJ1aWx0aW5ETExzOyB0YWJsZS0+ZGVzY3I7IHRhYmxlKyspCiAgICAgICAgIGlmICghbHN0cmNtcGkzMkEoIHRhYmxlLT5kZXNjci0+bmFtZSwgZGxsbmFtZSApKSBicmVhazsKLSAgICBpZiAoIXRhYmxlLT5kZXNjcikgcmV0dXJuIDA7CisgICAgaWYgKCF0YWJsZS0+ZGVzY3IpIHJldHVybiBCVUlMVElOMzJfTG9hZE1vZHVsZSggbmFtZSwgZm9yY2UgKTsKICAgICBpZiAoKHRhYmxlLT5mbGFncyAmIERMTF9GTEFHX05PVF9VU0VEKSAmJiAhZm9yY2UpIHJldHVybiAwOwogCi0gICAgaWYgKHRhYmxlLT5mbGFncyAmIERMTF9GTEFHX1dJTjMyKQotICAgICAgICByZXR1cm4gQlVJTFRJTl9Eb0xvYWRNb2R1bGUzMiggdGFibGUgKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBCVUlMVElOX0RvTG9hZE1vZHVsZTE2KCAmdGFibGUtPmRlc2NyLT53aW4xNiApOworICAgIHJldHVybiBCVUlMVElOX0RvTG9hZE1vZHVsZTE2KCB0YWJsZS0+ZGVzY3IgKTsKIH0KIAogCkBAIC01ODQsNDUgKzMyNCw2IEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQlVJTFRJTl9HZXRFbnRyeVBvaW50MzIKLSAqCi0gKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIERMTCBlbnRyeSBwb2ludCBjb3JyZXNwb25kaW5nCi0gKiB0byBhIHJlbGF5IGVudHJ5IHBvaW50IGFkZHJlc3MuIFRoaXMgaXMgdXNlZCBvbmx5IGJ5IHJlbGF5IGRlYnVnZ2luZy4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIF9tdXN0XyByZXR1cm4gdGhlIHJlYWwgZW50cnkgcG9pbnQgdG8gY2FsbAotICogYWZ0ZXIgdGhlIGRlYnVnIGluZm8gaXMgcHJpbnRlZC4KLSAqLwotRkFSUFJPQzMyIEJVSUxUSU5fR2V0RW50cnlQb2ludDMyKCBjaGFyICpidWZmZXIsIHZvaWQgKnJlbGF5LCBEV09SRCAqdHlwZW1hc2sgKQotewotICAgIEJVSUxUSU5fRExMICpkbGw7Ci0gICAgaW50IG9yZGluYWwsIGk7Ci0gICAgY29uc3QgV0lOMzJfREVTQ1JJUFRPUiAqZGVzY3I7Ci0KLSAgICAvKiBGaXJzdCBmaW5kIHRoZSBtb2R1bGUgKi8KLQotICAgIGZvciAoZGxsID0gQnVpbHRpbkRMTHM7IGRsbC0+ZGVzY3I7IGRsbCsrKQotICAgICAgICBpZiAoKGRsbC0+ZmxhZ3MgJiBETExfRkxBR19XSU4zMikgJiYKLSAgICAgICAgICAgICgodm9pZCAqKWRsbC0+ZGJnX2Z1bmNzIDw9IHJlbGF5KSAmJgotICAgICAgICAgICAgKCh2b2lkICopKGRsbC0+ZGJnX2Z1bmNzICsgZGxsLT5kZXNjci0+d2luMzIubmJfZnVuY3MpID4gcmVsYXkpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgYXNzZXJ0KGRsbC0+ZGVzY3IpOwotICAgIGRlc2NyID0gJmRsbC0+ZGVzY3ItPndpbjMyOwotCi0gICAgLyogTm93IGZpbmQgdGhlIGZ1bmN0aW9uICovCi0KLSAgICBvcmRpbmFsID0gKChEV09SRClyZWxheS0oRFdPUkQpZGxsLT5kYmdfZnVuY3MpIC8gc2l6ZW9mKERFQlVHX0VOVFJZX1BPSU5UKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZGVzY3ItPm5iX25hbWVzOyBpKyspCi0gICAgICAgIGlmIChkZXNjci0+b3JkaW5hbHNbaV0gPT0gb3JkaW5hbCkgYnJlYWs7Ci0gICAgYXNzZXJ0KCBpIDwgZGVzY3ItPm5iX25hbWVzICk7Ci0KLSAgICBzcHJpbnRmKCBidWZmZXIsICIlcy4lZDogJXMiLCBkZXNjci0+bmFtZSwgb3JkaW5hbCArIGRlc2NyLT5iYXNlLAotICAgICAgICAgICAgIGRlc2NyLT5uYW1lc1tpXSApOwotICAgICp0eXBlbWFzayA9IGRlc2NyLT5hcmd0eXBlc1tvcmRpbmFsXTsKLSAgICByZXR1cm4gKEZBUlBST0MzMilkZXNjci0+ZnVuY3Rpb25zW29yZGluYWxdOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgQlVJTFRJTl9EZWZhdWx0SW50SGFuZGxlcgogICoKQEAgLTY0NCw3ICszNDUsNyBAQAogICovCiBCT09MMzIgQlVJTFRJTl9QYXJzZURMTE9wdGlvbnMoIGNvbnN0IGNoYXIgKnN0ciApCiB7Ci0gICAgQlVJTFRJTl9ETEwgKmRsbDsKKyAgICBCVUlMVElOMTZfRExMICpkbGw7CiAgICAgY29uc3QgY2hhciAqcDsKIAogICAgIHdoaWxlICgqc3RyKQpAQCAtNjg1LDcgKzM4Niw3IEBACiB2b2lkIEJVSUxUSU5fUHJpbnRETExzKHZvaWQpCiB7CiAgICAgaW50IGk7Ci0gICAgQlVJTFRJTl9ETEwgKmRsbDsKKyAgICBCVUlMVElOMTZfRExMICpkbGw7CiAKICAgICBmcHJpbnRmKHN0ZGVyciwiRXhhbXBsZTogLWRsbCAtb2xlMiAgICBEbyBub3QgdXNlIGVtdWxhdGVkIE9MRTIuRExMXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwiQXZhaWxhYmxlIERMTHM6XG4iKTsKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwuc3BlYyBiL2lmMTYzMi9rZXJuZWwuc3BlYwppbmRleCBjN2ZhOGRhLi5kYjFkYWUyIDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbC5zcGVjCkBAIC0yMTMsMTYgKzIxMywxNiBAQAogMjEzIHN0dWIgS0VSTkVMXzIxMwogMjE0IHN0dWIgS0VSTkVMXzIxNAogMjE2IHBhc2NhbCAgIFJlZ0VudW1LZXkobG9uZyBsb25nIHB0ciBsb25nKSBSZWdFbnVtS2V5MTYKLTIxNyBwYXNjYWwgICBSZWdPcGVuS2V5KGxvbmcgcHRyIHB0cikgUmVnT3BlbktleTE2Ci0yMTggcGFzY2FsICAgUmVnQ3JlYXRlS2V5KGxvbmcgcHRyIHB0cikgUmVnQ3JlYXRlS2V5MTYKLTIxOSBwYXNjYWwgICBSZWdEZWxldGVLZXkobG9uZyBwdHIpIFJlZ0RlbGV0ZUtleTE2CisyMTcgcGFzY2FsICAgUmVnT3BlbktleShsb25nIHN0ciBwdHIpIFJlZ09wZW5LZXkxNgorMjE4IHBhc2NhbCAgIFJlZ0NyZWF0ZUtleShsb25nIHN0ciBwdHIpIFJlZ0NyZWF0ZUtleTE2CisyMTkgcGFzY2FsICAgUmVnRGVsZXRlS2V5KGxvbmcgc3RyKSBSZWdEZWxldGVLZXkxNgogMjIwIHBhc2NhbCAgIFJlZ0Nsb3NlS2V5KGxvbmcpIFJlZ0Nsb3NlS2V5Ci0yMjEgcGFzY2FsICAgUmVnU2V0VmFsdWUobG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWUxNgotMjIyIHBhc2NhbCAgIFJlZ0RlbGV0ZVZhbHVlKGxvbmcgcHRyKSBSZWdEZWxldGVWYWx1ZTE2CisyMjEgcGFzY2FsICAgUmVnU2V0VmFsdWUobG9uZyBzdHIgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWUxNgorMjIyIHBhc2NhbCAgIFJlZ0RlbGV0ZVZhbHVlKGxvbmcgc3RyKSBSZWdEZWxldGVWYWx1ZTE2CiAyMjMgcGFzY2FsICAgUmVnRW51bVZhbHVlKGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0cikgUmVnRW51bVZhbHVlMTYKLTIyNCBwYXNjYWwgICBSZWdRdWVyeVZhbHVlKGxvbmcgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWUxNgotMjI1IHBhc2NhbCAgIFJlZ1F1ZXJ5VmFsdWVFeChsb25nIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFJlZ1F1ZXJ5VmFsdWVFeDE2Ci0yMjYgcGFzY2FsICAgUmVnU2V0VmFsdWVFeChsb25nIHB0ciBsb25nIGxvbmcgcHRyIGxvbmcpIFJlZ1NldFZhbHVlRXgxNgorMjI0IHBhc2NhbCAgIFJlZ1F1ZXJ5VmFsdWUobG9uZyBzdHIgcHRyIHB0cikgUmVnUXVlcnlWYWx1ZTE2CisyMjUgcGFzY2FsICAgUmVnUXVlcnlWYWx1ZUV4KGxvbmcgc3RyIHB0ciBwdHIgcHRyIHB0cikgUmVnUXVlcnlWYWx1ZUV4MTYKKzIyNiBwYXNjYWwgICBSZWdTZXRWYWx1ZUV4KGxvbmcgc3RyIGxvbmcgbG9uZyBwdHIgbG9uZykgUmVnU2V0VmFsdWVFeDE2CiAyMjcgcGFzY2FsICAgUmVnRmx1c2hLZXkobG9uZykgUmVnRmx1c2hLZXkKIDIyOCBzdHViIEsyMjgKIDIyOSBzdHViIEsyMjkKQEAgLTI5OCw3ICsyOTgsNyBAQAogNDIwIHBhc2NhbCAgIEdldEZpbGVBdHRyaWJ1dGVzKHB0cikgR2V0RmlsZUF0dHJpYnV0ZXMxNgogNDIxIHBhc2NhbDE2IFNldEZpbGVBdHRyaWJ1dGVzKHB0ciBsb25nKSBTZXRGaWxlQXR0cmlidXRlczE2CiA0MjIgcGFzY2FsMTYgR2V0RGlza0ZyZWVTcGFjZShwdHIgcHRyIHB0ciBwdHIgcHRyKSBHZXREaXNrRnJlZVNwYWNlMTYgCi00MzEgc3R1YiBLRVJORUxfNDMxCis0MzEgcGFzY2FsMTYgS0VSTkVMXzQzMShzdHIgd29yZCkgS0VSTkVMXzQzMQogNDMyIHN0dWIgRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUKIDQzNSBzdHViIEtFUk5FTF80MzUKIDQzOSBzdHViIEtFUk5FTF80MzkKZGlmZiAtLWdpdCBhL2lmMTYzMi9tbXN5c3RlbS5zcGVjIGIvaWYxNjMyL21tc3lzdGVtLnNwZWMKaW5kZXggYzAxNzhlMS4uY2Q5ODg5YSAxMDA2NDQKLS0tIGEvaWYxNjMyL21tc3lzdGVtLnNwZWMKKysrIGIvaWYxNjMyL21tc3lzdGVtLnNwZWMKQEAgLTEyLDE0ICsxMiwxNCBAQAogMzIgICAgIHN0dWIgICAgU1RBQ0tFTlRFUgogMzMgICAgIHN0dWIgICAgU1RBQ0tMRUFWRQogMzQgICAgIHN0dWIgICAgTU1EUlZJTlNUQUxMCi0xMDEgICAgcGFzY2FsICBKT1lHRVROVU1ERVZTKCkgSm95R2V0TnVtRGV2cwotMTAyICAgIHBhc2NhbCAgSk9ZR0VUREVWQ0FQUyh3b3JkIHB0ciB3b3JkKSBKb3lHZXREZXZDYXBzCi0xMDMgICAgcGFzY2FsICBKT1lHRVRQT1Mod29yZCBwdHIpIEpveUdldFBvcwotMTA0ICAgIHBhc2NhbCAgSk9ZR0VUVEhSRVNIT0xEKHdvcmQgcHRyKSBKb3lHZXRUaHJlc2hvbGQKLTEwNSAgICBwYXNjYWwgIEpPWVJFTEVBU0VDQVBUVVJFKHdvcmQpIEpveVJlbGVhc2VDYXB0dXJlCi0xMDYgICAgcGFzY2FsICBKT1lTRVRDQVBUVVJFKHdvcmQgd29yZCB3b3JkIHdvcmQpIEpveVNldENhcHR1cmUKLTEwNyAgICBwYXNjYWwgIEpPWVNFVFRIUkVTSE9MRCh3b3JkIHdvcmQpIEpveVNldFRocmVzaG9sZAotMTA5ICAgIHBhc2NhbCAgSk9ZU0VUQ0FMSUJSQVRJT04od29yZCkgSm95U2V0Q2FsaWJyYXRpb24KKzEwMSAgICBwYXNjYWwgIGpveUdldE51bURldnMoKSBqb3lHZXROdW1EZXZzMTYKKzEwMiAgICBwYXNjYWwgIGpveUdldERldkNhcHMod29yZCBwdHIgd29yZCkgam95R2V0RGV2Q2FwczE2CisxMDMgICAgcGFzY2FsICBqb3lHZXRQb3Mod29yZCBwdHIpIGpveUdldFBvczE2CisxMDQgICAgcGFzY2FsICBqb3lHZXRUaHJlc2hvbGQod29yZCBwdHIpIGpveUdldFRocmVzaG9sZDE2CisxMDUgICAgcGFzY2FsICBqb3lSZWxlYXNlQ2FwdHVyZSh3b3JkKSBqb3lSZWxlYXNlQ2FwdHVyZTE2CisxMDYgICAgcGFzY2FsICBqb3lTZXRDYXB0dXJlKHdvcmQgd29yZCB3b3JkIHdvcmQpIGpveVNldENhcHR1cmUxNgorMTA3ICAgIHBhc2NhbCAgam95U2V0VGhyZXNob2xkKHdvcmQgd29yZCkgam95U2V0VGhyZXNob2xkMTYKKzEwOSAgICBwYXNjYWwgIGpveVNldENhbGlicmF0aW9uKHdvcmQpIGpveVNldENhbGlicmF0aW9uMTYKIDExMCAgICBzdHViICAgIEpPWUdFVFBPU0VYCiAxMTEgICAgc3R1YiAgICBKT1lDT05GSUdDSEFOR0VECiAyMDEgICAgcGFzY2FsICBtaWRpT3V0R2V0TnVtRGV2cygpIG1pZGlPdXRHZXROdW1EZXZzMTYKQEAgLTk5LDIwICs5OSwyMCBAQAogNTEyICAgIHBhc2NhbCAgd2F2ZUluR2V0UG9zaXRpb24od29yZCBwdHIgd29yZCkgd2F2ZUluR2V0UG9zaXRpb24xNgogNTEzICAgIHBhc2NhbCAgd2F2ZUluR2V0SUQod29yZCBwdHIpIHdhdmVJbkdldElEMTYKIDUxNCAgICBwYXNjYWwgIHdhdmVJbk1lc3NhZ2Uod29yZCB3b3JkIGxvbmcgbG9uZykgd2F2ZUluTWVzc2FnZTE2Ci02MDEgICAgcGFzY2FsICB0aW1lR2V0U3lzdGVtVGltZShwdHIgd29yZCkgdGltZUdldFN5c3RlbVRpbWUKLTYwMiAgICBwYXNjYWwgIHRpbWVTZXRFdmVudCh3b3JkIHdvcmQgc2VncHRyIGxvbmcgd29yZCkgdGltZVNldEV2ZW50Ci02MDMgICAgcGFzY2FsICB0aW1lS2lsbEV2ZW50KHdvcmQpIHRpbWVLaWxsRXZlbnQKLTYwNCAgICBwYXNjYWwgIHRpbWVHZXREZXZDYXBzKHB0ciB3b3JkKSB0aW1lR2V0RGV2Q2FwcwotNjA1ICAgIHBhc2NhbCAgdGltZUJlZ2luUGVyaW9kKHdvcmQpIHRpbWVCZWdpblBlcmlvZAotNjA2ICAgIHBhc2NhbCAgdGltZUVuZFBlcmlvZCh3b3JkKSB0aW1lRW5kUGVyaW9kCis2MDEgICAgcGFzY2FsICB0aW1lR2V0U3lzdGVtVGltZShwdHIgd29yZCkgdGltZUdldFN5c3RlbVRpbWUxNgorNjAyICAgIHBhc2NhbCAgdGltZVNldEV2ZW50KHdvcmQgd29yZCBzZWdwdHIgbG9uZyB3b3JkKSB0aW1lU2V0RXZlbnQxNgorNjAzICAgIHBhc2NhbCAgdGltZUtpbGxFdmVudCh3b3JkKSB0aW1lS2lsbEV2ZW50MTYKKzYwNCAgICBwYXNjYWwgIHRpbWVHZXREZXZDYXBzKHB0ciB3b3JkKSB0aW1lR2V0RGV2Q2FwczE2Cis2MDUgICAgcGFzY2FsICB0aW1lQmVnaW5QZXJpb2Qod29yZCkgdGltZUJlZ2luUGVyaW9kMTYKKzYwNiAgICBwYXNjYWwgIHRpbWVFbmRQZXJpb2Qod29yZCkgdGltZUVuZFBlcmlvZDE2CiA2MDcgICAgcGFzY2FsICB0aW1lR2V0VGltZSgpIHRpbWVHZXRUaW1lCiA3MDEgICAgcGFzY2FsICBNQ0lTRU5EQ09NTUFORCh3b3JkIHdvcmQgbG9uZyBsb25nKSBtY2lTZW5kQ29tbWFuZAogNzAyICAgIHBhc2NhbCAgTUNJU0VORFNUUklORyhzdHIgcHRyIHdvcmQgd29yZCkgbWNpU2VuZFN0cmluZwotNzAzICAgIHBhc2NhbCAgTUNJR0VUREVWSUNFSUQocHRyKSBtY2lHZXREZXZpY2VJRAotNzA1ICAgIHN0dWIgICAgTUNJTE9BRENPTU1BTkRSRVNPVVJDRQorNzAzICAgIHBhc2NhbCAgbWNpR2V0RGV2aWNlSUQocHRyKSBtY2lHZXREZXZpY2VJRAorNzA1ICAgIHBhc2NhbCAgbWNpTG9hZENvbW1hbmRSZXNvdXJjZSh3b3JkIHN0ciB3b3JkKSBtY2lMb2FkQ29tbWFuZFJlc291cmNlMTYKIDcwNiAgICBwYXNjYWwgIG1jaUdldEVycm9yU3RyaW5nKGxvbmcgcHRyIHdvcmQpIG1jaUdldEVycm9yU3RyaW5nMTYKLTcwNyAgICBzdHViICAgIE1DSVNFVERSSVZFUkRBVEEKLTcwOCAgICBzdHViICAgIE1DSUdFVERSSVZFUkRBVEEKKzcwNyAgICBwYXNjYWwgIG1jaVNldERyaXZlckRhdGEod29yZCBsb25nKSBtY2lTZXREcml2ZXJEYXRhMTYKKzcwOCAgICBwYXNjYWwgIG1jaUdldERyaXZlckRhdGEod29yZCkgbWNpR2V0RHJpdmVyRGF0YTE2CiA3MTAgICAgc3R1YiAgICBNQ0lEUklWRVJZSUVMRAogNzExICAgIHN0dWIgICAgTUNJRFJJVkVSTk9USUZZCiA3MTIgICAgc3R1YiAgICBNQ0lFWEVDVVRFCkBAIC0xMzEsOSArMTMxLDkgQEAKIDgwNyAgICBwYXNjYWwgIG1peGVyR2V0TGluZUNvbnRyb2xzKHdvcmQgcHRyIGxvbmcpIG1peGVyR2V0TGluZUNvbnRyb2xzMTYKIDgwOCAgICBwYXNjYWwgIG1peGVyR2V0Q29udHJvbERldGFpbHMod29yZCBwdHIgbG9uZykgbWl4ZXJHZXRDb250cm9sRGV0YWlsczE2CiA4MDkgICAgcGFzY2FsICBtaXhlclNldENvbnRyb2xEZXRhaWxzKHdvcmQgcHRyIGxvbmcpIG1peGVyU2V0Q29udHJvbERldGFpbHMxNgotOTAwICAgIHN0dWIgICAgTU1UQVNLQ1JFQVRFCis5MDAgICAgcGFzY2FsICBtbVRhc2tDcmVhdGUocHRyIGxvbmcgbG9uZykgbW1UYXNrQ3JlYXRlMTYKIDkwMiAgICBzdHViICAgIE1NVEFTS0JMT0NLCi05MDMgICAgc3R1YiAgICBNTVRBU0tTSUdOQUwKKzkwMyAgICBwYXNjYWwgIG1tVGFza1NpZ25hbCh3b3JkKSBtbVRhc2tTaWduYWwxNgogOTA0ICAgIHN0dWIgICAgTU1HRVRDVVJSRU5UVEFTSwogOTA1ICAgIHN0dWIgICAgTU1UQVNLWUlFTEQKIDExMDAgICBwYXNjYWwgIERSVk9QRU4oc3RyIHN0ciBsb25nKSBEcnZPcGVuCkBAIC0xNDEsMTIgKzE0MSwxMiBAQAogMTEwMiAgIHBhc2NhbCAgRFJWU0VORE1FU1NBR0Uod29yZCB3b3JkIGxvbmcgbG9uZykgRHJ2U2VuZE1lc3NhZ2UKIDExMDMgICBwYXNjYWwgIERSVkdFVE1PRFVMRUhBTkRMRSh3b3JkKSBEcnZHZXRNb2R1bGVIYW5kbGUKIDExMDQgICBwYXNjYWwgIERSVkRFRkRSSVZFUlBST0MobG9uZyB3b3JkIHdvcmQgbG9uZyBsb25nKSBEcnZEZWZEcml2ZXJQcm9jCi0xMTIwICAgc3R1YiAgICBNTVRIUkVBRENSRUFURQotMTEyMSAgIHN0dWIgICAgTU1USFJFQURTSUdOQUwKKzExMjAgICBwYXNjYWwgIG1tVGhyZWFkQ3JlYXRlKHB0ciBwdHIgbG9uZyBsb25nKSBtbVRocmVhZENyZWF0ZTE2CisxMTIxICAgcGFzY2FsICBtbVRocmVhZFNpZ25hbCh3b3JkKSBtbVRocmVhZFNpZ25hbDE2CiAxMTIyICAgc3R1YiAgICBNTVRIUkVBREJMT0NLCiAxMTIzICAgc3R1YiAgICBNTVRIUkVBRElTQ1VSUkVOVAogMTEyNCAgIHN0dWIgICAgTU1USFJFQURJU1ZBTElECi0xMTI1ICAgc3R1YiAgICBNTVRIUkVBREdFVFRBU0sKKzExMjUgICBwYXNjYWwgIG1tVGhyZWFkR2V0VGFzayh3b3JkKSBtbVRocmVhZEdldFRhc2sxNgogMTE1MCAgIHN0dWIgICAgTU1TSE9XTU1DUExQUk9QRVJUWVNIRUVUCiAxMjEwICAgcGFzY2FsICBtbWlvT3BlbihzdHIgcHRyIGxvbmcpIG1taW9PcGVuMTYKIDEyMTEgICBwYXNjYWwgIE1NSU9DTE9TRSh3b3JkIHdvcmQpIG1taW9DbG9zZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL29sZTJ0aGsuc3BlYyBiL2lmMTYzMi9vbGUydGhrLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0NWE5OAotLS0gL2Rldi9udWxsCisrKyBiL2lmMTYzMi9vbGUydGhrLnNwZWMKQEAgLTAsMCArMSwxMCBAQAorbmFtZQlvbGUydGhrCit0eXBlCXdpbjE2CisKKzEgc3R1YiBXRVAKKzIgc3R1YiBST1QxNl9JU1JVTk5JTkcxNgorMyBzdHViIElTV0lOMzJTSEFORExFCis0IHN0dWIgX19fRVhQT1JURURTVFVCCis1IHN0dWIgQ09USEtDT01NT04KKzYgc3R1YiBST1QxNl9HRVRUSU1FT0ZMQVNUQ0hBTkdFMTYKKzcgc3R1YiBST1QxNl9HRVRPQkpFQ1QxNgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCBhNDkxMTRkLi42NTk2YmU1IDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtMjMyLDIwOCArMjMyLDYgQEAKIH0KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSRUxBWV9DYWxsRnJvbTMyCi0gKgotICogU3RhY2sgbGF5b3V0IG9uIGVudHJ5IHRvIHRoaXMgZnVuY3Rpb246Ci0gKiAgLi4uICAgICAgLi4uCi0gKiAoZXNwKzEyKSAgYXJnMgotICogKGVzcCs4KSAgIGFyZzEKLSAqIChlc3ArNCkgICByZXRfYWRkcgotICogKGVzcCkgICAgIHJldHVybiBhZGRyIHRvIHJlbGF5IGNvZGUKLSAqLwotaW50IFJFTEFZX0NhbGxGcm9tMzIoIGludCByZXRfYWRkciwgLi4uICkKLXsKLSAgICBpbnQgaSwgcmV0OwotICAgIGNoYXIgYnVmZmVyWzgwXTsKLSAgICBGQVJQUk9DMzIgZnVuYzsKLSAgICBEV09SRCBtYXNrLCB0eXBlbWFzazsKLQotICAgIGludCAqYXJncyA9ICZyZXRfYWRkcjsKLSAgICAvKiBSZWxheSBhZGRyIGlzIHRoZSByZXR1cm4gYWRkcmVzcyBmb3IgdGhpcyBmdW5jdGlvbiAqLwotICAgIEJZVEUgKnJlbGF5X2FkZHIgPSAoQllURSAqKWFyZ3NbLTFdOwotICAgIFdPUkQgbmJfYXJncyA9ICooV09SRCAqKShyZWxheV9hZGRyICsgMSkgLyBzaXplb2YoaW50KTsKLQotICAgIGFzc2VydChkZWJ1Z2dpbmdfcmVsYXkpOwotICAgIGZ1bmMgPSBCVUlMVElOX0dldEVudHJ5UG9pbnQzMiggYnVmZmVyLCByZWxheV9hZGRyIC0gNSwgJnR5cGVtYXNrICk7Ci0gICAgcHJpbnRmKCAiQ2FsbCAlcygiLCBidWZmZXIgKTsKLSAgICBhcmdzKys7Ci0gICAgZm9yIChpID0gMCwgbWFzayA9IDM7IGkgPCBuYl9hcmdzOyBpKyssIG1hc2sgPDw9IDIpCi0gICAgewotICAgICAgICBpZiAoaSkgcHJpbnRmKCAiLCIgKTsKLQlpZiAoKHR5cGVtYXNrICYgbWFzaykgJiYgSElXT1JEKGFyZ3NbaV0pKQotICAgICAgICB7Ci0JICAgIGlmICh0eXBlbWFzayAmICgyPDwoMippKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBidWZmWzgwXTsKLSAgICAgICAgICAgICAgICBsc3RyY3B5bld0b0EoIGJ1ZmYsIChMUFdTVFIpYXJnc1tpXSwgc2l6ZW9mKGJ1ZmYpICk7Ci0JICAgIAlwcmludGYoICIlMDh4IExcIiVzXCIiLCBhcmdzW2ldLCBidWZmICk7Ci0JICAgIH0KLSAgICAgICAgICAgIGVsc2UgcHJpbnRmKCAiJTA4eCBcIiVzXCIiLCBhcmdzW2ldLCAoY2hhciAqKWFyZ3NbaV0gKTsKLQl9Ci0gICAgICAgIGVsc2UgcHJpbnRmKCAiJTA4eCIsIGFyZ3NbaV0gKTsKLSAgICB9Ci0gICAgcHJpbnRmKCAiKSByZXQ9JTA4eFxuIiwgcmV0X2FkZHIgKTsKLSAgICBpZiAoKnJlbGF5X2FkZHIgPT0gMHhjMykgLyogY2RlY2wgKi8KLSAgICB7Ci0gICAgICAgIExSRVNVTFQgKCpjZnVuYykoKSA9IChMUkVTVUxUKCopKCkpZnVuYzsKLSAgICAgICAgc3dpdGNoKG5iX2FyZ3MpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAwOiByZXQgPSBjZnVuYygpOyBicmVhazsKLSAgICAgICAgY2FzZSAxOiByZXQgPSBjZnVuYyhhcmdzWzBdKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pOyBicmVhazsKLSAgICAgICAgY2FzZSA0OiByZXQgPSBjZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0pOyBicmVhazsKLSAgICAgICAgY2FzZSA3OiByZXQgPSBjZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgODogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0pOyBicmVhazsKLSAgICAgICAgY2FzZSAxMDogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0pOyBicmVhazsKLSAgICAgICAgY2FzZSAxMTogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0pOyBicmVhazsKLSAgICAgICAgY2FzZSAxMjogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMTFdKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IHJldCA9IGNmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdLGFyZ3NbMTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzEyXSk7IGJyZWFrOwotICAgICAgICBjYXNlIDE0OiByZXQgPSBjZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSxhcmdzWzExXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1sxMl0sYXJnc1sxM10pOyBicmVhazsKLSAgICAgICAgY2FzZSAxNTogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sYXJnc1sxMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMTJdLGFyZ3NbMTNdLGFyZ3NbMTRdKTsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJSRUxBWV9DYWxsRnJvbTMyOiBVbnN1cHBvcnRlZCBuYiBhcmdzICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgbmJfYXJncyApOwotICAgICAgICAgICAgYXNzZXJ0KEZBTFNFKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlICAvKiBzdGRjYWxsICovCi0gICAgewotICAgICAgICBzd2l0Y2gobmJfYXJncykKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6IHJldCA9IGZ1bmMoKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogcmV0ID0gZnVuYyhhcmdzWzBdKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogcmV0ID0gZnVuYyhhcmdzWzBdLGFyZ3NbMV0pOyBicmVhazsKLSAgICAgICAgY2FzZSAzOiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogcmV0ID0gZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogcmV0ID0gZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pOyBicmVhazsKLSAgICAgICAgY2FzZSA2OiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0pOyBicmVhazsKLSAgICAgICAgY2FzZSA3OiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSk7IGJyZWFrOwotICAgICAgICBjYXNlIDg6IHJldCA9IGZ1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdLGFyZ3NbN10pOyBicmVhazsKLSAgICAgICAgY2FzZSA5OiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0pOyBicmVhazsKLSAgICAgICAgY2FzZSAxMDogcmV0ID0gZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6IHJldCA9IGZ1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSk7IGJyZWFrOwotICAgICAgICBjYXNlIDEyOiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1sxMV0pOyBicmVhazsKLSAgICAgICAgY2FzZSAxMzogcmV0ID0gZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdLGFyZ3NbMTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMTJdKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ6IHJldCA9IGZ1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSxhcmdzWzExXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzEyXSxhcmdzWzEzXSk7IGJyZWFrOwotICAgICAgICBjYXNlIDE1OiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sYXJnc1sxMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1sxMl0sYXJnc1sxM10sYXJnc1sxNF0pOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlJFTEFZX0NhbGxGcm9tMzI6IFVuc3VwcG9ydGVkIG5iIGFyZ3MgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICBuYl9hcmdzICk7Ci0gICAgICAgICAgICBhc3NlcnQoRkFMU0UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZiggIlJldCAgJXMoKSByZXR2YWw9JTA4eCByZXQ9JTA4eFxuIiwgYnVmZmVyLCByZXQsIHJldF9hZGRyICk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBSRUxBWV9DYWxsRnJvbTMyUmVncwotICoKLSAqICdzdGFjaycgcG9pbnRzIHRvIHRoZSByZWxheSBhZGRyIG9uIHRoZSBzdGFjay4KLSAqIFN0YWNrIGxheW91dDoKLSAqICAuLi4gICAgICAuLi4KLSAqIChlc3ArMjE2KSByZXRfYWRkcgotICogKGVzcCsyMTIpIHJldHVybiB0byByZWxheSBkZWJ1Z2dpbmcgY29kZSAob25seSB3aGVuIGRlYnVnZ2luZ19yZWxheSkKLSAqIChlc3ArMjA4KSBlbnRyeSBwb2ludCB0byBjYWxsCi0gKiAoZXNwKzQpICAgQ09OVEVYVAotICogKGVzcCkgICAgIHJldHVybiBhZGRyIHRvIHJlbGF5IGNvZGUKLSAqLwotdm9pZCBSRUxBWV9DYWxsRnJvbTMyUmVncyggQ09OVEVYVCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoQ0FMTEJBQ0sgKmVudHJ5X3BvaW50KShDT05URVhUICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQllURSAqcmVsYXlfYWRkciwgaW50IHJldF9hZGRyICkKLXsKLSAgICBpZiAoIWRlYnVnZ2luZ19yZWxheSkKLSAgICB7Ci0gICAgICAgIC8qIFNpbXBseSBjYWxsIHRoZSBlbnRyeSBwb2ludCAqLwotICAgICAgICBlbnRyeV9wb2ludCggJmNvbnRleHQgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgY2hhciBidWZmZXJbODBdOwotICAgICAgICBEV09SRCB0eXBlbWFzazsKLQotICAgIAlfX1JFU1RPUkVfRVM7Ci0gICAgICAgIC8qIEZpeHVwIHRoZSBjb250ZXh0IHN0cnVjdHVyZSBiZWNhdXNlIG9mIHRoZSBleHRyYSBwYXJhbWV0ZXIgKi8KLSAgICAgICAgLyogcHVzaGVkIGJ5IHRoZSByZWxheSBkZWJ1Z2dpbmcgY29kZSAqLwotCi0gICAgICAgIEVJUF9yZWcoJmNvbnRleHQpID0gcmV0X2FkZHI7Ci0gICAgICAgIEVTUF9yZWcoJmNvbnRleHQpICs9IHNpemVvZihpbnQpOwotCi0gICAgICAgIEJVSUxUSU5fR2V0RW50cnlQb2ludDMyKCBidWZmZXIsIHJlbGF5X2FkZHIgLSA1LCAmdHlwZW1hc2sgKTsKLSAgICAgICAgcHJpbnRmKCJDYWxsICVzKHJlZ3MpIHJldD0lMDh4XG4iLCBidWZmZXIsIHJldF9hZGRyICk7Ci0gICAgICAgIHByaW50ZigiIEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseCBFU0k9JTA4bHggRURJPSUwOGx4XG4iLAotICAgICAgICAgICAgICAgIEVBWF9yZWcoJmNvbnRleHQpLCBFQlhfcmVnKCZjb250ZXh0KSwgRUNYX3JlZygmY29udGV4dCksCi0gICAgICAgICAgICAgICAgRURYX3JlZygmY29udGV4dCksIEVTSV9yZWcoJmNvbnRleHQpLCBFRElfcmVnKCZjb250ZXh0KSApOwotICAgICAgICBwcmludGYoIiBFQlA9JTA4bHggRVNQPSUwOGx4IEVJUD0lMDhseCBEUz0lMDRseCBFUz0lMDRseCBGUz0lMDRseCBHUz0lMDRseCBFRkw9JTA4bHhcbiIsCi0gICAgICAgICAgICAgICAgRUJQX3JlZygmY29udGV4dCksIEVTUF9yZWcoJmNvbnRleHQpLCBFSVBfcmVnKCZjb250ZXh0KSwKLSAgICAgICAgICAgICAgICBEU19yZWcoJmNvbnRleHQpLCBFU19yZWcoJmNvbnRleHQpLCBGU19yZWcoJmNvbnRleHQpLAotICAgICAgICAgICAgICAgIEdTX3JlZygmY29udGV4dCksIEVGTF9yZWcoJmNvbnRleHQpICk7Ci0KLSAgICAgICAgLyogTm93IGNhbGwgdGhlIHJlYWwgZnVuY3Rpb24gKi8KLSAgICAgICAgZW50cnlfcG9pbnQoICZjb250ZXh0ICk7Ci0KLSAgICAgICAgcHJpbnRmKCJSZXQgICVzKCkgcmV0dmFsPXJlZ3MgcmV0PSUwOHhcbiIsIGJ1ZmZlciwgcmV0X2FkZHIgKTsKLSAgICAgICAgcHJpbnRmKCIgRUFYPSUwOGx4IEVCWD0lMDhseCBFQ1g9JTA4bHggRURYPSUwOGx4IEVTST0lMDhseCBFREk9JTA4bHhcbiIsCi0gICAgICAgICAgICAgICAgRUFYX3JlZygmY29udGV4dCksIEVCWF9yZWcoJmNvbnRleHQpLCBFQ1hfcmVnKCZjb250ZXh0KSwKLSAgICAgICAgICAgICAgICBFRFhfcmVnKCZjb250ZXh0KSwgRVNJX3JlZygmY29udGV4dCksIEVESV9yZWcoJmNvbnRleHQpICk7Ci0gICAgICAgIHByaW50ZigiIEVCUD0lMDhseCBFU1A9JTA4bHggRUlQPSUwOGx4IERTPSUwNGx4IEVTPSUwNGx4IEZTPSUwNGx4IEdTPSUwNGx4IEVGTD0lMDhseFxuIiwKLSAgICAgICAgICAgICAgICBFQlBfcmVnKCZjb250ZXh0KSwgRVNQX3JlZygmY29udGV4dCksIEVJUF9yZWcoJmNvbnRleHQpLAotICAgICAgICAgICAgICAgIERTX3JlZygmY29udGV4dCksIEVTX3JlZygmY29udGV4dCksIEZTX3JlZygmY29udGV4dCksCi0gICAgICAgICAgICAgICAgR1NfcmVnKCZjb250ZXh0KSwgRUZMX3JlZygmY29udGV4dCkgKTsKLSAgICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgUkVMQVlfVW5pbXBsZW1lbnRlZDMyCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHVuaW1wbGVtZW50ZWQgMzItYml0IGVudHJ5IHBvaW50cyAoZGVjbGFyZWQKLSAqIGFzICdzdHViJyBpbiB0aGUgc3BlYyBmaWxlKS4KLSAqLwotdm9pZCBSRUxBWV9VbmltcGxlbWVudGVkMzIoIGNvbnN0IGNoYXIgKmRsbF9uYW1lLCBpbnQgb3JkaW5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jX25hbWUsIGludCByZXRfYWRkciApCi17Ci0gICAgX19SRVNUT1JFX0VTOyAgLyogSnVzdCBpbiBjYXNlICovCi0gICAgZnByaW50Ziggc3RkZXJyLCAiTm8gaGFuZGxlciBmb3IgV2luMzIgcm91dGluZSAlcy4lZDogJXMgKGNhbGxlZCBmcm9tICUwOHgpXG4iLAotICAgICAgICAgICAgIGRsbF9uYW1lLCBvcmRpbmFsLCBmdW5jX25hbWUsIHJldF9hZGRyICk7Ci0gICAgVEFTS19LaWxsQ3VycmVudFRhc2soMSk7Ci19Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICAgQ2F0Y2ggICAgKEtFUk5FTC41NSkKICAqCmRpZmYgLS1naXQgYS9pZjE2MzIvdGh1bmsuYyBiL2lmMTYzMi90aHVuay5jCmluZGV4IDRhOWE0NDYuLjViYjZlYmEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi90aHVuay5jCisrKyBiL2lmMTYzMi90aHVuay5jCkBAIC0xLDEwICsxLDEwIEBACiAvKgotICogRW11bGF0b3IgYW5kIFdpbjk1IHRodW5rcworICogRW11bGF0b3IgdGh1bmtzCiAgKgogICogQ29weXJpZ2h0IDE5OTYsIDE5OTcgQWxleGFuZHJlIEp1bGxpYXJkCi0gKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICAqLwogCisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJyZXNvdXJjZS5oIgpAQCAtMjYsOCArMjYsOCBAQAogLyogYnkgdGhlIGJ1aWxkIHByb2dyYW0gdG8gZ2VuZXJhdGUgdGhlIGZpbGUgaWYxNjMyL2NhbGx0bzE2LlMgKi8KIAogLyogIyMjIHN0YXJ0IGJ1aWxkICMjIyAqLwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfcmVnc19zaG9ydChjb25zdCBDT05URVhUICpjb250ZXh0LCBJTlQzMiBvZmZzZXQpOwotZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfcmVnc19sb25nIChjb25zdCBDT05URVhUICpjb250ZXh0LCBJTlQzMiBvZmZzZXQpOworZXh0ZXJuIExPTkcgQ0FMTEJBQ0sgQ2FsbFRvMTZfc3JlZ18oY29uc3QgQ09OVEVYVCAqY29udGV4dCwgSU5UMzIgb2Zmc2V0KTsKK2V4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xyZWdfKGNvbnN0IENPTlRFWFQgKmNvbnRleHQsIElOVDMyIG9mZnNldCk7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkXyAgICAgKEZBUlBST0MxNik7CiBleHRlcm4gV09SRCBDQUxMQkFDSyBDYWxsVG8xNl93b3JkX3cgICAgKEZBUlBST0MxNixXT1JEKTsKIGV4dGVybiBMT05HIENBTExCQUNLIENhbGxUbzE2X2xvbmdfbCAgICAoRkFSUFJPQzE2LExPTkcpOwpAQCAtOTgsNyArOTgsOCBAQAogLyogQ2FsbGJhY2tzIGZ1bmN0aW9uIHRhYmxlIGZvciB0aGUgZW11bGF0b3IgKi8KIHN0YXRpYyBjb25zdCBDQUxMQkFDS1NfVEFCTEUgQ0FMTEJBQ0tfRW11bGF0b3JUYWJsZSA9CiB7Ci0gICAgKHZvaWQgKilDYWxsVG8xNl9yZWdzX3Nob3J0LCAgICAgICAgICAgLyogQ2FsbFJlZ2lzdGVyUHJvYyAqLworICAgICh2b2lkICopQ2FsbFRvMTZfc3JlZ18sICAgICAgICAgICAgICAgIC8qIENhbGxSZWdpc3RlclNob3J0UHJvYyAqLworICAgICh2b2lkICopQ2FsbFRvMTZfbHJlZ18sICAgICAgICAgICAgICAgIC8qIENhbGxSZWdpc3RlckxvbmdQcm9jICovCiAgICAgVEhVTktfQ2FsbFRhc2tSZXNjaGVkdWxlLCAgICAgICAgICAgICAgLyogQ2FsbFRhc2tSZXNjaGVkdWxlUHJvYyAqLwogICAgIENhbGxGcm9tMTZfbG9uZ193d3dsbCwgICAgICAgICAgICAgICAgIC8qIENhbGxGcm9tMTZXbmRQcm9jICovCiAgICAgVEhVTktfQ2FsbFduZFByb2MxNiwgICAgICAgICAgICAgICAgICAgLyogQ2FsbFduZFByb2MgKi8KQEAgLTExMCw2ICsxMTEsNyBAQAogICAgICh2b2lkICopQ2FsbFRvMTZfd29yZF93dywgICAgICAgICAgICAgIC8qIENhbGxCb290QXBwUHJvYyAqLwogICAgICh2b2lkICopQ2FsbFRvMTZfd29yZF93d3csICAgICAgICAgICAgIC8qIENhbGxMb2FkQXBwU2VnUHJvYyAqLwogICAgICh2b2lkICopQ2FsbFRvMTZfd29yZF8sICAgICAgICAgICAgICAgIC8qIENhbGxTeXN0ZW1UaW1lclByb2MgKi8KKyAgICAodm9pZCAqKUNhbGxUbzE2X2xvbmdfbCwgICAgICAgICAgICAgICAvKiBDYWxsV09XQ2FsbGJhY2tQcm9jICovCiAgICAgKHZvaWQgKilDYWxsVG8xNl9sb25nX2wsICAgICAgICAgICAgICAgLyogQ2FsbEFTUElQb3N0UHJvYyAqLwogICAgICh2b2lkICopQ2FsbFRvMTZfd29yZF9sd2xsLCAgICAgICAgICAgIC8qIENhbGxEcnZDb250cm9sUHJvYyAqLwogICAgICh2b2lkICopQ2FsbFRvMTZfd29yZF9sd2xsbCwgICAgICAgICAgIC8qIENhbGxEcnZFbmFibGVQcm9jICovCkBAIC0xODMsNyArMTg1LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KLSAgICBmcHJpbnRmKCBzdGRlcnIsICJUSFVOS19GcmVlOiBpbnZhbGlkIHRodW5rIGFkZHIgJXBcbiIsIHRodW5rICk7CisgICAgZHByaW50Zl90aHVuayggc3RkZGViLCAiVEhVTktfRnJlZTogaW52YWxpZCB0aHVuayBhZGRyICVwXG4iLCB0aHVuayApOwogfQogCiAKQEAgLTI0Niw3ICsyNDgsNyBAQAogICAgIGFyZ3NbNF0gPSBod25kOwogICAgIC8qIGFyZ3NbNV0gYW5kIGFyZ3NbNl0gYXJlIHVzZWQgYnkgcmVsYXkgY29kZSB0byBzdG9yZSB0aGUgc3RhY2sgcG9pbnRlciAqLwogCi0gICAgcmV0ID0gQ2FsbFRvMTZfcmVnc19zaG9ydCggJmNvbnRleHQsIC0oNSAqIHNpemVvZihXT1JEKSkgKTsKKyAgICByZXQgPSBDYWxsVG8xNl9zcmVnXyggJmNvbnRleHQsIC0oNSAqIHNpemVvZihXT1JEKSkgKTsKICAgICBpZiAob2Zmc2V0KSBTVEFDSzE2X1BPUChvZmZzZXQpOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC01NzIsNTk4ICs1NzQsMyBAQAogICAgIH0KICAgICByZXR1cm4gTlVMTDsKIH0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgIFdpbjk1IGludGVybmFsIHRodW5rcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBHZW5lcmF0ZXMgYSBGVF9Qcm9sb2cgY2FsbC4KLSAqCQotICogIDBGQjZEMSAgICAgICAgICAgICAgICAgIG1vdnpibCBlZHgsY2wKLSAqICA4QjE0OTV4eHh4eHh4eAkgICAgbW92IGVkeCxbNCplZHggKyB4eHh4eHh4eF0KLSAqICA2OHh4eHh4eHh4CQkgICAgcHVzaCBGVF9Qcm9sb2cKLSAqICBDMwkJCSAgICBscmV0Ci0gKi8KLXN0YXRpYyB2b2lkIF93cml0ZV9mdHByb2xvZyhMUEJZVEUgdGh1bmssRFdPUkQgdGh1bmtzdGFydCkgewotCUxQQllURQl4OwotCi0JeAk9IHRodW5rOwotCSp4KysJPSAweDBmOyp4Kys9MHhiNjsqeCsrPTB4ZDE7IC8qIG1vdnpibCBlZHgsY2wgKi8KLQkqeCsrCT0gMHg4QjsqeCsrPTB4MTQ7KngrKz0weDk1OyooRFdPUkQqKXg9IHRodW5rc3RhcnQ7Ci0JeCs9NDsJLyogbW92IGVkeCwgWzQqZWR4ICsgdGh1bmtzdGFydF0gKi8KLQkqeCsrCT0gMHg2ODsgKihEV09SRCopeCA9IChEV09SRClHZXRQcm9jQWRkcmVzczMyKEdldE1vZHVsZUhhbmRsZTMyQSgiS0VSTkVMMzIiKSwiRlRfUHJvbG9nIik7Ci0JeCs9NDsgCS8qIHB1c2ggRlRfUHJvbG9nICovCi0JKngrKwk9IDB4QzM7CQkvKiBscmV0ICovCi0JLyogZmlsbCByZXN0IHdpdGggMHhDQyAvIGludCAzICovCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlGVF9Qcm9sb2dQcmltZQkJCShLRVJORUwzMi44OSkKLSAqLwotdm9pZCBXSU5BUEkgRlRfUHJvbG9nUHJpbWUoRFdPUkQgc3RhcnRpbmQsTFBCWVRFIHRodW5rKSB7Ci0JX3dyaXRlX2Z0cHJvbG9nKHRodW5rLCooRFdPUkQqKShzdGFydGluZCt0aHVuaykpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEdlbmVyYXRlcyBhIFFUX1RodW5rIHN0eWxlIGNhbGwuCi0gKgkKLSAqICAzM0M5ICAgICAgICAgICAgICAgICAgICB4b3IgZWN4LCBlY3gKLSAqICA4QTRERkMgICAgICAgICAgICAgICAgICBtb3YgY2wgLCBbZWJwLTA0XQotICogIDhCMTQ4RHh4eHh4eHh4ICAgICAgICAgIG1vdiBlZHgsIFs0KmVjeCArIChFQVgrRURYKV0KLSAqICBCOHl5eXl5eXl5ICAgICAgICAgICAgICBtb3YgZWF4LCBRVF9UaHVuawotICogIEZGRTAgICAgICAgICAgICAgICAgICAgIGptcCBlYXgKLSAqLwotc3RhdGljIHZvaWQgX3dyaXRlX3F0dGh1bmsoTFBCWVRFIHN0YXJ0LERXT1JEIHRodW5rc3RhcnQpIHsKLQlMUEJZVEUJeDsKLQotCXgJPSBzdGFydDsKLQkqeCsrCT0gMHgzMzsqeCsrPTB4Qzk7IC8qIHhvciBlY3gsZWN4ICovCi0JKngrKwk9IDB4OEE7KngrKz0weDREOyp4Kys9MHhGQzsgLyogbW92YiBjbCxbZWJwLTA0XSAqLwotCSp4KysJPSAweDhCOyp4Kys9MHgxNDsqeCsrPTB4OEQ7KihEV09SRCopeD0gdGh1bmtzdGFydDsKLQl4Kz00OwkvKiBtb3YgZWR4LCBbNCplY3ggKyAoRUFYK0VEWCkgKi8KLQkqeCsrCT0gMHhCODsgKihEV09SRCopeCA9IChEV09SRClHZXRQcm9jQWRkcmVzczMyKEdldE1vZHVsZUhhbmRsZTMyQSgiS0VSTkVMMzIiKSwiUVRfVGh1bmsiKTsKLQl4Kz00OyAJLyogbW92IGVheCAsIFFUX1RodW5rICovCi0JKngrKwk9IDB4RkY7ICp4KysgPSAweEUwOwkvKiBqbXAgZWF4ICovCi0JLyogc2hvdWxkIGZpbGwgdGhlIHJlc3Qgb2YgdGhlIDMyIGJ5dGVzIHdpdGggMHhDQyAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlUaHVua0Nvbm5lY3QzMgkJKEtFUk5FTDMyKQotICogQ29ubmVjdHMgYSAzMmJpdCBhbmQgYSAxNmJpdCB0aHVua2J1ZmZlci4KLSAqLwotc3RydWN0IHRodW5rc3RydWN0Ci17Ci0JY2hhcgltYWdpY1s0XTsKLQlEV09SRAlsZW5ndGg7Ci0JRFdPUkQJcHRyOwotCURXT1JECXgwQzsKLQotCURXT1JECXgxMDsKLQlEV09SRAl4MTQ7Ci0JRFdPUkQJeDE4OwotCURXT1JECXgxQzsKLQlEV09SRAl4MjA7Ci19OwotCi1VSU5UMzIgV0lOQVBJIFRodW5rQ29ubmVjdDMyKCBzdHJ1Y3QgdGh1bmtzdHJ1Y3QgKnRocywgTFBTVFIgdGh1bmtmdW4xNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIG1vZHVsZTE2LCBMUFNUUiBtb2R1bGUzMiwgSE1PRFVMRTMyIGhtb2QzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRsbGluaXRhcmcxICkKLXsKLQlISU5TVEFOQ0UxNglobW07Ci0JU0VHUFRSCQl0aGtidWY7Ci0Jc3RydWN0CXRodW5rc3RydWN0CSp0aHMxNjsKLQotCWZwcmludGYoc3RkbmltcCwiVGh1bmtDb25uZWN0MzIoPHN0cnVjdD4sJXMsJXMsJXMsJXgsJWx4KVxuIiwKLQkJdGh1bmtmdW4xNixtb2R1bGUzMixtb2R1bGUxNixobW9kMzIsZGxsaW5pdGFyZzEKLQkpOwotCWZwcmludGYoc3RkbmltcCwiCW1hZ2ljID0gJWMlYyVjJWNcbiIsCi0JCXRocy0+bWFnaWNbMF0sCi0JCXRocy0+bWFnaWNbMV0sCi0JCXRocy0+bWFnaWNbMl0sCi0JCXRocy0+bWFnaWNbM10KLQkpOwotCWZwcmludGYoc3RkbmltcCwiCWxlbmd0aCA9ICVseFxuIix0aHMtPmxlbmd0aCk7Ci0JaWYgKGxzdHJuY21wMzJBKHRocy0+bWFnaWMsIlNMMDEiLDQpJiZsc3RybmNtcDMyQSh0aHMtPm1hZ2ljLCJMUzAxIiw0KSkKLQkJcmV0dXJuIDA7Ci0JaG1tPUxvYWRNb2R1bGUxNihtb2R1bGUxNixOVUxMKTsKLQlpZiAoaG1tPD0zMikKLQkJcmV0dXJuIDA7Ci0JdGhrYnVmPShTRUdQVFIpV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihobW0sdGh1bmtmdW4xNik7Ci0JaWYgKCF0aGtidWYpCi0JCXJldHVybiAwOwotCXRoczE2PShzdHJ1Y3QgdGh1bmtzdHJ1Y3QqKVBUUl9TRUdfVE9fTElOKHRoa2J1Zik7Ci0JaWYgKGxzdHJuY21wMzJBKHRoczE2LT5tYWdpYyx0aHMtPm1hZ2ljLDQpKQotCQlyZXR1cm4gMDsKLQotCWlmICghbHN0cm5jbXAzMkEodGhzLT5tYWdpYywiU0wwMSIsNCkpICB7Ci0JCWlmICh0aHMxNi0+bGVuZ3RoICE9IHRocy0+bGVuZ3RoKQotCQkJcmV0dXJuIDA7Ci0JCXRocy0+eDBDID0gKERXT1JEKXRoczE2OwotCi0JCWZwcmludGYoc3RkZXJyLCIJdGhzMTYgbWFnaWMgaXMgMHglMDhseFxuIiwqKERXT1JEKil0aHMxNi0+bWFnaWMpOwotCQlpZiAoKigoRFdPUkQqKXRoczE2LT5tYWdpYykgIT0gMHgwMDAwMzA0QykKLQkJCXJldHVybiAwOwotCQlpZiAoISooV09SRCopKCgoTFBCWVRFKXRoczE2KSsweDEyKSkKLQkJCXJldHVybiAwOwotCQkKLQl9Ci0JaWYgKCFsc3RybmNtcDMyQSh0aHMtPm1hZ2ljLCJMUzAxIiw0KSkgIHsKLQkJaWYgKHRoczE2LT5sZW5ndGggIT0gdGhzLT5sZW5ndGgpCi0JCQlyZXR1cm4gMDsKLQkJdGhzLT5wdHIgPSAoRFdPUkQpUFRSX1NFR19UT19MSU4odGhzMTYtPnB0cik7Ci0JCS8qIGNvZGUgb2Zmc2V0IGZvciBRVF9UaHVuayBpcyBhdCAweDFDLi4uICAqLwotCQlfd3JpdGVfcXR0aHVuayAoKChMUEJZVEUpdGhzKSArIHRocy0+eDFDLHRocy0+cHRyKTsKLQkJLyogY29kZSBvZmZzZXQgZm9yIEZUX1Byb2xvZyBpcyBhdCAweDIwLi4uICAqLwotCQlfd3JpdGVfZnRwcm9sb2coKChMUEJZVEUpdGhzKSArIHRocy0+eDIwLHRocy0+cHRyKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiBUUlVFOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCVFUX1RodW5rCQkJKEtFUk5FTDMyKQotICoKLSAqIFRoZSB0YXJnZXQgYWRkcmVzcyBpcyBpbiBFRFguCi0gKiBUaGUgMTYgYml0IGFyZ3VtZW50cyBzdGFydCBhdCBFU1ArNC4KLSAqIFRoZSBudW1iZXIgb2YgMTZiaXQgYXJndW1lbnRieXRlcyBpcyBFQlAtRVNQLTB4NDQgKDY4IEJ5dGUgdGh1bmtzZXR1cCkuCi0gKiBbb2tdCi0gKi8KLVZPSUQgV0lOQVBJIFFUX1RodW5rKENPTlRFWFQgKmNvbnRleHQpCi17Ci0JQ09OVEVYVAljb250ZXh0MTY7Ci0JRFdPUkQJYXJnc2l6ZTsKLQotCW1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOwotCi0JQ1NfcmVnKCZjb250ZXh0MTYpCSA9IEhJV09SRChFRFhfcmVnKGNvbnRleHQpKTsKLQlJUF9yZWcoJmNvbnRleHQxNikJID0gTE9XT1JEKEVEWF9yZWcoY29udGV4dCkpOwotCi0JYXJnc2l6ZSA9IEVCUF9yZWcoY29udGV4dCktRVNQX3JlZyhjb250ZXh0KS0weDQ0OwotCi0JLyogYWRkaXRpb25hbCA0IGJ5dGVzIHVzZWQgYnkgdGhlIHJlbGF5Y29kZSBmb3Igc3RvcmluZyB0aGUgc3RhY2twdHIgKi8KLQltZW1jcHkoCSgoTFBCWVRFKUNVUlJFTlRfU1RBQ0sxNiktYXJnc2l6ZS00LAotCQkoTFBCWVRFKUVTUF9yZWcoY29udGV4dCkrNCwKLQkJYXJnc2l6ZQotCSk7Ci0JRUFYX3JlZyhjb250ZXh0KSA9IENhbGxUbzE2X3JlZ3Nfc2hvcnQoJmNvbnRleHQxNiwtYXJnc2l6ZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBXT1dDYWxsYmFjazE2IChLRVJORUwzMi42MikKLSAqLwotRFdPUkQgV0lOQVBJIFdPV0NhbGxiYWNrMTYoRkFSUFJPQzE2IGZwcm9jLERXT1JEIGFyZykKLXsKLQlEV09SRAlyZXQ7Ci0JZnByaW50ZihzdGRlcnIsIldPV0NhbGxiYWNrMTYoJXAsMHglMDhseCkgIixmcHJvYyxhcmcpOwotCXJldCA9ICBDYWxsVG8xNl9sb25nX2woZnByb2MsYXJnKTsKLQlmcHJpbnRmKHN0ZGVyciwiLi4uIHJldHVybnMgJWxkXG4iLHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgX0tFUk5FTDMyXzUyICAgIChLRVJORUwzMi41MikKLSAqIFJldHVybnMgYSBwb2ludGVyIHRvIFRoa0J1ZiBpbiB0aGUgMTZiaXQgbGlicmFyeSBTWVNUSFVOSy5ETEwuCi0gKiBbb2sgcHJvYmFibHldCi0gKi8KLUxQVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzUyKCkKLXsKLQlITU9EVUxFMzIJaG1vZCA9IExvYWRMaWJyYXJ5MTYoInN5c3RodW5rLmRsbCIpOwotCi0JaWYgKGhtb2Q8PTMyKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gUFRSX1NFR19UT19MSU4oV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihobW9kLCJUaGtCdWYiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQlfS0VSTkVMMzJfNDMgCShLRVJORUwzMi40MikKLSAqIEEgdGh1bmtidWZmZXIgbGluayByb3V0aW5lIAotICogVGhlIHRodW5rYnVmIGxvb2tzIGxpa2U6Ci0gKgotICoJMDA6IERXT1JECWxlbmd0aAkJPyBkb24ndCBrbm93IGV4YWN0bHkKLSAqCTA0OiBTRUdQVFIJcHRyCQk/IHdoZXJlIGRvZXMgaXQgcG9pbnQgdG8/Ci0gKiBUaGUgcG9pbnRlciBwdHIgaXMgd3JpdHRlbiBpbnRvIHRoZSBmaXJzdCBEV09SRCBvZiAndGh1bmsnLgotICogKHByb2JhYmx5IGNvcnJlY3QgaW1wbGVtZW50ZWQpCi0gKiBbb2sgcHJvYmFibHldCi0gKi8KLURXT1JEIFdJTkFQSSBfS0VSTkVMMzJfNDMoTFBEV09SRCB0aHVuayxMUENTVFIgdGhrYnVmLERXT1JEIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBkbGwxNixMUENTVFIgZGxsMzIpCi17Ci0JSElOU1RBTkNFMTYJaG1vZDsKLQlMUERXT1JECQlhZGRyOwotCVNFR1BUUgkJc2VnYWRkcjsKLQotCWhtb2QgPSBMb2FkTGlicmFyeTE2KGRsbDE2KTsKLQlpZiAoaG1vZDwzMikgewotCQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfNDMtPmZhaWxlZCB0byBsb2FkIDE2Yml0IERMTCAlcywgZXJyb3IgJWRcbiIsZGxsMTYsaG1vZCk7Ci0JCXJldHVybiAwOwotCX0KLQlzZWdhZGRyID0gKERXT1JEKVdJTjMyX0dldFByb2NBZGRyZXNzMTYoaG1vZCwoTFBTVFIpdGhrYnVmKTsKLQlpZiAoIXNlZ2FkZHIpIHsKLQkJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzQzLT5ubyAlcyBleHBvcnRlZCBmcm9tICVzIVxuIix0aGtidWYsZGxsMTYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JYWRkciA9IChMUERXT1JEKVBUUl9TRUdfVE9fTElOKHNlZ2FkZHIpOwotCWlmIChhZGRyWzBdICE9IGxlbikgewotCQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfNDMtPnRoa2J1ZiBsZW5ndGggbWlzbWF0Y2g/ICVsZCB2cyAlbGRcbiIsbGVuLGFkZHJbMF0pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFhZGRyWzFdKQotCQlyZXR1cm4gMDsKLQkqKERXT1JEKil0aHVuayA9IGFkZHJbMV07Ci0JcmV0dXJuIGFkZHJbMV07Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQlfS0VSTkVMMzJfNDUgCShLRVJORUwzMi40NCkKLSAqIEFub3RoZXIgMzItPjE2IHRodW5rLCB0aGUgZGlmZmVyZW5jZSB0byBRVF9UaHVuayBpcywgdGhhdCB0aGUgY2FsbGVkIHJvdXRpbmUKLSAqIHVzZXMgMHg2NiBscmV0LCBhbmQgdGhhdCB3ZSBoYXZlIHRvIHBhc3MgQ1ggaW4gREkuCi0gKiAodGhlcmUgc2VlbXMgdG8gYmUgc29tZSBraW5kIG9mIEJML0JYIHJldHVybiBtYWdpYyB0b28uLi4pCi0gKgotICogW2RvZXNuJ3QgY3Jhc2ggYW55bW9yZV0KLSAqLwotVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzQ1KENPTlRFWFQgKmNvbnRleHQpCi17Ci0JQ09OVEVYVAljb250ZXh0MTY7Ci0JTFBCWVRFCWN1cnN0YWNrOwotCURXT1JECXJldCxzdGFja3NpemU7Ci0KLQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfNDUoJSVlYXg9MHglMDhseCglJWN4PTB4JTA0bHgsJSVlZHg9MHglMDhseCkpXG4iLAotCQkoRFdPUkQpRUFYX3JlZyhjb250ZXh0KSwoRFdPUkQpQ1hfcmVnKGNvbnRleHQpLChEV09SRClFRFhfcmVnKGNvbnRleHQpCi0JKTsKLQlzdGFja3NpemUgPSBFQlBfcmVnKGNvbnRleHQpLUVTUF9yZWcoY29udGV4dCk7Ci0JZnByaW50ZihzdGRlcnIsIglzdGFja3NpemUgPSAlbGRcbiIsc3RhY2tzaXplKTsKLQotCW1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOwotCi0JRElfcmVnKCZjb250ZXh0MTYpCSA9IENYX3JlZyhjb250ZXh0KTsKLQlDU19yZWcoJmNvbnRleHQxNikJID0gSElXT1JEKEVBWF9yZWcoY29udGV4dCkpOwotCUlQX3JlZygmY29udGV4dDE2KQkgPSBMT1dPUkQoRUFYX3JlZyhjb250ZXh0KSk7Ci0KLQljdXJzdGFjayA9IFBUUl9TRUdfVE9fTElOKFNUQUNLMTZfUFVTSChzdGFja3NpemUpKTsKLQltZW1jcHkoY3Vyc3RhY2stc3RhY2tzaXplLChMUEJZVEUpRVNQX3JlZyhjb250ZXh0KSxzdGFja3NpemUpOwotCXJldCA9IENhbGxUbzE2X3JlZ3NfbG9uZygmY29udGV4dDE2LDApOwotCVNUQUNLMTZfUE9QKHN0YWNrc2l6ZSk7Ci0KLQlmcHJpbnRmKHN0ZGVyciwiLiByZXR1cm5lZCAlMDhseFxuIixyZXQpOwotCUVBWF9yZWcoY29udGV4dCkgCSA9IHJldDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCV9LRVJORUwzMl80MCAJKEtFUk5FTDMyLjQwKQotICogWUVUIEFub3RoZXIgMzItPjE2IHRodW5rLCB0aGUgZGlmZmVyZW5jZSB0byB0aGUgb3RoZXJzIGlzIHN0aWxsIG15c3RlcmlvdXMKLSAqIHRhcmdldCBhZGRyZXNzIGlzIEVEWAotICoKLSAqIFtjcmFzaGVzXQotICovCi1WT0lEIFdJTkFQSSBfS0VSTkVMMzJfNDAoQ09OVEVYVCAqY29udGV4dCkKLXsKLQlDT05URVhUCWNvbnRleHQxNjsKLQlMUEJZVEUJY3Vyc3RhY2s7Ci0JRFdPUkQJcmV0LHN0YWNrc2l6ZTsKLQotCWZwcmludGYoc3RkZXJyLCJfS0VSTkVMMzJfNDAoRURYPTB4JTA4bHgpXG4iLAotCQlFRFhfcmVnKGNvbnRleHQpCi0JKTsKLQlzdGFja3NpemUgPSBFQlBfcmVnKGNvbnRleHQpLUVTUF9yZWcoY29udGV4dCk7Ci0JZnByaW50ZihzdGRlcnIsIglzdGFja3NpemUgPSAlbGRcbiIsc3RhY2tzaXplKTsKLQlmcHJpbnRmKHN0ZGVyciwib24gdG9wIG9mIHN0YWNrOiAweCUwNHhcbiIsKihXT1JEKilFU1BfcmVnKGNvbnRleHQpKTsKLQotCW1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOwotCi0JQ1NfcmVnKCZjb250ZXh0MTYpCSA9IEhJV09SRChFRFhfcmVnKGNvbnRleHQpKTsKLQlJUF9yZWcoJmNvbnRleHQxNikJID0gTE9XT1JEKEVEWF9yZWcoY29udGV4dCkpOwotCi0JY3Vyc3RhY2sgPSBQVFJfU0VHX1RPX0xJTihTVEFDSzE2X1BVU0goc3RhY2tzaXplKSk7Ci0JbWVtY3B5KGN1cnN0YWNrLXN0YWNrc2l6ZSwoTFBCWVRFKUVTUF9yZWcoY29udGV4dCksc3RhY2tzaXplKTsKLQlyZXQgPSBDYWxsVG8xNl9yZWdzX3Nob3J0KCZjb250ZXh0MTYsMCk7Ci0JU1RBQ0sxNl9QT1Aoc3RhY2tzaXplKTsKLQotCWZwcmludGYoc3RkZXJyLCIuIHJldHVybmVkICUwOGx4XG4iLHJldCk7Ci0JRUFYX3JlZyhjb250ZXh0KSAJID0gcmV0OwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkoS0VSTkVMMzIuNDEpCi0gKiBBIHRodW5rIHNldHVwIHJvdXRpbmUuCi0gKiBFeHBlY3RzIGEgcG9pbnRlciB0byBhIHByZWluaXRpYWxpemVkIHRodW5rYnVmZmVyIGluIHRoZSBmaXJzdCBhcmd1bWVudAotICogbG9va2luZyBsaWtlOgotICoJMDAuLjAzOgkJdW5rbm93bgkocG9pbnRlciwgY2hlY2sgXzQxLCBfNDMsIF80NikKLSAqCTA0OiBFQjFFCQlqbXAgKzB4MjAKLSAqCi0gKgkwNi4uMjM6CQl1bmtub3duIChzcGFjZSBmb3IgcmVwbGFjZW1lbnQgY29kZSwgY2hlY2sgLjkwKQotICoKLSAqCTI0Oj5FODAwMDAwMDAwCQljYWxsIG9mZnNldCAyOQotICoJMjk6PjU4CQkJcG9wIGVheAkJICAgKCB0YXJnZXQgb2YgY2FsbCApCi0gKgkyQTogMkQyNTAwMDAwMAkJc3ViIGVheCwweDAwMDAwMDI1ICggbm93IHBvaW50cyB0byBvZmZzZXQgNCApCi0gKgkyRjogQkF4eHh4eHh4eAkJbW92IGVkeCx4eHh4eHh4eAotICoJMzQ6IDY4eXl5eXl5eXkJCXB1c2ggS0VSTkVMMzIuOTAKLSAqCTM5OiBDMwkJCXJldAotICoKLSAqCTNBOiBFQjFFCQlqbXAgKzB4MjAKLSAqCTNFIC4uLiA1OToJdW5rbm93biAoc3BhY2UgZm9yIHJlcGxhY2VtZW50IGNvZGU/KQotICoJNUE6IEU4eHh4eHh4eHgJCWNhbGwgPDMyYml0b2Zmc2V0IHh4eHh4eHh4PgotICoJNUY6IDVBCQkJcG9wIGVkeAotICoJNjA6IDgxRUEyNXh4eHh4eAlzdWIgZWR4LCAweDI1eHh4eHh4Ci0gKgk2NjogNTIJCQlwdXNoIGVkeAotICoJNjc6IDY4eHh4eHh4eHgJCXB1c2ggeHh4eHh4eHgKLSAqCTZDOiA2OHl5eXl5eXl5CQlwdXNoIEtFUk5FTDMyLjg5Ci0gKgk3MTogQzMJCQlyZXQKLSAqCTcyOiBlbmQ/Ci0gKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY29kZSBpcyB0aGVyZSwgYW5kIHJlcGxhY2VzIHRoZSB5eXl5eXl5eSBlbnRyaWVzCi0gKiBieSB0aGUgZnVuY3Rpb25wb2ludGVycy4KLSAqIFRoZSB0aHVua2J1ZiBsb29rcyBsaWtlOgotICoKLSAqCTAwOiBEV09SRAlsZW5ndGgJCT8gZG9uJ3Qga25vdyBleGFjdGx5Ci0gKgkwNDogU0VHUFRSCXB0cgkJPyB3aGVyZSBkb2VzIGl0IHBvaW50IHRvPwotICogVGhlIHNlZ3BvaW50ZXIgcHRyIGlzIHdyaXR0ZW4gaW50byB0aGUgZmlyc3QgRFdPUkQgb2YgJ3RodW5rJy4KLSAqIFtvayBwcm9iYWJseV0KLSAqLwotCi1MUFZPSUQgV0lOQVBJIF9LRVJORUwzMl80MShMUEJZVEUgdGh1bmssTFBDU1RSIHRoa2J1ZixEV09SRCBsZW4sTFBDU1RSIGRsbDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGRsbDMyKQotewotCUhNT0RVTEUzMgloa3JubDMyID0gR2V0TW9kdWxlSGFuZGxlMzJBKCJLRVJORUwzMiIpOwotCUhNT0RVTEUxNglobW9kOwotCUxQRFdPUkQJCWFkZHIsYWRkcjI7Ci0JRFdPUkQJCXNlZ2FkZHI7Ci0KLQkvKiBGSVhNRTogYWRkIGNoZWNrcyBmb3IgdmFsaWQgY29kZSAuLi4gKi8KLQkvKiB3cml0ZSBwb2ludGVycyB0byBrZXJuZWwzMi44OSBhbmQga2VybmVsMzIuOTAgKCtvcmRpbmFsIGJhc2Ugb2YgMSkgKi8KLQkqKERXT1JEKikodGh1bmsrMHgzNSkgPSAoRFdPUkQpR2V0UHJvY0FkZHJlc3MzMihoa3JubDMyLChMUFNUUik5MCk7Ci0JKihEV09SRCopKHRodW5rKzB4NkQpID0gKERXT1JEKUdldFByb2NBZGRyZXNzMzIoaGtybmwzMiwoTFBTVFIpODkpOwotCi0JCi0JaG1vZCA9IExvYWRMaWJyYXJ5MTYoZGxsMTYpOwotCWlmIChobW9kPDMyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl80MS0+ZmFpbGVkIHRvIGxvYWQgMTZiaXQgRExMICVzLCBlcnJvciAlZFxuIixkbGwxNixobW9kKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNlZ2FkZHIgPSAoRFdPUkQpV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihobW9kLChMUFNUUil0aGtidWYpOwotCWlmICghc2VnYWRkcikgewotCQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfNDEtPm5vICVzIGV4cG9ydGVkIGZyb20gJXMhXG4iLHRoa2J1ZixkbGwxNik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhZGRyID0gKExQRFdPUkQpUFRSX1NFR19UT19MSU4oc2VnYWRkcik7Ci0JaWYgKGFkZHJbMF0gIT0gbGVuKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl80MS0+dGhrYnVmIGxlbmd0aCBtaXNtYXRjaD8gJWxkIHZzICVsZFxuIixsZW4sYWRkclswXSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhZGRyMiA9IFBUUl9TRUdfVE9fTElOKGFkZHJbMV0pOwotCWlmIChISVdPUkQoYWRkcjIpKQotCQkqKERXT1JEKil0aHVuayA9IChEV09SRClhZGRyMjsKLQlyZXR1cm4gYWRkcjI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJCQkJKEtFUk5FTDMyLjkwKQotICogUVQgVGh1bmsgcHJpbWluZyBmdW5jdGlvbgotICogUmV3cml0ZXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHRodW5rIHRvIHVzZSB0aGUgUVRfVGh1bmsgaW50ZXJmYWNlCi0gKiBhbmQganVtcHMgdG8gdGhlIHN0YXJ0IG9mIHRoYXQgY29kZS4KLSAqIFtva10KLSAqLwotVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzkwKENPTlRFWFQgKmNvbnRleHQpCi17Ci0JX3dyaXRlX3F0dGh1bmsoKExQQllURSlFQVhfcmVnKGNvbnRleHQpLCooRFdPUkQqKShFQVhfcmVnKGNvbnRleHQpK0VEWF9yZWcoY29udGV4dCkpKTsKLQkvKiB3ZSBqdXN0IGNhbGwgdGhlIHJlYWwgUVRfVGh1bmsgcmlnaHQgbm93IAotCSAqIHdlIGNhbiBieXBhc3MgdGhlIHJlbGF5Y29kZSwgZm9yIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmVnaXN0ZXJjb250ZXh0Ci0JICovCi0JRURYX3JlZyhjb250ZXh0KSA9ICooRFdPUkQqKSgoKihEV09SRCopKEVBWF9yZWcoY29udGV4dCkrRURYX3JlZyhjb250ZXh0KSkpKzQqKCgoQllURSopRUJQX3JlZyhjb250ZXh0KSlbLTRdKSk7Ci0JcmV0dXJuIFFUX1RodW5rKGNvbnRleHQpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCQkJCShLRVJORUwzMi40NSkKLSAqIEFub3RoZXIgdGh1bmtidWYgbGluayByb3V0aW5lLgotICogVGhlIHN0YXJ0IG9mIHRoZSB0aHVua2J1ZiBsb29rcyBsaWtlIHRoaXM6Ci0gKiAJMDA6IERXT1JECWxlbmd0aAotICoJMDQ6IFNFR1BUUglhZGRyZXNzIGZvciB0aHVua2J1ZmZlciBwb2ludGVyCi0gKiBbb2sgcHJvYmFibHldCi0gKi8KLVZPSUQgV0lOQVBJIF9LRVJORUwzMl80NihMUEJZVEUgdGh1bmssTFBTVFIgdGhrYnVmLERXT1JEIGxlbixMUFNUUiBkbGwxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBkbGwzMikKLXsKLQlMUERXT1JECQlhZGRyOwotCUhNT0RVTEUxNglobW9kOwotCVNFR1BUUgkJc2VnYWRkcjsKLQotCWhtb2QgPSBMb2FkTGlicmFyeTE2KGRsbDE2KTsKLQlpZiAoaG1vZCA8IDMyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl80Ni0+Y291bGRuJ3QgbG9hZCAlcywgZXJyb3IgJWRcbiIsZGxsMTYsaG1vZCk7Ci0JCXJldHVybjsKLQl9Ci0Jc2VnYWRkciA9IChTRUdQVFIpV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihobW9kLHRoa2J1Zik7Ci0JaWYgKCFzZWdhZGRyKSB7Ci0JCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl80Ni0+IGhhdmVuJ3QgZm91bmQgJXMgaW4gJXMhXG4iLHRoa2J1ZixkbGwxNik7Ci0JCXJldHVybjsKLQl9Ci0JYWRkciA9IChMUERXT1JEKVBUUl9TRUdfVE9fTElOKHNlZ2FkZHIpOwotCWlmIChhZGRyWzBdICE9IGxlbikgewotCQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfNDYtPiBsZW5ndGggb2YgdGhrYnVmIGRpZmZlcnMgZnJvbSBleHBlY3RlZCBsZW5ndGghICglbGQgdnMgJWxkKVxuIixhZGRyWzBdLGxlbik7Ci0JCXJldHVybjsKLQl9Ci0JKihEV09SRCopUFRSX1NFR19UT19MSU4oYWRkclsxXSkgPSAoRFdPUkQpdGh1bms7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgX0tFUk5FTDMyXzg3Ci0gKiBDaGVjayBpZiB0aHVua2luZyBpcyBpbml0aWFsaXplZCAoc3Mgc2VsZWN0b3Igc2V0IHVwIGV0Yy4pCi0gKiBXZSBkbyB0aGF0IGRpZmZlcmVudGx5LCBzbyBqdXN0IHJldHVybiBUUlVFLgotICogW29rXQotICovCi1CT09MMzIgV0lOQVBJIF9LRVJORUwzMl84NygpCi17Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgX0tFUk5FTDMyXzg4Ci0gKiBPbmUgb2YgdGhlIHJlYWwgdGh1bmtpbmcgZnVuY3Rpb25zLiBUaGlzIG9uZSBzZWVtcyB0byBiZSBmb3IgMzI8LT4zMgotICogdGh1bmtzLiBJdCBzaG91bGQgcHJvYmFibHkgYmUgY2FwYWJsZSBvZiBjcm9zc2luZyBwcm9jZXNzYm91bmRhcmllcy4KLSAqCi0gKiBBbmQgWUVTLCBJJ3ZlIHNlZW4gbnI9NDggKHNvbWV3aGVyZSBpbiB0aGUgV2luOTUgMzI8LT4xNiBPTEUgY291cGxpbmcpCi0gKiBbb2tdCi0gKi8KLURXT1JEIFdJTkFQSVYgX0tFUk5FTDMyXzg4KCBEV09SRCBuciwgRFdPUkQgZmxhZ3MsIEZBUlBST0MzMiBmdW4sIC4uLiApCi17Ci0gICAgRFdPUkQgaSxyZXQ7Ci0gICAgRFdPUkQgKmFyZ3MgPSAoKERXT1JEICopJmZ1bikgKyAxOwotCi0gICAgZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzg4KCVsZCwweCUwOGx4LCVwLFsgIixucixmbGFncyxmdW4pOwotICAgIGZvciAoaT0wO2k8bnIvNDtpKyspIGZwcmludGYoc3RkZXJyLCIweCUwOGx4LCIsYXJnc1tpXSk7Ci0gICAgZnByaW50ZihzdGRlcnIsIl0pIik7Ci0gICAgc3dpdGNoIChucikgewotICAgIGNhc2UgMDoJcmV0ID0gZnVuKCk7Ci0JCWJyZWFrOwotICAgIGNhc2UgNDoJcmV0ID0gZnVuKGFyZ3NbMF0pOwotCQlicmVhazsKLSAgICBjYXNlIDg6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0pOwotCQlicmVhazsKLSAgICBjYXNlIDEyOglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pOwotCQlicmVhazsKLSAgICBjYXNlIDE2OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7Ci0JCWJyZWFrOwotICAgIGNhc2UgMjA6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pOwotCQlicmVhazsKLSAgICBjYXNlIDI0OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pOwotCQlicmVhazsKLSAgICBjYXNlIDI4OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSk7Ci0JCWJyZWFrOwotICAgIGNhc2UgMzI6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdLGFyZ3NbN10pOwotCQlicmVhazsKLSAgICBjYXNlIDM2OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0pOwotCQlicmVhazsKLSAgICBjYXNlIDQwOglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSk7Ci0JCWJyZWFrOwotICAgIGNhc2UgNDQ6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdKTsKLQkJYnJlYWs7Ci0gICAgY2FzZSA0ODoJcmV0ID0gZnVuKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sYXJnc1sxMV0pOwotCQlicmVhazsKLSAgICBkZWZhdWx0OgotCWZwcmludGYoc3RkZXJyLCIgICAgdW5zdXBwb3J0ZWQgbnIgb2YgYXJndW1lbnRzLCAlbGRcbiIsbnIpOwotCXJldCA9IDA7Ci0JYnJlYWs7Ci0KLSAgICB9Ci0gICAgZnByaW50ZihzdGRlcnIsIiByZXR1cm5pbmcgJWxkIC4uLlxuIixyZXQpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCUtFUk5FTF82MTkJCShLRVJORUwpCi0gKiBTZWVtcyB0byBzdG9yZSB5IGFuZCB6IGRlcGVuZGluZyBvbiB4IGluIHNvbWUgaW50ZXJuYWwgbGlzdHMuLi4KLSAqLwotV09SRCBXSU5BUEkgX0tFUk5FTF82MTkoV09SRCB4LERXT1JEIHksRFdPUkQgeikKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwiS0VSTkVMXzYxOSgweCUwNHgsMHglMDhseCwweCUwOGx4KVxuIix4LHkseik7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUFsbG9jU0xDYWxsYmFjawkJKEtFUk5FTDMyKQotICoKLSAqIFdpbjk1IHVzZXMgc29tZSBzdHJ1Y3RjaGFpbnMgZm9yIGNhbGxiYWNrcy4gSXQgYWxsb2NhdGVzIHRoZW0KLSAqIGluIGJsb2NrcyBvZiAxMDAgZW50cmllcywgc2l6ZSAzMiBieXRlcyBlYWNoLCBsYXlvdXQ6Ci0gKiBibG9ja3N0YXJ0OgotICogCTA6CVBUUgluZXh0YmxvY2tzdGFydAotICoJNDoJZW50cnkJKmZpcnN0OwotICoJODoJV09SRAlzZWwgKCBzdGFydCBwb2ludHMgdG8gYmxvY2tzdGFydCkKLSAqCUE6CVdPUkQJdW5rbm93bgotICogMTAweGVudHJ5OgotICoJMDAuLjE3OgkJQ29kZQotICoJMTg6CVBEQgkqb3duaW5nX3Byb2Nlc3M7Ci0gKgkxQzoJUFRSCWJsb2Nrc3RhcnQKLSAqCi0gKiBXZSBpZ25vcmUgdGhpcyBmb3Igbm93LiAoSnVzdCBhIG5vdGUgZm9yIGZ1cnRoZXIgZGV2ZWxvcGVycykKLSAqIEZJWE1FOiB1c2UgdGhpcyBtZXRob2QsIHNvIHdlIGRvbid0IHdhc3RlIHNlbGVjdG9ycy4uLgotICoKLSAqIEZvbGxvd2luZyBjb2RlIGlzIHRoZW4gZ2VuZXJhdGVkIGJ5IEFsbG9jU0xDYWxsYmFjay4gVGhlIGNvZGUgaXMgMTYgYml0LCBzbwotICogdGhlIDB4NjYgcHJlZml4IHN3aXRjaGVzIGZyb20gd29yZC0+bG9uZyByZWdpc3RlcnMuCi0gKgotICoJNjY1QQkJcG9wCWVkeCAKLSAqCTY2Njh4IGFyZzIgeCAJcHVzaGwJPGFyZzI+Ci0gKgk2NjUyCQlwdXNoCWVkeAotICoJRUF4IGFyZzEgeAlqbXBmCTxhcmcxPgotICoKLSAqIHJldHVybnMgdGhlIHN0YXJ0YWRkcmVzcyBvZiB0aGlzIHRodW5rLgotICoKLSAqIE5vdGUsIHRoYXQgdGhleSBsb29rIHZlcnkgc2ltaWxhaXIgdG8gdGhlIG9uZXMgYWxsb2NhdGVzIGJ5IFRIVU5LX0FsbG9jLgotICovCi1EV09SRCBXSU5BUEkKLUFsbG9jU0xDYWxsYmFjayhEV09SRCBmaW5hbGl6ZXIsRFdPUkQgY2FsbGJhY2spIHsKLQlMUEJZVEUJeCx0aHVuayA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMzIgKTsKLQlXT1JECXNlbDsKLQotCXg9dGh1bms7Ci0JKngrKz0weDY2Oyp4Kys9MHg1YTsJCQkJLyogcG9wbCBlZHggKi8KLQkqeCsrPTB4NjY7KngrKz0weDY4OyooRFdPUkQqKXg9ZmluYWxpemVyO3grPTQ7CS8qIHB1c2hsIGZpbmFsaXplciAqLwotCSp4Kys9MHg2NjsqeCsrPTB4NTI7CQkJCS8qIHB1c2hsIGVkeCAqLwotCSp4Kys9MHhlYTsqKERXT1JEKil4PWNhbGxiYWNrO3grPTQ7CQkvKiBqbXBmIGNhbGxiYWNrICovCi0KLQkqKERXT1JEKikodGh1bmsrMTgpID0gR2V0Q3VycmVudFByb2Nlc3NJZCgpOwotCi0Jc2VsID0gU0VMRUNUT1JfQWxsb2NCbG9jayggdGh1bmsgLCAzMiwgU0VHTUVOVF9DT0RFLCBGQUxTRSwgRkFMU0UgKTsKLQlyZXR1cm4gKHNlbDw8MTYpfDA7Ci19Ci0KLXZvaWQgV0lOQVBJCi1GcmVlU0xDYWxsYmFjayhEV09SRCB4KSB7Ci0JZnByaW50ZihzdGRlcnIsIkZyZWVTTENhbGxiYWNrKDB4JTA4bHgpXG4iLHgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQlLRVJORUxfMzU4CQkoS0VSTkVMKQotICogQWxsb2NhdGVzIGEgY29kZSBzZWdtZW50IHdoaWNoIHN0YXJ0cyBhdCB0aGUgYWRkcmVzcyBwYXNzZWQgaW4geC4gbGltaXQKLSAqIDB4ZmZmZmYsIGFuZCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBzdGFydC4KLSAqLwotRFdPUkQgV0lOQVBJCi1fS0VSTkVMXzM1OChEV09SRCB4KSB7Ci0JV09SRAlzZWw7Ci0KLQlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FTF8zNTgoMHglMDhseCksc3R1YlxuIix4KTsKLQlpZiAoIUhJV09SRCh4KSkKLQkJcmV0dXJuIHg7Ci0KLQlzZWwgPSBTRUxFQ1RPUl9BbGxvY0Jsb2NrKCBQVFJfU0VHX1RPX0xJTih4KSAsIDB4ZmZmZiwgU0VHTUVOVF9DT0RFLCBGQUxTRSwgRkFMU0UgKTsKLQlyZXR1cm4gKHNlbDw8MTYpfCgweDAwMDApOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQlLRVJORUxfMzU5CQkoS0VSTkVMKQotICogRnJlZXMgdGhlIGNvZGUgc2VnbWVudCBvZiB0aGUgcGFzc2VkIGxpbmVhciBwb2ludGVyIChUaGlzIGhhcyB1c3VhbGx5Ci0gKiBiZWVuIGFsbG9jYXRlZCBieSBfS0VSTkVMXzM1OCkuCi0gKi8KLVZPSUQgV0lOQVBJCi1fS0VSTkVMXzM1OShEV09SRCB4KSB7Ci0JRFdPUkQJc2F2ZWRzc3NwOwotCi0JZnByaW50ZihzdGRlcnIsIl9LRVJORUxfMzU5KDB4JTA4bHgpLHN0dWJcbiIseCk7Ci0JaWYgKChISVdPUkQoeCkgJiA3KSE9NykKLQkJcmV0dXJuOwotCXNhdmVkc3NzcCA9IElGMTYzMl9TYXZlZDE2X3NzX3NwO0lGMTYzMl9TYXZlZDE2X3NzX3NwID0gMDsKLQlTRUxFQ1RPUl9GcmVlQmxvY2soeD4+MTYsMSk7Ci0JSUYxNjMyX1NhdmVkMTZfc3Nfc3AgPSBzYXZlZHNzc3A7Ci0JcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQlLRVJORUxfNDcyCQkoS0VSTkVMKQotICogc29tZXRoaW5nIGxpa2UgR2V0Q3VycmVudGhJbnN0YW5jZS4KLSAqLwotVk9JRCBXSU5BUEkKLV9LRVJORUxfNDcyKENPTlRFWFQgKmNvbnRleHQpIHsKLQlmcHJpbnRmKHN0ZGVyciwiX0tFUk5FTF80NzIoMHglMDhseCksc3R1YlxuIixFQVhfcmVnKGNvbnRleHQpKTsKLQlpZiAoIUVBWF9yZWcoY29udGV4dCkpIHsKLQkJVERCICpwVGFzayA9IChUREIqKUdsb2JhbExvY2sxNihHZXRDdXJyZW50VGFzaygpKTsKLQkJQVhfcmVnKGNvbnRleHQpPXBUYXNrLT5oSW5zdGFuY2U7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFISVdPUkQoRUFYX3JlZyhjb250ZXh0KSkpCi0JCXJldHVybjsgLyogcmV0dXJucyB0aGUgcGFzc2VkIHZhbHVlICovCi0JLyogaG1tIC4uLiBmaXhtZSAqLwotfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3Rvb2xoZWxwLnNwZWMgYi9pZjE2MzIvdG9vbGhlbHAuc3BlYwppbmRleCBjMzgzN2U5Li45OTQwZDk5IDEwMDY0NAotLS0gYS9pZjE2MzIvdG9vbGhlbHAuc3BlYworKysgYi9pZjE2MzIvdG9vbGhlbHAuc3BlYwpAQCAtMTcsOSArMTcsOSBAQAogNjMgcGFzY2FsMTYgVGFza0ZpcnN0KHB0cikgVGFza0ZpcnN0CiA2NCBwYXNjYWwxNiBUYXNrTmV4dChwdHIpIFRhc2tOZXh0CiA2NSBwYXNjYWwxNiBUYXNrRmluZEhhbmRsZShwdHIgd29yZCkgVGFza0ZpbmRIYW5kbGUKLTY2IHN0dWIgU1RBQ0tUUkFDRUZJUlNUCi02NyBzdHViIFNUQUNLVFJBQ0VDU0lQRklSU1QKLTY4IHN0dWIgU1RBQ0tUUkFDRU5FWFQKKzY2IHBhc2NhbDE2IFN0YWNrVHJhY2VGaXJzdChwdHIgd29yZCkgU3RhY2tUcmFjZUZpcnN0Cis2NyBwYXNjYWwxNiBTdGFja1RyYWNlQ1NJUEZpcnN0KHB0ciB3b3JkIHdvcmQgd29yZCB3b3JkKSBTdGFja1RyYWNlQ1NJUEZpcnN0Cis2OCBwYXNjYWwxNiBTdGFja1RyYWNlTmV4dChwdHIpIFN0YWNrVHJhY2VOZXh0CiA2OSBwYXNjYWwxNiBDbGFzc0ZpcnN0KHB0cikgQ2xhc3NGaXJzdAogNzAgcGFzY2FsMTYgQ2xhc3NOZXh0KHB0cikgQ2xhc3NOZXh0CiA3MSBwYXNjYWwxNiBTeXN0ZW1IZWFwSW5mbyhwdHIpIFN5c3RlbUhlYXBJbmZvCmRpZmYgLS1naXQgYS9pZjE2MzIvdXNlci5zcGVjIGIvaWYxNjMyL3VzZXIuc3BlYwppbmRleCBmZWYzYmZjLi44MTRhMTlmIDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlci5zcGVjCisrKyBiL2lmMTYzMi91c2VyLnNwZWMKQEAgLTM0Niw3ICszNDYsNyBAQAogMzgzIHN0dWIgR2V0V2luZG93Q29udGV4dEhlbHBJRAogMzg0IHN0dWIgU2V0TWVudUNvbnRleHRIZWxwSUQKIDM4NSBzdHViIEdldE1lbnVDb250ZXh0SGVscElECi0zODkgc3R1YiBMb2FkSW1hZ2UKKzM4OSBwYXNjYWwgTG9hZEltYWdlKHdvcmQgc2Vnc3RyIHdvcmQgd29yZCB3b3JkIHdvcmQpIExvYWRJbWFnZTE2CiAzOTAgc3R1YiBDb3B5SW1hZ2UKIDM5MSBzdHViIFNpZ25hbFByb2MzMgogMzk0IHBhc2NhbDE2IERyYXdJY29uRXgod29yZCB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQpIERyYXdJY29uRXgxNgpAQCAtMzczLDcgKzM3Myw3IEBACiA0MTcgcGFzY2FsICAgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnMoKSBHZXRNZW51Q2hlY2tNYXJrRGltZW5zaW9ucwogNDE4IHBhc2NhbDE2IFNldE1lbnVJdGVtQml0bWFwcyh3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQpIFNldE1lbnVJdGVtQml0bWFwczE2CiA0MjAgcGFzY2FsMTYgd3NwcmludGYoKSBXSU4xNl93c3ByaW50ZjE2Ci00MjEgcGFzY2FsMTYgd3ZzcHJpbnRmKHB0ciBwdHIgcHRyKSB3dnNwcmludGYxNgorNDIxIHBhc2NhbDE2IHd2c3ByaW50ZihwdHIgc3RyIHB0cikgd3ZzcHJpbnRmMTYKIDQyMiBwYXNjYWwxNiBEbGdEaXJTZWxlY3RFeCh3b3JkIHB0ciB3b3JkIHdvcmQpIERsZ0RpclNlbGVjdEV4MTYKIDQyMyBwYXNjYWwxNiBEbGdEaXJTZWxlY3RDb21ib0JveEV4KHdvcmQgcHRyIHdvcmQgd29yZCkgRGxnRGlyU2VsZWN0Q29tYm9Cb3hFeDE2CiA0MjcgcGFzY2FsMTYgRmluZFdpbmRvd0V4KHdvcmQgd29yZCBzZWdzdHIgc3RyKSBGaW5kV2luZG93RXgxNgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dpbjMyczE2LnNwZWMgYi9pZjE2MzIvd2luMzJzMTYuc3BlYwppbmRleCAyNDU3Yzg4Li5hODJhZmYyIDEwMDY0NAotLS0gYS9pZjE2MzIvd2luMzJzMTYuc3BlYworKysgYi9pZjE2MzIvd2luMzJzMTYuc3BlYwpAQCAtMiw3ICsyLDcgQEAKIHR5cGUJd2luMTYKIAogMSBzdHViIFdFUAotMiBzdHViIEJPT1RUQVNLCisyIHBhc2NhbDE2IEJvb3RUYXNrKCkgQm9vdFRhc2sKIDMgc3R1YiBDUkVBVEVQUk9DRVNTCiA0IHN0dWIgV0FJVEZPUkRFQlVHRVZFTlQKIDUgcGFzY2FsIENPTlRJTlVFREVCVUdFVkVOVChsb25nIGxvbmcgbG9uZykgQ29udGludWVEZWJ1Z0V2ZW50CkBAIC00OCw4ICs0OCw4IEBACiA0NSBzdHViIEZBUElMT0cxNgogNDYgc3R1YiBBTExPQ0NBTExCQUNLCiA0NyBzdHViIExJTkVBUlRPSFVHRVNFTEVDVE9ST0ZGU0VUCi00OCBzdHViIFVUU0VMRUNUT1JPRkZTRVRUT0xJTkVBUgotNDkgc3R1YiBVVExJTkVBUlRPU0VMRUNUT1JPRkZTRVQKKzQ4IHBhc2NhbCBVVFNlbGVjdG9yT2Zmc2V0VG9MaW5lYXIocHRyKSBVVFNlbGVjdG9yT2Zmc2V0VG9MaW5lYXIKKzQ5IHBhc2NhbCBVVExpbmVhclRvU2VsZWN0b3JPZmZzZXQocHRyKSBVVExpbmVhclRvU2VsZWN0b3JPZmZzZXQKIDUwIHN0dWIgU0VMRk9SRUlHTlRJQgogNTEgc3R1YiBNWUdMT0JBTFJFQUxMT0MKIDUyIHN0dWIgQ1JFQVRFUEVIRUFERVIKZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5kZWJ1Zy5zcGVjIGIvaWYxNjMyL3dpbmRlYnVnLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0ZmI2YgotLS0gL2Rldi9udWxsCisrKyBiL2lmMTYzMi93aW5kZWJ1Zy5zcGVjCkBAIC0wLDAgKzEsNiBAQAorbmFtZQl3aW5kZWJ1ZwordHlwZQl3aW4xNgorCisgIDEgc3R1YiAgICAgV0lOREVCVUcKKyAgMiBzdHViICAgICBXRVAKKyAgMyBwYXNjYWwgICBXaW5Ob3RpZnkoKSBXaW5Ob3RpZnkKZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5zb2NrLnNwZWMgYi9pZjE2MzIvd2luc29jay5zcGVjCmluZGV4IDI1NDhlMTAuLmU4NTY0YmIgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93aW5zb2NrLnNwZWMKKysrIGIvaWYxNjMyL3dpbnNvY2suc3BlYwpAQCAtMTYsNyArMTYsNyBAQAogOCAgIHBhc2NhbCAgIGh0b25sKGxvbmcpIFdJTlNPQ0tfaHRvbmwKIDkgICBwYXNjYWwxNiBodG9ucyh3b3JkKSBXSU5TT0NLX2h0b25zCiAxMCAgcGFzY2FsICAgaW5ldF9hZGRyKHB0cikgV0lOU09DS19pbmV0X2FkZHIKLTExICBwYXNjYWwgICBpbmV0X250b2EobG9uZykgV0lOU09DS19pbmV0X250b2EKKzExICBwYXNjYWwgICBpbmV0X250b2EobG9uZykgV0lOU09DS19pbmV0X250b2ExNgogMTIgIHBhc2NhbDE2IGlvY3Rsc29ja2V0KHdvcmQgbG9uZyBwdHIpIFdJTlNPQ0tfaW9jdGxzb2NrZXQxNgogMTMgIHBhc2NhbDE2IGxpc3Rlbih3b3JkIHdvcmQpIFdJTlNPQ0tfbGlzdGVuMTYKIDE0ICBwYXNjYWwgICBudG9obChsb25nKSBXSU5TT0NLX250b2hsCkBAIC0zNiwyMCArMzYsMjAgQEAKIDU1ICBwYXNjYWwgICBnZXRzZXJ2YnluYW1lKHB0ciBwdHIpIFdJTlNPQ0tfZ2V0c2VydmJ5bmFtZTE2CiA1NiAgcGFzY2FsICAgZ2V0c2VydmJ5cG9ydCh3b3JkIHB0cikgV0lOU09DS19nZXRzZXJ2Ynlwb3J0MTYKIDU3ICBwYXNjYWwgICBnZXRob3N0bmFtZShwdHIgd29yZCkgV0lOU09DS19nZXRob3N0bmFtZTE2Ci0xMDEgcGFzY2FsMTYgV1NBQXN5bmNTZWxlY3Qod29yZCB3b3JkIHdvcmQgbG9uZykgV1NBQXN5bmNTZWxlY3QKKzEwMSBwYXNjYWwxNiBXU0FBc3luY1NlbGVjdCh3b3JkIHdvcmQgd29yZCBsb25nKSBXU0FBc3luY1NlbGVjdDE2CiAxMDIgcGFzY2FsMTYgV1NBQXN5bmNHZXRIb3N0QnlBZGRyKHdvcmQgd29yZCBwdHIgd29yZCB3b3JkIHNlZ3B0ciB3b3JkKQotICAgICAgICAgICAgIFdTQUFzeW5jR2V0SG9zdEJ5QWRkcgorICAgICAgICAgICAgIFdTQUFzeW5jR2V0SG9zdEJ5QWRkcjE2CiAxMDMgcGFzY2FsMTYgV1NBQXN5bmNHZXRIb3N0QnlOYW1lKHdvcmQgd29yZCBwdHIgc2VncHRyIHdvcmQpCi0gICAgICAgICAgICAgV1NBQXN5bmNHZXRIb3N0QnlOYW1lCisgICAgICAgICAgICAgV1NBQXN5bmNHZXRIb3N0QnlOYW1lMTYKIDEwNCBwYXNjYWwxNiBXU0FBc3luY0dldFByb3RvQnlOdW1iZXIod29yZCB3b3JkIHdvcmQgc2VncHRyIHdvcmQpCi0gICAgICAgICAgICAgV1NBQXN5bmNHZXRQcm90b0J5TnVtYmVyCisgICAgICAgICAgICAgV1NBQXN5bmNHZXRQcm90b0J5TnVtYmVyMTYKIDEwNSBwYXNjYWwxNiBXU0FBc3luY0dldFByb3RvQnlOYW1lKHdvcmQgd29yZCBwdHIgc2VncHRyIHdvcmQpCi0gICAgICAgICAgICAgV1NBQXN5bmNHZXRQcm90b0J5TmFtZQorICAgICAgICAgICAgIFdTQUFzeW5jR2V0UHJvdG9CeU5hbWUxNgogMTA2IHBhc2NhbDE2IFdTQUFzeW5jR2V0U2VydkJ5UG9ydCh3b3JkIHdvcmQgd29yZCBwdHIgc2VncHRyIHdvcmQpCi0gICAgICAgICAgICAgV1NBQXN5bmNHZXRTZXJ2QnlQb3J0CisgICAgICAgICAgICAgV1NBQXN5bmNHZXRTZXJ2QnlQb3J0MTYKIDEwNyBwYXNjYWwxNiBXU0FBc3luY0dldFNlcnZCeU5hbWUod29yZCB3b3JkIHB0ciBwdHIgc2VncHRyIHdvcmQpCi0gICAgICAgICAgICAgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lCi0xMDggcGFzY2FsMTYgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0KHdvcmQpIFdTQUNhbmNlbEFzeW5jUmVxdWVzdAorICAgICAgICAgICAgIFdTQUFzeW5jR2V0U2VydkJ5TmFtZTE2CisxMDggcGFzY2FsMTYgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0KHdvcmQpIFdTQUNhbmNlbEFzeW5jUmVxdWVzdDE2CiAxMDkgcGFzY2FsMTYgV1NBU2V0QmxvY2tpbmdIb29rKHNlZ3B0cikgV1NBU2V0QmxvY2tpbmdIb29rMTYKIDExMCBwYXNjYWwxNiBXU0FVbmhvb2tCbG9ja2luZ0hvb2soKSBXU0FVbmhvb2tCbG9ja2luZ0hvb2sxNgogMTExIHBhc2NhbDE2IFdTQUdldExhc3RFcnJvcigpIFdTQUdldExhc3RFcnJvcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9idWlsdGluMzIuaCBiL2luY2x1ZGUvYnVpbHRpbjMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1MzJhMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYnVpbHRpbjMyLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIFdpbjMyIGJ1aWx0LWluIERMTHMgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaWZuZGVmIF9fV0lORV9CVUlMVElOMzJfSAorI2RlZmluZSBfX1dJTkVfQlVJTFRJTjMyX0gKKwordHlwZWRlZiB2b2lkICgqRU5UUllQT0lOVDMyKSgpOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IGNoYXIgICAgICAgICAgICpuYW1lOyAgICAgICAgIC8qIERMTCBuYW1lICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgIGJhc2U7ICAgICAgICAgLyogT3JkaW5hbCBiYXNlICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgIG5iX2Z1bmNzOyAgICAgLyogTnVtYmVyIG9mIGZ1bmN0aW9ucyAqLworICAgIGludCAgICAgICAgICAgICAgICAgICBuYl9uYW1lczsgICAgIC8qIE51bWJlciBvZiBmdW5jdGlvbiBuYW1lcyAqLworICAgIGludCAgICAgICAgICAgICAgICAgICBuYl9yZWdfZnVuY3M7IC8qIE51bWJlciBvZiByZWdpc3RlciBmdW5jdGlvbnMgKi8KKyAgICBjb25zdCBFTlRSWVBPSU5UMzIgICAqZnVuY3Rpb25zOyAgICAvKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRhYmxlICovCisgICAgY29uc3QgY2hhciAqIGNvbnN0ICAgKm5hbWVzOyAgICAgICAgLyogUG9pbnRlciB0byBuYW1lcyB0YWJsZSAqLworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpvcmRpbmFsczsgICAgIC8qIFBvaW50ZXIgdG8gb3JkaW5hbHMgdGFibGUgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICAqYXJnczsgICAgICAgICAvKiBQb2ludGVyIHRvIGFyZ3VtZW50IGxlbmd0aHMgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgICAqYXJndHlwZXM7ICAgICAvKiBQb2ludGVyIHRvIGFyZ3VtZW50IHR5cGVzIGJpdG1hc2sgKi8KK30gQlVJTFRJTjMyX0RFU0NSSVBUT1I7CisKK2V4dGVybiBFTlRSWVBPSU5UMzIgQlVJTFRJTjMyX0dldEVudHJ5UG9pbnQoIGNoYXIgKmJ1ZmZlciwgdm9pZCAqcmVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnR5cGVtYXNrICk7CitleHRlcm4gdm9pZCBCVUlMVElOMzJfVW5pbXBsZW1lbnRlZCggY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgKmRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRpbmFsICk7CisKKyNlbmRpZiAvKiBfX1dJTkVfQlVJTFRJTjMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FjaGUuaCBiL2luY2x1ZGUvY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTEwYjAzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jYWNoZS5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBXaW5lIGludGVybmFsbHkgY2FjaGVkIG9iamVjdHMgdG8gc3BlZWR1cCBzb21lIHRoaW5ncyBhbmQgcHJldmVudCAKKyAqIGluZmluaXRlIGR1cGxpY2F0aW9uIG9mIHRyaXZpYWwgY29kZSBhbmQgZGF0YS4gCisgKiAKKyAqIENvcHlyaWdodCAxOTk3IEJlcnRobyBBLiBTdHVsdGllbnMKKyAqCisgKi8KKworI2lmbmRlZiBfX1dJTkVfQ0FDSEVfSAorI2RlZmluZSBfX1dJTkVfQ0FDSEVfSAorCisjaW5jbHVkZSAid2ludHlwZXMuaCIKKworSEJSVVNIMzIgIENBQ0hFX0dldFBhdHRlcm41NUFBQnJ1c2godm9pZCk7CitIQklUTUFQMzIgQ0FDSEVfR2V0UGF0dGVybjU1QUFCaXRtYXAodm9pZCk7CisKKyNlbmRpZiAvKiBfX1dJTkVfQ0FDSEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYWxsYmFjay5oIGIvaW5jbHVkZS9jYWxsYmFjay5oCmluZGV4IDg2YjYwNGYuLmMwMmFiY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FsbGJhY2suaAorKysgYi9pbmNsdWRlL2NhbGxiYWNrLmgKQEAgLTE5LDcgKzE5LDggQEAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBWT0lEIChDQUxMQkFDSyAqQ2FsbFJlZ2lzdGVyUHJvYykoIENPTlRFWFQgKiwgSU5UMzIgKTsKKyAgICBMT05HIChDQUxMQkFDSyAqQ2FsbFJlZ2lzdGVyU2hvcnRQcm9jKSggQ09OVEVYVCAqLCBJTlQzMiApOworICAgIExPTkcgKENBTExCQUNLICpDYWxsUmVnaXN0ZXJMb25nUHJvYykoIENPTlRFWFQgKiwgSU5UMzIgKTsKICAgICBWT0lEIChDQUxMQkFDSyAqQ2FsbFRhc2tSZXNjaGVkdWxlUHJvYykodm9pZCk7CiAgICAgVk9JRCAoQ0FMTEJBQ0sgKkNhbGxGcm9tMTZXbmRQcm9jKSh2b2lkKTsKICAgICBMUkVTVUxUIChDQUxMQkFDSyAqQ2FsbFduZFByb2MpKCBXTkRQUk9DMTYsIEhXTkQxNiwgVUlOVDE2LApAQCAtMzYsNiArMzcsNyBAQAogICAgIFZPSUQgKENBTExCQUNLICpDYWxsQm9vdEFwcFByb2MpKCBGQVJQUk9DMTYsIEhBTkRMRTE2LCBIRklMRTE2ICk7CiAgICAgV09SRCAoQ0FMTEJBQ0sgKkNhbGxMb2FkQXBwU2VnUHJvYykoIEZBUlBST0MxNiwgSEFORExFMTYsIEhGSUxFMTYsIFdPUkQgKTsKICAgICBWT0lEIChDQUxMQkFDSyAqQ2FsbFN5c3RlbVRpbWVyUHJvYykoIEZBUlBST0MxNiApOworICAgIERXT1JEIChDQUxMQkFDSyAqQ2FsbFdPV0NhbGxiYWNrUHJvYykoIEZBUlBST0MxNiwgRFdPUkQgKTsKICAgICBMUkVTVUxUIChDQUxMQkFDSyAqQ2FsbEFTUElQb3N0UHJvYykoIEZBUlBST0MxNiwgU0VHUFRSICk7CiAgICAgLyogRm9sbG93aW5nIGFyZSB0aGUgZ3JhcGhpY3MgZHJpdmVyIGNhbGxiYWNrcyAqLwogICAgIFdPUkQgKENBTExCQUNLICpDYWxsRHJ2Q29udHJvbFByb2MpKCBGQVJQUk9DMTYsIFNFR1BUUiwgV09SRCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29sb3IuaCBiL2luY2x1ZGUvY29sb3IuaAppbmRleCA3MzVlNjI5Li5kMjI2YTE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbG9yLmgKKysrIGIvaW5jbHVkZS9jb2xvci5oCkBAIC0xNCw2ICsxNCw3IEBACiAjZGVmaW5lIFBDX1NZU19SRVNFUlZFRCAweDQwCQkvKiBzeXN0ZW0gcGFsZW50cnkgaXMgbm90IHRvIGJlIG1hcHBlZCB0byAqLwogI2RlZmluZSBQQ19TWVNfTUFQUEVEICAgMHgxMAkJLyogbG9naWNhbCBwYWxlbnRyeSBpcyBhIGRpcmVjdCBhbGlhcyBmb3Igc3lzdGVtIHBhbGVudHJ5ICovCiAKK2V4dGVybiBCT09MMzIgICAgIENPTE9SX0luaXQodm9pZCk7CiBleHRlcm4gdm9pZAkgIENPTE9SX0NsZWFudXAodm9pZCk7CiBleHRlcm4gQ09MT1JSRUYJICBDT0xPUl9Ub0xvZ2ljYWwoaW50IHBpeGVsKTsKIGV4dGVybiBpbnQgCSAgQ09MT1JfVG9QaHlzaWNhbCggREMgKmRjLCBDT0xPUlJFRiBjb2xvciApOwpAQCAtMjIsMTEgKzIzLDEzIEBACiBleHRlcm4gQ29sb3JtYXAJICBDT0xPUl9HZXRDb2xvcm1hcCgpOwogZXh0ZXJuIFVJTlQxNgkgIENPTE9SX0dldFN5c3RlbVBhbGV0dGVTaXplKCk7CiBleHRlcm4gVUlOVDE2CSAgQ09MT1JfR2V0U3lzdGVtUGFsZXR0ZUZsYWdzKCk7CitleHRlcm4gY29uc3QgUEFMRVRURUVOVFJZKiBDT0xPUl9HZXRTeXN0ZW1QYWxldHRlVGVtcGxhdGUodm9pZCk7CiBleHRlcm4gQk9PTDMyCSAgQ09MT1JfR2V0TW9ub1BsYW5lKCBpbnQqICk7CiAKIGV4dGVybiBDT0xPUlJFRgkgIENPTE9SX0xvb2t1cE5lYXJlc3RDb2xvciggUEFMRVRURUVOVFJZKiwgaW50LCBDT0xPUlJFRiApOwogZXh0ZXJuIGludCAgICAgICAgQ09MT1JfUGFsZXR0ZUxvb2t1cFBpeGVsKCBQQUxFVFRFRU5UUlkqLCBpbnQsIGludCogLCBDT0xPUlJFRiwgQk9PTDMyICk7CiBleHRlcm4gQ09MT1JSRUYgICBDT0xPUl9HZXRTeXN0ZW1QYWxldHRlRW50cnkoVUlOVDMyKTsKK2V4dGVybiBpbnQgQ09MT1JfTG9va3VwU3lzdGVtUGl4ZWwoQ09MT1JSRUYgY29sKTsKIAogZXh0ZXJuIGludCAJQ09MT1JfbWFwRUdBUGl4ZWxbMTZdOwogZXh0ZXJuIGludCogCUNPTE9SX1BhbGV0dGVUb1BpeGVsOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21wb2JqLmggYi9pbmNsdWRlL2NvbXBvYmouaAppbmRleCA5YWNhNzcxLi42ZjIyODlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbXBvYmouaAorKysgYi9pbmNsdWRlL2NvbXBvYmouaApAQCAtMTEsNyArMTEsNyBAQAogICAgIEJZVEUgIERhdGE0WzhdOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgdGFnR1VJRAlHVUlEOwordHlwZWRlZiBzdHJ1Y3QgdGFnR1VJRAlHVUlELCpMUEdVSUQ7CiB0eXBlZGVmIHN0cnVjdCB0YWdHVUlECUNMU0lELCpMUENMU0lELCpSRUZDTFNJRDsKIHR5cGVkZWYgc3RydWN0IHRhZ0dVSUQJSUlELCpSRUZJSUQsKkxQSUlEOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZy5oLmluIGIvaW5jbHVkZS9jb25maWcuaC5pbgppbmRleCAxMmNkODJkLi4yZDMwMWM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZy5oLmluCisrKyBiL2luY2x1ZGUvY29uZmlnLmguaW4KQEAgLTIxLDYgKzIxLDkgQEAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtbW92ZSBmdW5jdGlvbi4gICovCiAjdW5kZWYgSEFWRV9NRU1NT1ZFCiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLworI3VuZGVmIEhBVkVfU1RSRVJST1IKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0Y2dldGF0dHIgZnVuY3Rpb24uICAqLwogI3VuZGVmIEhBVkVfVENHRVRBVFRSCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3Vyc29yaWNvbi5oIGIvaW5jbHVkZS9jdXJzb3JpY29uLmgKaW5kZXggMTRjMzRiOC4uNjkxNDg3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jdXJzb3JpY29uLmgKKysrIGIvaW5jbHVkZS9jdXJzb3JpY29uLmgKQEAgLTUwLDYgKzUwLDkgQEAKIAogI3ByYWdtYSBwYWNrKDQpCiAKK2V4dGVybiBIQ1VSU09SMTYgQ1VSU09SSUNPTl9JY29uVG9DdXJzb3IoIEhJQ09OMTYgaEljb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgYlNlbWlUcmFuc3BhcmVudCApOworCiBleHRlcm4gQ3Vyc29yIENVUlNPUklDT05fWEN1cnNvcjsgIC8qIEN1cnJlbnQgWCBjdXJzb3IgKi8KIAogI2VuZGlmIC8qIF9fV0lORV9DVVJTT1JJQ09OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGNlLmggYi9pbmNsdWRlL2RjZS5oCmluZGV4IDExZDIzNWYuLjA4OWFkMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGNlLmgKKysrIGIvaW5jbHVkZS9kY2UuaApAQCAtMjIsNiArMjIsNyBAQAogCiAjZGVmaW5lIERDWF9EQ0VFTVBUWQkJMHgwMDAwMDgwMAogI2RlZmluZSBEQ1hfRENFQlVTWQkJMHgwMDAwMTAwMAorI2RlZmluZSBEQ1hfRENFRElSVFkJCTB4MDAwMDIwMDAKICNkZWZpbmUgRENYX1dJTkRPV1BBSU5UCQkweDAwMDIwMDAwCiAjZGVmaW5lIERDWF9LRUVQQ0xJUFJHTgkJMHgwMDA0MDAwMAogI2RlZmluZSBEQ1hfTk9DTElQQ0hJTERSRU4gICAgICAweDAwMDgwMDAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlYnVnLmggYi9pbmNsdWRlL2RlYnVnLmgKaW5kZXggMzY1YzBlYS4uYTM0NTE5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZGVidWcuaApAQCAtNzgsNiArNzgsNyBAQAogI3VuZGVmIERFQlVHX1NUUklORwogI3VuZGVmIERFQlVHX1RBU0sKICN1bmRlZiBERUJVR19URVhUCisjdW5kZWYgREVCVUdfVEhVTksKICN1bmRlZiBERUJVR19USU1FUgogI3VuZGVmIERFQlVHX1RPT0xIRUxQCiAjdW5kZWYgREVCVUdfVFdFQUsKQEAgLTE2NCw2ICsxNjUsNyBAQAogI2RlZmluZSBERUJVR19TVFJJTkcKICNkZWZpbmUgREVCVUdfVEFTSwogI2RlZmluZSBERUJVR19URVhUCisjZGVmaW5lIERFQlVHX1RIVU5LCiAjZGVmaW5lIERFQlVHX1RJTUVSCiAjZGVmaW5lIERFQlVHX1RPT0xIRUxQCiAjZGVmaW5lIERFQlVHX1RXRUFLCkBAIC01NDAsNiArNTQyLDExIEBACiAjZWxzZQogICAgIDAsCiAjZW5kaWYKKyNpZmRlZiBERUJVR19USFVOSworICAgIDEsCisjZWxzZQorICAgIDAsCisjZW5kaWYKICNpZmRlZiBERUJVR19USU1FUgogICAgIDEsCiAjZWxzZQpAQCAtMTUzOSw4ICsxNTQ2LDIxIEBACiAjZW5kaWYKIAogI2lmZGVmIERFQlVHX1JVTlRJTUUKLSNkZWZpbmUgZHByaW50Zl90aW1lciBpZighZGVidWdfbXNnX2VuYWJsZWRbNzJdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdGltZXIgZGVidWdfbXNnX2VuYWJsZWRbNzJdCisjZGVmaW5lIGRwcmludGZfdGh1bmsgaWYoIWRlYnVnX21zZ19lbmFibGVkWzcyXSkgOyBlbHNlIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3RodW5rIGRlYnVnX21zZ19lbmFibGVkWzcyXQorI2Vsc2UKKyNpZmRlZiBERUJVR19USFVOSworI2RlZmluZSBkcHJpbnRmX3RodW5rIGZwcmludGYKKyNkZWZpbmUgZGVidWdnaW5nX3RodW5rIDEKKyNlbHNlCisjZGVmaW5lIGRwcmludGZfdGh1bmsgd2hpbGUoMCkgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdGh1bmsgMAorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIERFQlVHX1JVTlRJTUUKKyNkZWZpbmUgZHByaW50Zl90aW1lciBpZighZGVidWdfbXNnX2VuYWJsZWRbNzNdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdGltZXIgZGVidWdfbXNnX2VuYWJsZWRbNzNdCiAjZWxzZQogI2lmZGVmIERFQlVHX1RJTUVSCiAjZGVmaW5lIGRwcmludGZfdGltZXIgZnByaW50ZgpAQCAtMTU1Miw4ICsxNTcyLDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3Rvb2xoZWxwIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3M10pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190b29saGVscCBkZWJ1Z19tc2dfZW5hYmxlZFs3M10KKyNkZWZpbmUgZHByaW50Zl90b29saGVscCBpZighZGVidWdfbXNnX2VuYWJsZWRbNzRdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdG9vbGhlbHAgZGVidWdfbXNnX2VuYWJsZWRbNzRdCiAjZWxzZQogI2lmZGVmIERFQlVHX1RPT0xIRUxQCiAjZGVmaW5lIGRwcmludGZfdG9vbGhlbHAgZnByaW50ZgpAQCAtMTU2NSw4ICsxNTg1LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3R3ZWFrIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs3NF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ190d2VhayBkZWJ1Z19tc2dfZW5hYmxlZFs3NF0KKyNkZWZpbmUgZHByaW50Zl90d2VhayBpZighZGVidWdfbXNnX2VuYWJsZWRbNzVdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdHdlYWsgZGVidWdfbXNnX2VuYWJsZWRbNzVdCiAjZWxzZQogI2lmZGVmIERFQlVHX1RXRUFLCiAjZGVmaW5lIGRwcmludGZfdHdlYWsgZnByaW50ZgpAQCAtMTU3OCw4ICsxNTk4LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3VwZG93biBpZighZGVidWdfbXNnX2VuYWJsZWRbNzVdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdXBkb3duIGRlYnVnX21zZ19lbmFibGVkWzc1XQorI2RlZmluZSBkcHJpbnRmX3VwZG93biBpZighZGVidWdfbXNnX2VuYWJsZWRbNzZdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdXBkb3duIGRlYnVnX21zZ19lbmFibGVkWzc2XQogI2Vsc2UKICNpZmRlZiBERUJVR19VUERPV04KICNkZWZpbmUgZHByaW50Zl91cGRvd24gZnByaW50ZgpAQCAtMTU5MSw4ICsxNjExLDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3ZlciBpZighZGVidWdfbXNnX2VuYWJsZWRbNzZdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdmVyIGRlYnVnX21zZ19lbmFibGVkWzc2XQorI2RlZmluZSBkcHJpbnRmX3ZlciBpZighZGVidWdfbXNnX2VuYWJsZWRbNzddKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdmVyIGRlYnVnX21zZ19lbmFibGVkWzc3XQogI2Vsc2UKICNpZmRlZiBERUJVR19WRVIKICNkZWZpbmUgZHByaW50Zl92ZXIgZnByaW50ZgpAQCAtMTYwNCw4ICsxNjI0LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3ZpcnR1YWwgaWYoIWRlYnVnX21zZ19lbmFibGVkWzc3XSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3ZpcnR1YWwgZGVidWdfbXNnX2VuYWJsZWRbNzddCisjZGVmaW5lIGRwcmludGZfdmlydHVhbCBpZighZGVidWdfbXNnX2VuYWJsZWRbNzhdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdmlydHVhbCBkZWJ1Z19tc2dfZW5hYmxlZFs3OF0KICNlbHNlCiAjaWZkZWYgREVCVUdfVklSVFVBTAogI2RlZmluZSBkcHJpbnRmX3ZpcnR1YWwgZnByaW50ZgpAQCAtMTYxNyw4ICsxNjM3LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3Z4ZCBpZighZGVidWdfbXNnX2VuYWJsZWRbNzhdKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfdnhkIGRlYnVnX21zZ19lbmFibGVkWzc4XQorI2RlZmluZSBkcHJpbnRmX3Z4ZCBpZighZGVidWdfbXNnX2VuYWJsZWRbNzldKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfdnhkIGRlYnVnX21zZ19lbmFibGVkWzc5XQogI2Vsc2UKICNpZmRlZiBERUJVR19WWEQKICNkZWZpbmUgZHByaW50Zl92eGQgZnByaW50ZgpAQCAtMTYzMCw4ICsxNjUwLDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3dpbiBpZighZGVidWdfbXNnX2VuYWJsZWRbNzldKSA7IGVsc2UgZnByaW50ZgotI2RlZmluZSBkZWJ1Z2dpbmdfd2luIGRlYnVnX21zZ19lbmFibGVkWzc5XQorI2RlZmluZSBkcHJpbnRmX3dpbiBpZighZGVidWdfbXNnX2VuYWJsZWRbODBdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfd2luIGRlYnVnX21zZ19lbmFibGVkWzgwXQogI2Vsc2UKICNpZmRlZiBERUJVR19XSU4KICNkZWZpbmUgZHByaW50Zl93aW4gZnByaW50ZgpAQCAtMTY0Myw4ICsxNjYzLDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3dpbjE2ZHJ2IGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs4MF0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW4xNmRydiBkZWJ1Z19tc2dfZW5hYmxlZFs4MF0KKyNkZWZpbmUgZHByaW50Zl93aW4xNmRydiBpZighZGVidWdfbXNnX2VuYWJsZWRbODFdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfd2luMTZkcnYgZGVidWdfbXNnX2VuYWJsZWRbODFdCiAjZWxzZQogI2lmZGVmIERFQlVHX1dJTjE2RFJWCiAjZGVmaW5lIGRwcmludGZfd2luMTZkcnYgZnByaW50ZgpAQCAtMTY1Niw4ICsxNjc2LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3dpbjMyIGlmKCFkZWJ1Z19tc2dfZW5hYmxlZFs4MV0pIDsgZWxzZSBmcHJpbnRmCi0jZGVmaW5lIGRlYnVnZ2luZ193aW4zMiBkZWJ1Z19tc2dfZW5hYmxlZFs4MV0KKyNkZWZpbmUgZHByaW50Zl93aW4zMiBpZighZGVidWdfbXNnX2VuYWJsZWRbODJdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfd2luMzIgZGVidWdfbXNnX2VuYWJsZWRbODJdCiAjZWxzZQogI2lmZGVmIERFQlVHX1dJTjMyCiAjZGVmaW5lIGRwcmludGZfd2luMzIgZnByaW50ZgpAQCAtMTY2OSw4ICsxNjg5LDggQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfUlVOVElNRQotI2RlZmluZSBkcHJpbnRmX3dpbnNvY2sgaWYoIWRlYnVnX21zZ19lbmFibGVkWzgyXSkgOyBlbHNlIGZwcmludGYKLSNkZWZpbmUgZGVidWdnaW5nX3dpbnNvY2sgZGVidWdfbXNnX2VuYWJsZWRbODJdCisjZGVmaW5lIGRwcmludGZfd2luc29jayBpZighZGVidWdfbXNnX2VuYWJsZWRbODNdKSA7IGVsc2UgZnByaW50ZgorI2RlZmluZSBkZWJ1Z2dpbmdfd2luc29jayBkZWJ1Z19tc2dfZW5hYmxlZFs4M10KICNlbHNlCiAjaWZkZWYgREVCVUdfV0lOU09DSwogI2RlZmluZSBkcHJpbnRmX3dpbnNvY2sgZnByaW50ZgpAQCAtMTc1Nyw2ICsxNzc3LDcgQEAKICAgICAic3RyaW5nIiwKICAgICAidGFzayIsCiAgICAgInRleHQiLAorICAgICJ0aHVuayIsCiAgICAgInRpbWVyIiwKICAgICAidG9vbGhlbHAiLAogICAgICJ0d2VhayIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dkaS5oIGIvaW5jbHVkZS9nZGkuaAppbmRleCBkNzQ0YTQxLi5lZDkwYjk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2dkaS5oCisrKyBiL2luY2x1ZGUvZ2RpLmgKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJsb2NhbC5oIgogI2luY2x1ZGUgIngxMWRydi5oIgorI2luY2x1ZGUgInBhdGguaCIKIAogICAvKiBHREkgb2JqZWN0cyBtYWdpYyBudW1iZXJzICovCiAjZGVmaW5lIFBFTl9NQUdJQyAgICAgICAgICAgICAweDRmNDcKQEAgLTEwMCw2ICsxMDEsOCBAQAogICAgIEhCSVRNQVAxNiAgICAgaEZpcnN0Qml0bWFwOyAvKiBCaXRtYXAgc2VsZWN0ZWQgYXQgY3JlYXRpb24gb2YgdGhlIERDICovCiAgICAgSEFORExFMTYgICAgICBoRGV2aWNlOwogICAgIEhQQUxFVFRFMTYgICAgaFBhbGV0dGU7CisgICAgCisgICAgR2RpUGF0aCAgICAgICBwYXRoOwogCiAgICAgV09SRCAgICAgICAgICBST1Btb2RlOwogICAgIFdPUkQgICAgICAgICAgcG9seUZpbGxNb2RlOwpAQCAtMjQ2LDcgKzI0OSw3IEBACiAKICAgLyogU3RvY2sgb2JqZWN0cyBoYW5kbGVzICovCiAKLSNkZWZpbmUgTkJfU1RPQ0tfT0JKRUNUUyAgICAgICAgICAoU1lTVEVNX0ZJWEVEX0ZPTlQgKyAxKQorI2RlZmluZSBOQl9TVE9DS19PQkpFQ1RTICAgICAgICAgIChERUZBVUxUX0dVSV9GT05UICsgMSkKIAogI2RlZmluZSBTVE9DS19XSElURV9CUlVTSCAgICAgICAoKEhCUlVTSDE2KShGSVJTVF9TVE9DS19IQU5ETEUrV0hJVEVfQlJVU0gpKQogI2RlZmluZSBTVE9DS19MVEdSQVlfQlJVU0ggICAgICAoKEhCUlVTSDE2KShGSVJTVF9TVE9DS19IQU5ETEUrTFRHUkFZX0JSVVNIKSkKQEAgLTI2NSwxMSArMjY4LDEyIEBACiAjZGVmaW5lIFNUT0NLX0RFVklDRV9ERUZBVUxUX0ZPTlQgKChIRk9OVDE2KShGSVJTVF9TVE9DS19IQU5ETEUrREVWSUNFX0RFRkFVTFRfRk9OVCkpCiAjZGVmaW5lIFNUT0NLX0RFRkFVTFRfUEFMRVRURSAgICgoSFBBTEVUVEUxNikoRklSU1RfU1RPQ0tfSEFORExFK0RFRkFVTFRfUEFMRVRURSkpCiAjZGVmaW5lIFNUT0NLX1NZU1RFTV9GSVhFRF9GT05UICgoSEZPTlQxNikoRklSU1RfU1RPQ0tfSEFORExFK1NZU1RFTV9GSVhFRF9GT05UKSkKKyNkZWZpbmUgU1RPQ0tfREVGQVVMVF9HVUlfRk9OVCAgKChIRk9OVDE2KShGSVJTVF9TVE9DS19IQU5ETEUrREVGQVVMVF9HVUlfRk9OVCkpCiAKICNkZWZpbmUgRklSU1RfU1RPQ0tfRk9OVCAgICAgICAgU1RPQ0tfT0VNX0ZJWEVEX0ZPTlQKLSNkZWZpbmUgTEFTVF9TVE9DS19GT05UICAgICAgICAgU1RPQ0tfU1lTVEVNX0ZJWEVEX0ZPTlQKKyNkZWZpbmUgTEFTVF9TVE9DS19GT05UICAgICAgICAgU1RPQ0tfREVGQVVMVF9HVUlfRk9OVAogCi0jZGVmaW5lIExBU1RfU1RPQ0tfSEFORExFICAgICAgICgoRFdPUkQpU1RPQ0tfU1lTVEVNX0ZJWEVEX0ZPTlQpCisjZGVmaW5lIExBU1RfU1RPQ0tfSEFORExFICAgICAgICgoRFdPUkQpU1RPQ0tfREVGQVVMVF9HVUlfRk9OVCkKIAogICAvKiBEZXZpY2UgPC0+IGxvZ2ljYWwgY29vcmRzIGNvbnZlcnNpb24gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pbnRlcmZhY2VzLmggYi9pbmNsdWRlL2ludGVyZmFjZXMuaAppbmRleCA1ZTkxMmRhLi5lZjcwYTIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ludGVyZmFjZXMuaAorKysgYi9pbmNsdWRlL2ludGVyZmFjZXMuaApAQCAtNSw2ICs1LDEzIEBACiAjaW5jbHVkZSAib2xlMi5oIgogI2luY2x1ZGUgImNvbXBvYmouaCIKIAorI2RlZmluZSBTVERNRVRIT0QoeGZuKSBIUkVTVUxUIChDQUxMQkFDSyAqZm4jI3hmbikKKyNkZWZpbmUgU1RETUVUSE9EXyhyZXQseGZuKSByZXQgKENBTExCQUNLICpmbiMjeGZuKQorI2RlZmluZSBQVVJFCisjZGVmaW5lIEZBUgorI2RlZmluZQlUSElTXyBUSElTLAorCisKIERFRklORV9PTEVHVUlEKElJRF9JVW5rbm93biwwLDAsMCk7CiBERUZJTkVfT0xFR1VJRChJSURfSUNsYXNzRmFjdG9yeSwxLDAsMCk7CiBERUZJTkVfT0xFR1VJRChJSURfSU1hbGxvYywyLDAsMCk7CkBAIC0xOCwyOCArMjUsNjUgQEAKIERFRklORV9PTEVHVUlEKElJRF9JTWVzc2FnZUZpbHRlciwweDE2LDAsMCk7CiBERUZJTkVfT0xFR1VJRChJSURfSVN0ZE1hcnNoYWxJbmZvLDB4MTgsMCwwKTsKIAotdHlwZWRlZiBzdHJ1Y3QgdGFnVU5LTk9XTiAqTFBVTktOT1dOLElVbmtub3duOworI2RlZmluZSBUSElTIExQVU5LTk9XTiB0aGlzCit0eXBlZGVmIHN0cnVjdCBJVW5rbm93biAqTFBVTktOT1dOLElVbmtub3duOwogdHlwZWRlZiBzdHJ1Y3QgewotCUhSRVNVTFQJKENBTExCQUNLICpmblF1ZXJ5SW50ZXJmYWNlKShMUFVOS05PV04gdGhpcyxSRUZJSUQgcmVmaWlkLExQVk9JRCAqb2JqKTsKLQlIUkVTVUxUCShDQUxMQkFDSyAqZm5BZGRSZWYpKExQVU5LTk9XTiB0aGlzKTsKLQlIUkVTVUxUCShDQUxMQkFDSyAqZm5SZWxlYXNlKShMUFVOS05PV04gdGhpcyk7Ci19ICpMUFVOS05PV05fVlRBQkxFOworCVNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLExQVk9JRCBGQVIqIHBwdk9iaikgUFVSRTsKKwlTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgKFRISVMpIFBVUkU7CisJU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKK30gKkxQVU5LTk9XTl9WVEFCTEUsSVVua25vd25fVlRhYmxlOwogCi1zdHJ1Y3QgdGFnVU5LTk9XTiB7CitzdHJ1Y3QgSVVua25vd24gewogCUxQVU5LTk9XTl9WVEFCTEUJbHB2dGJsOwotCS8qIGludGVybmFsIHN0dWZmLiBOb3QgbmVlZGVkIHVudGlsIHdlIGFjdHVhbGx5IGltcGxlbWVudCBJVW5rbm93biAqLworCURXT1JECQkJcmVmOwogfTsKKyN1bmRlZiBUSElTCiAKLXR5cGVkZWYgc3RydWN0IHRhZ0NMQVNTRkFDVE9SWSAqTFBDTEFTU0ZBQ1RPUlksSUNsYXNzRmFjdG9yeTsKKyNkZWZpbmUgVEhJUyBMUENMQVNTRkFDVE9SWSB0aGlzCit0eXBlZGVmIHN0cnVjdCBJQ2xhc3NGYWN0b3J5ICpMUENMQVNTRkFDVE9SWSxJQ2xhc3NGYWN0b3J5OwogdHlwZWRlZiBzdHJ1Y3QgewotCUhSRVNVTFQJKENBTExCQUNLICpmblF1ZXJ5SW50ZXJmYWNlKShMUENMQVNTRkFDVE9SWSB0aGlzLFJFRklJRCByZWZpaWQsTFBWT0lEICpvYmopOwotCUhSRVNVTFQJKENBTExCQUNLICpmbkFkZFJlZikoTFBDTEFTU0ZBQ1RPUlkgdGhpcyk7Ci0JSFJFU1VMVAkoQ0FMTEJBQ0sgKmZuUmVsZWFzZSkoTFBDTEFTU0ZBQ1RPUlkgdGhpcyk7Ci0JSFJFU1VMVCAoQ0FMTEJBQ0sgKmZuQ3JlYXRlSW5zdGFuY2UpKExQQ0xBU1NGQUNUT1JZIHRoaXMsTFBVTktOT1dOIHBVbmtPdXRlcixSRUZJSUQgcmlpZCxMUFZPSUQgKiBwcHZPYmplY3QpOwotfSAqTFBDTEFTU0ZBQ1RPUllfVlRBQkxFOworCVNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLExQVk9JRCBGQVIqIHBwdk9iaikgUFVSRTsKKwlTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgKFRISVMpIFBVUkU7CisJU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKwlTVERNRVRIT0QoQ3JlYXRlSW5zdGFuY2UpIChUSElTXyBMUFVOS05PV04gcFVua091dGVyLCBSRUZJSUQgcmlpZCwgTFBWT0lEIEZBUiogcHB2T2JqZWN0KSBQVVJFOworfSAqTFBDTEFTU0ZBQ1RPUllfVlRBQkxFLElDbGFzc0ZhY3RvcnlfVlRhYmxlOwogCi1zdHJ1Y3QgdGFnQ0xBU1NGQUNUT1JZIHsKLQlMUENMQVNTRkFDVE9SWV9WVEFCTEUgbHB2dGJsOwotCS8qaW50ZXJuYWwgc3R1ZmYuIE5vdCBuZWVkZWQgdW50aWwgd2UgYWN0dWFsbHkgaW1wbGVtZW50IElDbGFzc0ZhY3RvcnkqLworc3RydWN0IElDbGFzc0ZhY3RvcnkgeworCUxQQ0xBU1NGQUNUT1JZX1ZUQUJMRQlscHZ0Ymw7CisJRFdPUkQJCQlyZWY7CiB9OworI3VuZGVmIFRISVMKKworI2RlZmluZSBUSElTIExQTUFMTE9DIHRoaXMKK3R5cGVkZWYgc3RydWN0IElNYWxsb2MgKkxQTUFMTE9DLElNYWxsb2M7Cit0eXBlZGVmIHN0cnVjdCB7CisJU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsTFBWT0lEIEZBUiogcHB2T2JqKSBQVVJFOworCVNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgUFVSRTsKKwlTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOworCisJU1RETUVUSE9EXyhMUFZPSUQsQWxsb2MpICggVEhJU18gRFdPUkQgY2IpOworCVNURE1FVEhPRF8oTFBWT0lELFJlYWxsb2MpICggVEhJU18gTFBWT0lEIHB2LERXT1JEIGNiKTsKKwlTVERNRVRIT0RfKFZPSUQsRnJlZSkgKCBUSElTXyBMUFZPSUQgcHYpOworCVNURE1FVEhPRF8oRFdPUkQsR2V0U2l6ZSkgKCBUSElTXyBMUFZPSUQgcHYpOworCVNURE1FVEhPRF8oTFBJTlQzMixEaWRBbGxvYykgKCBUSElTXyBMUFZPSUQgcHYpOworCVNURE1FVEhPRF8oTFBWT0lELEhlYXBNaW5pbWl6ZSkgKCBUSElTICk7Cit9ICpMUE1BTExPQ19WVEFCTEUsSU1hbGxvY19WVGFibGU7CisKK3N0cnVjdCBJTWFsbG9jIHsKKwlMUE1BTExPQ19WVEFCTEUgbHB2dGJsOworCURXT1JECQlyZWY7Cit9OworI3VuZGVmIFRISVMKKworLyogcHJpdmF0ZSBwcm90b3R5cGVzIGZvciB0aGUgY29uc3RydWN0b3JzICovCisjaWZkZWYgX19XSU5FX18KK0xQVU5LTk9XTglJVW5rbm93bl9Db25zdHJ1Y3RvcigpOworTFBNQUxMT0MJSU1hbGxvY19Db25zdHJ1Y3RvcigpOworI2VuZGlmCisKKyN1bmRlZiBTVERNRVRIT0QKKyN1bmRlZiBTVERNRVRIT0RfCisjdW5kZWYgUFVSRQorI3VuZGVmIEZBUgorI3VuZGVmIFRISVNfCiAjZW5kaWYgLypfV0lORV9JTlRFUkZBQ0VTX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tbXN5c3RlbS5oIGIvaW5jbHVkZS9tbXN5c3RlbS5oCmluZGV4IGZhNWE1MGIuLjY4NDVmMzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW1zeXN0ZW0uaAorKysgYi9pbmNsdWRlL21tc3lzdGVtLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2RlZmluZSBNQVhQTkFNRUxFTiAgICAgIDMyICAgICAvKiBtYXggcHJvZHVjdCBuYW1lIGxlbmd0aCAoaW5jbHVkaW5nIE5VTEwpICovCiAjZGVmaW5lIE1BWEVSUk9STEVOR1RIICAgMTI4ICAgIC8qIG1heCBlcnJvciB0ZXh0IGxlbmd0aCAoaW5jbHVkaW5nIE5VTEwpICovCisjZGVmaW5lIE1BWF9KT1lTVElDS09FTVZYRE5BTUUJMjYwCiAKIHR5cGVkZWYgV09SRCAgICBWRVJTSU9OOyAgICAgICAgLyogbWFqb3IgKGhpZ2ggYnl0ZSksIG1pbm9yIChsb3cgYnl0ZSkgKi8KIApAQCAtMjcsNiArMjgsOSBAQAogdHlwZWRlZiBVSU5UMTYJTUNJREVWSUNFSUQxNjsKIHR5cGVkZWYgVUlOVDMyCU1DSURFVklDRUlEMzI7CiBERUNMX1dJTkVMSUJfVFlQRShNQ0lERVZJQ0VJRCk7Cit0eXBlZGVmCVVJTlQxNglNTVJFU1VMVDE2OwordHlwZWRlZglVSU5UMzIJTU1SRVNVTFQzMjsKK0RFQ0xfV0lORUxJQl9UWVBFKE1NUkVTVUxUKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFVJTlQxNiAgICB3VHlwZTsJCS8qIGluZGljYXRlcyB0aGUgY29udGVudHMgb2YgdGhlIHVuaW9uICovCkBAIC03MzMsMjQgKzczNyw0NSBAQAogI2RlZmluZSBUSU1FUlJfTk9DQU5ETyAgICAgICAgKFRJTUVSUl9CQVNFKzEpICAgICAgLyogcmVxdWVzdCBub3QgY29tcGxldGVkICovCiAjZGVmaW5lIFRJTUVSUl9TVFJVQ1QgICAgICAgICAoVElNRVJSX0JBU0UrMzMpICAgICAvKiB0aW1lIHN0cnVjdCBzaXplICovCiAKLXR5cGVkZWYgdm9pZCAoQ0FMTEJBQ0sgKkxQVElNRUNBTExCQUNLKSAoVUlOVDE2IHVUaW1lcklELCBVSU5UMTYgdU1lc3NhZ2UsIERXT1JEIGR3VXNlciwgRFdPUkQgZHcxLCBEV09SRCBkdzIpOwordHlwZWRlZiB2b2lkIChDQUxMQkFDSyAqTFBUSU1FQ0FMTEJBQ0sxNikoVUlOVDE2IHVUaW1lcklELCBVSU5UMTYgdU1lc3NhZ2UsIERXT1JEIGR3VXNlciwgRFdPUkQgZHcxLCBEV09SRCBkdzIpOwordHlwZWRlZiB2b2lkIChDQUxMQkFDSyAqTFBUSU1FQ0FMTEJBQ0szMikoVUlOVDMyIHVUaW1lcklELCBVSU5UMzIgdU1lc3NhZ2UsIERXT1JEIGR3VXNlciwgRFdPUkQgZHcxLCBEV09SRCBkdzIpOworREVDTF9XSU5FTElCX1RZUEUoTFBUSU1FQ0FMTEJBQ0spOwogCiAjZGVmaW5lIFRJTUVfT05FU0hPVCAgICAwICAgLyogcHJvZ3JhbSB0aW1lciBmb3Igc2luZ2xlIGV2ZW50ICovCiAjZGVmaW5lIFRJTUVfUEVSSU9ESUMgICAxICAgLyogcHJvZ3JhbSBmb3IgY29udGludW91cyBwZXJpb2RpYyBldmVudCAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgVUlOVDE2ICAgIHdQZXJpb2RNaW47ICAgICAvKiBtaW5pbXVtIHBlcmlvZCBzdXBwb3J0ZWQgICovCi0gICAgVUlOVDE2ICAgIHdQZXJpb2RNYXg7ICAgICAvKiBtYXhpbXVtIHBlcmlvZCBzdXBwb3J0ZWQgICovCi19IFRJTUVDQVBTLCAqTFBUSU1FQ0FQUzsKKyAgICBVSU5UMTYJd1BlcmlvZE1pbjsJLyogbWluaW11bSBwZXJpb2Qgc3VwcG9ydGVkICAqLworICAgIFVJTlQxNgl3UGVyaW9kTWF4OwkvKiBtYXhpbXVtIHBlcmlvZCBzdXBwb3J0ZWQgICovCit9IFRJTUVDQVBTMTYsKkxQVElNRUNBUFMxNjsKIAotVUlOVDE2IFdJTkFQSSB0aW1lR2V0U3lzdGVtVGltZShMUE1NVElNRTE2IGxwVGltZSwgVUlOVDE2IHVTaXplKTsKLURXT1JEIFdJTkFQSSB0aW1lR2V0VGltZSh2b2lkKTsKLVVJTlQxNiBXSU5BUEkgdGltZVNldEV2ZW50KFVJTlQxNiB1RGVsYXksIFVJTlQxNiB1UmVzb2x1dGlvbiwKLSAgICBMUFRJTUVDQUxMQkFDSyBscEZ1bmN0aW9uLCBEV09SRCBkd1VzZXIsIFVJTlQxNiB1RmxhZ3MpOwotVUlOVDE2IFdJTkFQSSB0aW1lS2lsbEV2ZW50KFVJTlQxNiB1VGltZXJJRCk7Ci1VSU5UMTYgV0lOQVBJIHRpbWVHZXREZXZDYXBzKFRJTUVDQVBTICogbHBUaW1lQ2FwcywgVUlOVDE2IHVTaXplKTsKLVVJTlQxNiBXSU5BUEkgdGltZUJlZ2luUGVyaW9kKFVJTlQxNiB1UGVyaW9kKTsKLVVJTlQxNiBXSU5BUEkgdGltZUVuZFBlcmlvZChVSU5UMTYgdVBlcmlvZCk7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUlOVDMyCXdQZXJpb2RNaW47CisgICAgVUlOVDMyCXdQZXJpb2RNYXg7Cit9IFRJTUVDQVBTMzIsICpMUFRJTUVDQVBTMzI7CisKK0RFQ0xfV0lORUxJQl9UWVBFKFRJTUVDQVBTKTsKK0RFQ0xfV0lORUxJQl9UWVBFKExQVElNRUNBUFMpOworCitNTVJFU1VMVDE2IFdJTkFQSSB0aW1lR2V0U3lzdGVtVGltZTE2KExQTU1USU1FMTYsVUlOVDE2KTsKK01NUkVTVUxUMzIgV0lOQVBJIHRpbWVHZXRTeXN0ZW1UaW1lMzIoTFBNTVRJTUUzMixVSU5UMzIpOworI2RlZmluZSB0aW1lR2V0U3lzdGVtVGltZSBXSU5FTElCX05BTUUodGltZUdldFN5c3RlbVRpbWUpCitEV09SRCBXSU5BUEkgdGltZUdldFRpbWUoKTsJLyogc2FtZSBmb3Igd2luMzIvd2luMTYgKi8KK01NUkVTVUxUMTYgV0lOQVBJIHRpbWVTZXRFdmVudDE2KFVJTlQxNixVSU5UMTYsTFBUSU1FQ0FMTEJBQ0sxNixEV09SRCxVSU5UMTYpOworTU1SRVNVTFQzMiBXSU5BUEkgdGltZVNldEV2ZW50MzIoVUlOVDMyLFVJTlQzMixMUFRJTUVDQUxMQkFDSzMyLERXT1JELFVJTlQzMik7CisjZGVmaW5lIHRpbWVTZXRFdmVudCBXSU5FTElCX05BTUUodGltZVNldEV2ZW50KQorTU1SRVNVTFQxNiBXSU5BUEkgdGltZUtpbGxFdmVudDE2KFVJTlQxNik7CitNTVJFU1VMVDMyIFdJTkFQSSB0aW1lS2lsbEV2ZW50MzIoVUlOVDMyKTsKKyNkZWZpbmUgdGltZUtpbGxFdmVudCBXSU5FTElCX05BTUUodGltZUtpbGxFdmVudCkKK01NUkVTVUxUMTYgV0lOQVBJIHRpbWVHZXREZXZDYXBzMTYoTFBUSU1FQ0FQUzE2LFVJTlQxNik7CitNTVJFU1VMVDMyIFdJTkFQSSB0aW1lR2V0RGV2Q2FwczMyKExQVElNRUNBUFMzMixVSU5UMzIpOworI2RlZmluZSB0aW1lR2V0RGV2Q2FwcyBXSU5FTElCX05BTUUodGltZUdldERldkNhcHMpCitNTVJFU1VMVDE2IFdJTkFQSSB0aW1lQmVnaW5QZXJpb2QxNihVSU5UMTYpOworTU1SRVNVTFQzMiBXSU5BUEkgdGltZUJlZ2luUGVyaW9kMzIoVUlOVDMyKTsKKyNkZWZpbmUgdGltZUJlZ2luUGVyaW9kIFdJTkVMSUJfTkFNRSh0aW1lQmVnaW5QZXJpb2QpCitNTVJFU1VMVDE2IFdJTkFQSSB0aW1lRW5kUGVyaW9kMTYoVUlOVDE2KTsKK01NUkVTVUxUMzIgV0lOQVBJIHRpbWVFbmRQZXJpb2QzMihVSU5UMzIpOworI2RlZmluZSB0aW1lRW5kUGVyaW9kIFdJTkVMSUJfTkFNRSh0aW1lRW5kUGVyaW9kKQogCiAjZGVmaW5lIEpPWUVSUl9OT0VSUk9SICAgICAgICAoMCkgICAgICAgICAgICAgICAgICAvKiBubyBlcnJvciAqLwogI2RlZmluZSBKT1lFUlJfUEFSTVMgICAgICAgICAgKEpPWUVSUl9CQVNFKzUpICAgICAgLyogYmFkIHBhcmFtZXRlcnMgKi8KQEAgLTc3MCw4ICs3OTUsOCBAQAogI2RlZmluZSBKT1lTVElDS0lEMiAgICAgICAgIDEKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIFVJTlQxNiB3TWlkOyAgICAgICAgICAgICAgICAgIC8qIG1hbnVmYWN0dXJlciBJRCAqLwotICAgIFVJTlQxNiB3UGlkOyAgICAgICAgICAgICAgICAgIC8qIHByb2R1Y3QgSUQgKi8KKyAgICBXT1JEIHdNaWQ7ICAgICAgICAgICAgICAgICAgLyogbWFudWZhY3R1cmVyIElEICovCisgICAgV09SRCB3UGlkOyAgICAgICAgICAgICAgICAgIC8qIHByb2R1Y3QgSUQgKi8KICAgICBjaGFyIHN6UG5hbWVbTUFYUE5BTUVMRU5dOyAgLyogcHJvZHVjdCBuYW1lIChOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nKSAqLwogICAgIFVJTlQxNiB3WG1pbjsgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0geCBwb3NpdGlvbiB2YWx1ZSAqLwogICAgIFVJTlQxNiB3WG1heDsgICAgICAgICAgICAgICAgIC8qIG1heGltdW0geCBwb3NpdGlvbiB2YWx1ZSAqLwpAQCAtNzgyLDIzICs4MDcsMTE2IEBACiAgICAgVUlOVDE2IHdOdW1CdXR0b25zOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ1dHRvbnMgKi8KICAgICBVSU5UMTYgd1BlcmlvZE1pbjsgICAgICAgICAgICAvKiBtaW5pbXVtIG1lc3NhZ2UgcGVyaW9kIHdoZW4gY2FwdHVyZWQgKi8KICAgICBVSU5UMTYgd1BlcmlvZE1heDsgICAgICAgICAgICAvKiBtYXhpbXVtIG1lc3NhZ2UgcGVyaW9kIHdoZW4gY2FwdHVyZWQgKi8KLX0gSk9ZQ0FQUywgKkxQSk9ZQ0FQUzsKKyAgICAvKiB3aW45NSxudDQgYWRkaXRpb25zOiAqLworICAgIFVJTlQxNiB3Um1pbjsJCS8qIG1pbmltdW0gciBwb3NpdGlvbiB2YWx1ZSAqLworICAgIFVJTlQxNiB3Um1heDsJCS8qIG1heGltdW0gciBwb3NpdGlvbiB2YWx1ZSAqLworICAgIFVJTlQxNiB3VW1pbjsJCS8qIG1pbmltdW0gdSAoNXRoIGF4aXMpIHBvc2l0aW9uIHZhbHVlICovCisgICAgVUlOVDE2IHdVbWF4OwkJLyogbWF4aW11bSB1ICg1dGggYXhpcykgcG9zaXRpb24gdmFsdWUgKi8KKyAgICBVSU5UMTYgd1ZtaW47CQkvKiBtaW5pbXVtIHYgKDZ0aCBheGlzKSBwb3NpdGlvbiB2YWx1ZSAqLworICAgIFVJTlQxNiB3Vm1heDsJCS8qIG1heGltdW0gdiAoNnRoIGF4aXMpIHBvc2l0aW9uIHZhbHVlICovCisgICAgVUlOVDE2IHdDYXBzOwkJLyogam95c3RpY2sgY2FwYWJpbGl0ZXMgKi8KKyAgICBVSU5UMTYgd01heEF4ZXM7CQkvKiBtYXhpbXVtIG51bWJlciBvZiBheGVzIHN1cHBvcnRlZCAqLworICAgIFVJTlQxNiB3TnVtQXhlczsJCS8qIG51bWJlciBvZiBheGVzIGluIHVzZSAqLworICAgIFVJTlQxNiB3TWF4QnV0dG9uczsJCS8qIG1heGltdW0gbnVtYmVyIG9mIGJ1dHRvbnMgc3VwcG9ydGVkICovCisgICAgQ0hBUiBzelJlZ0tleVtNQVhQTkFNRUxFTl07IC8qIHJlZ2lzdHJ5IGtleSAqLworICAgIENIQVIgc3pPRU1WeERbTUFYX0pPWVNUSUNLT0VNVlhETkFNRV07IC8qIE9FTSBWeEQgaW4gdXNlICovCit9IEpPWUNBUFMxNiwgKkxQSk9ZQ0FQUzE2OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgV09SRCB3TWlkOworICAgIFdPUkQgd1BpZDsKKyAgICBDSEFSIHN6UG5hbWVbTUFYUE5BTUVMRU5dOworICAgIFVJTlQzMiB3WG1pbjsKKyAgICBVSU5UMzIgd1htYXg7CisgICAgVUlOVDMyIHdZbWluOworICAgIFVJTlQzMiB3WW1heDsKKyAgICBVSU5UMzIgd1ptaW47CisgICAgVUlOVDMyIHdabWF4OworICAgIFVJTlQzMiB3TnVtQnV0dG9uczsKKyAgICBVSU5UMzIgd1BlcmlvZE1pbjsKKyAgICBVSU5UMzIgd1BlcmlvZE1heDsKKyAgICBVSU5UMzIgd1JtaW47CisgICAgVUlOVDMyIHdSbWF4OworICAgIFVJTlQzMiB3VW1pbjsKKyAgICBVSU5UMzIgd1VtYXg7CisgICAgVUlOVDMyIHdWbWluOworICAgIFVJTlQzMiB3Vm1heDsKKyAgICBVSU5UMzIgd0NhcHM7CisgICAgVUlOVDMyIHdNYXhBeGVzOworICAgIFVJTlQzMiB3TnVtQXhlczsKKyAgICBVSU5UMzIgd01heEJ1dHRvbnM7CisgICAgQ0hBUiBzelJlZ0tleVtNQVhQTkFNRUxFTl07CisgICAgQ0hBUiBzek9FTVZ4RFtNQVhfSk9ZU1RJQ0tPRU1WWEROQU1FXTsKK30gSk9ZQ0FQUzMyQSwgKkxQSk9ZQ0FQUzMyQTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFdPUkQgd01pZDsKKyAgICBXT1JEIHdQaWQ7CisgICAgV0NIQVIgc3pQbmFtZVtNQVhQTkFNRUxFTl07CisgICAgVUlOVDMyIHdYbWluOworICAgIFVJTlQzMiB3WG1heDsKKyAgICBVSU5UMzIgd1ltaW47CisgICAgVUlOVDMyIHdZbWF4OworICAgIFVJTlQzMiB3Wm1pbjsKKyAgICBVSU5UMzIgd1ptYXg7CisgICAgVUlOVDMyIHdOdW1CdXR0b25zOworICAgIFVJTlQzMiB3UGVyaW9kTWluOworICAgIFVJTlQzMiB3UGVyaW9kTWF4OworICAgIFVJTlQzMiB3Um1pbjsKKyAgICBVSU5UMzIgd1JtYXg7CisgICAgVUlOVDMyIHdVbWluOworICAgIFVJTlQzMiB3VW1heDsKKyAgICBVSU5UMzIgd1ZtaW47CisgICAgVUlOVDMyIHdWbWF4OworICAgIFVJTlQzMiB3Q2FwczsKKyAgICBVSU5UMzIgd01heEF4ZXM7CisgICAgVUlOVDMyIHdOdW1BeGVzOworICAgIFVJTlQzMiB3TWF4QnV0dG9uczsKKyAgICBXQ0hBUiBzelJlZ0tleVtNQVhQTkFNRUxFTl07CisgICAgV0NIQVIgc3pPRU1WeERbTUFYX0pPWVNUSUNLT0VNVlhETkFNRV07Cit9IEpPWUNBUFMzMlcsICpMUEpPWUNBUFMzMlc7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhKT1lDQVBTKQorREVDTF9XSU5FTElCX1RZUEVfQVcoTFBKT1lDQVBTKQogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgVUlOVDE2IHdYcG9zOyAgICAgICAgICAgICAgICAgLyogeCBwb3NpdGlvbiAqLwogICAgIFVJTlQxNiB3WXBvczsgICAgICAgICAgICAgICAgIC8qIHkgcG9zaXRpb24gKi8KICAgICBVSU5UMTYgd1pwb3M7ICAgICAgICAgICAgICAgICAvKiB6IHBvc2l0aW9uICovCiAgICAgVUlOVDE2IHdCdXR0b25zOyAgICAgICAgICAgICAgLyogYnV0dG9uIHN0YXRlcyAqLwotfSBKT1lJTkZPLCAqTFBKT1lJTkZPOworfSBKT1lJTkZPMTYsICpMUEpPWUlORk8xNjsKIAotVUlOVDE2IFdJTkFQSSBqb3lHZXREZXZDYXBzKFVJTlQxNiB1Sm95SUQsIEpPWUNBUFMgKiBscENhcHMsIFVJTlQxNiB1U2l6ZSk7Ci1VSU5UMTYgV0lOQVBJIGpveUdldE51bURldnModm9pZCk7Ci1VSU5UMTYgV0lOQVBJIGpveUdldFBvcyhVSU5UMTYgdUpveUlELCBKT1lJTkZPICogbHBJbmZvKTsKLVVJTlQxNiBXSU5BUEkgam95R2V0VGhyZXNob2xkKFVJTlQxNiB1Sm95SUQsIFVJTlQxNiAqIGxwdVRocmVzaG9sZCk7Ci1VSU5UMTYgV0lOQVBJIGpveVJlbGVhc2VDYXB0dXJlKFVJTlQxNiB1Sm95SUQpOwotVUlOVDE2IFdJTkFQSSBqb3lTZXRDYXB0dXJlKEhXTkQxNiBod25kLCBVSU5UMTYgdUpveUlELCBVSU5UMTYgdVBlcmlvZCwKLSAgICBCT09MMTYgYkNoYW5nZWQpOwotVUlOVDE2IFdJTkFQSSBqb3lTZXRUaHJlc2hvbGQoVUlOVDE2IHVKb3lJRCwgVUlOVDE2IHVUaHJlc2hvbGQpOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVJTlQzMiB3WHBvczsKKyAgICBVSU5UMzIgd1lwb3M7CisgICAgVUlOVDMyIHdacG9zOworICAgIFVJTlQzMiB3QnV0dG9uczsKK30gSk9ZSU5GTzMyLCAqTFBKT1lJTkZPMzI7CisKK0RFQ0xfV0lORUxJQl9UWVBFKEpPWUlORk8pCitERUNMX1dJTkVMSUJfVFlQRShMUEpPWUlORk8pCisKK01NUkVTVUxUMTYgV0lOQVBJIGpveUdldERldkNhcHMxNiAoVUlOVDE2LExQSk9ZQ0FQUzE2ICxVSU5UMTYpOworTU1SRVNVTFQzMiBXSU5BUEkgam95R2V0RGV2Q2FwczMyQShVSU5UMzIsTFBKT1lDQVBTMzJBLFVJTlQzMik7CitNTVJFU1VMVDMyIFdJTkFQSSBqb3lHZXREZXZDYXBzMzJXKFVJTlQzMixMUEpPWUNBUFMzMlcsVUlOVDMyKTsKKyNkZWZpbmUgam95R2V0RGV2Q2FwcyBXSU5FTElCX05BTUVfQVcoam95R2V0RGV2Q2FwcykKK1VJTlQxNiBXSU5BUEkgam95R2V0TnVtRGV2czE2KHZvaWQpOworVUlOVDMyIFdJTkFQSSBqb3lHZXROdW1EZXZzMzIodm9pZCk7CisjZGVmaW5lIGpveUdldE51bURldnMgV0lORUxJQl9OQU1FKGpveUdldE51bURldnMpCitNTVJFU1VMVDE2IFdJTkFQSSBqb3lHZXRQb3MxNihVSU5UMTYsTFBKT1lJTkZPMTYpOworTU1SRVNVTFQzMiBXSU5BUEkgam95R2V0UG9zMzIoVUlOVDMyLExQSk9ZSU5GTzMyKTsKKyNkZWZpbmUgam95R2V0UG9zIFdJTkVMSUJfTkFNRShqb3lHZXRQb3MpCitNTVJFU1VMVDE2IFdJTkFQSSBqb3lHZXRUaHJlc2hvbGQxNihVSU5UMTYsVUlOVDE2Kik7CitNTVJFU1VMVDMyIFdJTkFQSSBqb3lHZXRUaHJlc2hvbGQzMihVSU5UMzIsVUlOVDMyKik7CisjZGVmaW5lIGpveUdldFRocmVzaG9sZCBXSU5FTElCX05BTUUoam95R2V0VGhyZXNob2xkKQorTU1SRVNVTFQxNiBXSU5BUEkgam95UmVsZWFzZUNhcHR1cmUxNihVSU5UMTYpOworTU1SRVNVTFQzMiBXSU5BUEkgam95UmVsZWFzZUNhcHR1cmUzMihVSU5UMzIpOworI2RlZmluZSBqb3lSZWxlYXNlQ2FwdHVyZSBXSU5FTElCX05BTUUoam95UmVsZWFzZUNhcHR1cmUpCitNTVJFU1VMVDE2IFdJTkFQSSBqb3lTZXRDYXB0dXJlMTYoSFdORDE2LFVJTlQxNixVSU5UMTYsQk9PTDE2KTsKK01NUkVTVUxUMzIgV0lOQVBJIGpveVNldENhcHR1cmUzMihIV05EMzIsVUlOVDMyLFVJTlQzMixCT09MMzIpOworI2RlZmluZSBqb3lTZXRDYXB0dXJlIFdJTkVMSUJfTkFNRShqb3lTZXRDYXB0dXJlKQorTU1SRVNVTFQxNiBXSU5BUEkgam95U2V0VGhyZXNob2xkMTYoVUlOVDE2LFVJTlQxNik7CitNTVJFU1VMVDMyIFdJTkFQSSBqb3lTZXRUaHJlc2hvbGQzMihVSU5UMzIsVUlOVDMyKTsKKyNkZWZpbmUgam95U2V0VGhyZXNob2xkIFdJTkVMSUJfTkFNRShqb3lTZXRUaHJlc2hvbGQpCiAKIHR5cGVkZWYgc3RydWN0IHsKIAlXT1JECQl3TWlkOwkJLyogbWFudWZhY3R1cmVyIGlkICovCkBAIC0yNTYwLDExICsyNjc4LDExIEBACiB9IE1JRElPUEVOREVTQywgKkxQTUlESU9QRU5ERVNDOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JVUlOVDE2CQl3RGVsYXk7Ci0JVUlOVDE2CQl3UmVzb2x1dGlvbjsKLQlMUFRJTUVDQUxMQkFDSwlscEZ1bmN0aW9uOwotCURXT1JECQlkd1VzZXI7Ci0JVUlOVDE2CQl3RmxhZ3M7CisJVUlOVDE2CQkJd0RlbGF5OworCVVJTlQxNgkJCXdSZXNvbHV0aW9uOworCUxQVElNRUNBTExCQUNLMTYJbHBGdW5jdGlvbjsKKwlEV09SRAkJCWR3VXNlcjsKKwlVSU5UMTYJCQl3RmxhZ3M7CiB9IFRJTUVSRVZFTlQsICpMUFRJTUVSRVZFTlQ7CiAKIHR5cGVkZWYgc3RydWN0IHRNSVhFUk9QRU5ERVNDCkBAIC0yNjAzLDYgKzI3MjEsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMik7CiBEV09SRCBXSU5BUEkgYXV4TWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAogCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpOworCitzdHJ1Y3QgTElOVVhfTUNJRFJJVkVSIHsKKwlIRFJWUjE2CQkJaGRydjsKKwlEUklWRVJQUk9DMTYJCWRyaXZlcnByb2M7CisJTUNJX09QRU5fRFJJVkVSX1BBUk1TCW1vZHA7CisJTUNJX09QRU5fUEFSTVMxNgltb3A7CisJRFdPUkQJCQlwcml2YXRlOworfTsKKworI3ByYWdtYSBwYWNrKDQpCiBEV09SRCBXSU5BUEkgbWl4TWVzc2FnZShXT1JEIHdEZXZJRCwgV09SRCB3TXNnLCBEV09SRCBkd1VzZXIsIAogCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpOwogRFdPUkQgV0lOQVBJIG1pZE1lc3NhZ2UoV09SRCB3RGV2SUQsIFdPUkQgd01zZywgRFdPUkQgZHdVc2VyLCAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbnRkbGwuaCBiL2luY2x1ZGUvbnRkbGwuaAppbmRleCAyZjFiZjhiLi4yOGYzNTgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL250ZGxsLmgKKysrIGIvaW5jbHVkZS9udGRsbC5oCkBAIC0xNTYsNiArMTU2LDI3IEBACiAJTFBXU1RSCUJ1ZmZlcjsKIH0gVU5JQ09ERV9TVFJJTkcsKkxQVU5JQ09ERV9TVFJJTkc7CiAKKworQk9PTDMyIFdJTkFQSSBJc1ZhbGlkU2lkKExQU0lEKTsKK0JPT0wzMiBXSU5BUEkgRXF1YWxTaWQoTFBTSUQsTFBTSUQpOworQk9PTDMyIFdJTkFQSSBFcXVhbFByZWZpeFNpZChMUFNJRCxMUFNJRCk7CitEV09SRCAgV0lOQVBJIEdldFNpZExlbmd0aFJlcXVpcmVkKEJZVEUpOworQk9PTDMyIFdJTkFQSSBBbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoTFBTSURfSURFTlRJRklFUl9BVVRIT1JJVFksQllURSxEV09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JELERXT1JELERXT1JELERXT1JELERXT1JELERXT1JELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQsTFBTSUQqKTsKK1ZPSUQqICBXSU5BUEkgRnJlZVNpZChMUFNJRCk7CitCT09MMzIgV0lOQVBJIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoU0VDVVJJVFlfREVTQ1JJUFRPUiosRFdPUkQpOworQk9PTDMyIFdJTkFQSSBJbml0aWFsaXplU2lkKExQU0lELExQU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZLEJZVEUpOworRFdPUkQqIFdJTkFQSSBHZXRTaWRTdWJBdXRob3JpdHkoTFBTSUQsRFdPUkQpOworQllURSAqIFdJTkFQSSBHZXRTaWRTdWJBdXRob3JpdHlDb3VudChMUFNJRCk7CitEV09SRCAgV0lOQVBJIEdldExlbmd0aFNpZChMUFNJRCk7CitCT09MMzIgV0lOQVBJIENvcHlTaWQoRFdPUkQsTFBTSUQsTFBTSUQpOworQk9PTDMyIFdJTkFQSSBMb29rdXBBY2NvdW50U2lkMzJBKExQQ1NUUixQU0lELExQQ1NUUixMUERXT1JELExQQ1NUUixMUERXT1JELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTSURfTkFNRV9VU0UpOworQk9PTDMyIFdJTkFQSSBMb29rdXBBY2NvdW50U2lkMzJXKExQQ1dTVFIsUFNJRCxMUENXU1RSLExQRFdPUkQsTFBDV1NUUixMUERXT1JELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTSURfTkFNRV9VU0UpOworTFBTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgV0lOQVBJIEdldFNpZElkZW50aWZpZXJBdXRob3JpdHkoTFBTSUQpOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wYXRoLmggYi9pbmNsdWRlL3BhdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmYwMGUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wYXRoLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIEdyYXBoaWNzIHBhdGhzIChCZWdpblBhdGgsIEVuZFBhdGggZXRjLikKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBNYXJ0aW4gQm9laG1lCisgKi8KKworI2lmbmRlZiBfX1dJTkVfUEFUSF9ICisjZGVmaW5lIF9fV0lORV9QQVRIX0gKKworLyogSXQgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgdG8gYWNjZXNzIHRoZSBjb250ZW50cyBvZiB0aGUgR2RpUGF0aAorICogc3RydWN0dXJlIGRpcmVjdGx5OyBpZiB5b3UgZmluZCB0aGF0IHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgZG9uJ3QKKyAqIGFsbG93IHlvdSB0byBkbyB3aGF0IHlvdSB3YW50LCB0aGVuIHBsZWFzZSBwbGFjZSBhIG5ldyBleHBvcnRlZAorICogZnVuY3Rpb24gdGhhdCBkb2VzIHRoaXMgam9iIGluIHBhdGguYy4KKyAqLworCit0eXBlZGVmIGVudW0gdGFnR2RpUGF0aFN0YXRlCit7CisgICBQQVRIX051bGwsCisgICBQQVRIX09wZW4sCisgICBQQVRIX0Nsb3NlZAorfSBHZGlQYXRoU3RhdGU7CisKK3R5cGVkZWYgc3RydWN0IHRhZ0dkaVBhdGgKK3sKKyAgIEdkaVBhdGhTdGF0ZSBzdGF0ZTsKKyAgIFBPSU5UMzIgICAgICAqcFBvaW50czsKKyAgIEJZVEUgICAgICAgICAqcEZsYWdzOworICAgaW50ICAgICAgICAgIG51bUVudHJpZXNVc2VkLCBudW1FbnRyaWVzQWxsb2NhdGVkOworICAgQk9PTDMyICAgICAgIG5ld1N0cm9rZTsKK30gR2RpUGF0aDsKKworI2RlZmluZSBQQVRIX0lzUGF0aE9wZW4ocGF0aCkgKChwYXRoKS5zdGF0ZT09UEFUSF9PcGVuKQorLyogUmV0dXJucyBUUlVFIGlmIHRoZSBzcGVjaWZpZWQgcGF0aCBpcyBpbiB0aGUgb3BlbiBzdGF0ZSwgaS5lLiBpbiB0aGUKKyAqIHN0YXRlIHdoZXJlIHBvaW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwYXRoLCBvciBGQUxTRSBvdGhlcndpc2UuIFRoaXMKKyAqIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgbWFjcm8gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgKi8KKworZXh0ZXJuIHZvaWQgICBQQVRIX0luaXRHZGlQYXRoKEdkaVBhdGggKnBQYXRoKTsKK2V4dGVybiB2b2lkICAgUEFUSF9EZXN0cm95R2RpUGF0aChHZGlQYXRoICpwUGF0aCk7CitleHRlcm4gQk9PTDMyIFBBVEhfQXNzaWduR2RpUGF0aChHZGlQYXRoICpwUGF0aERlc3QsCisgICBjb25zdCBHZGlQYXRoICpwUGF0aFNyYyk7CitleHRlcm4gQk9PTDMyIFBBVEhfTW92ZVRvKEhEQzMyIGhkYyk7CitleHRlcm4gQk9PTDMyIFBBVEhfTGluZVRvKEhEQzMyIGhkYywgSU5UMzIgeCwgSU5UMzIgeSk7CisKKyNlbmRpZiAvKiBfX1dJTkVfUEFUSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BlX2ltYWdlLmggYi9pbmNsdWRlL3BlX2ltYWdlLmgKaW5kZXggYjQzMmM4My4uYjY4NzZlOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wZV9pbWFnZS5oCisrKyBiL2luY2x1ZGUvcGVfaW1hZ2UuaApAQCAtNDEsNiArNDEsNiBAQAogc3RydWN0IF9QREIzMjsgLyogZm9yd2FyZCBkZWZpbml0aW9uICovCiBleHRlcm4gdm9pZCBQRV9Jbml0aWFsaXplRExMcyhzdHJ1Y3QgX1BEQjMyKixEV09SRCxMUFZPSUQpOwogCi1leHRlcm4gTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgR2V0UmVzRGlyRW50cnlXKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZLExQQ1dTVFIsRFdPUkQpOworZXh0ZXJuIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIEdldFJlc0RpckVudHJ5VyhMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSxMUENXU1RSLERXT1JELEJPT0wzMik7CiAKICNlbmRpZiAvKiBfX1dJTkVfUEVfSU1BR0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaGVsbC5oIGIvaW5jbHVkZS9zaGVsbC5oCmluZGV4IDJkZGYzYTMuLmVlMGJhMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2hlbGwuaAorKysgYi9pbmNsdWRlL3NoZWxsLmgKQEAgLTMyLDYgKzMyLDE2IEBACiAJLyogbWVtb3J5IGJsb2NrIHdpdGggZmlsZW5hbWVzIGZvbGxvd3MgKi8gICAgIAogfSBEUk9QRklMRVNUUlVDVCwgKkxQRFJPUEZJTEVTVFJVQ1Q7IAogCit0eXBlZGVmIHN0cnVjdCBfTk9USUZZSUNPTkRBVEEgeworCURXT1JEIGNiU2l6ZTsKKwlIV05EMzIgaFduZDsKKwlVSU5UMzIgdUlEOworCVVJTlQzMiB1RmxhZ3M7CisJVUlOVDMyIHVDYWxsYmFja01lc3NhZ2U7CisJSElDT04zMiBoSWNvbjsKKwlDSEFSIHN6VGlwWzY0XTsKK30gTk9USUZZSUNPTkRBVEEsICpQTk9USUZZSUNPTkRBVEE7CisKIHR5cGVkZWYgc3RydWN0IHRhZ1NIRklMRUlORk8zMkEgewogCUhJQ09OMzIJaEljb247CQkJLyogaWNvbiAqLwogCWludAlpSWNvbjsJCQkvKiBpY29uIGluZGV4ICovCkBAIC01OSw4ICs2OSw2IEBACiAJTFBBUkFNCWxQYXJhbTsKIH0gQVBQQkFSREFUQSwgKlBBUFBCQVJEQVRBOwogCi1ERUNMX1dJTkVMSUJfVFlQRShBUFBCQVJEQVRBKTsKLQogI2RlZmluZSBTSEdGSV9JQ09OICAgICAgICAgICAgICAweDAwMDAwMDEwMCAgICAgLyogZ2V0IGljb24gKi8KICNkZWZpbmUgU0hHRklfRElTUExBWU5BTUUgICAgICAgMHgwMDAwMDAyMDAgICAgIC8qIGdldCBkaXNwbGF5IG5hbWUgKi8KICNkZWZpbmUgU0hHRklfVFlQRU5BTUUgICAgICAgICAgMHgwMDAwMDA0MDAgICAgIC8qIGdldCB0eXBlIG5hbWUgKi8KQEAgLTg3LDQgKzk1LDIyIEBACiAjZGVmaW5lIFNFX0VSUl9EREVCVVNZICAgICAgICAgIDMwCiAjZGVmaW5lIFNFX0VSUl9OT0FTU09DICAgICAgICAgIDMxCiAKKyNkZWZpbmUJQ1NJRExfREVTS1RPUAkJMHgwMDAwCisjZGVmaW5lCUNTSURMX1BST0dSQU1TCQkweDAwMDIKKyNkZWZpbmUJQ1NJRExfQ09OVFJPTFMJCTB4MDAwMworI2RlZmluZQlDU0lETF9QUklOVEVSUwkJMHgwMDA0CisjZGVmaW5lCUNTSURMX1BFUlNPTkFMCQkweDAwMDUKKyNkZWZpbmUJQ1NJRExfRkFWT1JJVEVTCQkweDAwMDYKKyNkZWZpbmUJQ1NJRExfU1RBUlRVUAkJMHgwMDA3CisjZGVmaW5lCUNTSURMX1JFQ0VOVAkJMHgwMDA4CisjZGVmaW5lCUNTSURMX1NFTkRUTwkJMHgwMDA5CisjZGVmaW5lCUNTSURMX0JJVEJVQ0tFVAkJMHgwMDBhCisjZGVmaW5lCUNTSURMX1NUQVJUTUVOVQkJMHgwMDBiCisjZGVmaW5lCUNTSURMX0RFU0tUT1BESVJFQ1RPUlkJMHgwMDEwCisjZGVmaW5lCUNTSURMX0RSSVZFUwkJMHgwMDExCisjZGVmaW5lCUNTSURMX05FVFdPUksJCTB4MDAxMgorI2RlZmluZQlDU0lETF9ORVRIT09ECQkweDAwMTMKKyNkZWZpbmUJQ1NJRExfRk9OVFMJCTB4MDAxNAorI2RlZmluZQlDU0lETF9URU1QTEFURVMJCTB4MDAxNQorCiAjZW5kaWYgIC8qIF9fV0lORV9TSEVMTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NobG9iai5oIGIvaW5jbHVkZS9zaGxvYmouaAppbmRleCBiYjA2ZWZlLi5kNTFhMTkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NobG9iai5oCisrKyBiL2luY2x1ZGUvc2hsb2JqLmgKQEAgLTEsMTIgKzEsMTkgQEAKICNpZm5kZWYgX1dJTkVfU0hMT0JKX0gKICNkZWZpbmUgX1dJTkVfU0hMT0JKX0gKIAorI2luY2x1ZGUgInNoZWxsLmgiCiAjaW5jbHVkZSAib2xlLmgiCiAjaW5jbHVkZSAib2xlMi5oIgogI2luY2x1ZGUgImNvbXBvYmouaCIKIAorI2RlZmluZSBTVERNRVRIT0QoeGZuKSBIUkVTVUxUIChDQUxMQkFDSyAqZm4jI3hmbikKKyNkZWZpbmUgU1RETUVUSE9EXyh0eXBlLHhmbikgdHlwZSAoQ0FMTEJBQ0sgKmZuIyN4Zm4pCisjZGVmaW5lIFBVUkUKKyNkZWZpbmUgRkFSCisjZGVmaW5lIFRISVNfIFRISVMsCisKKwogdHlwZWRlZiBMUFZPSUQJTFBCQzsgLyogKklCaW5kQ3R4IHJlYWxseSAqLwotdHlwZWRlZiBMUFZPSUQJTFBTVFJSRVQsTFBFTlVNSURMSVNUOwogCiAvKgogICogc2hlbGwzMiBjbGFzc2lkcwpAQCAtMjgsNiArMzUsMjEgQEAKIERFRklORV9TSExHVUlEKElJRF9JRW51bUlETGlzdCwgICAgICAgICAweDAwMDIxNEYyTCwgMCwgMCk7CiBERUZJTkVfU0hMR1VJRChJSURfSUZpbGVWaWV3ZXJTaXRlLCAgICAgMHgwMDAyMTRGM0wsIDAsIDApOwogCisjZGVmaW5lCVNUUlJFVF9XU1RSCTB4MDAwMAorI2RlZmluZQlTVFJSRVRfT0ZGU0VUCTB4MDAwMQorI2RlZmluZQlTVFJSRVRfQ1NUUgkweDAwMDIKKwordHlwZWRlZiBzdHJ1Y3QgX1NUUlJFVAoreworICAgIFVJTlQzMiB1VHlwZTsJCS8qIFNUUlJFVF94eHggKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgTFBXU1RSCXBPbGVTdHI7CS8qIE9MRVNUUiB0aGF0IHdpbGwgYmUgZnJlZWQgKi8KKyAgICAgICAgVUlOVDMyCXVPZmZzZXQ7CS8qIE9mZnNldCBpbnRvIFNISVRFTUlEIChBTlNJKSAqLworICAgICAgICBjaGFyCWNTdHJbTUFYX1BBVEhdOwkvKiBCdWZmZXIgdG8gZmlsbCBpbiAqLworICAgIH0gRFVNTVlVTklPTk5BTUU7Cit9IFNUUlJFVCwqTFBTVFJSRVQ7CisKIHR5cGVkZWYgc3RydWN0IHsKIAlXT1JECQljYjsJLyogbnIgb2YgYnl0ZXMgaW4gdGhpcyBpdGVtICovCiAJQllURQkJYWJJRFsxXTsvKiBmaXJzdCBieXRlIGluIHRoaXMgaXRlbSAqLwpAQCAtMzcsMjkgKzU5LDE5OCBAQAogCVNISVRFTUlECW1raWQ7IC8qIGZpcnN0IGl0ZW1pZCBpbiBsaXN0ICovCiB9IElURU1JRExJU1QsKkxQSVRFTUlETElTVCwqTFBDSVRFTUlETElTVDsKIAotLyogVGhlIElTaGVsbEZvbGRlciBpbnRlcmZhY2UgLi4uIHRoZSBiYXNpYyBpbnRlcmZhY2UgZm9yIGEgbG90IG9mIHN0dWZmICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElFbnVtSURMaXN0IGludGVyZmFjZQorICovCisjZGVmaW5lIFRISVMgTFBFTlVNSURMSVNUIHRoaXMKKwordHlwZWRlZiBzdHJ1Y3QgSUVudW1JRExpc3QgSUVudW1JRExpc3QsKkxQRU5VTUlETElTVDsKK3R5cGVkZWYgc3RydWN0IElFbnVtSURMaXN0X1ZUYWJsZSB7CisgICAgLyogKioqIElVbmtub3duIG1ldGhvZHMgKioqICovCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKSAoVEhJU18gUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikgKFRISVMpICBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkgKFRISVMpIFBVUkU7CisKKyAgICAvKiAqKiogSUVudW1JRExpc3QgbWV0aG9kcyAqKiogKi8KKyAgICBTVERNRVRIT0QoTmV4dCkgIChUSElTXyBVTE9ORyBjZWx0LAorICAgICAgICAgICAgICAgICAgICAgIExQSVRFTUlETElTVCAqcmdlbHQsCisgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgKnBjZWx0RmV0Y2hlZCkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2tpcCkgIChUSElTXyBVTE9ORyBjZWx0KSBQVVJFOworICAgIFNURE1FVEhPRChSZXNldCkgKFRISVMpIFBVUkU7CisgICAgU1RETUVUSE9EKENsb25lKSAoVEhJU18gSUVudW1JRExpc3QgKipwcGVudW0pIFBVUkU7Cit9IElFbnVtSURMaXN0X1ZUYWJsZSwqTFBFTlVNSURMSVNUX1ZUQUJMRTsKKworc3RydWN0IElFbnVtSURMaXN0IHsKKwlMUEVOVU1JRExJU1RfVlRBQkxFCWxwdnRibDsKKwlEV09SRAkJCXJlZjsKK307CisjdW5kZWYgVEhJUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVGhlIElTaGVsbEZvbGRlciBpbnRlcmZhY2UgLi4uIHRoZSBiYXNpYyBpbnRlcmZhY2UgZm9yIGEgbG90IG9mIHN0dWZmCisgKi8KKworI2RlZmluZSBUSElTIExQU0hFTExGT0xERVIgdGhpcworCisvKiBJU2hlbGxGb2xkZXI6OkdldERpc3BsYXlOYW1lT2YvU2V0TmFtZU9mIHVGbGFncyAqLwordHlwZWRlZiBlbnVtCit7CisgICAgU0hHRE5fTk9STUFMICAgICAgICAgICAgPSAwLCAgICAgICAgLyogZGVmYXVsdCAoZGlzcGxheSBwdXJwb3NlKSAqLworICAgIFNIR0ROX0lORk9MREVSICAgICAgICAgID0gMSwgICAgICAgIC8qIGRpc3BsYXllZCB1bmRlciBhIGZvbGRlciAocmVsYXRpdmUpKi8KKyAgICBTSEdETl9GT1JQQVJTSU5HICAgICAgICA9IDB4ODAwMCwgICAvKiBmb3IgUGFyc2VEaXNwbGF5TmFtZSBvciBwYXRoICovCit9IFNIR05POworCisvKiBJU2hlbGxGb2xkZXI6OkVudW1PYmplY3RzICovCit0eXBlZGVmIGVudW0gdGFnU0hDT05URgoreworICAgIFNIQ09OVEZfRk9MREVSUyAgICAgICAgID0gMzIsICAgICAgIC8qIGZvciBzaGVsbCBicm93c2VyICovCisgICAgU0hDT05URl9OT05GT0xERVJTICAgICAgPSA2NCwgICAgICAgLyogZm9yIGRlZmF1bHQgdmlldyAqLworICAgIFNIQ09OVEZfSU5DTFVERUhJRERFTiAgID0gMTI4LCAgICAgIC8qIGZvciBoaWRkZW4vc3lzdGVtIG9iamVjdHMgKi8KK30gU0hDT05URjsKKworLyogZnJvbSBvbGVpZGwuaCAqLworI2RlZmluZQlEUk9QRUZGRUNUX05PTkUJCTAKKyNkZWZpbmUJRFJPUEVGRkVDVF9DT1BZCQkxCisjZGVmaW5lCURST1BFRkZFQ1RfTU9WRQkJMgorI2RlZmluZQlEUk9QRUZGRUNUX0xJTksJCTQKKyNkZWZpbmUJRFJPUEVGRkVDVF9TQ1JPTEwgICAgICAgMHg4MDAwMDAwMAorCisvKiBJU2hlbGxGb2xkZXI6OkdldEF0dHJpYnV0ZXNPZiBmbGFncyAqLworI2RlZmluZSBTRkdBT19DQU5DT1BZICAgICAgICAgICBEUk9QRUZGRUNUX0NPUFkgLyogT2JqZWN0cyBjYW4gYmUgY29waWVkICovCisjZGVmaW5lIFNGR0FPX0NBTk1PVkUgICAgICAgICAgIERST1BFRkZFQ1RfTU9WRSAvKiBPYmplY3RzIGNhbiBiZSBtb3ZlZCAqLworI2RlZmluZSBTRkdBT19DQU5MSU5LICAgICAgICAgICBEUk9QRUZGRUNUX0xJTksgLyogT2JqZWN0cyBjYW4gYmUgbGlua2VkICovCisjZGVmaW5lIFNGR0FPX0NBTlJFTkFNRSAgICAgICAgIDB4MDAwMDAwMTBMICAgICAvKiBPYmplY3RzIGNhbiBiZSByZW5hbWVkICovCisjZGVmaW5lIFNGR0FPX0NBTkRFTEVURSAgICAgICAgIDB4MDAwMDAwMjBMICAgICAvKiBPYmplY3RzIGNhbiBiZSBkZWxldGVkICovCisjZGVmaW5lIFNGR0FPX0hBU1BST1BTSEVFVCAgICAgIDB4MDAwMDAwNDBMICAgICAvKiBPYmplY3RzIGhhdmUgcHJvcGVydHkgc2hlZXRzICovCisjZGVmaW5lIFNGR0FPX0RST1BUQVJHRVQgICAgICAgIDB4MDAwMDAxMDBMICAgICAvKiBPYmplY3RzIGFyZSBkcm9wIHRhcmdldCAqLworI2RlZmluZSBTRkdBT19DQVBBQklMSVRZTUFTSyAgICAweDAwMDAwMTc3TAorI2RlZmluZSBTRkdBT19MSU5LICAgICAgICAgICAgICAweDAwMDEwMDAwTCAgICAgLyogU2hvcnRjdXQgKGxpbmspICovCisjZGVmaW5lIFNGR0FPX1NIQVJFICAgICAgICAgICAgIDB4MDAwMjAwMDBMICAgICAvKiBzaGFyZWQgKi8KKyNkZWZpbmUgU0ZHQU9fUkVBRE9OTFkgICAgICAgICAgMHgwMDA0MDAwMEwgICAgIC8qIHJlYWQtb25seSAqLworI2RlZmluZSBTRkdBT19HSE9TVEVEICAgICAgICAgICAweDAwMDgwMDAwTCAgICAgLyogZ2hvc3RlZCBpY29uICovCisjZGVmaW5lIFNGR0FPX0RJU1BMQVlBVFRSTUFTSyAgIDB4MDAwRjAwMDBMCisjZGVmaW5lIFNGR0FPX0ZJTEVTWVNBTkNFU1RPUiAgIDB4MTAwMDAwMDBMICAgICAvKiBJdCBjb250YWlucyBmaWxlIHN5c3RlbSBmb2xkZXIgKi8KKyNkZWZpbmUgU0ZHQU9fRk9MREVSICAgICAgICAgICAgMHgyMDAwMDAwMEwgICAgIC8qIEl0J3MgYSBmb2xkZXIuICovCisjZGVmaW5lIFNGR0FPX0ZJTEVTWVNURU0gICAgICAgIDB4NDAwMDAwMDBMICAgICAvKiBpcyBhIGZpbGUgc3lzdGVtIHRoaW5nIChmaWxlL2ZvbGRlci9yb290KSAqLworI2RlZmluZSBTRkdBT19IQVNTVUJGT0xERVIgICAgICAweDgwMDAwMDAwTCAgICAgLyogRXhwYW5kYWJsZSBpbiB0aGUgbWFwIHBhbmUgKi8KKyNkZWZpbmUgU0ZHQU9fQ09OVEVOVFNNQVNLICAgICAgMHg4MDAwMDAwMEwKKyNkZWZpbmUgU0ZHQU9fVkFMSURBVEUgICAgICAgICAgMHgwMTAwMDAwMEwgICAgIC8qIGludmFsaWRhdGUgY2FjaGVkIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFNGR0FPX1JFTU9WQUJMRSAgICAgICAgMHgwMjAwMDAwMEwgICAgICAvKiBpcyB0aGlzIHJlbW92ZWFibGUgbWVkaWE/ICovCisKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU0hFTExGT0xERVIgKkxQU0hFTExGT0xERVIsSVNoZWxsRm9sZGVyOwotdHlwZWRlZiBzdHJ1Y3QgewotCUhSRVNVTFQJKENBTExCQUNLICpmblF1ZXJ5SW50ZXJmYWNlKShMUFNIRUxMRk9MREVSIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaik7Ci0JSFJFU1VMVAkoQ0FMTEJBQ0sgKmZuQWRkUmVmKShMUFNIRUxMRk9MREVSIHRoaXMpOwotCUhSRVNVTFQJKENBTExCQUNLICpmblJlbGVhc2UpKExQU0hFTExGT0xERVIgdGhpcyk7Ci0JLyogSVNoZWxsRm9sZGVyIG1ldGhvZHMgKi8KK3R5cGVkZWYgc3RydWN0IElTaGVsbEZvbGRlcl9WVGFibGUgeworICAgIC8qICoqKiBJVW5rbm93biBtZXRob2RzICoqKiAqLworICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkgKFRISVNfIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPYmopIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpIChUSElTKSAgUFVSRTsKKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpIChUSElTKSBQVVJFOwogCi0JSFJFU1VMVCAoQ0FMTEJBQ0sgKmZuUGFyc2VEaXNwbGF5TmFtZSkgKExQU0hFTExGT0xERVIgdGhpcyxIV05EMzIgaHduZE93bmVyLExQQkMgcGJjUmVzZXJ2ZWQsTFBPTEVTVFIgbHBzekRpc3BsYXlOYW1lLERXT1JEICogcGNoRWF0ZW4sTFBJVEVNSURMSVNUICogcHBpZGwsIERXT1JEICpwZHdBdHRyaWJ1dGVzKSA7Ci0KLQlIUkVTVUxUIChDQUxMQkFDSyAqZm5FbnVtT2JqZWN0cykoIExQU0hFTExGT0xERVIgdGhpcyxIV05EMzIgaHduZE93bmVyLCBEV09SRCBncmZGbGFncywgTFBFTlVNSURMSVNUKiBwcGVudW1JRExpc3QpOwotCUhSRVNVTFQgKENBTExCQUNLICpmbkJpbmRUb09iamVjdCkoTFBTSEVMTEZPTERFUiB0aGlzLCBMUENJVEVNSURMSVNUIHBpZGwsIExQQkMgcGJjUmVzZXJ2ZWQsIFJFRklJRCByaWlkLCBMUFZPSUQgKiBwcHZPdXQpOwotCUhSRVNVTFQgKENBTExCQUNLICpmbkJpbmRUb1N0b3JhZ2UpKExQU0hFTExGT0xERVIgdGhpcywgTFBDSVRFTUlETElTVCBwaWRsLCBMUEJDIHBiY1Jlc2VydmVkLCBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKTsKLSAgICAJSFJFU1VMVCAoQ0FMTEJBQ0sgKmZuQ29tcGFyZUlEcykgKExQU0hFTExGT0xERVIgdGhpcywgTFBBUkFNIGxQYXJhbSwgTFBDSVRFTUlETElTVCBwaWRsMSwgTFBDSVRFTUlETElTVCBwaWRsMik7Ci0JSFJFU1VMVCAoQ0FMTEJBQ0sgKmZuQ3JlYXRlVmlld09iamVjdCkgKExQU0hFTExGT0xERVIgdGhpcywgSFdORDMyIGh3bmRPd25lciwgUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk91dCk7Ci0JSFJFU1VMVCAoQ0FMTEJBQ0sgKmZuR2V0QXR0cmlidXRlc09mKSAgKExQU0hFTExGT0xERVIgdGhpcywgVUlOVDMyIGNpZGwsIExQQ0lURU1JRExJU1QgKiBhcGlkbCwgRFdPUkQgKiByZ2ZJbk91dCk7Ci0JSFJFU1VMVCAoQ0FMTEJBQ0sgKmZuR2V0VUlPYmplY3RPZikgICAgKExQU0hFTExGT0xERVIgdGhpcywgSFdORDMyIGh3bmRPd25lciwgVUlOVDMyIGNpZGwsIExQQ0lURU1JRExJU1QgKiBhcGlkbCwgUkVGSUlEIHJpaWQsIFVJTlQzMiAqIHByZ2ZJbk91dCwgTFBWT0lEICogcHB2T3V0KTsKLQlIUkVTVUxUIChDQUxMQkFDSyAqZm5HZXREaXNwbGF5TmFtZU9mKSAoTFBTSEVMTEZPTERFUiB0aGlzLCBMUENJVEVNSURMSVNUIHBpZGwsIERXT1JEIHVGbGFncywgTFBTVFJSRVQgbHBOYW1lKTsKLQlIUkVTVUxUIChDQUxMQkFDSyAqZm5TZXROYW1lT2YpICAgICAgICAoTFBTSEVMTEZPTERFUiB0aGlzLCBIV05EMzIgaHduZE93bmVyLCBMUENJVEVNSURMSVNUIHBpZGwsIExQQ09MRVNUUiBscHN6TmFtZSwgRFdPUkQgdUZsYWdzLCBMUElURU1JRExJU1QgKiBwcGlkbE91dCk7Ci19ICpMUFNIRUxMRk9MREVSX1ZUQUJMRTsKKyAgICAvKiAqKiogSVNoZWxsRm9sZGVyIG1ldGhvZHMgKioqICovCisgICAgU1RETUVUSE9EKFBhcnNlRGlzcGxheU5hbWUpIChUSElTXyBIV05EMzIgaHduZE93bmVyLAorICAgICAgICBMUEJDIHBiY1Jlc2VydmVkLCBMUE9MRVNUUiBscHN6RGlzcGxheU5hbWUsCisgICAgICAgIFVMT05HICogcGNoRWF0ZW4sIExQSVRFTUlETElTVCAqIHBwaWRsLCBVTE9ORyAqcGR3QXR0cmlidXRlcykgUFVSRTsKKyAgICBTVERNRVRIT0QoRW51bU9iamVjdHMpICggVEhJU18gSFdORDMyIGh3bmRPd25lciwgRFdPUkQgZ3JmRmxhZ3MsIExQRU5VTUlETElTVAorKiBwcGVudW1JRExpc3QpIFBVUkU7CisgICAgU1RETUVUSE9EKEJpbmRUb09iamVjdCkgICAgIChUSElTXyBMUENJVEVNSURMSVNUIHBpZGwsIExQQkMgcGJjUmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T3V0KSBQVVJFOworICAgIFNURE1FVEhPRChCaW5kVG9TdG9yYWdlKSAgICAoVEhJU18gTFBDSVRFTUlETElTVCBwaWRsLCBMUEJDIHBiY1Jlc2VydmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsIExQVk9JRCAqIHBwdk9iaikgUFVSRTsKKyAgICBTVERNRVRIT0QoQ29tcGFyZUlEcykgICAgICAgKFRISVNfIExQQVJBTSBsUGFyYW0sIExQQ0lURU1JRExJU1QgcGlkbDEsIExQQ0lURU1JRExJU1QgcGlkbDIpIFBVUkU7CisgICAgU1RETUVUSE9EKENyZWF0ZVZpZXdPYmplY3QpIChUSElTXyBIV05EMzIgaHduZE93bmVyLCBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T3V0KSBQVVJFOworICAgIFNURE1FVEhPRChHZXRBdHRyaWJ1dGVzT2YpICAoVEhJU18gVUlOVDMyIGNpZGwsIExQQ0lURU1JRExJU1QgKiBhcGlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HICogcmdmSW5PdXQpIFBVUkU7CisgICAgU1RETUVUSE9EKEdldFVJT2JqZWN0T2YpICAgIChUSElTXyBIV05EMzIgaHduZE93bmVyLCBVSU5UMzIgY2lkbCwgTFBDSVRFTUlETElTVAorKiBhcGlkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLCBVSU5UMzIgKiBwcmdmSW5PdXQsIExQVk9JRCAqIHBwdk91dCkgUFVSRTsKKyAgICBTVERNRVRIT0QoR2V0RGlzcGxheU5hbWVPZikgKFRISVNfIExQQ0lURU1JRExJU1QgcGlkbCwgRFdPUkQgdUZsYWdzLCBMUFNUUlJFVCBscE5hbWUpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldE5hbWVPZikgICAgICAgIChUSElTXyBIV05EMzIgaHduZE93bmVyLCBMUENJVEVNSURMSVNUIHBpZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENPTEVTVFIgbHBzek5hbWUsIERXT1JEIHVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQSVRFTUlETElTVCAqIHBwaWRsT3V0KSBQVVJFOworfSAqTFBTSEVMTEZPTERFUl9WVEFCTEUsSVNoZWxsRm9sZGVyX1ZUYWJsZTsKIAogc3RydWN0IHRhZ1NIRUxMRk9MREVSIHsKLQlMUFNIRUxMRk9MREVSX1ZUQUJMRQkqbHB2dGJsOworCUxQU0hFTExGT0xERVJfVlRBQkxFCWxwdnRibDsKKwlEV09SRAkJCXJlZjsKIH07CisKKyN1bmRlZiBUSElTCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJU2hlbGxMaW5rIGludGVyZmFjZQorICovCisKKyNkZWZpbmUgVEhJUyBMUFNIRUxMTElOSyB0aGlzCisvKiBJU2hlbGxMaW5rOjpSZXNvbHZlIGZGbGFncyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBTTFJfTk9fVUkgICAgICAgICAgID0gMHgwMDAxLAorICAgIFNMUl9BTllfTUFUQ0ggICAgICAgPSAweDAwMDIsCisgICAgU0xSX1VQREFURSAgICAgICAgICA9IDB4MDAwNCwKK30gU0xSX0ZMQUdTOworCisvKiBJU2hlbGxMaW5rOjpHZXRQYXRoIGZGbGFncyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBTTEdQX1NIT1JUUEFUSCAgICAgID0gMHgwMDAxLAorICAgIFNMR1BfVU5DUFJJT1JJVFkgICAgPSAweDAwMDIsCit9IFNMR1BfRkxBR1M7CisKKworCit0eXBlZGVmIHN0cnVjdCBJU2hlbGxMaW5rIElTaGVsbExpbmssKkxQU0hFTExMSU5LOwordHlwZWRlZiBzdHJ1Y3QgSVNoZWxsTGlua19WVGFibGUKK3sKKyAgICAvLyAqKiogSVVua25vd24gbWV0aG9kcyAqKioKKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpIChUSElTXyBSRUZJSUQgcmlpZCwgTFBWT0lEICogcHB2T2JqKSBQVVJFOworICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKSAoVEhJUykgIFBVUkU7CisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKSAoVEhJUykgUFVSRTsKKworICAgIFNURE1FVEhPRChHZXRQYXRoKShUSElTXyBMUFNUUiBwc3pGaWxlLCBJTlQzMiBjY2hNYXhQYXRoLCBXSU4zMl9GSU5EX0RBVEEzMkEgKnBmZCwgRFdPUkQgZkZsYWdzKSBQVVJFOworCisgICAgU1RETUVUSE9EKEdldElETGlzdCkoVEhJU18gTFBJVEVNSURMSVNUICogcHBpZGwpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldElETGlzdCkoVEhJU18gTFBDSVRFTUlETElTVCBwaWRsKSBQVVJFOworCisgICAgU1RETUVUSE9EKEdldERlc2NyaXB0aW9uKShUSElTXyBMUFNUUiBwc3pOYW1lLCBpbnQgY2NoTWF4TmFtZSkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0RGVzY3JpcHRpb24pKFRISVNfIExQQ1NUUiBwc3pOYW1lKSBQVVJFOworCisgICAgU1RETUVUSE9EKEdldFdvcmtpbmdEaXJlY3RvcnkpKFRISVNfIExQU1RSIHBzekRpciwgaW50IGNjaE1heFBhdGgpIFBVUkU7CisgICAgU1RETUVUSE9EKFNldFdvcmtpbmdEaXJlY3RvcnkpKFRISVNfIExQQ1NUUiBwc3pEaXIpIFBVUkU7CisKKyAgICBTVERNRVRIT0QoR2V0QXJndW1lbnRzKShUSElTXyBMUFNUUiBwc3pBcmdzLCBpbnQgY2NoTWF4UGF0aCkgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0QXJndW1lbnRzKShUSElTXyBMUENTVFIgcHN6QXJncykgUFVSRTsKKworICAgIFNURE1FVEhPRChHZXRIb3RrZXkpKFRISVNfIFdPUkQgKnB3SG90a2V5KSBQVVJFOworICAgIFNURE1FVEhPRChTZXRIb3RrZXkpKFRISVNfIFdPUkQgd0hvdGtleSkgUFVSRTsKKworICAgIFNURE1FVEhPRChHZXRTaG93Q21kKShUSElTXyBJTlQzMiAqcGlTaG93Q21kKSBQVVJFOworICAgIFNURE1FVEhPRChTZXRTaG93Q21kKShUSElTXyBJTlQzMiBpU2hvd0NtZCkgUFVSRTsKKworICAgIFNURE1FVEhPRChHZXRJY29uTG9jYXRpb24pKFRISVNfIExQU1RSIHBzekljb25QYXRoLCBJTlQzMiBjY2hJY29uUGF0aCwgSU5UMzIgKnBpSWNvbikgUFVSRTsKKyAgICBTVERNRVRIT0QoU2V0SWNvbkxvY2F0aW9uKShUSElTXyBMUENTVFIgcHN6SWNvblBhdGgsIElOVDMyIGlJY29uKSBQVVJFOworCisgICAgU1RETUVUSE9EKFNldFJlbGF0aXZlUGF0aCkoVEhJU18gTFBDU1RSIHBzelBhdGhSZWwsIERXT1JEIGR3UmVzZXJ2ZWQpIFBVUkU7CisKKyAgICBTVERNRVRIT0QoUmVzb2x2ZSkoVEhJU18gSFdORDMyIGh3bmQsIERXT1JEIGZGbGFncykgUFVSRTsKKworICAgIFNURE1FVEhPRChTZXRQYXRoKShUSElTXyBMUENTVFIgcHN6RmlsZSkgUFVSRTsKK30gSVNoZWxsTGlua19WVGFibGUsKkxQU0hFTExMSU5LX1ZUQUJMRTsKKworc3RydWN0IElTaGVsbExpbmsgeworCUxQU0hFTExMSU5LX1ZUQUJMRQlscHZ0Ymw7CisJRFdPUkQJCQlyZWY7Cit9OworCisjdW5kZWYgVEhJUworCisjaWZkZWYgX19XSU5FX18KK2V4dGVybiBMUFNIRUxMRk9MREVSIElTaGVsbEZvbGRlcl9Db25zdHJ1Y3RvcigpOworZXh0ZXJuIExQU0hFTExMSU5LIElTaGVsbExpbmtfQ29uc3RydWN0b3IoKTsKK2V4dGVybiBMUEVOVU1JRExJU1QgSUVudW1JRExpc3RfQ29uc3RydWN0b3IoKTsKKyNlbmRpZgorCitEV09SRCBXSU5BUEkgU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdChMUENMU0lELFJFRklJRCxMUFZPSUQqKTsKKworI3VuZGVmIFBVUkUKKyN1bmRlZiBGQVIKKyN1bmRlZiBUSElTCisjdW5kZWYgVEhJU18KKyN1bmRlZiBTVERNRVRIT0QKKyN1bmRlZiBTVERNRVRIT0RfCiAjZW5kaWYgLypfV0lORV9TSExPQkpfSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0ZGRlYnVnLmggYi9pbmNsdWRlL3N0ZGRlYnVnLmgKaW5kZXggOGY3M2VmYy4uMGY1MTk5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdGRkZWJ1Zy5oCisrKyBiL2luY2x1ZGUvc3RkZGVidWcuaApAQCAtMTQ4LDYgKzE0OCw3IEBACiAjdW5kZWYgREVCVUdfU1RSSU5HCiAjdW5kZWYgREVCVUdfVEFTSwogI3VuZGVmIERFQlVHX1RFWFQKKyN1bmRlZiBERUJVR19USFVOSwogI3VuZGVmIERFQlVHX1RJTUVSCiAjdW5kZWYgREVCVUdfVE9PTEhFTFAKICN1bmRlZiBERUJVR19UV0VBSwpAQCAtMjM0LDYgKzIzNSw3IEBACiAjZGVmaW5lIERFQlVHX1NUUklORwogI2RlZmluZSBERUJVR19UQVNLCiAjZGVmaW5lIERFQlVHX1RFWFQKKyNkZWZpbmUgREVCVUdfVEhVTksKICNkZWZpbmUgREVCVUdfVElNRVIKICNkZWZpbmUgREVCVUdfVE9PTEhFTFAKICNkZWZpbmUgREVCVUdfVFdFQUsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFzay5oIGIvaW5jbHVkZS90YXNrLmgKaW5kZXggZWY1NDEzNS4uNDYwZjVkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXNrLmgKKysrIGIvaW5jbHVkZS90YXNrLmgKQEAgLTEzMSw1ICsxMzEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMTYgY21kU2hvdyApOwogZXh0ZXJuIHZvaWQgVEFTS19LaWxsQ3VycmVudFRhc2soIElOVDE2IGV4aXRDb2RlICk7CiBleHRlcm4gSFRBU0sxNiBUQVNLX0dldE5leHRUYXNrKCBIVEFTSzE2IGhUYXNrICk7CitleHRlcm4gdm9pZCBUQVNLX1Jlc2NoZWR1bGUodm9pZCk7CiAKICNlbmRpZiAvKiBfX1dJTkVfVEFTS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Rvb2xoZWxwLmggYi9pbmNsdWRlL3Rvb2xoZWxwLmgKaW5kZXggOGQxY2Q4MS4uMWQyZGRiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90b29saGVscC5oCisrKyBiL2luY2x1ZGUvdG9vbGhlbHAuaApAQCAtMzQ4LDYgKzM0OCwxOCBAQAogICAgIHZvaWQgICAgICAqKmxwQmFkUGFyYW07CiB9IE5GWUxPR1BBUkFNRVJST1I7CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBEV09SRCBkd1NpemU7CisgICAgSFRBU0sxNiBoVGFzazsKKyAgICBXT1JEIHdTUzsKKyAgICBXT1JEIHdCUDsKKyAgICBXT1JEIHdDUzsKKyAgICBXT1JEIHdJUDsKKyAgICBITU9EVUxFMTYgaE1vZHVsZTsKKyAgICBXT1JEIHdTZWdtZW50OworICAgIFdPUkQgd0ZsYWdzOworfSBTVEFDS1RSQUNFRU5UUlk7CisKICNwcmFnbWEgcGFjayg0KQogCiAjZW5kaWYgLyogX19XSU5FX1RPT0xIRUxQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXNlci5oIGIvaW5jbHVkZS91c2VyLmgKaW5kZXggNjhlMDIzZi4uYjIzNWI3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91c2VyLmgKKysrIGIvaW5jbHVkZS91c2VyLmgKQEAgLTI0LDUgKzI0LDggQEAKICAgICAgICAgICgoaGFuZGxlKSA/IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihVU0VSX0hlYXBTZWwsIChoYW5kbGUpKSA6IChTRUdQVFIpMCkKIAogdm9pZCBVU0VSX1NpZ25hbFByb2MoSEFORExFMTYsIFVJTlQxNiwgVUlOVDE2LCBISU5TVEFOQ0UxNiwgSFFVRVVFMTYpOwordm9pZCBVU0VSX0V4aXRXaW5kb3dzKHZvaWQpOworSEdMT0JBTDE2IFVTRVJfQ2FsbERlZmF1bHRSc3JjSGFuZGxlciggSEdMT0JBTDE2IGhNZW1PYmosIEhNT0RVTEUxNiBoTW9kdWxlLAorCQkJCSAgICAgICBIUlNSQzE2IGhSc3JjICk7CiAKICNlbmRpZiAgLyogX19XSU5FX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS92ZXJzaW9uLmggYi9pbmNsdWRlL3ZlcnNpb24uaAppbmRleCBiMGNmYzg1Li5kMzQxM2UyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL3ZlcnNpb24uaApAQCAtMSArMSBAQAotI2RlZmluZSBXSU5FX1JFTEVBU0VfSU5GTyAiV2luZSByZWxlYXNlIDk3MTEzMCIKKyNkZWZpbmUgV0lORV9SRUxFQVNFX0lORk8gIldpbmUgcmVsZWFzZSA5NzEyMjEiCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IDk5NzIwOGEuLjg2Y2I1YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC0xNTkxLDEzICsxNTkxLDMwIEBACiBERUNMX1dJTkVMSUJfVFlQRShMT0dQRU4pOwogREVDTF9XSU5FTElCX1RZUEUoTFBMT0dQRU4pOwogCi0jZGVmaW5lIFBTX1NPTElECSAgMAotI2RlZmluZSBQU19EQVNIICAgICAgICAgICAxCi0jZGVmaW5lIFBTX0RPVCAgICAgICAgICAgIDIKLSNkZWZpbmUgUFNfREFTSERPVCAgICAgICAgMwotI2RlZmluZSBQU19EQVNIRE9URE9UICAgICA0Ci0jZGVmaW5lIFBTX05VTEwgCSAgNQotI2RlZmluZSBQU19JTlNJREVGUkFNRSAJICA2CisjZGVmaW5lIFBTX1NPTElEICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQU19EQVNIICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUFNfRE9UICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFBTX0RBU0hET1QgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBQU19EQVNIRE9URE9UICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUFNfTlVMTCAgICAgICAgICAweDAwMDAwMDA1CisjZGVmaW5lIFBTX0lOU0lERUZSQU1FICAgMHgwMDAwMDAwNgorI2RlZmluZSBQU19VU0VSU1RZTEUgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgUFNfQUxURVJOQVRFICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFBTX1NUWUxFX01BU0sgICAgMHgwMDAwMDAwZgorCisjZGVmaW5lIFBTX0VORENBUF9ST1VORCAgMHgwMDAwMDAwMAorI2RlZmluZSBQU19FTkRDQVBfU1FVQVJFIDB4MDAwMDAxMDAKKyNkZWZpbmUgUFNfRU5EQ0FQX0ZMQVQgICAweDAwMDAwMjAwCisjZGVmaW5lIFBTX0VORENBUF9NQVNLICAgMHgwMDAwMGYwMAorCisjZGVmaW5lIFBTX0pPSU5fUk9VTkQgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQU19KT0lOX0JFVkVMICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgUFNfSk9JTl9NSVRFUiAgICAweDAwMDAyMDAwCisjZGVmaW5lIFBTX0pPSU5fTUFTSyAgICAgMHgwMDAwZjAwMAorCisjZGVmaW5lIFBTX0NPU01FVElDICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBQU19HRU9NRVRSSUMgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgUFNfVFlQRV9NQVNLICAgICAweDAwMGYwMDAwCiAKICAgLyogUmVnaW9ucyAqLwogCkBAIC0xOTQ3LDYgKzE5NjQsMTAgQEAKIAlIQklUTUFQMzIJaGJtQ29sb3I7CiB9IElDT05JTkZPLCpMUElDT05JTkZPOwogCisjaWZkZWYgRlNISUZUCisvKiBHY2Mgb24gU29sYXJpcyBoYXMgYSB2ZXJzaW9uIG9mIHRoaXMgdGhhdCB3ZSBkb24ndCBjYXJlIGFib3V0LiAgKi8KKyN1bmRlZiBGU0hJRlQKKyNlbmRpZgogCiAjZGVmaW5lCUZWSVJUS0VZCVRSVUUgICAgICAgICAgLyogQXNzdW1lZCB0byBiZSA9PSBUUlVFICovCiAjZGVmaW5lCUZOT0lOVkVSVAkweDAyCkBAIC0yNTU3LDYgKzI1NzgsNyBAQAogI2RlZmluZSBERVZJQ0VfREVGQVVMVF9GT05UIDE0CiAjZGVmaW5lIERFRkFVTFRfUEFMRVRURSAgICAgMTUKICNkZWZpbmUgU1lTVEVNX0ZJWEVEX0ZPTlQgICAxNgorI2RlZmluZSBERUZBVUxUX0dVSV9GT05UICAgIDE3CiAKIC8qIERyYWdPYmplY3Qgc3R1ZmYgKi8KIApAQCAtMzAzOCwzMyArMzA2MCw0NyBAQAogI2RlZmluZSBHQ1dfSEJSQkFDS0dST1VORCAoLTEwKQogI2VuZGlmCiAKLSNkZWZpbmUgTUJfT0sgICAgICAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgTUJfT0tDQU5DRUwgICAgICAgICAweDAwMDEKLSNkZWZpbmUgTUJfQUJPUlRSRVRSWUlHTk9SRSAweDAwMDIKLSNkZWZpbmUgTUJfWUVTTk9DQU5DRUwgICAgICAweDAwMDMKLSNkZWZpbmUgTUJfWUVTTk8gICAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgTUJfUkVUUllDQU5DRUwgICAgICAweDAwMDUKLSNkZWZpbmUgTUJfVFlQRU1BU0sgICAgICAgICAweDAwMEYKKyNkZWZpbmUgTUJfT0sJCQkweDAwMDAwMDAwCisjZGVmaW5lIE1CX09LQ0FOQ0VMCQkweDAwMDAwMDAxCisjZGVmaW5lIE1CX0FCT1JUUkVUUllJR05PUkUJMHgwMDAwMDAwMgorI2RlZmluZSBNQl9ZRVNOT0NBTkNFTAkJMHgwMDAwMDAwMworI2RlZmluZSBNQl9ZRVNOTwkJMHgwMDAwMDAwNAorI2RlZmluZSBNQl9SRVRSWUNBTkNFTAkJMHgwMDAwMDAwNQorI2RlZmluZSBNQl9UWVBFTUFTSwkJMHgwMDAwMDAwRgogCi0jZGVmaW5lIE1CX0lDT05IQU5EICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIE1CX0lDT05RVUVTVElPTiAgICAgMHgwMDIwCi0jZGVmaW5lIE1CX0lDT05FWENMQU1BVElPTiAgMHgwMDMwCi0jZGVmaW5lIE1CX0lDT05BU1RFUklTSyAgICAgMHgwMDQwCi0jZGVmaW5lIE1CX0lDT05NQVNLICAgICAgICAgMHgwMEYwCisjZGVmaW5lIE1CX0lDT05IQU5ECQkweDAwMDAwMDEwCisjZGVmaW5lIE1CX0lDT05RVUVTVElPTgkJMHgwMDAwMDAyMAorI2RlZmluZSBNQl9JQ09ORVhDTEFNQVRJT04JMHgwMDAwMDAzMAorI2RlZmluZSBNQl9JQ09OQVNURVJJU0sJCTB4MDAwMDAwNDAKKyNkZWZpbmUJTUJfVVNFUklDT04JCTB4MDAwMDAwODAKKyNkZWZpbmUgTUJfSUNPTk1BU0sJCTB4MDAwMDAwRjAKIAotI2RlZmluZSBNQl9JQ09OSU5GT1JNQVRJT04gIE1CX0lDT05BU1RFUklTSwotI2RlZmluZSBNQl9JQ09OU1RPUCAgICAgICAgIE1CX0lDT05IQU5ECisjZGVmaW5lIE1CX0lDT05JTkZPUk1BVElPTglNQl9JQ09OQVNURVJJU0sKKyNkZWZpbmUgTUJfSUNPTlNUT1AJCU1CX0lDT05IQU5ECisjZGVmaW5lIE1CX0lDT05XQVJOSU5HCQlNQl9JQ09ORVhDTEFNQVRJT04KKyNkZWZpbmUgTUJfSUNPTkVSUk9SCQlNQl9JQ09OSEFORAogCi0jZGVmaW5lIE1CX0RFRkJVVFRPTjEgICAgICAgMHgwMDAwCi0jZGVmaW5lIE1CX0RFRkJVVFRPTjIgICAgICAgMHgwMTAwCi0jZGVmaW5lIE1CX0RFRkJVVFRPTjMgICAgICAgMHgwMjAwCi0jZGVmaW5lIE1CX0RFRk1BU0sgICAgICAgICAgMHgwRjAwCisjZGVmaW5lIE1CX0RFRkJVVFRPTjEJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTUJfREVGQlVUVE9OMgkJMHgwMDAwMDEwMAorI2RlZmluZSBNQl9ERUZCVVRUT04zCQkweDAwMDAwMjAwCisjZGVmaW5lIE1CX0RFRkJVVFRPTjQJCTB4MDAwMDAzMDAKKyNkZWZpbmUgTUJfREVGTUFTSwkJMHgwMDAwMEYwMAogCi0jZGVmaW5lIE1CX0FQUExNT0RBTCAgICAgICAgMHgwMDAwCi0jZGVmaW5lIE1CX1NZU1RFTU1PREFMICAgICAgMHgxMDAwCi0jZGVmaW5lIE1CX1RBU0tNT0RBTCAgICAgICAgMHgyMDAwCisjZGVmaW5lIE1CX0FQUExNT0RBTAkJMHgwMDAwMDAwMAorI2RlZmluZSBNQl9TWVNURU1NT0RBTAkJMHgwMDAwMTAwMAorI2RlZmluZSBNQl9UQVNLTU9EQUwJCTB4MDAwMDIwMDAKKyNkZWZpbmUgTUJfTU9ERU1BU0sJCTB4MDAwMDMwMDAKIAotI2RlZmluZSBNQl9OT0ZPQ1VTICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBNQl9IRUxQCQkJMHgwMDAwNDAwMAorI2RlZmluZSBNQl9OT0ZPQ1VTCQkweDAwMDA4MDAwCisjZGVmaW5lIE1CX01JU0NNQVNLCQkweDAwMDBDMDAwCisKKyNkZWZpbmUgTUJfU0VURk9SRUdST1VORAkweDAwMDEwMDAwCisjZGVmaW5lIE1CX0RFRkFVTFRfREVTS1RPUF9PTkxZCTB4MDAwMjAwMDAKKyNkZWZpbmUgTUJfU0VSVklDRV9OT1RJRklDQVRJT04JMHgwMDA0MDAwMAorI2RlZmluZSBNQl9UT1BNT1NUCQkweDAwMDQwMDAwCisjZGVmaW5lIE1CX1JJR0hUCQkweDAwMDgwMDAwCisjZGVmaW5lIE1CX1JUTFJFQURJTkcJCTB4MDAxMDAwMDAKIAogCiAjZGVmaW5lIERUX1RPUCAwCkBAIC0zMTY1LDcgKzMyMDEsOSBAQAogI2RlZmluZSBERkNTX01PTk8gICAgICAgICAgICAgICAweDgwMDAKIAogLyogRHJhd1N0YXRlIGRlZmluZXMgLi4uICovCi10eXBlZGVmIEJPT0wzMiAoQ0FMTEJBQ0sgKkRSQVdTVEFURVBST0MpKEhEQzMyLExQQVJBTSxXUEFSQU0zMixJTlQzMixJTlQzMik7Cit0eXBlZGVmIEJPT0wxNiAoQ0FMTEJBQ0sgKkRSQVdTVEFURVBST0MxNikoSERDMTYsTFBBUkFNLFdQQVJBTTE2LElOVDE2LElOVDE2KTsKK3R5cGVkZWYgQk9PTDMyIChDQUxMQkFDSyAqRFJBV1NUQVRFUFJPQzMyKShIREMzMixMUEFSQU0sV1BBUkFNMzIsSU5UMzIsSU5UMzIpOworREVDTF9XSU5FTElCX1RZUEUoRFJBV1NUQVRFUFJPQyk7CiAKIC8qIEltYWdlIHR5cGUgKi8KICNkZWZpbmUJRFNUX0NPTVBMRVgJMHgwMDAwCkBAIC0zMTc4LDYgKzMyMTYsNyBAQAogI2RlZmluZQlEU1NfTk9STUFMCTB4MDAwMAogI2RlZmluZQlEU1NfVU5JT04JMHgwMDEwICAvKiBHcmF5IHN0cmluZyBhcHBlYXJhbmNlICovCiAjZGVmaW5lCURTU19ESVNBQkxFRAkweDAwMjAKKyNkZWZpbmUJRFNTX0RFRkFVTFQJMHgwMDQwICAvKiBNYWtlIGl0IGJvbGQgKi8KICNkZWZpbmUJRFNTX01PTk8JMHgwMDgwCiAjZGVmaW5lCURTU19SSUdIVAkweDgwMDAKIApAQCAtNDg3NSw2ICs0OTE0LDIwIEBACiBERUNMX1dJTkVMSUJfVFlQRV9BVyhERVZNT0RFKTsKIERFQ0xfV0lORUxJQl9UWVBFX0FXKExQREVWTU9ERSk7CiAKK3R5cGVkZWYgc3RydWN0IF9QUklOVEVSX0RFRkFVTFRTMzJBIHsKKyAgICBMUFNUUiAgICAgICAgcERhdGF0eXBlOworICAgIExQREVWTU9ERTMyQSBwRGV2TW9kZTsKKyAgICBBQ0NFU1NfTUFTSyAgRGVzaXJlZEFjY2VzczsKK30gUFJJTlRFUl9ERUZBVUxUUzMyQSwgKkxQUFJJTlRFUl9ERUZBVUxUUzMyQTsKKwordHlwZWRlZiBzdHJ1Y3QgX1BSSU5URVJfREVGQVVMVFMzMlcgeworICAgIExQV1NUUiAgICAgICBwRGF0YXR5cGU7CisgICAgTFBERVZNT0RFMzJXIHBEZXZNb2RlOworICAgIEFDQ0VTU19NQVNLICBEZXNpcmVkQWNjZXNzOworfSBQUklOVEVSX0RFRkFVTFRTMzJXLCAqTFBQUklOVEVSX0RFRkFVTFRTMzJXOworCitERUNMX1dJTkVMSUJfVFlQRV9BVyhQUklOVEVSX0RFRkFVTFRTKTsKKwogdHlwZWRlZiBzdHJ1Y3QgX1NZU1RFTV9QT1dFUl9TVEFUVVMKIHsKICAgQk9PTDE2ICBBQ0xpbmVTdGF0dXM7CkBAIC00OTEwLDYgKzQ5NjMsMTIgQEAKICNkZWZpbmUgTFJfTE9BRFJFQUxTSVpFCQkweDAwMjAKICNkZWZpbmUgTFJfTE9BRE1BUDNEQ09MT1JTCTB4MTAwMAogCisvKiBGbGFncyBmb3IgUG9seURyYXcgYW5kIEdldFBhdGggKi8KKyNkZWZpbmUgUFRfQ0xPU0VGSUdVUkUgICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFBUX0xJTkVUTyAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBQVF9CRVpJRVJUTyAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgUFRfTU9WRVRPICAgICAgICAgICAgICAgMHgwMDA2CisKIHR5cGVkZWYgc3RydWN0IF9MQVJHRV9JTlRFR0VSCiB7CiAgICAgRFdPUkQgICAgTG93UGFydDsKQEAgLTUzMzMsNiArNTM5Miw3OSBAQAogICAgIH0gSGlnaFdvcmQ7CiB9IExEVF9FTlRSWSwgKkxQTERUX0VOVFJZOwogCisjZGVmaW5lCVJESF9SRUNUQU5HTEVTICAxCisKK3R5cGVkZWYgc3RydWN0IF9SR05EQVRBSEVBREVSIHsKKyAgICBEV09SRAlkd1NpemU7CisgICAgRFdPUkQJaVR5cGU7CisgICAgRFdPUkQJbkNvdW50OworICAgIERXT1JECW5SZ25TaXplOworICAgIFJFQ1QzMglyY0JvdW5kOworfSBSR05EQVRBSEVBREVSLCpMUFJHTkRBVEFIRUFERVI7CisKK3R5cGVkZWYgc3RydWN0IF9SR05EQVRBIHsKKyAgICBSR05EQVRBSEVBREVSCXJkaDsKKyAgICBjaGFyCQlCdWZmZXJbMV07Cit9IFJHTkRBVEEsKlBSR05EQVRBLCpMUFJHTkRBVEE7CisKKyNkZWZpbmUJSEVMUElORk9fV0lORE9XCQkweDAwMDEKKyNkZWZpbmUJSEVMUElORk9fTUVOVUlURU0JMHgwMDAyCit0eXBlZGVmIHN0cnVjdAkJCS8qIFN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IGxQYXJhbSBvZiBXTV9IRUxQICovCit7CisgICAgVUlOVDMyCWNiU2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhpcyBzdHJ1Y3QgICovCisgICAgSU5UMzIJaUNvbnRleHRUeXBlOwkvKiBFaXRoZXIgSEVMUElORk9fV0lORE9XIG9yIEhFTFBJTkZPX01FTlVJVEVNICovCisgICAgSU5UMzIJaUN0cmxJZDsJLyogQ29udHJvbCBJZCBvciBhIE1lbnUgaXRlbSBJZC4gKi8KKyAgICBIQU5ETEUzMgloSXRlbUhhbmRsZTsJLyogaFduZCBvZiBjb250cm9sIG9yIGhNZW51LiAgICAgKi8KKyAgICBEV09SRAlkd0NvbnRleHRJZDsJLyogQ29udGV4dCBJZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpdGVtICovCisgICAgUE9JTlQzMglNb3VzZVBvczsJLyogTW91c2UgUG9zaXRpb24gaW4gc2NyZWVuIGNvLW9yZGluYXRlcyAqLworfSAgSEVMUElORk8sKkxQSEVMUElORk87CisKK3R5cGVkZWYgdm9pZCAoQ0FMTEJBQ0sgKk1TR0JPWENBTExCQUNLKShMUEhFTFBJTkZPIGxwSGVscEluZm8pOworCit0eXBlZGVmIHN0cnVjdCAvKiBub3Qgc3VyZSBpZiB0aGUgMTZiaXQgdmVyc2lvbiBpcyBjb3JyZWN0ICovCit7CisgICAgVUlOVDE2CWNiU2l6ZTsKKyAgICBIV05EMTYJaHduZE93bmVyOworICAgIEhJTlNUQU5DRTE2CWhJbnN0YW5jZTsKKyAgICBMUENTVFIJbHBzelRleHQ7CisgICAgTFBDU1RSCWxwc3pDYXB0aW9uOworICAgIERXT1JECWR3U3R5bGU7CisgICAgTFBDU1RSCWxwc3pJY29uOworICAgIERXT1JECWR3Q29udGV4dEhlbHBJZDsKKyAgICBNU0dCT1hDQUxMQkFDSwlscGZuTXNnQm94Q2FsbGJhY2s7CisgICAgRFdPUkQJZHdMYW5ndWFnZUlkOworfSBNU0dCT1hQQVJBTVMxNiwqTFBNU0dCT1hQQVJBTVMxNjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVSU5UMzIJY2JTaXplOworICAgIEhXTkQzMglod25kT3duZXI7CisgICAgSElOU1RBTkNFMzIJaEluc3RhbmNlOworICAgIExQQ1NUUglscHN6VGV4dDsKKyAgICBMUENTVFIJbHBzekNhcHRpb247CisgICAgRFdPUkQJZHdTdHlsZTsKKyAgICBMUENTVFIJbHBzekljb247CisgICAgRFdPUkQJZHdDb250ZXh0SGVscElkOworICAgIE1TR0JPWENBTExCQUNLCWxwZm5Nc2dCb3hDYWxsYmFjazsKKyAgICBEV09SRAlkd0xhbmd1YWdlSWQ7Cit9IE1TR0JPWFBBUkFNUzMyQSwqTFBNU0dCT1hQQVJBTVMzMkE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDMyCWNiU2l6ZTsKKyAgICBIV05EMzIJaHduZE93bmVyOworICAgIEhJTlNUQU5DRTMyCWhJbnN0YW5jZTsKKyAgICBMUENXU1RSCWxwc3pUZXh0OworICAgIExQQ1dTVFIJbHBzekNhcHRpb247CisgICAgRFdPUkQJZHdTdHlsZTsKKyAgICBMUENXU1RSCWxwc3pJY29uOworICAgIERXT1JECWR3Q29udGV4dEhlbHBJZDsKKyAgICBNU0dCT1hDQUxMQkFDSwlscGZuTXNnQm94Q2FsbGJhY2s7CisgICAgRFdPUkQJZHdMYW5ndWFnZUlkOworfSBNU0dCT1hQQVJBTVMzMlcsKkxQTVNHQk9YUEFSQU1TMzJXOworCitERUNMX1dJTkVMSUJfVFlQRV9BVyhNU0dCT1hQQVJBTVMpCisKICNwcmFnbWEgcGFjayg0KQogCiAvKiBEZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyB0aGF0IGV4aXN0IG9ubHkgaW4gV2luMTYgKi8KQEAgLTUzOTAsNiArNTUyMiw3IEBACiBEV09SRCAgICAgICBXSU5BUEkgR2V0RmlsZVJlc291cmNlU2l6ZShMUENTVFIsU0VHUFRSLFNFR1BUUixMUERXT1JEKTsKIERXT1JEICAgICAgIFdJTkFQSSBHZXRGaWxlUmVzb3VyY2UoTFBDU1RSLFNFR1BUUixTRUdQVFIsRFdPUkQsRFdPUkQsTFBWT0lEKTsKIERXT1JEICAgICAgIFdJTkFQSSBHZXRIZWFwU3BhY2VzKEhNT0RVTEUxNik7CitXT1JEICAgICAgICBXSU5BUEkgR2V0SWNvbklEKEhHTE9CQUwxNixEV09SRCk7CiBJTlQxNiAgICAgICBXSU5BUEkgR2V0SW5zdGFuY2VEYXRhKEhJTlNUQU5DRTE2LFdPUkQsSU5UMTYpOwogSEdMT0JBTDE2ICAgV0lOQVBJIEdldE1ldGFGaWxlQml0cyhITUVUQUZJTEUxNik7CiBCT09MMTYgICAgICBXSU5BUEkgR2V0TW9kdWxlTmFtZShISU5TVEFOQ0UxNixMUFNUUixJTlQxNik7CkBAIC01NDM0LDYgKzU1NjcsNyBAQAogV09SRCAgICAgICAgV0lOQVBJIExvY2FsQ291bnRGcmVlKHZvaWQpOwogV09SRCAgICAgICAgV0lOQVBJIExvY2FsSGFuZGxlRGVsdGEoV09SRCk7CiBXT1JEICAgICAgICBXSU5BUEkgTG9jYWxIZWFwU2l6ZSh2b2lkKTsKK0hJQ09OMTYgICAgIFdJTkFQSSBMb2FkSWNvbkhhbmRsZXIoSEdMT0JBTDE2LEJPT0wxNik7CiBCT09MMTYgICAgICBXSU5BUEkgTG9jYWxJbml0KEhBTkRMRTE2LFdPUkQsV09SRCk7CiBGQVJQUk9DMTYgICBXSU5BUEkgTG9jYWxOb3RpZnkoRkFSUFJPQzE2KTsKIEhUQVNLMTYgICAgIFdJTkFQSSBMb2NrQ3VycmVudFRhc2soQk9PTDE2KTsKQEAgLTU1MDksNiArNTY0Myw3IEBACiBIRklMRTMyICAgICBXSU5BUEkgQ3JlYXRlRmlsZTMyVyhMUENXU1RSLERXT1JELERXT1JELExQU0VDVVJJVFlfQVRUUklCVVRFUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JELERXT1JELEhBTkRMRTMyKTsKICNkZWZpbmUgICAgIENyZWF0ZUZpbGUgV0lORUxJQl9OQU1FX0FXKENyZWF0ZUZpbGUpCitIUEFMRVRURTMyICBXSU5BUEkgQ3JlYXRlSGFsZnRvbmVQYWxldHRlKEhEQzMyKTsKIEhBTkRMRTMyICAgIFdJTkFQSSBDcmVhdGVGaWxlTWFwcGluZzMyQShIQU5ETEUzMixMUFNFQ1VSSVRZX0FUVFJJQlVURVMsRFdPUkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQsRFdPUkQsTFBDU1RSKTsKIEhBTkRMRTMyICAgIFdJTkFQSSBDcmVhdGVGaWxlTWFwcGluZzMyVyhIQU5ETEUzMixMUFNFQ1VSSVRZX0FUVFJJQlVURVMsRFdPUkQsCkBAIC01NTU4LDcgKzU2OTMsMTEgQEAKIEhSU1JDMzIgICAgIFdJTkFQSSBGaW5kUmVzb3VyY2VFeDMyQShISU5TVEFOQ0UzMixMUENTVFIsTFBDU1RSLFdPUkQpOwogSFJTUkMzMiAgICAgV0lOQVBJIEZpbmRSZXNvdXJjZUV4MzJXKEhJTlNUQU5DRTMyLExQQ1dTVFIsTFBDV1NUUixXT1JEKTsKICNkZWZpbmUgICAgIEZpbmRSZXNvdXJjZUV4IFdJTkVMSUJfTkFNRV9BVyhGaW5kUmVzb3VyY2VFeCkKK0JPT0wzMiAgICAgIFdJTkFQSSBGbHVzaENvbnNvbGVJbnB1dEJ1ZmZlcihIQU5ETEUzMik7CiBCT09MMzIgICAgICBXSU5BUEkgRmx1c2hGaWxlQnVmZmVycyhIRklMRTMyKTsKK0RXT1JEICAgICAgIFdJTkFQSSBGb3JtYXRNZXNzYWdlMzJBKERXT1JELExQQ1ZPSUQsRFdPUkQsRFdPUkQsTFBTVFIsCisJCQkJICAgIERXT1JELExQRFdPUkQpOworI2RlZmluZSAgICAgRm9ybWF0TWVzc2FnZSBXSU5FTElCX05BTUVfQVcoRm9ybWF0TWVzc2FnZSkKIEJPT0wzMiAgICAgIFdJTkFQSSBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJBKExQU1RSKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJXKExQV1NUUik7CiAjZGVmaW5lICAgICBGcmVlRW52aXJvbm1lbnRTdHJpbmdzIFdJTkVMSUJfTkFNRV9BVyhGcmVlRW52aXJvbm1lbnRTdHJpbmdzKQpAQCAtNTU3MCw3ICs1NzA5LDE0IEBACiBCT09MMzIgICAgICBXSU5BUEkgR2V0Q29tcHV0ZXJOYW1lMzJBKExQU1RSLExQRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldENvbXB1dGVyTmFtZTMyVyhMUFdTVFIsTFBEV09SRCk7CiAjZGVmaW5lICAgICBHZXRDb21wdXRlck5hbWUgV0lORUxJQl9OQU1FX0FXKEdldENvbXB1dGVyTmFtZSkKK1VJTlQzMiAgICAgIFdJTkFQSSBHZXRDb25zb2xlQ1AoKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBHZXRDb25zb2xlTW9kZShIQU5ETEUzMixMUERXT1JEKTsKK1VJTlQzMiAgICAgIFdJTkFQSSBHZXRDb25zb2xlT3V0cHV0Q1AoKTsKK0RXT1JEICAgICAgIFdJTkFQSSBHZXRDb25zb2xlVGl0bGUzMkEoTFBTVFIsRFdPUkQpOworRFdPUkQgICAgICAgV0lOQVBJIEdldENvbnNvbGVUaXRsZTMyVyhMUFdTVFIsRFdPUkQpOworI2RlZmluZSAgICAgR2V0Q29uc29sZVRpdGxlIFdJTkVMSUJfTkFNRV9BVyhHZXRDb25zb2xlVGl0bGUpCiBCT09MMzIgICAgICBXSU5BUEkgR2V0Q1BJbmZvKFVJTlQzMixMUENQSU5GTyk7CitIQU5ETEUzMiAgICBXSU5BUEkgR2V0Q3VycmVudE9iamVjdChIREMzMixVSU5UMzIpOwogSEFORExFMzIgICAgV0lOQVBJIEdldEN1cnJlbnRQcm9jZXNzKHZvaWQpOwogRFdPUkQgICAgICAgV0lOQVBJIEdldEN1cnJlbnRQcm9jZXNzSWQodm9pZCk7CiBIQU5ETEUzMiAgICBXSU5BUEkgR2V0Q3VycmVudFRocmVhZCh2b2lkKTsKQEAgLTU1ODksMTEgKzU3MzUsMTQgQEAKIERXT1JEICAgICAgIFdJTkFQSSBHZXRGdWxsUGF0aE5hbWUzMkEoTFBDU1RSLERXT1JELExQU1RSLExQU1RSKik7CiBEV09SRCAgICAgICBXSU5BUEkgR2V0RnVsbFBhdGhOYW1lMzJXKExQQ1dTVFIsRFdPUkQsTFBXU1RSLExQV1NUUiopOwogI2RlZmluZSAgICAgR2V0RnVsbFBhdGhOYW1lIFdJTkVMSUJfTkFNRV9BVyhHZXRGdWxsUGF0aE5hbWUpCitEV09SRCAgICAgICBXSU5BUEkgR2V0TGFyZ2VzdENvbnNvbGVXaW5kb3dTaXplKEhBTkRMRTMyKTsKIFZPSUQgICAgICAgIFdJTkFQSSBHZXRMb2NhbFRpbWUoTFBTWVNURU1USU1FKTsKIERXT1JEICAgICAgIFdJTkFQSSBHZXRMb2dpY2FsRHJpdmVzKHZvaWQpOwogQk9PTDMyICAgICAgV0lOQVBJIEdldE1lbnVJdGVtSW5mbzMyQShITUVOVTMyLFVJTlQzMixCT09MMzIsTUVOVUlURU1JTkZPMzJBKik7CiBCT09MMzIgICAgICBXSU5BUEkgR2V0TWVudUl0ZW1JbmZvMzJXKEhNRU5VMzIsVUlOVDMyLEJPT0wzMixNRU5VSVRFTUlORk8zMlcqKTsKICNkZWZpbmUgICAgIEdldE1lbnVJdGVtSW5mbyBXSU5FTElCX05BTUVfQVcoR2V0TWVudUl0ZW1JbmZvKQorQk9PTDMyICAgICAgV0lOQVBJIEdldE51bWJlck9mQ29uc29sZUlucHV0RXZlbnRzKEhBTkRMRTMyLExQRFdPUkQpOworQk9PTDMyICAgICAgV0lOQVBJIEdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9ucyhMUERXT1JEKTsKIERXT1JEICAgICAgIFdJTkFQSSBHZXRPYmplY3RUeXBlKEhBTkRMRTMyKTsKIFVJTlQzMiAgICAgIFdJTkFQSSBHZXRPRU1DUCh2b2lkKTsKIERXT1JEICAgICAgIFdJTkFQSSBHZXRQcmlvcml0eUNsYXNzKEhBTkRMRTMyKTsKQEAgLTU2MzUsNiArNTc4NCw3IEBACiBCT09MMzIgICAgICBXSU5BUEkgSGVhcFVubG9jayhIQU5ETEUzMik7CiBCT09MMzIgICAgICBXSU5BUEkgSGVhcFZhbGlkYXRlKEhBTkRMRTMyLERXT1JELExQQ1ZPSUQpOwogQk9PTDMyICAgICAgV0lOQVBJIElzREJDU0xlYWRCeXRlRXgoVUlOVDMyLEJZVEUpOworQk9PTDMyICAgICAgV0lOQVBJIElzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQoRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIElzV2luZG93VW5pY29kZShIV05EMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIElzVmFsaWRMb2NhbGUoRFdPUkQsRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIExvY2FsRmlsZVRpbWVUb0ZpbGVUaW1lKGNvbnN0IEZJTEVUSU1FKixMUEZJTEVUSU1FKTsKQEAgLTU3MDIsNiArNTg1Miw3IEBACiBCT09MMzIgICAgICBXSU5BUEkgU2V0QnJ1c2hPcmdFeChIREMzMixJTlQzMixJTlQzMixMUFBPSU5UMzIpOwogQk9PTDMyICAgICAgV0lOQVBJIFNldENvbW1NYXNrKElOVDMyLERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBTZXRDb21tVGltZW91dHMoSU5UMzIsTFBDT01NVElNRU9VVFMpOworQk9PTDMyICAgICAgV0lOQVBJIFNldENvbnNvbGVNb2RlKEhBTkRMRTMyLERXT1JEKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBTZXRDb25zb2xlVGl0bGUzMkEoTFBDU1RSKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBTZXRDb25zb2xlVGl0bGUzMlcoTFBDV1NUUik7CiAjZGVmaW5lICAgICBTZXRDb25zb2xlVGl0bGUgV0lORUxJQl9OQU1FX0FXKFNldENvbnNvbGVUaXRsZSkKQEAgLTU3NDMsOCArNTg5NCw4IEBACiBCT09MMzIgICAgICBXSU5BUEkgVmlydHVhbFF1ZXJ5KExQQ1ZPSUQsTFBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04sRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIFZpcnR1YWxRdWVyeUV4KEhBTkRMRTMyLExQQ1ZPSUQsTFBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04sRFdPUkQpOwogQk9PTDMyICAgICAgV0lOQVBJIFZpcnR1YWxVbmxvY2soTFBWT0lELERXT1JEKTsKLUJPT0wzMiAgICAgIFdJTkFQSSBXcml0ZUNvbnNvbGUzMkEoSEFORExFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBWT0lEKTsKLUJPT0wzMiAgICAgIFdJTkFQSSBXcml0ZUNvbnNvbGUzMlcoSEFORExFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBWT0lEKTsKK0JPT0wzMiAgICAgIFdJTkFQSSBXcml0ZUNvbnNvbGUzMkEoSEFORExFMzIsTFBDVk9JRCxEV09SRCxMUERXT1JELExQVk9JRCk7CitCT09MMzIgICAgICBXSU5BUEkgV3JpdGVDb25zb2xlMzJXKEhBTkRMRTMyLExQQ1ZPSUQsRFdPUkQsTFBEV09SRCxMUFZPSUQpOwogI2RlZmluZSAgICAgV3JpdGVDb25zb2xlIFdJTkVMSUJfTkFNRV9BVyhXcml0ZUNvbnNvbGUpCiBCT09MMzIgICAgICBXSU5BUEkgV3JpdGVGaWxlKEhGSUxFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBPVkVSTEFQUEVEKTsKIApAQCAtNTc3OCw2ICs1OTI5LDkgQEAKIAogLyogRGVjbGFyYXRpb25zIGZvciBmdW5jdGlvbnMgdGhhdCBjaGFuZ2UgYmV0d2VlbiBXaW4xNiBhbmQgV2luMzIgKi8KIAorQk9PTDE2ICAgICAgV0lOQVBJIEFib3J0UGF0aDE2KEhEQzE2KTsKK0JPT0wzMiAgICAgIFdJTkFQSSBBYm9ydFBhdGgzMihIREMzMik7CisjZGVmaW5lICAgICBBYm9ydFBhdGggV0lORUxJQl9OQU1FKEFib3J0UGF0aCkKIExSRVNVTFQgICAgIFdJTkFQSSBBYm91dERsZ1Byb2MxNihIV05EMTYsVUlOVDE2LFdQQVJBTTE2LExQQVJBTSk7CiBMUkVTVUxUICAgICBXSU5BUEkgQWJvdXREbGdQcm9jMzIoSFdORDMyLFVJTlQzMixXUEFSQU0zMixMUEFSQU0pOwogI2RlZmluZSAgICAgQWJvdXREbGdQcm9jIFdJTkVMSUJfTkFNRShBYm91dERsZ1Byb2MpCkBAIC01ODU1LDYgKzYwMDksOSBAQAogSERDMTYgICAgICAgV0lOQVBJIEJlZ2luUGFpbnQxNihIV05EMTYsTFBQQUlOVFNUUlVDVDE2KTsKIEhEQzMyICAgICAgIFdJTkFQSSBCZWdpblBhaW50MzIoSFdORDMyLExQUEFJTlRTVFJVQ1QzMik7CiAjZGVmaW5lICAgICBCZWdpblBhaW50IFdJTkVMSUJfTkFNRShCZWdpblBhaW50KQorQk9PTDE2ICAgICAgV0lOQVBJIEJlZ2luUGF0aDE2KEhEQzE2KTsKK0JPT0wzMiAgICAgIFdJTkFQSSBCZWdpblBhdGgzMihIREMzMik7CisjZGVmaW5lICAgICBCZWdpblBhdGggV0lORUxJQl9OQU1FKEJlZ2luUGF0aCkKIEJPT0wxNiAgICAgIFdJTkFQSSBCaXRCbHQxNihIREMxNixJTlQxNixJTlQxNixJTlQxNixJTlQxNixIREMxNixJTlQxNixJTlQxNixEV09SRCk7CiBCT09MMzIgICAgICBXSU5BUEkgQml0Qmx0MzIoSERDMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsSERDMzIsSU5UMzIsSU5UMzIsRFdPUkQpOwogI2RlZmluZSAgICAgQml0Qmx0IFdJTkVMSUJfTkFNRShCaXRCbHQpCkBAIC01OTQ2LDYgKzYxMDMsOSBAQAogQk9PTDE2ICAgICAgV0lOQVBJIENsb3NlQ2xpcGJvYXJkMTYodm9pZCk7CiBCT09MMzIgICAgICBXSU5BUEkgQ2xvc2VDbGlwYm9hcmQzMih2b2lkKTsKICNkZWZpbmUgICAgIENsb3NlQ2xpcGJvYXJkIFdJTkVMSUJfTkFNRShDbG9zZUNsaXBib2FyZCkKK0JPT0wxNiAgICAgIFdJTkFQSSBDbG9zZUZpZ3VyZTE2KEhEQzE2KTsKK0JPT0wzMiAgICAgIFdJTkFQSSBDbG9zZUZpZ3VyZTMyKEhEQzMyKTsKKyNkZWZpbmUgICAgIENsb3NlRmlndXJlIFdJTkVMSUJfTkFNRShDbG9zZUZpZ3VyZSkKIEhNRVRBRklMRTE2IFdJTkFQSSBDbG9zZU1ldGFGaWxlMTYoSERDMTYpOwogSE1FVEFGSUxFMzIgV0lOQVBJIENsb3NlTWV0YUZpbGUzMihIREMzMik7CiAjZGVmaW5lICAgICBDbG9zZU1ldGFGaWxlIFdJTkVMSUJfTkFNRShDbG9zZU1ldGFGaWxlKQpAQCAtNjMwNCw2ICs2NDY0LDkgQEAKIEJPT0wxNiAgICAgIFdJTkFQSSBFbmRQYWludDE2KEhXTkQxNixjb25zdCBQQUlOVFNUUlVDVDE2Kik7CiBCT09MMzIgICAgICBXSU5BUEkgRW5kUGFpbnQzMihIV05EMzIsY29uc3QgUEFJTlRTVFJVQ1QzMiopOwogI2RlZmluZSAgICAgRW5kUGFpbnQgV0lORUxJQl9OQU1FKEVuZFBhaW50KQorQk9PTDE2ICAgICAgV0lOQVBJIEVuZFBhdGgxNihIREMxNik7CitCT09MMzIgICAgICBXSU5BUEkgRW5kUGF0aDMyKEhEQzMyKTsKKyNkZWZpbmUgICAgIEVuZFBhdGggV0lORUxJQl9OQU1FKEVuZFBhdGgpCiBCT09MMTYgICAgICBXSU5BUEkgRW51bUNoaWxkV2luZG93czE2KEhXTkQxNixXTkRFTlVNUFJPQzE2LExQQVJBTSk7CiBCT09MMzIgICAgICBXSU5BUEkgRW51bUNoaWxkV2luZG93czMyKEhXTkQzMixXTkRFTlVNUFJPQzMyLExQQVJBTSk7CiAjZGVmaW5lICAgICBFbnVtQ2hpbGRXaW5kb3dzIFdJTkVMSUJfTkFNRShFbnVtQ2hpbGRXaW5kb3dzKQpAQCAtNjM2MCw2ICs2NTIzLDkgQEAKIEJPT0wxNiAgICAgIFdJTkFQSSBFeGl0V2luZG93czE2KERXT1JELFVJTlQxNik7CiAjZGVmaW5lICAgICBFeGl0V2luZG93czMyKGEsYikgRXhpdFdpbmRvd3NFeChFV1hfTE9HT0ZGLDB4ZmZmZmZmZmYpCiAjZGVmaW5lICAgICBFeGl0V2luZG93cyBXSU5FTElCX05BTUUoRXhpdFdpbmRvd3MpCitIUEVOMTYgICAgICBXSU5BUEkgRXh0Q3JlYXRlUGVuMTYoRFdPUkQsRFdPUkQsY29uc3QgTE9HQlJVU0gxNiosRFdPUkQsY29uc3QgRFdPUkQqKTsKK0hQRU4zMiAgICAgIFdJTkFQSSBFeHRDcmVhdGVQZW4zMihEV09SRCxEV09SRCxjb25zdCBMT0dCUlVTSDMyKixEV09SRCxjb25zdCBEV09SRCopOworI2RlZmluZSAgICAgRXh0Q3JlYXRlUGVuIFdJTkVMSUJfTkFNRShFeHRDcmVhdGVQZW4pCiBCT09MMTYgICAgICBXSU5BUEkgRXh0Rmxvb2RGaWxsMTYoSERDMTYsSU5UMTYsSU5UMTYsQ09MT1JSRUYsVUlOVDE2KTsKIEJPT0wzMiAgICAgIFdJTkFQSSBFeHRGbG9vZEZpbGwzMihIREMzMixJTlQzMixJTlQzMixDT0xPUlJFRixVSU5UMzIpOwogI2RlZmluZSAgICAgRXh0Rmxvb2RGaWxsIFdJTkVMSUJfTkFNRShFeHRGbG9vZEZpbGwpCkBAIC02MzgyLDYgKzY1NDgsOSBAQAogdm9pZCAgICAgICAgV0lOQVBJIEZhdGFsQXBwRXhpdDMyQShVSU5UMzIsTFBDU1RSKTsKIHZvaWQgICAgICAgIFdJTkFQSSBGYXRhbEFwcEV4aXQzMlcoVUlOVDMyLExQQ1dTVFIpOwogI2RlZmluZSAgICAgRmF0YWxBcHBFeGl0IFdJTkVMSUJfTkFNRV9BVyhGYXRhbEFwcEV4aXQpCitCT09MMTYgICAgICBXSU5BUEkgRmlsbFBhdGgxNihIREMxNik7CitCT09MMzIgICAgICBXSU5BUEkgRmlsbFBhdGgzMihIREMzMik7CisjZGVmaW5lICAgICBGaWxsUGF0aCBXSU5FTElCX05BTUUoRmlsbFBhdGgpCiBJTlQxNiAgICAgICBXSU5BUEkgRmlsbFJlY3QxNihIREMxNixjb25zdCBSRUNUMTYqLEhCUlVTSDE2KTsKIElOVDMyICAgICAgIFdJTkFQSSBGaWxsUmVjdDMyKEhEQzMyLGNvbnN0IFJFQ1QzMiosSEJSVVNIMzIpOwogI2RlZmluZSAgICAgRmlsbFJlY3QgV0lORUxJQl9OQU1FKEZpbGxSZWN0KQpAQCAtNjQwMiwxMSArNjU3MSwxMSBAQAogSEFORExFMTYgICAgV0lOQVBJIEZpbmRGaXJzdEZpbGUxNihMUENTVFIsTFBXSU4zMl9GSU5EX0RBVEEzMkEpOwogSEFORExFMzIgICAgV0lOQVBJIEZpbmRGaXJzdEZpbGUzMkEoTFBDU1RSLExQV0lOMzJfRklORF9EQVRBMzJBKTsKIEhBTkRMRTMyICAgIFdJTkFQSSBGaW5kRmlyc3RGaWxlMzJXKExQQ1dTVFIsTFBXSU4zMl9GSU5EX0RBVEEzMlcpOwotI2RlZmluZSAgICAgRmluZEZpcnN0IFdJTkVMSUJfTkFNRV9BVyhGaW5kRmlyc3QpCisjZGVmaW5lICAgICBGaW5kRmlyc3RGaWxlIFdJTkVMSUJfTkFNRV9BVyhGaW5kRmlyc3RGaWxlKQogQk9PTDE2ICAgICAgV0lOQVBJIEZpbmROZXh0RmlsZTE2KEhBTkRMRTE2LExQV0lOMzJfRklORF9EQVRBMzJBKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBGaW5kTmV4dEZpbGUzMkEoSEFORExFMzIsTFBXSU4zMl9GSU5EX0RBVEEzMkEpOwogQk9PTDMyICAgICAgV0lOQVBJIEZpbmROZXh0RmlsZTMyVyhIQU5ETEUzMixMUFdJTjMyX0ZJTkRfREFUQTMyVyk7Ci0jZGVmaW5lICAgICBGaW5kTmV4dCBXSU5FTElCX05BTUVfQVcoRmluZE5leHQpCisjZGVmaW5lICAgICBGaW5kTmV4dEZpbGUgV0lORUxJQl9OQU1FX0FXKEZpbmROZXh0RmlsZSkKIEhSU1JDMTYgICAgIFdJTkFQSSBGaW5kUmVzb3VyY2UxNihISU5TVEFOQ0UxNixTRUdQVFIsU0VHUFRSKTsKIEhSU1JDMzIgICAgIFdJTkFQSSBGaW5kUmVzb3VyY2UzMkEoSElOU1RBTkNFMzIsTFBDU1RSLExQQ1NUUik7CiBIUlNSQzMyICAgICBXSU5BUEkgRmluZFJlc291cmNlMzJXKEhJTlNUQU5DRTMyLExQQ1dTVFIsTFBDV1NUUik7CkBAIC02NTYzLDYgKzY3MzIsOSBAQAogSU5UMTYgICAgICAgV0lOQVBJIEdldERldmljZUNhcHMxNihIREMxNixJTlQxNik7CiBJTlQzMiAgICAgICBXSU5BUEkgR2V0RGV2aWNlQ2FwczMyKEhEQzMyLElOVDMyKTsKICNkZWZpbmUgICAgIEdldERldmljZUNhcHMgV0lORUxJQl9OQU1FKEdldERldmljZUNhcHMpCitVSU5UMTYgICAgICBXSU5BUEkgR2V0RElCQ29sb3JUYWJsZTE2KEhEQzE2LFVJTlQxNixVSU5UMTYsUkdCUVVBRCopOworVUlOVDMyICAgICAgV0lOQVBJIEdldERJQkNvbG9yVGFibGUzMihIREMzMixVSU5UMzIsVUlOVDMyLFJHQlFVQUQqKTsKKyNkZWZpbmUgICAgIEdldERJQkNvbG9yVGFibGUgV0lORUxJQl9OQU1FKEdldERJQkNvbG9yVGFibGUpCiBJTlQxNiAgICAgICBXSU5BUEkgR2V0RElCaXRzMTYoSERDMTYsSEJJVE1BUDE2LFVJTlQxNixVSU5UMTYsTFBTVFIsTFBCSVRNQVBJTkZPLFVJTlQxNik7CiBJTlQzMiAgICAgICBXSU5BUEkgR2V0RElCaXRzMzIoSERDMzIsSEJJVE1BUDMyLFVJTlQzMixVSU5UMzIsTFBTVFIsTFBCSVRNQVBJTkZPLFVJTlQzMik7CiAjZGVmaW5lICAgICBHZXRESUJpdHMgV0lORUxJQl9OQU1FKEdldERJQml0cykKQEAgLTY3MTgsNiArNjg5MCw5IEBACiBIV05EMTYgICAgICBXSU5BUEkgR2V0UGFyZW50MTYoSFdORDE2KTsKIEhXTkQzMiAgICAgIFdJTkFQSSBHZXRQYXJlbnQzMihIV05EMzIpOwogI2RlZmluZSAgICAgR2V0UGFyZW50IFdJTkVMSUJfTkFNRShHZXRQYXJlbnQpCitJTlQxNiAgICAgICBXSU5BUEkgR2V0UGF0aDE2KEhEQzE2LExQUE9JTlQxNixMUEJZVEUsSU5UMTYpOworSU5UMzIgICAgICAgV0lOQVBJIEdldFBhdGgzMihIREMzMixMUFBPSU5UMzIsTFBCWVRFLElOVDMyKTsKKyNkZWZpbmUgICAgIEdldFBhdGggV0lORUxJQl9OQU1FKEdldFBhdGgpCiBDT0xPUlJFRiAgICBXSU5BUEkgR2V0UGl4ZWwxNihIREMxNixJTlQxNixJTlQxNik7CiBDT0xPUlJFRiAgICBXSU5BUEkgR2V0UGl4ZWwzMihIREMzMixJTlQzMixJTlQzMik7CiAjZGVmaW5lICAgICBHZXRQaXhlbCBXSU5FTElCX05BTUUoR2V0UGl4ZWwpCkBAIC03MjI4LDYgKzc0MDMsMTAgQEAKIElOVDMyICAgICAgIFdJTkFQSSBNZXNzYWdlQm94MzJBKEhXTkQzMixMUENTVFIsTFBDU1RSLFVJTlQzMik7CiBJTlQzMiAgICAgICBXSU5BUEkgTWVzc2FnZUJveDMyVyhIV05EMzIsTFBDV1NUUixMUENXU1RSLFVJTlQzMik7CiAjZGVmaW5lICAgICBNZXNzYWdlQm94IFdJTkVMSUJfTkFNRV9BVyhNZXNzYWdlQm94KQorSU5UMTYgICAgICAgV0lOQVBJIE1lc3NhZ2VCb3hJbmRpcmVjdDE2KExQTVNHQk9YUEFSQU1TMTYpOworSU5UMzIgICAgICAgV0lOQVBJIE1lc3NhZ2VCb3hJbmRpcmVjdDMyQShMUE1TR0JPWFBBUkFNUzMyQSk7CitJTlQzMiAgICAgICBXSU5BUEkgTWVzc2FnZUJveEluZGlyZWN0MzJXKExQTVNHQk9YUEFSQU1TMzJXKTsKKyNkZWZpbmUgICAgIE1lc3NhZ2VCb3hJbmRpcmVjdCBXSU5FTElCX05BTUVfQVcoTWVzc2FnZUJveEluZGlyZWN0KQogQk9PTDE2ICAgICAgV0lOQVBJIE1vZGlmeU1lbnUxNihITUVOVTE2LFVJTlQxNixVSU5UMTYsVUlOVDE2LFNFR1BUUik7CiBCT09MMzIgICAgICBXSU5BUEkgTW9kaWZ5TWVudTMyQShITUVOVTMyLFVJTlQzMixVSU5UMzIsVUlOVDMyLExQQ1NUUik7CiBCT09MMzIgICAgICBXSU5BUEkgTW9kaWZ5TWVudTMyVyhITUVOVTMyLFVJTlQzMixVSU5UMzIsVUlOVDMyLExQQ1dTVFIpOwpAQCAtNzI5Miw2ICs3NDcxLDkgQEAKIEJPT0wxNiAgICAgIFdJTkFQSSBQYXRCbHQxNihIREMxNixJTlQxNixJTlQxNixJTlQxNixJTlQxNixEV09SRCk7CiBCT09MMzIgICAgICBXSU5BUEkgUGF0Qmx0MzIoSERDMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsRFdPUkQpOwogI2RlZmluZSAgICAgUGF0Qmx0IFdJTkVMSUJfTkFNRShQYXRCbHQpCitIUkdOMTYgICAgICBXSU5BUEkgUGF0aFRvUmVnaW9uMTYoSERDMTYpOworSFJHTjMyICAgICAgV0lOQVBJIFBhdGhUb1JlZ2lvbjMyKEhEQzMyKTsKKyNkZWZpbmUgICAgIFBhdGhUb1JlZ2lvbiBXSU5FTElCX05BTUUoUGF0aFRvUmVnaW9uKQogQk9PTDE2ICAgICAgV0lOQVBJIFBlZWtNZXNzYWdlMTYoTFBNU0cxNixIV05EMTYsVUlOVDE2LFVJTlQxNixVSU5UMTYpOwogQk9PTDMyICAgICAgV0lOQVBJIFBlZWtNZXNzYWdlMzJBKExQTVNHMzIsSFdORDMyLFVJTlQzMixVSU5UMzIsVUlOVDMyKTsKIEJPT0wzMiAgICAgIFdJTkFQSSBQZWVrTWVzc2FnZTMyVyhMUE1TRzMyLEhXTkQzMixVSU5UMzIsVUlOVDMyLFVJTlQzMik7CkBAIC03NDY5LDYgKzc2NTEsOSBAQAogSU5UMzIgICAgICAgV0lOQVBJIFNjcm9sbFdpbmRvd0V4MzIoSFdORDMyLElOVDMyLElOVDMyLGNvbnN0IFJFQ1QzMiosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUMzIqLEhSR04zMixMUFJFQ1QzMixVSU5UMzIpOwogI2RlZmluZSAgICAgU2Nyb2xsV2luZG93RXggV0lORUxJQl9OQU1FKFNjcm9sbFdpbmRvd0V4KQorQk9PTDE2ICAgICAgV0lOQVBJIFNlbGVjdENsaXBQYXRoMTYoSERDMTYsSU5UMTYpOworQk9PTDMyICAgICAgV0lOQVBJIFNlbGVjdENsaXBQYXRoMzIoSERDMzIsSU5UMzIpOworI2RlZmluZSAgICAgU2VsZWN0Q2xpcFBhdGggV0lORUxJQl9OQU1FKFNlbGVjdENsaXBQYXRoKQogSU5UMTYgICAgICAgV0lOQVBJIFNlbGVjdENsaXBSZ24xNihIREMxNixIUkdOMTYpOwogSU5UMzIgICAgICAgV0lOQVBJIFNlbGVjdENsaXBSZ24zMihIREMzMixIUkdOMzIpOwogI2RlZmluZSAgICAgU2VsZWN0Q2xpcFJnbiBXSU5FTElCX05BTUUoU2VsZWN0Q2xpcFJnbikKQEAgLTc0ODYsNiArNzY3MSwxMyBAQAogTFJFU1VMVCAgICAgV0lOQVBJIFNlbmRNZXNzYWdlMzJBKEhXTkQzMixVSU5UMzIsV1BBUkFNMzIsTFBBUkFNKTsKIExSRVNVTFQgICAgIFdJTkFQSSBTZW5kTWVzc2FnZTMyVyhIV05EMzIsVUlOVDMyLFdQQVJBTTMyLExQQVJBTSk7CiAjZGVmaW5lICAgICBTZW5kTWVzc2FnZSBXSU5FTElCX05BTUVfQVcoU2VuZE1lc3NhZ2UpCitMUkVTVUxUICAgICBXSU5BUEkgU2VuZE1lc3NhZ2VUaW1lb3V0MTYoSFdORDE2LFVJTlQxNixXUEFSQU0xNixMUEFSQU0sVUlOVDE2LAorCQkJCQlVSU5UMTYsTFBXT1JEKTsKK0xSRVNVTFQgICAgIFdJTkFQSSBTZW5kTWVzc2FnZVRpbWVvdXQzMkEoSFdORDMyLFVJTlQzMixXUEFSQU0zMixMUEFSQU0sVUlOVDMyLAorCQkJCQkgVUlOVDMyLExQRFdPUkQpOworTFJFU1VMVCAgICAgV0lOQVBJIFNlbmRNZXNzYWdlVGltZW91dDMyVyhIV05EMzIsVUlOVDMyLFdQQVJBTTMyLExQQVJBTSxVSU5UMzIsCisJCQkJCSBVSU5UMzIsTFBEV09SRCk7CisjZGVmaW5lICAgICBTZW5kTWVzc2FnZVRpbWVvdXQgV0lORUxJQl9OQU1FX0FXKFNlbmRNZXNzYWdlVGltZW91dCkKIEhXTkQxNiAgICAgIFdJTkFQSSBTZXRBY3RpdmVXaW5kb3cxNihIV05EMTYpOwogSFdORDMyICAgICAgV0lOQVBJIFNldEFjdGl2ZVdpbmRvdzMyKEhXTkQzMik7CiAjZGVmaW5lICAgICBTZXRBY3RpdmVXaW5kb3cgV0lORUxJQl9OQU1FKFNldEFjdGl2ZVdpbmRvdykKQEAgLTc1NDIsNiArNzczNCw5IEBACiBCT09MMTYgICAgICBXSU5BUEkgU2V0RGVza1dhbGxQYXBlcjE2KExQQ1NUUik7CiBCT09MMzIgICAgICBXSU5BUEkgU2V0RGVza1dhbGxQYXBlcjMyKExQQ1NUUik7CiAjZGVmaW5lICAgICBTZXREZXNrV2FsbFBhcGVyIFdJTkVMSUJfTkFNRShTZXREZXNrV2FsbFBhcGVyKQorVUlOVDE2ICAgICAgV0lOQVBJIFNldERJQkNvbG9yVGFibGUxNihIREMxNixVSU5UMTYsVUlOVDE2LFJHQlFVQUQqKTsKK1VJTlQzMiAgICAgIFdJTkFQSSBTZXRESUJDb2xvclRhYmxlMzIoSERDMzIsVUlOVDMyLFVJTlQzMixSR0JRVUFEKik7CisjZGVmaW5lICAgICBTZXRESUJDb2xvclRhYmxlIFdJTkVMSUJfTkFNRShTZXRESUJDb2xvclRhYmxlKQogSU5UMTYgICAgICAgV0lOQVBJIFNldERJQml0czE2KEhEQzE2LEhCSVRNQVAxNixVSU5UMTYsVUlOVDE2LExQQ1ZPSUQsY29uc3QgQklUTUFQSU5GTyosVUlOVDE2KTsKIElOVDMyICAgICAgIFdJTkFQSSBTZXRESUJpdHMzMihIREMzMixIQklUTUFQMzIsVUlOVDMyLFVJTlQzMixMUENWT0lELGNvbnN0IEJJVE1BUElORk8qLFVJTlQzMik7CiAjZGVmaW5lICAgICBTZXRESUJpdHMgV0lORUxJQl9OQU1FKFNldERJQml0cykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZXJyb3IuaCBiL2luY2x1ZGUvd2luZXJyb3IuaAppbmRleCBjZTFhM2ZlLi5kZDJmM2YzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmVycm9yLmgKKysrIGIvaW5jbHVkZS93aW5lcnJvci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjZGVmaW5lIEVSUk9SX1RPT19NQU5ZX09QRU5fRklMRVMgICA0CiAjZGVmaW5lIEVSUk9SX0FDQ0VTU19ERU5JRUQgICAgICAgICA1CiAjZGVmaW5lIEVSUk9SX0lOVkFMSURfSEFORExFICAgICAgICA2CisjZGVmaW5lIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZICAgICA4CiAjZGVmaW5lIEVSUk9SX0JBRF9GT1JNQVQgICAgICAgICAgICAxMQogI2RlZmluZSBFUlJPUl9PVVRPRk1FTU9SWSAgICAgICAgICAgMTQKICNkZWZpbmUgRVJST1JfTk9fTU9SRV9GSUxFUyAgICAgICAgIDE4CkBAIC0yOCw2ICsyOSw3IEBACiAjZGVmaW5lIEVSUk9SX0JST0tFTl9QSVBFICAgICAgICAgICAxMDkKICNkZWZpbmUgRVJST1JfRElTS19GVUxMICAgICAgICAgICAgIDExMgogI2RlZmluZSBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCAgMTIwCisjZGVmaW5lIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIgICAxMjIKICNkZWZpbmUgRVJST1JfU0VFS19PTl9ERVZJQ0UgICAgICAgIDEzMgogI2RlZmluZSBFUlJPUl9ESVJfTk9UX0VNUFRZICAgICAgICAgMTQ1CiAjZGVmaW5lIEVSUk9SX0JVU1kgICAgICAgICAgICAgICAgICAxNzAKQEAgLTM1LDkgKzM3LDIyIEBACiAjZGVmaW5lIEVSUk9SX0ZJTEVOQU1FX0VYQ0VEX1JBTkdFICAyMDYKICNkZWZpbmUgRVJST1JfTU9SRV9EQVRBICAgICAgICAgICAgIDIzNAogI2RlZmluZSBFUlJPUl9OT19NT1JFX0lURU1TICAgICAgICAgMjU5CisjZGVmaW5lIEVSUk9SX0lOVkFMSURfQUREUkVTUyAgICAgICA0ODcKKyNkZWZpbmUgRVJST1JfQ0FOX05PVF9DT01QTEVURSAgICAgIDEwMDMKICNkZWZpbmUgRVJST1JfSU9fREVWSUNFICAgICAgICAgICAgIDExMTcKICNkZWZpbmUgRVJST1JfUE9TU0lCTEVfREVBRExPQ0sgICAgIDExMzEKICNkZWZpbmUgRVJST1JfQkFEX0RFVklDRSAgICAgICAgICAgIDEyMDAKICNkZWZpbmUgRVJST1JfTk9fTkVUV09SSyAgICAgICAgICAgIDEyMjIKKyNkZWZpbmUgRVJST1JfQ09NTUlUTUVOVF9MSU1JVCAgICAgIDE0NTUKKworLyogSFJFU1VMVCB2YWx1ZXMgZm9yIE9MRSwgU0hFTEwgYW5kIG90aGVyIEludGVyZmFjZSBzdHVmZiAqLworI2RlZmluZQlOT0VSUk9SCQkJCTAKKyNkZWZpbmUJU19PSwkJCQkwCisjZGVmaW5lCUVfVU5FWFBFQ1RFRAkJCTB4ODAwMEZGRkYKKyNkZWZpbmUJRV9PVVRPRk1FTU9SWQkJCTB4ODAwNzAwMEUKKyNkZWZpbmUJRV9JTlZBTElEQVJHCQkJMHg4MDA3MDA1NworCisjZGVmaW5lCU9MRV9FX0VOVU1fTk9NT1JFCQkweDgwMDQwMDAyCisjZGVmaW5lCUNMQVNTX0VfQ0xBU1NOT1RBVkFJTEFCTEUJMHg4MDA0MDExMQogCiAjZW5kaWYgIC8qIF9fV0lORV9XSU5FUlJPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbm50LmggYi9pbmNsdWRlL3dpbm50LmgKaW5kZXggYTIzZGYxNC4uMGQ1MzI5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5udC5oCisrKyBiL2luY2x1ZGUvd2lubnQuaApAQCAtMjQsNiArMjQsMTIgQEAKICNkZWZpbmUgSEVBUF9XSU5FX1NFR1BUUiAgICAgICAgICAgICAgICAweDAxMDAwMDAwICAvKiBOb3QgYSBXaW4zMiBmbGFnICovCiAjZGVmaW5lIEhFQVBfV0lORV9DT0RFU0VHICAgICAgICAgICAgICAgMHgwMjAwMDAwMCAgLyogTm90IGEgV2luMzIgZmxhZyAqLwogCisvKiBQcm9jZXNzb3IgZmVhdHVyZSBmbGFncy4gICovCisjZGVmaW5lIFBGX0ZMT0FUSU5HX1BPSU5UX1BSRUNJU0lPTl9FUlJBVEEgICAgMAorI2RlZmluZSBQRl9GTE9BVElOR19QT0lOVF9FTVVMQVRFRCAgICAgICAgICAgIDEKKyNkZWZpbmUgUEZfQ09NUEFSRV9FWENIQU5HRV9ET1VCTEUgICAgICAgICAgICAyCisjZGVmaW5lIFBGX01NWF9JTlNUUlVDVElPTlNfQVZBSUxBQkxFICAgICAgICAgMworCiAvKiBUaGUgV2luMzIgcmVnaXN0ZXIgY29udGV4dCAqLwogCiAjZGVmaW5lIENPTlRFWFRfaTM4NiAgICAgIDB4MDAwMTAwMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2lucG9zLmggYi9pbmNsdWRlL3dpbnBvcy5oCmluZGV4IGYwNzQzMWUuLmE1NzJkOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2lucG9zLmgKKysrIGIvaW5jbHVkZS93aW5wb3MuaApAQCAtNDEsNSArNDEsOCBAQAogZXh0ZXJuIExPTkcgV0lOUE9TX0hhbmRsZVdpbmRvd1Bvc0NoYW5naW5nMTYoV05EICp3bmRQdHIsIFdJTkRPV1BPUzE2ICp3aW5wb3MpOwogZXh0ZXJuIExPTkcgV0lOUE9TX0hhbmRsZVdpbmRvd1Bvc0NoYW5naW5nMzIoV05EICp3bmRQdHIsIFdJTkRPV1BPUzMyICp3aW5wb3MpOwogZXh0ZXJuIElOVDE2IFdJTlBPU19XaW5kb3dGcm9tUG9pbnQoIFdORCogc2NvcGVXbmQsIFBPSU5UMTYgcHQsIFdORCAqKnBwV25kICk7CitleHRlcm4gdm9pZCBXSU5QT1NfQ2hlY2tJbnRlcm5hbFBvcyggSFdORDMyIGh3bmQgKTsKK2V4dGVybiBCT09MMzIgV0lOUE9TX0FjdGl2YXRlT3RoZXJXaW5kb3coV05EKiBwV25kKTsKK2V4dGVybiBCT09MMzIgV0lOUE9TX0NyZWF0ZUludGVybmFsUG9zQXRvbSh2b2lkKTsKIAogI2VuZGlmICAvKiBfX1dJTkVfV0lOUE9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luc29jay5oIGIvaW5jbHVkZS93aW5zb2NrLmgKaW5kZXggZDIwMjY1NS4uZWRlZTI1MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5zb2NrLmgKKysrIGIvaW5jbHVkZS93aW5zb2NrLmgKQEAgLTYxLDQ2ICs2MSw2MiBAQAogewogICAgICAgICBVSU5UMTYgICAgZmRfY291bnQ7ICAgICAgICAgICAgICAgLyogaG93IG1hbnkgYXJlIFNFVD8gKi8KICAgICAgICAgU09DS0VUMTYgIGZkX2FycmF5W0ZEX1NFVFNJWkVdOyAgIC8qIGFuIGFycmF5IG9mIFNPQ0tFVHMgKi8KLX0gd3NfZmRfc2V0OworfSB3c19mZF9zZXQxNjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgICAgVUlOVDMyICAgIGZkX2NvdW50OyAgICAgICAgICAgICAgIC8qIGhvdyBtYW55IGFyZSBTRVQ/ICovCisgICAgICAgIFNPQ0tFVDMyICBmZF9hcnJheVtGRF9TRVRTSVpFXTsgICAvKiBhbiBhcnJheSBvZiBTT0NLRVRzICovCit9IHdzX2ZkX3NldDMyOwogCiAvKiB3c19mZF9zZXQgb3BlcmF0aW9ucyAqLwogCi1JTlQxNiBXSU5BUEkgX19XU0FGRElzU2V0MTYoIFNPQ0tFVDE2LCB3c19mZF9zZXQgKiApOwotSU5UMzIgV0lOQVBJIF9fV1NBRkRJc1NldDMyKCBTT0NLRVQzMiwgd3NfZmRfc2V0ICogKTsKK0lOVDE2IFdJTkFQSSBfX1dTQUZESXNTZXQxNiggU09DS0VUMTYsIHdzX2ZkX3NldDE2ICogKTsKK0lOVDMyIFdJTkFQSSBfX1dTQUZESXNTZXQzMiggU09DS0VUMzIsIHdzX2ZkX3NldDMyICogKTsKICNkZWZpbmUgX19XU0FGRElzU2V0IFdJTkVMSUJfTkFNRShfX1dTQUZESXNTZXQpOwogCi0jZGVmaW5lIFdTX0ZEX0NMUihmZCwgc2V0KSBkbyB7IFwKKyNkZWZpbmUgX19XU19GRF9DTFIoZmQsIHNldCwgY2FzdCkgZG8geyBcCiAgICAgVUlOVDE2IF9faTsgXAotICAgIGZvciAoX19pID0gMDsgX19pIDwgKCh3c19mZF9zZXQqKShzZXQpKS0+ZmRfY291bnQgOyBfX2krKykgXAorICAgIGZvciAoX19pID0gMDsgX19pIDwgKChjYXN0Kikoc2V0KSktPmZkX2NvdW50IDsgX19pKyspIFwKICAgICB7IFwKLSAgICAgICAgaWYgKCgod3NfZmRfc2V0Kikoc2V0KSktPmZkX2FycmF5W19faV0gPT0gZmQpIFwKKyAgICAgICAgaWYgKCgoY2FzdCopKHNldCkpLT5mZF9hcnJheVtfX2ldID09IGZkKSBcCiAJeyBcCi0gICAgICAgICAgICB3aGlsZSAoX19pIDwgKCh3c19mZF9zZXQqKShzZXQpKS0+ZmRfY291bnQtMSkgXAorICAgICAgICAgICAgd2hpbGUgKF9faSA8ICgoY2FzdCopKHNldCkpLT5mZF9jb3VudC0xKSBcCiAJICAgIHsgXAotICAgICAgICAgICAgICAgICgod3NfZmRfc2V0Kikoc2V0KSktPmZkX2FycmF5W19faV0gPSBcCi0gICAgICAgICAgICAgICAgICAgICgod3NfZmRfc2V0Kikoc2V0KSktPmZkX2FycmF5W19faSsxXTsgXAorICAgICAgICAgICAgICAgICgoY2FzdCopKHNldCkpLT5mZF9hcnJheVtfX2ldID0gXAorICAgICAgICAgICAgICAgICAgICAoKGNhc3QqKShzZXQpKS0+ZmRfYXJyYXlbX19pKzFdOyBcCiAgICAgICAgICAgICAgICAgX19pKys7IFwKICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgKCh3c19mZF9zZXQqKShzZXQpKS0+ZmRfY291bnQtLTsgXAorICAgICAgICAgICAgKChjYXN0Kikoc2V0KSktPmZkX2NvdW50LS07IFwKICAgICAgICAgICAgIGJyZWFrOyBcCiAgICAgICAgIH0gXAogICAgIH0gXAogfSB3aGlsZSgwKQorI2RlZmluZSBXU19GRF9DTFIxNihmZCwgc2V0KQlfX1dTX0ZEX0NMUigoZmQpLChzZXQpLCB3c19mZF9zZXQxNikKKyNkZWZpbmUgV1NfRkRfQ0xSMzIoZmQsIHNldCkJX19XU19GRF9DTFIoKGZkKSwoc2V0KSwgd3NfZmRfc2V0MzIpCisjZGVmaW5lIFdTX0ZEX0NMUiAJCVdJTkVMSUJfTkFNRShXU19GRF9DTFIpOwogCi0jZGVmaW5lIFdTX0ZEX1NFVChmZCwgc2V0KSBkbyB7IFwKLSAgICBpZiAoKCh3c19mZF9zZXQqKShzZXQpKS0+ZmRfY291bnQgPCBGRF9TRVRTSVpFKSBcCi0gICAgICAgICgod3NfZmRfc2V0Kikoc2V0KSktPmZkX2FycmF5Wygod3NfZmRfc2V0Kikoc2V0KSktPmZkX2NvdW50KytdPShmZCk7XAorI2RlZmluZSBfX1dTX0ZEX1NFVChmZCwgc2V0LCBjYXN0KSBkbyB7IFwKKyAgICBpZiAoKChjYXN0Kikoc2V0KSktPmZkX2NvdW50IDwgRkRfU0VUU0laRSkgXAorICAgICAgICAoKGNhc3QqKShzZXQpKS0+ZmRfYXJyYXlbKChjYXN0Kikoc2V0KSktPmZkX2NvdW50KytdPShmZCk7XAogfSB3aGlsZSgwKQorI2RlZmluZSBXU19GRF9TRVQxNihmZCwgc2V0KSAgICBfX1dTX0ZEX1NFVCgoZmQpLChzZXQpLCB3c19mZF9zZXQxNikKKyNkZWZpbmUgV1NfRkRfU0VUMzIoZmQsIHNldCkgICAgX19XU19GRF9TRVQoKGZkKSwoc2V0KSwgd3NfZmRfc2V0MzIpCisjZGVmaW5lIFdTX0ZEX1NFVAkJV0lORUxJQl9OQU1FKFdTX0ZEX1NFVCk7CiAKLSNkZWZpbmUgV1NfRkRfWkVSTyhzZXQpICgoKHdzX2ZkX3NldCopKHNldCkpLT5mZF9jb3VudD0wKQorI2RlZmluZSBXU19GRF9aRVJPMTYoc2V0KSAoKCh3c19mZF9zZXQxNiopKHNldCkpLT5mZF9jb3VudD0wKQorI2RlZmluZSBXU19GRF9aRVJPMzIoc2V0KSAoKCh3c19mZF9zZXQzMiopKHNldCkpLT5mZF9jb3VudD0wKQorI2RlZmluZSBXU19GRF9aRVJPCQlXSU5FTElCX05BTUUoV1NfRkRfWkVSTyk7CiAKLSNkZWZpbmUgV1NfRkRfSVNTRVQoZmQsIHNldCkgX19XU0FGRElzU2V0KChTT0NLRVQxNikoZmQpLCAod3NfZmRfc2V0Kikoc2V0KSkKKyNkZWZpbmUgV1NfRkRfSVNTRVQxNihmZCwgc2V0KSBfX1dTQUZESXNTZXQxNigoU09DS0VUMTYpKGZkKSwgKHdzX2ZkX3NldDE2Kikoc2V0KSkKKyNkZWZpbmUgV1NfRkRfSVNTRVQzMihmZCwgc2V0KSBfX1dTQUZESXNTZXQzMigoU09DS0VUMzIpKGZkKSwgKHdzX2ZkX3NldDMyKikoc2V0KSkKKyNkZWZpbmUgV1NfRkRfSVNTRVQJCVdJTkVMSUJfTkFNRShXU19GRF9JU1NFVCk7CiAKIC8qIAogICogSW50ZXJuZXQgYWRkcmVzcyAob2xkIHN0eWxlLi4uIHNob3VsZCBiZSB1cGRhdGVkKSAKICAqLwogCi10eXBlZGVmIHN0cnVjdCB3c19hZGRyX2luCitzdHJ1Y3Qgd3NfaW5fYWRkcgogewogICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICAgICAgc3RydWN0IHsgQllURSAgIHNfYjEsc19iMixzX2IzLHNfYjQ7IH0gU191bl9iOwpAQCAtMTEzLDE1ICsxMjksMTUgQEAKICNkZWZpbmUgd3NfaW1wICAgU191bi5TX3VuX3cuc193MgkvKiBpbXAgKi8KICNkZWZpbmUgd3NfaW1wbm8gU191bi5TX3VuX2Iuc19iNAkvKiBpbXAgIyAqLwogI2RlZmluZSB3c19saCAgICBTX3VuLlNfdW5fYi5zX2IzCS8qIGxvZ2ljYWwgaG9zdCAqLwotfSBfd3NfaW5fYWRkcjsKK307CiAKLXR5cGVkZWYgc3RydWN0IHdzX3NvY2thZGRyX2luCitzdHJ1Y3Qgd3Nfc29ja2FkZHJfaW4KIHsKICAgICAgICAgSU5UMTYJCXNpbl9mYW1pbHk7CiAgICAgICAgIFVJTlQxNiAJCXNpbl9wb3J0OwotICAgICAgICBfd3NfaW5fYWRkciAJc2luX2FkZHI7Ci0gICAgICAgIGNoYXIgICAgCXNpbl96ZXJvWzhdOwotfSBfd3Nfc29ja2FkZHJfaW47CisgICAgICAgIHN0cnVjdCB3c19pbl9hZGRyIHNpbl9hZGRyOworICAgICAgICBCWVRFICAgIAlzaW5femVyb1s4XTsKK307CiAKICNkZWZpbmUgV1NBREVTQ1JJUFRJT05fTEVOICAgICAgMjU2CiAjZGVmaW5lIFdTQVNZU19TVEFUVVNfTEVOICAgICAgIDEyOApAQCAtMzU2LDI3ICszNzIsNTEgQEAKIEZBUlBST0MxNiBXSU5BUEkgV1NBU2V0QmxvY2tpbmdIb29rMTYoRkFSUFJPQzE2IGxwQmxvY2tGdW5jKTsKIEZBUlBST0MzMiBXSU5BUEkgV1NBU2V0QmxvY2tpbmdIb29rMzIoRkFSUFJPQzMyIGxwQmxvY2tGdW5jKTsKICNkZWZpbmUgICBXU0FTZXRCbG9ja2luZ0hvb2sgV0lORUxJQl9OQU1FKFdTQVNldEJsb2NraW5nSG9vaykKLUhBTkRMRTE2ICBXSU5BUEkgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lLCBMUENTVFIgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIgYnVmLCBJTlQxNiBidWZsZW4pOwogCi1IQU5ETEUxNiAgV0lOQVBJIFdTQUFzeW5jR2V0U2VydkJ5UG9ydChIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIElOVDE2IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgcHJvdG8sIFNFR1BUUiBidWYsIElOVDE2IGJ1Zmxlbik7CitIQU5ETEUxNiAgV0lOQVBJIFdTQUFzeW5jR2V0U2VydkJ5TmFtZTE2KEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgTFBDU1RSIG5hbWUsIExQQ1NUUiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSIGJ1ZiwgSU5UMTYgYnVmbGVuKTsKK0hBTkRMRTMyICBXSU5BUEkgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lMzIoSFdORDMyIGhXbmQsIFVJTlQzMiB1TXNnLCBMUENTVFIgbmFtZSwgTFBDU1RSIHByb3RvLAorCQkJCQkgTFBTVFIgc2J1ZiwgSU5UMzIgYnVmbGVuKTsKKyNkZWZpbmUgICBXU0FBc3luY0dldFNlcnZCeU5hbWUgV0lORUxJQl9OQU1FKFdTQUFzeW5jR2V0U2VydkJ5TmFtZSkKIAotSEFORExFMTYgIFdJTkFQSSBXU0FBc3luY0dldFByb3RvQnlOYW1lKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgbmFtZSwgU0VHUFRSIGJ1ZiwgSU5UMTYgYnVmbGVuKTsKK0hBTkRMRTE2ICBXSU5BUEkgV1NBQXN5bmNHZXRTZXJ2QnlQb3J0MTYoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLCBJTlQxNiBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgcHJvdG8sIFNFR1BUUiBidWYsIElOVDE2IGJ1Zmxlbik7CitIQU5ETEUzMiAgV0lOQVBJIFdTQUFzeW5jR2V0U2VydkJ5UG9ydDMyKEhXTkQzMiBoV25kLCBVSU5UMzIgdU1zZywgSU5UMzIgcG9ydCwKKwkJCQkJIExQQ1NUUiBwcm90bywgTFBTVFIgc2J1ZiwgSU5UMzIgYnVmbGVuKTsKKyNkZWZpbmUgICBXU0FBc3luY0dldFNlcnZCeVBvcnQgV0lORUxJQl9OQU1FKFdTQUFzeW5jR2V0U2VydkJ5UG9ydCkKIAotSEFORExFMTYgIFdJTkFQSSBXU0FBc3luY0dldFByb3RvQnlOdW1iZXIoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgbnVtYmVyLCBTRUdQVFIgYnVmLCBJTlQxNiBidWZsZW4pOworSEFORExFMTYgIFdJTkFQSSBXU0FBc3luY0dldFByb3RvQnlOYW1lMTYoSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIG5hbWUsIFNFR1BUUiBidWYsIElOVDE2IGJ1Zmxlbik7CitIQU5ETEUzMiAgV0lOQVBJIFdTQUFzeW5jR2V0UHJvdG9CeU5hbWUzMihIV05EMzIgaFduZCwgVUlOVDMyIHVNc2csCisJCQkJCSAgTFBDU1RSIG5hbWUsIExQU1RSIHNidWYsIElOVDMyIGJ1Zmxlbik7CisjZGVmaW5lICAgV1NBQXN5bmNHZXRQcm90b0J5QnlOYW1lIFdJTkVMSUJfTkFNRShXU0FBc3luY0dldFByb3RvQnlCeU5hbWUpCiAKLUhBTkRMRTE2ICBXSU5BUEkgV1NBQXN5bmNHZXRIb3N0QnlOYW1lKEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lLCBTRUdQVFIgYnVmLCBJTlQxNiBidWZsZW4pOworSEFORExFMTYgIFdJTkFQSSBXU0FBc3luY0dldFByb3RvQnlOdW1iZXIxNihIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IG51bWJlciwgU0VHUFRSIGJ1ZiwgSU5UMTYgYnVmbGVuKTsKK0hBTkRMRTMyICBXSU5BUEkgV1NBQXN5bmNHZXRQcm90b0J5TnVtYmVyMzIoSFdORDMyIGhXbmQsIFVJTlQzMiB1TXNnLAorCQkJCQkgICAgSU5UMzIgbnVtYmVyLCBMUFNUUiBzYnVmLCBJTlQzMiBidWZsZW4pOworI2RlZmluZSAgIFdTQUFzeW5jR2V0UHJvdG9CeU51bWJlciBXSU5FTElCX05BTUUoV1NBQXN5bmNHZXRQcm90b0J5TnVtYmVyKQogCi1IQU5ETEUxNiAgV0lOQVBJIFdTQUFzeW5jR2V0SG9zdEJ5QWRkcihIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIExQQ1NUUiBhZGRyLAorSEFORExFMTYgIFdJTkFQSSBXU0FBc3luY0dldEhvc3RCeU5hbWUxNihIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBuYW1lLCBTRUdQVFIgYnVmLCBJTlQxNiBidWZsZW4pOworSEFORExFMzIgIFdJTkFQSSBXU0FBc3luY0dldEhvc3RCeU5hbWUzMihIV05EMzIgaFduZCwgVUlOVDMyIHVNc2csCisJCQkJCSBMUENTVFIgbmFtZSwgTFBTVFIgc2J1ZiwgSU5UMzIgYnVmbGVuKTsKKyNkZWZpbmUgICBXU0FBc3luY0dldEhvc3RCeU5hbWUgV0lORUxJQl9OQU1FKFdTQUFzeW5jR2V0SG9zdEJ5TmFtZSkKKworSEFORExFMTYgIFdJTkFQSSBXU0FBc3luY0dldEhvc3RCeUFkZHIxNihIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIExQQ1NUUiBhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgbGVuLCBJTlQxNiB0eXBlLCBTRUdQVFIgYnVmLCBJTlQxNiBidWZsZW4pOwotSU5UMTYgCSAgV0lOQVBJIFdTQUNhbmNlbEFzeW5jUmVxdWVzdChIQU5ETEUxNiBoQXN5bmNUYXNrSGFuZGxlKTsKLUlOVDE2ICAgICBXSU5BUEkgV1NBQXN5bmNTZWxlY3QoU09DS0VUMTYgcywgSFdORDE2IGhXbmQsIFVJTlQxNiB3TXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgbEV2ZW50KTsKK0hBTkRMRTMyICBXSU5BUEkgV1NBQXN5bmNHZXRIb3N0QnlBZGRyMzIoSFdORDMyIGhXbmQsIFVJTlQzMiB1TXNnLCBMUENTVFIgYWRkciwKKwkJCSAgICAgIElOVDMyIGxlbiwgSU5UMzIgdHlwZSwgTFBTVFIgc2J1ZiwgSU5UMzIgYnVmbGVuKTsKKyNkZWZpbmUgICBXU0FBc3luY0dldEhvc3RCeUFkZHIgV0lORUxJQl9OQU1FKFdTQUFzeW5jR2V0SG9zdEJ5QWRkcikKKworSU5UMTYgCSAgV0lOQVBJIFdTQUNhbmNlbEFzeW5jUmVxdWVzdDE2KEhBTkRMRTE2IGhBc3luY1Rhc2tIYW5kbGUpOworSU5UMzIgICAgIFdJTkFQSSBXU0FDYW5jZWxBc3luY1JlcXVlc3QzMihIQU5ETEUzMiBoQXN5bmNUYXNrSGFuZGxlKTsKKyNkZWZpbmUgICBXU0FDYW5jZWxBc3luY1JlcXVlc3QgV0lORUxJQl9OQU1FKFdTQUNhbmNlbEFzeW5jUmVxdWVzdCkKKworSU5UMTYgICAgIFdJTkFQSSBXU0FBc3luY1NlbGVjdDE2KFNPQ0tFVDE2IHMsIEhXTkQxNiBoV25kLCBVSU5UMTYgd01zZywgVUlOVDMyIGxFdmVudCk7CitJTlQzMiAgICAgV0lOQVBJIFdTQUFzeW5jU2VsZWN0MzIoU09DS0VUMzIgcywgSFdORDMyIGhXbmQsIFVJTlQzMiB1TXNnLCBVSU5UMzIgbEV2ZW50KTsKKyNkZWZpbmUgICBXU0FBc3luY1NlbGVjdCBXSU5FTElCX05BTUUoV1NBQXN5bmNTZWxlY3QpCisKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CkBAIC00NTgsMTIgKzQ5OCwxOCBAQAogCiAgIC8qIGN1c3RvbSBkYXRhICovCiAKLSAgSFdORDE2ICAgICAgICBoV25kOwkJCQkvKiBoV25kIHRvIHBvc3QgKi8gCi0gIFVJTlQxNiAgICAgICAgdU1zZzsJCQkJLyogdU1zZyBtZXNzYWdlIHRvLiAqLworICBIV05EMzIgICAgICAgIGhXbmQ7CQkJCS8qIGhXbmQgdG8gcG9zdCAqLyAKKyAgVUlOVDMyICAgICAgICB1TXNnOwkJCQkvKiB1TXNnIG1lc3NhZ2UgdG8uICovCiAKLSAgU0VHUFRSCWJ1ZmZlcl9iYXNlOwkJCS8qIGJ1ZmZlciB0byBjb3B5IHJlc3VsdCB0byAqLwotICBVSU5UMTYgICAgICAgIGJ1ZmxlbjsKLSAgVUlOVDE2CWZsYWdzOwkJCQkvKiBXU01TR19BU1lOQ18uLi4gKi8KKyAgdW5pb24gCisgIHsKKyAgICBTRUdQVFIgc2VnX2Jhc2U7CisgICAgTFBTVFIgIGxpbl9iYXNlOworICAgIHZvaWQqICBwdHJfYmFzZTsKKyAgfSAJCWI7CQkJCS8qIGJ1ZmZlciB0byBjb3B5IHJlc3VsdCB0byAqLworCisgIFVJTlQzMiAgICAgICAgYnVmbGVuOworICBVSU5UMzIJZmxhZ3M7CQkJCS8qIFdTTVNHX0FTWU5DXy4uLiAqLwogfSB3c19hc3luY19vcDsKIAogI2RlZmluZSBXU01TR19BU1lOQ19IT1NUQllOQU1FICAweDAwMDEKQEAgLTQ3Miw2ICs1MTgsNyBAQAogI2RlZmluZSBXU01TR19BU1lOQ19QUk9UT0JZTlVNICAweDAwMjAKICNkZWZpbmUgV1NNU0dfQVNZTkNfU0VSVkJZTkFNRSAgMHgwMTAwCiAjZGVmaW5lIFdTTVNHX0FTWU5DX1NFUlZCWVBPUlQgIDB4MDIwMAorI2RlZmluZSBXU01TR19BU1lOQ19XSU4zMgkweDEwMDAKICNkZWZpbmUgV1NNU0dfREVBRF9BT1AJCTB4ODAwMAogCiB0eXBlZGVmIHN0cnVjdCBfX3NvcAkvKiBXU0FBc3luY1NlbGVjdCgpIGNvbnRyb2wgc3RydWN0ICovCkBAIC00NzksOCArNTI2LDggQEAKICAgc3RydWN0IF9fc29wICpuZXh0LCAqcHJldjsKIAogICBzdHJ1Y3QgX193cyogIHB3czsKLSAgSFdORDE2ICAgICAgICBoV25kOwotICBVSU5UMTYgICAgICAgIHVNc2c7CisgIEhXTkQzMiAgICAgICAgaFduZDsKKyAgVUlOVDMyICAgICAgICB1TXNnOwogfSB3c19zZWxlY3Rfb3A7CiAKIHR5cGVkZWYgc3RydWN0CV9fd3MJLyogc29ja2V0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnR5cGVzLmggYi9pbmNsdWRlL3dpbnR5cGVzLmgKaW5kZXggNTA5MjE1Ny4uYTVhYjU1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW50eXBlcy5oCisrKyBiL2luY2x1ZGUvd2ludHlwZXMuaApAQCAtODgsNiArODgsNyBAQAogdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgVUlOVDMyOwogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgV09SRDsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIERXT1JEOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgVUxPTkc7CiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBCWVRFOwogdHlwZWRlZiBsb25nICAgICAgICAgICAgTE9ORzsKIHR5cGVkZWYgY2hhciAgICAgICAgICAgIENIQVI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3gxMWRydi5oIGIvaW5jbHVkZS94MTFkcnYuaAppbmRleCBkYTM1ODhmLi4wZGI2Yjg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3gxMWRydi5oCisrKyBiL2luY2x1ZGUveDExZHJ2LmgKQEAgLTE0LDYgKzE0LDggQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgaW50ICAgICAgICAgIHN0eWxlOworICAgIGludCAgICAgICAgICBlbmRjYXA7CisgICAgaW50ICAgICAgICAgIGxpbmVqb2luOwogICAgIGludCAgICAgICAgICBwaXhlbDsKICAgICBpbnQgICAgICAgICAgd2lkdGg7CiAgICAgY2hhciAqICAgICAgIGRhc2hlczsKZGlmZiAtLWdpdCBhL2xvYWRlci9tb2R1bGUuYyBiL2xvYWRlci9tb2R1bGUuYwppbmRleCBmMzViYWU0Li5jZWJhZWEwIDEwMDY0NAotLS0gYS9sb2FkZXIvbW9kdWxlLmMKKysrIGIvbG9hZGVyL21vZHVsZS5jCkBAIC01MjYsNyArNTI2LDcgQEAKIAogICAgIGlmIChuZV9oZWFkZXIubmVfbWFnaWMgPT0gSU1BR0VfT1MyX1NJR05BVFVSRV9MWCkgewogICAgICAgZnByaW50ZihzdGRlcnIsICJTb3JyeSwgdGhpcyBpcyBhbiBPUy8yIGxpbmVhciBleGVjdXRhYmxlIChMWCkgZmlsZSAhXG4iKTsKLSAgICAgIHJldHVybiAoSE1PRFVMRTMyKTExOworICAgICAgcmV0dXJuIChITU9EVUxFMzIpMTI7CiAgICAgfQogICAgIC8qIFdlIG5vdyBoYXZlIGEgdmFsaWQgTkUgaGVhZGVyICovCiAKQEAgLTE1MDgsOSArMTUwOCw5IEBACiAgKgogICogRklYTUU6IHJvdWdoIGd1ZXNzd29yaywgZG9uJ3Qga25vdyB3aGF0ICJQcml2YXRlIiBtZWFucwogICovCi1ITU9EVUxFMzIgV0lOQVBJIFByaXZhdGVMb2FkTGlicmFyeShMUENTVFIgbGlibmFtZSkKK0hJTlNUQU5DRTMyIFdJTkFQSSBQcml2YXRlTG9hZExpYnJhcnkoTFBDU1RSIGxpYm5hbWUpCiB7Ci0gICAgICAgIHJldHVybiBMb2FkTGlicmFyeTE2KGxpYm5hbWUpOworICAgICAgICByZXR1cm4gKEhJTlNUQU5DRTMyKUxvYWRMaWJyYXJ5MTYobGlibmFtZSk7CiB9CiAKIApAQCAtMTUyOSw5ICsxNTI5LDkgQEAKICAqCiAgKiBGSVhNRTogcm91Z2ggZ3Vlc3N3b3JrLCBkb24ndCBrbm93IHdoYXQgIlByaXZhdGUiIG1lYW5zCiAgKi8KLXZvaWQgV0lOQVBJIFByaXZhdGVGcmVlTGlicmFyeShITU9EVUxFMzIgaGFuZGxlKQordm9pZCBXSU5BUEkgUHJpdmF0ZUZyZWVMaWJyYXJ5KEhJTlNUQU5DRTMyIGhhbmRsZSkKIHsKLQlGcmVlTGlicmFyeTE2KGhhbmRsZSk7CisJRnJlZUxpYnJhcnkxNigoSElOU1RBTkNFMTYpaGFuZGxlKTsKIH0KIAogCmRpZmYgLS1naXQgYS9sb2FkZXIvbmVfaW1hZ2UuYyBiL2xvYWRlci9uZV9pbWFnZS5jCmluZGV4IGQ0MmU1YmMuLjk4YThhOWMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9uZV9pbWFnZS5jCisrKyBiL2xvYWRlci9uZV9pbWFnZS5jCkBAIC01NSw4ICs1NSw4IEBACiAgICAgaWYgKCFwU2VnLT5maWxlcG9zKSByZXR1cm4gVFJVRTsgIC8qIE5vIGZpbGUgaW1hZ2UsIGp1c3QgcmV0dXJuICovCiAJCiAgICAgZmQgPSBNT0RVTEVfT3BlbkZpbGUoIHBNb2R1bGUtPnNlbGYgKTsKLSAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiTG9hZGluZyBzZWdtZW50ICVkLCBzZWxlY3Rvcj0lMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICBzZWdudW0sIHBTZWctPnNlbGVjdG9yICk7CisgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIkxvYWRpbmcgc2VnbWVudCAlZCwgc2VsZWN0b3I9JTA0eCwgZmxhZ3M9JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc2VnbnVtLCBwU2VnLT5zZWxlY3RvciwgcFNlZy0+ZmxhZ3MgKTsKICAgICBsc2VlayggZmQsIHBTZWctPmZpbGVwb3MgPDwgcE1vZHVsZS0+YWxpZ25tZW50LCBTRUVLX1NFVCApOwogICAgIGlmIChwU2VnLT5zaXplKSBzaXplID0gcFNlZy0+c2l6ZTsKICAgICBlbHNlIGlmIChwU2VnLT5taW5zaXplKSBzaXplID0gcFNlZy0+bWluc2l6ZTsKQEAgLTYzMSw3ICs2MzEsNyBAQAogICAgIGRwcmludGZfZGxsKCBzdGRkZWIsICJDYWxsaW5nIExpYk1haW4sIGNzOmlwPSUwNGx4OiUwNHggZHM9JTA0bHggZGk9JTA0eCBjeD0lMDR4XG4iLCAKICAgICAgICAgICAgICAgICAgQ1NfcmVnKCZjb250ZXh0KSwgSVBfcmVnKCZjb250ZXh0KSwgRFNfcmVnKCZjb250ZXh0KSwKICAgICAgICAgICAgICAgICAgRElfcmVnKCZjb250ZXh0KSwgQ1hfcmVnKCZjb250ZXh0KSApOwotICAgIENhbGxiYWNrcy0+Q2FsbFJlZ2lzdGVyUHJvYyggJmNvbnRleHQsIDAgKTsKKyAgICBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYyggJmNvbnRleHQsIDAgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtNjc0LDQgKzY3NCw1IEBACiAvKiBJdCBkb2VzIG5vdGhpbmcgKi8KIHZvaWQgV0lOQVBJIFBhdGNoQ29kZUhhbmRsZShIQU5ETEUxNiBoU2VsKQogeworCWZwcmludGYoc3RkZXJyLCJQYXRjaENvZGVIYW5kbGUoJTA0eCksc3R1YiFcbiIsaFNlbCk7CiB9CmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfaW1hZ2UuYyBiL2xvYWRlci9wZV9pbWFnZS5jCmluZGV4IDE0ODVjYjYuLjY2OTNmZTIgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9pbWFnZS5jCisrKyBiL2xvYWRlci9wZV9pbWFnZS5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIH0KIAogdm9pZCAKLWZpeHVwX2ltcG9ydHMgKFBEQjMyICpwcm9jZXNzLFBFX01PRFJFRiAqcGVtKQorZml4dXBfaW1wb3J0cyAoUERCMzIgKnByb2Nlc3MsUEVfTU9EUkVGICpwZW0sSE1PRFVMRTMyIGhNb2R1bGUpCiB7CiAgICAgSU1BR0VfSU1QT1JUX0RFU0NSSVBUT1IJKnBlX2ltcDsKICAgICBpbnQJZml4dXBfZmFpbGVkCQk9IDA7CkBAIC0yMDcsMTAgKzIwNywxMCBAQAogCS8qIGRvbid0IHVzZSBNT0RVTEVfTG9hZCwgV2luMzIgY3JlYXRlcyBuZXcgdGFzayBkaWZmZXJlbnRseSAqLwogCXJlcyA9IFBFX0xvYWRMaWJyYXJ5RXgzMkEoIG5hbWUsIDAsIDAgKTsKIAlpZiAocmVzIDw9IChITU9EVUxFMzIpIDMyKSB7Ci0JICAgIGNoYXIgKnAsIGJ1ZmZlclsyNTZdOworCSAgICBjaGFyICpwLCBidWZmZXJbMTAyNF07CiAKIAkgICAgLyogVHJ5IHdpdGggcHJlcGVuZGluZyB0aGUgcGF0aCBvZiB0aGUgY3VycmVudCBtb2R1bGUgKi8KLQkgICAgR2V0TW9kdWxlRmlsZU5hbWUzMkEoIHBlbS0+bW9kdWxlLCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSk7CisJICAgIEdldE1vZHVsZUZpbGVOYW1lMzJBKCBoTW9kdWxlLCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSk7CiAJICAgIGlmICghKHAgPSBzdHJyY2hyIChidWZmZXIsICdcXCcpKSkKIAkJcCA9IGJ1ZmZlcjsKIAkgICAgc3RyY3B5IChwICsgMSwgbmFtZSk7CkBAIC01MjIsNiArNTIyLDExIEBACiAJbG9hZF9hZGRyID0gKERXT1JEKVZpcnR1YWxBbGxvYyggKHZvaWQqKWxvYWRfYWRkciwgdm1hX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FTV9SRVNFUlZFIHwgTUVNX0NPTU1JVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOworCWlmIChsb2FkX2FkZHIgPT0gMCkgeworCQlsb2FkX2FkZHIgPSAoRFdPUkQpVmlydHVhbEFsbG9jKCBOVUxMLCB2bWFfc2l6ZSwKKwkJCQkJCSBNRU1fUkVTRVJWRSB8IE1FTV9DT01NSVQsCisJCQkJCQkgUEFHRV9FWEVDVVRFX1JFQURXUklURSApOworCX0KIAlwZW0tPm1vZHVsZSA9IChITU9EVUxFMzIpbG9hZF9hZGRyOwogCiAJZHByaW50Zl93aW4zMihzdGRkZWIsICJMb2FkIGFkZHIgaXMgcmVhbGx5ICVseCwgcmFuZ2UgJXhcbiIsCkBAIC02NDcsNyArNjUyLDcgQEAKIAogCWlmKHBlbS0+cGVfcmVsb2MpCWRvX3JlbG9jYXRpb25zKHBlbSk7CiAJaWYocGVtLT5wZV9leHBvcnQpCWR1bXBfZXhwb3J0cyhwZW0tPm1vZHVsZSk7Ci0JaWYocGVtLT5wZV9pbXBvcnQpCWZpeHVwX2ltcG9ydHMocHJvY2VzcyxwZW0pOworCWlmKHBlbS0+cGVfaW1wb3J0KQlmaXh1cF9pbXBvcnRzKHByb2Nlc3MscGVtLGhNb2R1bGUpOwogICAJCQogCWlmIChwZW0tPnBlX2V4cG9ydCkKIAkJbW9kbmFtZSA9IChjaGFyKilSVkEocGVtLT5wZV9leHBvcnQtPk5hbWUpOwpAQCAtNjcxLDYgKzY3Niw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUaGUgUEUgTGlicmFyeSBMb2FkZXIgZnJvbnRlbmQuIAogICogRklYTUU6IGhhbmRsZSB0aGUgZmxhZ3MuCisgKiAgICAgICAgaW50ZXJuYWwgbW9kdWxlIGhhbmRsaW5nIHNob3VsZCBiZSBtYWRlIGJldHRlciBoZXJlIChhbmQgaW4gYnVpbHRpbi5jKQogICovCiBITU9EVUxFMzIgUEVfTG9hZExpYnJhcnlFeDMyQSAoTFBDU1RSIG5hbWUsIEhGSUxFMzIgaEZpbGUsIERXT1JEIGZsYWdzKSB7CiAJT0ZTVFJVQ1QJb2ZzOwpAQCAtNjkwLDYgKzY5NiwyNyBAQAogCQkJcGVtID0gcGVtLT5uZXh0OwogCQl9CiAJCXBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKGhNb2R1bGUpOworCQlpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfQlVJTFRJTikgeworCQkJUERCMzIJKnByb2Nlc3MgPSAoUERCMzIqKUdldEN1cnJlbnRQcm9jZXNzSWQoKTsKKwkJCUlNQUdFX0RPU19IRUFERVIJKmRoOworCQkJSU1BR0VfTlRfSEVBREVSUwkqbmg7CisJCQlJTUFHRV9TRUNUSU9OX0hFQURFUgkqc2g7CisKKwkJCS8qIHdlIG9ubHkgY29tZSBoZXJlIGlmIHdlIGFscmVhZHkgaGF2ZSAnbG9hZGVkJyB0aGUKKwkJCSAqIGludGVybmFsIGRsbCBidXQgaW4gYW5vdGhlciBwcm9jZXNzLiBKdXN0IGNyZWF0ZQorCQkJICogYSBQRV9NT0RSRUYgYW5kIHJldHVybi4KKwkJCSAqLworCQkJcGVtID0gKFBFX01PRFJFRiopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksCisJCQkJSEVBUF9aRVJPX01FTU9SWSxzaXplb2YoKnBlbSkpOworCQkJcGVtLT5tb2R1bGUgCSAgICAgPSBoTW9kdWxlOworCQkJZGggPSAoSU1BR0VfRE9TX0hFQURFUiopcGVtLT5tb2R1bGU7CisJCQluaCA9IChJTUFHRV9OVF9IRUFERVJTKikoZGgrMSk7CisJCQlzaCA9IChJTUFHRV9TRUNUSU9OX0hFQURFUiopKG5oKzEpOworCQkJcGVtLT5wZV9leHBvcnQJICAgICA9IChJTUFHRV9FWFBPUlRfRElSRUNUT1JZKikoc2grMik7CisJCQlwZW0tPm5leHQJICAgICA9IHByb2Nlc3MtPm1vZHJlZl9saXN0OworCQkJcHJvY2Vzcy0+bW9kcmVmX2xpc3QgPSBwZW07CisJCQlyZXR1cm4gaE1vZHVsZTsKKwkJfQogCX0gZWxzZSB7CiAKIAkJLyogdHJ5IHRvIGxvYWQgYnVpbHRpbiwgZW5hYmxlZCBtb2R1bGVzIGZpcnN0ICovCmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfcmVzb3VyY2UuYyBiL2xvYWRlci9wZV9yZXNvdXJjZS5jCmluZGV4IDRiYTA5ZGQuLjAxMzk2MzMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9wZV9yZXNvdXJjZS5jCkBAIC01Myw3ICs1Myw4IEBACiAgKgogICovCiBMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSBHZXRSZXNEaXJFbnRyeVcoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkgcmVzZGlycHRyLAotCQkJCQkgICBMUENXU1RSIG5hbWUsRFdPUkQgcm9vdCkKKwkJCQkJICAgTFBDV1NUUiBuYW1lLERXT1JEIHJvb3QsCisJCQkJCSAgIEJPT0wzMiBhbGxvd2RlZmF1bHQpCiB7CiAgICAgaW50IGVudHJ5bnVtOwogICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZIGVudHJ5VGFibGU7CkBAIC02NCw3ICs2NSw3IEBACiAJCWNoYXIJYnVmWzEwXTsKIAogCQlsc3RyY3B5bld0b0EoYnVmLG5hbWUrMSwxMCk7Ci0JCXJldHVybiBHZXRSZXNEaXJFbnRyeVcocmVzZGlycHRyLChMUENXU1RSKWF0b2koYnVmKSxyb290KTsKKwkJcmV0dXJuIEdldFJlc0RpckVudHJ5VyhyZXNkaXJwdHIsKExQQ1dTVFIpYXRvaShidWYpLHJvb3QsYWxsb3dkZWZhdWx0KTsKIAl9CiAJZW50cnlUYWJsZSA9IChMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSkgKAogCQkJKEJZVEUgKikgcmVzZGlycHRyICsgCkBAIC05NCw3ICs5NSw3IEBACiAJCQlyb290ICsKIAkJCWVudHJ5VGFibGVbZW50cnludW1dLnUyLnMuT2Zmc2V0VG9EaXJlY3RvcnkpOwogCS8qIGp1c3QgdXNlIGZpcnN0IGVudHJ5IGlmIG5vIGRlZmF1bHQgY2FuIGJlIGZvdW5kICovCi0JaWYgKCFuYW1lICYmIHJlc2RpcnB0ci0+TnVtYmVyT2ZJZEVudHJpZXMpCisJaWYgKGFsbG93ZGVmYXVsdCAmJiAhbmFtZSAmJiByZXNkaXJwdHItPk51bWJlck9mSWRFbnRyaWVzKQogCQlyZXR1cm4gKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKSAoCiAJCQlyb290ICsKIAkJCWVudHJ5VGFibGVbMF0udTIucy5PZmZzZXRUb0RpcmVjdG9yeSk7CkBAIC0xMTgsMTQgKzExOSwxNCBAQAogCiAgICAgcmVzZGlycHRyID0gcGVtLT5wZV9yZXNvdXJjZTsKICAgICByb290ID0gKERXT1JEKSByZXNkaXJwdHI7Ci0gICAgaWYgKChyZXNkaXJwdHIgPSBHZXRSZXNEaXJFbnRyeVcocmVzZGlycHRyLCB0eXBlLCByb290KSkgPT0gTlVMTCkKKyAgICBpZiAoKHJlc2RpcnB0ciA9IEdldFJlc0RpckVudHJ5VyhyZXNkaXJwdHIsIHR5cGUsIHJvb3QsIEZBTFNFKSkgPT0gTlVMTCkKIAlyZXR1cm4gMDsKLSAgICBpZiAoKHJlc2RpcnB0ciA9IEdldFJlc0RpckVudHJ5VyhyZXNkaXJwdHIsIG5hbWUsIHJvb3QpKSA9PSBOVUxMKQorICAgIGlmICgocmVzZGlycHRyID0gR2V0UmVzRGlyRW50cnlXKHJlc2RpcnB0ciwgbmFtZSwgcm9vdCwgRkFMU0UpKSA9PSBOVUxMKQogCXJldHVybiAwOwotICAgIHJlc3VsdCA9IChIQU5ETEUzMilHZXRSZXNEaXJFbnRyeVcocmVzZGlycHRyLCAoTFBDV1NUUikoVUlOVDMyKWxhbmcsIHJvb3QpOworICAgIHJlc3VsdCA9IChIQU5ETEUzMilHZXRSZXNEaXJFbnRyeVcocmVzZGlycHRyLCAoTFBDV1NUUikoVUlOVDMyKWxhbmcsIHJvb3QsIEZBTFNFKTsKIAkvKiBUcnkgTEFOR19ORVVUUkFMLCB0b28gKi8KICAgICBpZighcmVzdWx0KQotICAgICAgICByZXR1cm4gKEhBTkRMRTMyKUdldFJlc0RpckVudHJ5VyhyZXNkaXJwdHIsIChMUENXU1RSKTAsIHJvb3QpOworICAgICAgICByZXR1cm4gKEhBTkRMRTMyKUdldFJlc0RpckVudHJ5VyhyZXNkaXJwdHIsIChMUENXU1RSKTAsIHJvb3QsIFRSVUUpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI0Myw3ICsyNDQsNyBAQAogCXR5cGVXID0gSEVBUF9zdHJkdXBBdG9XKGhlYXAsMCx0eXBlKTsKICAgICBlbHNlCiAJdHlwZVcgPSAoTFBXU1RSKXR5cGU7Ci0gICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2Rpcix0eXBlVywoRFdPUkQpcGVtLT5wZV9yZXNvdXJjZSk7CisgICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2Rpcix0eXBlVywoRFdPUkQpcGVtLT5wZV9yZXNvdXJjZSxGQUxTRSk7CiAgICAgaWYgKEhJV09SRCh0eXBlVykpCiAgICAgCUhlYXBGcmVlKGhlYXAsMCx0eXBlVyk7CiAgICAgaWYgKCFyZXNkaXIpCkBAIC0yODIsNyArMjgzLDcgQEAKICAgICAJcmV0dXJuIEZBTFNFOwogCiAgICAgcmVzZGlyID0gKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKXBlbS0+cGVfcmVzb3VyY2U7Ci0gICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2Rpcix0eXBlLChEV09SRClwZW0tPnBlX3Jlc291cmNlKTsKKyAgICByZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcocmVzZGlyLHR5cGUsKERXT1JEKXBlbS0+cGVfcmVzb3VyY2UsRkFMU0UpOwogICAgIGlmICghcmVzZGlyKQogICAgIAlyZXR1cm4gRkFMU0U7CiAgICAgZXQgPShMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSkoKExQQllURSlyZXNkaXIrc2l6ZW9mKElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkpOwpAQCAtMzI0LDcgKzMyNSw3IEBACiAJbmFtZVcgPSBIRUFQX3N0cmR1cEF0b1coaGVhcCwwLG5hbWUpOwogICAgIGVsc2UKICAgICAJbmFtZVcgPSAoTFBXU1RSKW5hbWU7Ci0gICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2RpcixuYW1lVywoRFdPUkQpcGVtLT5wZV9yZXNvdXJjZSk7CisgICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2RpcixuYW1lVywoRFdPUkQpcGVtLT5wZV9yZXNvdXJjZSxGQUxTRSk7CiAgICAgaWYgKEhJV09SRChuYW1lVykpCiAgICAgCUhlYXBGcmVlKGhlYXAsMCxuYW1lVyk7CiAgICAgaWYgKCFyZXNkaXIpCkBAIC0zMzMsNyArMzM0LDcgQEAKIAl0eXBlVyA9IEhFQVBfc3RyZHVwQXRvVyhoZWFwLDAsdHlwZSk7CiAgICAgZWxzZQogCXR5cGVXID0gKExQV1NUUil0eXBlOwotICAgIHJlc2RpciA9IEdldFJlc0RpckVudHJ5VyhyZXNkaXIsdHlwZVcsKERXT1JEKXBlbS0+cGVfcmVzb3VyY2UpOworICAgIHJlc2RpciA9IEdldFJlc0RpckVudHJ5VyhyZXNkaXIsdHlwZVcsKERXT1JEKXBlbS0+cGVfcmVzb3VyY2UsRkFMU0UpOwogICAgIGlmIChISVdPUkQodHlwZVcpKQogICAgIAlIZWFwRnJlZShoZWFwLDAsdHlwZVcpOwogICAgIGlmICghcmVzZGlyKQpAQCAtMzY3LDEwICszNjgsMTAgQEAKICAgICAJcmV0dXJuIEZBTFNFOwogCiAgICAgcmVzZGlyID0gKExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZKXBlbS0+cGVfcmVzb3VyY2U7Ci0gICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2RpcixuYW1lLChEV09SRClwZW0tPnBlX3Jlc291cmNlKTsKKyAgICByZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcocmVzZGlyLG5hbWUsKERXT1JEKXBlbS0+cGVfcmVzb3VyY2UsRkFMU0UpOwogICAgIGlmICghcmVzZGlyKQogICAgIAlyZXR1cm4gRkFMU0U7Ci0gICAgcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2Rpcix0eXBlLChEV09SRClwZW0tPnBlX3Jlc291cmNlKTsKKyAgICByZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcocmVzZGlyLHR5cGUsKERXT1JEKXBlbS0+cGVfcmVzb3VyY2UsRkFMU0UpOwogICAgIGlmICghcmVzZGlyKQogICAgIAlyZXR1cm4gRkFMU0U7CiAgICAgZXQgPShMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSkoKExQQllURSlyZXNkaXIrc2l6ZW9mKElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSkpOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3Rhc2suYyBiL2xvYWRlci90YXNrLmMKaW5kZXggY2Y5ODFkNC4uMDg4ODFkNiAxMDA2NDQKLS0tIGEvbG9hZGVyL3Rhc2suYworKysgYi9sb2FkZXIvdGFzay5jCkBAIC0zODYsNyArMzg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RPUk9GKElGMTYzMl9TYXZlZDE2X3NzX3NwKSwKICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVRPRihJRjE2MzJfU2F2ZWQxNl9zc19zcCkgKTsKIAotICAgICAgICBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclByb2MoICZjb250ZXh0LCAwICk7CisgICAgICAgIENhbGxiYWNrcy0+Q2FsbFJlZ2lzdGVyU2hvcnRQcm9jKCAmY29udGV4dCwgMCApOwogICAgICAgICAvKiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4gKi8KICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiVEFTS19DYWxsVG9TdGFydDogTWFpbiBwcm9ncmFtIHJldHVybmVkIVxuIiApOwogICAgICAgICBUQVNLX0tpbGxDdXJyZW50VGFzayggMSApOwpAQCAtNjI5LDggKzYyOSw2IEBACiAgKi8KIHZvaWQgVEFTS19LaWxsQ3VycmVudFRhc2soIElOVDE2IGV4aXRDb2RlICkKIHsKLSAgICBleHRlcm4gdm9pZCBVU0VSX0V4aXRXaW5kb3dzKHZvaWQpOwotCiAgICAgVERCKiBwVGFzayA9IChUREIqKSBHbG9iYWxMb2NrMTYoIGhDdXJyZW50VGFzayApOwogICAgIGlmICghcFRhc2spIFVTRVJfRXhpdFdpbmRvd3MoKTsgIC8qIE5vIGN1cnJlbnQgdGFzayB5ZXQgKi8KIApkaWZmIC0tZ2l0IGEvbWVtb3J5L2hlYXAuYyBiL21lbW9yeS9oZWFwLmMKaW5kZXggMGNmMjBmNS4uMWQ0YWVlMiAxMDA2NDQKLS0tIGEvbWVtb3J5L2hlYXAuYworKysgYi9tZW1vcnkvaGVhcC5jCkBAIC04ODUsNyArODg1LDcgQEAKICAgICAgICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwQWxsb2MoJTA4eCwlMDhseCwlMDhseCk6IHJldHVybmluZyBOVUxMXG4iLAogICAgICAgICAgICAgICAgICAgaGVhcCwgZmxhZ3MsIHNpemUgICk7CiAgICAgICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwVW5sb2NrKCBoZWFwICk7Ci0gICAgICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKKyAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9DT01NSVRNRU5UX0xJTUlUICk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtOTExLDcgKzkxMSw2IEBACiAgICAgZWxzZSBpZiAoZGVidWdnaW5nX2hlYXApIG1lbXNldCggcEluVXNlICsgMSwgQVJFTkFfSU5VU0VfRklMTEVSLCBzaXplICk7CiAKICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOwotICAgIFNldExhc3RFcnJvciggMCApOwogCiAgICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwQWxsb2MoJTA4eCwlMDhseCwlMDhseCk6IHJldHVybmluZyAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCBzaXplLCAoRFdPUkQpKHBJblVzZSArIDEpICk7CmRpZmYgLS1naXQgYS9tZW1vcnkvc2VsZWN0b3IuYyBiL21lbW9yeS9zZWxlY3Rvci5jCmluZGV4IDVjNDc3NzUuLjQxMGMwZDUgMTAwNjQ0Ci0tLSBhL21lbW9yeS9zZWxlY3Rvci5jCisrKyBiL21lbW9yeS9zZWxlY3Rvci5jCkBAIC0yMiw3ICsyMiw4IEBACiAgKi8KIFdPUkQgV0lOQVBJIEFsbG9jU2VsZWN0b3JBcnJheSggV09SRCBjb3VudCApCiB7Ci0gICAgV09SRCBpLCBzaXplID0gMDsKKyAgICBXT1JEIGksIHNlbCwgc2l6ZSA9IDA7CisgICAgbGR0X2VudHJ5IGVudHJ5OwogCiAgICAgaWYgKCFjb3VudCkgcmV0dXJuIDA7CiAgICAgZm9yIChpID0gRklSU1RfTERUX0VOVFJZX1RPX0FMTE9DOyBpIDwgTERUX1NJWkU7IGkrKykKQEAgLTMxLDkgKzMyLDIyIEBACiAgICAgICAgIGVsc2UgaWYgKCsrc2l6ZSA+PSBjb3VudCkgYnJlYWs7CiAgICAgfQogICAgIGlmIChpID09IExEVF9TSVpFKSByZXR1cm4gMDsKLSAgICAvKiBNYXJrIHNlbGVjdG9yIGFzIGFsbG9jYXRlZCAqLwotICAgIHdoaWxlIChzaXplLS0pIGxkdF9mbGFnc19jb3B5W2ktLV0gfD0gTERUX0ZMQUdTX0FMTE9DQVRFRDsKLSAgICByZXR1cm4gRU5UUllfVE9fU0VMRUNUT1IoIGkgKyAxICk7CisgICAgc2VsID0gaSAtIHNpemUgKyAxOworCisgICAgZW50cnkuYmFzZSAgICAgICAgICAgPSAwOworICAgIGVudHJ5LnR5cGUgICAgICAgICAgID0gU0VHTUVOVF9EQVRBOworICAgIGVudHJ5LnNlZ18zMmJpdCAgICAgID0gRkFMU0U7CisgICAgZW50cnkucmVhZF9vbmx5ICAgICAgPSBGQUxTRTsKKyAgICBlbnRyeS5saW1pdF9pbl9wYWdlcyA9IEZBTFNFOworICAgIGVudHJ5LmxpbWl0ICAgICAgICAgID0gMTsgIC8qIGF2b2lkIDAgYmFzZSBhbmQgbGltaXQgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKyAgICAgICAgLyogTWFyayBzZWxlY3RvciBhcyBhbGxvY2F0ZWQgKi8KKyAgICAgICAgbGR0X2ZsYWdzX2NvcHlbc2VsICsgaV0gfD0gTERUX0ZMQUdTX0FMTE9DQVRFRDsKKyAgICAgICAgTERUX1NldEVudHJ5KCBzZWwgKyBpLCAmZW50cnkgKTsKKyAgICB9CisgICAgcmV0dXJuIEVOVFJZX1RPX1NFTEVDVE9SKCBzZWwgKTsKIH0KIAogCkBAIC02NTIsMyArNjY2LDI0IEBACiAgICAgZnByaW50ZihzdGRuaW1wLCJXT1dHZXRWRE1Qb2ludGVyVW5maXgoJTA4bHgpLCBTVFVCXG4iLHZwKTsKICAgICAvKiBGSVhNRTogdW5maXggaGVhcHNlZ21lbnQgKi8KIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVVRTZWxlY3Rvck9mZnNldFRvTGluZWFyICAgICAgIChXSU4zMlMxNi40OCkKKyAqCisgKiByb3VnaCBndWVzc3dvcmssIGJ1dCBzZWVtcyB0byB3b3JrIChJIGhhZCBubyAicmVhc29uYWJsZSIgZG9jdSkKKyAqLworTFBWT0lEIFdJTkFQSSBVVFNlbGVjdG9yT2Zmc2V0VG9MaW5lYXIoU0VHUFRSIHNwdHIpCit7CisgICAgICAgIHJldHVybiBQVFJfU0VHX1RPX0xJTihzcHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVVRMaW5lYXJUb1NlbGVjdG9yT2Zmc2V0ICAgICAgIChXSU4zMlMxNi40OSkKKyAqCisgKiBGSVhNRTogSSBkb24ndCBrbm93IGlmIHRoYXQncyB0aGUgcmlnaHQgd2F5IHRvIGRvIGxpbmVhciAtPiBzZWdtZW50ZWQKKyAqLworU0VHUFRSIFdJTkFQSSBVVExpbmVhclRvU2VsZWN0b3JPZmZzZXQoTFBWT0lEIGxwdHIpCit7CisgICAgZnByaW50Ziggc3RkZXJyLCAiVVRMaW5lYXJUb1NlbGVjdG9yT2Zmc2V0KCVwKTogc3R1YlxuIiwgbHB0ciApOworICAgIHJldHVybiAoU0VHUFRSKWxwdHI7Cit9CmRpZmYgLS1naXQgYS9tZW1vcnkvdmlydHVhbC5jIGIvbWVtb3J5L3ZpcnR1YWwuYwppbmRleCA3YWU2OWJlLi44MmQ0ODQ1IDEwMDY0NAotLS0gYS9tZW1vcnkvdmlydHVhbC5jCisrKyBiL21lbW9yeS92aXJ0dWFsLmMKQEAgLTIxLDYgKzIxLDEwIEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCisjaWZuZGVmIE1TX1NZTkMKKyNkZWZpbmUgTVNfU1lOQyAwCisjZW5kaWYKKwogLyogRmlsZSBtYXBwaW5nICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMTkwLDYgKzE5NCw4IEBACiAKICAgICAvKiBDcmVhdGUgdGhlIHZpZXcgc3RydWN0dXJlICovCiAKKyAgICBhc3NlcnQoICEoYmFzZSAmIHBhZ2VfbWFzaykgKTsKKyAgICBhc3NlcnQoICEoc2l6ZSAmIHBhZ2VfbWFzaykgKTsKICAgICBzaXplID4+PSBwYWdlX3NoaWZ0OwogICAgIGlmICghKHZpZXcgPSAoRklMRV9WSUVXICopbWFsbG9jKCBzaXplb2YoKnZpZXcpICsgc2l6ZSAtIDEgKSkpIHJldHVybiBOVUxMOwogICAgIHZpZXctPmJhc2UgICAgPSBiYXNlOwpAQCAtNDkwLDYgKzQ5NiwxMyBAQAogICAgICAgICAgICAgaWYgKHZpZXdfc2l6ZSA+IHNpemUpCiAgICAgICAgICAgICAgICAgRklMRV9tdW5tYXAoICh2b2lkICopKHB0ciArIHNpemUpLCAwLCB2aWV3X3NpemUgLSBzaXplICk7CiAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocHRyICE9IGJhc2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdlIGNvdWxkbid0IGdldCB0aGUgYWRkcmVzcyB3ZSB3YW50ZWQgKi8KKyAgICAgICAgICAgIEZJTEVfbXVubWFwKCAodm9pZCAqKXB0ciwgMCwgdmlld19zaXplICk7CisJICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9BRERSRVNTICk7CisJICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIGlmICghKHZpZXcgPSBWSVJUVUFMX0NyZWF0ZVZpZXcoIHB0ciwgc2l6ZSwgMCwgMCwgdnByb3QsIE5VTEwgKSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIEZJTEVfbXVubWFwKCAodm9pZCAqKXB0ciwgMCwgc2l6ZSApOwpAQCAtMTA5Nyw3ICsxMTEwLDcgQEAKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICBpZiAoIWNiRmx1c2gpIGNiRmx1c2ggPSB2aWV3LT5zaXplOwotICAgIGlmICghbXN5bmMoIGFkZHIsIGNiRmx1c2gsIE1TX1NZTkMgKSkgcmV0dXJuIFRSVUU7CisgICAgaWYgKCFtc3luYyggKHZvaWQgKilhZGRyLCBjYkZsdXNoLCBNU19TWU5DICkpIHJldHVybiBUUlVFOwogICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKICAgICByZXR1cm4gRkFMU0U7CiAKZGlmZiAtLWdpdCBhL21pc2MvTWFrZWZpbGUuaW4gYi9taXNjL01ha2VmaWxlLmluCmluZGV4IDRiYmJlOTAuLmY5NzIyZGIgMTAwNjQ0Ci0tLSBhL21pc2MvTWFrZWZpbGUuaW4KKysrIGIvbWlzYy9NYWtlZmlsZS5pbgpAQCAtMzcsNiArMzcsOCBAQAogCXczMnNjb21iLmMgXAogCXczMnNrcm5sLmMgXAogCXczMnN5cy5jIFwKKwl3aW4zMnMxNi5jIFwKKwl3aW5kZWJ1Zy5jIFwKIAl3aW5zb2NrLmMgXAogCXdpbnNvY2tfZG5zLmMgXAogCXdzcHJpbnRmLmMgXApkaWZmIC0tZ2l0IGEvbWlzYy9jYWxsYmFjay5jIGIvbWlzYy9jYWxsYmFjay5jCmluZGV4IGMzNzlhOTAuLjM0ZTVmMDIgMTAwNjQ0Ci0tLSBhL21pc2MvY2FsbGJhY2suYworKysgYi9taXNjL2NhbGxiYWNrLmMKQEAgLTcsOCArNyw4IEBACiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInRhc2suaCIKIAotZXh0ZXJuIHZvaWQgVEFTS19SZXNjaGVkdWxlKHZvaWQpOyAgLyogbG9hZGVyL3Rhc2suYyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgICBDQUxMQkFDS19DYWxsV25kUHJvYwpAQCAtMjQsMTAgKzI0LDExIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJICAgICBDQUxMQkFDS19DYWxsUmVnaXN0ZXJQcm9jCiAgKi8KLXN0YXRpYyBWT0lEIFdJTkFQSSBDQUxMQkFDS19DYWxsUmVnaXN0ZXJQcm9jKCBDT05URVhUICpjb250ZXh0LCBJTlQzMiBvZmZzZXQpCitzdGF0aWMgTE9ORyBXSU5BUEkgQ0FMTEJBQ0tfQ2FsbFJlZ2lzdGVyUHJvYyggQ09OVEVYVCAqY29udGV4dCwgSU5UMzIgb2Zmc2V0KQogewogICAgIGZwcmludGYoIHN0ZGVyciwgIkNhbm5vdCBjYWxsIGEgcmVnaXN0ZXIgcHJvYyBpbiBXaW5lbGliXG4iICk7CiAgICAgYXNzZXJ0KCBGQUxTRSApOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTEyMyw2ICsxMjQsMTUgQEAKICAgICByZXR1cm4gcHJvYyggcHRyICk7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgQ0FMTEJBQ0tfQ2FsbFdPV0NhbGxiYWNrUHJvYworICovCitzdGF0aWMgRFdPUkQgV0lOQVBJIENBTExCQUNLX0NhbGxXT1dDYWxsYmFja1Byb2MoIEZBUlBST0MxNiBwcm9jLCBEV09SRCBkdyApCit7CisgICAgcmV0dXJuIHByb2MoIGR3ICk7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgIENBTExCQUNLX1dpbmVsaWJUYWJsZQogICoKQEAgLTEzMCw3ICsxNDAsOCBAQAogICovCiBzdGF0aWMgY29uc3QgQ0FMTEJBQ0tTX1RBQkxFIENBTExCQUNLX1dpbmVsaWJUYWJsZSA9CiB7Ci0gICAgQ0FMTEJBQ0tfQ2FsbFJlZ2lzdGVyUHJvYywgICAgIC8qIENhbGxSZWdpc3RlclByb2MgKi8KKyAgICBDQUxMQkFDS19DYWxsUmVnaXN0ZXJQcm9jLCAgICAgLyogQ2FsbFJlZ2lzdGVyU2hvcnRQcm9jICovCisgICAgQ0FMTEJBQ0tfQ2FsbFJlZ2lzdGVyUHJvYywgICAgIC8qIENhbGxSZWdpc3RlckxvbmdQcm9jICovCiAgICAgVEFTS19SZXNjaGVkdWxlLCAgICAgICAgICAgICAgIC8qIENhbGxUYXNrUmVzY2hlZHVsZVByb2MgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FsbEZyb20xNlduZFByb2MgKi8KICAgICBDQUxMQkFDS19DYWxsV25kUHJvYywgICAgICAgICAgLyogQ2FsbFduZFByb2MgKi8KQEAgLTE0Miw2ICsxNTMsNyBAQAogICAgIENBTExCQUNLX0NhbGxCb290QXBwUHJvYywgICAgICAvKiBDYWxsQm9vdEFwcFByb2MgKi8KICAgICBDQUxMQkFDS19DYWxsTG9hZEFwcFNlZ1Byb2MsICAgLyogQ2FsbExvYWRBcHBTZWdQcm9jICovCiAgICAgQ0FMTEJBQ0tfQ2FsbFN5c3RlbVRpbWVyUHJvYywgIC8qIENhbGxTeXN0ZW1UaW1lclByb2MgKi8KKyAgICBDQUxMQkFDS19DYWxsV09XQ2FsbGJhY2tQcm9jLCAgLyogQ2FsbFdPV0NhbGxiYWNrUHJvYyAqLwogICAgIENBTExCQUNLX0NhbGxBU1BJUG9zdFByb2MsICAgICAvKiBDYWxsQVNQSVBvc3RQcm9jICovCiAgICAgLyogVGhlIGdyYXBoaWNzIGRyaXZlciBjYWxsYmFja3MgYXJlIG5ldmVyIHVzZWQgaW4gV2luZWxpYiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDYWxsRHJ2Q29udHJvbFByb2MgKi8KZGlmZiAtLWdpdCBhL21pc2MvY29tbWRsZy5jIGIvbWlzYy9jb21tZGxnLmMKaW5kZXggODNmYTkyMi4uZDQyMmM4NyAxMDA2NDQKLS0tIGEvbWlzYy9jb21tZGxnLmMKKysrIGIvbWlzYy9jb21tZGxnLmMKQEAgLTUzOCwxMCArNTM4LDE0IEBACiAgICAgfQogICBlbHNlCiAgICAgKnRtcHN0ciA9IDA7Ci0gIGlmICghRklMRURMR19TY2FuRGlyKGhXbmQsIHRtcHN0cikpCi0gICAgZnByaW50ZihzdGRlcnIsICJGaWxlRGxnOiBjb3VsZG4ndCByZWFkIGluaXRpYWwgZGlyZWN0b3J5ICVzIVxuIiwgdG1wc3RyKTsKLSAgLyogc2VsZWN0IGN1cnJlbnQgZHJpdmUgaW4gY29tYm8gMiAqLwotICBuID0gRFJJVkVfR2V0Q3VycmVudERyaXZlKCk7CisgIGlmICghRklMRURMR19TY2FuRGlyKGhXbmQsIHRtcHN0cikpIHsKKyAgICAqdG1wc3RyID0gMDsKKyAgICBpZiAoIUZJTEVETEdfU2NhbkRpcihoV25kLCB0bXBzdHIpKQorICAgICAgZnByaW50ZihzdGRlcnIsICJGaWxlRGxnOiBjb3VsZG4ndCByZWFkIGluaXRpYWwgZGlyZWN0b3J5ICVzIVxuIix0bXBzdHIpOworICB9CisgIC8qIHNlbGVjdCBjdXJyZW50IGRyaXZlIGluIGNvbWJvIDIsIG9taXQgbWlzc2luZyBkcml2ZXMgKi8KKyAgZm9yKGk9MCwgbj0tMTsgaTw9RFJJVkVfR2V0Q3VycmVudERyaXZlKCk7IGkrKykKKyAgICBpZiAoRFJJVkVfSXNWYWxpZChpKSkgICAgICAgICAgICAgICAgICBuKys7CiAgIFNlbmREbGdJdGVtTWVzc2FnZTE2KGhXbmQsIGNtYjIsIENCX1NFVENVUlNFTDE2LCBuLCAwKTsKICAgaWYgKCEobHBvZm4tPkZsYWdzICYgT0ZOX1NIT1dIRUxQKSkKICAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGhXbmQsIHBzaEhlbHApLCBTV19ISURFKTsKZGlmZiAtLWdpdCBhL21pc2MvY3B1LmMgYi9taXNjL2NwdS5jCmluZGV4IDAxNGM1NDYuLmZmYmJiYmYgMTAwNjQ0Ci0tLSBhL21pc2MvY3B1LmMKKysrIGIvbWlzYy9jcHUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBXaGF0IHByb2Nlc3Nvcj8KICAqCi0gKiBDb3B5cmlnaHQgMTk5NSBNb3J0ZW4gV2VsaW5kZXIKKyAqIENvcHlyaWdodCAxOTk1LDE5OTcgTW9ydGVuIFdlbGluZGVyCiAgKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKICAqLwogCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbm50LmgiCiAKIFZPSUQgV0lOQVBJIEdldFN5c3RlbUluZm8oTFBTWVNURU1fSU5GTyBzaSkKIHsKQEAgLTk5LDMgKzEwMCwyNSBAQAogCXJldHVybjsKICNlbmRpZiAgLyogbGludXggKi8KIH0KKworCisvKiBJc1Byb2Nlc3NvckZlYXR1cmVQcmVzZW50IFtLRVJORUwzMi44ODBdICovCitCT09MMzIgV0lOQVBJIElzUHJvY2Vzc29yRmVhdHVyZVByZXNlbnQgKERXT1JEIGZlYXR1cmUpCit7CisgIFNZU1RFTV9JTkZPIHNpOworICBHZXRTeXN0ZW1JbmZvICgmc2kpOworICAvKiBGSVhNRTogdGhlc2UgYXJlIHJlbGF0aXZlbHkgc3R1cGlkIGFwcHJveGltYXRpb25zLiAgKi8KKyAgc3dpdGNoIChmZWF0dXJlKQorICAgIHsKKyAgICBjYXNlIFBGX0ZMT0FUSU5HX1BPSU5UX1BSRUNJU0lPTl9FUlJBVEE6CisgICAgICByZXR1cm4gc2kud1Byb2Nlc3NvckxldmVsID09IDU7CisgICAgY2FzZSBQRl9GTE9BVElOR19QT0lOVF9FTVVMQVRFRDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICBjYXNlIFBGX0NPTVBBUkVfRVhDSEFOR0VfRE9VQkxFOgorICAgICAgcmV0dXJuIHNpLndQcm9jZXNzb3JMZXZlbCA+PSA1OworICAgIGNhc2UgUEZfTU1YX0lOU1RSVUNUSU9OU19BVkFJTEFCTEU6CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9taXNjL2NydGRsbC5jIGIvbWlzYy9jcnRkbGwuYwppbmRleCA3ZmZhMDFhLi4zYTEyYzliIDEwMDY0NAotLS0gYS9taXNjL2NydGRsbC5jCisrKyBiL21pc2MvY3J0ZGxsLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHNldGptcC5oPgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgpAQCAtNDM4LDcgKzQzOSw3IEBACiAJaWYgKGZkID09IC0xKQogCSAgbGVuID0gLTE7CiAJZWxzZSBpZiAoZmQ8PTIpCi0JICBsZW4gPSAoVUlOVDMyKXdyaXRlKGZkLGJ1ZiwoTE9ORylsZW4pOworCSAgbGVuID0gKFVJTlQzMil3cml0ZShmZCxidWYsKExPTkcpY291bnQpOwogCWVsc2UKIAkgIGxlbiA9IF9sd3JpdGUzMihmZCxidWYsY291bnQpOwogCWRwcmludGZfY3J0ZGxsKHN0ZGRlYiwiQ1JURExMX3dyaXRlICVkLyVkIGJ5dGUgdG8gZGZoICVkIGZyb20gJXAsXG4iLApAQCAtNDU2LDYgKzQ1Nyw4IEBACiAgKiAgRklYTUUgICAgICAgICAgIF9leGl0ICAgICAgICAgICAoQ1JURExMLjg3KQogICogIEZJWE1FICAgICAgICAgICBleGl0ICAgICAgICAgICAgKENSVERMTC4zNTkpCiAgKgorICogYXRleGl0LXByb2Nlc3NpbmcgY29tZXMgdG8gbWluZCAtLSBNVy4KKyAqCiAgKi8KIHZvaWQgX19jZGVjbCBDUlRETExfX2NleGl0KElOVDMyIHJldCkKIHsKQEAgLTUwMiwxMCArNTA1LDEzIEBACiAgKi8KIExQU1RSIF9fY2RlY2wgQ1JURExMX2dldHMoTFBTVFIgYnVmKQogeworICAgY2hhciAqIHJldDsKICAgLyogQkFELCBmb3IgdGhlIHdob2xlIFdJTkUgcHJvY2VzcyBibG9ja3MuLi4ganVzdCBkb25lIHRoaXMgd2F5IHRvIHRlc3QKICAgICogd2luZG93czk1J3MgZnRwLmV4ZS4KICAgICovCi0gICAgcmV0dXJuIGdldHMoYnVmKTsKKyAgIHJldCA9IGdldHMoYnVmKTsKKyAgIGRwcmludGZfY3J0ZGxsKHN0ZGRlYiwiQ1JURExMX2dldHMgZ290ICVzXG4iLHJldCk7CisgICByZXR1cm4gcmV0OwogfQogCiAKQEAgLTc2MiwxMiArNzY4LDEyIEBACiAgIGJwID0gYnVmZmVyICsgc3RybGVuKGJ1ZmZlcik7CiAgIGkgPSBzdHJsZW4oYnVmZmVyKSArIHN0cmxlbih4KSArMjsKIAotICAvKiBDYWxjdWxhdGUgbmVlZGVkIGJ1ZmZlciBzaXplIHRwIHByZXZlbnQgb3ZlcmZsb3cqLworICAvKiBDYWxjdWxhdGUgbmVlZGVkIGJ1ZmZlciBzaXplIHRvIHByZXZlbnQgb3ZlcmZsb3cuICAqLwogICB3aGlsZSAoKnkpIHsKICAgICBpZiAoKnkgPT0nXFwnKSBpKys7CiAgICAgeSsrOwogICB9Ci0gIC8qIGlmIGJ1ZmZlciB0byBzaG9ydCwgZXhpdCAqLworICAvKiBJZiBidWZmZXIgdG9vIHNob3J0LCBleGl0LiAgKi8KICAgaWYgKGkgPiBTWVNCVUZfTEVOR1RIKSB7CiAgICAgZHByaW50Zl9jcnRkbGwoc3RkZGViLCJfc3lzdGVtIGJ1ZmZlciB0byBzbWFsbFxuIik7CiAgICAgcmV0dXJuIDEyNzsKQEAgLTc4MCw3ICs3ODYsNyBAQAogICAgIGJwKys7IHkrKzsKICAgICBpZiAoKih5LTEpID09J1xcJykgKmJwKysgPSAnXFwnOwogICB9Ci0gIC8qIHJlbW92ZSBzcGFjZXMgZnJvbSBlbmQgb2Ygc3RyaW5nICovCisgIC8qIFJlbW92ZSBzcGFjZXMgZnJvbSBlbmQgb2Ygc3RyaW5nLiAgKi8KICAgd2hpbGUgKCooeS0xKSA9PSAnICcpIHsKICAgICBicC0tO3ktLTsKICAgfQpAQCAtODM2LDYgKzg0MiwxNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgbG9uZ2ptcCAgICAgICAgKENSVERMTC40MjYpCisgKi8KK1ZPSUQgX19jZGVjbCBDUlRETExfbG9uZ2ptcChqbXBfYnVmIGVudiwgaW50IHZhbCkKK3sKKyAgICBkcHJpbnRmX2NydGRsbChzdGRuaW1wLCJDUlRETExfbG9uZ2ptcCBzZW1pc3R1cCwgZXhwZWN0IGNyYXNoXG4iKTsKKyAgICBkcHJpbnRmX2NydGRsbChzdGRkZWIsICJDUlRETExfbG9uZ2ptcCBzZW1pc3R1cCwgZXhwZWN0IGNyYXNoXG4iKTsKKyAgICByZXR1cm4gbG9uZ2ptcChlbnYsIHZhbCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgbWFsbG9jICAgICAgICAoQ1JURExMLjQyNykKICAqLwogVk9JRCogX19jZGVjbCBDUlRETExfbWFsbG9jKERXT1JEIHNpemUpCkBAIC0xMDg4LDE0ICsxMTA0LDE0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgIHdjc2NociAgICAgICAgICAgKENSVERMTC41MDQpCiAgKi8KLUxQV1NUUiBfX2NkZWNsIENSVERMTF93Y3NjaHIoTFBXU1RSIHN0cixXQ0hBUiB4Y2hhcikKK0xQV1NUUiBfX2NkZWNsIENSVERMTF93Y3NjaHIoTFBDV1NUUiBzdHIsV0NIQVIgeGNoYXIpCiB7Ci0JTFBXU1RSCXM7CisJTFBDV1NUUglzOwogCiAJcz1zdHI7CiAJZG8gewogCQlpZiAoKnM9PXhjaGFyKQotCQkJcmV0dXJuIHM7CisJCQlyZXR1cm4gKExQV1NUUilzOwogCX0gd2hpbGUgKCpzKyspOwogCXJldHVybiBOVUxMOwogfQpAQCAtMTM0NSw3ICsxMzYxLDcgQEAKIHsKIAogLyogU2xpZ2h0bHkgbW9kaWZpZWQgbHN0cmNweW5BdG9XIGZ1bmN0aW9ucyBmcm9tIG1lbW9yeS9zdHJpbmdzLmMKLSAqICBXZSBuZWVkIHRoZSBudW1iZXJyIG9mIGNoYXJhY3RlcnMgdHJhbnNmZXJlZCAKKyAqICBXZSBuZWVkIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0cmFuc2ZlcmVkIAogICogIEZJWE1FOiBObyBtdWx0aWJ5dGUgc3VwcG9ydCB5ZXQKICAqLwogCkBAIC0xNTIyLDkgKzE1MzgsOCBAQAogCiAgIGxlbiA9IHNpemU7CiAgIGlmICghYnVmKSB7Ci0gICAgbGVuID0gc2l6ZTsKICAgICBpZiAoc2l6ZSA8IDApIC8qIGFsbG9jYXRlIGFzIGJpZyBhcyBuZXNjZXNzYXJ5ICovCi0gICAgICBsZW4gPUdldEN1cnJlbnREaXJlY3RvcnkzMkEoMSx0ZXN0KTsKKyAgICAgIGxlbiA9R2V0Q3VycmVudERpcmVjdG9yeTMyQSgxLHRlc3QpICsgMTsKICAgICBpZighKGJ1ZiA9IENSVERMTF9tYWxsb2MobGVuKSkpCiAgICAgewogCS8qIHNldCBlcnJvciB0byBPdXRPZlJhbmdlICovCmRpZmYgLS1naXQgYS9taXNjL2xzdHIuYyBiL21pc2MvbHN0ci5jCmluZGV4IDJkN2RiMTguLmNlODA0NzYgMTAwNjQ0Ci0tLSBhL21pc2MvbHN0ci5jCisrKyBiL21pc2MvbHN0ci5jCkBAIC0xMCw0MCArMTAsNTAgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHdjdHlwZS5oPgogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbm50LmgiCS8qIEhFQVBfIG1hY3JvcyAqLworI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibGR0LmgiCisjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotI2RlZmluZSBUb1VwcGVyKGMpCXRvdXBwZXIoYykKLSNkZWZpbmUgVG9Mb3dlcihjKQl0b2xvd2VyKGMpCi0KIAogLyogRnVubnkgdG8gZGl2aWRlIHRoZW0gYmV0d2VlbiB1c2VyIGFuZCBrZXJuZWwuICovCiAKLS8qIElzQ2hhckFscGhhIFVTRVIgNDMzICovCisvKiBiZSBjYXJlZnVsOiBhbHdheXMgdXNlIGZ1bmN0aW9ucyBmcm9tIHdjdHlwZS5oIGlmIGNoYXJhY3RlciA+IDI1NSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlJc0NoYXJBbHBoYSAoVVNFUi40MzMpCisgKi8KIEJPT0wxNiBXSU5BUEkgSXNDaGFyQWxwaGExNihDSEFSIGNoKQogewogICByZXR1cm4gaXNhbHBoYShjaCk7ICAgLyogVGhpcyBpcyBwcm9iYWJseSBub3QgcmlnaHQgZm9yIE5MUyAqLwogfQogCi0vKiBJc0NoYXJBbHBoYW51bWVyaWMgVVNFUiA0MzQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCUlzQ2hhckFscGhhbnVtZXJpYyAoVVNFUi40MzQpCisgKi8KIEJPT0wxNiBXSU5BUEkgSXNDaGFyQWxwaGFOdW1lcmljMTYoQ0hBUiBjaCkKIHsKICAgICByZXR1cm4gaXNhbG51bShjaCk7CiB9CiAKLS8qIElzQ2hhclVwcGVyIFVTRVIgNDM1ICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlJc0NoYXJVcHBlciAoVVNFUi40MzUpCisgKi8KIEJPT0wxNiBXSU5BUEkgSXNDaGFyVXBwZXIxNihDSEFSIGNoKQogewogICByZXR1cm4gaXN1cHBlcihjaCk7CiB9CiAKLS8qIElzQ2hhckxvd2VyIFVTRVIgNDM2ICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlJc0NoYXJMb3dlciAoVVNFUi40MzYpCisgKi8KIEJPT0wxNiBXSU5BUEkgSXNDaGFyTG93ZXIxNihDSEFSIGNoKQogewogICByZXR1cm4gaXNsb3dlcihjaCk7CkBAIC02NCw3ICs3NCw3IEBACiAgICAgICAgIGZvciAocyA9IFBUUl9TRUdfVE9fTElOKHN0ck9yQ2hhcik7ICpzOyBzKyspICpzID0gdG91cHBlcigqcyk7CiAgICAgICAgIHJldHVybiBzdHJPckNoYXI7CiAgICAgfQotICAgIGVsc2UgcmV0dXJuIChTRUdQVFIpVG9VcHBlciggKGludClzdHJPckNoYXIgKTsKKyAgICBlbHNlIHJldHVybiB0b3VwcGVyKChjaGFyKXN0ck9yQ2hhcik7CiB9CiAKIApAQCAtOTMsNyArMTAzLDcgQEAKICAgICAgICAgZm9yIChzID0gUFRSX1NFR19UT19MSU4oIHN0ck9yQ2hhciApOyAqczsgcysrKSAqcyA9IHRvbG93ZXIoICpzICk7CiAgICAgICAgIHJldHVybiBzdHJPckNoYXI7CiAgICAgfQotICAgIGVsc2UgcmV0dXJuIChTRUdQVFIpdG9sb3dlciggKGludClzdHJPckNoYXIgKTsKKyAgICBlbHNlIHJldHVybiB0b2xvd2VyKChjaGFyKXN0ck9yQ2hhcik7CiB9CiAKIApAQCAtMjc0LDcgKzI4NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHg7CiAgICAgfQotICAgIGVsc2UgcmV0dXJuIChMUFNUUil0b2xvd2VyKExPV09SRCh4KSk7CisgICAgZWxzZSByZXR1cm4gKExQU1RSKXRvbG93ZXIoKGNoYXIpKGludCl4KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yODUsNiArMjk1LDcgQEAKIHsKICAgICBEV09SRCBkb25lPTA7CiAKKyAgICBpZiAoIXgpIHJldHVybiAwOyAvKiBZRVMgKi8KICAgICB3aGlsZSAoKnggJiYgKGJ1Zmxlbi0tKSkKICAgICB7CiAgICAgICAgICp4PXRvbG93ZXIoKngpOwpAQCAtMzAyLDkgKzMxMywxMCBAQAogewogICAgIERXT1JEIGRvbmU9MDsKIAorICAgIGlmICgheCkgcmV0dXJuIDA7IC8qIFlFUyAqLwogICAgIHdoaWxlICgqeCAmJiAoYnVmbGVuLS0pKQogICAgIHsKLSAgICAgICAgKng9dG9sb3dlcigqeCk7CisgICAgICAgICp4PXRvd2xvd2VyKCp4KTsKICAgICAgICAgeCsrOwogICAgICAgICBkb25lKys7CiAgICAgfQpAQCAtMzIyLDEyICszMzQsMTIgQEAKICAgICAgICAgTFBXU1RSIHMgPSB4OwogICAgICAgICB3aGlsZSAoKnMpCiAgICAgICAgIHsKLSAgICAgICAgICAgICpzPXRvbG93ZXIoKnMpOworICAgICAgICAgICAgKnM9dG93bG93ZXIoKnMpOwogICAgICAgICAgICAgcysrOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB4OwogICAgIH0KLSAgICBlbHNlIHJldHVybiAoTFBXU1RSKXRvbG93ZXIoTE9XT1JEKHgpKTsKKyAgICBlbHNlIHJldHVybiAoTFBXU1RSKXRvd2xvd2VyKExPV09SRCh4KSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzQ2LDcgKzM1OCw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHg7CiAgICAgfQotICAgIGVsc2UgcmV0dXJuIChMUFNUUil0b3VwcGVyKExPV09SRCh4KSk7CisgICAgcmV0dXJuIChMUFNUUil0b3VwcGVyKChjaGFyKShpbnQpeCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzU3LDYgKzM2OSw3IEBACiB7CiAgICAgRFdPUkQgZG9uZT0wOwogCisgICAgaWYgKCF4KSByZXR1cm4gMDsgLyogWUVTICovCiAgICAgd2hpbGUgKCp4ICYmIChidWZsZW4tLSkpCiAgICAgewogICAgICAgICAqeD10b3VwcGVyKCp4KTsKQEAgLTM3NCw5ICszODcsMTAgQEAKIHsKICAgICBEV09SRCBkb25lPTA7CiAKKyAgICBpZiAoIXgpIHJldHVybiAwOyAvKiBZRVMgKi8KICAgICB3aGlsZSAoKnggJiYgKGJ1Zmxlbi0tKSkKICAgICB7Ci0gICAgICAgICp4PXRvdXBwZXIoKngpOworICAgICAgICAqeD10b3d1cHBlcigqeCk7CiAgICAgICAgIHgrKzsKICAgICAgICAgZG9uZSsrOwogICAgIH0KQEAgLTM5NCwxMiArNDA4LDEyIEBACiAgICAgICAgIExQV1NUUiBzID0geDsKICAgICAgICAgd2hpbGUgKCpzKQogICAgICAgICB7Ci0gICAgICAgICAgICAqcz10b3VwcGVyKCpzKTsKKyAgICAgICAgICAgICpzPXRvd3VwcGVyKCpzKTsKICAgICAgICAgICAgIHMrKzsKICAgICAgICAgfQogICAgICAgICByZXR1cm4geDsKICAgICB9Ci0gICAgZWxzZSByZXR1cm4gKExQV1NUUil0b3VwcGVyKExPV09SRCh4KSk7CisgICAgZWxzZSByZXR1cm4gKExQV1NUUil0b3d1cHBlcihMT1dPUkQoeCkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQyNiw3ICs0NDAsNyBAQAogICovCiBCT09MMzIgV0lOQVBJIElzQ2hhckFscGhhTnVtZXJpYzMyVyhXQ0hBUiB4KQogewotICAgIHJldHVybiBpc2FsbnVtKHgpOworICAgIHJldHVybiBpc3dhbG51bSh4KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00MzUsNyArNDQ5LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBJc0NoYXJBbHBoYTMyVyhXQ0hBUiB4KQogewotICAgIHJldHVybiBpc2FscGhhKHgpOworICAgIHJldHVybiBpc3dhbHBoYSh4KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NTMsNyArNDY3LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBJc0NoYXJMb3dlcjMyVyhXQ0hBUiB4KQogewotICAgIHJldHVybiBpc2xvd2VyKHgpOworICAgIHJldHVybiBpc3dsb3dlcih4KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC00NzEsNyArNDg1LDcgQEAKICAqLwogQk9PTDMyIFdJTkFQSSBJc0NoYXJVcHBlcjMyVyhXQ0hBUiB4KQogewotICAgIHJldHVybiBpc3VwcGVyKHgpOworICAgIHJldHVybiBpc3d1cHBlcih4KTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9taXNjL21haW4uYyBiL21pc2MvbWFpbi5jCmluZGV4IDAyOTg0YWUuLmJkYTE3NzkgMTAwNjQ0Ci0tLSBhL21pc2MvbWFpbi5jCisrKyBiL21pc2MvbWFpbi5jCkBAIC0xOCwxMiArMTgsMTIgQEAKICNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KICNpbmNsdWRlIDxYMTEvWGxvY2FsZS5oPgogI2luY2x1ZGUgPFgxMS9jdXJzb3Jmb250Lmg+CisjaW5jbHVkZSAid2luc29jay5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCiAjaW5jbHVkZSAibXNkb3MuaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiY29sb3IuaCIKLSNpbmNsdWRlICJ3aW5zb2NrLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgImRlc2t0b3AuaCIKICNpbmNsdWRlICJwcm9jZXNzLmgiCmRpZmYgLS1naXQgYS9taXNjL25ldHdvcmsuYyBiL21pc2MvbmV0d29yay5jCmluZGV4IDEyZWQ5ZmEuLjU4YjhjYmQgMTAwNjQ0Ci0tLSBhL21pc2MvbmV0d29yay5jCisrKyBiL21pc2MvbmV0d29yay5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJV05ldEdldENvbm5lY3Rpb24JW1VTRVIuNTEyXQogICovCi1pbnQgV0lOQVBJIFdOZXRHZXRDb25uZWN0aW9uMTYoTFBTVFIgbHBMb2NhbE5hbWUsIAoraW50IFdJTkFQSSBXTmV0R2V0Q29ubmVjdGlvbjE2KExQQ1NUUiBscExvY2FsTmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBSZW1vdGVOYW1lLCBVSU5UMTYgKmNiUmVtb3RlTmFtZSkKIHsKICAgICBjb25zdCBjaGFyICpwYXRoOwpkaWZmIC0tZ2l0IGEvbWlzYy9wb3J0LmMgYi9taXNjL3BvcnQuYwppbmRleCBiMTZmZjBmLi5mOThhOTUxIDEwMDY0NAotLS0gYS9taXNjL3BvcnQuYworKysgYi9taXNjL3BvcnQuYwpAQCAtNDksMyArNDksMTEgQEAKICAgICByZXR1cm4gZGVzdDsKIH0KICNlbmRpZiAgLyogSEFWRV9NRU1NT1ZFICovCisKKyNpZm5kZWYgSEFWRV9TVFJFUlJPUgorY29uc3QgY2hhciAqc3RyZXJyb3IoIGludCBlcnIgKQoreworICAgIC8qIExldCdzIGhvcGUgd2UgaGF2ZSBzeXNfZXJybGlzdCB0aGVuICovCisgICAgcmV0dXJuIHN5c19lcnJsaXN0W2Vycl07Cit9CisjZW5kaWYgIC8qIEhBVkVfU1RSRVJST1IgKi8KZGlmZiAtLWdpdCBhL21pc2MvcHJpbnRkcnYuYyBiL21pc2MvcHJpbnRkcnYuYwppbmRleCA5NGNhNjk2Li4zYzczNTgxIDEwMDY0NAotLS0gYS9taXNjL3ByaW50ZHJ2LmMKKysrIGIvbWlzYy9wcmludGRydi5jCkBAIC04OSw2ICs4OSwxNCBAQAogICAgIHJldHVybiAxOwogfQogCitCT09MMzIgV0lOQVBJIE9wZW5QcmludGVyMzJBKExQU1RSIGxwUHJpbnRlck5hbWUsSEFORExFMzIgKnBoUHJpbnRlciwKKwkJCSAgICAgTFBQUklOVEVSX0RFRkFVTFRTMzJBIHBEZWZhdWx0KQoreworICAgIGZwcmludGYoc3RkZXJyLCJPcGVuUHJpbnRlcjMyQSglcywlcCwlcCksIHN0dWJcbiIsCisJICAgIGxwUHJpbnRlck5hbWUsIHBoUHJpbnRlciwgcERlZmF1bHQpOworICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CisgICAgcmV0dXJuIEZBTFNFOworfQogQk9PTDMyICBXSU5BUEkgRW51bVByaW50ZXJzMzJBKERXT1JEIGR3VHlwZSwgTFBTVFIgbHBzek5hbWUsCiAJCQkgICAgICAgRFdPUkQgZHdMZXZlbCwgTFBCWVRFIGxwYlByaW50ZXJzLAogCQkJICAgICAgIERXT1JEIGNiQnVmLCBMUERXT1JEIGxwZHdOZWVkZWQsCmRpZmYgLS1naXQgYS9taXNjL3NoZWxsLmMgYi9taXNjL3NoZWxsLmMKaW5kZXggNjZhOTRjZS4uZDBiZDZiYSAxMDA2NDQKLS0tIGEvbWlzYy9zaGVsbC5jCisrKyBiL21pc2Mvc2hlbGwuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5lcnJvci5oIgogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJzaGVsbC5oIgogI2luY2x1ZGUgImhlYXAuaCIKQEAgLTEyNSw2ICsxMjYsNyBAQAogICAgICJXaWxsaWFtIFNtaXRoIiwKICAgICAiRG9taW5payBTdHJhc3NlciIsCiAgICAgIlZhZGltIFN0cml6aGV2c2t5IiwKKyAgICAiQmVydGhvIFN0dWx0aWVucyIsCiAgICAgIkVyaWsgU3ZlbmRzZW4iLAogICAgICJUcmlzdGFuIFRhcnJhbnQiLAogICAgICJBbmRyZXcgVGF5bG9yIiwKQEAgLTE4MSw5ICsxODMsNiBAQAogCiAjcHJhZ21hIHBhY2soNCkKIAotZXh0ZXJuIEhJQ09OMTYgICBXSU5BUEkgTG9hZEljb25IYW5kbGVyKCBIR0xPQkFMMTYgaFJlc291cmNlLCBCT09MMTYgYk5ldyApOwotZXh0ZXJuIFdPUkQgCSBXSU5BUEkgR2V0SWNvbklEKCBIR0xPQkFMMTYgaFJlc291cmNlLCBEV09SRCByZXNUeXBlICk7Ci0KIHN0YXRpYyBjb25zdCBjaGFyKglscHN0ck1zZ1duZENyZWF0ZWQgPSAiT1RIRVJXSU5ET1dDUkVBVEVEIjsKIHN0YXRpYyBjb25zdCBjaGFyKglscHN0ck1zZ1duZERlc3Ryb3llZCA9ICJPVEhFUldJTkRPV0RFU1RST1lFRCI7CiBzdGF0aWMgY29uc3QgY2hhcioJbHBzdHJNc2dTaGVsbEFjdGl2YXRlID0gIkFDVElWQVRFU0hFTExXSU5ET1ciOwpAQCAtNzU0LDYgKzc1MywyOSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlTaGVsbF9Ob3RpZnlJY29uCVtTSEVMTDMyLjI0OV0KKyAqCUZJWE1FCisgKglUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGRlYWwgd2l0aCB0aGUgc3lzdHJheS4KKyAqCUFueSBpZGVhcyBvbiBob3cgdGhpcyBpcyB0byBiZSBpbXBsaW1lbnRlZD8KKyAqLworQk9PTDMyIFdJTkFQSSBTaGVsbF9Ob3RpZnlJY29uKAlEV09SRCBkd01lc3NhZ2UsCisJCQkJUE5PVElGWUlDT05EQVRBIHBuaWQgKQoreworICAgIHJldHVybiBGQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCVNoZWxsX05vdGlmeUljb24JW1NIRUxMMzIuMjQwXQorICoJRklYTUUKKyAqCVRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZGVhbCB3aXRoIHRoZSBzeXN0cmF5LgorICoJQW55IGlkZWFzIG9uIGhvdyB0aGlzIGlzIHRvIGJlIGltcGxpbWVudGVkPworICovCitCT09MMzIgV0lOQVBJIFNoZWxsX05vdGlmeUljb25BKERXT1JEIGR3TWVzc2FnZSwKKwkJCQlQTk9USUZZSUNPTkRBVEEgcG5pZCApCit7CisgICAgcmV0dXJuIEZBTFNFOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJU0hFTExfR2V0UmVzb3VyY2VUYWJsZQpAQCAtMTA0OCw3ICsxMDcwLDcgQEAKIAkJX2xjbG9zZTMyKCBoRmlsZSk7CiAJCXJldHVybiAwOwogCX0KLQlpY29uZ3JvdXByZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcocm9vdHJlc2RpciwoTFBXU1RSKVJUX0dST1VQX0lDT04sKERXT1JEKXJvb3RyZXNkaXIpOworCWljb25ncm91cHJlc2RpciA9IEdldFJlc0RpckVudHJ5Vyhyb290cmVzZGlyLChMUFdTVFIpUlRfR1JPVVBfSUNPTiwoRFdPUkQpcm9vdHJlc2RpcixGQUxTRSk7CiAJaWYgKCFpY29uZ3JvdXByZXNkaXIpIHsKIAkJZnByaW50ZihzdGRlcnIsIkludGVybmFsRXh0cmFjdEljb246IE5vIEljb25ncm91cHJlc291cmNlZGlyZWN0b3J5IVxuIik7CiAJCVVubWFwVmlld09mRmlsZShwZWltYWdlKTsKQEAgLTEwOTQsNyArMTExNiw3IEBACiAJCS8qIGdvIGRvd24gdGhpcyByZXNvdXJjZSBlbnRyeSwgbmFtZSAqLwogCQlyZXNkaXIgPSAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpKChEV09SRClyb290cmVzZGlyKyh4cmVzZW50LT51Mi5zLk9mZnNldFRvRGlyZWN0b3J5KSk7CiAJCS8qIGRlZmF1bHQgbGFuZ3VhZ2UgKDApICovCi0JCXJlc2RpciA9IEdldFJlc0RpckVudHJ5VyhyZXNkaXIsKExQV1NUUikwLChEV09SRClyb290cmVzZGlyKTsKKwkJcmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc2RpciwoTFBXU1RSKTAsKERXT1JEKXJvb3RyZXNkaXIsVFJVRSk7CiAJCWlnZGF0YWVudCA9IChMUElNQUdFX1JFU09VUkNFX0RBVEFfRU5UUlkpcmVzZGlyOwogCiAJCS8qIGxvb2t1cCBhZGRyZXNzIGluIG1hcHBlZCBpbWFnZSBmb3IgdmlydHVhbCBhZGRyZXNzICovCkBAIC0xMTE2LDEzICsxMTM4LDkgQEAKIAkJLyogZm91bmQgKi8KIAkJY2lkID0gKENVUlNPUklDT05ESVIqKWlnZGF0YTsKIAkJY2lkc1tpXSA9IGNpZDsKLQkJZnByaW50ZihzdGRlcnIsImN1cnNvcmljb25kaXIgJWQ6IGlkVHlwZSAlZCwgaWRDb3VudCAlZFxuIiwKLQkJCWksY2lkLT5pZFR5cGUsY2lkLT5pZENvdW50Ci0JCSk7CiAJCVJldFB0cltpXSA9IExvb2t1cEljb25JZEZyb21EaXJlY3RvcnlFeDMyKGlnZGF0YSxUUlVFLFNZU01FVFJJQ1NfQ1hJQ09OLFNZU01FVFJJQ1NfQ1lJQ09OLDApOwotCQlmcHJpbnRmKHN0ZGVyciwiLT4gYmVzdCBtYXRjaCBpcyAlMDh4XG4iLFJldFB0cltpXSk7CiAJfQotCWljb25yZXNkaXI9R2V0UmVzRGlyRW50cnlXKHJvb3RyZXNkaXIsKExQV1NUUilSVF9JQ09OLChEV09SRClyb290cmVzZGlyKTsKKwlpY29ucmVzZGlyPUdldFJlc0RpckVudHJ5Vyhyb290cmVzZGlyLChMUFdTVFIpUlRfSUNPTiwoRFdPUkQpcm9vdHJlc2RpcixGQUxTRSk7CiAJaWYgKCFpY29ucmVzZGlyKSB7CiAJICAgIGZwcmludGYoc3RkZXJyLCJJbnRlcm5hbEV4dHJhY3RJY29uOiBObyBJY29ucmVzb3VyY2VkaXJlY3RvcnkhXG4iKTsKIAkgICAgVW5tYXBWaWV3T2ZGaWxlKHBlaW1hZ2UpOwpAQCAtMTEzMyw4ICsxMTUxLDggQEAKIAlmb3IgKGk9MDtpPG47aSsrKSB7CiAJICAgIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZCXhyZXNkaXI7CiAKLQkgICAgeHJlc2RpciA9IEdldFJlc0RpckVudHJ5VyhpY29ucmVzZGlyLChMUFdTVFIpUmV0UHRyW2ldLChEV09SRClyb290cmVzZGlyKTsKLQkgICAgeHJlc2RpciA9IEdldFJlc0RpckVudHJ5Vyh4cmVzZGlyLChMUFdTVFIpMCwoRFdPUkQpcm9vdHJlc2Rpcik7CisJICAgIHhyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcoaWNvbnJlc2RpciwoTFBXU1RSKVJldFB0cltpXSwoRFdPUkQpcm9vdHJlc2RpcixGQUxTRSk7CisJICAgIHhyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcoeHJlc2RpciwoTFBXU1RSKTAsKERXT1JEKXJvb3RyZXNkaXIsVFJVRSk7CiAKIAkgICAgaWRhdGFlbnQgPSAoTFBJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZKXhyZXNkaXI7CiAKQEAgLTEyMTQsNiArMTIzMiwxMiBAQAogICogUmV0dXJuIGljb24gZm9yIGdpdmVuIGZpbGUgKGVpdGhlciBmcm9tIGZpbGUgaXRzZWxmIG9yIGZyb20gYXNzb2NpYXRlZAogICogZXhlY3V0YWJsZSkgYW5kIHBhdGNoIHBhcmFtZXRlcnMgaWYgbmVlZGVkLgogICovCitISUNPTjMyIFdJTkFQSSBFeHRyYWN0QXNzb2NpYXRlZEljb24zMkEoSElOU1RBTkNFMzIgaEluc3QsTFBTVFIgbHBJY29uUGF0aCwKKwlMUFdPUkQgbHBpSWNvbikKK3sKKwlyZXR1cm4gRXh0cmFjdEFzc29jaWF0ZWRJY29uMTYoaEluc3QsbHBJY29uUGF0aCxscGlJY29uKTsKK30KKwogSElDT04xNiBXSU5BUEkgRXh0cmFjdEFzc29jaWF0ZWRJY29uMTYoSElOU1RBTkNFMTYgaEluc3QsTFBTVFIgbHBJY29uUGF0aCwKIAlMUFdPUkQgbHBpSWNvbikKIHsKQEAgLTE1NDEsMjYgKzE1NjUsMTAxIEBACiAgKgogICogaHR0cDovL3ByZW1pdW0ubWljcm9zb2Z0LmNvbS9tc2RuL2xpYnJhcnkvc2RrZG9jL2FwaTJfNDhmby5odG0KICAqLwotCi0vKiBUaGlzIGlzIHRoZSB3cm9uZyBwbGFjZSwgYnV0IHdoZXJlIGlzIHRoZSByaWdodCBvbmU/ICAqLwotI2lmIDAKLSNkZWZpbmUgRV9PVVRPRk1FTU9SWSAweDgwMDcwMDBFTAotCi1IUkVTVUxUMzIgV0lOQVBJIFNIRUxMMzJfRGxsR2V0Q2xhc3NPYmplY3QgKFJFRkNMU0lEMzIgY2xzaWQsCi0JCQkJCSAgICBSRUZJSUQzMiByaWlkLAotCQkJCQkgICAgTFBWT0lEICpwcHYpCitEV09SRCBXSU5BUEkgU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsUkVGSUlEIGlpZCxMUFZPSUQgKnBwdikKIHsKLSAgSFJFU1VMVDMyIGhyZXMgPSBFX09VVE9GTUVNT1JZOyAKLSAgKnBwdiA9IE5VTEw7IAorICAgIGNoYXIJeGNsc2lkWzUwXSx4aWlkWzUwXTsKKyAgICBIUkVTVUxUCWhyZXMgPSBFX09VVE9GTUVNT1JZOwogCi0gIGZwcmludGYgKHN0ZG5pbXAsICJTSEVMTDMyX0RsbEdldENsYXNzT2JqZWN0ICgweCV4LDB4JXgsJXApIC0tIFNUVUJcbiIsCi0JICAgY2xzaWQsIHJpaWQsIHBwdik7CiAKLSAgcmV0dXJuIGhyZXM7Ci19Ci0jZW5kaWYKKyAgICBTdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmNsc2lkLHhjbHNpZCk7CisgICAgU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKWlpZCx4aWlkKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwiU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdCglcywlcywlcClcbiIseGNsc2lkLHhpaWQscHB2KTsKIAotRFdPUkQgV0lOQVBJIFNIR2V0RGVza3RvcEZvbGRlcihMUFNIRUxMRk9MREVSICpzaGVsbGZvbGRlcikgewotCSpzaGVsbGZvbGRlciA9IE5VTEw7CisgICAgKnBwdiA9IE5VTEw7CisvKiBTREsgZXhhbXBsZSBjb2RlIGxvb2tzIGxpa2UgdGhpczoKKyAqCisgICAgSFJFU1VMVAlocmVzID0gRV9PVVRPRk1FTU9SWTsKKworICAgICpwcHYgPSBOVUxMOworICAgIENDbGFzc0ZhY3RvcnkgKnBDbGFzc0ZhY3RvcnkgPSBuZXcgQ0NsYXNzRmFjdG9yeShyY2xzaWQpOworICAgIAorICAgIGlmIChwQ2xhc3NGYWN0b3J5KSB7CisgICAgCWhSZXMgPSBwQ2xhc3NGYWN0b3J5LT5RdWVyeUludGVyZmFjZShyaWlkLHBwdik7CisJcENsYXNzRmFjdG9yeS0+UmVsZWFzZSgpOworICAgIH0KKyAgICByZXR1cm4gaFJlczsKKyAqCisgKiBUaGUgbWFnaWMgb2YgdGhlIHdob2xlIHN0dWZmIGlzIHN0aWxsIHVuY2xlYXIgdG8gbWUsIHNvIGp1c3QgaGFjayB0b2dldGhlciAKKyAqIHNvbWV0aGluZy4KKyAqLworICAKKyAgICBpZiAoIW1lbWNtcChyY2xzaWQsJkNMU0lEX1NoZWxsRGVza3RvcCxzaXplb2YoQ0xTSURfU2hlbGxEZXNrdG9wKSkpIHsKKyAgICAJZnByaW50ZihzdGRlcnIsIglyZXF1ZXN0ZWQgQ0xTSURfU2hlbGxEZXNrdG9wLCBjcmVhdGluZyBpdC5cbiIpOworCSpwcHYgPSBJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IoKTsKKwkvKiBGSVhNRTogSW5pdGlhbGl6ZSB0aGlzIGZvbGRlciB0byBiZSB0aGUgc2hlbGwgZGVza3RvcCBmb2xkZXIgKi8KIAlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBmcHJpbnRmIChzdGRuaW1wLCAiCS0+IGNsc2lkIG5vdCBmb3VuZC4gcmV0dXJuaW5nIEVfT1VUT0ZNRU1PUlkuXG4iKTsKKyAgICByZXR1cm4gaHJlczsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJIFNIR2V0RGVza3RvcEZvbGRlcgkJW1NIRUxMMzIuMjE2XQorICogcmV0dXJucyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBzaGVsbCBkZXNrdG9wIGZvbGRlci4KKyAqCisgKiBbU0RLIGhlYWRlciB3aW45NS9zaGxvYmouaDogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGwgQ29DcmVhdGVJbnN0YW5jZSB3aXRoCisgKiAgQ0xTSURfU2hlbGxEZXNrdG9wLgorICoKKyAqICBDb0NyZWF0ZUluc3RhbmNlKENMU0lEX0Rlc2t0b3AsIE5VTEwsCisgKiAgICAgICAgICAgICAgICAgICBDTFNDVFhfSU5QUk9DLCBJSURfSVNoZWxsRm9sZGVyLCAmcHNoZik7CisgKiBdCisgKiBTbyB3aGF0IHdlIGFyZSBkb2luZyBpcyBjdXJyZW50bHkgd3JvbmcuLi4uCisgKi8KK0RXT1JEIFdJTkFQSSBTSEdldERlc2t0b3BGb2xkZXIoTFBTSEVMTEZPTERFUiAqc2hlbGxmb2xkZXIpIHsKKwkqc2hlbGxmb2xkZXIgPSBJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IoKTsKKwlyZXR1cm4gTk9FUlJPUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJIFNIR2V0TWFsbG9jCQkJW1NIRUxMMzIuMjIwXQorICogcmV0dXJucyB0aGUgaW50ZXJmYWNlIHRvIHNoZWxsIG1hbGxvYy4KKyAqCisgKiBbU0RLIGhlYWRlciB3aW45NS9zaGxvYmouaDoKKyAqIGVxdWl2YWxlbnQgdG86ICAjZGVmaW5lIFNIR2V0TWFsbG9jKHBwbWVtKSAgIENvR2V0TWFsbG9jKE1FTUNUWF9UQVNLLCBwcG1lbSkKKyAqIF0KKyAqIFdoYXQgd2UgYXJlIGN1cnJlbnRseSBkb2luZyBpcyBub3QgdmVyeSB3cm9uZywgc2luY2Ugd2UgYWx3YXlzIHVzZSB0aGUgc2FtZQorICogaGVhcCAoUHJvY2Vzc0hlYXApLgorICovCitEV09SRCBXSU5BUEkgU0hHZXRNYWxsb2MoTFBNQUxMT0MgKmxwbWFsKSB7CisJZnByaW50ZihzdGRlcnIsIlNIR2V0TWFsbG9jKClcbiIpOworCSpscG1hbCA9IElNYWxsb2NfQ29uc3RydWN0b3IoKTsKKwlyZXR1cm4gTk9FUlJPUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJIFNIR2V0U3BlY2lhbEZvbGRlckxvY2F0aW9uCVtTSEVMTDMyLjIyM10KKyAqIHJldHVybnMgdGhlIFBJREwgb2YgYSBzcGVjaWFsIGZvbGRlcgorICoKKyAqIG5Gb2xkZXIgaXMgYSBDU0lETF94eHh4eC4KKyAqLworSFJFU1VMVCBXSU5BUEkgU0hHZXRTcGVjaWFsRm9sZGVyTG9jYXRpb24oSFdORDMyIGh3bmRPd25lciwgSU5UMzIgbkZvbGRlciwgTFBJVEVNSURMSVNUICogcHBpZGwpIHsKKwlmcHJpbnRmKHN0ZGVyciwiU0hHZXRTcGVjaWFsRm9sZGVyTG9jYXRpb24oJTA0eCwlZCwlcCksc3R1YiFcbiIsCisJCWh3bmRPd25lcixuRm9sZGVyLHBwaWRsCisJKTsKKwkqcHBpZGwgPSAoTFBJVEVNSURMSVNUKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsMipzaXplb2YoSVRFTUlETElTVCkpOworCS8qIEZJWE1FOiB3ZSByZXR1cm4gb25seSB0aGUgZW1wdHkgSVRFTUlETElTVCBjdXJyZW50bHkuICovCisJKCpwcGlkbCktPm1raWQuY2IgPSAwOworCXJldHVybiBOT0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkgU0hHZXRQYXRoRnJvbUlETGlzdAkJW1NIRUxMMzIuMjIxXQorICogcmV0dXJucyB0aGUgcGF0aCBmcm9tIGEgcGFzc2VkIFBJREwuCisgKi8KK0JPT0wzMiBXSU5BUEkgU0hHZXRQYXRoRnJvbUlETGlzdChMUENJVEVNSURMSVNUIHBpZGwsTFBTVFIgcHN6UGF0aCkgeworCWZwcmludGYoc3RkZXJyLCJTSEdldFBhdGhGcm9tSURMaXN0KCVwLCVwKSxzdHViIVxuIixwaWRsLHBzelBhdGgpOworCWxzdHJjcHkzMkEocHN6UGF0aCwiRTpcXCIpOyAvKiBGSVhNRSAqLworCXJldHVybiBOT0VSUk9SOworfQorCmRpZmYgLS1naXQgYS9taXNjL3NoZWxsb3JkLmMgYi9taXNjL3NoZWxsb3JkLmMKaW5kZXggZjNhMTE5MS4uM2ExYTZkYyAxMDA2NDQKLS0tIGEvbWlzYy9zaGVsbG9yZC5jCisrKyBiL21pc2Mvc2hlbGxvcmQuYwpAQCAtMzIsNiArMzIsODEgQEAKICNpbmNsdWRlICJ3aW5yZWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBTSEVMTDMyXzIgICAJCQlbU0hFTEwzMi4yXQorICovCitEV09SRCBXSU5BUEkgU0hFTEwzMl8yKEhXTkQzMiBod25kLERXT1JEIHgyLERXT1JEIHgzLERXT1JEIHg0LERXT1JEIHg1LERXT1JEIHg2KSB7CisJZnByaW50ZihzdGRlcnIsIlNIRUxMMzJfMigweCUwNHgsMHglMDhseCwweCUwOGx4LDB4JTA4bHgsMHglMDhseCwweCUwOGx4KSxzdHViIVxuIiwKKwkJaHduZCx4Mix4Myx4NCx4NSx4NgorCSk7CisJcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIFNIRUxMMzJfMTYgICAJCQlbU0hFTEwzMi4xNl0KKyAqIGZpbmRfbGFzdGl0ZW1faW5faXRlbWlkbGlzdCgpCisgKi8KK0xQU0hJVEVNSUQgV0lOQVBJIFNIRUxMMzJfMTYoTFBJVEVNSURMSVNUIGlpbCkgeworCUxQU0hJVEVNSUQJbGFzdHNpaSxzaWk7CisKKwlpZiAoIWlpbCkKKwkJcmV0dXJuIE5VTEw7CisJc2lpID0gJihpaWwtPm1raWQpOworCWxhc3RzaWkgPSBzaWk7CisJd2hpbGUgKHNpaS0+Y2IpIHsKKwkJbGFzdHNpaSA9IHNpaTsKKwkJc2lpID0gKExQU0hJVEVNSUQpKCgoY2hhciopc2lpKStzaWktPmNiKTsKKwl9CisJcmV0dXJuIGxhc3RzaWk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIFNIRUxMMzJfMjkgICAJCQlbU0hFTEwzMi4yOV0KKyAqIGlzX3Jvb3RkaXIoY29uc3QgY2hhcipwYXRoKQorICovCitCT09MMzIgV0lOQVBJIFNIRUxMMzJfMjkoTFBDU1RSIHgpIHsKKwlpZiAoIWxzdHJjbXAzMkEoeCsxLCI6XFwiKSkJCS8qICJYOlwiICovCisJCXJldHVybiAxOworCWlmICghbHN0cmNtcDMyQSh4LCJcXCIpKQkJLyogIlwiICovCisJCXJldHVybiAxOworCWlmICh4WzBdPT0nXFwnICYmIHhbMV09PSdcXCcpIHsJCS8qIFVOQyAiXFw8eHg+XCIgKi8KKwkJaW50CWZvdW5kYmFja3NsYXNoID0gMDsKKwkJeD14KzI7CisJCXdoaWxlICgqeCkgeworCQkJaWYgKCp4Kys9PSdcXCcpCisJCQkJZm91bmRiYWNrc2xhc2grKzsKKwkJfQorCQlpZiAoZm91bmRiYWNrc2xhc2g8PTEpCS8qIG1heCAxIFwgbW9yZSAuLi4gKi8KKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBTSEVMTDMyXzMwICAgCQkJW1NIRUxMMzIuMzBdCisgKiBnZXRfcm9vdGRpcihjaGFyKnBhdGgsaW50IGRyaXZlKQorICovCitEV09SRCBXSU5BUEkgU0hFTEwzMl8zMChMUFNUUiByb290LEJZVEUgZHJpdmUpIHsKKwlzdHJjcHkocm9vdCwiQTpcXCIpOworCXJvb3RbMF0rPWRyaXZlOworCXJldHVybiByb290OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCVNIRUxMMzJfMzEgICAgICBbU0hFTEwzMi4zMV0KKyAqIHJldHVybnMgcG9pbnRlciB0byBsYXN0IC4gaW4gbGFzdCBwYXRoY29tcG9uZW50IG9yIGF0IFwwLgorICovCitMUFNUUiBXSU5BUEkgU0hFTEwzMl8zMShMUFNUUiBwYXRoKSB7CisgICAgTFBTVFIgICBsYXN0cG9pbnQgPSBOVUxMOworCisgICAgd2hpbGUgKCpwYXRoKSB7CisJaWYgKCpwYXRoPT0nXFwnfHwqcGF0aD09JyAnKQorCSAgICBsYXN0cG9pbnQ9TlVMTDsKKwlpZiAoKnBhdGg9PScuJykKKwkgICAgbGFzdHBvaW50PXBhdGg7CisJcGF0aCsrOworICAgIH0KKyAgICByZXR1cm4gbGFzdHBvaW50P2xhc3Rwb2ludDpwYXRoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJU0hFTEwzMl8zMglbU0hFTEwzMi4zMl0KICAqIGFwcGVuZCBcIGlmIHRoZXJlIGlzIG5vbmUKICAqLwpAQCAtNDgsNiArMTIzLDI3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlTSEVMTDMyXzMzICAgICAgW1NIRUxMMzIuMzNdCisgKiByZW1vdmUgc3BhY2VzIGZyb20gYmVnaW5uaW5nIGFuZCBlbmQgb2YgcGFzc2VkIHN0cmluZworICovCitMUFNUUiBXSU5BUEkgU0hFTEwzMl8zMyhMUFNUUiBzdHIpIHsKKyAgICBMUFNUUiB4ID0gc3RyOworCisgICAgd2hpbGUgKCp4PT0nICcpIHgrKzsKKyAgICBpZiAoeCE9c3RyKQorCWxzdHJjcHkzMkEoc3RyLHgpOworICAgIGlmICghKnN0cikKKwlyZXR1cm4gc3RyOworICAgIHg9c3RyK3N0cmxlbihzdHIpLTE7CisgICAgd2hpbGUgKCp4PT0nICcpCisJeC0tOworICAgIGlmICgqeD09JyAnKQorCSp4PSdcMCc7CisgICAgcmV0dXJuIHg7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCVNIRUxMMzJfMzQJW1NIRUxMMzIuMzRdCiAgKiBiYXNlbmFtZShjaGFyICpmbik7CiAgKi8KQEAgLTEzNSw2ICsyMzEsMjcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCVNIRUxMMzJfMzkJW1NIRUxMMzIuMzldCisgKiBpc1VOQyhjb25zdCBjaGFyKnBhdGgpOworICovCitCT09MMzIgV0lOQVBJIFNIRUxMMzJfMzkoTFBDU1RSIHBhdGgpIHsKKwlpZiAoKHBhdGhbMF09PSdcXCcpICYmIChwYXRoWzFdPT0nXFwnKSkKKwkJcmV0dXJuIFRSVUU7CisJcmV0dXJuIEZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJU0hFTEwzMl80NQlbU0hFTEwzMi40NV0KKyAqIGZpbGVfZXhpc3RzKGNoYXIgKmZuKTsKKyAqLworQk9PTDMyIFdJTkFQSSBTSEVMTDMyXzQ1KExQU1RSIGZuKSB7CisgICAgaWYgKEdldEZpbGVBdHRyaWJ1dGVzMzJBKGZuKT09LTEpCisgICAgCXJldHVybiBGQUxTRTsKKyAgICBlbHNlCisgICAgCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJU0hFTEwzMl81MglbU0hFTEwzMi41Ml0KICAqIGxvb2sgZm9yIG5leHQgYXJnIGluIHN0cmluZy4gaGFuZGxlICJxdW90ZWQiIHN0cmluZ3MKICAqIHJldHVybnMgcG9pbnRlciB0byBhcmd1bWVudCAqQUZURVIqIHRoZSBzcGFjZS4gT3IgdG8gdGhlIFwwLgpAQCAtMTUzLDE0ICsyNzAsOTUgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCVNIRUxMMzJfNDUJW1NIRUxMMzIuNDVdCi0gKiBmaWxlX2V4aXN0cyhjaGFyICpmbik7CisgKgkJCQlTSEVMTDMyXzU2ICAgICAgW1NIRUxMMzIuNTZdCisgKiB1bnF1b3RlIHN0cmluZyAocmVtb3ZlICIpCiAgKi8KLUJPT0wzMiBXSU5BUEkgU0hFTEwzMl80NShMUFNUUiBmbikgewotICAgIGlmIChHZXRGaWxlQXR0cmlidXRlczMyQShmbik9PS0xKQotICAgIAlyZXR1cm4gRkFMU0U7Ci0gICAgZWxzZQotICAgIAlyZXR1cm4gVFJVRTsKK1ZPSUQgV0lOQVBJIFNIRUxMMzJfNTYoTFBTVFIgc3RyKSB7CisgICAgRFdPUkQgICAgICBsZW4gPSBsc3RybGVuMzJBKHN0cik7CisKKyAgICBpZiAoKnN0ciE9JyInKSByZXR1cm47CisgICAgaWYgKHN0cltsZW4tMV0hPSciJykgcmV0dXJuOworICAgIHN0cltsZW4tMV09J1wwJzsKKyAgICBsc3RyY3B5MzJBKHN0cixzdHIrMSk7CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIFNIRUxMMzJfNTggICAJCQlbU0hFTEwzMi41OF0KKyAqLworRFdPUkQgV0lOQVBJIFNIRUxMMzJfNTgoTFBDU1RSIHNyYyxEV09SRCB4MixMUFNUUiB0YXJnZXQsRFdPUkQgcGF0aGxlbikgeworCWZwcmludGYoc3RkZXJyLCJTSEVMTDMyXzU4KCVzLDB4JTA4bHgsJXAsJWxkKSxTVFVCIVxuIiwKKwkJc3JjLHgyLHRhcmdldCxwYXRobGVuCisJKTsKKwlpZiAoIXNyYykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkgCQkgU0hFTEwzMl82MiAgIAkJCVtTSEVMTDMyLjYyXQorICovCitEV09SRCBXSU5BUEkgU0hFTEwzMl82MihEV09SRCB4LERXT1JEIHksRFdPUkQgeixEV09SRCBhKSB7CisJZnByaW50ZihzdGRlcnIsIlNIRUxMMzJfNjIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLHgseSx6LGEpOworCXJldHVybiAweGZmZmZmZmZmOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgU0hFTEwzMl82MyAgICAgICAgICAgICAgICAgICAgIFtTSEVMTDMyLjYzXQorICovCitEV09SRCBXSU5BUEkgU0hFTEwzMl82MyhIV05EMzIgaG93bmVyLCBMUFNUUiB0YXJnZXRidWYsIERXT1JEIGxlbiwgRFdPUkQgeCwgTFBDU1RSIHN1ZmZpeCwgTFBDU1RSIHksIExQQ1NUUiBjbWQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiU0hFTEwzMl82MyglMDR4LCVwLCVsZCwlMDhseCwlcywlcywlcyksc3R1YiFcbiIsCisJICAgIGhvd25lcix0YXJnZXRidWYsbGVuLHgsc3VmZml4LHksY21kCisgICAgKTsKKyAgICAvKiBwdXRzIHVwIGEgT3BlbiBEaWFsb2cgYW5kIHJlcXVlc3RzIGlucHV0IGludG8gdGFyZ2V0YnVmICovCisgICAgLyogT0ZOX0hJREVSRUFET05MWXxPRk5fTk9DSEFOR0VESVJ8T0ZOX0ZJTEVNVVNURVhJU1R8T0ZOX3Vua25vd24gKi8KKyAgICBsc3RyY3B5MzJBKHRhcmdldGJ1ZiwieDpcXHMzLmV4ZSIpOworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgU0hFTEwzMl82OCAgICAgICAgICAgICAgICAgICAgIFtTSEVMTDMyLjY4XQorICovCitEV09SRCBXSU5BUEkgU0hFTEwzMl82OChEV09SRCB4LERXT1JEIHksRFdPUkQgeikgeworCWZwcmludGYoc3RkZXJyLCJTSEVMTDMyXzY4KDB4JTA4bHgsMHglMDhseCwweCUwOGx4KSxzdHViIVxuIiwKKwkJeCx5LHoKKwkpOworCXJldHVybiAwOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJIFNIRUxMMzJfNzEgICAJCQlbU0hFTEwzMi43MV0KKyAqIHJldHVybnMgaW50ZXJuYWwgc2hlbGwgdmFsdWVzIGluIHRoZSBwYXNzZWQgcG9pbnRlcnMKKyAqLworQk9PTDMyIFdJTkFQSSBTSEVMTDMyXzcxKExQRFdPUkQgeCxMUERXT1JEIHkpIHsKKworCWZwcmludGYoc3RkZXJyLCJTSEVMTDMyXzcxKCVwLCVwKSxzdHViIVxuIix4LHkpOworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkgU0hFTEwzMl83MiAgIAkJCVtTSEVMTDMyLjcyXQorICogZHVubm8uIHNvbWV0aGluZyB3aXRoIGljb25zCisgKi8KK3ZvaWQgV0lOQVBJIFNIRUxMMzJfNzIoTFBTVFIgeCxEV09SRCB5LERXT1JEIHopIHsKKwlmcHJpbnRmKHN0ZGVyciwiU0hFTEwzMl83MiglcywlMDhseCwlMDhseCksc3R1YiFcbiIseCx5LHopOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkgU0hFTEwzMl84OSAgIAkJCVtTSEVMTDMyLjg5XQorICovCitEV09SRCBXSU5BUEkgU0hFTEwzMl84OShEV09SRCB4MSxEV09SRCB4MixEV09SRCB4MykgeworCWZwcmludGYoc3RkZXJyLCJTSEVMTDMyXzg5KDB4JTA4bHgsMHglMDhseCwweCUwOGx4KSxzdHViIVxuIiwKKwkJeDEseDIseDMKKwkpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJU0hFTEwzMl8xMTkJW1NIRUxMMzIuMTE5XQorICogdW5rbm93bgorICovCit2b2lkIFdJTkFQSSBTSEVMTDMyXzExOShMUFZPSUQgeCkgeworICAgIGZwcmludGYoc3RkZXJyLCJTSEVMTDMyXzExOSglcCglcykpLHN0dWJcbiIseCwoY2hhciAqKXgpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTgyLDE0ICszODAsNiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJU0hFTEwzMl8xMTkJW1NIRUxMMzIuMTE5XQotICogdW5rbm93bgotICovCi12b2lkIFdJTkFQSSBTSEVMTDMyXzExOShMUFZPSUQgeCkgewotICAgIGZwcmludGYoc3RkZXJyLCJTSEVMTDMyXzExOSglcCksc3R1YlxuIix4KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCVNIRUxMMzJfNzUJW1NIRUxMMzIuNzVdCiAgKiB1bmtub3duCiAgKi8KQEAgLTE5OCwxNiArMzg4LDI2IEBACiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKLURXT1JEIFdJTkFQSQotU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdChSRUZDTFNJRCAqY2xzaWQsUkVGSUlEICppaWQsTFBWT0lEICp4KSB7Ci0JY2hhcgl4Y2xzaWRbNTBdLHhpaWRbNTBdOwotCi0JU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKWNsc2lkLHhjbHNpZCk7Ci0JU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKWlpZCx4aWlkKTsKLQlmcHJpbnRmKHN0ZGVyciwiU0hFTEwzMl9EbGxHZXRDbGFzc09iamVjdCglcywlcywlcCksIFNUVUJcbiIseGNsc2lkLHhpaWQseCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIFNIRUxMMzJfNzcgICAJCQlbU0hFTEwzMi43N10KKyAqLworRFdPUkQgV0lOQVBJIFNIRUxMMzJfNzcoRFdPUkQgeCxEV09SRCB5LERXT1JEIHopIHsKKwlmcHJpbnRmKHN0ZGVyciwiU0hFTEwzMl83NyglMDhseCwlMDhseCwlMDhseCksc3R1YiFcbiIseCx5LHopOwogCXJldHVybiAwOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIFNIRUxMMzJfNzkgICAJCQlbU0hFTEwzMi43OV0KKyAqIGNyZWF0ZV9kaXJlY3RvcnlfYW5kX25vdGlmeSguLi4pCisgKi8KK0RXT1JEIFdJTkFQSSBTSEVMTDMyXzc5KExQQ1NUUiBkaXIsTFBWT0lEIHh2b2lkKSB7CisJZnByaW50ZihzdGRlcnIsIm1rZGlyICVzLCVwXG4iLGRpcix4dm9pZCk7CisJaWYgKCFDcmVhdGVEaXJlY3RvcnkzMkEoZGlyLHh2b2lkKSkKKwkJcmV0dXJuIEZBTFNFOworCS8qIFNIQ2hhbmdlTm90aWZ5KDgsMSxkaXIsMCk7ICovCisJcmV0dXJuIFRSVUU7Cit9CisKIHN0YXRpYyBGQVJQUk9DMzIgX2ZpbmRfbW9kdWxlcHJvYyhMUFNUUiBkbGxuYW1lLEhNT0RVTEUzMiAqeGhtb2QsTFBTVFIgbmFtZSkgewogCUhNT0RVTEUzMglobW9kOwogCUZBUlBST0MzMglkbGx1bmxvYWQsbmFtZXByb2M7CkBAIC0yMzYsMTggKzQzNiwyNiBAQAogKSB7CiAJRFdPUkQJV0lOQVBJCSgqZGxsZ2V0Y2xhc3NvYikoUkVGQ0xTSUQsUkVGSUlELExQVk9JRCk7CiAJRFdPUkQJCWhyZXM7CisvKgogCUxQQ0xBU1NGQUNUT1JZCWNsYXNzZmFjOworICovCiAKIAlkbGxnZXRjbGFzc29iID0gKERXT1JEKCopKFJFRkNMU0lELFJFRklJRCxMUFZPSUQpKV9maW5kX21vZHVsZXByb2MoZGxsbmFtZSxOVUxMLCJEbGxHZXRDbGFzc09iamVjdCIpOwogCWlmICghZGxsZ2V0Y2xhc3NvYikKIAkJcmV0dXJuIDB4ODAwNzAwMDB8R2V0TGFzdEVycm9yKCk7CiAKLQlocmVzID0gKCpkbGxnZXRjbGFzc29iKShjbHNpZCwoUkVGSUlEKSZJSURfSUNsYXNzRmFjdG9yeSwmY2xhc3NmYWMpOworLyogRklYTUUgKi8KKwlocmVzID0gKCpkbGxnZXRjbGFzc29iKShjbHNpZCwoUkVGSUlEKSZJSURfSUNsYXNzRmFjdG9yeSxpbnN0KTsKIAlpZiAoaHJlczwwKQogCQlyZXR1cm4gaHJlczsKIAorLyoKKwlocmVzID0gKCpkbGxnZXRjbGFzc29iKShjbHNpZCwoUkVGSUlEKSZJSURfSUNsYXNzRmFjdG9yeSwmY2xhc3NmYWMpOworCWlmIChocmVzPDApCisJCXJldHVybiBocmVzOwogCWNsYXNzZmFjLT5scHZ0YmwtPmZuQ3JlYXRlSW5zdGFuY2UoY2xhc3NmYWMsdW5rbm93bm91dGVyLHJlZmlpZCxpbnN0KTsKIAljbGFzc2ZhYy0+bHB2dGJsLT5mblJlbGVhc2UoY2xhc3NmYWMpOworICovCiAJcmV0dXJuIDA7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzIxLDI0ICs1MjksNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCSBTSEVMTDMyXzcxICAgCQkJW1NIRUxMMzIuNzFdCi0gKiByZXR1cm5zIGludGVybmFsIHNoZWxsIHZhbHVlcyBpbiB0aGUgcGFzc2VkIHBvaW50ZXJzCi0gKi8KLUJPT0wzMiBXSU5BUEkgU0hFTEwzMl83MShMUERXT1JEIHgsTFBEV09SRCB5KSB7Ci0KLQlmcHJpbnRmKHN0ZGVyciwiU0hFTEwzMl83MSglcCwlcCksc3R1YiFcbiIseCx5KTsKLQlyZXR1cm4gVFJVRTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJIFNIRUxMMzJfNzIgICAJCQlbU0hFTEwzMi43Ml0KLSAqIGR1bm5vLiBzb21ldGhpbmcgd2l0aCBpY29ucwotICovCi12b2lkIFdJTkFQSSBTSEVMTDMyXzcyKExQU1RSIHgsRFdPUkQgeSxEV09SRCB6KSB7Ci0JZnByaW50ZihzdGRlcnIsIlNIRUxMMzJfNzIoJXMsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLHgseSx6KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJIFNIRUxMMzJfMTAwICAgCQkJW1NIRUxMMzIuMTAwXQogICogd2Fsa3MgdGhyb3VnaCBwb2xpY3kgdGFibGUsIHF1ZXJpZXMgPGFwcD4ga2V5LCA8dHlwZT4gdmFsdWUsIHJldHVybnMgCiAgKiBxdWVyaWVkIChEV09SRCkgdmFsdWUuCkBAIC0zNzUsNTYgKzU2NSw2IEBACiAJCiB9CiAKLURXT1JEIFdJTkFQSSBTSEVMTDMyXzc3KERXT1JEIHgsRFdPUkQgeSxEV09SRCB6KSB7Ci0JZnByaW50ZihzdGRlcnIsIlNIRUxMMzJfNzcoJTA4bHgsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLHgseSx6KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBTSEVMTDMyXzc5ICAgCQkJW1NIRUxMMzIuNzldCi0gKiBjcmVhdGVfZGlyZWN0b3J5X2FuZF9ub3RpZnkoLi4uKQotICovCi1EV09SRCBXSU5BUEkgU0hFTEwzMl83OShMUENTVFIgZGlyLExQVk9JRCB4dm9pZCkgewotCWZwcmludGYoc3RkZXJyLCJta2RpciAlcywlcFxuIixkaXIseHZvaWQpOwotCWlmICghQ3JlYXRlRGlyZWN0b3J5MzJBKGRpcix4dm9pZCkpCi0JCXJldHVybiBGQUxTRTsKLQkvKiBTSENoYW5nZU5vdGlmeSg4LDEsZGlyLDApOyAqLwotCXJldHVybiBUUlVFOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJIAkJIFNIRUxMMzJfMTY1ICAgCQkJW1NIRUxMMzIuMTY1XQotICogY3JlYXRlX3BhdGhfYW5kX25vdGlmeSguLi4pCi0gKi8KLURXT1JEIFdJTkFQSSBTSEVMTDMyXzE2NShEV09SRCB4LExQQ1NUUiBwYXRoKSB7Ci0JaWYgKFNIRUxMMzJfNzkocGF0aCwoTFBWT0lEKXgpKQotCQlyZXR1cm4gMDsKLQlmcHJpbnRmKHN0ZGVyciwiU0hFTEwzMl8xNjUoJTA4bHgsJXMpLHN0dWIhXG4iLHgscGF0aCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgU0hFTEwzMl8yOSAgIAkJCVtTSEVMTDMyLjI5XQotICogaXNfcm9vdGRpcihjb25zdCBjaGFyKnBhdGgpCi0gKi8KLUJPT0wzMiBXSU5BUEkgU0hFTEwzMl8yOShMUENTVFIgeCkgewotCWlmICghbHN0cmNtcDMyQSh4KzEsIjpcXCIpKQkJLyogIlg6XCIgKi8KLQkJcmV0dXJuIDE7Ci0JaWYgKCFsc3RyY21wMzJBKHgsIlxcIikpCQkvKiAiXCIgKi8KLQkJcmV0dXJuIDE7Ci0JaWYgKHhbMF09PSdcXCcgJiYgeFsxXT09J1xcJykgewkJLyogVU5DICJcXDx4eD5cIiAqLwotCQlpbnQJZm91bmRiYWNrc2xhc2ggPSAwOwotCQl4PXgrMjsKLQkJd2hpbGUgKCp4KSB7Ci0JCQlpZiAoKngrKz09J1xcJykKLQkJCQlmb3VuZGJhY2tzbGFzaCsrOwotCQl9Ci0JCWlmIChmb3VuZGJhY2tzbGFzaDw9MSkJLyogbWF4IDEgXCBtb3JlIC4uLiAqLwotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJIAkJIFNIRUxMMzJfMTUyICAgCQkJW1NIRUxMMzIuMTUyXQogICogaXRlbWxpc3RfbGVuZ3RoCkBAIC00NDMsNiArNTgzLDM0IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICBTSEVMTDMyXzE1OCAgICAgICAgICAgICAgICAgICAgW1NIRUxMMzIuMTU4XQorICovCitMUFNUUiBXSU5BUEkgU0hFTEwzMl8xNTgoTFBTVFIgcGF0aCxEV09SRCB5LERXT1JEIHopIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiU0hFTEwzMl8xNTgoJXMsJTA4bHgsJTA4bHgpXG4iLHBhdGgseSx6KTsKKyAgICBwYXRoID0gU0hFTEwzMl8zMShwYXRoKTsKKyAgICByZXR1cm4gKnBhdGg/KHBhdGgrMSk6cGF0aDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAJCSBTSEVMTDMyXzE2NSAgIAkJCVtTSEVMTDMyLjE2NV0KKyAqIGNyZWF0ZV9wYXRoX2FuZF9ub3RpZnkoLi4uKQorICovCitEV09SRCBXSU5BUEkgU0hFTEwzMl8xNjUoRFdPUkQgeCxMUENTVFIgcGF0aCkgeworCWlmIChTSEVMTDMyXzc5KHBhdGgsKExQVk9JRCl4KSkKKwkJcmV0dXJuIDA7CisJZnByaW50ZihzdGRlcnIsIlNIRUxMMzJfMTY1KCUwOGx4LCVzKSxzdHViIVxuIix4LHBhdGgpOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJIAkJIFNIRUxMMzJfMTk1ICAgCQkJW1NIRUxMMzIuMTk1XQorICogZnJlZV9wdHIoKSAtIGZyZWVzIG1lbW9yeSB1c2luZyBJTWFsbG9jCisgKi8KK0RXT1JEIFdJTkFQSSBTSEVMTDMyXzE5NShMUFZPSUQgeCkgeworCXJldHVybiBMb2NhbEZyZWUzMigoSEFORExFMzIpeCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgCQkgU0hFTEwzMl8xOTYgICAJCQlbU0hFTEwzMi4xOTZdCiAgKiB2b2lkICp0YXNrX2FsbG9jKERXT1JEIGxlbiksIHVzZXMgU0hNYWxsb2MgYWxsb2NhdG9yCiAgKi8KQEAgLTQ4MSwzMiArNjQ5LDYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAJCSBTSEVMTDMyXzE2ICAgCQkJW1NIRUxMMzIuMTZdCi0gKiBmaW5kX2xhc3RpdGVtX2luX2l0ZW1pZGxpc3QoKQotICovCi1MUFNISVRFTUlEIFdJTkFQSSBTSEVMTDMyXzE2KExQSVRFTUlETElTVCBpaWwpIHsKLQlMUFNISVRFTUlECWxhc3RzaWksc2lpOwotCi0JaWYgKCFpaWwpCi0JCXJldHVybiBOVUxMOwotCXNpaSA9ICYoaWlsLT5ta2lkKTsKLQlsYXN0c2lpID0gc2lpOwotCXdoaWxlIChzaWktPmNiKSB7Ci0JCWxhc3RzaWkgPSBzaWk7Ci0JCXNpaSA9IChMUFNISVRFTUlEKSgoKGNoYXIqKXNpaSkrc2lpLT5jYik7Ci0JfQotCXJldHVybiBsYXN0c2lpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJIAkJIFNIRUxMMzJfMTk1ICAgCQkJW1NIRUxMMzIuMTk1XQotICogZnJlZV9wdHIoKSAtIGZyZWVzIG1lbW9yeSB1c2luZyBJTWFsbG9jCi0gKi8KLURXT1JEIFdJTkFQSSBTSEVMTDMyXzE5NShMUFZPSUQgeCkgewotCXJldHVybiBMb2NhbEZyZWUzMigoSEFORExFMzIpeCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgCQkgU0hFTEwzMl8xNTUgICAJCQlbU0hFTEwzMi4xNTVdCiAgKiBmcmVlX2NoZWNrX3B0ciAtIGZyZWVzIG1lbW9yeSAoaWYgbm90IE5VTEwpIGFsbG9jYXRlZCBieSBTSE1hbGxvYyBhbGxvY2F0b3IKICAqLwpAQCAtNTE1LDExICs2NTcsMyBAQAogCQlyZXR1cm4gMDsKIAlyZXR1cm4gU0hFTEwzMl8xOTUoeCk7CiB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkgCQkgU0hFTEwzMl82MiAgIAkJCVtTSEVMTDMyLjYyXQotICovCi1EV09SRCBXSU5BUEkgU0hFTEwzMl82MihEV09SRCB4LERXT1JEIHksRFdPUkQgeixEV09SRCBhKSB7Ci0JZnByaW50ZihzdGRlcnIsIlNIRUxMMzJfNjIoJTA4bHgsJTA4bHgsJTA4bHgsJTA4bHgpLHN0dWIhXG4iLHgseSx6LGEpOwotCXJldHVybiAweGZmZmZmZmZmOwotfQpkaWZmIC0tZ2l0IGEvbWlzYy90b29saGVscC5jIGIvbWlzYy90b29saGVscC5jCmluZGV4IGM5Y2VhYmIuLmFmYmRjNDYgMTAwNjQ0Ci0tLSBhL21pc2MvdG9vbGhlbHAuYworKysgYi9taXNjL3Rvb2xoZWxwLmMKQEAgLTcwLDMgKzcwLDE4IEBACiAgICAgbnJvZm5vdGlmeXMtLTsKICAgICByZXR1cm4gVFJVRTsKIH0KKworQk9PTDE2IFdJTkFQSSBTdGFja1RyYWNlQ1NJUEZpcnN0KFNUQUNLVFJBQ0VFTlRSWSAqc3RlLCBXT1JEIHdTUywgV09SRCB3Q1MsIFdPUkQgd0lQLCBXT1JEIHdCUCkKK3sKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTDE2IFdJTkFQSSBTdGFja1RyYWNlRmlyc3QoU1RBQ0tUUkFDRUVOVFJZICpzdGUsIEhUQVNLMTYgVGFzaykKK3sKKyAgICByZXR1cm4gVFJVRTsKK30KKworQk9PTDE2IFdJTkFQSSBTdGFja1RyYWNlTmV4dChTVEFDS1RSQUNFRU5UUlkgKnN0ZSkKK3sKKyAgICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL21pc2MvdmVyLmMgYi9taXNjL3Zlci5jCmluZGV4IDQyMmU2YzMuLjg4M2FmMGQgMTAwNjQ0Ci0tLSBhL21pc2MvdmVyLmMKKysrIGIvbWlzYy92ZXIuYwpAQCAtMzEwLDEwICszMTAsNiBAQAogCX0KIH0KIAotZXh0ZXJuIExQSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZIEdldFJlc0RpckVudHJ5VygKLQlMUElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSByZXNkaXJwdHIsTFBDV1NUUiBuYW1lLERXT1JEIHJvb3QKLSk7Ci0KIC8qIExvYWRzIHRoZSBzcGVjaWZpZWQgUEUgcmVzb3VyY2UuCiAgKiBGSVhNRTogc2hvdWxkbid0IGxvYWQgdGhlIHdob2xlIGltYWdlCiAgKi8KQEAgLTM2OCwyMCArMzY0LDIwIEBACiAJCQljb250aW51ZTsKIAl9CiAJcmVzb3VyY2VkaXIgPSAoTFBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUlkpKGltYWdlK3Jlc2Rpci5WaXJ0dWFsQWRkcmVzcyk7Ci0JeHJlc2RpciA9IEdldFJlc0RpckVudHJ5VyhyZXNvdXJjZWRpcix0eXBlaWQsKERXT1JEKXJlc291cmNlZGlyKTsKKwl4cmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHJlc291cmNlZGlyLHR5cGVpZCwoRFdPUkQpcmVzb3VyY2VkaXIsRkFMU0UpOwogCWlmICgheHJlc2RpcikgewogCQlkcHJpbnRmX3ZlcihzdGRkZWIsIi4uLm5vIHR5cGVpZCBlbnRyeSBmb3VuZCBmb3IgJXBcbiIsdHlwZWlkKTsKIAkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGltYWdlKTsKIAkJcmV0dXJuIDA7CiAJfQotCXhyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcoeHJlc2RpcixyZXNpZCwoRFdPUkQpcmVzb3VyY2VkaXIpOworCXhyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcoeHJlc2RpcixyZXNpZCwoRFdPUkQpcmVzb3VyY2VkaXIsRkFMU0UpOwogCWlmICgheHJlc2RpcikgewogCQlkcHJpbnRmX3ZlcihzdGRkZWIsIi4uLm5vIHJlc2lkIGVudHJ5IGZvdW5kIGZvciAlcFxuIixyZXNpZCk7CiAJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxpbWFnZSk7CiAJCXJldHVybiAwOwogCX0KIAkKLQl4cmVzZGlyID0gR2V0UmVzRGlyRW50cnlXKHhyZXNkaXIsMCwoRFdPUkQpcmVzb3VyY2VkaXIpOworCXhyZXNkaXIgPSBHZXRSZXNEaXJFbnRyeVcoeHJlc2RpciwwLChEV09SRClyZXNvdXJjZWRpcixUUlVFKTsKIAlpZiAoIXhyZXNkaXIpIHsKIAkJZHByaW50Zl92ZXIoc3RkZGViLCIuLi5ubyAwIChkZWZhdWx0IGxhbmd1YWdlKSBlbnRyeSBmb3VuZCBmb3IgJXBcbiIscmVzaWQpOwogCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsaW1hZ2UpOwpAQCAtMTE4MSw3ICsxMTc3LDggQEAKIAkJCW5leHRzbGFzaCsrOwogCQlpZiAoISpuZXh0c2xhc2gpCiAJCQluZXh0c2xhc2g9TlVMTDsKLQl9CisJfSBlbHNlIGlmICgqc3RyID09IDApCisJCXJldHVybiBOVUxMOwogCiAKIAl3aGlsZSAoMSkgewpAQCAtMTIwOCw3ICsxMjA1LDcgQEAKIH0KIAogLyogdGhpcyBvbmUgdXNlZCBmb3IgV2luMzIgcmVzb3VyY2VzLCB3aGljaCBhcmUgYWx3YXlzIGluIFVOSUNPREUgZm9ybWF0ICovCi1leHRlcm4gTFBXU1RSIENSVERMTF93Y3NjaHIoTFBDV1NUUiBzdHIsV0NIQVIgeGNoYXIpOworZXh0ZXJuIExQV1NUUiBfX2NkZWNsIENSVERMTF93Y3NjaHIoTFBDV1NUUiBzdHIsV0NIQVIgeGNoYXIpOwogc3RhdGljIEJZVEUqCiBfZmluZF9kYXRhVyhCWVRFICpibG9jayxMUENXU1RSIHN0ciwgaW50IGJ1ZmZfcmVtYWluKSB7CiAJTFBXU1RSCW5leHRzbGFzaDsKQEAgLTEyMjcsNyArMTIyNCw4IEBACiAJCQluZXh0c2xhc2grKzsKIAkJaWYgKCEqbmV4dHNsYXNoKQogCQkJbmV4dHNsYXNoPU5VTEw7Ci0JfQorCX0gZWxzZSBpZiAoKnN0ciA9PSAwKQorCQlyZXR1cm4gTlVMTDsKIAogCiAJd2hpbGUgKDEpIHsKQEAgLTEyOTgsNiArMTI5Niw3IEBACiAJCWlmICghYikgewogCQkJZnByaW50ZihzdGRlcnIsImtleSAlcyBub3QgZm91bmQgaW4gdmVyc2lvbnJlc291cmNlLlxuIixzKTsKIAkJCSpidWZsZW49MDsKKwkJCWZyZWUgKHMpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJZGI9KHN0cnVjdCBkYlcqKWI7CkBAIC0xMzE1LDYgKzEzMTQsNyBAQAogCQlpZiAoIWIpIHsKIAkJCWZwcmludGYoc3RkZXJyLCJrZXkgJXMgbm90IGZvdW5kIGluIHZlcnNpb25yZXNvdXJjZS5cbiIscyk7CiAJCQkqYnVmbGVuPTA7CisJCQlmcmVlIChzKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWRiPShzdHJ1Y3QgZGJBKiliOwpAQCAtMTM1OCw2ICsxMzU4LDcgQEAKIAkJaWYgKCFiKSB7CiAJCQlmcHJpbnRmKHN0ZGVyciwia2V5ICVzIG5vdCBmb3VuZCBpbiB2ZXJzaW9ucmVzb3VyY2UuXG4iLHMpOwogCQkJKmJ1Zmxlbj0wOworCQkJZnJlZSAocyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlkYgk9IChzdHJ1Y3QgZGJXKiliOwpAQCAtMTM2OSwxMiArMTM3MCwxNSBAQAogCQkgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHhzKTsKIAkJfSBlbHNlCiAJCSAgICBkcHJpbnRmX3ZlcihzdGRlcnIsIi0+JXBcbiIsYik7CisJCS8qIFRoaXMgaXMgYSBsZWFrLiAgKi8KKwkJYiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsKFdDSEFSKiliKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QJZGJBCSpkYjsKIAkJYj1fZmluZF9kYXRhQShibG9jayxzLCooV09SRCopYmxvY2spOwogCQlpZiAoIWIpIHsKIAkJCWZwcmludGYoc3RkZXJyLCJrZXkgJXMgbm90IGZvdW5kIGluIHZlcnNpb25yZXNvdXJjZS5cbiIsc3ViYmxvY2spOwogCQkJKmJ1Zmxlbj0wOworCQkJZnJlZSAocyk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlkYj0oc3RydWN0IGRiQSopYjsKZGlmZiAtLWdpdCBhL21pc2MvdzMyc2NvbWIuYyBiL21pc2MvdzMyc2NvbWIuYwppbmRleCA1NGQxZDVjLi45ZDJhYzllIDEwMDY0NAotLS0gYS9taXNjL3czMnNjb21iLmMKKysrIGIvbWlzYy93MzJzY29tYi5jCkBAIC0xMCwxMyArMTAsMTQgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAibGR0LmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldDE2RExMQWRkcmVzcyAgICAgICAoS0VSTkVMMzIpCiAgKgogICogcm91Z2ggZ3Vlc3N3b3JrLCBidXQgc2VlbXMgdG8gd29yawogICovCi1GQVJQUk9DMTYgR2V0MTZETExBZGRyZXNzKEhNT0RVTEUzMiBoYW5kbGUsIExQU1RSIG5hbWUpIHsKK0ZBUlBST0MxNiBXSU5BUEkgR2V0MTZETExBZGRyZXNzKEhNT0RVTEUxNiBoYW5kbGUsIExQU1RSIG5hbWUpIHsKICAgICAgICAgaWYgKCFoYW5kbGUpIGhhbmRsZT1HZXRNb2R1bGVIYW5kbGUxNigiV0lOMzJTMTYiKTsKICAgICAgICAgcmV0dXJuIChGQVJQUk9DMTYpV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihoYW5kbGUsIG5hbWUpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy93MzJza3JubC5jIGIvbWlzYy93MzJza3JubC5jCmluZGV4IGFmOGRhZTUuLmYwNWNjOTkgMTAwNjQ0Ci0tLSBhL21pc2MvdzMyc2tybmwuYworKysgYi9taXNjL3czMnNrcm5sLmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogCi1MUFNUUiBXSU5BUEkgR2V0V2luMzJzRGlyZWN0b3J5KCkKK0xQU1RSIFdJTkFQSSBHZXRXaW4zMnNEaXJlY3Rvcnkodm9pZCkKIHsKICAgICBzdGF0aWMgY2hhciAqc3lzZGlyOwogICAgIExQU1RSIHRleHQ7CkBAIC0yNCw3ICsyNCw3IEBACiB9CiAKIC8qIEZJWE1FICovCi1TRUdQVFIgV0lOQVBJIF9HZXRUaHVua0J1ZmYoKQorU0VHUFRSIFdJTkFQSSBfR2V0VGh1bmtCdWZmKHZvaWQpCiB7CiAJcmV0dXJuIChTRUdQVFIpTlVMTDsKIH0KZGlmZiAtLWdpdCBhL21pc2Mvd2luMzJzMTYuYyBiL21pc2Mvd2luMzJzMTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJlMTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzYy93aW4zMnMxNi5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBXSU4zMlMxNgorICogRExMIGZvciBXaW4zMnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcgQW5kcmVhcyBNb2hyCisgKi8KKworI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCit2b2lkIEJvb3RUYXNrKCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIkJvb3RUYXNrKCk6IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgV0lOMzJTLkVYRS5cbiIpOworfQpkaWZmIC0tZ2l0IGEvbWlzYy93aW5kZWJ1Zy5jIGIvbWlzYy93aW5kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZjRkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjL3dpbmRlYnVnLmMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIFdJTkRFQlVHLkRMTAorICoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBBbmRyZWFzIE1vaHIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFdpbk5vdGlmeSAgICAgICAoV0lOREVCVUcuMSkKKyAqICB3cml0dGVuIHdpdGhvdXQgX2FueV8gZG9jdQorICovCitEV09SRCBXaW5Ob3RpZnkoKSB7CisJZnByaW50ZihzdGRlcnIsICJXaW5Ob3RpZnkoKTogc3R1YiAhXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL21pc2Mvd2luc29jay5jIGIvbWlzYy93aW5zb2NrLmMKaW5kZXggYTVkNGRjOS4uYjk0YmIzYyAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrLmMKKysrIGIvbWlzYy93aW5zb2NrLmMKQEAgLTQsNyArNCw2IEBACiAgKiAKICAqIChDKSAxOTkzLDE5OTQsMTk5NiwxOTk3IEpvaG4gQnJlemFrLCBFcmlrIEJvcywgQWxleCBLb3JvYmthLgogICoKLSAqIFRPRE86IDMyLWJpdCBhc3luY2hyb25vdXMgc2VydmljZXMuCiAgKi8KICAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMzIsMTMgKzMxLDEzIEBACiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgIndpbnNvY2suaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2lubnQuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgIm1lc3NhZ2UuaCIKLSNpbmNsdWRlICJ3aW5zb2NrLmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTE0OCwyNSArMTQ3LDMxIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBmZF9zZXQqIGZkX3NldF9pbXBvcnQoIGZkX3NldCogZmRzLCBMUFdTSU5GTyBwd3NpLCB3c19mZF9zZXQqIHdzLCBpbnQqIGhpZ2hmZCApCitzdGF0aWMgZmRfc2V0KiBmZF9zZXRfaW1wb3J0KCBmZF9zZXQqIGZkcywgTFBXU0lORk8gcHdzaSwgdm9pZCogd3NmZHMsIGludCogaGlnaGZkLCBCT09MMzIgYjMyICkKIHsKICAgICAvKiB0cmFuc2xhdGUgV2luc29jayBmZCBzZXQgaW50byBsb2NhbCBmZCBzZXQgKi8KIAotICAgIGlmKCB3cyApIAorICAgIGlmKCB3c2ZkcyApIAogICAgIHsgCi0JaW50IAlpOwotCXdzX3NvY2tldCogIHB3czsKKyNkZWZpbmUgd3NmZHMxNgkoKHdzX2ZkX3NldDE2Kil3c2ZkcykKKyNkZWZpbmUgd3NmZHMzMiAoKHdzX2ZkX3NldDMyKil3c2ZkcykKKwl3c19zb2NrZXQqIHB3czsKKwlpbnQgaSwgY291bnQ7CiAKIAlGRF9aRVJPKGZkcyk7Ci0JZm9yKCBpID0gMDsgaSA8ICh3cy0+ZmRfY291bnQpIDsgaSsrICkgCisJY291bnQgPSAoYjMyKSA/IHdzZmRzMzItPmZkX2NvdW50IDogd3NmZHMxNi0+ZmRfY291bnQ7CisJZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQogCXsKLQkgICAgcHdzID0gKHdzX3NvY2tldCopV1NfSEFORExFMlBUUih3cy0+ZmRfYXJyYXlbaV0pOwotCSAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKSAKLQkgICAgewotCQlpZiggcHdzLT5mZCA+ICpoaWdoZmQgKSAqaGlnaGZkID0gcHdzLT5mZDsgCi0JCUZEX1NFVChwd3MtPmZkLCBmZHMpOyAKLQkgICAgfQorCSAgICAgcHdzID0gKGIzMikgPyAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHdzZmRzMzItPmZkX2FycmF5W2ldKQorCQkJIDogKHdzX3NvY2tldCopV1NfSEFORExFMlBUUih3c2ZkczE2LT5mZF9hcnJheVtpXSk7CisJICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQorICAgICAgICAgICAgIHsKKwkJICAgIGlmKCBwd3MtPmZkID4gKmhpZ2hmZCApICpoaWdoZmQgPSBwd3MtPmZkOworCQkgICAgRkRfU0VUKHB3cy0+ZmQsIGZkcyk7CisJICAgICB9CiAJfQorI3VuZGVmIHdzZmRzMzIKKyN1bmRlZiB3c2ZkczE2CiAJcmV0dXJuIGZkczsKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CkBAIC0xODIsMjAgKzE4NywyMyBAQAogICAgIHJldHVybiBvcHR2YWwgIT0gMDsKIH0KIAotc3RhdGljIGludCBmZF9zZXRfZXhwb3J0KCBMUFdTSU5GTyBwd3NpLCBmZF9zZXQqIGZkcywgZmRfc2V0KiBleGNlcHRmZHMsIHdzX2ZkX3NldCogd3MgKQorc3RhdGljIGludCBmZF9zZXRfZXhwb3J0KCBMUFdTSU5GTyBwd3NpLCBmZF9zZXQqIGZkcywgZmRfc2V0KiBleGNlcHRmZHMsIHZvaWQqIHdzZmRzLCBCT09MMzIgYjMyICkKIHsKICAgICBpbnQgbnVtX2VyciA9IDA7CiAKICAgICAvKiB0cmFuc2xhdGUgbG9jYWwgZmQgc2V0IGludG8gV2luc29jayBmZCBzZXQsIGFkZGluZwogICAgICAqIGVycm9ycyB0byBleGNlcHRmZHMgKG9ubHkgaWYgYXBwIHJlcXVlc3RlZCBpdCkgKi8KIAotICAgIGlmKCB3cyApCisgICAgaWYoIHdzZmRzICkKICAgICB7Ci0JaW50IGksIGosIGNvdW50ID0gd3MtPmZkX2NvdW50OworI2RlZmluZSB3c2ZkczE2ICgod3NfZmRfc2V0MTYqKXdzZmRzKQorI2RlZmluZSB3c2ZkczMyICgod3NfZmRfc2V0MzIqKXdzZmRzKQorCWludCBpLCBqLCBjb3VudCA9IChiMzIpID8gd3NmZHMzMi0+ZmRfY291bnQgOiB3c2ZkczE2LT5mZF9jb3VudDsKIAogCWZvciggaSA9IDAsIGogPSAwOyBpIDwgY291bnQ7IGkrKyApCiAJewotCSAgICB3c19zb2NrZXQgKnB3cyA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIod3MtPmZkX2FycmF5W2ldKTsKKwkgICAgd3Nfc29ja2V0ICpwd3MgPSAoYjMyKSA/ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIod3NmZHMzMi0+ZmRfYXJyYXlbaV0pCisJCQkJICAgOiAod3Nfc29ja2V0KilXU19IQU5ETEUyUFRSKHdzZmRzMTYtPmZkX2FycmF5W2ldKTsKIAkgICAgaW50IGZkID0gcHdzLT5mZDsKIAogCSAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgJiYgRkRfSVNTRVQoZmQsIGZkcykgKQpAQCAtMjA2LDExICsyMTQsMTkgQEAKIAkJICAgIG51bV9lcnIrKzsKIAkJfQogCQllbHNlCi0JCSAgICB3cy0+ZmRfYXJyYXlbaisrXSA9IHdzLT5mZF9hcnJheVtpXTsKKwkJICAgIGlmKCBiMzIgKQorCQkJd3NmZHMzMi0+ZmRfYXJyYXlbaisrXSA9IHdzZmRzMzItPmZkX2FycmF5W2ldOworCQkgICAgZWxzZQorCQkJd3NmZHMxNi0+ZmRfYXJyYXlbaisrXSA9IHdzZmRzMTYtPmZkX2FycmF5W2ldOwogCSAgICB9CiAJfQotCXdzLT5mZF9jb3VudCA9IGo7CisKKwlpZiggYjMyICkgd3NmZHMzMi0+ZmRfY291bnQgPSBqOworCWVsc2Ugd3NmZHMxNi0+ZmRfY291bnQgPSBqOworCiAJZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIlxuIik7CisjdW5kZWYgd3NmZHMzMgorI3VuZGVmIHdzZmRzMTYKICAgICB9CiAgICAgcmV0dXJuIG51bV9lcnI7CiB9CkBAIC0zODYsNyArNDAyLDcgQEAKIAkgICAgaWYoIHB3c2ktPnNvY2tbaV0ucHNvcCApCiAJICAgIHsKIAkJbisrOwotCQlXU0FBc3luY1NlbGVjdCggKFNPQ0tFVDE2KVdTX1BUUjJIQU5ETEUocHdzaS0+c29jayArIGkpLCAwLCAwLCAwICk7CisJCVdTQUFzeW5jU2VsZWN0MzIoIChTT0NLRVQxNilXU19QVFIySEFORExFKHB3c2ktPnNvY2sgKyBpKSwgMCwgMCwgMCApOwogCSAgICB9CiAgICAgICAgICAgICBjbG9zZShwd3NpLT5zb2NrW2ldLmZkKTsgaisrOyAKICAgICAgICAgfQpAQCAtNTA0LDggKzUyMCw4IEBACiAJCSAgICBFVkVOVF9BZGRJTyggcHdzLT5mZCwgRVZFTlRfSU9fUkVBRCApOwkvKiByZWVuYWJsZXIgKi8KIAogCQkgICAgLyogYXN5bmMgc2VsZWN0IHRoZSBhY2NlcHQoKSdlZCBzb2NrZXQgKi8KLQkJICAgIFdTQUFzeW5jU2VsZWN0KCBzLCBwd3MtPnBzb3AtPmhXbmQsIHB3cy0+cHNvcC0+dU1zZywKLQkJCQkgICAgcHdzLT5mbGFncyAmIH5XU19GRF9BQ0NFUFQgKTsKKwkJICAgIFdTQUFzeW5jU2VsZWN0MzIoIHMsIHB3cy0+cHNvcC0+aFduZCwgcHdzLT5wc29wLT51TXNnLAorCQkJCSAgICAgIHB3cy0+ZmxhZ3MgJiB+V1NfRkRfQUNDRVBUICk7CiAJCX0KIAkJcmV0dXJuIHM7CiAgICAgICAgICAgICB9IApAQCAtNTM4LDEzICs1NTQsMTMgQEAKIAogICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19CSU5EKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICU4eCwgbGVuZ3RoICVkXG4iLCAKIAkJCSAgICh1bnNpZ25lZClwd3NpLCBzLCAoaW50KSBuYW1lLCBuYW1lbGVuKTsKLSNpZiBERUJVR19TT0NLQUREUgorLyogI2lmIERFQlVHX1NPQ0tBRERSICovCiAgICAgZHVtcF9zb2NrYWRkcihuYW1lKTsKLSNlbmRpZgorLyogI2VuZGlmICovCiAKICAgICBpZiAoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICAgIGlmICggbmFtZWxlbiA+PSBzaXplb2YoKm5hbWUpICkgCi0JaWYgKCAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW5hbWUpLT5zaW5fZmFtaWx5ID09IEFGX0lORVQgKQorCWlmICggKChzdHJ1Y3Qgd3Nfc29ja2FkZHJfaW4gKiluYW1lKS0+c2luX2ZhbWlseSA9PSBBRl9JTkVUICkKIAkgIGlmICggYmluZChwd3MtPmZkLCBuYW1lLCBuYW1lbGVuKSA8IDAgKSAKIAkgIHsKIAkgICAgIGludAlsb2NfZXJybm8gPSBlcnJubzsKQEAgLTU4NSw3ICs2MDEsNyBAQAogICAgIHsgCiAJaW50CWZkID0gcHdzLT5mZDsKIAotCWlmKCBwd3MtPnBzb3AgKSBXU0FBc3luY1NlbGVjdCggcywgMCwgMCwgMCApOworCWlmKCBwd3MtPnBzb3AgKSBXU0FBc3luY1NlbGVjdDMyKCBzLCAwLCAwLCAwICk7CiAKIAlwd3MtPmZkID0gLTE7CiAJcHdzLT5mbGFncyA9ICh1bnNpZ25lZClwd3NpLT5sYXN0X2ZyZWU7CkBAIC03ODksNyArODA1LDcgQEAKICAqLwogdV9zaG9ydCBXSU5BUEkgV0lOU09DS19odG9ucyh1X3Nob3J0IGhvc3RzaG9ydCkgeyByZXR1cm4oIGh0b25zKGhvc3RzaG9ydCkgKTsgfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJaW5ldF9hZGRyKCkJCShXSU5TT0NLLjEwKQorICoJCWluZXRfYWRkcigpCQkoV0lOU09DSy4xMCkoV1NPQ0szMi4xMCkKICAqLwogdV9sb25nIFdJTkFQSSBXSU5TT0NLX2luZXRfYWRkcihjaGFyICpjcCkgICAgICB7IHJldHVybiggaW5ldF9hZGRyKGNwKSApOyB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgwMiwzNCArODE4LDQwIEBACiB1X3Nob3J0IFdJTkFQSSBXSU5TT0NLX250b2hzKHVfc2hvcnQgbmV0c2hvcnQpICB7IHJldHVybiggbnRvaHMobmV0c2hvcnQpICk7IH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJaW5ldF9udG9hKCkJCShXSU5TT0NLLjExKQorICoJCWluZXRfbnRvYSgpCQkoV0lOU09DSy4xMSkoV1NPQ0szMi4xMSkKICAqLwotU0VHUFRSIFdJTkFQSSBXSU5TT0NLX2luZXRfbnRvYShzdHJ1Y3QgaW5fYWRkciBpbikKK2NoYXIqIFdJTkFQSSBXSU5TT0NLX2luZXRfbnRvYTMyKHN0cnVjdCBpbl9hZGRyIGluKQogewogICAvKiB1c2UgImJ1ZmZlciBmb3IgZHVtbWllcyIgaGVyZSBiZWNhdXNlIHNvbWUgYXBwbGljYXRpb25zIGhhdmUgCiAgICAqIHByb3BlbnNpdHkgdG8gZGVjb2RlIGFkZHJlc3NlcyBpbiB3c19ob3N0ZW50IHN0cnVjdHVyZSB3aXRob3V0IAogICAgKiBzYXZpbmcgdGhlbSBmaXJzdC4uLgogICAgKi8KIAotICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKyAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBpZiggcHdzaSApCi0gIHsKLSAgICBjaGFyKglzID0gaW5ldF9udG9hKGluKTsKLSAgICBpZiggcyApIAorICAgIGlmKCBwd3NpICkKICAgICB7Ci0JaWYoIHB3c2ktPmRidWZmZXIgPT0gTlVMTCApCi0JICAgIGlmKChwd3NpLT5kYnVmZmVyID0gKGNoYXIqKSBTRUdQVFJfQUxMT0MoMzIpKSA9PSBOVUxMICkKLQkgICAgewotCQlwd3NpLT5lcnIgPSBXU0FFTk9CVUZTOwotCQlyZXR1cm4gKFNFR1BUUilOVUxMOwotCSAgICB9Ci0Jc3RybmNweShwd3NpLT5kYnVmZmVyLCBzLCAzMiApOwotCXJldHVybiBTRUdQVFJfR0VUKHB3c2ktPmRidWZmZXIpOyAKKwljaGFyKglzID0gaW5ldF9udG9hKGluKTsKKwlpZiggcyApIAorCXsKKwkgICAgaWYoIHB3c2ktPmRidWZmZXIgPT0gTlVMTCApCisJCWlmKChwd3NpLT5kYnVmZmVyID0gKGNoYXIqKSBTRUdQVFJfQUxMT0MoMzIpKSA9PSBOVUxMICkKKwkJeworCQkgICAgcHdzaS0+ZXJyID0gV1NBRU5PQlVGUzsKKwkJICAgIHJldHVybiBOVUxMOworCQl9CisJICAgIHN0cm5jcHkocHdzaS0+ZGJ1ZmZlciwgcywgMzIgKTsKKwkgICAgcmV0dXJuIHB3c2ktPmRidWZmZXI7IAorCX0KKwlwd3NpLT5lcnIgPSB3c2FFcnJubygpOwogICAgIH0KLSAgICBwd3NpLT5lcnIgPSB3c2FFcnJubygpOwotICB9Ci0gIHJldHVybiAoU0VHUFRSKU5VTEw7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK1NFR1BUUiBXSU5BUEkgV0lOU09DS19pbmV0X250b2ExNihzdHJ1Y3QgaW5fYWRkciBpbikKK3sKKyAgY2hhciogcmV0VmFsID0gV0lOU09DS19pbmV0X250b2EzMihpbik7CisgIHJldHVybiByZXRWYWwgPyBTRUdQVFJfR0VUKHJldFZhbCkgOiAoU0VHUFRSKU5VTEw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTAxOSwxNiArMTA0MSwxNSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQlzZWxlY3QoKQkJKFdJTlNPQ0suMTgpCisgKgkJc2VsZWN0KCkJCShXSU5TT0NLLjE4KShXU09DSzMyLjE4KQogICovCi1JTlQxNiBXSU5BUEkgV0lOU09DS19zZWxlY3QxNihJTlQxNiBuZmRzLCB3c19mZF9zZXQgKndzX3JlYWRmZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c19mZF9zZXQgKndzX3dyaXRlZmRzLCB3c19mZF9zZXQgKndzX2V4Y2VwdGZkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KQorc3RhdGljIElOVDMyIF9fd3Nfc2VsZWN0KCBCT09MMzIgYjMyLCB2b2lkICp3c19yZWFkZmRzLCB2b2lkICp3c193cml0ZWZkcywgdm9pZCAqd3NfZXhjZXB0ZmRzLAorCQkJICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCApCiB7CiAgICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAJCi0gICAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX1NFTEVDVCglMDh4KTogbmZkcyAlZCAoaWdub3JlZCksIHJlYWQgJTh4LCB3cml0ZSAlOHgsIGV4Y3AgJTh4XG4iLCAKLSAgICAodW5zaWduZWQpIHB3c2ksIG5mZHMsICh1bnNpZ25lZCkgd3NfcmVhZGZkcywgKHVuc2lnbmVkKSB3c193cml0ZWZkcywgKHVuc2lnbmVkKSB3c19leGNlcHRmZHMpOworICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19TRUxFQ1QoJTA4eCk6IHJlYWQgJTh4LCB3cml0ZSAlOHgsIGV4Y3AgJTh4XG4iLCAKKyAgICAodW5zaWduZWQpIHB3c2ksICh1bnNpZ25lZCkgd3NfcmVhZGZkcywgKHVuc2lnbmVkKSB3c193cml0ZWZkcywgKHVuc2lnbmVkKSB3c19leGNlcHRmZHMpOwogCiAgICAgaWYoIHB3c2kgKQogICAgIHsKQEAgLTEwMzYsMjggKzEwNTcsNDEgQEAKIAlmZF9zZXQgICAgICByZWFkZmRzLCB3cml0ZWZkcywgZXhjZXB0ZmRzOwogCWZkX3NldCAgICAgKnBfcmVhZCwgKnBfd3JpdGUsICpwX2V4Y2VwdDsKIAotCXBfcmVhZCA9IGZkX3NldF9pbXBvcnQoJnJlYWRmZHMsIHB3c2ksIHdzX3JlYWRmZHMsICZoaWdoZmQpOwotCXBfd3JpdGUgPSBmZF9zZXRfaW1wb3J0KCZ3cml0ZWZkcywgcHdzaSwgd3Nfd3JpdGVmZHMsICZoaWdoZmQpOwotCXBfZXhjZXB0ID0gZmRfc2V0X2ltcG9ydCgmZXhjZXB0ZmRzLCBwd3NpLCB3c19leGNlcHRmZHMsICZoaWdoZmQpOworCXBfcmVhZCA9IGZkX3NldF9pbXBvcnQoJnJlYWRmZHMsIHB3c2ksIHdzX3JlYWRmZHMsICZoaWdoZmQsIGIzMik7CisJcF93cml0ZSA9IGZkX3NldF9pbXBvcnQoJndyaXRlZmRzLCBwd3NpLCB3c193cml0ZWZkcywgJmhpZ2hmZCwgYjMyKTsKKwlwX2V4Y2VwdCA9IGZkX3NldF9pbXBvcnQoJmV4Y2VwdGZkcywgcHdzaSwgd3NfZXhjZXB0ZmRzLCAmaGlnaGZkLCBiMzIpOwogCiAJaWYoIChoaWdoZmQgPSBzZWxlY3QoaGlnaGZkICsgMSwgcF9yZWFkLCBwX3dyaXRlLCBwX2V4Y2VwdCwgdGltZW91dCkpID49IDAgKQogCXsKIAkgICAgaWYoIGhpZ2hmZCApCiAJICAgIHsKLQkJZmRfc2V0X2V4cG9ydChwd3NpLCAmcmVhZGZkcywgcF9leGNlcHQsIHdzX3JlYWRmZHMpOwotCQlmZF9zZXRfZXhwb3J0KHB3c2ksICZ3cml0ZWZkcywgcF9leGNlcHQsIHdzX3dyaXRlZmRzKTsKKwkJZmRfc2V0X2V4cG9ydChwd3NpLCAmcmVhZGZkcywgcF9leGNlcHQsIHdzX3JlYWRmZHMsIGIzMik7CisJCWZkX3NldF9leHBvcnQocHdzaSwgJndyaXRlZmRzLCBwX2V4Y2VwdCwgd3Nfd3JpdGVmZHMsIGIzMik7CiAKIAkJaWYgKHBfZXhjZXB0ICYmIHdzX2V4Y2VwdGZkcykKIAkJewotCQkgICAgaW50IGksIGosIGNvdW50ID0gd3NfZXhjZXB0ZmRzLT5mZF9jb3VudDsKKyNkZWZpbmUgd3NmZHMxNiAoKHdzX2ZkX3NldDE2Kil3c19leGNlcHRmZHMpCisjZGVmaW5lIHdzZmRzMzIgKCh3c19mZF9zZXQzMiopd3NfZXhjZXB0ZmRzKQorCQkgICAgaW50IGksIGosIGNvdW50ID0gKGIzMikgPyB3c2ZkczMyLT5mZF9jb3VudCA6IHdzZmRzMTYtPmZkX2NvdW50OwogCiAJCSAgICBmb3IgKGkgPSBqID0gMDsgaSA8IGNvdW50OyBpKyspCiAJCSAgICB7Ci0JCQl3c19zb2NrZXQgKnB3cyA9ICh3c19zb2NrZXQgKilXU19IQU5ETEUyUFRSKHdzX2V4Y2VwdGZkcy0+ZmRfYXJyYXlbaV0pOworCQkJd3Nfc29ja2V0ICpwd3MgPSAoYjMyKSA/ICh3c19zb2NrZXQgKilXU19IQU5ETEUyUFRSKHdzZmRzMzItPmZkX2FycmF5W2ldKQorCQkJCQkgICAgICAgOiAod3Nfc29ja2V0ICopV1NfSEFORExFMlBUUih3c2ZkczE2LT5mZF9hcnJheVtpXSk7CiAJCQlpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgJiYgRkRfSVNTRVQocHdzLT5mZCwgJmV4Y2VwdGZkcykgKQotCQkJICAgIHdzX2V4Y2VwdGZkcy0+ZmRfYXJyYXlbaisrXSA9IHdzX2V4Y2VwdGZkcy0+ZmRfYXJyYXlbaV07CisJCQl7CisJCQkgICAgaWYoIGIzMiApCisJCQkJd3NmZHMzMi0+ZmRfYXJyYXlbaisrXSA9IHdzZmRzMzItPmZkX2FycmF5W2ldOworCQkJICAgIGVsc2UKKwkJCQl3c2ZkczE2LT5mZF9hcnJheVtqKytdID0gd3NmZHMxNi0+ZmRfYXJyYXlbaV07CisJCQl9CiAJCSAgICB9Ci0JCSAgICB3c19leGNlcHRmZHMtPmZkX2NvdW50ID0gajsKKwkJICAgIGlmKCBiMzIgKQorCQkJd3NmZHMzMi0+ZmRfY291bnQgPSBqOworCQkgICAgZWxzZQorCQkJd3NmZHMxNi0+ZmRfY291bnQgPSBqOworI3VuZGVmIHdzZmRzMzIKKyN1bmRlZiB3c2ZkczE2CiAJCX0KIAkgICAgfQogCSAgICByZXR1cm4gaGlnaGZkOyAKQEAgLTEwNjcsMTUgKzExMDEsMTkgQEAKICAgICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICBzZWxlY3QoKQkJKFdTT0NLMzIuMTgpCi0gKi8KLUlOVDMyIFdJTkFQSSBXSU5TT0NLX3NlbGVjdDMyKElOVDMyIG5mZHMsIHdzX2ZkX3NldCAqd3NfcmVhZGZkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzX2ZkX3NldCAqd3Nfd3JpdGVmZHMsIHdzX2ZkX3NldCAqd3NfZXhjZXB0ZmRzLAorSU5UMTYgV0lOQVBJIFdJTlNPQ0tfc2VsZWN0MTYoSU5UMTYgbmZkcywgd3NfZmRfc2V0MTYgKndzX3JlYWRmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c19mZF9zZXQxNiAqd3Nfd3JpdGVmZHMsIHdzX2ZkX3NldDE2ICp3c19leGNlcHRmZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dCkKK3sKKyAgICByZXR1cm4gKElOVDE2KV9fd3Nfc2VsZWN0KCBGQUxTRSwgd3NfcmVhZGZkcywgd3Nfd3JpdGVmZHMsIHdzX2V4Y2VwdGZkcywgdGltZW91dCApOworfQorCitJTlQzMiBXSU5BUEkgV0lOU09DS19zZWxlY3QzMihJTlQzMiBuZmRzLCB3c19mZF9zZXQzMiAqd3NfcmVhZGZkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzX2ZkX3NldDMyICp3c193cml0ZWZkcywgd3NfZmRfc2V0MzIgKndzX2V4Y2VwdGZkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICp0aW1lb3V0KQogewogICAgIC8qIHN0cnVjdCB0aW1ldmFsIGlzIHRoZSBzYW1lIGZvciBib3RoIDMyLSBhbmQgMTYtYml0IGNvZGUgKi8KLSAgICByZXR1cm4gV0lOU09DS19zZWxlY3QxNiggKElOVDE2KW5mZHMsIHdzX3JlYWRmZHMsIHdzX3dyaXRlZmRzLCB3c19leGNlcHRmZHMsIHRpbWVvdXQgKTsKKyAgICByZXR1cm4gKElOVDMyKV9fd3Nfc2VsZWN0KCBUUlVFLCB3c19yZWFkZmRzLCB3c193cml0ZWZkcywgd3NfZXhjZXB0ZmRzLCB0aW1lb3V0ICk7CiB9CiAKIApAQCAtMTA4OCw3ICsxMTI2LDcgQEAKICAgICBMUFdTSU5GTyAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAogICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19TRU5EKCUwOHgpOiBzb2NrZXQgJTA0eCwgcHRyICUwOHgsIGxlbmd0aCAlZCwgZmxhZ3MgJWRcbiIsIAotCQkJICAodW5zaWduZWQpcHdzaSwgcywgKHVuc2lnbmVkKSBidWYsIGxlbiwgZmxhZ3MpOworCQkJICAgKHVuc2lnbmVkKXB3c2ksIHMsICh1bnNpZ25lZCkgYnVmLCBsZW4sIGZsYWdzKTsKICAgICBpZiggX2NoZWNrX3dzKHB3c2ksIHB3cykgKQogICAgIHsKIAlpbnQJbGVuZ3RoOwpAQCAtMTIyMSw3ICsxMjU5LDcgQEAKIAogCQljYXNlIDI6IC8qIGRyb3AgYWxsICovCiAJCWRlZmF1bHQ6Ci0JCQlXU0FBc3luY1NlbGVjdCggcywgMCwgMCwgMCApOworCQkJV1NBQXN5bmNTZWxlY3QzMiggcywgMCwgMCwgMCApOwogCQkJYnJlYWs7CiAJICAgIH0KIApAQCAtMTU4NiwyMyArMTYyNCw0MCBAQAogICovCiAKIC8qIHdpbnNvY2tfZG5zLmMgKi8KLWV4dGVybiBIQU5ETEUxNiBfX1dTQXN5bmNEQlF1ZXJ5KExQV1NJTkZPIHB3c2ksIEhXTkQxNiBoV25kLCBVSU5UMTYgdU1zZywgSU5UMTYgdHlwZSwgTFBDU1RSIGluaXQsCi0JCQkJIElOVDE2IGxlbiwgTFBDU1RSIHByb3RvLCBTRUdQVFIgc2J1ZiwgSU5UMTYgYnVmbGVuLCBVSU5UMzIgZmxhZyk7CitleHRlcm4gSEFORExFMTYgX19XU0FzeW5jREJRdWVyeShMUFdTSU5GTyBwd3NpLCBIV05EMzIgaFduZCwgVUlOVDMyIHVNc2csIElOVDMyIHR5cGUsIExQQ1NUUiBpbml0LAorCQkJCSBJTlQzMiBsZW4sIExQQ1NUUiBwcm90bywgdm9pZCogc2J1ZiwgSU5UMzIgYnVmbGVuLCBVSU5UMzIgZmxhZyk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgV1NBQXN5bmNHZXRIb3N0QnlBZGRyKCkJKFdJTlNPQ0suMTAyKQogICovCi1IQU5ETEUxNiBXSU5BUEkgV1NBQXN5bmNHZXRIb3N0QnlBZGRyKEhXTkQxNiBoV25kLCBVSU5UMTYgdU1zZywgTFBDU1RSIGFkZHIsCitIQU5ETEUxNiBXSU5BUEkgV1NBQXN5bmNHZXRIb3N0QnlBZGRyMTYoSFdORDE2IGhXbmQsIFVJTlQxNiB1TXNnLCBMUENTVFIgYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBsZW4sIElOVDE2IHR5cGUsIFNFR1BUUiBzYnVmLCBJTlQxNiBidWZsZW4pCiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jR2V0SG9zdEJ5QWRkciglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA0eCwgYWRkciAlMDh4WyVpXVxuIiwKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jR2V0SG9zdEJ5QWRkcjE2KCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBhZGRyICUwOHhbJWldXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgaFduZCwgdU1zZywgKHVuc2lnbmVkKWFkZHIgLCBsZW4gKTsKIAogICBpZiggcHdzaSApIAogICAgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIHR5cGUsIGFkZHIsIGxlbiwKLQkJCSAgICBOVUxMLCBzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX0hPU1RCWUFERFIgKTsKKwkJCSAgICBOVUxMLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19IT1NUQllBRERSICk7CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgIFdTQUFzeW5jR2V0SG9zdEJ5QWRkcigpICAgICAgICAoV1NPQ0szMi4xMDIpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBXU0FBc3luY0dldEhvc3RCeUFkZHIzMihIV05EMzIgaFduZCwgVUlOVDMyIHVNc2csIExQQ1NUUiBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGxlbiwgSU5UMzIgdHlwZSwgTFBTVFIgc2J1ZiwgSU5UMzIgYnVmbGVuKQoreworICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldEhvc3RCeUFkZHIzMiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgYWRkciAlMDh4WyVpXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgKHVuc2lnbmVkKWFkZHIgLCBsZW4gKTsKKworICBpZiggcHdzaSApCisgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgdHlwZSwgYWRkciwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX0hPU1RCWUFERFIgfCBXU01TR19BU1lOQ19XSU4zMik7CiAgIHJldHVybiAwOwogfQogCkBAIC0xNjEwLDE3ICsxNjY1LDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgIFdTQUFzeW5jR2V0SG9zdEJ5TmFtZSgpCShXSU5TT0NLLjEwMykKICAqLwotSEFORExFMTYgV0lOQVBJIFdTQUFzeW5jR2V0SG9zdEJ5TmFtZShIV05EMTYgaFduZCwgVUlOVDE2IHVNc2csIExQQ1NUUiBuYW1lLCAKK0hBTkRMRTE2IFdJTkFQSSBXU0FBc3luY0dldEhvc3RCeU5hbWUxNihIV05EMTYgaFduZCwgVUlOVDE2IHVNc2csIExQQ1NUUiBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSIHNidWYsIElOVDE2IGJ1ZmxlbikKIHsKICAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKIAotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRIb3N0QnlOYW1lKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBob3N0ICVzLCBidWZmZXIgJWlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKGludClidWZsZW4gKTsKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jR2V0SG9zdEJ5TmFtZTE2KCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBob3N0ICVzLCAKK2J1ZmZlciAlaVxuIiwgKHVuc2lnbmVkKXB3c2ksIGhXbmQsIHVNc2csIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HLCAoaW50KWJ1ZmxlbiApOwogCiAgIGlmKCBwd3NpICkKICAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCAwLCBuYW1lLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfSE9TVEJZTkFNRSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX0hPU1RCWU5BTUUgKTsKICAgcmV0dXJuIDA7CiB9ICAgICAgICAgICAgICAgICAgICAgCiAKQEAgLTE2MjgsMTIgKzE2ODMsMTQgQEAKICAqICAgICAgIFdTQUFzeW5jR2V0SG9zdEJ5TmFtZTMyKCkJKFdTT0NLMzIuMTAzKQogICovCiBIQU5ETEUzMiBXSU5BUEkgV1NBQXN5bmNHZXRIb3N0QnlOYW1lMzIoSFdORDMyIGhXbmQsIFVJTlQzMiB1TXNnLCBMUENTVFIgbmFtZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIHNidWYsIElOVDMyIGJ1ZmxlbikKKwkJCQkJTFBTVFIgc2J1ZiwgSU5UMzIgYnVmbGVuKQogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRIb3N0QnlOYW1lKCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBob3N0ICVzLCBidWZmZXIgJWlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKGludClidWZsZW4gKTsKLQorICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRIb3N0QnlOYW1lMzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIGhvc3QgJXMsIAorYnVmZmVyICVpXG4iLCAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKGludClidWZsZW4gKTsKKyAgaWYoIHB3c2kgKQorICAgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIDAsIG5hbWUsIDAsCisgCQkJICAgIE5VTEwsICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX0hPU1RCWU5BTUUgfCBXU01TR19BU1lOQ19XSU4zMik7CiAgIHJldHVybiAwOwogfSAgICAgICAgICAgICAgICAgICAgIAogCkBAIC0xNjQxLDE3ICsxNjk4LDM0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgIFdTQUFzeW5jR2V0UHJvdG9CeU5hbWUoKQkoV0lOU09DSy4xMDUpCiAgKi8KLUhBTkRMRTE2IFdJTkFQSSBXU0FBc3luY0dldFByb3RvQnlOYW1lKEhXTkQxNiBoV25kLCBVSU5UMTYgdU1zZywgTFBDU1RSIG5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHUFRSIHNidWYsIElOVDE2IGJ1ZmxlbikKK0hBTkRMRTE2IFdJTkFQSSBXU0FBc3luY0dldFByb3RvQnlOYW1lMTYoSFdORDE2IGhXbmQsIFVJTlQxNiB1TXNnLCBMUENTVFIgbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR1BUUiBzYnVmLCBJTlQxNiBidWZsZW4pCiB7CiAgIExQV1NJTkZPICAgICAgICAgICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jR2V0UHJvdG9CeU5hbWUoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIHByb3RvY29sICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgaFduZCwgdU1zZywgKG5hbWUpP25hbWU6TlVMTF9TVFJJTkcgKTsKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jR2V0UHJvdG9CeU5hbWUxNiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgcHJvdG9jb2wgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCAoSFdORDE2KWhXbmQsIHVNc2csIChuYW1lKT9uYW1lOk5VTExfU1RSSU5HICk7CiAKICAgaWYoIHB3c2kgKQogICAgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIDAsIG5hbWUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19QUk9UT0JZTkFNRSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX1BST1RPQllOQU1FICk7CisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgIFdTQUFzeW5jR2V0UHJvdG9CeU5hbWUoKSAgICAgICAoV1NPQ0szMi4xMDUpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBXU0FBc3luY0dldFByb3RvQnlOYW1lMzIoSFdORDMyIGhXbmQsIFVJTlQzMiB1TXNnLCBMUENTVFIgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgc2J1ZiwgSU5UMzIgYnVmbGVuKQoreworICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFByb3RvQnlOYW1lMzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIHByb3RvY29sICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORyApOworCisgIGlmKCBwd3NpICkKKyAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCAwLCBuYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX1BST1RPQllOQU1FIHwgV1NNU0dfQVNZTkNfV0lOMzIpOwogICByZXR1cm4gMDsKIH0KIApAQCAtMTY1OSwxNyArMTczMywzNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICBXU0FBc3luY0dldFByb3RvQnlOdW1iZXIoKQkoV0lOU09DSy4xMDQpCiAgKi8KLUhBTkRMRTE2IFdJTkFQSSBXU0FBc3luY0dldFByb3RvQnlOdW1iZXIoSFdORDE2IGhXbmQsIFVJTlQxNiB1TXNnLCBJTlQxNiBudW1iZXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIgc2J1ZiwgSU5UMTYgYnVmbGVuKQorSEFORExFMTYgV0lOQVBJIFdTQUFzeW5jR2V0UHJvdG9CeU51bWJlcjE2KEhXTkQxNiBoV25kLCBVSU5UMTYgdU1zZywgSU5UMTYgbnVtYmVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdQVFIgc2J1ZiwgSU5UMTYgYnVmbGVuKQogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFByb3RvQnlOdW1iZXIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIG51bSAlaVxuIiwKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIldTX0FzeW5jR2V0UHJvdG9CeU51bWJlcjE2KCUwOHgpOiBod25kICUwNHgsIG1zZyAlMDR4LCBudW0gJWlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCBudW1iZXIgKTsKIAogICBpZiggcHdzaSApCiAgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgbnVtYmVyLCBOVUxMLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfUFJPVE9CWU5VTSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICh2b2lkKilzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX1BST1RPQllOVU0gKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgV1NBQXN5bmNHZXRQcm90b0J5TnVtYmVyKCkgICAgIChXU09DSzMyLjEwNCkKKyAqLworSEFORExFMzIgV0lOQVBJIFdTQUFzeW5jR2V0UHJvdG9CeU51bWJlcjMyKEhXTkQzMiBoV25kLCBVSU5UMzIgdU1zZywgSU5UMzIgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIHNidWYsIElOVDMyIGJ1ZmxlbikKK3sKKyAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRQcm90b0J5TnVtYmVyMzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIG51bSAlaVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIChIV05EMTYpaFduZCwgdU1zZywgbnVtYmVyICk7CisKKyAgaWYoIHB3c2kgKQorICAgIHJldHVybiBfX1dTQXN5bmNEQlF1ZXJ5KHB3c2ksIGhXbmQsIHVNc2csIG51bWJlciwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19QUk9UT0JZTlVNIHwgV1NNU0dfQVNZTkNfV0lOMzIpOwogICByZXR1cm4gMDsKIH0KIApAQCAtMTY3Nyw2NSArMTc2OCwxMDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lKCkJKFdJTlNPQ0suMTA3KQogICovCi1IQU5ETEUxNiBXSU5BUEkgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lKEhXTkQxNiBoV25kLCBVSU5UMTYgdU1zZywgTFBDU1RSIG5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgcHJvdG8sIFNFR1BUUiBzYnVmLCBJTlQxNiBidWZsZW4pCitIQU5ETEUxNiBXSU5BUEkgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lMTYoSFdORDE2IGhXbmQsIFVJTlQxNiB1TXNnLCBMUENTVFIgbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHByb3RvLCBTRUdQVFIgc2J1ZiwgSU5UMTYgYnVmbGVuKQogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFNlcnZCeU5hbWUoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIG5hbWUgJXMsIHByb3RvICVzXG4iLAorICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRTZXJ2QnlOYW1lMTYoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIG5hbWUgJXMsIHByb3RvICVzXG4iLAogICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClwd3NpLCBoV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyApOwogCiAgIGlmKCBwd3NpICkKICAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCAwLCBuYW1lLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLCBzYnVmLCBidWZsZW4sIFdTTVNHX0FTWU5DX1NFUlZCWU5BTUUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90bywgKHZvaWQqKXNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfU0VSVkJZTkFNRSApOwogICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICBXU0FBc3luY0dldFNlcnZCeU5hbWUoKSAgICAgICAgKFdTT0NLMzIuMTA3KQorICovCitIQU5ETEUzMiBXSU5BUEkgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lMzIoSFdORDMyIGhXbmQsIFVJTlQzMiB1TXNnLCBMUENTVFIgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgcHJvdG8sIExQU1RSIHNidWYsIElOVDMyIGJ1ZmxlbikKK3sKKyAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRTZXJ2QnlOYW1lMzIoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwOHgsIG5hbWUgJXMsIHByb3RvICVzXG4iLAorICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCAobmFtZSk/bmFtZTpOVUxMX1NUUklORywgKHByb3RvKT9wcm90bzpOVUxMX1NUUklORyApOworICBpZiggcHdzaSApCisgICAgcmV0dXJuIF9fV1NBc3luY0RCUXVlcnkocHdzaSwgaFduZCwgdU1zZywgMCwgbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90bywgKHZvaWQqKXNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfU0VSVkJZTkFNRSB8IFdTTVNHX0FTWU5DX1dJTjMyKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICBXU0FBc3luY0dldFNlcnZCeVBvcnQoKQkoV0lOU09DSy4xMDYpCiAgKi8KLUhBTkRMRTE2IFdJTkFQSSBXU0FBc3luY0dldFNlcnZCeVBvcnQoSFdORDE2IGhXbmQsIFVJTlQxNiB1TXNnLCBJTlQxNiBwb3J0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHByb3RvLCBTRUdQVFIgc2J1ZiwgSU5UMTYgYnVmbGVuKQorSEFORExFMTYgV0lOQVBJIFdTQUFzeW5jR2V0U2VydkJ5UG9ydDE2KEhXTkQxNiBoV25kLCBVSU5UMTYgdU1zZywgSU5UMTYgcG9ydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHByb3RvLCBTRUdQVFIgc2J1ZiwgSU5UMTYgYnVmbGVuKQogewogICBMUFdTSU5GTyAgICAgICAgICAgICAgcHdzaSA9IHdzaV9maW5kKEdldEN1cnJlbnRUYXNrKCkpOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFNlcnZCeVBvcnQoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIHBvcnQgJWksIHByb3RvICVzXG4iLAorICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNHZXRTZXJ2QnlQb3J0MTYoJTA4eCk6IGh3bmQgJTA0eCwgbXNnICUwNHgsIHBvcnQgJWksIHByb3RvICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB3c2ksIGhXbmQsIHVNc2csIHBvcnQsIChwcm90byk/cHJvdG86TlVMTF9TVFJJTkcgKTsKIAogICBpZiggcHdzaSApCiAgICAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCBwb3J0LCBwcm90bywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfU0VSVkJZUE9SVCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgKHZvaWQqKXNidWYsIGJ1ZmxlbiwgV1NNU0dfQVNZTkNfU0VSVkJZUE9SVCApOwogICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICBXU0FDYW5jZWxBc3luY1JlcXVlc3QoKQkoV0lOU09DSy4xMDgpCisgKiAgICAgICBXU0FBc3luY0dldFNlcnZCeVBvcnQoKSAgICAgICAgKFdTT0NLMzIuMTA2KQogICovCi1JTlQxNiBXSU5BUEkgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0KEhBTkRMRTE2IGhBc3luY1Rhc2tIYW5kbGUpCitIQU5ETEUzMiBXSU5BUEkgV1NBQXN5bmNHZXRTZXJ2QnlQb3J0MzIoSFdORDMyIGhXbmQsIFVJTlQzMiB1TXNnLCBJTlQzMiBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBwcm90bywgTFBTVFIgc2J1ZiwgSU5UMzIgYnVmbGVuKQogewotICBJTlQxNgkJCXJldFZhbCA9IFNPQ0tFVF9FUlJPUjsKICAgTFBXU0lORk8gICAgICAgICAgICAgIHB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKLSAgd3NfYXN5bmNfb3AqCQlwX2FvcCA9ICh3c19hc3luY19vcCopV1NfSEFORExFMlBUUihoQXN5bmNUYXNrSGFuZGxlKTsKIAotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQ2FuY2VsQXN5bmNSZXF1ZXN0KCUwOHgpOiBoYW5kbGUgJTA0eFxuIiwgCi0JCQkgICAodW5zaWduZWQpcHdzaSwgaEFzeW5jVGFza0hhbmRsZSk7CisgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY0dldFNlcnZCeVBvcnQzMiglMDh4KTogaHduZCAlMDR4LCBtc2cgJTA4eCwgcG9ydCAlaSwgcHJvdG8gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcHdzaSwgKEhXTkQxNiloV25kLCB1TXNnLCBwb3J0LCAocHJvdG8pP3Byb3RvOk5VTExfU1RSSU5HICk7CisKICAgaWYoIHB3c2kgKQotICB7Ci0gICAgICBTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBUUlVFICk7CS8qIGJsb2NrIFNJR0lPICovCi0gICAgICBpZiggV0lOU09DS19jYW5jZWxfYXN5bmNfb3AocF9hb3ApICkKLSAgICAgIHsKLQkgIFdTX0ZSRUUocF9hb3ApOwotCSAgcHdzaS0+bnVtX2FzeW5jX3JxLS07Ci0JICByZXRWYWwgPSAwOwotICAgICAgfQotICAgICAgZWxzZSBwd3NpLT5lcnIgPSBXU0FFSU5WQUw7Ci0gICAgICBTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBGQUxTRSApOwotICB9Ci0gIHJldHVybiByZXRWYWw7CisgICAgICByZXR1cm4gX19XU0FzeW5jREJRdWVyeShwd3NpLCBoV25kLCB1TXNnLCBwb3J0LCBwcm90bywgMCwKKyAgICAgICAgICAgICBOVUxMLCAodm9pZCopc2J1ZiwgYnVmbGVuLCBXU01TR19BU1lOQ19TRVJWQllQT1JUIHwgV1NNU0dfQVNZTkNfV0lOMzIpOworICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgIFdTQUNhbmNlbEFzeW5jUmVxdWVzdCgpCShXSU5TT0NLLjEwOCkoV1NPQ0szMi4xMDkpCisgKi8KK0lOVDMyIFdJTkFQSSBXU0FDYW5jZWxBc3luY1JlcXVlc3QzMihIQU5ETEUzMiBoQXN5bmNUYXNrSGFuZGxlKQoreworICAgIElOVDMyCQlyZXRWYWwgPSBTT0NLRVRfRVJST1I7CisgICAgTFBXU0lORk8JCXB3c2kgPSB3c2lfZmluZChHZXRDdXJyZW50VGFzaygpKTsKKyAgICB3c19hc3luY19vcCoJcF9hb3AgPSAod3NfYXN5bmNfb3AqKVdTX0hBTkRMRTJQVFIoaEFzeW5jVGFza0hhbmRsZSk7CisKKyAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQ2FuY2VsQXN5bmNSZXF1ZXN0KCUwOHgpOiBoYW5kbGUgJTA4eFxuIiwgCisJCQkgICAodW5zaWduZWQpcHdzaSwgaEFzeW5jVGFza0hhbmRsZSk7CisgICAgaWYoIHB3c2kgKQorICAgIHsKKwlTSUdOQUxfTWFza0FzeW5jRXZlbnRzKCBUUlVFICk7CS8qIGJsb2NrIFNJR0lPICovCisJaWYoIFdJTlNPQ0tfY2FuY2VsX2FzeW5jX29wKHBfYW9wKSApCisJeworCSAgICBXU19GUkVFKHBfYW9wKTsKKwkgICAgcHdzaS0+bnVtX2FzeW5jX3JxLS07CisJICAgIHJldFZhbCA9IDA7CisJfQorCWVsc2UgcHdzaS0+ZXJyID0gV1NBRUlOVkFMOworCVNJR05BTF9NYXNrQXN5bmNFdmVudHMoIEZBTFNFICk7CisgICAgfQorICAgIHJldHVybiByZXRWYWw7Cit9CisKK0lOVDE2IFdJTkFQSSBXU0FDYW5jZWxBc3luY1JlcXVlc3QxNihIQU5ETEUxNiBoQXN5bmNUYXNrSGFuZGxlKQoreworICAgIHJldHVybiAoSEFORExFMTYpV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0MTYoKEhBTkRMRTMyKWhBc3luY1Rhc2tIYW5kbGUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgV1NBQXN5bmNTZWxlY3QoKQkJKFdJTlNPQ0suMTAxKQorICogICAgICBXU0FBc3luY1NlbGVjdCgpCQkoV0lOU09DSy4xMDEpKFdTT0NLMzIuMTAxKQogICovCiAKIHN0YXRpYyB3c19zZWxlY3Rfb3AqIF9fd3Nfc2VsZWN0X2xpc3QgPSBOVUxMOwpAQCAtMTgzOCw3ICsxOTY5LDcgQEAKIAkJICAgIC8qIHRoaXMgd2lsbCBiZSByZWVuYWJsZWQgd2hlbiBzZW5kKCkgb3Igc2VuZHRvKCkgZmFpbCB3aXRoCiAJCSAgICAgKiBXU0FFV09VTERCTE9DSyAqLwogCi0JCSAgICBpZiggUG9zdE1lc3NhZ2UxNiggcHNvcC0+aFduZCwgcHNvcC0+dU1zZywgKFdQQVJBTTE2KVdTX1BUUjJIQU5ETEUocHNvcC0+cHdzKSwgCisJCSAgICBpZiggUG9zdE1lc3NhZ2UzMkEoIHBzb3AtPmhXbmQsIHBzb3AtPnVNc2csIChXUEFSQU0zMilXU19QVFIySEFORExFKHBzb3AtPnB3cyksIAogCQkJICAgICAgICAgICAgICAoTFBBUkFNKVdTQU1BS0VTRUxFQ1RSRVBMWSggV1NfRkRfV1JJVEUsIDAgKSApICkKIAkJICAgIHsKIAkJCWRwcmludGZfd2luc29jayhzdGRkZWIsICJcdCAgICBod25kICUwNHggLSAlMDR4LCAlMDh4XG4iLApAQCAtMTkwNSw4ICsyMDM2LDggQEAKIAkgICAgewogCQlkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiXHQgICAgaHduZCAlMDR4IC0gJTA0eCwgJTA4eFxuIiwgCiAJCQkJcHNvcC0+aFduZCwgcHNvcC0+dU1zZywgKHVuc2lnbmVkKWR3RXZlbnQgKTsKLQkJUG9zdE1lc3NhZ2UxNiggcHNvcC0+aFduZCwgcHNvcC0+dU1zZywgCi0JCQkgICAgICAoV1BBUkFNMTYpV1NfUFRSMkhBTkRMRShwc29wLT5wd3MpLCAoTFBBUkFNKWR3RXZlbnQgKTsKKwkJUG9zdE1lc3NhZ2UzMkEoIHBzb3AtPmhXbmQsIHBzb3AtPnVNc2csIAorCQkJICAgICAgKFdQQVJBTTMyKVdTX1BUUjJIQU5ETEUocHNvcC0+cHdzKSwgKExQQVJBTSlkd0V2ZW50ICk7CiAJCWJQb3N0ID0gRkFMU0U7CiAJCW51bV9wb3N0ZWQrKzsKIAkgICAgfQpAQCAtMTkxOCwxNCArMjA0OSwxMyBAQAogICAgIHJldHVybiAoIG51bV9wb3N0ZWQgKSA/IFRSVUUgOiBGQUxTRTsKIH0KIAotCi1JTlQxNiBXSU5BUEkgV1NBQXN5bmNTZWxlY3QoU09DS0VUMTYgcywgSFdORDE2IGhXbmQsIFVJTlQxNiB1TXNnLCBVSU5UMzIgbEV2ZW50KQorSU5UMzIgV0lOQVBJIFdTQUFzeW5jU2VsZWN0MzIoU09DS0VUMzIgcywgSFdORDMyIGhXbmQsIFVJTlQzMiB1TXNnLCBVSU5UMzIgbEV2ZW50KQogewogICAgIHdzX3NvY2tldCogICAgcHdzICA9ICh3c19zb2NrZXQqKVdTX0hBTkRMRTJQVFIocyk7CiAgICAgTFBXU0lORk8gICAgICBwd3NpID0gd3NpX2ZpbmQoR2V0Q3VycmVudFRhc2soKSk7CiAKLSAgICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiV1NfQXN5bmNTZWxlY3QoJTA4eCk6ICUwNHgsIGhXbmQgJTA0eCwgdU1zZyAlMDR4LCBldmVudCAlMDh4XG4iLAotCQkJICAodW5zaWduZWQpcHdzaSwgcywgaFduZCwgdU1zZywgKHVuc2lnbmVkKWxFdmVudCApOworICAgIGRwcmludGZfd2luc29jayhzdGRkZWIsICJXU19Bc3luY1NlbGVjdCglMDh4KTogJTA0eCwgaFduZCAlMDR4LCB1TXNnICUwOHgsIGV2ZW50ICUwOHhcbiIsCisJCQkgICh1bnNpZ25lZClwd3NpLCAoU09DS0VUMTYpcywgKEhXTkQxNiloV25kLCB1TXNnLCAodW5zaWduZWQpbEV2ZW50ICk7CiAgICAgaWYoIF9jaGVja193cyhwd3NpLCBwd3MpICkKICAgICB7CiAJd3Nfc2VsZWN0X29wKiBwc29wOwpAQCAtMTk5NiwxNSArMjEyNiwyMCBAQAogICAgIHJldHVybiBTT0NLRVRfRVJST1I7IAogfQogCitJTlQxNiBXSU5BUEkgV1NBQXN5bmNTZWxlY3QxNihTT0NLRVQxNiBzLCBIV05EMTYgaFduZCwgVUlOVDE2IHdNc2csIFVJTlQzMiBsRXZlbnQpCit7CisgICAgcmV0dXJuIChJTlQxNilXU0FBc3luY1NlbGVjdDMyKCBzLCBoV25kLCB3TXNnLCBsRXZlbnQgKTsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCV9fV1NBRkRJc1NldCgpCQkJKFdJTlNPQ0suMTUxKQogICovCi1JTlQxNiBXSU5BUEkgX19XU0FGRElzU2V0MTYoU09DS0VUMTYgcywgd3NfZmRfc2V0ICpzZXQpCitJTlQxNiBXSU5BUEkgX19XU0FGRElzU2V0MTYoU09DS0VUMTYgcywgd3NfZmRfc2V0MTYgKnNldCkKIHsKICAgaW50IGkgPSBzZXQtPmZkX2NvdW50OwogICAKLSAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIl9fV1NBRkRJc1NldCglZCwlOGx4KVxuIiwgcywodW5zaWduZWQgbG9uZylzZXQpOworICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCAiX19XU0FGRElzU2V0MTYoJWQsJThseClcbiIsIHMsKHVuc2lnbmVkIGxvbmcpc2V0KTsKICAgICAKICAgd2hpbGUgKGktLSkKICAgICAgIGlmIChzZXQtPmZkX2FycmF5W2ldID09IHMpIHJldHVybiAxOwpAQCAtMjAxNCw5ICsyMTQ5LDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgX19XU0FGRElzU2V0KCkJCQkoV1NPQ0szMi4xNTEpCiAgKi8KLUlOVDMyIFdJTkFQSSBfX1dTQUZESXNTZXQzMihTT0NLRVQzMiBzLCB3c19mZF9zZXQgKnNldCkKK0lOVDMyIFdJTkFQSSBfX1dTQUZESXNTZXQzMihTT0NLRVQzMiBzLCB3c19mZF9zZXQzMiAqc2V0KQogewotICAgIHJldHVybiBfX1dTQUZESXNTZXQxNiggKFNPQ0tFVDE2KXMsIHNldCApOworICBpbnQgaSA9IHNldC0+ZmRfY291bnQ7CisKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwgIl9fV1NBRkRJc1NldDMyKCVkLCU4bHgpXG4iLCBzLCh1bnNpZ25lZCBsb25nKXNldCk7CisKKyAgd2hpbGUgKGktLSkKKyAgICAgIGlmIChzZXQtPmZkX2FycmF5W2ldID09IHMpIHJldHVybiAxOworICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMTIxLDI1ICsyMjYyLDc0IEBACiAgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKIH0KIAorLyoKKyAqICAgICAgVENQL0lQIGFjdGlvbiBjb2Rlcy4KKyAqLworCisKKyNkZWZpbmUgV1NDTlRMX1RDUElQX1FVRVJZX0lORk8gICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBXU0NOVExfVENQSVBfU0VUX0lORk8gICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFdTQ05UTF9UQ1BJUF9JQ01QX0VDSE8gICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgV1NDTlRMX1RDUElQX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICBXc0NvbnRyb2woKQorICoKKyAqIFdzQ29udHJvbCBzZWVtcyB0byBiZSBhbiB1bmRvY3VtZW50ZWQgV2luOTUgZnVuY3Rpb24uIEEgbG90IG9mIAorICogZGlzY3Vzc2lvbiBhYm91dCBXc0NvbnRyb2wgY2FuIGJlIGZvdW5kIG9uIHRoZSBuZXQsIGUuZy4KKyAqIFN1YmplY3Q6ICAgICAgUmU6IFdTT0NLMzIuRExMIFdzQ29udHJvbCBFeHBvcnRlZCBGdW5jdGlvbgorICogRnJvbTogICAgICAgICAiUGV0ZXIgUmluZGZ1c3MiIDxyaW5kZnVzcy1zQG1lZGVhLnd6LWJlcmxpbi5kZT4KKyAqIERhdGU6ICAgICAgICAgMTk5Ny8wOC8xNwogICovCi1WT0lEIFdJTkFQSSBXc0NvbnRyb2woRFdPUkQgeDEsRFdPUkQgeDIsTFBEV09SRCB4MyxMUERXT1JEIHg0LAotICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgeDUsTFBEV09SRCB4NikgCisKK0RXT1JEIFdJTkFQSSBXc0NvbnRyb2woRFdPUkQgcHJvdG9jb2xsLERXT1JEIGFjdGlvbiwKKwkJICAgICAgTFBWT0lEIGluYnVmLExQRFdPUkQgaW5idWZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIG91dGJ1ZixMUERXT1JEIG91dGJ1ZmxlbikgCiB7Ci0JZnByaW50ZihzdGRuaW1wLCJXc0NvbnRyb2woJWx4LCVseCwlcCwlcCwlcCwlcClcbiIsCi0JCXgxLHgyLHgzLHg0LHg1LHg2Ci0JKTsKLQlmcHJpbnRmKHN0ZG5pbXAsIldzQ29udHJvbCh4LHgsJWx4LCVseCwlbHgsJWx4KVxuIiwKLQkJeDM/KngzOjAseDQ/Kng0OjAseDU/Kng1OjAseDY/Kng2OjAKLQkpOworCisgIHN3aXRjaCAoYWN0aW9uKSB7CisgIGNhc2UgV1NDTlRMX1RDUElQX0lDTVBfRUNITzoKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgYWRkciA9ICoodW5zaWduZWQgaW50KilpbmJ1ZjsKKyNpZiAwCisgICAgICBpbnQgdGltZW91dD0gKih1bnNpZ25lZCBpbnQqKShpbmJ1Zis0KTsKKyAgICAgIHNob3J0IHgxID0gKih1bnNpZ25lZCBzaG9ydCopKGluYnVmKzgpOworICAgICAgc2hvcnQgc2VuZGJ1ZnNpemUgPSAqKHVuc2lnbmVkIHNob3J0KikoaW5idWYrMTApOworICAgICAgY2hhciB4MiA9ICoodW5zaWduZWQgY2hhciopKGluYnVmKzEyKTsKKyAgICAgIGNoYXIgdHRsID0gKih1bnNpZ25lZCBjaGFyKikoaW5idWYrMTMpOworICAgICAgY2hhciBzZXJ2aWNlID0gKih1bnNpZ25lZCBjaGFyKikoaW5idWYrMTQpOworICAgICAgY2hhciB0eXBlPSAqKHVuc2lnbmVkIGNoYXIqKShpbmJ1ZisxNSk7IC8qIDB4MjogZG9uJ3QgZnJhZ21lbnQqLworI2VuZGlmICAgICAgCisgICAgICAKKyAgICAgIGZwcmludGYoc3RkbmltcCwiV3NDb250cm9sKElDTVBfRUNITykgdG8gMHglMDh4IHN0dWIgXG4iLAorCSAgICAgIGFkZHIpOworICAgICAgYnJlYWs7CisgICAgfQorICBkZWZhdWx0OgorICAgIGZwcmludGYoc3RkbmltcCwiV3NDb250cm9sKCVseCwlbHgsJXAsJXAsJXAsJXApIHN0dWJcbiIsCisJICAgIHByb3RvY29sbCxhY3Rpb24saW5idWYsaW5idWZsZW4sb3V0YnVmLG91dGJ1Zmxlbik7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgV1Nfc19wZXJyb3IgICAgICAgICBXU09DSzMyLjExMDggCisgKi8KK3ZvaWQgV0lOQVBJIFdTX3NfcGVycm9yKExQQ1NUUiBtZXNzYWdlKQoreworICAgIGZwcmludGYoc3RkbmltcCwic19wZXJyb3IgJXMgc3R1YlxuIixtZXNzYWdlKTsKIAlyZXR1cm47CiB9CisKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW5kIG9mIEFQSSBzdHVmZiAqLwogCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVyIGZ1bmN0aW9ucyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVyIGZ1bmN0aW9ucyAtCisgKgorICogVE9ETzogTWVyZ2UgV1NfZHVwXy4uKCkgc3R1ZmYgaW50byBvbmUgZnVuY3Rpb24gdGhhdAorICogd291bGQgb3BlcmF0ZSB3aXRoIGEgZ2VuZXJpYyBzdHJ1Y3R1cmUgY29udGFpbmluZyBpbnRlcm5hbAorICogcG9pbnRlcnMgKHZpYSBzb21lIHNvcnQgb2YgYSB0ZW1wbGF0ZSkuCisgKi8KIAogc3RhdGljIGludCBsaXN0X3NpemUoY2hhcioqIGwsIGludCBpdGVtX3NpemUpCiB7CkBAIC0yMTkzLDM0ICsyMzgzLDI5IEBACiAgICBpbnQgc2l6ZSA9IGhvc3RlbnRfc2l6ZShwX2hlKTsKICAgIGlmKCBzaXplICkKICAgIHsKLSAgICAgY2hhciogICAgICAgICAgIHBfbmFtZSwqcF9hbGlhc2VzLCpwX2FkZHIsKnBfYmFzZSwqcDsKKyAgICAgc3RydWN0IHdzX2hvc3RlbnQqIHBfdG87CisgICAgIGNoYXIqIHBfbmFtZSwqcF9hbGlhc2VzLCpwX2FkZHIsKnBfYmFzZSwqcDsKIAogICAgICBfY2hlY2tfYnVmZmVyKHB3c2ksIHNpemUpOworICAgICBwX3RvID0gKHN0cnVjdCB3c19ob3N0ZW50Kilwd3NpLT5idWZmZXI7CiAgICAgIHAgPSBwd3NpLT5idWZmZXI7CiAgICAgIHBfYmFzZSA9IChmbGFnICYgV1NfRFVQX09GRlNFVCkgPyBOVUxMCiAJCQkJICAgICA6ICgoZmxhZyAmIFdTX0RVUF9TRUdQVFIpID8gKGNoYXIqKVNFR1BUUl9HRVQocCkgOiBwKTsKLSAgICAgcCArPSAoZmxhZyAmIFdTX0RVUF9OQVRJVkUpID8gc2l6ZW9mKHN0cnVjdCBob3N0ZW50KSA6IHNpemVvZihzdHJ1Y3Qgd3NfaG9zdGVudCk7CisgICAgIHAgKz0gc2l6ZW9mKHN0cnVjdCB3c19ob3N0ZW50KTsKICAgICAgcF9uYW1lID0gcDsKICAgICAgc3RyY3B5KHAsIHBfaGUtPmhfbmFtZSk7IHAgKz0gc3RybGVuKHApICsgMTsKICAgICAgcF9hbGlhc2VzID0gcDsKICAgICAgcCArPSBsaXN0X2R1cChwX2hlLT5oX2FsaWFzZXMsIHAsIHBfYmFzZSArIChwIC0gcHdzaS0+YnVmZmVyKSwgMCk7CiAgICAgIHBfYWRkciA9IHA7CiAgICAgIGxpc3RfZHVwKHBfaGUtPmhfYWRkcl9saXN0LCBwLCBwX2Jhc2UgKyAocCAtIHB3c2ktPmJ1ZmZlciksIHBfaGUtPmhfbGVuZ3RoKTsKLSAgICAgaWYoIGZsYWcgJiBXU19EVVBfTkFUSVZFICkKLSAgICAgeyBzdHJ1Y3QgaG9zdGVudCogcF90byA9IChzdHJ1Y3QgaG9zdGVudCopcHdzaS0+YnVmZmVyOwotICAgICAgIHBfdG8tPmhfYWRkcnR5cGUgPSBwX2hlLT5oX2FkZHJ0eXBlOyBwX3RvLT5oX2xlbmd0aCA9IHBfaGUtPmhfbGVuZ3RoOwotICAgICAgIHBfdG8tPmhfbmFtZSA9IHBfYmFzZSArIChwX25hbWUgLSBwd3NpLT5idWZmZXIpOwotICAgICAgIHBfdG8tPmhfYWxpYXNlcyA9IChjaGFyKiopKHBfYmFzZSArIChwX2FsaWFzZXMgLSBwd3NpLT5idWZmZXIpKTsKLSAgICAgICBwX3RvLT5oX2FkZHJfbGlzdCA9IChjaGFyKiopKHBfYmFzZSArIChwX2FkZHIgLSBwd3NpLT5idWZmZXIpKTsgfQotICAgICBlbHNlCi0gICAgIHsgc3RydWN0IHdzX2hvc3RlbnQqIHBfdG8gPSAoc3RydWN0IHdzX2hvc3RlbnQqKXB3c2ktPmJ1ZmZlcjsKLSAgICAgICBwX3RvLT5oX2FkZHJ0eXBlID0gKElOVDE2KXBfaGUtPmhfYWRkcnR5cGU7IAotICAgICAgIHBfdG8tPmhfbGVuZ3RoID0gKElOVDE2KXBfaGUtPmhfbGVuZ3RoOwotICAgICAgIHBfdG8tPmhfbmFtZSA9IChTRUdQVFIpKHBfYmFzZSArIChwX25hbWUgLSBwd3NpLT5idWZmZXIpKTsKLSAgICAgICBwX3RvLT5oX2FsaWFzZXMgPSAoU0VHUFRSKShwX2Jhc2UgKyAocF9hbGlhc2VzIC0gcHdzaS0+YnVmZmVyKSk7Ci0gICAgICAgcF90by0+aF9hZGRyX2xpc3QgPSAoU0VHUFRSKShwX2Jhc2UgKyAocF9hZGRyIC0gcHdzaS0+YnVmZmVyKSk7CiAKLSAgICAgICByZXR1cm4gKHNpemUgKyBzaXplb2Yoc3RydWN0IHdzX2hvc3RlbnQpIC0gc2l6ZW9mKHN0cnVjdCBob3N0ZW50KSk7IH0KKyAgICAgcF90by0+aF9hZGRydHlwZSA9IChJTlQxNilwX2hlLT5oX2FkZHJ0eXBlOyAKKyAgICAgcF90by0+aF9sZW5ndGggPSAoSU5UMTYpcF9oZS0+aF9sZW5ndGg7CisgICAgIHBfdG8tPmhfbmFtZSA9IChTRUdQVFIpKHBfYmFzZSArIChwX25hbWUgLSBwd3NpLT5idWZmZXIpKTsKKyAgICAgcF90by0+aF9hbGlhc2VzID0gKFNFR1BUUikocF9iYXNlICsgKHBfYWxpYXNlcyAtIHB3c2ktPmJ1ZmZlcikpOworICAgICBwX3RvLT5oX2FkZHJfbGlzdCA9IChTRUdQVFIpKHBfYmFzZSArIChwX2FkZHIgLSBwd3NpLT5idWZmZXIpKTsKKworICAgICBzaXplICs9IChzaXplb2Yoc3RydWN0IHdzX2hvc3RlbnQpIC0gc2l6ZW9mKHN0cnVjdCBob3N0ZW50KSk7CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKIH0KQEAgLTIyNDIsMjggKzI0MjcsMjUgQEAKICAgIGludCBzaXplID0gcHJvdG9lbnRfc2l6ZShwX3BlKTsKICAgIGlmKCBzaXplICkKICAgIHsKLSAgICAgY2hhciogICAgICAgICAgICBwX25hbWUsKnBfYWxpYXNlcywqcF9iYXNlLCpwOworICAgICBzdHJ1Y3Qgd3NfcHJvdG9lbnQqIHBfdG87CisgICAgIGNoYXIqIHBfbmFtZSwqcF9hbGlhc2VzLCpwX2Jhc2UsKnA7CiAKICAgICAgX2NoZWNrX2J1ZmZlcihwd3NpLCBzaXplKTsKKyAgICAgcF90byA9IChzdHJ1Y3Qgd3NfcHJvdG9lbnQqKXB3c2ktPmJ1ZmZlcjsKICAgICAgcCA9IHB3c2ktPmJ1ZmZlcjsgCiAgICAgIHBfYmFzZSA9IChmbGFnICYgV1NfRFVQX09GRlNFVCkgPyBOVUxMCiAJCQkJICAgICA6ICgoZmxhZyAmIFdTX0RVUF9TRUdQVFIpID8gKGNoYXIqKVNFR1BUUl9HRVQocCkgOiBwKTsKLSAgICAgcCArPSAoZmxhZyAmIFdTX0RVUF9OQVRJVkUpPyBzaXplb2Yoc3RydWN0IHByb3RvZW50KSA6IHNpemVvZihzdHJ1Y3Qgd3NfcHJvdG9lbnQpOworICAgICBwICs9IHNpemVvZihzdHJ1Y3Qgd3NfcHJvdG9lbnQpOwogICAgICBwX25hbWUgPSBwOwogICAgICBzdHJjcHkocCwgcF9wZS0+cF9uYW1lKTsgcCArPSBzdHJsZW4ocCkgKyAxOwogICAgICBwX2FsaWFzZXMgPSBwOwogICAgICBsaXN0X2R1cChwX3BlLT5wX2FsaWFzZXMsIHAsIHBfYmFzZSArIChwIC0gcHdzaS0+YnVmZmVyKSwgMCk7Ci0gICAgIGlmKCBmbGFnICYgV1NfRFVQX05BVElWRSApCi0gICAgIHsgc3RydWN0IHByb3RvZW50KiBwX3RvID0gKHN0cnVjdCBwcm90b2VudCopcHdzaS0+YnVmZmVyOwotICAgICAgIHBfdG8tPnBfcHJvdG8gPSBwX3BlLT5wX3Byb3RvOwotICAgICAgIHBfdG8tPnBfbmFtZSA9IHBfYmFzZSArIChwX25hbWUgLSBwd3NpLT5idWZmZXIpOyAKLSAgICAgICBwX3RvLT5wX2FsaWFzZXMgPSAoY2hhcioqKShwX2Jhc2UgKyAocF9hbGlhc2VzIC0gcHdzaS0+YnVmZmVyKSk7IH0KLSAgICAgZWxzZQotICAgICB7IHN0cnVjdCB3c19wcm90b2VudCogcF90byA9IChzdHJ1Y3Qgd3NfcHJvdG9lbnQqKXB3c2ktPmJ1ZmZlcjsKLSAgICAgICBwX3RvLT5wX3Byb3RvID0gKElOVDE2KXBfcGUtPnBfcHJvdG87Ci0gICAgICAgcF90by0+cF9uYW1lID0gKFNFR1BUUikocF9iYXNlKSArIChwX25hbWUgLSBwd3NpLT5idWZmZXIpOwotICAgICAgIHBfdG8tPnBfYWxpYXNlcyA9IChTRUdQVFIpKChwX2Jhc2UpICsgKHBfYWxpYXNlcyAtIHB3c2ktPmJ1ZmZlcikpOyAKLSAgICAgICByZXR1cm4gKHNpemUgKyBzaXplb2Yoc3RydWN0IHdzX3Byb3RvZW50KSAtIHNpemVvZihzdHJ1Y3QgcHJvdG9lbnQpKTsgfQorCisgICAgIHBfdG8tPnBfcHJvdG8gPSAoSU5UMTYpcF9wZS0+cF9wcm90bzsKKyAgICAgcF90by0+cF9uYW1lID0gKFNFR1BUUikocF9iYXNlKSArIChwX25hbWUgLSBwd3NpLT5idWZmZXIpOworICAgICBwX3RvLT5wX2FsaWFzZXMgPSAoU0VHUFRSKSgocF9iYXNlKSArIChwX2FsaWFzZXMgLSBwd3NpLT5idWZmZXIpKTsgCisKKyAgICAgc2l6ZSArPSAoc2l6ZW9mKHN0cnVjdCB3c19wcm90b2VudCkgLSBzaXplb2Yoc3RydWN0IHByb3RvZW50KSk7CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKIH0KQEAgLTIyODUsOSArMjQ2NywxMSBAQAogICAgaW50IHNpemUgPSBzZXJ2ZW50X3NpemUocF9zZSk7CiAgICBpZiggc2l6ZSApCiAgICB7Ci0gICAgIGNoYXIqICAgICAgICAgICBwX25hbWUsKnBfYWxpYXNlcywqcF9wcm90bywqcF9iYXNlLCpwOworICAgICBzdHJ1Y3Qgd3Nfc2VydmVudCogcF90bzsKKyAgICAgY2hhciogcF9uYW1lLCpwX2FsaWFzZXMsKnBfcHJvdG8sKnBfYmFzZSwqcDsKIAogICAgICBfY2hlY2tfYnVmZmVyKHB3c2ksIHNpemUpOworICAgICBwX3RvID0gKHN0cnVjdCB3c19zZXJ2ZW50Kilwd3NpLT5idWZmZXI7CiAgICAgIHAgPSBwd3NpLT5idWZmZXI7CiAgICAgIHBfYmFzZSA9IChmbGFnICYgV1NfRFVQX09GRlNFVCkgPyBOVUxMIAogCQkJCSAgICAgOiAoKGZsYWcgJiBXU19EVVBfU0VHUFRSKSA/IChjaGFyKilTRUdQVFJfR0VUKHApIDogcCk7CkBAIC0yMjk5LDE5ICsyNDgzLDEyIEBACiAgICAgIHBfYWxpYXNlcyA9IHA7CiAgICAgIGxpc3RfZHVwKHBfc2UtPnNfYWxpYXNlcywgcCwgcF9iYXNlICsgKHAgLSBwd3NpLT5idWZmZXIpLCAwKTsKIAotICAgICBpZiggZmxhZyAmIFdTX0RVUF9OQVRJVkUgKQotICAgICB7IHN0cnVjdCBzZXJ2ZW50KiBwX3RvID0gKHN0cnVjdCBzZXJ2ZW50Kilwd3NpLT5idWZmZXI7Ci0gICAgICAgcF90by0+c19wb3J0ID0gcF9zZS0+c19wb3J0OwotICAgICAgIHBfdG8tPnNfbmFtZSA9IHBfYmFzZSArIChwX25hbWUgLSBwd3NpLT5idWZmZXIpOyAKLSAgICAgICBwX3RvLT5zX3Byb3RvID0gcF9iYXNlICsgKHBfcHJvdG8gLSBwd3NpLT5idWZmZXIpOwotICAgICAgIHBfdG8tPnNfYWxpYXNlcyA9IChjaGFyKiopKHBfYmFzZSArIChwX2FsaWFzZXMgLSBwd3NpLT5idWZmZXIpKTsgfQotICAgICBlbHNlCi0gICAgIHsgc3RydWN0IHdzX3NlcnZlbnQqIHBfdG8gPSAoc3RydWN0IHdzX3NlcnZlbnQqKXB3c2ktPmJ1ZmZlcjsKLSAgICAgICBwX3RvLT5zX3BvcnQgPSAoSU5UMTYpcF9zZS0+c19wb3J0OwotICAgICAgIHBfdG8tPnNfbmFtZSA9IChTRUdQVFIpKHBfYmFzZSArIChwX25hbWUgLSBwd3NpLT5idWZmZXIpKTsKLSAgICAgICBwX3RvLT5zX3Byb3RvID0gKFNFR1BUUikocF9iYXNlICsgKHBfcHJvdG8gLSBwd3NpLT5idWZmZXIpKTsKLSAgICAgICBwX3RvLT5zX2FsaWFzZXMgPSAoU0VHUFRSKShwX2Jhc2UgKyAocF9hbGlhc2VzIC0gcHdzaS0+YnVmZmVyKSk7IAotICAgICAgIHJldHVybiAoc2l6ZSArIHNpemVvZihzdHJ1Y3Qgd3Nfc2VydmVudCkgLSBzaXplb2Yoc3RydWN0IHNlcnZlbnQpKTsgfQorICAgICBwX3RvLT5zX3BvcnQgPSAoSU5UMTYpcF9zZS0+c19wb3J0OworICAgICBwX3RvLT5zX25hbWUgPSAoU0VHUFRSKShwX2Jhc2UgKyAocF9uYW1lIC0gcHdzaS0+YnVmZmVyKSk7CisgICAgIHBfdG8tPnNfcHJvdG8gPSAoU0VHUFRSKShwX2Jhc2UgKyAocF9wcm90byAtIHB3c2ktPmJ1ZmZlcikpOworICAgICBwX3RvLT5zX2FsaWFzZXMgPSAoU0VHUFRSKShwX2Jhc2UgKyAocF9hbGlhc2VzIC0gcHdzaS0+YnVmZmVyKSk7IAorCisgICAgIHNpemUgKz0gKHNpemVvZihzdHJ1Y3Qgd3Nfc2VydmVudCkgLSBzaXplb2Yoc3RydWN0IHNlcnZlbnQpKTsKICAgIH0KICAgIHJldHVybiBzaXplOwogfQpAQCAtMjMyMyw3ICsyNTAwLDcgQEAKICAgICBpbnQJbG9jX2Vycm5vID0gZXJybm87IAogI2lmIGRlZmluZWQoX19GcmVlQlNEX18pCiAgICAgICAgZHByaW50Zl93aW5zb2NrKHN0ZGVyciwgIndpbnNvY2s6IGVycm5vICVkLCAoJXMpLlxuIiwgCi0gICAgICAgICAgICAgICAgCQkJIGVycm5vLCBzeXNfZXJybGlzdFtlcnJub10pOworICAgICAgICAgICAgICAgIAkJCSBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKICNlbHNlCiAgICAgICAgZHByaW50Zl93aW5zb2NrKHN0ZGVyciwgIndpbnNvY2s6IGVycm5vICVkXG4iLCBlcnJubyk7CiAjZW5kaWYKQEAgLTIzOTgsNyArMjU3NSw3IEBACiAKICNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQogICAgIGRwcmludGZfd2luc29jayhzdGRlcnIsICJ3aW5zb2NrOiBoX2Vycm5vICVkLCAoJXMpLlxuIiwgCi0gICAgICAgICAgICAgICAJICAgIGhfZXJybm8sIHN5c19lcnJsaXN0W2hfZXJybm9dKTsKKyAgICAgICAgICAgICAgIAkgICAgaF9lcnJubywgc3RyZXJyb3IoaF9lcnJubykpOwogI2Vsc2UKICAgICBkcHJpbnRmX3dpbnNvY2soc3RkZXJyLCAid2luc29jazogaF9lcnJubyAlZC5cbiIsIGhfZXJybm8pOwogI2lmbmRlZiBzdW4KZGlmZiAtLWdpdCBhL21pc2Mvd2luc29ja19kbnMuYyBiL21pc2Mvd2luc29ja19kbnMuYwppbmRleCAxNzNmNmJiLi45NDIyNGRlIDEwMDY0NAotLS0gYS9taXNjL3dpbnNvY2tfZG5zLmMKKysrIGIvbWlzYy93aW5zb2NrX2Rucy5jCkBAIC0yOSwxMiArMjksMTIgQEAKIAogZXh0ZXJuIGludCBoX2Vycm5vOwogCisjaW5jbHVkZSAid2luc29jay5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAibWVzc2FnZS5oIgogI2luY2x1ZGUgIm1pc2NlbXUuaCIKLSNpbmNsdWRlICJ3aW5zb2NrLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2lmbmRlZiBGQVNZTkMKQEAgLTY3LDkgKzY3LDkgQEAKIHN0YXRpYyBmZF9zZXQJCV9fYXN5bmNfaW9fZmRzZXQ7CiBzdGF0aWMgd3NfYXN5bmNfb3AqCV9fYXN5bmNfb3BfbGlzdCA9IE5VTEw7CiAKLXN0YXRpYyB2b2lkIGZpeHVwX3dzaGUoc3RydWN0IHdzX2hvc3RlbnQqIHBfd3NoZSwgU0VHUFRSIGJhc2UpOwotc3RhdGljIHZvaWQgZml4dXBfd3NwZShzdHJ1Y3Qgd3NfcHJvdG9lbnQqIHBfd3NwZSwgU0VHUFRSIGJhc2UpOwotc3RhdGljIHZvaWQgZml4dXBfd3NzZShzdHJ1Y3Qgd3Nfc2VydmVudCogcF93c3NlLCBTRUdQVFIgYmFzZSk7CitzdGF0aWMgdm9pZCBmaXh1cF93c2hlKHN0cnVjdCB3c19ob3N0ZW50KiBwX3dzaGUsIHZvaWQqIGJhc2UpOworc3RhdGljIHZvaWQgZml4dXBfd3NwZShzdHJ1Y3Qgd3NfcHJvdG9lbnQqIHBfd3NwZSwgdm9pZCogYmFzZSk7CitzdGF0aWMgdm9pZCBmaXh1cF93c3NlKHN0cnVjdCB3c19zZXJ2ZW50KiBwX3dzc2UsIHZvaWQqIGJhc2UpOwogCiBleHRlcm4gdm9pZCBFVkVOVF9BZGRJTyggaW50IGZkLCB1bnNpZ25lZCBmbGFnICk7CiBleHRlcm4gdm9pZCBFVkVOVF9EZWxldGVJTyggaW50IGZkLCB1bnNpZ25lZCBmbGFnICk7CkBAIC0yNzQsMTkgKzI3NCwyMSBAQAogICAgIHsKIAlpZiggKGludClMT1dPUkQobExlbmd0aCkgPD0gcF9hb3AtPmJ1ZmxlbiApCiAJewotICAgICAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKVBUUl9TRUdfVE9fTElOKHBfYW9wLT5idWZmZXJfYmFzZSk7CisgICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAocF9hb3AtPmZsYWdzICYgV1NNU0dfQVNZTkNfV0lOMzIpCisJCSAgPyBwX2FvcC0+Yi5saW5fYmFzZSA6IChjaGFyKilQVFJfU0VHX1RPX0xJTihwX2FvcC0+Yi5zZWdfYmFzZSk7CisKICAgICAgICAgICAgIHJlYWQocF9hb3AtPmZkWzBdLCBidWZmZXIsIExPV09SRChsTGVuZ3RoKSk7CiAgICAgICAgICAgICBzd2l0Y2goIHBfYW9wLT5mbGFncyApCiAgICAgICAgICAgICB7CiAJCWNhc2UgV1NNU0dfQVNZTkNfSE9TVEJZTkFNRToKIAkJY2FzZSBXU01TR19BU1lOQ19IT1NUQllBRERSOgotCQkgICAgIGZpeHVwX3dzaGUoKHN0cnVjdCB3c19ob3N0ZW50KilidWZmZXIsIHBfYW9wLT5idWZmZXJfYmFzZSk7IGJyZWFrOworCQkgICAgIGZpeHVwX3dzaGUoKHN0cnVjdCB3c19ob3N0ZW50KilidWZmZXIsIHBfYW9wLT5iLnB0cl9iYXNlKTsgYnJlYWs7CiAJCWNhc2UgV1NNU0dfQVNZTkNfUFJPVE9CWU5BTUU6CiAJCWNhc2UgV1NNU0dfQVNZTkNfUFJPVE9CWU5VTToKLQkJICAgICBmaXh1cF93c3BlKChzdHJ1Y3Qgd3NfcHJvdG9lbnQqKWJ1ZmZlciwgcF9hb3AtPmJ1ZmZlcl9iYXNlKTsgYnJlYWs7CisJCSAgICAgZml4dXBfd3NwZSgoc3RydWN0IHdzX3Byb3RvZW50KilidWZmZXIsIHBfYW9wLT5iLnB0cl9iYXNlKTsgYnJlYWs7CiAJCWNhc2UgV1NNU0dfQVNZTkNfU0VSVkJZTkFNRToKIAkJY2FzZSBXU01TR19BU1lOQ19TRVJWQllQT1JUOgotCQkgICAgIGZpeHVwX3dzc2UoKHN0cnVjdCB3c19zZXJ2ZW50KilidWZmZXIsIHBfYW9wLT5idWZmZXJfYmFzZSk7IGJyZWFrOworCQkgICAgIGZpeHVwX3dzc2UoKHN0cnVjdCB3c19zZXJ2ZW50KilidWZmZXIsIHBfYW9wLT5iLnB0cl9iYXNlKTsgYnJlYWs7CiAJCWRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICBpZiggcF9hb3AtPmZsYWdzICkgZnByaW50ZihzdGRlcnIsIlJlY2VpdmVkIHVua25vd24gYXN5bmMgcmVxdWVzdCFcbiIpOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFPUF9DT05UUk9MX1JFTU9WRTsKQEAgLTMwMiwxNCArMzA0LDE0IEBACiAKICAgICAvKiBGSVhNRTogdXBkYXRlIG51bV9hc3luY19ycSAqLwogICAgIEVWRU5UX0RlbGV0ZUlPKCBwX2FvcC0+ZmRbMF0sIEVWRU5UX0lPX1JFQUQgKTsKLSAgICBQb3N0TWVzc2FnZTE2KCBwX2FvcC0+aFduZCwgcF9hb3AtPnVNc2csIF9fd3NfZ2V0aGFuZGxlKHBfYW9wKSwgKExQQVJBTSlsTGVuZ3RoICk7CisgICAgUG9zdE1lc3NhZ2UzMkEoIHBfYW9wLT5oV25kLCBwX2FvcC0+dU1zZywgX193c19nZXRoYW5kbGUocF9hb3ApLCAoTFBBUkFNKWxMZW5ndGggKTsKICAgICAKICAgICByZXR1cm4gQU9QX0NPTlRST0xfUkVNT1ZFOyAgLyogb25lLXNob3QgcmVxdWVzdCAqLwogfQogCiAKLUhBTkRMRTE2IF9fV1NBc3luY0RCUXVlcnkoTFBXU0lORk8gcHdzaSwgSFdORDE2IGhXbmQsIFVJTlQxNiB1TXNnLCBJTlQxNiB0eXBlLCBMUFNUUiBpbml0LAotCQkgIAkgIElOVDE2IGxlbiwgTFBTVFIgcHJvdG8sIFNFR1BUUiBzYnVmLCBJTlQxNiBidWZsZW4sIFVJTlQzMiBmbGFnKQorSEFORExFMTYgX19XU0FzeW5jREJRdWVyeShMUFdTSU5GTyBwd3NpLCBIV05EMzIgaFduZCwgVUlOVDMyIHVNc2csIElOVDMyIHR5cGUsIExQU1RSIGluaXQsCisJCSAgCSAgSU5UMzIgbGVuLCBMUFNUUiBwcm90bywgdm9pZCogc2J1ZiwgSU5UMzIgYnVmbGVuLCBVSU5UMzIgZmxhZykKIHsKICAgICAvKiBxdWV1ZSAnZmxhZycgcmVxdWVzdCBhbmQgZm9yayBvZmYgaXRzIGhhbmRsZXIgKi8KIApAQCAtMzI4LDcgKzMzMCw4IEBACiAKIAkgICAgYXN5bmNfY3RsLndzX2FvcC0+aFduZCA9IGhXbmQ7CiAJICAgIGFzeW5jX2N0bC53c19hb3AtPnVNc2cgPSB1TXNnOwotCSAgICBhc3luY19jdGwud3NfYW9wLT5idWZmZXJfYmFzZSA9IHNidWY7IGFzeW5jX2N0bC53c19hb3AtPmJ1ZmxlbiA9IGJ1ZmxlbjsKKwkgICAgYXN5bmNfY3RsLndzX2FvcC0+Yi5wdHJfYmFzZSA9IHNidWY7IAorCSAgICBhc3luY19jdGwud3NfYW9wLT5idWZsZW4gPSBidWZsZW47CiAJICAgIGFzeW5jX2N0bC53c19hb3AtPmZsYWdzID0gZmxhZzsKIAkgICAgYXN5bmNfY3RsLndzX2FvcC0+YW9wX2NvbnRyb2wgPSAmYW9wX2NvbnRyb2w7CiAKQEAgLTQ0MSwxOSArNDQ0LDIwIEBACiAKICAgY2xvc2UoYXN5bmNfY3RsLndzX2FvcC0+ZmRbMF0pOwogCi0gIGRwcmludGZfd2luc29jayhzdGRkZWIsIkROUzogZ2V0dGluZyBob3N0ZW50IGZvciBbJXNdXG4iLCBhc3luY19jdGwucnEubmFtZSApOwotCiAgIHBfaGUgPSAoZmxhZyAmIFdTTVNHX0FTWU5DX0hPU1RCWU5BTUUpCiAJID8gZ2V0aG9zdGJ5bmFtZShhc3luY19jdGwucnEubmFtZSkKIAkgOiBnZXRob3N0YnlhZGRyKGFzeW5jX2N0bC5ycS5uYW1lLAogCQkgCSBhc3luY19jdGwuaWxlbmd0aCwgYXN5bmNfY3RsLnR5cGUpOwotICBkcHJpbnRmX3dpbnNvY2soc3RkZGViLCJETlM6IGRvbmUhXG4iKTsKIAotICBpZiggcF9oZSApIHNpemUgPSBXU19kdXBfaGUocHdzaSwgcF9oZSwgV1NfRFVQX1NFR1BUUiB8IFdTX0RVUF9PRkZTRVQgKTsKKyAgZHByaW50Zl93aW5zb2NrKHN0ZGRlYiwiRE5TOiBnb3QgaG9zdGVudCBmb3IgWyVzXVxuIiwgYXN5bmNfY3RsLnJxLm5hbWUgKTsKKworICBpZiggcF9oZSApIC8qIGNvbnZlcnQgdG8gdGhlIFdpbnNvY2sgZm9ybWF0IHdpdGggaW50ZXJuYWwgcG9pbnRlcnMgYXMgb2Zmc2V0cyAqLworICAgICAgc2l6ZSA9IFdTX2R1cF9oZShwd3NpLCBwX2hlLCBXU19EVVBfT0ZGU0VUIHwgCisJCSAgICAgKChmbGFnICYgV1NNU0dfQVNZTkNfV0lOMzIpID8gV1NfRFVQX0xJTkVBUiA6IFdTX0RVUF9TRUdQVFIpICk7CiAgIGlmKCBzaXplICkKICAgewotICAgICBhc3luY19jdGwuYnVmZmVyID0gcHdzaS0+YnVmZmVyOwotICAgICBhc3luY19jdGwuaWxlbmd0aCA9ICh1bnNpZ25lZClXU0FNQUtFQVNZTkNSRVBMWSggKFVJTlQxNilzaXplLCAwICk7CisgICAgICBhc3luY19jdGwuYnVmZmVyID0gcHdzaS0+YnVmZmVyOworICAgICAgYXN5bmNfY3RsLmlsZW5ndGggPSAodW5zaWduZWQpV1NBTUFLRUFTWU5DUkVQTFkoIChVSU5UMTYpc2l6ZSwgMCApOwogICAgICBfYXN5bmNfbm90aWZ5KCBmbGFnICk7CiAgIH0KICAgZWxzZSBfYXN5bmNfZmFpbCgpOwpAQCAtNDY4LDExICs0NzIsMTYgQEAKICAgcF9wZSA9IChmbGFnICYgV1NNU0dfQVNZTkNfUFJPVE9CWU5BTUUpCiAJID8gZ2V0cHJvdG9ieW5hbWUoYXN5bmNfY3RsLnJxLm5hbWUpCiAJIDogZ2V0cHJvdG9ieW51bWJlcihhc3luY19jdGwudHlwZSk7Ci0gIGlmKCBwX3BlICkgc2l6ZSA9IFdTX2R1cF9wZShwd3NpLCBwX3BlLCBXU19EVVBfU0VHUFRSIHwgV1NfRFVQX09GRlNFVCApOworCisgIGRwcmludGZfd2luc29jayhzdGRkZWIsIkROUzogZ290IHByb3RvZW50IGZvciBbJXNdXG4iLCBhc3luY19jdGwucnEubmFtZSApOworCisgIGlmKCBwX3BlICkgLyogY29udmVydCB0byB0aGUgV2luc29jayBmb3JtYXQgd2l0aCBpbnRlcm5hbCBwb2ludGVycyBhcyBvZmZzZXRzICovCisgICAgICBzaXplID0gV1NfZHVwX3BlKHB3c2ksIHBfcGUsIFdTX0RVUF9PRkZTRVQgfAorCQkgICAgICgoZmxhZyAmIFdTTVNHX0FTWU5DX1dJTjMyKSA/IFdTX0RVUF9MSU5FQVIgOiBXU19EVVBfU0VHUFRSKSApOwogICBpZiggc2l6ZSApCiAgIHsKLSAgICAgYXN5bmNfY3RsLmJ1ZmZlciA9IHB3c2ktPmJ1ZmZlcjsKLSAgICAgYXN5bmNfY3RsLmlsZW5ndGggPSAodW5zaWduZWQpV1NBTUFLRUFTWU5DUkVQTFkoIChVSU5UMTYpc2l6ZSwgMCApOworICAgICAgYXN5bmNfY3RsLmJ1ZmZlciA9IHB3c2ktPmJ1ZmZlcjsKKyAgICAgIGFzeW5jX2N0bC5pbGVuZ3RoID0gKHVuc2lnbmVkKVdTQU1BS0VBU1lOQ1JFUExZKCAoVUlOVDE2KXNpemUsIDAgKTsKICAgICAgX2FzeW5jX25vdGlmeSggZmxhZyApOwogICB9IAogICBlbHNlIF9hc3luY19mYWlsKCk7CkBAIC00ODcsMTkgKzQ5NiwzMiBAQAogICBwX3NlID0gKGZsYWcgJiBXU01TR19BU1lOQ19TRVJWQllOQU1FKQogCSA/IGdldHNlcnZieW5hbWUoYXN5bmNfY3RsLnJxLm5hbWUsIGFzeW5jX2N0bC5idWZmZXIpCiAJIDogZ2V0c2VydmJ5cG9ydChhc3luY19jdGwudHlwZSwgYXN5bmNfY3RsLmJ1ZmZlcik7Ci0gIGlmKCBwX3NlICkgc2l6ZSA9IFdTX2R1cF9zZShwd3NpLCBwX3NlLCBXU19EVVBfU0VHUFRSIHwgV1NfRFVQX09GRlNFVCApOworCisgIGlmKCBwX3NlICkgLyogY29udmVydCB0byB0aGUgV2luc29jayBmb3JtYXQgd2l0aCBpbnRlcm5hbCBwb2ludGVycyBhcyBvZmZzZXRzICovCisgICAgICBzaXplID0gV1NfZHVwX3NlKHB3c2ksIHBfc2UsIFdTX0RVUF9PRkZTRVQgfAorCQkgICAgICAoKGZsYWcgJiBXU01TR19BU1lOQ19XSU4zMikgPyBXU19EVVBfTElORUFSIDogV1NfRFVQX1NFR1BUUikgKTsKICAgaWYoIHNpemUgKQogICB7Ci0gICAgIGFzeW5jX2N0bC5idWZmZXIgPSBwd3NpLT5idWZmZXI7Ci0gICAgIGFzeW5jX2N0bC5pbGVuZ3RoID0gKHVuc2lnbmVkKVdTQU1BS0VBU1lOQ1JFUExZKCAoVUlOVDE2KXNpemUsIDAgKTsKKyAgICAgIGFzeW5jX2N0bC5idWZmZXIgPSBwd3NpLT5idWZmZXI7CisgICAgICBhc3luY19jdGwuaWxlbmd0aCA9ICh1bnNpZ25lZClXU0FNQUtFQVNZTkNSRVBMWSggKFVJTlQxNilzaXplLCAwICk7CiAgICAgIF9hc3luY19ub3RpZnkoIGZsYWcgKTsKICAgfQogICBlbHNlIF9hc3luY19mYWlsKCk7CiB9CiAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlciBmdW5jdGlvbnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlciBmdW5jdGlvbnMgLQorICoKKyAqIFJhdyByZXN1bHRzIGZyb20gcGlwZSBjb250YWluIGludGVybmFsIHBvaW50ZXJzIHN0b3JlZCBhcworICogb2Zmc2V0cyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgYW5kIHdlIG5lZWQKKyAqIHRvIGFwcGx5IGEgZml4dXAgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byBhcHBsaWNhdGlvbnMuCisgKgorICogTk9URTogSXQgaXMgcG9zc2libGUgdG8gZXhwbG9pdCB0aGUgZmFjdCB0aGF0IGZvcmsoKSBkb2Vzbid0IAorICogY2hhbmdlIHRoZSBidWZmZXIgYWRkcmVzcyBieSBzdG9yaW5nIGZpeGVkIHVwIHBvaW50ZXJzIHJpZ2h0IAorICogaW4gdGhlIGhhbmRsZXIuIEhvd2V2ZXIsIHRoaXMgd2lsbCBnZXQgaW4gdGhlIHdheSBpZiB3ZSBldmVyIAorICogZ2V0IHRvIGltcGxlbWVudGluZyBETlMgaGVscGVyIGRhZW1vbiBhLWxhIE5ldHNjYXBlLgorICovCiAKLXZvaWQgZml4dXBfd3NoZShzdHJ1Y3Qgd3NfaG9zdGVudCogcF93c2hlLCBTRUdQVFIgYmFzZSkKK3ZvaWQgZml4dXBfd3NoZShzdHJ1Y3Qgd3NfaG9zdGVudCogcF93c2hlLCB2b2lkKiBiYXNlKQogewogICAgLyogYWRkICdiYXNlJyB0byB3c19ob3N0ZW50IHBvaW50ZXJzIHRvIGNvbnZlcnQgdGhlbSBmcm9tIG9mZnNldHMgKi8KIApAQCAtNTE1LDcgKzUzNyw3IEBACiAgICBmb3IoaT0wO3BfYWRkcltpXTtpKyspIHBfYWRkcltpXSArPSAodW5zaWduZWQpYmFzZTsKIH0KIAotdm9pZCBmaXh1cF93c3BlKHN0cnVjdCB3c19wcm90b2VudCogcF93c3BlLCBTRUdQVFIgYmFzZSkKK3ZvaWQgZml4dXBfd3NwZShzdHJ1Y3Qgd3NfcHJvdG9lbnQqIHBfd3NwZSwgdm9pZCogYmFzZSkKIHsKICAgIGludCBpOwogICAgdW5zaWduZWQqICAgICAgIHBfYWxpYXNlcyA9ICh1bnNpZ25lZCopKChjaGFyKilwX3dzcGUgKyAodW5zaWduZWQpcF93c3BlLT5wX2FsaWFzZXMpOwpAQCAtNTI0LDcgKzU0Niw3IEBACiAgICBmb3IoaT0wO3BfYWxpYXNlc1tpXTtpKyspIHBfYWxpYXNlc1tpXSArPSAodW5zaWduZWQpYmFzZTsKIH0KIAotdm9pZCBmaXh1cF93c3NlKHN0cnVjdCB3c19zZXJ2ZW50KiBwX3dzc2UsIFNFR1BUUiBiYXNlKQordm9pZCBmaXh1cF93c3NlKHN0cnVjdCB3c19zZXJ2ZW50KiBwX3dzc2UsIHZvaWQqIGJhc2UpCiB7CiAgICBpbnQgaTsKICAgIHVuc2lnbmVkKiAgICAgICBwX2FsaWFzZXMgPSAodW5zaWduZWQqKSgoY2hhciopcF93c3NlICsgKHVuc2lnbmVkKXBfd3NzZS0+c19hbGlhc2VzKTsKZGlmZiAtLWdpdCBhL21pc2NlbXUvaW5zdHIuYyBiL21pc2NlbXUvaW5zdHIuYwppbmRleCBjMTAxZDIxLi40NmNkNDIxIDEwMDY0NAotLS0gYS9taXNjZW11L2luc3RyLmMKKysrIGIvbWlzY2VtdS9pbnN0ci5jCkBAIC0yMiwyMCArMjIsMjMgQEAKICAqICAgICAgICAgICBJTlNUUl9SZXBsYWNlU2VsZWN0b3IKICAqCiAgKiBUcnkgdG8gcmVwbGFjZSBhbiBpbnZhbGlkIHNlbGVjdG9yIGJ5IGEgdmFsaWQgb25lLgotICogRm9yIG5vdywgb25seSBzZWxlY3RvciAweDQwIGlzIGhhbmRsZWQgaGVyZS4KKyAqIFRoZSBvbmx5IHNlbGVjdG9yIHdoZXJlIGl0IGlzIGFsbG93ZWQgdG8gZG8gIm1vdiBheCw0MDttb3YgZXMsYXgiCisgKiBpcyB0aGUgc28gY2FsbGVkICdiaW1vZGFsJyBzZWxlY3RvciAweDQwLCB3aGljaCBwb2ludHMgdG8gdGhlIEJJT1MKKyAqIGRhdGEgc2VnbWVudC4gVXNlZCBieSAoYXQgbGVhc3QpIEJvcmxhbmQgcHJvZHVjdHMgKGFuZCBwcm9ncmFtcyBjb21waWxlZCAKKyAqIHVzaW5nIEJvcmxhbmQgcHJvZHVjdHMpLgorICoKKyAqIFNlZSBVbmRvY3VtZW50ZWQgV2luZG93cywgQ2hhcHRlciA1LCBfXzAwNDAuCiAgKi8KIHN0YXRpYyBXT1JEIElOU1RSX1JlcGxhY2VTZWxlY3RvciggU0lHQ09OVEVYVCAqY29udGV4dCwgV09SRCBzZWwpCiB7CiAgICAgaWYgKHNlbCA9PSAweDQwKQogICAgIHsKICAgICAgICAgc3RhdGljIFdPUkQgc3lzX3RpbWVyID0gMDsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRGlyZWN0IGFjY2VzcyB0byBzZWdtZW50IDB4NDAgKGNzOmlwPSUwNHg6JTA0bHgpLlxuIiwKLSAgICAgICAgICAgICAgICAgQ1Nfc2lnKGNvbnRleHQpLCBFSVBfc2lnKGNvbnRleHQpICk7CiAgICAgICAgIGlmICghc3lzX3RpbWVyKQogICAgICAgICAgICAgc3lzX3RpbWVyID0gQ3JlYXRlU3lzdGVtVGltZXIoIDU1LCAoRkFSUFJPQzE2KURPU01FTV9UaWNrICk7CiAgICAgICAgIHJldHVybiBET1NNRU1fQmlvc1NlZzsKICAgICB9Ci0gICAgcmV0dXJuIDA7ICAvKiBDYW4ndCByZXBsYWNlIHNlbGVjdG9yICovCisgICAgcmV0dXJuIDA7ICAvKiBDYW4ndCByZXBsYWNlIHNlbGVjdG9yLCBjcmFzaGR1bXAgKi8KIH0KIAogCmRpZmYgLS1naXQgYS9tc2Rvcy9pbnQxMy5jIGIvbXNkb3MvaW50MTMuYwppbmRleCBlYjk1NjBjLi4xZTg2MjU4IDEwMDY0NAotLS0gYS9tc2Rvcy9pbnQxMy5jCisrKyBiL21zZG9zL2ludDEzLmMKQEAgLTI1LDE1ICsyNSwxMyBAQAogCQlicmVhazsKIAkgICAgICAgCiAJY2FzZSAweDA1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGT1JNQVQgVFJBQ0sgKi8KKyAgICAgICAgY2FzZSAweDA2OiAgICAgICAgICAgICAvKiBGT1JNQVQgVFJBQ0sgQU5EIFNFVCBCQUQgU0VDVE9SIEZMQUdTICovCisgICAgICAgIGNhc2UgMHgwNzogICAgICAgICAgICAgLyogRk9STUFUIERSSVZFIFNUQVJUSU5HIEFUIEdJVkVOIFRSQUNLICAqLworICAgICAgIC8qIGRlc3BpdGUgb2Ygd2hhdCBSYWxmIEJyb3duIHNheXMsIDB4MDYgYW5kIDB4MDcgc2VlbSB0byBzZXQgQ0ZMQUcsIHRvbyAoYXQgbGVhc3QgbXkgQklPUyBkb2VzIHRoYXQpICovCiAJCUFIX3JlZyhjb250ZXh0KSA9IDB4MGM7CiAgICAgICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwogCQlicmVhazsKIAotCWNhc2UgMHgwNjogICAgICAgICAgICAgLyogRk9STUFUIFRSQUNLIEFORCBTRVQgQkFEIFNFQ1RPUiBGTEFHUyAqLwotCWNhc2UgMHgwNzogICAgICAgICAgICAgLyogRk9STUFUIERSSVZFIFNUQVJUSU5HIEFUIEdJVkVOIFRSQUNLICAqLyAKLQkJQUhfcmVnKGNvbnRleHQpID0gMHgwYzsKLQkJYnJlYWs7Ci0KIAljYXNlIDB4MDg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR0VUIERSSVZFIFBBUkFNRVRFUlMgICovCiAJCUFIX3JlZyhjb250ZXh0KSA9IChETF9yZWcoY29udGV4dCkgJiAweDgwKSA/IDB4MDcgOiAweDAxOwogICAgICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvYXVkaW8uYyBiL211bHRpbWVkaWEvYXVkaW8uYwppbmRleCAwZDVlMTRjLi41OGQ4MzY1IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL2F1ZGlvLmMKKysrIGIvbXVsdGltZWRpYS9hdWRpby5jCkBAIC0xNzM4LDcgKzE3MzgsNyBAQAogICogCQkJCUFVRElPX0RyaXZlclByb2MJCVtzYW1wbGUgZHJpdmVyXQogICovCiBMT05HIFdBVkVfRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUjE2IGhEcml2LCBXT1JEIHdNc2csIAotCQkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQorCQkgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCWRwcmludGZfbWNpd2F2ZShzdGRkZWIsIldBVkVfRHJpdmVyUHJvYyglMDhsWCwgJTA0WCwgJTA0WCwgJTA4bFgsICUwOGxYKVxuIiwgCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2pveXN0aWNrLmMgYi9tdWx0aW1lZGlhL2pveXN0aWNrLmMKaW5kZXggY2RkNjVhYi4uOTdmNDAxNiAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9qb3lzdGljay5jCisrKyBiL211bHRpbWVkaWEvam95c3RpY2suYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBKb3lzdGljayBmdW5jdGlvbnMKKyAqIGpveXN0aWNrIGZ1bmN0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTk3IEFuZHJlYXMgTW9ocgogICovCkBAIC0yMSwxMCArMjEsMTAgQEAKIHN0YXRpYyBpbnQgY291bnRfdXNlWzRdID0gezAsIDAsIDAsIDB9Owogc3RhdGljIGludCBkZXZfc3RhdDsKIHN0YXRpYyBpbnQgam95X25yX29wZW4gPSAwOwotc3RhdGljIEJPT0wxNiBKb3lDYXB0dXJlZCA9IEZBTFNFOworc3RhdGljIEJPT0wxNiBqb3lDYXB0dXJlZCA9IEZBTFNFOwogc3RhdGljIEhXTkQxNiBDYXB0dXJlV25kWzJdID0gezAsIDB9Owogc3RhdGljIGludCBqb3lfZGV2WzJdID0gey0xLCAtMX07Ci1zdGF0aWMgSk9ZSU5GTyBKb3lDYXBEYXRhWzJdOworc3RhdGljIEpPWUlORk8xNiBqb3lDYXBEYXRhWzJdOwogc3RhdGljIHVuc2lnbmVkIGludCBqb3lfdGhyZXNob2xkWzJdID0gezAsIDB9OwogCiBzdHJ1Y3QganNfc3RhdHVzCkBAIC0zNiw5ICszNiw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpveU9wZW5Ecml2ZXIgICAgICAgICAgIFtpbnRlcm5hbF0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam95T3BlbkRyaXZlciAgICAgICAgICAgW2ludGVybmFsXQogICovCi1CT09MMTYgSm95T3BlbkRyaXZlcihXT1JEIHdJRCkKK0JPT0wxNiBqb3lPcGVuRHJpdmVyKFdPUkQgd0lEKQogewogCWNoYXIgZGV2X25hbWVbXSA9ICIvZGV2L2pzeCI7CiAKQEAgLTUyLDkgKzUyLDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpveUNsb3NlRHJpdmVyICAgICAgICAgICBbaW50ZXJuYWxdCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpveUNsb3NlRHJpdmVyICAgICAgICAgICBbaW50ZXJuYWxdCiAgKi8KLXZvaWQgSm95Q2xvc2VEcml2ZXIoV09SRCB3SUQpCit2b2lkIGpveUNsb3NlRHJpdmVyKFdPUkQgd0lEKQogewogCWlmIChqb3lfZGV2W3dJRF0gPj0gMCkgewogCQljbG9zZShqb3lfZGV2W3dJRF0pOwpAQCAtNjQsOSArNjQsOSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm95U2VuZE1lc3NhZ2VzICAgICAgICAgICBbaW50ZXJuYWxdCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpveVNlbmRNZXNzYWdlcyAgICAgICAgICAgW2ludGVybmFsXQogICovCi12b2lkIEpveVNlbmRNZXNzYWdlcyh2b2lkKQordm9pZCBqb3lTZW5kTWVzc2FnZXModm9pZCkKIHsKIAlpbnQgam95OwogICAgICAgICBzdHJ1Y3QganNfc3RhdHVzIGpzOwpAQCAtNzUsNjcgKzc1LDE0NiBAQAogCWZvciAoam95PTA7IGpveSA8IDQ7IGpveSsrKSAKIAlpZiAoam95X2Rldltqb3ldID49IDApIHsKIAkJaWYgKGNvdW50X3VzZVtqb3ldID4gMjUwKSB7Ci0JCQlKb3lDbG9zZURyaXZlcihqb3kpOworCQkJam95Q2xvc2VEcml2ZXIoam95KTsKIAkJCWNvdW50X3VzZVtqb3ldID0gMDsKIAkJfQogCQljb3VudF91c2Vbam95XSsrOwogCX0KIAllbHNlIHJldHVybjsKLSAgICAgICAgaWYgKEpveUNhcHR1cmVkID09IEZBTFNFKSByZXR1cm47CisgICAgICAgIGlmIChqb3lDYXB0dXJlZCA9PSBGQUxTRSkgcmV0dXJuOwogCWRwcmludGZfbW1zeXMoc3RkZGViLCAiSm95U2VuZE1lc3NhZ2VzKClcbiIpOwogICAgICAgICBmb3IgKGpveT0wOyBqb3kgPCA0OyBqb3krKykgewotCQlpZiAoSm95T3BlbkRyaXZlcihqb3kpID09IEZBTFNFKSBjb250aW51ZTsKKwkJaWYgKGpveU9wZW5Ecml2ZXIoam95KSA9PSBGQUxTRSkgY29udGludWU7CiAgICAgICAgICAgICAgICAgZGV2X3N0YXQgPSByZWFkKGpveV9kZXZbam95XSwgJmpzLCBzaXplb2YoanMpKTsKICAgICAgICAgICAgICAgICBpZiAoZGV2X3N0YXQgPT0gc2l6ZW9mKGpzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAganMueCA9IGpzLngqMzc7CiAgICAgICAgICAgICAgICAgICAgICAgICBqcy55ID0ganMueSozNzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoSm95Q2FwRGF0YVtqb3ldLndYcG9zICE9IGpzLngpIHx8IChKb3lDYXBEYXRhW2pveV0ud1lwb3MgIT0ganMueSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoam95Q2FwRGF0YVtqb3ldLndYcG9zICE9IGpzLngpIHx8IChqb3lDYXBEYXRhW2pveV0ud1lwb3MgIT0ganMueSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoQ2FwdHVyZVduZFtqb3ldLCBNTV9KT1kxTU9WRSArIGpveSwganMuYnV0dG9ucywgTUFLRUxPTkcoanMueCwganMueSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb3lDYXBEYXRhW2pveV0ud1hwb3MgPSBqcy54OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb3lDYXBEYXRhW2pveV0ud1lwb3MgPSBqcy55OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb3lDYXBEYXRhW2pveV0ud1hwb3MgPSBqcy54OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb3lDYXBEYXRhW2pveV0ud1lwb3MgPSBqcy55OwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpveUNhcERhdGFbam95XS53QnV0dG9ucyAhPSBqcy5idXR0b25zKSB7Ci0JCQkJdW5zaWduZWQgaW50IEJ1dHRvbkNoYW5nZWQgPSAoV09SRCkoSm95Q2FwRGF0YVtqb3ldLndCdXR0b25zIF4ganMuYnV0dG9ucyk8PDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKb3lDYXBEYXRhW2pveV0ud0J1dHRvbnMgPCBqcy5idXR0b25zKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpveUNhcERhdGFbam95XS53QnV0dG9ucyAhPSBqcy5idXR0b25zKSB7CisJCQkJdW5zaWduZWQgaW50IEJ1dHRvbkNoYW5nZWQgPSAoV09SRCkoam95Q2FwRGF0YVtqb3ldLndCdXR0b25zIF4ganMuYnV0dG9ucyk8PDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqb3lDYXBEYXRhW2pveV0ud0J1dHRvbnMgPCBqcy5idXR0b25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZTMyQShDYXB0dXJlV25kW2pveV0sIE1NX0pPWTFCVVRUT05ET1dOICsgam95LCBCdXR0b25DaGFuZ2VkLCBNQUtFTE9ORyhqcy54LCBqcy55KSk7CiAJCQkJZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSm95Q2FwRGF0YVtqb3ldLndCdXR0b25zID4ganMuYnV0dG9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpveUNhcERhdGFbam95XS53QnV0dG9ucyA+IGpzLmJ1dHRvbnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlMzJBKENhcHR1cmVXbmRbam95XSwgTU1fSk9ZMUJVVFRPTlVQCiArIGpveSwgQnV0dG9uQ2hhbmdlZCwgTUFLRUxPTkcoanMueCwganMueSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb3lDYXBEYXRhW2pveV0ud0J1dHRvbnMgPSBqcy5idXR0b25zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb3lDYXBEYXRhW2pveV0ud0J1dHRvbnMgPSBqcy5idXR0b25zOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCUpveUdldE51bURldnMJCVtNTVNZU1RFTS4xMDFdCiAgKi8KLVdPUkQgV0lOQVBJIEpveUdldE51bURldnModm9pZCkKK1VJTlQzMiBXSU5BUEkgam95R2V0TnVtRGV2czMyKHZvaWQpCiB7Ci1pbnQgam95OwotV09SRCBqb3lfY250ID0gMDsKKwlyZXR1cm4gam95R2V0TnVtRGV2czE2KCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCUpveUdldE51bURldnMJCVtNTVNZU1RFTS4xMDFdCisgKi8KK1VJTlQxNiBXSU5BUEkgam95R2V0TnVtRGV2czE2KHZvaWQpCit7CisgICAgaW50IGpveTsKKyAgICBVSU5UMTYgam95X2NudCA9IDA7CiAKICAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIkpveUdldE51bURldnM6ICIpOwogICAgIGZvciAoam95PTA7IGpveTw0OyBqb3krKykKLQlpZiAoSm95T3BlbkRyaXZlcihqb3kpID09IFRSVUUpIHsJCQotCQlKb3lDbG9zZURyaXZlcihqb3kpOworCWlmIChqb3lPcGVuRHJpdmVyKGpveSkgPT0gVFJVRSkgewkJCisJCWpveUNsb3NlRHJpdmVyKGpveSk7CiAJCWpveV9jbnQrKzsKLQl9CisgICAgfQogICAgIGRwcmludGZfbW1zeXMoc3RkZGViLCAicmV0dXJuaW5nICVkXG4iLCBqb3lfY250KTsKICAgICBpZiAoIWpveV9jbnQpIGZwcmludGYoc3RkZXJyLCAiTm8gam95c3RpY2sgZm91bmQgLSBwZXJoYXBzIGdldCBqb3lzdGljay0wLjguMC50YXIuZ3ogYW5kIGxvYWQgaXQgYXMgbW9kdWxlIG9yIHVzZSBMaW51eCA+PSAyLjEuNDUgdG8gYmUgYWJsZSB0byB1c2Ugam95c3RpY2tzLlxuIik7CiAgICAgcmV0dXJuIGpveV9jbnQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCUpveUdldERldkNhcHMJCVtXSU5NTS4yN10KKyAqLworTU1SRVNVTFQzMiBXSU5BUEkgam95R2V0RGV2Q2FwczMyQShVSU5UMzIgd0lELCBMUEpPWUNBUFMzMkEgbHBDYXBzLFVJTlQzMiB3U2l6ZSkKK3sKKwlKT1lDQVBTMTYJamMxNjsKKwlNTVJFU1VMVDE2CXJldCA9IGpveUdldERldkNhcHMxNih3SUQsJmpjMTYsc2l6ZW9mKGpjMTYpKTsKKworCWxwQ2Fwcy0+d01pZCA9IGpjMTYud01pZDsKKwlscENhcHMtPndQaWQgPSBqYzE2LndQaWQ7CisJbHN0cmNweTMyQShscENhcHMtPnN6UG5hbWUsamMxNi5zelBuYW1lKTsKKyAgICAgICAgbHBDYXBzLT53WG1pbiA9IGpjMTYud1htaW47CisgICAgICAgIGxwQ2Fwcy0+d1htYXggPSBqYzE2LndYbWF4OworICAgICAgICBscENhcHMtPndZbWluID0gamMxNi53WW1pbjsKKyAgICAgICAgbHBDYXBzLT53WW1heCA9IGpjMTYud1ltYXg7CisgICAgICAgIGxwQ2Fwcy0+d1ptaW4gPSBqYzE2LndabWluOworICAgICAgICBscENhcHMtPndabWF4ID0gamMxNi53Wm1heDsKKyAgICAgICAgbHBDYXBzLT53TnVtQnV0dG9ucyA9IGpjMTYud051bUJ1dHRvbnM7CisgICAgICAgIGxwQ2Fwcy0+d1BlcmlvZE1pbiA9IGpjMTYud1BlcmlvZE1pbjsKKyAgICAgICAgbHBDYXBzLT53UGVyaW9kTWF4ID0gamMxNi53UGVyaW9kTWF4OworCisgICAgICAgIGxwQ2Fwcy0+d1JtaW4gPSBqYzE2LndSbWluOworICAgICAgICBscENhcHMtPndSbWF4ID0gamMxNi53Um1heDsKKyAgICAgICAgbHBDYXBzLT53VW1pbiA9IGpjMTYud1VtaW47CisgICAgICAgIGxwQ2Fwcy0+d1VtYXggPSBqYzE2LndVbWF4OworICAgICAgICBscENhcHMtPndWbWluID0gamMxNi53Vm1pbjsKKyAgICAgICAgbHBDYXBzLT53Vm1heCA9IGpjMTYud1ZtYXg7CisgICAgICAgIGxwQ2Fwcy0+d0NhcHMgPSBqYzE2LndDYXBzOworICAgICAgICBscENhcHMtPndNYXhBeGVzID0gamMxNi53TWF4QXhlczsKKyAgICAgICAgbHBDYXBzLT53TnVtQXhlcyA9IGpjMTYud051bUF4ZXM7CisgICAgICAgIGxwQ2Fwcy0+d01heEJ1dHRvbnMgPSBqYzE2LndNYXhCdXR0b25zOworICAgICAgICBsc3RyY3B5MzJBKGxwQ2Fwcy0+c3pSZWdLZXksamMxNi5zelJlZ0tleSk7CisgICAgICAgIGxzdHJjcHkzMkEobHBDYXBzLT5zek9FTVZ4RCxqYzE2LnN6T0VNVnhEKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQlKb3lHZXREZXZDYXBzCQlbV0lOTU0uMjhdCisgKi8KK01NUkVTVUxUMzIgV0lOQVBJIGpveUdldERldkNhcHMzMlcoVUlOVDMyIHdJRCwgTFBKT1lDQVBTMzJXIGxwQ2FwcyxVSU5UMzIgd1NpemUpCit7CisJSk9ZQ0FQUzE2CWpjMTY7CisJTU1SRVNVTFQxNglyZXQgPSBqb3lHZXREZXZDYXBzMTYod0lELCZqYzE2LHNpemVvZihqYzE2KSk7CisKKwlscENhcHMtPndNaWQgPSBqYzE2LndNaWQ7CisJbHBDYXBzLT53UGlkID0gamMxNi53UGlkOworCWxzdHJjcHlBdG9XKGxwQ2Fwcy0+c3pQbmFtZSxqYzE2LnN6UG5hbWUpOworICAgICAgICBscENhcHMtPndYbWluID0gamMxNi53WG1pbjsKKyAgICAgICAgbHBDYXBzLT53WG1heCA9IGpjMTYud1htYXg7CisgICAgICAgIGxwQ2Fwcy0+d1ltaW4gPSBqYzE2LndZbWluOworICAgICAgICBscENhcHMtPndZbWF4ID0gamMxNi53WW1heDsKKyAgICAgICAgbHBDYXBzLT53Wm1pbiA9IGpjMTYud1ptaW47CisgICAgICAgIGxwQ2Fwcy0+d1ptYXggPSBqYzE2LndabWF4OworICAgICAgICBscENhcHMtPndOdW1CdXR0b25zID0gamMxNi53TnVtQnV0dG9uczsKKyAgICAgICAgbHBDYXBzLT53UGVyaW9kTWluID0gamMxNi53UGVyaW9kTWluOworICAgICAgICBscENhcHMtPndQZXJpb2RNYXggPSBqYzE2LndQZXJpb2RNYXg7CisKKyAgICAgICAgbHBDYXBzLT53Um1pbiA9IGpjMTYud1JtaW47CisgICAgICAgIGxwQ2Fwcy0+d1JtYXggPSBqYzE2LndSbWF4OworICAgICAgICBscENhcHMtPndVbWluID0gamMxNi53VW1pbjsKKyAgICAgICAgbHBDYXBzLT53VW1heCA9IGpjMTYud1VtYXg7CisgICAgICAgIGxwQ2Fwcy0+d1ZtaW4gPSBqYzE2LndWbWluOworICAgICAgICBscENhcHMtPndWbWF4ID0gamMxNi53Vm1heDsKKyAgICAgICAgbHBDYXBzLT53Q2FwcyA9IGpjMTYud0NhcHM7CisgICAgICAgIGxwQ2Fwcy0+d01heEF4ZXMgPSBqYzE2LndNYXhBeGVzOworICAgICAgICBscENhcHMtPndOdW1BeGVzID0gamMxNi53TnVtQXhlczsKKyAgICAgICAgbHBDYXBzLT53TWF4QnV0dG9ucyA9IGpjMTYud01heEJ1dHRvbnM7CisgICAgICAgIGxzdHJjcHlBdG9XKGxwQ2Fwcy0+c3pSZWdLZXksamMxNi5zelJlZ0tleSk7CisgICAgICAgIGxzdHJjcHlBdG9XKGxwQ2Fwcy0+c3pPRU1WeEQsamMxNi5zek9FTVZ4RCk7CisJcmV0dXJuIHJldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCUpveUdldERldkNhcHMJCVtNTVNZU1RFTS4xMDJdCiAgKi8KLVdPUkQgV0lOQVBJIEpveUdldERldkNhcHMoV09SRCB3SUQsIExQSk9ZQ0FQUyBscENhcHMsIFdPUkQgd1NpemUpCitNTVJFU1VMVDE2IFdJTkFQSSBqb3lHZXREZXZDYXBzMTYoVUlOVDE2IHdJRCwgTFBKT1lDQVBTMTYgbHBDYXBzLCBVSU5UMTYgd1NpemUpCiB7CiAgICAgZHByaW50Zl9tbXN5cyhzdGRlcnIsICJKb3lHZXREZXZDYXBzKCUwNFgsICVwLCAlZCk7XG4iLAogICAgICAgICAgICAgd0lELCBscENhcHMsIHdTaXplKTsKLSAgICBpZiAod1NpemUgIT0gc2l6ZW9mKCpscENhcHMpKSByZXR1cm4gSk9ZRVJSX1BBUk1TOyAvKiBGSVhNRTogc2hvdWxkIHdlIHJlYWxseSByZXR1cm4gdGhpcyBlcnJvciB2YWx1ZSA/ICovCi0gICAgaWYgKEpveU9wZW5Ecml2ZXIod0lEKSA9PSBUUlVFKSB7CisgICAgaWYgKGpveU9wZW5Ecml2ZXIod0lEKSA9PSBUUlVFKSB7CiAgICAgICAgIGxwQ2Fwcy0+d01pZCA9IE1NX01JQ1JPU09GVDsKICAgICAgICAgbHBDYXBzLT53UGlkID0gTU1fUENfSk9ZU1RJQ0s7CiAgICAgICAgIHN0cmNweShscENhcHMtPnN6UG5hbWUsICJXaW5lSm95Iik7IC8qIGpveXN0aWNrIHByb2R1Y3QgbmFtZSAqLwpAQCAtMTQ4LDggKzIyNywyMiBAQAogICAgICAgICBscENhcHMtPndOdW1CdXR0b25zID0gMjsKICAgICAgICAgbHBDYXBzLT53UGVyaW9kTWluID0gMDsKICAgICAgICAgbHBDYXBzLT53UGVyaW9kTWF4ID0gNTA7IC8qIEZJWE1FIGVuZCAqLwotCi0JSm95Q2xvc2VEcml2ZXIod0lEKTsKKwlpZiAod1NpemUgPT0gc2l6ZW9mKEpPWUNBUFMxNikpIHsKKwkJLyogY29tcGxldGUgOTUgc3RydWN0dXJlICovCisJCWxwQ2Fwcy0+d1JtaW4gPSAwOworCQlscENhcHMtPndSbWF4ID0gMHhmZmZmOworCQlscENhcHMtPndVbWluID0gMDsKKwkJbHBDYXBzLT53VW1heCA9IDB4ZmZmZjsKKwkJbHBDYXBzLT53Vm1pbiA9IDA7CisJCWxwQ2Fwcy0+d1ZtYXggPSAweGZmZmY7CisJCWxwQ2Fwcy0+d0NhcHMgPSAwOworCQlscENhcHMtPndNYXhBeGVzID0gNjsKKwkJbHBDYXBzLT53TnVtQXhlcyA9IDI7CisJCWxwQ2Fwcy0+d01heEJ1dHRvbnMgPSAzOworCQlzdHJjcHkobHBDYXBzLT5zelJlZ0tleSwiIik7CisJCXN0cmNweShscENhcHMtPnN6T0VNVnhELCIiKTsKKwl9CisJam95Q2xvc2VEcml2ZXIod0lEKTsKICAgICAgICAgcmV0dXJuIEpPWUVSUl9OT0VSUk9SOwogICAgIH0KICAgICBlbHNlCkBAIC0xNTcsMTcgKzI1MCwzMiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQlKb3lHZXRQb3MJICAgICAgIAlbV0lOTU0uMzBdCisgKi8KK01NUkVTVUxUMzIgV0lOQVBJIGpveUdldFBvczMyKFVJTlQzMiB3SUQsIExQSk9ZSU5GTzMyIGxwSW5mbykKK3sKKwlKT1lJTkZPMTYJamk7CisJTU1SRVNVTFQxNglyZXQgPSBqb3lHZXRQb3MxNih3SUQsJmppKTsKKworCWxwSW5mby0+d1hwb3MgPSBqaS53WHBvczsKKwlscEluZm8tPndZcG9zID0gamkud1lwb3M7CisJbHBJbmZvLT53WnBvcyA9IGppLndacG9zOworCWxwSW5mby0+d0J1dHRvbnMgPSBqaS53QnV0dG9uczsKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQlKb3lHZXRQb3MJICAgICAgIAlbTU1TWVNURU0uMTAzXQogICovCi1XT1JEIFdJTkFQSSBKb3lHZXRQb3MoV09SRCB3SUQsIExQSk9ZSU5GTyBscEluZm8pCitNTVJFU1VMVDE2IFdJTkFQSSBqb3lHZXRQb3MxNihVSU5UMTYgd0lELCBMUEpPWUlORk8xNiBscEluZm8pCiB7CiAgICAgICAgIHN0cnVjdCBqc19zdGF0dXMganM7CiAKICAgICAgICAgZHByaW50Zl9tbXN5cyhzdGRlcnIsICJKb3lHZXRQb3MoJTA0WCwgJXApOiIsIHdJRCwgbHBJbmZvKTsKLSAgICAgICAgaWYgKEpveU9wZW5Ecml2ZXIod0lEKSA9PSBGQUxTRSkgcmV0dXJuIE1NU1lTRVJSX05PRFJJVkVSOworICAgICAgICBpZiAoam95T3BlbkRyaXZlcih3SUQpID09IEZBTFNFKSByZXR1cm4gTU1TWVNFUlJfTk9EUklWRVI7CiAJZGV2X3N0YXQgPSByZWFkKGpveV9kZXZbd0lEXSwgJmpzLCBzaXplb2YoanMpKTsKIAlpZiAoZGV2X3N0YXQgIT0gc2l6ZW9mKGpzKSkgewotCQlKb3lDbG9zZURyaXZlcih3SUQpOworCQlqb3lDbG9zZURyaXZlcih3SUQpOwogCQlyZXR1cm4gSk9ZRVJSX1VOUExVR0dFRDsgLyogRklYTUU6IHBlcmhhcHMgd3JvbmcsIGJ1dCB3aGF0IHNob3VsZCBJIHJldHVybiBlbHNlID8gKi8KIAl9CiAJY291bnRfdXNlW3dJRF0gPSAwOwpAQCAtMTgyLDkgKzI5MCwyMSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQlKb3lHZXRUaHJlc2hvbGQJCVtXSU5NTS4zMl0KKyAqLworTU1SRVNVTFQzMiBXSU5BUEkgam95R2V0VGhyZXNob2xkMzIoVUlOVDMyIHdJRCwgTFBVSU5UMzIgbHBUaHJlc2hvbGQpCit7CisJVUlOVDE2CQl0aHJlc2g7CisJTU1SRVNVTFQxNglyZXQgPSBqb3lHZXRUaHJlc2hvbGQxNih3SUQsJnRocmVzaCk7CisKKwkqbHBUaHJlc2hvbGQgPSB0aHJlc2g7CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJSm95R2V0VGhyZXNob2xkCQlbTU1TWVNURU0uMTA0XQogICovCi1XT1JEIFdJTkFQSSBKb3lHZXRUaHJlc2hvbGQoV09SRCB3SUQsIExQV09SRCBscFRocmVzaG9sZCkKK01NUkVTVUxUMTYgV0lOQVBJIGpveUdldFRocmVzaG9sZDE2KFVJTlQxNiB3SUQsIExQVUlOVDE2IGxwVGhyZXNob2xkKQogewogICAgIGRwcmludGZfbW1zeXMoc3RkZXJyLCAiSm95R2V0VGhyZXNob2xkKCUwNFgsICVwKTtcbiIsIHdJRCwgbHBUaHJlc2hvbGQpOwogICAgIGlmICh3SUQgPiAzKSByZXR1cm4gSk9ZRVJSX1BBUk1TOwpAQCAtMTkzLDEzICszMTMsMjEgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQkJSm95UmVsZWFzZUNhcHR1cmUJW1dJTk1NLjMzXQorICovCitNTVJFU1VMVDMyIFdJTkFQSSBqb3lSZWxlYXNlQ2FwdHVyZTMyKFVJTlQzMiB3SUQpCit7CisJcmV0dXJuIGpveVJlbGVhc2VDYXB0dXJlMTYod0lEKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJSm95UmVsZWFzZUNhcHR1cmUJW01NU1lTVEVNLjEwNV0KICAqLwotV09SRCBXSU5BUEkgSm95UmVsZWFzZUNhcHR1cmUoV09SRCB3SUQpCitNTVJFU1VMVDE2IFdJTkFQSSBqb3lSZWxlYXNlQ2FwdHVyZTE2KFVJTlQxNiB3SUQpCiB7CiAgICAgZHByaW50Zl9tbXN5cyhzdGRlcnIsICJKb3lSZWxlYXNlQ2FwdHVyZSglMDRYKTtcbiIsIHdJRCk7Ci0gICAgSm95Q2FwdHVyZWQgPSBGQUxTRTsKLSAgICBKb3lDbG9zZURyaXZlcih3SUQpOworICAgIGpveUNhcHR1cmVkID0gRkFMU0U7CisgICAgam95Q2xvc2VEcml2ZXIod0lEKTsKICAgICBqb3lfZGV2W3dJRF0gPSAtMTsKICAgICBDYXB0dXJlV25kW3dJRF0gPSAwOwogICAgIHJldHVybiBKT1lFUlJfTk9FUlJPUjsKQEAgLTIwOCwxNSArMzM2LDIzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQlKb3lTZXRDYXB0dXJlCQlbTU1TWVNURU0uMTA2XQogICovCi1XT1JEIFdJTkFQSSBKb3lTZXRDYXB0dXJlKEhXTkQxNiBoV25kLCBXT1JEIHdJRCwgV09SRCB3UGVyaW9kLCBCT09MMTYgYkNoYW5nZWQpCitNTVJFU1VMVDMyIFdJTkFQSSBqb3lTZXRDYXB0dXJlMzIoSFdORDMyIGhXbmQsVUlOVDMyIHdJRCxVSU5UMzIgd1BlcmlvZCxCT09MMzIgYkNoYW5nZWQpCit7CisJcmV0dXJuIGpveVNldENhcHR1cmUxNihoV25kLHdJRCx3UGVyaW9kLGJDaGFuZ2VkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQkJSm95U2V0Q2FwdHVyZQkJW01NU1lTVEVNLjEwNl0KKyAqLworTU1SRVNVTFQxNiBXSU5BUEkgam95U2V0Q2FwdHVyZTE2KEhXTkQxNiBoV25kLFVJTlQxNiB3SUQsVUlOVDE2IHdQZXJpb2QsQk9PTDE2IGJDaGFuZ2VkKQogewogCiAgICAgZHByaW50Zl9tbXN5cyhzdGRlcnIsICJKb3lTZXRDYXB0dXJlKCUwNFgsICUwNFgsICVkLCAlZCk7XG4iLAogCSAgICBoV25kLCB3SUQsIHdQZXJpb2QsIGJDaGFuZ2VkKTsKIAogICAgIGlmICghQ2FwdHVyZVduZFt3SURdKSB7Ci0JaWYgKEpveU9wZW5Ecml2ZXIod0lEKSA9PSBGQUxTRSkgcmV0dXJuIE1NU1lTRVJSX05PRFJJVkVSOwotCUpveUNhcHR1cmVkID0gVFJVRTsKKwlpZiAoam95T3BlbkRyaXZlcih3SUQpID09IEZBTFNFKSByZXR1cm4gTU1TWVNFUlJfTk9EUklWRVI7CisJam95Q2FwdHVyZWQgPSBUUlVFOwogCUNhcHR1cmVXbmRbd0lEXSA9IGhXbmQ7CiAJcmV0dXJuIEpPWUVSUl9OT0VSUk9SOwogICAgIH0KQEAgLTIyNSw5ICszNjEsMTYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQkJSm95U2V0VGhyZXNob2xkCQlbV0lOTU0uMzVdCisgKi8KK01NUkVTVUxUMzIgV0lOQVBJIGpveVNldFRocmVzaG9sZDMyKFVJTlQzMiB3SUQsIFVJTlQzMiB3VGhyZXNob2xkKQoreworCXJldHVybiBqb3lTZXRUaHJlc2hvbGQxNih3SUQsd1RocmVzaG9sZCk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQlKb3lTZXRUaHJlc2hvbGQJCVtNTVNZU1RFTS4xMDddCiAgKi8KLVdPUkQgV0lOQVBJIEpveVNldFRocmVzaG9sZChXT1JEIHdJRCwgV09SRCB3VGhyZXNob2xkKQorTU1SRVNVTFQxNiBXSU5BUEkgam95U2V0VGhyZXNob2xkMTYoVUlOVDE2IHdJRCwgVUlOVDE2IHdUaHJlc2hvbGQpCiB7CiAgICAgZHByaW50Zl9tbXN5cyhzdGRlcnIsICJKb3lTZXRUaHJlc2hvbGQoJTA0WCwgJWQpO1xuIiwgd0lELCB3VGhyZXNob2xkKTsKIApAQCAtMjM5LDggKzM4Miw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQlKb3lTZXRDYWxpYnJhdGlvbglbTU1TWVNURU0uMTA5XQogICovCi1XT1JEIFdJTkFQSSBKb3lTZXRDYWxpYnJhdGlvbihXT1JEIHdJRCkKK01NUkVTVUxUMTYgV0lOQVBJIGpveVNldENhbGlicmF0aW9uMTYoVUlOVDE2IHdJRCkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVNUFRZIFNUVUIgISEhIEpveVNldENhbGlicmF0aW9uKCUwNFgpO1xuIiwgd0lEKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVNUFRZIFNUVUIgISEhIGpveVNldENhbGlicmF0aW9uKCUwNFgpO1xuIiwgd0lEKTsKICAgICByZXR1cm4gSk9ZRVJSX05PQ0FORE87CiB9CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21jaWFuaW0uYyBiL211bHRpbWVkaWEvbWNpYW5pbS5jCmluZGV4IDdiNDRlMzkuLjM5ZmNkZjEgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWNpYW5pbS5jCisrKyBiL211bHRpbWVkaWEvbWNpYW5pbS5jCkBAIC02MDUsNyArNjA1LDcgQEAKICogCQkJCUFOSU1fRHJpdmVyUHJvYwkJW3NhbXBsZSBkcml2ZXJdCiAqLwogTE9ORyBBTklNX0RyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIxNiBoRHJpdiwgV09SRCB3TXNnLCAKLQkJCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCisJCSAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogI2lmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19GcmVlQlNEX18pCiAJc3dpdGNoKHdNc2cpIHsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpY2RhLmMgYi9tdWx0aW1lZGlhL21jaWNkYS5jCmluZGV4IGQ5MmQ4NDAuLjY1YTMzNzUgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbWNpY2RhLmMKKysrIGIvbXVsdGltZWRpYS9tY2ljZGEuYwpAQCAtMTAyNiw3ICsxMDI2LDcgQEAKICogCQkJCUNEQVVESU9fRHJpdmVyUHJvYwkJW3NhbXBsZSBkcml2ZXJdCiAqLwogTE9ORyBDREFVRElPX0RyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIxNiBoRHJpdiwgV09SRCB3TXNnLCAKLQkJCQkJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCisJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpCiB7CiAjaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKIAlzd2l0Y2god01zZykgewpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tY2lzdHJpbmcuYyBiL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKaW5kZXggMjk4YmQ1Yy4uODhjZjYwYSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2lzdHJpbmcuYworKysgYi9tdWx0aW1lZGlhL21jaXN0cmluZy5jCkBAIC0yMywyMCArMjMsMTcgQEAKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAiZHJpdmVyLmgiCiAjaW5jbHVkZSAibW1zeXN0ZW0uaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKIAotZXh0ZXJuIE1DSV9PUEVOX0RSSVZFUl9QQVJNUwltY2lEcnZbTUFYTUNJRFJJVkVSU107Ci0KLS8qIEZJWE1FOiBJIG5lZWQgdG8gcmVtZW1iZXIgdGhlIGFsaWFzbmFtZSBvZiBhIHNwZWMuIGRyaXZlci4gCi0gKiAgICAgICAgYW5kIHRoaXMgaXMgdGhlIGVhc2llc3Qgd2F5LiAqc2lnaCoKLSAqLwotZXh0ZXJuIE1DSV9PUEVOX1BBUk1TMTYJCW1jaU9wZW5EcnZbTUFYTUNJRFJJVkVSU107CitleHRlcm4gc3RydWN0IExJTlVYX01DSURSSVZFUiBtY2lEcnZbTUFYTUNJRFJJVkVSU107CiAKICNkZWZpbmUgR2V0RHJ2KHdEZXZJRCkgKCZtY2lEcnZbTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCldKQotI2RlZmluZSBHZXRPcGVuRHJ2KHdEZXZJRCkgKCZtY2lPcGVuRHJ2W01NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpXSkKKyNkZWZpbmUgR2V0T3BlbkRydih3RGV2SUQpICgmKEdldERydih3RGV2SUQpLT5tb3ApKQorCiBleHRlcm4gaW50IE1NU1lTVEVNX0RldklEVG9JbmRleChVSU5UMTYgd0RldklEKTsKIGV4dGVybiBVSU5UMTYgTU1TWVNURU1fRmlyc3REZXZJRCh2b2lkKTsKIGV4dGVybiBVSU5UMTYgTU1TWVNURU1fTmV4dERldklEKFVJTlQxNiB3RGV2SUQpOwpAQCAtODAsMjQgKzc3LDI1IEBACiAjZGVmaW5lIF9NQ0lfQ0FMTF9EUklWRVIoY21kLHBhcmFtcykgXAogCXN3aXRjaCh1RGV2VHlwKSB7XAogCWNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86XAotCQlyZXM9Q0RBVURJT19Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT53RGV2aWNlSUQsMCxjbWQsZHdGbGFncywgKERXT1JEKShwYXJhbXMpKTtcCisJCXJlcz1DREFVRElPX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELDAsY21kLGR3RmxhZ3MsIChEV09SRCkocGFyYW1zKSk7XAogCQlicmVhaztcCiAJY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzpcCi0JCXJlcz1XQVZFX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCwwLGNtZCxkd0ZsYWdzLChEV09SRCkocGFyYW1zKSk7XAorCQlyZXM9V0FWRV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwwLGNtZCxkd0ZsYWdzLChEV09SRCkocGFyYW1zKSk7XAogCQlicmVhaztcCiAJY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6XAotCQlyZXM9TUlESV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT53RGV2aWNlSUQsMCxjbWQsZHdGbGFncywoRFdPUkQpKHBhcmFtcykpO1wKKwkJcmVzPU1JRElfRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsMCxjbWQsZHdGbGFncywoRFdPUkQpKHBhcmFtcykpO1wKIAkJYnJlYWs7XAogCWNhc2UgTUNJX0RFVlRZUEVfQU5JTUFUSU9OOlwKLQkJcmVzPUFOSU1fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+d0RldmljZUlELDAsY21kLGR3RmxhZ3MsKERXT1JEKShwYXJhbXMpKTtcCisJCXJlcz1BTklNX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELDAsY21kLGR3RmxhZ3MsKERXT1JEKShwYXJhbXMpKTtcCiAJCWJyZWFrO1wKIAljYXNlIE1DSV9ERVZUWVBFX0RJR0lUQUxfVklERU86XAogCQlkcHJpbnRmX21jaShzdGRkZWIsIl9NQ0lfQ0FMTF9EUklWRVIgLy9ObyBESUdJVEFMX1ZJREVPIHlldCAhXG4iKTtcCiAJCXJlcz1NQ0lFUlJfREVWSUNFX05PVF9JTlNUQUxMRUQ7XAogCQlicmVhaztcCiAJZGVmYXVsdDpcCi0JCWRwcmludGZfbWNpKHN0ZGRlYiwiX01DSV9DQUxMX0RSSVZFUiAvL0ludmFsaWQgRGV2aWNlIE5hbWUgJyVzJyAhXG4iLGRldik7XAotCQlyZXM9TUNJRVJSX0lOVkFMSURfREVWSUNFX05BTUU7XAorCQkvKnJlcyA9IENhbGxiYWNrcy0+Q2FsbERyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPmRyaXZlcnByb2MsR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELEdldERydih3RGV2SUQpLT5oZHJ2LGNtZCxkd0ZsYWdzLChEV09SRCkocGFyYW1zKSk7XAorCQlicmVhazsqL1wKKwkJcmVzID0gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEO1wKIAkJYnJlYWs7XAogCX0KIC8qIHByaW50IGEgRFdPUkQgaW4gdGhlIHNwZWNpZmllZCB0aW1lZm9ybWF0ICovCkBAIC0zMzUsMTcgKzMzMywxNyBAQAogCQlyZXR1cm4gTUNJRVJSX0lOVkFMSURfREVWSUNFX05BTUU7CiAJfQogCXdEZXZJRD1NTVNZU1RFTV9GaXJzdERldklEKCk7Ci0Jd2hpbGUoR2V0RHJ2KHdEZXZJRCktPndUeXBlKSB7CisJd2hpbGUoR2V0RHJ2KHdEZXZJRCktPm1vZHAud1R5cGUpIHsKIAkJd0RldklEID0gTU1TWVNURU1fTmV4dERldklEKHdEZXZJRCk7CiAJCWlmICghTU1TWVNURU1fRGV2SURWYWxpZCh3RGV2SUQpKSB7Ci0JCQlkcHJpbnRmX21jaShzdGRkZWIsIF9fRklMRV9fIjpNQ0lTVFJfT3BlbjpNQVhNQ0lEUklWRVJTIHJlYWNoZWQhXG4iKTsKKwkJCWRwcmludGZfbWNpKHN0ZGRlYiwgX19GSUxFX18iOk1DSVNUUl9PcGVuOk1BWE1DSURSSVZFUlMgcmVhY2hlZCAoJXgpICFcbiIsIHdEZXZJRCk7CiAJCQlTRUdQVFJfRlJFRShQVFJfU0VHX1RPX0xJTihwVS0+b3BlblBhcmFtcy5scHN0ckVsZW1lbnROYW1lKSk7CiAJCQlTRUdQVFJfRlJFRShwVSk7CiAJCQlyZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCQl9CiAJfQotCUdldERydih3RGV2SUQpLT53VHlwZQkJPSB1RGV2VHlwOwotCUdldERydih3RGV2SUQpLT53RGV2aWNlSUQJPSAwOyAgLyogRklYTUU/IGZvciBtdWx0aXBsZSBkZXZpY2VzICovCisJR2V0RHJ2KHdEZXZJRCktPm1vZHAud1R5cGUJPSB1RGV2VHlwOworCUdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRAk9IDA7ICAvKiBGSVhNRT8gZm9yIG11bHRpcGxlIGRldmljZXMgKi8KIAlwVS0+b3BlblBhcmFtcy5kd0NhbGxiYWNrCT0gaHduZENhbGxiYWNrIDsKIAlwVS0+b3BlblBhcmFtcy53RGV2aWNlSUQJPSB3RGV2SUQ7CiAJcFUtPm92bHlvcGVuUGFyYW1zLmR3U3R5bGUJPSAwOyAKQEAgLTIxOTAsNyArMjE4OCw3IEBACiAJCQkJcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9OQU1FOwogCQkJfQogCQl9Ci0JCXVEZXZUeXA9R2V0RHJ2KHdEZXZJRCktPndUeXBlOworCQl1RGV2VHlwPUdldERydih3RGV2SUQpLT5tb2RwLndUeXBlOwogCX0KIAogIAlmb3IgKGk9MDtNQ0lTVFJfY21kdGFibGVbaV0uY21kIT1OVUxMO2krKykgewpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taWRpLmMgYi9tdWx0aW1lZGlhL21pZGkuYwppbmRleCA0NzFhNGQxLi5mMzhkNWRkIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21pZGkuYworKysgYi9tdWx0aW1lZGlhL21pZGkuYwpAQCAtMTM0Nyw3ICsxMzQ3LDcgQEAKICAqIAkJCQlNSURJX0RyaXZlclByb2MJCVtzYW1wbGUgZHJpdmVyXQogICovCiBMT05HIE1JRElfRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUjE2IGhEcml2LCBXT1JEIHdNc2csIAotCQkJCQkJRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQorCQkgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMikKIHsKICNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKQogCXN3aXRjaCh3TXNnKSB7CmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21peGVyLmMgYi9tdWx0aW1lZGlhL21peGVyLmMKaW5kZXggMTRlYzE3YS4uODlmOTM5NCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9taXhlci5jCisrKyBiL211bHRpbWVkaWEvbWl4ZXIuYwpAQCAtMzksNyArMzksNiBAQAogewogI2lmZGVmIGxpbnV4CiAJaW50IAkJbWl4ZXIsbWFzazsKLQlzdHJ1Y3QJbWl4ZXJfaW5mbwltaTsKIAogCWRwcmludGZfbW1hdXgoc3RkZGViLCJNSVhfR2V0RGV2Q2FwcyglMDRYLCAlcCwgJWx1KTtcbiIsIHdEZXZJRCwgbHBDYXBzLCBkd1NpemUpOwogCWlmIChscENhcHMgPT0gTlVMTCkgcmV0dXJuIE1NU1lTRVJSX05PVEVOQUJMRUQ7CkBAIC00NywxNiArNDYsMTAgQEAKIAkJZHByaW50Zl9tbWF1eChzdGRkZWIsIk1JWF9HZXREZXZDYXBzIC8vIG1peGVyIGRldmljZSBub3QgYXZhaWxhYmxlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKIAl9Ci0JaWYgKGlvY3RsKG1peGVyLCBTT1VORF9NSVhFUl9JTkZPLCAmbWkpID09IC0xKSB7Ci0JCWNsb3NlKG1peGVyKTsKLQkJcGVycm9yKCJpb2N0bCBtaXhlciBTT1VORF9NSVhFUl9JTkZPIik7Ci0JCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwotCX0KLQlmcHJpbnRmKHN0ZGVyciwiU09VTkRfTUlYRVJfSU5GTyByZXR1cm5zIHsgXCIlc1wiLFwiJXNcIiB9XG4iLG1pLmlkLG1pLm5hbWUpOwogCWxwQ2Fwcy0+d01pZCA9IDB4QUE7CiAJbHBDYXBzLT53UGlkID0gMHg1NTsKIAlscENhcHMtPnZEcml2ZXJWZXJzaW9uID0gMHgwMTAwOwotCXN0cmNweShscENhcHMtPnN6UG5hbWUsbWkubmFtZSk7CisJc3RyY3B5KGxwQ2Fwcy0+c3pQbmFtZSwiV0lORSBHZW5lcmljIE1peGVyIik7CiAJaWYgKGlvY3RsKG1peGVyLCBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0ssICZtYXNrKSA9PSAtMSkgewogCQljbG9zZShtaXhlcik7CiAJCXBlcnJvcigiaW9jdGwgbWl4ZXIgU09VTkRfTUlYRVJfREVWTUFTSyIpOwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCmluZGV4IDE1OWU3OGYuLmFkOWQyMTEgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYworKysgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAibW1zeXN0ZW0uaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorLyogI2RlZmluZSBERUJVR19NTVNZUyAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgImNhbGxiYWNrLmgiCkBAIC0zMSwxMSArMzIsNyBAQAogc3RhdGljIGludAlJbnN0YWxsZWRMaXN0TGVuOwogc3RhdGljIExQU1RSCWxwSW5zdGFsbE5hbWVzID0gTlVMTDsKIAotTUNJX09QRU5fRFJJVkVSX1BBUk1TCW1jaURydltNQVhNQ0lEUklWRVJTXTsKLS8qIHN0cnVjdCBiZWxvdyBpcyB0byByZW1lbWJlciBhbGlhcy9kZXZpY2VuYW1lcyBmb3IgbWNpc3RyaW5nLmMgCi0gKiBGSVhNRTogc2hvdWxkIHVzZSBzb21lIGludGVybmFsIHN0cnVjdCAuLi4gCi0gKi8KLU1DSV9PUEVOX1BBUk1TMTYgbWNpT3BlbkRydltNQVhNQ0lEUklWRVJTXTsKK3N0cnVjdCBMSU5VWF9NQ0lEUklWRVIgbWNpRHJ2W01BWE1DSURSSVZFUlNdOwogCiBVSU5UMTYgbWlkaUdldEVycm9yVGV4dChVSU5UMTYgdUVycm9yLCBMUFNUUiBscFRleHQsIFVJTlQxNiB1U2l6ZSk7CiBzdGF0aWMgVUlOVDE2IHdhdmVHZXRFcnJvclRleHQoVUlOVDE2IHVFcnJvciwgTFBTVFIgbHBUZXh0LCBVSU5UMTYgdVNpemUpOwpAQCAtNTMsNyArNTAsNyBAQAogCiAKICNkZWZpbmUgR2V0RHJ2KHdEZXZJRCkgKCZtY2lEcnZbTU1TWVNURU1fRGV2SURUb0luZGV4KHdEZXZJRCldKQotI2RlZmluZSBHZXRPcGVuRHJ2KHdEZXZJRCkgKCZtY2lPcGVuRHJ2W01NU1lTVEVNX0RldklEVG9JbmRleCh3RGV2SUQpXSkKKyNkZWZpbmUgR2V0T3BlbkRydih3RGV2SUQpICgmKEdldERydih3RGV2SUQpLT5tb3ApKQogCiAvKiBUaGUgd0RldklEJ3MgcmV0dXJuZWQgYnkgd2luZSB3ZXJlIG9yaWdpbmFsbHkgaW4gdGhlIHJhbmdlIAogICogMCAtIChNQVhNQ0lEUklWRVJTIC0gMSkgYW5kIHVzZWQgZGlyZWN0bHkgYXMgYXJyYXkgaW5kaWNlcy4KQEAgLTEyMiwyNSArMTE5LDIyIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJUGxheVNvdW5kQQkJW1dJTk1NLjFdCi0qLworICogCQkJCVBsYXlTb3VuZEEJCVtXSU5NTS4xXQorICovCiBCT09MMzIgV0lOQVBJIFBsYXlTb3VuZDMyQShMUENTVFIgcHN6U291bmQsIEhNT0RVTEUzMiBobW9kLCBEV09SRCBmZHdTb3VuZCkKIHsKLSAgZHByaW50Zl9tbXN5cyhzdGRkZWIsICJQbGF5U291bmRBOiBwc3pTb3VuZD0nJXMnIGhtb2Q9JTA0WCBmZHdTb3VuZD0lMDhsWFxuIiwKKyAgZHByaW50Zl9tbXN5cyhzdGRkZWIsICJQbGF5U291bmRBOiBwc3pTb3VuZD0nJXAnIGhtb2Q9JTA0WCBmZHdTb3VuZD0lMDhsWFxuIiwKIAkJcHN6U291bmQsIGhtb2QsIGZkd1NvdW5kKTsKICAgaWYoaG1vZCAhPSAwIHx8ICEoZmR3U291bmQgJiBTTkRfRklMRU5BTUUpKSB7CiAgICAgZnByaW50ZihzdGRlcnIsICJQbGF5U291bmRBOiBvbmx5IGRpc2sgc291bmQgZmlsZXMgYXJlIHN1cHBvcnRlZFxuIik7CiAgICAgcmV0dXJuIEZBTFNFOwotICB9IGVsc2UgewotICAgIEJPT0wxNiBiU291bmQ7Ci0gICAgYlNvdW5kID0gc25kUGxheVNvdW5kKHBzelNvdW5kLCAoVUlOVDE2KSBmZHdTb3VuZCk7Ci0gICAgcmV0dXJuIChCT09MMzIpIGJTb3VuZDsKLSAgfQorICB9IGVsc2UKKyAgICByZXR1cm4gIHNuZFBsYXlTb3VuZChwc3pTb3VuZCwgKFVJTlQxNikgZmR3U291bmQpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCVBsYXlTb3VuZFcJCVtXSU5NTS4xOF0KLSovCisgKiAJCQkJUGxheVNvdW5kVwkJW1dJTk1NLjE4XQorICovCiBCT09MMzIgV0lOQVBJIFBsYXlTb3VuZDMyVyhMUENXU1RSIHBzelNvdW5kLCBITU9EVUxFMzIgaG1vZCwgRFdPUkQgZmR3U291bmQpCiB7CiAgIExQU1RSIHBzelNvdW5kQSA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAscHN6U291bmQpOwpAQCAtNTM3LDcgKzUzMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckdldExpbmVDb250cm9sc0EJW1dJTk1NLjEwNF0KICAqLwotVUlOVDMyIG1peGVyR2V0TGluZUNvbnRyb2xzMzJBKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkxJTkVDT05UUk9MUzMyQSBscG1sYyxEV09SRCBmZHdDb250cm9scykgeworVUlOVDMyIFdJTkFQSSBtaXhlckdldExpbmVDb250cm9sczMyQShITUlYRVJPQkozMiBobWl4LExQTUlYRVJMSU5FQ09OVFJPTFMzMkEgbHBtbGMsRFdPUkQgZmR3Q29udHJvbHMpIHsKIAlmcHJpbnRmKHN0ZGVyciwibWl4ZXJHZXRMaW5lQ29udHJvbHNBKCUwNHgsJXAsJTA4bHgpLHN0dWIhXG4iLAogCQlobWl4LGxwbWxjLGZkd0NvbnRyb2xzCiAJKTsKQEAgLTU0Nyw3ICs1NDEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAJCQkJbWl4ZXJHZXRMaW5lQ29udHJvbHNXCVtXSU5NTS4xMDVdCiAgKi8KLVVJTlQzMiBtaXhlckdldExpbmVDb250cm9sczMyVyhITUlYRVJPQkozMiBobWl4LExQTUlYRVJMSU5FQ09OVFJPTFMzMlcgbHBtbGMsRFdPUkQgZmR3Q29udHJvbHMpIHsKK1VJTlQzMiBXSU5BUEkgbWl4ZXJHZXRMaW5lQ29udHJvbHMzMlcoSE1JWEVST0JKMzIgaG1peCxMUE1JWEVSTElORUNPTlRST0xTMzJXIGxwbWxjLERXT1JEIGZkd0NvbnRyb2xzKSB7CiAJZnByaW50ZihzdGRlcnIsIm1peGVyR2V0TGluZUNvbnRyb2xzQSglMDR4LCVwLCUwOGx4KSxzdHViIVxuIiwKIAkJaG1peCxscG1sYyxmZHdDb250cm9scwogCSk7CkBAIC01NTcsNyArNTUxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyR2V0TGluZUNvbnRyb2xzCVtNTVNZU1RFTS44MDddCiAgKi8KLVVJTlQxNiBtaXhlckdldExpbmVDb250cm9sczE2KEhNSVhFUk9CSjE2IGhtaXgsTFBNSVhFUkxJTkVDT05UUk9MUzE2IGxwbWxjLERXT1JEIGZkd0NvbnRyb2xzKSB7CitVSU5UMTYgV0lOQVBJIG1peGVyR2V0TGluZUNvbnRyb2xzMTYoSE1JWEVST0JKMTYgaG1peCxMUE1JWEVSTElORUNPTlRST0xTMTYgbHBtbGMsRFdPUkQgZmR3Q29udHJvbHMpIHsKIAlmcHJpbnRmKHN0ZGVyciwibWl4ZXJHZXRMaW5lQ29udHJvbHMoJTA0eCwlcCwlMDhseCksc3R1YiFcbiIsCiAJCWhtaXgsbHBtbGMsZmR3Q29udHJvbHMKIAkpOwpAQCAtNTY3LDcgKzU2MSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckdldExpbmVJbmZvQQlbV0lOTU0uMTA2XQogICovCi1VSU5UMzIgbWl4ZXJHZXRMaW5lSW5mbzMyQShITUlYRVJPQkozMiBobWl4LExQTUlYRVJMSU5FMzJBIGxwbWwsRFdPUkQgZmR3SW5mbykgeworVUlOVDMyIFdJTkFQSSBtaXhlckdldExpbmVJbmZvMzJBKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkxJTkUzMkEgbHBtbCxEV09SRCBmZHdJbmZvKSB7CiAJTUlYRVJMSU5FMTYJbWwxNjsKIAlVSU5UMzIJCXJldDsKIApAQCAtNTk5LDcgKzU5Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckdldExpbmVJbmZvVwlbV0lOTU0uMTA3XQogICovCi1VSU5UMzIgbWl4ZXJHZXRMaW5lSW5mbzMyVyhITUlYRVJPQkozMiBobWl4LExQTUlYRVJMSU5FMzJXIGxwbWwsRFdPUkQgZmR3SW5mbykgeworVUlOVDMyIFdJTkFQSSBtaXhlckdldExpbmVJbmZvMzJXKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkxJTkUzMlcgbHBtbCxEV09SRCBmZHdJbmZvKSB7CiAJTUlYRVJMSU5FMTYJbWwxNjsKIAlVSU5UMzIJCXJldDsKIApAQCAtNjMxLDcgKzYyNSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQltaXhlckdldExpbmVJbmZvCVtNTVNZU1RFTS44MDVdCiAgKi8KLVVJTlQxNiBtaXhlckdldExpbmVJbmZvMTYoSE1JWEVST0JKMTYgaG1peCxMUE1JWEVSTElORTE2IGxwbWwsRFdPUkQgZmR3SW5mbykgeworVUlOVDE2IFdJTkFQSSBtaXhlckdldExpbmVJbmZvMTYoSE1JWEVST0JKMTYgaG1peCxMUE1JWEVSTElORTE2IGxwbWwsRFdPUkQgZmR3SW5mbykgewogCVVJTlQxNiBkZXZpZCA9ICBfZ2V0X21peGVySURfZnJvbV9oYW5kbGUoaG1peCxmZHdJbmZvKTsKIAogCWZwcmludGYoc3RkZXJyLCJtaXhlckdldExpbmVJbmZvMTYoJTA0eCwlcFtsaW5lICUwOGx4XSwlMDhseClcbiIsCkBAIC02NDMsNyArNjM3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyU2V0Q29udHJvbERldGFpbHMJW1dJTk1NLjExMV0KICAqLwotVUlOVDMyIG1peGVyU2V0Q29udHJvbERldGFpbHMzMihITUlYRVJPQkozMiBobWl4LExQTUlYRVJDT05UUk9MREVUQUlMUzMyIGxwbWNkLERXT1JEIGZkd0RldGFpbHMpIHsKK1VJTlQzMiBXSU5BUEkgbWl4ZXJTZXRDb250cm9sRGV0YWlsczMyKEhNSVhFUk9CSjMyIGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMzIgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgewogCWZwcmludGYoc3RkZXJyLCJtaXhlclNldENvbnRyb2xEZXRhaWxzMzIoJTA0eCwlcCwlMDhseCksc3R1YiFcbiIsCiAJCWhtaXgsbHBtY2QsZmR3RGV0YWlscwogCSk7CkBAIC02NTMsNyArNjQ3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyU2V0Q29udHJvbERldGFpbHMJW01NU1lTVEVNLjgwOV0KICAqLwotVUlOVDE2IG1peGVyU2V0Q29udHJvbERldGFpbHMxNihITUlYRVJPQkoxNiBobWl4LExQTUlYRVJDT05UUk9MREVUQUlMUzE2IGxwbWNkLERXT1JEIGZkd0RldGFpbHMpIHsKK1VJTlQxNiBXSU5BUEkgbWl4ZXJTZXRDb250cm9sRGV0YWlsczE2KEhNSVhFUk9CSjE2IGhtaXgsTFBNSVhFUkNPTlRST0xERVRBSUxTMTYgbHBtY2QsRFdPUkQgZmR3RGV0YWlscykgewogCWZwcmludGYoc3RkZXJyLCJtaXhlclNldENvbnRyb2xEZXRhaWxzMTYoJTA0eCwlcCwlMDhseCksc3R1YiFcbiIsCiAJCWhtaXgsbHBtY2QsZmR3RGV0YWlscwogCSk7CkBAIC02NjMsNyArNjU3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyTWVzc2FnZQkJW1dJTk1NLjEwOV0KICAqLwotVUlOVDMyIG1peGVyTWVzc2FnZTMyKEhNSVhFUjMyIGhtaXgsVUlOVDMyIHVNc2csRFdPUkQgZHdQYXJhbTEsRFdPUkQgZHdQYXJhbTIpIHsKK1VJTlQzMiBXSU5BUEkgbWl4ZXJNZXNzYWdlMzIoSE1JWEVSMzIgaG1peCxVSU5UMzIgdU1zZyxEV09SRCBkd1BhcmFtMSxEV09SRCBkd1BhcmFtMikgewogCUxQTUlYRVJPUEVOREVTQwlscG1vZDsKIAlVSU5UMTYJdURldmljZUlEOwogCkBAIC02NzksNyArNjczLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCW1peGVyTWVzc2FnZQkJW01NU1lTVEVNLjgwNF0KICAqLwotVUlOVDE2IG1peGVyTWVzc2FnZTE2KEhNSVhFUjE2IGhtaXgsVUlOVDE2IHVNc2csRFdPUkQgZHdQYXJhbTEsRFdPUkQgZHdQYXJhbTIpIHsKK1VJTlQxNiBXSU5BUEkgbWl4ZXJNZXNzYWdlMTYoSE1JWEVSMTYgaG1peCxVSU5UMTYgdU1zZyxEV09SRCBkd1BhcmFtMSxEV09SRCBkd1BhcmFtMikgewogCUxQTUlYRVJPUEVOREVTQwlscG1vZDsKIAlVSU5UMTYJdURldmljZUlEOwogCkBAIC0xMTY0LDcgKzExNTgsNyBAQAogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWNpT3BlbiglMDhsWCwgJXAgKCVwKSlcbiIsIGR3UGFyYW0sIGxwMTZQYXJtcywgbHBQYXJtcyk7CiAJaWYgKGxwMTZQYXJtcyA9PSBOVUxMKSByZXR1cm4gTUNJRVJSX0lOVEVSTkFMOwogCi0Jd2hpbGUoR2V0RHJ2KHdEZXZJRCktPndUeXBlICE9IDApIHsKKwl3aGlsZShHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSAhPSAwKSB7CiAJCXdEZXZJRCA9IE1NU1lTVEVNX05leHREZXZJRCh3RGV2SUQpOwogCQlpZiAoIU1NU1lTVEVNX0RldklEVmFsaWQod0RldklEKSkgewogCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJNQ0lfT1BFTiAvLyBNQVhNQ0lEUklWRVJTIHJlYWNoZWQgIVxuIik7CkBAIC0xMjA0LDggKzExOTgsMjEgQEAKIAkJCWlmIChzdHJjbXAoc3RyLCIqIikgPT0gMCkgewogCQkJCWRwcmludGZfbW1zeXMoc3RkZGViLCJObyBbbWNpIGV4dGVuc2lvbnNdIGVudHJ5IGZvciAlcyBmb3VuZC5cbiIsdCk7CiAJCQkJcmV0dXJuIE1DSUVSUl9FWFRFTlNJT05fTk9UX0ZPVU5EOworI2lmIHRlc3RpbmcxNgogCQkJfSBlbHNlICB7Ci0JCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsIlttY2kgZXh0ZW5zaW9uc10gZW50cnkgJXMgZm9yICVzIG5vdCBzdXBwb3J0ZWQuXG4iLHN0cix0KTsKKwkJCQlIRFJWUjE2IGhkcnYgPSBPcGVuRHJpdmVyKHN0ciwibWNpIixOVUxMKTsKKwkJCQlpZiAoaGRydikgeworCQkJCQlITU9EVUxFMTYJaG1vZDsKKworCQkJCQlobW9kID0gR2V0RHJpdmVyTW9kdWxlSGFuZGxlKGhkcnYpOworCQkJCQlHZXREcnYod0RldklEKS0+aGRydiA9IGhkcnY7CisJCQkJCUdldERydih3RGV2SUQpLT5kcml2ZXJwcm9jID0gR2V0UHJvY0FkZHJlc3MxNihobW9kLFNFR1BUUl9HRVQoU0VHUFRSX1NUUkRVUCgiRFJJVkVSUFJPQyIpKSk7CisJCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9PVEhFUjsKKwkJCQl9IGVsc2UgeworCQkJCQlkcHJpbnRmX21tc3lzKHN0ZGRlYiwiW21jaSBleHRlbnNpb25zXSBlbnRyeSAlcyBmb3IgJXMgbm90IHN1cHBvcnRlZC5cbiIsc3RyLHQpOworCQkJCQlyZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOworCQkJCX0KKyNlbmRpZgogCQkJfQogCQl9IGVsc2UKIAkJCXJldHVybiBNQ0lFUlJfRVhURU5TSU9OX05PVF9GT1VORDsKQEAgLTEyNDUsMTEgKzEyNTIsMjYgQEAKIAkJCX0gZWxzZQogCQkJaWYgKHN0cmNtcChzdHIsICJBVklWSURFTyIpID09IDApIHsKIAkJCQl1RGV2VHlwID0gTUNJX0RFVlRZUEVfRElHSVRBTF9WSURFTzsKKwkJCX0gZWxzZSB7CisjaWYgdGVzdGluZzE2CisJCQkJSERSVlIxNiBoZHJ2OworCQkJCWZwcmludGYoc3RkZXJyLCJ0cnlpbmcgdG8gbG9hZCBkcml2ZXIuLi5cbiIpOworCQkJCWhkcnYgPSBPcGVuRHJpdmVyKHN0ciwibWNpIixOVUxMKTsKKwkJCQlpZiAoaGRydikgeworCQkJCQlITU9EVUxFMTYJaG1vZDsKKworCQkJCQlobW9kID0gR2V0RHJpdmVyTW9kdWxlSGFuZGxlKGhkcnYpOworCQkJCQlHZXREcnYod0RldklEKS0+aGRydiA9IGhkcnY7CisJCQkJCUdldERydih3RGV2SUQpLT5kcml2ZXJwcm9jID0gR2V0UHJvY0FkZHJlc3MxNihobW9kLFNFR1BUUl9HRVQoU0VHUFRSX1NUUkRVUCgiRFJJVkVSUFJPQyIpKSk7CisJCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9PVEhFUjsKKwkJCQl9IGVsc2UKKyNlbmRpZgorCQkJCQlyZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOwogCQkJfQogCQl9CiAJfQotCUdldERydih3RGV2SUQpLT53VHlwZSA9IHVEZXZUeXA7Ci0JR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCA9IDA7ICAvKiBGSVhNRT8gZm9yIG11bHRpcGxlIGRldmljZXMgKi8KKwlHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSA9IHVEZXZUeXA7CisJR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlEID0gMDsgIC8qIEZJWE1FPyBmb3IgbXVsdGlwbGUgZGV2aWNlcyAqLwogCWxwUGFybXMtPndEZXZpY2VJRCA9IHdEZXZJRDsKIAlkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIG1jaWRldj0lZCwgdURldlR5cD0lMDRYIHdEZXZpY2VJRD0lMDRYICFcbiIsIAogCQkJCXdEZXZJRCwgdURldlR5cCwgbHBQYXJtcy0+d0RldmljZUlEKTsKQEAgLTEyNjMsNyArMTI4NSw3IEBACiAJICBkd3JldCA9ICBXQVZFX0RyaXZlclByb2MoIDAsIDAsIE1DSV9PUEVOX0RSSVZFUiwgCiAJCQkJICAgZHdQYXJhbSwgKERXT1JEKWxwMTZQYXJtcyk7CiAJICBicmVhazsKLSAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6CisJY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6CiAJICBkd3JldCA9IE1JRElfRHJpdmVyUHJvYyggMCwgMCwgTUNJX09QRU5fRFJJVkVSLCAKIAkJCQkgIGR3UGFyYW0sIChEV09SRClscDE2UGFybXMpOwogCSAgYnJlYWs7CkBAIC0xMjc1LDcgKzEyOTcsMTAgQEAKIAkgIGRwcmludGZfbW1zeXMoc3RkZGViLCAiTUNJX09QRU4gLy8gTm8gRElHSVRBTF9WSURFTyB5ZXQgIVxuIik7CiAJICByZXR1cm4gTUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEOwogICAgICAgICBkZWZhdWx0OgorI2lmIHRlc3RpbmcxNgorCSAgZHdyZXQgPSBDYWxsYmFja3MtPkNhbGxEcml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5kcml2ZXJwcm9jLDAsR2V0RHJ2KHdEZXZJRCktPmhkcnYsTUNJX09QRU5fRFJJVkVSLGR3UGFyYW0sKERXT1JEKWxwMTZQYXJtcyk7CiAJICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIEludmFsaWQgRGV2aWNlIE5hbWUgJyUwOGx4JyAhXG4iLCAoRFdPUkQpbHBQYXJtcy0+bHBzdHJEZXZpY2VUeXBlKTsKKyNlbmRpZgogCSAgcmV0dXJuIE1DSUVSUl9JTlZBTElEX0RFVklDRV9OQU1FOwogICAgICAgICB9CiAKQEAgLTEyODksNDAgKzEzMTQsNTYgQEAKIAlyZXR1cm4gZHdyZXQ7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJbWNpR2V0RHJpdmVyRGF0YQkJCVtNTVNZU1RFTS43MDhdCisgKi8KK0RXT1JEIFdJTkFQSSBtY2lHZXREcml2ZXJEYXRhMTYoSERSVlIxNiBoZHJ2KSB7CisJZnByaW50ZihzdGRlcnIsIm1jaUdldERyaXZlckRhdGEoJTA0eCksc3R1YiFcbiIsaGRydik7CisJcmV0dXJuIDB4NDI7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJbWNpQ2xvc2UJCQkJW2ludGVybmFsXQotKi8KKyAqIAkJCW1jaVNldERyaXZlckRhdGEJCQlbTU1TWVNURU0uNzA3XQorICovCitEV09SRCBXSU5BUEkgbWNpU2V0RHJpdmVyRGF0YTE2KEhEUlZSMTYgaGRydixEV09SRCBkYXRhKSB7CisJZnByaW50ZihzdGRlcnIsIm1jaVNldERyaXZlckRhdGEoJTA0eCwlMDhseCksc3R1YiFcbiIsaGRydixkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQltY2lDbG9zZQkJCQlbaW50ZXJuYWxdCisgKi8KIERXT1JEIG1jaUNsb3NlKFVJTlQxNiB3RGV2SUQsIERXT1JEIGR3UGFyYW0sIExQTUNJX0dFTkVSSUNfUEFSTVMgbHBQYXJtcykKIHsKIAlEV09SRAlkd1JldCA9IE1DSUVSUl9JTlRFUk5BTDsKIAogCWRwcmludGZfbW1zeXMoc3RkZGViLCAibWNpQ2xvc2UoJTA0eCwgJTA4bFgsICVwKVxuIiwgd0RldklELCBkd1BhcmFtLCBscFBhcm1zKTsKLQlzd2l0Y2goR2V0RHJ2KHdEZXZJRCktPndUeXBlKSB7Ci0JCWNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86Ci0JCQlkd1JldCA9IENEQVVESU9fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+d0RldmljZUlELDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNJX0NMT1NFLCBkd1BhcmFtLCAoRFdPUkQpbHBQYXJtcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKLQkJCWR3UmV0ID0gV0FWRV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT53RGV2aWNlSUQsIDAsIAotCQkJCQkJTUNJX0NMT1NFLCBkd1BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKWxwUGFybXMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOgotCQkJZHdSZXQgPSBNSURJX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCwgMCwgCi0JCQkJCQlNQ0lfQ0xPU0UsIGR3UGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpbHBQYXJtcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046Ci0JCQlkd1JldCA9IEFOSU1fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+d0RldmljZUlELCAwLCAKLQkJCQkJCU1DSV9DTE9TRSwgZHdQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChEV09SRClscFBhcm1zKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZHByaW50Zl9tbXN5cyhzdGRkZWIsICJtY2lDbG9zZSgpIC8vIHVua25vd24gZGV2aWNlIHR5cGU9JTA0WCAhXG4iLCBHZXREcnYod0RldklEKS0+d1R5cGUpOwotCQkJZHdSZXQgPSBNQ0lFUlJfREVWSUNFX05PVF9JTlNUQUxMRUQ7Ci0JCX0KLQlHZXREcnYod0RldklEKS0+d1R5cGUgPSAwOworCXN3aXRjaChHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSkgeworCWNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86CisJCWR3UmV0ID0gQ0RBVURJT19Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwwLAorCQkJCSAgIE1DSV9DTE9TRSwgZHdQYXJhbSwgKERXT1JEKWxwUGFybXMpOworCQlicmVhazsKKwljYXNlIE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOgorCQlkd1JldCA9IFdBVkVfRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsIDAsIAorCQkJCQlNQ0lfQ0xPU0UsIGR3UGFyYW0sCisJCQkJCShEV09SRClscFBhcm1zKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6CisJCWR3UmV0ID0gTUlESV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwgMCwgCisJCQkJCU1DSV9DTE9TRSwgZHdQYXJhbSwKKwkJCQkJKERXT1JEKWxwUGFybXMpOworCQlicmVhazsKKwkvKgorCWNhc2UgTUNJX0RFVlRZUEVfQU5JTUFUSU9OOgorCQlkd1JldCA9IEFOSU1fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsIDAsIAorCQkJCQlNQ0lfQ0xPU0UsIGR3UGFyYW0sCisJCQkJCShEV09SRClscFBhcm1zKTsKKwkJYnJlYWs7CisJICovCisJZGVmYXVsdDoKKwkJZHdSZXQgPSBDYWxsYmFja3MtPkNhbGxEcml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5kcml2ZXJwcm9jLEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCxHZXREcnYod0RldklEKS0+aGRydixNQ0lfQ0xPU0UsZHdQYXJhbSwoRFdPUkQpbHBQYXJtcyk7CisJfQorCUdldERydih3RGV2SUQpLT5tb2RwLndUeXBlID0gMDsKIAogCWlmIChkd1BhcmFtJk1DSV9OT1RJRlkpCiAJICBtY2lEcml2ZXJOb3RpZnkobHBQYXJtcy0+ZHdDYWxsYmFjayx3RGV2SUQsCkBAIC0xMzM0LDggKzEzNzUsOCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQltY2lTeXNpbmZvCQkJCVtpbnRlcm5hbF0KLSovCisgKiAJCQltY2lTeXNpbmZvCQkJCVtpbnRlcm5hbF0KKyAqLwogRFdPUkQgbWNpU3lzSW5mbyhEV09SRCBkd0ZsYWdzLCBMUE1DSV9TWVNJTkZPX1BBUk1TMTYgbHBQYXJtcykKIHsKIAlpbnQJbGVuOwpAQCAtMTM4Miw2ICsxNDIzLDYzIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgIAltY2lMb2FkQ29tbWFuZFJlc291cmNlCisgKi8KK1VJTlQxNiBtY2lMb2FkQ29tbWFuZFJlc291cmNlMTYoSEFORExFMTYgaGluc3QsTFBDU1RSIHJlc25hbWUsVUlOVDE2IHR5cGUpCit7CisgICAgICBjaGFyICAgICAgICAgICAgYnVmWzIwMF07CisgICAgICBPRlNUUlVDVCAgICAgICAgb2ZzOworICAgICAgSEFORExFMTYgICAgICAgIHhoaW5zdDsKKyAgICAgIEhSU1JDMTYgICAgICAgICBocnNyYzsKKyAgICAgIEhHTE9CQUwxNiAgICAgICBobWVtOworICAgICAgTFBTVFIgICAgICAgICAgIHNlZ3N0cjsKKyAgICAgIFNFR1BUUiAgICAgICAgICB4bWVtOworICAgICAgTFBCWVRFICAgICAgICAgIGxtZW07CisgICAgICBzdGF0aWMgICAgICAgICAgbWNpZGV2dHlwZSA9IDA7CisKKyAgICAgIGZwcmludGYoc3RkZXJyLCJtY2lMb2FkQ29tbWFuZFJlc291cmNlMTYoJTA0eCwlcywlZCksc3R1YiFcbiIsCisgICAgICAgICAgICAgIGhpbnN0LHJlc25hbWUsdHlwZQorICAgICAgKTsKKyAgICAgIGlmICghbHN0cmNtcGkzMkEocmVzbmFtZSwiY29yZSIpKSB7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJtY2lMb2FkQ29tbWFuZFJlc291cmNlKC4uLixcImNvcmVcIiwuLi4pLCBoYXZlIHRvIHVzZSBpbnRlcm5hbCB0YWJsZXMuLi4gKG5vdCB0aGVyZSB5ZXQpXG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICAvKiBpZiBmaWxlIGV4aXN0cyAicmVzbmFtZS5tY2kiLCB0aGVuIGxvYWQgcmVzb3VyY2UgInJlc25hbWUiIGZyb20gaXQKKyAgICAgICAqIG90aGVyd2lzZSBkaXJlY3RseSBmcm9tIGRyaXZlcgorICAgICAgICovCisgICAgICBzdHJjcHkoYnVmLHJlc25hbWUpOworICAgICAgc3RyY2F0KGJ1ZiwiLm1jaSIpOworICAgICAgaWYgKE9wZW5GaWxlMzIoYnVmLCZvZnMsT0ZfRVhJU1QpIT1IRklMRV9FUlJPUjMyKSB7CisgICAgICAgICAgICAgIHhoaW5zdCA9IExvYWRMaWJyYXJ5MTYoYnVmKTsKKyAgICAgICAgICAgICAgaWYgKHhoaW5zdCA+MzIpCisgICAgICAgICAgICAgICAgICAgICAgaGluc3QgPSB4aGluc3Q7CisgICAgICB9IC8qIGVsc2UgdXNlIHBhc3NlZCBoaW5zdCAqLworICAgICAgc2Vnc3RyID0gU0VHUFRSX1NUUkRVUChyZXNuYW1lKTsKKyAgICAgIGhyc3JjID0gRmluZFJlc291cmNlMTYoaGluc3QsU0VHUFRSX0dFVChzZWdzdHIpLHR5cGUpOworICAgICAgU0VHUFRSX0ZSRUUoc2Vnc3RyKTsKKyAgICAgIGlmICghaHJzcmMpIHsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIm1jaUxvYWRDb21tYW5kUmVzb3VyY2U6bm8gc3BlY2lhbCBjb21tYW5kbGlzdCBmb3VuZCBpbiByZXNvdXJjZVxuIik7CisgICAgICAgICAgICAgIHJldHVybiBNQ0lfTk9fQ09NTUFORF9UQUJMRTsKKyAgICAgIH0KKyAgICAgIGhtZW0gPSBMb2FkUmVzb3VyY2UxNihoaW5zdCxocnNyYyk7CisgICAgICBpZiAoIWhtZW0pIHsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIm1jaUxvYWRDb21tYW5kUmVzb3VyY2U6Y291bGRuJ3QgbG9hZCByZXNvdXJjZT8/XG4iKTsKKyAgICAgICAgICAgICAgcmV0dXJuIE1DSV9OT19DT01NQU5EX1RBQkxFOworICAgICAgfQorICAgICAgeG1lbSA9IFdJTjE2X0xvY2tSZXNvdXJjZTE2KGhtZW0pOworICAgICAgaWYgKCF4bWVtKSB7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJtY2lMb2FkQ29tbWFuZFJlc291cmNlOmNvdWxkbid0IGxvY2sgcmVzb3VyY2U/P1xuIik7CisgICAgICAgICAgICAgIEZyZWVSZXNvdXJjZTE2KGhtZW0pOworICAgICAgICAgICAgICByZXR1cm4gTUNJX05PX0NPTU1BTkRfVEFCTEU7CisgICAgICB9CisgICAgICBsbWVtID0gUFRSX1NFR19UT19MSU4oeG1lbSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwiZmlyc3QgcmVzb3VyY2UgZW50cnkgaXMgJXNcbiIsKGNoYXIqKWxtZW0pOworICAgICAgLyogcGFyc2UgcmVzb3VyY2UsIHJlZ2lzdGVyIHN0dWZmLCByZXR1cm4gdW5pcXVlIGlkICovCisgICAgICByZXR1cm4gKyttY2lkZXZ0eXBlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJbWNpU291bmQJCQkJW2ludGVybmFsXQogICogIG5vdCB1c2VkIGFueW1vcmUgPz8KIApAQCAtMTQ0MSw4ICsxNTM5LDE5IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAJCQkJbWNpU2VuZENvbW1hbmQJCQlbTU1TWVNURU0uNzAxXQotKi8KKyAqIAkJCQltY2lTZW5kQ29tbWFuZEEJCQlbV0lOTU0uNDldCisgKi8KK0RXT1JEIFdJTkFQSSBtY2lTZW5kQ29tbWFuZDMyQShVSU5UMzIgd0RldklELCBVSU5UMzIgd01zZywgRFdPUkQgZHdQYXJhbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTIpCit7CisJZnByaW50ZihzdGRlcnIsIm1jaVNlbmRDb21tYW5kMzJBKCUwOHgsJTA4eCwlMDhseCwlMDhseCksc3R1YiFcbiIsCisJCXdEZXZJRCx3TXNnLGR3UGFyYW0xLGR3UGFyYW0yCisJKTsKKwlyZXR1cm4gMDsgLyogb2sgKi8KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCW1jaVNlbmRDb21tYW5kCQkJW01NU1lTVEVNLjcwMV0KKyAqLwogRFdPUkQgV0lOQVBJIG1jaVNlbmRDb21tYW5kKFVJTlQxNiB3RGV2SUQsIFVJTlQxNiB3TXNnLCBEV09SRCBkd1BhcmFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1BhcmFtMikKIHsKQEAgLTE0NjAsMjQgKzE1NjksMjggQEAKICAgICAgICAgcmV0dXJuIG1jaVN5c0luZm8oIGR3UGFyYW0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQTUNJX1NZU0lORk9fUEFSTVMxNilQVFJfU0VHX1RPX0xJTihkd1BhcmFtMikpOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaChHZXREcnYod0RldklEKS0+d1R5cGUpCisgICAgICAgIHN3aXRjaChHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSkKICAgICAgICAgewogICAgICAgICBjYXNlIE1DSV9ERVZUWVBFX0NEX0FVRElPOgotICAgICAgICAgICAgcmV0dXJuIENEQVVESU9fRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+d0RldmljZUlELCBoRHJ2LCAKKyAgICAgICAgICAgIHJldHVybiBDREFVRElPX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELCBoRHJ2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKICAgICAgICAgY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKLSAgICAgICAgICAgIHJldHVybiBXQVZFX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCwgaERydiwgCisgICAgICAgICAgICByZXR1cm4gV0FWRV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwgaERydiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CiAgICAgICAgIGNhc2UgTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOgotICAgICAgICAgICAgcmV0dXJuIE1JRElfRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+d0RldmljZUlELCBoRHJ2LCAKKyAgICAgICAgICAgIHJldHVybiBNSURJX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPm1vZHAud0RldmljZUlELCBoRHJ2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd01zZywgZHdQYXJhbTEsIGR3UGFyYW0yKTsKKwkvKgogICAgICAgICBjYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKLSAgICAgICAgICAgIHJldHVybiBBTklNX0RyaXZlclByb2MoR2V0RHJ2KHdEZXZJRCktPndEZXZpY2VJRCwgaERydiwgCisgICAgICAgICAgICByZXR1cm4gQU5JTV9Ecml2ZXJQcm9jKEdldERydih3RGV2SUQpLT5tb2RwLndEZXZpY2VJRCwgaERydiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdNc2csIGR3UGFyYW0xLCBkd1BhcmFtMik7CisgCSAqLwogICAgICAgICBkZWZhdWx0OgorCSAgICByZXR1cm4gQ2FsbGJhY2tzLT5DYWxsRHJpdmVyUHJvYyhHZXREcnYod0RldklEKS0+ZHJpdmVycHJvYyxHZXREcnYod0RldklEKS0+bW9kcC53RGV2aWNlSUQsR2V0RHJ2KHdEZXZJRCktPmhkcnYsTUNJX0NMT1NFLGR3UGFyYW0xLGR3UGFyYW0yKTsKKwogICAgICAgICAgICAgZHByaW50Zl9tY2koc3RkZGViLAogICAgICAgICAgICAgICAgICAgICAgICAgIm1jaVNlbmRDb21tYW5kKCkgLy8gdW5rbm93biBkZXZpY2UgdHlwZT0lMDRYICFcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICAgR2V0RHJ2KHdEZXZJRCktPndUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldERydih3RGV2SUQpLT5tb2RwLndUeXBlKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKQEAgLTE0OTgsNyArMTYxMSw3IEBACiAJcmV0dXJuIDA7CiAKICAgICB3RGV2SUQgPSBNTVNZU1RFTV9GaXJzdERldklEKCk7Ci0gICAgd2hpbGUoTU1TWVNURU1fRGV2SURWYWxpZCh3RGV2SUQpICYmIEdldERydih3RGV2SUQpLT53VHlwZSkgeworICAgIHdoaWxlKE1NU1lTVEVNX0RldklEVmFsaWQod0RldklEKSAmJiBHZXREcnYod0RldklEKS0+bW9kcC53VHlwZSkgewogCWlmIChHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyRGV2aWNlVHlwZSAmJiAKICAgICAgICAgICAgIHN0cmNtcChQVFJfU0VHX1RPX0xJTihHZXRPcGVuRHJ2KHdEZXZJRCktPmxwc3RyRGV2aWNlVHlwZSksIGxwc3RyTmFtZSkgPT0gMCkKIAkgICAgcmV0dXJuIHdEZXZJRDsKQEAgLTM5NDEsMTAgKzQwNTQsNjMgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCURydkRlZkRyaXZlclByb2MJW01NU1lTVEVNLjExMDRdCi0qLworICogCQkJCURydkRlZkRyaXZlclByb2MJW01NU1lTVEVNLjExMDRdCisgKi8KIExSRVNVTFQgV0lOQVBJIERydkRlZkRyaXZlclByb2MoRFdPUkQgZHdEcml2ZXJJRCwgSERSVlIxNiBoRHJpdiwgV09SRCB3TXNnLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKQogewogCXJldHVybiBEZWZEcml2ZXJQcm9jKGR3RHJpdmVySUQsIGhEcml2LCB3TXNnLCBkd1BhcmFtMSwgZHdQYXJhbTIpOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQltbVRocmVhZENyZWF0ZQkJW01NU1lTVEVNLjExMjBdCisgKi8KK0xSRVNVTFQgV0lOQVBJIG1tVGhyZWFkQ3JlYXRlMTYoTFBWT0lEIHgxLCBMUFdPUkQgeDIsIERXT1JEIHgzLCBEV09SRCB4NCkgeworCWZwcmludGYoc3RkZXJyLCJtbVRocmVhZENyZWF0ZTE2KCVwLCVwLCUwOGx4LCUwOGx4KSxzdHViIVxuIiwKKwkJeDEseDIseDMseDQKKwkpOworCSp4MiA9IDB4YmFiZTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQkJbW1UaHJlYWRHZXRUYXNrCQlbTU1TWVNURU0uMTEyNV0KKyAqLworTFJFU1VMVCBXSU5BUEkgbW1UaHJlYWRHZXRUYXNrMTYoV09SRCBobmQpIHsKKwlmcHJpbnRmKHN0ZGVyciwibW1UaHJlYWRHZXRUYXNrMTYoJTA0eCksc3R1YiFcbiIsaG5kKTsKKwlyZXR1cm4gR2V0Q3VycmVudFRhc2soKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQkJbW1UaHJlYWRTaWduYWwJCVtNTVNZU1RFTS4xMTIxXQorICovCitMUkVTVUxUIFdJTkFQSSBtbVRocmVhZFNpZ25hbDE2KFdPUkQgaG5kKSB7CisJZnByaW50ZihzdGRlcnIsIm1tVGhyZWFkU2lnbmFsMTYoJTA0eCksIHN0dWIhXG4iLGhuZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCW1tVGFza0NyZWF0ZQkJW01NU1lTVEVNLjkwMF0KKyAqLworTFJFU1VMVCBXSU5BUEkgbW1UYXNrQ3JlYXRlMTYoTFBXT1JEIGxwaG5kLERXT1JEIHgxLERXT1JEIHgyKSB7CisJZnByaW50ZihzdGRlcnIsIm1tVGFza0NyZWF0ZTE2KCVwLCUwOGx4LCUwOGx4KSxzdHViIVxuIixscGhuZCx4MSx4Mik7CisJKmxwaG5kID0gMHhjYWZlOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQltbVRhc2tTaWduYWwJCVtNTVNZU1RFTS45MDNdCisgKi8KK0xSRVNVTFQgV0lOQVBJIG1tVGFza1NpZ25hbDE2KEhUQVNLMTYgaHQpIHsKKwlmcHJpbnRmKHN0ZGVyciwibW1UYXNrU2lnbmFsKCUwNHgpLHN0dWIhXG4iLGh0KTsKKwlyZXR1cm4gUG9zdEFwcE1lc3NhZ2UxNihodCwweDQwMCwwLDApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQltY2lEcml2ZXJZaWVsZAkJW01NU1lTVEVNLjcxMF0KKyAqLworTFJFU1VMVCBXSU5BUEkgbWNpRHJpdmVyWWllbGQxNihIQU5ETEUxNiBobmQpIHsKKwlmcHJpbnRmKHN0ZGVyciwibWNpRHJpdmVyWWllbGQxNiglMDR4KSxzdHViIVxuIixobmQpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL3RpbWUuYyBiL211bHRpbWVkaWEvdGltZS5jCmluZGV4IGM2MzFjZTAuLjdhNGViNmQgMTAwNjQ0Ci0tLSBhL211bHRpbWVkaWEvdGltZS5jCisrKyBiL211bHRpbWVkaWEvdGltZS5jCkBAIC0yNCwxNCArMjQsMTUgQEAKIHN0YXRpYyBNTVRJTUUxNiBtbVN5c1RpbWVTTVBURTsKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnVElNRVJFTlRSWSB7Ci0gICAgV09SRCB3RGVsYXk7Ci0gICAgV09SRCB3UmVzb2w7CisgICAgVUlOVDMyCXdEZWxheTsKKyAgICBVSU5UMzIJd1Jlc29sOwogICAgIEZBUlBST0MxNiBscEZ1bmM7Ci0gICAgSElOU1RBTkNFMTYgaEluc3RhbmNlOwotICAgIERXT1JEIGR3VXNlcjsKLSAgICBXT1JEIHdGbGFnczsKLSAgICBXT1JEIHdUaW1lcklEOwotICAgIFdPUkQgd0N1clRpbWU7CisgICAgSElOU1RBTkNFMzIJaEluc3RhbmNlOworICAgIERXT1JECWR3VXNlcjsKKyAgICBVSU5UMzIJd0ZsYWdzOworICAgIFVJTlQzMgl3VGltZXJJRDsKKyAgICBVSU5UMzIJd0N1clRpbWU7CisgICAgVUlOVDMyCWlzd2luMzI7CiAgICAgc3RydWN0IHRhZ1RJTUVSRU5UUlkgKk5leHQ7CiB9IFRJTUVSRU5UUlksICpMUFRJTUVSRU5UUlk7CiAKQEAgLTU4LDYgKzU5LDcgQEAKIAlscFRpbWVyLT53Q3VyVGltZS0tOwogCWlmIChscFRpbWVyLT53Q3VyVGltZSA9PSAwKSB7CiAJICAgIGxwVGltZXItPndDdXJUaW1lID0gbHBUaW1lci0+d0RlbGF5OworCiAJICAgIGlmIChscFRpbWVyLT5scEZ1bmMgIT0gKEZBUlBST0MxNikgTlVMTCkgewogCQlkcHJpbnRmX21tdGltZShzdGRkZWIsICJNTVN5c1RpbWVDYWxsYmFjayAvLyBiZWZvcmUgQ2FsbEJhY2sxNiAhXG4iKTsKIAkJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gbHBGdW5jPSVwIHdUaW1lcklEPSUwNFggZHdVc2VyPSUwOGxYICFcbiIsCkBAIC03NywxNSArNzksMTkgQEAKICAqCSAgICBQb3N0TWVzc2FnZSksIGFuZCBtdXN0IHJlc2lkZSBpbiBETEwgKHRoZXJlZm9yZSB1c2VzIHN0YWNrIG9mIGFjdGl2ZSBhcHBsaWNhdGlvbikuIFNvIEkgCiAgKiAgICAgICAgICBndWVzcyBjdXJyZW50IGltcGxlbWVudGF0aW9uIHZpYSBTZXRUaW1lciBoYXMgdG8gYmUgaW1wcm92ZWQgdXBvbi4JCQogICovCi0KLQkJQ2FsbGJhY2tzLT5DYWxsVGltZUZ1bmNQcm9jKGxwVGltZXItPmxwRnVuYywgbHBUaW1lci0+d1RpbWVySUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGxwVGltZXItPmR3VXNlciwgMCwgMCApOworIAkJaWYgKGxwVGltZXItPmlzd2luMzIpCisJCQlscFRpbWVyLT5scEZ1bmMobHBUaW1lci0+d1RpbWVySUQsMCxscFRpbWVyLT5kd1VzZXIsMCwwKTsKKwkJZWxzZQorCQkJQ2FsbGJhY2tzLT5DYWxsVGltZUZ1bmNQcm9jKGxwVGltZXItPmxwRnVuYywKKwkJCQkJCSAgICBscFRpbWVyLT53VGltZXJJRCwwLAorCQkJCQkJICAgIGxwVGltZXItPmR3VXNlciwwLDAKKwkJCSk7CiAKIAkJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAiTU1TeXNUaW1lQ2FsbGJhY2sgLy8gYWZ0ZXIgQ2FsbEJhY2sxNiAhXG4iKTsKIAkJZmZsdXNoKHN0ZG91dCk7CiAJICAgIH0KIAkgICAgaWYgKGxwVGltZXItPndGbGFncyAmIFRJTUVfT05FU0hPVCkKLQkJdGltZUtpbGxFdmVudChscFRpbWVyLT53VGltZXJJRCk7CisJCXRpbWVLaWxsRXZlbnQzMihscFRpbWVyLT53VGltZXJJRCk7CiAJfQogCWxwVGltZXIgPSBscFRpbWVyLT5OZXh0OwogICAgIH0KQEAgLTExMiwxMSArMTE4LDI0IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCXRpbWVHZXRTeXN0ZW1UaW1lCVtXSU5NTS4xNDBdCisgKi8KK01NUkVTVUxUMzIgV0lOQVBJIHRpbWVHZXRTeXN0ZW1UaW1lMzIoTFBNTVRJTUUzMiBscFRpbWUsIFVJTlQzMiB3U2l6ZSkKK3sKKyAgICBkcHJpbnRmX21tc3lzKHN0ZGRlYiwgInRpbWVHZXRTeXN0ZW1UaW1lMzIoJXAsICV1KTtcbiIsIGxwVGltZSwgd1NpemUpOworICAgIGlmICghbW1UaW1lU3RhcnRlZCkKKwlTdGFydE1NVGltZSgpOworICAgIGxwVGltZS0+d1R5cGUgPSBUSU1FX01TOworICAgIGxwVGltZS0+dS5tcyA9IG1tU3lzVGltZU1TLnUubXM7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogCQkJCXRpbWVHZXRTeXN0ZW1UaW1lCVtNTVNZU1RFTS42MDFdCiAgKi8KLVdPUkQgV0lOQVBJIHRpbWVHZXRTeXN0ZW1UaW1lKExQTU1USU1FMTYgbHBUaW1lLCBXT1JEIHdTaXplKQorTU1SRVNVTFQxNiBXSU5BUEkgdGltZUdldFN5c3RlbVRpbWUxNihMUE1NVElNRTE2IGxwVGltZSwgVUlOVDE2IHdTaXplKQogewotICAgIGRwcmludGZfbW1zeXMoc3RkZGViLCAidGltZUdldFN5c3RlbVRpbWUoJXAsICV1KTtcbiIsIGxwVGltZSwgd1NpemUpOworICAgIGRwcmludGZfbW1zeXMoc3RkZGViLCAidGltZUdldFN5c3RlbVRpbWUxNiglcCwgJXUpO1xuIiwgbHBUaW1lLCB3U2l6ZSk7CiAgICAgaWYgKCFtbVRpbWVTdGFydGVkKQogCVN0YXJ0TU1UaW1lKCk7CiAgICAgbHBUaW1lLT53VHlwZSA9IFRJTUVfTVM7CkBAIC0xMjcsOCArMTQ2LDQ5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQl0aW1lU2V0RXZlbnQJCVtNTVNZU1RFTS42MDJdCiAgKi8KLVdPUkQgV0lOQVBJIHRpbWVTZXRFdmVudChXT1JEIHdEZWxheSwgV09SRCB3UmVzb2wsIExQVElNRUNBTExCQUNLIGxwRnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd1VzZXIsIFdPUkQgd0ZsYWdzKQorTU1SRVNVTFQzMiBXSU5BUEkgdGltZVNldEV2ZW50MzIoVUlOVDMyIHdEZWxheSxVSU5UMzIgd1Jlc29sLAorCQkJCSBMUFRJTUVDQUxMQkFDSzMyIGxwRnVuYyxEV09SRCBkd1VzZXIsCisJCQkJIFVJTlQzMiB3RmxhZ3MpCit7CisgICAgV09SRCB3TmV3SUQgPSAwOworICAgIExQVElNRVJFTlRSWSBscE5ld1RpbWVyOworICAgIExQVElNRVJFTlRSWSBscFRpbWVyID0gbHBUaW1lckxpc3Q7CisKKyAgICBkcHJpbnRmX21tdGltZShzdGRkZWIsICJ0aW1lU2V0RXZlbnQzMigldSwgJXUsICVwLCAlMDhsWCwgJTA0WCk7XG4iLAorCQkgIHdEZWxheSwgd1Jlc29sLCBscEZ1bmMsIGR3VXNlciwgd0ZsYWdzKTsKKyAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCisJU3RhcnRNTVRpbWUoKTsKKyAgICBscE5ld1RpbWVyID0gKExQVElNRVJFTlRSWSl4bWFsbG9jKHNpemVvZihUSU1FUkVOVFJZKSk7CisgICAgaWYgKGxwTmV3VGltZXIgPT0gTlVMTCkKKwlyZXR1cm4gMDsKKyAgICB3aGlsZSAobHBUaW1lciAhPSBOVUxMKSB7CisJd05ld0lEID0gTUFYKHdOZXdJRCwgbHBUaW1lci0+d1RpbWVySUQpOworCWxwVGltZXIgPSBscFRpbWVyLT5OZXh0OworICAgIH0KKworICAgIGxwTmV3VGltZXItPk5leHQgPSBscFRpbWVyTGlzdDsKKyAgICBscFRpbWVyTGlzdCA9IGxwTmV3VGltZXI7CisgICAgbHBOZXdUaW1lci0+d1RpbWVySUQgPSB3TmV3SUQgKyAxOworICAgIGxwTmV3VGltZXItPndDdXJUaW1lID0gd0RlbGF5OworICAgIGxwTmV3VGltZXItPndEZWxheSA9IHdEZWxheTsKKyAgICBscE5ld1RpbWVyLT53UmVzb2wgPSB3UmVzb2w7CisgICAgbHBOZXdUaW1lci0+bHBGdW5jID0gKEZBUlBST0MxNikgbHBGdW5jOworICAgIGxwTmV3VGltZXItPmlzd2luMzIgPSAxOworICAgIGxwTmV3VGltZXItPmhJbnN0YW5jZSA9IEdldFRhc2tEUygpOworCWRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVTZXRFdmVudCAvLyBoSW5zdGFuY2U9JTA0WCAhXG4iLCBscE5ld1RpbWVyLT5oSW5zdGFuY2UpOworCWRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVTZXRFdmVudCAvLyBscEZ1bmM9JXAgIVxuIiwgCisJCQkJbHBGdW5jKTsKKyAgICBscE5ld1RpbWVyLT5kd1VzZXIgPSBkd1VzZXI7CisgICAgbHBOZXdUaW1lci0+d0ZsYWdzID0gd0ZsYWdzOworICAgIHJldHVybiBscE5ld1RpbWVyLT53VGltZXJJRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQkJdGltZVNldEV2ZW50CQlbTU1TWVNURU0uNjAyXQorICovCitNTVJFU1VMVDE2IFdJTkFQSSB0aW1lU2V0RXZlbnQxNihVSU5UMTYgd0RlbGF5LCBVSU5UMTYgd1Jlc29sLAorCQkJCSBMUFRJTUVDQUxMQkFDSzE2IGxwRnVuYyxEV09SRCBkd1VzZXIsCisJCQkJIFVJTlQxNiB3RmxhZ3MpCiB7CiAgICAgV09SRCB3TmV3SUQgPSAwOwogICAgIExQVElNRVJFTlRSWSBscE5ld1RpbWVyOwpAQCAtMTUyLDYgKzIxMiw3IEBACiAgICAgbHBOZXdUaW1lci0+d0RlbGF5ID0gd0RlbGF5OwogICAgIGxwTmV3VGltZXItPndSZXNvbCA9IHdSZXNvbDsKICAgICBscE5ld1RpbWVyLT5scEZ1bmMgPSAoRkFSUFJPQzE2KSBscEZ1bmM7CisgICAgbHBOZXdUaW1lci0+aXN3aW4zMiA9IDA7CiAgICAgbHBOZXdUaW1lci0+aEluc3RhbmNlID0gR2V0VGFza0RTKCk7CiAJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZVNldEV2ZW50IC8vIGhJbnN0YW5jZT0lMDRYICFcbiIsIGxwTmV3VGltZXItPmhJbnN0YW5jZSk7CiAJZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZVNldEV2ZW50IC8vIFBUUl9TRUdfVE9fTElOKGxwRnVuYyk9JXAgIVxuIiwgCkBAIC0xNjIsOSArMjIzLDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCQkJdGltZUtpbGxFdmVudAkJW01NU1lTVEVNLjYwM10KKyAqIAkJCQl0aW1lS2lsbEV2ZW50CQlbV0lOTU0uMTQyXQogICovCi1XT1JEIFdJTkFQSSB0aW1lS2lsbEV2ZW50KFdPUkQgd0lEKQorTU1SRVNVTFQzMiBXSU5BUEkgdGltZUtpbGxFdmVudDMyKFVJTlQzMiB3SUQpCiB7CiAgICAgTFBUSU1FUkVOVFJZIHhscHRpbWVyLCpscFRpbWVyID0gJmxwVGltZXJMaXN0OwogICAgIHdoaWxlICgqbHBUaW1lcikgewpAQCAtMTgwLDkgKzI0MSwxNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJCQl0aW1lR2V0RGV2Q2FwcwkJW01NU1lTVEVNLjYwNF0KKyAqIAkJCQl0aW1lS2lsbEV2ZW50CQlbTU1TWVNURU0uNjAzXQogICovCi1XT1JEIFdJTkFQSSB0aW1lR2V0RGV2Q2FwcyhMUFRJTUVDQVBTIGxwQ2FwcywgV09SRCB3U2l6ZSkKK01NUkVTVUxUMTYgV0lOQVBJIHRpbWVLaWxsRXZlbnQxNihVSU5UMTYgd0lEKQoreworICAgIHJldHVybiB0aW1lS2lsbEV2ZW50MzIod0lEKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCQkJdGltZUdldERldkNhcHMJCVtXSU5NTS4xMzldCisgKi8KK01NUkVTVUxUMzIgV0lOQVBJIHRpbWVHZXREZXZDYXBzMzIoTFBUSU1FQ0FQUzMyIGxwQ2FwcyxVSU5UMzIgd1NpemUpCiB7CiAgICAgZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZUdldERldkNhcHMoJXAsICV1KSAhXG4iLCBscENhcHMsIHdTaXplKTsKICAgICBpZiAoIW1tVGltZVN0YXJ0ZWQpCkBAIC0xOTMsOSArMjYyLDM0IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCXRpbWVHZXREZXZDYXBzCQlbTU1TWVNURU0uNjA0XQorICovCitNTVJFU1VMVDE2IFdJTkFQSSB0aW1lR2V0RGV2Q2FwczE2KExQVElNRUNBUFMxNiBscENhcHMsIFVJTlQxNiB3U2l6ZSkKK3sKKyAgICBkcHJpbnRmX21tdGltZShzdGRkZWIsICJ0aW1lR2V0RGV2Q2FwcyglcCwgJXUpICFcbiIsIGxwQ2Fwcywgd1NpemUpOworICAgIGlmICghbW1UaW1lU3RhcnRlZCkKKwlTdGFydE1NVGltZSgpOworICAgIGxwQ2Fwcy0+d1BlcmlvZE1pbiA9IE1NU1lTVElNRV9NSU5JTlRFUlZBTDsKKyAgICBscENhcHMtPndQZXJpb2RNYXggPSBNTVNZU1RJTUVfTUFYSU5URVJWQUw7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQkJCXRpbWVCZWdpblBlcmlvZAkJW1dJTk1NLjEzN10KKyAqLworTU1SRVNVTFQzMiBXSU5BUEkgdGltZUJlZ2luUGVyaW9kMzIoVUlOVDMyIHdQZXJpb2QpCit7CisgICAgZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZUJlZ2luUGVyaW9kMzIoJXUpICFcbiIsIHdQZXJpb2QpOworICAgIGlmICghbW1UaW1lU3RhcnRlZCkKKwlTdGFydE1NVGltZSgpOworICAgIGlmICh3UGVyaW9kIDwgTU1TWVNUSU1FX01JTklOVEVSVkFMIHx8IHdQZXJpb2QgPiBNTVNZU1RJTUVfTUFYSU5URVJWQUwpIAorICAgICAgICByZXR1cm4gVElNRVJSX05PQ0FORE87CisgICAgcmV0dXJuIDA7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIAkJCQl0aW1lQmVnaW5QZXJpb2QJCVtNTVNZU1RFTS42MDVdCiAgKi8KLVdPUkQgV0lOQVBJIHRpbWVCZWdpblBlcmlvZChXT1JEIHdQZXJpb2QpCitNTVJFU1VMVDE2IFdJTkFQSSB0aW1lQmVnaW5QZXJpb2QxNihVSU5UMTYgd1BlcmlvZCkKIHsKICAgICBkcHJpbnRmX21tdGltZShzdGRkZWIsICJ0aW1lQmVnaW5QZXJpb2QoJXUpICFcbiIsIHdQZXJpb2QpOwogICAgIGlmICghbW1UaW1lU3RhcnRlZCkKQEAgLTIwNiw5ICszMDAsOSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIAkJCQl0aW1lRW5kUGVyaW9kCQlbTU1TWVNURU0uNjA2XQorICogCQkJCXRpbWVFbmRQZXJpb2QJCVtXSU5NTS4xMzhdCiAgKi8KLVdPUkQgV0lOQVBJIHRpbWVFbmRQZXJpb2QoV09SRCB3UGVyaW9kKQorTU1SRVNVTFQzMiBXSU5BUEkgdGltZUVuZFBlcmlvZDMyKFVJTlQzMiB3UGVyaW9kKQogewogICAgIGRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVFbmRQZXJpb2QoJXUpICFcbiIsIHdQZXJpb2QpOwogICAgIGlmICh3UGVyaW9kIDwgTU1TWVNUSU1FX01JTklOVEVSVkFMIHx8IHdQZXJpb2QgPiBNTVNZU1RJTUVfTUFYSU5URVJWQUwpIApAQCAtMjE3LDEzICszMTEsMzAgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAJCQkJdGltZUdldFRpbWUgICAgCQlbTU1TWVNURU0uNjA3XQorICogCQkJCXRpbWVFbmRQZXJpb2QJCVtNTVNZU1RFTS42MDZdCisgKi8KK01NUkVTVUxUMTYgV0lOQVBJIHRpbWVFbmRQZXJpb2QxNihVSU5UMTYgd1BlcmlvZCkKK3sKKyAgICBkcHJpbnRmX21tdGltZShzdGRkZWIsICJ0aW1lRW5kUGVyaW9kKCV1KSAhXG4iLCB3UGVyaW9kKTsKKyAgICBpZiAod1BlcmlvZCA8IE1NU1lTVElNRV9NSU5JTlRFUlZBTCB8fCB3UGVyaW9kID4gTU1TWVNUSU1FX01BWElOVEVSVkFMKSAKKyAgICAgICAgcmV0dXJuIFRJTUVSUl9OT0NBTkRPOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJCQl0aW1lR2V0VGltZSAgICBbTU1TWVNURU0uNjA3XVtXSU5NTS4xNDFdCiAgKi8KIERXT1JEIFdJTkFQSSB0aW1lR2V0VGltZSgpCiB7CisgICAgc3RhdGljIERXT1JEIGxhc3R0aWNrPTA7CisgICAgRFdPUkQJbmV3dGljazsKKwogICAgIGRwcmludGZfbW10aW1lKHN0ZGRlYiwgInRpbWVHZXRUaW1lKCk7ICFcbiIpOwogICAgIGlmICghbW1UaW1lU3RhcnRlZCkKIAlTdGFydE1NVGltZSgpOworICAgIG5ld3RpY2sgPSBHZXRUaWNrQ291bnQoKTsKKyAgICBtbVN5c1RpbWVNUy51Lm1zKz1uZXd0aWNrLWxhc3R0aWNrOyAvKiBGSVhNRTogZmFrZWQgdGltZXIgKi8KKyAgICBsYXN0dGljayA9IG5ld3RpY2s7CiAgICAgZHByaW50Zl9tbXRpbWUoc3RkZGViLCAidGltZUdldFRpbWUoKSAvLyBUaW1lID0gJWxkXG4iLG1tU3lzVGltZU1TLnUubXMpOwogICAgIHJldHVybiBtbVN5c1RpbWVNUy51Lm1zOwogfQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9iaXRtYXAuYyBiL29iamVjdHMvYml0bWFwLmMKaW5kZXggYzZmYmJlMS4uNDA5MjcxOSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9iaXRtYXAuYworKysgYi9vYmplY3RzL2JpdG1hcC5jCkBAIC00ODksNiArNDg5LDI5IEBACiAgICAgcmV0dXJuIGhlaWdodCAqIGJtcC0+Yml0bWFwLmJtV2lkdGhCeXRlczsKIH0KIAorSEFORExFMTYgV0lOQVBJIExvYWRJbWFnZTE2KCBISU5TVEFOQ0UxNiBoaW5zdCwgTFBDU1RSIG5hbWUsIFVJTlQxNiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBkZXNpcmVkeCwgSU5UMTYgZGVzaXJlZHksIFVJTlQxNiBsb2FkZmxhZ3MpCit7CisJaWYgKEhJV09SRChuYW1lKSkgeworCQlmcHJpbnRmKHN0ZGRlYiwiTG9hZEltYWdlMTYoMHglMDR4LCVzLCVkLCVkLCVkLDB4JTA4eClcbiIsCisJCQloaW5zdCwoY2hhciAqKVBUUl9TRUdfVE9fTElOKG5hbWUpLHR5cGUsZGVzaXJlZHgsZGVzaXJlZHksbG9hZGZsYWdzCisJCSk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRkZWIsIkxvYWRJbWFnZTE2KDB4JTA0eCwlcCwlZCwlZCwlZCwweCUwOHgpXG4iLAorCQkJaGluc3QsbmFtZSx0eXBlLGRlc2lyZWR4LGRlc2lyZWR5LGxvYWRmbGFncworCQkpOworCX0KKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElNQUdFX0JJVE1BUDoKKwkJcmV0dXJuIExvYWRCaXRtYXAxNihoaW5zdCxuYW1lKTsKKwljYXNlIElNQUdFX0lDT046CisJCXJldHVybiBMb2FkSWNvbjE2KGhpbnN0LG5hbWUpOworCWNhc2UgSU1BR0VfQ1VSU09SOgorCQlyZXR1cm4gTG9hZEN1cnNvcjE2KGhpbnN0LG5hbWUpOworCX0KKwlyZXR1cm4gMDsKKwkKK30KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgTG9hZEltYWdlQSAgICAoVVNFUjMyLjM2NCkKICAqIEZJWE1FOiBpbXBsZW1lbnRhdGlvbiBzdGlsbCBsYWNrcyBuZWFybHkgYWxsIGZlYXR1cmVzLCBzZWUgTFJfKgpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9icnVzaC5jIGIvb2JqZWN0cy9icnVzaC5jCmluZGV4IDVlZjg0ZmIuLjhmMmViODMgMTAwNjQ0Ci0tLSBhL29iamVjdHMvYnJ1c2guYworKysgYi9vYmplY3RzL2JydXNoLmMKQEAgLTIzNiw2ICsyMzYsMTUgQEAKICAgICByZXR1cm4gVFJVRTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRml4QnJ1c2hPcmdFeCAgICAoR0RJMzIuMTAyKQorICogU0RLIHNheXMgZGlzY29udGludWVkLCBidXQgaW4gV2luOTUgR0RJMzIgdGhpcyBpcyB0aGUgc2FtZSBhcyBTZXRCcnVzaE9yZ0V4CisgKi8KK0JPT0wzMiBXSU5BUEkgRml4QnJ1c2hPcmdFeCggSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5LCBMUFBPSU5UMzIgb2xkb3JnICkKK3sKKyAgICByZXR1cm4gU2V0QnJ1c2hPcmdFeChoZGMseCx5LG9sZG9yZyk7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgR2V0U3lzQ29sb3JCcnVzaDE2ICAgIChVU0VSLjI4MSkKZGlmZiAtLWdpdCBhL29iamVjdHMvY3Vyc29yaWNvbi5jIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKaW5kZXggYTlhN2EwNi4uZDc3YTVmNyAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jdXJzb3JpY29uLmMKKysrIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKQEAgLTQxLDkgKzQxLDkgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInVzZXIuaCIKIAogZXh0ZXJuIFVJTlQxNiBDT0xPUl9HZXRTeXN0ZW1QYWxldHRlU2l6ZSgpOwotZXh0ZXJuIEhHTE9CQUwxNiBVU0VSX0NhbGxEZWZhdWx0UnNyY0hhbmRsZXIoIEhHTE9CQUwxNiwgSE1PRFVMRTE2LCBIUlNSQzE2ICk7CiAKIEN1cnNvciBDVVJTT1JJQ09OX1hDdXJzb3IgPSBOb25lOyAgICAvKiBDdXJyZW50IFggY3Vyc29yICovCiBzdGF0aWMgSENVUlNPUjMyIGhBY3RpdmVDdXJzb3IgPSAwOyAgLyogQWN0aXZlIGN1cnNvciAqLwpAQCAtNDQwLDYgKzQ0MCwyNyBAQAogfQogCiAKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgQ3JlYXRlSWNvbkZyb21SZXNvdXJjZSAgICAgICAgICAoVVNFUjMyKQorICovCitISUNPTjMyIFdJTkFQSSBDcmVhdGVJY29uRnJvbVJlc291cmNlMzIoIExQQllURSBiaXRzLCBVSU5UMzIgY2JTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBiSWNvbiwgRFdPUkQgZHdWZXJzaW9uKQorLypGSVhNRTogYm9uQGVsZWt0cm9uLmlrcC5waHlzaWsudHUtZGFybXN0YWR0LmRlIDk3MTEzMDogVGVzdCB3aXRoIHdlZGl0cmVzCisJIHNob3dlZCBvbmx5IGJsYW5rIGxheW91dC4gQ291bGRuJ3QgZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBwcm9ibGVtCisJIHdpdGggQ3JlYXRlSWNvbkZyb21SZXNvdXJjZTMyIG9yIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGFwcGxpY2F0aW9uCisJIHdpbmRvd3MgYmVoYXZlcyBzdHJhbmdlIChubyByZWRyYXcpIGJlZm9yZSAgQ3JlYXRlSWNvbkZyb21SZXNvdXJjZTMyCisqLworeworICAgIEhJQ09OMzIgcmV0OworICAgIHJldCA9IENyZWF0ZUljb25Gcm9tUmVzb3VyY2VFeDE2KCBiaXRzLCBjYlNpemUsIGJJY29uLCBkd1ZlcnNpb24sIDAsMCwwKTsKKyAgICBmcHJpbnRmKHN0ZG5pbXAsIkNyZWF0ZUljb25Gcm9tUmVzb3VyY2UzIHByb2JhYmx5IG9ubHkgYSBzdHViXG4iKTsKKyAgICBkcHJpbnRmX2ljb24oc3RkZGViLCAKKwkiQ3JlYXRlSWNvbkZyb21SZXNvdXJjZTMyICVzIGF0ICVwIHNpemUgJWQgd2ludmVyICVkIHJldHVybiAweCUwNHhcbiIsCisgICAgICAgICAgICAgICAgIChiSWNvbik/Ikljb24iOiJDdXJzb3IiLGJpdHMsY2JTaXplLGJJY29uLHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgQ3JlYXRlSWNvbkZyb21SZXNvdXJjZUV4MzIgICAgICAgICAgKFVTRVIzMi43NikKICAqLwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kYy5jIGIvb2JqZWN0cy9kYy5jCmluZGV4IDJlMGUxYzEuLjdmZjYxNmQgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZGMuYworKysgYi9vYmplY3RzL2RjLmMKQEAgLTE4LDQ2ICsxOCw2IEBACiAKIGV4dGVybiB2b2lkIENMSVBQSU5HX1VwZGF0ZUdDUmVnaW9uKCBEQyAqIGRjICk7ICAgICAvKiBvYmplY3RzL2NsaXBwaW5nLmMgKi8KIAotICAvKiBEZWZhdWx0IERDIHZhbHVlcyAqLwotc3RhdGljIGNvbnN0IFdJTl9EQ19JTkZPIERDX2RlZmF1bHRWYWx1ZXMgPQotewotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogZGV2Q2FwcyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGhDbGlwUmduICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogaFZpc1JnbiAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGhHQ0NsaXBSZ24gKi8KLSAgICBTVE9DS19CTEFDS19QRU4sICAgICAgICAvKiBoUGVuICovCi0gICAgU1RPQ0tfV0hJVEVfQlJVU0gsICAgICAgLyogaEJydXNoICovCi0gICAgU1RPQ0tfU1lTVEVNX0ZPTlQsICAgICAgLyogaEZvbnQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBoQml0bWFwICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogaEZpcnN0Qml0bWFwICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogaERldmljZSAqLwotICAgIFNUT0NLX0RFRkFVTFRfUEFMRVRURSwgIC8qIGhQYWxldHRlICovCi0gICAgUjJfQ09QWVBFTiwgICAgICAgICAgICAgLyogUk9QbW9kZSAqLwotICAgIEFMVEVSTkFURSwgICAgICAgICAgICAgIC8qIHBvbHlGaWxsTW9kZSAqLwotICAgIEJMQUNLT05XSElURSwgICAgICAgICAgIC8qIHN0cmV0Y2hCbHRNb2RlICovCi0gICAgQUJTT0xVVEUsICAgICAgICAgICAgICAgLyogcmVsQWJzTW9kZSAqLwotICAgIE9QQVFVRSwgICAgICAgICAgICAgICAgIC8qIGJhY2tncm91bmRNb2RlICovCi0gICAgUkdCKCAyNTUsIDI1NSwgMjU1ICksICAgLyogYmFja2dyb3VuZENvbG9yICovCi0gICAgUkdCKCAwLCAwLCAwICksICAgICAgICAgLyogdGV4dENvbG9yICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogYmFja2dyb3VuZFBpeGVsICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogdGV4dFBpeGVsICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogYnJ1c2hPcmdYICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogYnJ1c2hPcmdZICovCi0gICAgVEFfTEVGVCB8IFRBX1RPUCB8IFRBX05PVVBEQVRFQ1AsICAvKiB0ZXh0QWxpZ24gKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBjaGFyRXh0cmEgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBicmVha1RvdGFsRXh0cmEgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBicmVha0NvdW50ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogYnJlYWtFeHRyYSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIGJyZWFrUmVtICovCi0gICAgMSwgICAgICAgICAgICAgICAgICAgICAgLyogYml0c1BlclBpeGVsICovCi0gICAgTU1fVEVYVCwgICAgICAgICAgICAgICAgLyogTWFwTW9kZSAqLwotICAgIEdNX0NPTVBBVElCTEUsICAgICAgICAgIC8qIEdyYXBoaWNzTW9kZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIERDT3JnWCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIERDT3JnWSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnNQb3NYICovCi0gICAgMCAgICAgICAgICAgICAgICAgICAgICAgLyogQ3Vyc1Bvc1kgKi8KLX07CiAKICAgLyogUk9QIGNvZGUgdG8gR0MgZnVuY3Rpb24gY29udmVyc2lvbiAqLwogY29uc3QgaW50IERDX1hST1BmdW5jdGlvblsxNl0gPQpAQCAtMTM0LDYgKzk0LDU0IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRENfSW5pdF9EQ19JTkZPCisgKgorICogRmlsbCB0aGUgV0lOX0RDX0lORk8gc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCBEQ19Jbml0X0RDX0lORk8oIFdJTl9EQ19JTkZPICp3aW5fZGNfaW5mbyApCit7CisgICAgd2luX2RjX2luZm8tPmZsYWdzICAgICAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPmRldkNhcHMgICAgICAgICA9IE5VTEw7CisgICAgd2luX2RjX2luZm8tPmhDbGlwUmduICAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPmhWaXNSZ24gICAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPmhHQ0NsaXBSZ24gICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPmhQZW4gICAgICAgICAgICA9IFNUT0NLX0JMQUNLX1BFTjsKKyAgICB3aW5fZGNfaW5mby0+aEJydXNoICAgICAgICAgID0gU1RPQ0tfV0hJVEVfQlJVU0g7CisgICAgd2luX2RjX2luZm8tPmhGb250ICAgICAgICAgICA9IFNUT0NLX1NZU1RFTV9GT05UOworICAgIHdpbl9kY19pbmZvLT5oQml0bWFwICAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5oRmlyc3RCaXRtYXAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5oRGV2aWNlICAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5oUGFsZXR0ZSAgICAgICAgPSBTVE9DS19ERUZBVUxUX1BBTEVUVEU7CisgICAgd2luX2RjX2luZm8tPlJPUG1vZGUgICAgICAgICA9IFIyX0NPUFlQRU47CisgICAgd2luX2RjX2luZm8tPnBvbHlGaWxsTW9kZSAgICA9IEFMVEVSTkFURTsKKyAgICB3aW5fZGNfaW5mby0+c3RyZXRjaEJsdE1vZGUgID0gQkxBQ0tPTldISVRFOworICAgIHdpbl9kY19pbmZvLT5yZWxBYnNNb2RlICAgICAgPSBBQlNPTFVURTsKKyAgICB3aW5fZGNfaW5mby0+YmFja2dyb3VuZE1vZGUgID0gT1BBUVVFOworICAgIHdpbl9kY19pbmZvLT5iYWNrZ3JvdW5kQ29sb3IgPSBSR0IoIDI1NSwgMjU1LCAyNTUgKTsKKyAgICB3aW5fZGNfaW5mby0+dGV4dENvbG9yICAgICAgID0gUkdCKCAwLCAwLCAwICk7CisgICAgd2luX2RjX2luZm8tPmJhY2tncm91bmRQaXhlbCA9IDA7CisgICAgd2luX2RjX2luZm8tPnRleHRQaXhlbCAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPmJydXNoT3JnWCAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPmJydXNoT3JnWSAgICAgICA9IDA7CisgICAgd2luX2RjX2luZm8tPnRleHRBbGlnbiAgICAgICA9IFRBX0xFRlQgfCBUQV9UT1AgfCBUQV9OT1VQREFURUNQOworICAgIHdpbl9kY19pbmZvLT5jaGFyRXh0cmEgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5icmVha1RvdGFsRXh0cmEgPSAwOworICAgIHdpbl9kY19pbmZvLT5icmVha0NvdW50ICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5icmVha0V4dHJhICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5icmVha1JlbSAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5iaXRzUGVyUGl4ZWwgICAgPSAxOworICAgIHdpbl9kY19pbmZvLT5NYXBNb2RlICAgICAgICAgPSBNTV9URVhUOworICAgIHdpbl9kY19pbmZvLT5HcmFwaGljc01vZGUgICAgPSBHTV9DT01QQVRJQkxFOworICAgIHdpbl9kY19pbmZvLT5EQ09yZ1ggICAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5EQ09yZ1kgICAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5DdXJzUG9zWCAgICAgICAgPSAwOworICAgIHdpbl9kY19pbmZvLT5DdXJzUG9zWSAgICAgICAgPSAwOworCisgICAgUEFUSF9Jbml0R2RpUGF0aCgmd2luX2RjX2luZm8tPnBhdGgpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERDX0FsbG9jREMKICAqLwogREMgKkRDX0FsbG9jREMoIGNvbnN0IERDX0ZVTkNUSU9OUyAqZnVuY3MgKQpAQCAtMTU5LDcgKzE2Nyw4IEBACiAgICAgZGMtPnZwb3J0RXh0WCAgPSAxOwogICAgIGRjLT52cG9ydEV4dFkgID0gMTsKIAotICAgIG1lbWNweSggJmRjLT53LCAmRENfZGVmYXVsdFZhbHVlcywgc2l6ZW9mKERDX2RlZmF1bHRWYWx1ZXMpICk7CisgICAgRENfSW5pdF9EQ19JTkZPKCAmZGMtPncgKTsKKwogICAgIHJldHVybiBkYzsKIH0KIApAQCAtMzQ5LDggKzM1OCwzMiBAQAogICAgIH0KICAgICBlbHNlIHZhbC5saW5lX3N0eWxlID0gTGluZVNvbGlkOwogICAgIHZhbC5saW5lX3dpZHRoID0gZGMtPnUueC5wZW4ud2lkdGg7Ci0gICAgdmFsLmNhcF9zdHlsZSAgPSAodmFsLmxpbmVfd2lkdGggPD0gMSkgPyBDYXBOb3RMYXN0IDogQ2FwUm91bmQ7Ci0gICAgdmFsLmpvaW5fc3R5bGUgPSBKb2luTWl0ZXI7CisgICAgaWYgKHZhbC5saW5lX3dpZHRoIDw9IDEpIHsKKwl2YWwuY2FwX3N0eWxlID0gQ2FwTm90TGFzdDsKKyAgICB9IGVsc2UgeworCXN3aXRjaCAoZGMtPnUueC5wZW4uZW5kY2FwKQorCXsKKwljYXNlIFBTX0VORENBUF9TUVVBUkU6CisJICAgIHZhbC5jYXBfc3R5bGUgPSBDYXBQcm9qZWN0aW5nOworCSAgICBicmVhazsKKwljYXNlIFBTX0VORENBUF9GTEFUOgorCSAgICB2YWwuY2FwX3N0eWxlID0gQ2FwQnV0dDsKKwkgICAgYnJlYWs7CisJY2FzZSBQU19FTkRDQVBfUk9VTkQ6CisJZGVmYXVsdDoKKwkgICAgdmFsLmNhcF9zdHlsZSA9IENhcFJvdW5kOworCX0KKyAgICB9CisgICAgc3dpdGNoIChkYy0+dS54LnBlbi5saW5lam9pbikKKyAgICB7CisgICAgY2FzZSBQU19KT0lOX0JFVkVMOgorCXZhbC5qb2luX3N0eWxlID0gSm9pbkJldmVsOworICAgIGNhc2UgUFNfSk9JTl9NSVRFUjoKKwl2YWwuam9pbl9zdHlsZSA9IEpvaW5NaXRlcjsKKyAgICBjYXNlIFBTX0pPSU5fUk9VTkQ6CisgICAgZGVmYXVsdDoKKwl2YWwuam9pbl9zdHlsZSA9IEpvaW5Sb3VuZDsKKyAgICB9CiAgICAgWENoYW5nZUdDKCBkaXNwbGF5LCBkYy0+dS54LmdjLCAKIAkgICAgICAgR0NGdW5jdGlvbiB8IEdDRm9yZWdyb3VuZCB8IEdDQmFja2dyb3VuZCB8IEdDTGluZVdpZHRoIHwKIAkgICAgICAgR0NMaW5lU3R5bGUgfCBHQ0NhcFN0eWxlIHwgR0NKb2luU3R5bGUgfCBHQ0ZpbGxTdHlsZSwgJnZhbCApOwpAQCAtNDUzLDYgKzQ4Niw4IEBACiAgICAgbmV3ZGMtPmhTZWxmID0gKEhEQzMyKWhhbmRsZTsKICAgICBuZXdkYy0+c2F2ZUxldmVsID0gMDsKIAorICAgIFBBVEhfSW5pdEdkaVBhdGgoICZuZXdkYy0+dy5wYXRoICk7CisgICAgCiAgICAgLyogR2V0L1NldERDU3RhdGUoKSBkb24ndCBjaGFuZ2UgaFZpc1JnbiBmaWVsZCAoIlVuZG9jLiBXaW5kb3dzIiBwLjU1OSkuICovCiAKICAgICBuZXdkYy0+dy5oR0NDbGlwUmduID0gbmV3ZGMtPncuaFZpc1JnbiA9IDA7CkBAIC01NzIsNiArNjA3LDIxIEBACiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgZGNzID0gKERDICopIEdESV9IRUFQX0xPQ0soIGhkY3MgKTsKKworICAgIC8qIENvcHkgcGF0aC4gVGhlIHJlYXNvbiB3aHkgcGF0aCBzYXZpbmcgLyByZXN0b3JpbmcgaXMgaW4gU2F2ZURDLworICAgICAqIFJlc3RvcmVEQyBhbmQgbm90IGluIEdldERDU3RhdGUvU2V0RENTdGF0ZSBpcyB0aGF0IHRoZSAuLi5EQ1N0YXRlCisgICAgICogZnVuY3Rpb25zIGFyZSBvbmx5IGluIFdpbjE2ICh3aGljaCBkb2Vzbid0IGhhdmUgcGF0aHMpIGFuZCB0aGF0CisgICAgICogU2V0RENTdGF0ZSBkb2Vzbid0IGFsbG93IHVzIHRvIHNpZ25hbCBhbiBlcnJvciAod2hpY2ggY2FuIGhhcHBlbgorICAgICAqIHdoZW4gY29weWluZyBwYXRocykuCisgICAgICovCisgICAgaWYgKCFQQVRIX0Fzc2lnbkdkaVBhdGgoICZkY3MtPncucGF0aCwgJmRjLT53LnBhdGggKSkKKyAgICB7CisgICAgICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7CisJR0RJX0hFQVBfVU5MT0NLKCBoZGNzICk7CisJRGVsZXRlREMzMiggaGRjcyApOworCXJldHVybiAwOworICAgIH0KKyAgICAKICAgICBkY3MtPmhlYWRlci5oTmV4dCA9IGRjLT5oZWFkZXIuaE5leHQ7CiAgICAgZGMtPmhlYWRlci5oTmV4dCA9IGhkY3M7CiAgICAgZHByaW50Zl9kYyhzdGRkZWIsICJTYXZlREMoJTA0eCk6IHJldHVybmluZyAlZFxuIiwgaGRjLCBkYy0+c2F2ZUxldmVsKzEgKTsKQEAgLTU5Nyw2ICs2NDcsNyBAQAogQk9PTDMyIFdJTkFQSSBSZXN0b3JlREMzMiggSERDMzIgaGRjLCBJTlQzMiBsZXZlbCApCiB7CiAgICAgREMgKiBkYywgKiBkY3M7CisgICAgQk9PTDMyIHN1Y2Nlc3M7CiAKICAgICBkcHJpbnRmX2RjKHN0ZGRlYiwgIlJlc3RvcmVEQzogJTA0eCAlZFxuIiwgaGRjLCBsZXZlbCApOwogICAgIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKQEAgLTYyMCw2ICs2NzEsNyBAQAogICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KICAgICAKKyAgICBzdWNjZXNzPVRSVUU7CiAgICAgd2hpbGUgKGRjLT5zYXZlTGV2ZWwgPj0gbGV2ZWwpCiAgICAgewogCUhEQzE2IGhkY3MgPSBkYy0+aGVhZGVyLmhOZXh0OwpAQCAtNjI5LDExICs2ODEsMTggQEAKIAkgIHJldHVybiBGQUxTRTsKIAl9CQogCWRjLT5oZWFkZXIuaE5leHQgPSBkY3MtPmhlYWRlci5oTmV4dDsKLQlpZiAoLS1kYy0+c2F2ZUxldmVsIDwgbGV2ZWwpIFNldERDU3RhdGUoIGhkYywgaGRjcyApOworCWlmICgtLWRjLT5zYXZlTGV2ZWwgPCBsZXZlbCkKKwl7CisJICAgIFNldERDU3RhdGUoIGhkYywgaGRjcyApOworICAgICAgICAgICAgaWYgKCFQQVRIX0Fzc2lnbkdkaVBhdGgoICZkYy0+dy5wYXRoLCAmZGNzLT53LnBhdGggKSkKKwkJLyogRklYTUU6IFRoaXMgbWlnaHQgbm90IGJlIHF1aXRlIHJpZ2h0LCBzaW5jZSB3ZSdyZQorCQkgKiByZXR1cm5pbmcgRkFMU0UgYnV0IHN0aWxsIGRlc3Ryb3lpbmcgdGhlIHNhdmVkIERDIHN0YXRlICovCisJICAgICAgICBzdWNjZXNzPUZBTFNFOworCX0KIAlEZWxldGVEQzMyKCBoZGNzICk7CiAgICAgfQogICAgIEdESV9IRUFQX1VOTE9DSyggaGRjICk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIApAQCAtODIzLDYgKzg4Miw4IEBACiAgICAgaWYgKGRjLT53LmhWaXNSZ24pIERlbGV0ZU9iamVjdDMyKCBkYy0+dy5oVmlzUmduICk7CiAgICAgaWYgKGRjLT53LmhHQ0NsaXBSZ24pIERlbGV0ZU9iamVjdDMyKCBkYy0+dy5oR0NDbGlwUmduICk7CiAgICAgCisgICAgUEFUSF9EZXN0cm95R2RpUGF0aCgmZGMtPncucGF0aCk7CisgICAgCiAgICAgcmV0dXJuIEdESV9GcmVlT2JqZWN0KCBoZGMgKTsKIH0KIApkaWZmIC0tZ2l0IGEvb2JqZWN0cy9kaWIuYyBiL29iamVjdHMvZGliLmMKaW5kZXggM2MxYmUyZS4uYjVkMWNmMiAxMDA2NDQKLS0tIGEvb2JqZWN0cy9kaWIuYworKysgYi9vYmplY3RzL2RpYi5jCkBAIC0yOTEsNiArMjkxLDcgQEAKIAkgICAgc3JjYml0cyArPSBsaW5lYnl0ZXM7CiAJfQogICAgIH0gZWxzZSB7CisJbGluZXMgPSAtbGluZXM7CiAJZm9yIChoID0gMDsgaCA8IGxpbmVzOyBoKyspIHsKIAkgICAgRElCX1NldEltYWdlQml0c18xX0xpbmUoZHN0d2lkdGgsIGNvbG9ycywgYm1wSW1hZ2UsIGgsIHNyY2JpdHMpOwogCSAgICBzcmNiaXRzICs9IGxpbmVieXRlczsKQEAgLTMyNyw2ICszMjgsNyBAQAogCSAgICBiaXRzCSA9IHNyY2JpdHM7CiAJfQogICAgIH0gZWxzZSB7CisJbGluZXMgPSAtbGluZXM7CiAJZm9yIChoID0gMDsgaCA8IGxpbmVzOyBoKyspIHsKIAkgICAgZm9yIChpID0gZHN0d2lkdGgvMiwgeCA9IDA7IGkgPiAwOyBpLS0pIHsKIAkJQllURSBwaXggPSAqYml0cysrOwpAQCAtNzMxLDYgKzczMyw3IEBACiAJICAgIGJpdHMgPSAoc3JjYml0cyArPSBsaW5lYnl0ZXMpOwogCX0KICAgICB9IGVsc2UgeworCWxpbmVzID0gLWxpbmVzOwogCWZvciAoaCA9IDA7IGggPCBsaW5lczsgaCsrKSB7CiAJICAgIGZvciAoeCA9IDA7IHggPCBkc3R3aWR0aDsgeCsrLCBiaXRzICs9IDQpIHsKIAkJWFB1dFBpeGVsKCBibXBJbWFnZSwgeCwgaCwKZGlmZiAtLWdpdCBhL29iamVjdHMvZ2Rpb2JqLmMgYi9vYmplY3RzL2dkaW9iai5jCmluZGV4IGRkNDk1MzAuLmZlM2M2ZjkgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZ2Rpb2JqLmMKKysrIGIvb2JqZWN0cy9nZGlvYmouYwpAQCAtOTAsNiArOTAsMTAgQEAKICAgICB7IDEyLCAwLCAwLCAwLCBGV19OT1JNQUwsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIE9FTV9DSEFSU0VULAogICAgICAgMCwgMCwgREVGQVVMVF9RVUFMSVRZLCBGSVhFRF9QSVRDSCB8IEZGX01PREVSTiwgIiIgfQogfTsKKy8qIEZpbGxlciB0byBtYWtlIHRoZSBsb2NhdGlvbiBjb3VudGVyIGR3b3JkIGFsaWduZWQgYWdhaW4uICBUaGlzIGlzIG5lY2Vzc2FyeQorICAgc2luY2UgKGEpIEZPTlRPQkogaXMgcGFja2VkLCAoYikgZ2NjIHBsYWNlcyBpbml0aWFsaXNlZCB2YXJpYWJsZXMgaW4gdGhlIGNvZGUKKyAgIHNlZ21lbnQsIGFuZCAoYykgU29sYXJpcyBhc3NlbWJsZXIgaXMgc3R1cGlkLiAgKi8KK3N0YXRpYyBVSU5UMTYgYWxpZ25fT0VNRml4ZWRGb250ID0gMTsKIAogc3RhdGljIEZPTlRPQkogQW5zaUZpeGVkRm9udCA9CiB7CkBAIC05Nyw2ICsxMDEsNyBAQAogICAgIHsgMTIsIDAsIDAsIDAsIEZXX05PUk1BTCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgQU5TSV9DSEFSU0VULAogICAgICAgMCwgMCwgREVGQVVMVF9RVUFMSVRZLCBGSVhFRF9QSVRDSCB8IEZGX01PREVSTiwgIiIgfQogfTsKK3N0YXRpYyBVSU5UMTYgYWxpZ25fQW5zaUZpeGVkRm9udCA9IDE7CiAKIHN0YXRpYyBGT05UT0JKIEFuc2lWYXJGb250ID0KIHsKQEAgLTEwNCw2ICsxMDksNyBAQAogICAgIHsgMTIsIDAsIDAsIDAsIEZXX05PUk1BTCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgQU5TSV9DSEFSU0VULAogICAgICAgMCwgMCwgREVGQVVMVF9RVUFMSVRZLCBWQVJJQUJMRV9QSVRDSCB8IEZGX1NXSVNTLCAiTVMgU2FucyBTZXJpZiIgfQogfTsKK3N0YXRpYyBVSU5UMTYgYWxpZ25fQW5zaVZhckZvbnQgPSAxOwogCiBzdGF0aWMgRk9OVE9CSiBTeXN0ZW1Gb250ID0KIHsKQEAgLTExMSw2ICsxMTcsNyBAQAogICAgIHsgMTYsIDAsIDAsIDAsIEZXX0JPTEQsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEFOU0lfQ0hBUlNFVCwKICAgICAgIDAsIDAsIERFRkFVTFRfUVVBTElUWSwgVkFSSUFCTEVfUElUQ0ggfCBGRl9TV0lTUywgIlN5c3RlbSIgfQogfTsKK3N0YXRpYyBVSU5UMTYgYWxpZ25fU3lzdGVtRm9udCA9IDE7CiAKIHN0YXRpYyBGT05UT0JKIERldmljZURlZmF1bHRGb250ID0KIHsKQEAgLTExOCw2ICsxMjUsNyBAQAogICAgIHsgMTIsIDAsIDAsIDAsIEZXX05PUk1BTCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgQU5TSV9DSEFSU0VULAogICAgICAgMCwgMCwgREVGQVVMVF9RVUFMSVRZLCBWQVJJQUJMRV9QSVRDSCB8IEZGX1NXSVNTLCAiIiB9CiB9Oworc3RhdGljIFVJTlQxNiBhbGlnbl9EZXZpY2VEZWZhdWx0Rm9udCA9IDE7CiAKIHN0YXRpYyBGT05UT0JKIFN5c3RlbUZpeGVkRm9udCA9CiB7CkBAIC0xMjUsNiArMTMzLDE2IEBACiAgICAgeyAxMiwgMCwgMCwgMCwgRldfQk9MRCwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgQU5TSV9DSEFSU0VULAogICAgICAgMCwgMCwgREVGQVVMVF9RVUFMSVRZLCBGSVhFRF9QSVRDSCB8IEZGX01PREVSTiwgIiIgfQogfTsKK3N0YXRpYyBVSU5UMTYgYWxpZ25fU3lzdGVtRml4ZWRGb250ID0gMTsKKworLyogRklYTUU6IElzIHRoaXMgY29ycmVjdD8gKi8KK3N0YXRpYyBGT05UT0JKIERlZmF1bHRHdWlGb250ID0KK3sKKyAgICB7IDksIEZPTlRfTUFHSUMsIDEgfSwgICAvKiBoZWFkZXIgKi8KKyAgICB7IDEyLCAwLCAwLCAwLCBGV19OT1JNQUwsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIEFOU0lfQ0hBUlNFVCwKKyAgICAgIDAsIDAsIERFRkFVTFRfUVVBTElUWSwgVkFSSUFCTEVfUElUQ0ggfCBGRl9TV0lTUywgIk1TIFNhbnMgU2VyaWYiIH0KK307CitzdGF0aWMgVUlOVDE2IGFsaWduX0RlZmF1bHRHdWlGb250ID0gMTsKIAogCiBzdGF0aWMgR0RJT0JKSERSICogU3RvY2tPYmplY3RzW05CX1NUT0NLX09CSkVDVFNdID0KQEAgLTE0NSw3ICsxNjMsOCBAQAogICAgIChHRElPQkpIRFIgKikgJlN5c3RlbUZvbnQsCiAgICAgKEdESU9CSkhEUiAqKSAmRGV2aWNlRGVmYXVsdEZvbnQsCiAgICAgTlVMTCwgICAgICAgICAgICAvKiBERUZBVUxUX1BBTEVUVEUgY3JlYXRlZCBieSBQQUxFVFRFX0luaXQgKi8KLSAgICAoR0RJT0JKSERSICopICZTeXN0ZW1GaXhlZEZvbnQKKyAgICAoR0RJT0JKSERSICopICZTeXN0ZW1GaXhlZEZvbnQsCisgICAgKEdESU9CSkhEUiAqKSAmRGVmYXVsdEd1aUZvbnQKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIxMyw2ICsyMzIsMTUgQEAKICAgICBleHRlcm4gQk9PTDMyIFgxMURSVl9Jbml0KHZvaWQpOwogICAgIGV4dGVybiBCT09MMzIgRElCX0luaXQodm9pZCk7CiAKKyAgICAvKiBLaWxsIHNvbWUgd2FybmluZ3MuICAqLworICAgICh2b2lkKWFsaWduX09FTUZpeGVkRm9udDsKKyAgICAodm9pZClhbGlnbl9BbnNpRml4ZWRGb250OworICAgICh2b2lkKWFsaWduX0Fuc2lWYXJGb250OworICAgICh2b2lkKWFsaWduX1N5c3RlbUZvbnQ7CisgICAgKHZvaWQpYWxpZ25fRGV2aWNlRGVmYXVsdEZvbnQ7CisgICAgKHZvaWQpYWxpZ25fU3lzdGVtRml4ZWRGb250OworICAgICh2b2lkKWFsaWduX0RlZmF1bHRHdWlGb250OworCiAgICAgLyogVFdFQUs6IEluaXRpYWxpemUgZm9udCBoaW50cyAqLwogICAgIFJlYWRGb250SW5mb3JtYXRpb24oIk9FTUZpeGVkIiwgJk9FTUZpeGVkRm9udCwgMTIsIDAsIDAsIDAsIDApOwogICAgIFJlYWRGb250SW5mb3JtYXRpb24oIkFuc2lGaXhlZCIsICZBbnNpRml4ZWRGb250LCAxMiwgMCwgMCwgMCwgMCk7CkBAIC01MTUsNiArNTQzLDI4IEBACiAgICAgcmV0dXJuIEdldE9iamVjdDMyQSggaGFuZGxlLCBjb3VudCwgYnVmZmVyICk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldEN1cnJlbnRPYmplY3QgICAgCShHREkzMi4xNjYpCisgKi8KK0hBTkRMRTMyIFdJTkFQSSBHZXRDdXJyZW50T2JqZWN0KEhEQzMyIGhkYyxVSU5UMzIgdHlwZSkKK3sKKyAgICBEQyAqIGRjID0gRENfR2V0RENQdHIoIGhkYyApOworCisgICAgaWYgKCFkYykgCisgICAgCXJldHVybiAwOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgT0JKX1BFTjoJcmV0dXJuIGRjLT53LmhQZW47CisgICAgY2FzZSBPQkpfQlJVU0g6CXJldHVybiBkYy0+dy5oQnJ1c2g7CisgICAgY2FzZSBPQkpfUEFMOglyZXR1cm4gZGMtPncuaFBhbGV0dGU7CisgICAgY2FzZSBPQkpfRk9OVDoJcmV0dXJuIGRjLT53LmhGb250OworICAgIGNhc2UgT0JKX0JJVE1BUDoJcmV0dXJuIGRjLT53LmhCaXRtYXA7CisgICAgZGVmYXVsdDoKKyAgICAJLyogdGhlIFNESyBvbmx5IG1lbnRpb25zIHRob3NlIGFib3ZlICovCisgICAgCWZwcmludGYoc3RkZXJyLCJHZXRDdXJyZW50T2JqZWN0KCUwOHgsJWQpLCB1bmtub3duIHR5cGUuXG4iLGhkYyx0eXBlKTsKKwlyZXR1cm4gMDsKKyAgICB9Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU2VsZWN0T2JqZWN0MTYgICAgKEdESS40NSkKZGlmZiAtLWdpdCBhL29iamVjdHMvbWV0YWZpbGUuYyBiL29iamVjdHMvbWV0YWZpbGUuYwppbmRleCA3Nzg1MzEzLi4zNzNjODUxIDEwMDY0NAotLS0gYS9vYmplY3RzL21ldGFmaWxlLmMKKysrIGIvb2JqZWN0cy9tZXRhZmlsZS5jCkBAIC0yNzcsNiArMjc3LDEwIEBACiAJbXIgPSAoTUVUQVJFQ09SRCAqKSgoY2hhciAqKW1oICsgb2Zmc2V0KTsKIAlkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwib2Zmc2V0ID0gJTA0eCBzaXplID0gJTA4bHggZnVuY3Rpb24gPSAlMDR4XG4iLAogCQkJIG9mZnNldCxtci0+cmRTaXplLG1yLT5yZEZ1bmN0aW9uKTsKKwlpZiAoIW1yLT5yZFNpemUpIHsKKwkJZnByaW50ZihzdGRlcnIsIk1FVEFGSUxFIGVudHJ5IGdvdCBzaXplIDAgYXQgb2Zmc2V0ICVkLCB0b3RhbCBtZiBsZW5ndGggaXMgJWxkXG4iLG9mZnNldCxtaC0+bXRTaXplKjIpOworCQlicmVhazsgLyogd291bGQgbG9vcCBlbmRsZXNzbHkgb3RoZXJ3aXNlICovCisJfQogCW9mZnNldCArPSBtci0+cmRTaXplICogMjsKIAlQbGF5TWV0YUZpbGVSZWNvcmQxNiggaGRjLCBodCwgbXIsIG1oLT5tdE5vT2JqZWN0cyApOwogICAgIH0KQEAgLTY1MCw2ICs2NTQsOCBAQAogICAgICAgICAgICAgZHh4ID0gKExQSU5UMTYpKHNvdCsoKChzMSsxKT4+MSkqMikpOwkgICAKICAgICAgICAgICBlbHNlIAogCSAgeworCSAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJFWFRURVhUT1VUOiAlcyAgbGVuOiAlbGRcbiIsCisgICAgICAgICAgICAgc290LG1yLT5yZFNpemUpOwogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKIAkgICAgICJQbGVhc2UgcmVwb3J0OiBQbGF5TWV0YUZpbGUvRXh0VGV4dE91dCBsZW49JWxkIHNsZW49JWQgcmRTaXplPSVsZCBvcHQ9JTA0eFxuIiwKIAkJICAgbGVuLHMxLG1yLT5yZFNpemUsbXItPnJkUGFyYW1bM10pOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9wYWxldHRlLmMgYi9vYmplY3RzL3BhbGV0dGUuYwppbmRleCBjOGFkY2FhLi5mN2Y0YTA0IDEwMDY0NAotLS0gYS9vYmplY3RzL3BhbGV0dGUuYworKysgYi9vYmplY3RzL3BhbGV0dGUuYwpAQCAtMjAsOSArMjAsNiBAQAogLyogI2RlZmluZSBERUJVR19QQUxFVFRFICovCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotIC8qIGxvb2t1cCBwaXhlbCBhbW9uZyBzdGF0aWMgZW50cmllcyBvZiB0aGUgc3lzdGVtIHBhbGV0dGUgKi8KLWV4dGVybiBpbnQgQ09MT1JfTG9va3VwU3lzdGVtUGl4ZWwoQ09MT1JSRUYpOwotCiBzdGF0aWMgVUlOVDMyIFN5c3RlbVBhbGV0dGVVc2UgPSBTWVNQQUxfU1RBVElDOyAgLyogY3VycmVudGx5IG5vdCBjb25zaWRlcmVkICovCiAKIHN0YXRpYyBIUEFMRVRURTE2IGhQcmltYXJ5UGFsZXR0ZSA9IDA7IC8qIHVzZWQgZm9yIFdNX1BBTEVUVEVDSEFOR0VEICovCkBAIC0zNiw4ICszMyw2IEBACiAgKi8KIEhQQUxFVFRFMTYgUEFMRVRURV9Jbml0KHZvaWQpCiB7Ci0gICAgZXh0ZXJuIGNvbnN0IFBBTEVUVEVFTlRSWSogQ09MT1JfR2V0U3lzdGVtUGFsZXR0ZVRlbXBsYXRlKHZvaWQpOwotCiAgICAgaW50ICAgICAgICAgICAgICAgICBpOwogICAgIEhQQUxFVFRFMTYgICAgICAgICAgaHBhbGV0dGU7CiAgICAgTE9HUEFMRVRURSAqICAgICAgICBwYWxQdHI7CkBAIC0xMTcsNiArMTEyLDE0IEBACiAgICAgcmV0dXJuIGhwYWxldHRlOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDcmVhdGVIYWxmdG9uZVBhbGV0dGUgICAoR0RJMzIuNDcpCisgKi8KK0hQQUxFVFRFMzIgV0lOQVBJIENyZWF0ZUhhbGZ0b25lUGFsZXR0ZShIREMzMiBoZGMpCit7CisgIGZwcmludGYoc3RkbmltcCwiQ3JlYXRlSGFsZnRvbmVQYWxldHRlOiBlbXB0eSBzdHViIVxuIik7CisgIHJldHVybiBOVUxMOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRQYWxldHRlRW50cmllczE2ICAgIChHREkuMzYzKQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9wZW4uYyBiL29iamVjdHMvcGVuLmMKaW5kZXggYzJjNjNhZC4uY2EzYTE5MSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9wZW4uYworKysgYi9vYmplY3RzL3Blbi5jCkBAIC03Myw2ICs3MywzMCBAQAogICAgIHJldHVybiBocGVuOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBFeHRDcmVhdGVQZW4zMiAgICAoR0RJMzIuOTMpCisgKgorICogRklYTUU6IFBTX1VTRVJTVFlMRSBub3QgaGFuZGxlZAorICovCisKK0hQRU4zMiBXSU5BUEkgRXh0Q3JlYXRlUGVuMzIoIERXT1JEIHN0eWxlLCBEV09SRCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExPR0JSVVNIMzIgKiBicnVzaCwgRFdPUkQgc3R5bGVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV09SRCAqc3R5bGVfYml0cyApCit7CisgICAgTE9HUEVOMzIgbG9ncGVuOworCisgICAgaWYgKChzdHlsZSAmIFBTX1NUWUxFX01BU0spID09IFBTX1VTRVJTVFlMRSkKKwlmcHJpbnRmKHN0ZGVyciwgIkV4dENyZWF0ZVBlbjogUFNfVVNFUlNUWUxFIG5vdCBoYW5kbGVkXG4iKTsKKyAgICBpZiAoKHN0eWxlICYgUFNfVFlQRV9NQVNLKSA9PSBQU19HRU9NRVRSSUMpCisJaWYgKGJydXNoLT5sYkhhdGNoKQorCSAgICBmcHJpbnRmKHN0ZGVyciwgIkV4dENyZWF0ZVBlbjogSGF0Y2hlcyBub3QgaW1wbGVtZW50ZWRcbiIpOworCisgICAgbG9ncGVuLmxvcG5TdHlsZSA9IHN0eWxlICYgflBTX1RZUEVfTUFTSzsKKyAgICBsb2dwZW4ubG9wbldpZHRoLnggPSAoc3R5bGUgJiBQU19HRU9NRVRSSUMpID8gd2lkdGggOiAxOworICAgIGxvZ3Blbi5sb3BuV2lkdGgueSA9IDA7CisgICAgbG9ncGVuLmxvcG5Db2xvciA9IGJydXNoLT5sYkNvbG9yOworICAgIHJldHVybiBDcmVhdGVQZW5JbmRpcmVjdDMyKCAmbG9ncGVuICk7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFBFTl9HZXRPYmplY3QxNgpkaWZmIC0tZ2l0IGEvb2JqZWN0cy90ZXh0LmMgYi9vYmplY3RzL3RleHQuYwppbmRleCAwNGY4ZjhiLi42MGVjMTBjIDEwMDY0NAotLS0gYS9vYmplY3RzL3RleHQuYworKysgYi9vYmplY3RzL3RleHQuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAvKiAjZGVmaW5lIERFQlVHX1RFWFQgKi8KICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImNhY2hlLmgiCiAKICNkZWZpbmUgVEFCICAgICA5CiAjZGVmaW5lIExGICAgICAxMApAQCAtNDIwLDIxICs0MjEsMTE3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgVEVYVF9HcmF5U3RyaW5nCisgKgorICogRklYTUU6IFRoZSBjYWxsIHRvIDE2LWJpdCBjb2RlIG9ubHkgd29ya3MgYmVjYXVzZSB0aGUgd2luZSBHREkgaXMgYSAxNi1iaXQKKyAqIGhlYXAgYW5kIHdlIGNhbiBndWFyYW50ZWUgdGhhdCB0aGUgaGFuZGxlcyBmaXQgaW4gYW4gSU5UMTYuIFdlIGhhdmUgdG8KKyAqIHJldGhpbmsgdGhlIHN0cmF0ZWd5IG9uY2UgdGhlIG1pZ3JhdGlvbiB0byBOVCBoYW5kbGVzIGlzIGNvbXBsZXRlLgorICogV2UgYXJlIGdvaW5nIHRvIGdldCBhIGxvdCBvZiBjb2RlLWR1cGxpY2F0aW9uIG9uY2UgdGhpcyBtaWdyYXRpb24gaXMKKyAqIGNvbXBsZXRlZC4uLgorICogCisgKi8KK3N0YXRpYyBCT09MMzIgVEVYVF9HcmF5U3RyaW5nKEhEQzMyIGhkYywgSEJSVVNIMzIgaGIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBWVNUUklOR1BST0MzMiBmbiwgTFBBUkFNIGxwLCBJTlQzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB4LCBJTlQzMiB5LCBJTlQzMiBjeCwgSU5UMzIgY3ksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHVuaWNvZGUsIEJPT0wzMiBfMzJiaXQpCit7CisgICAgSEJJVE1BUDMyIGhibSwgaGJtc2F2ZTsKKyAgICBIQlJVU0gzMiBoYnNhdmU7CisgICAgSEZPTlQzMiBoZnNhdmU7CisgICAgSERDMzIgbWVtZGMgPSBDcmVhdGVDb21wYXRpYmxlREMzMihoZGMpOworICAgIGludCBzbGVuID0gbGVuOworICAgIEJPT0wzMiByZXR2YWwgPSBUUlVFOworICAgIFJFQ1QzMiByOworICAgIENPTE9SUkVGIGZnLCBiZzsKKworICAgIGlmKCFoZGMpIHJldHVybiBGQUxTRTsKKyAgICAKKyAgICBpZihsZW4gPT0gMCkKKyAgICB7CisgICAgICAgIGlmKHVuaWNvZGUpCisgICAgCSAgICBzbGVuID0gbHN0cmxlbjMyVygoTFBDV1NUUilscCk7CisgICAgCWVsc2UgaWYoXzMyYml0KQorICAgIAkgICAgc2xlbiA9IGxzdHJsZW4zMkEoKExQQ1NUUilscCk7CisgICAgCWVsc2UKKyAgICAJICAgIHNsZW4gPSBsc3RybGVuMzJBKChMUENTVFIpUFRSX1NFR19UT19MSU4obHApKTsKKyAgICB9CisKKyAgICBpZigoY3ggPT0gMCB8fCBjeSA9PSAwKSAmJiBzbGVuICE9IC0xKQorICAgIHsKKyAgICAgICAgU0laRTMyIHM7CisgICAgICAgIGlmKHVuaWNvZGUpCisgICAgICAgICAgICBHZXRUZXh0RXh0ZW50UG9pbnQzMlcoaGRjLCAoTFBDV1NUUilscCwgc2xlbiwgJnMpOworICAgICAgICBlbHNlIGlmKF8zMmJpdCkKKyAgICAgICAgICAgIEdldFRleHRFeHRlbnRQb2ludDMyQShoZGMsIChMUENTVFIpbHAsIHNsZW4sICZzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgR2V0VGV4dEV4dGVudFBvaW50MzJBKGhkYywgKExQQ1NUUilQVFJfU0VHX1RPX0xJTihscCksIHNsZW4sICZzKTsKKyAgICAgICAgaWYoY3ggPT0gMCkgY3ggPSBzLmN4OworICAgICAgICBpZihjeSA9PSAwKSBjeSA9IHMuY3k7CisgICAgfQorCisgICAgci5sZWZ0ID0gci50b3AgPSAwOworICAgIHIucmlnaHQgPSBjeDsKKyAgICByLmJvdHRvbSA9IGN5OworCisgICAgaGJtID0gQ3JlYXRlQml0bWFwMzIoY3gsIGN5LCAxLCAxLCBOVUxMKTsKKyAgICBoYm1zYXZlID0gKEhCSVRNQVAzMilTZWxlY3RPYmplY3QzMihtZW1kYywgaGJtKTsKKyAgICBGaWxsUmVjdDMyKG1lbWRjLCAmciwgKEhCUlVTSDMyKUdldFN0b2NrT2JqZWN0MzIoQkxBQ0tfQlJVU0gpKTsKKyAgICBTZXRUZXh0Q29sb3IzMihtZW1kYywgUkdCKDI1NSwgMjU1LCAyNTUpKTsKKyAgICBTZXRCa0NvbG9yMzIobWVtZGMsIFJHQigwLCAwLCAwKSk7CisgICAgaGZzYXZlID0gKEhGT05UMzIpU2VsZWN0T2JqZWN0MzIobWVtZGMsIEdldEN1cnJlbnRPYmplY3QoaGRjLCBPQkpfRk9OVCkpOworICAgICAgICAgICAgCisgICAgaWYoZm4pCisgICAgICAgIGlmKF8zMmJpdCkKKyAgICAgICAgICAgIHJldHZhbCA9IGZuKG1lbWRjLCBscCwgc2xlbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHZhbCA9IChCT09MMzIpKChCT09MMTYpKChHUkFZU1RSSU5HUFJPQzE2KWZuKSgoSERDMTYpbWVtZGMsIGxwLCAoSU5UMTYpc2xlbikpOworICAgIGVsc2UKKyAgICAgICAgaWYodW5pY29kZSkKKyAgICAgICAgICAgIFRleHRPdXQzMlcobWVtZGMsIDAsIDAsIChMUENXU1RSKWxwLCBzbGVuKTsKKyAgICAgICAgZWxzZSBpZihfMzJiaXQpCisgICAgICAgICAgICBUZXh0T3V0MzJBKG1lbWRjLCAwLCAwLCAoTFBDU1RSKWxwLCBzbGVuKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgVGV4dE91dDMyQShtZW1kYywgMCwgMCwgKExQQ1NUUilQVFJfU0VHX1RPX0xJTihscCksIHNsZW4pOworCisgICAgU2VsZWN0T2JqZWN0MzIobWVtZGMsIGhmc2F2ZSk7CisKKy8qCisgKiBXaW5kb3dzIGRvYyBzYXlzIHRoYXQgdGhlIGJpdG1hcCBpc24ndCBncmF5ZWQgd2hlbiBsZW4gPT0gLTEgYW5kCisgKiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJucyBGQUxTRS4gSG93ZXZlciwgdGVzdGluZyB0aGlzIG9uCisgKiB3aW45NSBzaG93ZWQgb3RoZXJ3aXNlLi4uCisqLworI2lmZGVmIEdSQVlTVFJJTkdfVVNJTkdfRE9DVU1FTlRFRF9CRUhBVklPVVIKKyAgICBpZihyZXR2YWwgfHwgbGVuICE9IC0xKQorI2VuZGlmCisgICAgeworICAgICAgICBoYnNhdmUgPSAoSEJSVVNIMzIpU2VsZWN0T2JqZWN0MzIobWVtZGMsIENBQ0hFX0dldFBhdHRlcm41NUFBQnJ1c2goKSk7CisgICAgICAgIFBhdEJsdDMyKG1lbWRjLCAwLCAwLCBjeCwgY3ksIDB4MDAwQTAzMjkpOworICAgICAgICBTZWxlY3RPYmplY3QzMihtZW1kYywgaGJzYXZlKTsKKyAgICB9CisKKyAgICBpZihoYikgaGJzYXZlID0gKEhCUlVTSDMyKVNlbGVjdE9iamVjdDMyKGhkYywgaGIpOworICAgIGZnID0gU2V0VGV4dENvbG9yMzIoaGRjLCBSR0IoMCwgMCwgMCkpOworICAgIGJnID0gU2V0QmtDb2xvcjMyKGhkYywgUkdCKDI1NSwgMjU1LCAyNTUpKTsKKyAgICBCaXRCbHQzMihoZGMsIHgsIHksIGN4LCBjeSwgbWVtZGMsIDAsIDAsIDB4MDBFMjA3NDYpOworICAgIFNldFRleHRDb2xvcjMyKGhkYywgZmcpOworICAgIFNldEJrQ29sb3IzMihoZGMsIGJnKTsKKyAgICBpZihoYikgU2VsZWN0T2JqZWN0MzIoaGRjLCBoYnNhdmUpOworCisgICAgU2VsZWN0T2JqZWN0MzIobWVtZGMsIGhibXNhdmUpOworICAgIERlbGV0ZU9iamVjdDMyKGhibSk7CisgICAgRGVsZXRlREMzMihtZW1kYyk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHcmF5U3RyaW5nMTYgICAoVVNFUi4xODUpCiAgKi8KIEJPT0wxNiBXSU5BUEkgR3JheVN0cmluZzE2KCBIREMxNiBoZGMsIEhCUlVTSDE2IGhiciwgR1JBWVNUUklOR1BST0MxNiBnc3ByYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtLCBJTlQxNiBjY2gsIElOVDE2IHgsIElOVDE2IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgY3gsIElOVDE2IGN5ICkKIHsKLSAgICBCT09MMTYgcmV0OwotICAgIENPTE9SUkVGIGN1cnJlbnRfY29sb3I7Ci0KLSAgICBpZiAoIWNjaCkgY2NoID0gbHN0cmxlbjE2KCAoTFBDU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkgKTsKLSAgICBpZiAoZ3NwcmMpIHJldHVybiBnc3ByYyggaGRjLCBsUGFyYW0sIGNjaCApOwotICAgIGN1cnJlbnRfY29sb3IgPSBTZXRUZXh0Q29sb3IzMiggaGRjLCBHZXRTeXNDb2xvcjMyKENPTE9SX0dSQVlURVhUKSApOwotICAgIHJldCA9IFRleHRPdXQxNiggaGRjLCB4LCB5LCAoTFBDU1RSKVBUUl9TRUdfVE9fTElOKGxQYXJhbSksIGNjaCApOwotICAgIFNldFRleHRDb2xvcjMyKCBoZGMsIGN1cnJlbnRfY29sb3IgKTsKLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBURVhUX0dyYXlTdHJpbmcoaGRjLCBoYnIsIChHUkFZU1RSSU5HUFJPQzMyKWdzcHJjLCBsUGFyYW0sIGNjaCwgeCwgeSwgY3gsIGN5LCBGQUxTRSwgRkFMU0UpOwogfQogCiAKQEAgLTQ0NSwxNSArNTQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSwgSU5UMzIgY2NoLCBJTlQzMiB4LCBJTlQzMiB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjeCwgSU5UMzIgY3kgKQogewotICAgIEJPT0wzMiByZXQ7Ci0gICAgQ09MT1JSRUYgY3VycmVudF9jb2xvcjsKLQotICAgIGlmICghY2NoKSBjY2ggPSBsc3RybGVuMzJBKCAoTFBDU1RSKWxQYXJhbSApOwotICAgIGlmIChnc3ByYykgcmV0dXJuIGdzcHJjKCBoZGMsIGxQYXJhbSwgY2NoICk7Ci0gICAgY3VycmVudF9jb2xvciA9IFNldFRleHRDb2xvcjMyKCBoZGMsIEdldFN5c0NvbG9yMzIoQ09MT1JfR1JBWVRFWFQpICk7Ci0gICAgcmV0ID0gVGV4dE91dDMyQSggaGRjLCB4LCB5LCAoTFBDU1RSKWxQYXJhbSwgY2NoICk7Ci0gICAgU2V0VGV4dENvbG9yMzIoIGhkYywgY3VycmVudF9jb2xvciApOwotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIFRFWFRfR3JheVN0cmluZyhoZGMsIGhiciwgZ3NwcmMsIGxQYXJhbSwgY2NoLCB4LCB5LCBjeCwgY3ksIEZBTFNFLCBUUlVFKTsKIH0KIAogCkBAIC00NjQsMTUgKzU1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0sIElOVDMyIGNjaCwgSU5UMzIgeCwgSU5UMzIgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgY3gsIElOVDMyIGN5ICkKIHsKLSAgICBCT09MMzIgcmV0OwotICAgIENPTE9SUkVGIGN1cnJlbnRfY29sb3I7Ci0KLSAgICBpZiAoIWNjaCkgY2NoID0gbHN0cmxlbjMyVyggKExQQ1dTVFIpbFBhcmFtICk7Ci0gICAgaWYgKGdzcHJjKSByZXR1cm4gZ3NwcmMoIGhkYywgbFBhcmFtLCBjY2ggKTsKLSAgICBjdXJyZW50X2NvbG9yID0gU2V0VGV4dENvbG9yMzIoIGhkYywgR2V0U3lzQ29sb3IzMihDT0xPUl9HUkFZVEVYVCkgKTsKLSAgICByZXQgPSBUZXh0T3V0MzJXKCBoZGMsIHgsIHksIChMUENXU1RSKWxQYXJhbSwgY2NoICk7Ci0gICAgU2V0VGV4dENvbG9yMzIoIGhkYywgY3VycmVudF9jb2xvciApOwotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIFRFWFRfR3JheVN0cmluZyhoZGMsIGhiciwgZ3NwcmMsIGxQYXJhbSwgY2NoLCB4LCB5LCBjeCwgY3ksIFRSVUUsIFRSVUUpOwogfQogCiAKQEAgLTY1NSw4ICs3MzYsMTAgQEAKIElOVDMyIFdJTkFQSSBHZXRUZXh0Q2hhcnNldEluZm8oSERDMzIgaGRjLExQQ0hBUlNFVElORk8gY3NpLERXT1JEIGZsYWdzKQogewogICAgIGZwcmludGYoc3RkbmltcCwiR2V0VGV4dENoYXJzZXRJbmZvKDB4JXgsJXAsJTA4bHgpLCBzdHViIVxuIixoZGMsY3NpLGZsYWdzKTsKLSAgICBjc2ktPmNpQ2hhcnNldCA9IERFRkFVTFRfQ0hBUlNFVDsKLSAgICBjc2ktPmNpQUNQID0gR2V0QUNQKCk7CisgICAgaWYgKGNzaSkgeworCWNzaS0+Y2lDaGFyc2V0ID0gREVGQVVMVF9DSEFSU0VUOworCWNzaS0+Y2lBQ1AgPSBHZXRBQ1AoKTsKKyAgICB9CiAgICAgLyogLi4uIGZpbGwgZm9udHN0cnVjdCB0b28gLi4uICovCiAgICAgcmV0dXJuIERFRkFVTFRfQ0hBUlNFVDsKIH0KZGlmZiAtLWdpdCBhL29sZS9NYWtlZmlsZS5pbiBiL29sZS9NYWtlZmlsZS5pbgppbmRleCBmZWVjYTZjLi4xZDkyMzczMyAxMDA2NDQKLS0tIGEvb2xlL01ha2VmaWxlLmluCisrKyBiL29sZS9NYWtlZmlsZS5pbgpAQCAtNyw2ICs3LDggQEAKIAogQ19TUkNTID0gXAogCWNvbXBvYmouYyBcCisJaWZzLmMgXAorCWZvbGRlcnMuYyBcCiAJb2xlMi5jIFwKIAlvbGUyZGlzcC5jIFwKIAlvbGUybmxzLmMgXApAQCAtMTgsNCArMjAsMyBAQAogQE1BS0VfUlVMRVNACiAKICMjIyBEZXBlbmRlbmNpZXM6Ci0KZGlmZiAtLWdpdCBhL29sZS9mb2xkZXJzLmMgYi9vbGUvZm9sZGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMGRlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9vbGUvZm9sZGVycy5jCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICoJU2hlbGwgRm9sZGVyIHN0dWZmCisgKgorICoJQ29weXJpZ2h0IDE5OTcJTWFyY3VzIE1laXNzbmVyCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAib2xlLmgiCisjaW5jbHVkZSAib2xlMi5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJjb21wb2JqLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlcy5oIgorI2luY2x1ZGUgInNobG9iai5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJRW51bUlETGlzdCBpbXBsZW1lbnRhdGlvbgorICovCisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSUVudW1JRExpc3RfQWRkUmVmKExQRU5VTUlETElTVCB0aGlzKSB7CisJZnByaW50ZihzdGRlcnIsIklFbnVtSURMaXN0KCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CisJcmV0dXJuICsrKHRoaXMtPnJlZik7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSUVudW1JRExpc3RfUmVsZWFzZShMUEVOVU1JRExJU1QgdGhpcykgeworCWZwcmludGYoc3RkZXJyLCJJRW51bUlETGlzdCglcCktPlJlbGVhc2UoKVxuIix0aGlzKTsKKwlpZiAoIS0tKHRoaXMtPnJlZikpIHsKKwkJZnByaW50ZihzdGRlcnIsIgktPiBmcmVlaW5nIElFbnVtSURMaXN0KCVwKVxuIix0aGlzKTsKKwkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHRoaXMtPnJlZjsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtSURMaXN0X05leHQoCisJTFBFTlVNSURMSVNUIHRoaXMsVUxPTkcgY2VsdCxMUElURU1JRExJU1QgKnJnZWx0LFVMT05HICpwY2VsdEZldGNoZWQKKykgeworCWZwcmludGYoc3RkZXJyLCJJRW51bUlETGlzdCglcCktPk5leHQoJWxkLCVwLCVwKSxzdHViIVxuIiwKKwkJdGhpcyxjZWx0LHJnZWx0LHBjZWx0RmV0Y2hlZAorCSk7CisJKnBjZWx0RmV0Y2hlZCA9IDA7IC8qIHdlIGRvbid0IGhhdmUgYW55IC4uLiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgSUVudW1JRExpc3RfVlRhYmxlIGVpZGx2dCA9IHsKKwkxLAorCUlFbnVtSURMaXN0X0FkZFJlZiwKKwlJRW51bUlETGlzdF9SZWxlYXNlLAorCUlFbnVtSURMaXN0X05leHQsCisJNSw2LDcKK307CisKK0xQRU5VTUlETElTVCBJRW51bUlETGlzdF9Db25zdHJ1Y3RvcigpIHsKKwlMUEVOVU1JRExJU1QJbHBlaWRsOworCisJbHBlaWRsPSAoTFBFTlVNSURMSVNUKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElFbnVtSURMaXN0KSk7CisJbHBlaWRsLT5yZWYgPSAxOworCWxwZWlkbC0+bHB2dGJsID0gJmVpZGx2dDsKKwlyZXR1cm4gbHBlaWRsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJU2hlbGxGb2xkZXIgaW1wbGVtZW50YXRpb24KKyAqLworc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxGb2xkZXJfUmVsZWFzZShMUFNIRUxMRk9MREVSIHRoaXMpIHsKKwlmcHJpbnRmKHN0ZGVyciwiSVNoZWxsRm9sZGVyKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOworCWlmICghLS0odGhpcy0+cmVmKSkgeworCQlmcHJpbnRmKHN0ZGVyciwiCS0+IGZyZWVpbmcgSVNoZWxsRm9sZGVyKCVwKVxuIix0aGlzKTsKKwkJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRoaXMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHRoaXMtPnJlZjsKK30KKworc3RhdGljIFVMT05HIFdJTkFQSSBJU2hlbGxGb2xkZXJfQWRkUmVmKExQU0hFTExGT0xERVIgdGhpcykgeworCWZwcmludGYoc3RkZXJyLCJJU2hlbGxGb2xkZXIoJXApLT5BZGRSZWYoKVxuIix0aGlzKTsKKwlyZXR1cm4gKysodGhpcy0+cmVmKTsKK30KKworc3RhdGljIEhSRVNVTFQgV0lOQVBJIElTaGVsbEZvbGRlcl9HZXRBdHRyaWJ1dGVzT2YoCisJTFBTSEVMTEZPTERFUiB0aGlzLFVJTlQzMiBjaWRsLExQQ0lURU1JRExJU1QgKmFwaWRsLERXT1JEICpyZ2ZJbk91dAorKSB7CisJZnByaW50ZihzdGRlcnIsIklTaGVsbEZvbGRlciglcCktPkdldEF0dHJpYnV0ZXNPZiglZCwlcCwlcCksc3R1YiFcbiIsCisJCXRoaXMsY2lkbCxhcGlkbCxyZ2ZJbk91dAorCSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfQmluZFRvT2JqZWN0KAorCUxQU0hFTExGT0xERVIgdGhpcyxMUENJVEVNSURMSVNUIHBpZGwsTFBCQyBwYmNSZXNlcnZlZCxSRUZJSUQgcmlpZCxMUFZPSUQgKiBwcHZPdXQKKykgeworCWNoYXIJeGNsc2lkWzUwXTsKKworCVN0cmluZ0Zyb21DTFNJRChyaWlkLHhjbHNpZCk7CisJZnByaW50ZihzdGRlcnIsIklTaGVsbEZvbGRlciglcCktPkJpbmRUb09iamVjdCglcCwlcCwlcywlcCksc3R1YiFcbiIsCisJCXRoaXMscGlkbCxwYmNSZXNlcnZlZCx4Y2xzaWQscHB2T3V0CisJKTsKKwkqcHB2T3V0ID0gSVNoZWxsRm9sZGVyX0NvbnN0cnVjdG9yKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfUGFyc2VEaXNwbGF5TmFtZSgKKwlMUFNIRUxMRk9MREVSIHRoaXMsSFdORDMyIGh3bmRPd25lcixMUEJDIHBiY1Jlc2VydmVkLAorCUxQT0xFU1RSIGxwc3pEaXNwbGF5TmFtZSxEV09SRCAqcGNoRWF0ZW4sTFBJVEVNSURMSVNUICpwcGlkbCwKKwlEV09SRCAqcGR3QXR0cmlidXRlcworKSB7CisJZnByaW50ZihzdGRlcnIsIklTaGVsbEZvbGRlciglcCktPlBhcnNlRGlzcGxheU5hbWUoJTA4eCwlcCwlcywlcCwlcCwlcCksc3R1YiFcbiIsCisJCXRoaXMsaHduZE93bmVyLHBiY1Jlc2VydmVkLGxwc3pEaXNwbGF5TmFtZSxwY2hFYXRlbixwcGlkbCxwZHdBdHRyaWJ1dGVzCisJKTsKKwkqKERXT1JEKilwYmNSZXNlcnZlZCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfRW51bU9iamVjdHMoCisJTFBTSEVMTEZPTERFUiB0aGlzLEhXTkQzMiBod25kT3duZXIsRFdPUkQgZ3JmRmxhZ3MsCisJTFBFTlVNSURMSVNUKiBwcGVudW1JRExpc3QKKykgeworCWZwcmludGYoc3RkZXJyLCJJU2hlbGxGb2xkZXIoJXApLT5FbnVtT2JqZWN0cygweCUwNHgsMHglMDhseCwlcCksc3R1YiFcbiIsCisJCXRoaXMsaHduZE93bmVyLGdyZkZsYWdzLHBwZW51bUlETGlzdAorCSk7CisJKnBwZW51bUlETGlzdCA9IElFbnVtSURMaXN0X0NvbnN0cnVjdG9yKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdJTkFQSSBJU2hlbGxGb2xkZXJfQ3JlYXRlVmlld09iamVjdCgKKwlMUFNIRUxMRk9MREVSIHRoaXMsSFdORDMyIGh3bmRPd25lcixSRUZJSUQgcmlpZCxMUFZPSUQgKnBwdgorKSB7CisJY2hhcgl4Y2xzaWRbNTBdOworCisJU3RyaW5nRnJvbUNMU0lEKHJpaWQseGNsc2lkKTsKKwlmcHJpbnRmKHN0ZGVyciwiSVNoZWxsRm9sZGVyKCVwKS0+Q3JlYXRlVmlld09iamVjdCgweCUwNHgsJXMsJXApLHN0dWIhXG4iLAorCQl0aGlzLGh3bmRPd25lcix4Y2xzaWQscHB2CisJKTsKKwkqKERXT1JEKilwcHYgPSBOVUxMOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgSVNoZWxsRm9sZGVyX1ZUYWJsZSBzZnZ0ID0geworCTEsCisJSVNoZWxsRm9sZGVyX0FkZFJlZiwKKwlJU2hlbGxGb2xkZXJfUmVsZWFzZSwKKwlJU2hlbGxGb2xkZXJfUGFyc2VEaXNwbGF5TmFtZSwKKwlJU2hlbGxGb2xkZXJfRW51bU9iamVjdHMsCisJSVNoZWxsRm9sZGVyX0JpbmRUb09iamVjdCwKKwk3LDgsCisJSVNoZWxsRm9sZGVyX0NyZWF0ZVZpZXdPYmplY3QsCisJSVNoZWxsRm9sZGVyX0dldEF0dHJpYnV0ZXNPZiwKKwkxMSwxMiwxMworfTsKKworTFBTSEVMTEZPTERFUiBJU2hlbGxGb2xkZXJfQ29uc3RydWN0b3IoKSB7CisJTFBTSEVMTEZPTERFUglzZjsKKworCXNmID0gKExQU0hFTExGT0xERVIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSVNoZWxsRm9sZGVyKSk7CisJc2YtPnJlZgkJPSAxOworCXNmLT5scHZ0YmwJPSAmc2Z2dDsKKwlyZXR1cm4gc2Y7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgSVNoZWxsTGlua19WVGFibGUgc2x2dCA9IHsKKwkxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMQorfTsKKworTFBTSEVMTExJTksgSVNoZWxsTGlua19Db25zdHJ1Y3RvcigpIHsKKwlMUFNIRUxMTElOSyBzbDsKKworCXNsID0gKExQU0hFTExMSU5LKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElTaGVsbExpbmspKTsKKwlzbC0+cmVmID0gMTsKKwlzbC0+bHB2dGJsID0gJnNsdnQ7CisJcmV0dXJuIHNsOworfQpkaWZmIC0tZ2l0IGEvb2xlL2lmcy5jIGIvb2xlL2lmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OGEwYWUKLS0tIC9kZXYvbnVsbAorKysgYi9vbGUvaWZzLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKgliYXNpYyBpbnRlcmZhY2VzCisgKgorICoJQ29weXJpZ2h0IDE5OTcJTWFyY3VzIE1laXNzbmVyCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAid2luZXJyb3IuaCIKKyNpbmNsdWRlICJvbGUuaCIKKyNpbmNsdWRlICJvbGUyLmgiCisjaW5jbHVkZSAiY29tcG9iai5oIgorI2luY2x1ZGUgImludGVyZmFjZXMuaCIKKyNpbmNsdWRlICJzaGxvYmouaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSVVua25vd25fQWRkUmVmKExQVU5LTk9XTiB0aGlzKSB7IAorCWRwcmludGZfcmVsYXkoc3RkZGViLCJJVW5rbm93biglcCktPkFkZFJlZigpXG4iLHRoaXMpOworCXJldHVybiArKyh0aGlzLT5yZWYpOworfQorc3RhdGljIFVMT05HIFdJTkFQSSBJVW5rbm93bl9SZWxlYXNlKExQVU5LTk9XTiB0aGlzKSB7CisJZHByaW50Zl9yZWxheShzdGRkZWIsIklVbmtub3duKCVwKS0+UmVsZWFzZSgpXG4iLHRoaXMpOworCWlmICghLS0odGhpcy0+cmVmKSkgeworCQlIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsdGhpcyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gdGhpcy0+cmVmOworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVVua25vd25fUXVlcnlJbnRlcmZhY2UoTFBVTktOT1dOIHRoaXMsUkVGSUlEIHJlZmlpZCxMUFZPSUQgKm9iaikgeworCWNoYXIJeHJlZmlpZFs1MF07CisKKwlTdHJpbmdGcm9tQ0xTSUQoKExQQ0xTSUQpcmVmaWlkLHhyZWZpaWQpOworCWRwcmludGZfcmVsYXkoc3RkZGViLCJJVW5rbm93biglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKworCWlmICghbWVtY21wKCZJSURfSVVua25vd24scmVmaWlkLHNpemVvZihJSURfSVVua25vd24pKSkgeworCQkqb2JqID0gdGhpczsKKwkJcmV0dXJuIDA7IAorCX0KKwlyZXR1cm4gT0xFX0VfRU5VTV9OT01PUkU7IAorfQorCitzdGF0aWMgSVVua25vd25fVlRhYmxlIHV2dCA9IHsKKwlJVW5rbm93bl9RdWVyeUludGVyZmFjZSwKKwlJVW5rbm93bl9BZGRSZWYsCisJSVVua25vd25fUmVsZWFzZQorfTsKKworCitMUFVOS05PV04KK0lVbmtub3duX0NvbnN0cnVjdG9yKCkgeworCUxQVU5LTk9XTgl1bms7CisKKwlmcHJpbnRmKHN0ZGVyciwiY2xvbmluZyBJVW5rbm93bi5cbiIpOworCXVuayA9IChMUFVOS05PV04pSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoSVVua25vd24pKTsKKwl1bmstPmxwdnRibAk9ICZ1dnQ7CisJdW5rLT5yZWYJPSAxOworCXJldHVybiB1bms7Cit9CisKK3N0YXRpYyBVTE9ORyBXSU5BUEkgSU1hbGxvY19BZGRSZWYoTFBNQUxMT0MgdGhpcykgeworCWRwcmludGZfcmVsYXkoc3RkZGViLCJJTWFsbG9jKCVwKS0+QWRkUmVmKClcbiIsdGhpcyk7CisJcmV0dXJuIDE7IC8qIGNhbm5vdCBiZSBmcmVlZCAqLworfQorCitzdGF0aWMgVUxPTkcgV0lOQVBJIElNYWxsb2NfUmVsZWFzZShMUE1BTExPQyB0aGlzKSB7CisJZHByaW50Zl9yZWxheShzdGRkZWIsIklNYWxsb2MoJXApLT5SZWxlYXNlKClcbiIsdGhpcyk7CisJcmV0dXJuIDE7IC8qIGNhbm5vdCBiZSBmcmVlZCAqLworfQorCitzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSU1hbGxvY19RdWVyeUludGVyZmFjZShMUE1BTExPQyB0aGlzLFJFRklJRCByZWZpaWQsTFBWT0lEICpvYmopIHsKKwljaGFyCXhyZWZpaWRbNTBdOworCisJU3RyaW5nRnJvbUNMU0lEKChMUENMU0lEKXJlZmlpZCx4cmVmaWlkKTsKKwlkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiSU1hbGxvYyglcCktPlF1ZXJ5SW50ZXJmYWNlKCVzLCVwKVxuIix0aGlzLHhyZWZpaWQsb2JqKTsKKwlpZiAoCSFtZW1jbXAoJklJRF9JVW5rbm93bixyZWZpaWQsc2l6ZW9mKElJRF9JVW5rbm93bikpIHx8CisJCSFtZW1jbXAoJklJRF9JTWFsbG9jLHJlZmlpZCxzaXplb2YoSUlEX0lNYWxsb2MpKQorCSkgeworCQkqb2JqID0gdGhpczsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBPTEVfRV9FTlVNX05PTU9SRTsgCit9CisKK3N0YXRpYyBMUFZPSUQgV0lOQVBJIElNYWxsb2NfQWxsb2MoTFBNQUxMT0MgdGhpcyxEV09SRCBjYikgeworCWRwcmludGZfcmVsYXkoc3RkZGViLCJJTWFsbG9jKCVwKS0+QWxsb2MoJWxkKVxuIix0aGlzLGNiKTsKKwlyZXR1cm4gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxjYik7Cit9CisKK3N0YXRpYyBMUFZPSUQgV0lOQVBJIElNYWxsb2NfUmVhbGxvYyhMUE1BTExPQyB0aGlzLExQVk9JRCBwdixEV09SRCBjYikgeworCWRwcmludGZfcmVsYXkoc3RkZGViLCJJTWFsbG9jKCVwKS0+UmVhbGxvYyglcCwlbGQpXG4iLHRoaXMscHYsY2IpOworCXJldHVybiBIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAscHYsY2IpOworfQorc3RhdGljIFZPSUQgV0lOQVBJIElNYWxsb2NfRnJlZShMUE1BTExPQyB0aGlzLExQVk9JRCBwdikgeworCWRwcmludGZfcmVsYXkoc3RkZGViLCJJTWFsbG9jKCVwKS0+RnJlZSglcClcbiIsdGhpcyxwdik7CisJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHB2KTsKK30KKworc3RhdGljIERXT1JEIFdJTkFQSSBJTWFsbG9jX0dldFNpemUoTFBNQUxMT0MgdGhpcyxMUFZPSUQgcHYpIHsKKwlkcHJpbnRmX3JlbGF5KHN0ZGRlYiwiSU1hbGxvYyglcCktPkdldFNpemUoJXApXG4iLHRoaXMscHYpOworCXJldHVybiBIZWFwU2l6ZShHZXRQcm9jZXNzSGVhcCgpLDAscHYpOworfQorCitzdGF0aWMgTFBJTlQzMiBXSU5BUEkgSU1hbGxvY19EaWRBbGxvYyhMUE1BTExPQyB0aGlzLExQVk9JRCBwdikgeworCWRwcmludGZfcmVsYXkoc3RkZGViLCJJTWFsbG9jKCVwKS0+RGlkQWxsb2MoJXApXG4iLHRoaXMscHYpOworCXJldHVybiAoTFBJTlQzMikweGZmZmZmZmZmOworfQorc3RhdGljIExQVk9JRCBXSU5BUEkgSU1hbGxvY19IZWFwTWluaW1pemUoTFBNQUxMT0MgdGhpcykgeworCWRwcmludGZfcmVsYXkoc3RkZGViLCJJTWFsbG9jKCVwKS0+SGVhcE1pbmltaXplKClcbiIsdGhpcyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBJTWFsbG9jX1ZUYWJsZSBWVF9JTWFsbG9jID0geworCUlNYWxsb2NfUXVlcnlJbnRlcmZhY2UsCisJSU1hbGxvY19BZGRSZWYsCisJSU1hbGxvY19SZWxlYXNlLAorCUlNYWxsb2NfQWxsb2MsCisJSU1hbGxvY19SZWFsbG9jLAorCUlNYWxsb2NfRnJlZSwKKwlJTWFsbG9jX0dldFNpemUsCisJSU1hbGxvY19EaWRBbGxvYywKKwlJTWFsbG9jX0hlYXBNaW5pbWl6ZSwKK307CisKK0xQTUFMTE9DCitJTWFsbG9jX0NvbnN0cnVjdG9yKCkgeworCUxQTUFMTE9DCXRoaXM7CisKKwlmcHJpbnRmKHN0ZGVyciwiY2xvbmluZyBJTWFsbG9jXG4iKTsKKwl0aGlzID0gKExQTUFMTE9DKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsc2l6ZW9mKElNYWxsb2MpKTsKKwl0aGlzLT5scHZ0YmwgPSAmVlRfSU1hbGxvYzsKKwl0aGlzLT5yZWYgPSAxOworCXJldHVybiB0aGlzOworfQpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvTWFrZWZpbGUuaW4gYi9wcm9ncmFtcy9NYWtlZmlsZS5pbgppbmRleCAwMTE4ZDZkLi4yZjJlODM5IDEwMDY0NAotLS0gYS9wcm9ncmFtcy9NYWtlZmlsZS5pbgorKysgYi9wcm9ncmFtcy9NYWtlZmlsZS5pbgpAQCAtMSw0ICsxLDggQEAKLVNVQkRJUlMgPSBwcm9nbWFuIHdpbmhlbHAgd2ludmVyCitTVUJESVJTID0gXAorCW5vdGVwYWQgXAorCXByb2dtYW4gXAorCXdpbmhlbHAgXAorCXdpbnZlcgogCiBhbGw6ICQoU1VCRElSUykKIApkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cgYi9wcm9ncmFtcy9ub3RlcGFkL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E1ZmEwCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9DaGFuZ2VMb2cKQEAgLTAsMCArMSw1IEBACitGcmkgRGVjIDA1IDIwOjUxOjU1IDE5OTcgIE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAgICAgICAqIFtub3RlcGFkLmNdIFtub3RlcGFkLmhdIFtub3RlcGFkLnJjXSBbRW4ucmNdIFtEZS5yY10KKyAgICAgICAgIFtsaWNlbnNlLmNdIFtsaWNlbnNlLmhdIFtMaWNlbnNlX0VuLmNdCisgICAgICAgICBbUkVBRE1FXSBbVE9ET10gW0NoYW5nZUxvZ10KKyAgICAgICAgIE9yaWdpbmFscyBieSBNYXJjZWwgQmF1cgpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9EZS5yYyBiL3Byb2dyYW1zL25vdGVwYWQvRGUucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyYTEwOQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvRGUucmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIE5vdGVwYWQgKEdlcm1hbiByZXNvdXJjZXMpCisgKgorICogQ29weXJpZ2h0IDE5OTcgTWFyY2VsIEJhdXIgPG1iYXVyQGcyNi5ldGh6LmNoPgorICovCisKKyNkZWZpbmUgTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgICBEZQorI2RlZmluZSBMQU5HVUFHRV9OVU1CRVIgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTEFOR1VBR0VfTUVOVV9JVEVNICAgICAgICAgICAiJkRldXRzY2giCisKKy8qIE1lbnUgKi8KKworI2RlZmluZSBNRU5VX0ZJTEUgICAgICAgICAgICAgICAgICAgICImRGF0ZWkiCisjZGVmaW5lIE1FTlVfRklMRV9ORVcgICAgICAgICAgICAgICAgIiZOZXUuLi4iCisjZGVmaW5lIE1FTlVfRklMRV9PUEVOICAgICAgICAgICAgICAgItYmZmZuZW4uLi4iCisjZGVmaW5lIE1FTlVfRklMRV9TQVZFICAgICAgICAgICAgICAgIiZTcGVpY2hlcm4iCisjZGVmaW5lIE1FTlVfRklMRV9TQVZFQVMgICAgICAgICAgICAgIlNwZWljaGVybiAmdW50ZXIuLi4iCisjZGVmaW5lIE1FTlVfRklMRV9QUklOVCAgICAgICAgICAgICAgIiZEcnVja2VuIgorI2RlZmluZSBNRU5VX0ZJTEVfUEFHRVNFVFVQICAgICAgICAgICJTZWl0ZSBlaW4mcmljaHRlbi4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX1BSSU5UU0VUVVAgICAgICAgICAiRHJ1Y2tlciZlaW5yaWNodHVuZy4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX0VYSVQgICAgICAgICAgICAgICAiJkJlZW5kZW4iCisKKyNkZWZpbmUgTUVOVV9FRElUICAgICAgICAgICAgICAgICAgICAiJkJlYXJiZWl0ZW4iCisjZGVmaW5lIE1FTlVfRURJVF9VTkRPICAgICAgICAgICAgICAgIiZS/GNrZ+RuZ2lnXHRTdHJnK1oiCisjZGVmaW5lIE1FTlVfRURJVF9DVVQgICAgICAgICAgICAgICAgIiZBdXNzY2huZWlkZW5cdFN0cmcrWCIKKyNkZWZpbmUgTUVOVV9FRElUX0NPUFkgICAgICAgICAgICAgICAiJktvcGllcmVuXHRTdHJnK0MiCisjZGVmaW5lIE1FTlVfRURJVF9QQVNURSAgICAgICAgICAgICAgIiZFaW5m/Gdlblx0U3RyZytWIgorI2RlZmluZSBNRU5VX0VESVRfREVMRVRFICAgICAgICAgICAgICImTPZzY2hlblx0RW50ZiIKKyNkZWZpbmUgTUVOVV9FRElUX1NFTEVDVEFMTCAgICAgICAgICAiQWxsZXMgJm1hcmtpZXJlbiIKKyNkZWZpbmUgTUVOVV9FRElUX1RJTUVEQVRFICAgICAgICAgICAiJlVocnplaXQvRGF0dW1cdEY1IgorI2RlZmluZSBNRU5VX0VESVRfV1JBUCAgICAgICAgICAgICAgICImWmVpbGVudW1icnVjaCIKKworI2RlZmluZSBNRU5VX1NFQVJDSCAgICAgICAgICAgICAgICAgICImU3VjaGVuIgorI2RlZmluZSBNRU5VX1NFQVJDSF9TRUFSQ0ggICAgICAgICAgICJTdWNoZW4uLi4iCisjZGVmaW5lIE1FTlVfU0VBUkNIX05FWFQgICAgICAgICAgICAgIiZXZWl0ZXJzdWNoZW5cdEYzIgorCisjZGVmaW5lIE1FTlVfTEFOR1VBR0UgICAgICAgICAgICAgICAgIiZTcHJhY2hlIgorCisjZGVmaW5lIE1FTlVfSEVMUCAgICAgICAgICAgICAgICAgICAgIiZIaWxmZSIKKyNkZWZpbmUgTUVOVV9IRUxQX0NPTlRFTlRTICAgICAgICAgICAiJkluaGFsdCIKKyNkZWZpbmUgTUVOVV9IRUxQX1NFQVJDSCAgICAgICAgICAgICAiJlN1Y2hlbi4uLiIKKyNkZWZpbmUgTUVOVV9IRUxQX0hFTFBfT05fSEVMUCAgICAgICAiJkhpbGZlIGJlbnV0emVuIgorCisjZGVmaW5lIE1FTlVfSU5GTyAgICAgICAgICAgICAgICAgICAgIkluZiZvLi4uIgorI2RlZmluZSBNRU5VX0lORk9fTElDRU5TRSAgICAgICAgICAgICImTGl6ZW56IgorI2RlZmluZSBNRU5VX0lORk9fTk9fV0FSUkFOVFkgICAgICAgICImS0VJTkUgR0FSQU5USUUiCisjZGVmaW5lIE1FTlVfSU5GT19BQk9VVF9XSU5FICAgICAgICAgIibcYmVyIFdJTkUiCisKKworLyogRGlhbG9ncyAqLworCisjZGVmaW5lIERJQUxPR19PSyAgICAgICAgICAgICAgICAgICAgIk9LIgorI2RlZmluZSBESUFMT0dfQ0FOQ0VMICAgICAgICAgICAgICAgICJBYmJyZWNoZW4iCisjZGVmaW5lIERJQUxPR19CUk9XU0UgICAgICAgICAgICAgICAgIiZEdXJjaHN1Y2hlbi4uLiIKKyNkZWZpbmUgRElBTE9HX0hFTFAgICAgICAgICAgICAgICAgICAiJkhpbGZlIgorCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfQ0FQVElPTiAgICAgIlNlaXRlIGVpbnJpY2h0ZW4iCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfSEVBRCAgICAgICAgIiZLb3BmemVpbGU6IgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX1RBSUwgICAgICAgICImRnXfemVpbGU6IgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0JPUkRFUlMgICAgICJS5G5kZXIiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfTEVGVCAgICAgICAgIiZMaW5rczoiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfUklHSFQgICAgICAgIiZSaWdodDoiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfVE9QICAgICAgICAgIiZPYmVuOiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9CT1RUT00gICAgICAiJlVudGVuOiIKKworCisvKiBTdHJpbmdzICovCisjZGVmaW5lIFNUUklOR19OT1RFUEFEICAgICAgICAgICAgICAgIkVkaXRvciIKKyNkZWZpbmUgU1RSSU5HX0VSUk9SICAgICAgICAgICAgICAgICAiRkVITEVSIgorI2RlZmluZSBTVFJJTkdfV0FSTklORyAgICAgICAgICAgICAgICJBQ0hUVU5HIgorI2RlZmluZSBTVFJJTkdfSU5GTyAgICAgICAgICAgICAgICAgICJJbmZvcm1hdGlvbiIKKworI2RlZmluZSBTVFJJTkdfVU5USVRMRUQgICAgICAgICAgICAgICIodW5iZW5hbm50KSIKKworI2RlZmluZSBTVFJJTkdfQUxMRklMRVMgICAgICAgICAgICAgICJBbGxlIERhdGVpZW4gKCouKikiCisjZGVmaW5lIFNUUklOR19URVhURklMRVMgICAgICAgICAgICAgIlRleHRkYXRlaWVuICgqLlRYVCkiCisKKyNkZWZpbmUgU1RSSU5HX1RPT0xBUkdFICAgICAgICInJXMnIGlzdCB6dSBncm9zcyBm/HIgZGVuIEVkaXRvclxuIFwKK0JlbnV0emVuIFNpZSBiaXR0ZSBlaW5lbiBhbmRlcmVuIEVkaXRvciwgdW0gZGllc2UgRGF0ZWkgenUgYmVhcmJlaXRlbi4iCisKKyNkZWZpbmUgU1RSSU5HX05PVEVYVCAgICAgICAgICJTaWUgaGFiZW4ga2VpbmVuIFRleHQgZWluZ2VnZWJlbiwgZGVyIFwKK2dlc3BlaWNoZXJ0XG4gd2VyZGVuIGv2bm50ZS4gR2ViZW4gU2llIFRleHQgZWluLCB1bmQgdmVyc3VjaGVuIFNpZSBlcyBcCitcbmVybmV1dC4iCisKKyNkZWZpbmUgU1RSSU5HX05PVEZPVU5EICAgICAgICInJXMnIGthbm4gbmljaHQgZ2VmdW5kZW4gd2VyZGVuLiIKKworI2RlZmluZSBTVFJJTkdfT1VUX09GX01FTU9SWSAgIk5pY2h0IGdlbvxnZW5kIEFyYmVpdHNzcGVpY2hlciwgXAordW0gZGllc2UgRnVua3Rpb24gXG5hYnp1c2NobGll32VuLiBCZWVuZGVuIFNpZSBlaW5lIG9kZXIgbWVocmVyZSBcCitcbkFud2VuZHVuZ2VuLCB1bSBkZW4gdmVyZvxnYmFyZW4gQXJiZWl0c3NwZWljaGVyIHp1IFxuZXJo9mhlbi4iCisKKwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9Fbi5yYyBiL3Byb2dyYW1zL25vdGVwYWQvRW4ucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhYjk4YQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvRW4ucmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIE5vdGVwYWQgKEVuZ2xpc2ggcmVzb3VyY2VzKQorICoKKyAqIENvcHlyaWdodCAxOTk3IE1hcmNlbCBCYXVyIDxtYmF1ckBnMjYuZXRoei5jaD4KKyAqIEZJWE1FOiBTZWUgVE9ETyBhYm91dCBob3cgdG8gZml4IHdlYWsgdHJhbnNsYXRpb25zLgorICovCisKKyNkZWZpbmUgTEFOR1VBR0VfSUQgICAgICAgICAgICAgICAgICBFbgorI2RlZmluZSBMQU5HVUFHRV9OVU1CRVIgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEFOR1VBR0VfTUVOVV9JVEVNICAgICAgICAgICAiJkVuZ2xpc2giCisKKy8qIE1lbnUgKi8KKworI2RlZmluZSBNRU5VX0ZJTEUgICAgICAgICAgICAgICAgICAgICImRmlsZSIKKyNkZWZpbmUgTUVOVV9GSUxFX05FVyAgICAgICAgICAgICAgICAiJk5ldy4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX09QRU4gICAgICAgICAgICAgICAiTyZwZW4iCisjZGVmaW5lIE1FTlVfRklMRV9TQVZFICAgICAgICAgICAgICAgIiZTYXZlIgorI2RlZmluZSBNRU5VX0ZJTEVfU0FWRUFTICAgICAgICAgICAgICImU2F2ZSBhcy4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX1BSSU5UICAgICAgICAgICAgICAiJlByaW50IgorI2RlZmluZSBNRU5VX0ZJTEVfUEFHRVNFVFVQICAgICAgICAgICJQYWdlIFNlJnR1cC4uLiIKKyNkZWZpbmUgTUVOVV9GSUxFX1BSSU5UU0VUVVAgICAgICAgICAiUCZyaW50ZXIgU2V0dXAuLi4iCisjZGVmaW5lIE1FTlVfRklMRV9FWElUICAgICAgICAgICAgICAgIiZFeGl0IgorCisjZGVmaW5lIE1FTlVfRURJVCAgICAgICAgICAgICAgICAgICAgIiZFZGl0IgorI2RlZmluZSBNRU5VX0VESVRfVU5ETyAgICAgICAgICAgICAgICImVW5kb1x0Q3RybCtaIgorI2RlZmluZSBNRU5VX0VESVRfQ1VUICAgICAgICAgICAgICAgICJDdSZ0XEN0cmwrWCIKKyNkZWZpbmUgTUVOVV9FRElUX0NPUFkgICAgICAgICAgICAgICAiJkNvcHlcdEN0cmwrQyIKKyNkZWZpbmUgTUVOVV9FRElUX1BBU1RFICAgICAgICAgICAgICAiJlBhc3RlXHRDdHJsK1YiCisjZGVmaW5lIE1FTlVfRURJVF9ERUxFVEUgICAgICAgICAgICAgIiZEZWxldGVcdERlbCIKKyNkZWZpbmUgTUVOVV9FRElUX1NFTEVDVEFMTCAgICAgICAgICAiU2VsZWN0ICZhbGwiCisjZGVmaW5lIE1FTlVfRURJVF9USU1FREFURSAgICAgICAgICAgIiZUaW1lL0RhdGVcdEY1IgorI2RlZmluZSBNRU5VX0VESVRfV1JBUCAgICAgICAgICAgICAgICImV3JhcCBsb25nIGxpbmVzIgorCisjZGVmaW5lIE1FTlVfU0VBUkNIICAgICAgICAgICAgICAgICAgIiZTZWFyY2giCisjZGVmaW5lIE1FTlVfU0VBUkNIX1NFQVJDSCAgICAgICAgICAgIlNlYXJjaC4uLiIKKyNkZWZpbmUgTUVOVV9TRUFSQ0hfTkVYVCAgICAgICAgICAgICAiJlNlYXJjaCBuZXh0XHRGMyIKKworI2RlZmluZSBNRU5VX0xBTkdVQUdFICAgICAgICAgICAgICAgICImTGFuZ3VhZ2UiCisKKyNkZWZpbmUgTUVOVV9IRUxQICAgICAgICAgICAgICAgICAgICAiJkhlbHAiCisjZGVmaW5lIE1FTlVfSEVMUF9DT05URU5UUyAgICAgICAgICAgIiZDb250ZW50cyIKKyNkZWZpbmUgTUVOVV9IRUxQX1NFQVJDSCAgICAgICAgICAgICAiJlNlYXJjaC4uLiIKKyNkZWZpbmUgTUVOVV9IRUxQX0hFTFBfT05fSEVMUCAgICAgICAiJkhlbHAgb24gaGVscCIKKworI2RlZmluZSBNRU5VX0lORk8gICAgICAgICAgICAgICAgICAgICJJbmYmby4uLiIKKyNkZWZpbmUgTUVOVV9JTkZPX0xJQ0VOU0UgICAgICAgICAgICAiJkxpY2Vuc2UiCisjZGVmaW5lIE1FTlVfSU5GT19OT19XQVJSQU5UWSAgICAgICAgIiZOTyBXQVJSQU5UWSIKKyNkZWZpbmUgTUVOVV9JTkZPX0FCT1VUX1dJTkUgICAgICAgICAiJkFib3V0IFdpbmUiCisKKy8qIERpYWxvZ3MgKi8KKworI2RlZmluZSBESUFMT0dfT0sgICAgICAgICAgICAgICAgICAgICJPSyIKKyNkZWZpbmUgRElBTE9HX0NBTkNFTCAgICAgICAgICAgICAgICAiQ2FuY2VsIgorI2RlZmluZSBESUFMT0dfQlJPV1NFICAgICAgICAgICAgICAgICImQnJvd3NlLi4uIgorI2RlZmluZSBESUFMT0dfSEVMUCAgICAgICAgICAgICAgICAgICImSGVscCIKKworI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0NBUFRJT04gICAgICJQYWdlIFNldHVwIgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0hFQUQgICAgICAgICImSGVhZGVyOiIKKyNkZWZpbmUgRElBTE9HX1BBR0VTRVRVUF9UQUlMICAgICAgICAiJkZvb3RlcjoiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfQk9SREVSICAgICAgIkJvcmRlcnM6IgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0xFRlQgICAgICAgICImTGVmdDoiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfUklHSFQgICAgICAgIiZSaWdodDoiCisjZGVmaW5lIERJQUxPR19QQUdFU0VUVVBfVE9QICAgICAgICAgIiZUb3A6IgorI2RlZmluZSBESUFMT0dfUEFHRVNFVFVQX0JPVFRPTSAgICAgICImQm90dG9tOiIKKworCisvKiBTdHJpbmdzICovCisjZGVmaW5lIFNUUklOR19OT1RFUEFEICAgICAgICAgICAgICAgIk5vdGVwYWQiCisjZGVmaW5lIFNUUklOR19FUlJPUiAgICAgICAgICAgICAgICAgIkVSUk9SIgorI2RlZmluZSBTVFJJTkdfV0FSTklORyAgICAgICAgICAgICAgICJXQVJOSU5HIgorI2RlZmluZSBTVFJJTkdfSU5GTyAgICAgICAgICAgICAgICAgICJJbmZvcm1hdGlvbiIKKworI2RlZmluZSBTVFJJTkdfVU5USVRMRUQgICAgICAgICAgICAgICIodW50aXRsZWQpIgorCisjZGVmaW5lIFNUUklOR19BTExGSUxFUyAgICAgICAgICAgICAgIkFsbCBmaWxlcyAoKi4qKSIKKyNkZWZpbmUgU1RSSU5HX1RFWFRGSUxFUyAgICAgICAgICAgICAiVGV4dCBmaWxlcyAoKi4qKSIKKworI2RlZmluZSBTVFJJTkdfVE9PTEFSR0UgICAgICAgICAiRmlsZSAnJXMnIGlzdCB0b28gbGFyZ2UgZm9yIG5vdGVwYWQuXG4gXAorUGxlYXNlIHVzZSBhIGRpZmZlcmVudCBlZGl0b3IuIgorCisjZGVmaW5lIFNUUklOR19OT1RFWFQgICAgICAgICAgICJZb3UgZGlkbid0IGVudGVyIGFueSB0ZXh0LiBcCitcblBsZWFzZSB0eXBlIHNvbWV0aGluZyBhbmQgdHJ5IGFnYWluIgorCisjZGVmaW5lIFNUUklOR19OT1RGT1VORCAgICAgICAgICInJXMnIGNhbiBub3QgYmUgZm91bmQuIgorCisjZGVmaW5lIFNUUklOR19PVVRfT0ZfTUVNT1JZICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGlzIFwKK3Rhc2suIFxuQ2xvc2Ugb25lIG9yIG1vcmUgYXBwbGljYXRpb25zIHRvIGluY3JlYXNlIHRoZSBhbW91bnQgb2YgXG5mcmVlIFwKK21lbW9yeS4iCisKKworCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL0xpY2Vuc2VfRW4uYyBiL3Byb2dyYW1zL25vdGVwYWQvTGljZW5zZV9Fbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzY2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9ub3RlcGFkL0xpY2Vuc2VfRW4uYwpAQCAtMCwwICsxLDQ4IEBACisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImxpY2Vuc2UuaCIKKworc3RhdGljIENIQVIgTGljZW5zZUNhcHRpb25fRW5bXSA9ICJMSUNFTlNFIjsKK3N0YXRpYyBDSEFSIExpY2Vuc2VfRW5bXSA9ICJcCitZb3UgbWF5IHdpdGhvdXQgY2hhcmdlLCByb3lhbHR5IG9yIG90aGVyIHBheW1lbnQsIGNvcHkgYW5kXAorIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgd29yayBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGlzIHdvcmtcCisgaW4gc291cmNlIG9yIGJpbmFyeSBmb3JtIHByb3ZpZGVkIHRoYXQ6ICgxKVwKKyB5b3UgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHRcCisgbm90aWNlOyAoMikgZmFpdGhmdWxseSByZXByb2R1Y2UgYWxsIHByaW9yIGNvcHlyaWdodCBub3RpY2VzXAorIGluY2x1ZGVkIGluIHRoZSBvcmlnaW5hbCB3b3JrICh5b3UgbWF5IGFsc28gYWRkIHlvdXIgb3duXAorIGNvcHlyaWdodCBub3RpY2UpOyBhbmQgKDMpIGFncmVlIHRvIGluZGVtbmlmeSBhbmQgaG9sZCBhbGwgcHJpb3JcCisgYXV0aG9ycywgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGxpY2Vuc29ycyBvZiB0aGUgd29yayBoYXJtbGVzc1wKKyBmcm9tIGFuZCBhZ2FpbnN0IGFsbCBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB1c2Ugb2YgdGhlIHdvcmsuXAorXG5cCitZb3UgbWF5IGRpc3RyaWJ1dGUgc291cmNlcyBvZiBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSB3b3JrXAorIHByb3ZpZGVkIHRoYXQgKDEpIChhKSBhbGwgc291cmNlIGZpbGVzIG9mIHRoZSBvcmlnaW5hbCB3b3JrIHRoYXRcCisgaGF2ZSBiZWVuIG1vZGlmaWVkLCAoYikgYWxsIHNvdXJjZSBmaWxlcyBvZiB0aGUgZGVyaXZhdGl2ZSB3b3JrXAorIHRoYXQgY29udGFpbiBhbnkgcGFydHkgb2YgdGhlIG9yaWdpbmFsIHdvcmssIGFuZCAoYykgYWxsIHNvdXJjZVwKKyBmaWxlcyBvZiB0aGUgZGVyaXZhdGl2ZSB3b3JrIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byBjb21waWxlLCBsaW5rXAorIGFuZCBydW4gdGhlIGRlcml2YXRpdmUgd29yayB3aXRob3V0IHVucmVzb2x2ZWQgZXh0ZXJuYWwgY2FsbHMgYW5kXAorIHdpdGggdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgb3JpZ2luYWwgd29yayAoXCJOZWNlc3NhcnlcCisgU291cmNlc1wiKSBjYXJyeSBhIHByb21pbmVudCBub3RpY2UgZXhwbGFpbmluZyB0aGUgbmF0dXJlIGFuZCBkYXRlXAorIG9mIHRoZSBtb2RpZmljYXRpb24gYW5kL29yIGNyZWF0aW9uLiAgWW91IGFyZSBlbmNvdXJhZ2VkIHRvIG1ha2VcCisgdGhlIE5lY2Vzc2FyeSBTb3VyY2VzIGF2YWlsYWJsZSB1bmRlciB0aGlzIGxpY2Vuc2UgaW4gb3JkZXIgdG9cCisgZnVydGhlciB0aGUgZGV2ZWxvcG1lbnQgYW5kIGFjY2VwdGFuY2Ugb2YgdGhlIHdvcmsuXAorXG5cCitFWENFUFQgQVMgT1RIRVJXSVNFIFJFU1RSSUNURUQgQlkgTEFXLCBUSElTIFdPUksgSVMgUFJPVklERURcCisgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQsIElOQ0xVRElOR1wKKyBCVVQgTk9UIExJTUlURUQgVE8sIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgRklUTkVTUyBGT1IgQVwKKyBQQVJUSUNVTEFSIFBVUlBPU0UsIE1FUkNIQU5UQUJJTElUWSBPUiBUSVRMRS4gIEVYQ0VQVCBBU1wKKyBPVEhFUldJU0UgUFJPVklERUQgQlkgTEFXLCBOTyBBVVRIT1IsIENPUFlSSUdIVCBIT0xERVIgT1JcCisgTElDRU5TT1IgU0hBTEwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUyBPRiBBTlkgS0lORCwgRVZFTiBJRlwKKyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuIjsKKworc3RhdGljIENIQVIgTm9XYXJyYW50eUNhcHRpb25fRW5bXSA9ICJOTyBXQVJSQU5UWSI7CitzdGF0aWMgQ0hBUiBOb1dhcnJhbnR5X0VuW10gPSAiXAorRVhDRVBUIEFTIE9USEVSV0lTRSBSRVNUUklDVEVEIEJZIExBVywgVEhJUyBXT1JLIElTIFBST1ZJREVEXAorIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTIE9GIEFOWSBLSU5ELCBJTkNMVURJTkdcCisgQlVUIE5PVCBMSU1JVEVEIFRPLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIEZJVE5FU1MgRk9SIEFcCisgUEFSVElDVUxBUiBQVVJQT1NFLCBNRVJDSEFOVEFCSUxJVFkgT1IgVElUTEUuICBFWENFUFQgQVNcCisgT1RIRVJXSVNFIFBST1ZJREVEIEJZIExBVywgTk8gQVVUSE9SLCBDT1BZUklHSFQgSE9MREVSIE9SXAorIExJQ0VOU09SIFNIQUxMIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMgT0YgQU5ZIEtJTkQsIEVWRU4gSUZcCisgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLiI7CisKK0xJQ0VOU0UgV2luZUxpY2Vuc2VfRW4gPSB7TGljZW5zZV9FbiwgTGljZW5zZUNhcHRpb25fRW4sCisJCQkgIE5vV2FycmFudHlfRW4sIE5vV2FycmFudHlDYXB0aW9uX0VufTsKKwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9NYWtlZmlsZS5pbiBiL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhODNkNgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw0NyBAQAorREVGUyAgICAgID0gLURXSU5FTElCCitUT1BTUkNESVIgPSBAdG9wX3NyY2RpckAKK1RPUE9CSkRJUiA9IC4uLy4uCitTUkNESVIgICAgPSBAc3JjZGlyQAorVlBBVEggICAgID0gQHNyY2RpckAKK01PRFVMRSAgICA9IG5vbmUKK1BST0dSQU1TICA9IG5vdGVwYWQKK0FMTF9MSUJTICA9ICQoV0lORUxJQikgJChYX0xJQlMpICQoWFBNX0xJQikgJChYTElCKSAkKExETElCUykKK1JDRkxBR1MgICA9IC13MzIgLWgKKworTEFOR1VBR0VTICAgPSBFbiBEZQorTElDRU5TRUxBTkcgPSBFbgorCitNT1NUU1JDUyA9IFwKKwlsaWNlbnNlLmMgXAorCW5vdGVwYWQuYworCisjIFNvbWUgc3RyaW5ncyBuZWVkIGFkZHJlc3NlcyA+PSAweDEwMDAwCitTVFJJTkdTUkNTID0gXAorCSQoTElDRU5TRUxBTkc6JT1MaWNlbnNlXyUuYykKKworUkNfU1JDUyA9IFwKKwlub3RlcGFkLnJjIFwKKwkkKExBTkdVQUdFUzolPSUucmMpCisKK0NfU1JDUyA9ICQoTU9TVFNSQ1MpICQoU1RSSU5HU1JDUykKKworTU9TVE9CSlMgPSAkKE1PU1RTUkNTOi5jPS5vKQorU1RSSU5HT0JKUyA9ICQoU1RSSU5HU1JDUzouYz0ubykgJChSQ19TUkNTOi5yYz0ubykKKworYWxsOiBjaGVja193aW5lcmMgJChQUk9HUkFNUykKKworZGVwZW5kOjogJChSQ19TUkNTOi5yYz0uaCkKKworQE1BS0VfUlVMRVNACisKK25vdGVwYWQ6ICQoTU9TVE9CSlMpICQoU1RSSU5HT0JKUykKKwkkKENDKSAtbyBub3RlcGFkICQoTU9TVE9CSlMpICQoTERPUFRJT05TKSAkKEFMTF9MSUJTKSAkKFNUUklOR09CSlMpCisKK2luc3RhbGw6IGR1bW15CisJJChJTlNUQUxMX1BST0dSQU0pIG5vdGVwYWQgJChiaW5kaXIpL25vdGVwYWQKKworJChSQ19TUkNTOi5yYz0uYykgJChSQ19TUkNTOi5yYz0uaCk6ICQoV0lORVJDKQorCitkdW1teToKKworIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL3Byb2dyYW1zL25vdGVwYWQvUkVBRE1FIGIvcHJvZ3JhbXMvbm90ZXBhZC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUwM2VhOQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvUkVBRE1FCkBAIC0wLDAgKzEsMTkgQEAKKworTk9URVBBRCBmb3IgV0lORQorPT09PT09PT09PT09PT09PQorCitUaGlzIGlzIGFuIGVhcmx5IHJlbGVhc2Ugb2Ygbm90ZXBhZCBhbmQgbW9zdCBvZiB0aGUgY29kZSBpcyBzdGlsbCAKK2Jyb2tlbi4gSXQgd2lsbCBwcm9iYWJseSBjb21waWxlIGJ1dCB0aGUgYXBwbGljYXRpb24gd2lsbCBub3QgbWFrZQorbXVjaCBzZW5zZSB5ZXQuCisKK1BsZWFzZSBzZWUgZmlsZSBUT0RPIGZvciB0aGluZ3MgdG8gZG8gYW5kIGtlZXAgdGhlIGZpbGUgQ2hhbmdlTG9nCit1cCB0byBkYXRlLgorCitDb2RlIGlzIGN1cnJlbnRseSB1bmRlciBoZWF2eSBjb25zdHJ1Y3Rpb24uIE5lYXJseSBhbGwgZmlsZXMgd2lsbCAKK2NoYW5nZSB1bnRpbCBuZXh0IHJlbGVhc2UuIFlvdSBjYW4gc3BlZWQgdXAgZGV2ZWxvcG1lbnQgb2Ygbm90ZXBhZAoraWYgeW91IHNlbmQgcGF0Y2hlcyBhbmQgYWRkaXRpb25zIGRpcmVjdGx5IHRvIG15IHBlcnNvbmFsIGVtYWlsIAorYWRkcmVzcyA8bWJhdXJAZzI2LmV0aHouY2g+LgorCitJIGFsc28gdHJ5IHRvIHJlYWQgbmV3czpjb21wLmVtdWxhdG9ycy5tcy13aW5kb3dzLndpbmUgZnJlcXVlbnRseSwgCitzbyBJIGNhbiBhbHNvIGludGVncmF0ZSBwYXRjaGVzIHBvc3RlZCB2aWEgdXNlbmV0LgorCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL1RPRE8gYi9wcm9ncmFtcy9ub3RlcGFkL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkMjhiNAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvVE9ETwpAQCAtMCwwICsxLDggQEAKKworIC0gRW4ucmMgaXMgdHJhbnNsYXRlZCBmcm9tIGdlcm1hbiB2ZXJzaW9uIG9mIE5vdGVwYWQuIAorICAgSSBkb24ndCBrbm93IHdoYXQgdGhlIHJlYWwgc3RyaW5ncyBhcmUsIGFzIEkgZG8gbm90IGhhdmUgYW4gZW5nbGlzaAorICAgY29weSBvZiBOb3RlcGFkLiBQbGVhc2UgY2hlY2sgc3RyaW5ncyBpbiBFbi5yYyBhbmQgc3VibWl0IGNvcnJlY3Rpb25zLgorCisgLSBjcmVhdGUgbmV3ICoucmMgZmlsZXMgZm9yIGFsbCBsYW5ndWFnZXMgeW91IGtub3cuCisKKwpkaWZmIC0tZ2l0IGEvcHJvZ3JhbXMvbm90ZXBhZC9saWNlbnNlLmMgYi9wcm9ncmFtcy9ub3RlcGFkL2xpY2Vuc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWUzNmUxCi0tLSAvZGV2L251bGwKKysrIGIvcHJvZ3JhbXMvbm90ZXBhZC9saWNlbnNlLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIE5vdGVwYWQgKGxpY2Vuc2UuaCkKKyAqLworCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImxpY2Vuc2UuaCIKKworc3RhdGljIExJQ0VOU0UqIFNlbGVjdExhbmd1YWdlKExQQ1NUUiBMYW5ndWFnZSkKK3sKKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJDeiIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0N6KTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJEYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0RhKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJEZSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0RlKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJFbiIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VuKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJFbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VvKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJFcyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0VzKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJGaSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0ZpKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJGciIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0ZyKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJIdSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0h1KTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJJdCIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0l0KTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ2F1Z2UsICJLbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX0tvKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJObyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX05vKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJQbCIpKSByZXR1cm4oJldpbmVMaWNlbnNlX1BsKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJQbyIpKSByZXR1cm4oJldpbmVMaWNlbnNlX1BvKTsgKi8KKy8qICBpZiAoIWxzdHJjbXAoTGFuZ3VhZ2UsICJWYSIpKSByZXR1cm4oJldpbmVMaWNlbnNlX1ZhKTsgKi8KKyAgcmV0dXJuKCZXaW5lTGljZW5zZV9Fbik7Cit9CisKKworVk9JRCBXaW5lTGljZW5zZShIV05EIFduZCwgTFBDU1RSIExhbmd1YWdlKQoreworICBMSUNFTlNFICpMaWNlbnNlID0gU2VsZWN0TGFuZ3VhZ2UoTGFuZ3VhZ2UpOworCisgIE1lc3NhZ2VCb3goV25kLCBMaWNlbnNlLT5MaWNlbnNlLCBMaWNlbnNlLT5MaWNlbnNlQ2FwdGlvbiwKKwkgICAgIE1CX0lDT05JTkZPUk1BVElPTiB8IE1CX09LKTsKK30KKworCitWT0lEIFdpbmVXYXJyYW50eShIV05EIFduZCwgTFBDU1RSIExhbmd1YWdlKQoreworICBMSUNFTlNFICpMaWNlbnNlID0gU2VsZWN0TGFuZ3VhZ2UoTGFuZ3VhZ2UpOworCisgIE1lc3NhZ2VCb3goV25kLCBMaWNlbnNlLT5XYXJyYW50eSwgTGljZW5zZS0+V2FycmFudHlDYXB0aW9uLAorCSAgICAgTUJfSUNPTkVYQ0xBTUFUSU9OIHwgTUJfT0spOworfQorCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL2xpY2Vuc2UuaCBiL3Byb2dyYW1zL25vdGVwYWQvbGljZW5zZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTFlOGQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9ncmFtcy9ub3RlcGFkL2xpY2Vuc2UuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogTm90ZXBhZCAobGljZW5zZS5oKQorICovCisKK1ZPSUQgV2luZUxpY2Vuc2UoSFdORCBoV25kLCBMUENTVFIgbHBzekxhbmd1YWdlKTsKK1ZPSUQgV2luZVdhcnJhbnR5KEhXTkQgaFduZCwgTFBDU1RSIGxhbmd1YWdlKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgTFBDU1RSIExpY2Vuc2UsIExpY2Vuc2VDYXB0aW9uOworICBMUENTVFIgV2FycmFudHksIFdhcnJhbnR5Q2FwdGlvbjsKK30gTElDRU5TRTsKKworLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfQ3o7ICovCisvKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9EYTsgKi8KKy8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0RlOyAqLworZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRW47CisvKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9FbzsgKi8KKy8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0VzOyAqLworLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfRmk7ICovCisvKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9GcjsgKi8KKy8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX0h1OyAqLworLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfSXQ7ICovCisvKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9LbzsgKi8KKy8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX05vOyAqLworLyogZXh0ZXJuIExJQ0VOU0UgV2luZUxpY2Vuc2VfUGw7ICovCisvKiBleHRlcm4gTElDRU5TRSBXaW5lTGljZW5zZV9QbzsgKi8KKy8qIGV4dGVybiBMSUNFTlNFIFdpbmVMaWNlbnNlX1ZhOyAqLworCmRpZmYgLS1naXQgYS9wcm9ncmFtcy9ub3RlcGFkL25vdGVwYWQucmMgYi9wcm9ncmFtcy9ub3RlcGFkL25vdGVwYWQucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3OWFmNQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2dyYW1zL25vdGVwYWQvbm90ZXBhZC5yYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogTm90ZXBhZCAobm90ZXBhZC5yYykKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CisgKi8KKworI2RlZmluZSBDT05DQVQoYSwgYikgYSMjYgorCisvKiBNYWluIE1lbnUgKi8KKworQ09OQ0FUKE1FTlVfLCBMQU5HVUFHRV9JRCkgTUVOVQoreworIFBPUFVQIE1FTlVfRklMRSB7CisgICBNRU5VSVRFTSBNRU5VX0ZJTEVfTkVXLCAgICAgICAgICAgICAgTlBfTkVXIAorICAgTUVOVUlURU0gTUVOVV9GSUxFX09QRU4sICAgICAgICAgICAgIE5QX09QRU4KKyAgIE1FTlVJVEVNIE1FTlVfRklMRV9TQVZFLCAgICAgICAgICAgICBOUF9TQVZFCisgICBNRU5VSVRFTSBNRU5VX0ZJTEVfU0FWRUFTLCAgICAgICAgICAgTlBfU0FWRUFTCisgICBNRU5VSVRFTSBNRU5VX0ZJTEVfUFJJTlQsICAgICAgICAgICAgTlBfUFJJTlQKKyAgIE1FTlVJVEVNIE1FTlVfRklMRV9QQUdFU0VUVVAsICAgICAgICBOUF9QQUdFU0VUVVAKKyAgIE1FTlVJVEVNIE1FTlVfRklMRV9QUklOVFNFVFVQLCAgICAgICBOUF9QUklOVFNFVFVQCisgICBNRU5VSVRFTSBTRVBBUkFUT1IgICAKKyAgIE1FTlVJVEVNIE1FTlVfRklMRV9FWElULCAgICAgICAgICAgICBOUF9FWElUCisgfQorIFBPUFVQIE1FTlVfRURJVCB7CisgICBNRU5VSVRFTSBNRU5VX0VESVRfVU5ETywgICAgICAgICAgICAgTlBfRURJVF9VTkRPCisgICBNRU5VSVRFTSBTRVBBUkFUT1IKKyAgIE1FTlVJVEVNIE1FTlVfRURJVF9DVVQsICAgICAgICAgICAgICBOUF9FRElUX0NVVCwgICAgIEdSQVlFRAorICAgTUVOVUlURU0gTUVOVV9FRElUX0NPUFksICAgICAgICAgICAgIE5QX0VESVRfQ09QWSwgICAgR1JBWUVECisgICBNRU5VSVRFTSBNRU5VX0VESVRfUEFTVEUsICAgICAgICAgICAgTlBfRURJVF9QQVNURSwgICBHUkFZRUQKKyAgIE1FTlVJVEVNIE1FTlVfRURJVF9ERUxFVEUsICAgICAgICAgICBOUF9FRElUX0RFTEVURSwgIEdSQVlFRAorICAgTUVOVUlURU0gU0VQQVJBVE9SCisgICBNRU5VSVRFTSBNRU5VX0VESVRfU0VMRUNUQUxMLCAgICAgICAgTlBfRURJVF9TRUxFQ1RBTEwKKyAgIE1FTlVJVEVNIE1FTlVfRURJVF9USU1FREFURSwgICAgICAgICBOUF9FRElUX1RJTUVEQVRFCisgICBNRU5VSVRFTSBTRVBBUkFUT1IKKyAgIE1FTlVJVEVNIE1FTlVfRURJVF9XUkFQLCAgICAgICAgICAgICBOUF9FRElUX1dSQVAKKyB9CisgUE9QVVAgTUVOVV9TRUFSQ0ggeworICAgTUVOVUlURU0gTUVOVV9TRUFSQ0hfU0VBUkNILCAgICAgICAgIE5QX1NFQVJDSF9TRUFSQ0gKKyAgIE1FTlVJVEVNIE1FTlVfU0VBUkNIX05FWFQsICAgICAgICAgICBOUF9TRUFSQ0hfTkVYVAorIH0KKyBQT1BVUCBNRU5VX0xBTkdVQUdFIHsKKyAgIC8qIER1bW15IGl0ZW0sIHdpbGwgYmUgcmVtb3ZlZCAqLworICAgTUVOVUlURU0gU0VQQVJBVE9SCisgfQorIFBPUFVQIE1FTlVfSEVMUCB7CisgICBNRU5VSVRFTSBNRU5VX0hFTFBfQ09OVEVOVFMsICAgICAgICAgUE1fQ09OVEVOVFMKKyAgIE1FTlVJVEVNIE1FTlVfSEVMUF9TRUFSQ0gsICAgICAgICAgICBQTV9TRUFSQ0gKKyAgIE1FTlVJVEVNIE1FTlVfSEVMUF9IRUxQX09OX0hFTFAsICAgICBQTV9IRUxQT05IRUxQCisgICBNRU5VSVRFTSBTRVBBUkFUT1IKKworIFBPUFVQIE1FTlVfSU5GTyB7CisgICBNRU5VSVRFTSBNRU5VX0lORk9fTElDRU5TRSwgICAgICAgIFBNX0xJQ0VOU0UKKyAgIE1FTlVJVEVNIE1FTlVfSU5GT19OT19XQVJSQU5UWSwgICAgUE1fTk9fV0FSUkFOVFkKKyAgIE1FTlVJVEVNIE1FTlVfSU5GT19BQk9VVF9XSU5FLCAgICAgUE1fQUJPVVRfV0lORQorICB9Cit9Cit9CisKZGlmZiAtLWdpdCBhL3JjL3dpbmVyYy5jIGIvcmMvd2luZXJjLmMKaW5kZXggZWE4YWE2NS4uMDU4MzQzYiAxMDA2NDQKLS0tIGEvcmMvd2luZXJjLmMKKysrIGIvcmMvd2luZXJjLmMKQEAgLTgsNyArOCw3IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CmRpZmYgLS1naXQgYS9yZWxheTMyL01ha2VmaWxlLmluIGIvcmVsYXkzMi9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDYwM2U2Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsYXkzMi9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDYzIEBACitERUZTICAgICAgPSBARExMRkxBR1NAIC1EX19XSU5FX18KK1RPUFNSQ0RJUiA9IEB0b3Bfc3JjZGlyQAorVE9QT0JKRElSID0gLi4KK1NSQ0RJUiAgICA9IEBzcmNkaXJACitWUEFUSCAgICAgPSBAc3JjZGlyQAorTU9EVUxFICAgID0gcmVsYXkzMgorCitETExTID0gXAorCWFkdmFwaTMyLnNwZWMgXAorCWNvbWN0bDMyLnNwZWMgXAorCWNvbWRsZzMyLnNwZWMgXAorCWNydGRsbC5zcGVjIFwKKwlkY2ltYW4zMi5zcGVjIFwKKwlnZGkzMi5zcGVjIFwKKwlrZXJuZWwzMi5zcGVjIFwKKwlsejMyLnNwZWMgXAorCW1wci5zcGVjIFwKKwltc3ZmdzMyLnNwZWMgXAorCW50ZGxsLnNwZWMgXAorCW9sZTMyLnNwZWMgXAorCW9sZWNsaTMyLnNwZWMgXAorCW9sZXN2cjMyLnNwZWMgXAorCXNoZWxsMzIuc3BlYyBcCisJdGFwaTMyLnNwZWMgXAorCXVzZXIzMi5zcGVjIFwKKwl2ZXJzaW9uLnNwZWMgXAorCXczMnNrcm5sLnNwZWMgXAorCXdpbm1tLnNwZWMgXAorCXdpbnNwb29sLnNwZWMgXAorCXdvdzMyLnNwZWMgXAorCXdzb2NrMzIuc3BlYworCitDX1NSQ1MgPSBcCisJYnVpbHRpbjMyLmMgXAorCXJlbGF5Mzg2LmMKKworU1BFQ19GSUxFUyA9ICQoRExMUzouc3BlYz0uYykKKworRVhUUkFfT0JKUyA9ICQoRExMUzouc3BlYz0ubykKKworR0VOX0FTTV9TUkNTID0gXAorCWNhbGwzMi5zCisKKy5TVUZGSVhFUzogLnNwZWMKKworLnNwZWMuYzoKKwkkKEJVSUxEKSAtbyAkQCAtc3BlYyAkPAorCithbGw6IGNoZWNrYnVpbGQgJChNT0RVTEUpLm8KKworQE1BS0VfUlVMRVNACisKKyQoU1BFQ19GSUxFUyk6ICQoQlVJTEQpCisKKyQoRVhUUkFfT0JKUyk6ICQoVE9QU1JDRElSKS9pbmNsdWRlL2J1aWx0aW4zMi5oCisKK2NhbGwzMi5zOiAkKEJVSUxEKQorCSQoQlVJTEQpIC1vICRAIC1jYWxsMzIKKworY2xlYW46OgorCSQoUk0pICQoU1BFQ19GSUxFUykKKworIyMjIERlcGVuZGVuY2llczoKZGlmZiAtLWdpdCBhL2lmMTYzMi9hZHZhcGkzMi5zcGVjIGIvcmVsYXkzMi9hZHZhcGkzMi5zcGVjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpZjE2MzIvYWR2YXBpMzIuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi9hZHZhcGkzMi5zcGVjCmRpZmYgLS1naXQgYS9yZWxheTMyL2J1aWx0aW4zMi5jIGIvcmVsYXkzMi9idWlsdGluMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmRmM2ViCi0tLSAvZGV2L251bGwKKysrIGIvcmVsYXkzMi9idWlsdGluMzIuYwpAQCAtMCwwICsxLDM3OSBAQAorLyoKKyAqIFdpbjMyIGJ1aWx0aW4gZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTcgQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiYnVpbHRpbjMyLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAidGFzay5oIgorI2luY2x1ZGUgInByb2Nlc3MuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURSAgY2FsbDsgICAgICAgICAgICAgICAgICAgIC8qIDB4ZTggY2FsbCBjYWxsZnJvbTMyIChyZWxhdGl2ZSkgKi8KKyAgICBEV09SRCBjYWxsZnJvbTMyIFdJTkVfUEFDS0VEOyAgLyogUkVMQVlfQ2FsbEZyb20zMiByZWxhdGl2ZSBhZGRyICovCisgICAgQllURSAgcmV0OyAgICAgICAgICAgICAgICAgICAgIC8qIDB4YzIgcmV0ICRuICBvciAgMHhjMyByZXQgKi8KKyAgICBXT1JEICBhcmdzOyAgICAgICAgICAgICAgICAgICAgLyogbmIgb2YgYXJncyB0byByZW1vdmUgZnJvbSB0aGUgc3RhY2sgKi8KK30gREVCVUdfRU5UUllfUE9JTlQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgQllURSAgcHVzaGw7ICAgICAgICAgICAgICAgICAgIC8qIDB4NjggcHVzaGwgJGZ1bmNfdG9fY2FsbCAqLworICAgIERXT1JEIGZ1bmMgV0lORV9QQUNLRUQ7ICAgICAgICAvKiBmdW5jIHRvIGNhbGwgKi8KKyAgICBCWVRFICBqbXA7ICAgICAgICAgICAgICAgICAgICAgLyogMHhlOSBqbXAgQ0FMTDMyX1JlZ3MgKHJlbGF0aXZlKSAqLworICAgIERXT1JEIGNhbGwzMl9yZWdzIFdJTkVfUEFDS0VEOyAvKiBDQUxMMzJfUmVncyByZWxhdGl2ZSBhZGRyICovCisgICAgV09SRCAgbm9wOyAgICAgICAgICAgICAgICAgICAgIC8qIDB4OTA5MCBub3A7bm9wICovCit9IFJFR19FTlRSWV9QT0lOVDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiAqZGVzY3I7ICAgICAvKiBETEwgZGVzY3JpcHRvciAqLworICAgIERFQlVHX0VOVFJZX1BPSU5UICAgICAgICAgICpkYmdfZnVuY3M7IC8qIFJlbGF5IGRlYnVnZ2luZyBmdW5jdGlvbnMgdGFibGUqLworICAgIEJPT0wzMiAgICAgICAgICAgICAgICAgICAgICB1c2VkOyAgICAgIC8qIFVzZWQgYnkgZGVmYXVsdCAqLworfSBCVUlMVElOMzJfRExMOworCisKK2V4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBBRFZBUEkzMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIENPTUNUTDMyX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgQ09NRExHMzJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBDUlRETExfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBEQ0lNQU4zMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIEdESTMyX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgS0VSTkVMMzJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBMWjMyX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgTVBSX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgTVNWRlczMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIE5URExMX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgT0xFMzJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBPTEVDTEkzMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIE9MRVNWUjMyX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgU0hFTEwzMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIFRBUEkzMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIFVTRVIzMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIFZFUlNJT05fRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBXMzJTS1JOTF9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIFdJTk1NX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgV0lOU1BPT0xfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiBXT1czMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IEJVSUxUSU4zMl9ERVNDUklQVE9SIFdTT0NLMzJfRGVzY3JpcHRvcjsKKworc3RhdGljIEJVSUxUSU4zMl9ETEwgQnVpbHRpbkRMTHNbXSA9Cit7CisgICAgeyAmQURWQVBJMzJfRGVzY3JpcHRvciwgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZDT01DVEwzMl9EZXNjcmlwdG9yLCBOVUxMLCBGQUxTRSB9LAorICAgIHsgJkNPTURMRzMyX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCisgICAgeyAmQ1JURExMX0Rlc2NyaXB0b3IsICAgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZEQ0lNQU4zMl9EZXNjcmlwdG9yLCBOVUxMLCBUUlVFICB9LAorICAgIHsgJkdESTMyX0Rlc2NyaXB0b3IsICAgIE5VTEwsIFRSVUUgIH0sCisgICAgeyAmS0VSTkVMMzJfRGVzY3JpcHRvciwgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZMWjMyX0Rlc2NyaXB0b3IsICAgICBOVUxMLCBUUlVFICB9LAorICAgIHsgJk1QUl9EZXNjcmlwdG9yLCAgICAgIE5VTEwsIFRSVUUgIH0sCisgICAgeyAmTVNWRlczMl9EZXNjcmlwdG9yLCAgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZOVERMTF9EZXNjcmlwdG9yLCAgICBOVUxMLCBUUlVFICB9LAorICAgIHsgJk9MRTMyX0Rlc2NyaXB0b3IsICAgIE5VTEwsIEZBTFNFIH0sCisgICAgeyAmT0xFQ0xJMzJfRGVzY3JpcHRvciwgTlVMTCwgRkFMU0UgfSwKKyAgICB7ICZPTEVTVlIzMl9EZXNjcmlwdG9yLCBOVUxMLCBGQUxTRSB9LAorICAgIHsgJlNIRUxMMzJfRGVzY3JpcHRvciwgIE5VTEwsIFRSVUUgIH0sCisgICAgeyAmVEFQSTMyX0Rlc2NyaXB0b3IsICAgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZVU0VSMzJfRGVzY3JpcHRvciwgICBOVUxMLCBUUlVFICB9LAorICAgIHsgJlZFUlNJT05fRGVzY3JpcHRvciwgIE5VTEwsIFRSVUUgIH0sCisgICAgeyAmVzMyU0tSTkxfRGVzY3JpcHRvciwgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZXSU5NTV9EZXNjcmlwdG9yLCAgICBOVUxMLCBUUlVFICB9LAorICAgIHsgJldJTlNQT09MX0Rlc2NyaXB0b3IsIE5VTEwsIFRSVUUgIH0sCisgICAgeyAmV09XMzJfRGVzY3JpcHRvciwgICAgTlVMTCwgVFJVRSAgfSwKKyAgICB7ICZXU09DSzMyX0Rlc2NyaXB0b3IsICBOVUxMLCBUUlVFICB9LAorICAgIC8qIExhc3QgZW50cnkgKi8KKyAgICB7IE5VTEwsIE5VTEwsIEZBTFNFIH0KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQlVJTFRJTjMyX0RvTG9hZE1vZHVsZQorICoKKyAqIExvYWQgYSBidWlsdC1pbiBXaW4zMiBtb2R1bGUuIEhlbHBlciBmdW5jdGlvbiBmb3IgQlVJTFRJTjMyX0xvYWRNb2R1bGUuCisgKi8KK3N0YXRpYyBITU9EVUxFMzIgQlVJTFRJTjMyX0RvTG9hZE1vZHVsZSggQlVJTFRJTjMyX0RMTCAqZGxsICkKK3sKKyAgICBleHRlcm4gdm9pZCBSRUxBWV9DYWxsRnJvbTMyKCk7CisgICAgZXh0ZXJuIHZvaWQgQ0FMTDMyX1JlZ3MoKTsKKworICAgIEhNT0RVTEUxNiBoTW9kdWxlOworICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKKyAgICBPRlNUUlVDVCBvZnM7CisgICAgSU1BR0VfREFUQV9ESVJFQ1RPUlkgKmRpcjsKKyAgICBJTUFHRV9ET1NfSEVBREVSICpkb3M7CisgICAgSU1BR0VfTlRfSEVBREVSUyAqbnQ7CisgICAgSU1BR0VfU0VDVElPTl9IRUFERVIgKnNlYzsKKyAgICBJTUFHRV9FWFBPUlRfRElSRUNUT1JZICpleHA7CisgICAgTFBWT0lEICpmdW5jczsKKyAgICBMUFNUUiAqbmFtZXM7CisgICAgREVCVUdfRU5UUllfUE9JTlQgKmRlYnVnOworICAgIFJFR19FTlRSWV9QT0lOVCAqcmVnczsKKyAgICBQRV9NT0RSRUYgKnBlbTsKKyAgICBJTlQzMiBpLCBzaXplOworICAgIEJZVEUgKmFkZHI7CisKKyAgICAvKiBBbGxvY2F0ZSB0aGUgbW9kdWxlICovCisKKyAgICBzaXplID0gKHNpemVvZihJTUFHRV9ET1NfSEVBREVSKQorICAgICAgICAgICAgKyBzaXplb2YoSU1BR0VfTlRfSEVBREVSUykKKyAgICAgICAgICAgICsgMiAqIHNpemVvZihJTUFHRV9TRUNUSU9OX0hFQURFUikKKyAgICAgICAgICAgICsgc2l6ZW9mKElNQUdFX0VYUE9SVF9ESVJFQ1RPUlkpCisgICAgICAgICAgICArIGRsbC0+ZGVzY3ItPm5iX2Z1bmNzICogc2l6ZW9mKExQVk9JRCkKKyAgICAgICAgICAgICsgZGxsLT5kZXNjci0+bmJfbmFtZXMgKiBzaXplb2YoTFBTVFIpCisgICAgICAgICAgICArIGRsbC0+ZGVzY3ItPm5iX3JlZ19mdW5jcyAqIHNpemVvZihSRUdfRU5UUllfUE9JTlQpKTsKKyNpZmRlZiBfX2kzODZfXworICAgIGlmIChkZWJ1Z2dpbmdfcmVsYXkpCisgICAgICAgIHNpemUgKz0gZGxsLT5kZXNjci0+bmJfZnVuY3MgKiBzaXplb2YoREVCVUdfRU5UUllfUE9JTlQpOworI2VuZGlmCisgICAgYWRkciAgPSBWaXJ0dWFsQWxsb2MoIE5VTEwsIHNpemUsIE1FTV9DT01NSVQsIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUgKTsKKyAgICBpZiAoIWFkZHIpIHJldHVybiAwOworICAgIGRvcyAgID0gKElNQUdFX0RPU19IRUFERVIgKilhZGRyOworICAgIG50ICAgID0gKElNQUdFX05UX0hFQURFUlMgKikoZG9zICsgMSk7CisgICAgc2VjICAgPSAoSU1BR0VfU0VDVElPTl9IRUFERVIgKikobnQgKyAxKTsKKyAgICBleHAgICA9IChJTUFHRV9FWFBPUlRfRElSRUNUT1JZICopKHNlYyArIDIpOworICAgIGZ1bmNzID0gKExQVk9JRCAqKShleHAgKyAxKTsKKyAgICBuYW1lcyA9IChMUFNUUiAqKShmdW5jcyArIGRsbC0+ZGVzY3ItPm5iX2Z1bmNzKTsKKyAgICByZWdzICA9IChSRUdfRU5UUllfUE9JTlQgKikobmFtZXMgKyBkbGwtPmRlc2NyLT5uYl9uYW1lcyk7CisgICAgZGVidWcgPSAoREVCVUdfRU5UUllfUE9JTlQgKikocmVncyArIGRsbC0+ZGVzY3ItPm5iX3JlZ19mdW5jcyk7CisKKyAgICAvKiBCdWlsZCB0aGUgRE9TIGFuZCBOVCBoZWFkZXJzICovCisKKyAgICBkb3MtPmVfbWFnaWMgID0gSU1BR0VfRE9TX1NJR05BVFVSRTsKKyAgICBkb3MtPmVfbGZhbmV3ID0gc2l6ZW9mKCpkb3MpOworCisgICAgbnQtPlNpZ25hdHVyZSAgICAgICAgICAgICAgICAgICAgICAgPSBJTUFHRV9OVF9TSUdOQVRVUkU7CisgICAgbnQtPkZpbGVIZWFkZXIuTWFjaGluZSAgICAgICAgICAgICAgPSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NjsKKyAgICBudC0+RmlsZUhlYWRlci5OdW1iZXJPZlNlY3Rpb25zICAgICA9IDI7ICAvKiBleHBvcnRzICsgY29kZSAqLworICAgIG50LT5GaWxlSGVhZGVyLlNpemVPZk9wdGlvbmFsSGVhZGVyID0gc2l6ZW9mKG50LT5PcHRpb25hbEhlYWRlcik7CisgICAgbnQtPkZpbGVIZWFkZXIuQ2hhcmFjdGVyaXN0aWNzICAgICAgPSBJTUFHRV9GSUxFX0RMTDsKKworICAgIG50LT5PcHRpb25hbEhlYWRlci5NYWdpYyA9IElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQzsKKyAgICBudC0+T3B0aW9uYWxIZWFkZXIuU2l6ZU9mQ29kZSAgICAgICAgICAgICAgICAgID0gMHgxMDAwOworICAgIG50LT5PcHRpb25hbEhlYWRlci5TaXplT2ZJbml0aWFsaXplZERhdGEgICAgICAgPSAwOworICAgIG50LT5PcHRpb25hbEhlYWRlci5TaXplT2ZVbmluaXRpYWxpemVkRGF0YSAgICAgPSAwOworICAgIG50LT5PcHRpb25hbEhlYWRlci5JbWFnZUJhc2UgICAgICAgICAgICAgICAgICAgPSAoRFdPUkQpYWRkcjsKKyAgICBudC0+T3B0aW9uYWxIZWFkZXIuU2VjdGlvbkFsaWdubWVudCAgICAgICAgICAgID0gMHgxMDAwOworICAgIG50LT5PcHRpb25hbEhlYWRlci5GaWxlQWxpZ25tZW50ICAgICAgICAgICAgICAgPSAweDEwMDA7CisgICAgbnQtPk9wdGlvbmFsSGVhZGVyLk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9IDE7CisgICAgbnQtPk9wdGlvbmFsSGVhZGVyLk1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9IDA7CisgICAgbnQtPk9wdGlvbmFsSGVhZGVyLk1ham9yU3Vic3lzdGVtVmVyc2lvbiAgICAgICA9IDQ7CisgICAgbnQtPk9wdGlvbmFsSGVhZGVyLk1pbm9yU3Vic3lzdGVtVmVyc2lvbiAgICAgICA9IDA7CisgICAgbnQtPk9wdGlvbmFsSGVhZGVyLlNpemVPZkltYWdlICAgICAgICAgICAgICAgICA9IHNpemU7CisgICAgbnQtPk9wdGlvbmFsSGVhZGVyLlNpemVPZkhlYWRlcnMgICAgICAgICAgICAgICA9IChCWVRFICopZXhwIC0gYWRkcjsKKyAgICBudC0+T3B0aW9uYWxIZWFkZXIuTnVtYmVyT2ZSdmFBbmRTaXplcyA9IElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTOworCisgICAgLyogQnVpbGQgdGhlIGV4cG9ydCBkaXJlY3RvcnkgKi8KKworICAgIGRpciA9ICZudC0+T3B0aW9uYWxIZWFkZXIuRGF0YURpcmVjdG9yeVtJTUFHRV9GSUxFX0VYUE9SVF9ESVJFQ1RPUlldOworICAgIGRpci0+VmlydHVhbEFkZHJlc3MgPSAoQllURSAqKWV4cCAtIGFkZHI7CisgICAgZGlyLT5TaXplID0gc2l6ZW9mKCpleHApCisgICAgICAgICAgICAgICAgKyBkbGwtPmRlc2NyLT5uYl9mdW5jcyAqIHNpemVvZihMUFZPSUQpCisgICAgICAgICAgICAgICAgKyBkbGwtPmRlc2NyLT5uYl9uYW1lcyAqIHNpemVvZihMUFNUUik7CisKKyAgICAvKiBCdWlsZCB0aGUgZXhwb3J0cyBzZWN0aW9uICovCisKKyAgICBzdHJjcHkoIHNlYy0+TmFtZSwgIi5lZGF0YSIgKTsKKyAgICBzZWMtPk1pc2MuVmlydHVhbFNpemUgPSBkaXItPlNpemU7CisgICAgc2VjLT5WaXJ0dWFsQWRkcmVzcyAgID0gKEJZVEUgKilleHAgLSBhZGRyOworICAgIHNlYy0+U2l6ZU9mUmF3RGF0YSAgICA9IGRpci0+U2l6ZTsKKyAgICBzZWMtPlBvaW50ZXJUb1Jhd0RhdGEgPSAoQllURSAqKWV4cCAtIGFkZHI7CisgICAgc2VjLT5DaGFyYWN0ZXJpc3RpY3MgID0gKElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX1NDTl9NRU1fRVhFQ1VURSB8IElNQUdFX1NDTl9NRU1fUkVBRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX1NDTl9NRU1fV1JJVEUpOworCisgICAgLyogQnVpbGQgdGhlIGNvZGUgc2VjdGlvbiAqLworCisgICAgc2VjKys7CisgICAgc3RyY3B5KCBzZWMtPk5hbWUsICIuY29kZSIgKTsKKyAgICBzZWMtPlNpemVPZlJhd0RhdGEgPSBkbGwtPmRlc2NyLT5uYl9yZWdfZnVuY3MgKiBzaXplb2YoUkVHX0VOVFJZX1BPSU5UKTsKKyNpZmRlZiBfX2kzODZfXworICAgIGlmIChkZWJ1Z2dpbmdfcmVsYXkpCisgICAgICAgIHNlYy0+U2l6ZU9mUmF3RGF0YSArPSBkbGwtPmRlc2NyLT5uYl9mdW5jcyAqIHNpemVvZihERUJVR19FTlRSWV9QT0lOVCk7CisjZW5kaWYKKyAgICBzZWMtPk1pc2MuVmlydHVhbFNpemUgPSBzZWMtPlNpemVPZlJhd0RhdGE7CisgICAgc2VjLT5WaXJ0dWFsQWRkcmVzcyAgID0gKEJZVEUgKilyZWdzIC0gYWRkcjsKKyAgICBzZWMtPlBvaW50ZXJUb1Jhd0RhdGEgPSAoQllURSAqKXJlZ3MgLSBhZGRyOworICAgIHNlYy0+Q2hhcmFjdGVyaXN0aWNzICA9IChJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgfCBJTUFHRV9TQ05fTUVNX1JFQUQpOworCisgICAgLyogQnVpbGQgdGhlIGV4cG9ydHMgc2VjdGlvbiBkYXRhICovCisKKyAgICBleHAtPk5hbWUgICAgICAgICAgICAgICAgICA9IChCWVRFICopZGxsLT5kZXNjci0+bmFtZSAtIGFkZHI7ICAvKj8/Ki8KKyAgICBleHAtPkJhc2UgICAgICAgICAgICAgICAgICA9IGRsbC0+ZGVzY3ItPmJhc2U7CisgICAgZXhwLT5OdW1iZXJPZkZ1bmN0aW9ucyAgICAgPSBkbGwtPmRlc2NyLT5uYl9mdW5jczsKKyAgICBleHAtPk51bWJlck9mTmFtZXMgICAgICAgICA9IGRsbC0+ZGVzY3ItPm5iX25hbWVzOworICAgIGV4cC0+QWRkcmVzc09mRnVuY3Rpb25zICAgID0gKExQRFdPUkQgKikoKEJZVEUgKilmdW5jcyAtIGFkZHIpOworICAgIGV4cC0+QWRkcmVzc09mTmFtZXMgICAgICAgID0gKExQRFdPUkQgKikoKEJZVEUgKiluYW1lcyAtIGFkZHIpOworICAgIGV4cC0+QWRkcmVzc09mTmFtZU9yZGluYWxzID0gKExQV09SRCAqKSgoQllURSAqKWRsbC0+ZGVzY3ItPm9yZGluYWxzIC0gYWRkcik7CisKKyAgICAvKiBCdWlsZCB0aGUgZnVuY3MgdGFibGUgKi8KKworICAgIGlmIChkZWJ1Z2dpbmdfcmVsYXkpIGRsbC0+ZGJnX2Z1bmNzID0gZGVidWc7CisgICAgZm9yIChpID0gMDsgaSA8IGRsbC0+ZGVzY3ItPm5iX2Z1bmNzOyBpKyssIGZ1bmNzKyssIGRlYnVnKyspCisgICAgeworICAgICAgICBCWVRFIGFyZ3MgPSBkbGwtPmRlc2NyLT5hcmdzW2ldOworICAgICAgICBpZiAoIWRsbC0+ZGVzY3ItPmZ1bmN0aW9uc1tpXSkgY29udGludWU7CisjaWZkZWYgX19pMzg2X18KKyAgICAgICAgc3dpdGNoKGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAweGZlOiAgLyogcmVnaXN0ZXIgZnVuYyAqLworICAgICAgICAgICAgcmVncy0+cHVzaGwgICAgICAgPSAweDY4OworICAgICAgICAgICAgcmVncy0+ZnVuYyAgICAgICAgPSAoRFdPUkQpZGxsLT5kZXNjci0+ZnVuY3Rpb25zW2ldOworICAgICAgICAgICAgcmVncy0+am1wICAgICAgICAgPSAweGU5OworICAgICAgICAgICAgcmVncy0+Y2FsbDMyX3JlZ3MgPSAoRFdPUkQpQ0FMTDMyX1JlZ3MgLSAoRFdPUkQpJnJlZ3MtPm5vcDsKKyAgICAgICAgICAgIHJlZ3MtPm5vcCAgICAgICAgID0gMHg5MDkwOworICAgICAgICAgICAgaWYgKGRlYnVnZ2luZ19yZWxheSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWJ1Zy0+Y2FsbCAgICAgICA9IDB4ZTg7CisgICAgICAgICAgICAgICAgZGVidWctPmNhbGxmcm9tMzIgPSAoRFdPUkQpcmVncyAtIChEV09SRCkmZGVidWctPnJldDsKKyAgICAgICAgICAgICAgICBkZWJ1Zy0+cmV0ICAgICAgICA9IDB4OTA7ICAvKiBub3AgKi8KKyAgICAgICAgICAgICAgICBkZWJ1Zy0+YXJncyAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgKmZ1bmNzID0gKExQVk9JRCkoKEJZVEUgKilkZWJ1ZyAtIGFkZHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAqZnVuY3MgPSAoTFBWT0lEKSgoQllURSAqKXJlZ3MgLSBhZGRyKTsKKyAgICAgICAgICAgIHJlZ3MrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ZmY6ICAvKiBzdHViIG9yIGV4dGVybiAqLworICAgICAgICAgICAgKmZ1bmNzID0gKExQVk9JRCkoKEJZVEUgKilkbGwtPmRlc2NyLT5mdW5jdGlvbnNbaV0gLSBhZGRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgLyogbm9ybWFsIGZ1bmN0aW9uIChzdGRjYWxsIG9yIGNkZWNsKSAqLworICAgICAgICAgICAgaWYgKGRlYnVnZ2luZ19yZWxheSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWJ1Zy0+Y2FsbCAgICAgICA9IDB4ZTg7CisgICAgICAgICAgICAgICAgZGVidWctPmNhbGxmcm9tMzIgPSAoRFdPUkQpUkVMQVlfQ2FsbEZyb20zMiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRFdPUkQpJmRlYnVnLT5yZXQ7CisgICAgICAgICAgICAgICAgZGVidWctPnJldCAgICAgICAgPSAoYXJncyAmIDB4ODApID8gMHhjMyA6IDB4YzI7IC8qcmV0L3JldCAkbiovCisgICAgICAgICAgICAgICAgZGVidWctPmFyZ3MgICAgICAgPSAoYXJncyAmIDB4N2YpICogc2l6ZW9mKGludCk7CisgICAgICAgICAgICAgICAgKmZ1bmNzID0gKExQVk9JRCkoKEJZVEUgKilkZWJ1ZyAtIGFkZHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpmdW5jcyA9IChMUFZPSUQpKChCWVRFICopZGxsLT5kZXNjci0+ZnVuY3Rpb25zW2ldIC0gYWRkcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2Vsc2UgIC8qIF9faTM4Nl9fICovCisgICAgICAgICpmdW5jcyA9IChMUFZPSUQpKChCWVRFICopZGxsLT5kZXNjci0+ZnVuY3Rpb25zW2ldIC0gYWRkcik7CisjZW5kaWYgIC8qIF9faTM4Nl9fICovCisgICAgfQorCisgICAgLyogQnVpbGQgdGhlIG5hbWVzIHRhYmxlICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZXhwLT5OdW1iZXJPZk5hbWVzOyBpKyssIG5hbWVzKyspCisgICAgICAgIGlmIChkbGwtPmRlc2NyLT5uYW1lc1tpXSkKKyAgICAgICAgICAgICpuYW1lcyA9IChMUFNUUikoKEJZVEUgKilkbGwtPmRlc2NyLT5uYW1lc1tpXSAtIGFkZHIpOworCisgICAgLyogQ3JlYXRlIGEgbW9kcmVmICovCisKKyAgICBwZW0gPSAoUEVfTU9EUkVGICopSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcGVtKSApOworICAgIHBlbS0+bW9kdWxlID0gKEhNT0RVTEUzMilhZGRyOworICAgIHBlbS0+cGVfZXhwb3J0ID0gZXhwOworICAgIHBlbS0+bmV4dCA9IHBDdXJyZW50UHJvY2Vzcy0+bW9kcmVmX2xpc3Q7CisgICAgcEN1cnJlbnRQcm9jZXNzLT5tb2RyZWZfbGlzdCA9IHBlbTsKKworICAgIC8qIENyZWF0ZSBhIFdpbjE2IGR1bW15IG1vZHVsZSAqLworCisgICAgc3ByaW50Ziggb2ZzLnN6UGF0aE5hbWUsICIlcy5ETEwiLCBkbGwtPmRlc2NyLT5uYW1lICk7CisgICAgaE1vZHVsZSA9IE1PRFVMRV9DcmVhdGVEdW1teU1vZHVsZSggJm9mcyApOworICAgIHBNb2R1bGUgPSAoTkVfTU9EVUxFICopR2xvYmFsTG9jazE2KCBoTW9kdWxlICk7CisgICAgcE1vZHVsZS0+ZmxhZ3MgPSBORV9GRkxBR1NfU0lOR0xFREFUQSB8IE5FX0ZGTEFHU19CVUlMVElOIHwKKyAgICAgICAgICAgICAgICAgICAgIE5FX0ZGTEFHU19MSUJNT0RVTEUgfCBORV9GRkxBR1NfV0lOMzI7CisgICAgcE1vZHVsZS0+bW9kdWxlMzIgPSAoSE1PRFVMRTMyKWFkZHI7CisgICAgcmV0dXJuIHBNb2R1bGUtPm1vZHVsZTMyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEJVSUxUSU4zMl9Mb2FkTW9kdWxlCisgKgorICogTG9hZCBhIGJ1aWx0LWluIG1vZHVsZS4gSWYgdGhlICdmb3JjZScgcGFyYW1ldGVyIGlzIEZBTFNFLCB3ZSBvbmx5CisgKiBsb2FkIHRoZSBtb2R1bGUgaWYgaXQgaGFzIG5vdCBiZWVuIGRpc2FibGVkIHZpYSB0aGUgLWRsbCBvcHRpb24uCisgKi8KK0hNT0RVTEUzMiBCVUlMVElOMzJfTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIEJPT0wzMiBmb3JjZSApCit7CisgICAgQlVJTFRJTjMyX0RMTCAqdGFibGU7CisgICAgY2hhciBkbGxuYW1lWzE2XSwgKnA7CisKKyAgICAvKiBGaXggdGhlIG5hbWUgaW4gY2FzZSB3ZSBoYXZlIGEgZnVsbCBwYXRoIGFuZCBleHRlbnNpb24gKi8KKworICAgIGlmICgocCA9IHN0cnJjaHIoIG5hbWUsICdcXCcgKSkpIG5hbWUgPSBwICsgMTsKKyAgICBsc3RyY3B5bjMyQSggZGxsbmFtZSwgbmFtZSwgc2l6ZW9mKGRsbG5hbWUpICk7CisgICAgaWYgKChwID0gc3RycmNociggZGxsbmFtZSwgJy4nICkpKSAqcCA9ICdcMCc7CisKKyAgICBmb3IgKHRhYmxlID0gQnVpbHRpbkRMTHM7IHRhYmxlLT5kZXNjcjsgdGFibGUrKykKKyAgICAgICAgaWYgKCFsc3RyY21waTMyQSggdGFibGUtPmRlc2NyLT5uYW1lLCBkbGxuYW1lICkpIGJyZWFrOworICAgIGlmICghdGFibGUtPmRlc2NyKSByZXR1cm4gMDsKKyAgICBpZiAoIXRhYmxlLT51c2VkICYmICFmb3JjZSkgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gQlVJTFRJTjMyX0RvTG9hZE1vZHVsZSggdGFibGUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBCVUlMVElOMzJfR2V0RW50cnlQb2ludAorICoKKyAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgRExMIGVudHJ5IHBvaW50IGNvcnJlc3BvbmRpbmcKKyAqIHRvIGEgcmVsYXkgZW50cnkgcG9pbnQgYWRkcmVzcy4gVGhpcyBpcyB1c2VkIG9ubHkgYnkgcmVsYXkgZGVidWdnaW5nLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gX211c3RfIHJldHVybiB0aGUgcmVhbCBlbnRyeSBwb2ludCB0byBjYWxsCisgKiBhZnRlciB0aGUgZGVidWcgaW5mbyBpcyBwcmludGVkLgorICovCitFTlRSWVBPSU5UMzIgQlVJTFRJTjMyX0dldEVudHJ5UG9pbnQoIGNoYXIgKmJ1ZmZlciwgdm9pZCAqcmVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqdHlwZW1hc2sgKQoreworICAgIEJVSUxUSU4zMl9ETEwgKmRsbDsKKyAgICBpbnQgb3JkaW5hbCwgaTsKKworICAgIC8qIEZpcnN0IGZpbmQgdGhlIG1vZHVsZSAqLworCisgICAgZm9yIChkbGwgPSBCdWlsdGluRExMczsgZGxsLT5kZXNjcjsgZGxsKyspCisgICAgICAgIGlmICgoKHZvaWQgKilkbGwtPmRiZ19mdW5jcyA8PSByZWxheSkgJiYKKyAgICAgICAgICAgICgodm9pZCAqKShkbGwtPmRiZ19mdW5jcyArIGRsbC0+ZGVzY3ItPm5iX2Z1bmNzKSA+IHJlbGF5KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGFzc2VydChkbGwtPmRlc2NyKTsKKworICAgIC8qIE5vdyBmaW5kIHRoZSBmdW5jdGlvbiAqLworCisgICAgb3JkaW5hbCA9ICgoRFdPUkQpcmVsYXktKERXT1JEKWRsbC0+ZGJnX2Z1bmNzKSAvIHNpemVvZihERUJVR19FTlRSWV9QT0lOVCk7CisgICAgZm9yIChpID0gMDsgaSA8IGRsbC0+ZGVzY3ItPm5iX25hbWVzOyBpKyspCisgICAgICAgIGlmIChkbGwtPmRlc2NyLT5vcmRpbmFsc1tpXSA9PSBvcmRpbmFsKSBicmVhazsKKyAgICBhc3NlcnQoIGkgPCBkbGwtPmRlc2NyLT5uYl9uYW1lcyApOworCisgICAgc3ByaW50ZiggYnVmZmVyLCAiJXMuJWQ6ICVzIiwgZGxsLT5kZXNjci0+bmFtZSwgb3JkaW5hbCArIGRsbC0+ZGVzY3ItPmJhc2UsCisgICAgICAgICAgICAgZGxsLT5kZXNjci0+bmFtZXNbaV0gKTsKKyAgICAqdHlwZW1hc2sgPSBkbGwtPmRlc2NyLT5hcmd0eXBlc1tvcmRpbmFsXTsKKyAgICByZXR1cm4gZGxsLT5kZXNjci0+ZnVuY3Rpb25zW29yZGluYWxdOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEJVSUxUSU4zMl9VbmltcGxlbWVudGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHVuaW1wbGVtZW50ZWQgMzItYml0IGVudHJ5IHBvaW50cyAoZGVjbGFyZWQKKyAqIGFzICdzdHViJyBpbiB0aGUgc3BlYyBmaWxlKS4KKyAqLwordm9pZCBCVUlMVElOMzJfVW5pbXBsZW1lbnRlZCggY29uc3QgQlVJTFRJTjMyX0RFU0NSSVBUT1IgKmRlc2NyLCBpbnQgb3JkaW5hbCApCit7CisgICAgY29uc3QgY2hhciAqZnVuY19uYW1lID0gIj8/PyI7CisgICAgaW50IGk7CisKKyAgICBfX1JFU1RPUkVfRVM7ICAvKiBKdXN0IGluIGNhc2UgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjci0+bmJfbmFtZXM7IGkrKykKKyAgICAgICAgaWYgKGRlc2NyLT5vcmRpbmFsc1tpXSArIGRlc2NyLT5iYXNlID09IG9yZGluYWwpIGJyZWFrOworICAgIGlmIChpIDwgZGVzY3ItPm5iX25hbWVzKSBmdW5jX25hbWUgPSBkZXNjci0+bmFtZXNbaV07CisKKyAgICBmcHJpbnRmKCBzdGRlcnIsICJObyBoYW5kbGVyIGZvciBXaW4zMiByb3V0aW5lICVzLiVkOiAlcyIsCisgICAgICAgICAgICAgZGVzY3ItPm5hbWUsIG9yZGluYWwsIGZ1bmNfbmFtZSApOworI2lmZGVmIF9fR05VQ19fCisgICAgZnByaW50Ziggc3RkZXJyLCAiIChjYWxsZWQgZnJvbSAlcCkiLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMSkgKTsKKyNlbmRpZgorICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOworICAgIFRBU0tfS2lsbEN1cnJlbnRUYXNrKDEpOworfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2NvbWN0bDMyLnNwZWMgYi9yZWxheTMyL2NvbWN0bDMyLnNwZWMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGlmMTYzMi9jb21jdGwzMi5zcGVjCnJlbmFtZSB0byByZWxheTMyL2NvbWN0bDMyLnNwZWMKZGlmZiAtLWdpdCBhL2lmMTYzMi9jb21kbGczMi5zcGVjIGIvcmVsYXkzMi9jb21kbGczMi5zcGVjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpZjE2MzIvY29tZGxnMzIuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi9jb21kbGczMi5zcGVjCmRpZmYgLS1naXQgYS9pZjE2MzIvY3J0ZGxsLnNwZWMgYi9yZWxheTMyL2NydGRsbC5zcGVjCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGlmMTYzMi9jcnRkbGwuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi9jcnRkbGwuc3BlYwppbmRleCA5MWI0ZTJkLi5hNDFhZjc3IDEwMDY0NAotLS0gYS9pZjE2MzIvY3J0ZGxsLnNwZWMKKysrIGIvcmVsYXkzMi9jcnRkbGwuc3BlYwpAQCAtNDI3LDcgKzQyNyw3IEBACiA0MjMgY2RlY2wgbG9jYWx0aW1lKHB0cikgbG9jYWx0aW1lCiA0MjQgY2RlY2wgbG9nKGRvdWJsZSkgbG9nCiA0MjUgY2RlY2wgbG9nMTAoZG91YmxlKSBsb2cxMAotNDI2IHN0dWIgbG9uZ2ptcAorNDI2IGNkZWNsIGxvbmdqbXAocHRyIGxvbmcpIENSVERMTF9sb25nam1wCiA0MjcgY2RlY2wgbWFsbG9jKHB0cikgQ1JURExMX21hbGxvYwogNDI4IGNkZWNsIG1ibGVuKHB0ciBsb25nKSBDUlRETExfbWJsZW4KIDQyOSBjZGVjbCBtYnN0b3djcyhwdHIgcHRyIGxvbmcpIENSVERMTF9tYnN0b3djcwpkaWZmIC0tZ2l0IGEvcmVsYXkzMi9kY2ltYW4zMi5zcGVjIGIvcmVsYXkzMi9kY2ltYW4zMi5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDEwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxheTMyL2RjaW1hbjMyLnNwZWMKQEAgLTAsMCArMSwyNSBAQAorbmFtZQlkY2ltYW4zMgordHlwZQl3aW4zMgorCisgIDEgc3R1YiAgICBEQ0lCZWdpbkFjY2VzcworICAyIHN0dWIgICAgRENJQ2xvc2VQcm92aWRlcgorICAzIHN0dWIgICAgRENJQ3JlYXRlT2Zmc2NyZWVuCisgIDQgc3R1YiAgICBEQ0lDcmVhdGVPdmVybGF5CisgIDUgc3R1YiAgICBEQ0lDcmVhdGVQcmltYXJ5CisgIDYgc3R1YiAgICBEQ0lEZXN0cm95CisgIDcgc3R1YiAgICBEQ0lEcmF3CisgIDggc3R1YiAgICBEQ0lFbmRBY2Nlc3MKKyAgOSBzdHViICAgIERDSUVudW0KKyAxMCBzdHViICAgIERDSU9wZW5Qcm92aWRlcgorIDExIHN0dWIgICAgRENJU2V0Q2xpcExpc3QKKyAxMiBzdHViICAgIERDSVNldERlc3RpbmF0aW9uCisgMTMgc3R1YiAgICBEQ0lTZXRTcmNEZXN0Q2xpcAorIDE0IHN0dWIgICAgRGxsRW50cnlQb2ludAorIDE1IHN0dWIgICAgR2V0RENSZWdpb25EYXRhCisgMTYgc3R1YiAgICBHZXRXaW5kb3dSZWdpb25EYXRhCisgMTcgc3R1YiAgICBXaW5XYXRjaENsb3NlCisgMTggc3R1YiAgICBXaW5XYXRjaERpZFN0YXR1c0NoYW5nZQorIDE5IHN0dWIgICAgV2luV2F0Y2hHZXRDbGlwTGlzdAorIDIwIHN0dWIgICAgV2luV2F0Y2hOb3RpZnkKKyAyMSBzdHViICAgIFdpbldhdGNoT3BlbgorIDIyIHN0dWIgICAgZGNpdGhrX1RodW5rRGF0YTMyCmRpZmYgLS1naXQgYS9pZjE2MzIvZ2RpMzIuc3BlYyBiL3JlbGF5MzIvZ2RpMzIuc3BlYwpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBpZjE2MzIvZ2RpMzIuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi9nZGkzMi5zcGVjCmluZGV4IDY4NmNmY2YuLmUwNjgyNzkgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkzMi5zcGVjCisrKyBiL3JlbGF5MzIvZ2RpMzIuc3BlYwpAQCAtMiw3ICsyLDcgQEAKIHR5cGUJd2luMzIKIAogICAwIHN0dWIgQWJvcnREb2MKLSAgMSBzdHViIEFib3J0UGF0aAorICAxIHN0ZGNhbGwgQWJvcnRQYXRoKGxvbmcpIEFib3J0UGF0aDMyCiAgIDIgc3RkY2FsbCBBZGRGb250UmVzb3VyY2VBKHN0cikgQWRkRm9udFJlc291cmNlMzJBCiAgIDMgc3R1YiBBZGRGb250UmVzb3VyY2VUcmFja2luZwogICA0IHN0ZGNhbGwgQWRkRm9udFJlc291cmNlVyh3c3RyKSBBZGRGb250UmVzb3VyY2UzMlcKQEAgLTEwLDE0ICsxMCwxNCBAQAogICA2IHN0ZGNhbGwgQW5pbWF0ZVBhbGV0dGUobG9uZyBsb25nIGxvbmcgcHRyKSBBbmltYXRlUGFsZXR0ZTMyCiAgIDcgc3RkY2FsbCBBcmMobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIEFyYzMyCiAgIDggc3R1YiBBcmNUbwotICA5IHN0dWIgQmVnaW5QYXRoCisgIDkgc3RkY2FsbCBCZWdpblBhdGgobG9uZykgQmVnaW5QYXRoMzIKICAxMCBzdGRjYWxsIEJpdEJsdChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgQml0Qmx0MzIKICAxMSBzdHViIENhbmNlbERDCiAgMTIgc3R1YiBDaGVja0NvbG9yc0luR2FtdXQKICAxMyBzdHViIENob29zZVBpeGVsRm9ybWF0CiAgMTQgc3RkY2FsbCBDaG9yZChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgQ2hvcmQzMgogIDE1IHN0dWIgQ2xvc2VFbmhNZXRhRmlsZQotIDE2IHN0dWIgQ2xvc2VGaWd1cmUKKyAxNiBzdGRjYWxsIENsb3NlRmlndXJlKGxvbmcpIENsb3NlRmlndXJlMzIKICAxNyBzdHViIENsb3NlTWV0YUZpbGUKICAxOCBzdHViIENvbG9yTWF0Y2hUb1RhcmdldAogIDE5IHN0ZGNhbGwgQ29tYmluZVJnbihsb25nIGxvbmcgbG9uZyBsb25nKSBDb21iaW5lUmduMzIKQEAgLTUwLDcgKzUwLDcgQEAKICA0NSBzdGRjYWxsIENyZWF0ZUZvbnRJbmRpcmVjdFcocHRyKSBDcmVhdGVGb250SW5kaXJlY3QzMlcKICA0NiBzdGRjYWxsIENyZWF0ZUZvbnRXKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZwogICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIHdzdHIpIENyZWF0ZUZvbnQzMlcKLSA0NyBzdHViIENyZWF0ZUhhbGZ0b25lUGFsZXR0ZQorIDQ3IHN0ZGNhbGwgQ3JlYXRlSGFsZnRvbmVQYWxldHRlKGxvbmcpIENyZWF0ZUhhbGZ0b25lUGFsZXR0ZQogIDQ4IHN0ZGNhbGwgQ3JlYXRlSGF0Y2hCcnVzaChsb25nIGxvbmcpIENyZWF0ZUhhdGNoQnJ1c2gzMgogIDQ5IHN0ZGNhbGwgQ3JlYXRlSUNBKHN0ciBzdHIgc3RyIHB0cikgQ3JlYXRlSUMzMkEKICA1MCBzdGRjYWxsIENyZWF0ZUlDVyh3c3RyIHdzdHIgd3N0ciBwdHIpIENyZWF0ZUlDMzJXCkBAIC04Miw3ICs4Miw3IEBACiAgNzUgc3RkY2FsbCBFbGxpcHNlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgRWxsaXBzZTMyCiAgNzYgc3R1YiBFbmREb2MKICA3NyBzdHViIEVuZFBhZ2UKLSA3OCBzdHViIEVuZFBhdGgKKyA3OCBzdGRjYWxsIEVuZFBhdGgobG9uZykgRW5kUGF0aDMyCiAgNzkgc3R1YiBFbnVtRW5oTWV0YUZpbGUKICA4MCBzdGRjYWxsIEVudW1Gb250RmFtaWxpZXNBKGxvbmcgc3RyIHB0ciBsb25nKSBFbnVtRm9udEZhbWlsaWVzMzJBCiAgODEgc3RkY2FsbCBFbnVtRm9udEZhbWlsaWVzRXhBKGxvbmcgc3RyIHB0ciBsb25nIGxvbmcpIEVudW1Gb250RmFtaWxpZXNFeDMyQQpAQCAtOTcsMTYgKzk3LDE2IEBACiAgOTAgc3RkY2FsbCBFcXVhbFJnbihsb25nIGxvbmcpIEVxdWFsUmduMzIKICA5MSBzdGRjYWxsIEVzY2FwZShsb25nIGxvbmcgbG9uZyBwdHIgcHRyKSBFc2NhcGUzMgogIDkyIHN0ZGNhbGwgRXhjbHVkZUNsaXBSZWN0KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgRXhjbHVkZUNsaXBSZWN0MzIKLSA5MyBzdHViIEV4dENyZWF0ZVBlbgorIDkzIHN0ZGNhbGwgRXh0Q3JlYXRlUGVuKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIpIEV4dENyZWF0ZVBlbjMyCiAgOTQgc3R1YiBFeHRDcmVhdGVSZWdpb24KICA5NSBzdGRjYWxsIEV4dEVzY2FwZShsb25nIGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIpIEV4dEVzY2FwZTMyCiAgOTYgc3RkY2FsbCBFeHRGbG9vZEZpbGwobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBFeHRGbG9vZEZpbGwzMgogIDk3IHN0dWIgRXh0U2VsZWN0Q2xpcFJnbgogIDk4IHN0ZGNhbGwgRXh0VGV4dE91dEEobG9uZyBsb25nIGxvbmcgbG9uZyBwdHIgc3RyIGxvbmcgcHRyKSBFeHRUZXh0T3V0MzJBCiAgOTkgc3RkY2FsbCBFeHRUZXh0T3V0Vyhsb25nIGxvbmcgbG9uZyBsb25nIHB0ciB3c3RyIGxvbmcgcHRyKSBFeHRUZXh0T3V0MzJXCi0xMDAgc3R1YiBGaWxsUGF0aAorMTAwIHN0ZGNhbGwgRmlsbFBhdGgobG9uZykgRmlsbFBhdGgzMgogMTAxIHN0ZGNhbGwgRmlsbFJnbihsb25nIGxvbmcgbG9uZykgRmlsbFJnbjMyCi0xMDIgc3R1YiBGaXhCcnVzaE9yZ0V4CisxMDIgc3RkY2FsbCBGaXhCcnVzaE9yZ0V4KGxvbmcgbG9uZyBsb25nIHB0cikgRml4QnJ1c2hPcmdFeAogMTAzIHN0dWIgRmxhdHRlblBhdGgKIDEwNCBzdGRjYWxsIEZsb29kRmlsbChsb25nIGxvbmcgbG9uZyBsb25nKSBGbG9vZEZpbGwzMgogMTA1IHN0ZGNhbGwgRnJhbWVSZ24obG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBGcmFtZVJnbjMyCkBAIC0xNzAsNyArMTcwLDcgQEAKIDE2MyBzdGRjYWxsIEdldENsaXBSZ24obG9uZyBsb25nKSBHZXRDbGlwUmduMzIKIDE2NCBzdHViIEdldENvbG9yQWRqdXN0bWVudAogMTY1IHN0dWIgR2V0Q29sb3JTcGFjZQotMTY2IHN0dWIgR2V0Q3VycmVudE9iamVjdAorMTY2IHN0ZGNhbGwgR2V0Q3VycmVudE9iamVjdChsb25nIGxvbmcpIEdldEN1cnJlbnRPYmplY3QKIDE2NyBzdGRjYWxsIEdldEN1cnJlbnRQb3NpdGlvbkV4KGxvbmcgcHRyKSBHZXRDdXJyZW50UG9zaXRpb25FeDMyCiAxNjggc3RkY2FsbCBHZXREQ09yZ0V4KGxvbmcgcHRyKSBHZXREQ09yZ0V4CiAxNjkgc3RkY2FsbCBHZXRESUJDb2xvclRhYmxlKGxvbmcgbG9uZyBsb25nIHB0cikgR2V0RElCQ29sb3JUYWJsZTMyCkBAIC0yMTQsNyArMjE0LDcgQEAKIDIwNyBzdHViIEdldE91dGxpbmVUZXh0TWV0cmljc0EKIDIwOCBzdHViIEdldE91dGxpbmVUZXh0TWV0cmljc1cKIDIwOSBzdGRjYWxsIEdldFBhbGV0dGVFbnRyaWVzKGxvbmcgbG9uZyBsb25nIHB0cikgR2V0UGFsZXR0ZUVudHJpZXMzMgotMjEwIHN0dWIgR2V0UGF0aAorMjEwIHN0ZGNhbGwgR2V0UGF0aChsb25nIHB0ciBwdHIgbG9uZykgR2V0UGF0aDMyCiAyMTEgc3RkY2FsbCBHZXRQaXhlbChsb25nIGxvbmcgbG9uZykgR2V0UGl4ZWwzMgogMjEyIHN0dWIgR2V0UGl4ZWxGb3JtYXQKIDIxMyBzdGRjYWxsIEdldFBvbHlGaWxsTW9kZShsb25nKSBHZXRQb2x5RmlsbE1vZGUzMgpAQCAtMjY1LDcgKzI2NSw3IEBACiAyNTggc3RkY2FsbCBPZmZzZXRXaW5kb3dPcmdFeChsb25nIGxvbmcgbG9uZyBwdHIpIE9mZnNldFdpbmRvd09yZ0V4MzIKIDI1OSBzdGRjYWxsIFBhaW50UmduKGxvbmcgbG9uZykgUGFpbnRSZ24zMgogMjYwIHN0ZGNhbGwgUGF0Qmx0KGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBQYXRCbHQzMgotMjYxIHN0dWIgUGF0aFRvUmVnaW9uCisyNjEgc3RkY2FsbCBQYXRoVG9SZWdpb24obG9uZykgUGF0aFRvUmVnaW9uMzIKIDI2MiBzdGRjYWxsIFBpZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgUGllMzIKIDI2MyBzdHViIFBsYXlFbmhNZXRhRmlsZQogMjY0IHN0dWIgUGxheUVuaE1ldGFGaWxlUmVjb3JkCkBAIC0zMDAsNyArMzAwLDcgQEAKIDI5MyBzdGRjYWxsIFNjYWxlVmlld3BvcnRFeHRFeChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBTY2FsZVZpZXdwb3J0RXh0RXgzMgogMjk0IHN0ZGNhbGwgU2NhbGVXaW5kb3dFeHRFeChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgcHRyKSBTY2FsZVdpbmRvd0V4dEV4MzIKIDI5NSBzdHViIFNlbGVjdEJydXNoTG9jYWwKLTI5NiBzdHViIFNlbGVjdENsaXBQYXRoCisyOTYgc3RkY2FsbCBTZWxlY3RDbGlwUGF0aChsb25nIGxvbmcpIFNlbGVjdENsaXBQYXRoMzIKIDI5NyBzdGRjYWxsIFNlbGVjdENsaXBSZ24obG9uZyBsb25nKSBTZWxlY3RDbGlwUmduMzIKIDI5OCBzdHViIFNlbGVjdEZvbnRMb2NhbAogMjk5IHN0ZGNhbGwgU2VsZWN0T2JqZWN0KGxvbmcgbG9uZykgU2VsZWN0T2JqZWN0MzIKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwzMi5zcGVjIGIvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGlmMTYzMi9rZXJuZWwzMi5zcGVjCnJlbmFtZSB0byByZWxheTMyL2tlcm5lbDMyLnNwZWMKaW5kZXggNGRlNmNhMy4uN2RkZTZiNCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMKKysrIGIvcmVsYXkzMi9rZXJuZWwzMi5zcGVjCkBAIC0xNjksNyArMTY5LDcgQEAKIDE3OCBzdGRjYWxsIENyZWF0ZVRocmVhZChwdHIgbG9uZyBwdHIgbG9uZyBsb25nIHB0cikgQ3JlYXRlVGhyZWFkCiAxNzkgc3R1YiBDcmVhdGVUb29saGVscDMyU25hcHNob3QKIDE4MCBzdHViIERlYnVnQWN0aXZlUHJvY2VzcwotMTgxIHJlZ2lzdGVyIERlYnVnQnJlYWsoKSBEZWJ1Z0JyZWFrMzIKKzE4MSBzdHViIERlYnVnQnJlYWsKIDE4MiBzdHViIERlZmluZURvc0RldmljZUEKIDE4MyBzdHViIERlZmluZURvc0RldmljZVcKIDE4NCBzdGRjYWxsIERlbGV0ZUF0b20obG9uZykgRGVsZXRlQXRvbTMyCkBAIC0yMzYsMTEgKzIzNiwxMSBAQAogMjQ1IHN0ZGNhbGwgRmluZEF0b21XKHdzdHIpIEZpbmRBdG9tMzJXCiAyNDcgc3R1YiBGaW5kQ2xvc2VDaGFuZ2VOb3RpZmljYXRpb24KIDI0NiBzdGRjYWxsIEZpbmRDbG9zZShsb25nKSBGaW5kQ2xvc2UzMgotMjQ4IHN0dWIgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uQQorMjQ4IHN0ZGNhbGwgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uQShzdHIgbG9uZyBsb25nKSBGaW5kRmlyc3RDaGFuZ2VOb3RpZmljYXRpb24zMkEKIDI0OSBzdHViIEZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvblcKIDI1MCBzdGRjYWxsIEZpbmRGaXJzdEZpbGVBKHN0ciBwdHIpIEZpbmRGaXJzdEZpbGUzMkEKIDI1MSBzdGRjYWxsIEZpbmRGaXJzdEZpbGVXKHdzdHIgcHRyKSBGaW5kRmlyc3RGaWxlMzJXCi0yNTIgc3R1YiBGaW5kTmV4dENoYW5nZU5vdGlmaWNhdGlvbgorMjUyIHN0ZGNhbGwgRmluZE5leHRDaGFuZ2VOb3RpZmljYXRpb24obG9uZykgRmluZE5leHRDaGFuZ2VOb3RpZmljYXRpb24KIDI1MyBzdGRjYWxsIEZpbmROZXh0RmlsZUEobG9uZyBwdHIpIEZpbmROZXh0RmlsZTMyQQogMjU0IHN0ZGNhbGwgRmluZE5leHRGaWxlVyhsb25nIHB0cikgRmluZE5leHRGaWxlMzJXCiAyNTUgc3RkY2FsbCBGaW5kUmVzb3VyY2VBKGxvbmcgc3RyIHN0cikgRmluZFJlc291cmNlMzJBCkBAIC0yODQsNyArMjg0LDcgQEAKIDI5MyBzdGRjYWxsIEdldENvbXB1dGVyTmFtZUEocHRyIHB0cikgR2V0Q29tcHV0ZXJOYW1lMzJBCiAyOTQgc3RkY2FsbCBHZXRDb21wdXRlck5hbWVXKHB0ciBwdHIpIEdldENvbXB1dGVyTmFtZTMyVwogMjk1IHN0ZGNhbGwgR2V0Q29uc29sZUNQKCkgR2V0Q29uc29sZUNQCi0yOTYgc3R1YiBHZXRDb25zb2xlQ3Vyc29ySW5mbworMjk2IHN0ZGNhbGwgR2V0Q29uc29sZUN1cnNvckluZm8obG9uZyBwdHIpIEdldENvbnNvbGVDdXJzb3JJbmZvMzIKIDI5NyBzdGRjYWxsIEdldENvbnNvbGVNb2RlKGxvbmcgcHRyKSBHZXRDb25zb2xlTW9kZQogMjk4IHN0ZGNhbGwgR2V0Q29uc29sZU91dHB1dENQKCkgR2V0Q29uc29sZU91dHB1dENQCiAyOTkgc3RkY2FsbCBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhsb25nIHB0cikgR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8KQEAgLTM0Niw3ICszNDYsNyBAQAogMzU1IHN0dWIgR2V0TnVtYmVyRm9ybWF0QQogMzU2IHN0dWIgR2V0TnVtYmVyRm9ybWF0VwogMzU3IHN0ZGNhbGwgR2V0TnVtYmVyT2ZDb25zb2xlSW5wdXRFdmVudHMobG9uZyBwdHIpIEdldE51bWJlck9mQ29uc29sZUlucHV0RXZlbnRzCi0zNTggc3R1YiBHZXROdW1iZXJPZkNvbnNvbGVNb3VzZUJ1dHRvbnMKKzM1OCBzdGRjYWxsIEdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9ucyhsb25nIHB0cikgR2V0TnVtYmVyT2ZDb25zb2xlTW91c2VCdXR0b25zCiAzNTkgc3RkY2FsbCBHZXRPRU1DUCgpIEdldE9FTUNQCiAzNjAgc3R1YiBHZXRPdmVybGFwcGVkUmVzdWx0CiAzNjEgc3RkY2FsbCBHZXRQcmlvcml0eUNsYXNzKGxvbmcpIEdldFByaW9yaXR5Q2xhc3MKQEAgLTUzOCw4ICs1MzgsOCBAQAogNTQ3IHN0dWIgT3BlblZ4REhhbmRsZQogNTQ4IHN0ZGNhbGwgT3V0cHV0RGVidWdTdHJpbmdBKHN0cikgT3V0cHV0RGVidWdTdHJpbmczMkEKIDU0OSBzdGRjYWxsIE91dHB1dERlYnVnU3RyaW5nVyh3c3RyKSBPdXRwdXREZWJ1Z1N0cmluZzMyVwotNTUwIHN0dWIgUGVla0NvbnNvbGVJbnB1dEEKLTU1MSBzdHViIFBlZWtDb25zb2xlSW5wdXRXCis1NTAgc3RkY2FsbCBQZWVrQ29uc29sZUlucHV0QShwdHIgcHRyIGxvbmcgcHRyKSBQZWVrQ29uc29sZUlucHV0MzJBCis1NTEgc3RkY2FsbCBQZWVrQ29uc29sZUlucHV0VyhwdHIgcHRyIGxvbmcgcHRyKSBQZWVrQ29uc29sZUlucHV0MzJXCiA1NTIgc3R1YiBQZWVrTmFtZWRQaXBlCiA1NTMgc3R1YiBQb3N0UXVldWVkQ29tcGxldGlvblN0YXR1cwogNTU0IHN0dWIgUHJlcGFyZVRhcGUKQEAgLTU5MCw3ICs1OTAsNyBAQAogNTk5IHJlZ2lzdGVyIFNNYXBMU19JUF9FQlBfMzYoKSBTTWFwTFNfSVBfRUJQXzM2CiA2MDAgcmVnaXN0ZXIgU01hcExTX0lQX0VCUF80MCgpIFNNYXBMU19JUF9FQlBfNDAKIDYwMSByZWdpc3RlciBTTWFwTFNfSVBfRUJQXzgoKSBTTWFwTFNfSVBfRUJQXzgKLTYwMiBzdHViIFNVbk1hcExTCis2MDIgcmVnaXN0ZXIgU1VuTWFwTFMoKSBTVW5NYXBMUwogNjAzIHJlZ2lzdGVyIFNVbk1hcExTX0lQX0VCUF8xMigpIFNVbk1hcExTX0lQX0VCUF8xMgogNjA0IHJlZ2lzdGVyIFNVbk1hcExTX0lQX0VCUF8xNigpIFNVbk1hcExTX0lQX0VCUF8xNgogNjA1IHJlZ2lzdGVyIFNVbk1hcExTX0lQX0VCUF8yMCgpIFNVbk1hcExTX0lQX0VCUF8yMApAQCAtNjE0LDcgKzYxNCw3IEBACiA2MjMgc3R1YiBTZXRDb25zb2xlQWN0aXZlU2NyZWVuQnVmZmVyCiA2MjQgc3R1YiBTZXRDb25zb2xlQ1AKIDYyNSBzdGRjYWxsIFNldENvbnNvbGVDdHJsSGFuZGxlcihwdHIgbG9uZykgU2V0Q29uc29sZUN0cmxIYW5kbGVyCi02MjYgc3R1YiBTZXRDb25zb2xlQ3Vyc29ySW5mbworNjI2IHN0ZGNhbGwgU2V0Q29uc29sZUN1cnNvckluZm8obG9uZyBwdHIpIFNldENvbnNvbGVDdXJzb3JJbmZvMzIKIDYyNyBzdGRjYWxsIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihsb25nIGxvbmcpIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbgogNjI4IHN0ZGNhbGwgU2V0Q29uc29sZU1vZGUobG9uZyBsb25nKSBTZXRDb25zb2xlTW9kZQogNjI5IHN0dWIgU2V0Q29uc29sZU91dHB1dENQCkBAIC03MjgsNyArNzI4LDcgQEAKIDczNyBzdGRjYWxsIFdyaXRlQ29uc29sZVcobG9uZyBwdHIgbG9uZyBwdHIgcHRyKSBXcml0ZUNvbnNvbGUzMlcKIDczOCBzdGRjYWxsIFdyaXRlRmlsZShsb25nIHB0ciBsb25nIHB0ciBwdHIpIFdyaXRlRmlsZQogNzM5IHN0dWIgV3JpdGVGaWxlRXgKLTc0MCBzdHViIFdyaXRlUHJpdmF0ZVByb2ZpbGVTZWN0aW9uQQorNzQwIHN0ZGNhbGwgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb25BKHN0ciBzdHIgc3RyKSBXcml0ZVByaXZhdGVQcm9maWxlU2VjdGlvbjMyQQogNzQxIHN0dWIgV3JpdGVQcml2YXRlUHJvZmlsZVNlY3Rpb25XCiA3NDIgc3RkY2FsbCBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nQShzdHIgc3RyIHN0ciBzdHIpIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmczMkEKIDc0MyBzdGRjYWxsIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmdXKHdzdHIgd3N0ciB3c3RyIHdzdHIpIFdyaXRlUHJpdmF0ZVByb2ZpbGVTdHJpbmczMlcKQEAgLTg2MCwxNSArODYwLDE1IEBACiA4Njggc3R1YiBHZXRDb25zb2xlSW5wdXRFeGVOYW1lVwogODY5IHN0dWIgR2V0Q29uc29sZUtleWJvYXJkTGF5b3V0TmFtZUEKIDg3MCBzdHViIEdldENvbnNvbGVLZXlib2FyZExheW91dE5hbWVXCi04NzEgc3R1YiBHZXREaXNrRnJlZVNwYWNlRXhBCi04NzMgc3R1YiBHZXREaXNrRnJlZVNwYWNlRXhXCis4NzEgc3RkY2FsbCBHZXREaXNrRnJlZVNwYWNlRXhBIChzdHIgcHRyIHB0ciBwdHIpIEdldERpc2tGcmVlU3BhY2VFeDMyQQorODczIHN0ZGNhbGwgR2V0RGlza0ZyZWVTcGFjZUV4VyAod3N0ciBwdHIgcHRyIHB0cikgR2V0RGlza0ZyZWVTcGFjZUV4MzJXCiA4NzQgc3R1YiBHZXRGaWxlQXR0cmlidXRlc0V4QQogODc1IHN0dWIgR2V0RmlsZUF0dHJpYnV0ZXNFeFcKIDg3NiBzdHViIEdldFByb2Nlc3NQcmlvcml0eUJvb3N0CiA4Nzcgc3R1YiBHZXRUaHJlYWRQcmlvcml0eUJvb3N0CiA4Nzggc3R1YiBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZQogODc5IHN0dWIgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZAotODgwIHN0dWIgSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudAorODgwIHN0ZGNhbGwgSXNQcm9jZXNzb3JGZWF0dXJlUHJlc2VudChsb25nKSBJc1Byb2Nlc3NvckZlYXR1cmVQcmVzZW50CiA4ODEgc3R1YiBPcGVuV2FpdGFibGVUaW1lckEKIDg4MiBzdHViIE9wZW5XYWl0YWJsZVRpbWVyVwogODgzIHN0dWIgUmVhZENvbnNvbGVJbnB1dEV4QQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2x6MzIuc3BlYyBiL3JlbGF5MzIvbHozMi5zcGVjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpZjE2MzIvbHozMi5zcGVjCnJlbmFtZSB0byByZWxheTMyL2x6MzIuc3BlYwpkaWZmIC0tZ2l0IGEvaWYxNjMyL21wci5zcGVjIGIvcmVsYXkzMi9tcHIuc3BlYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaWYxNjMyL21wci5zcGVjCnJlbmFtZSB0byByZWxheTMyL21wci5zcGVjCmRpZmYgLS1naXQgYS9yZWxheTMyL21zdmZ3MzIuc3BlYyBiL3JlbGF5MzIvbXN2ZnczMi5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzU0NjEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxheTMyL21zdmZ3MzIuc3BlYwpAQCAtMCwwICsxLDUyIEBACituYW1lCW1zdmZ3MzIKK3R5cGUJd2luMzIKKworICAyIHN0dWIgICAgVmlkZW9Gb3JXaW5kb3dzVmVyc2lvbgorICAzIHN0dWIgICAgRHJhd0RpYkJlZ2luCisgIDQgc3R1YiAgICBEcmF3RGliQ2hhbmdlUGFsZXR0ZQorICA1IHN0dWIgICAgRHJhd0RpYkNsb3NlCisgIDYgc3R1YiAgICBEcmF3RGliRHJhdworICA3IHN0dWIgICAgRHJhd0RpYkVuZAorICA4IHN0dWIgICAgRHJhd0RpYkdldEJ1ZmZlcgorICA5IHN0dWIgICAgRHJhd0RpYkdldFBhbGV0dGUKKyAxMCBzdHViICAgIERyYXdEaWJPcGVuCisgMTEgc3R1YiAgICBEcmF3RGliUHJvZmlsZURpc3BsYXkKKyAxMiBzdHViICAgIERyYXdEaWJSZWFsaXplCisgMTMgc3R1YiAgICBEcmF3RGliU2V0UGFsZXR0ZQorIDE0IHN0dWIgICAgRHJhd0RpYlN0YXJ0CisgMTUgc3R1YiAgICBEcmF3RGliU3RvcAorIDE2IHN0dWIgICAgRHJhd0RpYlRpbWUKKyAxNyBzdHViICAgIEdldE9wZW5GaWxlTmFtZVByZXZpZXcKKyAxOCBzdHViICAgIEdldE9wZW5GaWxlTmFtZVByZXZpZXdBCisgMTkgc3R1YiAgICBHZXRPcGVuRmlsZU5hbWVQcmV2aWV3VworIDIwIHN0dWIgICAgR2V0U2F2ZUZpbGVOYW1lUHJldmlld0EKKyAyMSBzdHViICAgIEdldFNhdmVGaWxlTmFtZVByZXZpZXdXCisgMjIgc3R1YiAgICBJQ0Nsb3NlCisgMjMgc3R1YiAgICBJQ0NvbXByZXNzCisgMjQgc3R1YiAgICBJQ0NvbXByZXNzb3JDaG9vc2UKKyAyNSBzdHViICAgIElDQ29tcHJlc3NvckZyZWUKKyAyNiBzdHViICAgIElDRGVjb21wcmVzcworIDI3IHN0dWIgICAgSUNEcmF3CisgMjggc3R1YiAgICBJQ0RyYXdCZWdpbgorIDI5IHN0dWIgICAgSUNHZXREaXNwbGF5Rm9ybWF0CisgMzAgc3R1YiAgICBJQ0dldEluZm8KKyAzMSBzdHViICAgIElDSW1hZ2VDb21wcmVzcworIDMyIHN0dWIgICAgSUNJbWFnZURlY29tcHJlc3MKKyAzMyBzdHViICAgIElDSW5mbworIDM0IHN0dWIgICAgSUNJbnN0YWxsCisgMzUgc3R1YiAgICBJQ0xvY2F0ZQorIDM2IHN0dWIgICAgSUNNVGh1bmszMgorIDM3IHN0dWIgICAgSUNPcGVuCisgMzggc3R1YiAgICBJQ09wZW5GdW5jdGlvbgorIDM5IHN0dWIgICAgSUNSZW1vdmUKKyA0MCBzdHViICAgIElDU2VuZE1lc3NhZ2UKKyA0MSBzdHViICAgIElDU2VxQ29tcHJlc3NGcmFtZQorIDQyIHN0dWIgICAgSUNTZXFDb21wcmVzc0ZyYW1lRW5kCisgNDMgc3R1YiAgICBJQ1NlcUNvbXByZXNzRnJhbWVTdGFydAorIDQ0IHN0dWIgICAgTUNJV25kQ3JlYXRlCisgNDUgc3R1YiAgICBNQ0lXbmRDcmVhdGVBCisgNDYgc3R1YiAgICBNQ0lXbmRDcmVhdGVXCisgNDcgc3R1YiAgICBNQ0lXbmRSZWdpc3RlckNsYXNzCisgNDggc3R1YiAgICBTdHJldGNoRElCCisgNDkgc3R1YiAgICBsc19UaHVua0RhdGEzMgorIDUwIHN0dWIgICAgc2xfVGh1bmtEYXRhMzIKZGlmZiAtLWdpdCBhL2lmMTYzMi9udGRsbC5zcGVjIGIvcmVsYXkzMi9udGRsbC5zcGVjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpZjE2MzIvbnRkbGwuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi9udGRsbC5zcGVjCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMzIuc3BlYyBiL3JlbGF5MzIvb2xlMzIuc3BlYwpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBpZjE2MzIvb2xlMzIuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi9vbGUzMi5zcGVjCmluZGV4IDE4Y2VjODAuLjNmYWE5ZTUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9vbGUzMi5zcGVjCisrKyBiL3JlbGF5MzIvb2xlMzIuc3BlYwpAQCAtMywxMiArMywxMiBAQAogCiAgIDEgc3R1YiBCaW5kTW9uaWtlcgogICAyIHN0dWIgQ0xTSURGcm9tUHJvZ0lECi0gIDMgc3R1YiBDTFNJREZyb21TdHJpbmcKLSAgNCBzdHViIENvQnVpbGRWZXJzaW9uCisgIDMgc3RkY2FsbCBDTFNJREZyb21TdHJpbmcoc3RyIHB0cikgQ0xTSURGcm9tU3RyaW5nCisgIDQgc3RkY2FsbCBDb0J1aWxkVmVyc2lvbigpIENvQnVpbGRWZXJzaW9uCiAgIDUgc3R1YiBDb0NyZWF0ZUZyZWVUaHJlYWRlZE1hcnNoYWxlcgogICA2IHN0dWIgQ29DcmVhdGVHdWlkCiAgIDcgc3R1YiBDb0NyZWF0ZUluc3RhbmNlCi0gIDggc3R1YiBDb0Rpc2Nvbm5lY3RPYmplY3QKKyAgOCBzdGRjYWxsIENvRGlzY29ubmVjdE9iamVjdChwdHIgbG9uZykgQ29EaXNjb25uZWN0T2JqZWN0CiAgIDkgc3R1YiBDb0Rvc0RhdGVUaW1lVG9GaWxlVGltZQogIDEwIHN0dWIgQ29GaWxlVGltZU5vdwogIDExIHN0dWIgQ29GaWxlVGltZVRvRG9zRGF0ZVRpbWUKQEAgLTIwLDEzICsyMCwxMyBAQAogIDE3IHN0dWIgQ29HZXRDdXJyZW50TG9naWNhbFRocmVhZElkCiAgMTggc3R1YiBDb0dldEN1cnJlbnRQcm9jZXNzCiAgMTkgc3R1YiBDb0dldEludGVyZmFjZUFuZFJlbGVhc2VTdHJlYW0KLSAyMCBzdHViIENvR2V0TWFsbG9jCisgMjAgc3RkY2FsbCBDb0dldE1hbGxvYyhsb25nIHB0cikgQ29HZXRNYWxsb2MKICAyMSBzdHViIENvR2V0TWFyc2hhbFNpemVNYXgKICAyMiBzdHViIENvR2V0UFNDbHNpZAogIDIzIHN0dWIgQ29HZXRTdGFuZGFyZE1hcnNoYWwKICAyNCBzdHViIENvR2V0U3RhdGUKICAyNSBzdHViIENvR2V0VHJlYXRBc0NsYXNzCi0gMjYgc3R1YiBDb0luaXRpYWxpemUKKyAyNiBzdGRjYWxsIENvSW5pdGlhbGl6ZShsb25nKSBDb0luaXRpYWxpemUKICAyNyBzdHViIENvSW5pdGlhbGl6ZVdPVwogIDI4IHN0dWIgQ29Jc0hhbmRsZXJDb25uZWN0ZWQKICAyOSBzdHViIENvSXNPbGUxQ2xhc3MKQEAgLTQ3LDcgKzQ3LDcgQEAKICA0NCBzdHViIENvVGFza01lbUZyZWUKICA0NSBzdHViIENvVGFza01lbVJlYWxsb2MKICA0NiBzdHViIENvVHJlYXRBc0NsYXNzCi0gNDcgc3R1YiBDb1VuaW5pdGlhbGl6ZQorIDQ3IHN0ZGNhbGwgQ29VbmluaXRpYWxpemUoKSBDb1VuaXRpYWxpemUKICA0OCBzdHViIENvVW5sb2FkaW5nV09XCiAgNDkgc3R1YiBDb1VubWFyc2hhbEhyZXN1bHQKICA1MCBzdHViIENvVW5tYXJzaGFsSW50ZXJmYWNlCkBAIC0xNTEsNyArMTUxLDcgQEAKIDE0OCBzdHViIFN0Z09wZW5TdG9yYWdlCiAxNDkgc3R1YiBTdGdPcGVuU3RvcmFnZU9uSUxvY2tCeXRlcwogMTUwIHN0dWIgU3RnU2V0VGltZXMKLTE1MSBzdHViIFN0cmluZ0Zyb21DTFNJRAorMTUxIHN0ZGNhbGwgU3RyaW5nRnJvbUNMU0lEKHB0ciBwdHIpIFN0cmluZ0Zyb21DTFNJRAogMTUyIHN0dWIgU3RyaW5nRnJvbUdVSUQyCiAxNTMgc3R1YiBTdHJpbmdGcm9tSUlECiAxNTQgc3R1YiBVdENvbnZlcnREdnRkMTZ0b0R2dGQzMgpkaWZmIC0tZ2l0IGEvaWYxNjMyL29sZWNsaTMyLnNwZWMgYi9yZWxheTMyL29sZWNsaTMyLnNwZWMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGlmMTYzMi9vbGVjbGkzMi5zcGVjCnJlbmFtZSB0byByZWxheTMyL29sZWNsaTMyLnNwZWMKZGlmZiAtLWdpdCBhL2lmMTYzMi9vbGVzdnIzMi5zcGVjIGIvcmVsYXkzMi9vbGVzdnIzMi5zcGVjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpZjE2MzIvb2xlc3ZyMzIuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi9vbGVzdnIzMi5zcGVjCmRpZmYgLS1naXQgYS9yZWxheTMyL3JlbGF5Mzg2LmMgYi9yZWxheTMyL3JlbGF5Mzg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzMWU0YQotLS0gL2Rldi9udWxsCisrKyBiL3JlbGF5MzIvcmVsYXkzODYuYwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIDM4Ni1zcGVjaWZpYyBXaW4zMiByZWxheSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaWZkZWYgX19pMzg2X18KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgIndpbm50LmgiCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImJ1aWx0aW4zMi5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSRUxBWV9DYWxsRnJvbTMyCisgKgorICogU3RhY2sgbGF5b3V0IG9uIGVudHJ5IHRvIHRoaXMgZnVuY3Rpb246CisgKiAgLi4uICAgICAgLi4uCisgKiAoZXNwKzEyKSAgYXJnMgorICogKGVzcCs4KSAgIGFyZzEKKyAqIChlc3ArNCkgICByZXRfYWRkcgorICogKGVzcCkgICAgIHJldHVybiBhZGRyIHRvIHJlbGF5IGNvZGUKKyAqLworaW50IFJFTEFZX0NhbGxGcm9tMzIoIGludCByZXRfYWRkciwgLi4uICkKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIGNoYXIgYnVmZmVyWzgwXTsKKyAgICBGQVJQUk9DMzIgZnVuYzsKKyAgICB1bnNpZ25lZCBpbnQgbWFzaywgdHlwZW1hc2s7CisKKyAgICBpbnQgKmFyZ3MgPSAmcmV0X2FkZHI7CisgICAgLyogUmVsYXkgYWRkciBpcyB0aGUgcmV0dXJuIGFkZHJlc3MgZm9yIHRoaXMgZnVuY3Rpb24gKi8KKyAgICBCWVRFICpyZWxheV9hZGRyID0gKEJZVEUgKilhcmdzWy0xXTsKKyAgICBXT1JEIG5iX2FyZ3MgPSAqKFdPUkQgKikocmVsYXlfYWRkciArIDEpIC8gc2l6ZW9mKGludCk7CisKKyAgICBhc3NlcnQoZGVidWdnaW5nX3JlbGF5KTsKKyAgICBmdW5jID0gKEZBUlBST0MzMilCVUlMVElOMzJfR2V0RW50cnlQb2ludCggYnVmZmVyLCByZWxheV9hZGRyIC0gNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVtYXNrICk7CisgICAgcHJpbnRmKCAiQ2FsbCAlcygiLCBidWZmZXIgKTsKKyAgICBhcmdzKys7CisgICAgZm9yIChpID0gMCwgbWFzayA9IDM7IGkgPCBuYl9hcmdzOyBpKyssIG1hc2sgPDw9IDIpCisgICAgeworICAgICAgICBpZiAoaSkgcHJpbnRmKCAiLCIgKTsKKwlpZiAoKHR5cGVtYXNrICYgbWFzaykgJiYgSElXT1JEKGFyZ3NbaV0pKQorICAgICAgICB7CisJICAgIGlmICh0eXBlbWFzayAmICgyPDwoMippKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciBidWZmWzgwXTsKKyAgICAgICAgICAgICAgICBsc3RyY3B5bld0b0EoIGJ1ZmYsIChMUFdTVFIpYXJnc1tpXSwgc2l6ZW9mKGJ1ZmYpICk7CisJICAgIAlwcmludGYoICIlMDh4IExcIiVzXCIiLCBhcmdzW2ldLCBidWZmICk7CisJICAgIH0KKyAgICAgICAgICAgIGVsc2UgcHJpbnRmKCAiJTA4eCBcIiVzXCIiLCBhcmdzW2ldLCAoY2hhciAqKWFyZ3NbaV0gKTsKKwl9CisgICAgICAgIGVsc2UgcHJpbnRmKCAiJTA4eCIsIGFyZ3NbaV0gKTsKKyAgICB9CisgICAgcHJpbnRmKCAiKSByZXQ9JTA4eFxuIiwgcmV0X2FkZHIgKTsKKyAgICBpZiAoKnJlbGF5X2FkZHIgPT0gMHhjMykgLyogY2RlY2wgKi8KKyAgICB7CisgICAgICAgIExSRVNVTFQgKCpjZnVuYykoKSA9IChMUkVTVUxUKCopKCkpZnVuYzsKKyAgICAgICAgc3dpdGNoKG5iX2FyZ3MpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAwOiByZXQgPSBjZnVuYygpOyBicmVhazsKKyAgICAgICAgY2FzZSAxOiByZXQgPSBjZnVuYyhhcmdzWzBdKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMzogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pOyBicmVhazsKKyAgICAgICAgY2FzZSA0OiByZXQgPSBjZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNTogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNjogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0pOyBicmVhazsKKyAgICAgICAgY2FzZSA3OiByZXQgPSBjZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdKTsgYnJlYWs7CisgICAgICAgIGNhc2UgODogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddKTsgYnJlYWs7CisgICAgICAgIGNhc2UgOTogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0pOyBicmVhazsKKyAgICAgICAgY2FzZSAxMDogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0pOyBicmVhazsKKyAgICAgICAgY2FzZSAxMTogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0pOyBicmVhazsKKyAgICAgICAgY2FzZSAxMjogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMTFdKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTM6IHJldCA9IGNmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdLGFyZ3NbMTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzEyXSk7IGJyZWFrOworICAgICAgICBjYXNlIDE0OiByZXQgPSBjZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSxhcmdzWzExXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1sxMl0sYXJnc1sxM10pOyBicmVhazsKKyAgICAgICAgY2FzZSAxNTogcmV0ID0gY2Z1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sYXJnc1sxMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMTJdLGFyZ3NbMTNdLGFyZ3NbMTRdKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJSRUxBWV9DYWxsRnJvbTMyOiBVbnN1cHBvcnRlZCBuYiBhcmdzICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgbmJfYXJncyApOworICAgICAgICAgICAgYXNzZXJ0KEZBTFNFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlICAvKiBzdGRjYWxsICovCisgICAgeworICAgICAgICBzd2l0Y2gobmJfYXJncykKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6IHJldCA9IGZ1bmMoKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTogcmV0ID0gZnVuYyhhcmdzWzBdKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjogcmV0ID0gZnVuYyhhcmdzWzBdLGFyZ3NbMV0pOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNDogcmV0ID0gZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdKTsgYnJlYWs7CisgICAgICAgIGNhc2UgNTogcmV0ID0gZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pOyBicmVhazsKKyAgICAgICAgY2FzZSA2OiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNV0pOyBicmVhazsKKyAgICAgICAgY2FzZSA3OiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSk7IGJyZWFrOworICAgICAgICBjYXNlIDg6IHJldCA9IGZ1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdLGFyZ3NbN10pOyBicmVhazsKKyAgICAgICAgY2FzZSA5OiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0pOyBicmVhazsKKyAgICAgICAgY2FzZSAxMDogcmV0ID0gZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTE6IHJldCA9IGZ1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSk7IGJyZWFrOworICAgICAgICBjYXNlIDEyOiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1sxMV0pOyBicmVhazsKKyAgICAgICAgY2FzZSAxMzogcmV0ID0gZnVuYyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdLGFyZ3NbMTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMTJdKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTQ6IHJldCA9IGZ1bmMoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSxhcmdzWzEwXSxhcmdzWzExXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzEyXSxhcmdzWzEzXSk7IGJyZWFrOworICAgICAgICBjYXNlIDE1OiByZXQgPSBmdW5jKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sYXJnc1sxMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1sxMl0sYXJnc1sxM10sYXJnc1sxNF0pOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlJFTEFZX0NhbGxGcm9tMzI6IFVuc3VwcG9ydGVkIG5iIGFyZ3MgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBuYl9hcmdzICk7CisgICAgICAgICAgICBhc3NlcnQoRkFMU0UpOworICAgICAgICB9CisgICAgfQorICAgIHByaW50ZiggIlJldCAgJXMoKSByZXR2YWw9JTA4eCByZXQ9JTA4eFxuIiwgYnVmZmVyLCByZXQsIHJldF9hZGRyICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBSRUxBWV9DYWxsRnJvbTMyUmVncworICoKKyAqICdzdGFjaycgcG9pbnRzIHRvIHRoZSByZWxheSBhZGRyIG9uIHRoZSBzdGFjay4KKyAqIFN0YWNrIGxheW91dDoKKyAqICAuLi4gICAgICAuLi4KKyAqIChlc3ArMjE2KSByZXRfYWRkcgorICogKGVzcCsyMTIpIHJldHVybiB0byByZWxheSBkZWJ1Z2dpbmcgY29kZSAob25seSB3aGVuIGRlYnVnZ2luZ19yZWxheSkKKyAqIChlc3ArMjA4KSBlbnRyeSBwb2ludCB0byBjYWxsCisgKiAoZXNwKzQpICAgQ09OVEVYVAorICogKGVzcCkgICAgIHJldHVybiBhZGRyIHRvIHJlbGF5IGNvZGUKKyAqLwordm9pZCBSRUxBWV9DYWxsRnJvbTMyUmVncyggQ09OVEVYVCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoQ0FMTEJBQ0sgKmVudHJ5X3BvaW50KShDT05URVhUICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQllURSAqcmVsYXlfYWRkciwgaW50IHJldF9hZGRyICkKK3sKKyAgICBpZiAoIWRlYnVnZ2luZ19yZWxheSkKKyAgICB7CisgICAgICAgIC8qIFNpbXBseSBjYWxsIHRoZSBlbnRyeSBwb2ludCAqLworICAgICAgICBlbnRyeV9wb2ludCggJmNvbnRleHQgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY2hhciBidWZmZXJbODBdOworICAgICAgICB1bnNpZ25lZCBpbnQgdHlwZW1hc2s7CisKKyAgICAJX19SRVNUT1JFX0VTOworICAgICAgICAvKiBGaXh1cCB0aGUgY29udGV4dCBzdHJ1Y3R1cmUgYmVjYXVzZSBvZiB0aGUgZXh0cmEgcGFyYW1ldGVyICovCisgICAgICAgIC8qIHB1c2hlZCBieSB0aGUgcmVsYXkgZGVidWdnaW5nIGNvZGUgKi8KKworICAgICAgICBFSVBfcmVnKCZjb250ZXh0KSA9IHJldF9hZGRyOworICAgICAgICBFU1BfcmVnKCZjb250ZXh0KSArPSBzaXplb2YoaW50KTsKKworICAgICAgICBCVUlMVElOMzJfR2V0RW50cnlQb2ludCggYnVmZmVyLCByZWxheV9hZGRyIC0gNSwgJnR5cGVtYXNrICk7CisgICAgICAgIHByaW50ZigiQ2FsbCAlcyhyZWdzKSByZXQ9JTA4eFxuIiwgYnVmZmVyLCByZXRfYWRkciApOworICAgICAgICBwcmludGYoIiBFQVg9JTA4bHggRUJYPSUwOGx4IEVDWD0lMDhseCBFRFg9JTA4bHggRVNJPSUwOGx4IEVEST0lMDhseFxuIiwKKyAgICAgICAgICAgICAgICBFQVhfcmVnKCZjb250ZXh0KSwgRUJYX3JlZygmY29udGV4dCksIEVDWF9yZWcoJmNvbnRleHQpLAorICAgICAgICAgICAgICAgIEVEWF9yZWcoJmNvbnRleHQpLCBFU0lfcmVnKCZjb250ZXh0KSwgRURJX3JlZygmY29udGV4dCkgKTsKKyAgICAgICAgcHJpbnRmKCIgRUJQPSUwOGx4IEVTUD0lMDhseCBFSVA9JTA4bHggRFM9JTA0bHggRVM9JTA0bHggRlM9JTA0bHggR1M9JTA0bHggRUZMPSUwOGx4XG4iLAorICAgICAgICAgICAgICAgIEVCUF9yZWcoJmNvbnRleHQpLCBFU1BfcmVnKCZjb250ZXh0KSwgRUlQX3JlZygmY29udGV4dCksCisgICAgICAgICAgICAgICAgRFNfcmVnKCZjb250ZXh0KSwgRVNfcmVnKCZjb250ZXh0KSwgRlNfcmVnKCZjb250ZXh0KSwKKyAgICAgICAgICAgICAgICBHU19yZWcoJmNvbnRleHQpLCBFRkxfcmVnKCZjb250ZXh0KSApOworCisgICAgICAgIC8qIE5vdyBjYWxsIHRoZSByZWFsIGZ1bmN0aW9uICovCisgICAgICAgIGVudHJ5X3BvaW50KCAmY29udGV4dCApOworCisgICAgICAgIHByaW50ZigiUmV0ICAlcygpIHJldHZhbD1yZWdzIHJldD0lMDh4XG4iLCBidWZmZXIsIHJldF9hZGRyICk7CisgICAgICAgIHByaW50ZigiIEVBWD0lMDhseCBFQlg9JTA4bHggRUNYPSUwOGx4IEVEWD0lMDhseCBFU0k9JTA4bHggRURJPSUwOGx4XG4iLAorICAgICAgICAgICAgICAgIEVBWF9yZWcoJmNvbnRleHQpLCBFQlhfcmVnKCZjb250ZXh0KSwgRUNYX3JlZygmY29udGV4dCksCisgICAgICAgICAgICAgICAgRURYX3JlZygmY29udGV4dCksIEVTSV9yZWcoJmNvbnRleHQpLCBFRElfcmVnKCZjb250ZXh0KSApOworICAgICAgICBwcmludGYoIiBFQlA9JTA4bHggRVNQPSUwOGx4IEVJUD0lMDhseCBEUz0lMDRseCBFUz0lMDRseCBGUz0lMDRseCBHUz0lMDRseCBFRkw9JTA4bHhcbiIsCisgICAgICAgICAgICAgICAgRUJQX3JlZygmY29udGV4dCksIEVTUF9yZWcoJmNvbnRleHQpLCBFSVBfcmVnKCZjb250ZXh0KSwKKyAgICAgICAgICAgICAgICBEU19yZWcoJmNvbnRleHQpLCBFU19yZWcoJmNvbnRleHQpLCBGU19yZWcoJmNvbnRleHQpLAorICAgICAgICAgICAgICAgIEdTX3JlZygmY29udGV4dCksIEVGTF9yZWcoJmNvbnRleHQpICk7CisgICAgfQorfQorCisjZW5kaWYgIC8qIF9faTM4Nl9fICovCmRpZmYgLS1naXQgYS9pZjE2MzIvc2hlbGwzMi5zcGVjIGIvcmVsYXkzMi9zaGVsbDMyLnNwZWMKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gaWYxNjMyL3NoZWxsMzIuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi9zaGVsbDMyLnNwZWMKaW5kZXggOTg2N2U2MC4uZjMxZDhhMyAxMDA2NDQKLS0tIGEvaWYxNjMyL3NoZWxsMzIuc3BlYworKysgYi9yZWxheTMyL3NoZWxsMzIuc3BlYwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZXNlIG5lZWQgdG8gaGF2ZSB0aGVzZSBleGFjdCBvcmRpbmFscywgZm9yIHNvbWUgd2luOTUgZGxscyAKICMgIGltcG9ydCBzaGVsbDMyLmRsbCBieSBvcmRpbmFsKQogCi0gICAyIHN0dWIgU0hFTEwzMl8yCisgICAyIHN0ZGNhbGwgU0hFTEwzMl8yKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBTSEVMTDMyXzIKICAgIDMgc3R1YiBDaGVja0VzY2FwZXNBCiAgICA0IHN0dWIgU0hFTEwzMl80CiAgICA1IHN0dWIgU0hFTEwzMl81CkBAIC0yOSwxMCArMjksMTAgQEAKICAgMjcgc3R1YiBTSEVMTDMyXzI3CiAgIDI4IHN0dWIgU0hFTEwzMl8yOAogICAyOSBzdGRjYWxsIFNIRUxMMzJfMjkoc3RyKSBTSEVMTDMyXzI5Ci0gIDMwIHN0dWIgU0hFTEwzMl8zMAotICAzMSBzdHViIFNIRUxMMzJfMzEKKyAgMzAgc3RkY2FsbCBTSEVMTDMyXzMwKHB0ciBsb25nKSBTSEVMTDMyXzMwCisgIDMxIHN0ZGNhbGwgU0hFTEwzMl8zMShzdHIpIFNIRUxMMzJfMzEKICAgMzIgc3RkY2FsbCBTSEVMTDMyXzMyKHN0cikgU0hFTEwzMl8zMgotICAzMyBzdHViIFNIRUxMMzJfMzMKKyAgMzMgc3RkY2FsbCBTSEVMTDMyXzMzKHN0cikgU0hFTEwzMl8zMwogICAzNCBzdGRjYWxsIFNIRUxMMzJfMzQoc3RyKSBTSEVMTDMyXzM0CiAgIDM1IHN0ZGNhbGwgU0hFTEwzMl8zNShzdHIpIFNIRUxMMzJfMzUKICAgMzYgc3RkY2FsbCBTSEVMTDMyXzM2KHN0ciBzdHIpIFNIRUxMMzJfMzYKQEAgLTU1LDE5ICs1NSwxOSBAQAogICA1MyBzdHViIERyYWdRdWVyeUZpbGVBb3JXCiAgIDU0IHN0dWIgRHJhZ1F1ZXJ5RmlsZVcKICAgNTUgc3R1YiBTSEVMTDMyXzU1Ci0gIDU2IHN0dWIgU0hFTEwzMl81NgorICA1NiBzdGRjYWxsIFNIRUxMMzJfNTYoc3RyKSBTSEVMTDMyXzU2CiAgIDU3IHN0dWIgU0hFTEwzMl81NwotICA1OCBzdHViIFNIRUxMMzJfNTgKKyAgNTggc3RkY2FsbCBTSEVMTDMyXzU4KGxvbmcgbG9uZyBsb25nIGxvbmcpIFNIRUxMMzJfNTgKICAgNTkgc3R1YiBTSEVMTDMyXzU5CiAgIDYwIHN0dWIgU0hFTEwzMl82MAogICA2MSBzdHViIFNIRUxMMzJfNjEKICAgNjIgc3RkY2FsbCBTSEVMTDMyXzYyKGxvbmcgbG9uZyBsb25nIGxvbmcpIFNIRUxMMzJfNjIKLSAgNjMgc3R1YiBTSEVMTDMyXzYzCisgIDYzIHN0ZGNhbGwgU0hFTEwzMl82Myhsb25nIGxvbmcgbG9uZyBsb25nIHN0ciBzdHIgc3RyKSBTSEVMTDMyXzYzCiAgIDY0IHN0dWIgU0hFTEwzMl82NAogICA2NSBzdHViIFNIRUxMMzJfNjUKICAgNjYgc3R1YiBTSEVMTDMyXzY2CiAgIDY3IHN0dWIgU0hFTEwzMl82NwotICA2OCBzdHViIFNIRUxMMzJfNjgKKyAgNjggc3RkY2FsbCBTSEVMTDMyXzY4KGxvbmcgbG9uZyBsb25nKSBTSEVMTDMyXzY4CiAgIDY5IHN0dWIgU0hFTEwzMl82OQogICA3MCBzdHViIFNIRUxMMzJfNzAKICAgNzEgc3RkY2FsbCBTSEVMTDMyXzcxKHB0ciBwdHIpIFNIRUxMMzJfNzEKQEAgLTg4LDcgKzg4LDcgQEAKICAgODYgc3R1YiBTSEVMTDMyXzg2CiAgIDg3IHN0dWIgU0hFTEwzMl84NwogICA4OCBzdHViIFNIRUxMMzJfODgKLSAgODkgc3R1YiBTSEVMTDMyXzg5CisgIDg5IHN0ZGNhbGwgU0hFTEwzMl84OShsb25nIGxvbmcgbG9uZykgU0hFTEwzMl84OQogICA5MCBzdHViIFNIRUxMMzJfOTAKICAgOTEgc3R1YiBTSEVMTDMyXzkxCiAgIDkyIHN0dWIgU0hFTEwzMl85MgpAQCAtMTAwLDcgKzEwMCw3IEBACiAgIDk4IHN0dWIgU0hFTEwzMl85OAogICA5OSBzdHViIFNIRUxMMzJfOTkKICAxMDAgc3RkY2FsbCBTSEVMTDMyXzEwMChsb25nKSBTSEVMTDMyXzEwMAotIDEwMSBzdHViIEV4dHJhY3RBc3NvY2lhdGVkSWNvbkV4QQorIDEwMSBzdGRjYWxsIEV4dHJhY3RBc3NvY2lhdGVkSWNvbkEobG9uZyBwdHIgbG9uZykgRXh0cmFjdEFzc29jaWF0ZWRJY29uMzJBCiAgMTAyIHN0ZGNhbGwgU0hFTEwzMl8xMDIocHRyIHB0ciBsb25nIHB0ciBwdHIpIFNIRUxMMzJfMTAyCiAgMTAzIHN0dWIgU0hFTEwzMl8xMDMKICAxMDQgc3R1YiBTSEVMTDMyXzEwNApAQCAtMjE5LDEwICsyMTksMTAgQEAKICAyMTcgc3RkY2FsbCBTSEdldEZpbGVJbmZvKHB0ciBsb25nIHB0ciBsb25nIGxvbmcpIFNIR2V0RmlsZUluZm8zMkEKICAyMTggc3RkY2FsbCBTSEdldEZpbGVJbmZvQShwdHIgbG9uZyBwdHIgbG9uZyBsb25nKSBTSEdldEZpbGVJbmZvMzJBCiAgMjE5IHN0dWIgU0hHZXRJbnN0YW5jZUV4cGxvcmVyCi0gMjIwIHN0dWIgU0hHZXRNYWxsb2MKLSAyMjEgc3R1YiBTSEdldFBhdGhGcm9tSURMaXN0CisgMjIwIHN0ZGNhbGwgU0hHZXRNYWxsb2MocHRyKSBTSEdldE1hbGxvYworIDIyMSBzdGRjYWxsIFNIR2V0UGF0aEZyb21JRExpc3QocHRyIHB0cikgU0hHZXRQYXRoRnJvbUlETGlzdAogIDIyMiBzdHViIFNIR2V0UGF0aEZyb21JRExpc3RBCi0gMjIzIHN0dWIgU0hHZXRTcGVjaWFsRm9sZGVyTG9jYXRpb24KKyAyMjMgc3RkY2FsbCBTSEdldFNwZWNpYWxGb2xkZXJMb2NhdGlvbihsb25nIGxvbmcgcHRyKSBTSEdldFNwZWNpYWxGb2xkZXJMb2NhdGlvbgogIDIyNCBzdHViIFNISGVscFNob3J0Y3V0c19SdW5ETEwKICAyMjUgc3R1YiBTSExvYWRJblByb2MKICAyMjYgc3R1YiBTaGVDaGFuZ2VEaXJBCkBAIC0yNDgsOCArMjQ4LDggQEAKICAyNDYgc3R1YiBTaGVsbEV4ZWN1dGVFeAogIDI0NyBzdHViIFNoZWxsRXhlY3V0ZUV4QQogIDI0OCBzdHViIFNoZWxsRXhlY3V0ZVcKLSAyNDkgc3R1YiBTaGVsbF9Ob3RpZnlJY29uCi0gMjUwIHN0dWIgU2hlbGxfTm90aWZ5SWNvbkEKKyAyNDkgc3RkY2FsbCBTaGVsbF9Ob3RpZnlJY29uKGxvbmcgcHRyKSBTaGVsbF9Ob3RpZnlJY29uCisgMjUwIHN0ZGNhbGwgU2hlbGxfTm90aWZ5SWNvbkEobG9uZyBwdHIpIFNoZWxsX05vdGlmeUljb25BCiAgMjUxIHN0dWIgU2hsMTYzMl9UaHVua0RhdGEzMgogIDI1MiBzdHViIFNobDMyMTZfVGh1bmtEYXRhMzIKICA1MDUgc3R1YiBTSEVMTDMyXzUwNQpkaWZmIC0tZ2l0IGEvcmVsYXkzMi90YXBpMzIuc3BlYyBiL3JlbGF5MzIvdGFwaTMyLnNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExZDBhYgotLS0gL2Rldi9udWxsCisrKyBiL3JlbGF5MzIvdGFwaTMyLnNwZWMKQEAgLTAsMCArMSwxMTcgQEAKK25hbWUJdGFwaTMyCit0eXBlCXdpbjMyCisKKyAgMSBzdHViICAgIGxpbmVBY2NlcHQKKyAgMiBzdHViICAgIGxpbmVBZGRQcm92aWRlcgorICAzIHN0dWIgICAgbGluZUFkZFRvQ29uZmVyZW5jZQorICA0IHN0dWIgICAgbGluZUFuc3dlcgorICA1IHN0dWIgICAgbGluZUJsaW5kVHJhbnNmZXIKKyAgNiBzdHViICAgIGxpbmVDbG9zZQorICA3IHN0dWIgICAgbGluZUNvbXBsZXRlQ2FsbAorICA4IHN0dWIgICAgbGluZUNvbXBsZXRlVHJhbnNmZXIKKyAgOSBzdHViICAgIGxpbmVDb25maWdEaWFsb2cKKyAxMCBzdHViICAgIGxpbmVDb25maWdEaWFsb2dFZGl0CisgMTEgc3R1YiAgICBsaW5lQ29uZmlnUHJvdmlkZXIKKyAxMiBzdHViICAgIGxpbmVEZWFsbG9jYXRlQ2FsbAorIDEzIHN0dWIgICAgbGluZURldlNwZWNpZmljCisgMTQgc3R1YiAgICBsaW5lRGV2U3BlY2lmaWNGZWF0dXJlCisgMTUgc3R1YiAgICBsaW5lRGlhbAorIDE2IHN0dWIgICAgbGluZURyb3AKKyAxNyBzdHViICAgIGxpbmVGb3J3YXJkCisgMTggc3R1YiAgICBsaW5lR2F0aGVyRGlnaXRzCisgMTkgc3R1YiAgICBsaW5lR2VuZXJhdGVEaWdpdHMKKyAyMCBzdHViICAgIGxpbmVHZW5lcmF0ZVRvbmUKKyAyMSBzdHViICAgIGxpbmVHZXRBZGRyZXNzQ2FwcworIDIyIHN0dWIgICAgbGluZUdldEFkZHJlc3NJRAorIDIzIHN0dWIgICAgbGluZUdldEFkZHJlc3NTdGF0dXMKKyAyNCBzdHViICAgIGxpbmVHZXRBcHBQcmlvcml0eQorIDI1IHN0dWIgICAgbGluZUdldENhbGxJbmZvCisgMjYgc3R1YiAgICBsaW5lR2V0Q2FsbFN0YXR1cworIDI3IHN0dWIgICAgbGluZUdldENvbmZSZWxhdGVkQ2FsbHMKKyAyOCBzdHViICAgIGxpbmVHZXRDb3VudHJ5CisgMjkgc3R1YiAgICBsaW5lR2V0RGV2Q2FwcworIDMwIHN0dWIgICAgbGluZUdldERldkNvbmZpZworIDMxIHN0dWIgICAgbGluZUdldElECisgMzIgc3R1YiAgICBsaW5lR2V0SWNvbgorIDMzIHN0dWIgICAgbGluZUdldExpbmVEZXZTdGF0dXMKKyAzNCBzdHViICAgIGxpbmVHZXROZXdDYWxscworIDM1IHN0dWIgICAgbGluZUdldE51bVJpbmdzCisgMzYgc3R1YiAgICBsaW5lR2V0UHJvdmlkZXJMaXN0CisgMzcgc3R1YiAgICBsaW5lR2V0UmVxdWVzdAorIDM4IHN0dWIgICAgbGluZUdldFN0YXR1c01lc3NhZ2VzCisgMzkgc3R1YiAgICBsaW5lR2V0VHJhbnNsYXRlQ2FwcworIDQwIHN0dWIgICAgbGluZUhhbmRvZmYKKyA0MSBzdHViICAgIGxpbmVIb2xkCisgNDIgc3R1YiAgICBsaW5lSW5pdGlhbGl6ZQorIDQzIHN0dWIgICAgbGluZU1ha2VDYWxsCisgNDQgc3R1YiAgICBsaW5lTW9uaXRvckRpZ2l0cworIDQ1IHN0dWIgICAgbGluZU1vbml0b3JNZWRpYQorIDQ2IHN0dWIgICAgbGluZU1vbml0b3JUb25lcworIDQ3IHN0dWIgICAgbGluZU5lZ290aWF0ZUFQSVZlcnNpb24KKyA0OCBzdHViICAgIGxpbmVOZWdvdGlhdGVFeHRWZXJzaW9uCisgNDkgc3R1YiAgICBsaW5lT3BlbgorIDUwIHN0dWIgICAgbGluZVBhcmsKKyA1MSBzdHViICAgIGxpbmVQaWNrdXAKKyA1MiBzdHViICAgIGxpbmVQcmVwYXJlQWRkVG9Db25mZXJlbmNlCisgNTMgc3R1YiAgICBsaW5lUmVkaXJlY3QKKyA1NCBzdHViICAgIGxpbmVSZWdpc3RlclJlcXVlc3RSZWNpcGllbnQKKyA1NSBzdHViICAgIGxpbmVSZWxlYXNlVXNlclVzZXJJbmZvCisgNTYgc3R1YiAgICBsaW5lUmVtb3ZlRnJvbUNvbmZlcmVuY2UKKyA1NyBzdHViICAgIGxpbmVSZW1vdmVQcm92aWRlcgorIDU4IHN0dWIgICAgbGluZVNlY3VyZUNhbGwKKyA1OSBzdHViICAgIGxpbmVTZW5kVXNlclVzZXJJbmZvCisgNjAgc3R1YiAgICBsaW5lU2V0QXBwUHJpb3JpdHkKKyA2MSBzdHViICAgIGxpbmVTZXRBcHBTcGVjaWZpYworIDYyIHN0dWIgICAgbGluZVNldENhbGxQYXJhbXMKKyA2MyBzdHViICAgIGxpbmVTZXRDYWxsUHJpdmlsZWdlCisgNjQgc3R1YiAgICBsaW5lU2V0Q3VycmVudExvY2F0aW9uCisgNjUgc3R1YiAgICBsaW5lU2V0RGV2Q29uZmlnCisgNjYgc3R1YiAgICBsaW5lU2V0TWVkaWFDb250cm9sCisgNjcgc3R1YiAgICBsaW5lU2V0TWVkaWFNb2RlCisgNjggc3R1YiAgICBsaW5lU2V0TnVtUmluZ3MKKyA2OSBzdHViICAgIGxpbmVTZXRTdGF0dXNNZXNzYWdlcworIDcwIHN0dWIgICAgbGluZVNldFRlcm1pbmFsCisgNzEgc3R1YiAgICBsaW5lU2V0VG9sbExpc3QKKyA3MiBzdHViICAgIGxpbmVTZXR1cENvbmZlcmVuY2UKKyA3MyBzdHViICAgIGxpbmVTZXR1cFRyYW5zZmVyCisgNzQgc3R1YiAgICBsaW5lU2h1dGRvd24KKyA3NSBzdHViICAgIGxpbmVTd2FwSG9sZAorIDc2IHN0dWIgICAgbGluZVRyYW5zbGF0ZUFkZHJlc3MKKyA3NyBzdHViICAgIGxpbmVUcmFuc2xhdGVEaWFsb2cKKyA3OCBzdHViICAgIGxpbmVVbmNvbXBsZXRlQ2FsbAorIDc5IHN0dWIgICAgbGluZVVuaG9sZAorIDgwIHN0dWIgICAgbGluZVVucGFyaworIDgxIHN0dWIgICAgcGhvbmVDbG9zZQorIDgyIHN0dWIgICAgcGhvbmVDb25maWdEaWFsb2cKKyA4MyBzdHViICAgIHBob25lRGV2U3BlY2lmaWMKKyA4NCBzdHViICAgIHBob25lR2V0QnV0dG9uSW5mbworIDg1IHN0dWIgICAgcGhvbmVHZXREYXRhCisgODYgc3R1YiAgICBwaG9uZUdldERldkNhcHMKKyA4NyBzdHViICAgIHBob25lR2V0RGlzcGxheQorIDg4IHN0dWIgICAgcGhvbmVHZXRHYWluCisgODkgc3R1YiAgICBwaG9uZUdldEhvb2tTd2l0Y2gKKyA5MCBzdHViICAgIHBob25lR2V0SUQKKyA5MSBzdHViICAgIHBob25lR2V0SWNvbgorIDkyIHN0dWIgICAgcGhvbmVHZXRMYW1wCisgOTMgc3R1YiAgICBwaG9uZUdldFJpbmcKKyA5NCBzdHViICAgIHBob25lR2V0U3RhdHVzCisgOTUgc3R1YiAgICBwaG9uZUdldFN0YXR1c01lc3NhZ2VzCisgOTYgc3R1YiAgICBwaG9uZUdldFZvbHVtZQorIDk3IHN0dWIgICAgcGhvbmVJbml0aWFsaXplCisgOTggc3R1YiAgICBwaG9uZU5lZ290aWF0ZUFQSVZlcnNpb24KKyA5OSBzdHViICAgIHBob25lTmVnb3RpYXRlRXh0VmVyc2lvbgorMTAwIHN0dWIgICAgcGhvbmVPcGVuCisxMDEgc3R1YiAgICBwaG9uZVNldEJ1dHRvbkluZm8KKzEwMiBzdHViICAgIHBob25lU2V0RGF0YQorMTAzIHN0dWIgICAgcGhvbmVTZXREaXNwbGF5CisxMDQgc3R1YiAgICBwaG9uZVNldEdhaW4KKzEwNSBzdHViICAgIHBob25lU2V0SG9va1N3aXRjaAorMTA2IHN0dWIgICAgcGhvbmVTZXRMYW1wCisxMDcgc3R1YiAgICBwaG9uZVNldFJpbmcKKzEwOCBzdHViICAgIHBob25lU2V0U3RhdHVzTWVzc2FnZXMKKzEwOSBzdHViICAgIHBob25lU2V0Vm9sdW1lCisxMTAgc3R1YiAgICBwaG9uZVNodXRkb3duCisxMTEgc3R1YiAgICB0YXBpR2V0TG9jYXRpb25JbmZvCisxMTIgc3R1YiAgICB0YXBpUmVxdWVzdERyb3AKKzExMyBzdHViICAgIHRhcGlSZXF1ZXN0TWFrZUNhbGwKKzExNCBzdHViICAgIHRhcGlSZXF1ZXN0TWVkaWFDYWxsCmRpZmYgLS1naXQgYS9pZjE2MzIvdXNlcjMyLnNwZWMgYi9yZWxheTMyL3VzZXIzMi5zcGVjCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGlmMTYzMi91c2VyMzIuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi91c2VyMzIuc3BlYwppbmRleCBmMGY5OGJlLi41YzA5OWJhIDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlcjMyLnNwZWMKKysrIGIvcmVsYXkzMi91c2VyMzIuc3BlYwpAQCAtNzYsNyArNzYsNyBAQAogIDczIHN0ZGNhbGwgQ3JlYXRlRGlhbG9nUGFyYW1BKGxvbmcgcHRyIGxvbmcgcHRyIGxvbmcpIENyZWF0ZURpYWxvZ1BhcmFtMzJBCiAgNzQgc3RkY2FsbCBDcmVhdGVEaWFsb2dQYXJhbVcobG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgQ3JlYXRlRGlhbG9nUGFyYW0zMlcKICA3NSBzdGRjYWxsIENyZWF0ZUljb24obG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIHB0ciBwdHIpIENyZWF0ZUljb24zMgotIDc2IHN0dWIgQ3JlYXRlSWNvbkZyb21SZXNvdXJjZQorIDc2IHN0ZGNhbGwgQ3JlYXRlSWNvbkZyb21SZXNvdXJjZSAocHRyIGxvbmcgbG9uZyBsb25nKSBDcmVhdGVJY29uRnJvbVJlc291cmNlMzIKICA3NyBzdGRjYWxsIENyZWF0ZUljb25Gcm9tUmVzb3VyY2VFeChwdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIENyZWF0ZUljb25Gcm9tUmVzb3VyY2VFeDMyCiAgNzggc3RkY2FsbCBDcmVhdGVJY29uSW5kaXJlY3QocHRyKSBDcmVhdGVJY29uSW5kaXJlY3QKICA3OSBzdHViIENyZWF0ZU1ESVdpbmRvd0EKQEAgLTM5Niw4ICszOTYsOCBAQAogMzkxIHN0ZGNhbGwgTWVzc2FnZUJveEEobG9uZyBzdHIgc3RyIGxvbmcpIE1lc3NhZ2VCb3gzMkEKIDM5MiBzdGRjYWxsIE1lc3NhZ2VCb3hFeEEobG9uZyBzdHIgc3RyIGxvbmcgbG9uZykgTWVzc2FnZUJveEV4MzJBCiAzOTMgc3RkY2FsbCBNZXNzYWdlQm94RXhXKGxvbmcgd3N0ciB3c3RyIGxvbmcgbG9uZykgTWVzc2FnZUJveEV4MzJXCi0zOTQgc3R1YiBNZXNzYWdlQm94SW5kaXJlY3RBCi0zOTUgc3R1YiBNZXNzYWdlQm94SW5kaXJlY3RXCiszOTQgc3RkY2FsbCBNZXNzYWdlQm94SW5kaXJlY3RBKHB0cikgTWVzc2FnZUJveEluZGlyZWN0MzJBCiszOTUgc3RkY2FsbCBNZXNzYWdlQm94SW5kaXJlY3RXKHB0cikgTWVzc2FnZUJveEluZGlyZWN0MzJXCiAzOTYgc3RkY2FsbCBNZXNzYWdlQm94Vyhsb25nIHdzdHIgd3N0ciBsb25nKSBNZXNzYWdlQm94MzJXCiAzOTcgc3RkY2FsbCBNb2RpZnlNZW51QShsb25nIGxvbmcgbG9uZyBsb25nIHB0cikgTW9kaWZ5TWVudTMyQQogMzk4IHN0ZGNhbGwgTW9kaWZ5TWVudVcobG9uZyBsb25nIGxvbmcgbG9uZyBwdHIpIE1vZGlmeU1lbnUzMlcKQEAgLTQ1OSw4ICs0NTksOCBAQAogNDU0IHN0ZGNhbGwgU2VuZE1lc3NhZ2VBKGxvbmcgbG9uZyBsb25nIGxvbmcpIFNlbmRNZXNzYWdlMzJBCiA0NTUgc3R1YiBTZW5kTWVzc2FnZUNhbGxiYWNrQQogNDU2IHN0dWIgU2VuZE1lc3NhZ2VDYWxsYmFja1cKLTQ1NyBzdHViIFNlbmRNZXNzYWdlVGltZW91dEEKLTQ1OCBzdHViIFNlbmRNZXNzYWdlVGltZW91dFcKKzQ1NyBzdGRjYWxsIFNlbmRNZXNzYWdlVGltZW91dEEobG9uZyBsb25nIGxvbmcgbG9uZyBwdHIgcHRyKSBTZW5kTWVzc2FnZVRpbWVvdXQzMkEKKzQ1OCBzdGRjYWxsIFNlbmRNZXNzYWdlVGltZW91dFcobG9uZyBsb25nIGxvbmcgbG9uZyBwdHIgcHRyKSBTZW5kTWVzc2FnZVRpbWVvdXQzMlcKIDQ1OSBzdGRjYWxsIFNlbmRNZXNzYWdlVyhsb25nIGxvbmcgbG9uZyBsb25nKSBTZW5kTWVzc2FnZTMyVwogNDYwIHN0dWIgU2VuZE5vdGlmeU1lc3NhZ2VBCiA0NjEgc3R1YiBTZW5kTm90aWZ5TWVzc2FnZVcKQEAgLTU4OSw4ICs1ODksOCBAQAogNTg0IHN0dWIgbW91c2VfZXZlbnQKIDU4NSB2YXJhcmdzIHdzcHJpbnRmQSgpIHdzcHJpbnRmMzJBCiA1ODYgdmFyYXJncyB3c3ByaW50ZlcoKSB3c3ByaW50ZjMyVwotNTg3IHN0ZGNhbGwgd3ZzcHJpbnRmQShzdHIgc3RyIHB0cikgd3ZzcHJpbnRmMzJBCi01ODggc3RkY2FsbCB3dnNwcmludGZXKHdzdHIgd3N0ciBwdHIpIHd2c3ByaW50ZjMyVworNTg3IHN0ZGNhbGwgd3ZzcHJpbnRmQShwdHIgc3RyIHB0cikgd3ZzcHJpbnRmMzJBCis1ODggc3RkY2FsbCB3dnNwcmludGZXKHB0ciB3c3RyIHB0cikgd3ZzcHJpbnRmMzJXCiAjbGF0ZSBhZGRpdGlvbnMKIDU4OSBzdHViIENoYW5nZURpc3BsYXlTZXR0aW5nc0EKIDU5MCBzdHViIENoYW5nZURpc3BsYXlTZXR0aW5nc1cKZGlmZiAtLWdpdCBhL2lmMTYzMi92ZXJzaW9uLnNwZWMgYi9yZWxheTMyL3ZlcnNpb24uc3BlYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaWYxNjMyL3ZlcnNpb24uc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi92ZXJzaW9uLnNwZWMKZGlmZiAtLWdpdCBhL2lmMTYzMi93MzJza3JubC5zcGVjIGIvcmVsYXkzMi93MzJza3JubC5zcGVjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpZjE2MzIvdzMyc2tybmwuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi93MzJza3JubC5zcGVjCmRpZmYgLS1naXQgYS9pZjE2MzIvd2lubW0uc3BlYyBiL3JlbGF5MzIvd2lubW0uc3BlYwpzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBpZjE2MzIvd2lubW0uc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi93aW5tbS5zcGVjCmluZGV4IDNjNzAxNjcuLmRlMWE0ZTUgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93aW5tbS5zcGVjCisrKyBiL3JlbGF5MzIvd2lubW0uc3BlYwpAQCAtMiw2ICsyLDggQEAKIHR5cGUgd2luMzIKIAogICAxIHN0ZGNhbGwgUGxheVNvdW5kQShwdHIgbG9uZyBsb25nKSBQbGF5U291bmQzMkEKKyAgMiBzdGRjYWxsIFdJTk1NXzIocHRyIGxvbmcgbG9uZykgUGxheVNvdW5kMzJBCisgIDMgc3R1YiBXSU5NTV8zCiAgIDQgc3R1YiBDbG9zZURyaXZlcgogICA1IHN0dWIgRGVmRHJpdmVyUHJvYwogICA2IHN0dWIgRHJpdmVyQ2FsbGJhY2sKQEAgLTE1LDcgKzE3LDcgQEAKICAxNCBzdHViIEdldERyaXZlck1vZHVsZUhhbmRsZQogIDE1IHN0ZGNhbGwgT3BlbkRyaXZlcihwdHIgcHRyIGxvbmcpIE9wZW5Ecml2ZXIKICAxNiBzdHViIE9wZW5Ecml2ZXJBCi0gMTcgc3R1YiBQbGF5U291bmQKKyAxNyBzdGRjYWxsIFBsYXlTb3VuZChwdHIgbG9uZyBsb25nKSBQbGF5U291bmQzMkEKICAxOCBzdGRjYWxsIFBsYXlTb3VuZFcocHRyIGxvbmcgbG9uZykgUGxheVNvdW5kMzJXCiAgMTkgc3R1YiBTZW5kRHJpdmVyTWVzc2FnZQogIDIwIHN0ZGNhbGwgYXV4R2V0RGV2Q2Fwc0EobG9uZyBwdHIgbG9uZykgYXV4R2V0RGV2Q2FwczMyQQpAQCAtMjUsMTIgKzI3LDEyIEBACiAgMjQgc3RkY2FsbCBhdXhPdXRNZXNzYWdlKGxvbmcgbG9uZyBsb25nIGxvbmcpIGF1eE91dE1lc3NhZ2UzMgogIDI1IHN0ZGNhbGwgYXV4U2V0Vm9sdW1lKGxvbmcgbG9uZykgYXV4U2V0Vm9sdW1lMzIKICAyNiBzdHViIGpveUNvbmZpZ0NoYW5nZWQKLSAyNyBzdHViIGpveUdldERldkNhcHNBCi0gMjggc3R1YiBqb3lHZXREZXZDYXBzVwotIDI5IHN0dWIgam95R2V0TnVtRGV2cwotIDMwIHN0dWIgam95R2V0UG9zCisgMjcgc3RkY2FsbCBqb3lHZXREZXZDYXBzQShsb25nIHB0ciBsb25nKSBqb3lHZXREZXZDYXBzMzJBCisgMjggc3RkY2FsbCBqb3lHZXREZXZDYXBzVyhsb25nIHB0ciBsb25nKSBqb3lHZXREZXZDYXBzMzJXCisgMjkgc3RkY2FsbCBqb3lHZXROdW1EZXZzKCkgam95R2V0TnVtRGV2czMyCisgMzAgc3RkY2FsbCBqb3lHZXRQb3MobG9uZyBwdHIpIGpveUdldFBvczMyCiAgMzEgc3R1YiBqb3lHZXRQb3NFeAotIDMyIHN0dWIgam95R2V0VGhyZXNob2xkCisgMzIgc3RkY2FsbCBqb3lHZXRUaHJlc2hvbGQobG9uZyBwdHIpIGpveUdldFRocmVzaG9sZDMyCiAgMzMgc3R1YiBqb3lSZWxlYXNlQ2FwdHVyZQogIDM0IHN0dWIgam95U2V0Q2FwdHVyZQogIDM1IHN0dWIgam95U2V0VGhyZXNob2xkCkBAIC00Nyw3ICs0OSw3IEBACiAgNDYgc3RkY2FsbCBtY2lHZXRFcnJvclN0cmluZ1cobG9uZyBwdHIgbG9uZykgbWNpR2V0RXJyb3JTdHJpbmczMlcKICA0NyBzdHViIG1jaUdldFlpZWxkUHJvYwogIDQ4IHN0dWIgbWNpTG9hZENvbW1hbmRSZXNvdXJjZQotIDQ5IHN0dWIgbWNpU2VuZENvbW1hbmRBCisgNDkgc3RkY2FsbCBtY2lTZW5kQ29tbWFuZEEobG9uZyBsb25nIGxvbmcgbG9uZykgbWNpU2VuZENvbW1hbmQzMkEKICA1MCBzdHViIG1jaVNlbmRDb21tYW5kVwogIDUxIHN0ZGNhbGwgbWNpU2VuZFN0cmluZ0EocHRyIHB0ciBsb25nIGxvbmcpIG1jaVNlbmRTdHJpbmcKICA1MiBzdHViIG1jaVNlbmRTdHJpbmdXCkBAIC0xMzUsMTMgKzEzNywxMyBAQAogMTM0IHN0ZGNhbGwgbW1zeXN0ZW1HZXRWZXJzaW9uKCkgbW1zeXN0ZW1HZXRWZXJzaW9uMzIKIDEzNSBzdGRjYWxsIHNuZFBsYXlTb3VuZEEocHRyIGxvbmcpIHNuZFBsYXlTb3VuZAogMTM2IHN0dWIgc25kUGxheVNvdW5kVwotMTM3IHN0dWIgdGltZUJlZ2luUGVyaW9kCi0xMzggc3R1YiB0aW1lRW5kUGVyaW9kCi0xMzkgc3R1YiB0aW1lR2V0RGV2Q2FwcwotMTQwIHN0dWIgdGltZUdldFN5c3RlbVRpbWUKKzEzNyBzdGRjYWxsIHRpbWVCZWdpblBlcmlvZChsb25nKSB0aW1lQmVnaW5QZXJpb2QzMgorMTM4IHN0ZGNhbGwgdGltZUVuZFBlcmlvZChsb25nKSB0aW1lRW5kUGVyaW9kMzIKKzEzOSBzdGRjYWxsIHRpbWVHZXREZXZDYXBzKHB0ciBsb25nKSB0aW1lR2V0RGV2Q2FwczMyCisxNDAgc3RkY2FsbCB0aW1lR2V0U3lzdGVtVGltZShwdHIgbG9uZykgdGltZUdldFN5c3RlbVRpbWUzMgogMTQxIHN0ZGNhbGwgdGltZUdldFRpbWUoKSB0aW1lR2V0VGltZQotMTQyIHN0dWIgdGltZUtpbGxFdmVudAotMTQzIHN0dWIgdGltZVNldEV2ZW50CisxNDIgc3RkY2FsbCB0aW1lS2lsbEV2ZW50KGxvbmcpIHRpbWVLaWxsRXZlbnQzMgorMTQzIHN0ZGNhbGwgdGltZVNldEV2ZW50KGxvbmcgbG9uZyBwdHIgbG9uZyBsb25nKSB0aW1lU2V0RXZlbnQzMgogMTQ0IHN0ZGNhbGwgd2F2ZUluQWRkQnVmZmVyKGxvbmcgcHRyIGxvbmcpIHdhdmVJbkFkZEJ1ZmZlcjMyCiAxNDUgc3RkY2FsbCB3YXZlSW5DbG9zZShsb25nKSB3YXZlSW5DbG9zZTMyCiAxNDYgc3RkY2FsbCB3YXZlSW5HZXREZXZDYXBzQShsb25nIHB0ciBsb25nKSB3YXZlSW5HZXREZXZDYXBzMzJBCmRpZmYgLS1naXQgYS9pZjE2MzIvd2luc3Bvb2wuc3BlYyBiL3JlbGF5MzIvd2luc3Bvb2wuc3BlYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBpZjE2MzIvd2luc3Bvb2wuc3BlYwpyZW5hbWUgdG8gcmVsYXkzMi93aW5zcG9vbC5zcGVjCmluZGV4IGY1YmQzMWEuLmJlNzcyMWYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93aW5zcG9vbC5zcGVjCisrKyBiL3JlbGF5MzIvd2luc3Bvb2wuc3BlYwpAQCAtOTYsNyArOTYsNyBAQAogMTkzIHN0dWIgR2V0UHJpbnRlckRyaXZlclcKIDE5NCBzdHViIEdldFByaW50ZXJXCiAxOTUgc3R1YiBJbml0aWFsaXplRGxsCi0xOTYgc3R1YiBPcGVuUHJpbnRlckEKKzE5NiBzdGRjYWxsIE9wZW5QcmludGVyQShzdHIgcHRyIHB0cikgT3BlblByaW50ZXIzMkEKIDE5NyBzdHViIE9wZW5QcmludGVyVwogMTk4IHN0dWIgUGxheUdkaVNjcmlwdE9uUHJpbnRlcklDCiAxOTkgc3R1YiBQcmludGVyTWVzc2FnZUJveEEKZGlmZiAtLWdpdCBhL3JlbGF5MzIvd293MzIuc3BlYyBiL3JlbGF5MzIvd293MzIuc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjViNTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsYXkzMi93b3czMi5zcGVjCkBAIC0wLDAgKzEsMjAgQEAKK25hbWUJd293MzIKK3R5cGUJd2luMzIKKworIyAgMQorICAyIHN0dWIgICAgV09XQ2FsbGJhY2sxNgorICAzIHN0dWIgICAgV09XQ2FsbGJhY2sxNkV4CisgIDQgc3R1YiAgICBXT1dEaXJlY3RlZFlpZWxkMTYKKyAgNSBzdHViICAgIFdPV0dldFZETVBvaW50ZXIKKyAgNiBzdHViICAgIFdPV0dldFZETVBvaW50ZXJGaXgKKyAgNyBzdHViICAgIFdPV0dldFZETVBvaW50ZXJVbmZpeAorICA4IHN0dWIgICAgV09XR2xvYmFsQWxsb2MxNgorICA5IHN0dWIgICAgV09XR2xvYmFsQWxsb2NMb2NrMTYKKyAxMCBzdHViICAgIFdPV0dsb2JhbEZyZWUxNgorIDExIHN0dWIgICAgV09XR2xvYmFsTG9jazE2CisgMTIgc3R1YiAgICBXT1dHbG9iYWxMb2NrU2l6ZTE2CisgMTMgc3R1YiAgICBXT1dHbG9iYWxVbmxvY2sxNgorIDE0IHN0dWIgICAgV09XR2xvYmFsVW5sb2NrRnJlZTE2CisgMTUgc3R1YiAgICBXT1dIYW5kbGUxNgorIDE2IHN0dWIgICAgV09XSGFuZGxlMzIKKyAxNyBzdHViICAgIFdPV1lpZWxkMTYKZGlmZiAtLWdpdCBhL2lmMTYzMi93c29jazMyLnNwZWMgYi9yZWxheTMyL3dzb2NrMzIuc3BlYwpzaW1pbGFyaXR5IGluZGV4IDc4JQpyZW5hbWUgZnJvbSBpZjE2MzIvd3NvY2szMi5zcGVjCnJlbmFtZSB0byByZWxheTMyL3dzb2NrMzIuc3BlYwppbmRleCA4MjlmZTk1Li43ZGM0ZGVmIDEwMDY0NAotLS0gYS9pZjE2MzIvd3NvY2szMi5zcGVjCisrKyBiL3JlbGF5MzIvd3NvY2szMi5zcGVjCkBAIC0xMCw4ICsxMCw4IEBACiAwMDcgc3RkY2FsbCBnZXRzb2Nrb3B0KGxvbmcgbG9uZyBsb25nIHB0ciBwdHIpIFdJTlNPQ0tfZ2V0c29ja29wdDMyCiAwMDggc3RkY2FsbCBodG9ubChsb25nKSBXSU5TT0NLX2h0b25sCiAwMDkgc3RkY2FsbCBodG9ucyhsb25nKSBXSU5TT0NLX2h0b25zCi0wMTAgc3RkY2FsbCBpbmV0X2FkZHIocHRyKSBpbmV0X2FkZHIKLTAxMSBzdGRjYWxsIGluZXRfbnRvYShwdHIpIGluZXRfbnRvYQorMDEwIHN0ZGNhbGwgaW5ldF9hZGRyKHB0cikgV0lOU09DS19pbmV0X2FkZHIKKzAxMSBzdGRjYWxsIGluZXRfbnRvYShwdHIpIFdJTlNPQ0tfaW5ldF9udG9hMzIKIDAxMiBzdGRjYWxsIGlvY3Rsc29ja2V0KGxvbmcgbG9uZyBwdHIpIFdJTlNPQ0tfaW9jdGxzb2NrZXQzMgogMDEzIHN0ZGNhbGwgbGlzdGVuKGxvbmcgbG9uZykgV0lOU09DS19saXN0ZW4zMgogMDE0IHN0ZGNhbGwgbnRvaGwobG9uZykgV0lOU09DS19udG9obApAQCAtMzEsMTQgKzMxLDE0IEBACiAwNTUgc3RkY2FsbCBnZXRzZXJ2YnluYW1lKHN0ciBzdHIpIFdJTlNPQ0tfZ2V0c2VydmJ5bmFtZTMyCiAwNTYgc3RkY2FsbCBnZXRzZXJ2Ynlwb3J0KGxvbmcgc3RyKSBXSU5TT0NLX2dldHNlcnZieXBvcnQzMgogMDU3IHN0ZGNhbGwgZ2V0aG9zdG5hbWUocHRyIGxvbmcpIFdJTlNPQ0tfZ2V0aG9zdG5hbWUzMgotMTAxIHN0ZGNhbGwgV1NBQXN5bmNTZWxlY3QobG9uZyBsb25nIGxvbmcgbG9uZykgV1NBQXN5bmNTZWxlY3QKLTEwMiBzdHViIFdTQUFzeW5jR2V0SG9zdEJ5QWRkcgorMTAxIHN0ZGNhbGwgV1NBQXN5bmNTZWxlY3QobG9uZyBsb25nIGxvbmcgbG9uZykgV1NBQXN5bmNTZWxlY3QzMgorMTAyIHN0ZGNhbGwgV1NBQXN5bmNHZXRIb3N0QnlBZGRyKGxvbmcgbG9uZyBwdHIgbG9uZyBsb25nIHB0ciBsb25nKSBXU0FBc3luY0dldEhvc3RCeUFkZHIzMgogMTAzIHN0ZGNhbGwgV1NBQXN5bmNHZXRIb3N0QnlOYW1lKGxvbmcgbG9uZyBwdHIgcHRyIGxvbmcpIFdTQUFzeW5jR2V0SG9zdEJ5TmFtZTMyCi0xMDQgc3R1YiBXU0FBc3luY0dldFByb3RvQnlOdW1iZXIKLTEwNSBzdHViIFdTQUFzeW5jR2V0UHJvdG9CeU5hbWUKLTEwNiBzdHViIFdTQUFzeW5jR2V0U2VydkJ5UG9ydAotMTA3IHN0dWIgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lCi0xMDggc3R1YiBXU0FDYW5jZWxBc3luY1JlcXVlc3QKKzEwNCBzdGRjYWxsIFdTQUFzeW5jR2V0UHJvdG9CeU51bWJlcihsb25nIGxvbmcgbG9uZyBwdHIgbG9uZykgV1NBQXN5bmNHZXRQcm90b0J5TnVtYmVyMzIKKzEwNSBzdGRjYWxsIFdTQUFzeW5jR2V0UHJvdG9CeU5hbWUobG9uZyBsb25nIHB0ciBwdHIgbG9uZykgV1NBQXN5bmNHZXRQcm90b0J5TmFtZTMyCisxMDYgc3RkY2FsbCBXU0FBc3luY0dldFNlcnZCeVBvcnQobG9uZyBsb25nIGxvbmcgcHRyIHB0ciBsb25nKSBXU0FBc3luY0dldFNlcnZCeVBvcnQzMgorMTA3IHN0ZGNhbGwgV1NBQXN5bmNHZXRTZXJ2QnlOYW1lKGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBsb25nKSBXU0FBc3luY0dldFNlcnZCeU5hbWUzMgorMTA4IHN0ZGNhbGwgV1NBQ2FuY2VsQXN5bmNSZXF1ZXN0KGxvbmcpIFdTQUNhbmNlbEFzeW5jUmVxdWVzdDMyCiAxMDkgc3RkY2FsbCBXU0FTZXRCbG9ja2luZ0hvb2socHRyKSBXU0FTZXRCbG9ja2luZ0hvb2szMgogMTEwIHN0ZGNhbGwgV1NBVW5ob29rQmxvY2tpbmdIb29rKCkgV1NBVW5ob29rQmxvY2tpbmdIb29rMzIKIDExMSBzdGRjYWxsIFdTQUdldExhc3RFcnJvcigpIFdTQUdldExhc3RFcnJvcgpAQCAtNTIsNyArNTIsNyBAQAogIyBhcHBsaWNhdGlvbnMgKnNob3VsZCogJ2RlZ3JhZGUgZ3JhY2VmdWxseSBpZiB0aGVzZSBhcmUgbm90IHByZXNlbnQKICMgLi4uIGFzIGl0IGlzLCB0aGV5IGRvbid0CiAjMTAwMCBzdHViIFdTQXBTZXRQb3N0Um91dGluZQotMTAwMSBzdGRjYWxsIFdzQ29udHJvbChsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgV3NDb250cm9sCisxMDAxIHN0ZGNhbGwgV3NDb250cm9sKGxvbmcgbG9uZyBwdHIgcHRyIHB0ciBwdHIpIFdzQ29udHJvbAogMTEwMCBzdGRjYWxsIGluZXRfbmV0d29yayhwdHIpIGluZXRfbmV0d29yawogMTEwMSBzdGRjYWxsIGdldG5ldGJ5bmFtZShwdHIpIGdldG5ldGJ5bmFtZQogIzExMDIgc3R1YiByY21kCkBAIC02MSw3ICs2MSw3IEBACiAjMTEwNSBzdHViIHNldGhvc3RuYW1lCiAjMTEwNiBzdHViIGRuX2V4cGFuZAogMTEwNyBzdHViIFdTQVJlY3ZFeAotMTEwOCBzdHViIHNfcGVycm9yCisxMTA4IHN0ZGNhbGwgc19wZXJyb3IocHRyKSBXU19zX3BlcnJvcgogMTEwOSBzdHViIEdldEFkZHJlc3NCeU5hbWVBCiAxMTEwIHN0dWIgR2V0QWRkcmVzc0J5TmFtZVcKICMxMTExIHN0dWIgRW51bVByb3RvY29sc0EKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfRGUucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0RlLnJjCmluZGV4IGI4NjZmZDQuLjM1MzQzMzggMTAwNjQ0Ci0tLSBhL3Jlc291cmNlcy9zeXNyZXNfRGUucmMKKysrIGIvcmVzb3VyY2VzL3N5c3Jlc19EZS5yYwpAQCAtMTcsMTQgKzE3LDE0IEBACiB7CiAJUE9QVVAgIiIKIAlCRUdJTgotCQlNRU5VSVRFTSAiJlVuZG8iLCBFTV9VTkRPMzIKKwkJTUVOVUlURU0gIiZS/GNrZ+RuZ2lnIiwgRU1fVU5ETzMyCiAJCU1FTlVJVEVNIFNFUEFSQVRPUgotCQlNRU5VSVRFTSAiQ3UmdCIsIFdNX0NVVAotCQlNRU5VSVRFTSAiJkNvcHkiLCBXTV9DT1BZCi0JCU1FTlVJVEVNICImUGFzdGUiLCBXTV9QQVNURQotCQlNRU5VSVRFTSAiJkRlbGV0ZSIsIFdNX0NMRUFSCisJCU1FTlVJVEVNICImQXVzc2NobmVpZGVuIiwgV01fQ1VUCisJCU1FTlVJVEVNICImS29waWVyZW4iLCBXTV9DT1BZCisJCU1FTlVJVEVNICImRWluZvxnZW4iLCBXTV9QQVNURQorCQlNRU5VSVRFTSAiJkz2c2NoZW4iLCBXTV9DTEVBUgogCQlNRU5VSVRFTSBTRVBBUkFUT1IKLQkJTUVOVUlURU0gIlNlbGVjdCAmQWxsIiwgRU1fU0VUU0VMMzIKKwkJTUVOVUlURU0gIiZBbGxlcyBtYXJraWVyZW4iLCBFTV9TRVRTRUwzMgogCUVORAogfQogCmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvcHJvY2Vzcy5jIGIvc2NoZWR1bGVyL3Byb2Nlc3MuYwppbmRleCBlM2JkNzFiLi5iODE5MDgwIDEwMDY0NAotLS0gYS9zY2hlZHVsZXIvcHJvY2Vzcy5jCisrKyBiL3NjaGVkdWxlci9wcm9jZXNzLmMKQEAgLTY1OCw2ICs2NTgsNyBAQAogCQkJCXJldCA9IEdldEVudmlyb25tZW50VmFyaWFibGUzMkEoeCxkLGN1cnNpemUtKGQteGRzdCkpOwogCQkJCWlmIChyZXQpIHsKIAkJCQkJZCs9c3RybGVuKGQpOworCQkJCQlzPWVuZDsKIAkJCQl9IGVsc2UgewogCQkJCQlDSEVDS19GUkVFKHN0cmxlbih4KSsyKTsKIAkJCQkJKmQrKz0nJSc7CkBAIC02NjcsOSArNjY4LDkgQEAKIAkJCQl9CiAJCQkJSGVhcEZyZWUoaGVhcCwwLHgpOwogCQkJfSBlbHNlCi0JCQkJKmQ9KnM7CisJCQkJKmQrKz0qczsKIAotCQkJcysrO2QrKzsKKwkJCXMrKzsKIAkJfSBlbHNlIHsKIAkJCUNIRUNLX0ZSRUUoMSk7CiAJCQkqZCsrPSpzKys7CmRpZmYgLS1naXQgYS90b29scy9idWlsZC5jIGIvdG9vbHMvYnVpbGQuYwppbmRleCAzZjM5YmRhLi5jNjkyYTQxIDEwMDY0NAotLS0gYS90b29scy9idWlsZC5jCisrKyBiL3Rvb2xzL2J1aWxkLmMKQEAgLTk2MCwxMDIgKzk2MCw0NyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgQnVpbGRTcGVjMzJGaWxlCiAgKgotICogQnVpbGQgYSBXaW4zMiBhc3NlbWJseSBmaWxlIGZyb20gYSBzcGVjIGZpbGUuCisgKiBCdWlsZCBhIFdpbjMyIEMgZmlsZSBmcm9tIGEgc3BlYyBmaWxlLgogICovCiBzdGF0aWMgaW50IEJ1aWxkU3BlYzMyRmlsZSggY2hhciAqIHNwZWNmaWxlLCBGSUxFICpvdXRmaWxlICkKIHsKICAgICBPUkRERUYgKm9kcDsKLSAgICBpbnQgaSwgbmJfbmFtZXMsIG5iX3N0dWJzOwotICAgIGNoYXIgYnVmZmVyWzEwMjRdOwotICAgIHVuc2lnbmVkIGNoYXIgKmFyZ3MsICpwOworICAgIGludCBpLCBuYl9uYW1lcywgbmJfcmVnX2Z1bmNzID0gMDsKIAotICAgIGZwcmludGYoIG91dGZpbGUsICIvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5OyBkbyBub3QgZWRpdCEgKi9cbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZmlsZVx0XCIlc1wiXG4iLCBzcGVjZmlsZSApOwotI2lmZGVmIFVTRV9TVEFCUwotICAgIGdldGN3ZChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLQotICAgIC8qCi0gICAgICogVGhlIHN0YWJzIGhlbHAgdGhlIGludGVybmFsIGRlYnVnZ2VyIGFzIHRoZXkgYXJlIGFuIGluZGljYXRpb24gdGhhdCBpdAotICAgICAqIGlzIHNlbnNpYmxlIHRvIHN0ZXAgaW50byBhIHRodW5rL3RyYW1wb2xpbmUuCi0gICAgICovCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIiVzL1wiLDEwMCwwLDAsQ29kZV9TdGFydFxuIiwgYnVmZmVyKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiJXNcIiwxMDAsMCwwLENvZGVfU3RhcnRcbiIsIHNwZWNmaWxlKTsKLSNlbmRpZgotCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYWxpZ24gNFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJDb2RlX1N0YXJ0OlxuIiApOwotCi0gICAgLyogT3V0cHV0IGNvZGUgZm9yIGFsbCByZWdpc3RlciBmdW5jdGlvbnMgKi8KLQotICAgIGZvciAoaSA9IEJhc2UsIG9kcCA9IE9yZGluYWxEZWZpbml0aW9ucyArIEJhc2U7IGkgPD0gTGltaXQ7IGkrKywgb2RwKyspCi0gICAgewotICAgICAgICBpZiAob2RwLT50eXBlICE9IFRZUEVfUkVHSVNURVIpIGNvbnRpbnVlOwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXG4vKiAlcy4lZCAoJXMpICovXG4iLCBETExOYW1lLCBpLCBvZHAtPm5hbWUpOwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYWxpZ24gNFxuIiApOwotI2lmZGVmIFVTRV9TVEFCUwotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiJXNfJWQ6RjFcIiwzNiwwLCVkLCVzXyVkXG4iLCAKLSAgICAgICAgICAgICAgICAgRExMTmFtZSwgaSwgb2RwLT5saW5lbm8sIERMTE5hbWUsIGkpOwotI2VuZGlmCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICIlc18lZDpcbiIsIERMTE5hbWUsIGkgKTsKLSNpZmRlZiBVU0VfU1RBQlMKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFibiA2OCwwLCVkLDBcbiIsIG9kcC0+bGluZW5vKTsKLSNlbmRpZgotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAkIiBQUkVGSVggIiVzXG4iLG9kcC0+dS5mdW5jLmxpbmtfbmFtZSk7Ci0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdGptcCAiIFBSRUZJWCAiQ0FMTDMyX1JlZ3NcbiIgKTsKLSAgICB9CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIi8qIEZpbGUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSAlczsgZG8gbm90IGVkaXQhICovXG5cbiIsCisgICAgICAgICAgICAgc3BlY2ZpbGUgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiI2luY2x1ZGUgXCJidWlsdGluMzIuaFwiXG5cbiIgKTsKIAogICAgIC8qIE91dHB1dCBjb2RlIGZvciBhbGwgc3R1YnMgZnVuY3Rpb25zICovCiAKLSAgICBuYl9zdHVicyA9IDA7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgImV4dGVybiBjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiAlc19EZXNjcmlwdG9yO1xuIiwKKyAgICAgICAgICAgICBETExOYW1lICk7CiAgICAgZm9yIChpID0gQmFzZSwgb2RwID0gT3JkaW5hbERlZmluaXRpb25zICsgQmFzZTsgaSA8PSBMaW1pdDsgaSsrLCBvZHArKykKICAgICB7CiAgICAgICAgIGlmIChvZHAtPnR5cGUgIT0gVFlQRV9TVFVCKSBjb250aW51ZTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlxuLyogJXMuJWQgKCVzKSAqL1xuIiwgRExMTmFtZSwgaSwgb2RwLT5uYW1lKTsKLSNpZmRlZiBVU0VfU1RBQlMKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIiVzXyVkOkYxXCIsMzYsMCwlZCwlc18lZFxuIiwgCi0gICAgICAgICAgICAgICAgIERMTE5hbWUsIGksIG9kcC0+bGluZW5vLCBETExOYW1lLCBpKTsKLSNlbmRpZgotICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiJXNfJWQ6XG4iLCBETExOYW1lLCBpICk7Ci0jaWZkZWYgVVNFX1NUQUJTCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYm4gNjgsMCwlZCwwXG4iLCBvZHAtPmxpbmVubyk7Ci0jZW5kaWYKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJE5hbWVfJWRcbiIsIGkgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJCVkXG4iLCBpICk7Ci0gICAgICAgIGlmICgrK25iX3N0dWJzID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJEb1N0dWI6XG4iICk7Ci0gICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAkRExMTmFtZVxuIiApOwotICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCAiIFBSRUZJWCAiUkVMQVlfVW5pbXBsZW1lbnRlZDMyXG4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBmcHJpbnRmKCBvdXRmaWxlLCAiXHRqbXAgRG9TdHViXG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJzdGF0aWMgdm9pZCBfX3N0dWJfJWQoKSB7IEJVSUxUSU4zMl9VbmltcGxlbWVudGVkKCYlc19EZXNjcmlwdG9yLCVkKTsgfVxuIiwKKyAgICAgICAgICAgICAgICAgaSwgRExMTmFtZSwgaSApOwogICAgIH0KIAotICAgIC8qIE91dHB1dCB0aGUgRExMIGZ1bmN0aW9ucyB0YWJsZSAqLworICAgIC8qIE91dHB1dCB0aGUgRExMIGZ1bmN0aW9ucyBwcm90b3R5cGVzICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIiApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5hbGlnbiA0XG4iICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIkZ1bmN0aW9uczpcbiIgKTsKICAgICBmb3IgKGkgPSBCYXNlLCBvZHAgPSBPcmRpbmFsRGVmaW5pdGlvbnMgKyBCYXNlOyBpIDw9IExpbWl0OyBpKyssIG9kcCsrKQogICAgIHsKICAgICAgICAgc3dpdGNoKG9kcC0+dHlwZSkKICAgICAgICAgewotICAgICAgICBjYXNlIFRZUEVfSU5WQUxJRDoKLSAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5sb25nIDBcbiIgKTsKLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRZUEVfVkFSQVJHUzoKLSAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5sb25nICIgUFJFRklYICIlc1xuIixvZHAtPnUudmFyZ3MubGlua19uYW1lKTsKKyAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJleHRlcm4gdm9pZCAlcygpO1xuIiwgb2RwLT51LnZhcmdzLmxpbmtfbmFtZSApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVFlQRV9FWFRFUk46Ci0gICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQubG9uZyAiIFBSRUZJWCAiJXNcbiIsIG9kcC0+dS5leHQubGlua19uYW1lICk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUWVBFX1NURENBTEw6Ci0gICAgICAgIGNhc2UgVFlQRV9DREVDTDoKLSAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5sb25nICIgUFJFRklYICIlc1xuIiwgb2RwLT51LmZ1bmMubGlua19uYW1lKTsKKyAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJleHRlcm4gdm9pZCAlcygpO1xuIiwgb2RwLT51LmV4dC5saW5rX25hbWUgKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRZUEVfUkVHSVNURVI6CisgICAgICAgIGNhc2UgVFlQRV9TVERDQUxMOgorICAgICAgICBjYXNlIFRZUEVfQ0RFQ0w6CisgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiZXh0ZXJuIHZvaWQgJXMoKTtcbiIsIG9kcC0+dS5mdW5jLmxpbmtfbmFtZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9JTlZBTElEOgogICAgICAgICBjYXNlIFRZUEVfU1RVQjoKLSAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5sb25nICVzXyVkXG4iLCBETExOYW1lLCBpICk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJidWlsZDogZnVuY3Rpb24gdHlwZSAlZCBub3QgYXZhaWxhYmxlIGZvciBXaW4zMlxuIiwKQEAgLTEwNjQsMTggKzEwMDksNTQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qIE91dHB1dCB0aGUgRExMIG5hbWVzIHRhYmxlICovCisgICAgLyogT3V0cHV0IHRoZSBETEwgZnVuY3Rpb25zIHRhYmxlICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiRnVuY05hbWVzOlxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcbnN0YXRpYyBjb25zdCBFTlRSWVBPSU5UMzIgRnVuY3Rpb25zWyVkXSA9XG57XG4iLAorICAgICAgICAgICAgIExpbWl0IC0gQmFzZSArIDEgKTsKICAgICBmb3IgKGkgPSBCYXNlLCBvZHAgPSBPcmRpbmFsRGVmaW5pdGlvbnMgKyBCYXNlOyBpIDw9IExpbWl0OyBpKyssIG9kcCsrKQogICAgIHsKLSAgICAgICAgaWYgKG9kcC0+dHlwZSAhPSBUWVBFX0lOVkFMSUQpCi0gICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQubG9uZyBOYW1lXyVkXG4iLCBpICk7CisgICAgICAgIHN3aXRjaChvZHAtPnR5cGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBUWVBFX0lOVkFMSUQ6CisgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiICAgIDAiICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWVBFX1ZBUkFSR1M6CisgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiICAgICVzIiwgb2RwLT51LnZhcmdzLmxpbmtfbmFtZSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFlQRV9FWFRFUk46CisgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiICAgICVzIiwgb2RwLT51LmV4dC5saW5rX25hbWUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRZUEVfUkVHSVNURVI6CisgICAgICAgIGNhc2UgVFlQRV9TVERDQUxMOgorICAgICAgICBjYXNlIFRZUEVfQ0RFQ0w6CisgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiICAgICVzIiwgb2RwLT51LmZ1bmMubGlua19uYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRZUEVfU1RVQjoKKyAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICIgICAgX19zdHViXyVkIiwgaSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPCBMaW1pdCkgZnByaW50Ziggb3V0ZmlsZSwgIixcbiIgKTsKICAgICB9CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlxufTtcblxuIiApOworCisgICAgLyogT3V0cHV0IHRoZSBETEwgbmFtZXMgdGFibGUgKi8KKworICAgIG5iX25hbWVzID0gMDsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAic3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBGdW5jTmFtZXNbXSA9XG57XG4iICk7CisgICAgZm9yIChpID0gQmFzZSwgb2RwID0gT3JkaW5hbERlZmluaXRpb25zICsgQmFzZTsgaSA8PSBMaW1pdDsgaSsrLCBvZHArKykKKyAgICB7CisgICAgICAgIGlmIChvZHAtPnR5cGUgPT0gVFlQRV9JTlZBTElEKSBjb250aW51ZTsKKyAgICAgICAgaWYgKG5iX25hbWVzKyspIGZwcmludGYoIG91dGZpbGUsICIsXG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICIgICAgXCIlc1wiIiwgb2RwLT5uYW1lICk7CisgICAgfQorICAgIGZwcmludGYoIG91dGZpbGUsICJcbn07XG5cbiIgKTsKIAogICAgIC8qIE91dHB1dCB0aGUgRExMIGFyZ3VtZW50IHR5cGVzICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiQXJnVHlwZXM6XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgInN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgQXJnVHlwZXNbJWRdID1cbntcbiIsCisgICAgICAgICAgICAgTGltaXQgLSBCYXNlICsgMSApOwogICAgIGZvciAoaSA9IEJhc2UsIG9kcCA9IE9yZGluYWxEZWZpbml0aW9ucyArIEJhc2U7IGkgPD0gTGltaXQ7IGkrKywgb2RwKyspCiAgICAgewogICAgIAl1bnNpZ25lZCBpbnQgaiwgbWFzayA9IDA7CkBAIC0xMDg1LDczICsxMDY2LDY3IEBACiAgICAgICAgICAgICAgICAgaWYgKG9kcC0+dS5mdW5jLmFyZ190eXBlc1tqXSA9PSAndCcpIG1hc2sgfD0gMTw8IChqKjIpOwogICAgICAgICAgICAgICAgIGlmIChvZHAtPnUuZnVuYy5hcmdfdHlwZXNbal0gPT0gJ1cnKSBtYXNrIHw9IDI8PCAoaioyKTsKIAkgICAgfQotCWZwcmludGYoIG91dGZpbGUsICJcdC5sb25nICVkXG4iLG1hc2spOworCWZwcmludGYoIG91dGZpbGUsICIgICAgJWQiLCBtYXNrICk7CisgICAgICAgIGlmIChpIDwgTGltaXQpIGZwcmludGYoIG91dGZpbGUsICIsXG4iICk7CiAgICAgfQorICAgIGZwcmludGYoIG91dGZpbGUsICJcbn07XG5cbiIgKTsKIAogICAgIC8qIE91dHB1dCB0aGUgRExMIG9yZGluYWxzIHRhYmxlICovCiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiRnVuY09yZGluYWxzOlxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgRnVuY09yZGluYWxzW10gPVxue1xuIiApOwogICAgIG5iX25hbWVzID0gMDsKICAgICBmb3IgKGkgPSBCYXNlLCBvZHAgPSBPcmRpbmFsRGVmaW5pdGlvbnMgKyBCYXNlOyBpIDw9IExpbWl0OyBpKyssIG9kcCsrKQogICAgIHsKICAgICAgICAgaWYgKG9kcC0+dHlwZSA9PSBUWVBFX0lOVkFMSUQpIGNvbnRpbnVlOwotICAgICAgICBuYl9uYW1lcysrOwotICAgICAgICAvKiBTb21lIGFzc2VtYmxlcnMgZG8gbm90IGhhdmUgLndvcmQgKi8KLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmJ5dGUgJWQsJWRcbiIsCi0gICAgICAgICAgICAgICAgIExPQllURShpIC0gQmFzZSksIEhJQllURShpIC0gQmFzZSkgKTsKKyAgICAgICAgaWYgKG5iX25hbWVzKyspIGZwcmludGYoIG91dGZpbGUsICIsXG4iICk7CisgICAgICAgIGZwcmludGYoIG91dGZpbGUsICIgICAgJWQiLCBpIC0gQmFzZSApOwogICAgIH0KLQotICAgIC8qIE91dHB1dCB0aGUgRExMIG5hbWVzICovCi0KLSAgICBmb3IgKGkgPSBCYXNlLCBvZHAgPSBPcmRpbmFsRGVmaW5pdGlvbnMgKyBCYXNlOyBpIDw9IExpbWl0OyBpKyssIG9kcCsrKQotICAgIHsKLSAgICAgICAgaWYgKG9kcC0+dHlwZSAhPSBUWVBFX0lOVkFMSUQpCi0gICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiTmFtZV8lZDpcdC5hc2NpaSBcIiVzXFwwXCJcbiIsIGksIG9kcC0+bmFtZSApOwotICAgIH0KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXG59O1xuXG4iICk7CiAKICAgICAvKiBPdXRwdXQgdGhlIERMTCBmdW5jdGlvbnMgYXJndW1lbnRzICovCiAKLSAgICBhcmdzID0gcCA9ICh1bnNpZ25lZCBjaGFyICopeG1hbGxvYyggTGltaXQgLSBCYXNlICsgMSApOworICAgIGZwcmludGYoIG91dGZpbGUsICJzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBGdW5jQXJnc1slZF0gPVxue1xuIiwKKyAgICAgICAgICAgICBMaW1pdCAtIEJhc2UgKyAxICk7CiAgICAgZm9yIChpID0gQmFzZSwgb2RwID0gT3JkaW5hbERlZmluaXRpb25zICsgQmFzZTsgaSA8PSBMaW1pdDsgaSsrLCBvZHArKykKICAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYXJnczsKICAgICAgICAgc3dpdGNoKG9kcC0+dHlwZSkKICAgICAgICAgewogICAgICAgICBjYXNlIFRZUEVfU1REQ0FMTDoKLSAgICAgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcilzdHJsZW4ob2RwLT51LmZ1bmMuYXJnX3R5cGVzKTsKKyAgICAgICAgICAgIGFyZ3MgPSAodW5zaWduZWQgY2hhcilzdHJsZW4ob2RwLT51LmZ1bmMuYXJnX3R5cGVzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRZUEVfQ0RFQ0w6Ci0gICAgICAgICAgICAqcCsrID0gMHg4MCB8ICh1bnNpZ25lZCBjaGFyKXN0cmxlbihvZHAtPnUuZnVuYy5hcmdfdHlwZXMpOworICAgICAgICAgICAgYXJncyA9IDB4ODAgfCAodW5zaWduZWQgY2hhcilzdHJsZW4ob2RwLT51LmZ1bmMuYXJnX3R5cGVzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFRZUEVfUkVHSVNURVI6Ci0gICAgICAgICAgICAqcCsrID0gMHhmZTsKKyAgICAgICAgICAgIGFyZ3MgPSAweGZlOworICAgICAgICAgICAgbmJfcmVnX2Z1bmNzKys7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICpwKysgPSAweGZmOworICAgICAgICAgICAgYXJncyA9IDB4ZmY7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiICAgIDB4JTAyeCIsIGFyZ3MgKTsKKyAgICAgICAgaWYgKGkgPCBMaW1pdCkgZnByaW50Ziggb3V0ZmlsZSwgIixcbiIgKTsKICAgICB9Ci0gICAgRHVtcEJ5dGVzKCBvdXRmaWxlLCBhcmdzLCBMaW1pdCAtIEJhc2UgKyAxLCBOVUxMLCAiRnVuY0FyZ3MiICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlxufTtcblxuIiApOwogCiAgICAgLyogT3V0cHV0IHRoZSBETEwgZGVzY3JpcHRvciAqLwogCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIkRMTE5hbWU6XHQuYXNjaWkgXCIlc1xcMFwiXG4iLCBETExOYW1lICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmFsaWduIDRcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIiVzX0Rlc2NyaXB0b3JcbiIsIERMTE5hbWUgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIiVzX0Rlc2NyaXB0b3I6XG4iLCBETExOYW1lICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgRExMTmFtZVxuIiApOyAgICAgICAgICAvKiBOYW1lICovCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgJWRcbiIsIEJhc2UgKTsgICAgICAgICAvKiBCYXNlICovCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgJWRcbiIsIExpbWl0KzEtQmFzZSApOyAvKiBOdW1iZXIgb2YgZnVuY3Rpb25zICovCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgJWRcbiIsIG5iX25hbWVzICk7ICAgICAvKiBOdW1iZXIgb2YgbmFtZXMgKi8KLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQubG9uZyBGdW5jdGlvbnNcbiIgKTsgICAgICAgIC8qIEZ1bmN0aW9ucyAqLwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5sb25nIEZ1bmNOYW1lc1xuIiApOyAgICAgICAgLyogRnVuY3Rpb24gbmFtZXMgKi8KLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQubG9uZyBGdW5jT3JkaW5hbHNcbiIgKTsgICAgIC8qIEZ1bmN0aW9uIG9yZGluYWxzICovCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgRnVuY0FyZ3NcbiIgKTsgICAgICAgICAvKiBGdW5jdGlvbiBhcmd1bWVudHMgKi8KLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQubG9uZyBBcmdUeXBlc1xuIiApOyAgICAgICAgIC8qIEZ1bmN0aW9uIGFyZ3R5cGVzICovCi0jaWZkZWYgVVNFX1NUQUJTCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIpOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5zdGFicyBcIlwiLDEwMCwwLDAsLkxldGV4dFxuIik7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIi5MZXRleHQ6XG4iKTsKLSNlbmRpZgorICAgIGZwcmludGYoIG91dGZpbGUsICJjb25zdCBCVUlMVElOMzJfREVTQ1JJUFRPUiAlc19EZXNjcmlwdG9yID1cbntcbiIsCisgICAgICAgICAgICAgRExMTmFtZSApOworICAgIGZwcmludGYoIG91dGZpbGUsICIgICAgXCIlc1wiLFxuIiwgRExMTmFtZSApOworICAgIGZwcmludGYoIG91dGZpbGUsICIgICAgJWQsXG4iLCBCYXNlICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIiAgICAlZCxcbiIsIExpbWl0IC0gQmFzZSArIDEgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiICAgICVkLFxuIiwgbmJfbmFtZXMgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiICAgICVkLFxuIiwgbmJfcmVnX2Z1bmNzICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwKKyAgICAgICAgICAgICAiICAgIEZ1bmN0aW9ucyxcbiIKKyAgICAgICAgICAgICAiICAgIEZ1bmNOYW1lcyxcbiIKKyAgICAgICAgICAgICAiICAgIEZ1bmNPcmRpbmFscyxcbiIKKyAgICAgICAgICAgICAiICAgIEZ1bmNBcmdzLFxuIgorICAgICAgICAgICAgICIgICAgQXJnVHlwZXNcbiIKKyAgICAgICAgICAgICAifTtcbiIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTc0Nyw3ICsxNzIyLDggQEAKICAqIFByb3RvdHlwZXMgZm9yIHRoZSBDYWxsVG8xNiBmdW5jdGlvbnM6CiAgKiAgIGV4dGVybiBXSU5BUEkgV09SRCBDYWxsVG8xNl93b3JkX3h4eCggRkFSUFJPQzE2IGZ1bmMsIGFyZ3MuLi4gKTsKICAqICAgZXh0ZXJuIFdJTkFQSSBMT05HIENhbGxUbzE2X2xvbmdfeHh4KCBGQVJQUk9DMTYgZnVuYywgYXJncy4uLiApOwotICogICBleHRlcm4gV0lOQVBJIHZvaWQgQ2FsbFRvMTZfcmVnc197c2hvcnQsbG9uZ30oIGNvbnN0IENPTlRFWFQgKmNvbnRleHQgKTsKKyAqICAgZXh0ZXJuIFdJTkFQSSB2b2lkIENhbGxUbzE2X3NyZWdfKCBjb25zdCBDT05URVhUICpjb250ZXh0ICk7CisgKiAgIGV4dGVybiBXSU5BUEkgdm9pZCBDYWxsVG8xNl9scmVnXyggY29uc3QgQ09OVEVYVCAqY29udGV4dCApOwogICovCiBzdGF0aWMgdm9pZCBCdWlsZENhbGxUbzE2RnVuYyggRklMRSAqb3V0ZmlsZSwgY2hhciAqcHJvZmlsZSApCiB7CkBAIC0xNzU2LDcgKzE3MzIsOCBAQAogICAgIGNoYXIgKmFyZ3MgPSBwcm9maWxlICsgNTsKIAogICAgIGlmICghc3RybmNtcCggIndvcmRfIiwgcHJvZmlsZSwgNSApKSBzaG9ydF9yZXQgPSAxOwotICAgIGVsc2UgaWYgKCFzdHJuY21wKCAicmVnc18iLCBwcm9maWxlLCA1ICkpIHJlZ19mdW5jID0gMTsKKyAgICBlbHNlIGlmICghc3RybmNtcCggInNyZWdfIiwgcHJvZmlsZSwgNSApKSByZWdfZnVuYyA9IDE7CisgICAgZWxzZSBpZiAoIXN0cm5jbXAoICJscmVnXyIsIHByb2ZpbGUsIDUgKSkgcmVnX2Z1bmMgPSAyOwogICAgIGVsc2UgaWYgKHN0cm5jbXAoICJsb25nXyIsIHByb2ZpbGUsIDUgKSkKICAgICB7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkludmFsaWQgZnVuY3Rpb24gbmFtZSAnJXMnLlxuIiwgcHJvZmlsZSApOwpAQCAtMTc5Myw3ICsxNzcwLDcgQEAKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDQUxMVE8xNl9SZXN0b3JlOlxuIiApOwogICAgIH0KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWJwXG4iICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cmV0ICQlZFxuIiwgc3RybGVuKGFyZ3MpICsgMSApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHJldCAkJWRcbiIsIDQgKiBzdHJsZW4oYXJncykgKyA0ICk7CiAKICAgICAvKiBTdGFydCBvZiB0aGUgYWN0dWFsIENhbGxUbzE2IHJvdXRpbmUgKi8KIApAQCAtMTg1MywxMCArMTgzMCwxMCBAQAogICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZWJ4KSwlJWVkaVxuIiwgQ09OVEVYVE9GRlNFVChFZGkpICk7CiAKICAgICAgICAgLyogUHVzaCB0aGUgcmV0dXJuIGFkZHJlc3MgCi0JICogV2l0aCBfc2hvcnQgc3VmZml4LCB3ZSBwdXNoIDE2OjE2IGFkZHJlc3MgKG5vcm1hbCBscmV0KQotCSAqIFdpdGggX2xvbmcgc3VmZml4LCB3ZSBwdXNoIDE2OjMyIGFkZHJlc3MgKDB4NjYgbHJldCwgZm9yIEtFUk5FTDMyXzQ1KQorCSAqIFdpdGggc3JlZyBzdWZmaXgsIHdlIHB1c2ggMTY6MTYgYWRkcmVzcyAobm9ybWFsIGxyZXQpCisJICogV2l0aCBscmVnIHN1ZmZpeCwgd2UgcHVzaCAxNjozMiBhZGRyZXNzICgweDY2IGxyZXQsIGZvciBLRVJORUwzMl80NSkKIAkgKi8KLQlpZiAoIXN0cm5jbXAocHJvZmlsZSwicmVnc19zaG9ydCIsMTApKQorCWlmIChyZWdfZnVuYyA9PSAxKQogCSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAiIFBSRUZJWCAiQ0FMTFRPMTZfUmV0QWRkcl9yZWdzXG4iICk7CiAJZWxzZSAKIAl7CkBAIC0yMDQyLDYgKzIwMTksNyBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDQUxMMzJfSW5pdDpGMVwiLDM2LDAsMCwiIFBSRUZJWCAiQ0FMTDMyX0luaXRcbiIpOwogI2VuZGlmCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDQUxMMzJfSW5pdFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50eXBlICIgUFJFRklYICJDQUxMMzJfSW5pdCxAZnVuY3Rpb25cbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTEwzMl9Jbml0OlxuIiApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgLTI1NiglJWVzcCksJSVlYXhcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LENBTEwzMl9PcmlnaW5hbDMyX2VzcFxuIiApOwpAQCAtMjM1MCw2ICsyMzI4LDggQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS4gRG8gbm90IGVkaXQhICovXG5cbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIiApOwogCisjaWZkZWYgX19pMzg2X18KKwogI2lmZGVmIFVTRV9TVEFCUwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5maWxlXHRcIiVzXCJcbiIsIG91dG5hbWUgKTsKICAgICBnZXRjd2QoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CkBAIC0yMzc5LDYgKzIzNTksMTIgQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLkxldGV4dDpcbiIpOwogI2VuZGlmCiAKKyNlbHNlICAvKiBfX2kzODZfXyAqLworCisgICAgLyogSnVzdCB0byBhdm9pZCBhbiBlbXB0eSBmaWxlICovCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgMFxuIiApOworCisjZW5kaWYgIC8qIF9faTM4Nl9fICovCiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbjMyL01ha2VmaWxlLmluIGIvd2luMzIvTWFrZWZpbGUuaW4KaW5kZXggZDQyNjEzZC4uN2M2ODNlMSAxMDA2NDQKLS0tIGEvd2luMzIvTWFrZWZpbGUuaW4KKysrIGIvd2luMzIvTWFrZWZpbGUuaW4KQEAgLTE1LDYgKzE1LDcgQEAKIAlmaWxlLmMgXAogCWluaXQuYyBcCiAJazMyb2JqLmMgXAorCWtlcm5lbDMyLmMgXAogCW5ld2Zucy5jIFwKIAlvcmRpbmFscy5jIFwKIAlwcm9jZXNzLmMgXApkaWZmIC0tZ2l0IGEvd2luMzIvY29kZV9wYWdlLmMgYi93aW4zMi9jb2RlX3BhZ2UuYwppbmRleCBlZDZlYTgyMi4uMjc3MTA2MSAxMDA2NDQKLS0tIGEvd2luMzIvY29kZV9wYWdlLmMKKysrIGIvd2luMzIvY29kZV9wYWdlLmMKQEAgLTg1LDU0ICs4NSw4MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciAgICAgICAgICAgICAgICAoS0VSTkVMMzIuMzkyKQogICovCi1pbnQgV0lOQVBJIE11bHRpQnl0ZVRvV2lkZUNoYXIoVUlOVDMyIHBhZ2UsIERXT1JEIGZsYWdzLCBjaGFyICpzcmMsIGludCBzcmNsZW4sCitpbnQgV0lOQVBJIE11bHRpQnl0ZVRvV2lkZUNoYXIoVUlOVDMyIHBhZ2UsIERXT1JEIGZsYWdzLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnNyYywgaW50IHNyY2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQ0hBUiAqZHN0LCBpbnQgZHN0bGVuKQogewotICAgIGlmIChzcmNsZW4gPT0gLTEpCi0gICAJIHNyY2xlbiA9IGxzdHJsZW4zMkEoc3JjKSsxOwotICAgIGlmICghZHN0bGVuIHx8ICFkc3QpCi0gICAgICAgICByZXR1cm4gc3JjbGVuOworICAgIGludCByZXQ7CiAKLSAgICBsc3RyY3B5bkF0b1coZHN0LHNyYyxzcmNsZW4pOyAvKiBGSVhNRSAqLwotICAgIHJldHVybiBzcmNsZW4tMTsKKyAgICBpZiAoc3JjbGVuID09IC0xKQorCXNyY2xlbiA9IGxzdHJsZW4zMkEoc3JjKSsxOworICAgIGlmICghZHN0bGVuIHx8ICFkc3QpCisJcmV0dXJuIHNyY2xlbjsKKworICAgIHJldCA9IHNyY2xlbjsKKyAgICB3aGlsZSAoc3JjbGVuID4gMCAmJiBkc3RsZW4gPiAwKSB7CisJKmRzdCA9IChXQ0hBUikodW5zaWduZWQgY2hhcikqc3JjOworCWlmICghKnNyYykKKwkgICAgcmV0dXJuIHJldDsKKwlkc3QrKzsgICAgc3JjKys7CisJZHN0bGVuLS07IHNyY2xlbi0tOworICAgIH0KKyAgICBpZiAoZHN0bGVuID09IDApIHsKKwlTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CisJcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiByZXQ7CiB9CiAKIGludCBXSU5BUEkgV2lkZUNoYXJUb011bHRpQnl0ZShVSU5UMzIgcGFnZSwgRFdPUkQgZmxhZ3MsIFdDSEFSICpzcmMsIGludCBzcmNsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZHN0LCBpbnQgZHN0bGVuLCBjaGFyKiBkZWZjaGFyLCBCT09MMzIgKnVzZWQpCiB7Ci0JaW50IGNvdW50ID0gMDsKLQlpbnQgZG9udF9jb3B5PSAoZHN0bGVuPT0wKTsKLQlpZihwYWdlIT1HZXRBQ1AoKSAmJiBwYWdlIT1DUF9PRU1DUCAmJiBwYWdlIT1DUF9BQ1ApCi0JCWZwcmludGYoc3RkbmltcCwiQ29udmVyc2lvbiBpbiBDUCAlZCBub3Qgc3VwcG9ydGVkXG4iLHBhZ2UpOworICAgIGludCBjb3VudCA9IDA7CisgICAgaW50IGVvcyA9IDA7CisgICAgaW50IGRvbnRfY29weT0gKGRzdGxlbj09MCk7CisgICAgaWYgKHBhZ2UhPUdldEFDUCgpICYmIHBhZ2UhPUNQX09FTUNQICYmIHBhZ2UhPUNQX0FDUCkKKwlmcHJpbnRmKHN0ZG5pbXAsIkNvbnZlcnNpb24gaW4gQ1AgJWQgbm90IHN1cHBvcnRlZFxuIixwYWdlKTsKICNpZiAwCi0JaWYoZmxhZ3MpCi0JCWZwcmludGYoc3RkbmltcCwiV2lkZUNoYXJUb011bHRpQnl0ZSBmbGFncyAlbHggbm90IHN1cHBvcnRlZFxuIixmbGFncyk7CisgICAgaWYgKGZsYWdzKQorCWZwcmludGYoc3RkbmltcCwiV2lkZUNoYXJUb011bHRpQnl0ZSBmbGFncyAlbHggbm90IHN1cHBvcnRlZFxuIixmbGFncyk7CiAjZW5kaWYKLQlpZih1c2VkKQotCQkqdXNlZD0wOwotCXdoaWxlKHNyY2xlbiAmJiAoZG9udF9jb3B5IHx8IGRzdGxlbikpCi0JewotCQlpZighZG9udF9jb3B5KXsKLQkJCWlmKCpzcmM8MjU2KQotCQkJCSpkc3QgPSAqc3JjOwotCQkJZWxzZQotCQkJewotCQkJCS8qIEZJWE1FOiBJcyB0aGlzIGNvcnJlY3QgPyovCi0JCQkJaWYoZmxhZ3MgJiBXQ19ERUZBVUxUQ0hBUil7Ci0JCQkJCSpkc3QgPSBkZWZjaGFyID8gKmRlZmNoYXIgOiAnPyc7Ci0JCQkJCWlmKHVzZWQpKnVzZWQ9MTsKLQkJCQl9Ci0JCQl9Ci0JCQlkc3RsZW4tLTsKLQkJCWRzdCsrOwotCQl9Ci0JCWNvdW50Kys7Ci0JCWlmKCEqc3JjKQotCQkJYnJlYWs7Ci0JCWlmKHNyY2xlbiE9LTEpc3JjbGVuLS07Ci0JCXNyYysrOworICAgIGlmKHVzZWQpCisJKnVzZWQ9MDsKKyAgICBpZiAoc3JjbGVuID09IC0xKQorCXNyY2xlbiA9IGxzdHJsZW4zMlcoc3JjKSsxOworICAgIHdoaWxlKHNyY2xlbiAmJiAoZG9udF9jb3B5IHx8IGRzdGxlbikpCisgICAgeworCWlmKCFkb250X2NvcHkpeworCSAgICBpZigqc3JjPDI1NikKKwkJKmRzdCA9ICpzcmM7CisJICAgIGVsc2UKKwkgICAgeworCQkvKiA/Pz8gVGhlIFdDX0RFRkFVTFRDSEFSIGZsYWcgb25seSBnZXRzIHVzZWQgaW4KKwkJICogY29tYmluYXRpb24gd2l0aCB0aGUgV0NfQ09NUE9TSVRFQ0hFQ0sgZmxhZyBvciBhdAorCQkgKiBsZWFzdCB0aGlzIGlzIHdoYXQgaXQgc2VlbXMgZnJvbSB1c2luZyB0aGUgZnVuY3Rpb24KKwkJICogb24gTlQ0LjAgaW4gY29tYmluYXRpb24gd2l0aCByZWFkaW5nIHRoZSBkb2N1bWVudGF0aW9uLgorCQkgKi8KKwkJKmRzdCA9IGRlZmNoYXIgPyAqZGVmY2hhciA6ICc/JzsKKwkJaWYodXNlZCkqdXNlZD0xOworCSAgICB9CisJICAgIGRzdGxlbi0tOworCSAgICBkc3QrKzsKIAl9CisJY291bnQrKzsKKwlzcmNsZW4tLTsKKwlpZighKnNyYykgeworCSAgICBlb3MgPSAxOworCSAgICBicmVhazsKKwl9CisJc3JjKys7CisgICAgfQorICAgIGlmIChkb250X2NvcHkpCiAJcmV0dXJuIGNvdW50OworCisgICAgaWYgKCFlb3MgJiYgc3JjbGVuID4gMCkgeworCVNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbjMyL2NvbnNvbGUuYyBiL3dpbjMyL2NvbnNvbGUuYwppbmRleCBkMTBhMWNhLi5mYTgxNjZmIDEwMDY0NAotLS0gYS93aW4zMi9jb25zb2xlLmMKKysrIGIvd2luMzIvY29uc29sZS5jCkBAIC0yLDYgKzIsNyBAQAogICogV2luMzIga2VybmVsIGZ1bmN0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTk1IE1hcnRpbiB2b24gTG9ld2lzIGFuZCBDYW1lcm9uIEhlaWRlCisgKiBDb3B5cmlnaHQgMTk5NyBLYXJsIEdhcnJpc29uCiAgKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC04MSw5ICs4Miw3IEBACiB7CiAJKm1vZGUgPSAJRU5BQkxFX1BST0NFU1NFRF9JTlBVVAl8CiAJCQlFTkFCTEVfTElORV9JTlBVVAl8Ci0JCQlFTkFCTEVfRUNIT19JTlBVVAl8Ci0JCQlFTkFCTEVfV0lORE9XX0lOUFVUCXwKLQkJCUVOQUJMRV9NT1VTRV9JTlBVVDsKKwkJCUVOQUJMRV9FQ0hPX0lOUFVUOwogCXJldHVybiBUUlVFOwogfQogCkBAIC0xMTgsNyArMTE3LDcgQEAKICAqICAgICAgICAgICAgV3JpdGVDb25zb2xlQSAgIChLRVJORUwzMi41NjcpCiAgKi8KIEJPT0wzMiBXSU5BUEkgV3JpdGVDb25zb2xlMzJBKCBIQU5ETEUzMiBoQ29uc29sZU91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgbHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDVk9JRCBscEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBuTnVtYmVyT2ZDaGFyc1RvV3JpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBscE51bWJlck9mQ2hhcnNXcml0dGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFJlc2VydmVkICkKQEAgLTEzMyw3ICsxMzIsNyBAQAogICogICAgICAgICAgICBXcml0ZUNvbnNvbGVXICAgKEtFUk5FTDMyLjU3NykKICAqLwogQk9PTDMyIFdJTkFQSSBXcml0ZUNvbnNvbGUzMlcoIEhBTkRMRTMyIGhDb25zb2xlT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENWT0lEIGxwQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIG5OdW1iZXJPZkNoYXJzVG9Xcml0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwTnVtYmVyT2ZDaGFyc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwUmVzZXJ2ZWQgKQpAQCAtMTk5LDcgKzE5OCw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgRmx1c2hDb25zb2xlSW5wdXRCdWZmZXIgICAoS0VSTkVMMzIuMTMyKQogICovCi1CT09MMzIgV0lOQVBJIEZsdXNoQ29uc29sZUlucHV0QnVmZmVyKEhBTkRMRTMyIGhDb25zb2xlSW5wdXQpeworQk9PTDMyIFdJTkFQSSBGbHVzaENvbnNvbGVJbnB1dEJ1ZmZlcihIQU5ETEUzMiBoQ29uc29sZUlucHV0KQorewogICAgIGZwcmludGYoc3RkZXJyLCJGbHVzaENvbnNvbGVJbnB1dEJ1ZmZlciglZClcbiIsaENvbnNvbGVJbnB1dCk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0yMjIsNiArMjIyLDcwIEBACiAgKi8KIEJPT0wzMiBXSU5BUEkgR2V0TnVtYmVyT2ZDb25zb2xlSW5wdXRFdmVudHMoSEFORExFMzIgaGNvbixMUERXT1JEIG5yb2ZldmVudHMpCiB7Ci0JKm5yb2ZldmVudHMgPSAxOworCSpucm9mZXZlbnRzID0gMDsKIAlyZXR1cm4gVFJVRTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIEdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9ucyAgIChLRVJORUwzMi4zNTgpCisgKi8KK0JPT0wzMiBXSU5BUEkgR2V0TnVtYmVyT2ZDb25zb2xlTW91c2VCdXR0b25zKExQRFdPUkQgbnJvZmJ1dHRvbnMpCit7CisgICAgKm5yb2ZidXR0b25zID0gMjsKKyAgICBmcHJpbnRmKHN0ZGVyciwiR2V0TnVtYmVyT2ZDb25zb2xlTW91c2VCdXR0b25zOiBTVFVCIHJldHVybmluZyAyXG4iKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIFBlZWtDb25zb2xlSW5wdXRBICAgKEtFUk5FTDMyLjU1MCkKKyAqLworQk9PTDMyIFdJTkFQSSBQZWVrQ29uc29sZUlucHV0MzJBKEhBTkRMRTMyIGhDb25zb2xlSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEV09SRCBwaXJCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgY0luUmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY1JlYWQpCisvKiBGSVhNRTogcGlyQnVmZmVyIHNob3VsZCBiZSBhIHBvaW50ZXIgdG8gYW4gSU5QVVRfUkVDT1JEIHN0cnVjdHVyZQorICAgLUthcmwgR2Fycmlzb24gKDEyLzAxLzk3KSAqLworeworICAgIHBpckJ1ZmZlciA9IE5VTEw7CisgICAgY0luUmVjb3JkcyA9IDA7CisgICAgKmxwY1JlYWQgPSAwOworICAgIGZwcmludGYoc3RkZXJyLCJHZXROdW1iZXJPZkNvbnNvbGVNb3VzZUJ1dHRvbnM6IFNUVUIgcmV0dXJuaW5nIE5VTExcbiIpOworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgUGVla0NvbnNvbGVJbnB1dFcgICAoS0VSTkVMMzIuNTUxKQorICovCitCT09MMzIgV0lOQVBJIFBlZWtDb25zb2xlSW5wdXQzMlcoSEFORExFMzIgaENvbnNvbGVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIHBpckJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBjSW5SZWNvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQRFdPUkQgbHBjUmVhZCkKKy8qIEZJWE1FOiBwaXJCdWZmZXIgc2hvdWxkIGJlIGEgcG9pbnRlciB0byBhbiBJTlBVVF9SRUNPUkQgc3RydWN0dXJlCisgICAtS2FybCBHYXJyaXNvbiAoMTIvMDEvOTcpICovCit7CisgICAgcGlyQnVmZmVyID0gTlVMTDsKKyAgICBjSW5SZWNvcmRzID0gMDsKKyAgICAqbHBjUmVhZCA9IDA7CisgICAgZnByaW50ZihzdGRlcnIsIkdldE51bWJlck9mQ29uc29sZU1vdXNlQnV0dG9uczogU1RVQiByZXR1cm5pbmcgTlVMTFxuIik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICBHZXRDb25zb2xlQ3Vyc29ySW5mbzMyICAgKEtFUk5FTDMyLjI5NikKKyAqLworQk9PTDMyIFdJTkFQSSBHZXRDb25zb2xlQ3Vyc29ySW5mbzMyKEhBTkRMRTMyIGhjb24sIExQRFdPUkQgY2luZm8pCit7CisgIGNpbmZvWzBdID0gMTA7IC8qIDEwJSBvZiBjaGFyYWN0ZXIgYm94IGlzIGN1cnNvci4gICovCisgIGNpbmZvWzFdID0gVFJVRTsgIC8qIEN1cnN1ciBpcyB2aXNpYmxlLiAgKi8KKyAgZnByaW50ZiAoc3RkbmltcCwgIkdldENvbnNvbGVDdXJzb3JJbmZvMzIgLS0gU1RVQiFcbiIpOworICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgIFNldENvbnNvbGVDdXJzb3JJbmZvMzIgICAoS0VSTkVMMzIuNjI2KQorICovCitCT09MMzIgV0lOQVBJIFNldENvbnNvbGVDdXJzb3JJbmZvMzIoSEFORExFMzIgaGNvbiwgTFBEV09SRCBjaW5mbykKK3sKKyAgZnByaW50ZiAoc3RkbmltcCwgIlNldENvbnNvbGVDdXJzb3JJbmZvMzIgLS0gU1RVQiFcbiIpOworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL3dpbjMyL2Vudmlyb25tZW50LmMgYi93aW4zMi9lbnZpcm9ubWVudC5jCmluZGV4IDkwYTBiZjMuLjY1YWQ0NGQgMTAwNjQ0Ci0tLSBhL3dpbjMyL2Vudmlyb25tZW50LmMKKysrIGIvd2luMzIvZW52aXJvbm1lbnQuYwpAQCAtMjksOSArMjksOSBAQAogICovCiBMUENXU1RSIFdJTkFQSSBHZXRDb21tYW5kTGluZTMyVyh2b2lkKQogewotICAgIHN0YXRpYyBXQ0hBUiBidWZmZXJbMjU2XTsKKyAgICBzdGF0aWMgV0NIQVIgYnVmZmVyWzEwMjRdOwogCi0gICAgbHN0cmNweW5BdG9XKGJ1ZmZlcixHZXRDb21tYW5kTGluZTMyQSgpLDI1Nik7CisgICAgbHN0cmNweW5BdG9XKGJ1ZmZlcixHZXRDb21tYW5kTGluZTMyQSgpLDEwMjQpOwogICAgIHJldHVybiBidWZmZXI7CiB9CiAKZGlmZiAtLWdpdCBhL3dpbjMyL2tlcm5lbDMyLmMgYi93aW4zMi9rZXJuZWwzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1M2UwNGUKLS0tIC9kZXYvbnVsbAorKysgYi93aW4zMi9rZXJuZWwzMi5jCkBAIC0wLDAgKzEsNjYzIEBACisvKgorICogS0VSTkVMMzIgdGh1bmtzIGFuZCBvdGhlciB1bmRvY3VtZW50ZWQgc3R1ZmYKKyAqCisgKiBDb3B5cmlnaHQgMTk5NyBNYXJjdXMgTWVpc3NuZXIKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJyZXNvdXJjZS5oIgorI2luY2x1ZGUgInRhc2suaCIKKyNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAiaGVhcC5oIgorI2luY2x1ZGUgIm1vZHVsZS5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKKyNpbmNsdWRlICJzZWxlY3RvcnMuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAid2luLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgIFdpbjk1IGludGVybmFsIHRodW5rcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZW5lcmF0ZXMgYSBGVF9Qcm9sb2cgY2FsbC4KKyAqCQorICogIDBGQjZEMSAgICAgICAgICAgICAgICAgIG1vdnpibCBlZHgsY2wKKyAqICA4QjE0OTV4eHh4eHh4eAkgICAgbW92IGVkeCxbNCplZHggKyB4eHh4eHh4eF0KKyAqICA2OHh4eHh4eHh4CQkgICAgcHVzaCBGVF9Qcm9sb2cKKyAqICBDMwkJCSAgICBscmV0CisgKi8KK3N0YXRpYyB2b2lkIF93cml0ZV9mdHByb2xvZyhMUEJZVEUgdGh1bmssRFdPUkQgdGh1bmtzdGFydCkgeworCUxQQllURQl4OworCisJeAk9IHRodW5rOworCSp4KysJPSAweDBmOyp4Kys9MHhiNjsqeCsrPTB4ZDE7IC8qIG1vdnpibCBlZHgsY2wgKi8KKwkqeCsrCT0gMHg4QjsqeCsrPTB4MTQ7KngrKz0weDk1OyooRFdPUkQqKXg9IHRodW5rc3RhcnQ7CisJeCs9NDsJLyogbW92IGVkeCwgWzQqZWR4ICsgdGh1bmtzdGFydF0gKi8KKwkqeCsrCT0gMHg2ODsgKihEV09SRCopeCA9IChEV09SRClHZXRQcm9jQWRkcmVzczMyKEdldE1vZHVsZUhhbmRsZTMyQSgiS0VSTkVMMzIiKSwiRlRfUHJvbG9nIik7CisJeCs9NDsgCS8qIHB1c2ggRlRfUHJvbG9nICovCisJKngrKwk9IDB4QzM7CQkvKiBscmV0ICovCisJLyogZmlsbCByZXN0IHdpdGggMHhDQyAvIGludCAzICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlGVF9Qcm9sb2dQcmltZQkJCShLRVJORUwzMi44OSkKKyAqLwordm9pZCBXSU5BUEkgRlRfUHJvbG9nUHJpbWUoRFdPUkQgc3RhcnRpbmQsTFBCWVRFIHRodW5rKSB7CisJX3dyaXRlX2Z0cHJvbG9nKHRodW5rLCooRFdPUkQqKShzdGFydGluZCt0aHVuaykpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEdlbmVyYXRlcyBhIFFUX1RodW5rIHN0eWxlIGNhbGwuCisgKgkKKyAqICAzM0M5ICAgICAgICAgICAgICAgICAgICB4b3IgZWN4LCBlY3gKKyAqICA4QTRERkMgICAgICAgICAgICAgICAgICBtb3YgY2wgLCBbZWJwLTA0XQorICogIDhCMTQ4RHh4eHh4eHh4ICAgICAgICAgIG1vdiBlZHgsIFs0KmVjeCArIChFQVgrRURYKV0KKyAqICBCOHl5eXl5eXl5ICAgICAgICAgICAgICBtb3YgZWF4LCBRVF9UaHVuaworICogIEZGRTAgICAgICAgICAgICAgICAgICAgIGptcCBlYXgKKyAqLworc3RhdGljIHZvaWQgX3dyaXRlX3F0dGh1bmsoTFBCWVRFIHN0YXJ0LERXT1JEIHRodW5rc3RhcnQpIHsKKwlMUEJZVEUJeDsKKworCXgJPSBzdGFydDsKKwkqeCsrCT0gMHgzMzsqeCsrPTB4Qzk7IC8qIHhvciBlY3gsZWN4ICovCisJKngrKwk9IDB4OEE7KngrKz0weDREOyp4Kys9MHhGQzsgLyogbW92YiBjbCxbZWJwLTA0XSAqLworCSp4KysJPSAweDhCOyp4Kys9MHgxNDsqeCsrPTB4OEQ7KihEV09SRCopeD0gdGh1bmtzdGFydDsKKwl4Kz00OwkvKiBtb3YgZWR4LCBbNCplY3ggKyAoRUFYK0VEWCkgKi8KKwkqeCsrCT0gMHhCODsgKihEV09SRCopeCA9IChEV09SRClHZXRQcm9jQWRkcmVzczMyKEdldE1vZHVsZUhhbmRsZTMyQSgiS0VSTkVMMzIiKSwiUVRfVGh1bmsiKTsKKwl4Kz00OyAJLyogbW92IGVheCAsIFFUX1RodW5rICovCisJKngrKwk9IDB4RkY7ICp4KysgPSAweEUwOwkvKiBqbXAgZWF4ICovCisJLyogc2hvdWxkIGZpbGwgdGhlIHJlc3Qgb2YgdGhlIDMyIGJ5dGVzIHdpdGggMHhDQyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQlUaHVua0Nvbm5lY3QzMgkJKEtFUk5FTDMyKQorICogQ29ubmVjdHMgYSAzMmJpdCBhbmQgYSAxNmJpdCB0aHVua2J1ZmZlci4KKyAqLworc3RydWN0IHRodW5rc3RydWN0Cit7CisJY2hhcgltYWdpY1s0XTsKKwlEV09SRAlsZW5ndGg7CisJRFdPUkQJcHRyOworCURXT1JECXgwQzsKKworCURXT1JECXgxMDsKKwlEV09SRAl4MTQ7CisJRFdPUkQJeDE4OworCURXT1JECXgxQzsKKwlEV09SRAl4MjA7Cit9OworCitVSU5UMzIgV0lOQVBJIFRodW5rQ29ubmVjdDMyKCBzdHJ1Y3QgdGh1bmtzdHJ1Y3QgKnRocywgTFBTVFIgdGh1bmtmdW4xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQU1RSIG1vZHVsZTE2LCBMUFNUUiBtb2R1bGUzMiwgSE1PRFVMRTMyIGhtb2QzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRsbGluaXRhcmcxICkKK3sKKwlISU5TVEFOQ0UxNglobW07CisJU0VHUFRSCQl0aGtidWY7CisJc3RydWN0CXRodW5rc3RydWN0CSp0aHMxNjsKKworCWRwcmludGZfdGh1bmsoc3RkZGViLCJUaHVua0Nvbm5lY3QzMig8c3RydWN0PiwlcywlcywlcywleCwlbHgpXG4iLAorCQl0aHVua2Z1bjE2LG1vZHVsZTMyLG1vZHVsZTE2LGhtb2QzMixkbGxpbml0YXJnMQorCSk7CisJZHByaW50Zl90aHVuayhzdGRkZWIsIgltYWdpYyA9ICVjJWMlYyVjXG4iLAorCQl0aHMtPm1hZ2ljWzBdLAorCQl0aHMtPm1hZ2ljWzFdLAorCQl0aHMtPm1hZ2ljWzJdLAorCQl0aHMtPm1hZ2ljWzNdCisJKTsKKwlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiCWxlbmd0aCA9ICVseFxuIix0aHMtPmxlbmd0aCk7CisJaWYgKGxzdHJuY21wMzJBKHRocy0+bWFnaWMsIlNMMDEiLDQpJiZsc3RybmNtcDMyQSh0aHMtPm1hZ2ljLCJMUzAxIiw0KSkKKwkJcmV0dXJuIDA7CisJaG1tPUxvYWRNb2R1bGUxNihtb2R1bGUxNixOVUxMKTsKKwlpZiAoaG1tPD0zMikKKwkJcmV0dXJuIDA7CisJdGhrYnVmPShTRUdQVFIpV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihobW0sdGh1bmtmdW4xNik7CisJaWYgKCF0aGtidWYpCisJCXJldHVybiAwOworCXRoczE2PShzdHJ1Y3QgdGh1bmtzdHJ1Y3QqKVBUUl9TRUdfVE9fTElOKHRoa2J1Zik7CisJaWYgKGxzdHJuY21wMzJBKHRoczE2LT5tYWdpYyx0aHMtPm1hZ2ljLDQpKQorCQlyZXR1cm4gMDsKKworCWlmICghbHN0cm5jbXAzMkEodGhzLT5tYWdpYywiU0wwMSIsNCkpICB7CisJCWlmICh0aHMxNi0+bGVuZ3RoICE9IHRocy0+bGVuZ3RoKQorCQkJcmV0dXJuIDA7CisJCXRocy0+eDBDID0gKERXT1JEKXRoczE2OworCisJCWRwcmludGZfdGh1bmsoc3RkZGViLCIJdGhzMTYgbWFnaWMgaXMgMHglMDhseFxuIiwqKERXT1JEKil0aHMxNi0+bWFnaWMpOworCQlpZiAoKigoRFdPUkQqKXRoczE2LT5tYWdpYykgIT0gMHgwMDAwMzA0QykKKwkJCXJldHVybiAwOworCQlpZiAoISooV09SRCopKCgoTFBCWVRFKXRoczE2KSsweDEyKSkKKwkJCXJldHVybiAwOworCQkKKwl9CisJaWYgKCFsc3RybmNtcDMyQSh0aHMtPm1hZ2ljLCJMUzAxIiw0KSkgIHsKKwkJaWYgKHRoczE2LT5sZW5ndGggIT0gdGhzLT5sZW5ndGgpCisJCQlyZXR1cm4gMDsKKwkJdGhzLT5wdHIgPSAoRFdPUkQpUFRSX1NFR19UT19MSU4odGhzMTYtPnB0cik7CisJCS8qIGNvZGUgb2Zmc2V0IGZvciBRVF9UaHVuayBpcyBhdCAweDFDLi4uICAqLworCQlfd3JpdGVfcXR0aHVuayAoKChMUEJZVEUpdGhzKSArIHRocy0+eDFDLHRocy0+cHRyKTsKKwkJLyogY29kZSBvZmZzZXQgZm9yIEZUX1Byb2xvZyBpcyBhdCAweDIwLi4uICAqLworCQlfd3JpdGVfZnRwcm9sb2coKChMUEJZVEUpdGhzKSArIHRocy0+eDIwLHRocy0+cHRyKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCVFUX1RodW5rCQkJKEtFUk5FTDMyKQorICoKKyAqIFRoZSB0YXJnZXQgYWRkcmVzcyBpcyBpbiBFRFguCisgKiBUaGUgMTYgYml0IGFyZ3VtZW50cyBzdGFydCBhdCBFU1ArNC4KKyAqIFRoZSBudW1iZXIgb2YgMTZiaXQgYXJndW1lbnRieXRlcyBpcyBFQlAtRVNQLTB4NDQgKDY4IEJ5dGUgdGh1bmtzZXR1cCkuCisgKiBbb2tdCisgKi8KK1ZPSUQgV0lOQVBJIFFUX1RodW5rKENPTlRFWFQgKmNvbnRleHQpCit7CisJQ09OVEVYVAljb250ZXh0MTY7CisJRFdPUkQJYXJnc2l6ZTsKKworCW1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOworCisJQ1NfcmVnKCZjb250ZXh0MTYpCSA9IEhJV09SRChFRFhfcmVnKGNvbnRleHQpKTsKKwlJUF9yZWcoJmNvbnRleHQxNikJID0gTE9XT1JEKEVEWF9yZWcoY29udGV4dCkpOworCisJYXJnc2l6ZSA9IEVCUF9yZWcoY29udGV4dCktRVNQX3JlZyhjb250ZXh0KS0weDQ0OworCisJLyogYWRkaXRpb25hbCA0IGJ5dGVzIHVzZWQgYnkgdGhlIHJlbGF5Y29kZSBmb3Igc3RvcmluZyB0aGUgc3RhY2twdHIgKi8KKwltZW1jcHkoCSgoTFBCWVRFKUNVUlJFTlRfU1RBQ0sxNiktYXJnc2l6ZS00LAorCQkoTFBCWVRFKUVTUF9yZWcoY29udGV4dCkrNCwKKwkJYXJnc2l6ZQorCSk7CisJRUFYX3JlZyhjb250ZXh0KSA9IENhbGxiYWNrcy0+Q2FsbFJlZ2lzdGVyU2hvcnRQcm9jKCZjb250ZXh0MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtYXJnc2l6ZSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBXT1dDYWxsYmFjazE2IChLRVJORUwzMi42MikKKyAqLworRFdPUkQgV0lOQVBJIFdPV0NhbGxiYWNrMTYoRkFSUFJPQzE2IGZwcm9jLERXT1JEIGFyZykKK3sKKwlEV09SRAlyZXQ7CisJZHByaW50Zl90aHVuayhzdGRkZWIsIldPV0NhbGxiYWNrMTYoJXAsMHglMDhseCkgIixmcHJvYyxhcmcpOworCXJldCA9ICBDYWxsYmFja3MtPkNhbGxXT1dDYWxsYmFja1Byb2MoZnByb2MsYXJnKTsKKwlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiLi4uIHJldHVybnMgJWxkXG4iLHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgX0tFUk5FTDMyXzUyICAgIChLRVJORUwzMi41MikKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIFRoa0J1ZiBpbiB0aGUgMTZiaXQgbGlicmFyeSBTWVNUSFVOSy5ETEwuCisgKiBbb2sgcHJvYmFibHldCisgKi8KK0xQVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzUyKCkKK3sKKwlITU9EVUxFMzIJaG1vZCA9IExvYWRMaWJyYXJ5MTYoInN5c3RodW5rLmRsbCIpOworCisJZHByaW50Zl90aHVuayhzdGRkZWIsICJfS0VSTkVMMzJfNTI6IHN5c3RodW5rLmRsbCBtb2R1bGUgJWRcbiIsIGhtb2QpOworCQorCWlmIChobW9kPD0zMikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIFBUUl9TRUdfVE9fTElOKFdJTjMyX0dldFByb2NBZGRyZXNzMTYoaG1vZCwiVGhrQnVmIikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJX0tFUk5FTDMyXzQzIAkoS0VSTkVMMzIuNDIpCisgKiBBIHRodW5rYnVmZmVyIGxpbmsgcm91dGluZSAKKyAqIFRoZSB0aHVua2J1ZiBsb29rcyBsaWtlOgorICoKKyAqCTAwOiBEV09SRAlsZW5ndGgJCT8gZG9uJ3Qga25vdyBleGFjdGx5CisgKgkwNDogU0VHUFRSCXB0cgkJPyB3aGVyZSBkb2VzIGl0IHBvaW50IHRvPworICogVGhlIHBvaW50ZXIgcHRyIGlzIHdyaXR0ZW4gaW50byB0aGUgZmlyc3QgRFdPUkQgb2YgJ3RodW5rJy4KKyAqIChwcm9iYWJseSBjb3JyZWN0IGltcGxlbWVudGVkKQorICogW29rIHByb2JhYmx5XQorICovCitEV09SRCBXSU5BUEkgX0tFUk5FTDMyXzQzKExQRFdPUkQgdGh1bmssTFBDU1RSIHRoa2J1ZixEV09SRCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgZGxsMTYsTFBDU1RSIGRsbDMyKQoreworCUhJTlNUQU5DRTE2CWhtb2Q7CisJTFBEV09SRAkJYWRkcjsKKwlTRUdQVFIJCXNlZ2FkZHI7CisKKwlobW9kID0gTG9hZExpYnJhcnkxNihkbGwxNik7CisJaWYgKGhtb2Q8MzIpIHsKKwkJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzQzLT5mYWlsZWQgdG8gbG9hZCAxNmJpdCBETEwgJXMsIGVycm9yICVkXG4iLGRsbDE2LGhtb2QpOworCQlyZXR1cm4gMDsKKwl9CisJc2VnYWRkciA9IChEV09SRClXSU4zMl9HZXRQcm9jQWRkcmVzczE2KGhtb2QsKExQU1RSKXRoa2J1Zik7CisJaWYgKCFzZWdhZGRyKSB7CisJCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl80My0+bm8gJXMgZXhwb3J0ZWQgZnJvbSAlcyFcbiIsdGhrYnVmLGRsbDE2KTsKKwkJcmV0dXJuIDA7CisJfQorCWFkZHIgPSAoTFBEV09SRClQVFJfU0VHX1RPX0xJTihzZWdhZGRyKTsKKwlpZiAoYWRkclswXSAhPSBsZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzQzLT50aGtidWYgbGVuZ3RoIG1pc21hdGNoPyAlbGQgdnMgJWxkXG4iLGxlbixhZGRyWzBdKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghYWRkclsxXSkKKwkJcmV0dXJuIDA7CisJKihEV09SRCopdGh1bmsgPSBhZGRyWzFdOworCisJZHByaW50Zl90aHVuayhzdGRkZWIsICJfS0VSTkVMMzJfNDM6IGxvYWRlZCBtb2R1bGUgJWQsIGZ1bmMgJXMgKCVkKSBAICVwICglcCksIHJldHVybmluZyAlcFxuIiwKKwkJICAgICAgaG1vZCwgSElXT1JEKHRoa2J1Zik9PTAgPyAiPG9yZGluYWw+IiA6IHRoa2J1ZiwgKGludCl0aGtidWYsICh2b2lkKilzZWdhZGRyLCBhZGRyLCAodm9pZCopYWRkclsxXSk7CisKKwlyZXR1cm4gYWRkclsxXTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCV9LRVJORUwzMl80NSAJKEtFUk5FTDMyLjQ0KQorICogQW5vdGhlciAzMi0+MTYgdGh1bmssIHRoZSBkaWZmZXJlbmNlIHRvIFFUX1RodW5rIGlzLCB0aGF0IHRoZSBjYWxsZWQgcm91dGluZQorICogdXNlcyAweDY2IGxyZXQsIGFuZCB0aGF0IHdlIGhhdmUgdG8gcGFzcyBDWCBpbiBESS4KKyAqICh0aGVyZSBzZWVtcyB0byBiZSBzb21lIGtpbmQgb2YgQkwvQlggcmV0dXJuIG1hZ2ljIHRvby4uLikKKyAqCisgKiBbZG9lc24ndCBjcmFzaCBhbnltb3JlXQorICovCitWT0lEIFdJTkFQSSBfS0VSTkVMMzJfNDUoQ09OVEVYVCAqY29udGV4dCkKK3sKKwlDT05URVhUCWNvbnRleHQxNjsKKwlMUEJZVEUJY3Vyc3RhY2s7CisJRFdPUkQJcmV0LHN0YWNrc2l6ZTsKKworCWRwcmludGZfdGh1bmsoc3RkZGViLCJLRVJORUwzMl80NSglJWVheD0weCUwOGx4KCUlY3g9MHglMDRseCwlJWVkeD0weCUwOGx4KSlcbiIsCisJCShEV09SRClFQVhfcmVnKGNvbnRleHQpLChEV09SRClDWF9yZWcoY29udGV4dCksKERXT1JEKUVEWF9yZWcoY29udGV4dCkKKwkpOworCXN0YWNrc2l6ZSA9IEVCUF9yZWcoY29udGV4dCktRVNQX3JlZyhjb250ZXh0KTsKKwlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiCXN0YWNrc2l6ZSA9ICVsZFxuIixzdGFja3NpemUpOworCisJbWVtY3B5KCZjb250ZXh0MTYsY29udGV4dCxzaXplb2YoY29udGV4dDE2KSk7CisKKwlESV9yZWcoJmNvbnRleHQxNikJID0gQ1hfcmVnKGNvbnRleHQpOworCUNTX3JlZygmY29udGV4dDE2KQkgPSBISVdPUkQoRUFYX3JlZyhjb250ZXh0KSk7CisJSVBfcmVnKCZjb250ZXh0MTYpCSA9IExPV09SRChFQVhfcmVnKGNvbnRleHQpKTsKKworCWN1cnN0YWNrID0gUFRSX1NFR19UT19MSU4oU1RBQ0sxNl9QVVNIKHN0YWNrc2l6ZSkpOworCW1lbWNweShjdXJzdGFjay1zdGFja3NpemUsKExQQllURSlFU1BfcmVnKGNvbnRleHQpLHN0YWNrc2l6ZSk7CisJcmV0ID0gQ2FsbGJhY2tzLT5DYWxsUmVnaXN0ZXJMb25nUHJvYygmY29udGV4dDE2LDApOworCVNUQUNLMTZfUE9QKHN0YWNrc2l6ZSk7CisKKwlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiLiByZXR1cm5lZCAlMDhseFxuIixyZXQpOworCUVBWF9yZWcoY29udGV4dCkgCSA9IHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAJCV9LRVJORUwzMl80MCAJKEtFUk5FTDMyLjQwKQorICogWUVUIEFub3RoZXIgMzItPjE2IHRodW5rLCB0aGUgZGlmZmVyZW5jZSB0byB0aGUgb3RoZXJzIGlzIHN0aWxsIG15c3RlcmlvdXMKKyAqIHRhcmdldCBhZGRyZXNzIGlzIEVEWAorICoKKyAqIFtjcmFzaGVzXQorICovCitWT0lEIFdJTkFQSSBfS0VSTkVMMzJfNDAoQ09OVEVYVCAqY29udGV4dCkKK3sKKwlDT05URVhUCWNvbnRleHQxNjsKKwlMUEJZVEUJY3Vyc3RhY2s7CisJRFdPUkQJcmV0LHN0YWNrc2l6ZTsKKworCWRwcmludGZfdGh1bmsoc3RkZGViLCJfS0VSTkVMMzJfNDAoRURYPTB4JTA4bHgpXG4iLAorCQlFRFhfcmVnKGNvbnRleHQpCisJKTsKKwlzdGFja3NpemUgPSBFQlBfcmVnKGNvbnRleHQpLUVTUF9yZWcoY29udGV4dCk7CisJZHByaW50Zl90aHVuayhzdGRkZWIsIglzdGFja3NpemUgPSAlbGRcbiIsc3RhY2tzaXplKTsKKwlkcHJpbnRmX3RodW5rKHN0ZGRlYiwib24gdG9wIG9mIHN0YWNrOiAweCUwNHhcbiIsKihXT1JEKilFU1BfcmVnKGNvbnRleHQpKTsKKworCW1lbWNweSgmY29udGV4dDE2LGNvbnRleHQsc2l6ZW9mKGNvbnRleHQxNikpOworCisJQ1NfcmVnKCZjb250ZXh0MTYpCSA9IEhJV09SRChFRFhfcmVnKGNvbnRleHQpKTsKKwlJUF9yZWcoJmNvbnRleHQxNikJID0gTE9XT1JEKEVEWF9yZWcoY29udGV4dCkpOworCisJY3Vyc3RhY2sgPSBQVFJfU0VHX1RPX0xJTihTVEFDSzE2X1BVU0goc3RhY2tzaXplKSk7CisJbWVtY3B5KGN1cnN0YWNrLXN0YWNrc2l6ZSwoTFBCWVRFKUVTUF9yZWcoY29udGV4dCksc3RhY2tzaXplKTsKKwlyZXQgPSBDYWxsYmFja3MtPkNhbGxSZWdpc3RlclNob3J0UHJvYygmY29udGV4dDE2LDApOworCVNUQUNLMTZfUE9QKHN0YWNrc2l6ZSk7CisKKwlkcHJpbnRmX3RodW5rKHN0ZGRlYiwiLiByZXR1cm5lZCAlMDhseFxuIixyZXQpOworCUVBWF9yZWcoY29udGV4dCkgCSA9IHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkoS0VSTkVMMzIuNDEpCisgKiBBIHRodW5rIHNldHVwIHJvdXRpbmUuCisgKiBFeHBlY3RzIGEgcG9pbnRlciB0byBhIHByZWluaXRpYWxpemVkIHRodW5rYnVmZmVyIGluIHRoZSBmaXJzdCBhcmd1bWVudAorICogbG9va2luZyBsaWtlOgorICoJMDAuLjAzOgkJdW5rbm93bgkocG9pbnRlciwgY2hlY2sgXzQxLCBfNDMsIF80NikKKyAqCTA0OiBFQjFFCQlqbXAgKzB4MjAKKyAqCisgKgkwNi4uMjM6CQl1bmtub3duIChzcGFjZSBmb3IgcmVwbGFjZW1lbnQgY29kZSwgY2hlY2sgLjkwKQorICoKKyAqCTI0Oj5FODAwMDAwMDAwCQljYWxsIG9mZnNldCAyOQorICoJMjk6PjU4CQkJcG9wIGVheAkJICAgKCB0YXJnZXQgb2YgY2FsbCApCisgKgkyQTogMkQyNTAwMDAwMAkJc3ViIGVheCwweDAwMDAwMDI1ICggbm93IHBvaW50cyB0byBvZmZzZXQgNCApCisgKgkyRjogQkF4eHh4eHh4eAkJbW92IGVkeCx4eHh4eHh4eAorICoJMzQ6IDY4eXl5eXl5eXkJCXB1c2ggS0VSTkVMMzIuOTAKKyAqCTM5OiBDMwkJCXJldAorICoKKyAqCTNBOiBFQjFFCQlqbXAgKzB4MjAKKyAqCTNFIC4uLiA1OToJdW5rbm93biAoc3BhY2UgZm9yIHJlcGxhY2VtZW50IGNvZGU/KQorICoJNUE6IEU4eHh4eHh4eHgJCWNhbGwgPDMyYml0b2Zmc2V0IHh4eHh4eHh4PgorICoJNUY6IDVBCQkJcG9wIGVkeAorICoJNjA6IDgxRUEyNXh4eHh4eAlzdWIgZWR4LCAweDI1eHh4eHh4CisgKgk2NjogNTIJCQlwdXNoIGVkeAorICoJNjc6IDY4eHh4eHh4eHgJCXB1c2ggeHh4eHh4eHgKKyAqCTZDOiA2OHl5eXl5eXl5CQlwdXNoIEtFUk5FTDMyLjg5CisgKgk3MTogQzMJCQlyZXQKKyAqCTcyOiBlbmQ/CisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgY29kZSBpcyB0aGVyZSwgYW5kIHJlcGxhY2VzIHRoZSB5eXl5eXl5eSBlbnRyaWVzCisgKiBieSB0aGUgZnVuY3Rpb25wb2ludGVycy4KKyAqIFRoZSB0aHVua2J1ZiBsb29rcyBsaWtlOgorICoKKyAqCTAwOiBEV09SRAlsZW5ndGgJCT8gZG9uJ3Qga25vdyBleGFjdGx5CisgKgkwNDogU0VHUFRSCXB0cgkJPyB3aGVyZSBkb2VzIGl0IHBvaW50IHRvPworICogVGhlIHNlZ3BvaW50ZXIgcHRyIGlzIHdyaXR0ZW4gaW50byB0aGUgZmlyc3QgRFdPUkQgb2YgJ3RodW5rJy4KKyAqIFtvayBwcm9iYWJseV0KKyAqLworCitMUFZPSUQgV0lOQVBJIF9LRVJORUwzMl80MShMUEJZVEUgdGh1bmssTFBDU1RSIHRoa2J1ZixEV09SRCBsZW4sTFBDU1RSIGRsbDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIGRsbDMyKQoreworCUhNT0RVTEUzMgloa3JubDMyID0gR2V0TW9kdWxlSGFuZGxlMzJBKCJLRVJORUwzMiIpOworCUhNT0RVTEUxNglobW9kOworCUxQRFdPUkQJCWFkZHIsYWRkcjI7CisJRFdPUkQJCXNlZ2FkZHI7CisKKwkvKiBGSVhNRTogYWRkIGNoZWNrcyBmb3IgdmFsaWQgY29kZSAuLi4gKi8KKwkvKiB3cml0ZSBwb2ludGVycyB0byBrZXJuZWwzMi44OSBhbmQga2VybmVsMzIuOTAgKCtvcmRpbmFsIGJhc2Ugb2YgMSkgKi8KKwkqKERXT1JEKikodGh1bmsrMHgzNSkgPSAoRFdPUkQpR2V0UHJvY0FkZHJlc3MzMihoa3JubDMyLChMUFNUUik5MCk7CisJKihEV09SRCopKHRodW5rKzB4NkQpID0gKERXT1JEKUdldFByb2NBZGRyZXNzMzIoaGtybmwzMiwoTFBTVFIpODkpOworCisJCisJaG1vZCA9IExvYWRMaWJyYXJ5MTYoZGxsMTYpOworCWlmIChobW9kPDMyKSB7CisJCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl80MS0+ZmFpbGVkIHRvIGxvYWQgMTZiaXQgRExMICVzLCBlcnJvciAlZFxuIixkbGwxNixobW9kKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNlZ2FkZHIgPSAoRFdPUkQpV0lOMzJfR2V0UHJvY0FkZHJlc3MxNihobW9kLChMUFNUUil0aGtidWYpOworCWlmICghc2VnYWRkcikgeworCQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfNDEtPm5vICVzIGV4cG9ydGVkIGZyb20gJXMhXG4iLHRoa2J1ZixkbGwxNik7CisJCXJldHVybiBOVUxMOworCX0KKwlhZGRyID0gKExQRFdPUkQpUFRSX1NFR19UT19MSU4oc2VnYWRkcik7CisJaWYgKGFkZHJbMF0gIT0gbGVuKSB7CisJCWZwcmludGYoc3RkZXJyLCJLRVJORUwzMl80MS0+dGhrYnVmIGxlbmd0aCBtaXNtYXRjaD8gJWxkIHZzICVsZFxuIixsZW4sYWRkclswXSk7CisJCXJldHVybiBOVUxMOworCX0KKwlhZGRyMiA9IFBUUl9TRUdfVE9fTElOKGFkZHJbMV0pOworCWlmIChISVdPUkQoYWRkcjIpKQorCQkqKERXT1JEKil0aHVuayA9IChEV09SRClhZGRyMjsKKworCWRwcmludGZfdGh1bmsoc3RkZGViLCAiX0tFUk5FTDMyXzQxOiBsb2FkZWQgbW9kdWxlICVkLCBmdW5jICVzKCVkKSBAICVwICglcCksIHJldHVybmluZyAlcFxuIiwKKwkJICAgICAgaG1vZCwgSElXT1JEKHRoa2J1Zik9PTAgPyAiPG9yZGluYWw+IiA6IHRoa2J1ZiwgKGludCl0aGtidWYsICh2b2lkKilzZWdhZGRyLCBhZGRyLCBhZGRyMik7CisKKwlyZXR1cm4gYWRkcjI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJKEtFUk5FTDMyLjkwKQorICogUVQgVGh1bmsgcHJpbWluZyBmdW5jdGlvbgorICogUmV3cml0ZXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHRodW5rIHRvIHVzZSB0aGUgUVRfVGh1bmsgaW50ZXJmYWNlCisgKiBhbmQganVtcHMgdG8gdGhlIHN0YXJ0IG9mIHRoYXQgY29kZS4KKyAqIFtva10KKyAqLworVk9JRCBXSU5BUEkgX0tFUk5FTDMyXzkwKENPTlRFWFQgKmNvbnRleHQpCit7CisJZHByaW50Zl90aHVuayhzdGRkZWIsICJfS0VSTkVMMzJfOTA6IFFUIFRodW5rIHByaW1pbmc7IGNvbnRleHQgJXBcbiIsIGNvbnRleHQpOworCQorCV93cml0ZV9xdHRodW5rKChMUEJZVEUpRUFYX3JlZyhjb250ZXh0KSwqKERXT1JEKikoRUFYX3JlZyhjb250ZXh0KStFRFhfcmVnKGNvbnRleHQpKSk7CisJLyogd2UganVzdCBjYWxsIHRoZSByZWFsIFFUX1RodW5rIHJpZ2h0IG5vdyAKKwkgKiB3ZSBjYW4gYnlwYXNzIHRoZSByZWxheWNvZGUsIGZvciB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJlZ2lzdGVyY29udGV4dAorCSAqLworCUVEWF9yZWcoY29udGV4dCkgPSAqKERXT1JEKikoKCooRFdPUkQqKShFQVhfcmVnKGNvbnRleHQpK0VEWF9yZWcoY29udGV4dCkpKSs0KigoKEJZVEUqKUVCUF9yZWcoY29udGV4dCkpWy00XSkpOworCXJldHVybiBRVF9UaHVuayhjb250ZXh0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJCQkoS0VSTkVMMzIuNDUpCisgKiBBbm90aGVyIHRodW5rYnVmIGxpbmsgcm91dGluZS4KKyAqIFRoZSBzdGFydCBvZiB0aGUgdGh1bmtidWYgbG9va3MgbGlrZSB0aGlzOgorICogCTAwOiBEV09SRAlsZW5ndGgKKyAqCTA0OiBTRUdQVFIJYWRkcmVzcyBmb3IgdGh1bmtidWZmZXIgcG9pbnRlcgorICogW29rIHByb2JhYmx5XQorICovCitWT0lEIFdJTkFQSSBfS0VSTkVMMzJfNDYoTFBCWVRFIHRodW5rLExQU1RSIHRoa2J1ZixEV09SRCBsZW4sTFBTVFIgZGxsMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgZGxsMzIpCit7CisJTFBEV09SRAkJYWRkcjsKKwlITU9EVUxFMTYJaG1vZDsKKwlTRUdQVFIJCXNlZ2FkZHI7CisKKwlobW9kID0gTG9hZExpYnJhcnkxNihkbGwxNik7CisJaWYgKGhtb2QgPCAzMikgeworCQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfNDYtPmNvdWxkbid0IGxvYWQgJXMsIGVycm9yICVkXG4iLGRsbDE2LGhtb2QpOworCQlyZXR1cm47CisJfQorCXNlZ2FkZHIgPSAoU0VHUFRSKVdJTjMyX0dldFByb2NBZGRyZXNzMTYoaG1vZCx0aGtidWYpOworCWlmICghc2VnYWRkcikgeworCQlmcHJpbnRmKHN0ZGVyciwiS0VSTkVMMzJfNDYtPiBoYXZlbid0IGZvdW5kICVzIGluICVzIVxuIix0aGtidWYsZGxsMTYpOworCQlyZXR1cm47CisJfQorCWFkZHIgPSAoTFBEV09SRClQVFJfU0VHX1RPX0xJTihzZWdhZGRyKTsKKwlpZiAoYWRkclswXSAhPSBsZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsIktFUk5FTDMyXzQ2LT4gbGVuZ3RoIG9mIHRoa2J1ZiBkaWZmZXJzIGZyb20gZXhwZWN0ZWQgbGVuZ3RoISAoJWxkIHZzICVsZClcbiIsYWRkclswXSxsZW4pOworCQlyZXR1cm47CisJfQorCSooRFdPUkQqKVBUUl9TRUdfVE9fTElOKGFkZHJbMV0pID0gKERXT1JEKXRodW5rOworCisJZHByaW50Zl90aHVuayhzdGRkZWIsICJfS0VSTkVMMzJfNDY6IGxvYWRlZCBtb2R1bGUgJWQsIGZ1bmMgJXMoJWQpIEAgJXAgKCVwKVxuIiwKKwkJICAgICAgaG1vZCwgSElXT1JEKHRoa2J1Zik9PTAgPyAiPG9yZGluYWw+IiA6IHRoa2J1ZiwgKGludCl0aGtidWYsICh2b2lkKilzZWdhZGRyLCBhZGRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBfS0VSTkVMMzJfODcKKyAqIENoZWNrIGlmIHRodW5raW5nIGlzIGluaXRpYWxpemVkIChzcyBzZWxlY3RvciBzZXQgdXAgZXRjLikKKyAqIFdlIGRvIHRoYXQgZGlmZmVyZW50bHksIHNvIGp1c3QgcmV0dXJuIFRSVUUuCisgKiBbb2tdCisgKi8KK0JPT0wzMiBXSU5BUEkgX0tFUk5FTDMyXzg3KCkKK3sKKyAgICBkcHJpbnRmX3RodW5rKHN0ZGRlYiwgIl9LRVJORUwzMl84NzogWWVzLCB0aHVua2luZyBpcyBpbml0aWFsaXplZFxuIik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgX0tFUk5FTDMyXzg4CisgKiBPbmUgb2YgdGhlIHJlYWwgdGh1bmtpbmcgZnVuY3Rpb25zLiBUaGlzIG9uZSBzZWVtcyB0byBiZSBmb3IgMzI8LT4zMgorICogdGh1bmtzLiBJdCBzaG91bGQgcHJvYmFibHkgYmUgY2FwYWJsZSBvZiBjcm9zc2luZyBwcm9jZXNzYm91bmRhcmllcy4KKyAqCisgKiBBbmQgWUVTLCBJJ3ZlIHNlZW4gbnI9NDggKHNvbWV3aGVyZSBpbiB0aGUgV2luOTUgMzI8LT4xNiBPTEUgY291cGxpbmcpCisgKiBbb2tdCisgKi8KK0RXT1JEIFdJTkFQSVYgX0tFUk5FTDMyXzg4KCBEV09SRCBuciwgRFdPUkQgZmxhZ3MsIEZBUlBST0MzMiBmdW4sIC4uLiApCit7CisgICAgRFdPUkQgaSxyZXQ7CisgICAgRFdPUkQgKmFyZ3MgPSAoKERXT1JEICopJmZ1bikgKyAxOworCisgICAgZHByaW50Zl90aHVuayhzdGRkZWIsIktFUk5FTDMyXzg4KCVsZCwweCUwOGx4LCVwLFsgIixucixmbGFncyxmdW4pOworICAgIGZvciAoaT0wO2k8bnIvNDtpKyspIHsgZHByaW50Zl90aHVuayhzdGRkZWIsIjB4JTA4bHgsIixhcmdzW2ldKTsgfQorICAgIGRwcmludGZfdGh1bmsoc3RkZGViLCJdKVxuIik7CisgICAgc3dpdGNoIChucikgeworICAgIGNhc2UgMDoJcmV0ID0gZnVuKCk7CisJCWJyZWFrOworICAgIGNhc2UgNDoJcmV0ID0gZnVuKGFyZ3NbMF0pOworCQlicmVhazsKKyAgICBjYXNlIDg6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0pOworCQlicmVhazsKKyAgICBjYXNlIDEyOglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pOworCQlicmVhazsKKyAgICBjYXNlIDE2OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7CisJCWJyZWFrOworICAgIGNhc2UgMjA6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pOworCQlicmVhazsKKyAgICBjYXNlIDI0OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pOworCQlicmVhazsKKyAgICBjYXNlIDI4OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSk7CisJCWJyZWFrOworICAgIGNhc2UgMzI6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdLGFyZ3NbN10pOworCQlicmVhazsKKyAgICBjYXNlIDM2OglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0pOworCQlicmVhazsKKyAgICBjYXNlIDQwOglyZXQgPSBmdW4oYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSxhcmdzWzddLGFyZ3NbOF0sYXJnc1s5XSk7CisJCWJyZWFrOworICAgIGNhc2UgNDQ6CXJldCA9IGZ1bihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0sYXJnc1s1XSxhcmdzWzZdLGFyZ3NbN10sYXJnc1s4XSxhcmdzWzldLGFyZ3NbMTBdKTsKKwkJYnJlYWs7CisgICAgY2FzZSA0ODoJcmV0ID0gZnVuKGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdLGFyZ3NbM10sYXJnc1s0XSxhcmdzWzVdLGFyZ3NbNl0sYXJnc1s3XSxhcmdzWzhdLGFyZ3NbOV0sYXJnc1sxMF0sYXJnc1sxMV0pOworCQlicmVhazsKKyAgICBkZWZhdWx0OgorCWZwcmludGYoc3RkZXJyLCJfS0VSTkVMMzJfODg6IHVuc3VwcG9ydGVkIG5yIG9mIGFyZ3VtZW50cywgJWxkXG4iLG5yKTsKKwlyZXQgPSAwOworCWJyZWFrOworCisgICAgfQorICAgIGRwcmludGZfdGh1bmsoc3RkZGViLCIgcmV0dXJuaW5nICVsZCAuLi5cbiIscmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogCQlLRVJORUxfNjE5CQkoS0VSTkVMKQorICogU2VlbXMgdG8gc3RvcmUgeSBhbmQgeiBkZXBlbmRpbmcgb24geCBpbiBzb21lIGludGVybmFsIGxpc3RzLi4uCisgKi8KK1dPUkQgV0lOQVBJIF9LRVJORUxfNjE5KFdPUkQgeCxEV09SRCB5LERXT1JEIHopCit7CisgICAgZnByaW50ZihzdGRlcnIsIktFUk5FTF82MTkoMHglMDR4LDB4JTA4bHgsMHglMDhseClcbiIseCx5LHopOworICAgIHJldHVybiB4OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlBbGxvY1NMQ2FsbGJhY2sJCShLRVJORUwzMikKKyAqCisgKiBXaW45NSB1c2VzIHNvbWUgc3RydWN0Y2hhaW5zIGZvciBjYWxsYmFja3MuIEl0IGFsbG9jYXRlcyB0aGVtCisgKiBpbiBibG9ja3Mgb2YgMTAwIGVudHJpZXMsIHNpemUgMzIgYnl0ZXMgZWFjaCwgbGF5b3V0OgorICogYmxvY2tzdGFydDoKKyAqIAkwOglQVFIJbmV4dGJsb2Nrc3RhcnQKKyAqCTQ6CWVudHJ5CSpmaXJzdDsKKyAqCTg6CVdPUkQJc2VsICggc3RhcnQgcG9pbnRzIHRvIGJsb2Nrc3RhcnQpCisgKglBOglXT1JECXVua25vd24KKyAqIDEwMHhlbnRyeToKKyAqCTAwLi4xNzoJCUNvZGUKKyAqCTE4OglQREIJKm93bmluZ19wcm9jZXNzOworICoJMUM6CVBUUglibG9ja3N0YXJ0CisgKgorICogV2UgaWdub3JlIHRoaXMgZm9yIG5vdy4gKEp1c3QgYSBub3RlIGZvciBmdXJ0aGVyIGRldmVsb3BlcnMpCisgKiBGSVhNRTogdXNlIHRoaXMgbWV0aG9kLCBzbyB3ZSBkb24ndCB3YXN0ZSBzZWxlY3RvcnMuLi4KKyAqCisgKiBGb2xsb3dpbmcgY29kZSBpcyB0aGVuIGdlbmVyYXRlZCBieSBBbGxvY1NMQ2FsbGJhY2suIFRoZSBjb2RlIGlzIDE2IGJpdCwgc28KKyAqIHRoZSAweDY2IHByZWZpeCBzd2l0Y2hlcyBmcm9tIHdvcmQtPmxvbmcgcmVnaXN0ZXJzLgorICoKKyAqCTY2NUEJCXBvcAllZHggCisgKgk2NjY4eCBhcmcyIHggCXB1c2hsCTxhcmcyPgorICoJNjY1MgkJcHVzaAllZHgKKyAqCUVBeCBhcmcxIHgJam1wZgk8YXJnMT4KKyAqCisgKiByZXR1cm5zIHRoZSBzdGFydGFkZHJlc3Mgb2YgdGhpcyB0aHVuay4KKyAqCisgKiBOb3RlLCB0aGF0IHRoZXkgbG9vayB2ZXJ5IHNpbWlsYWlyIHRvIHRoZSBvbmVzIGFsbG9jYXRlcyBieSBUSFVOS19BbGxvYy4KKyAqLworRFdPUkQgV0lOQVBJCitBbGxvY1NMQ2FsbGJhY2soRFdPUkQgZmluYWxpemVyLERXT1JEIGNhbGxiYWNrKSB7CisJTFBCWVRFCXgsdGh1bmsgPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIDMyICk7CisJV09SRAlzZWw7CisKKwl4PXRodW5rOworCSp4Kys9MHg2NjsqeCsrPTB4NWE7CQkJCS8qIHBvcGwgZWR4ICovCisJKngrKz0weDY2Oyp4Kys9MHg2ODsqKERXT1JEKil4PWZpbmFsaXplcjt4Kz00OwkvKiBwdXNobCBmaW5hbGl6ZXIgKi8KKwkqeCsrPTB4NjY7KngrKz0weDUyOwkJCQkvKiBwdXNobCBlZHggKi8KKwkqeCsrPTB4ZWE7KihEV09SRCopeD1jYWxsYmFjazt4Kz00OwkJLyogam1wZiBjYWxsYmFjayAqLworCisJKihEV09SRCopKHRodW5rKzE4KSA9IEdldEN1cnJlbnRQcm9jZXNzSWQoKTsKKworCXNlbCA9IFNFTEVDVE9SX0FsbG9jQmxvY2soIHRodW5rICwgMzIsIFNFR01FTlRfQ09ERSwgRkFMU0UsIEZBTFNFICk7CisJcmV0dXJuIChzZWw8PDE2KXwwOworfQorCit2b2lkIFdJTkFQSQorRnJlZVNMQ2FsbGJhY2soRFdPUkQgeCkgeworCWZwcmludGYoc3RkZXJyLCJGcmVlU0xDYWxsYmFjaygweCUwOGx4KVxuIix4KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJS0VSTkVMXzM1OAkJKEtFUk5FTCkKKyAqIEFsbG9jYXRlcyBhIGNvZGUgc2VnbWVudCB3aGljaCBzdGFydHMgYXQgdGhlIGFkZHJlc3MgcGFzc2VkIGluIHguIGxpbWl0CisgKiAweGZmZmZmLCBhbmQgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgc3RhcnQuCisgKi8KK0RXT1JEIFdJTkFQSQorX0tFUk5FTF8zNTgoRFdPUkQgeCkgeworCVdPUkQJc2VsOworCisJZnByaW50ZihzdGRlcnIsIl9LRVJORUxfMzU4KDB4JTA4bHgpLHN0dWJcbiIseCk7CisJaWYgKCFISVdPUkQoeCkpCisJCXJldHVybiB4OworCisJc2VsID0gU0VMRUNUT1JfQWxsb2NCbG9jayggUFRSX1NFR19UT19MSU4oeCkgLCAweGZmZmYsIFNFR01FTlRfQ09ERSwgRkFMU0UsIEZBTFNFICk7CisJcmV0dXJuIChzZWw8PDE2KXwoMHgwMDAwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJS0VSTkVMXzM1OQkJKEtFUk5FTCkKKyAqIEZyZWVzIHRoZSBjb2RlIHNlZ21lbnQgb2YgdGhlIHBhc3NlZCBsaW5lYXIgcG9pbnRlciAoVGhpcyBoYXMgdXN1YWxseQorICogYmVlbiBhbGxvY2F0ZWQgYnkgX0tFUk5FTF8zNTgpLgorICovCitWT0lEIFdJTkFQSQorX0tFUk5FTF8zNTkoRFdPUkQgeCkgeworCURXT1JECXNhdmVkc3NzcDsKKworCWZwcmludGYoc3RkZXJyLCJfS0VSTkVMXzM1OSgweCUwOGx4KSxzdHViXG4iLHgpOworCWlmICgoSElXT1JEKHgpICYgNykhPTcpCisJCXJldHVybjsKKwlzYXZlZHNzc3AgPSBJRjE2MzJfU2F2ZWQxNl9zc19zcDtJRjE2MzJfU2F2ZWQxNl9zc19zcCA9IDA7CisJU0VMRUNUT1JfRnJlZUJsb2NrKHg+PjE2LDEpOworCUlGMTYzMl9TYXZlZDE2X3NzX3NwID0gc2F2ZWRzc3NwOworCXJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJS0VSTkVMXzQ3MgkJKEtFUk5FTCkKKyAqIHNvbWV0aGluZyBsaWtlIEdldEN1cnJlbnRoSW5zdGFuY2UuCisgKi8KK1ZPSUQgV0lOQVBJCitfS0VSTkVMXzQ3MihDT05URVhUICpjb250ZXh0KSB7CisJZnByaW50ZihzdGRlcnIsIl9LRVJORUxfNDcyKDB4JTA4bHgpLHN0dWJcbiIsRUFYX3JlZyhjb250ZXh0KSk7CisJaWYgKCFFQVhfcmVnKGNvbnRleHQpKSB7CisJCVREQiAqcFRhc2sgPSAoVERCKilHbG9iYWxMb2NrMTYoR2V0Q3VycmVudFRhc2soKSk7CisJCUFYX3JlZyhjb250ZXh0KT1wVGFzay0+aEluc3RhbmNlOworCQlyZXR1cm47CisJfQorCWlmICghSElXT1JEKEVBWF9yZWcoY29udGV4dCkpKQorCQlyZXR1cm47IC8qIHJldHVybnMgdGhlIHBhc3NlZCB2YWx1ZSAqLworCS8qIGhtbSAuLi4gZml4bWUgKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIAkJS0VSTkVMXzQzMQkJKEtFUk5FTC40MzEpCisgKiBJc1BlRmlsZQorICovCitCT09MMTYgV0lOQVBJIEtFUk5FTF80MzEoTFBTVFIgZm4sV09SRCB4KSB7CisJSU1BR0VfRE9TX0hFQURFUgltemg7CisJSEZJTEUzMgkJCWhmOworCU9GU1RSVUNUCQlvZnM7CisJRFdPUkQJCQl4bWFnaWM7CisKKwloZiA9IE9wZW5GaWxlMzIoZm4sJm9mcyxPRl9SRUFEKTsKKwlpZiAoaGY9PUhGSUxFX0VSUk9SMzIpCisJCXJldHVybiBGQUxTRTsKKwlpZiAoc2l6ZW9mKG16aCkhPV9scmVhZDMyKGhmLCZtemgsc2l6ZW9mKG16aCkpKSB7CisJCV9sY2xvc2UzMihoZik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKG16aC5lX21hZ2ljIT1JTUFHRV9ET1NfU0lHTkFUVVJFKSB7CisJCWZwcmludGYoc3RkZXJyLCJmaWxlIGhhcyBub3QgZ290IGRvcyBzaWduYXR1cmUhXG4iKTsKKwkJX2xjbG9zZTMyKGhmKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlfbGxzZWVrMzIoaGYsbXpoLmVfbGZhbmV3LFNFRUtfU0VUKTsKKwlpZiAoc2l6ZW9mKERXT1JEKSE9X2xyZWFkMzIoaGYsJnhtYWdpYyxzaXplb2YoRFdPUkQpKSkgeworCQlfbGNsb3NlMzIoaGYpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCV9sY2xvc2UzMihoZik7CisJcmV0dXJuICh4bWFnaWMgPT0gSU1BR0VfTlRfU0lHTkFUVVJFKTsKK30KZGlmZiAtLWdpdCBhL3dpbjMyL25ld2Zucy5jIGIvd2luMzIvbmV3Zm5zLmMKaW5kZXggMzE5MjQ1MS4uMWVmNzJlNSAxMDA2NDQKLS0tIGEvd2luMzIvbmV3Zm5zLmMKKysrIGIvd2luMzIvbmV3Zm5zLmMKQEAgLTQ5LDYgKzQ5LDE3IEBACiAJcmV0dXJuIEZBTFNFOwogfQogCitIQU5ETEUzMiBXSU5BUEkgRmluZEZpcnN0Q2hhbmdlTm90aWZpY2F0aW9uMzJBKExQQ1NUUiBscFBhdGhOYW1lLEJPT0wzMiBiV2F0Y2hTdWJ0cmVlLERXT1JEIGR3Tm90aWZ5RmlsdGVyKSB7CisJZnByaW50ZihzdGRlcnIsIkZpbmRGaXJzdENoYW5nZU5vdGlmaWNhdGlvbiglcywlZCwlMDhseCksc3R1YlxuIiwKKwkJbHBQYXRoTmFtZSxiV2F0Y2hTdWJ0cmVlLGR3Tm90aWZ5RmlsdGVyCisJKTsKKwlyZXR1cm4gMHhjYWZlYmFiZTsKK30KKworQk9PTDMyIFdJTkFQSSBGaW5kTmV4dENoYW5nZU5vdGlmaWNhdGlvbihIQU5ETEUzMiBmY25oYW5kbGUpIHsKKwlmcHJpbnRmKHN0ZGVyciwiRmluZE5leHRDaGFuZ2VOb3RpZmljYXRpb24oJTA4eCksc3R1YiFcbiIsZmNuaGFuZGxlKTsKKwlyZXR1cm4gRkFMU0U7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSAoS0VSTkVMMzIuNTY1KQpkaWZmIC0tZ2l0IGEvd2luMzIvb3JkaW5hbHMuYyBiL3dpbjMyL29yZGluYWxzLmMKaW5kZXggNTc2ZDI1Yi4uMTBhZjYzYiAxMDA2NDQKLS0tIGEvd2luMzIvb3JkaW5hbHMuYworKysgYi93aW4zMi9vcmRpbmFscy5jCkBAIC0xNiw5ICsxNiw2IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogCi1leHRlcm4gVEhEQgkqcEN1cnJlbnRUaHJlYWQ7Ci1leHRlcm4gUERCMzIJKnBDdXJyZW50UHJvY2VzczsKLQogc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gV2luMTZNdXRleDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS93aW4zMi90aHJlYWQuYyBiL3dpbjMyL3RocmVhZC5jCmluZGV4IGUzMzc1NWEuLmU5NzRjMjkgMTAwNjQ0Ci0tLSBhL3dpbjMyL3RocmVhZC5jCisrKyBiL3dpbjMyL3RocmVhZC5jCkBAIC0xNTksNyArMTU5LDcgQEAKIAogdm9pZCBXSU5BUEkgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKENSSVRJQ0FMX1NFQ1RJT04gKnBjcml0aWNhbCkKIHsKLSAgIHNlbWN0bCgoaW50KSBwY3JpdGljYWwtPkxvY2tTZW1hcGhvcmUsMCxJUENfUk1JRCwodW5pb24gc2VtdW4pTlVMTCk7CisgICBzZW1jdGwoKGludCkgcGNyaXRpY2FsLT5Mb2NrU2VtYXBob3JlLDAsSVBDX1JNSUQsICh2b2lkICopMCk7CiAgICBwY3JpdGljYWwtPlJlc2VydmVkPS0xOwogfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL2RjZS5jIGIvd2luZG93cy9kY2UuYwppbmRleCAyZDNiNTA2Li42ZmI2ZDU2IDEwMDY0NAotLS0gYS93aW5kb3dzL2RjZS5jCisrKyBiL3dpbmRvd3MvZGNlLmMKQEAgLTEyLDggKzEyLDkgQEAKICAqCiAgKiBEQ1hfRENFRU1QVFkgICAgLSBkY2UgaXMgdW5pbml0aWFsaXplZAogICogRENYX0RDRUJVU1kgICAgIC0gZGNlIGlzIGluIHVzZQotICogRENYX0tFRVBDTElQUkdOIC0gUmVsZWFzZURDIHNob3VsZCBwcmVzZXJ2ZSB0aGUgY2xpcHBpbmcgcmVnaW9uCi0gKiBEQ1hfV0lORE9XUEFJTlQgLSBCZWdpblBhaW50IHNwZWNpZmljIGZsYWcKKyAqIERDWF9EQ0VESVJUWSAgICAtIFJlbGVhc2VEQygpIHNob3VsZCB3aXBlIGluc3RlYWQgb2YgY2FjaGluZworICogRENYX0tFRVBDTElQUkdOIC0gUmVsZWFzZURDKCkgc2hvdWxkIG5vdCBkZWxldGUgdGhlIGNsaXBwaW5nIHJlZ2lvbgorICogRENYX1dJTkRPV1BBSU5UIC0gQmVnaW5QYWludCgpIGlzIGluIGVmZmVjdAogICovCiAKICNpbmNsdWRlICJvcHRpb25zLmgiCkBAIC0xOTIsNyArMTkzLDE3IEBACiAgICAgaWYgKGRjZS0+RENYZmxhZ3MgJiBEQ1hfQ0FDSEUpCiAgICAgewogICAgICAgICBTZXREQ1N0YXRlKCBkY2UtPmhEQywgZGVmYXVsdERDc3RhdGUgKTsKLSAgICAgICAgZGNlLT5EQ1hmbGFncyAmPSB+RENYX0RDRUJVU1k7CS8qIGJ1dCB3aXRob3V0IERDWF9EQ0VFTVBUWSAqLworICAgICAgICBkY2UtPkRDWGZsYWdzICY9IH5EQ1hfRENFQlVTWTsKKwlpZiAoZGNlLT5EQ1hmbGFncyAmIERDWF9EQ0VESVJUWSkKKwl7CisJICAgIC8qIGRvbid0IGtlZXAgYXJvdW5kIGludmFsaWRhdGVkIGVudHJpZXMgCisJICAgICAqIGJlY2F1c2UgU2V0RENTdGF0ZSgpIGRpc2FibGVzIGhWaXNSZ24gdXBkYXRlcworCSAgICAgKiBieSByZW1vdmluZyBkaXJ0eSBiaXQuICovCisKKwkgICAgZGNlLT5od25kQ3VycmVudCA9IDA7CisJICAgIGRjZS0+RENYZmxhZ3MgJj0gRENYX0NBQ0hFOworCSAgICBkY2UtPkRDWGZsYWdzIHw9IERDWF9EQ0VFTVBUWTsKKwl9CiAgICAgfQogICAgIHJldHVybiAxOwogfQpAQCAtMjYxLDExICsyNzIsMTIgQEAKIAkJCQl9CiAJCQkJZWxzZQogCQkJCXsKLQkJCQkgICAgLyogU2V0IGRpcnR5IGJpdCBpbiB0aGUgaERDICovCisJCQkJICAgIC8qIFNldCBkaXJ0eSBiaXRzIGluIHRoZSBoREMgYW5kIERDRSBzdHJ1Y3RzICovCiAKIAkJCQkgICAgZHByaW50Zl9kYyhzdGRkZWIsIlx0Zml4ZWQgdXAgJTA4eCBkY2UgWyUwNHhdXG4iLCAKIAkJCQkJCSh1bnNpZ25lZClkY2UsIHduZEN1cnJlbnQtPmh3bmRTZWxmKTsKIAorCQkJCSAgICBkY2UtPkRDWGZsYWdzIHw9IERDWF9EQ0VESVJUWTsKIAkJCQkgICAgU2V0SG9va0ZsYWdzKGRjZS0+aERDLCBEQ0hGX0lOVkFMSURBVEVWSVNSR04pOwogCQkJCSAgICBiUmV0ID0gVFJVRTsKIAkJCQl9CkBAIC03NjksNiArNzgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgd25kLT5mbGFncyB8PSBXSU5fU0FWRVVOREVSX09WRVJSSURFOwogCX0KIAlkYy0+dy5mbGFncyAmPSB+RENfRElSVFk7CisJZGNlLT5EQ1hmbGFncyAmPSB+RENYX0RDRURJUlRZOwogCVNlbGVjdFZpc1JnbiggaGRjLCBocmduVmlzaWJsZSApOwogICAgIH0KICAgICBlbHNlCkBAIC05MDgsNyArOTIxLDggQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmVSZ24zMihoVmlzUmduLCBoVmlzUmduLCBkY2UtPmhDbGlwUmduLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRjZS0+RENYZmxhZ3MgJiBEQ1hfRVhDTFVERVJHTik/IFJHTl9ESUZGOlJHTl9BTkQpOwotCSAgICAgICB9ICAKKwkgICAgICAgfQorCSAgICAgICBkY2UtPkRDWGZsYWdzICY9IH5EQ1hfRENFRElSVFk7CiAJICAgICAgIFNlbGVjdFZpc1JnbihoREMsIGhWaXNSZ24pOwogCSAgICAgICBEZWxldGVPYmplY3QzMiggaFZpc1JnbiApOwogCSAgIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmd25kLmMgYi93aW5kb3dzL2RlZnduZC5jCmluZGV4IGU1MGQwMGIuLjAwMjg2OGEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmd25kLmMKKysrIGIvd2luZG93cy9kZWZ3bmQuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJub25jbGllbnQuaCIKICNpbmNsdWRlICJ3aW5wb3MuaCIKKyNpbmNsdWRlICJkY2UuaCIKICNpbmNsdWRlICJzeXNjb2xvci5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgpAQCAtMjgsOCArMjksNiBAQAogc3RhdGljIHNob3J0IGlGMTBLZXkgPSAwOwogc3RhdGljIHNob3J0IGlNZW51U3lzS2V5ID0gMDsKIAotZXh0ZXJuIHZvaWQgIEVuZE1lbnUodm9pZCk7Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERFRldORF9IYW5kbGVXaW5kb3dQb3NDaGFuZ2VkCiAgKgpAQCAtOTEsNiArOTAsMzMgQEAKICAgICByZXR1cm4gc3lzQ29sb3JPYmplY3RzLmhicnVzaFdpbmRvdzsKIH0KIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBERUZXTkRfU2V0UmVkcmF3CisgKi8KK3N0YXRpYyB2b2lkIERFRldORF9TZXRSZWRyYXcoIFdORCogd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0gKQoreworICAgIEJPT0wzMiBiVmlzaWJsZSA9IHduZFB0ci0+ZHdTdHlsZSAmIFdTX1ZJU0lCTEU7CisKKyAgICBpZiggd1BhcmFtICkKKyAgICB7CisJaWYoICFiVmlzaWJsZSApCisJeworCSAgICB3bmRQdHItPmR3U3R5bGUgfD0gV1NfVklTSUJMRTsKKwkgICAgRENFX0ludmFsaWRhdGVEQ0UoIHduZFB0ci0+cGFyZW50LCAmd25kUHRyLT5yZWN0V2luZG93ICk7CisJfQorICAgIH0KKyAgICBlbHNlIGlmKCBiVmlzaWJsZSApCisgICAgeworCWlmKCB3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSApIHdQYXJhbSA9IFJEV19WQUxJREFURTsKKwllbHNlIHdQYXJhbSA9IFJEV19BTExDSElMRFJFTiB8IFJEV19WQUxJREFURTsKKworCVBBSU5UX1JlZHJhd1dpbmRvdyggd25kUHRyLT5od25kU2VsZiwgTlVMTCwgMCwgd1BhcmFtLCAwICk7CisJRENFX0ludmFsaWRhdGVEQ0UoIHduZFB0ci0+cGFyZW50LCAmd25kUHRyLT5yZWN0V2luZG93ICk7CisJd25kUHRyLT5kd1N0eWxlICY9IH5XU19WSVNJQkxFOworICAgIH0KK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgREVGV05EX0RlZldpblByb2MKICAqCkBAIC0xNjcsMTQgKzE5Myw3IEBACiAJfQogCiAgICAgY2FzZSBXTV9TRVRSRURSQVc6Ci0gICAgICAgIGlmKHdQYXJhbSkKLSAgICAgICAgICAgIFNldFdpbmRvd1BvczMyKCB3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCAwLCAwLCAwLCAwLAotICAgICAgICAgICAgICAgIFNXUF9TSE9XV0lORE9XIHwgU1dQX05PTU9WRSB8IFNXUF9OT1NJWkUgfCBTV1BfTk9aT1JERVIgfAotICAgICAgICAgICAgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PUkVEUkFXICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFNldFdpbmRvd1BvczMyKCB3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCAwLCAwLCAwLCAwLAotICAgICAgICAgICAgICAgIFNXUF9ISURFV0lORE9XIHwgU1dQX05PTU9WRSB8IFNXUF9OT1NJWkUgfCBTV1BfTk9aT1JERVIgfAotICAgICAgICAgICAgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PUkVEUkFXICk7CisJREVGV05EX1NldFJlZHJhdyggd25kUHRyLCB3UGFyYW0gKTsKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBjYXNlIFdNX0NMT1NFOgpkaWZmIC0tZ2l0IGEvd2luZG93cy9kaWFsb2cuYyBiL3dpbmRvd3MvZGlhbG9nLmMKaW5kZXggYjY4MTUxZS4uZjQ2OWM2MSAxMDA2NDQKLS0tIGEvd2luZG93cy9kaWFsb2cuYworKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC02Niw3ICs2Niw3IEBACiAgKgogICogSW5pdGlhbGlzYXRpb24gb2YgdGhlIGRpYWxvZyBtYW5hZ2VyLgogICovCi1CT09MMzIgRElBTE9HX0luaXQoKQorQk9PTDMyIERJQUxPR19Jbml0KHZvaWQpCiB7CiAgICAgVEVYVE1FVFJJQzE2IHRtOwogICAgIEhEQzE2IGhkYzsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWRpLmMgYi93aW5kb3dzL21kaS5jCmluZGV4IDU0YmFiZTAuLmU5ZTE5ODAgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWRpLmMKKysrIGIvd2luZG93cy9tZGkuYwpAQCAtMTUxMiw3ICsxNTEyLDcgQEAKIAkJc3dpdGNoKCBtc2ctPndQYXJhbSApCiAJCXsKIAkJICAgIGNhc2UgVktfRjY6Ci0JCSAgICBjYXNlIFZLX1NFUEFSQVRPUjoKKwkJICAgIGNhc2UgVktfVEFCOgogCQkJIHdQYXJhbSA9ICggR2V0S2V5U3RhdGUzMihWS19TSElGVCkgJiAweDgwMDAgKQogCQkJCSAgPyBTQ19ORVhUV0lORE9XIDogU0NfUFJFVldJTkRPVzsKIAkJCSBicmVhazsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggMDFlMGMwNzAuLmE2MmNhODcgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWVzc2FnZS5jCisrKyBiL3dpbmRvd3MvbWVzc2FnZS5jCkBAIC0zNyw3ICszNyw3IEBACiBleHRlcm4gTUVTU0FHRVFVRVVFICpwQ3Vyc29yUXVldWU7CQkJIC8qIHF1ZXVlLmMgKi8KIGV4dGVybiBNRVNTQUdFUVVFVUUgKnBBY3RpdmVRdWV1ZTsKIAotZXh0ZXJuIHZvaWQgSm95U2VuZE1lc3NhZ2VzKHZvaWQpOworZXh0ZXJuIHZvaWQgam95U2VuZE1lc3NhZ2VzKHZvaWQpOwogCiBEV09SRCBNU0dfV2luZVN0YXJ0VGlja3M7IC8qIFRpY2tzIGF0IFdpbmUgc3RhcnR1cCAqLwogCkBAIC00NDAsNyArNDQwLDcgQEAKICAgICBpbnQgaSwga2JkX21zZywgcG9zID0gc3lzTXNnUXVldWUtPm5leHRNZXNzYWdlOwogCiAgICAgLyogRklYTUU6IHRoZXJlIGhhcyB0byBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyAqLwotICAgIEpveVNlbmRNZXNzYWdlcygpOworICAgIGpveVNlbmRNZXNzYWdlcygpOwogCiAgICAgLyogSWYgdGhlIHF1ZXVlIGlzIGVtcHR5LCBhdHRlbXB0IHRvIGZpbGwgaXQgKi8KICAgICBpZiAoIXN5c01zZ1F1ZXVlLT5tc2dDb3VudCAmJiBYUGVuZGluZyhkaXNwbGF5KSkKQEAgLTExMzYsNyArMTEzNiw3IEBACiAgICAgV05EICoqbGlzdCwgKipwcFduZDsKICAgICBMUkVTVUxUIHJldDsKIAotICAgIGlmIChod25kID09IEhXTkRfQlJPQURDQVNUKQorICAgIGlmIChod25kID09IEhXTkRfQlJPQURDQVNUIHx8IGh3bmQgPT0gSFdORF9UT1BNT1NUKQogICAgIHsKICAgICAgICAgaWYgKCEobGlzdCA9IFdJTl9CdWlsZFdpbkFycmF5KCBXSU5fR2V0RGVza3RvcCgpLCAwLCBOVUxMICkpKQogICAgICAgICAgICAgcmV0dXJuIFRSVUU7CkBAIC0xMTc4LDcgKzExNzgsNyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIFNlbmRNZXNzYWdlMzJXICAgKFVTRVIzMi40NTgpCisgKiAgICAgICAgICAgU2VuZE1lc3NhZ2UzMlcgICAoVVNFUjMyLjQ1OSkKICAqLwogTFJFU1VMVCBXSU5BUEkgU2VuZE1lc3NhZ2UzMlcoIEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApCkBAIC0xMTg3LDcgKzExODcsNyBAQAogICAgIFdORCAqKmxpc3QsICoqcHBXbmQ7CiAgICAgTFJFU1VMVCByZXQ7CiAKLSAgICBpZiAoaHduZCA9PSBIV05EX0JST0FEQ0FTVCkKKyAgICBpZiAoaHduZCA9PSBIV05EX0JST0FEQ0FTVCB8fCBod25kID09IEhXTkRfVE9QTU9TVCkKICAgICB7CiAgICAgICAgIGlmICghKGxpc3QgPSBXSU5fQnVpbGRXaW5BcnJheSggV0lOX0dldERlc2t0b3AoKSwgMCwgTlVMTCApKSkKICAgICAgICAgICAgIHJldHVybiBUUlVFOwpAQCAtMTIyOCw2ICsxMjI4LDQyIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2VuZE1lc3NhZ2VUaW1lb3V0MTYgICAgKG5vdCBhIFdJTkFQSSkKKyAqLworTFJFU1VMVCBXSU5BUEkgU2VuZE1lc3NhZ2VUaW1lb3V0MTYoIEhXTkQxNiBod25kLCBVSU5UMTYgbXNnLCBXUEFSQU0xNiB3UGFyYW0sCisJCQkJICAgICBMUEFSQU0gbFBhcmFtLCBVSU5UMTYgZmxhZ3MsCisJCQkJICAgICBVSU5UMTYgdGltZW91dCwgTFBXT1JEIHJlc3VsdHApCit7CisgIGZwcmludGYgKHN0ZG5pbXAsICJTZW5kTWVzc2FnZVRpbWVvdXQxNiAtLSBzZW1pc3R1YlxuIik7CisgIHJldHVybiBTZW5kTWVzc2FnZTE2IChod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZW5kTWVzc2FnZVRpbWVvdXQzMkEgICAoVVNFUjMyLjQ1NykKKyAqLworTFJFU1VMVCBXSU5BUEkgU2VuZE1lc3NhZ2VUaW1lb3V0MzJBKCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAorCQkJCSAgICAgIExQQVJBTSBsUGFyYW0sIFVJTlQzMiBmbGFncywKKwkJCQkgICAgICBVSU5UMzIgdGltZW91dCwgTFBEV09SRCByZXN1bHRwKQoreworICBmcHJpbnRmIChzdGRuaW1wLCAiU2VuZE1lc3NhZ2VUaW1lb3V0MzJBIC0tIHNlbWlzdHViXG4iKTsKKyAgcmV0dXJuIFNlbmRNZXNzYWdlMzJBIChod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZW5kTWVzc2FnZVRpbWVvdXQzMlcgICAoVVNFUjMyLjQ1OCkKKyAqLworTFJFU1VMVCBXSU5BUEkgU2VuZE1lc3NhZ2VUaW1lb3V0MzJXKCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAorCQkJCSAgICAgIExQQVJBTSBsUGFyYW0sIFVJTlQzMiBmbGFncywKKwkJCQkgICAgICBVSU5UMzIgdGltZW91dCwgTFBEV09SRCByZXN1bHRwKQoreworICBmcHJpbnRmIChzdGRuaW1wLCAiU2VuZE1lc3NhZ2VUaW1lb3V0MzJXIC0tIHNlbWlzdHViXG4iKTsKKyAgcmV0dXJuIFNlbmRNZXNzYWdlMzJXIChod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBXYWl0TWVzc2FnZSAgICAoVVNFUi4xMTIpIChVU0VSMzIuNTc3KQogICovCiB2b2lkIFdJTkFQSSBXYWl0TWVzc2FnZSggdm9pZCApCmRpZmYgLS1naXQgYS93aW5kb3dzL21zZ2JveC5jIGIvd2luZG93cy9tc2dib3guYwppbmRleCA2MjdlMGNmLi5mNWY5MGJkIDEwMDY0NAotLS0gYS93aW5kb3dzL21zZ2JveC5jCisrKyBiL3dpbmRvd3MvbXNnYm94LmMKQEAgLTEzLDE0ICsxMyw2IEBACiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFBDU1RSIHRpdGxlOwotICAgIExQQ1NUUiB0ZXh0OwotICAgIFVJTlQzMiB0eXBlOwotfSBNU0dCT1gsICpMUE1TR0JPWDsKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNU0dCT1hfRGxnUHJvYwogICoKQEAgLTI5LDcgKzIxLDggQEAKIHN0YXRpYyBMUkVTVUxUIENBTExCQUNLIE1TR0JPWF9EbGdQcm9jKCBIV05EMzIgaHduZCwgVUlOVDMyIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKLSAgTFBNU0dCT1ggbHBtYjsKKyAgTFBNU0dCT1hQQVJBTVMzMkEgbHBtYjsKKwogICBSRUNUMzIgcmVjdCwgdGV4dHJlY3Q7CiAgIEhXTkQzMiBoSXRlbTsKICAgSERDMzIgaGRjOwpAQCAtMzksMTEgKzMyLDExIEBACiAgIAogICBzd2l0Y2gobWVzc2FnZSkgewogICAgY2FzZSBXTV9JTklURElBTE9HOgotICAgIGxwbWIgPSAoTFBNU0dCT1gpbFBhcmFtOwotICAgIGlmIChscG1iLT50aXRsZSkgU2V0V2luZG93VGV4dDMyQShod25kLCBscG1iLT50aXRsZSk7Ci0gICAgU2V0V2luZG93VGV4dDMyQShHZXREbGdJdGVtMzIoaHduZCwgMTAwKSwgbHBtYi0+dGV4dCk7CisgICAgbHBtYiA9IChMUE1TR0JPWFBBUkFNUzMyQSlsUGFyYW07CisgICAgaWYgKGxwbWItPmxwc3pDYXB0aW9uKSBTZXRXaW5kb3dUZXh0MzJBKGh3bmQsIGxwbWItPmxwc3pDYXB0aW9uKTsKKyAgICBTZXRXaW5kb3dUZXh0MzJBKEdldERsZ0l0ZW0zMihod25kLCAxMDApLCBscG1iLT5scHN6VGV4dCk7CiAgICAgLyogSGlkZSBub3Qgc2VsZWN0ZWQgYnV0dG9ucyAqLwotICAgIHN3aXRjaChscG1iLT50eXBlICYgTUJfVFlQRU1BU0spIHsKKyAgICBzd2l0Y2gobHBtYi0+ZHdTdHlsZSAmIE1CX1RZUEVNQVNLKSB7CiAgICAgIGNhc2UgTUJfT0s6CiAgICAgICBTaG93V2luZG93MzIoR2V0RGxnSXRlbTMyKGh3bmQsIDIpLCBTV19ISURFKTsKICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwpAQCAtNzEsNyArNjQsNyBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICAgIC8qIFNldCB0aGUgaWNvbiAqLwotICAgIHN3aXRjaChscG1iLT50eXBlICYgTUJfSUNPTk1BU0spIHsKKyAgICBzd2l0Y2gobHBtYi0+ZHdTdHlsZSAmIE1CX0lDT05NQVNLKSB7CiAgICAgIGNhc2UgTUJfSUNPTkVYQ0xBTUFUSU9OOgogICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlMTYoaHduZCwgc3RjMSwgU1RNX1NFVElDT04xNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXUEFSQU0xNilMb2FkSWNvbjE2KDAsIElESV9FWENMQU1BVElPTiksIDApOwpAQCAtMTIxLDcgKzExNCw3IEBACiAgICAgCiAgICAgR2V0Q2xpZW50UmVjdDMyKGhJdGVtLCAmcmVjdCk7CiAgICAgaGRjID0gR2V0REMzMihoSXRlbSk7Ci0gICAgbFJldCA9IERyYXdUZXh0MzJBKCBoZGMsIGxwbWItPnRleHQsIC0xLCAmcmVjdCwKKyAgICBsUmV0ID0gRHJhd1RleHQzMkEoIGhkYywgbHBtYi0+bHBzelRleHQsIC0xLCAmcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgIERUX0xFRlQgfCBEVF9FWFBBTkRUQUJTIHwgRFRfV09SREJSRUFLIHwgRFRfQ0FMQ1JFQ1QpOwogICAgIHRoZWlnaHQgPSByZWN0LmJvdHRvbSAgLSByZWN0LnRvcDsKICAgICB0aWhlaWdodCA9IDE2ICsgTUFYKGloZWlnaHQsIHRoZWlnaHQpOwpAQCAtMTUwLDcgKzE0Myw3IEBACiAgICAgICAvKiBzb21lIGFyaXRobWV0aWMgdG8gZ2V0IHRoZSByaWdodCBvcmRlciBmb3IgWWVzTm9DYW5jZWwgd2luZG93cyAqLwogICAgICAgaEl0ZW0gPSBHZXREbGdJdGVtMzIoaHduZCwgKGkgKyA1KSAlIDcgKyAxKTsKICAgICAgIGlmIChHZXRXaW5kb3dMb25nMzJBKGhJdGVtLCBHV0xfU1RZTEUpICYgV1NfVklTSUJMRSkgewotCWlmIChidXR0b25zKysgPT0gKChscG1iLT50eXBlICYgTUJfREVGTUFTSykgPj4gOCkpIHsKKwlpZiAoYnV0dG9ucysrID09ICgobHBtYi0+ZHdTdHlsZSAmIE1CX0RFRk1BU0spID4+IDgpKSB7CiAJICBTZXRGb2N1czMyKGhJdGVtKTsKIAkgIFNlbmRNZXNzYWdlMzJBKCBoSXRlbSwgQk1fU0VUU1RZTEUzMiwgQlNfREVGUFVTSEJVVFRPTiwgVFJVRSApOwogCX0KQEAgLTE5NSwxMyArMTg4LDEzIEBACiAgKi8KIElOVDMyIFdJTkFQSSBNZXNzYWdlQm94MzJBKEhXTkQzMiBoV25kLCBMUENTVFIgdGV4dCwgTFBDU1RSIHRpdGxlLCBVSU5UMzIgdHlwZSkKIHsKLSAgICBNU0dCT1ggbWJveDsKKyAgICBNU0dCT1hQQVJBTVMzMkEgbWJveDsKIAogICAgIGlmICghdGV4dCkgdGV4dD0iPFdJTkUtTlVMTD4iOwogICAgIGlmICghdGl0bGUpIHRpdGxlPSI8V0lORS1OVUxMPiI7Ci0gICAgbWJveC50aXRsZSA9IHRpdGxlOwotICAgIG1ib3gudGV4dCAgPSB0ZXh0OwotICAgIG1ib3gudHlwZSAgPSB0eXBlOworICAgIG1ib3gubHBzekNhcHRpb24gPSB0aXRsZTsKKyAgICBtYm94Lmxwc3pUZXh0ICA9IHRleHQ7CisgICAgbWJveC5kd1N0eWxlICA9IHR5cGU7CiAgICAgcmV0dXJuIERpYWxvZ0JveEluZGlyZWN0UGFyYW0zMkEoIFdJTl9HZXRXaW5kb3dJbnN0YW5jZShoV25kKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTUkVTX0dldFJlc1B0ciggU1lTUkVTX0RJQUxPR19NU0dCT1ggKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFduZCwgTVNHQk9YX0RsZ1Byb2MsIChMUEFSQU0pJm1ib3ggKTsKQEAgLTI0Myw2ICsyMzYsMzEgQEAKICAgICByZXR1cm4gTWVzc2FnZUJveDMyVyhoV25kLHRleHQsdGl0bGUsdHlwZSk7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1lc3NhZ2VCb3hJbmRpcmVjdDMyQSAgIChVU0VSMzIuMzk0KQorICovCitJTlQzMiBXSU5BUEkgTWVzc2FnZUJveEluZGlyZWN0MzJBKCBMUE1TR0JPWFBBUkFNUzMyQSBtc2dib3ggKQoreworICAgIHJldHVybiBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtMzJBKCBtc2dib3gtPmhJbnN0YW5jZSwKKyAgIAkJCQkgICAgICBTWVNSRVNfR2V0UmVzUHRyKCBTWVNSRVNfRElBTE9HX01TR0JPWCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2dib3gtPmh3bmRPd25lciwgTVNHQk9YX0RsZ1Byb2MsCisJCQkJICAgICAgKExQQVJBTSltc2dib3ggKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTWVzc2FnZUJveEluZGlyZWN0MzJXICAgKFVTRVIzMi4zOTUpCisgKi8KK0lOVDMyIFdJTkFQSSBNZXNzYWdlQm94SW5kaXJlY3QzMlcoIExQTVNHQk9YUEFSQU1TMzJXIG1zZ2JveCApCit7CisgICAgTVNHQk9YUEFSQU1TMzJBCW1zZ2JveGE7CisKKyAgICBtZW1jcHkoJm1zZ2JveGEsbXNnYm94LHNpemVvZihtc2dib3hhKSk7CisgICAgaWYgKG1zZ2JveC0+bHBzekNhcHRpb24pCWxzdHJjcHlXdG9BKG1zZ2JveGEubHBzekNhcHRpb24sbXNnYm94LT5scHN6Q2FwdGlvbik7CisgICAgaWYgKG1zZ2JveC0+bHBzelRleHQpCWxzdHJjcHlXdG9BKG1zZ2JveGEubHBzelRleHQsbXNnYm94LT5scHN6VGV4dCk7CisKKyAgICByZXR1cm4gTWVzc2FnZUJveEluZGlyZWN0MzJBKCZtc2dib3hhKTsKK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBGYXRhbEFwcEV4aXQxNiAgIChLRVJORUwuMTM3KQpkaWZmIC0tZ2l0IGEvd2luZG93cy9ub25jbGllbnQuYyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKaW5kZXggZTliMjQ4OS4uN2JkYmNlNCAxMDA2NDQKLS0tIGEvd2luZG93cy9ub25jbGllbnQuYworKysgYi93aW5kb3dzL25vbmNsaWVudC5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAic2hlbGwuaCIKKyNpbmNsdWRlICJjdXJzb3JpY29uLmgiCiAjaW5jbHVkZSAiZGlhbG9nLmgiCiAjaW5jbHVkZSAic3lzY29sb3IuaCIKICNpbmNsdWRlICJtZW51LmgiCkBAIC02Nyw4ICs2Nyw2IEBACiAjZGVmaW5lIE9OX0JPVFRPTV9CT1JERVIoaGl0KSBcCiAgKCgoaGl0KSA9PSBIVEJPVFRPTSkgfHwgKChoaXQpID09IEhUQk9UVE9NTEVGVCkgfHwgKChoaXQpID09IEhUQk9UVE9NUklHSFQpKQogCi1leHRlcm4gSENVUlNPUjE2IENVUlNPUklDT05fSWNvblRvQ3Vyc29yKCBISUNPTjE2LCBCT09MMzIgKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTkNfQWRqdXN0UmVjdAogICoKZGlmZiAtLWdpdCBhL3dpbmRvd3MvcGFpbnRpbmcuYyBiL3dpbmRvd3MvcGFpbnRpbmcuYwppbmRleCA5YWI3M2Q0Li5lZWIxYzc4IDEwMDY0NAotLS0gYS93aW5kb3dzL3BhaW50aW5nLmMKKysrIGIvd2luZG93cy9wYWludGluZy5jCkBAIC0xNDQsNiArMTQ0LDEwIEBACiAgICAgfQogCiAgICAgR2V0UmduQm94MTYoIElucXVpcmVWaXNSZ24obHBzLT5oZGMpLCAmbHBzLT5yY1BhaW50ICk7CisKK2RwcmludGZfd2luKHN0ZGRlYiwiYm94ID0gKCVpLCVpIC0gJWksJWkpXG4iLCBscHMtPnJjUGFpbnQubGVmdCwgbHBzLT5yY1BhaW50LnRvcCwKKwkJICAgIGxwcy0+cmNQYWludC5yaWdodCwgbHBzLT5yY1BhaW50LmJvdHRvbSApOworCiAgICAgRFB0b0xQMTYoIGxwcy0+aGRjLCAoTFBQT0lOVDE2KSZscHMtPnJjUGFpbnQsIDIgKTsKIAogICAgIGlmICh3bmRQdHItPmZsYWdzICYgV0lOX05FRURTX0VSQVNFQktHTkQpCmRpZmYgLS1naXQgYS93aW5kb3dzL3Njcm9sbC5jIGIvd2luZG93cy9zY3JvbGwuYwppbmRleCBmZGM5ZjRhLi5iNGRhYWU2IDEwMDY0NAotLS0gYS93aW5kb3dzL3Njcm9sbC5jCisrKyBiL3dpbmRvd3Mvc2Nyb2xsLmMKQEAgLTM4Nyw3ICszODcsNyBAQAogICAgICAgICBlbHNlIGlmKCBiVXBkYXRlICkgaHJnblVwZGF0ZSA9IENyZWF0ZVJlY3RSZ24zMiggMCwgMCwgMCwgMCApOwogCiAJaERDID0gR2V0RENFeDMyKCBod25kLCBocmduQ2xpcCwgRENYX0NBQ0hFIHwgRENYX1VTRVNUWUxFIHwgCi0JCSAgICAgICAgKGZsYWdzICYgU1dfU0NST0xMQ0hJTERSRU4pID8gRENYX05PQ0xJUENISUxEUkVOIDogMCApOworCQkgICAgICAgKChmbGFncyAmIFNXX1NDUk9MTENISUxEUkVOKSA/IERDWF9OT0NMSVBDSElMRFJFTiA6IDApICk7CiAJaWYoIChkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaERDLCBEQ19NQUdJQykpICkKIAl7CiAJICAgIFBPSU5UMzIgZHN0LCBzcmM7CmRpZmYgLS1naXQgYS93aW5kb3dzL3dpbi5jIGIvd2luZG93cy93aW4uYwppbmRleCA1ZjZmYmMwLi5jOGFjMWM0IDEwMDY0NAotLS0gYS93aW5kb3dzL3dpbi5jCisrKyBiL3dpbmRvd3Mvd2luLmMKQEAgLTQ1LDExICs0NSw3IEBACiAKIGV4dGVybiBCT09MMzIgSUNPTlRJVExFX0luaXQodm9pZCk7CiBleHRlcm4gQk9PTDMyIE1FTlVfUGF0Y2hSZXNpZGVudFBvcHVwKCBIUVVFVUUxNiwgV05EKiApOwotZXh0ZXJuIEhDVVJTT1IxNiBDVVJTT1JJQ09OX0ljb25Ub0N1cnNvcihISUNPTjE2LCBCT09MMzIpOwogZXh0ZXJuIEhXTkQzMiBDQVJFVF9HZXRId25kKHZvaWQpOwotZXh0ZXJuIEJPT0wzMiBXSU5QT1NfQ3JlYXRlSW50ZXJuYWxQb3NBdG9tKHZvaWQpOwotZXh0ZXJuIHZvaWQgICBXSU5QT1NfQ2hlY2tJbnRlcm5hbFBvcyhIV05EMzIpOwotZXh0ZXJuIEJPT0wzMiBXSU5QT1NfQWN0aXZhdGVPdGhlcldpbmRvdyhXTkQqIHBXbmQpOwogZXh0ZXJuIEJPT0wzMiBFVkVOVF9DaGVja0ZvY3VzKHZvaWQpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYyMyw4ICs2MTksMTcgQEAKICAgICAgICAgaWYgKGNzLT5jeCA8IG1pblRyYWNrLnggKSBjcy0+Y3ggPSBtaW5UcmFjay54OwogICAgICAgICBpZiAoY3MtPmN5IDwgbWluVHJhY2sueSApIGNzLT5jeSA9IG1pblRyYWNrLnk7CiAgICAgfQotICAgIGlmIChjcy0+Y3ggPD0gMCkgY3MtPmN4ID0gMTsKLSAgICBpZiAoY3MtPmN5IDw9IDApIGNzLT5jeSA9IDE7CisKKyAgICBpZihjcy0+c3R5bGUgJiBXU19DSElMRCkKKyAgICB7CisgICAgICAgIGlmKGNzLT5jeCA8IDApIGNzLT5jeCA9IDA7CisgICAgICAgIGlmKGNzLT5jeSA8IDApIGNzLT5jeSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChjcy0+Y3ggPD0gMCkgY3MtPmN4ID0gMTsKKyAgICAgICAgaWYgKGNzLT5jeSA8PSAwKSBjcy0+Y3kgPSAxOworICAgIH0KIAogICAgIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0ICAgPSBjcy0+eDsKICAgICB3bmRQdHItPnJlY3RXaW5kb3cudG9wICAgID0gY3MtPnk7CkBAIC0xMTQ4LDEzICsxMTUzLDE1IEBACiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKwogICAgIGZvciAoIDsgcFduZDsgcFduZCA9IHBXbmQtPm5leHQpCiAgICAgewogICAgICAgICBpZiAoY2xhc3NOYW1lICYmICEocFduZC0+ZHdTdHlsZSAmIFdTX0NISUxEKSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCEocENsYXNzID0gQ0xBU1NfRmluZENsYXNzQnlBdG9tKCBjbGFzc05hbWUsIHBXbmQtPmhJbnN0YW5jZSkpKQorICAgICAgICAgICAgaWYgKCEocENsYXNzID0gQ0xBU1NfRmluZENsYXNzQnlBdG9tKCBjbGFzc05hbWUsIEdldEV4ZVB0cihwV25kLT5oSW5zdGFuY2UpKSkpCiAgICAgICAgICAgICAgICAgY29udGludWU7ICAvKiBTa2lwIHRoaXMgd2luZG93ICovCiAgICAgICAgIH0KKwogICAgICAgICBpZiAocENsYXNzICYmIChwV25kLT5jbGFzcyAhPSBwQ2xhc3MpKQogICAgICAgICAgICAgY29udGludWU7ICAvKiBOb3QgdGhlIHJpZ2h0IGNsYXNzICovCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luaGVscC5jIGIvd2luZG93cy93aW5oZWxwLmMKaW5kZXggM2IwNTc2Zi4uZDg1MjFkNCAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5oZWxwLmMKKysrIGIvd2luZG93cy93aW5oZWxwLmMKQEAgLTI4LDIxICsyOCwyOCBAQAogQk9PTDMyIFdJTkFQSSBXaW5IZWxwMzJBKCBIV05EMzIgaFduZCwgTFBDU1RSIGxwSGVscEZpbGUsIFVJTlQzMiB3Q29tbWFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZHdEYXRhICkKIHsKLQlzdGF0aWMgV09SRCBXTV9XSU5IRUxQPTA7CisJc3RhdGljIFdPUkQgV01fV0lOSEVMUCA9IDA7CiAJSFdORDMyIGhEZXN0OwogCUxQV0lOSEVMUCBscHdoOwogCUhHTE9CQUwxNiBod2g7CiAJaW50IHNpemUsZHNpemUsbmxlbjsKICAgICAgICAgaWYgKHdDb21tYW5kICE9IEhFTFBfUVVJVCkgIC8qIEZJWE1FICovCi0gICAgICAgICAgICBpZihXaW5FeGVjMzIoIndpbmhlbHAuZXhlIC14IixTV19TSE9XTk9STUFMKTw9MzIpCisJeworICAgICAgICAgICAgaWYgKFdpbkV4ZWMzMigid2luaGVscC5leGUgLXgiLFNXX1NIT1dOT1JNQUwpIDw9IDMyKQogCQlyZXR1cm4gRkFMU0U7Ci0JLyogRklYTUU6IFNob3VsZCBiZSBkaXJlY3RlZCB5aWVsZCwgdG8gbGV0IHdpbmhlbHAgb3BlbiB0aGUgd2luZG93ICovCi0JWWllbGQxNigpOwotCWlmKCFXTV9XSU5IRUxQKSB7CisKKwkgICAgLyogTk9URTogUHJvYmFibHksIHRoaXMgc2hvdWxkIGJlIGRpcmVjdGVkIHlpZWxkLCAKKwkJICAgICB0byBsZXQgd2luaGVscCBvcGVuIHRoZSB3aW5kb3cgaW4gYWxsIGNhc2VzLiAqLworCSAgICBZaWVsZDE2KCk7CisJfQorCisJaWYoIVdNX1dJTkhFTFApIAorCXsKIAkJV01fV0lOSEVMUD1SZWdpc3RlcldpbmRvd01lc3NhZ2UzMkEoIldNX1dJTkhFTFAiKTsKIAkJaWYoIVdNX1dJTkhFTFApCiAJCQlyZXR1cm4gRkFMU0U7CiAJfQorCiAJaERlc3QgPSBGaW5kV2luZG93MzJBKCAiTVNfV0lOSEVMUCIsIE5VTEwgKTsKIAlpZighaERlc3QpCiAJCWlmKHdDb21tYW5kID09IEhFTFBfUVVJVCkKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucHJvYy5jIGIvd2luZG93cy93aW5wcm9jLmMKaW5kZXggMjU5YjM4NC4uMTQwMmI2YyAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wcm9jLmMKKysrIGIvd2luZG93cy93aW5wcm9jLmMKQEAgLTc2LDE4ICs3NiwxOCBAQAogICAgICAgICAgIChXTkRQUk9DMTYpKChwcHJvYyktPnRodW5rLnRfZnJvbTMyLnByb2MpIDogXAogICAgICAgICAgIChXTkRQUk9DMTYpKChwcHJvYyktPnRodW5rLnRfZnJvbTE2LnByb2MpKQogCi1MUkVTVUxUIFdJTlBST0NfQ2FsbFByb2MxNlRvMzJBKCBIV05EMTYgaHduZCwgVUlOVDE2IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdORFBST0MzMiBmdW5jICk7Ci1MUkVTVUxUIFdJTlBST0NfQ2FsbFByb2MxNlRvMzJXKCBIV05EMTYgaHduZCwgVUlOVDE2IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdORFBST0MzMiBmdW5jICk7CiBzdGF0aWMgTFJFU1VMVCBXSU5BUEkgV0lOUFJPQ19DYWxsUHJvYzMyQVRvMTYoIFdORFBST0MxNiBmdW5jLCBIV05EMzIgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICk7CiBzdGF0aWMgTFJFU1VMVCBXSU5BUEkgV0lOUFJPQ19DYWxsUHJvYzMyV1RvMTYoIFdORFBST0MxNiBmdW5jLCBIV05EMzIgaHduZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICk7CitzdGF0aWMgTFJFU1VMVCBXSU5QUk9DX0NhbGxQcm9jMTZUbzMyQSggSFdORDE2IGh3bmQsIFVJTlQxNiBtc2csCisJCQkJCVdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSwKKwkJCQkJV05EUFJPQzMyIGZ1bmMgKTsKK3N0YXRpYyBMUkVTVUxUIFdJTlBST0NfQ2FsbFByb2MxNlRvMzJXKCBIV05EMTYgaHduZCwgVUlOVDE2IG1zZywKKwkJCQkJV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtLAorCQkJCQlXTkRQUk9DMzIgZnVuYyApOwogCiBzdGF0aWMgSEFORExFMzIgV2luUHJvY0hlYXA7CiAKQEAgLTczOSw4ICs3MzksMTMgQEAKICAgICAgICAgKnBscGFyYW0gICA9IChMUEFSQU0pKEhNRU5VMzIpSElXT1JEKCpwbHBhcmFtKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgY2FzZSBXTV9NRElBQ1RJVkFURToKLSAgICAgICAgKnB3cGFyYW0zMiA9IChXUEFSQU0zMikoSFdORDMyKUhJV09SRCgqcGxwYXJhbSk7Ci0gICAgICAgICpwbHBhcmFtICAgPSAoTFBBUkFNKShIV05EMzIpTE9XT1JEKCpwbHBhcmFtKTsKKwlpZiggKnBscGFyYW0gKQorCXsKKwkgICAgKnB3cGFyYW0zMiA9IChXUEFSQU0zMikoSFdORDMyKUhJV09SRCgqcGxwYXJhbSk7CisJICAgICpwbHBhcmFtICAgPSAoTFBBUkFNKShIV05EMzIpTE9XT1JEKCpwbHBhcmFtKTsKKwl9CisJZWxzZSAvKiBtZXNzYWdlIHNlbnQgdG8gTURJIGNsaWVudCAqLworCSAgICAqcHdwYXJhbTMyID0gd1BhcmFtMTY7CiAgICAgICAgIHJldHVybiAwOwogICAgIGNhc2UgV01fTkNDQUxDU0laRToKICAgICAgICAgewpAQCAtMTM0Myw5ICsxMzQ4LDE3IEBACiAgICAgICAgICpwbHBhcmFtID0gTUFLRUxQQVJBTSggSElXT1JEKHdQYXJhbTMyKSwgKEhNRU5VMTYpKnBscGFyYW0gKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgY2FzZSBXTV9NRElBQ1RJVkFURToKLSAgICAgICAgKnB3cGFyYW0xNiA9ICgoSFdORDMyKSpwbHBhcmFtID09IGh3bmQpOwotICAgICAgICAqcGxwYXJhbSA9IE1BS0VMUEFSQU0oIChIV05EMTYpTE9XT1JEKCpwbHBhcmFtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSFdORDE2KUxPV09SRCh3UGFyYW0zMikgKTsKKwlpZiggV0lER0VUU19Jc0NvbnRyb2wzMihXSU5fRmluZFduZFB0cihod25kKSwgQklDMzJfTURJQ0xJRU5UKSApCisJeworCSAgICAqcHdwYXJhbTE2ID0gKEhXTkQzMil3UGFyYW0zMjsKKwkgICAgKnBscGFyYW0gPSAwOworCX0KKwllbHNlCisJeworCSAgICAqcHdwYXJhbTE2ID0gKChIV05EMzIpKnBscGFyYW0gPT0gaHduZCk7CisJICAgICpwbHBhcmFtID0gTUFLRUxQQVJBTSggKEhXTkQxNilMT1dPUkQoKnBscGFyYW0pLAorCQkJCSAgIChIV05EMTYpTE9XT1JEKHdQYXJhbTMyKSApOworCX0KICAgICAgICAgcmV0dXJuIDA7CiAgICAgY2FzZSBXTV9OQ0NBTENTSVpFOgogICAgICAgICB7Cg==