From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heikki Krogerus Subject: Re: [PATCH v4 6/7] typec: tcpm: Represent source supply through power_supply class Date: Tue, 30 Jan 2018 15:11:31 +0200 Message-ID: <20180130131131.GF14922@kuha.fi.intel.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: Adam Thomson Cc: Guenter Roeck , Greg Kroah-Hartman , Sebastian Reichel , Hans de Goede , Yueyao Zhu , Rui Miguel Silva , linux-usb@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, support.opensource@diasemi.com List-Id: linux-pm@vger.kernel.org Hi Adam, On Tue, Jan 02, 2018 at 03:50:54PM +0000, Adam Thomson wrote: > This commit adds a power_supply class instance to represent a > PD source's voltage and current properties. This provides an > interface for reading these properties from user-space or other > drivers. > > For PPS enabled Sources, this also provides write access to set > the current and voltage and allows for swapping between standard > PDO and PPS APDO. > > As this represents a superset of the information provided in the > fusb302 driver, the power_supply instance in that code is removed > as part of this change, so reverting the commit titled > 'typec: tcpm: Represent source supply through power_supply class' > Signed-off-by: Adam Thomson > --- > .../ABI/testing/sysfs-class-power-tcpm-source-psy | 92 ++++++++ > drivers/usb/typec/Kconfig | 1 + > drivers/usb/typec/fusb302/Kconfig | 2 +- > drivers/usb/typec/fusb302/fusb302.c | 63 +----- > drivers/usb/typec/tcpm.c | 233 ++++++++++++++++++++- > 5 files changed, 328 insertions(+), 63 deletions(-) > create mode 100644 Documentation/ABI/testing/sysfs-class-power-tcpm-source-psy > > diff --git a/Documentation/ABI/testing/sysfs-class-power-tcpm-source-psy b/Documentation/ABI/testing/sysfs-class-power-tcpm-source-psy > new file mode 100644 > index 0000000..4986cba > --- /dev/null > +++ b/Documentation/ABI/testing/sysfs-class-power-tcpm-source-psy > @@ -0,0 +1,92 @@ > +What: /sys/class/power_supply/tcpm-source-psy/type > +Date: December 2017 > +Contact: Adam Thomson > +Description: > + This read-only property describes the main type of source supply. > + Type-C is a USB standard so this property always returns "USB". > + > +What: /sys/class/power_supply/tcpm-source-psy/connected_type > +Date: December 2017 > +Contact: Adam Thomson > +Description: > + This read-only property describes the type of source supply that is > + connected, if the supply is online. The value is always Type C > + unless a source has been attached which is identified as USB-PD capable. > + > + Valid values: > + - "USB_TYPE_C" : Type C connected supply, not UBS-PD capable > + (default value) > + - "USB_PD" : USB-PD capable source supply connected > + - "USB_PD_PPS" : USB-PD PPS capable source supply connected > + > +What: /sys/class/power_supply/tcpm-source-psy/online > +Date: December 2017 > +Contact: Adam Thomson > +Description: > + This read-write property describes the online state of the source > + supply. When the value of this property is not 0, and the supply allows > + it, then it's possible to switch between online states (i.e. 1 -> 2, > + 2 -> 1) > + > + Valid values: > + - 0 : Offline, no source supply attached > + - 1 : Fixed Online, Type-C or USB-PD capable supply > + attached, non-configurable current and voltage > + properties in this state. > + - 2 : PPS Online, USB-PD PPS feature enabled, 'current_now' > + and 'voltage_now' properties can be modified in this > + state. Re-writing of this value again, once already > + set, will re-request the same configured voltage and > + current values. This can be used as a keep-alive for > + the PPS connection. > + [NOTE: This is value only selectable if > + 'connected_type' reports a value of "USB_PD_PPS"] > + > +What: /sys/class/power_supply/tcpm-source-psy/voltage_min > +Date: December 2017 > +Contact: Adam Thomson > +Description: > + This read-only property describes the minimum voltage the source supply > + can provide. > + > + Value in microvolts. > + > +What: /sys/class/power_supply/tcpm-source-psy/voltage_max > +Date: December 2017 > +Contact: Adam Thomson > +Description: > + This read-only property describes the maximum voltage the source supply > + can provide. > + > + Value in microvolts. > + > +What: /sys/class/power_supply/tcpm-source-psy/voltage_now > +Date: December 2017 > +Contact: Adam Thomson > +Description: > + This read-write property describes the voltage the source supply is > + providing now. This property can only be written to if the source supply > + is in online state '2' (PPS enabled), otherwise it's read-only > + information. > + > + Value in microvolts. > + > +What: /sys/class/power_supply/tcpm-source-psy/current_max > +Date: December 2017 > +Contact: Adam Thomson > +Description: > + This read-only property describes the maximum current the source supply > + can provide. > + > + Value in microamps. > + > +What: /sys/class/power_supply/tcpm-source-psy/current_now > +Date: December 2017 > +Contact: Adam Thomson > +Description: > + This read-write property describes the current the source supply can > + provide now. This property can only be written to if the source supply > + is in online state '2' (PPS enabled), otherwise it's read-only > + information. > + > + Value in microamps. I think those should be documented for the entire psy class, not just for this driver. > diff --git a/drivers/usb/typec/Kconfig b/drivers/usb/typec/Kconfig > index bcb2744..1ef606d 100644 > --- a/drivers/usb/typec/Kconfig > +++ b/drivers/usb/typec/Kconfig > @@ -48,6 +48,7 @@ if TYPEC > config TYPEC_TCPM > tristate "USB Type-C Port Controller Manager" > depends on USB > + select POWER_SUPPLY I'm a little bit uncomfortable with such a strong dependency on an other subsystem that we may not always need, but let's see what Guenter says. Thanks, -- heikki 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: [v4,6/7] typec: tcpm: Represent source supply through power_supply class From: Heikki Krogerus Message-Id: <20180130131131.GF14922@kuha.fi.intel.com> Date: Tue, 30 Jan 2018 15:11:31 +0200 To: Adam Thomson Cc: Guenter Roeck , Greg Kroah-Hartman , Sebastian Reichel , Hans de Goede , Yueyao Zhu , Rui Miguel Silva , linux-usb@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, support.opensource@diasemi.com List-ID: SGkgQWRhbSwKCk9uIFR1ZSwgSmFuIDAyLCAyMDE4IGF0IDAzOjUwOjU0UE0gKzAwMDAsIEFkYW0g VGhvbXNvbiB3cm90ZToKPiBUaGlzIGNvbW1pdCBhZGRzIGEgcG93ZXJfc3VwcGx5IGNsYXNzIGlu c3RhbmNlIHRvIHJlcHJlc2VudCBhCj4gUEQgc291cmNlJ3Mgdm9sdGFnZSBhbmQgY3VycmVudCBw cm9wZXJ0aWVzLiBUaGlzIHByb3ZpZGVzIGFuCj4gaW50ZXJmYWNlIGZvciByZWFkaW5nIHRoZXNl IHByb3BlcnRpZXMgZnJvbSB1c2VyLXNwYWNlIG9yIG90aGVyCj4gZHJpdmVycy4KPiAKPiBGb3Ig UFBTIGVuYWJsZWQgU291cmNlcywgdGhpcyBhbHNvIHByb3ZpZGVzIHdyaXRlIGFjY2VzcyB0byBz ZXQKPiB0aGUgY3VycmVudCBhbmQgdm9sdGFnZSBhbmQgYWxsb3dzIGZvciBzd2FwcGluZyBiZXR3 ZWVuIHN0YW5kYXJkCj4gUERPIGFuZCBQUFMgQVBETy4KPiAKPiBBcyB0aGlzIHJlcHJlc2VudHMg YSBzdXBlcnNldCBvZiB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgaW4gdGhlCj4gZnVzYjMwMiBk cml2ZXIsIHRoZSBwb3dlcl9zdXBwbHkgaW5zdGFuY2UgaW4gdGhhdCBjb2RlIGlzIHJlbW92ZWQK PiBhcyBwYXJ0IG9mIHRoaXMgY2hhbmdlLCBzbyByZXZlcnRpbmcgdGhlIGNvbW1pdCB0aXRsZWQK PiAndHlwZWM6IHRjcG06IFJlcHJlc2VudCBzb3VyY2Ugc3VwcGx5IHRocm91Z2ggcG93ZXJfc3Vw cGx5IGNsYXNzJwoKCgo+IFNpZ25lZC1vZmYtYnk6IEFkYW0gVGhvbXNvbiA8QWRhbS5UaG9tc29u Lk9wZW5zb3VyY2VAZGlhc2VtaS5jb20+Cj4gLS0tCj4gIC4uLi9BQkkvdGVzdGluZy9zeXNmcy1j bGFzcy1wb3dlci10Y3BtLXNvdXJjZS1wc3kgIHwgIDkyICsrKysrKysrCj4gIGRyaXZlcnMvdXNi L3R5cGVjL0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKPiAgZHJpdmVy cy91c2IvdHlwZWMvZnVzYjMwMi9LY29uZmlnICAgICAgICAgICAgICAgICAgfCAgIDIgKy0KPiAg ZHJpdmVycy91c2IvdHlwZWMvZnVzYjMwMi9mdXNiMzAyLmMgICAgICAgICAgICAgICAgfCAgNjMg Ky0tLS0tCj4gIGRyaXZlcnMvdXNiL3R5cGVjL3RjcG0uYyAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgMjMzICsrKysrKysrKysrKysrKysrKysrLQo+ICA1IGZpbGVzIGNoYW5nZWQsIDMyOCBp bnNlcnRpb25zKCspLCA2MyBkZWxldGlvbnMoLSkKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3Vt ZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcG93ZXItdGNwbS1zb3VyY2UtcHN5Cj4g Cj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcG93 ZXItdGNwbS1zb3VyY2UtcHN5IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFz cy1wb3dlci10Y3BtLXNvdXJjZS1wc3kKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAw MDAwMDAuLjQ5ODZjYmEKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkv dGVzdGluZy9zeXNmcy1jbGFzcy1wb3dlci10Y3BtLXNvdXJjZS1wc3kKPiBAQCAtMCwwICsxLDky IEBACj4gK1doYXQ6IAkJL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvdGNwbS1zb3VyY2UtcHN5L3R5 cGUKPiArRGF0ZToJCURlY2VtYmVyIDIwMTcKPiArQ29udGFjdDoJQWRhbSBUaG9tc29uIDxBZGFt LlRob21zb24uT3BlbnNvdXJjZUBkaWFzZW1pLmNvbT4KPiArRGVzY3JpcHRpb246Cj4gKwlUaGlz IHJlYWQtb25seSBwcm9wZXJ0eSBkZXNjcmliZXMgdGhlIG1haW4gdHlwZSBvZiBzb3VyY2Ugc3Vw cGx5Lgo+ICsJVHlwZS1DIGlzIGEgVVNCIHN0YW5kYXJkIHNvIHRoaXMgcHJvcGVydHkgYWx3YXlz IHJldHVybnMgIlVTQiIuCj4gKwo+ICtXaGF0OiAJCS9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L3Rj cG0tc291cmNlLXBzeS9jb25uZWN0ZWRfdHlwZQo+ICtEYXRlOgkJRGVjZW1iZXIgMjAxNwo+ICtD b250YWN0OglBZGFtIFRob21zb24gPEFkYW0uVGhvbXNvbi5PcGVuc291cmNlQGRpYXNlbWkuY29t Pgo+ICtEZXNjcmlwdGlvbjoKPiArCVRoaXMgcmVhZC1vbmx5IHByb3BlcnR5IGRlc2NyaWJlcyB0 aGUgdHlwZSBvZiBzb3VyY2Ugc3VwcGx5IHRoYXQgaXMKPiArCWNvbm5lY3RlZCwgaWYgdGhlIHN1 cHBseSBpcyBvbmxpbmUuIFRoZSB2YWx1ZSBpcyBhbHdheXMgVHlwZSBDCj4gKwl1bmxlc3MgYSBz b3VyY2UgaGFzIGJlZW4gYXR0YWNoZWQgd2hpY2ggaXMgaWRlbnRpZmllZCBhcyBVU0ItUEQgY2Fw YWJsZS4KPiArCj4gKwlWYWxpZCB2YWx1ZXM6Cj4gKwkJLSAiVVNCX1RZUEVfQyIJOiBUeXBlIEMg Y29ubmVjdGVkIHN1cHBseSwgbm90IFVCUy1QRCBjYXBhYmxlCj4gKwkJCQkgIChkZWZhdWx0IHZh bHVlKQo+ICsJCS0gIlVTQl9QRCIJOiBVU0ItUEQgY2FwYWJsZSBzb3VyY2Ugc3VwcGx5IGNvbm5l Y3RlZAo+ICsJCS0gIlVTQl9QRF9QUFMiCTogVVNCLVBEIFBQUyBjYXBhYmxlIHNvdXJjZSBzdXBw bHkgY29ubmVjdGVkCj4gKwo+ICtXaGF0OiAJCS9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L3RjcG0t c291cmNlLXBzeS9vbmxpbmUKPiArRGF0ZToJCURlY2VtYmVyIDIwMTcKPiArQ29udGFjdDoJQWRh bSBUaG9tc29uIDxBZGFtLlRob21zb24uT3BlbnNvdXJjZUBkaWFzZW1pLmNvbT4KPiArRGVzY3Jp cHRpb246Cj4gKwlUaGlzIHJlYWQtd3JpdGUgcHJvcGVydHkgZGVzY3JpYmVzIHRoZSBvbmxpbmUg c3RhdGUgb2YgdGhlIHNvdXJjZQo+ICsJc3VwcGx5LiBXaGVuIHRoZSB2YWx1ZSBvZiB0aGlzIHBy b3BlcnR5IGlzIG5vdCAwLCBhbmQgdGhlIHN1cHBseSBhbGxvd3MKPiArCWl0LCB0aGVuIGl0J3Mg cG9zc2libGUgdG8gc3dpdGNoIGJldHdlZW4gb25saW5lIHN0YXRlcyAoaS5lLiAxIC0+IDIsCj4g KwkyIC0+IDEpCj4gKwo+ICsJVmFsaWQgdmFsdWVzOgo+ICsJCS0gMAk6IE9mZmxpbmUsIG5vIHNv dXJjZSBzdXBwbHkgYXR0YWNoZWQKPiArCQktIDEJOiBGaXhlZCBPbmxpbmUsIFR5cGUtQyBvciBV U0ItUEQgY2FwYWJsZSBzdXBwbHkKPiArCQkJICBhdHRhY2hlZCwgbm9uLWNvbmZpZ3VyYWJsZSBj dXJyZW50IGFuZCB2b2x0YWdlCj4gKwkJCSAgcHJvcGVydGllcyBpbiB0aGlzIHN0YXRlLgo+ICsJ CS0gMgk6IFBQUyBPbmxpbmUsIFVTQi1QRCBQUFMgZmVhdHVyZSBlbmFibGVkLCAnY3VycmVudF9u b3cnCj4gKwkJCSAgYW5kICd2b2x0YWdlX25vdycgcHJvcGVydGllcyBjYW4gYmUgbW9kaWZpZWQg aW4gdGhpcwo+ICsJCQkgIHN0YXRlLiBSZS13cml0aW5nIG9mIHRoaXMgdmFsdWUgYWdhaW4sIG9u Y2UgYWxyZWFkeQo+ICsJCQkgIHNldCwgd2lsbCByZS1yZXF1ZXN0IHRoZSBzYW1lIGNvbmZpZ3Vy ZWQgdm9sdGFnZSBhbmQKPiArCQkJICBjdXJyZW50IHZhbHVlcy4gVGhpcyBjYW4gYmUgdXNlZCBh cyBhIGtlZXAtYWxpdmUgZm9yCj4gKwkJCSAgdGhlIFBQUyBjb25uZWN0aW9uLgo+ICsJCQkgIFtO T1RFOiBUaGlzIGlzIHZhbHVlIG9ubHkgc2VsZWN0YWJsZSBpZgo+ICsJCQkgICAnY29ubmVjdGVk X3R5cGUnIHJlcG9ydHMgYSB2YWx1ZSBvZiAiVVNCX1BEX1BQUyJdCj4gKwo+ICtXaGF0OiAJCS9z eXMvY2xhc3MvcG93ZXJfc3VwcGx5L3RjcG0tc291cmNlLXBzeS92b2x0YWdlX21pbgo+ICtEYXRl OgkJRGVjZW1iZXIgMjAxNwo+ICtDb250YWN0OglBZGFtIFRob21zb24gPEFkYW0uVGhvbXNvbi5P cGVuc291cmNlQGRpYXNlbWkuY29tPgo+ICtEZXNjcmlwdGlvbjoKPiArCVRoaXMgcmVhZC1vbmx5 IHByb3BlcnR5IGRlc2NyaWJlcyB0aGUgbWluaW11bSB2b2x0YWdlIHRoZSBzb3VyY2Ugc3VwcGx5 Cj4gKwljYW4gcHJvdmlkZS4KPiArCj4gKwlWYWx1ZSBpbiBtaWNyb3ZvbHRzLgo+ICsKPiArV2hh dDogCQkvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS90Y3BtLXNvdXJjZS1wc3kvdm9sdGFnZV9tYXgK PiArRGF0ZToJCURlY2VtYmVyIDIwMTcKPiArQ29udGFjdDoJQWRhbSBUaG9tc29uIDxBZGFtLlRo b21zb24uT3BlbnNvdXJjZUBkaWFzZW1pLmNvbT4KPiArRGVzY3JpcHRpb246Cj4gKwlUaGlzIHJl YWQtb25seSBwcm9wZXJ0eSBkZXNjcmliZXMgdGhlIG1heGltdW0gdm9sdGFnZSB0aGUgc291cmNl IHN1cHBseQo+ICsJY2FuIHByb3ZpZGUuCj4gKwo+ICsJVmFsdWUgaW4gbWljcm92b2x0cy4KPiAr Cj4gK1doYXQ6IAkJL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvdGNwbS1zb3VyY2UtcHN5L3ZvbHRh Z2Vfbm93Cj4gK0RhdGU6CQlEZWNlbWJlciAyMDE3Cj4gK0NvbnRhY3Q6CUFkYW0gVGhvbXNvbiA8 QWRhbS5UaG9tc29uLk9wZW5zb3VyY2VAZGlhc2VtaS5jb20+Cj4gK0Rlc2NyaXB0aW9uOgo+ICsJ VGhpcyByZWFkLXdyaXRlIHByb3BlcnR5IGRlc2NyaWJlcyB0aGUgdm9sdGFnZSB0aGUgc291cmNl IHN1cHBseSBpcwo+ICsJcHJvdmlkaW5nIG5vdy4gVGhpcyBwcm9wZXJ0eSBjYW4gb25seSBiZSB3 cml0dGVuIHRvIGlmIHRoZSBzb3VyY2Ugc3VwcGx5Cj4gKwlpcyBpbiBvbmxpbmUgc3RhdGUgJzIn IChQUFMgZW5hYmxlZCksIG90aGVyd2lzZSBpdCdzIHJlYWQtb25seQo+ICsJaW5mb3JtYXRpb24u Cj4gKwo+ICsJVmFsdWUgaW4gbWljcm92b2x0cy4KPiArCj4gK1doYXQ6IAkJL3N5cy9jbGFzcy9w b3dlcl9zdXBwbHkvdGNwbS1zb3VyY2UtcHN5L2N1cnJlbnRfbWF4Cj4gK0RhdGU6CQlEZWNlbWJl ciAyMDE3Cj4gK0NvbnRhY3Q6CUFkYW0gVGhvbXNvbiA8QWRhbS5UaG9tc29uLk9wZW5zb3VyY2VA ZGlhc2VtaS5jb20+Cj4gK0Rlc2NyaXB0aW9uOgo+ICsJVGhpcyByZWFkLW9ubHkgcHJvcGVydHkg ZGVzY3JpYmVzIHRoZSBtYXhpbXVtIGN1cnJlbnQgdGhlIHNvdXJjZSBzdXBwbHkKPiArCWNhbiBw cm92aWRlLgo+ICsKPiArCVZhbHVlIGluIG1pY3JvYW1wcy4KPiArCj4gK1doYXQ6IAkJL3N5cy9j bGFzcy9wb3dlcl9zdXBwbHkvdGNwbS1zb3VyY2UtcHN5L2N1cnJlbnRfbm93Cj4gK0RhdGU6CQlE ZWNlbWJlciAyMDE3Cj4gK0NvbnRhY3Q6CUFkYW0gVGhvbXNvbiA8QWRhbS5UaG9tc29uLk9wZW5z b3VyY2VAZGlhc2VtaS5jb20+Cj4gK0Rlc2NyaXB0aW9uOgo+ICsJVGhpcyByZWFkLXdyaXRlIHBy b3BlcnR5IGRlc2NyaWJlcyB0aGUgY3VycmVudCB0aGUgc291cmNlIHN1cHBseSBjYW4KPiArCXBy b3ZpZGUgbm93LiBUaGlzIHByb3BlcnR5IGNhbiBvbmx5IGJlIHdyaXR0ZW4gdG8gaWYgdGhlIHNv dXJjZSBzdXBwbHkKPiArCWlzIGluIG9ubGluZSBzdGF0ZSAnMicgKFBQUyBlbmFibGVkKSwgb3Ro ZXJ3aXNlIGl0J3MgcmVhZC1vbmx5Cj4gKwlpbmZvcm1hdGlvbi4KPiArCj4gKwlWYWx1ZSBpbiBt aWNyb2FtcHMuCgpJIHRoaW5rIHRob3NlIHNob3VsZCBiZSBkb2N1bWVudGVkIGZvciB0aGUgZW50 aXJlIHBzeSBjbGFzcywgbm90IGp1c3QKZm9yIHRoaXMgZHJpdmVyLgoKPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy91c2IvdHlwZWMvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3R5cGVjL0tjb25maWcKPiBp bmRleCBiY2IyNzQ0Li4xZWY2MDZkIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdXNiL3R5cGVjL0tj b25maWcKPiArKysgYi9kcml2ZXJzL3VzYi90eXBlYy9LY29uZmlnCj4gQEAgLTQ4LDYgKzQ4LDcg QEAgaWYgVFlQRUMKPiAgY29uZmlnIFRZUEVDX1RDUE0KPiAgCXRyaXN0YXRlICJVU0IgVHlwZS1D IFBvcnQgQ29udHJvbGxlciBNYW5hZ2VyIgo+ICAJZGVwZW5kcyBvbiBVU0IKPiArCXNlbGVjdCBQ T1dFUl9TVVBQTFkKCkknbSBhIGxpdHRsZSBiaXQgdW5jb21mb3J0YWJsZSB3aXRoIHN1Y2ggYSBz dHJvbmcgZGVwZW5kZW5jeSBvbiBhbgpvdGhlciBzdWJzeXN0ZW0gdGhhdCB3ZSBtYXkgbm90IGFs d2F5cyBuZWVkLCBidXQgbGV0J3Mgc2VlIHdoYXQKR3VlbnRlciBzYXlzLgoKClRoYW5rcywK