From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH 1/1] cameraif: add ABI for para-virtual camera Date: Mon, 10 Sep 2018 10:16:06 +0300 Message-ID: References: <20180731093142.3828-1-andr2000@gmail.com> <20180731093142.3828-2-andr2000@gmail.com> <73b69e31-d36d-d89f-20d6-d59dbefe395e@xs4all.nl> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fzGQg-0003Ni-7a for xen-devel@lists.xenproject.org; Mon, 10 Sep 2018 07:16:14 +0000 Received: by mail-lf1-x12d.google.com with SMTP id v77-v6so16552985lfa.6 for ; Mon, 10 Sep 2018 00:16:09 -0700 (PDT) In-Reply-To: <73b69e31-d36d-d89f-20d6-d59dbefe395e@xs4all.nl> Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Hans Verkuil , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com Cc: Oleksandr Andrushchenko List-Id: xen-devel@lists.xenproject.org SGksIEhhbnMhCgpPbiAwOS8wOS8yMDE4IDAxOjMxIFBNLCBIYW5zIFZlcmt1aWwgd3JvdGU6Cj4g SGkgT2xla3NhbmRyLAo+Cj4gU29ycnkgZm9yIHRoZSBkZWxheSBpbiByZXZpZXdpbmcsIEkgbWlz c2VkIHRoaXMgcGF0Y2ggdW50aWwgeW91IHBpbmdlZCBtZSwgYW5kCj4gSSB3YXMgdmVyeSBidXN5 IGFmdGVyIHRoYXQgYXMgd2VsbC4KSSBkbyBhcHByZWNpYXRlIHlvdSBzcGVuZGluZyB0aW1lIG9u IHRoaXMhCj4KPiBPbiAwNy8zMS8yMDE4IDExOjMxIEFNLCBPbGVrc2FuZHIgQW5kcnVzaGNoZW5r byB3cm90ZToKPj4gRnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRy dXNoY2hlbmtvQGVwYW0uY29tPgo+Pgo+PiBUaGlzIGlzIHRoZSBBQkkgZm9yIHRoZSB0d28gaGFs dmVzIG9mIGEgcGFyYS12aXJ0dWFsaXplZAo+PiBjYW1lcmEgZHJpdmVyIHdoaWNoIGV4dGVuZHMg WGVuJ3MgcmVhY2ggbXVsdGltZWRpYSBjYXBhYmlsaXRpZXMgZXZlbgo+PiBmYXJ0aGVyIGVuYWJs aW5nIGl0IGZvciB2aWRlbyBjb25mZXJlbmNpbmcsIEluLVZlaGljbGUgSW5mb3RhaW5tZW50LAo+ PiBoaWdoIGRlZmluaXRpb24gbWFwcyBldGMuCj4+Cj4+IFRoZSBpbml0aWFsIGdvYWwgaXMgdG8g c3VwcG9ydCBtb3N0IG5lZWRlZCBmdW5jdGlvbmFsaXR5IHdpdGggdGhlCj4+IGZpbmFsIGlkZWEg dG8gbWFrZSBpdCBwb3NzaWJsZSB0byBleHRlbmQgdGhlIHByb3RvY29sIGlmIG5lZWQgYmU6Cj4+ Cj4+IDEuIFByb3ZpZGUgbWVhbnMgZm9yIGJhc2UgdmlydHVhbCBkZXZpY2UgY29uZmlndXJhdGlv bjoKPj4gICAtIHBpeGVsIGZvcm1hdHMKPj4gICAtIHJlc29sdXRpb25zCj4+ICAgLSBmcmFtZSBy YXRlcwo+PiAyLiBTdXBwb3J0IGJhc2ljIGNhbWVyYSBjb250cm9sczoKPj4gICAtIGNvbnRyYXN0 Cj4+ICAgLSBicmlnaHRuZXNzCj4+ICAgLSBodWUKPj4gICAtIHNhdHVyYXRpb24KPj4gMy4gU3Vw cG9ydCBzdHJlYW1pbmcgY29udHJvbAo+PiA0LiBTdXBwb3J0IHplcm8tY29weWluZyB1c2UtY2Fz ZXMKPj4KPj4gU2lnbmVkLW9mZi1ieTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5k cl9hbmRydXNoY2hlbmtvQGVwYW0uY29tPgo+PiAtLS0KPj4gICB4ZW4vaW5jbHVkZS9wdWJsaWMv aW8vY2FtZXJhaWYuaCB8IDk4MSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+ICAg MSBmaWxlIGNoYW5nZWQsIDk4MSBpbnNlcnRpb25zKCspCj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0 IHhlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1lcmFpZi5oCj4+Cj4+IGRpZmYgLS1naXQgYS94ZW4v aW5jbHVkZS9wdWJsaWMvaW8vY2FtZXJhaWYuaCBiL3hlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1l cmFpZi5oCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uYmRj NmExMjYyZmNmCj4+IC0tLSAvZGV2L251bGwKPj4gKysrIGIveGVuL2luY2x1ZGUvcHVibGljL2lv L2NhbWVyYWlmLmgKPj4gQEAgLTAsMCArMSw5ODEgQEAKPj4gKy8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioKPj4gKyAqIGNhbWVyYWlmLmgKPj4gKyAqCj4+ICsgKiBVbmlmaWVkIGNhbWVyYSBkZXZpY2Ug SS9PIGludGVyZmFjZSBmb3IgWGVuIGd1ZXN0IE9TZXMuCj4+ICsgKgo+PiArICogUGVybWlzc2lv biBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWlu aW5nIGEgY29weQo+PiArICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVu dGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCj4+ICsgKiBkZWFsIGluIHRoZSBTb2Z0 d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRo ZQo+PiArICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlz dHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCj4+ICsgKiBzZWxsIGNvcGllcyBvZiB0aGUgU29m dHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwo+PiAr ICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u czoKPj4gKyAqCj4+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJt aXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgo+PiArICogYWxsIGNvcGllcyBvciBz dWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCj4+ICsgKgo+PiArICogVEhFIFNP RlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQs IEVYUFJFU1MgT1IKPj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8g VEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAo+PiArICogRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwg VEhFCj4+ICsgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5Z IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4+ICsgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4g QUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwo+PiArICogRlJP TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBP UiBPVEhFUgo+PiArICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo+PiArICoKPj4gKyAqIENv cHlyaWdodCAoQykgMjAxOCBFUEFNIFN5c3RlbXMgSW5jLgo+PiArICoKPj4gKyAqIEF1dGhvcjog T2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVwYW0uY29t Pgo+PiArICovCj4gVXNlIFNQRFggdGFnIGluc3RlYWQgb2YgY29weWluZyB0aGUgbGljZW5zZSB0 ZXh0LgpUaGlzIGlzIHlldCBhIFhlbiBoZWFkZXIgd2hpY2ggYmVsb25ncyB0byBYZW4gcHJvamVj dCBhbmQKYWxsIHRoZSByZXN0IG9mIHRoZSBwcm90b2NvbHMgaGF2ZSB0aGUgc2FtZSBsaWNlbnNl IGhlYWRlci4KSWYgWGVuIGNvbW11bml0eSBkZWNpZGVzIHRvIHVzZSBTUERYIHRoZW4gSSdsbCBk ZWZpbml0ZWx5IGZvbGxvdy4KCktvbnJhZCwgZG8geW91IHRoaW5rIHRoaXMgaXMgdGhlIHJpZ2h0 IHRpbWUgZm9yIHN1Y2ggYSBtb3ZlPwo+Cj4+ICsKPj4gKyNpZm5kZWYgX19YRU5fUFVCTElDX0lP X0NBTUVSQUlGX0hfXwo+PiArI2RlZmluZSBfX1hFTl9QVUJMSUNfSU9fQ0FNRVJBSUZfSF9fCj4+ ICsKPj4gKyNpbmNsdWRlICJyaW5nLmgiCj4+ICsjaW5jbHVkZSAiLi4vZ3JhbnRfdGFibGUuaCIK Pj4gKwo+PiArLyoKPj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPj4gKyAqICAgICAgICAgICAg ICAgICAgICAgICAgICAgUHJvdG9jb2wgdmVyc2lvbgo+PiArICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Kgo+PiArICovCj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9QUk9UT0NPTF9WRVJTSU9OICAgICAiMSIK Pj4gKwo+PiArLyoKPj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPj4gKyAqICAgICAgICAgICAg ICAgICAgRmVhdHVyZSBhbmQgUGFyYW1ldGVyIE5lZ290aWF0aW9uCj4+ICsgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCj4+ICsgKgo+PiArICogRnJvbnQtPmJhY2sgbm90aWZpY2F0aW9uczogd2hlbiBl bnF1ZXVpbmcgYSBuZXcgcmVxdWVzdCwgc2VuZGluZyBhCj4+ICsgKiBub3RpZmljYXRpb24gY2Fu IGJlIG1hZGUgY29uZGl0aW9uYWwgb24geGVuY2FtZXJhX3JlcSAoaS5lLiwgdGhlIGdlbmVyaWMK Pj4gKyAqIGhvbGQtb2ZmIG1lY2hhbmlzbSBwcm92aWRlZCBieSB0aGUgcmluZyBtYWNyb3MpLiBC YWNrZW5kcyBtdXN0IHNldAo+PiArICogeGVuY2FtZXJhX3JlcSBhcHByb3ByaWF0ZWx5IChlLmcu LCB1c2luZyBSSU5HX0ZJTkFMX0NIRUNLX0ZPUl9SRVFVRVNUUygpKS4KPj4gKyAqCj4+ICsgKiBC YWNrLT5mcm9udCBub3RpZmljYXRpb25zOiB3aGVuIGVucXVldWluZyBhIG5ldyByZXNwb25zZSwg c2VuZGluZyBhCj4+ICsgKiBub3RpZmljYXRpb24gY2FuIGJlIG1hZGUgY29uZGl0aW9uYWwgb24g eGVuY2FtZXJhX3Jlc3AgKGkuZS4sIHRoZSBnZW5lcmljCj4+ICsgKiBob2xkLW9mZiBtZWNoYW5p c20gcHJvdmlkZWQgYnkgdGhlIHJpbmcgbWFjcm9zKS4gRnJvbnRlbmRzIG11c3Qgc2V0Cj4+ICsg KiB4ZW5jYW1lcmFfcmVzcCBhcHByb3ByaWF0ZWx5IChlLmcuLCB1c2luZyBSSU5HX0ZJTkFMX0NI RUNLX0ZPUl9SRVNQT05TRVMoKSkuCj4+ICsgKgo+PiArICogVGhlIHR3byBoYWx2ZXMgb2YgYSBw YXJhLXZpcnR1YWwgY2FtZXJhIGRyaXZlciB1dGlsaXplIG5vZGVzIHdpdGhpbgo+PiArICogWGVu U3RvcmUgdG8gY29tbXVuaWNhdGUgY2FwYWJpbGl0aWVzIGFuZCB0byBuZWdvdGlhdGUgb3BlcmF0 aW5nIHBhcmFtZXRlcnMuCj4+ICsgKiBUaGlzIHNlY3Rpb24gZW51bWVyYXRlcyB0aGVzZSBub2Rl cyB3aGljaCByZXNpZGUgaW4gdGhlIHJlc3BlY3RpdmUgZnJvbnQgYW5kCj4+ICsgKiBiYWNrZW5k IHBvcnRpb25zIG9mIFhlblN0b3JlLCBmb2xsb3dpbmcgdGhlIFhlbkJ1cyBjb252ZW50aW9uLgo+ PiArICoKPj4gKyAqIEFsbCBkYXRhIGluIFhlblN0b3JlIGlzIHN0b3JlZCBhcyBzdHJpbmdzLiBO b2RlcyBzcGVjaWZ5aW5nIG51bWVyaWMKPj4gKyAqIHZhbHVlcyBhcmUgZW5jb2RlZCBpbiBkZWNp bWFsLiBJbnRlZ2VyIHZhbHVlIHJhbmdlcyBsaXN0ZWQgYmVsb3cgYXJlCj4+ICsgKiBleHByZXNz ZWQgYXMgZml4ZWQgc2l6ZWQgaW50ZWdlciB0eXBlcyBjYXBhYmxlIG9mIHN0b3JpbmcgdGhlIGNv bnZlcnNpb24KPj4gKyAqIG9mIGEgcHJvcGVybHkgZm9ybWF0dGVkIG5vZGUgc3RyaW5nLCB3aXRo b3V0IGxvc3Mgb2YgaW5mb3JtYXRpb24uCj4+ICsgKgo+PiArICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq Kgo+PiArICogICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlIGNvbmZpZ3VyYXRpb24KPj4g KyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKPj4gKyAqCj4+ICsgKiBUaGlzIGlzIGFuIGV4YW1wbGUg b2YgYmFja2VuZCBhbmQgZnJvbnRlbmQgY29uZmlndXJhdGlvbjoKPj4gKyAqCj4+ICsgKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCYWNrZW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCj4+ICsgKgo+PiArICogL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmNh bWVyYS8xLzAvZnJvbnRlbmQtaWQgPSAiMSIKPj4gKyAqIC9sb2NhbC9kb21haW4vMC9iYWNrZW5k L3ZjYW1lcmEvMS8wL2Zyb250ZW5kID0gIi9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8w Igo+PiArICogL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmNhbWVyYS8xLzAvc3RhdGUgPSAiNCIK Pj4gKyAqIC9sb2NhbC9kb21haW4vMC9iYWNrZW5kL3ZjYW1lcmEvMS8wL3ZlcnNpb25zID0gIjEs MiIKPiBXaHkgdmNhbWVyYSBpbnN0ZWFkIG9mIGp1c3QgY2FtZXJhPyBJZiAndicgc3RhbmRzIGZv ciAndmlkZW8nLCB0aGVuIHRoYXQgc2VlbXMKPiBzdXBlcmZsdW91cyB0byBtZS4KJ3YnIHN0YW5k cyBmb3IgJ3ZpcnR1YWwnLiBJIGFtIGZvbGxvd2luZyBYZW4gY29udmVudGlvbiB1c2VkCmZvciBh bGwgb3RoZXIgdmlydHVhbCBkZXZpY2UgcHJvdG9jb2xzIGhlcmUuCj4+ICsgKgo+PiArICotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnJvbnRlbmQgLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQo+PiArICoKPj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNh bWVyYS8wL2JhY2tlbmQtaWQgPSAiMCIKPj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNh bWVyYS8wL2JhY2tlbmQgPSAiL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmNhbWVyYS8xIgo+PiAr ICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvc3RhdGUgPSAiNCIKPj4gKyAqIC9s b2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL3ZlcnNpb24gPSAiMSIKPj4gKyAqIC9sb2Nh bC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL2JlLWFsbG9jID0gIjEiCj4+ICsgKgo+PiArICot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERldmljZSAwIGNvbmZpZ3VyYXRpb24gLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQo+PiArICoKPj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2Uv dmNhbWVyYS8wL2NvbnRyb2xzID0gImNvbnRyYXN0LGh1ZSIKPj4gKyAqIC9sb2NhbC9kb21haW4v MS9kZXZpY2UvdmNhbWVyYS8wL2Zvcm1hdHMvWVVZVi82NDB4NDgwID0gIjMwLzEsMTUvMSwxNS8y Igo+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9ZVVlWLzE5 MjB4MTA4MCA9ICIxNS8yIgo+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAv Zm9ybWF0cy9CR1JBLzY0MHg0ODAgPSAiMTUvMSwxNS8yIgo+PiArICogL2xvY2FsL2RvbWFpbi8x L2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9CR1JBLzEyMDB4NzIwID0gIjE1LzIiCj4+ICsgKiAv bG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC91bmlxdWUtaWQgPSAiMCIKPj4gKyAqIC9s b2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8wL3JlcS1yaW5nLXJlZiA9ICIyODMyIgo+PiAr ICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvcmVxLWV2ZW50LWNoYW5uZWwgPSAi MTUiCj4+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9ldnQtcmluZy1yZWYg PSAiMzg3Igo+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZXZ0LWV2ZW50 LWNoYW5uZWwgPSAiMTYiCj4+ICsgKgo+PiArICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t IERldmljZSAxIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+PiArICoK Pj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL2NvbnRyb2xzID0gImJyaWdo dG5lc3Msc2F0dXJhdGlvbixodWUiCj4+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1l cmEvMS9mb3JtYXRzL1lVWVYvNjQweDQ4MCA9ICIzMC8xLDE1LzEsMTUvMiIKPj4gKyAqIC9sb2Nh bC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL2Zvcm1hdHMvWVVZVi8xOTIweDEwODAgPSAiMTUv MiIKPj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL3VuaXF1ZS1pZCA9ICIx Igo+PiArICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvcmVxLXJpbmctcmVmID0g IjI4MzMiCj4+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS9yZXEtZXZlbnQt Y2hhbm5lbCA9ICIxNyIKPj4gKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL2V2 dC1yaW5nLXJlZiA9ICIzODgiCj4+ICsgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEv MS9ldnQtZXZlbnQtY2hhbm5lbCA9ICIxOCIKPj4gKyAqCj4+ICsgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrZW5kIFhlbkJ1cyBOb2Rl cwo+PiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+PiArICoKPj4gKyAqLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0gUHJvdG9jb2wgdmVyc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KPj4gKyAqCj4+ICsgKiB2ZXJzaW9ucwo+PiArICogICAgICBWYWx1ZXM6ICAgICAgICAg PHN0cmluZz4KPj4gKyAqCj4+ICsgKiAgICAgIExpc3Qgb2YgWEVOQ0FNRVJBX0xJU1RfU0VQQVJB VE9SIHNlcGFyYXRlZCBwcm90b2NvbCB2ZXJzaW9ucyBzdXBwb3J0ZWQKPj4gKyAqICAgICAgYnkg dGhlIGJhY2tlbmQuIEZvciBleGFtcGxlICIxLDIsMyIuCj4+ICsgKgo+PiArICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgo+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJvbnRlbmQgWGVu QnVzIE5vZGVzCj4+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4+ICsgKgo+PiArICotLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBZGRyZXNzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQo+PiArICoKPj4gKyAqIGRvbS1pZAo+PiArICogICAgICBWYWx1ZXM6ICAg ICAgICAgPHVpbnQxNl90Pgo+PiArICoKPj4gKyAqICAgICAgRG9tYWluIGlkZW50aWZpZXIuCj4+ ICsgKgo+PiArICogZGV2LWlkCj4+ICsgKiAgICAgIFZhbHVlczogICAgICAgICA8dWludDE2X3Q+ Cj4+ICsgKgo+PiArICogICAgICBEZXZpY2UgaWRlbnRpZmllci4KPj4gKyAqCj4+ICsgKiAgICAg IC9sb2NhbC9kb21haW4vPGRvbS1pZD4vZGV2aWNlL3ZjYW1lcmEvPGRldi1pZD4vLi4uCj4+ICsg Kgo+PiArICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcm90b2NvbCB2ZXJzaW9uIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+PiArICoKPj4gKyAqIHZlcnNpb24KPj4gKyAq ICAgICAgVmFsdWVzOiAgICAgICAgIDxzdHJpbmc+Cj4+ICsgKgo+PiArICogICAgICBQcm90b2Nv bCB2ZXJzaW9uLCBjaG9zZW4gYW1vbmcgdGhlIG9uZXMgc3VwcG9ydGVkIGJ5IHRoZSBiYWNrZW5k Lgo+PiArICoKPj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCYWNrZW5kIGJ1ZmZlciBh bGxvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4gKyAqCj4+ICsgKiBiZS1hbGxv Ywo+IEkgdGhvdWdodCB0aGF0ICdiZScgcmVmZXJyZWQgdG8gJ2JpZy1lbmRpYW4nLCBidXQgYXBw YXJlbnRseSBub3QuIFBlcmhhcHMgaXQKPiBpcyBiZXR0ZXIgdG8ganVzdCB3cml0ZSAnYmFja2Vu ZC1hbGxvYycuCldlbGwsICdiZScgYW5kICdmZScgYXJlIGNvbW1vbmx5IHVzZWQgaW4gWGVuIGZv ciBiYWNrZW5kCmFuZCBmcm9udGVuZCwgc28gSSdsbCBwcm9iYWJseSBzdGljayB0byB0aGF0IGNv bnZlbnRpb24gZm9yIG5vdy4KPgo+PiArICogICAgICBWYWx1ZXM6ICAgICAgICAgIjAiLCAiMSIK Pj4gKyAqCj4+ICsgKiAgICAgIElmIHZhbHVlIGlzIHNldCB0byAiMSIsIHRoZW4gYmFja2VuZCB3 aWxsIGJlIHRoZSBidWZmZXIKPj4gKyAqICAgICAgcHJvdmlkZXIvYWxsb2NhdG9yIGZvciB0aGlz IGRvbWFpbiBkdXJpbmcgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUKPj4gKyAqICAgICAgb3BlcmF0 aW9uLgo+PiArICogICAgICBJZiB2YWx1ZSBpcyBub3QgIjEiIG9yIG9taXR0ZWQgZnJvbnRlbmQg bXVzdCBhbGxvY2F0ZSBidWZmZXJzIGl0c2VsZi4KPj4gKyAqCj4+ICsgKi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0gQ2FtZXJhIHNldHRpbmdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCj4+ICsgKgo+PiArICogdW5pcXVlLWlkCj4+ICsgKiAgICAgIFZhbHVlczogICAgICAg ICA8c3RyaW5nPgo+PiArICoKPj4gKyAqICAgICAgQWZ0ZXIgZGV2aWNlIGluc3RhbmNlIGluaXRp YWxpemF0aW9uIGVhY2ggY2FtZXJhIGlzIGFzc2lnbmVkIGEKPj4gKyAqICAgICAgdW5pcXVlIElE LCBzbyBpdCBjYW4gYmUgaWRlbnRpZmllZCBieSB0aGUgYmFja2VuZCBieSB0aGlzIElELgo+PiAr ICogICAgICBUaGlzIGNhbiBiZSBVVUlEIG9yIHN1Y2guCj4+ICsgKgo+PiArICogY29udHJvbHMK Pj4gKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDxsaXN0IG9mIHN0cmluZz4KPj4gKyAqCj4+ICsg KiAgICAgIExpc3Qgb2Ygc3VwcG9ydGVkIGNhbWVyYSBjb250cm9scyBzZXBhcmF0ZWQgYnkgWEVO Q0FNRVJBX0xJU1RfU0VQQVJBVE9SLgo+PiArICogICAgICBDYW1lcmEgY29udHJvbHMgYXJlIGV4 cHJlc3NlZCBhcyBhIGxpc3Qgb2Ygc3RyaW5nIHZhbHVlcyB3L28gYW55Cj4+ICsgKiAgICAgIG9y ZGVyaW5nIHJlcXVpcmVtZW50Lgo+PiArICoKPj4gKyAqIGZvcm1hdHMKPj4gKyAqICAgICAgVmFs dWVzOiAgICAgICAgIDxmb3JtYXQsIGNoYXJbNF0+Cj4+ICsgKgo+PiArICogICAgICBGb3JtYXRz IGFyZSBvcmdhbml6ZWQgYXMgYSBzZXQgb2YgZGlyZWN0b3JpZXMgb25lIHBlciBlYWNoCj4+ICsg KiAgICAgIHN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3Rvcnkg aXMgYW4gdXBwZXIgY2FzZQo+PiArICogICAgICBzdHJpbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcg Rk9VUkNDIHN0cmluZyBsYWJlbC4gVGhlIG5leHQgbGV2ZWwgb2YKPj4gKyAqICAgICAgdGhlIGRp cmVjdG9yeSB1bmRlciA8Zm9ybWF0cz4gcmVwcmVzZW50cyBzdXBwb3J0ZWQgcmVzb2x1dGlvbnMu Cj4gTG93ZXItY2FzZSBjaGFyYWN0ZXJzIGFyZSBhbHNvIHVzZSBpbiBwaXhlbGZvcm1hdHMsIHNv IEknZCBqdXN0IGtlZXAgdGhpcyBhcy1pcy4KT2ssIG5vIHByb2JsZW0gLSB3aWxsIHJlbW92ZSB0 aGUgJ3VwcGVyIGNhc2UnIGZyb20gdGhlIGRlZmluaXRpb24KPgo+IEluIGFkZGl0aW9uIGl0IGlz IGNvbW1vbiB0byBzZXQgYml0IDMxIG9mIHRoZSBmb3VyY2MgdG8gMSBpZiB0aGUgZm9ybWF0IGlz Cj4gYmlnLWVuZGlhbiAoc2VlIHY0bDJfZm91cmNjX2JlIG1hY3JvKS4gV2hlbiB2NGwgdXRpbGl0 aWVzIHByaW50IHRoaXMgZm9ybWF0IHdlCj4gYWRkIGEgLUJFIHN1ZmZpeCwgc28gVjRMMl9QSVhf Rk1UX0FSR0I1NTVYIGJlY29tZXMgIkFSMTUtQkUiLiBZb3UgbWlnaHQgd2FudCB0bwo+IGtlZXAg dGhhdCBjb252ZW50aW9uLgpJJ2xsIHRoaW5rIGFib3V0IGl0LCB0aGFuayB5b3UKPgo+PiArICoK Pj4gKyAqIHJlc29sdXRpb24KPj4gKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDx3aWR0aCwgdWlu dDMyX3Q+eDxoZWlnaHQsIHVpbnQzMl90Pgo+PiArICoKPj4gKyAqICAgICAgUmVzb2x1dGlvbnMg YXJlIG9yZ2FuaXplZCBhcyBhIHNldCBvZiBkaXJlY3RvcmllcyBvbmUgcGVyIGVhY2gKPj4gKyAq ICAgICAgc3VwcG9ydGVkIHJlc29sdXRpb24gdW5kZXIgY29ycmVzcG9uZGluZyA8Zm9ybWF0cz4g ZGlyZWN0b3J5Lgo+PiArICogICAgICBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGlzIHRoZSBz dXBwb3J0ZWQgd2lkdGggYW5kIGhlaWdodAo+PiArICogICAgICBvZiB0aGUgY2FtZXJhIHJlc29s dXRpb24gaW4gcGl4ZWxzLgo+IFdoYXQgaWYgeW91IGFyZSBkZWFsaW5nIHdpdGggYW4gSERNSSBp bnB1dD8gTm90IHVucmVhc29uYWJsZSBmb3IgbWVkaWEKPiBzeXN0ZW1zLiBUaGVyZSBjYW4gYmUg YSBsb3Qgb2YgcmVzb2x1dGlvbnMvZnJhbWVyYXRlcywgYW5kIHRoZSByZXNvbHV0aW9uCj4gY2Fu IGNoYW5nZSBvbiB0aGUgZmx5LCBvciBvZiBjb3Vyc2UgZGlzYXBwZWFyLgpXZWxsLCB0aGlzIGlz IGEgcGFydCBvZiB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZG9uZQpiZWZvcmUgd2UgYWN0dWFs bHkgcnVuIHRoZSBWTXMsIGUuZy4gYXQgc3lzdGVtIGRlc2lnbgphbmQgY29uZmlndXJhdGlvbiB0 aW1lLiBNb3N0IG9mIHRoZSB0aW1lIHlvdSBkbyBrbm93IHdoaWNoCnJlc29sdXRpb25zLCBmcmFt ZSByYXRlcyBldGMuIHlvdSB3YW50IHRvIGFzc2lnbiBhbmQgdGhlc2UKc2V0dGluZ3MgcmVtYWlu IHN0YXRpYyBmb3IgdGhlIHdob2xlIGxpZmV0aW1lIG9mIHRoYXQgVk0uCklmIHlvdSBhcmUgZGVz aWduaW5nIGEgc3lzdGVtIHdoaWNoIG5lZWRzIHRoZXNlIHJlc29sdXRpb25zCnRvIGNoYW5nZSBh dCBydW4tdGltZSB0aGVuIHRoaXMgY2FuIGJlIGRvbmU6CjEuIEJhY2tlbmQgY2hhbmdlcyB0aGUg c3RhdGUgb2YgdGhlIGZyb250ZW5kIHRvIFhlbmJ1c1N0YXRlQ2xvc2VkIHN0YXRlCjIuIFhlbiAo eGwvbGlieGwpIG9yIGJhY2tlbmQgY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIGluIFhlblN0b3Jl CjMuIEJhY2tlbmQgcmUtaW5pdGlhbGl6ZXMgdGhlIGZyb250ZW5kIHdoaWNoIHJlYWRzIG5ldyBj b25maWd1cmF0aW9uCj4KPiBXaGF0IGlzIGFsc28gbWlzc2luZyBoZXJlIGlzIGEgd2F5IHRvIHJl cG9ydCBwaXhlbCBhc3BlY3QgcmF0aW86IFBBTCBhbmQKPiBOVFNDLWJhc2VkIHZpZGVvIG1hdGVy aWFsIGRvZXNuJ3QgaGF2ZSBzcXVhcmUgcGl4ZWxzLgpIbSwgaW5kZWVkLCB0aGFuayB5b3UuIEkn bGwgcHV0IHRoaXMgYXMgYSBmcmFjdGlvbiB1bmRlcgp0aGUgY29ycmVzcG9uZGluZyAncmVzb2x1 dGlvbic6CgpOb3c6Ci9sb2NhbC9kb21haW4vMi9kZXZpY2UvdmNhbWVyYS8wL2Zvcm1hdHMvWVVZ Vi82NDB4NDgwID0gIjMwLzEsMTUvMSwxNS8yIgovbG9jYWwvZG9tYWluLzIvZGV2aWNlL3ZjYW1l cmEvMC9mb3JtYXRzL1lVWVYvMTI4MHgxMDI0ID0gIjAxNS8yIgoKV2lsbCBjaGFuZ2UgdG86Ci9s b2NhbC9kb21haW4vMi9kZXZpY2UvdmNhbWVyYS8wL2Zvcm1hdHMvWVVZVi82NDB4NDgwL2ZyYW1l cmF0ZXMvID0gCiIzMC8xLDE1LzEsMTUvMiIKL2xvY2FsL2RvbWFpbi8yL2RldmljZS92Y2FtZXJh LzAvZm9ybWF0cy9ZVVlWLzY0MHg0ODAvYXNwZWN0cmF0aW8gPSAiMS8xIgoKL2xvY2FsL2RvbWFp bi8yL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9ZVVlWLzEyODB4MTAyNC9mcmFtZXJhdGVzID0g IjAxNS8yIgovbG9jYWwvZG9tYWluLzIvZGV2aWNlL3ZjYW1lcmEvMC9mb3JtYXRzL1lVWVYvMTI4 MHgxMDI0L2FzcGVjdHJhdGlvID0gCiI1OS81OCIKCj4KPiBJdCdzIGltcG9ydGFudCB0byBkZWNp ZGUgd2hldGhlciBvciBub3QgeW91IHdhbnQgdG8gc3VwcG9ydCB2aWRlbyBzb3VyY2VzCj4gbGlr ZSB0aGF0IChIRE1JLCBDb21wb3NpdGUvUy1WaWRlbyBpbnB1dHMsIFVTQiBwb3J0cyB3aGVyZSB1 c2VycyBjYW4gY29ubmVjdAo+IG9yIGRpc2Nvbm5lY3Qgd2ViY2Ftcykgb3IgaWYgeW91IHN0aWNr IHRvIGZpeGVkIGNhbWVyYSBwaXBlbGluZXMuCkkgYmVsaWV2ZSB0aGF0IHRoaXMgaXMgYWxsIGhp ZGRlbiBmcm9tIHRoZSBmcm9udGVuZCBieSB0aGUKYmFja2VuZCwgc28gSSBzZSBub3RoaW5nIHdl IGhhdmUgdG8gcHV0IGluIHRoZSBwcm90b2NvbAp3aXRoIHRoaXMgcmVzcGVjdC4KPgo+IFRoZSBi aWcgZGlmZmVyZW5jZSBpcyB0aGF0IHlvdSBkb24ndCBjb250cm9sIHdoYXQgc29tZW9uZSBjYW4g Y29ubmVjdCBhcwo+IGV4dGVybmFsIHNvdXJjZXMsIHNvIHlvdSB3aWxsIGhhdmUgdG8gYmUgYSBs b3QgbW9yZSBjYXJlZnVsIGFuZCByb2J1c3QuCj4KPiBJIHN1c3BlY3QgdGhhdCB5b3UgbGlrZWx5 IHdpbGwgd2FudCB0byBzdXBwb3J0IHN1Y2ggc291cmNlcyBldmVudHVhbGx5LCBzbwo+IGl0IHBh eXMgdG8gZGVzaWduIHRoaXMgd2l0aCB0aGF0IGluIG1pbmQuCkFnYWluLCBJIHRoaW5rIHRoYXQg dGhpcyBpcyB0aGUgYmFja2VuZCB0byBoaWRlIHRoZXNlCnVzZS1jYXNlcyBmcm9tIHRoZSBmcm9u dGVuZC4KPgo+PiArICoKPj4gKyAqIGZyYW1lLXJhdGVzCj4+ICsgKiAgICAgIFZhbHVlczogICAg ICAgICA8bnVtZXJhdG9yLCB1aW50MzJfdD4vPGRlbm9taW5hdG9yLCB1aW50MzJfdD4KPj4gKyAq Cj4+ICsgKiAgICAgIExpc3Qgb2YgWEVOQ0FNRVJBX0ZSQU1FX1JBVEVfU0VQQVJBVE9SIHNlcGFy YXRlZCBzdXBwb3J0ZWQgZnJhbWUgcmF0ZXMKPj4gKyAqICAgICAgb2YgdGhlIGNhbWVyYSBleHBy ZXNzZWQgYXMgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBvZiB0aGUKPj4gKyAqICAgICAgY29y cmVzcG9uZGluZyBmcmFtZSByYXRlLgo+PiArICoKPj4gKyAqIFRoZSBmb3JtYXQgb2YgdGhlIDxm b3JtYXRzPiBkaXJlY3RvcnkgdHJlZSB3aXRoIHJlc29sdXRpb25zIGFuZCBmcmFtZSByYXRlcwo+ PiArICogbXVzdCBiZSBzdHJ1Y3R1cmVkIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0Ogo+PiArICoK Pj4gKyAqIC4uLi92Y2FtZXJhLzxkZXYtaWQ+Lzxmb3JtYXRbaV0+LzxyZXNvbHV0aW9uW2pdPi88 ZnJhbWUtcmF0ZXNba10+Cj4+ICsgKgo+PiArICogd2hlcmUKPj4gKyAqICBpIC0gaS10aCBzdXBw b3J0ZWQgcGl4ZWwgZm9ybWF0Cj4+ICsgKiAgaiAtIGotdGggc3VwcG9ydGVkIHJlc29sdXRpb24g Zm9yIGktdGggcGl4ZWwgZm9ybWF0Cj4+ICsgKiAgayAtIGstdGggc3VwcG9ydGVkIGZyYW1lIHJh dGUgZm9yIGktdGggcGl4ZWwgZm9ybWF0IGFuZCBqLXRoCj4+ICsgKiAgICAgIHJlc29sdXRpb24+ ICsgKgo+PiArICotLS0tLS0tLS0tLS0tLS0tLS0tIENhbWVyYSBSZXF1ZXN0IFRyYW5zcG9ydCBQ YXJhbWV0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+PiArICoKPj4gKyAqIFRoaXMgY29tbXVu aWNhdGlvbiBwYXRoIGlzIHVzZWQgdG8gZGVsaXZlciByZXF1ZXN0cyBmcm9tIGZyb250ZW5kIHRv IGJhY2tlbmQKPj4gKyAqIGFuZCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VzIGZyb20g YmFja2VuZCB0byBmcm9udGVuZCwKPj4gKyAqIHNldCB1cCBwZXIgdmlydHVhbCBjYW1lcmEgZGV2 aWNlLgo+PiArICoKPj4gKyAqIHJlcS1ldmVudC1jaGFubmVsCj4+ICsgKiAgICAgIFZhbHVlczog ICAgICAgICA8dWludDMyX3Q+Cj4+ICsgKgo+PiArICogICAgICBUaGUgaWRlbnRpZmllciBvZiB0 aGUgWGVuIGNhbWVyYSdzIGNvbnRyb2wgZXZlbnQgY2hhbm5lbAo+PiArICogICAgICB1c2VkIHRv IHNpZ25hbCBhY3Rpdml0eSBpbiB0aGUgcmluZyBidWZmZXIuCj4+ICsgKgo+PiArICogcmVxLXJp bmctcmVmCj4+ICsgKiAgICAgIFZhbHVlczogICAgICAgICA8dWludDMyX3Q+Cj4+ICsgKgo+PiAr ICogICAgICBUaGUgWGVuIGdyYW50IHJlZmVyZW5jZSBncmFudGluZyBwZXJtaXNzaW9uIGZvciB0 aGUgYmFja2VuZCB0byBtYXAKPj4gKyAqICAgICAgYSBzb2xlIHBhZ2Ugb2YgY2FtZXJhJ3MgY29u dHJvbCByaW5nIGJ1ZmZlci4KPj4gKyAqCj4+ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tIENhbWVy YSBFdmVudCBUcmFuc3BvcnQgUGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+ICsg Kgo+PiArICogVGhpcyBjb21tdW5pY2F0aW9uIHBhdGggaXMgdXNlZCB0byBkZWxpdmVyIGFzeW5j aHJvbm91cyBldmVudHMgZnJvbSBiYWNrZW5kCj4+ICsgKiB0byBmcm9udGVuZCwgc2V0IHVwIHBl ciB2aXJ0dWFsIGNhbWVyYSBkZXZpY2UuCj4+ICsgKgo+PiArICogZXZ0LWV2ZW50LWNoYW5uZWwK Pj4gKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDx1aW50MzJfdD4KPj4gKyAqCj4+ICsgKiAgICAg IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYZW4gY2FtZXJhJ3MgZXZlbnQgY2hhbm5lbAo+PiArICog ICAgICB1c2VkIHRvIHNpZ25hbCBhY3Rpdml0eSBpbiB0aGUgcmluZyBidWZmZXIuCj4+ICsgKgo+ PiArICogZXZ0LXJpbmctcmVmCj4+ICsgKiAgICAgIFZhbHVlczogICAgICAgICA8dWludDMyX3Q+ Cj4+ICsgKgo+PiArICogICAgICBUaGUgWGVuIGdyYW50IHJlZmVyZW5jZSBncmFudGluZyBwZXJt aXNzaW9uIGZvciB0aGUgYmFja2VuZCB0byBtYXAKPj4gKyAqICAgICAgYSBzb2xlIHBhZ2Ugb2Yg Y2FtZXJhJ3MgZXZlbnQgcmluZyBidWZmZXIuCj4+ICsgKi8KPj4gKwo+PiArLyoKPj4gKyAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKPj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNU QVRFIERJQUdSQU1TCj4+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4+ICsgKgo+PiArICogVG9v bCBzdGFjayBjcmVhdGVzIGZyb250IGFuZCBiYWNrIHN0YXRlIG5vZGVzIHdpdGggaW5pdGlhbCBz dGF0ZQo+PiArICogWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcuCj4+ICsgKiBUb29sIHN0YWNrIGNy ZWF0ZXMgYW5kIHNldHMgdXAgZnJvbnRlbmQgY2FtZXJhIGNvbmZpZ3VyYXRpb24KPj4gKyAqIG5v ZGVzIHBlciBkb21haW4uCj4+ICsgKgo+PiArICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLSBOb3JtYWwgZmxvdyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+PiArICoK Pj4gKyAqIEZyb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrCj4+ICsgKiA9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQo+PiArICogWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcgICAgICAgICAg ICAgIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nCj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIG8gUXVlcnkgYmFja2VuZCBkZXZpY2UgaWRlbnRpZmljYXRpb24KPj4g KyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLgo+PiArICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIE9wZW4gYW5kIHZhbGlkYXRl IGJhY2tlbmQgZGV2aWNlLgo+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8Cj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwKPj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgVgo+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFhlbmJ1c1N0YXRlSW5pdFdhaXQKPj4gKyAqCj4+ICsgKiBvIFF1ZXJ5IGZyb250ZW5kIGNvbmZp Z3VyYXRpb24KPj4gKyAqIG8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUKPj4gKyAqICAgZXZlbnQg Y2hhbm5lbHMgcGVyIGNvbmZpZ3VyZWQKPj4gKyAqICAgY2FtZXJhLgo+PiArICogbyBQdWJsaXNo IHRyYW5zcG9ydCBwYXJhbWV0ZXJzCj4+ICsgKiAgIHRoYXQgd2lsbCBiZSBpbiBlZmZlY3QgZHVy aW5nCj4+ICsgKiAgIHRoaXMgY29ubmVjdGlvbi4KPj4gKyAqICAgICAgICAgICAgICB8Cj4+ICsg KiAgICAgICAgICAgICAgfAo+PiArICogICAgICAgICAgICAgIFYKPj4gKyAqIFhlbmJ1c1N0YXRl SW5pdGlhbGlzZWQKPj4gKyAqCj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIG8gUXVlcnkgZnJvbnRlbmQgdHJhbnNwb3J0IHBhcmFtZXRlcnMuCj4+ICsgKiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gQ29ubmVjdCB0byB0aGUgZXZlbnQg Y2hhbm5lbHMuCj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwKPj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfAo+PiArICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBWCj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVuYnVz U3RhdGVDb25uZWN0ZWQKPj4gKyAqCj4+ICsgKiAgbyBDcmVhdGUgYW5kIGluaXRpYWxpemUgT1MK Pj4gKyAqICAgIHZpcnR1YWwgY2FtZXJhIGFzIHBlcgo+PiArICogICAgY29uZmlndXJhdGlvbi4K Pj4gKyAqICAgICAgICAgICAgICB8Cj4+ICsgKiAgICAgICAgICAgICAgfAo+PiArICogICAgICAg ICAgICAgIFYKPj4gKyAqIFhlbmJ1c1N0YXRlQ29ubmVjdGVkCj4+ICsgKgo+PiArICogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhlbmJ1c1N0YXRlVW5rbm93bgo+PiArICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhlbmJ1c1N0YXRlQ2xvc2VkCj4+ ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVDbG9z aW5nCj4+ICsgKiBvIFJlbW92ZSB2aXJ0dWFsIGNhbWVyYSBkZXZpY2UKPj4gKyAqIG8gUmVtb3Zl IGV2ZW50IGNoYW5uZWxzCj4+ICsgKiAgICAgICAgICAgICAgfAo+PiArICogICAgICAgICAgICAg IHwKPj4gKyAqICAgICAgICAgICAgICBWCj4+ICsgKiBYZW5idXNTdGF0ZUNsb3NlZAo+PiArICoK Pj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWNvdmVyeSBmbG93IC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4gKyAqCj4+ICsgKiBJbiBjYXNlIG9mIGZyb250 ZW5kIHVucmVjb3ZlcmFibGUgZXJyb3JzIGJhY2tlbmQgaGFuZGxlcyB0aGF0IGFzCj4+ICsgKiBp ZiBmcm9udGVuZCBnb2VzIGludG8gdGhlIFhlbmJ1c1N0YXRlQ2xvc2VkIHN0YXRlLgo+PiArICoK Pj4gKyAqIEluIGNhc2Ugb2YgYmFja2VuZCB1bnJlY292ZXJhYmxlIGVycm9ycyBmcm9udGVuZCB0 cmllcyByZW1vdmluZwo+PiArICogdGhlIHZpcnR1YWxpemVkIGRldmljZS4gSWYgdGhpcyBpcyBw b3NzaWJsZSBhdCB0aGUgbW9tZW50IG9mIGVycm9yLAo+PiArICogdGhlbiBmcm9udGVuZCBnb2Vz IGludG8gdGhlIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nIHN0YXRlIGFuZCBpcyByZWFkeSBmb3IK Pj4gKyAqIG5ldyBjb25uZWN0aW9uIHdpdGggYmFja2VuZC4gSWYgdGhlIHZpcnR1YWxpemVkIGRl dmljZSBpcyBzdGlsbCBpbiB1c2UgYW5kCj4+ICsgKiBjYW5ub3QgYmUgcmVtb3ZlZCwgdGhlbiBm cm9udGVuZCBnb2VzIGludG8gdGhlIFhlbmJ1c1N0YXRlUmVjb25maWd1cmluZyBzdGF0ZQo+PiAr ICogdW50aWwgZWl0aGVyIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UgaXMgcmVtb3ZlZCBvciBiYWNr ZW5kIGluaXRpYXRlcyBhIG5ldwo+PiArICogY29ubmVjdGlvbi4gT24gdGhlIHZpcnR1YWxpemVk IGRldmljZSByZW1vdmFsIGZyb250ZW5kIGdvZXMgaW50byB0aGUKPj4gKyAqIFhlbmJ1c1N0YXRl SW5pdGlhbGlzaW5nIHN0YXRlLgo+PiArICoKPj4gKyAqIE5vdGUgb24gWGVuYnVzU3RhdGVSZWNv bmZpZ3VyaW5nIHN0YXRlIG9mIHRoZSBmcm9udGVuZDogaWYgYmFja2VuZCBoYXMKPj4gKyAqIHVu cmVjb3ZlcmFibGUgZXJyb3JzIHRoZW4gZnJvbnRlbmQgY2Fubm90IHNlbmQgcmVxdWVzdHMgdG8g dGhlIGJhY2tlbmQKPj4gKyAqIGFuZCB0aHVzIGNhbm5vdCBwcm92aWRlIGZ1bmN0aW9uYWxpdHkg b2YgdGhlIHZpcnR1YWxpemVkIGRldmljZSBhbnltb3JlLgo+PiArICogQWZ0ZXIgYmFja2VuZCBp cyBiYWNrIHRvIG5vcm1hbCB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlIG1heSBzdGlsbCBob2xkIHNv bWUKPj4gKyAqIHN0YXRlOiBjb25maWd1cmF0aW9uIGluIHVzZSwgYWxsb2NhdGVkIGJ1ZmZlcnMs IGNsaWVudCBhcHBsaWNhdGlvbiBzdGF0ZSBldGMuCj4+ICsgKiBJbiBtb3N0IGNhc2VzLCB0aGlz IHdpbGwgcmVxdWlyZSBmcm9udGVuZCB0byBpbXBsZW1lbnQgY29tcGxleCByZWNvdmVyeQo+PiAr ICogcmVjb25uZWN0IGxvZ2ljLiBJbnN0ZWFkLCBieSBnb2luZyBpbnRvIFhlbmJ1c1N0YXRlUmVj b25maWd1cmluZyBzdGF0ZSwKPj4gKyAqIGZyb250ZW5kIHdpbGwgbWFrZSBzdXJlIG5vIG5ldyBj bGllbnRzIG9mIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UgYXJlCj4+ICsgKiBhY2NlcHRlZCwgYWxs b3cgZXhpc3RpbmcgY2xpZW50KHMpIHRvIGV4aXQgZ3JhY2VmdWxseSBieSBzaWduYWxpbmcgZXJy b3IKPj4gKyAqIHN0YXRlIGV0Yy4KPj4gKyAqIE9uY2UgYWxsIHRoZSBjbGllbnRzIGFyZSBnb25l IGZyb250ZW5kIGNhbiByZWluaXRpYWxpemUgdGhlIHZpcnR1YWxpemVkCj4+ICsgKiBkZXZpY2Ug YW5kIGdldCBpbnRvIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nIHN0YXRlIGFnYWluIHNpZ25hbGlu ZyB0aGUKPj4gKyAqIGJhY2tlbmQgdGhhdCBhIG5ldyBjb25uZWN0aW9uIGNhbiBiZSBtYWRlLgo+ PiArICoKPj4gKyAqIFRoZXJlIGFyZSBtdWx0aXBsZSBjb25kaXRpb25zIHBvc3NpYmxlIHVuZGVy IHdoaWNoIGZyb250ZW5kIHdpbGwgZ28gZnJvbQo+PiArICogWGVuYnVzU3RhdGVSZWNvbmZpZ3Vy aW5nIGludG8gWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcsIHNvbWUgb2YgdGhlbSBhcmUgT1MKPj4g KyAqIHNwZWNpZmljLiBGb3IgZXhhbXBsZToKPj4gKyAqIDEuIFRoZSB1bmRlcmx5aW5nIE9TIGZy YW1ld29yayBtYXkgcHJvdmlkZSBjYWxsYmFja3MgdG8gc2lnbmFsIHRoYXQgdGhlIGxhc3QKPj4g KyAqICAgIGNsaWVudCBvZiB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlIGhhcyBnb25lIGFuZCB0aGUg ZGV2aWNlIGNhbiBiZSByZW1vdmVkCj4+ICsgKiAyLiBGcm9udGVuZCBjYW4gc2NoZWR1bGUgYSBk ZWZlcnJlZCB3b3JrICh0aW1lci90YXNrbGV0L3dvcmtxdWV1ZSkKPj4gKyAqICAgIHRvIHBlcmlv ZGljYWxseSBjaGVjayBpZiB0aGlzIGlzIHRoZSByaWdodCB0aW1lIHRvIHJlLXRyeSByZW1vdmFs IG9mCj4+ICsgKiAgICB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlLgo+PiArICogMy4gQnkgYW55IG90 aGVyIG1lYW5zLgo+PiArICoKPj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPj4gKyAqICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBSRVFVRVNUIENPREVTCj4+ICsgKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqCj4+ICsgKi8KPj4gKyNkZWZpbmUgWEVOQ0FNRVJBX09QX1NFVF9DT05GSUcgICAgICAg IDB4MDAKPj4gKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0dFVF9CVUZfREVUQUlMUyAgIDB4MDEKPj4g KyNkZWZpbmUgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUgICAgICAgIDB4MDIKPj4gKyNkZWZpbmUg WEVOQ0FNRVJBX09QX0JVRl9ERVNUUk9ZICAgICAgIDB4MDMKPj4gKyNkZWZpbmUgWEVOQ0FNRVJB X09QX1NUUkVBTV9TVEFSVCAgICAgIDB4MDQKPj4gKyNkZWZpbmUgWEVOQ0FNRVJBX09QX1NUUkVB TV9TVE9QICAgICAgIDB4MDUKPj4gKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0dFVF9DVFJMX0RFVEFJ TFMgIDB4MDYKPj4gKyNkZWZpbmUgWEVOQ0FNRVJBX09QX1NFVF9DVFJMICAgICAgICAgIDB4MDcK SSBhbSB0aGlua2luZyBhYm91dCBleHRlbmRpbmcgdGhlIGNvbW1hbmQgc2V0IGEgYml0IGFzIGl0 IGFscmVhZHkKaGFzIHNvbWUgZmxhd3MsIGUuZy4gdGhlcmUgaXMgbm8gd2F5IGZvciBhIFZNIHRv IHRlbGwgdGhlIGJhY2tlbmQKdGhhdCB0aGUgYnVmZmVyIGlzIG5vdCBpbiB1c2UgYW55bW9yZSBh bmQgY2FuIGJlIGdpdmVuIGJhY2sKdG8gdGhlIHJlYWwgSFcgZHJpdmVyLCBlLmcuIHF1ZXVlL2Rl cXVldWUgaW4gVjRMMiB0ZXJtczoKCiNkZWZpbmUgWEVOQ0FNRVJBX09QX1NFVF9GT1JNQVTCoMKg wqDCoMKgwqDCoCAweDAwCi0gd2lsbCBiZSB1c2VkIHRvIHNldCBmb3JtYXQ6IHBpeGVsIGZvcm1h dCwgcmVzb2x1dGlvbgoKI2RlZmluZSBYRU5DQU1FUkFfT1BfU0VUX0ZSQU1FX1JBVEXCoMKgwqAg MHgwMQotIHVzZWQgdG8gc2V0IHRoZSBmcmFtZSByYXRlCgojZGVmaW5lIFhFTkNBTUVSQV9PUF9C VUZfUkVRVUVTVMKgwqDCoMKgwqDCoCAweDAyCi0gYXNrcyBiYWNrZW5kIHRvIGFsbG9jYXRlIHRo ZSBnaXZlbiBudW1iZXIgb2YgYnVmZmVycywKYmFja2VuZCByZXBsaWVzIHdpdGggcmVhbCBudW1i ZXIgb2YgdGhvc2UgdG8gYmUgdXNlZAoKI2RlZmluZSBYRU5DQU1FUkFfT1BfQlVGX0NSRUFURcKg wqDCoMKgwqDCoMKgIDB4MDMKLSBjcmVhdGUgYSBzaGFyZWQgYnVmZmVyCgojZGVmaW5lIFhFTkNB TUVSQV9PUF9CVUZfREVTVFJPWcKgwqDCoMKgwqDCoCAweDA0Ci0gZGVzdHJveSBhIHNoYXJlZCBi dWZmZXIKCiNkZWZpbmUgWEVOQ0FNRVJBX09QX0JVRl9RVUVVRcKgwqDCoMKgwqDCoMKgwqAgMHgw NQotIFZNIHRlbGxzIHRoZSBiYWNrZW5kIHRoYXQgaXQgaGFzIGFjY2VzcyB0byB0aGUgc2hhcmVk IGJ1ZmZlcgphbmQgdGhlIGJ1ZmZlciBjYW5ub3QgYmUgc2VudCBiYWNrIHRvIHJlYWwgSFcgZHJp dmVyCgojZGVmaW5lIFhFTkNBTUVSQV9PUF9CVUZfREVRVUVVRcKgwqDCoMKgwqDCoCAweDA2Ci0g Vk0gdGVsbHMgdGhlIGJhY2tlbmQgdGhhdCB0aGUgc2hhcmVkIGJ1ZmZlciBpcyBub3QgaW4gdXNl IGFuZApjYW4gYmUgc2VudCB0byByZWFsIEhXIGRyaXZlcgoKI2RlZmluZSBYRU5DQU1FUkFfT1Bf Q1RSTF9FTlVNwqDCoMKgwqDCoMKgwqDCoCAweDA3Ci0gZ2V0IGktdGggY29udHJvbCByYW5nZXMg YW5kIHNldHRpbmdzCgojZGVmaW5lIFhFTkNBTUVSQV9PUF9DVFJMX0dFVMKgwqDCoMKgwqDCoMKg wqDCoCAweDA4Ci0gZ2V0IGNvbnRyb2wgdmFsdWUKCiNkZWZpbmUgWEVOQ0FNRVJBX09QX0NUUkxf U0VUwqDCoMKgwqDCoMKgwqDCoMKgIDB4MDkKLSBzZXQgY29udHJvbCB2YWx1ZQoKI2RlZmluZSBY RU5DQU1FUkFfT1BfU1RSRUFNX1NUQVJUwqDCoMKgwqDCoCAweDBhCi0gc3RhcnQgc3RyZWFtaW5n CgojZGVmaW5lIFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RPUMKgwqDCoMKgwqDCoCAweDBiCi0gc3Rv cCBjdHJlYW1pbmcKCgo+PiArCj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0JSSUdIVE5FU1Mg ICAgICAweDAwCj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0NPTlRSQVNUICAgICAgICAweDAx Cj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX1NBVFVSQVRJT04gICAgICAweDAyCj4+ICsjZGVm aW5lIFhFTkNBTUVSQV9DVFJMX0hVRSAgICAgICAgICAgICAweDAzCj4+ICsKPj4gKy8qCj4+ICsg KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEVWRU5UIENPREVTCj4+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4+ICsgKi8KPj4gKyNk ZWZpbmUgWEVOQ0FNRVJBX0VWVF9GUkFNRV9BVkFJTCAgICAgIDB4MDAKPj4gKwo+PiArLyoKPj4g KyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKPj4gKyAqICAgICAgICAgICAgICAgWEVOU1RPUkUgRklF TEQgQU5EIFBBVEggTkFNRSBTVFJJTkdTLCBIRUxQRVJTCj4+ICsgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCj4+ICsgKi8KPj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0RSSVZFUl9OQU1FICAgICAgICAgICJ2 Y2FtZXJhIgo+IEFoLCB0aGF0J3Mgd2hlcmUgdmNhbWVyYSBjb21lcyBmcm9tLiBIb3cgYWJvdXQg Y2FsbGluZyB0aGlzIHhlbi1jYW1lcmEgb3IKPiB2aXJ0LWNhbWVyYT8gV2l0aCBhIHByZWZlcmVu Y2UgZm9yIHhlbi1jYW1lcmEsIHNpbmNlIHRoYXQncyB3aGF0IHlvdSB1c2UgZm9yIHRoZQo+IGRl ZmluZXMgYXMgd2VsbC4KPgo+IE9yIHBlcmhhcHMgcHYtY2FtZXJhPwo+Cj4gSXMgdGhpcyBkcml2 ZXIgZ29pbmcgdG8gYmUgeGVuLXNwZWNpZmljLCBvciBtb3JlIGEgZ2VuZXJhbCBhcHByb2FjaCB0 aGF0IGV2ZXJ5b25lCj4gY2FuIHVzZT8gT2J2aW91c2x5LCB0aGUgbGF0dGVyIHdvdWxkIGJlIHBy ZWZlcmFibGUuCkFzIEkgaGF2ZSBhbHJlYWR5IHJlcGxpZWQgdG8gdGhlIGNvdmVyIGxldHRlciB3 aXRoIGV4cGxhbmF0aW9uczoKJ3YnIHN0YW5kcyBmb3IgJ3ZpcnR1YWwnIGFuZCB0aGVyZSBpcyBh IGNvbnZlbnRpb24gdG8gbmFtZSB0aGUKWGVuIHZpcnR1YWwgZGV2aWNlcyBzdGFydGluZyB3aXRo ICd2JzogdmlmLCB2a2JkIGV0Yy4KPgo+IEJUVywgSSBhbSBub3Qgc3VyZSBpZiB5b3UgYXJlIGF3 YXJlIG9mIHRoaXMsIGJ1dCB0aGUgVjRMMiBBUEkgYWxzbyBoYXMgc3VwcG9ydCBmb3IKPiByYWRp byBhbmQgUkRTIGhhcmR3YXJlLiBDb250YWN0IG1lIGlmIHRoaXMgaXMgb2YgaW50ZXJlc3QgdG8g WGVuIHRvIHN1cHBvcnQgdGhpcyBhcwo+IHdlbGwgZ2l2ZW4gdGhlIGF1dG9tb3RpdmUgdXNlLWNh c2UuClllcywgdGhhbmsgeW91LCBidXQgYXQgdGhpcyBzdGFnZSB3ZSBhcmUgdGFyZ2V0aW5nIGNh bWVyYSBvbmx5LgpSYWRpbyBjYW4gYmUgYW5vdGhlciB0b3BpYyBpZiB0aW1lIGFsbG93cyA7KSBB bmQgbW9zdCBwcm9iYWJseQppdCB3aWxsIGJlIGEgZGVkaWNhdGVkICd2cmFkaW8nIHByb3RvY29s IHRoZW4uLi4KPgo+PiArCj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9MSVNUX1NFUEFSQVRPUiAgICAg ICAiLCIKPj4gKyNkZWZpbmUgWEVOQ0FNRVJBX1JFU09MVVRJT05fU0VQQVJBVE9SICJ4Igo+PiAr I2RlZmluZSBYRU5DQU1FUkFfRlJBTUVfUkFURV9TRVBBUkFUT1IgIi8iCj4+ICsKPj4gKyNkZWZp bmUgWEVOQ0FNRVJBX0ZJRUxEX0JFX1ZFUlNJT05TICAgICJ2ZXJzaW9ucyIKPj4gKyNkZWZpbmUg WEVOQ0FNRVJBX0ZJRUxEX0ZFX1ZFUlNJT04gICAgICJ2ZXJzaW9uIgo+PiArI2RlZmluZSBYRU5D QU1FUkFfRklFTERfUkVRX1JJTkdfUkVGICAgInJlcS1yaW5nLXJlZiIKPj4gKyNkZWZpbmUgWEVO Q0FNRVJBX0ZJRUxEX1JFUV9DSEFOTkVMICAgICJyZXEtZXZlbnQtY2hhbm5lbCIKPj4gKyNkZWZp bmUgWEVOQ0FNRVJBX0ZJRUxEX0VWVF9SSU5HX1JFRiAgICJldnQtcmluZy1yZWYiCj4+ICsjZGVm aW5lIFhFTkNBTUVSQV9GSUVMRF9FVlRfQ0hBTk5FTCAgICAiZXZ0LWV2ZW50LWNoYW5uZWwiCj4+ ICsjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9DT05UUk9MUyAgICAgICAiY29udHJvbHMiCj4+ICsj ZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9GT1JNQVRTICAgICAgICAiZm9ybWF0cyIKPj4gKyNkZWZp bmUgWEVOQ0FNRVJBX0ZJRUxEX0JFX0FMTE9DICAgICAgICJiZS1hbGxvYyIKPj4gKyNkZWZpbmUg WEVOQ0FNRVJBX0ZJRUxEX1VOSVFVRV9JRCAgICAgICJ1bmlxdWUtaWQiCj4+ICsKPj4gKyNkZWZp bmUgWEVOQ0FNRVJBX0NUUkxfQlJJR0hUTkVTU19TVFIgICJicmlnaHRuZXNzIgo+PiArI2RlZmlu ZSBYRU5DQU1FUkFfQ1RSTF9DT05UUkFTVF9TVFIgICAgImNvbnRyYXN0Igo+PiArI2RlZmluZSBY RU5DQU1FUkFfQ1RSTF9TQVRVUkFUSU9OX1NUUiAgInNhdHVyYXRpb24iCj4+ICsjZGVmaW5lIFhF TkNBTUVSQV9DVFJMX0hVRV9TVFIgICAgICAgICAiaHVlIgo+PiArCj4+ICsvKiBNYXhpbXVtIG51 bWJlciBvZiBidWZmZXIgcGxhbmVzIHN1cHBvcnRlZC4gKi8KPj4gKyNkZWZpbmUgWEVOQ0FNRVJB X01BWF9QTEFORSAgICAgICAgICAgIDQKPj4gKwo+PiArLyoKPj4gKyAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioKPj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUVVMgUkVUVVJOIENPREVT Cj4+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCj4+ICsgKgo+PiArICogU3RhdHVzIHJldHVybiBj b2RlIGlzIHplcm8gb24gc3VjY2VzcyBhbmQgLVhFTl9FWFggb24gZmFpbHVyZS4KPj4gKyAqCj4+ ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCj4+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEFzc3VtcHRpb25zCj4+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4+ICsgKgo+PiArICog LSB1c2FnZSBvZiBncmFudCByZWZlcmVuY2UgMCBhcyBpbnZhbGlkIGdyYW50IHJlZmVyZW5jZToK Pj4gKyAqICAgZ3JhbnQgcmVmZXJlbmNlIDAgaXMgdmFsaWQsIGJ1dCBuZXZlciBleHBvc2VkIHRv IGEgUFYgZHJpdmVyLAo+PiArICogICBiZWNhdXNlIG9mIHRoZSBmYWN0IGl0IGlzIGFscmVhZHkg aW4gdXNlL3Jlc2VydmVkIGJ5IHRoZSBQViBjb25zb2xlLgo+PiArICogLSBhbGwgcmVmZXJlbmNl cyBpbiB0aGlzIGRvY3VtZW50IHRvIHBhZ2Ugc2l6ZXMgbXVzdCBiZSB0cmVhdGVkCj4+ICsgKiAg IGFzIHBhZ2VzIG9mIHNpemUgWEVOX1BBR0VfU0laRSB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkLgo+ PiArICoKPj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPj4gKyAqICAgICAgIERlc2NyaXB0aW9u IG9mIHRoZSBwcm90b2NvbCBiZXR3ZWVuIGZyb250ZW5kIGFuZCBiYWNrZW5kIGRyaXZlcgo+PiAr ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgo+PiArICoKPj4gKyAqIFRoZSB0d28gaGFsdmVzIG9mIGEg UGFyYS12aXJ0dWFsIGNhbWVyYSBkcml2ZXIgY29tbXVuaWNhdGUgd2l0aAo+PiArICogZWFjaCBv dGhlciB1c2luZyBzaGFyZWQgcGFnZXMgYW5kIGV2ZW50IGNoYW5uZWxzLgo+PiArICogU2hhcmVk IHBhZ2UgY29udGFpbnMgYSByaW5nIHdpdGggcmVxdWVzdC9yZXNwb25zZSBwYWNrZXRzLgo+PiAr ICoKPj4gKyAqIEFsbCByZXNlcnZlZCBmaWVsZHMgaW4gdGhlIHN0cnVjdHVyZXMgYmVsb3cgbXVz dCBiZSAwLgo+PiArICoKPj4gKyAqIEZvciBhbGwgcmVxdWVzdC9yZXNwb25zZS9ldmVudCBwYWNr ZXRzOgo+PiArICogICAtIGZyYW1lIHJhdGUgcGFyYW1ldGVyIGlzIHJlcHJlc2VudGVkIGFzIGEg cGFpciBvZiA0IG9jdGV0IGxvbmcKPj4gKyAqICAgICBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9y Ogo+PiArICogICAgICAgLSBmcmFtZV9yYXRlX251bWVyIC0gdWludDMyX3QsIG51bWVyYXRvciBv ZiB0aGUgZnJhbWUgcmF0ZQo+PiArICogICAgICAgLSBmcmFtZV9yYXRlX2Rlbm9tIC0gdWludDMy X3QsIGRlbm9taW5hdG9yIG9mIHRoZSBmcmFtZSByYXRlCj4+ICsgKiAgICAgVGhlIGNvcnJlc3Bv bmRpbmcgZnJhbWUgcmF0ZSAoSHopIGlzIGNhbGN1bGF0ZWQgYXM6Cj4+ICsgKiAgICAgICBmcmFt ZV9yYXRlID0gZnJhbWVfcmF0ZV9udW1lciAvIGZyYW1lX3JhdGVfZGVub20KPj4gKyAqICAgLSBi dWZmZXIgaW5kZXggaXMgYSB6ZXJvIGJhc2VkIGluZGV4IG9mIHRoZSBidWZmZXIuIE11c3QgYmUg bGVzcyB0aGFuCj4+ICsgKiAgICAgdGhlIHZhbHVlIG9mIFhFTkNBTUVSQV9PUF9TRVRfQ09ORklH Lm51bV9idWZzIHJlc3BvbnNlOgo+PiArICogICAgICAgLSBpbmRleCAtIHVpbnQ4X3QsIGluZGV4 IG9mIHRoZSBidWZmZXIuCj4+ICsgKgo+PiArICoKPj4gKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLSBSZXF1ZXN0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K Pj4gKyAqCj4+ICsgKiBBbGwgcmVxdWVzdCBwYWNrZXRzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoICg2 NCBvY3RldHMpLgo+PiArICogQWxsIHJlcXVlc3QgcGFja2V0cyBoYXZlIGNvbW1vbiBoZWFkZXI6 Cj4+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAg ICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAg ICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8ICAgIG9wZXJhdGlvbiAgIHwgICByZXNlcnZl ZCAgICAgfCA0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4+ICsg KiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSsKPj4gKyAqICAgaWQgLSB1aW50MTZfdCwgcHJpdmF0ZSBndWVzdCB2YWx1 ZSwgZWNob2VkIGluIHJlc3BvbnNlLgo+PiArICogICBvcGVyYXRpb24gLSB1aW50OF90LCBvcGVy YXRpb24gY29kZSwgWEVOQ0FNRVJBX09QX1hYWC4KPj4gKyAqCj4+ICsgKgo+PiArICogUmVxdWVz dCBjb25maWd1cmF0aW9uIHNldC9yZXNldCAtIHJlcXVlc3QgdG8gc2V0IG9yIHJlc2V0Lgo+PiAr ICogdGhlIGNvbmZpZ3VyYXRpb24vbW9kZSBvZiB0aGUgY2FtZXJhOgo+PiArICogICAgICAgICAw ICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAg ICBvY3RldAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgaWQgICAg ICAgICAgICAgICAgfCBfT1BfU0VUX0NPTkZJRyB8ICAgcmVzZXJ2ZWQgICAgIHwgNAo+PiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZl ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAo+PiArICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsIGZvcm1hdCAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgMTIKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDE2Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAo+PiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9yYXRl X251bWVyICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjQKPj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfcmF0ZV9kZW5vbSAgICAgICAg ICAgICAgICAgICAgICAgICB8IDI4Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgbnVt X2J1ZnMgICAgfCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAg ICAgfCAzMgo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzYKPj4gKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKwo+PiArICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4g KyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCA2NAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKgo+PiArICogUGFz cyBhbGwgemVyb3MgdG8gcmVzZXQsIG90aGVyd2lzZSBjb21tYW5kIGlzIHRyZWF0ZWQgYXMgY29u ZmlndXJhdGlvbiBzZXQuCj4+ICsgKgo+PiArICogcGl4ZWxfZm9ybWF0IC0gdWludDMyX3QsIHBp eGVsIGZvcm1hdCB0byBiZSB1c2VkLCBGT1VSQ0MgY29kZS4KPj4gKyAqIHdpZHRoIC0gdWludDMy X3QsIHdpZHRoIGluIHBpeGVscy4KPj4gKyAqIGhlaWdodCAtIHVpbnQzMl90LCBoZWlnaHQgaW4g cGl4ZWxzLgo+PiArICogZnJhbWVfcmF0ZV9udW1lciAtIHVpbnQzMl90LCBudW1lcmF0b3Igb2Yg dGhlIGZyYW1lIHJhdGUuCj4+ICsgKiBmcmFtZV9yYXRlX2Rlbm9tIC0gdWludDMyX3QsIGRlbm9t aW5hdG9yIG9mIHRoZSBmcmFtZSByYXRlLgo+IElmIHlvdSBoYXZlIHRvIHN1cHBvcnQgSERNSS9T RFRWIGlucHV0cyBhcyB3ZWxsLCB0aGVuIHlvdSBhbHNvIG5lZWQgdG8ga25vdwo+IHRoZSBpbnRl cmxhY2VkIGZvcm1hdCwgdW5sZXNzIHlvdSBoYXZlIG5vIHBsYW5zIHRvIHN1cHBvcnQgdGhhdC4K Pgo+PiArICogbnVtX2J1ZnMgLSB1aW50OF90LCBkZXNpcmVkIG51bWJlciBvZiBidWZmZXJzIHRv IGJlIHVzZWQuCj4gSHVoPyBXaGF0IGhhcyB0aGF0IHRvIGRvIHdpdGggdGhlIGZvcm1hdD8gV2h5 IHdvdWxkIHlvdSBuZWVkIHRoaXMgaGVyZT8KV2VsbCwgdGhlIG9wZXJhdGlvbiBuYW1lIGlzICdz ZXRfY29uZmlnJywgbm90ICdzZXRfZm9ybWF0JywKc28gSSB0aG91Z2h0IHdlIGNhbiBoYXZlIHN1 Y2ggYSBjdW11bGF0aXZlIGNvbW1hbmQgYXNzZW1ibGluZwphbGwgdGhlIHBhcmFtZXRlcnMgb2Yg dGhlIGNvbmZpZ3VyYXRpb24uIEJ1dCBub3cgSSBhbSBsb29raW5nIGF0CnR1cm5pbmcgdGhpcyBz aW5nbGUgJ3NldF9jb25maWcnIGNvbW1hbmQgdG8gMyBkaWZmZXJlbnQgY29tbWFuZHMsCndoaWNo IGlzIG1vcmUgcHJhY3RpY2FsIGFuZCBhbGlnbmVkIHdpdGggVjRMMiBpbiBwYXJ0aWN1bGFyIChw bGVhc2UKc2VlIGFib3ZlIGluIHRoZSBjb21tYW5kIHNldCk6CjEuIHNldCBmb3JtYXQgY29tbWFu ZDoKIMKgKiBwaXhlbF9mb3JtYXQgLSB1aW50MzJfdCwgcGl4ZWwgZm9ybWF0IHRvIGJlIHVzZWQs IEZPVVJDQyBjb2RlLgogwqAqIHdpZHRoIC0gdWludDMyX3QsIHdpZHRoIGluIHBpeGVscy4KIMKg KiBoZWlnaHQgLSB1aW50MzJfdCwgaGVpZ2h0IGluIHBpeGVscy4KCjIuIFNldCBmcmFtZSByYXRl IGNvbW1hbmQ6CiDCoCsgKiBmcmFtZV9yYXRlX251bWVyIC0gdWludDMyX3QsIG51bWVyYXRvciBv ZiB0aGUgZnJhbWUgcmF0ZS4KIMKgKyAqIGZyYW1lX3JhdGVfZGVub20gLSB1aW50MzJfdCwgZGVu b21pbmF0b3Igb2YgdGhlIGZyYW1lIHJhdGUuCgozLiBTZXQvcmVxdWVzdCBudW0gYnVmczoKIMKg KiBudW1fYnVmcyAtIHVpbnQ4X3QsIGRlc2lyZWQgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgdXNl ZC4KPgo+PiArICoKPj4gKyAqIFNlZSByZXNwb25zZSBmb3JtYXQgZm9yIHRoaXMgcmVxdWVzdC4K Pj4gKyAqCj4+ICsgKiBOb3RlczoKPj4gKyAqICAtIGZyb250ZW5kIG11c3QgY2hlY2sgdGhlIGNv cnJlc3BvbmRpbmcgcmVzcG9uc2UgaW4gb3JkZXIgdG8gc2VlCj4+ICsgKiAgICBpZiB0aGUgdmFs dWVzIHJlcG9ydGVkIGJhY2sgYnkgdGhlIGJhY2tlbmQgZG8gbWF0Y2ggdGhlIGRlc2lyZWQgb25l cwo+PiArICogICAgYW5kIGNhbiBiZSBhY2NlcHRlZC4KPj4gKyAqICAtIGZyb250ZW5kIG1heSBz ZW5kIG11bHRpcGxlIFhFTkNBTUVSQV9PUF9TRVRfQ09ORklHIHJlcXVlc3RzIGJlZm9yZQo+PiAr ICogICAgc2VuZGluZyBYRU5DQU1FUkFfT1BfU1RSRUFNX1NUQVJUIHJlcXVlc3QgdG8gdXBkYXRl IG9yIHR1bmUgdGhlCj4+ICsgKiAgICBjb25maWd1cmF0aW9uLgo+PiArICovCj4+ICtzdHJ1Y3Qg eGVuY2FtZXJhX2NvbmZpZyB7Cj4+ICsgICAgdWludDMyX3QgcGl4ZWxfZm9ybWF0Owo+PiArICAg IHVpbnQzMl90IHdpZHRoOwo+PiArICAgIHVpbnQzMl90IGhlaWdodDsKPj4gKyAgICB1aW50MzJf dCBmcmFtZV9yYXRlX25vbTsKPj4gKyAgICB1aW50MzJfdCBmcmFtZV9yYXRlX2Rlbm9tOwo+PiAr ICAgIHVpbnQ4X3QgbnVtX2J1ZnM7Cj4+ICt9Owo+PiArCj4+ICsvKgo+PiArICogUmVxdWVzdCBi dWZmZXIgZGV0YWlscyAtIHJlcXVlc3QgY2FtZXJhIGJ1ZmZlcidzIG1lbW9yeSBsYXlvdXQuCj4+ ICsgKiBkZXRhaWxlZCBkZXNjcmlwdGlvbjoKPj4gKyAqICAgICAgICAgMCAgICAgICAgICAgICAg ICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPj4gKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHxf R0VUX0JVRl9ERVRBSUxTfCAgIHJlc2VydmVkICAgICB8IDQKPj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDgKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC98Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAo+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+ICsgKgo+PiArICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1 ZXN0Lgo+PiArICoKPj4gKyAqCj4+ICsgKiBSZXF1ZXN0IGNhbWVyYSBidWZmZXIgY3JlYXRpb246 Cj4+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAg ICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAg ICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8IF9PUF9CVUZfQ1JFQVRFIHwgICByZXNlcnZl ZCAgICAgfCA0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4+ICsg KiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICBpbmRleCAgICAgfCAgICAgICAgICAgICAgICAg ICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgfCAxMgo+PiArICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r Cj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZl9kaXJlY3RvcnkgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgMTYKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDIwCj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+PiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZl ZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKPj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ PiArICoKPj4gKyAqIEFuIGF0dGVtcHQgdG8gY3JlYXRlIG11bHRpcGxlIGJ1ZmZlcnMgd2l0aCB0 aGUgc2FtZSBpbmRleCBpcyBhbiBlcnJvci4KPj4gKyAqIGluZGV4IGNhbiBiZSByZS11c2VkIGFm dGVyIGRlc3Ryb3lpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2FtZXJhIGJ1ZmZlci4KPj4gKyAqCj4+ ICsgKiBpbmRleCAtIHVpbnQ4X3QsIGluZGV4IG9mIHRoZSBidWZmZXIgdG8gYmUgY3JlYXRlZC4K Pj4gKyAqIGdyZWZfZGlyZWN0b3J5IC0gZ3JhbnRfcmVmX3QsIGEgcmVmZXJlbmNlIHRvIHRoZSBm aXJzdCBzaGFyZWQgcGFnZQo+PiArICogICBkZXNjcmliaW5nIHNoYXJlZCBidWZmZXIgcmVmZXJl bmNlcy4gVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpcyBlcXVhbCB0bwo+PiArICogICBYRU5DQU1F UkFfT1BfR0VUX0JVRl9ERVRBSUxTLnNpemUgcmVzcG9uc2UuIEF0IGxlYXN0IG9uZSBwYWdlIGV4 aXN0cy4gSWYKPj4gKyAqICAgc2hhcmVkIGJ1ZmZlciBzaXplIGV4Y2VlZHMgd2hhdCBjYW4gYmUg YWRkcmVzc2VkIGJ5IHRoaXMgc2luZ2xlIHBhZ2UsCj4+ICsgKiAgIHRoZW4gcmVmZXJlbmNlIHRv IHRoZSBuZXh0IHNoYXJlZCBwYWdlIG11c3QgYmUgc3VwcGxpZWQgKHNlZQo+PiArICogICBncmVm X2Rpcl9uZXh0X3BhZ2UgYmVsb3cpLgo+IEl0IG1pZ2h0IGJlIGJldHRlciB0byBhbGxvY2F0ZSBh bGwgYnVmZmVycyBpbiBvbmUgZ28sIGkuZS4gd2hhdCBWSURJT0NfUkVRQlVGUwo+IGRvZXMuCldl bGwsIEkgc3RpbGwgdGhpbmsgaXQgaXMgYmV0dGVyIHRvIGhhdmUgYSBwZXIgYnVmZmVyIGludGVy ZmFjZQppbiB0aGUgcHJvdG9jb2wgYXMgaXQgaXMgZG9uZSBmb3Igb3RoZXIgWGVuIHZpcnR1YWwg ZGV2aWNlcy4KU28sIEknbGwga2VlcCB0aGlzIGFzIGlzIGZvciBub3c6IFZJRElPQ19SRVFCVUZT IGNhbiBzdGlsbCBkbwp3aGF0IGl0IGRvZXMgaW50ZXJuYWxseSBpbiB0aGUgZnJvbnRlbmQgZHJp dmVyCj4KPj4gKyAqCj4+ICsgKiBJZiBYRU5DQU1FUkFfRklFTERfQkVfQUxMT0MgY29uZmlndXJh dGlvbiBlbnRyeSBpcyBzZXQsIHRoZW4gYmFja2VuZCB3aWxsCj4+ICsgKiBhbGxvY2F0ZSB0aGUg YnVmZmVyIHdpdGggdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQgaW4gdGhpcyByZXF1ZXN0IGFuZCBw YWdlCj4+ICsgKiBkaXJlY3RvcnkgaXMgaGFuZGxlZCBhcyBmb2xsb3dzOgo+PiArICogICBGcm9u dGVuZCBvbiByZXF1ZXN0Ogo+PiArICogICAgIC0gYWxsb2NhdGVzIHBhZ2VzIGZvciB0aGUgZGly ZWN0b3J5IChncmVmX2RpcmVjdG9yeSwKPj4gKyAqICAgICAgIGdyZWZfZGlyX25leHRfcGFnZShz KQo+PiArICogICAgIC0gZ3JhbnRzIHBlcm1pc3Npb25zIGZvciB0aGUgcGFnZXMgb2YgdGhlIGRp cmVjdG9yeSB0byB0aGUgYmFja2VuZAo+PiArICogICAgIC0gc2V0cyBncmVmX2Rpcl9uZXh0X3Bh Z2UgZmllbGRzCj4+ICsgKiAgIEJhY2tlbmQgb24gcmVzcG9uc2U6Cj4+ICsgKiAgICAgLSBncmFu dHMgcGVybWlzc2lvbnMgZm9yIHRoZSBwYWdlcyBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCB0bwo+ PiArICogICAgICAgdGhlIGZyb250ZW5kCj4+ICsgKiAgICAgLSBmaWxscyBpbiBwYWdlIGRpcmVj dG9yeSB3aXRoIGdyYW50IHJlZmVyZW5jZXMKPj4gKyAqICAgICAgIChncmVmW10gaW4gc3RydWN0 IHhlbmNhbWVyYV9wYWdlX2RpcmVjdG9yeSkKPj4gKyAqLwo+PiArc3RydWN0IHhlbmNhbWVyYV9i dWZfY3JlYXRlX3JlcSB7Cj4+ICsgICAgdWludDhfdCBpbmRleDsKPj4gKyAgICB1aW50OF90IHJl c2VydmVkWzNdOwo+PiArICAgIGdyYW50X3JlZl90IGdyZWZfZGlyZWN0b3J5Owo+PiArfTsKPj4g Kwo+PiArLyoKPj4gKyAqIFNoYXJlZCBwYWdlIGZvciBYRU5DQU1FUkFfT1BfQlVGX0NSRUFURSBi dWZmZXIgZGVzY3JpcHRvciAoZ3JlZl9kaXJlY3RvcnkgaW4KPj4gKyAqIHRoZSByZXF1ZXN0KSBl bXBsb3lzIGEgbGlzdCBvZiBwYWdlcywgZGVzY3JpYmluZyBhbGwgcGFnZXMgb2YgdGhlIHNoYXJl ZAo+PiArICogZGF0YSBidWZmZXI6Cj4+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAg ICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4+ICsgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICBncmVmX2Rpcl9uZXh0X3Bh Z2UgICAgICAgICAgICAgICAgICAgICAgICAgfCA0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAq IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVmWzBdICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCA4Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+ PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Z3JlZltpXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaSo0KzgKPj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+PiArICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWZbTiAtIDFdICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCBOKjQrOAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKgo+PiArICogZ3JlZl9k aXJfbmV4dF9wYWdlIC0gZ3JhbnRfcmVmX3QsIHJlZmVyZW5jZSB0byB0aGUgbmV4dCBwYWdlIGRl c2NyaWJpbmcKPj4gKyAqICAgcGFnZSBkaXJlY3RvcnkuIE11c3QgYmUgMCBpZiB0aGVyZSBhcmUg bm8gbW9yZSBwYWdlcyBpbiB0aGUgbGlzdC4KPj4gKyAqIGdyZWZbaV0gLSBncmFudF9yZWZfdCwg cmVmZXJlbmNlIHRvIGEgc2hhcmVkIHBhZ2Ugb2YgdGhlIGJ1ZmZlcgo+PiArICogICBhbGxvY2F0 ZWQgYXQgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUuCj4+ICsgKgo+PiArICogTnVtYmVyIG9mIGdy YW50X3JlZl90IGVudHJpZXMgaW4gdGhlIHdob2xlIHBhZ2UgZGlyZWN0b3J5IGlzIG5vdAo+PiAr ICogcGFzc2VkLCBidXQgaW5zdGVhZCBjYW4gYmUgY2FsY3VsYXRlZCBhczoKPj4gKyAqICAgbnVt X2dyZWZzX3RvdGFsID0gKFhFTkNBTUVSQV9PUF9HRVRfQlVGX0RFVEFJTFMuc2l6ZSArIFhFTl9Q QUdFX1NJWkUgLSAxKSAvCj4+ICsgKiAgICAgICBYRU5fUEFHRV9TSVpFCj4+ICsgKi8KPj4gK3N0 cnVjdCB4ZW5jYW1lcmFfcGFnZV9kaXJlY3Rvcnkgewo+PiArICAgIGdyYW50X3JlZl90IGdyZWZf ZGlyX25leHRfcGFnZTsKPj4gKyAgICBncmFudF9yZWZfdCBncmVmWzFdOyAvKiBWYXJpYWJsZSBs ZW5ndGggKi8KPj4gK307Cj4+ICsKPj4gKy8qCj4+ICsgKiBSZXF1ZXN0IGJ1ZmZlciBkZXN0cnVj dGlvbiAtIGRlc3Ryb3kgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjYW1lcmEgYnVmZmVyOgo+PiAr ICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAg ICAgICAzICAgICAgICBvY3RldAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAg ICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQlVGX0RFU1RST1l8ICAgcmVzZXJ2ZWQgICAg IHwgNAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAo+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgaW5kZXggICAgIHwgICAgICAgICAgICAgICAgICAgICBy ZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgIHwgMTIKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiAr ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDE2Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv fAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKPj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+PiArICoKPj4gKyAqIGluZGV4IC0gdWludDhfdCwgaW5kZXggb2YgdGhlIGJ1ZmZl ciB0byBiZSBkZXN0cm95ZWQuCj4+ICsgKi8KPiBUaGVyZSBpcyBubyBWNEwyIGlvY3RsIHRvIGRl c3Ryb3kgc3BlY2lmaWMgYnVmZmVycy4gWW91IGNhbiBvbmx5IGRlc3Ryb3kgYWxsCj4gb2YgdGhl bS4KVGhpcyBpcyBub3Qgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gVjRMMiwgYnV0IGNhbiBiZSBp c3N1ZWQKaW4gcmVzcG9uc2UgdG8gYmFja2VuZCdzIHN0YXRlIGNoYW5nZSBldGMuClNvLCB3ZSBo YXZlIGEgcGFpciBvZiBjb21tYW5kcyB0byBjcmVhdGUgYW5kIGRlc3Ryb3kgYnVmZmVycy4KRXZl biBtb3JlLCBmcm9udGVuZCBjYW4gYmUgYSBzb21lLW9zLWJhc2VkLWRyaXZlciwgbm90IFY0TDIK YmFzZWQuIE9yIGV2ZW4gYSB1c2VyLXNwYWNlIGFwcGxpY2F0aW9uIGlmIHlvdXIgd2lsbC4KPgo+ PiArCj4+ICtzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9kZXN0cm95X3JlcSB7Cj4+ICsgICAgdWludDhf dCBpbmRleDsKPj4gK307Cj4+ICsKPj4gKy8qCj4+ICsgKiBSZXF1ZXN0IGNhbWVyYSBjYXB0dXJl IHN0cmVhbSBzdGFydDoKPj4gKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAg ICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPj4gKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Kwo+PiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHxfT1BfU1RSRUFNX1NU QVJUfCAgIHJlc2VydmVkICAgICB8IDQKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDgKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVk ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAo+PiArICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ ICsgKgo+PiArICoKPj4gKyAqIFJlcXVlc3QgY2FtZXJhIGNhcHR1cmUgc3RyZWFtIHN0b3A6Cj4+ ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAg ICAgICAgIDMgICAgICAgIG9jdGV0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAg ICAgICAgICBpZCAgICAgICAgICAgICAgICB8X09QX1NUUkVBTV9TVE9QIHwgICByZXNlcnZlZCAg ICAgfCA0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsg KiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgNjQKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICoKPj4gKyAqCj4+ICsg KiBSZXF1ZXN0IGNhbWVyYSBjb250cm9sIGRldGFpbHM6Cj4+ICsgKiAgICAgICAgIDAgICAgICAg ICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0 Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAg ICAgICB8R0VUX0NUUkxfREVUQUlMU3wgICByZXNlcnZlZCAgICAgfCA0Cj4+ICsgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKPj4gKyAqIHwgICAgICBpbmRleCAgICAgfCAgICAgICAgICAgICAgICAgICAgIHJlc2Vy dmVkICAgICAgICAgICAgICAgICAgICAgfCAxMgo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgMTYKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4+ ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl c2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAo+PiArICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCj4+ICsgKgo+PiArICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0Lgo+ PiArICoKPj4gKyAqIGluZGV4IC0gdWludDhfdCwgaW5kZXggb2YgdGhlIGNvbnRyb2wgdG8gYmUg cXVlcmllZC4KPj4gKyAqLwo+PiArc3RydWN0IHhlbmNhbWVyYV9nZXRfY3RybF9kZXRhaWxzX3Jl cSB7Cj4+ICsgICAgdWludDhfdCBpbmRleDsKPj4gK307Cj4+ICsKPj4gKy8qCj4+ICsgKgo+PiAr ICogUmVxdWVzdCBjYW1lcmEgY29udHJvbCBjaGFuZ2U6Cj4+ICsgKiAgICAgICAgIDAgICAgICAg ICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0 Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAg ICAgICB8ICBfT1BfU0VUX0NUUkwgIHwgICByZXNlcnZlZCAgICAgfCA0Cj4+ICsgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKPj4gKyAqIHwgICAgICBpbmRleCAgICAgfCAgICAgICAgICAgICAgICAgICAgIHJlc2Vy dmVkICAgICAgICAgICAgICAgICAgICAgfCAxMgo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgMTYKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIw Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+PiArICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgNjQKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICoKPj4g KyAqIFNlZSByZXNwb25zZSBmb3JtYXQgZm9yIHRoaXMgcmVxdWVzdC4KPj4gKyAqCj4+ICsgKiBp bmRleCAtIHVpbnQ4X3QsIGluZGV4IG9mIHRoZSBjb250cm9sLgo+PiArICogdmFsdWUgLSBpbnQz Ml90LCBuZXcgdmFsdWUgb2YgdGhlIGNvbnRyb2wuCj4gSSB3b3VsZCByZWNvbW1lbmQgdXNpbmcg YSBpbnQ2NF90IGFzIHRoZSBjb250cm9sIHZhbHVlLgpHb29kIHBvaW50LCB0aGFuayB5b3UKPgo+ IE5vdGUgdGhhdCB0aGVyZSBhcmUgYWxzbyBjb250cm9scyB3aXRoIGEgcGF5bG9hZCAoZS5nLiBz dHJpbmcgY29udHJvbHMpLgpDb3VsZCB5b3UgcGxlYXNlIGdpdmUgbWUgYW4gZXhhbXBsZSBvZiBz dWNoIGEgY29udHJvbD8KRG8geW91IHRoaW5rIHN1Y2ggY29udHJvbHMgY2FuIGJlIG9mIHVzZSBp biBhIFZNPwpDYW4gd2UgYXZvaWQgc3VjaCBjb250cm9scyBpZiB3ZSB0YXJnZXQgYSBzaW1wbGUg dmlydHVhbApjYW1lcmEgZGV2aWNlPyBJZiB0aGlzIGlzIGZvciByYWRpbyB1c2UtY2FzZSwgdGhl biB3ZSdsbApoYXZlIHN1Y2ggc3VwcG9ydCBpbiAndnJhZGlvJyBwcm90b2NvbCBpZiBuZWVkIGJl Cj4KPiBJZiB0aGVyZSBpcyBldmVyIGludGVyZXN0IGluIGFkZGluZyByYWRpby9SRFMgc3VwcG9y dCwgdGhlbiB0aGF0IHdpbGwgYmVjb21lCj4gYW4gaXNzdWUuCllvdSBtZWFuIHNvbWV0aGluZyBs aWtlIHN0YXRpb24gbmFtZXMsIGFkcyBldGM/Cj4KPj4gKyAqLwo+PiArc3RydWN0IHhlbmNhbWVy YV9zZXRfY3RybF9yZXEgewo+PiArICAgIHVpbnQ4X3QgaW5kZXg7Cj4+ICsgICAgdWludDhfdCBy ZXNlcnZlZFszXTsKPj4gKyAgICBpbnQzMl90IHZhbHVlOwo+PiArfTsKPj4gKwo+PiArLyoKPj4g KyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNwb25zZXMgLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4gKyAqCj4+ICsgKiBBbGwgcmVzcG9uc2UgcGFja2V0 cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAoNjQgb2N0ZXRzKS4KPj4gKyAqCj4+ICsgKiBBbGwgcmVz cG9uc2UgcGFja2V0cyBoYXZlIGNvbW1vbiBoZWFkZXI6Cj4+ICsgKiAgICAgICAgIDAgICAgICAg ICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0 Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAg ICAgICB8ICAgIG9wZXJhdGlvbiAgIHwgICAgcmVzZXJ2ZWQgICAgfCA0Cj4+ICsgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqCj4+ ICsgKiBpZCAtIHVpbnQxNl90LCBjb3BpZWQgZnJvbSB0aGUgcmVxdWVzdC4KPj4gKyAqIG9wZXJh dGlvbiAtIHVpbnQ4X3QsIFhFTkNBTUVSQV9PUF8qIC0gY29waWVkIGZyb20gcmVxdWVzdC4KPj4g KyAqIHN0YXR1cyAtIGludDMyX3QsIHJlc3BvbnNlIHN0YXR1cywgemVybyBvbiBzdWNjZXNzIGFu ZCAtWEVOX0VYWCBvbiBmYWlsdXJlLgo+PiArICoKPj4gKyAqCj4+ICsgKiBTZXQgY29uZmlndXJh dGlvbiByZXNwb25zZSAtIHJlc3BvbnNlIGZvciBYRU5DQU1FUkFfT1BfU0VUX0NPTkZJRzoKPj4g KyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAg ICAgICAgMyAgICAgICAgb2N0ZXQKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAg ICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX1NFVF9DT05GSUcgfCAgICByZXNlcnZlZCAg ICB8IDQKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKPj4gKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKwo+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCBmb3Jt YXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyCj4+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4g KyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAxNgo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgMjAKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgZnJhbWVfcmF0ZV9udW1lciAgICAgICAgICAgICAgICAgICAgICAgICB8IDI0Cj4+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3JhdGVf ZGVub20gICAgICAgICAgICAgICAgICAgICAgICAgfCAyOAo+PiArICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ ICsgKiB8ICAgIG51bV9idWZzICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAg ICAgICAgICAgICAgICAgIHwgMzIKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDM2Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiAr ICoKPj4gKyAqIE1lYW5pbmcgb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoaXMgcmVz cG9uc2UgaXMgdGhlIHNhbWUgYXMgZm9yCj4+ICsgKiBYRU5DQU1FUkFfT1BfU0VUX0NPTkZJRyBy ZXF1ZXN0Lgo+PiArICoKPj4gKyAqCj4+ICsgKiBSZXF1ZXN0IGJ1ZmZlciBkZXRhaWxzIHJlc3Bv bnNlIC0gcmVzcG9uc2UgZm9yIFhFTkNBTUVSQV9PUF9HRVRfQlVGX0RFVEFJTFMKPj4gKyAqIHJl cXVlc3Q6Cj4+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAg MiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAq IHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8X0dFVF9CVUZfREVUQUlMU3wgICAg cmVzZXJ2ZWQgICAgfCA0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4 Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMgo+PiArICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCj4+ICsgKiB8ICAgbnVtX3BsYW5lcyAgIHwgICAgICAgICAgICAgICAgICAgICByZXNl cnZlZCAgICAgICAgICAgICAgICAgICAgIHwgMTYKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICog fCAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfb2Zmc2V0WzBdICAgICAgICAgICAgICAg ICAgICAgICAgICB8IDIwCj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgIHBsYW5lX29mZnNldFsxXSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAy NAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBw bGFuZV9vZmZzZXRbMl0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjgKPj4gKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKwo+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfb2Zmc2V0WzNd ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMyCj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAq IHwgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zaXplWzBdICAgICAgICAgICAgICAg ICAgICAgICAgICAgfCAzNgo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGxhbmVfc2l6ZVsxXSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg NDAKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAg IHBsYW5lX3NpemVbMl0gICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQ0Cj4+ICsgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zaXplWzNd ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0OAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsg KiB8ICAgICAgICAgcGxhbmVfc3RyaWRlWzBdICAgICAgICAgfCAgICAgICAgIHBsYW5lX3N0cmlk ZVsxXSAgICAgICAgIHwgNTIKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAgIHBs YW5lX3N0cmlkZVsyXSAgICAgICAgIHwgICAgICAgICBwbGFuZV9zdHJpZGVbM10gICAgICAgICB8 IDU2Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2MAo+PiArICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiAr ICoKPj4gKyAqIHNpemUgLSB1aW50MzJfdCwgb3ZlcmFsbCBzaXplIG9mIHRoZSBidWZmZXIgaW5j bHVkaW5nIHNpemVzIG9mIHRoZQo+PiArICogICBpbmRpdmlkdWFsIHBsYW5lcyBhbmQgcGFkZGlu ZyBpZiBhcHBsaWNhYmxlLgo+PiArICogbnVtX3BsYW5lcyAtIHVpbnQ4X3QsIG51bWJlciBvZiBw bGFuZXMgZm9yIHRoaXMgYnVmZmVyLgo+PiArICogcGxhbmVfb2Zmc2V0IC0gYXJyYXkgb2YgdWlu dDMyX3QsIG9mZnNldCBvZiB0aGUgY29ycmVzcG9uZGluZyBwbGFuZQo+PiArICogICBpbiBvY3Rl dHMgZnJvbSB0aGUgYnVmZmVyIHN0YXJ0Lgo+PiArICogcGxhbmVfc2l6ZSAtIGFycmF5IG9mIHVp bnQzMl90LCBzaXplIGluIG9jdGV0cyBvZiB0aGUgY29ycmVzcG9uZGluZyBwbGFuZQo+PiArICog ICBpbmNsdWRpbmcgcGFkZGluZy4KPj4gKyAqIHBsYW5lX3N0cmlkZSAtIGFycmF5IG9mIHVpbnQz Ml90LCBzaXplIGluIG9jdGV0cyBvY2N1cGllZCBieSB0aGUKPj4gKyAqICAgY29ycmVzcG9uZGlu ZyBzaW5nbGUgaW1hZ2UgbGluZSBpbmNsdWRpbmcgcGFkZGluZyBpZiBhcHBsaWNhYmxlLgo+IE5p Y2UhClRoYW5rIHlvdQo+PiArICovCj4+ICtzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9kZXRhaWxzX3Jl c3Agewo+PiArICAgIHVpbnQzMl90IHNpemU7Cj4+ICsgICAgdWludDhfdCBudW1fcGxhbmVzOwo+ PiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbM107Cj4+ICsgICAgdWludDMyX3QgcGxhbmVfb2Zmc2V0 W1hFTkNBTUVSQV9NQVhfUExBTkVdOwo+PiArICAgIHVpbnQzMl90IHBsYW5lX3NpemVbWEVOQ0FN RVJBX01BWF9QTEFORV07Cj4+ICsgICAgdWludDE2X3QgcGxhbmVfc3RyaWRlW1hFTkNBTUVSQV9N QVhfUExBTkVdOwo+PiArfTsKPj4gKwo+PiArLyoKPj4gKyAqIEdldCBjb250cm9sIGRldGFpbHMg cmVzcG9uc2UgLSByZXNwb25zZSBmb3IgWEVOQ0FNRVJBX09QX0dFVF9DVFJMX0RFVEFJTFM6Cj4+ ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAg ICAgICAgIDMgICAgICAgIG9jdGV0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAg ICAgICAgICBpZCAgICAgICAgICAgICAgICB8R0VUX0NUUkxfREVUQUlMU3wgICAgcmVzZXJ2ZWQg ICAgfCA0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4Cj4+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgIGluZGV4ICAgICAgfCAgICAgIHR5cGUgICAgICB8ICAg ICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgfCAxMgo+PiArICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgMTYKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgbWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDIwCj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHN0ZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNAo+PiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmX3Zh bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjgKPj4gKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+ PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDM2Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvfAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKPj4gKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKwo+PiArICoKPj4gKyAqIGluZGV4IC0gdWludDhfdCwgaW5kZXggb2YgdGhlIGNh bWVyYSBjb250cm9sIGluIHJlc3BvbnNlLgo+PiArICogdHlwZSAtIHVpbnQ4X3QsIHR5cGUgb2Yg dGhlIGNvbnRyb2wsIG9uZSBvZiB0aGUgWEVOQ0FNRVJBX0NUUkxfWFhYLgo+PiArICogbWluIC0g aW50MzJfdCwgbWluaW11bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4KPj4gKyAqIG1heCAtIGludDMy X3QsIG1heGltdW0gdmFsdWUgb2YgdGhlIGNvbnRyb2wuCj4+ICsgKiBzdGVwIC0gaW50MzJfdCwg bWluaW11bSBzaXplIGluIHdoaWNoIGNvbnRyb2wgdmFsdWUgY2FuIGJlIGNoYW5nZWQuCj4+ICsg KiBkZWZfdmFsIC0gaW50MzJfdCwgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29udHJvbC4KPiBJJ2Qg Z28gd2l0aCA2NCBiaXQgdmFsdWVzIGZvciBtaW4vbWF4L3N0ZXAvZGVmX3ZhbC4KU3VyZSwgZ29v ZCBpZGVhLCB0aGFuayB5b3UKPgo+IEkgd291bGQgYWxzbyBhZGQgYSBmbGFncyBmaWVsZC4gU29t ZSBjb250cm9scyBhcmUgcmVhZC1vbmx5LCB3cml0ZS1vbmx5Cj4gb3Igdm9sYXRpbGUsIHRoaW5n cyB1c2Vyc3BhY2UgbmVlZHMgdG8ga25vdy4KVGhlbiBJJ2xsIGFsc28gYWRkIG51bWVyaWNhbCBj b25zdGFudHMgZm9yIHN1Y2gKPgo+IElmIHlvdSB3YW50IHRvIHN1cHBvcnQgbWVudSBjb250cm9s cywgdGhlbiB5b3UgbmVlZCBhIHdheSB0byBnZXQgdGhlIG1lbnUKPiBuYW1lcyBhcyB3ZWxsIChW SURJT0NfUVVFUllNRU5VKS4KPgo+IE5vbmUgb2YgdGhpcyBpcyBuZWVkZWQgZm9yIHRoaXMgaW5p dGlhbCB1c2UtY2FzZSwgYnV0IHlvdSBuZWVkIHRvIHRoaW5rCj4gYWJvdXQgdGhpcyB1cC1mcm9u dC4KWWVzLCB0aGFuayB5b3UKPj4gKyAqLwo+PiArc3RydWN0IHhlbmNhbWVyYV9nZXRfY3RybF9k ZXRhaWxzX3Jlc3Agewo+PiArICAgIHVpbnQ4X3QgaW5kZXg7Cj4+ICsgICAgdWludDhfdCB0eXBl Owo+PiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbMl07Cj4+ICsgICAgaW50MzJfdCBtaW47Cj4+ICsg ICAgaW50MzJfdCBtYXg7Cj4+ICsgICAgaW50MzJfdCBzdGVwOwo+PiArICAgIGludDMyX3QgZGVm X3ZhbDsKPj4gK307Cj4+ICsKPj4gKy8qCj4+ICsgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tIEV2ZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4+ICsg Kgo+PiArICogRXZlbnRzIGFyZSBzZW50IHZpYSBhIHNoYXJlZCBwYWdlIGFsbG9jYXRlZCBieSB0 aGUgZnJvbnQgYW5kIHByb3BhZ2F0ZWQgYnkKPj4gKyAqICAgZXZ0LWV2ZW50LWNoYW5uZWwvZXZ0 LXJpbmctcmVmIFhlblN0b3JlIGVudHJpZXMuCj4+ICsgKgo+PiArICogQWxsIGV2ZW50IHBhY2tl dHMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKDY0IG9jdGV0cykuCj4+ICsgKiBBbGwgZXZlbnQgcGFj a2V0cyBoYXZlIGNvbW1vbiBoZWFkZXI6Cj4+ICsgKiAgICAgICAgIDAgICAgICAgICAgICAgICAg MSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cj4+ICsgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8ICAg ICAgdHlwZSAgICAgIHwgICByZXNlcnZlZCAgICAgfCA0Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4g KyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCA4Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqCj4+ICsgKiBpZCAt IHVpbnQxNl90LCBldmVudCBpZCwgbWF5IGJlIHVzZWQgYnkgZnJvbnQuCj4+ICsgKiB0eXBlIC0g dWludDhfdCwgdHlwZSBvZiB0aGUgZXZlbnQuCj4+ICsgKgo+PiArICoKPj4gKyAqIEZyYW1lIGNh cHR1cmVkIGV2ZW50IC0gZXZlbnQgZnJvbSBiYWNrIHRvIGZyb250IHdoZW4gYSBuZXcgY2FwdHVy ZWQKPj4gKyAqIGZyYW1lIGlzIGF2YWlsYWJsZToKPj4gKyAqICAgICAgICAgMCAgICAgICAgICAg ICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKPj4g KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAg IHxfRVZUX0ZSQU1FX0FWQUlMfCAgIHJlc2VydmVkICAgICB8IDQKPj4gKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Kwo+PiArICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDgKPj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+PiArICogfCAgICAg IGluZGV4ICAgICB8ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAg ICAgICB8IDEyCj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB1c2VkX3N6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgo+PiAr ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCj4+ICsgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVz ZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKPj4gKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Kwo+PiArICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC98Cj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4gKyAqIHwgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfCA2NAo+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+ICsgKgo+PiArICogaW5kZXggLSB1aW50OF90 LCBpbmRleCBvZiB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgbmV3IGNhcHR1cmVkIGZyYW1lLgo+ PiArICogdXNlZF9zeiAtIHVpbnQzMl90LCBudW1iZXIgb2Ygb2N0ZXRzIHRoaXMgZnJhbWUgaGFz LiBUaGlzIGNhbiBiZSBsZXNzCj4+ICsgKiB0aGFuIHRoZSBYRU5DQU1FUkFfT1BfR0VUX0JVRl9E RVRBSUxTLnNpemUgZm9yIGNvbXByZXNzZWQgZm9ybWF0cy4KPj4gKyAqLwo+PiArc3RydWN0IHhl bmNhbWVyYV9mcmFtZV9hdmFpbF9ldnQgewo+PiArICAgIHVpbnQ4X3QgaW5kZXg7Cj4+ICsgICAg dWludDhfdCByZXNlcnZlZFszXTsKPj4gKyAgICB1aW50MzJfdCB1c2VkX3N6Owo+PiArfTsKPj4g Kwo+PiArc3RydWN0IHhlbmNhbWVyYV9yZXEgewo+PiArICAgIHVpbnQxNl90IGlkOwo+PiArICAg IHVpbnQ4X3Qgb3BlcmF0aW9uOwo+PiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07Cj4+ICsgICAg dW5pb24gewo+PiArICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2NvbmZpZyBjb25maWc7Cj4+ICsg ICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfYnVmX2NyZWF0ZV9yZXEgYnVmX2NyZWF0ZTsKPj4gKwlz dHJ1Y3QgeGVuY2FtZXJhX2J1Zl9kZXN0cm95X3JlcSBidWZfZGVzdHJveTsKPj4gKwlzdHJ1Y3Qg eGVuY2FtZXJhX3NldF9jdHJsX3JlcSBzZXRfY3RybDsKPj4gKyAgICAgICAgdWludDhfdCByZXNl cnZlZFs1Nl07Cj4+ICsgICAgfSByZXE7Cj4+ICt9Owo+PiArCj4+ICtzdHJ1Y3QgeGVuY2FtZXJh X3Jlc3Agewo+PiArICAgIHVpbnQxNl90IGlkOwo+PiArICAgIHVpbnQ4X3Qgb3BlcmF0aW9uOwo+ PiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWQ7Cj4+ICsgICAgaW50MzJfdCBzdGF0dXM7Cj4+ICsgICAg dW5pb24gewo+PiArICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2NvbmZpZyBjb25maWc7Cj4+ICsg ICAgICAgIHN0cnVjdCB4ZW5jYW1lcmFfYnVmX2RldGFpbHNfcmVzcCBidWZfZGV0YWlsczsKPj4g KwlzdHJ1Y3QgeGVuY2FtZXJhX2dldF9jdHJsX2RldGFpbHNfcmVzcCBjdHJsX2RldGFpbHM7Cj4+ ICsgICAgICAgIHVpbnQ4X3QgcmVzZXJ2ZWQxWzU2XTsKPj4gKyAgICB9IHJlc3A7Cj4+ICt9Owo+ PiArCj4+ICtzdHJ1Y3QgeGVuY2FtZXJhX2V2dCB7Cj4+ICsgICAgdWludDE2X3QgaWQ7Cj4+ICsg ICAgdWludDhfdCB0eXBlOwo+PiArICAgIHVpbnQ4X3QgcmVzZXJ2ZWRbNV07Cj4+ICsgICAgdW5p b24gewo+PiArICAgICAgICBzdHJ1Y3QgeGVuY2FtZXJhX2ZyYW1lX2F2YWlsX2V2dCBmcmFtZV9h dmFpbDsKPj4gKyAgICAgICAgdWludDhfdCByZXNlcnZlZFs1Nl07Cj4+ICsgICAgfSBldnQ7Cj4+ ICt9Owo+PiArCj4+ICtERUZJTkVfUklOR19UWVBFUyh4ZW5fY2FtZXJhaWYsIHN0cnVjdCB4ZW5j YW1lcmFfcmVxLCBzdHJ1Y3QgeGVuY2FtZXJhX3Jlc3ApOwo+PiArCj4+ICsvKgo+PiArICoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgo+PiArICogICAgICAgICAgICAgICAgICAgICAgICBCYWNrIHRvIGZy b250IGV2ZW50cyBkZWxpdmVyeQo+PiArICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgo+PiArICogSW4g b3JkZXIgdG8gZGVsaXZlciBhc3luY2hyb25vdXMgZXZlbnRzIGZyb20gYmFjayB0byBmcm9udCBh IHNoYXJlZCBwYWdlIGlzCj4+ICsgKiBhbGxvY2F0ZWQgYnkgZnJvbnQgYW5kIGl0cyBncmFudGVk IHJlZmVyZW5jZSBwcm9wYWdhdGVkIHRvIGJhY2sgdmlhCj4+ICsgKiBYZW5TdG9yZSBlbnRyaWVz IChldnQtcmluZy1yZWYvZXZ0LWV2ZW50LWNoYW5uZWwpLgo+PiArICogVGhpcyBwYWdlIGhhcyBh IGNvbW1vbiBoZWFkZXIgdXNlZCBieSBib3RoIGZyb250IGFuZCBiYWNrIHRvIHN5bmNocm9uaXpl Cj4+ICsgKiBhY2Nlc3MgYW5kIGNvbnRyb2wgZXZlbnQncyByaW5nIGJ1ZmZlciwgd2hpbGUgYmFj ayBiZWluZyBhIHByb2R1Y2VyIG9mIHRoZQo+PiArICogZXZlbnRzIGFuZCBmcm9udCBiZWluZyBh IGNvbnN1bWVyLiBUaGUgcmVzdCBvZiB0aGUgcGFnZSBhZnRlciB0aGUgaGVhZGVyCj4+ICsgKiBp cyB1c2VkIGZvciBldmVudCBwYWNrZXRzLgo+PiArICoKPj4gKyAqIFVwb24gcmVjZXB0aW9uIG9m IGFuIGV2ZW50KHMpIGZyb250IG1heSBjb25maXJtIGl0cyByZWNlcHRpb24KPj4gKyAqIGZvciBl aXRoZXIgZWFjaCBldmVudCwgZ3JvdXAgb2YgZXZlbnRzIG9yIG5vbmUuCj4+ICsgKi8KPj4gKwo+ PiArc3RydWN0IHhlbmNhbWVyYV9ldmVudF9wYWdlIHsKPj4gKyAgICB1aW50MzJfdCBpbl9jb25z Owo+PiArICAgIHVpbnQzMl90IGluX3Byb2Q7Cj4+ICsgICAgdWludDhfdCByZXNlcnZlZFs1Nl07 Cj4+ICt9Owo+PiArCj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9FVkVOVF9QQUdFX1NJWkUgNDA5Ngo+ PiArI2RlZmluZSBYRU5DQU1FUkFfSU5fUklOR19PRkZTIChzaXplb2Yoc3RydWN0IHhlbmNhbWVy YV9ldmVudF9wYWdlKSkKPj4gKyNkZWZpbmUgWEVOQ0FNRVJBX0lOX1JJTkdfU0laRSAoWEVOQ0FN RVJBX0VWRU5UX1BBR0VfU0laRSAtIFhFTkNBTUVSQV9JTl9SSU5HX09GRlMpCj4+ICsjZGVmaW5l IFhFTkNBTUVSQV9JTl9SSU5HX0xFTiAoWEVOQ0FNRVJBX0lOX1JJTkdfU0laRSAvIHNpemVvZihz dHJ1Y3QgeGVuY2FtZXJhX2V2dCkpCj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9JTl9SSU5HKHBhZ2Up IFwKPj4gKwkoKHN0cnVjdCB4ZW5jYW1lcmFfZXZ0ICopKChjaGFyICopKHBhZ2UpICsgWEVOQ0FN RVJBX0lOX1JJTkdfT0ZGUykpCj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9JTl9SSU5HX1JFRihwYWdl LCBpZHgpIFwKPj4gKwkoWEVOQ0FNRVJBX0lOX1JJTkcoKHBhZ2UpKVsoaWR4KSAlIFhFTkNBTUVS QV9JTl9SSU5HX0xFTl0pCj4+ICsKPj4gKyNlbmRpZiAvKiBfX1hFTl9QVUJMSUNfSU9fQ0FNRVJB SUZfSF9fICovCj4+ICsKPj4gKy8qCj4+ICsgKiBMb2NhbCB2YXJpYWJsZXM6Cj4+ICsgKiBtb2Rl OiBDCj4+ICsgKiBjLWZpbGUtc3R5bGU6ICJCU0QiCj4+ICsgKiBjLWJhc2ljLW9mZnNldDogNAo+ PiArICogdGFiLXdpZHRoOiA0Cj4+ICsgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKPj4gKyAqIEVu ZDoKPj4gKyAqLwo+Pgo+IEkgdGhpbmsgdGhlIG1vc3QgaW1wb3J0YW50IGRlY2lzaW9uIHRvIG1h a2UgaGVyZSBpcyB3aGV0aGVyIG9yIG5vdCB5b3Ugd2FudCB0byBzdXBwb3J0Cj4gaG90cGx1Z2dh YmxlIHNvdXJjZXMgbGlrZSBIRE1JLiBBbmQgYW4gYWRkaXRpb25hbCBjb21wbGljYXRpb24gd2l0 aCB0aGF0IGlzIEhEQ1AuCj4gV2hpbGUgVjRMMiBkb2Vzbid0IGhhdmUgYW4gQVBJIGZvciBIRENQ IGF0IHRoZSBtb21lbnQsIENpc2NvIGlzIHdvcmtpbmcgb24gdGhpcyBhbmQKPiBhIHBhdGNoIHNl cmllcyBhZGRpbmcgdGhpcyBpcyBleHBlY3RlZCBsYXRlciB0aGlzIHllYXIvZWFybHkgbmV4dCB5 ZWFyLiBJdCBtaWdodCBub3QKPiBiZSBhbiBpc3N1ZSBpbiBwcmFjdGljZSBpZiB0aGVzZSBhcmUg YWxsIGNsb3NlZCBzeXN0ZW1zLCBidXQgbmV2ZXJ0aGVsZXNzLCBpdCBpcwo+IHNvbWV0aGluZyB0 byB0aGluayBhYm91dC4KWWVzLCB0aGFuayB5b3UgZm9yIHJhaXNpbmcgdGhlc2UgcXVlc3Rpb25z LCBpdCBpcyB3b3J0aCB0aGlua2luZwphYm91dCBzdWNoIHVzZS1jYXNlcy4KPgo+IFJlZ2FyZHMs Cj4KPiAJSGFucwpUaGFuayB5b3Ugc28gbXVjaCBmb3IgdGhlIGNvbW1lbnRzLApPbGVrc2FuZHIK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZl bCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlz dHMueGVucHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-lf1-f46.google.com ([209.85.167.46]:33329 "EHLO mail-lf1-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727358AbeIJMIu (ORCPT ); Mon, 10 Sep 2018 08:08:50 -0400 Received: by mail-lf1-f46.google.com with SMTP id m26-v6so16577997lfb.0 for ; Mon, 10 Sep 2018 00:16:09 -0700 (PDT) Subject: Re: [Xen-devel][PATCH 1/1] cameraif: add ABI for para-virtual camera To: Hans Verkuil , xen-devel@lists.xenproject.org, konrad.wilk@oracle.com, jgross@suse.com, boris.ostrovsky@oracle.com, mchehab@kernel.org, linux-media@vger.kernel.org, sakari.ailus@linux.intel.com, koji.matsuoka.xm@renesas.com Cc: Oleksandr Andrushchenko References: <20180731093142.3828-1-andr2000@gmail.com> <20180731093142.3828-2-andr2000@gmail.com> <73b69e31-d36d-d89f-20d6-d59dbefe395e@xs4all.nl> From: Oleksandr Andrushchenko Message-ID: Date: Mon, 10 Sep 2018 10:16:06 +0300 MIME-Version: 1.0 In-Reply-To: <73b69e31-d36d-d89f-20d6-d59dbefe395e@xs4all.nl> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-media-owner@vger.kernel.org List-ID: Hi, Hans! On 09/09/2018 01:31 PM, Hans Verkuil wrote: > Hi Oleksandr, > > Sorry for the delay in reviewing, I missed this patch until you pinged me, and > I was very busy after that as well. I do appreciate you spending time on this! > > On 07/31/2018 11:31 AM, Oleksandr Andrushchenko wrote: >> From: Oleksandr Andrushchenko >> >> This is the ABI for the two halves of a para-virtualized >> camera driver which extends Xen's reach multimedia capabilities even >> farther enabling it for video conferencing, In-Vehicle Infotainment, >> high definition maps etc. >> >> The initial goal is to support most needed functionality with the >> final idea to make it possible to extend the protocol if need be: >> >> 1. Provide means for base virtual device configuration: >> - pixel formats >> - resolutions >> - frame rates >> 2. Support basic camera controls: >> - contrast >> - brightness >> - hue >> - saturation >> 3. Support streaming control >> 4. Support zero-copying use-cases >> >> Signed-off-by: Oleksandr Andrushchenko >> --- >> xen/include/public/io/cameraif.h | 981 +++++++++++++++++++++++++++++++ >> 1 file changed, 981 insertions(+) >> create mode 100644 xen/include/public/io/cameraif.h >> >> diff --git a/xen/include/public/io/cameraif.h b/xen/include/public/io/cameraif.h >> new file mode 100644 >> index 000000000000..bdc6a1262fcf >> --- /dev/null >> +++ b/xen/include/public/io/cameraif.h >> @@ -0,0 +1,981 @@ >> +/****************************************************************************** >> + * cameraif.h >> + * >> + * Unified camera device I/O interface for Xen guest OSes. >> + * >> + * Permission is hereby granted, free of charge, to any person obtaining a copy >> + * of this software and associated documentation files (the "Software"), to >> + * deal in the Software without restriction, including without limitation the >> + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or >> + * sell copies of the Software, and to permit persons to whom the Software is >> + * furnished to do so, subject to the following conditions: >> + * >> + * The above copyright notice and this permission notice shall be included in >> + * all copies or substantial portions of the Software. >> + * >> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR >> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, >> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE >> + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER >> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING >> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER >> + * DEALINGS IN THE SOFTWARE. >> + * >> + * Copyright (C) 2018 EPAM Systems Inc. >> + * >> + * Author: Oleksandr Andrushchenko >> + */ > Use SPDX tag instead of copying the license text. This is yet a Xen header which belongs to Xen project and all the rest of the protocols have the same license header. If Xen community decides to use SPDX then I'll definitely follow. Konrad, do you think this is the right time for such a move? > >> + >> +#ifndef __XEN_PUBLIC_IO_CAMERAIF_H__ >> +#define __XEN_PUBLIC_IO_CAMERAIF_H__ >> + >> +#include "ring.h" >> +#include "../grant_table.h" >> + >> +/* >> + ****************************************************************************** >> + * Protocol version >> + ****************************************************************************** >> + */ >> +#define XENCAMERA_PROTOCOL_VERSION "1" >> + >> +/* >> + ****************************************************************************** >> + * Feature and Parameter Negotiation >> + ****************************************************************************** >> + * >> + * Front->back notifications: when enqueuing a new request, sending a >> + * notification can be made conditional on xencamera_req (i.e., the generic >> + * hold-off mechanism provided by the ring macros). Backends must set >> + * xencamera_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). >> + * >> + * Back->front notifications: when enqueuing a new response, sending a >> + * notification can be made conditional on xencamera_resp (i.e., the generic >> + * hold-off mechanism provided by the ring macros). Frontends must set >> + * xencamera_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). >> + * >> + * The two halves of a para-virtual camera driver utilize nodes within >> + * XenStore to communicate capabilities and to negotiate operating parameters. >> + * This section enumerates these nodes which reside in the respective front and >> + * backend portions of XenStore, following the XenBus convention. >> + * >> + * All data in XenStore is stored as strings. Nodes specifying numeric >> + * values are encoded in decimal. Integer value ranges listed below are >> + * expressed as fixed sized integer types capable of storing the conversion >> + * of a properly formatted node string, without loss of information. >> + * >> + ****************************************************************************** >> + * Example configuration >> + ****************************************************************************** >> + * >> + * This is an example of backend and frontend configuration: >> + * >> + *--------------------------------- Backend ----------------------------------- >> + * >> + * /local/domain/0/backend/vcamera/1/0/frontend-id = "1" >> + * /local/domain/0/backend/vcamera/1/0/frontend = "/local/domain/1/device/vcamera/0" >> + * /local/domain/0/backend/vcamera/1/0/state = "4" >> + * /local/domain/0/backend/vcamera/1/0/versions = "1,2" > Why vcamera instead of just camera? If 'v' stands for 'video', then that seems > superfluous to me. 'v' stands for 'virtual'. I am following Xen convention used for all other virtual device protocols here. >> + * >> + *--------------------------------- Frontend ---------------------------------- >> + * >> + * /local/domain/1/device/vcamera/0/backend-id = "0" >> + * /local/domain/1/device/vcamera/0/backend = "/local/domain/0/backend/vcamera/1" >> + * /local/domain/1/device/vcamera/0/state = "4" >> + * /local/domain/1/device/vcamera/0/version = "1" >> + * /local/domain/1/device/vcamera/0/be-alloc = "1" >> + * >> + *---------------------------- Device 0 configuration ------------------------- >> + * >> + * /local/domain/1/device/vcamera/0/controls = "contrast,hue" >> + * /local/domain/1/device/vcamera/0/formats/YUYV/640x480 = "30/1,15/1,15/2" >> + * /local/domain/1/device/vcamera/0/formats/YUYV/1920x1080 = "15/2" >> + * /local/domain/1/device/vcamera/0/formats/BGRA/640x480 = "15/1,15/2" >> + * /local/domain/1/device/vcamera/0/formats/BGRA/1200x720 = "15/2" >> + * /local/domain/1/device/vcamera/0/unique-id = "0" >> + * /local/domain/1/device/vcamera/0/req-ring-ref = "2832" >> + * /local/domain/1/device/vcamera/0/req-event-channel = "15" >> + * /local/domain/1/device/vcamera/0/evt-ring-ref = "387" >> + * /local/domain/1/device/vcamera/0/evt-event-channel = "16" >> + * >> + *---------------------------- Device 1 configuration ------------------------- >> + * >> + * /local/domain/1/device/vcamera/1/controls = "brightness,saturation,hue" >> + * /local/domain/1/device/vcamera/1/formats/YUYV/640x480 = "30/1,15/1,15/2" >> + * /local/domain/1/device/vcamera/1/formats/YUYV/1920x1080 = "15/2" >> + * /local/domain/1/device/vcamera/1/unique-id = "1" >> + * /local/domain/1/device/vcamera/1/req-ring-ref = "2833" >> + * /local/domain/1/device/vcamera/1/req-event-channel = "17" >> + * /local/domain/1/device/vcamera/1/evt-ring-ref = "388" >> + * /local/domain/1/device/vcamera/1/evt-event-channel = "18" >> + * >> + ****************************************************************************** >> + * Backend XenBus Nodes >> + ****************************************************************************** >> + * >> + *----------------------------- Protocol version ------------------------------ >> + * >> + * versions >> + * Values: >> + * >> + * List of XENCAMERA_LIST_SEPARATOR separated protocol versions supported >> + * by the backend. For example "1,2,3". >> + * >> + ****************************************************************************** >> + * Frontend XenBus Nodes >> + ****************************************************************************** >> + * >> + *-------------------------------- Addressing --------------------------------- >> + * >> + * dom-id >> + * Values: >> + * >> + * Domain identifier. >> + * >> + * dev-id >> + * Values: >> + * >> + * Device identifier. >> + * >> + * /local/domain//device/vcamera//... >> + * >> + *----------------------------- Protocol version ------------------------------ >> + * >> + * version >> + * Values: >> + * >> + * Protocol version, chosen among the ones supported by the backend. >> + * >> + *------------------------- Backend buffer allocation ------------------------- >> + * >> + * be-alloc > I thought that 'be' referred to 'big-endian', but apparently not. Perhaps it > is better to just write 'backend-alloc'. Well, 'be' and 'fe' are commonly used in Xen for backend and frontend, so I'll probably stick to that convention for now. > >> + * Values: "0", "1" >> + * >> + * If value is set to "1", then backend will be the buffer >> + * provider/allocator for this domain during XENCAMERA_OP_BUF_CREATE >> + * operation. >> + * If value is not "1" or omitted frontend must allocate buffers itself. >> + * >> + *------------------------------- Camera settings ----------------------------- >> + * >> + * unique-id >> + * Values: >> + * >> + * After device instance initialization each camera is assigned a >> + * unique ID, so it can be identified by the backend by this ID. >> + * This can be UUID or such. >> + * >> + * controls >> + * Values: >> + * >> + * List of supported camera controls separated by XENCAMERA_LIST_SEPARATOR. >> + * Camera controls are expressed as a list of string values w/o any >> + * ordering requirement. >> + * >> + * formats >> + * Values: >> + * >> + * Formats are organized as a set of directories one per each >> + * supported pixel format. The name of the directory is an upper case >> + * string of the corresponding FOURCC string label. The next level of >> + * the directory under represents supported resolutions. > Lower-case characters are also use in pixelformats, so I'd just keep this as-is. Ok, no problem - will remove the 'upper case' from the definition > > In addition it is common to set bit 31 of the fourcc to 1 if the format is > big-endian (see v4l2_fourcc_be macro). When v4l utilities print this format we > add a -BE suffix, so V4L2_PIX_FMT_ARGB555X becomes "AR15-BE". You might want to > keep that convention. I'll think about it, thank you > >> + * >> + * resolution >> + * Values: x >> + * >> + * Resolutions are organized as a set of directories one per each >> + * supported resolution under corresponding directory. >> + * The name of the directory is the supported width and height >> + * of the camera resolution in pixels. > What if you are dealing with an HDMI input? Not unreasonable for media > systems. There can be a lot of resolutions/framerates, and the resolution > can change on the fly, or of course disappear. Well, this is a part of the system configuration done before we actually run the VMs, e.g. at system design and configuration time. Most of the time you do know which resolutions, frame rates etc. you want to assign and these settings remain static for the whole lifetime of that VM. If you are designing a system which needs these resolutions to change at run-time then this can be done: 1. Backend changes the state of the frontend to XenbusStateClosed state 2. Xen (xl/libxl) or backend change the configuration in XenStore 3. Backend re-initializes the frontend which reads new configuration > > What is also missing here is a way to report pixel aspect ratio: PAL and > NTSC-based video material doesn't have square pixels. Hm, indeed, thank you. I'll put this as a fraction under the corresponding 'resolution': Now: /local/domain/2/device/vcamera/0/formats/YUYV/640x480 = "30/1,15/1,15/2" /local/domain/2/device/vcamera/0/formats/YUYV/1280x1024 = "015/2" Will change to: /local/domain/2/device/vcamera/0/formats/YUYV/640x480/framerates/ = "30/1,15/1,15/2" /local/domain/2/device/vcamera/0/formats/YUYV/640x480/aspectratio = "1/1" /local/domain/2/device/vcamera/0/formats/YUYV/1280x1024/framerates = "015/2" /local/domain/2/device/vcamera/0/formats/YUYV/1280x1024/aspectratio = "59/58" > > It's important to decide whether or not you want to support video sources > like that (HDMI, Composite/S-Video inputs, USB ports where users can connect > or disconnect webcams) or if you stick to fixed camera pipelines. I believe that this is all hidden from the frontend by the backend, so I se nothing we have to put in the protocol with this respect. > > The big difference is that you don't control what someone can connect as > external sources, so you will have to be a lot more careful and robust. > > I suspect that you likely will want to support such sources eventually, so > it pays to design this with that in mind. Again, I think that this is the backend to hide these use-cases from the frontend. > >> + * >> + * frame-rates >> + * Values: / >> + * >> + * List of XENCAMERA_FRAME_RATE_SEPARATOR separated supported frame rates >> + * of the camera expressed as numerator and denominator of the >> + * corresponding frame rate. >> + * >> + * The format of the directory tree with resolutions and frame rates >> + * must be structured in the following format: >> + * >> + * .../vcamera//// >> + * >> + * where >> + * i - i-th supported pixel format >> + * j - j-th supported resolution for i-th pixel format >> + * k - k-th supported frame rate for i-th pixel format and j-th >> + * resolution> + * >> + *------------------- Camera Request Transport Parameters --------------------- >> + * >> + * This communication path is used to deliver requests from frontend to backend >> + * and get the corresponding responses from backend to frontend, >> + * set up per virtual camera device. >> + * >> + * req-event-channel >> + * Values: >> + * >> + * The identifier of the Xen camera's control event channel >> + * used to signal activity in the ring buffer. >> + * >> + * req-ring-ref >> + * Values: >> + * >> + * The Xen grant reference granting permission for the backend to map >> + * a sole page of camera's control ring buffer. >> + * >> + *-------------------- Camera Event Transport Parameters ---------------------- >> + * >> + * This communication path is used to deliver asynchronous events from backend >> + * to frontend, set up per virtual camera device. >> + * >> + * evt-event-channel >> + * Values: >> + * >> + * The identifier of the Xen camera's event channel >> + * used to signal activity in the ring buffer. >> + * >> + * evt-ring-ref >> + * Values: >> + * >> + * The Xen grant reference granting permission for the backend to map >> + * a sole page of camera's event ring buffer. >> + */ >> + >> +/* >> + ****************************************************************************** >> + * STATE DIAGRAMS >> + ****************************************************************************** >> + * >> + * Tool stack creates front and back state nodes with initial state >> + * XenbusStateInitialising. >> + * Tool stack creates and sets up frontend camera configuration >> + * nodes per domain. >> + * >> + *-------------------------------- Normal flow -------------------------------- >> + * >> + * Front Back >> + * ================================= ===================================== >> + * XenbusStateInitialising XenbusStateInitialising >> + * o Query backend device identification >> + * data. >> + * o Open and validate backend device. >> + * | >> + * | >> + * V >> + * XenbusStateInitWait >> + * >> + * o Query frontend configuration >> + * o Allocate and initialize >> + * event channels per configured >> + * camera. >> + * o Publish transport parameters >> + * that will be in effect during >> + * this connection. >> + * | >> + * | >> + * V >> + * XenbusStateInitialised >> + * >> + * o Query frontend transport parameters. >> + * o Connect to the event channels. >> + * | >> + * | >> + * V >> + * XenbusStateConnected >> + * >> + * o Create and initialize OS >> + * virtual camera as per >> + * configuration. >> + * | >> + * | >> + * V >> + * XenbusStateConnected >> + * >> + * XenbusStateUnknown >> + * XenbusStateClosed >> + * XenbusStateClosing >> + * o Remove virtual camera device >> + * o Remove event channels >> + * | >> + * | >> + * V >> + * XenbusStateClosed >> + * >> + *------------------------------- Recovery flow ------------------------------- >> + * >> + * In case of frontend unrecoverable errors backend handles that as >> + * if frontend goes into the XenbusStateClosed state. >> + * >> + * In case of backend unrecoverable errors frontend tries removing >> + * the virtualized device. If this is possible at the moment of error, >> + * then frontend goes into the XenbusStateInitialising state and is ready for >> + * new connection with backend. If the virtualized device is still in use and >> + * cannot be removed, then frontend goes into the XenbusStateReconfiguring state >> + * until either the virtualized device is removed or backend initiates a new >> + * connection. On the virtualized device removal frontend goes into the >> + * XenbusStateInitialising state. >> + * >> + * Note on XenbusStateReconfiguring state of the frontend: if backend has >> + * unrecoverable errors then frontend cannot send requests to the backend >> + * and thus cannot provide functionality of the virtualized device anymore. >> + * After backend is back to normal the virtualized device may still hold some >> + * state: configuration in use, allocated buffers, client application state etc. >> + * In most cases, this will require frontend to implement complex recovery >> + * reconnect logic. Instead, by going into XenbusStateReconfiguring state, >> + * frontend will make sure no new clients of the virtualized device are >> + * accepted, allow existing client(s) to exit gracefully by signaling error >> + * state etc. >> + * Once all the clients are gone frontend can reinitialize the virtualized >> + * device and get into XenbusStateInitialising state again signaling the >> + * backend that a new connection can be made. >> + * >> + * There are multiple conditions possible under which frontend will go from >> + * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS >> + * specific. For example: >> + * 1. The underlying OS framework may provide callbacks to signal that the last >> + * client of the virtualized device has gone and the device can be removed >> + * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) >> + * to periodically check if this is the right time to re-try removal of >> + * the virtualized device. >> + * 3. By any other means. >> + * >> + ****************************************************************************** >> + * REQUEST CODES >> + ****************************************************************************** >> + */ >> +#define XENCAMERA_OP_SET_CONFIG 0x00 >> +#define XENCAMERA_OP_GET_BUF_DETAILS 0x01 >> +#define XENCAMERA_OP_BUF_CREATE 0x02 >> +#define XENCAMERA_OP_BUF_DESTROY 0x03 >> +#define XENCAMERA_OP_STREAM_START 0x04 >> +#define XENCAMERA_OP_STREAM_STOP 0x05 >> +#define XENCAMERA_OP_GET_CTRL_DETAILS 0x06 >> +#define XENCAMERA_OP_SET_CTRL 0x07 I am thinking about extending the command set a bit as it already has some flaws, e.g. there is no way for a VM to tell the backend that the buffer is not in use anymore and can be given back to the real HW driver, e.g. queue/dequeue in V4L2 terms: #define XENCAMERA_OP_SET_FORMAT        0x00 - will be used to set format: pixel format, resolution #define XENCAMERA_OP_SET_FRAME_RATE    0x01 - used to set the frame rate #define XENCAMERA_OP_BUF_REQUEST       0x02 - asks backend to allocate the given number of buffers, backend replies with real number of those to be used #define XENCAMERA_OP_BUF_CREATE        0x03 - create a shared buffer #define XENCAMERA_OP_BUF_DESTROY       0x04 - destroy a shared buffer #define XENCAMERA_OP_BUF_QUEUE         0x05 - VM tells the backend that it has access to the shared buffer and the buffer cannot be sent back to real HW driver #define XENCAMERA_OP_BUF_DEQUEUE       0x06 - VM tells the backend that the shared buffer is not in use and can be sent to real HW driver #define XENCAMERA_OP_CTRL_ENUM         0x07 - get i-th control ranges and settings #define XENCAMERA_OP_CTRL_GET          0x08 - get control value #define XENCAMERA_OP_CTRL_SET          0x09 - set control value #define XENCAMERA_OP_STREAM_START      0x0a - start streaming #define XENCAMERA_OP_STREAM_STOP       0x0b - stop ctreaming >> + >> +#define XENCAMERA_CTRL_BRIGHTNESS 0x00 >> +#define XENCAMERA_CTRL_CONTRAST 0x01 >> +#define XENCAMERA_CTRL_SATURATION 0x02 >> +#define XENCAMERA_CTRL_HUE 0x03 >> + >> +/* >> + ****************************************************************************** >> + * EVENT CODES >> + ****************************************************************************** >> + */ >> +#define XENCAMERA_EVT_FRAME_AVAIL 0x00 >> + >> +/* >> + ****************************************************************************** >> + * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS >> + ****************************************************************************** >> + */ >> +#define XENCAMERA_DRIVER_NAME "vcamera" > Ah, that's where vcamera comes from. How about calling this xen-camera or > virt-camera? With a preference for xen-camera, since that's what you use for the > defines as well. > > Or perhaps pv-camera? > > Is this driver going to be xen-specific, or more a general approach that everyone > can use? Obviously, the latter would be preferable. As I have already replied to the cover letter with explanations: 'v' stands for 'virtual' and there is a convention to name the Xen virtual devices starting with 'v': vif, vkbd etc. > > BTW, I am not sure if you are aware of this, but the V4L2 API also has support for > radio and RDS hardware. Contact me if this is of interest to Xen to support this as > well given the automotive use-case. Yes, thank you, but at this stage we are targeting camera only. Radio can be another topic if time allows ;) And most probably it will be a dedicated 'vradio' protocol then... > >> + >> +#define XENCAMERA_LIST_SEPARATOR "," >> +#define XENCAMERA_RESOLUTION_SEPARATOR "x" >> +#define XENCAMERA_FRAME_RATE_SEPARATOR "/" >> + >> +#define XENCAMERA_FIELD_BE_VERSIONS "versions" >> +#define XENCAMERA_FIELD_FE_VERSION "version" >> +#define XENCAMERA_FIELD_REQ_RING_REF "req-ring-ref" >> +#define XENCAMERA_FIELD_REQ_CHANNEL "req-event-channel" >> +#define XENCAMERA_FIELD_EVT_RING_REF "evt-ring-ref" >> +#define XENCAMERA_FIELD_EVT_CHANNEL "evt-event-channel" >> +#define XENCAMERA_FIELD_CONTROLS "controls" >> +#define XENCAMERA_FIELD_FORMATS "formats" >> +#define XENCAMERA_FIELD_BE_ALLOC "be-alloc" >> +#define XENCAMERA_FIELD_UNIQUE_ID "unique-id" >> + >> +#define XENCAMERA_CTRL_BRIGHTNESS_STR "brightness" >> +#define XENCAMERA_CTRL_CONTRAST_STR "contrast" >> +#define XENCAMERA_CTRL_SATURATION_STR "saturation" >> +#define XENCAMERA_CTRL_HUE_STR "hue" >> + >> +/* Maximum number of buffer planes supported. */ >> +#define XENCAMERA_MAX_PLANE 4 >> + >> +/* >> + ****************************************************************************** >> + * STATUS RETURN CODES >> + ****************************************************************************** >> + * >> + * Status return code is zero on success and -XEN_EXX on failure. >> + * >> + ****************************************************************************** >> + * Assumptions >> + ****************************************************************************** >> + * >> + * - usage of grant reference 0 as invalid grant reference: >> + * grant reference 0 is valid, but never exposed to a PV driver, >> + * because of the fact it is already in use/reserved by the PV console. >> + * - all references in this document to page sizes must be treated >> + * as pages of size XEN_PAGE_SIZE unless otherwise noted. >> + * >> + ****************************************************************************** >> + * Description of the protocol between frontend and backend driver >> + ****************************************************************************** >> + * >> + * The two halves of a Para-virtual camera driver communicate with >> + * each other using shared pages and event channels. >> + * Shared page contains a ring with request/response packets. >> + * >> + * All reserved fields in the structures below must be 0. >> + * >> + * For all request/response/event packets: >> + * - frame rate parameter is represented as a pair of 4 octet long >> + * numerator and denominator: >> + * - frame_rate_numer - uint32_t, numerator of the frame rate >> + * - frame_rate_denom - uint32_t, denominator of the frame rate >> + * The corresponding frame rate (Hz) is calculated as: >> + * frame_rate = frame_rate_numer / frame_rate_denom >> + * - buffer index is a zero based index of the buffer. Must be less than >> + * the value of XENCAMERA_OP_SET_CONFIG.num_bufs response: >> + * - index - uint8_t, index of the buffer. >> + * >> + * >> + *---------------------------------- Requests --------------------------------- >> + * >> + * All request packets have the same length (64 octets). >> + * All request packets have common header: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id | operation | reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * id - uint16_t, private guest value, echoed in response. >> + * operation - uint8_t, operation code, XENCAMERA_OP_XXX. >> + * >> + * >> + * Request configuration set/reset - request to set or reset. >> + * the configuration/mode of the camera: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id | _OP_SET_CONFIG | reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * | pixel format | 12 >> + * +----------------+----------------+----------------+----------------+ >> + * | width | 16 >> + * +----------------+----------------+----------------+----------------+ >> + * | height | 20 >> + * +----------------+----------------+----------------+----------------+ >> + * | frame_rate_numer | 24 >> + * +----------------+----------------+----------------+----------------+ >> + * | frame_rate_denom | 28 >> + * +----------------+----------------+----------------+----------------+ >> + * | num_bufs | reserved | 32 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 36 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * Pass all zeros to reset, otherwise command is treated as configuration set. >> + * >> + * pixel_format - uint32_t, pixel format to be used, FOURCC code. >> + * width - uint32_t, width in pixels. >> + * height - uint32_t, height in pixels. >> + * frame_rate_numer - uint32_t, numerator of the frame rate. >> + * frame_rate_denom - uint32_t, denominator of the frame rate. > If you have to support HDMI/SDTV inputs as well, then you also need to know > the interlaced format, unless you have no plans to support that. > >> + * num_bufs - uint8_t, desired number of buffers to be used. > Huh? What has that to do with the format? Why would you need this here? Well, the operation name is 'set_config', not 'set_format', so I thought we can have such a cumulative command assembling all the parameters of the configuration. But now I am looking at turning this single 'set_config' command to 3 different commands, which is more practical and aligned with V4L2 in particular (please see above in the command set): 1. set format command:  * pixel_format - uint32_t, pixel format to be used, FOURCC code.  * width - uint32_t, width in pixels.  * height - uint32_t, height in pixels. 2. Set frame rate command:  + * frame_rate_numer - uint32_t, numerator of the frame rate.  + * frame_rate_denom - uint32_t, denominator of the frame rate. 3. Set/request num bufs:  * num_bufs - uint8_t, desired number of buffers to be used. > >> + * >> + * See response format for this request. >> + * >> + * Notes: >> + * - frontend must check the corresponding response in order to see >> + * if the values reported back by the backend do match the desired ones >> + * and can be accepted. >> + * - frontend may send multiple XENCAMERA_OP_SET_CONFIG requests before >> + * sending XENCAMERA_OP_STREAM_START request to update or tune the >> + * configuration. >> + */ >> +struct xencamera_config { >> + uint32_t pixel_format; >> + uint32_t width; >> + uint32_t height; >> + uint32_t frame_rate_nom; >> + uint32_t frame_rate_denom; >> + uint8_t num_bufs; >> +}; >> + >> +/* >> + * Request buffer details - request camera buffer's memory layout. >> + * detailed description: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id |_GET_BUF_DETAILS| reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * See response format for this request. >> + * >> + * >> + * Request camera buffer creation: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id | _OP_BUF_CREATE | reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * | index | reserved | 12 >> + * +----------------+----------------+----------------+----------------+ >> + * | gref_directory | 16 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 20 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * An attempt to create multiple buffers with the same index is an error. >> + * index can be re-used after destroying the corresponding camera buffer. >> + * >> + * index - uint8_t, index of the buffer to be created. >> + * gref_directory - grant_ref_t, a reference to the first shared page >> + * describing shared buffer references. The size of the buffer is equal to >> + * XENCAMERA_OP_GET_BUF_DETAILS.size response. At least one page exists. If >> + * shared buffer size exceeds what can be addressed by this single page, >> + * then reference to the next shared page must be supplied (see >> + * gref_dir_next_page below). > It might be better to allocate all buffers in one go, i.e. what VIDIOC_REQBUFS > does. Well, I still think it is better to have a per buffer interface in the protocol as it is done for other Xen virtual devices. So, I'll keep this as is for now: VIDIOC_REQBUFS can still do what it does internally in the frontend driver > >> + * >> + * If XENCAMERA_FIELD_BE_ALLOC configuration entry is set, then backend will >> + * allocate the buffer with the parameters provided in this request and page >> + * directory is handled as follows: >> + * Frontend on request: >> + * - allocates pages for the directory (gref_directory, >> + * gref_dir_next_page(s) >> + * - grants permissions for the pages of the directory to the backend >> + * - sets gref_dir_next_page fields >> + * Backend on response: >> + * - grants permissions for the pages of the buffer allocated to >> + * the frontend >> + * - fills in page directory with grant references >> + * (gref[] in struct xencamera_page_directory) >> + */ >> +struct xencamera_buf_create_req { >> + uint8_t index; >> + uint8_t reserved[3]; >> + grant_ref_t gref_directory; >> +}; >> + >> +/* >> + * Shared page for XENCAMERA_OP_BUF_CREATE buffer descriptor (gref_directory in >> + * the request) employs a list of pages, describing all pages of the shared >> + * data buffer: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | gref_dir_next_page | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | gref[0] | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | gref[i] | i*4+8 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | gref[N - 1] | N*4+8 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * gref_dir_next_page - grant_ref_t, reference to the next page describing >> + * page directory. Must be 0 if there are no more pages in the list. >> + * gref[i] - grant_ref_t, reference to a shared page of the buffer >> + * allocated at XENCAMERA_OP_BUF_CREATE. >> + * >> + * Number of grant_ref_t entries in the whole page directory is not >> + * passed, but instead can be calculated as: >> + * num_grefs_total = (XENCAMERA_OP_GET_BUF_DETAILS.size + XEN_PAGE_SIZE - 1) / >> + * XEN_PAGE_SIZE >> + */ >> +struct xencamera_page_directory { >> + grant_ref_t gref_dir_next_page; >> + grant_ref_t gref[1]; /* Variable length */ >> +}; >> + >> +/* >> + * Request buffer destruction - destroy a previously allocated camera buffer: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id | _OP_BUF_DESTROY| reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * | index | reserved | 12 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 16 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * index - uint8_t, index of the buffer to be destroyed. >> + */ > There is no V4L2 ioctl to destroy specific buffers. You can only destroy all > of them. This is not specifically related to V4L2, but can be issued in response to backend's state change etc. So, we have a pair of commands to create and destroy buffers. Even more, frontend can be a some-os-based-driver, not V4L2 based. Or even a user-space application if your will. > >> + >> +struct xencamera_buf_destroy_req { >> + uint8_t index; >> +}; >> + >> +/* >> + * Request camera capture stream start: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id |_OP_STREAM_START| reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * >> + * Request camera capture stream stop: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id |_OP_STREAM_STOP | reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * >> + * Request camera control details: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id |GET_CTRL_DETAILS| reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | index | reserved | 12 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 16 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * See response format for this request. >> + * >> + * index - uint8_t, index of the control to be queried. >> + */ >> +struct xencamera_get_ctrl_details_req { >> + uint8_t index; >> +}; >> + >> +/* >> + * >> + * Request camera control change: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id | _OP_SET_CTRL | reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | index | reserved | 12 >> + * +----------------+----------------+----------------+----------------+ >> + * | value | 16 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 20 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * See response format for this request. >> + * >> + * index - uint8_t, index of the control. >> + * value - int32_t, new value of the control. > I would recommend using a int64_t as the control value. Good point, thank you > > Note that there are also controls with a payload (e.g. string controls). Could you please give me an example of such a control? Do you think such controls can be of use in a VM? Can we avoid such controls if we target a simple virtual camera device? If this is for radio use-case, then we'll have such support in 'vradio' protocol if need be > > If there is ever interest in adding radio/RDS support, then that will become > an issue. You mean something like station names, ads etc? > >> + */ >> +struct xencamera_set_ctrl_req { >> + uint8_t index; >> + uint8_t reserved[3]; >> + int32_t value; >> +}; >> + >> +/* >> + *---------------------------------- Responses -------------------------------- >> + * >> + * All response packets have the same length (64 octets). >> + * >> + * All response packets have common header: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id | operation | reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | status | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * id - uint16_t, copied from the request. >> + * operation - uint8_t, XENCAMERA_OP_* - copied from request. >> + * status - int32_t, response status, zero on success and -XEN_EXX on failure. >> + * >> + * >> + * Set configuration response - response for XENCAMERA_OP_SET_CONFIG: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id | _OP_SET_CONFIG | reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | status | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * | pixel format | 12 >> + * +----------------+----------------+----------------+----------------+ >> + * | width | 16 >> + * +----------------+----------------+----------------+----------------+ >> + * | height | 20 >> + * +----------------+----------------+----------------+----------------+ >> + * | frame_rate_numer | 24 >> + * +----------------+----------------+----------------+----------------+ >> + * | frame_rate_denom | 28 >> + * +----------------+----------------+----------------+----------------+ >> + * | num_bufs | reserved | 32 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 36 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * Meaning of the corresponding values in this response is the same as for >> + * XENCAMERA_OP_SET_CONFIG request. >> + * >> + * >> + * Request buffer details response - response for XENCAMERA_OP_GET_BUF_DETAILS >> + * request: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id |_GET_BUF_DETAILS| reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | status | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * | size | 12 >> + * +----------------+----------------+----------------+----------------+ >> + * | num_planes | reserved | 16 >> + * +----------------+----------------+----------------+----------------+ >> + * | plane_offset[0] | 20 >> + * +----------------+----------------+----------------+----------------+ >> + * | plane_offset[1] | 24 >> + * +----------------+----------------+----------------+----------------+ >> + * | plane_offset[2] | 28 >> + * +----------------+----------------+----------------+----------------+ >> + * | plane_offset[3] | 32 >> + * +----------------+----------------+----------------+----------------+ >> + * | plane_size[0] | 36 >> + * +----------------+----------------+----------------+----------------+ >> + * | plane_size[1] | 40 >> + * +----------------+----------------+----------------+----------------+ >> + * | plane_size[2] | 44 >> + * +----------------+----------------+----------------+----------------+ >> + * | plane_size[3] | 48 >> + * +----------------+----------------+----------------+----------------+ >> + * | plane_stride[0] | plane_stride[1] | 52 >> + * +----------------+----------------+----------------+----------------+ >> + * | plane_stride[2] | plane_stride[3] | 56 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 60 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * size - uint32_t, overall size of the buffer including sizes of the >> + * individual planes and padding if applicable. >> + * num_planes - uint8_t, number of planes for this buffer. >> + * plane_offset - array of uint32_t, offset of the corresponding plane >> + * in octets from the buffer start. >> + * plane_size - array of uint32_t, size in octets of the corresponding plane >> + * including padding. >> + * plane_stride - array of uint32_t, size in octets occupied by the >> + * corresponding single image line including padding if applicable. > Nice! Thank you >> + */ >> +struct xencamera_buf_details_resp { >> + uint32_t size; >> + uint8_t num_planes; >> + uint8_t reserved[3]; >> + uint32_t plane_offset[XENCAMERA_MAX_PLANE]; >> + uint32_t plane_size[XENCAMERA_MAX_PLANE]; >> + uint16_t plane_stride[XENCAMERA_MAX_PLANE]; >> +}; >> + >> +/* >> + * Get control details response - response for XENCAMERA_OP_GET_CTRL_DETAILS: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id |GET_CTRL_DETAILS| reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | status | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * | index | type | reserved | 12 >> + * +----------------+----------------+----------------+----------------+ >> + * | min | 16 >> + * +----------------+----------------+----------------+----------------+ >> + * | max | 20 >> + * +----------------+----------------+----------------+----------------+ >> + * | step | 24 >> + * +----------------+----------------+----------------+----------------+ >> + * | def_val | 28 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 36 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * index - uint8_t, index of the camera control in response. >> + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. >> + * min - int32_t, minimum value of the control. >> + * max - int32_t, maximum value of the control. >> + * step - int32_t, minimum size in which control value can be changed. >> + * def_val - int32_t, default value of the control. > I'd go with 64 bit values for min/max/step/def_val. Sure, good idea, thank you > > I would also add a flags field. Some controls are read-only, write-only > or volatile, things userspace needs to know. Then I'll also add numerical constants for such > > If you want to support menu controls, then you need a way to get the menu > names as well (VIDIOC_QUERYMENU). > > None of this is needed for this initial use-case, but you need to think > about this up-front. Yes, thank you >> + */ >> +struct xencamera_get_ctrl_details_resp { >> + uint8_t index; >> + uint8_t type; >> + uint8_t reserved[2]; >> + int32_t min; >> + int32_t max; >> + int32_t step; >> + int32_t def_val; >> +}; >> + >> +/* >> + *----------------------------------- Events ---------------------------------- >> + * >> + * Events are sent via a shared page allocated by the front and propagated by >> + * evt-event-channel/evt-ring-ref XenStore entries. >> + * >> + * All event packets have the same length (64 octets). >> + * All event packets have common header: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id | type | reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * id - uint16_t, event id, may be used by front. >> + * type - uint8_t, type of the event. >> + * >> + * >> + * Frame captured event - event from back to front when a new captured >> + * frame is available: >> + * 0 1 2 3 octet >> + * +----------------+----------------+----------------+----------------+ >> + * | id |_EVT_FRAME_AVAIL| reserved | 4 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 8 >> + * +----------------+----------------+----------------+----------------+ >> + * | index | reserved | 12 >> + * +----------------+----------------+----------------+----------------+ >> + * | used_sz | 16 >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 20 >> + * +----------------+----------------+----------------+----------------+ >> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >> + * +----------------+----------------+----------------+----------------+ >> + * | reserved | 64 >> + * +----------------+----------------+----------------+----------------+ >> + * >> + * index - uint8_t, index of the buffer that contains new captured frame. >> + * used_sz - uint32_t, number of octets this frame has. This can be less >> + * than the XENCAMERA_OP_GET_BUF_DETAILS.size for compressed formats. >> + */ >> +struct xencamera_frame_avail_evt { >> + uint8_t index; >> + uint8_t reserved[3]; >> + uint32_t used_sz; >> +}; >> + >> +struct xencamera_req { >> + uint16_t id; >> + uint8_t operation; >> + uint8_t reserved[5]; >> + union { >> + struct xencamera_config config; >> + struct xencamera_buf_create_req buf_create; >> + struct xencamera_buf_destroy_req buf_destroy; >> + struct xencamera_set_ctrl_req set_ctrl; >> + uint8_t reserved[56]; >> + } req; >> +}; >> + >> +struct xencamera_resp { >> + uint16_t id; >> + uint8_t operation; >> + uint8_t reserved; >> + int32_t status; >> + union { >> + struct xencamera_config config; >> + struct xencamera_buf_details_resp buf_details; >> + struct xencamera_get_ctrl_details_resp ctrl_details; >> + uint8_t reserved1[56]; >> + } resp; >> +}; >> + >> +struct xencamera_evt { >> + uint16_t id; >> + uint8_t type; >> + uint8_t reserved[5]; >> + union { >> + struct xencamera_frame_avail_evt frame_avail; >> + uint8_t reserved[56]; >> + } evt; >> +}; >> + >> +DEFINE_RING_TYPES(xen_cameraif, struct xencamera_req, struct xencamera_resp); >> + >> +/* >> + ****************************************************************************** >> + * Back to front events delivery >> + ****************************************************************************** >> + * In order to deliver asynchronous events from back to front a shared page is >> + * allocated by front and its granted reference propagated to back via >> + * XenStore entries (evt-ring-ref/evt-event-channel). >> + * This page has a common header used by both front and back to synchronize >> + * access and control event's ring buffer, while back being a producer of the >> + * events and front being a consumer. The rest of the page after the header >> + * is used for event packets. >> + * >> + * Upon reception of an event(s) front may confirm its reception >> + * for either each event, group of events or none. >> + */ >> + >> +struct xencamera_event_page { >> + uint32_t in_cons; >> + uint32_t in_prod; >> + uint8_t reserved[56]; >> +}; >> + >> +#define XENCAMERA_EVENT_PAGE_SIZE 4096 >> +#define XENCAMERA_IN_RING_OFFS (sizeof(struct xencamera_event_page)) >> +#define XENCAMERA_IN_RING_SIZE (XENCAMERA_EVENT_PAGE_SIZE - XENCAMERA_IN_RING_OFFS) >> +#define XENCAMERA_IN_RING_LEN (XENCAMERA_IN_RING_SIZE / sizeof(struct xencamera_evt)) >> +#define XENCAMERA_IN_RING(page) \ >> + ((struct xencamera_evt *)((char *)(page) + XENCAMERA_IN_RING_OFFS)) >> +#define XENCAMERA_IN_RING_REF(page, idx) \ >> + (XENCAMERA_IN_RING((page))[(idx) % XENCAMERA_IN_RING_LEN]) >> + >> +#endif /* __XEN_PUBLIC_IO_CAMERAIF_H__ */ >> + >> +/* >> + * Local variables: >> + * mode: C >> + * c-file-style: "BSD" >> + * c-basic-offset: 4 >> + * tab-width: 4 >> + * indent-tabs-mode: nil >> + * End: >> + */ >> > I think the most important decision to make here is whether or not you want to support > hotpluggable sources like HDMI. And an additional complication with that is HDCP. > While V4L2 doesn't have an API for HDCP at the moment, Cisco is working on this and > a patch series adding this is expected later this year/early next year. It might not > be an issue in practice if these are all closed systems, but nevertheless, it is > something to think about. Yes, thank you for raising these questions, it is worth thinking about such use-cases. > > Regards, > > Hans Thank you so much for the comments, Oleksandr