hwmon: Honeywell Humidicon HIH-6130/HIH-6131 humidity and temperature sensor
Subsystems (2)
PATCH v2 1/1 hwmon: Honeywell Humidicon HIH-6130/HIH-6131 humidity and temperature sensor
Hi,
This is a new driver for the Honeywell Humidicon HIH-6130/HIH-6131 humidity sensor.
The driver is based on the existing Sensiron sht21 driver with the necessary changes to the probe, update_measurements and conversion functions necessary to use the Honeywell sensors.
There's no difference between the 6130 & 6131 other than the 6131 having an external condensation filter attached.
Changed for v2:
renamed driver to hih6130
added Documentation/hwmon/hih6130
calcuations now use DIV_ROUND_CLOSEST and shouldn't cause 32bit int overflow addressed other minor review comments
addressing the alignment concern for the hih6130_show_temperature function gives me an 82 char line and a checkpatch fail, I've left it that way for now as there's a couple of other things I'm not sure about, so I think there'll be at least another version of this anyway.
Documentation/hwmon/hih6130 new file +33 -0
@@ -0,0 +1,34 @@ +Kernel driver hih6130 +==========+ +Supported chips: + * Honeywell HIH-6130 / HIH-6131 + Prefix: 'hih6130' + Addresses scanned: none + Datasheet: Publicly available at the Honeywell website + http://sensing.honeywell.com/index.php?ci_id106&la_id=1&defIdD872 + +Author: + Iain Paton <[email protected]> + +Description +----------- + +The HIH-6130 & HIH-6131 are humidity and temperature sensors in a SO8 package. +The difference between the two devices is the HIH-6131 has a condensation +filter + +The devices communicate with the I2C protocol. All sensors are set to the same +I2C address 0x27 by default, so an entry with I2C_BOARD_INFO("hih6130", 0x27) +can be used in the board setup code. + +sysfs-Interface +--------------- + +temp1_input - temperature input +humidity1_input - humidity input + +Notes +----- + +Command mode and alarms are not currently supported.
drivers/hwmon/Kconfig +10 -0
@@ -433,6 +433,16 @@ config SENSORS_GPIO_FAN This driver can also be built as a module. If so, the module will be called gpio-fan. +config SENSORS_HIH6130 + tristate "Honeywell Humidicon HIH-6130 humidity/temperature sensor" + depends on I2C && EXPERIMENTAL + help + If you say yes here you get support for Honeywell Humidicon + HIH-6130 or HIH-6131 Humidicon humidity sensors. + + This driver can also be built as a module. If so, the module + will be called hih6130. + config SENSORS_CORETEMP tristate "Intel Core/Core2/Atom temperature sensor" depends on X86 && PCI && EXPERIMENTAL
drivers/hwmon/Makefile +1 -0
@@ -58,6 +58,7 @@ obj-$(CONFIG_SENSORS_G760A) += g760a.o obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o +obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.o
drivers/hwmon/hih6130.c new file +285 -0
285 lines not on this page · raw message
_______________________________________________
lm-sensors mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Guenter Roeck
maintainerRe: [lm-sensors] [PATCH v2] hwmon: Honeywell Humidicon HIH-6130/HIH-6131 humidity and temperature se
Quoted 18 lines · Iain Paton
Hi,
This is a new driver for the Honeywell Humidicon HIH-6130/HIH-6131 humidity sensor.
The driver is based on the existing Sensiron sht21 driver with the necessary changes to the probe,
update_measurementsand conversion functions necessary to use the Honeywell sensors.There's no difference between the 6130 & 6131 other than the 6131 having an external condensation filter attached.
Changed for v2:
renamed driver to hih6130
addedDocumentation/hwmon/hih6130
calcuations now useDIV_ROUND_CLOSESTand shouldn't cause 32bit int overflow addressed other minor review comments
Quoted 5 lines
addressing the alignment concern for the
hih6130_show_temperaturefunction gives me an 82 char line and a checkpatch fail, I've left it that way for now as there's a couple of other things I'm not sure about, so I think there'll be at least another version of this anyway.
Hi Iain,
almost there.
Please put the above comments after a -- line, and the Signed-off before that. This way I don't have to manually remove it before integration.
Quoted 15 lines
Signed-off-by Iain Paton <[email protected]>Documentation/hwmon/hih6130 new file +7
-0@@ -0,0 +1,34 @@ +Kernel driver hih6130 +==========> + +Supported chips: + * Honeywell HIH-6130 / HIH-6131 + Prefix: 'hih6130' + Addresses scanned: none + Datasheet: Publicly available at the Honeywell website
Documentation/hwmon/hih6130 line 17
Quoted 10 lines
Documentation/hwmon/hih6130 new file +10
-0+ http://sensing.honeywell.com/index.php?ci_id106&la_id=1&defIdD872 + +Author: + Iain Paton <[email protected]> + +Description +----------- + +The HIH-6130 & HIH-6131 are humidity and temperature sensors in a SO8 package. +The difference between the two devices is the HIH-6131 has a condensation
"is that the" the instead of "is the" ?
Documentation/hwmon/hih6130 line 18
Quoted 1 line
Documentation/hwmon/hih6130 new file +1
-0+filter
Add '.'
Documentation/hwmon/hih6130 line 23
Quoted 5 lines
Documentation/hwmon/hih6130 new file +5
-0+ +The devices communicate with the I2C protocol. All sensors are set to the same +I2C address 0x27 by default, so an entry with I2C_BOARD_INFO("hih6130", 0x27) +can be used in the board setup code. +
You could add something like
Please see Documentation/i2c/instantiating-devices for details on how to instantiate I2C devices.
Quoted 15 lines
Documentation/hwmon/hih6130 new file +10
-0+sysfs-Interface +--------------- + +temp1_input - temperature input +humidity1_input - humidity input + +Notes +----- + +Command mode and alarms are not currently supported.drivers/hwmon/Kconfig +0
-0
drivers/hwmon/Kconfig config SENSORS_GPIO_FAN · line 442
Quoted 10 lines
drivers/hwmon/Kconfig +7
-0@@ -433,6 +433,16 @@ config SENSORS_GPIO_FAN This driver can also be built as a module. If so, the module will be called gpio-fan. +config SENSORS_HIH6130 + tristate "Honeywell Humidicon HIH-6130 humidity/temperature sensor" + depends on I2C && EXPERIMENTAL + help + If you say yes here you get support for Honeywell Humidicon + HIH-6130 or HIH-6131 Humidicon humidity sensors. +
s/or/and/
Quoted 52 lines
drivers/hwmon/Kconfig +3
-0+ This driver can also be built as a module. If so, the module + will be called hih6130. + config SENSORS_CORETEMP tristate "Intel Core/Core2/Atom temperature sensor" depends on X86 && PCI && EXPERIMENTALdrivers/hwmon/Makefile +1
-0@@ -58,6 +58,7 @@ obj-$(CONFIG_SENSORS_G760A) += g760a.o obj-$(CONFIG_SENSORS_GL518SM) += gl518sm.o obj-$(CONFIG_SENSORS_GL520SM) += gl520sm.o obj-$(CONFIG_SENSORS_GPIO_FAN) += gpio-fan.o +obj-$(CONFIG_SENSORS_HIH6130) += hih6130.o obj-$(CONFIG_SENSORS_ULTRA45) += ultra45_env.o obj-$(CONFIG_SENSORS_I5K_AMB) += i5k_amb.o obj-$(CONFIG_SENSORS_IBMAEM) += ibmaem.odrivers/hwmon/hih6130.c new file +28
-0@@ -0,0 +1,285 @@ +/* Honeywell HIH-6130/HIH-6131 humidity and temperature sensor driver +* +* Copyright (C) 2012 Iain Paton <[email protected]> +* +* heavily based on the sht21 driver +* Copyright (C) 2010 Urs Fleisch <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA +* +* Data sheets available (2012-06-22) at +* http://sensing.honeywell.com/index.php?ci_id106&la_id=1&defIdD872 +*/ + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/slab.h>
drivers/hwmon/hih6130.c line 38
Quoted 10 lines
drivers/hwmon/hih6130.c new file +10
-0+#include <linux/i2c.h> +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h> +#include <linux/err.h> +#include <linux/mutex.h> +#include <linux/device.h> +#include <linux/delay.h> + +/** +* struct hih6130 - HIH-6136 device specific data
s/6136/6130
drivers/hwmon/hih6130.c line 41
Quoted 3 lines
drivers/hwmon/hih6130.c new file +3
-0+* @hwmon_dev: device registered with hwmon +* @lock: mutex to protect measurement values +* @valid: only 0 before first measurement is taken
s/0/false
Quoted 17 lines
drivers/hwmon/hih6130.c new file +17
-0+* @last_update: time of last update (jiffies) +* @temperature: cached temperature measurement value +* @humidity: cached humidity measurement value +*/ +struct hih6130 { +struct device *hwmon_dev; +struct mutex lock; +bool valid; +unsigned long last_update; +int temperature; +int humidity; +}; + +/** +* hih6130_temp_ticks_to_millicelsius() - convert raw temperature ticks to +* milli celsius +* @ticks: temperature ticks value received from sensor
drivers/hwmon/hih6130.c line 68
Quoted 10 lines
drivers/hwmon/hih6130.c new file +10
-0+*/ +static inline int hih6130_temp_ticks_to_millicelsius (int ticks) +{ + + ticks = ticks >>2 ; +/* +* from data sheet section 5.0 +* Formula T = ( ticks / ( 2^14 - 2 ) ) * 165 -40 +*/ +return (DIV_ROUND_CLOSEST ((ticks *1650 ),16382 ) -400 ) *100 ;
(ticks * 1650) -> ticks * 1650
Quoted 6 lines
drivers/hwmon/hih6130.c new file +6
-0+} + +/** +* hih6130_rh_ticks_to_per_cent_mille() - convert raw humidity ticks to +* one-thousandths of a percent relative humidity +* @ticks: humidity ticks value received from sensor
drivers/hwmon/hih6130.c line 84
Quoted 10 lines
drivers/hwmon/hih6130.c new file +10
-0+*/ +static inline int hih6130_rh_ticks_to_per_cent_mille (int ticks) +{ + + ticks &= ~0xC000 ;/* clear status bits */ +/* +* from data sheet section 4.0 +* Formula RH = ( ticks / ( 2^14 -2 ) ) * 100 +*/ +return DIV_ROUND_CLOSEST ((ticks *1000 ),16382 ) *100 ;
(ticks * 1000) -> ticks * 1000
Quoted 17 lines
drivers/hwmon/hih6130.c new file +17
-0+} + +/** +* hih6130_update_measurements() - get updated measurements from device +* @client: I2C client device +* +* Returns 0 on success, else negative errno. +*/ +static int hih6130_update_measurements (struct i2c_client *client) +{ +int ret =0 ; +int t; +struct hih6130 *hih6130 =i2c_get_clientdata (client); +unsigned char tmp[4 ]; +struct i2c_msg msgs[1 ] = { + { + .addr = client->addr,
drivers/hwmon/hih6130.c line 111
Quoted 10 lines
drivers/hwmon/hih6130.c new file +10
-0+ .flags = I2C_M_RD, + .len = 4, + .buf = tmp, + } + }; + +mutex_lock (&hih6130->lock); + +/* +* Response time for the sensor is measured in seconds, so we have
in seconds ?
Quoted 20 lines
drivers/hwmon/hih6130.c new file +20
-0+* nothing to gain from reading any faster +*/ +if (time_after (jiffies, hih6130->last_update +HZ ) || !hih6130->valid) { + +/* write to slave address, no data, to request a measurement */ + ret =i2c_master_send (client, tmp,0 ); +if (ret <0 ) + goto out; + +/* measurement cycle time is ~36.65msec */ +msleep (40 ); + + ret =i2c_transfer (client->adapter, msgs,1 ); +if (ret <0 ) + goto out; + +if ((tmp[0 ] &0xC0 ) !=0 ) { +dev_err (&client->dev,"Error while reading measurement result\n" ); + ret = -EIO ; + goto out;
drivers/hwmon/hih6130.c line 141
Quoted 10 lines
drivers/hwmon/hih6130.c new file +10
-0+ } + + t = (tmp[0 ] <<8 ) + tmp[1 ]; + hih6130->humidity =hih6130_rh_ticks_to_per_cent_mille (t); + + t = (tmp[2 ] <<8 ) + tmp[3 ]; + hih6130->temperature =hih6130_temp_ticks_to_millicelsius (t); + + hih6130->last_update = jiffies; + hih6130->valid =1 ;
s/1/true/
Quoted 64 lines
drivers/hwmon/hih6130.c new file +64
-0+ } +out: +mutex_unlock (&hih6130->lock); + +return ret >=0 ?0 : ret; +} + +/** +* hih6130_show_temperature() - show temperature measurement value in sysfs +* @dev: device +* @attr: device attribute +* @buf: sysfs buffer (PAGE_SIZE) where measurement values are written to +* +* Will be called on read access to temp1_input sysfs attribute. +* Returns number of bytes written into buffer, negative errno on error. +*/ +static ssize_t hih6130_show_temperature (struct device *dev, +struct device_attribute *attr,char *buf) +{ +struct i2c_client *client =to_i2c_client (dev); +struct hih6130 *hih6130 =i2c_get_clientdata (client); +int ret =hih6130_update_measurements (client); +if (ret <0 ) +return ret; +return sprintf (buf,"%d\n" , hih6130->temperature); +} + +/** +* hih6130_show_humidity() - show humidity measurement value in sysfs +* @dev: device +* @attr: device attribute +* @buf: sysfs buffer (PAGE_SIZE) where measurement values are written to +* +* Will be called on read access to humidity1_input sysfs attribute. +* Returns number of bytes written into buffer, negative errno on error. +*/ +static ssize_t hih6130_show_humidity (struct device *dev, +struct device_attribute *attr,char *buf) +{ +struct i2c_client *client =to_i2c_client (dev); +struct hih6130 *hih6130 =i2c_get_clientdata (client); +int ret =hih6130_update_measurements (client); +if (ret <0 ) +return ret; +return sprintf (buf,"%d\n" , hih6130->humidity); +} + +/* sysfs attributes */ +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, hih6130_show_temperature, + NULL, 0); +static SENSOR_DEVICE_ATTR(humidity1_input, S_IRUGO, hih6130_show_humidity, + NULL, 0); + +static struct attribute *hih6130_attributes[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_humidity1_input.dev_attr.attr, +NULL +}; + +static const struct attribute_group hih6130_attr_group = { + .attrs = hih6130_attributes, +}; + +/**
drivers/hwmon/hih6130.c line 215
Quoted 10 lines
drivers/hwmon/hih6130.c new file +10
-0+* hih6130_probe() - probe device +* @client: I2C client device +* @id: device ID +* +* Called by the I2C core when an entry in the ID table matches a +* device's name. +* Returns 0 on success. +*/ +static int __devinit hih6130_probe (struct i2c_client *client, +const struct i2c_device_id *id)
Please use similar alignments.
Quoted 61 lines
drivers/hwmon/hih6130.c new file +60
-0+{ +struct hih6130 *hih6130; +int err; + +if (!i2c_check_functionality (client->adapter,I2C_FUNC_I2C )) { +dev_err (&client->dev,"adapter does not support true I2C\n" ); +return -ENODEV ; + } + + hih6130 =devm_kzalloc (&client->dev,sizeof (*hih6130),GFP_KERNEL ); +if (!hih6130) +return -ENOMEM ; + +i2c_set_clientdata (client, hih6130); + +mutex_init (&hih6130->lock); + + err =sysfs_create_group (&client->dev.kobj, &hih6130_attr_group); +if (err) { +dev_dbg (&client->dev,"could not create sysfs files\n" ); +return err; + } + + hih6130->hwmon_dev =hwmon_device_register (&client->dev); +if (IS_ERR (hih6130->hwmon_dev)) { +dev_dbg (&client->dev,"unable to register hwmon device\n" ); + err =PTR_ERR (hih6130->hwmon_dev); + goto fail_remove_sysfs; + } + +return 0 ; + +fail_remove_sysfs: +sysfs_remove_group (&client->dev.kobj, &hih6130_attr_group); +return err; +} + +/** +* hih6130_remove() - remove device +* @client: I2C client device +*/ +static int __devexit hih6130_remove(struct i2c_client *client) +{ +struct hih6130 *hih6130 =i2c_get_clientdata (client); + +hwmon_device_unregister (hih6130->hwmon_dev); +sysfs_remove_group (&client->dev.kobj, &hih6130_attr_group); + +return 0 ; +} + +/* Device ID table */ +static const struct i2c_device_id hih6130_id[] = { + {"hih6130" ,0 }, + { } +}; +MODULE_DEVICE_TABLE (i2c, hih6130_id); + +static struct i2c_driver hih6130_driver = { + .driver.name ="hih6130" ,
drivers/hwmon/hih6130.c line 285
Quoted 10 lines
drivers/hwmon/hih6130.c new file +10
-0+ .probe = hih6130_probe, + .remove = __devexit_p(hih6130_remove), + .id_table = hih6130_id, +}; + +module_i2c_driver (hih6130_driver); + +MODULE_AUTHOR ("Iain Paton <[email protected]>" ); +MODULE_DESCRIPTION ("Honeywell HIH-6130 humidity and temperature sensor driver" ); +MODULE_LICENSE ("GPL" );
_______________________________________________
lm-sensors mailing list
[email protected]
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
Re: [lm-sensors] [PATCH v2] hwmon: Honeywell Humidicon HIH-6130/HIH-6131 humidity and temperature se
In reply to Iain PatonT24gMDYvMjIvMjAxMiAwMzozNCBQTSwgR3VlbnRlciBSb2VjayB3cm90ZToKCj4+ICsJICogUmVz cG9uc2UgdGltZSBmb3IgdGhlIHNlbnNvciBpcyBtZWFzdXJlZCBpbiBzZWNvbmRzLCBzbyB3ZSBo YXZlCj4gCj4gaW4gc2Vjb25kcyA/CgpTbywgaG93IHRvIHdvcmQgaXQgdGhlbi4uLiAgSW4gdGhl IGRhdGFzaGVldHMgd29yZHMsICJUaGUgbWVhc3VyZW1lbnQgY3ljbGUgCmR1cmF0aW9uIGlzIHR5 cGljYWxseSAzNi42NSBtcyBmb3IgdGVtcGVyYXR1cmUgYW5kIGh1bWlkaXR5IHJlYWRpbmdzLiIK Ckhvd2V2ZXIgd2UgYWxzbyBoYXZlCgpUYWJsZSAyLiBIdW1pZGl0eSBQZXJmb3JtYW5jZSBTcGVj aWZpY2F0aW9ucwpDaGFyYWN0ZXJpc3RpYyBDb25kaXRpb24gICAgICAgICAgICAgICAgTWluICBU eXAgIE1heCAgVW5pdApSZXNwb25zZSB0aW1lICBhaXJmbG93IG1pbmltdW0gMjAgbC9taW4gIOKA kyAgICA2ICAgIDggICAgcwoKClRhYmxlIDMuIFRlbXBlcmF0dXJlIFBlcmZvcm1hbmNlIFNwZWNp ZmljYXRpb25zCkNoYXJhY3RlcmlzdGljIENvbmRpdGlvbiAgICAgICAgICAgICAgICBNaW4gIFR5 cCAgTWF4ICBVbml0ClJlc3BvbnNlIHRpbWUgIDEvZSBzbG93IG1vdmluZyBhaXIgICAgICAgNSAg ICAtICAgIDMwICAgcwoKU28gYWx0aG91Z2ggd2UgY2FuIHJ1biBhIG1lYXN1cmVtZW50IGluIGFy b3VuZCA0MG1zIGl0IHdpbGwgdGFrZSB0aGUgc2Vuc29yIGxvbmdlcgp0byByZWFjdCB0byBhIGNo YW5nZS4KCkkgYWdyZWUgdGhpcyBuZWVkcyB0byBiZSBjbGVhciwgb3IgdGhlcmUncyBubyBwb2lu dCB0byB0aGUgY29tbWVudC4gSnVzdCB0aGF0IAp5b3UncmUgYXNraW5nIHN1Z2dlc3RzIGl0J3Mg bm90IGNsZWFyIGVub3VnaC4gU3VnZ2VzdGlvbnMgPwoKCkhvdyBhYm91dCB0aGlzOgoKV2hpbGUg dGhlIG1lYXN1cmVtZW50IGNhbiBiZSBjb21wbGV0ZWQgaW4gfjQwbXMgdGhlIHNlbnNvciB0YWtl cyBtdWNoIGxvbmdlciB0byByZWFjdAp0byBhIGNoYW5nZSBpbiBleHRlcm5hbCBjb25kaXRpb25z LiBIb3cgcXVpY2tseSBpdCByZWFjdHMgZGVwZW5kcyBvbiBhaXJmbG93IGFuZCBvdGhlcgpmYWN0 b3JzIG91dHdpdGggb3VyIGNvbnRyb2wuClRoZSBkYXRhc2hlZXQgc3BlY2lmaWVzIG1heGltdW0g J1Jlc3BvbnNlIHRpbWUnIGZvciBodW1pZGl0eSBhdCA4cyBhbmQgdGVtcGVyYXR1cmUgYXQKMzBz IHVuZGVyIHNwZWNpZmllZCBjb25kaXRpb25zLgpXZSB0aGVyZWZvcmUgY2hvb3NlIHRvIG9ubHkg cmVhZCB0aGUgc2Vuc29yIGF0IG1vc3Qgb25jZSBwZXIgc2Vjb25kLiBUaGlzIHRyYWRlcyBvZmYK cG9pbnRsZXNzIGFjdGl2aXR5IHBvbGxpbmcgdGhlIHNlbnNvciBtdWNoIGZhc3RlciB0aGFuIGl0 IGNhbiByZWFjdCBhZ2FpbnN0IGJldHRlciAKcmVzcG9uc2UgdGltZXMgaW4gY29uZGl0aW9ucyBt b3JlIGZhdm91cmFibGUgdGhhbiBzcGVjaWZpZWQgaW4gdGhlIGRhdGFzaGVldC4KClRvbyBtdWNo ID8KCklhaW4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0CmxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDov L2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxtYW4vbGlzdGluZm8vbG0tc2Vuc29ycw=
Guenter Roeck
maintainerRe: [lm-sensors] [PATCH v2] hwmon: Honeywell Humidicon HIH-6130/HIH-6131 humidity and temperature se
In reply to Iain PatonT24gV2VkLCBKdW4gMjcsIDIwMTIgYXQgMDc6NDE6MThBTSArMDAwMCwgSWFpbiBQYXRvbiB3cm90 ZToKPiBPbiAwNi8yMi8yMDEyIDAzOjM0IFBNLCBHdWVudGVyIFJvZWNrIHdyb3RlOgo+IAo+ID4+ ICsJICogUmVzcG9uc2UgdGltZSBmb3IgdGhlIHNlbnNvciBpcyBtZWFzdXJlZCBpbiBzZWNvbmRz LCBzbyB3ZSBoYXZlCj4gPiAKPiA+IGluIHNlY29uZHMgPwo+IApIaSBJYWluLAoKSG93IGFib3V0 ICJSZXNwb25zZSB0aW1lIGZvciB0aGUgc2Vuc29yIHRvIHJlYWN0IHRvIGNoYW5nZXMgaW4gZXh0 ZXJuYWwKY29uZGl0aW9ucyBpcyBzZXZlcmFsIHNlY29uZHMsIHNvIHdlIGhhdmUgLi4uIgoKPiBT bywgaG93IHRvIHdvcmQgaXQgdGhlbi4uLiAgSW4gdGhlIGRhdGFzaGVldHMgd29yZHMsICJUaGUg bWVhc3VyZW1lbnQgY3ljbGUgCj4gZHVyYXRpb24gaXMgdHlwaWNhbGx5IDM2LjY1IG1zIGZvciB0 ZW1wZXJhdHVyZSBhbmQgaHVtaWRpdHkgcmVhZGluZ3MuIgo+IAo+IEhvd2V2ZXIgd2UgYWxzbyBo YXZlCj4gCj4gVGFibGUgMi4gSHVtaWRpdHkgUGVyZm9ybWFuY2UgU3BlY2lmaWNhdGlvbnMKPiBD aGFyYWN0ZXJpc3RpYyBDb25kaXRpb24gICAgICAgICAgICAgICAgTWluICBUeXAgIE1heCAgVW5p dAo+IFJlc3BvbnNlIHRpbWUgIGFpcmZsb3cgbWluaW11bSAyMCBsL21pbiAg4oCTICAgIDYgICAg OCAgICBzCj4gCj4gCj4gVGFibGUgMy4gVGVtcGVyYXR1cmUgUGVyZm9ybWFuY2UgU3BlY2lmaWNh dGlvbnMKPiBDaGFyYWN0ZXJpc3RpYyBDb25kaXRpb24gICAgICAgICAgICAgICAgTWluICBUeXAg IE1heCAgVW5pdAo+IFJlc3BvbnNlIHRpbWUgIDEvZSBzbG93IG1vdmluZyBhaXIgICAgICAgNSAg ICAtICAgIDMwICAgcwo+IAo+IFNvIGFsdGhvdWdoIHdlIGNhbiBydW4gYSBtZWFzdXJlbWVudCBp biBhcm91bmQgNDBtcyBpdCB3aWxsIHRha2UgdGhlIHNlbnNvciBsb25nZXIKPiB0byByZWFjdCB0 byBhIGNoYW5nZS4KPiAKPiBJIGFncmVlIHRoaXMgbmVlZHMgdG8gYmUgY2xlYXIsIG9yIHRoZXJl J3Mgbm8gcG9pbnQgdG8gdGhlIGNvbW1lbnQuIEp1c3QgdGhhdCAKPiB5b3UncmUgYXNraW5nIHN1 Z2dlc3RzIGl0J3Mgbm90IGNsZWFyIGVub3VnaC4gU3VnZ2VzdGlvbnMgPwo+IAo+IAo+IEhvdyBh Ym91dCB0aGlzOgo+IAo+IFdoaWxlIHRoZSBtZWFzdXJlbWVudCBjYW4gYmUgY29tcGxldGVkIGlu IH40MG1zIHRoZSBzZW5zb3IgdGFrZXMgbXVjaCBsb25nZXIgdG8gcmVhY3QKPiB0byBhIGNoYW5n ZSBpbiBleHRlcm5hbCBjb25kaXRpb25zLiBIb3cgcXVpY2tseSBpdCByZWFjdHMgZGVwZW5kcyBv biBhaXJmbG93IGFuZCBvdGhlcgo+IGZhY3RvcnMgb3V0d2l0aCBvdXIgY29udHJvbC4KPiBUaGUg ZGF0YXNoZWV0IHNwZWNpZmllcyBtYXhpbXVtICdSZXNwb25zZSB0aW1lJyBmb3IgaHVtaWRpdHkg YXQgOHMgYW5kIHRlbXBlcmF0dXJlIGF0Cj4gMzBzIHVuZGVyIHNwZWNpZmllZCBjb25kaXRpb25z Lgo+IFdlIHRoZXJlZm9yZSBjaG9vc2UgdG8gb25seSByZWFkIHRoZSBzZW5zb3IgYXQgbW9zdCBv bmNlIHBlciBzZWNvbmQuIFRoaXMgdHJhZGVzIG9mZgo+IHBvaW50bGVzcyBhY3Rpdml0eSBwb2xs aW5nIHRoZSBzZW5zb3IgbXVjaCBmYXN0ZXIgdGhhbiBpdCBjYW4gcmVhY3QgYWdhaW5zdCBiZXR0 ZXIgCj4gcmVzcG9uc2UgdGltZXMgaW4gY29uZGl0aW9ucyBtb3JlIGZhdm91cmFibGUgdGhhbiBz cGVjaWZpZWQgaW4gdGhlIGRhdGFzaGVldC4KPiAKU291bmRzIGxpa2UgYW4gZXhjZWxsZW50IG5v dGUgdG8gYWRkIHRvIHRoZSBEb2N1bWVudGF0aW9uIGZpbGUuCgpUaGFua3MsCkd1ZW50ZXIKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMg bWFpbGluZyBsaXN0CmxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNl bnNvcnMub3JnL21haWxtYW4vbGlzdGluZm8vbG0tc2Vuc29ycw=