From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LLDfj-0006mB-H7 for qemu-devel@nongnu.org; Fri, 09 Jan 2009 04:28:55 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LLDfi-0006ke-H9 for qemu-devel@nongnu.org; Fri, 09 Jan 2009 04:28:54 -0500 Received: from [199.232.76.173] (port=53167 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LLDfi-0006kF-7x for qemu-devel@nongnu.org; Fri, 09 Jan 2009 04:28:54 -0500 Received: from smtp-out.google.com ([216.239.45.13]:27227) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LLDfg-0005O6-GI for qemu-devel@nongnu.org; Fri, 09 Jan 2009 04:28:53 -0500 Received: from wpaz17.hot.corp.google.com (wpaz17.hot.corp.google.com [172.24.198.81]) by smtp-out.google.com with ESMTP id n099Ske6026102 for ; Fri, 9 Jan 2009 01:28:47 -0800 Received: from rn-out-0910.google.com (rnej66.prod.google.com [10.38.161.66]) by wpaz17.hot.corp.google.com with ESMTP id n099SJLe031125 for ; Fri, 9 Jan 2009 01:28:45 -0800 Received: by rn-out-0910.google.com with SMTP id j66so6301293rne.20 for ; Fri, 09 Jan 2009 01:28:45 -0800 (PST) MIME-Version: 1.0 In-Reply-To: <4966BEC4.7080903@codemonkey.ws> References: <4966ADD4.5090102@codesourcery.com> <4966BB7A.3090303@codemonkey.ws> <4966BEC4.7080903@codemonkey.ws> Date: Fri, 9 Jan 2009 10:28:45 +0100 Message-ID: <60cad3f0901090128m23977527kf658c15ba90dbaf8@mail.gmail.com> Subject: Re: [Qemu-devel] Ongoing changes to the displaying code From: David Turner Content-Type: multipart/mixed; boundary=000e0cd40516309c690460096227 Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org --000e0cd40516309c690460096227 Content-Type: multipart/alternative; boundary=000e0cd40516309c620460096225 --000e0cd40516309c620460096225 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Hello everyone, as the guy who implemented all this in the Android emulator, I'd like to share a few thoughts. On Fri, Jan 9, 2009 at 4:04 AM, Anthony Liguori wrote: > > I assume you're looking to do this in order to support functionality like > in the Android simulator. So that if you're using QEMU to emulator a hand > held device (cell phone, whatever), you can have something that looks like > that device. > > The problem is, your GUI is going to want all the feature of a normal GUI. > Context menus, perhaps a tool bar, etc. Maybe you want animated button > clicks or even the buttons to make noises when clicked. Inevitably, it'll > bloat to a full blown GUI. Not very useful for us virtualization folks so > we'll also want our own GUI. Then things get ugly because should it be one > GUI or two separate ones? Another way to do this is to separate out the GUI > logic so it's not directly tied to QEMU. This has been discussed many times > and there are a lot of advantages to using an external GUI. Namely, you can > close the window without exiting the simulation. > +1 to separate the emulation logic and the display/GUI one. this is exactly what has been done in the Android emulator, even though the program uses its own GUI for practical reasons. > If you build a simple app that exec()'s and connects to QEMU via VNC, and > use something like gtk-vnc, you could build just what you're looking for > very easily. It's all portable to Windows too and LGPL licensed. You could > even develop in a higher level language like Python and you'd get to use > file dialog widgets, context menus, and all that good stuff without worrying > about recreating that in SDL. > > I think that's a better route to go for this sort of thing. If you think > it's generally useful, I think it'd also be worthwhile to host within the > QEMU project. I just don't think it's the right thing to add into QEMU > directly. > For my specific needs, VNC and a separate GUI application are totally overkill. However, it is true that QEMU itself absolutely doesn't require to support any GUI jazz (you should probably let that to forks/GUI wrappers instead). On the other hand, it would be nice to have a slightly better way to decouple display/events between the emulation and user-interaction parts of the system. For example, I've attached the framebuffer abstraction that I currently use in the Android emulator source code (it's a well documented header file). It's basically a slightly better DisplayState, with explicit producer/clients relationships and a global fifo used for initialization/linking. I do not claim it is the absolute best way to do it, just an example on how this can be implemented. If someone's interested, I can probably provide a patch against the QEMU svn sources. Regards, - Digit > > Regards, > > Anthony Liguori > > Regards, >> >> Anthony Liguori >> > > > > --000e0cd40516309c620460096225 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hello everyone,

as the guy who implemented all this in the Android e= mulator, I'd like to share a few thoughts.

On Fri, Jan 9, 2009 at 4:04 AM, Anthony Liguori <= ;anthony@codemonkey.ws> wrote:

I assume you're looking to do this in order to support functionality li= ke in the Android simulator.  So that if you're using QEMU to emul= ator a hand held device (cell phone, whatever), you can have something that= looks like that device.

The problem is, your GUI is going to want all the feature of a normal GUI. =  Context menus, perhaps a tool bar, etc.  Maybe you want animated= button clicks or even the buttons to make noises when clicked.  Inevi= tably, it'll bloat to a full blown GUI.  Not very useful for us vi= rtualization folks so we'll also want our own GUI.  Then things ge= t ugly because should it be one GUI or two separate ones?  Another way= to do this is to separate out the GUI logic so it's not directly tied = to QEMU.  This has been discussed many times and there are a lot of ad= vantages to using an external GUI.  Namely, you can close the window w= ithout exiting the simulation.

+1 to separate the emulation logic and the display/GU= I one. this is exactly what has been done in the Android emulator, even tho= ugh the program uses its own GUI for practical reasons.


If you build a simple app that exec()'s and connects to QEMU via VNC, a= nd use something like gtk-vnc, you could build just what you're looking= for very easily.  It's all portable to Windows too and LGPL licen= sed.  You could even develop in a higher level language like Python an= d you'd get to use file dialog widgets, context menus, and all that goo= d stuff without worrying about recreating that in SDL.



I think that's a better route to go for this sort of thing.  If yo= u think it's generally useful, I think it'd also be worthwhile to h= ost within the QEMU project.  I just don't think it's the righ= t thing to add into QEMU directly.

For my specific needs, VNC and a separate GUI applica= tion are totally overkill. However, it is true that QEMU itself absolutely doesn'= ;t require to support any GUI jazz (you should probably let that to forks/G= UI wrappers instead).

On the other hand, it would be nice to have a = slightly better way to decouple display/events between the emulation and us= er-interaction parts of the system. For example, I've attached the fram= ebuffer abstraction that I currently use in the Android emulator source cod= e (it's a well documented header file).

It's basically a slightly better DisplayState, with explicit produc= er/clients relationships and a global fifo used for initialization/linking.= I do not claim it is the absolute best way to do it, just an example on ho= w this can be implemented.

If someone's interested, I can probably provide a patch against the= QEMU svn sources.

Regards,

- Digit 
 
<= br> Regards,

Anthony Liguori

Regards,

Anthony Liguori




--000e0cd40516309c620460096225-- --000e0cd40516309c690460096227 Content-Type: text/x-chdr; charset=US-ASCII; name="framebuffer.h" Content-Disposition: attachment; filename="framebuffer.h" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fpqna6v50 LyogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVj dAoqKgoqKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljCioqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCioqIG1heSBiZSBjb3BpZWQsIGRpc3Ry aWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCioqCioqIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAoqKiBi dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgoqKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlCioqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp bHMuCiovCiNpZm5kZWYgX1FFTVVfRlJBTUVCVUZGRVJfSF8KI2RlZmluZSBfUUVNVV9GUkFNRUJV RkZFUl9IXwoKLyogQSBzaW1wbGUgYWJzdHJhY3QgaW50ZXJmYWNlIHRvIGZyYW1lYnVmZmVyIGRp c3BsYXlzLiB0aGlzIGlzIHVzZWQgdG8KICogZGUtY291cGxlIGhhcmR3YXJlIGVtdWxhdGlvbiBm cm9tIGZpbmFsIGRpc3BsYXkuCiAqCiAqIEVhY2ggUUZyYW1lQnVmZmVyIG9iamVjdCBob2xkcyBh IHBpeGVsIGJ1ZmZlciB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuCiAqIG9uZSAnUHJvZHVjZXInIGFu ZCBvbmUgb3IgbW9yZSAnQ2xpZW50cycKICoKICogVGhlIFByb2R1Y2VyIGlzIGluIGNoYXJnZSBv ZiB1cGRhdGluZyB0aGUgcGl4ZWwgYnVmZmVyIGZyb20gdGhlIHN0YXRlCiAqIG9mIHRoZSBlbXVs YXRlZCBWUkFNLiBBIENsaWVudCBsaXN0ZW5zIHRvIHVwZGF0ZXMgdG8gdGhlIHBpeGVsIGJ1ZmZl ciwKICogc2VudCBmcm9tIHRoZSBwcm9kdWNlciB0aHJvdWdoIHFmcmFtZWJ1ZmZlcl91cGRhdGUo KS9fcm90YXRlKCkgYW5kCiAqIGRpc3BsYXlzIHRoZW0uCiAqCiAqIG5vdGUgdGhlICdyb3RhdGlv bicgZmllbGQ6IGl0IGNhbiB0YWtlIHZhbHVlcyAwLCAxLCAyIG9yIDMgYW5kIGNvcnJlc3BvbmRz CiAqIHRvIGEgcm90YXRpb24gdGhhdCBtdXN0IGJlIHBlcmZvcm1lZCB0byB0aGUgcGl4ZWxzIHN0 b3JlZCBpbiB0aGUgZnJhbWVidWZmZXIKICogKmJlZm9yZSogZGlzcGxheWluZyB0aGVtIGEgdmFs dWUgb2YgMSBjb3JyZXNwb25kcyB0byBhIHJvdGF0aW9uIG9mCiAqIDkwIGNsb2Nrd2lzZS1kZWdy ZWVzLCB3aGVuIHRoZSBmcmFtZWJ1ZmZlciBpcyByb3RhdGVkIDkwIG9yIDI3MCBkZWdyZWVzLAog KiBpdHMgd2lkdGgvaGVpZ2h0IGFyZSBzd2FwcGVkIGF1dG9tYXRpY2FsbHkKICoKICogcGh5c193 aWR0aF9tbSBhbmQgcGh5c19oZWlnaHRfbW0gYXJlIHBoeXNpY2FsIGRpbWVuc2lvbnMgZXhwcmVz c2VkCiAqIGluIG1pbGxpbWV0ZXJzCiAqCiAqIE1vcmUgYWJvdXQgdGhlIGNsaWVudC9wcm9kdWNl ciByZWxhdGlvbnNoaXBzIGJlbG93LgogKi8KdHlwZWRlZiBzdHJ1Y3QgUUZyYW1lQnVmZmVyICAg UUZyYW1lQnVmZmVyOwoKCnR5cGVkZWYgZW51bSB7CiAgICBRRlJBTUVfQlVGRkVSX05PTkUgICA9 IDAsCiAgICBRRlJBTUVfQlVGRkVSX1JHQjU2NSA9IDEsCiAgICBRRlJBTUVfQlVGRkVSX01BWCAg ICAgICAgICAvKiBkbyBub3QgcmVtb3ZlICovCn0gUUZyYW1lQnVmZmVyRm9ybWF0OwoKc3RydWN0 IFFGcmFtZUJ1ZmZlciB7CiAgICBpbnQgICAgICAgICAgICAgICAgIHdpZHRoOyAgICAgICAgLyog d2lkdGggaW4gcGl4ZWxzICovCiAgICBpbnQgICAgICAgICAgICAgICAgIGhlaWdodDsgICAgICAg LyogaGVpZ2h0IGluIHBpeGVscyAqLwogICAgaW50ICAgICAgICAgICAgICAgICBwaXRjaDsgICAg ICAgIC8qIGJ5dGVzIHBlciBsaW5lICovCiAgICBpbnQgICAgICAgICAgICAgICAgIHJvdGF0aW9u OyAgICAgLyogcm90YXRpb24gdG8gYmUgYXBwbGllZCB3aGVuIGRpc3BsYXlpbmcgKi8KICAgIFFG cmFtZUJ1ZmZlckZvcm1hdCAgZm9ybWF0OwogICAgdm9pZCogICAgICAgICAgICAgICBwaXhlbHM7 ICAgICAgIC8qIHBpeGVsIGJ1ZmZlciAqLwoKICAgIGludCAgICAgICAgICAgICAgICAgcGh5c193 aWR0aF9tbTsKICAgIGludCAgICAgICAgICAgICAgICAgcGh5c19oZWlnaHRfbW07CgogICAgLyog ZXh0cmEgZGF0YSB0aGF0IGlzIGhhbmRsZWQgYnkgdGhlIGZyYW1lYnVmZmVyIGltcGxlbWVudGF0 aW9uICovCiAgICB2b2lkKiAgICAgICAgICAgICAgIGV4dHJhOwoKfTsKCi8qIHRoZSBkZWZhdWx0 IGRwaSByZXNvbHV0aW9uIG9mIGEgdHlwaWNhbCBmcmFtZWJ1ZmZlci4gdGhpcyBpcyBhbiBhdmVy YWdlCiAqIGJldHdlZW4gdmFyaW91cyBwcm90b3R5cGVzIGJlaW5nIHVzZWQgZHVyaW5nIHRoZSBk ZXZlbG9wbWVudCBvZiB0aGUKICogQW5kcm9pZCBzeXN0ZW0uLi4KICovCiNkZWZpbmUgIERFRkFV TFRfRlJBTUVCVUZGRVJfRFBJICAgMTY1CgoKLyogaW5pdGlhbGl6ZSBhIGZyYW1lYnVmZmVyIG9i amVjdCBhbmQgYWxsb2NhdGUgaXRzIHBpeGVsIGJ1ZmZlciAqLwovKiB0aGlzIGNvbXB1dGVzIHBo eXNfd2lkdGhfbW0gYW5kIHBoeXNfaGVpZ2h0X21tIGFzc3VtaW5nIGEgMTY1IGRwaSBzY3JlZW4g Ki8KLyogcmV0dXJucyAtMSBpbiBjYXNlIG9mIGVycm9yLCAwIG90aGVyd2lzZSAqLwpleHRlcm4g aW50CnFmcmFtZWJ1ZmZlcl9pbml0KCBRRnJhbWVCdWZmZXIqICAgICAgIHFmYnVmZiwKICAgICAg ICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgd2lkdGgsCiAgICAgICAgICAgICAgICAg ICBpbnQgICAgICAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgICAgICAgIGludCAgICAg ICAgICAgICAgICAgcm90YXRpb24sCiAgICAgICAgICAgICAgICAgICBRRnJhbWVCdWZmZXJGb3Jt YXQgIGZvcm1hdCApOwoKLyogcmVjb21wdXRlIHBoeXNfd2lkdGhfbW0gYW5kIHBoeXNfaGVpZ2h0 X21tIGFjY29yZGluZyB0byB0aGUgZW11bGF0ZWQgCiAqIHNjcmVlbiBEUEkgc2V0dGluZ3MgKi8K ZXh0ZXJuIHZvaWQKcWZyYW1lYnVmZmVyX3NldF9kcGkoIFFGcmFtZUJ1ZmZlciogICBxZmJ1ZmYs CiAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgeF9kcGksCiAgICAgICAgICAg ICAgICAgICAgICBpbnQgICAgICAgICAgICAgeV9kcGkgKTsKCi8qIGFsdGVybmF0aXZlIHRvIHFm cmFtZWJ1ZmZlcl9zZXRfZHBpIHdoZXJlIG9uZSBjYW4gc2V0IHRoZSBwaHlzaWNhbCAKICogZGlt ZW5zaW9ucyBkaXJlY3RseSBpbiBtaWxsaW1ldGVycy4gZm9yIHRoZSByZWNvcmQgMSBpbmNoID0g MjUuNCBtbSAqLwpleHRlcm4gdm9pZApxZnJhbWVidWZmZXJfc2V0X21tKCBRRnJhbWVCdWZmZXIq ICAgcWZidWZmLAogICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgd2lkdGhfbW0s CiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBoZWlnaHRfbW0gKTsKCi8qIHRo ZSBDbGllbnQ6OlVwZGF0ZSBtZXRob2QgaXMgY2FsbGVkIHRvIGluc3RydWN0IGEgY2xpZW50IHRo YXQgYSBnaXZlbgogKiByZWN0YW5nbGUgb2YgdGhlIGZyYW1lYnVmZmVyIHBpeGVscyB3YXMgdXBk YXRlZCBhbmQgbmVlZHMgdG8gYmUKICogcmVkcmF3bi4KICovCnR5cGVkZWYgdm9pZCAoKlFGcmFt ZUJ1ZmZlclVwZGF0ZUZ1bmMpKCB2b2lkKiAgb3BhcXVlLCBpbnQgIHgsIGludCAgeSwgCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHcs IGludCAgaCApOwoKLyogdGhlIENsaWVudDo6Um90YXRlIG1ldGhvZCBpcyBjYWxsZWQgdG8gaW5z dHJ1Y3QgdGhlIGNsaWVudCB0aGF0IGEKICogZnJhbWVidWZmZXIncyBpbnRlcm5hbCByb3RhdGlv biBoYXMgY2hhbmdlZC4gVGhpcyBpcyB0aGUgcm90YXRpb24KICogdGhhdCBtdXN0IGJlIGFwcGxp ZWQgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIHBpeGVscy4KICoKICogTm90ZSB0aGF0IGl0IGlzIGFz c3VtZWQgdGhhdCBhbGwgZnJhbWVidWZmZXIgcGl4ZWxzIGhhdmUgY2hhbmdlZCB0b28KICogc28g dGhlIGNsaWVudCBzaG91bGQgY2FsbCBpdHMgVXBkYXRlIG1ldGhvZCBhcyB3ZWxsLgogKi8KdHlw ZWRlZiB2b2lkICgqUUZyYW1lQnVmZmVyUm90YXRlRnVuYykoIHZvaWQqICBvcGFxdWUsIGludCAg cm90YXRpb24gKTsKCi8qIHRoZSBDbGllbnQ6OkRvbmUgZnVuYyB0ZWxscyBhIGNsaWVudCB0aGF0 IGEgZnJhbWVidWZmZXIgb2JqZWN0IHdhcyBmcmVlZC4KICogbm8gbW9yZSByZWZlcmVuY2UgdG8g aXRzIHBpeGVscyBzaG91bGQgYmUgZG9uZS4KICovCnR5cGVkZWYgdm9pZCAoKlFGcmFtZUJ1ZmZl ckRvbmVGdW5jKSAgKCB2b2lkKiAgb3BhcXVlICk7CgovKiBhZGQgb25lIGNsaWVudCB0byBhIGdp dmVuIGZyYW1lYnVmZmVyLgogKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IGFsbG93 cyBvbmUgY2xpZW50IHBlciBmcmFtZS1idWZmZXIsCiAqIGJ1dCB3ZSBjb3VsZCBhbGxvdyBtb3Jl IGZvciB2YXJpb3VzIHJlYXNvbnMgKGUuZy4gZGlzcGxheWluZyB0aGUKICogZnJhbWVidWZmZXIg KyBkaXNwYXRjaGluZyBpdCB0aHJvdWdoIFZOQyBhdCB0aGUgc2FtZSB0aW1lKQogKi8KZXh0ZXJu IHZvaWQKcWZyYW1lYnVmZmVyX2FkZF9jbGllbnQoIFFGcmFtZUJ1ZmZlciogICAgICAgICAgIHFm YnVmZiwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIGZi X29wYXF1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFFGcmFtZUJ1ZmZlclVwZGF0ZUZ1bmMg IGZiX3VwZGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFFGcmFtZUJ1ZmZlclJvdGF0ZUZ1 bmMgIGZiX3JvdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFFGcmFtZUJ1ZmZlckRvbmVG dW5jICAgIGZiX2RvbmUgKTsKCi8qIFByb2R1Y2VyOjpDaGVja1VwZGF0ZSBpcyBjYWxsZWQgdG8g bGV0IHRoZSBwcm9kdWNlciBjaGVjayB0aGUKICogVlJBTSBzdGF0ZSAoZS5nLiBWUkFNIGRpcnR5 IHBhZ2VzKSB0byBzZWUgaWYgYW55dGhpbmcgY2hhbmdlZCBzaW5jZSB0aGUKICogbGFzdCBjYWxs IHRvIHRoZSBtZXRob2QuIFdoZW4gdHJ1ZSwgdGhlIG1ldGhvZCBzaG91bGQgY2FsbCBlaXRoZXIK ICogcWZyYW1lYnVmZmVyX3VwZGF0ZSgpIG9yIHFmcmFtZWJ1ZmZlcl9yb3RhdGUoKSB3aXRoIHRo ZSBhcHByb3ByaWF0ZSB2YWx1ZXMuCiAqLwp0eXBlZGVmIHZvaWQgKCpRRnJhbWVCdWZmZXJDaGVj a1VwZGF0ZUZ1bmMpKCB2b2lkKiAgb3BhcXVlICk7CgovKiBQcm9kdWNlcjo6SW52YWxpZGF0ZSB0 ZWxscyB0aGUgcHJvZHVjZXIgdGhhdCB0aGUgbmV4dCBjYWxsIHRvCiAqIENoZWNrVXBkYXRlIHNo b3VsZCBhY3QgYXMgaWYgdGhlIHdob2xlIGNvbnRlbnQgb2YgVlJBTSBoYWQgY2hhbmdlZC4KICog dGhpcyBpcyBub3JtYWxseSBkb25lIHRvIGZvcmNlIGNsaWVudCBpbml0aWFsaXphdGlvbi9yZWZy ZXNoZXMuCiAqLwp0eXBlZGVmIHZvaWQgKCpRRnJhbWVCdWZmZXJJbnZhbGlkYXRlRnVuYykgKCB2 b2lkKiAgb3BhcXVlICk7CgovKiB0aGUgUHJvZHVjZXI6OkRldGFjaCBtZXRob2QgaXMgdXNlZCB0 byB0ZWxsIHRoZSBwcm9kdWNlciB0aGF0IHRoZQogKiB1bmRlcmx5aW5nIFFGcmFtZUJ1ZmZlciBv YmplY3QgaXMgYWJvdXQgdG8gYmUgZGUtYWxsb2NhdGVkLgogKi8KdHlwZWRlZiB2b2lkICgqUUZy YW1lQnVmZmVyRGV0YWNoRnVuYykgICAgICggdm9pZCogIG9wYXF1ZSApOwoKLyogc2V0IHRoZSBw cm9kdWNlciBvZiBhIGdpdmVuIGZyYW1lYnVmZmVyICovCmV4dGVybiB2b2lkCnFmcmFtZWJ1ZmZl cl9zZXRfcHJvZHVjZXIoIFFGcmFtZUJ1ZmZlciogICAgICAgICAgICAgICAgcWZidWZmLAogICAg ICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgIG9wYXF1 ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgUUZyYW1lQnVmZmVyQ2hlY2tVcGRhdGVGdW5j ICBmYl9jaGVjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgUUZyYW1lQnVmZmVySW52YWxp ZGF0ZUZ1bmMgICBmYl9pbnZhbGlkYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBRRnJh bWVCdWZmZXJEZXRhY2hGdW5jICAgICAgIGZiX2RldGFjaCApOwoKLyogdGVsbCBhIGNsaWVudCB0 aGF0IGEgcmVjdGFuZ2xlIHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGluIHRoZSBmcmFtZWJ1ZmZl cgogKiBwaXhlbCBidWZmZXIgdGhpcyBpcyB0eXBpY2FsbHkgY2FsbGVkIGZyb20gYSBQcm9kdWNl cjo6Q2hlY2tVcGRhdGUgbWV0aG9kCiAqLwpleHRlcm4gdm9pZApxZnJhbWVidWZmZXJfdXBkYXRl KCBRRnJhbWVCdWZmZXIqICBxZmJ1ZmYsIGludCAgeCwgaW50ICB5LCBpbnQgIHcsIGludCAgaCAp OwoKLyogcm90YXRlIHRoZSBmcmFtZWJ1ZmZlciAobWF5IHN3YXAgd2lkdGgvaGVpZ2h0KSwgYW5k IHRlbGwgYWxsIGNsaWVudHMuCiAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSBhIFByb2R1Y2VyOjpD aGVja1VwZGF0ZSBtZXRob2QKICovCmV4dGVybiB2b2lkCnFmcmFtZWJ1ZmZlcl9yb3RhdGUoIFFG cmFtZUJ1ZmZlciogIHFmYnVmZiwgaW50ICByb3RhdGlvbiApOwoKLyogZmluYWxpemUgYSBmcmFt ZWJ1ZmZlciwgcmVsZWFzZSBpdHMgcGl4ZWwgYnVmZmVyLiBTaG91bGQgYmUgY2FsbGVkCiAqIGZy b20gdGhlIGZyYW1lYnVmZmVyIG9iamVjdCdzIG93bmVyCiAqLwpleHRlcm4gdm9pZApxZnJhbWVi dWZmZXJfZG9uZSggUUZyYW1lQnVmZmVyKiAgIHFmYnVmZiApOwoKCi8qIHRoaXMgaXMgY2FsbGVk IHJlcGVhdGVkbHkgYnkgdGhlIGVtdWxhdG9yLiBmb3IgZWFjaCByZWdpc3RlcmVkIGZyYW1lYnVm ZmVyLAogKiBjYWxsIGl0cyBwcm9kdWNlcidzIENoZWNrVXBkYXRlIG1ldGhvZCwgaWYgYW55Lgog Ki8KZXh0ZXJuIHZvaWQKcWZyYW1lYnVmZmVyX2NoZWNrX3VwZGF0ZXMoIHZvaWQgKTsKCi8qIHRo aXMgaXMgY2FsbGVkIGJ5IHRoZSBlbXVsYXRvci4gZm9yIGVhY2ggcmVnaXN0ZXJlZCBmcmFtZWJ1 ZmZlciwgY2FsbAogKiBpdHMgcHJvZHVjZXIncyBJbnZhbGlkYXRlIG1ldGhvZCwgaWYgYW55CiAq LwpleHRlcm4gdm9pZApxZnJhbWVidWZmZXJfaW52YWxpZGF0ZV9hbGwoIHZvaWQgKTsKCi8qCiAq IHRvIGNvbXBsZXRlbHkgc2VwYXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGNsaWVudHMsIHBy b2R1Y2VycywgYW5kIHNraW5zLAogKiB3ZSB1c2UgYSBzaW1wbGUgZ2xvYmFsIEZJRk8gbGlzdCBv ZiBRRnJhbWVCdWZmZXIgb2JqZWN0cy4KICoKICogcWZyYW1lYnVmZmVyX2ZpZm9fYWRkKCkgaXMg dHlwaWNhbGx5IGNhbGxlZCBieSB0aGUgZW11bGF0b3IgaW5pdGlhbGl6YXRpb24KICogZGVwZW5k aW5nIG9uIHRoZSBlbXVsYXRlZCBkZXZpY2UncyBjb25maWd1cmF0aW9uCiAqCiAqIHFmcmFtZWJ1 ZmZlcl9maWZvX2dldCgpIGlzIHR5cGljYWxseSBjYWxsZWQgYnkgYSBoYXJkd2FyZSBmcmFtZWJ1 ZmZlcgogKiBlbXVsYXRpb24uCiAqLwoKLyogYWRkIGEgbmV3IGNvbnN0cnVjdGVkIGZyYW1lIGJ1 ZmZlciBvYmplY3QgdG8gb3VyIGdsb2JhbCBsaXN0ICovCmV4dGVybiB2b2lkCnFmcmFtZWJ1ZmZl cl9maWZvX2FkZCggUUZyYW1lQnVmZmVyKiAgcWZidWZmICk7CgovKiByZXRyaWV2ZSBhIGZyYW1l IGJ1ZmZlciBvYmplY3QgZnJvbSB0aGUgZ2xvYmFsIEZJRk8gbGlzdCAqLwpleHRlcm4gUUZyYW1l QnVmZmVyKgpxZnJhbWVidWZmZXJfZmlmb19nZXQoIHZvaWQgKTsKCi8qICovCgojZW5kaWYgLyog X1FFTVVfRlJBTUVCVUZGRVJfSF8gKi8KCg== --000e0cd40516309c690460096227--