From kde-core-devel Fri May 11 17:57:46 2001 From: Antonio Larrosa =?iso-8859-1?q?Jim=E9nez?= Date: Fri, 11 May 2001 17:57:46 +0000 To: kde-core-devel Subject: Wheel Emulation and two wheel mices X-MARC-Message: https://marc.info/?l=kde-core-devel&m=98960434522360 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--------------Boundary-00=_A8N61OBBG12CVE3KYHPI" --------------Boundary-00=_A8N61OBBG12CVE3KYHPI Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Subject: Hello, I've send this mail to Keith Packard and qt-bugs@trolltech.com. After wai= ting=20 some days with no response (not even the automatic response from trolltec= h) I sent it again. Again, no response at all. I don't know what to do about it, I suppose there's some problem with ema= il so I'll just post it here (kde-core-devel and xpert@xfree86.org), and ple= ase=20 do whatever you want with the patches and tell me if it gets included in = XFree=20 and/or Qt (note that I'm not subscribed to xpert@xfree86.org, so please C= c: me any answer). Sorry if this is not the appropiate list, I've never posted = to an=20 XFree list. Feel free to forward it to the appropiate list/person. I've added support on XFree for the Trackman Marble FX's 4th button (in a generic way, so that it can be used to emulate wheels in every mouse and = is=20 not specific to that model) and also added support for mice with two whee= ls=20 (vertical and horizontal) on Qt. I'll explain. The purpose of that "4th button" is that when it's pressed and the user m= oves the ball (it's a trackball), the mouse cursor doesn't move, but generates wheel events to move _freely_ (vertically and horizontally) through the document (like panning function that is usual on image viewers). This is = done by simulating vertical and horizontal wheels. Of course, this only worked with Windows (using Logitech's software) but now it also works for us :)= and for any mouse. The attached xfree86-emuwheel.diff file should be applied into xc/programs/Xserver/hw/xfree86 . The patch adds a new option to the mouse driver called "WheelButtonEmulation" used like this in XF86Config: Option "Buttons" "4" Option "WheelButtonEmulation" "4" Option "ZAxisMapping" "4 5 6 7" Each time the 4th button is pressed and the mouse is moved, the position won't change, but the 4th, 5th, 6th and 7th buttons will be used as if th= ey were two wheels (4 and 5 -> vertical, 6 and 7 -> horizontal) The patch should be clear, except maybe the emulateWheelType variable. This is used because for my trackball, the 4th button state is not availa= ble for mouse movements, but just when it's pressed or released, so it should= be handled different than all the other buttons, whose state is given for ev= ery movement. I don't know how other mices with more than 3 buttons work, so = I've leaved this to be handled in each mouse type. Note that I've preferred to make the button configurable just in case som= eone prefers to use it with a traditional 3 button mouse by setting "WheelButtonEmulation" to the middle button. What I don't have clear is i= f there should be a buttons &=3D ~pMse->emulateWheelButton; above the dz=3Ddy; dw=3Ddx; line to "disable" the button. This may be neccesary for emulation with us= ual buttons (left or right) but I've preferred to leave this decission to the mantainer of that module. This patch alone makes it possible to generate wheel events with any mous= e in a nice manner, but only vertical events are used by applications, so that= 's why I've also patched Qt. The patch for Qt allows it to understand horizontal wheel events so that = you can move completely freely for example in applications like konqueror, km= ail, etc. I've extended the QWheelEvent class to support a Direction property that specifies if it's a horizontal or vertical wheel event. Then, I've modifi= ed a few widgets to support this property and use the appropiate scrollbar in = each case. This has only one problem, there are Button4 and Button5 definitions in X= =2Eh but there're no Button6 and Button7 definitions ! (note that they were us= ed even before my changes, with the dw variable in PostEvent). The X.h.diff patch adds them, but I suppose that there should be other changes in that file like adding a Button6Mask, Mod6Mask, Button6MotionMask, etc. so I've decided to just use the values 6 and 7 in Qt instead of the definitions Button6 and Button7. Please, also note that before any of my changes, a horizontal wheel event would generate a single click (as if it was the left button) as the switch { case Button1: ... case Button2: ... case Button3: ... case Button4: case Button5: ... } statement in qapplication_x11.cpp didn't have a default: case There's just one problem with this approach in Qt: If a 3rd party applica= tion reacts to a QWheelEvent event by itself (not using QScrollView::wheelEven= t or similar) and it isn't changed to support the direction property of the ev= ent (for example, if a user only upgrades the library and not the app) then t= he application will think it's receiving only vertical wheel events (and thu= s,=20 scroll a bit randomly when moving the mouse while pressing the "emulation= =20 button") . I can modify all the applications on KDE's cvs, but everything= else=20 making use of QWheelEvent would need to be changed by the respective auth= or. Btw, the patch for XFree is against the current CVS, and the patch for Qt= is against the qt-copy module in KDE's cvs. I read a bit a recent snapshot o= f Qt 3.0 and it seems it can be applied there too mostly as it is. I haven't modified the help files (in X, the documentation about the new option, and in Qt, the developer documentation). Well, I think that's all. Opinions ? Greetings, -- Antonio Larrosa Jimenez KDE Core developer - larrosa@kde.org SuSE Labs developer - larrosa@suse.de http://perso.wanadoo.es/antlarr KDE - The development framework of the future, today. --------------Boundary-00=_A8N61OBBG12CVE3KYHPI Content-Type: text/x-c; charset="iso-8859-1"; name="xfree86-emuwheel.diff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="xfree86-emuwheel.diff" SW5kZXg6IGlucHV0L21vdXNlL21vdXNlLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2cy94Yy9w cm9ncmFtcy9Yc2VydmVyL2h3L3hmcmVlODYvaW5wdXQvbW91c2UvbW91c2UuYyx2CnJldHJpZXZp bmcgcmV2aXNpb24gMS40MQpkaWZmIC11IC1yMS40MSBtb3VzZS5jCi0tLSBpbnB1dC9tb3VzZS9t b3VzZS5jCTIwMDEvMDMvMDcgMTY6MjE6MDUJMS40MQorKysgaW5wdXQvbW91c2UvbW91c2UuYwky MDAxLzA1LzAzIDE3OjUxOjUxCkBAIC00MTAsNiArNDEwLDIwIEBACiAJCSAgICBwSW5mby0+bmFt ZSwgcyk7CiAJfQogICAgIH0KKworICAgIHsKKwlpbnQgYj0wOworCWIgPSB4Zjg2U2V0SW50T3B0 aW9uKHBJbmZvLT5vcHRpb25zLAorCQkJIldoZWVsQnV0dG9uRW11bGF0aW9uIiwgMCk7CisKKwlp ZiAoYikgeworCSAgICBwTXNlLT5lbXVsYXRlV2hlZWxCdXR0b24gPSAxIDw8IChiLTEpOworCSAg ICBwTXNlLT5lbXVsYXRlV2hlZWxUeXBlID0gKGIgPiAzKSA/IDIgOiAxOworCX0gZWxzZSB7CisJ ICAgIHBNc2UtPmVtdWxhdGVXaGVlbEJ1dHRvbiA9IDA7CisJICAgIHBNc2UtPmVtdWxhdGVXaGVl bFR5cGUgPSAwOworCX0KKyAgICB9CiB9CiAKIHN0YXRpYyBJbnB1dEluZm9QdHIKQEAgLTEwMjAs NiArMTAzNCw3IEBACiAKICAgICBwTXNlLT5wcm90b0J1ZlRhaWwgPSAwOwogICAgIHBNc2UtPmlu U3luYyA9IDA7CisgICAgcE1zZS0+aXNFbXVXaGVlbCA9IDA7CiAKICAgICByZXR1cm4gVFJVRTsK IH0KQEAgLTEzNTMsNiArMTM2OCwxMSBAQAogCQkgICAgZHggPSBkeSA9IDA7CiAJCSAgICBkeiA9 IChwQnVmWzJdICYgMHgwOCkgPyAocEJ1ZlsyXSAmIDB4MGYpIC0gMTYgOgogCQkJCQkgICAgKHBC dWZbMl0gJiAweDBmKTsKKworCQkgICAgaWYgKHBNc2UtPmVtdWxhdGVXaGVlbFR5cGU9PTIpIC8q IEZvciB0aGUgVHJhY2tNYW4gTWFyYmxlRlgKKwkJCQkJCQk0dGggYnV0dG9uICovCisgICAgCQkg ICAgICAgcE1zZS0+aXNFbXVXaGVlbD0oYnV0dG9ucyAmIHBNc2UtPmVtdWxhdGVXaGVlbEJ1dHRv bik7CisKIAkJICAgIGJyZWFrOwogCQljYXNlIDI6CQkvKiBMb2dpdGVjaCByZXNlcnZlcyB0aGlz IHBhY2tldCB0eXBlICovCiAJCSAgICAvKiAKQEAgLTE4NTIsNiArMTg3MiwxNSBAQAogCiAKICAg ICBwTXNlID0gcEluZm8tPnByaXZhdGU7CisKKyAgICBpZiAocE1zZS0+ZW11bGF0ZVdoZWVsVHlw ZT09MSkKKyAgICAgICAgcE1zZS0+aXNFbXVXaGVlbD0oYnV0dG9ucyAmIHBNc2UtPmVtdWxhdGVX aGVlbEJ1dHRvbik7CisKKyAgICBpZiAocE1zZS0+aXNFbXVXaGVlbCkKKyAgICB7CisJICAgZHo9 ZHk7IGR3PWR4OworCSAgIGR4PTA7IGR5PTA7CisgICAgfQogCiAgICAgLyogTWFwIHRoZSBaIGF4 aXMgbW92ZW1lbnQuICovCiAgICAgLyogWFhYIENvdWxkIHRoaXMgZ28gaW4gdGhlIGNvbnZlcnNp b25fcHJvYz8gKi8KSW5kZXg6IG9zLXN1cHBvcnQveGY4Nk9TbW91c2UuaAo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJD UyBmaWxlOiAvY3ZzL3hjL3Byb2dyYW1zL1hzZXJ2ZXIvaHcveGZyZWU4Ni9vcy1zdXBwb3J0L3hm ODZPU21vdXNlLmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTQKZGlmZiAtdSAtcjEuMTQgeGY4 Nk9TbW91c2UuaAotLS0gb3Mtc3VwcG9ydC94Zjg2T1Ntb3VzZS5oCTIwMDEvMDMvMDcgMTY6MjE6 MDQJMS4xNAorKysgb3Mtc3VwcG9ydC94Zjg2T1Ntb3VzZS5oCTIwMDEvMDUvMDMgMTc6NTE6NTIK QEAgLTEzNiw2ICsxMzYsMTMgQEAKICAgICB1bnNpZ25lZCBjaGFyCXByb3RvQnVmWzhdOwogICAg IHVuc2lnbmVkIGNoYXIJcHJvdG9QYXJhWzhdOwogICAgIHVuc2lnbmVkIGNoYXIJaW5TeW5jOwkJ LyogZHJpdmVyIGluIHN5bmMgd2l0aCBkYXRhc3RyZWFtICovCisgICAgdW5zaWduZWQgY2hhcglp c0VtdVdoZWVsOwkvKiBlbXVsYXRpbmcgd2hlZWwgKi8KKyAgICBpbnQgCQllbXVsYXRlV2hlZWxC dXR0b247LyogYnV0dG9uIHRoYXQgZW11bGF0ZXMgdGhlIHdoZWVsICovCisgICAgaW50IAkJZW11 bGF0ZVdoZWVsVHlwZTsvKiAxID0gYnV0dG9uIGdpdmVzIHN0YXRlIGZvciBlYWNoIAorCQkJCQkJ bW92ZSBldmVudC4KKwkJCQkJICAgIDIgPSBidXR0b24gZ2l2ZXMgc3RhdGUgd2hlbiAKKwkJCQkJ CWNoYW5naW5nIChzaG91bGQgYmUgaGFuZGxlZCBpbgorCQkJCQkJZWFjaCBtb3VzZSB0eXBlKSAq LwogICAgIHBvaW50ZXIJCW1vdXNlUHJpdjsJLyogcHJpdmF0ZSBhcmVhICovCiAgICAgSW5wdXRJ bmZvUHRyCXBJbmZvOwogICAgIGludAkJCW9yaWdQcm90b2NvbElEOwo= --------------Boundary-00=_A8N61OBBG12CVE3KYHPI Content-Type: text/x-c; charset="iso-8859-1"; name="X.h.diff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="X.h.diff" SW5kZXg6IFguaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3hjL2luY2x1ZGUvWC5oLHYKcmV0 cmlldmluZyByZXZpc2lvbiAxLjQKZGlmZiAtdSAtcjEuNCBYLmgKLS0tIFguaAkyMDAxLzAxLzE3 IDE3OjUzOjA5CTEuNAorKysgWC5oCTIwMDEvMDUvMDMgMTY6MjM6NTEKQEAgLTI2MSw2ICsyNjEs OCBAQAogI2RlZmluZSBCdXR0b24zCQkJMwogI2RlZmluZSBCdXR0b240CQkJNAogI2RlZmluZSBC dXR0b241CQkJNQorI2RlZmluZSBCdXR0b242CQkJNgorI2RlZmluZSBCdXR0b243CQkJNwogCiAv KiBOb3RpZnkgbW9kZXMgKi8KIAo= --------------Boundary-00=_A8N61OBBG12CVE3KYHPI Content-Type: text/x-c++; charset="iso-8859-1"; name="qt-twowheels.diff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="qt-twowheels.diff" SW5kZXg6IGtlcm5lbC9xYXBwbGljYXRpb25feDExLmNwcAo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAv aG9tZS9rZGUvcXQtY29weS9zcmMva2VybmVsL3FhcHBsaWNhdGlvbl94MTEuY3BwLHYKcmV0cmll dmluZyByZXZpc2lvbiAxLjQwCmRpZmYgLXUgLXIxLjQwIHFhcHBsaWNhdGlvbl94MTEuY3BwCi0t LSBrZXJuZWwvcWFwcGxpY2F0aW9uX3gxMS5jcHAJMjAwMS8wMy8wNyAxOTowODo1MQkxLjQwCisr KyBrZXJuZWwvcWFwcGxpY2F0aW9uX3gxMS5jcHAJMjAwMS8wNS8wNyAxNzozNDoyNwpAQCAtNTQy LDcgKzU0Miw3IEBACiAgICAgYm9vbCB0cmFuc2xhdGVDb25maWdFdmVudCggY29uc3QgWEV2ZW50 ICogKTsKICAgICBib29sIHRyYW5zbGF0ZUNsb3NlRXZlbnQoIGNvbnN0IFhFdmVudCAqICk7CiAg ICAgYm9vbCB0cmFuc2xhdGVTY3JvbGxEb25lRXZlbnQoIGNvbnN0IFhFdmVudCAqICk7Ci0gICAg Ym9vbCB0cmFuc2xhdGVXaGVlbEV2ZW50KCBpbnQgZ2xvYmFsX3gsIGludCBnbG9iYWxfeSwgaW50 IGRlbHRhLCBpbnQgc3RhdGUgKTsKKyAgICBib29sIHRyYW5zbGF0ZVdoZWVsRXZlbnQoIGludCBn bG9iYWxfeCwgaW50IGdsb2JhbF95LCBpbnQgZGVsdGEsIGludCBzdGF0ZSwgUVdoZWVsRXZlbnQ6 OkRpcmVjdGlvbiBkaXIgKTsKIH07CiAKIApAQCAtMzg5Myw2ICszODkzLDggQEAKIAkJYnJlYWs7 CiAJICAgIGNhc2UgQnV0dG9uNDoKIAkgICAgY2FzZSBCdXR0b241OgorCSAgICBjYXNlIDY6CisJ ICAgIGNhc2UgNzoKIAkJLy8gdGhlIGZhbmN5IG1vdXNlIHdoZWVsLgogCiAJCS8vIHRha2UgY2Fy ZSBhYm91dCBncmFiYmluZy4gIFdlIGRvIHRoaXMgaGVyZSBzaW5jZSBpdApAQCAtMzkyMywxMSAr MzkyNSwxOSBAQAogCQkgICAgLy8gbWF5IG9mZmVyIGEgZmluZXItcmVzb2x1dGlvbi4gIEEgcG9z aXRpdmUgZGVsdGEKIAkJICAgIC8vIGluZGljYXRlcyBmb3J3YXJkIHJvdGF0aW9uLCBhIG5lZ2F0 aXZlIG9uZQogCQkgICAgLy8gYmFja3dhcmQgcm90YXRpb24gcmVzcGVjdGl2ZWx5LgotCQkgICAg ZGVsdGEgKj0gMTIwKihldmVudC0+eGJ1dHRvbi5idXR0b24gPT0gQnV0dG9uND8xOi0xKTsKKwkJ ICAgIGRlbHRhICo9IDEyMCooKGV2ZW50LT54YnV0dG9uLmJ1dHRvbiA9PSBCdXR0b240IHx8IAor CQkJCSAgZXZlbnQtPnhidXR0b24uYnV0dG9uID09IDYgKSA/MTotMSk7CisJCSAgICAKKwkJICAg IFFXaGVlbEV2ZW50OjpEaXJlY3Rpb24gZGlyPQorCQkJKGV2ZW50LT54YnV0dG9uLmJ1dHRvbiA9 PSBCdXR0b240IHx8CisJCQlldmVudC0+eGJ1dHRvbi5idXR0b24gPT0gQnV0dG9uNSApID8KKwkJ CVFXaGVlbEV2ZW50OjpWZXJ0aWNhbCA6IFFXaGVlbEV2ZW50OjpIb3Jpem9udGFsOwogCi0JCSAg ICB0cmFuc2xhdGVXaGVlbEV2ZW50KCBnbG9iYWxQb3MueCgpLCBnbG9iYWxQb3MueSgpLCBkZWx0 YSwgc3RhdGUgKTsKKwkJICAgIHRyYW5zbGF0ZVdoZWVsRXZlbnQoIGdsb2JhbFBvcy54KCksIGds b2JhbFBvcy55KCksIGRlbHRhLCBzdGF0ZSwgZGlyICk7CiAJCX0KIAkJcmV0dXJuIFRSVUU7CisJ ICAgIGRlZmF1bHQ6CisJCXJldHVybiBUUlVFOwogCX0KIAlpZiAoIGV2ZW50LT50eXBlID09IEJ1 dHRvblByZXNzICkgewkvLyBtb3VzZSBidXR0b24gcHJlc3NlZAogCSAgICBxdF9idXR0b25fZG93 biA9IGZpbmRDaGlsZFdpZGdldCggdGhpcywgcG9zICk7CS8vbWFnaWMgZm9yIG1hc2tlZCB3aWRn ZXRzCkBAIC00MDcyLDcgKzQwODIsNyBAQAogLy8KIC8vIFdoZWVsIGV2ZW50IHRyYW5zbGF0aW9u CiAvLwotYm9vbCBRRVRXaWRnZXQ6OnRyYW5zbGF0ZVdoZWVsRXZlbnQoIGludCBnbG9iYWxfeCwg aW50IGdsb2JhbF95LCBpbnQgZGVsdGEsIGludCBzdGF0ZSApCitib29sIFFFVFdpZGdldDo6dHJh bnNsYXRlV2hlZWxFdmVudCggaW50IGdsb2JhbF94LCBpbnQgZ2xvYmFsX3ksIGludCBkZWx0YSwg aW50IHN0YXRlLCBRV2hlZWxFdmVudDo6RGlyZWN0aW9uIGRpciApCiB7CiAgICAgUVdpZGdldCog dyA9IHRoaXM7CiAKQEAgLTQwOTEsNyArNDEwMSw3IEBACiAJICAgIHBvcHVwLT5oaWRlKCk7CiAJ ZG8gewogCSAgICBRV2hlZWxFdmVudCBlKCB3LT5tYXBGcm9tR2xvYmFsKFFQb2ludCggZ2xvYmFs X3gsIGdsb2JhbF95KSksCi0JCQkgICBRUG9pbnQoZ2xvYmFsX3gsIGdsb2JhbF95KSwgZGVsdGEs IHN0YXRlICk7CisJCQkgICBRUG9pbnQoZ2xvYmFsX3gsIGdsb2JhbF95KSwgZGVsdGEsIHN0YXRl LCBkaXIgKTsKIAkgICAgZS5pZ25vcmUoKTsKIAkgICAgUUFwcGxpY2F0aW9uOjpzZW5kRXZlbnQo IHcsICZlICk7CiAJICAgIGlmICggZS5pc0FjY2VwdGVkKCkgKQpAQCAtNDEwNSw3ICs0MTE1LDcg QEAKICAgICBpZiAodyl7CiAJZG8gewogCSAgICBRV2hlZWxFdmVudCBlKCB3LT5tYXBGcm9tR2xv YmFsKFFQb2ludCggZ2xvYmFsX3gsIGdsb2JhbF95KSksCi0JCQkgICBRUG9pbnQoZ2xvYmFsX3gs IGdsb2JhbF95KSwgZGVsdGEsIHN0YXRlICk7CisJCQkgICBRUG9pbnQoZ2xvYmFsX3gsIGdsb2Jh bF95KSwgZGVsdGEsIHN0YXRlLCBkaXIgKTsKIAkgICAgZS5pZ25vcmUoKTsKIAkgICAgUUFwcGxp Y2F0aW9uOjpzZW5kRXZlbnQoIHcsICZlICk7CiAJICAgIGlmICggZS5pc0FjY2VwdGVkKCkgKQpJ bmRleDoga2VybmVsL3FldmVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2RlL3F0 LWNvcHkvc3JjL2tlcm5lbC9xZXZlbnQuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjI1CmRp ZmYgLXUgLXIxLjI1IHFldmVudC5jcHAKLS0tIGtlcm5lbC9xZXZlbnQuY3BwCTIwMDEvMDMvMDcg MTk6MDg6NTMJMS4yNQorKysga2VybmVsL3FldmVudC5jcHAJMjAwMS8wNS8wNyAxNzozNDozMApA QCAtMzk4LDcgKzM5OCw3IEBACiAqLwogCiAvKiEKLSAgXGZuIFFXaGVlbEV2ZW50OjpRV2hlZWxF dmVudCggY29uc3QgUVBvaW50ICZwb3MsIGludCBkZWx0YSwgaW50IHN0YXRlICkKKyAgXGZuIFFX aGVlbEV2ZW50OjpRV2hlZWxFdmVudCggY29uc3QgUVBvaW50ICZwb3MsIGludCBkZWx0YSwgaW50 IHN0YXRlLCBEaXJlY3Rpb24gZGlyICkKIAogICBDb25zdHJ1Y3RzIGEgd2hlZWwgZXZlbnQgb2Jq ZWN0LgogCkBAIC00MDgsMTUgKzQwOCwxNiBAQAogCiAgIFxzYSBwb3MoKSwgZGVsdGEoKSwgc3Rh dGUoKQogKi8KLVFXaGVlbEV2ZW50OjpRV2hlZWxFdmVudCggY29uc3QgUVBvaW50ICZwb3MsIGlu dCBkZWx0YSwgaW50IHN0YXRlICkKK1FXaGVlbEV2ZW50OjpRV2hlZWxFdmVudCggY29uc3QgUVBv aW50ICZwb3MsIGludCBkZWx0YSwgaW50IHN0YXRlLCAKKwkJCURpcmVjdGlvbiBfZGlyICkKICAg ICA6IFFFdmVudChXaGVlbCksIHAocG9zKSwgZChkZWx0YSksIHMoKHVzaG9ydClzdGF0ZSksCi0g ICAgICBhY2NwdChUUlVFKQorICAgICAgYWNjcHQoVFJVRSksIGRpcihfZGlyKQogewogICAgIGcg PSBRQ3Vyc29yOjpwb3MoKTsKIH0KIAogLyohCi0gIFxmbiBRV2hlZWxFdmVudDo6UVdoZWVsRXZl bnQoIGNvbnN0IFFQb2ludCAmcG9zLCBjb25zdCBRUG9pbnQmZ2xvYmFsUG9zLCBpbnQgZGVsdGEs IGludCBzdGF0ZSApCisgIFxmbiBRV2hlZWxFdmVudDo6UVdoZWVsRXZlbnQoIGNvbnN0IFFQb2lu dCAmcG9zLCBjb25zdCBRUG9pbnQmZ2xvYmFsUG9zLCBpbnQgZGVsdGEsIGludCBzdGF0ZSwgRGly ZWN0aW9uIGRpciApCiAKICAgQ29uc3RydWN0cyBhIHdoZWVsIGV2ZW50IG9iamVjdC4KIApJbmRl eDoga2VybmVsL3FldmVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9ob21lL2tkZS9xdC1jb3B5 L3NyYy9rZXJuZWwvcWV2ZW50LmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjUKZGlmZiAtdSAt cjEuMjUgcWV2ZW50LmgKLS0tIGtlcm5lbC9xZXZlbnQuaAkyMDAxLzAzLzA3IDE5OjA4OjUzCTEu MjUKKysrIGtlcm5lbC9xZXZlbnQuaAkyMDAxLzA1LzA3IDE3OjM0OjMxCkBAIC0xNzEsMTEgKzE3 MSwxNSBAQAogY2xhc3MgUV9FWFBPUlQgUVdoZWVsRXZlbnQgOiBwdWJsaWMgUUV2ZW50CiB7CiBw dWJsaWM6Ci0gICAgUVdoZWVsRXZlbnQoIGNvbnN0IFFQb2ludCAmcG9zLCBpbnQgZGVsdGEsIGlu dCBzdGF0ZSApOwotICAgIFFXaGVlbEV2ZW50KCBjb25zdCBRUG9pbnQgJnBvcywgY29uc3QgUVBv aW50JiBnbG9iYWxQb3MsIGludCBkZWx0YSwgaW50IHN0YXRlICkKKyAgICBlbnVtIERpcmVjdGlv biB7IEhvcml6b250YWwsIFZlcnRpY2FsIH07CisKKyAgICBRV2hlZWxFdmVudCggY29uc3QgUVBv aW50ICZwb3MsIGludCBkZWx0YSwgaW50IHN0YXRlLAorCSBEaXJlY3Rpb24gX2RpciA9IFZlcnRp Y2FsICk7CisgICAgUVdoZWVsRXZlbnQoIGNvbnN0IFFQb2ludCAmcG9zLCBjb25zdCBRUG9pbnQm IGdsb2JhbFBvcywgaW50IGRlbHRhLCBpbnQgc3RhdGUsIERpcmVjdGlvbiBfZGlyID0gVmVydGlj YWwgKQogCTogUUV2ZW50KFdoZWVsKSwgcChwb3MpLCBnKGdsb2JhbFBvcyksIGQoZGVsdGEpLCBz KCh1c2hvcnQpc3RhdGUpLAotCSAgYWNjcHQoVFJVRSkge30KKwkgIGFjY3B0KFRSVUUpLCBkaXIo X2Rpcikge30KICAgICBpbnQJICAgZGVsdGEoKQljb25zdAl7IHJldHVybiBkOyB9CisgICAgRGly ZWN0aW9uIGRpcmVjdGlvbigpIGNvbnN0CXsgcmV0dXJuIGRpcjsgfQogICAgIGNvbnN0IFFQb2lu dCAmcG9zKCkgY29uc3QJeyByZXR1cm4gcDsgfQogICAgIGNvbnN0IFFQb2ludCAmZ2xvYmFsUG9z KCkgY29uc3QJeyByZXR1cm4gZzsgfQogICAgIGludAkgICB4KCkJCWNvbnN0CXsgcmV0dXJuIHAu eCgpOyB9CkBAIC0xOTIsNiArMTk2LDcgQEAKICAgICBpbnQgZDsKICAgICB1c2hvcnQgczsKICAg ICBib29sICAgYWNjcHQ7CisgICAgRGlyZWN0aW9uIGRpcjsKIH07CiAKIApJbmRleDogd2lkZ2V0 cy9xbXVsdGlsaW5lZWRpdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2RlL3F0LWNv cHkvc3JjL3dpZGdldHMvcW11bHRpbGluZWVkaXQuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAx LjIzCmRpZmYgLXUgLXIxLjIzIHFtdWx0aWxpbmVlZGl0LmNwcAotLS0gd2lkZ2V0cy9xbXVsdGls aW5lZWRpdC5jcHAJMjAwMS8wMy8wNyAxOTowODo1OQkxLjIzCisrKyB3aWRnZXRzL3FtdWx0aWxp bmVlZGl0LmNwcAkyMDAxLzA1LzA3IDE3OjM1OjA1CkBAIC0xMDQyLDcgKzEwNDIsMTIgQEAKIFBh c3NlcyB3aGVlbCBldmVudHMgdG8gdGhlIHZlcnRpY2FsIHNjcm9sbGJhci4KICovCiB2b2lkIFFN dWx0aUxpbmVFZGl0Ojp3aGVlbEV2ZW50KCBRV2hlZWxFdmVudCAqZSApewotICAgIFFBcHBsaWNh dGlvbjo6c2VuZEV2ZW50KCB2ZXJ0aWNhbFNjcm9sbEJhcigpLCBlKTsKKyAgICBpZiAoZS0+ZGly ZWN0aW9uKCk9PVFXaGVlbEV2ZW50OjpWZXJ0aWNhbCkgeworICAgICAgICAgICBpZiAodmVydGlj YWxTY3JvbGxCYXIoKSkKKyAgICAgICAgICAgICAgUUFwcGxpY2F0aW9uOjpzZW5kRXZlbnQoIHZl cnRpY2FsU2Nyb2xsQmFyKCksIGUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgaWYgKGhv cml6b250YWxTY3JvbGxCYXIoKSkKKyAgICAgICAgICAgICAgUUFwcGxpY2F0aW9uOjpzZW5kRXZl bnQoIGhvcml6b250YWxTY3JvbGxCYXIoKSwgZSk7CiB9CiAKIApJbmRleDogd2lkZ2V0cy9xc2Ny b2xsdmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2hvbWUva2RlL3F0LWNvcHkvc3JjL3dp ZGdldHMvcXNjcm9sbHZpZXcuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjMxCmRpZmYgLXUg LXIxLjMxIHFzY3JvbGx2aWV3LmNwcAotLS0gd2lkZ2V0cy9xc2Nyb2xsdmlldy5jcHAJMjAwMS8w My8wNyAxOTowODo1OQkxLjMxCisrKyB3aWRnZXRzL3FzY3JvbGx2aWV3LmNwcAkyMDAxLzA1LzA3 IDE3OjM1OjIwCkBAIC05MjYsMTEgKzkyNiwxNSBAQAogKi8KIHZvaWQgUVNjcm9sbFZpZXc6Ondo ZWVsRXZlbnQoIFFXaGVlbEV2ZW50ICplICl7CiAgICAgUVdoZWVsRXZlbnQgY2UoIHZpZXdwb3J0 KCktPm1hcEZyb21HbG9iYWwoIGUtPmdsb2JhbFBvcygpICksCi0JCSAgICBlLT5nbG9iYWxQb3Mo KSwgZS0+ZGVsdGEoKSwgZS0+c3RhdGUoKSk7CisJCSAgICBlLT5nbG9iYWxQb3MoKSwgZS0+ZGVs dGEoKSwgZS0+c3RhdGUoKSwgZS0+ZGlyZWN0aW9uKCkpOwogICAgIHZpZXdwb3J0V2hlZWxFdmVu dCgmY2UpOwogICAgIGlmICggIWNlLmlzQWNjZXB0ZWQoKSApIHsKLQlpZiAodmVydGljYWxTY3Jv bGxCYXIoKSkKLQkgICAgUUFwcGxpY2F0aW9uOjpzZW5kRXZlbnQoIHZlcnRpY2FsU2Nyb2xsQmFy KCksIGUpOworCWlmIChjZS5kaXJlY3Rpb24oKT09UVdoZWVsRXZlbnQ6OlZlcnRpY2FsKSB7CisJ ICAgaWYgKHZlcnRpY2FsU2Nyb2xsQmFyKCkpCisJICAgICAgUUFwcGxpY2F0aW9uOjpzZW5kRXZl bnQoIHZlcnRpY2FsU2Nyb2xsQmFyKCksIGUpOworCX0gZWxzZQorCSAgIGlmIChob3Jpem9udGFs U2Nyb2xsQmFyKCkpCisJICAgICAgUUFwcGxpY2F0aW9uOjpzZW5kRXZlbnQoIGhvcml6b250YWxT Y3JvbGxCYXIoKSwgZSk7CiAgICAgfQogfQogCg== --------------Boundary-00=_A8N61OBBG12CVE3KYHPI--