From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: usb: musb: Support gadget mode when the port is set to dual role From: Maxime Ripard Message-Id: <20190322130953.kb4llrtz2nriyfbu@flea> Date: Fri, 22 Mar 2019 14:09:53 +0100 To: Bin Liu , Greg Kroah-Hartman , Paul Kocialkowski , Paul Kocialkowski , linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org, Chen-Yu Tsai List-ID: T24gRnJpLCBNYXIgMjIsIDIwMTkgYXQgMDc6NDY6MjJBTSAtMDUwMCwgQmluIExpdSB3cm90ZToK PiBPbiBUaHUsIE1hciAyMSwgMjAxOSBhdCAwNTo0MTozOFBNICswMTAwLCBHcmVnIEtyb2FoLUhh cnRtYW4gd3JvdGU6Cj4gPiBPbiBUaHUsIE1hciAyMSwgMjAxOSBhdCAwMjowMTozM1BNICswMTAw LCBNYXhpbWUgUmlwYXJkIHdyb3RlOgo+ID4gPiBIaSwKPiA+ID4KPiA+ID4gSSdtIHJldml2aW5n IHRoaXMgdGhyZWFkIGEgYml0LCBiZWNhdXNlIEkgZW5jb3VudGVyZWQgdGhpcyBidWcgdG9kYXku Cj4gPiA+Cj4gPiA+IE9uIFRodSwgTWFyIDIxLCAyMDE5IGF0IDExOjAyOjEwQU0gKzAxMDAsIEJp biBMaXUgd3JvdGU6Cj4gPiA+ID4gT24gU2F0LCBBcHIgMjEsIDIwMTggYXQgMTI6NTk6MjNQTSAr MDIwMCwgUGF1bCBLb2NpYWxrb3dza2kgd3JvdGU6Cj4gPiA+ID4gPiBIaSwKPiA+ID4gPiA+Cj4g PiA+ID4gPiBMZSB2ZW5kcmVkaSAyMCBhdnJpbCAyMDE4IMOgIDA5OjI1IC0wNTAwLCBCaW4gTGl1 IGEgw6ljcml0IDoKPiA+ID4gPiA+ID4gT24gVGh1LCBNYXIgMjksIDIwMTggYXQgMDE6NTc6MjRQ TSArMDIwMCwgUGF1bCBLb2NpYWxrb3dza2kgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gSGksCj4gPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBPbiBUaHUsIDIwMTgtMDMtMjkgYXQgMTE6MjMgKzAyMDAs IE1heGltZSBSaXBhcmQgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiBPbiBXZWQsIE1hciAyOCwgMjAx OCBhdCAxMTo1MjoxM1BNICswMjAwLCBQYXVsIEtvY2lhbGtvd3NraSB3cm90ZToKPiA+ID4gPiA+ ID4gPiA+ID4gVGhpcyBhbGxvd3MgZHVhbC1yb2xlIHBvcnRzIHRvIGJlIHJlcG9ydGVkIGFzIGhh dmluZyBnYWRnZXQgbW9kZQo+ID4gPiA+ID4gPiA+ID4gPiBieQo+ID4gPiA+ID4gPiA+ID4gPiB0 aGUKPiA+ID4gPiA+ID4gPiA+ID4gbXVzYl9oYXNfZ2FkZ2V0IGhlbHBlci4gVGhpcyBpcyByZXF1 aXJlZCB0byBlbmFibGUgTVVTQiBhdCBhbGwKPiA+ID4gPiA+ID4gPiA+ID4gd2l0aAo+ID4gPiA+ ID4gPiA+ID4gPiBNVVNCCj4gPiA+ID4gPiA+ID4gPiA+IGdsdWUgbGF5ZXJzIHRoYXQgc2V0IHRo ZSBwb3J0IG1vZGUgdG8gTVVTQl9QT1JUX01PREVfRFVBTF9ST0xFCj4gPiA+ID4gPiA+ID4gPiA+ IGF0Cj4gPiA+ID4gPiA+ID4gPiA+IGluaXQuCj4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ID4gPiA+IE1vc3Qgbm90YWJseSwgdGhpcyBhbGxvd3MgY2FsbGluZyBtdXNiX3N0YXJ0IHdoZW4g bmVlZGVkIGluIHRoZQo+ID4gPiA+ID4gPiA+ID4gPiB2aXJ0dWFsCj4gPiA+ID4gPiA+ID4gPiA+ IE1VU0Igcm9vdCBIVUIsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY3VycmVudCBtb2RlIHNo b3VsZCBiZQo+ID4gPiA+ID4gPiA+ID4gPiBnYWRnZXQKPiA+ID4gPiA+ID4gPiA+ID4gb3IgaG9z dC4KPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gVGhpcyBmaXhlcyBVU0IgT1RH IG9uIEFsbHdpbm5lciBkZXZpY2VzIHRoYXQgSSBjb3VsZCB0ZXN0IGl0Cj4gPiA+ID4gPiA+ID4g PiA+IHdpdGgsCj4gPiA+ID4gPiA+ID4gPiA+IG1haW5seSBBMjAgZGV2aWNlcy4KPiA+ID4gPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gU2lnbmVkLW9mZi1ieTogUGF1bCBLb2NpYWxrb3dz a2kgPGNvbnRhY3RAcGF1bGsuZnI+Cj4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gU3Vy ZWx5IHRoZXJlJ3MgbW9yZSB0byBpdCB0aGFuIHRoYXQuIFRoZSBnYWRnZXQgbW9kZSBvZiBBMjAg Ym9hcmRzCj4gPiA+ID4gPiA+ID4gPiBoYXZlIGJlZW4gd29ya2luZyBpbiB0aGUgcGFzdCwgaW5j bHVkaW5nIHdoZW4gY29tcGlsaW5nIHdpdGggbVVTQgo+ID4gPiA+ID4gPiA+ID4gc2V0dXAgYXMg ZHVhbCByb2xlLgo+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+IElzIHRoaXMgYSByZWdy ZXNzaW9uIHNpbmNlIGEgcGFydGljdWxhciBjb21taXQ/IE9yIGlzIHRoZXJlCj4gPiA+ID4gPiA+ ID4gPiBhbm90aGVyLAo+ID4gPiA+ID4gPiA+ID4gZGVlcGVyIGlzc3VlIG92ZXJsb29rZWQgaW4g dGhlIGNvbW1pdCBsb2c/Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBUaGUgcm9vdCBvZiB0 aGUgaXNzdWUgaGVyZSBpcyB0aGF0IG11c2Jfc3RhcnQgaXMgbm90IGNhbGxlZCBhdCBhbnkKPiA+ ID4gPiA+ID4gPiBwb2ludAo+ID4gPiA+ID4gPiA+IHdpdGhvdXQgdGhpcyBwYXRjaC4gTXkgdW5k ZXJzdGFuZGluZyBvZiB0aGUgZmxvdyBpcyB0aGUgZm9sbG93aW5nOgo+ID4gPiA+ID4gPiA+IHdo ZW4KPiA+ID4gPiA+ID4gPiB0aGUgUEhZIGRldGVjdHMgdGhhdCB0aGVyZSB3YXMgYSBWQlVTL0lE IGNoYW5nZSwgaXQgd2lsbCBub3RpZnkgaXRzCj4gPiA+ID4gPiA+ID4gbGlzdGVuZXJzIChtYWlu bHkgdGhlIG11c2Igc3VueGkgZ2x1ZSBsYXllcikuIFRoaXMgd2lsbCB0aGVuCj4gPiA+ID4gPiA+ ID4gc2NoZWR1bGUKPiA+ID4gPiA+ID4gPiB0aGUgZHJpdmVyJ3Mgd29yayAoc3VueGlfbXVzYl93 b3JrKSwgd2hpY2ggZG9lcyBub3RoaW5nIHNpbmNlIHRoZQo+ID4gPiA+ID4gPiA+IFNVTlhJX01V U0JfRkxfRU5BQkxFRCBiaXQgd2FzIG5ldmVyIHNldC4gVGhpcyBiaXQgaXMgb25seSBzZXQgYWZ0 ZXIKPiA+ID4gPiA+ID4gPiBjYWxsaW5nIHN1bnhpX211c2JfZW5hYmxlLCB3aGljaCBpcyBjYWxs ZWQgZnJvbQo+ID4gPiA+ID4gPiA+IG11c2JfcGxhdGZvcm1fZW5hYmxlLAo+ID4gPiA+ID4gPiA+ IHRoYXQgb3JpZ2luYXRlcyBmcm9tIG11c2Jfc3RhcnQuCj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ ID4gPiBDdXJyZW50bHkgSSBzZWUgdHdvIHBsYWNlcyB3aGVyZSBtdXNiX3N0YXJ0IGlzIGNhbGxl ZDoKPiA+ID4gPiA+ID4gPiAqIG11c2JfdmlydGh1Ygo+ID4gPiA+ID4gPiA+ICogbXVzYl9nYWRn ZXQKPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IEluIHRoZSBsYXR0ZXIgY2FzZSwgaXQgaXMg aW4gdHVybiBjYWxsZWQgZnJvbSB1ZGNfc3RhcnQsIHdoaWNoCj4gPiA+ID4gPiA+ID4gc2hvdWxk Cj4gPiA+ID4gPiA+ID4gcHJvYmFibHkgKGNvcnJlY3QgbWUgaWYgSSdtIHdyb25nKSBoYXBwZW4g bGF0ZXIgaW4gdGhlIGNhbGwgY2hhaW4KPiA+ID4gPiA+ID4gPiB0aGFuCj4gPiA+ID4gPiA+ID4g SUQvVkJVUyBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRpbWUuCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ IEkgZG9uJ3QgdGhpbmsgaXQgaXMgY29ycmVjdCB0aGF0IHVkY19zdGFydCgpIGlzIHRyaWdnZXJl ZCBieSBJRC9WQlVTCj4gPiA+ID4gPiA+IGV2ZW50cywgYnV0IEkgZG9uJ3QgaGF2ZSBhbiBBbGx3 aW5uZXIgcGxhdGZvcm0gdG8gdmVyaWZ5IHRoZSBjYWxsZmxvdy4KPiA+ID4gPiA+Cj4gPiA+ID4g PiBZZXMgeW91J3JlIHJpZ2h0LCBJIGRpZG4ndCBtYWtlIG15c2VsZiB2ZXJ5IGNsZWFyIGhlcmUu IEkgZGlkbid0Cj4gPiA+ID4gPiBpbnZlc3RpZ2F0ZSB0aGUgdWRjX3N0YXJ0IGNhbGwgcGF0aCBt dWNoIHNpbmNlIGl0IHdhcyBhcHBhcmVudGx5IG5vdCB0aGUKPiA+ID4gPiA+IGN1bHByaXQuCj4g PiA+ID4gPgo+ID4gPiA+ID4gPiBIYXZlIHlvdSB0cmllZCB0byBsb2FkIHdpdGggYSBnYWRnZXQg ZHJpdmVyPyBXaGVuIGEgZ2FkZ2V0IGZ1bmN0aW9uIGlzCj4gPiA+ID4gPiA+IGJvdW5kIHRvIFVE QywgdWRjX3N0YXJ0KCkgaXMgdHJpZ2dlcmVkLCB3aGljaCBpbiB0dXJuIGNhbGxzCj4gPiA+ID4g PiA+IG11c2Jfc3RhcnQoKS4KPiA+ID4gPiA+Cj4gPiA+ID4gPiBJdCBkb2VzIHdvcmsgdW5kZXIg dGhhdCBzY2VuYXJpbywgYWx0aG91Z2ggbXkgdXNlZCBjYXNlIGhlcmUgaXMgdXNpbmcKPiA+ID4g PiA+IG11c2Igd2l0aCBEVUFMX1JPTEUgYnV0IG5vIGdhZGdldCBkcml2ZXIgbG9hZGVkLiBUaGF0 IGl0LCBJIHdhbnQgdGhlCj4gPiA+ID4gPiBtdXNiX3N0YXJ0IGNhbGwgdG8gb3JpZ2luYXRlIGZy b20gdGhlIHZpcnR1YWwgaHViLCBub3QgZnJvbSB0aGUgZ2FkZ2V0Cj4gPiA+ID4gPiBzaWRlLgo+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBJbiB0aGUgZm9ybWVyIGNhc2UsIG11c2Jfc3RhcnQgaXMg Y2FsbGVkIGluIHRoZSByb290IGNvbnRyb2xsZXIgaHViCj4gPiA+ID4gPiA+ID4gY29udHJvbCwg d2hlbiBzZXR0aW5nIHRoZSBVU0JfUE9SVF9GRUFUX1BPV0VSIGZlYXR1cmUuIFRoaXMgbG9va3MK PiA+ID4gPiA+ID4gPiBwZXJmZWN0bHkgbGVnaXQgYW5kIElNTyB0aGlzIGlzIHdoZXJlIGl0IHNo b3VsZCBiZSBpbml0aWFsbHkgY2FsbGluZwo+ID4gPiA+ID4gPiA+IG11c2Jfc3RhcnQgaW4gdGhl IGR1YWwgcm9sZSBjYXNlLiBUaGUga2VybmVsIGlzIGluZGVlZCBzZXR0aW5nIHRoZQo+ID4gPiA+ ID4gPgo+ID4gPiA+ID4gPiBObyBhY3R1YWxseS4gQSBkdWFsLXJvbGUgcG9ydCBzaG91bGQgYmUg aW4gYl9pZGxlIHN0YXRlIGJ5IGRlZmF1bHQsIHNvCj4gPiA+ID4gPiA+IGxvZ2ljYWxseSBhbGwg YWN0aW9ucyBzaG91bGQgZ28gdG8gdGhlIGdhZGdldCBwYXRoIHVudGlsIHRoZSBwb3J0Cj4gPiA+ ID4gPiA+IHN3aXRjaGVzIHRvIGhvc3QgbW9kZS4KPiA+ID4gPiA+Cj4gPiA+ID4gPiBJdCBtYWtl cyBzZW5zZSB0aGF0IHRoZSBwb3J0IHNob3VsZCBiZSBpbiBiX2lkbGUgc3RhdGUgYnkgZGVmYXVs dCwgYnV0Cj4gPiA+ID4gPiBoZXJlIGl0IGZhaWxzIHRvIHN3aXRjaCB0byBob3N0IG1vZGUgd2hl biB0aGUgSUQgcGluIGRldGVjdHMgdGhhdCBpdAo+ID4gPiA+ID4gc2hvdWxkLiBPciBkb2VzIGJf aWRsZSBzdGF0ZSBlbnRhaWwgdGhhdCBhIGdhZGdldCBtdXN0IGJlIGxvYWRlZCAocGVyCj4gPiA+ ID4gPiB0aGUgVVNCIHNwZWMpLCBhbmQgdGh1cyBub3RoaW5nIHNob3VsZCAoZXZlcikgaGFwcGVu IHVudGlsIHRoYXQgaGFwcGVucz8KPiA+ID4gPiA+Cj4gPiA+ID4gPiBJIGZpbmQgaXQgcmVhbGx5 IG9kZCB0byBuZWVkIGEgZ2FkZ2V0IGRldmljZSB0byB0cmlnZ2VyIGhvc3QgbW9kZS4KPiA+ID4g PiA+IFRoaXMgcGF0Y2ggZG9lcyBmaXggdGhlIGlzc3VlLCBidXQgSSBhbSBwdXp6bGVkIGFzIHRv IHdoeSBpdCBpcyBuZWVkZWQKPiA+ID4gPiA+IGluIHRoZSBmaXJzdCBwbGFjZS4gVGhlIGNvbW1l bnQgYWJvdmUgaXQgbWVudGlvbnMgdGhhdCAiSW4gT1RHIG1vZGUgd2UKPiA+ID4gPiA+IGhhdmUg dG8gd2FpdCB1bnRpbCB3ZSBsb2FkZWQgYSBnYWRnZXQuIFdlIGRvbid0IHJlYWxseSBuZWVkIGEg Z2FkZ2V0IGlmCj4gPiA+ID4gPiB3ZSBvcGVyYXRlIGFzIGEgaG9zdCBidXQgd2Ugc2hvdWxkIG5v dCBzdGFydCBhIHNlc3Npb24gYXMgYSBkZXZpY2UKPiA+ID4gPiA+IHdpdGhvdXQgYSBnYWRnZXQg b3IgZWxzZSB3ZSBleHBsb2RlLiIsIHdoaWNoIGlzIGFwcGFyZW50bHkgY29tcGF0aWJsZQo+ID4g PiA+ID4gd2l0aCBteSB1c2UgY2FzZTogYSBnYWRnZXQgaXMgbm90IHJlYWxseSBuZWVkZWQgYW5k IEknbSBub3QgdHJ5aW5nIHRvCj4gPiA+ID4gPiBzdGFydCBhIHNlc3Npb24gYXMgYSBkZXZpY2Ug d2l0aG91dCBhIGdhZGdldCBsb2FkZWQuCj4gPiA+ID4gPgo+ID4gPiA+ID4gV2hhdCBkbyB5b3Ug dGhpbms/Cj4gPiA+ID4KPiA+ID4gPiBPa2F5LCB0aGlzIGNhbWUgZG93biB0byBhbiBhcmd1bWVu dCB0aGF0IHdoZXRoZXIgd2Ugc2hvdWxkIHJlcXVpcmUKPiA+ID4gPiBsb2FkaW5nIGEgZ2FkZ2V0 IGRyaXZlciBvbiBhIGR1YWwtcm9sZSBwb3J0IHRvIHdvcmsgaW4gaG9zdCBtb2RlLAo+ID4gPiA+ IHdoaWNoIGlzIGN1cnJlbnRseSByZXF1aXJlZCBvbiBtdXNiIHNpbmNlIGEgbG9uZyBsb25nIHRp bWUgYWdvLgo+ID4gPiA+Cj4gPiA+ID4gSSB1bmRlcnN0YW5kIHRoZSByZXF1aXJlbWVudCBpcyBr aW5kYSB1bm5lY2Vzc2FyeSwgYnV0IHNpbmNlIGl0IGFscmVhZHkKPiA+ID4gPiBleGlzdHMgb24g bXVzYiBzdGFjayBmb3IgYSBsb25nIHRpbWUsIEkgZG9uJ3QgcGxhbiB0byBjaGFuZ2UgaXQuIEJl Y2F1c2UgSQo+ID4gPiA+IGNhbm5vdCB0aGluayBvZiBhIHVzZSBjYXNlIGluIHJlYWwgcHJvZHVj dHMgdGhhdCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkKPiA+ID4gPiBsb2FkIGEgZ2FkZ2V0IGZ1bmN0 aW9uIG9uIHRoZSBkdWFsLXJvbGUgcG9ydC4KPiA+ID4gPgo+ID4gPiA+IElmIHlvdSBjYW4gZXhw bGFpbiBhIHVzZSBjYXNlIGluIHJlYWwgd29ybGQgKG5vdCBhIGVuZ2luZWVyaW5nIGxhYikgdGhh dAo+ID4gPiA+IHRoZSBnYWRnZXQgZHJpdmVyIHdpbGwgbm90IGJlIGxvYWRlZCBhdCBsaW51eCBi b290aW5nIHVwLCBidXQgbGF0ZXIKPiA+ID4gPiBiYXNlZCBvbiB1c2VyJ3MgaW5wdXQsIEkgd2ls bCByZWNvbnNpZGVyIG15IGRlY2lzaW9uLiBUbyByZW1vdmUgdGhpcwo+ID4gPiA+IHJlcXVpcmVt ZW50IGZyb20gbXVzYiBzdGFjaywgdGhlIHdvcmsgaXMgbW9yZSB0aGFuIHRoaXMgcGF0Y2guCj4g PiA+Cj4gPiA+IEkgaGF2ZSBvbmUgZm9yIHlvdTogd2UncmUgd29ya2luZyBvbiBhIGRldmljZSB0 aGF0IGJvb3RzIHByZXR0eSBmYXN0LAo+ID4gPiBhbmQgdGhlcmVmb3JlIGFyZSBwdXNoaW5nIGFz IG11Y2ggdGhpbmdzIGFzIHdlIGNhbiB0byBtb2R1bGVzLiBJdAo+ID4gPiBpbmNsdWRlcyBnYWRn ZXRzLCB0aGUgbXVzYiBkcml2ZXIgYW5kIGdsdWUsIGV0Yy4gVGhhdCBkb2Vzbid0IHNvdW5kCj4g PiA+IHdheSB2ZXJ5IGRpZmZlcmVudCBmcm9tIHdoYXQgYSBnZW5lcmljIGRpc3RybyB3b3VsZCBk byBhcyB3ZWxsLgo+ID4gPgo+ID4gPiBBdCBib290LCB0aGUgdmFyaW91cyBtb2R1bGVzIGZvciB0 aGUgaGFyZHdhcmUgYXJlIGxvYWRlZAo+ID4gPiBhdXRvbWF0aWNhbGx5OiB0aGUgbXVzYiBnbHVl LCB0aGUgbXVzYiBjb3JlLCBvdXIgVVNCIFBIWSwgZXRjLiBXZSBlbmQKPiA+ID4gdXAgaW4gYSBz aXR1YXRpb24gd2hlcmUgdGhlIG11c2IgZHJpdmVyIGlzIGxvYWRlZCBhbmQgcmVwb3J0ZWQgdG8g d29yawo+ID4gPiBwcm9wZXJseS4gVGhlIFVTQiBjYWJsZSB0byB0aGUgT1RHIHBvcnQgKGluIHBl cmlwaGVyYWwpIG1pZ2h0IG9yIG1pZ2h0Cj4gPiA+IG5vdCBiZSBjb25uZWN0ZWQsIGl0J3Mga2lu ZCBvZiBpcnJlbGV2YW50Lgo+ID4gPgo+ID4gPiBUaGUgZ2FkZ2V0cywgaG93ZXZlciwgYXJlIG5v dCBsb2FkZWQgYXV0b21hdGljYWxseS4KPiA+ID4KPiA+ID4gTm93IGNvbWVzIGEgdXNlciB0aGF0 IHdhbnRzIHRvIHVzZSBtdXNiIGFzIGEgaG9zdCwgYW5kIGNvbm5lY3QgYQo+ID4gPiBwcm9wZXIg VVNCIGFkYXB0ZXIsIHRoYXQgd2lyZXMgdGhlIElEIHBpbiBwcm9wZXJseS4gSW4gb3VyIGNhc2Us IHRoZQo+ID4gPiBwaHkgZGV0ZWN0cyBpdCwgcmVwb3J0cyB0aGUgbW9kZSBjaGFuZ2UsIGFuZCAu Li4uIG5vdGhpbmcuCj4gPiA+Cj4gPiA+IFRoYXQgZG9lc24ndCByZWFsbHkgbG9vayBsaWtlIGFu IGVuZ2luZWVyaW5nIGxhYiBzZXR1cCB0byBtZS4KPiA+Cj4gPiBJIGFncmVlLCB0aGF0IHNvdW5k cyBsaWtlIGEgdmFsaWQgc2V0dXAuCj4gPgo+ID4gQWxzbyByZWFsaXplIHRoYXQgQW5kcm9pZCBp cyBwdXNoaW5nIHRvIGhhdmUgYWxsIGRyaXZlcnMgYXMgbW9kdWxlcywgc28KPiA+IHlvdSB3aWxs IHN0YXJ0IHRvIHNlZSBhIHdob2xlIGxvdCBtb3JlIGRldmljZXMgb3V0IHRoZXJlIGJlIG1vZHVs YXIKPiA+IGluc3RlYWQgb2Ygc3RhdGljYWxseSBidWlsdCBrZXJuZWxzLiAgU28gaXNzdWVzIGxp a2UgdGhpcyBhcmUgZ29vZCB0bwo+ID4gcmVzb2x2ZSA6KQo+Cj4gVGhpcyBpc3N1ZSBoZXJlIGlz IG5vdCByZWxhdGVkIHRvIGJ1aWxkaW5nIGFsbCBkcml2ZXJzIGFzIG1vZHVsZXMuIFRvZGF5Cj4g d2UgYWxyZWFkeSBoYXZlIGFsbCBtdXNiIHJlbGF0ZWQgZHJpdmVycyBpbmNsdWRpbmcgZ2FkZ2V0 IGRyaXZlcnMgaW4KPiBtb2R1bGVzLgo+Cj4gVGhlIGlzc3VlIGRpc2N1c3NlZCBoZXJlIGlzIHRo YXQgd2hlbiBtdXNiIGlzIGNvbmZpZ3VyZWQgaW4gZHVhbC1yb2xlCj4gbW9kZSAoZHJfbW9kZSA9 ICdvdGcnIGluIGR0cyksIGEgZ2FkZ2V0IGRyaXZlciBoYXMgdG8gYmUgYm91bmQgdG8gdGhlCj4g dWRjIHRvIG1ha2UgbXVzYiB3b3JraW5nIGluIGhvc3QgbW9kZS4KPgo+IEkgbmV2ZXIgZGlzYWdy ZWUgaXQgaXMgbm90IGlkZWFsLCBidXQgSSBjb25zaWRlciBpdCBpcyBtaW5vciAtIHNpbmNlIHRo ZQo+IHBvcnQgaXMgY29uZmlndXJlZCB0byBkdWFsLXJvbGUgbW9kZSwgaXQgaXMgaW50ZW5kZWQg dG8gd29yayBpbgo+IHBlcmlwaGVyYWwgbW9kZSwgdGhlbiB3aHkgbm90IGF1dG9tYXRpY2FsbHkg bG9hZCB0aGUgZ2FkZ2V0IGRyaXZlciB3aGVuCj4gbGludXggYm9vdHMgdXAuCgpCZWNhdXNlIG5v IG90aGVyIGNvbnRyb2xsZXIgcmVxdWlyZXMgaXQgYW5kIHRoZXJlZm9yZSBpdCdzIG5vdApzdGFu ZGFyZCBhbmQgdmlvbGF0ZXMgdGhlIHByaW5jaXBsZSBvZiBsZWFzdCBzdXJwcmlzZT8KCkFuZCBl dmVuIHdpdGhvdXQgdGFraW5nIHRoaXMgaW50byBhY2NvdW50LCB0aGVyZSdzIGFsc28gdGhlIGZh Y3QgdGhhdAp3aGlsZSB0aGUgKmhhcmR3YXJlKiBjYW4gZG8gZHVhbCByb2xlLCB0aGUgc29mdHdh cmUgbWlnaHQgZGVjaWRlCm90aGVyd2lzZS4gSWYgSSBkb24ndCB3YW50IHRvIGhhdmUgc3VwcG9y dCBmb3IgYW55IGdhZGdldCAoYXQgYWxsKSBpbgp0aGUgZW5kIHN5c3RlbSwgdGhlbiB3aHkgc2hv dWxkIEkgYmUgZm9yY2VkIHRvIGNvbXBpbGUgYW5kIGxvYWQKc29tZXRoaW5nIEkgZG9uJ3QgZXZl biB3YW50IHRvIHVzZSBpbiB0aGUgZmlyc3QgcGxhY2U/CgpUaGUgc2FtZSBzdG9yeSBnb2VzIHdp dGggY29sZCBib290aW5nIHdpdGggYSBkZXZpY2UgcGx1Z2dlZCBpbiwgYW5kCnRoZXJlZm9yZSBh Y3RpbmcgYXMgYSBob3N0IGZyb20gdGhlIHZlcnkgYmVnaW5uaW5nLiBJdCB3aWxsIG5ldmVyIGV2 ZXIKYmUgY29uZmlndXJlZCBhcyBhIHBlcmlwaGVyYWwsIGV2ZW4gdGhvdWdoIHlvdSBtaWdodCBo YXZlIGxvYWRlZCBhCm1vZHVsZS4KCj4gVG8gc3VtbWFyaWVzIG15IGNvbW1lbnRzIG9uIHRoaXMg YWdhaW4sIHNpbmNlIGl0IGlzIG1pbm9yIGluIG15IG9waW5pb24sCj4gSSB3b24ndCBzcGVuZCB0 aW1lIHRvIHNvbHZlIGl0IG15c2VsZiAoaW4gYSBuZWFyIGZ1dHVyZSksIGJ1dCBJIGFtIG1vcmUK PiB0aGFuIGhhcHB5IHRvIHJldmlldyBhbmQgdGFrZSBhbnkgcGF0Y2ggd2hpY2ggc29sdmUgaXQu CgpQYXVsIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBzdGFydGVkIHRoaXMgZGlzY3Vzc2lvbi4gWW91 IG1lbnRpb25uZWQKdGhhdCBpdCdzIG5vdCBlbm91Z2ggYW5kIG90aGVyIHBhcnRzIHNob3VsZCBi ZSBtaXNzaW5nLiBXaGF0IGFyZQp0aG9zZT8KCk1heGltZQotLS0KTWF4aW1lIFJpcGFyZCwgQm9v dGxpbgpFbWJlZGRlZCBMaW51eCBhbmQgS2VybmVsIGVuZ2luZWVyaW5nCmh0dHBzOi8vYm9vdGxp bi5jb20K