diff for duplicates of <20111203162757.GA24302@ericsson.com> diff --git a/a/1.txt b/N1/1.txt index 5e1279a..ffe91b0 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,454 +1,329 @@ -On Sat, Dec 03, 2011 at 10:31:30AM -0500, Eddi De Pieri wrote: -> This patch add support to multiplexed smbus for proliant microserver -> N36L and may be applicable to other configuration based on sb8xx -> southbus. -> - -Did you read Documentation/SubmittingPatches ? - -The patch doesn't follow the canonical patch format, I can see that lines are split, -the patch isn't based on the linux root directory but on some other directory which -I guess you expect the reader to figure out, the patch description includes lots -of information which is irrelevant for the changelog, and it is based on 2.6.32 -instead of the current release and thus pretty much guaranteed not to apply -to the current kernel version. All that w/o even looking into the code. - -The patch implements an I2C multiplexer but doesn't use the I2C multiplexer -infrastructure. I am not one of the I2C maintainers, but that alone would cause me -to reject this patch (on top of all the other reasons above). - -Guenter - -> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -l -> i2c-0 smbus SMBus piix4 adapter (SDA0) SMBus adapter -> i2c-1 smbus SMBus piix4 adapter (SDA2) SMBus adapter -> i2c-2 smbus SMBus piix4 adapter (SDA3) SMBus adapter -> i2c-3 smbus SMBus piix4 adapter (SDA4) SMBus adapter -> root@proliant:/usr/src/lm-sensors/eddi# -> -> yes SDA1 is reserved... so i can't multiplex it -> -> root@proliant:/usr/src/lm-sensors/eddi# sensors -> k10temp-pci-00c3 -> Adapter: PCI adapter -> temp1: +24.5°C (high = +70.0°C, crit = +100.0°C) -> -> w83795adg-i2c-1-2f -> Adapter: SMBus piix4 adapter (SDA2) -> in0: +1.02 V (min = +0.00 V, max = +2.05 V) -> in1: +1.52 V (min = +0.00 V, max = +2.05 V) -> in2: +1.10 V (min = +0.00 V, max = +2.05 V) -> in3: +0.89 V (min = +0.00 V, max = +2.05 V) -> in12: +3.35 V (min = +0.00 V, max = +6.14 V) -> in13: +3.28 V (min = +0.00 V, max = +6.14 V) -> fan1: 703 RPM (min = 329 RPM) -> temp1: +23.0°C (high = +109.0°C, hyst = +109.0°C) -> (crit = +109.0°C, hyst = +109.0°C) sensor = thermal diode -> temp2: +33.2°C (high = +105.0°C, hyst = +105.0°C) -> (crit = +105.0°C, hyst = +105.0°C) sensor = thermal diode -> temp5: +14.0°C (high = +39.0°C, hyst = +39.0°C) -> (crit = +44.0°C, hyst = +44.0°C) sensor = thermistor -> beep_enable:disabled -> -> jc42-i2c-0-18 -> Adapter: SMBus piix4 adapter (SDA0) -> temp1: +20.5°C (low = +0.0°C, high = +0.0°C) ALARM -> (crit = +0.0°C, hyst = +0.0°C) ALARM -> -> -> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 0 -> 0 1 2 3 4 5 6 7 8 9 a b c d e f -> 00: -- -- -- -- -- -- -- -- -- -- -- -- -- -> 10: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- -> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 70: -- -- -- -- -- -- -- -- -> -> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 1 -> 0 1 2 3 4 5 6 7 8 9 a b c d e f -> 00: -- -- -- -- -- -- -- -- -- -- -- -- -- -> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- UU -> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 60: -- 61 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 70: -- -- -- -- -- -- -- -- -> -> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 2 -> 0 1 2 3 4 5 6 7 8 9 a b c d e f -> 00: -- -- -- -- -- -- -- -- -- -- -- -- -- -> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 40: -- -- -- -- -- -- -- -- -- -- -- -- 4c -- -- -- -> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 70: -- -- -- -- -- -- -- -- -> -> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 3 -> 0 1 2 3 4 5 6 7 8 9 a b c d e f -> 00: -- -- -- -- -- -- -- -- -- -- -- -- -- -> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -> 70: -- -- -- -- -- -- -- -- -> -> pay attention that the msleep seems to be really needed... -> -> Signed-off-by: Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org> -> -> Regards, -> -> Eddi -> -> follows patch.... -> -> diff -u -N -r 2.6.32.orig/i2c-piix4.c 2.6.32/i2c-piix4.c -> --- 2.6.32.orig/i2c-piix4.c 2011-11-16 17:07:03.000000000 +0100 -> +++ 2.6.32/i2c-piix4.c 2011-11-16 15:21:17.000000000 +0100 -> @@ -97,7 +97,8 @@ -> static unsigned short piix4_smba; -> static int srvrworks_csb5_delay; -> static struct pci_driver piix4_driver; -> -static struct i2c_adapter piix4_adapter; -> +struct i2c_adapter piix4_adapter; -> +EXPORT_SYMBOL_GPL(piix4_adapter); -> -> static struct dmi_system_id __devinitdata piix4_dmi_blacklist[] = { -> { -> @@ -246,10 +247,22 @@ -> "0x%x already in use!\n", smba_idx); -> return -EBUSY; -> } -> - outb_p(smb_en, smba_idx); -> - smba_en_lo = inb_p(smba_idx + 1); -> - outb_p(smb_en + 1, smba_idx); -> - smba_en_hi = inb_p(smba_idx + 1); -> + outb_p(smb_en, smba_idx); //seleziono il registro 0x2c -> + smba_en_lo = inb_p(smba_idx + 1); //leggo il dato L del registro 0x2c -> + outb_p(smb_en + 1, smba_idx); //seleziono il registro 0x2c + 1 -> + smba_en_hi = inb_p(smba_idx + 1); //leggo il dato H del registro 0x2c -> + -> + outb_p(smb_en, smba_idx); //seleziono il registro 0x2c -> + outb_p(smba_en_lo & 0xF9 , smba_idx + 1); //seleziono la porta 0 00 0 -> + outb_p(smb_en + 1, smba_idx); //seleziono il registro 0x2c + 1 -> + outb_p(smba_en_hi, smba_idx + 1); -> + -> + outb_p(smb_en, smba_idx); //seleziono il registro 0x2c -> + smba_en_lo = inb_p(smba_idx + 1); //leggo il dato L del registro 0x2c -> + outb_p(smb_en + 1, smba_idx); //seleziono il registro 0x2c + 1 -> + smba_en_hi = inb_p(smba_idx + 1); //leggo il dato H del registro 0x2c -> + -> + -> release_region(smba_idx, 2); -> -> if ((smba_en_lo & 1) == 0) { -> @@ -258,6 +271,8 @@ -> return -ENODEV; -> } -> -> + dev_info(&PIIX4_dev->dev,"Selected Default Smbus Port 0x%x", -> (smba_en_lo & 0x6) >> 1); -> + -> piix4_smba = ((smba_en_hi << 8) | smba_en_lo) & 0xffe0; -> if (acpi_check_region(piix4_smba, SMBIOSIZE, piix4_driver.name)) -> return -ENODEV; -> @@ -466,7 +481,7 @@ -> .functionality = piix4_func, -> }; -> -> -static struct i2c_adapter piix4_adapter = { -> +struct i2c_adapter piix4_adapter = { -> .owner = THIS_MODULE, -> .class = I2C_CLASS_HWMON | I2C_CLASS_SPD, -> .algo = &smbus_algorithm, -> diff -u -N -r 2.6.32.orig/i2c-piix4-n36l.c 2.6.32/i2c-piix4-n36l.c -> --- 2.6.32.orig/i2c-piix4-n36l.c 1970-01-01 01:00:00.000000000 +0100 -> +++ 2.6.32/i2c-piix4-n36l.c 2011-11-16 16:02:01.000000000 +0100 -> @@ -0,0 +1,247 @@ -> +/* -> + * i2c-piix4-n36l.c - i2c-piix4 extras for the HP proliant -> microserver n36l motherboard -> + * -> + * Copyright (C) 2004, 2008 Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org> -> + * Copyright (C) 2011 Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org> -> + * -> + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. -> + */ -> + -> +/* -> + * We select the channels by sending commands to the sb800 southbus -> + * the selection bit -> + * http://support.amd.com/us/Embedded_TechDocs/45482.pdf -> + * Smbus0En - RW – 16 bits - [PM_Reg: 2Ch] -> + * Field Name Bits Default Description -> + * SmBus0En 0 0b Set to 1 to enable SMBUS0 function and decoding. -> + * SmBus0Sel 2:1 00b SmBus port selection when PM_Reg 2Fh bit 0 is set to 0 -> + * 00: Port 0 -> + * 01: Port 2 -> + * 10: Port 3 -> + * 11: Port 4 -> + */ -> + -> +#include <linux/module.h> -> +#include <linux/kernel.h> -> +#include <linux/slab.h> -> +#include <linux/init.h> -> +#include <linux/i2c.h> -> +#include <linux/mutex.h> -> +#include <asm/io.h> -> + -> +extern struct i2c_adapter piix4_adapter; -> + -> +static struct i2c_adapter *n36l_adapter; -> +static struct i2c_algorithm *n36l_algo; -> + -> +/* Wrapper access functions for multiplexed SMBus */ -> +static DEFINE_MUTEX(piix4_lock); -> + -> +/* We remember the last used channels combination so as to only switch -> + channels when it is really needed. This greatly reduces the SMBus -> + overhead, but also assumes that nobody will be writing to the PCA9556 -> + in our back. */ -> +static u8 last_channels; -> + -> +static inline s32 piix4_access_channel(struct i2c_adapter * adap, u16 addr, -> + unsigned short flags, char read_write, -> + u8 command, int size, -> + union i2c_smbus_data * data, -> + u8 channels) -> +{ -> + int error; -> + unsigned short smba_idx = 0xcd6; -> + u8 smba_en_lo, smba_en_hi, smb_en = 0x2c; -> + -> + mutex_lock(&piix4_lock); -> + -> + if (last_channels != channels) { -> + union i2c_smbus_data mplxdata; -> + mplxdata.byte = channels; -> + -> + /* Determine the address of the SMBus areas */ -> + if (!request_region(smba_idx, 2, "smba_idx")) { -> + dev_err(&piix4_adapter.dev, "SMBus base address index region " -> + "0x%x already in use!\n", smba_idx); -> + return -EBUSY; -> + } -> + -> + outb_p(smb_en, smba_idx); //seleziono il registro 0x2c -> + smba_en_lo = inb_p(smba_idx + 1); //leggo il dato L del registro 0x2c -> + outb_p(smb_en + 1, smba_idx); //seleziono il registro 0x2c + 1 -> + smba_en_hi = inb_p(smba_idx + 1); //leggo il dato H del registro 0x2c -> + -> + msleep(50); -> + outb_p(smb_en, smba_idx); //seleziono il registro 0x2c -> + outb_p((smba_en_lo & 0xF9 )+ ( channels << 1) , smba_idx + 1); -> //seleziono la porta 0 00 0 -> + outb_p(smb_en + 1, smba_idx); //seleziono il registro 0x2c + 1 -> + outb_p(smba_en_hi, smba_idx + 1); -> + -> + msleep(50); -> + -> + release_region(smba_idx, 2); -> + -> + dev_info(&piix4_adapter.dev,"Selected Smbus Port 0x%x", (smba_en_lo -> & 0x6) >> 1); -> + -> + last_channels = channels; -> + -> + } -> + -> + error = piix4_adapter.algo->smbus_xfer(adap, addr, flags, read_write, -> + command, size, data); -> + -> + -> + mutex_unlock(&piix4_lock); -> + return error; -> +} -> + -> +static s32 piix4_access_virt0(struct i2c_adapter * adap, u16 addr, -> + unsigned short flags, char read_write, -> + u8 command, int size, -> + union i2c_smbus_data * data) -> +{ -> + return piix4_access_channel(adap, addr, flags, read_write, command, -> + size, data, 0); -> +} -> + -> +static s32 piix4_access_virt1(struct i2c_adapter * adap, u16 addr, -> + unsigned short flags, char read_write, -> + u8 command, int size, -> + union i2c_smbus_data * data) -> +{ -> + return piix4_access_channel(adap, addr, flags, read_write, command, -> + size, data, 1); -> +} -> + -> +static s32 piix4_access_virt2(struct i2c_adapter * adap, u16 addr, -> + unsigned short flags, char read_write, -> + u8 command, int size, -> + union i2c_smbus_data * data) -> +{ -> + return piix4_access_channel(adap, addr, flags, read_write, command, -> + size, data, 2); -> +} -> + -> +static s32 piix4_access_virt3(struct i2c_adapter * adap, u16 addr, -> + unsigned short flags, char read_write, -> + u8 command, int size, -> + union i2c_smbus_data * data) -> +{ -> + return piix4_access_channel(adap, addr, flags, read_write, command, -> + size, data, 3); -> +} -> + -> +static int __init piix4_n36l_init(void) -> +{ -> + int i, error; -> + -> + if (!piix4_adapter.dev.parent) -> + return -ENODEV; -> + -> + printk(KERN_INFO "Configure the AMD SB800 Multiplexer\n"); -> + -> + /* Unregister physical bus */ -> + error = i2c_del_adapter(&piix4_adapter); -> + if (error) { -> + dev_err(&piix4_adapter.dev, "Physical bus removal failed\n"); -> + goto ERROR0; -> + } -> + -> + printk(KERN_INFO "Enabling SMBus multiplexing for Hp Proliant -> Microserver N36l\n"); -> + /* Define the 4 virtual adapters and algorithms structures */ -> + if (!(n36l_adapter = kzalloc(5 * sizeof(struct i2c_adapter), -> + GFP_KERNEL))) { -> + error = -ENOMEM; -> + goto ERROR1; -> + } -> + if (!(n36l_algo = kzalloc(5 * sizeof(struct i2c_algorithm), -> + GFP_KERNEL))) { -> + error = -ENOMEM; -> + goto ERROR2; -> + } -> + -> + /* Fill in the new structures */ -> + n36l_algo[0] = *(piix4_adapter.algo); -> + n36l_algo[0].smbus_xfer = piix4_access_virt0; -> + n36l_adapter[0] = piix4_adapter; -> + snprintf(n36l_adapter[0].name, sizeof(n36l_adapter[0].name), -> + "SMBus piix4 adapter (SDA0)"); -> + n36l_adapter[0].algo = n36l_algo; -> + n36l_adapter[0].dev.parent = piix4_adapter.dev.parent; -> + for (i = 1; i < 4; i++) { -> + n36l_algo[i] = *(piix4_adapter.algo); -> + n36l_adapter[i] = piix4_adapter; -> + snprintf(n36l_adapter[i].name, sizeof(n36l_adapter[i].name), -> + "SMBus piix4 adapter (SDA%d)", i + 1); -> + n36l_adapter[i].algo = n36l_algo+i; -> + n36l_adapter[i].dev.parent = piix4_adapter.dev.parent; -> + } -> + n36l_algo[1].smbus_xfer = piix4_access_virt1; -> + n36l_algo[2].smbus_xfer = piix4_access_virt2; -> + n36l_algo[3].smbus_xfer = piix4_access_virt3; -> + -> + /* Register virtual adapters */ -> + for (i = 0; i < 4; i++) { -> + error = i2c_add_adapter(n36l_adapter+i); -> + if (error) { -> + printk(KERN_ERR "i2c-piix4-n36l: " -> + "Virtual adapter %d registration " -> + "failed, module not inserted\n", i); -> + for (i--; i >= 0; i--) -> + i2c_del_adapter(n36l_adapter+i); -> + goto ERROR3; -> + } -> + } -> + -> + return 0; -> + -> +ERROR3: -> + kfree(n36l_algo); -> + n36l_algo = NULL; -> +ERROR2: -> + kfree(n36l_adapter); -> + n36l_adapter = NULL; -> +ERROR1: -> + /* Restore physical bus */ -> + i2c_add_adapter(&piix4_adapter); -> +ERROR0: -> + return error; -> +} -> + -> +static void __exit piix4_n36l_exit(void) -> +{ -> + if (n36l_adapter) { -> + int i; -> + -> + for (i = 0; i < 5; i++) -> + i2c_del_adapter(n36l_adapter+i); -> + kfree(n36l_adapter); -> + n36l_adapter = NULL; -> + } -> + kfree(n36l_algo); -> + n36l_algo = NULL; -> + -> + /* Restore physical bus */ -> + if (i2c_add_adapter(&piix4_adapter)) -> + printk(KERN_ERR "i2c-piix4-n36l: " -> + "Physical bus restoration failed\n"); -> +} -> + -> +MODULE_AUTHOR("Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org"); -> +MODULE_DESCRIPTION("n36l SMBus multiplexing"); -> +MODULE_LICENSE("GPL"); -> + -> +module_init(piix4_n36l_init); -> +module_exit(piix4_n36l_exit); -> -> -> On Sun, Nov 27, 2011 at 11:55 PM, Ben Dooks <ben-i2c-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org> wrote: -> > -> > On Fri, Nov 25, 2011 at 11:07:21PM +0100, Eddi De Pieri wrote: -> >> This patch add support to multiplexed smbus for proliant microserver -> >> N36L and may be applicable to other configuration based on sb8xx -> >> southbus. -> >> -> >> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -l -> >> i2c-0 smbus SMBus piix4 adapter (SDA0) SMBus adapter -> >> i2c-1 smbus SMBus piix4 adapter (SDA2) SMBus adapter -> >> i2c-2 smbus SMBus piix4 adapter (SDA3) SMBus adapter -> >> i2c-3 smbus SMBus piix4 adapter (SDA4) SMBus adapter -> >> root@proliant:/usr/src/lm-sensors/eddi# -> > -> > patch should go inline so it can be reviewed, thanks. -> > -> > -- -> > Ben Dooks, ben-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org, http://www.fluff.org/ben/ -> > -> > Large Hadron Colada: A large Pina Colada that makes the universe disappear. -> > -> -> _______________________________________________ -> lm-sensors mailing list -> lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org -> http://lists.lm-sensors.org/mailman/listinfo/lm-sensors +T24gU2F0LCBEZWMgMDMsIDIwMTEgYXQgMTA6MzE6MzBBTSAtMDUwMCwgRWRkaSBEZSBQaWVyaSB3 +cm90ZToKPiBUaGlzIHBhdGNoIGFkZCBzdXBwb3J0IHRvIG11bHRpcGxleGVkIHNtYnVzIGZvciBw +cm9saWFudCBtaWNyb3NlcnZlcgo+IE4zNkwgYW5kIG1heSBiZSBhcHBsaWNhYmxlIHRvIG90aGVy +IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gc2I4eHgKPiBzb3V0aGJ1cy4KPiAKCkRpZCB5b3UgcmVh +ZCBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzID8KClRoZSBwYXRjaCBkb2Vzbid0IGZv +bGxvdyB0aGUgY2Fub25pY2FsIHBhdGNoIGZvcm1hdCwgSSBjYW4gc2VlIHRoYXQgbGluZXMgYXJl +IHNwbGl0LAp0aGUgcGF0Y2ggaXNuJ3QgYmFzZWQgb24gdGhlIGxpbnV4IHJvb3QgZGlyZWN0b3J5 +IGJ1dCBvbiBzb21lIG90aGVyIGRpcmVjdG9yeSB3aGljaApJIGd1ZXNzIHlvdSBleHBlY3QgdGhl +IHJlYWRlciB0byBmaWd1cmUgb3V0LCB0aGUgcGF0Y2ggZGVzY3JpcHRpb24gaW5jbHVkZXMgbG90 +cwpvZiBpbmZvcm1hdGlvbiB3aGljaCBpcyBpcnJlbGV2YW50IGZvciB0aGUgY2hhbmdlbG9nLCBh +bmQgaXQgaXMgYmFzZWQgb24gMi42LjMyCmluc3RlYWQgb2YgdGhlIGN1cnJlbnQgcmVsZWFzZSBh +bmQgdGh1cyBwcmV0dHkgbXVjaCBndWFyYW50ZWVkIG5vdCB0byBhcHBseQp0byB0aGUgY3VycmVu +dCBrZXJuZWwgdmVyc2lvbi4gQWxsIHRoYXQgdy9vIGV2ZW4gbG9va2luZyBpbnRvIHRoZSBjb2Rl +LgoKVGhlIHBhdGNoIGltcGxlbWVudHMgYW4gSTJDIG11bHRpcGxleGVyIGJ1dCBkb2Vzbid0IHVz +ZSB0aGUgSTJDIG11bHRpcGxleGVyCmluZnJhc3RydWN0dXJlLiBJIGFtIG5vdCBvbmUgb2YgdGhl +IEkyQyBtYWludGFpbmVycywgYnV0IHRoYXQgYWxvbmUgd291bGQgY2F1c2UgbWUKdG8gcmVqZWN0 +IHRoaXMgcGF0Y2ggKG9uIHRvcCBvZiBhbGwgdGhlIG90aGVyIHJlYXNvbnMgYWJvdmUpLgoKR3Vl +bnRlcgoKPiByb290QHByb2xpYW50Oi91c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMgaTJjZGV0ZWN0 +IC1sCj4gaTJjLTAgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBMCkg +ICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiBpMmMtMSAgIHNtYnVzICAgICAgICAgICBTTUJ1 +cyBwaWl4NCBhZGFwdGVyIChTREEyKSAgICAgICAgICAgICAgU01CdXMgYWRhcHRlcgo+IGkyYy0y +ICAgc21idXMgICAgICAgICAgIFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTMpICAgICAgICAgICAg +ICBTTUJ1cyBhZGFwdGVyCj4gaTJjLTMgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRh +cHRlciAoU0RBNCkgICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiByb290QHByb2xpYW50Oi91 +c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMKPiAKPiB5ZXMgU0RBMSBpcyByZXNlcnZlZC4uLiBzbyBp +IGNhbid0IG11bHRpcGxleCBpdAo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29y +cy9lZGRpIyBzZW5zb3JzCj4gazEwdGVtcC1wY2ktMDBjMwo+IEFkYXB0ZXI6IFBDSSBhZGFwdGVy +Cj4gdGVtcDE6ICAgICAgICsyNC41wrBDICAoaGlnaCA9ICs3MC4wwrBDLCBjcml0ID0gKzEwMC4w +wrBDKQo+IAo+IHc4Mzc5NWFkZy1pMmMtMS0yZgo+IEFkYXB0ZXI6IFNNQnVzIHBpaXg0IGFkYXB0 +ZXIgKFNEQTIpCj4gaW4wOiAgICAgICAgICsxLjAyIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g +ICsyLjA1IFYpCj4gaW4xOiAgICAgICAgICsxLjUyIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g +ICsyLjA1IFYpCj4gaW4yOiAgICAgICAgICsxLjEwIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g +ICsyLjA1IFYpCj4gaW4zOiAgICAgICAgICswLjg5IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g +ICsyLjA1IFYpCj4gaW4xMjogICAgICAgICszLjM1IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g +ICs2LjE0IFYpCj4gaW4xMzogICAgICAgICszLjI4IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g +ICs2LjE0IFYpCj4gZmFuMTogICAgICAgIDcwMyBSUE0gIChtaW4gPSAgMzI5IFJQTSkKPiB0ZW1w +MTogICAgICAgKzIzLjDCsEMgIChoaWdoID0gKzEwOS4wwrBDLCBoeXN0ID0gKzEwOS4wwrBDKQo+ +ICAgICAgICAgICAgICAgICAgICAgICAoY3JpdCA9ICsxMDkuMMKwQywgaHlzdCA9ICsxMDkuMMKw +QykgIHNlbnNvciA9IHRoZXJtYWwgZGlvZGUKPiB0ZW1wMjogICAgICAgKzMzLjLCsEMgIChoaWdo +ID0gKzEwNS4wwrBDLCBoeXN0ID0gKzEwNS4wwrBDKQo+ICAgICAgICAgICAgICAgICAgICAgICAo +Y3JpdCA9ICsxMDUuMMKwQywgaHlzdCA9ICsxMDUuMMKwQykgIHNlbnNvciA9IHRoZXJtYWwgZGlv +ZGUKPiB0ZW1wNTogICAgICAgKzE0LjDCsEMgIChoaWdoID0gKzM5LjDCsEMsIGh5c3QgPSArMzku +MMKwQykKPiAgICAgICAgICAgICAgICAgICAgICAgKGNyaXQgPSArNDQuMMKwQywgaHlzdCA9ICs0 +NC4wwrBDKSAgc2Vuc29yID0gdGhlcm1pc3Rvcgo+IGJlZXBfZW5hYmxlOmRpc2FibGVkCj4gCj4g +amM0Mi1pMmMtMC0xOAo+IEFkYXB0ZXI6IFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTApCj4gdGVt +cDE6ICAgICAgICsyMC41wrBDICAobG93ICA9ICArMC4wwrBDLCBoaWdoID0gICswLjDCsEMpICBB +TEFSTQo+ICAgICAgICAgICAgICAgICAgICAgICAoY3JpdCA9ICArMC4wwrBDLCBoeXN0ID0gICsw +LjDCsEMpICBBTEFSTQo+IAo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29ycy9l +ZGRpIyBpMmNkZXRlY3QgLXkgMAo+ICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAg +YSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSBVVSAtLSAtLSAtLSAt +LSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LQo+IDUwOiA1MCAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+ +IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDcw +OiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0t +c2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMQo+ICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAg +NyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSBVVQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLQo+IDYwOiAtLSA2MSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vz +ci9zcmMvbG0tc2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMgo+ICAgICAgMCAgMSAgMiAgMyAg +NCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSA0YyAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLQo+IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJv +bGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMwo+ICAgICAgMCAg +MSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAg +ICAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt +LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+ +IHBheSBhdHRlbnRpb24gdGhhdCB0aGUgbXNsZWVwIHNlZW1zIHRvIGJlIHJlYWxseSBuZWVkZWQu +Li4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBFZGRpIERlIFBpZXJpIDxlZGRpQGRlcGllcmkubmV0Pgo+ +IAo+IFJlZ2FyZHMsCj4gCj4gRWRkaQo+IAo+IGZvbGxvd3MgcGF0Y2guLi4uCj4gCj4gZGlmZiAt +dSAtTiAtciAyLjYuMzIub3JpZy9pMmMtcGlpeDQuYyAyLjYuMzIvaTJjLXBpaXg0LmMKPiAtLS0g +Mi42LjMyLm9yaWcvaTJjLXBpaXg0LmMgICAgIDIwMTEtMTEtMTYgMTc6MDc6MDMuMDAwMDAwMDAw +ICswMTAwCj4gKysrIDIuNi4zMi9pMmMtcGlpeDQuYyAgMjAxMS0xMS0xNiAxNToyMToxNy4wMDAw +MDAwMDAgKzAxMDAKPiBAQCAtOTcsNyArOTcsOCBAQAo+ICBzdGF0aWMgdW5zaWduZWQgc2hvcnQg +cGlpeDRfc21iYTsKPiAgc3RhdGljIGludCBzcnZyd29ya3NfY3NiNV9kZWxheTsKPiAgc3RhdGlj +IHN0cnVjdCBwY2lfZHJpdmVyIHBpaXg0X2RyaXZlcjsKPiAtc3RhdGljIHN0cnVjdCBpMmNfYWRh +cHRlciBwaWl4NF9hZGFwdGVyOwo+ICtzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGlpeDRfYWRhcHRlcjsK +PiArRVhQT1JUX1NZTUJPTF9HUEwocGlpeDRfYWRhcHRlcik7Cj4gCj4gIHN0YXRpYyBzdHJ1Y3Qg +ZG1pX3N5c3RlbV9pZCBfX2RldmluaXRkYXRhIHBpaXg0X2RtaV9ibGFja2xpc3RbXSA9IHsKPiAg +ICAgICAgIHsKPiBAQCAtMjQ2LDEwICsyNDcsMjIgQEAKPiAgICAgICAgICAgICAgICAgICAgICAg +ICAiMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsIHNtYmFfaWR4KTsKPiAgICAgICAgICAgICAgICAg +cmV0dXJuIC1FQlVTWTsKPiAgICAgICAgIH0KPiAtICAgICAgIG91dGJfcChzbWJfZW4sIHNtYmFf +aWR4KTsKPiAtICAgICAgIHNtYmFfZW5fbG8gPSBpbmJfcChzbWJhX2lkeCArIDEpOwo+IC0gICAg +ICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsKPiAtICAgICAgIHNtYmFfZW5faGkgPSBp +bmJfcChzbWJhX2lkeCArIDEpOwo+ICsgICAgICAgb3V0Yl9wKHNtYl9lbiwgc21iYV9pZHgpOyAg +ICAgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMKPiArICAgICAgIHNtYmFf +ZW5fbG8gPSBpbmJfcChzbWJhX2lkeCArIDEpOyAgICAgICAvL2xlZ2dvIGlsIGRhdG8gTCBkZWwg +cmVnaXN0cm8gMHgyYwo+ICsgICAgICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsgICAg +ICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMgKyAxCj4gKyAgICAgICBzbWJhX2Vu +X2hpID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdnbyBpbCBkYXRvIEggZGVsIHJl +Z2lzdHJvIDB4MmMKPiArCj4gKyAgICAgICBvdXRiX3Aoc21iX2VuLCBzbWJhX2lkeCk7ICAgICAg +ICAgICAgICAgLy9zZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYwo+ICsgICAgICAgb3V0Yl9wKHNt +YmFfZW5fbG8gJiAweEY5ICwgc21iYV9pZHggKyAxKTsgLy9zZWxlemlvbm8gbGEgcG9ydGEgMCAw +MCAwCj4gKyAgICAgICBvdXRiX3Aoc21iX2VuICsgMSwgc21iYV9pZHgpOyAgICAgICAgICAgLy9z +ZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYyArIDEKPiArICAgICAgIG91dGJfcChzbWJhX2VuX2hp +LCBzbWJhX2lkeCArIDEpOwo+ICsKPiArICAgICAgIG91dGJfcChzbWJfZW4sIHNtYmFfaWR4KTsg +ICAgICAgICAgICAgICAvL3NlbGV6aW9ubyBpbCByZWdpc3RybyAweDJjCj4gKyAgICAgICBzbWJh +X2VuX2xvID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdnbyBpbCBkYXRvIEwgZGVs +IHJlZ2lzdHJvIDB4MmMKPiArICAgICAgIG91dGJfcChzbWJfZW4gKyAxLCBzbWJhX2lkeCk7ICAg +ICAgICAgICAvL3NlbGV6aW9ubyBpbCByZWdpc3RybyAweDJjICsgMQo+ICsgICAgICAgc21iYV9l +bl9oaSA9IGluYl9wKHNtYmFfaWR4ICsgMSk7ICAgICAgIC8vbGVnZ28gaWwgZGF0byBIIGRlbCBy +ZWdpc3RybyAweDJjCj4gKwo+ICsKPiAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHNtYmFfaWR4LCAy +KTsKPiAKPiAgICAgICAgIGlmICgoc21iYV9lbl9sbyAmIDEpID09IDApIHsKPiBAQCAtMjU4LDYg +KzI3MSw4IEBACj4gICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwo+ICAgICAgICAgfQo+ +IAo+ICsgICAgICAgZGV2X2luZm8oJlBJSVg0X2Rldi0+ZGV2LCJTZWxlY3RlZCBEZWZhdWx0IFNt +YnVzIFBvcnQgMHgleCIsCj4gKHNtYmFfZW5fbG8gJiAweDYpID4+IDEpOwo+ICsKPiAgICAgICAg +IHBpaXg0X3NtYmEgPSAoKHNtYmFfZW5faGkgPDwgOCkgfCBzbWJhX2VuX2xvKSAmIDB4ZmZlMDsK +PiAgICAgICAgIGlmIChhY3BpX2NoZWNrX3JlZ2lvbihwaWl4NF9zbWJhLCBTTUJJT1NJWkUsIHBp +aXg0X2RyaXZlci5uYW1lKSkKPiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Cj4gQEAg +LTQ2Niw3ICs0ODEsNyBAQAo+ICAgICAgICAgLmZ1bmN0aW9uYWxpdHkgID0gcGlpeDRfZnVuYywK +PiAgfTsKPiAKPiAtc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBwaWl4NF9hZGFwdGVyID0gewo+ +ICtzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGlpeDRfYWRhcHRlciA9IHsKPiAgICAgICAgIC5vd25lciAg +ICAgICAgICA9IFRISVNfTU9EVUxFLAo+ICAgICAgICAgLmNsYXNzICAgICAgICAgID0gSTJDX0NM +QVNTX0hXTU9OIHwgSTJDX0NMQVNTX1NQRCwKPiAgICAgICAgIC5hbGdvICAgICAgICAgICA9ICZz +bWJ1c19hbGdvcml0aG0sCj4gZGlmZiAtdSAtTiAtciAyLjYuMzIub3JpZy9pMmMtcGlpeDQtbjM2 +bC5jIDIuNi4zMi9pMmMtcGlpeDQtbjM2bC5jCj4gLS0tIDIuNi4zMi5vcmlnL2kyYy1waWl4NC1u +MzZsLmMgICAgICAgIDE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCj4gKysrIDIu +Ni4zMi9pMmMtcGlpeDQtbjM2bC5jICAgICAyMDExLTExLTE2IDE2OjAyOjAxLjAwMDAwMDAwMCAr +MDEwMAo+IEBAIC0wLDAgKzEsMjQ3IEBACj4gKy8qCj4gKyAqIGkyYy1waWl4NC1uMzZsLmMgLSBp +MmMtcGlpeDQgZXh0cmFzIGZvciB0aGUgSFAgcHJvbGlhbnQKPiBtaWNyb3NlcnZlciBuMzZsIG1v +dGhlcmJvYXJkCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwOCBKZWFuIERlbHZh +cmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KPiArICogQ29weXJpZ2h0IChDKSAyMDExICBFZGRpIERl +IFBpZXJpIDxlZGRpQGRlcGllcmkubmV0Pgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJl +ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBp +dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 +Ymxpc2hlZCBieQo+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy +c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgo+ICsgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl +ciB2ZXJzaW9uLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhl +IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB +TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRB +QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsg +KiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKgo+ICsg +KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs +aWMgTGljZW5zZQo+ICsgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0 +byB0aGUgRnJlZSBTb2Z0d2FyZQo+ICsgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUs +IENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KPiArICovCj4gKwo+ICsvKgo+ICsgKiBXZSBzZWxl +Y3QgdGhlIGNoYW5uZWxzIGJ5IHNlbmRpbmcgY29tbWFuZHMgdG8gdGhlIHNiODAwIHNvdXRoYnVz +Cj4gKyAqIHRoZSBzZWxlY3Rpb24gYml0Cj4gKyAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMv +RW1iZWRkZWRfVGVjaERvY3MvNDU0ODIucGRmCj4gKyAqICBTbWJ1czBFbiAtIFJXIMOi4oKs4oCc +IDE2IGJpdHMgLSBbUE1fUmVnOiAyQ2hdCj4gKyAqICBGaWVsZCBOYW1lIEJpdHMgRGVmYXVsdCBE +ZXNjcmlwdGlvbgo+ICsgKiAgU21CdXMwRW4gMCAwYiBTZXQgdG8gMSB0byBlbmFibGUgU01CVVMw +IGZ1bmN0aW9uIGFuZCBkZWNvZGluZy4KPiArICogIFNtQnVzMFNlbCAyOjEgMDBiIFNtQnVzIHBv +cnQgc2VsZWN0aW9uIHdoZW4gUE1fUmVnIDJGaCBiaXQgMCBpcyBzZXQgdG8gMAo+ICsgKiAgMDA6 +IFBvcnQgMAo+ICsgKiAgMDE6IFBvcnQgMgo+ICsgKiAgMTA6IFBvcnQgMwo+ICsgKiAgMTE6IFBv +cnQgNAo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUg +PGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ICsjaW5jbHVkZSA8 +bGludXgvaW5pdC5oPgo+ICsjaW5jbHVkZSA8bGludXgvaTJjLmg+Cj4gKyNpbmNsdWRlIDxsaW51 +eC9tdXRleC5oPgo+ICsjaW5jbHVkZSA8YXNtL2lvLmg+Cj4gKwo+ICtleHRlcm4gc3RydWN0IGky +Y19hZGFwdGVyIHBpaXg0X2FkYXB0ZXI7Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVy +ICpuMzZsX2FkYXB0ZXI7Cj4gK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSAqbjM2bF9hbGdv +Owo+ICsKPiArLyogV3JhcHBlciBhY2Nlc3MgZnVuY3Rpb25zIGZvciBtdWx0aXBsZXhlZCBTTUJ1 +cyAqLwo+ICtzdGF0aWMgREVGSU5FX01VVEVYKHBpaXg0X2xvY2spOwo+ICsKPiArLyogV2UgcmVt +ZW1iZXIgdGhlIGxhc3QgdXNlZCBjaGFubmVscyBjb21iaW5hdGlvbiBzbyBhcyB0byBvbmx5IHN3 +aXRjaAo+ICsgICBjaGFubmVscyB3aGVuIGl0IGlzIHJlYWxseSBuZWVkZWQuIFRoaXMgZ3JlYXRs +eSByZWR1Y2VzIHRoZSBTTUJ1cwo+ICsgICBvdmVyaGVhZCwgYnV0IGFsc28gYXNzdW1lcyB0aGF0 +IG5vYm9keSB3aWxsIGJlIHdyaXRpbmcgdG8gdGhlIFBDQTk1NTYKPiArICAgaW4gb3VyIGJhY2su +ICovCj4gK3N0YXRpYyB1OCBsYXN0X2NoYW5uZWxzOwo+ICsKPiArc3RhdGljIGlubGluZSBzMzIg +cGlpeDRfYWNjZXNzX2NoYW5uZWwoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIs +Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0 +IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEsCj4gKyAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNoYW5uZWxzKQo+ICt7Cj4gKyAgICAg +ICBpbnQgZXJyb3I7Cj4gKyAgICAgICB1bnNpZ25lZCBzaG9ydCBzbWJhX2lkeCA9IDB4Y2Q2Owo+ +ICsgICAgICAgdTggc21iYV9lbl9sbywgc21iYV9lbl9oaSwgc21iX2VuID0gMHgyYzsKPiArCj4g +KyAgICAgICBtdXRleF9sb2NrKCZwaWl4NF9sb2NrKTsKPiArCj4gKyAgICAgICBpZiAobGFzdF9j +aGFubmVscyAhPSBjaGFubmVscykgewo+ICsgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNf +ZGF0YSBtcGx4ZGF0YTsKPiArICAgICAgICAgICAgICAgbXBseGRhdGEuYnl0ZSA9IGNoYW5uZWxz +Owo+ICsKPiArICAgICAgICAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBhZGRyZXNzIG9mIHRoZSBT +TUJ1cyBhcmVhcyAqLwo+ICsgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKHNtYmFf +aWR4LCAyLCAic21iYV9pZHgiKSkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIo +JnBpaXg0X2FkYXB0ZXIuZGV2LCAiU01CdXMgYmFzZSBhZGRyZXNzIGluZGV4IHJlZ2lvbiAiCj4g +KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMHgleCBhbHJlYWR5IGluIHVzZSFcbiIs +IHNtYmFfaWR4KTsKPiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwo+ICsg +ICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgICAgICBvdXRiX3Aoc21iX2VuLCBzbWJh +X2lkeCk7ICAgICAgICAgICAgICAgLy9zZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYwo+ICsgICAg +ICAgICAgICAgICBzbWJhX2VuX2xvID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdn +byBpbCBkYXRvIEwgZGVsIHJlZ2lzdHJvIDB4MmMKPiArICAgICAgICAgICAgICAgb3V0Yl9wKHNt +Yl9lbiArIDEsIHNtYmFfaWR4KTsgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4 +MmMgKyAxCj4gKyAgICAgICAgICAgICAgIHNtYmFfZW5faGkgPSBpbmJfcChzbWJhX2lkeCArIDEp +OyAgICAgICAvL2xlZ2dvIGlsIGRhdG8gSCBkZWwgcmVnaXN0cm8gMHgyYwo+ICsKPiArICAgICAg +ICAgICAgICAgbXNsZWVwKDUwKTsKPiArICAgICAgICAgICAgICAgb3V0Yl9wKHNtYl9lbiwgc21i +YV9pZHgpOyAgICAgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMKPiArICAg +ICAgICAgICAgICAgb3V0Yl9wKChzbWJhX2VuX2xvICYgMHhGOSApKyAoIGNoYW5uZWxzIDw8IDEp +ICwgc21iYV9pZHggKyAxKTsKPiAvL3NlbGV6aW9ubyBsYSBwb3J0YSAwIDAwIDAKPiArICAgICAg +ICAgICAgICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsgICAgICAgICAgIC8vc2VsZXpp +b25vIGlsIHJlZ2lzdHJvIDB4MmMgKyAxCj4gKyAgICAgICAgICAgICAgIG91dGJfcChzbWJhX2Vu +X2hpLCBzbWJhX2lkeCArIDEpOwo+ICsKPiArICAgICAgICAgICAgICAgbXNsZWVwKDUwKTsKPiAr +Cj4gKyAgICAgICAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHNtYmFfaWR4LCAyKTsKPiArCj4gKyAg +ICAgICAgICAgICAgIGRldl9pbmZvKCZwaWl4NF9hZGFwdGVyLmRldiwiU2VsZWN0ZWQgU21idXMg +UG9ydCAweCV4IiwgKHNtYmFfZW5fbG8KPiAmIDB4NikgPj4gMSk7Cj4gKwo+ICsgICAgICAgICAg +ICAgICBsYXN0X2NoYW5uZWxzID0gY2hhbm5lbHM7Cj4gKwo+ICsgICAgICAgfQo+ICsKPiArICAg +ICAgIGVycm9yID0gcGlpeDRfYWRhcHRlci5hbGdvLT5zbWJ1c194ZmVyKGFkYXAsIGFkZHIsIGZs +YWdzLCByZWFkX3dyaXRlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICBjb21tYW5kLCBzaXplLCBkYXRhKTsKPiArCj4gKwo+ICsgICAgICAgbXV0ZXhfdW5s +b2NrKCZwaWl4NF9sb2NrKTsKPiArICAgICAgIHJldHVybiBlcnJvcjsKPiArfQo+ICsKPiArc3Rh +dGljIHMzMiBwaWl4NF9hY2Nlc3NfdmlydDAoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2 +IGFkZHIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZs +YWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4 +IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlv +biBpMmNfc21idXNfZGF0YSAqIGRhdGEpCj4gK3sKPiArICAgICAgIHJldHVybiBwaWl4NF9hY2Nl +c3NfY2hhbm5lbChhZGFwLCBhZGRyLCBmbGFncywgcmVhZF93cml0ZSwgY29tbWFuZCwKPiArICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZGF0YSwgMCk7Cj4gK30KPiAr +Cj4gK3N0YXRpYyBzMzIgcGlpeDRfYWNjZXNzX3ZpcnQxKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFk +YXAsIHUxNiBhZGRyLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBz +aG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQo+ICt7Cj4gKyAgICAgICByZXR1cm4gcGlp +eDRfYWNjZXNzX2NoYW5uZWwoYWRhcCwgYWRkciwgZmxhZ3MsIHJlYWRfd3JpdGUsIGNvbW1hbmQs +Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGRhdGEsIDEpOwo+ +ICt9Cj4gKwo+ICtzdGF0aWMgczMyIHBpaXg0X2FjY2Vzc192aXJ0MihzdHJ1Y3QgaTJjX2FkYXB0 +ZXIgKiBhZGFwLCB1MTYgYWRkciwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5z +aWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKPiArICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsCj4gKyAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKPiArewo+ICsgICAgICAgcmV0 +dXJuIHBpaXg0X2FjY2Vzc19jaGFubmVsKGFkYXAsIGFkZHIsIGZsYWdzLCByZWFkX3dyaXRlLCBj +b21tYW5kLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBkYXRh +LCAyKTsKPiArfQo+ICsKPiArc3RhdGljIHMzMiBwaWl4NF9hY2Nlc3NfdmlydDMoc3RydWN0IGky +Y19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCj4gK3sKPiArICAg +ICAgIHJldHVybiBwaWl4NF9hY2Nlc3NfY2hhbm5lbChhZGFwLCBhZGRyLCBmbGFncywgcmVhZF93 +cml0ZSwgY29tbWFuZCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6 +ZSwgZGF0YSwgMyk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgX19pbml0IHBpaXg0X24zNmxfaW5p +dCh2b2lkKQo+ICt7Cj4gKyAgICAgICBpbnQgaSwgZXJyb3I7Cj4gKwo+ICsgICAgICAgaWYgKCFw +aWl4NF9hZGFwdGVyLmRldi5wYXJlbnQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVW +Owo+ICsKPiArICAgICAgIHByaW50ayhLRVJOX0lORk8gIkNvbmZpZ3VyZSB0aGUgQU1EIFNCODAw +IE11bHRpcGxleGVyXG4iKTsKPiArCj4gKyAgICAgICAvKiBVbnJlZ2lzdGVyIHBoeXNpY2FsIGJ1 +cyAqLwo+ICsgICAgICAgZXJyb3IgPSBpMmNfZGVsX2FkYXB0ZXIoJnBpaXg0X2FkYXB0ZXIpOwo+ +ICsgICAgICAgaWYgKGVycm9yKSB7Cj4gKyAgICAgICAgICAgICAgIGRldl9lcnIoJnBpaXg0X2Fk +YXB0ZXIuZGV2LCAiUGh5c2ljYWwgYnVzIHJlbW92YWwgZmFpbGVkXG4iKTsKPiArICAgICAgICAg +ICAgICAgZ290byBFUlJPUjA7Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgcHJpbnRrKEtFUk5f +SU5GTyAiRW5hYmxpbmcgU01CdXMgbXVsdGlwbGV4aW5nIGZvciBIcCBQcm9saWFudAo+IE1pY3Jv +c2VydmVyIE4zNmxcbiIpOwo+ICsgICAgICAgLyogRGVmaW5lIHRoZSA0IHZpcnR1YWwgYWRhcHRl +cnMgYW5kIGFsZ29yaXRobXMgc3RydWN0dXJlcyAqLwo+ICsgICAgICAgaWYgKCEobjM2bF9hZGFw +dGVyID0ga3phbGxvYyg1ICogc2l6ZW9mKHN0cnVjdCBpMmNfYWRhcHRlciksCj4gKyAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKSkpIHsKPiArICAgICAgICAg +ICAgICAgZXJyb3IgPSAtRU5PTUVNOwo+ICsgICAgICAgICAgICAgICBnb3RvIEVSUk9SMTsKPiAr +ICAgICAgIH0KPiArICAgICAgIGlmICghKG4zNmxfYWxnbyA9IGt6YWxsb2MoNSAqIHNpemVvZihz +dHJ1Y3QgaTJjX2FsZ29yaXRobSksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICBHRlBfS0VSTkVMKSkpIHsKPiArICAgICAgICAgICAgICAgZXJyb3IgPSAtRU5PTUVNOwo+ICsg +ICAgICAgICAgICAgICBnb3RvIEVSUk9SMjsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICAvKiBG +aWxsIGluIHRoZSBuZXcgc3RydWN0dXJlcyAqLwo+ICsgICAgICAgbjM2bF9hbGdvWzBdID0gKihw +aWl4NF9hZGFwdGVyLmFsZ28pOwo+ICsgICAgICAgbjM2bF9hbGdvWzBdLnNtYnVzX3hmZXIgPSBw +aWl4NF9hY2Nlc3NfdmlydDA7Cj4gKyAgICAgICBuMzZsX2FkYXB0ZXJbMF0gPSBwaWl4NF9hZGFw +dGVyOwo+ICsgICAgICAgc25wcmludGYobjM2bF9hZGFwdGVyWzBdLm5hbWUsIHNpemVvZihuMzZs +X2FkYXB0ZXJbMF0ubmFtZSksCj4gKyAgICAgICAgICAgICAgICAiU01CdXMgcGlpeDQgYWRhcHRl +ciAoU0RBMCkiKTsKPiArICAgICAgIG4zNmxfYWRhcHRlclswXS5hbGdvID0gbjM2bF9hbGdvOwo+ +ICsgICAgICAgbjM2bF9hZGFwdGVyWzBdLmRldi5wYXJlbnQgPSBwaWl4NF9hZGFwdGVyLmRldi5w +YXJlbnQ7Cj4gKyAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7Cj4gKyAgICAgICAgICAg +ICAgIG4zNmxfYWxnb1tpXSA9ICoocGlpeDRfYWRhcHRlci5hbGdvKTsKPiArICAgICAgICAgICAg +ICAgbjM2bF9hZGFwdGVyW2ldID0gcGlpeDRfYWRhcHRlcjsKPiArICAgICAgICAgICAgICAgc25w +cmludGYobjM2bF9hZGFwdGVyW2ldLm5hbWUsIHNpemVvZihuMzZsX2FkYXB0ZXJbaV0ubmFtZSks +Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJTTUJ1cyBwaWl4NCBhZGFwdGVyIChTREElZCki +LCBpICsgMSk7Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlcltpXS5hbGdvID0gbjM2bF9h +bGdvK2k7Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlcltpXS5kZXYucGFyZW50ID0gcGlp +eDRfYWRhcHRlci5kZXYucGFyZW50Owo+ICsgICAgICAgfQo+ICsgICAgICAgbjM2bF9hbGdvWzFd +LnNtYnVzX3hmZXIgPSBwaWl4NF9hY2Nlc3NfdmlydDE7Cj4gKyAgICAgICBuMzZsX2FsZ29bMl0u +c21idXNfeGZlciA9IHBpaXg0X2FjY2Vzc192aXJ0MjsKPiArICAgICAgIG4zNmxfYWxnb1szXS5z +bWJ1c194ZmVyID0gcGlpeDRfYWNjZXNzX3ZpcnQzOwo+ICsKPiArICAgICAgIC8qIFJlZ2lzdGVy +IHZpcnR1YWwgYWRhcHRlcnMgKi8KPiArICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsK +PiArICAgICAgICAgICAgICAgZXJyb3IgPSBpMmNfYWRkX2FkYXB0ZXIobjM2bF9hZGFwdGVyK2kp +Owo+ICsgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKPiArICAgICAgICAgICAgICAgICAgICAg +ICBwcmludGsoS0VSTl9FUlIgImkyYy1waWl4NC1uMzZsOiAiCj4gKyAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICJWaXJ0dWFsIGFkYXB0ZXIgJWQgcmVnaXN0cmF0aW9uICIKPiArICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZFxuIiwg +aSk7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpLS07IGkgPj0gMDsgaS0tKQo+ICsg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTJjX2RlbF9hZGFwdGVyKG4zNmxfYWRhcHRl +citpKTsKPiArICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVSUk9SMzsKPiArICAgICAgICAg +ICAgICAgfQo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHJldHVybiAwOwo+ICsKPiArRVJST1Iz +Ogo+ICsgICAgICAga2ZyZWUobjM2bF9hbGdvKTsKPiArICAgICAgIG4zNmxfYWxnbyA9IE5VTEw7 +Cj4gK0VSUk9SMjoKPiArICAgICAgIGtmcmVlKG4zNmxfYWRhcHRlcik7Cj4gKyAgICAgICBuMzZs +X2FkYXB0ZXIgPSBOVUxMOwo+ICtFUlJPUjE6Cj4gKyAgICAgICAvKiBSZXN0b3JlIHBoeXNpY2Fs +IGJ1cyAqLwo+ICsgICAgICAgaTJjX2FkZF9hZGFwdGVyKCZwaWl4NF9hZGFwdGVyKTsKPiArRVJS +T1IwOgo+ICsgICAgICAgcmV0dXJuIGVycm9yOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2V4 +aXQgcGlpeDRfbjM2bF9leGl0KHZvaWQpCj4gK3sKPiArICAgICAgIGlmIChuMzZsX2FkYXB0ZXIp +IHsKPiArICAgICAgICAgICAgICAgaW50IGk7Cj4gKwo+ICsgICAgICAgICAgICAgICBmb3IgKGkg +PSAwOyBpIDwgNTsgaSsrKQo+ICsgICAgICAgICAgICAgICAgICAgICAgIGkyY19kZWxfYWRhcHRl +cihuMzZsX2FkYXB0ZXIraSk7Cj4gKyAgICAgICAgICAgICAgIGtmcmVlKG4zNmxfYWRhcHRlcik7 +Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlciA9IE5VTEw7Cj4gKyAgICAgICB9Cj4gKyAg +ICAgICBrZnJlZShuMzZsX2FsZ28pOwo+ICsgICAgICAgbjM2bF9hbGdvID0gTlVMTDsKPiArCj4g +KyAgICAgICAvKiBSZXN0b3JlIHBoeXNpY2FsIGJ1cyAqLwo+ICsgICAgICAgaWYgKGkyY19hZGRf +YWRhcHRlcigmcGlpeDRfYWRhcHRlcikpCj4gKyAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VS +UiAiaTJjLXBpaXg0LW4zNmw6ICIKPiArICAgICAgICAgICAgICAgICAgICAgICJQaHlzaWNhbCBi +dXMgcmVzdG9yYXRpb24gZmFpbGVkXG4iKTsKPiArfQo+ICsKPiArTU9EVUxFX0FVVEhPUigiRWRk +aSBEZSBQaWVyaSA8ZWRkaUBkZXBpZXJpLm5ldCIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIm4z +NmwgU01CdXMgbXVsdGlwbGV4aW5nIik7Cj4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKPiArCj4g +K21vZHVsZV9pbml0KHBpaXg0X24zNmxfaW5pdCk7Cj4gK21vZHVsZV9leGl0KHBpaXg0X24zNmxf +ZXhpdCk7Cj4gCj4gCj4gT24gU3VuLCBOb3YgMjcsIDIwMTEgYXQgMTE6NTUgUE0sIEJlbiBEb29r +cyA8YmVuLWkyY0BmbHVmZi5vcmc+IHdyb3RlOgo+ID4KPiA+IE9uIEZyaSwgTm92IDI1LCAyMDEx +IGF0IDExOjA3OjIxUE0gKzAxMDAsIEVkZGkgRGUgUGllcmkgd3JvdGU6Cj4gPj4gVGhpcyBwYXRj +aCBhZGQgc3VwcG9ydCB0byBtdWx0aXBsZXhlZCBzbWJ1cyBmb3IgcHJvbGlhbnQgbWljcm9zZXJ2 +ZXIKPiA+PiBOMzZMIGFuZCBtYXkgYmUgYXBwbGljYWJsZSB0byBvdGhlciBjb25maWd1cmF0aW9u +IGJhc2VkIG9uIHNiOHh4Cj4gPj4gc291dGhidXMuCj4gPj4KPiA+PiByb290QHByb2xpYW50Oi91 +c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMgaTJjZGV0ZWN0IC1sCj4gPj4gaTJjLTAgICBzbWJ1cyAg +ICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBMCkgICAgICAgICAgICAgIFNNQnVzIGFk +YXB0ZXIKPiA+PiBpMmMtMSAgIHNtYnVzICAgICAgICAgICBTTUJ1cyBwaWl4NCBhZGFwdGVyIChT +REEyKSAgICAgICAgICAgICAgU01CdXMgYWRhcHRlcgo+ID4+IGkyYy0yICAgc21idXMgICAgICAg +ICAgIFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTMpICAgICAgICAgICAgICBTTUJ1cyBhZGFwdGVy +Cj4gPj4gaTJjLTMgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBNCkg +ICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiA+PiByb290QHByb2xpYW50Oi91c3Ivc3JjL2xt +LXNlbnNvcnMvZWRkaSMKPiA+Cj4gPiBwYXRjaCBzaG91bGQgZ28gaW5saW5lIHNvIGl0IGNhbiBi +ZSByZXZpZXdlZCwgdGhhbmtzLgo+ID4KPiA+IC0tCj4gPiBCZW4gRG9va3MsIGJlbkBmbHVmZi5v +cmcsIGh0dHA6Ly93d3cuZmx1ZmYub3JnL2Jlbi8KPiA+Cj4gPiBMYXJnZSBIYWRyb24gQ29sYWRh +OiBBIGxhcmdlIFBpbmEgQ29sYWRhIHRoYXQgbWFrZXMgdGhlIHVuaXZlcnNlIGRpc2FwcGVhci4K +PiA+Cj4gCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K +PiBsbS1zZW5zb3JzIG1haWxpbmcgbGlzdAo+IGxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKPiBo +dHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3JzCgpf +X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3Jz +IG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1z +ZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM diff --git a/a/content_digest b/N1/content_digest index 61545c2..2ba3173 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,468 +1,343 @@ "ref\0CAKdnbx7xeygkOK=BR+3vUrWT3GEt=PZrxgrEMvEB5nkOfAF0bg@mail.gmail.com\0" "ref\020111127225514.GO19115@trinity.fluff.org\0" "ref\0CAKdnbx4u6+_WJjjMJ3jnDLSU8eJ0yXX0Mg-dcr=3F4FaOd2R=g@mail.gmail.com\0" - "From\0Guenter Roeck <guenter.roeck-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org>\0" - "Subject\0Re: [lm-sensors] [PATCH] i2c multiplexer driver for Proliant microserver N36L\0" - "Date\0Sat, 3 Dec 2011 08:27:57 -0800\0" + "From\0Guenter Roeck <guenter.roeck@ericsson.com>\0" + "Subject\0Re: [lm-sensors] [PATCH] i2c multiplexer driver for Proliant\0" + "Date\0Sat, 03 Dec 2011 16:27:57 +0000\0" "To\0Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org>\0" "Cc\0Ben Dooks <ben-i2c-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>" linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org <linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org> " lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org <lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org>\0" "\00:1\0" "b\0" - "On Sat, Dec 03, 2011 at 10:31:30AM -0500, Eddi De Pieri wrote:\n" - "> This patch add support to multiplexed smbus for proliant microserver\n" - "> N36L and may be applicable to other configuration based on sb8xx\n" - "> southbus.\n" - "> \n" - "\n" - "Did you read Documentation/SubmittingPatches ?\n" - "\n" - "The patch doesn't follow the canonical patch format, I can see that lines are split,\n" - "the patch isn't based on the linux root directory but on some other directory which\n" - "I guess you expect the reader to figure out, the patch description includes lots\n" - "of information which is irrelevant for the changelog, and it is based on 2.6.32\n" - "instead of the current release and thus pretty much guaranteed not to apply\n" - "to the current kernel version. All that w/o even looking into the code.\n" - "\n" - "The patch implements an I2C multiplexer but doesn't use the I2C multiplexer\n" - "infrastructure. I am not one of the I2C maintainers, but that alone would cause me\n" - "to reject this patch (on top of all the other reasons above).\n" - "\n" - "Guenter\n" - "\n" - "> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -l\n" - "> i2c-0 smbus SMBus piix4 adapter (SDA0) SMBus adapter\n" - "> i2c-1 smbus SMBus piix4 adapter (SDA2) SMBus adapter\n" - "> i2c-2 smbus SMBus piix4 adapter (SDA3) SMBus adapter\n" - "> i2c-3 smbus SMBus piix4 adapter (SDA4) SMBus adapter\n" - "> root@proliant:/usr/src/lm-sensors/eddi#\n" - "> \n" - "> yes SDA1 is reserved... so i can't multiplex it\n" - "> \n" - "> root@proliant:/usr/src/lm-sensors/eddi# sensors\n" - "> k10temp-pci-00c3\n" - "> Adapter: PCI adapter\n" - "> temp1: +24.5\302\260C (high = +70.0\302\260C, crit = +100.0\302\260C)\n" - "> \n" - "> w83795adg-i2c-1-2f\n" - "> Adapter: SMBus piix4 adapter (SDA2)\n" - "> in0: +1.02 V (min = +0.00 V, max = +2.05 V)\n" - "> in1: +1.52 V (min = +0.00 V, max = +2.05 V)\n" - "> in2: +1.10 V (min = +0.00 V, max = +2.05 V)\n" - "> in3: +0.89 V (min = +0.00 V, max = +2.05 V)\n" - "> in12: +3.35 V (min = +0.00 V, max = +6.14 V)\n" - "> in13: +3.28 V (min = +0.00 V, max = +6.14 V)\n" - "> fan1: 703 RPM (min = 329 RPM)\n" - "> temp1: +23.0\302\260C (high = +109.0\302\260C, hyst = +109.0\302\260C)\n" - "> (crit = +109.0\302\260C, hyst = +109.0\302\260C) sensor = thermal diode\n" - "> temp2: +33.2\302\260C (high = +105.0\302\260C, hyst = +105.0\302\260C)\n" - "> (crit = +105.0\302\260C, hyst = +105.0\302\260C) sensor = thermal diode\n" - "> temp5: +14.0\302\260C (high = +39.0\302\260C, hyst = +39.0\302\260C)\n" - "> (crit = +44.0\302\260C, hyst = +44.0\302\260C) sensor = thermistor\n" - "> beep_enable:disabled\n" - "> \n" - "> jc42-i2c-0-18\n" - "> Adapter: SMBus piix4 adapter (SDA0)\n" - "> temp1: +20.5\302\260C (low = +0.0\302\260C, high = +0.0\302\260C) ALARM\n" - "> (crit = +0.0\302\260C, hyst = +0.0\302\260C) ALARM\n" - "> \n" - "> \n" - "> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 0\n" - "> 0 1 2 3 4 5 6 7 8 9 a b c d e f\n" - "> 00: -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 10: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --\n" - "> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 70: -- -- -- -- -- -- -- --\n" - "> \n" - "> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 1\n" - "> 0 1 2 3 4 5 6 7 8 9 a b c d e f\n" - "> 00: -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- UU\n" - "> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 60: -- 61 -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 70: -- -- -- -- -- -- -- --\n" - "> \n" - "> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 2\n" - "> 0 1 2 3 4 5 6 7 8 9 a b c d e f\n" - "> 00: -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 40: -- -- -- -- -- -- -- -- -- -- -- -- 4c -- -- --\n" - "> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 70: -- -- -- -- -- -- -- --\n" - "> \n" - "> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 3\n" - "> 0 1 2 3 4 5 6 7 8 9 a b c d e f\n" - "> 00: -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n" - "> 70: -- -- -- -- -- -- -- --\n" - "> \n" - "> pay attention that the msleep seems to be really needed...\n" - "> \n" - "> Signed-off-by: Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org>\n" - "> \n" - "> Regards,\n" - "> \n" - "> Eddi\n" - "> \n" - "> follows patch....\n" - "> \n" - "> diff -u -N -r 2.6.32.orig/i2c-piix4.c 2.6.32/i2c-piix4.c\n" - "> --- 2.6.32.orig/i2c-piix4.c 2011-11-16 17:07:03.000000000 +0100\n" - "> +++ 2.6.32/i2c-piix4.c 2011-11-16 15:21:17.000000000 +0100\n" - "> @@ -97,7 +97,8 @@\n" - "> static unsigned short piix4_smba;\n" - "> static int srvrworks_csb5_delay;\n" - "> static struct pci_driver piix4_driver;\n" - "> -static struct i2c_adapter piix4_adapter;\n" - "> +struct i2c_adapter piix4_adapter;\n" - "> +EXPORT_SYMBOL_GPL(piix4_adapter);\n" - "> \n" - "> static struct dmi_system_id __devinitdata piix4_dmi_blacklist[] = {\n" - "> {\n" - "> @@ -246,10 +247,22 @@\n" - "> \"0x%x already in use!\\n\", smba_idx);\n" - "> return -EBUSY;\n" - "> }\n" - "> - outb_p(smb_en, smba_idx);\n" - "> - smba_en_lo = inb_p(smba_idx + 1);\n" - "> - outb_p(smb_en + 1, smba_idx);\n" - "> - smba_en_hi = inb_p(smba_idx + 1);\n" - "> + outb_p(smb_en, smba_idx); //seleziono il registro 0x2c\n" - "> + smba_en_lo = inb_p(smba_idx + 1); //leggo il dato L del registro 0x2c\n" - "> + outb_p(smb_en + 1, smba_idx); //seleziono il registro 0x2c + 1\n" - "> + smba_en_hi = inb_p(smba_idx + 1); //leggo il dato H del registro 0x2c\n" - "> +\n" - "> + outb_p(smb_en, smba_idx); //seleziono il registro 0x2c\n" - "> + outb_p(smba_en_lo & 0xF9 , smba_idx + 1); //seleziono la porta 0 00 0\n" - "> + outb_p(smb_en + 1, smba_idx); //seleziono il registro 0x2c + 1\n" - "> + outb_p(smba_en_hi, smba_idx + 1);\n" - "> +\n" - "> + outb_p(smb_en, smba_idx); //seleziono il registro 0x2c\n" - "> + smba_en_lo = inb_p(smba_idx + 1); //leggo il dato L del registro 0x2c\n" - "> + outb_p(smb_en + 1, smba_idx); //seleziono il registro 0x2c + 1\n" - "> + smba_en_hi = inb_p(smba_idx + 1); //leggo il dato H del registro 0x2c\n" - "> +\n" - "> +\n" - "> release_region(smba_idx, 2);\n" - "> \n" - "> if ((smba_en_lo & 1) == 0) {\n" - "> @@ -258,6 +271,8 @@\n" - "> return -ENODEV;\n" - "> }\n" - "> \n" - "> + dev_info(&PIIX4_dev->dev,\"Selected Default Smbus Port 0x%x\",\n" - "> (smba_en_lo & 0x6) >> 1);\n" - "> +\n" - "> piix4_smba = ((smba_en_hi << 8) | smba_en_lo) & 0xffe0;\n" - "> if (acpi_check_region(piix4_smba, SMBIOSIZE, piix4_driver.name))\n" - "> return -ENODEV;\n" - "> @@ -466,7 +481,7 @@\n" - "> .functionality = piix4_func,\n" - "> };\n" - "> \n" - "> -static struct i2c_adapter piix4_adapter = {\n" - "> +struct i2c_adapter piix4_adapter = {\n" - "> .owner = THIS_MODULE,\n" - "> .class = I2C_CLASS_HWMON | I2C_CLASS_SPD,\n" - "> .algo = &smbus_algorithm,\n" - "> diff -u -N -r 2.6.32.orig/i2c-piix4-n36l.c 2.6.32/i2c-piix4-n36l.c\n" - "> --- 2.6.32.orig/i2c-piix4-n36l.c 1970-01-01 01:00:00.000000000 +0100\n" - "> +++ 2.6.32/i2c-piix4-n36l.c 2011-11-16 16:02:01.000000000 +0100\n" - "> @@ -0,0 +1,247 @@\n" - "> +/*\n" - "> + * i2c-piix4-n36l.c - i2c-piix4 extras for the HP proliant\n" - "> microserver n36l motherboard\n" - "> + *\n" - "> + * Copyright (C) 2004, 2008 Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>\n" - "> + * Copyright (C) 2011 Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org>\n" - "> + *\n" - "> + * This program is free software; you can redistribute it and/or modify\n" - "> + * it under the terms of the GNU General Public License as published by\n" - "> + * the Free Software Foundation; either version 2 of the License, or\n" - "> + * (at your option) any later version.\n" - "> + *\n" - "> + * This program is distributed in the hope that it will be useful,\n" - "> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" - "> + * GNU General Public License for more details.\n" - "> + *\n" - "> + * You should have received a copy of the GNU General Public License\n" - "> + * along with this program; if not, write to the Free Software\n" - "> + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n" - "> + */\n" - "> +\n" - "> +/*\n" - "> + * We select the channels by sending commands to the sb800 southbus\n" - "> + * the selection bit\n" - "> + * http://support.amd.com/us/Embedded_TechDocs/45482.pdf\n" - "> + * Smbus0En - RW \303\242\342\202\254\342\200\234 16 bits - [PM_Reg: 2Ch]\n" - "> + * Field Name Bits Default Description\n" - "> + * SmBus0En 0 0b Set to 1 to enable SMBUS0 function and decoding.\n" - "> + * SmBus0Sel 2:1 00b SmBus port selection when PM_Reg 2Fh bit 0 is set to 0\n" - "> + * 00: Port 0\n" - "> + * 01: Port 2\n" - "> + * 10: Port 3\n" - "> + * 11: Port 4\n" - "> + */\n" - "> +\n" - "> +#include <linux/module.h>\n" - "> +#include <linux/kernel.h>\n" - "> +#include <linux/slab.h>\n" - "> +#include <linux/init.h>\n" - "> +#include <linux/i2c.h>\n" - "> +#include <linux/mutex.h>\n" - "> +#include <asm/io.h>\n" - "> +\n" - "> +extern struct i2c_adapter piix4_adapter;\n" - "> +\n" - "> +static struct i2c_adapter *n36l_adapter;\n" - "> +static struct i2c_algorithm *n36l_algo;\n" - "> +\n" - "> +/* Wrapper access functions for multiplexed SMBus */\n" - "> +static DEFINE_MUTEX(piix4_lock);\n" - "> +\n" - "> +/* We remember the last used channels combination so as to only switch\n" - "> + channels when it is really needed. This greatly reduces the SMBus\n" - "> + overhead, but also assumes that nobody will be writing to the PCA9556\n" - "> + in our back. */\n" - "> +static u8 last_channels;\n" - "> +\n" - "> +static inline s32 piix4_access_channel(struct i2c_adapter * adap, u16 addr,\n" - "> + unsigned short flags, char read_write,\n" - "> + u8 command, int size,\n" - "> + union i2c_smbus_data * data,\n" - "> + u8 channels)\n" - "> +{\n" - "> + int error;\n" - "> + unsigned short smba_idx = 0xcd6;\n" - "> + u8 smba_en_lo, smba_en_hi, smb_en = 0x2c;\n" - "> +\n" - "> + mutex_lock(&piix4_lock);\n" - "> +\n" - "> + if (last_channels != channels) {\n" - "> + union i2c_smbus_data mplxdata;\n" - "> + mplxdata.byte = channels;\n" - "> +\n" - "> + /* Determine the address of the SMBus areas */\n" - "> + if (!request_region(smba_idx, 2, \"smba_idx\")) {\n" - "> + dev_err(&piix4_adapter.dev, \"SMBus base address index region \"\n" - "> + \"0x%x already in use!\\n\", smba_idx);\n" - "> + return -EBUSY;\n" - "> + }\n" - "> +\n" - "> + outb_p(smb_en, smba_idx); //seleziono il registro 0x2c\n" - "> + smba_en_lo = inb_p(smba_idx + 1); //leggo il dato L del registro 0x2c\n" - "> + outb_p(smb_en + 1, smba_idx); //seleziono il registro 0x2c + 1\n" - "> + smba_en_hi = inb_p(smba_idx + 1); //leggo il dato H del registro 0x2c\n" - "> +\n" - "> + msleep(50);\n" - "> + outb_p(smb_en, smba_idx); //seleziono il registro 0x2c\n" - "> + outb_p((smba_en_lo & 0xF9 )+ ( channels << 1) , smba_idx + 1);\n" - "> //seleziono la porta 0 00 0\n" - "> + outb_p(smb_en + 1, smba_idx); //seleziono il registro 0x2c + 1\n" - "> + outb_p(smba_en_hi, smba_idx + 1);\n" - "> +\n" - "> + msleep(50);\n" - "> +\n" - "> + release_region(smba_idx, 2);\n" - "> +\n" - "> + dev_info(&piix4_adapter.dev,\"Selected Smbus Port 0x%x\", (smba_en_lo\n" - "> & 0x6) >> 1);\n" - "> +\n" - "> + last_channels = channels;\n" - "> +\n" - "> + }\n" - "> +\n" - "> + error = piix4_adapter.algo->smbus_xfer(adap, addr, flags, read_write,\n" - "> + command, size, data);\n" - "> +\n" - "> +\n" - "> + mutex_unlock(&piix4_lock);\n" - "> + return error;\n" - "> +}\n" - "> +\n" - "> +static s32 piix4_access_virt0(struct i2c_adapter * adap, u16 addr,\n" - "> + unsigned short flags, char read_write,\n" - "> + u8 command, int size,\n" - "> + union i2c_smbus_data * data)\n" - "> +{\n" - "> + return piix4_access_channel(adap, addr, flags, read_write, command,\n" - "> + size, data, 0);\n" - "> +}\n" - "> +\n" - "> +static s32 piix4_access_virt1(struct i2c_adapter * adap, u16 addr,\n" - "> + unsigned short flags, char read_write,\n" - "> + u8 command, int size,\n" - "> + union i2c_smbus_data * data)\n" - "> +{\n" - "> + return piix4_access_channel(adap, addr, flags, read_write, command,\n" - "> + size, data, 1);\n" - "> +}\n" - "> +\n" - "> +static s32 piix4_access_virt2(struct i2c_adapter * adap, u16 addr,\n" - "> + unsigned short flags, char read_write,\n" - "> + u8 command, int size,\n" - "> + union i2c_smbus_data * data)\n" - "> +{\n" - "> + return piix4_access_channel(adap, addr, flags, read_write, command,\n" - "> + size, data, 2);\n" - "> +}\n" - "> +\n" - "> +static s32 piix4_access_virt3(struct i2c_adapter * adap, u16 addr,\n" - "> + unsigned short flags, char read_write,\n" - "> + u8 command, int size,\n" - "> + union i2c_smbus_data * data)\n" - "> +{\n" - "> + return piix4_access_channel(adap, addr, flags, read_write, command,\n" - "> + size, data, 3);\n" - "> +}\n" - "> +\n" - "> +static int __init piix4_n36l_init(void)\n" - "> +{\n" - "> + int i, error;\n" - "> +\n" - "> + if (!piix4_adapter.dev.parent)\n" - "> + return -ENODEV;\n" - "> +\n" - "> + printk(KERN_INFO \"Configure the AMD SB800 Multiplexer\\n\");\n" - "> +\n" - "> + /* Unregister physical bus */\n" - "> + error = i2c_del_adapter(&piix4_adapter);\n" - "> + if (error) {\n" - "> + dev_err(&piix4_adapter.dev, \"Physical bus removal failed\\n\");\n" - "> + goto ERROR0;\n" - "> + }\n" - "> +\n" - "> + printk(KERN_INFO \"Enabling SMBus multiplexing for Hp Proliant\n" - "> Microserver N36l\\n\");\n" - "> + /* Define the 4 virtual adapters and algorithms structures */\n" - "> + if (!(n36l_adapter = kzalloc(5 * sizeof(struct i2c_adapter),\n" - "> + GFP_KERNEL))) {\n" - "> + error = -ENOMEM;\n" - "> + goto ERROR1;\n" - "> + }\n" - "> + if (!(n36l_algo = kzalloc(5 * sizeof(struct i2c_algorithm),\n" - "> + GFP_KERNEL))) {\n" - "> + error = -ENOMEM;\n" - "> + goto ERROR2;\n" - "> + }\n" - "> +\n" - "> + /* Fill in the new structures */\n" - "> + n36l_algo[0] = *(piix4_adapter.algo);\n" - "> + n36l_algo[0].smbus_xfer = piix4_access_virt0;\n" - "> + n36l_adapter[0] = piix4_adapter;\n" - "> + snprintf(n36l_adapter[0].name, sizeof(n36l_adapter[0].name),\n" - "> + \"SMBus piix4 adapter (SDA0)\");\n" - "> + n36l_adapter[0].algo = n36l_algo;\n" - "> + n36l_adapter[0].dev.parent = piix4_adapter.dev.parent;\n" - "> + for (i = 1; i < 4; i++) {\n" - "> + n36l_algo[i] = *(piix4_adapter.algo);\n" - "> + n36l_adapter[i] = piix4_adapter;\n" - "> + snprintf(n36l_adapter[i].name, sizeof(n36l_adapter[i].name),\n" - "> + \"SMBus piix4 adapter (SDA%d)\", i + 1);\n" - "> + n36l_adapter[i].algo = n36l_algo+i;\n" - "> + n36l_adapter[i].dev.parent = piix4_adapter.dev.parent;\n" - "> + }\n" - "> + n36l_algo[1].smbus_xfer = piix4_access_virt1;\n" - "> + n36l_algo[2].smbus_xfer = piix4_access_virt2;\n" - "> + n36l_algo[3].smbus_xfer = piix4_access_virt3;\n" - "> +\n" - "> + /* Register virtual adapters */\n" - "> + for (i = 0; i < 4; i++) {\n" - "> + error = i2c_add_adapter(n36l_adapter+i);\n" - "> + if (error) {\n" - "> + printk(KERN_ERR \"i2c-piix4-n36l: \"\n" - "> + \"Virtual adapter %d registration \"\n" - "> + \"failed, module not inserted\\n\", i);\n" - "> + for (i--; i >= 0; i--)\n" - "> + i2c_del_adapter(n36l_adapter+i);\n" - "> + goto ERROR3;\n" - "> + }\n" - "> + }\n" - "> +\n" - "> + return 0;\n" - "> +\n" - "> +ERROR3:\n" - "> + kfree(n36l_algo);\n" - "> + n36l_algo = NULL;\n" - "> +ERROR2:\n" - "> + kfree(n36l_adapter);\n" - "> + n36l_adapter = NULL;\n" - "> +ERROR1:\n" - "> + /* Restore physical bus */\n" - "> + i2c_add_adapter(&piix4_adapter);\n" - "> +ERROR0:\n" - "> + return error;\n" - "> +}\n" - "> +\n" - "> +static void __exit piix4_n36l_exit(void)\n" - "> +{\n" - "> + if (n36l_adapter) {\n" - "> + int i;\n" - "> +\n" - "> + for (i = 0; i < 5; i++)\n" - "> + i2c_del_adapter(n36l_adapter+i);\n" - "> + kfree(n36l_adapter);\n" - "> + n36l_adapter = NULL;\n" - "> + }\n" - "> + kfree(n36l_algo);\n" - "> + n36l_algo = NULL;\n" - "> +\n" - "> + /* Restore physical bus */\n" - "> + if (i2c_add_adapter(&piix4_adapter))\n" - "> + printk(KERN_ERR \"i2c-piix4-n36l: \"\n" - "> + \"Physical bus restoration failed\\n\");\n" - "> +}\n" - "> +\n" - "> +MODULE_AUTHOR(\"Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org\");\n" - "> +MODULE_DESCRIPTION(\"n36l SMBus multiplexing\");\n" - "> +MODULE_LICENSE(\"GPL\");\n" - "> +\n" - "> +module_init(piix4_n36l_init);\n" - "> +module_exit(piix4_n36l_exit);\n" - "> \n" - "> \n" - "> On Sun, Nov 27, 2011 at 11:55 PM, Ben Dooks <ben-i2c-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org> wrote:\n" - "> >\n" - "> > On Fri, Nov 25, 2011 at 11:07:21PM +0100, Eddi De Pieri wrote:\n" - "> >> This patch add support to multiplexed smbus for proliant microserver\n" - "> >> N36L and may be applicable to other configuration based on sb8xx\n" - "> >> southbus.\n" - "> >>\n" - "> >> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -l\n" - "> >> i2c-0 smbus SMBus piix4 adapter (SDA0) SMBus adapter\n" - "> >> i2c-1 smbus SMBus piix4 adapter (SDA2) SMBus adapter\n" - "> >> i2c-2 smbus SMBus piix4 adapter (SDA3) SMBus adapter\n" - "> >> i2c-3 smbus SMBus piix4 adapter (SDA4) SMBus adapter\n" - "> >> root@proliant:/usr/src/lm-sensors/eddi#\n" - "> >\n" - "> > patch should go inline so it can be reviewed, thanks.\n" - "> >\n" - "> > --\n" - "> > Ben Dooks, ben-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org, http://www.fluff.org/ben/\n" - "> >\n" - "> > Large Hadron Colada: A large Pina Colada that makes the universe disappear.\n" - "> >\n" - "> \n" - "> _______________________________________________\n" - "> lm-sensors mailing list\n" - "> lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org\n" - > http://lists.lm-sensors.org/mailman/listinfo/lm-sensors + "T24gU2F0LCBEZWMgMDMsIDIwMTEgYXQgMTA6MzE6MzBBTSAtMDUwMCwgRWRkaSBEZSBQaWVyaSB3\n" + "cm90ZToKPiBUaGlzIHBhdGNoIGFkZCBzdXBwb3J0IHRvIG11bHRpcGxleGVkIHNtYnVzIGZvciBw\n" + "cm9saWFudCBtaWNyb3NlcnZlcgo+IE4zNkwgYW5kIG1heSBiZSBhcHBsaWNhYmxlIHRvIG90aGVy\n" + "IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gc2I4eHgKPiBzb3V0aGJ1cy4KPiAKCkRpZCB5b3UgcmVh\n" + "ZCBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzID8KClRoZSBwYXRjaCBkb2Vzbid0IGZv\n" + "bGxvdyB0aGUgY2Fub25pY2FsIHBhdGNoIGZvcm1hdCwgSSBjYW4gc2VlIHRoYXQgbGluZXMgYXJl\n" + "IHNwbGl0LAp0aGUgcGF0Y2ggaXNuJ3QgYmFzZWQgb24gdGhlIGxpbnV4IHJvb3QgZGlyZWN0b3J5\n" + "IGJ1dCBvbiBzb21lIG90aGVyIGRpcmVjdG9yeSB3aGljaApJIGd1ZXNzIHlvdSBleHBlY3QgdGhl\n" + "IHJlYWRlciB0byBmaWd1cmUgb3V0LCB0aGUgcGF0Y2ggZGVzY3JpcHRpb24gaW5jbHVkZXMgbG90\n" + "cwpvZiBpbmZvcm1hdGlvbiB3aGljaCBpcyBpcnJlbGV2YW50IGZvciB0aGUgY2hhbmdlbG9nLCBh\n" + "bmQgaXQgaXMgYmFzZWQgb24gMi42LjMyCmluc3RlYWQgb2YgdGhlIGN1cnJlbnQgcmVsZWFzZSBh\n" + "bmQgdGh1cyBwcmV0dHkgbXVjaCBndWFyYW50ZWVkIG5vdCB0byBhcHBseQp0byB0aGUgY3VycmVu\n" + "dCBrZXJuZWwgdmVyc2lvbi4gQWxsIHRoYXQgdy9vIGV2ZW4gbG9va2luZyBpbnRvIHRoZSBjb2Rl\n" + "LgoKVGhlIHBhdGNoIGltcGxlbWVudHMgYW4gSTJDIG11bHRpcGxleGVyIGJ1dCBkb2Vzbid0IHVz\n" + "ZSB0aGUgSTJDIG11bHRpcGxleGVyCmluZnJhc3RydWN0dXJlLiBJIGFtIG5vdCBvbmUgb2YgdGhl\n" + "IEkyQyBtYWludGFpbmVycywgYnV0IHRoYXQgYWxvbmUgd291bGQgY2F1c2UgbWUKdG8gcmVqZWN0\n" + "IHRoaXMgcGF0Y2ggKG9uIHRvcCBvZiBhbGwgdGhlIG90aGVyIHJlYXNvbnMgYWJvdmUpLgoKR3Vl\n" + "bnRlcgoKPiByb290QHByb2xpYW50Oi91c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMgaTJjZGV0ZWN0\n" + "IC1sCj4gaTJjLTAgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBMCkg\n" + "ICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiBpMmMtMSAgIHNtYnVzICAgICAgICAgICBTTUJ1\n" + "cyBwaWl4NCBhZGFwdGVyIChTREEyKSAgICAgICAgICAgICAgU01CdXMgYWRhcHRlcgo+IGkyYy0y\n" + "ICAgc21idXMgICAgICAgICAgIFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTMpICAgICAgICAgICAg\n" + "ICBTTUJ1cyBhZGFwdGVyCj4gaTJjLTMgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRh\n" + "cHRlciAoU0RBNCkgICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiByb290QHByb2xpYW50Oi91\n" + "c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMKPiAKPiB5ZXMgU0RBMSBpcyByZXNlcnZlZC4uLiBzbyBp\n" + "IGNhbid0IG11bHRpcGxleCBpdAo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29y\n" + "cy9lZGRpIyBzZW5zb3JzCj4gazEwdGVtcC1wY2ktMDBjMwo+IEFkYXB0ZXI6IFBDSSBhZGFwdGVy\n" + "Cj4gdGVtcDE6ICAgICAgICsyNC41wrBDICAoaGlnaCA9ICs3MC4wwrBDLCBjcml0ID0gKzEwMC4w\n" + "wrBDKQo+IAo+IHc4Mzc5NWFkZy1pMmMtMS0yZgo+IEFkYXB0ZXI6IFNNQnVzIHBpaXg0IGFkYXB0\n" + "ZXIgKFNEQTIpCj4gaW4wOiAgICAgICAgICsxLjAyIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n" + "ICsyLjA1IFYpCj4gaW4xOiAgICAgICAgICsxLjUyIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n" + "ICsyLjA1IFYpCj4gaW4yOiAgICAgICAgICsxLjEwIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n" + "ICsyLjA1IFYpCj4gaW4zOiAgICAgICAgICswLjg5IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n" + "ICsyLjA1IFYpCj4gaW4xMjogICAgICAgICszLjM1IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n" + "ICs2LjE0IFYpCj4gaW4xMzogICAgICAgICszLjI4IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n" + "ICs2LjE0IFYpCj4gZmFuMTogICAgICAgIDcwMyBSUE0gIChtaW4gPSAgMzI5IFJQTSkKPiB0ZW1w\n" + "MTogICAgICAgKzIzLjDCsEMgIChoaWdoID0gKzEwOS4wwrBDLCBoeXN0ID0gKzEwOS4wwrBDKQo+\n" + "ICAgICAgICAgICAgICAgICAgICAgICAoY3JpdCA9ICsxMDkuMMKwQywgaHlzdCA9ICsxMDkuMMKw\n" + "QykgIHNlbnNvciA9IHRoZXJtYWwgZGlvZGUKPiB0ZW1wMjogICAgICAgKzMzLjLCsEMgIChoaWdo\n" + "ID0gKzEwNS4wwrBDLCBoeXN0ID0gKzEwNS4wwrBDKQo+ICAgICAgICAgICAgICAgICAgICAgICAo\n" + "Y3JpdCA9ICsxMDUuMMKwQywgaHlzdCA9ICsxMDUuMMKwQykgIHNlbnNvciA9IHRoZXJtYWwgZGlv\n" + "ZGUKPiB0ZW1wNTogICAgICAgKzE0LjDCsEMgIChoaWdoID0gKzM5LjDCsEMsIGh5c3QgPSArMzku\n" + "MMKwQykKPiAgICAgICAgICAgICAgICAgICAgICAgKGNyaXQgPSArNDQuMMKwQywgaHlzdCA9ICs0\n" + "NC4wwrBDKSAgc2Vuc29yID0gdGhlcm1pc3Rvcgo+IGJlZXBfZW5hYmxlOmRpc2FibGVkCj4gCj4g\n" + "amM0Mi1pMmMtMC0xOAo+IEFkYXB0ZXI6IFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTApCj4gdGVt\n" + "cDE6ICAgICAgICsyMC41wrBDICAobG93ICA9ICArMC4wwrBDLCBoaWdoID0gICswLjDCsEMpICBB\n" + "TEFSTQo+ICAgICAgICAgICAgICAgICAgICAgICAoY3JpdCA9ICArMC4wwrBDLCBoeXN0ID0gICsw\n" + "LjDCsEMpICBBTEFSTQo+IAo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29ycy9l\n" + "ZGRpIyBpMmNkZXRlY3QgLXkgMAo+ICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAg\n" + "YSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSBVVSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LQo+IDUwOiA1MCAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+\n" + "IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDcw\n" + "OiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0t\n" + "c2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMQo+ICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAg\n" + "NyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSBVVQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLQo+IDYwOiAtLSA2MSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vz\n" + "ci9zcmMvbG0tc2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMgo+ICAgICAgMCAgMSAgMiAgMyAg\n" + "NCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSA0YyAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLQo+IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJv\n" + "bGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMwo+ICAgICAgMCAg\n" + "MSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAg\n" + "ICAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n" + "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+\n" + "IHBheSBhdHRlbnRpb24gdGhhdCB0aGUgbXNsZWVwIHNlZW1zIHRvIGJlIHJlYWxseSBuZWVkZWQu\n" + "Li4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBFZGRpIERlIFBpZXJpIDxlZGRpQGRlcGllcmkubmV0Pgo+\n" + "IAo+IFJlZ2FyZHMsCj4gCj4gRWRkaQo+IAo+IGZvbGxvd3MgcGF0Y2guLi4uCj4gCj4gZGlmZiAt\n" + "dSAtTiAtciAyLjYuMzIub3JpZy9pMmMtcGlpeDQuYyAyLjYuMzIvaTJjLXBpaXg0LmMKPiAtLS0g\n" + "Mi42LjMyLm9yaWcvaTJjLXBpaXg0LmMgICAgIDIwMTEtMTEtMTYgMTc6MDc6MDMuMDAwMDAwMDAw\n" + "ICswMTAwCj4gKysrIDIuNi4zMi9pMmMtcGlpeDQuYyAgMjAxMS0xMS0xNiAxNToyMToxNy4wMDAw\n" + "MDAwMDAgKzAxMDAKPiBAQCAtOTcsNyArOTcsOCBAQAo+ICBzdGF0aWMgdW5zaWduZWQgc2hvcnQg\n" + "cGlpeDRfc21iYTsKPiAgc3RhdGljIGludCBzcnZyd29ya3NfY3NiNV9kZWxheTsKPiAgc3RhdGlj\n" + "IHN0cnVjdCBwY2lfZHJpdmVyIHBpaXg0X2RyaXZlcjsKPiAtc3RhdGljIHN0cnVjdCBpMmNfYWRh\n" + "cHRlciBwaWl4NF9hZGFwdGVyOwo+ICtzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGlpeDRfYWRhcHRlcjsK\n" + "PiArRVhQT1JUX1NZTUJPTF9HUEwocGlpeDRfYWRhcHRlcik7Cj4gCj4gIHN0YXRpYyBzdHJ1Y3Qg\n" + "ZG1pX3N5c3RlbV9pZCBfX2RldmluaXRkYXRhIHBpaXg0X2RtaV9ibGFja2xpc3RbXSA9IHsKPiAg\n" + "ICAgICAgIHsKPiBAQCAtMjQ2LDEwICsyNDcsMjIgQEAKPiAgICAgICAgICAgICAgICAgICAgICAg\n" + "ICAiMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsIHNtYmFfaWR4KTsKPiAgICAgICAgICAgICAgICAg\n" + "cmV0dXJuIC1FQlVTWTsKPiAgICAgICAgIH0KPiAtICAgICAgIG91dGJfcChzbWJfZW4sIHNtYmFf\n" + "aWR4KTsKPiAtICAgICAgIHNtYmFfZW5fbG8gPSBpbmJfcChzbWJhX2lkeCArIDEpOwo+IC0gICAg\n" + "ICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsKPiAtICAgICAgIHNtYmFfZW5faGkgPSBp\n" + "bmJfcChzbWJhX2lkeCArIDEpOwo+ICsgICAgICAgb3V0Yl9wKHNtYl9lbiwgc21iYV9pZHgpOyAg\n" + "ICAgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMKPiArICAgICAgIHNtYmFf\n" + "ZW5fbG8gPSBpbmJfcChzbWJhX2lkeCArIDEpOyAgICAgICAvL2xlZ2dvIGlsIGRhdG8gTCBkZWwg\n" + "cmVnaXN0cm8gMHgyYwo+ICsgICAgICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsgICAg\n" + "ICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMgKyAxCj4gKyAgICAgICBzbWJhX2Vu\n" + "X2hpID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdnbyBpbCBkYXRvIEggZGVsIHJl\n" + "Z2lzdHJvIDB4MmMKPiArCj4gKyAgICAgICBvdXRiX3Aoc21iX2VuLCBzbWJhX2lkeCk7ICAgICAg\n" + "ICAgICAgICAgLy9zZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYwo+ICsgICAgICAgb3V0Yl9wKHNt\n" + "YmFfZW5fbG8gJiAweEY5ICwgc21iYV9pZHggKyAxKTsgLy9zZWxlemlvbm8gbGEgcG9ydGEgMCAw\n" + "MCAwCj4gKyAgICAgICBvdXRiX3Aoc21iX2VuICsgMSwgc21iYV9pZHgpOyAgICAgICAgICAgLy9z\n" + "ZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYyArIDEKPiArICAgICAgIG91dGJfcChzbWJhX2VuX2hp\n" + "LCBzbWJhX2lkeCArIDEpOwo+ICsKPiArICAgICAgIG91dGJfcChzbWJfZW4sIHNtYmFfaWR4KTsg\n" + "ICAgICAgICAgICAgICAvL3NlbGV6aW9ubyBpbCByZWdpc3RybyAweDJjCj4gKyAgICAgICBzbWJh\n" + "X2VuX2xvID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdnbyBpbCBkYXRvIEwgZGVs\n" + "IHJlZ2lzdHJvIDB4MmMKPiArICAgICAgIG91dGJfcChzbWJfZW4gKyAxLCBzbWJhX2lkeCk7ICAg\n" + "ICAgICAgICAvL3NlbGV6aW9ubyBpbCByZWdpc3RybyAweDJjICsgMQo+ICsgICAgICAgc21iYV9l\n" + "bl9oaSA9IGluYl9wKHNtYmFfaWR4ICsgMSk7ICAgICAgIC8vbGVnZ28gaWwgZGF0byBIIGRlbCBy\n" + "ZWdpc3RybyAweDJjCj4gKwo+ICsKPiAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHNtYmFfaWR4LCAy\n" + "KTsKPiAKPiAgICAgICAgIGlmICgoc21iYV9lbl9sbyAmIDEpID09IDApIHsKPiBAQCAtMjU4LDYg\n" + "KzI3MSw4IEBACj4gICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwo+ICAgICAgICAgfQo+\n" + "IAo+ICsgICAgICAgZGV2X2luZm8oJlBJSVg0X2Rldi0+ZGV2LCJTZWxlY3RlZCBEZWZhdWx0IFNt\n" + "YnVzIFBvcnQgMHgleCIsCj4gKHNtYmFfZW5fbG8gJiAweDYpID4+IDEpOwo+ICsKPiAgICAgICAg\n" + "IHBpaXg0X3NtYmEgPSAoKHNtYmFfZW5faGkgPDwgOCkgfCBzbWJhX2VuX2xvKSAmIDB4ZmZlMDsK\n" + "PiAgICAgICAgIGlmIChhY3BpX2NoZWNrX3JlZ2lvbihwaWl4NF9zbWJhLCBTTUJJT1NJWkUsIHBp\n" + "aXg0X2RyaXZlci5uYW1lKSkKPiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Cj4gQEAg\n" + "LTQ2Niw3ICs0ODEsNyBAQAo+ICAgICAgICAgLmZ1bmN0aW9uYWxpdHkgID0gcGlpeDRfZnVuYywK\n" + "PiAgfTsKPiAKPiAtc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBwaWl4NF9hZGFwdGVyID0gewo+\n" + "ICtzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGlpeDRfYWRhcHRlciA9IHsKPiAgICAgICAgIC5vd25lciAg\n" + "ICAgICAgICA9IFRISVNfTU9EVUxFLAo+ICAgICAgICAgLmNsYXNzICAgICAgICAgID0gSTJDX0NM\n" + "QVNTX0hXTU9OIHwgSTJDX0NMQVNTX1NQRCwKPiAgICAgICAgIC5hbGdvICAgICAgICAgICA9ICZz\n" + "bWJ1c19hbGdvcml0aG0sCj4gZGlmZiAtdSAtTiAtciAyLjYuMzIub3JpZy9pMmMtcGlpeDQtbjM2\n" + "bC5jIDIuNi4zMi9pMmMtcGlpeDQtbjM2bC5jCj4gLS0tIDIuNi4zMi5vcmlnL2kyYy1waWl4NC1u\n" + "MzZsLmMgICAgICAgIDE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCj4gKysrIDIu\n" + "Ni4zMi9pMmMtcGlpeDQtbjM2bC5jICAgICAyMDExLTExLTE2IDE2OjAyOjAxLjAwMDAwMDAwMCAr\n" + "MDEwMAo+IEBAIC0wLDAgKzEsMjQ3IEBACj4gKy8qCj4gKyAqIGkyYy1waWl4NC1uMzZsLmMgLSBp\n" + "MmMtcGlpeDQgZXh0cmFzIGZvciB0aGUgSFAgcHJvbGlhbnQKPiBtaWNyb3NlcnZlciBuMzZsIG1v\n" + "dGhlcmJvYXJkCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwOCBKZWFuIERlbHZh\n" + "cmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KPiArICogQ29weXJpZ2h0IChDKSAyMDExICBFZGRpIERl\n" + "IFBpZXJpIDxlZGRpQGRlcGllcmkubmV0Pgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJl\n" + "ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBp\n" + "dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1\n" + "Ymxpc2hlZCBieQo+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy\n" + "c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgo+ICsgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl\n" + "ciB2ZXJzaW9uLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhl\n" + "IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB\n" + "TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRB\n" + "QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsg\n" + "KiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKgo+ICsg\n" + "KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs\n" + "aWMgTGljZW5zZQo+ICsgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0\n" + "byB0aGUgRnJlZSBTb2Z0d2FyZQo+ICsgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUs\n" + "IENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KPiArICovCj4gKwo+ICsvKgo+ICsgKiBXZSBzZWxl\n" + "Y3QgdGhlIGNoYW5uZWxzIGJ5IHNlbmRpbmcgY29tbWFuZHMgdG8gdGhlIHNiODAwIHNvdXRoYnVz\n" + "Cj4gKyAqIHRoZSBzZWxlY3Rpb24gYml0Cj4gKyAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMv\n" + "RW1iZWRkZWRfVGVjaERvY3MvNDU0ODIucGRmCj4gKyAqICBTbWJ1czBFbiAtIFJXIMOi4oKs4oCc\n" + "IDE2IGJpdHMgLSBbUE1fUmVnOiAyQ2hdCj4gKyAqICBGaWVsZCBOYW1lIEJpdHMgRGVmYXVsdCBE\n" + "ZXNjcmlwdGlvbgo+ICsgKiAgU21CdXMwRW4gMCAwYiBTZXQgdG8gMSB0byBlbmFibGUgU01CVVMw\n" + "IGZ1bmN0aW9uIGFuZCBkZWNvZGluZy4KPiArICogIFNtQnVzMFNlbCAyOjEgMDBiIFNtQnVzIHBv\n" + "cnQgc2VsZWN0aW9uIHdoZW4gUE1fUmVnIDJGaCBiaXQgMCBpcyBzZXQgdG8gMAo+ICsgKiAgMDA6\n" + "IFBvcnQgMAo+ICsgKiAgMDE6IFBvcnQgMgo+ICsgKiAgMTA6IFBvcnQgMwo+ICsgKiAgMTE6IFBv\n" + "cnQgNAo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUg\n" + "PGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ICsjaW5jbHVkZSA8\n" + "bGludXgvaW5pdC5oPgo+ICsjaW5jbHVkZSA8bGludXgvaTJjLmg+Cj4gKyNpbmNsdWRlIDxsaW51\n" + "eC9tdXRleC5oPgo+ICsjaW5jbHVkZSA8YXNtL2lvLmg+Cj4gKwo+ICtleHRlcm4gc3RydWN0IGky\n" + "Y19hZGFwdGVyIHBpaXg0X2FkYXB0ZXI7Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVy\n" + "ICpuMzZsX2FkYXB0ZXI7Cj4gK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSAqbjM2bF9hbGdv\n" + "Owo+ICsKPiArLyogV3JhcHBlciBhY2Nlc3MgZnVuY3Rpb25zIGZvciBtdWx0aXBsZXhlZCBTTUJ1\n" + "cyAqLwo+ICtzdGF0aWMgREVGSU5FX01VVEVYKHBpaXg0X2xvY2spOwo+ICsKPiArLyogV2UgcmVt\n" + "ZW1iZXIgdGhlIGxhc3QgdXNlZCBjaGFubmVscyBjb21iaW5hdGlvbiBzbyBhcyB0byBvbmx5IHN3\n" + "aXRjaAo+ICsgICBjaGFubmVscyB3aGVuIGl0IGlzIHJlYWxseSBuZWVkZWQuIFRoaXMgZ3JlYXRs\n" + "eSByZWR1Y2VzIHRoZSBTTUJ1cwo+ICsgICBvdmVyaGVhZCwgYnV0IGFsc28gYXNzdW1lcyB0aGF0\n" + "IG5vYm9keSB3aWxsIGJlIHdyaXRpbmcgdG8gdGhlIFBDQTk1NTYKPiArICAgaW4gb3VyIGJhY2su\n" + "ICovCj4gK3N0YXRpYyB1OCBsYXN0X2NoYW5uZWxzOwo+ICsKPiArc3RhdGljIGlubGluZSBzMzIg\n" + "cGlpeDRfYWNjZXNzX2NoYW5uZWwoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIs\n" + "Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0\n" + "IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" + "ICAgICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAg\n" + "ICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEsCj4gKyAgICAgICAg\n" + "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNoYW5uZWxzKQo+ICt7Cj4gKyAgICAg\n" + "ICBpbnQgZXJyb3I7Cj4gKyAgICAgICB1bnNpZ25lZCBzaG9ydCBzbWJhX2lkeCA9IDB4Y2Q2Owo+\n" + "ICsgICAgICAgdTggc21iYV9lbl9sbywgc21iYV9lbl9oaSwgc21iX2VuID0gMHgyYzsKPiArCj4g\n" + "KyAgICAgICBtdXRleF9sb2NrKCZwaWl4NF9sb2NrKTsKPiArCj4gKyAgICAgICBpZiAobGFzdF9j\n" + "aGFubmVscyAhPSBjaGFubmVscykgewo+ICsgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNf\n" + "ZGF0YSBtcGx4ZGF0YTsKPiArICAgICAgICAgICAgICAgbXBseGRhdGEuYnl0ZSA9IGNoYW5uZWxz\n" + "Owo+ICsKPiArICAgICAgICAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBhZGRyZXNzIG9mIHRoZSBT\n" + "TUJ1cyBhcmVhcyAqLwo+ICsgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKHNtYmFf\n" + "aWR4LCAyLCAic21iYV9pZHgiKSkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIo\n" + "JnBpaXg0X2FkYXB0ZXIuZGV2LCAiU01CdXMgYmFzZSBhZGRyZXNzIGluZGV4IHJlZ2lvbiAiCj4g\n" + "KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMHgleCBhbHJlYWR5IGluIHVzZSFcbiIs\n" + "IHNtYmFfaWR4KTsKPiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwo+ICsg\n" + "ICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgICAgICBvdXRiX3Aoc21iX2VuLCBzbWJh\n" + "X2lkeCk7ICAgICAgICAgICAgICAgLy9zZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYwo+ICsgICAg\n" + "ICAgICAgICAgICBzbWJhX2VuX2xvID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdn\n" + "byBpbCBkYXRvIEwgZGVsIHJlZ2lzdHJvIDB4MmMKPiArICAgICAgICAgICAgICAgb3V0Yl9wKHNt\n" + "Yl9lbiArIDEsIHNtYmFfaWR4KTsgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4\n" + "MmMgKyAxCj4gKyAgICAgICAgICAgICAgIHNtYmFfZW5faGkgPSBpbmJfcChzbWJhX2lkeCArIDEp\n" + "OyAgICAgICAvL2xlZ2dvIGlsIGRhdG8gSCBkZWwgcmVnaXN0cm8gMHgyYwo+ICsKPiArICAgICAg\n" + "ICAgICAgICAgbXNsZWVwKDUwKTsKPiArICAgICAgICAgICAgICAgb3V0Yl9wKHNtYl9lbiwgc21i\n" + "YV9pZHgpOyAgICAgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMKPiArICAg\n" + "ICAgICAgICAgICAgb3V0Yl9wKChzbWJhX2VuX2xvICYgMHhGOSApKyAoIGNoYW5uZWxzIDw8IDEp\n" + "ICwgc21iYV9pZHggKyAxKTsKPiAvL3NlbGV6aW9ubyBsYSBwb3J0YSAwIDAwIDAKPiArICAgICAg\n" + "ICAgICAgICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsgICAgICAgICAgIC8vc2VsZXpp\n" + "b25vIGlsIHJlZ2lzdHJvIDB4MmMgKyAxCj4gKyAgICAgICAgICAgICAgIG91dGJfcChzbWJhX2Vu\n" + "X2hpLCBzbWJhX2lkeCArIDEpOwo+ICsKPiArICAgICAgICAgICAgICAgbXNsZWVwKDUwKTsKPiAr\n" + "Cj4gKyAgICAgICAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHNtYmFfaWR4LCAyKTsKPiArCj4gKyAg\n" + "ICAgICAgICAgICAgIGRldl9pbmZvKCZwaWl4NF9hZGFwdGVyLmRldiwiU2VsZWN0ZWQgU21idXMg\n" + "UG9ydCAweCV4IiwgKHNtYmFfZW5fbG8KPiAmIDB4NikgPj4gMSk7Cj4gKwo+ICsgICAgICAgICAg\n" + "ICAgICBsYXN0X2NoYW5uZWxzID0gY2hhbm5lbHM7Cj4gKwo+ICsgICAgICAgfQo+ICsKPiArICAg\n" + "ICAgIGVycm9yID0gcGlpeDRfYWRhcHRlci5hbGdvLT5zbWJ1c194ZmVyKGFkYXAsIGFkZHIsIGZs\n" + "YWdzLCByZWFkX3dyaXRlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" + "ICAgICAgICBjb21tYW5kLCBzaXplLCBkYXRhKTsKPiArCj4gKwo+ICsgICAgICAgbXV0ZXhfdW5s\n" + "b2NrKCZwaWl4NF9sb2NrKTsKPiArICAgICAgIHJldHVybiBlcnJvcjsKPiArfQo+ICsKPiArc3Rh\n" + "dGljIHMzMiBwaWl4NF9hY2Nlc3NfdmlydDAoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2\n" + "IGFkZHIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZs\n" + "YWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4\n" + "IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlv\n" + "biBpMmNfc21idXNfZGF0YSAqIGRhdGEpCj4gK3sKPiArICAgICAgIHJldHVybiBwaWl4NF9hY2Nl\n" + "c3NfY2hhbm5lbChhZGFwLCBhZGRyLCBmbGFncywgcmVhZF93cml0ZSwgY29tbWFuZCwKPiArICAg\n" + "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZGF0YSwgMCk7Cj4gK30KPiAr\n" + "Cj4gK3N0YXRpYyBzMzIgcGlpeDRfYWNjZXNzX3ZpcnQxKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFk\n" + "YXAsIHUxNiBhZGRyLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBz\n" + "aG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg\n" + "ICAgICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" + "ICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQo+ICt7Cj4gKyAgICAgICByZXR1cm4gcGlp\n" + "eDRfYWNjZXNzX2NoYW5uZWwoYWRhcCwgYWRkciwgZmxhZ3MsIHJlYWRfd3JpdGUsIGNvbW1hbmQs\n" + "Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGRhdGEsIDEpOwo+\n" + "ICt9Cj4gKwo+ICtzdGF0aWMgczMyIHBpaXg0X2FjY2Vzc192aXJ0MihzdHJ1Y3QgaTJjX2FkYXB0\n" + "ZXIgKiBhZGFwLCB1MTYgYWRkciwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5z\n" + "aWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKPiArICAgICAgICAgICAgICAgICAg\n" + "ICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsCj4gKyAgICAgICAgICAgICAgICAgICAg\n" + "ICAgICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKPiArewo+ICsgICAgICAgcmV0\n" + "dXJuIHBpaXg0X2FjY2Vzc19jaGFubmVsKGFkYXAsIGFkZHIsIGZsYWdzLCByZWFkX3dyaXRlLCBj\n" + "b21tYW5kLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBkYXRh\n" + "LCAyKTsKPiArfQo+ICsKPiArc3RhdGljIHMzMiBwaWl4NF9hY2Nlc3NfdmlydDMoc3RydWN0IGky\n" + "Y19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg\n" + "ICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAg\n" + "ICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAg\n" + "ICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCj4gK3sKPiArICAg\n" + "ICAgIHJldHVybiBwaWl4NF9hY2Nlc3NfY2hhbm5lbChhZGFwLCBhZGRyLCBmbGFncywgcmVhZF93\n" + "cml0ZSwgY29tbWFuZCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6\n" + "ZSwgZGF0YSwgMyk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgX19pbml0IHBpaXg0X24zNmxfaW5p\n" + "dCh2b2lkKQo+ICt7Cj4gKyAgICAgICBpbnQgaSwgZXJyb3I7Cj4gKwo+ICsgICAgICAgaWYgKCFw\n" + "aWl4NF9hZGFwdGVyLmRldi5wYXJlbnQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVW\n" + "Owo+ICsKPiArICAgICAgIHByaW50ayhLRVJOX0lORk8gIkNvbmZpZ3VyZSB0aGUgQU1EIFNCODAw\n" + "IE11bHRpcGxleGVyXG4iKTsKPiArCj4gKyAgICAgICAvKiBVbnJlZ2lzdGVyIHBoeXNpY2FsIGJ1\n" + "cyAqLwo+ICsgICAgICAgZXJyb3IgPSBpMmNfZGVsX2FkYXB0ZXIoJnBpaXg0X2FkYXB0ZXIpOwo+\n" + "ICsgICAgICAgaWYgKGVycm9yKSB7Cj4gKyAgICAgICAgICAgICAgIGRldl9lcnIoJnBpaXg0X2Fk\n" + "YXB0ZXIuZGV2LCAiUGh5c2ljYWwgYnVzIHJlbW92YWwgZmFpbGVkXG4iKTsKPiArICAgICAgICAg\n" + "ICAgICAgZ290byBFUlJPUjA7Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgcHJpbnRrKEtFUk5f\n" + "SU5GTyAiRW5hYmxpbmcgU01CdXMgbXVsdGlwbGV4aW5nIGZvciBIcCBQcm9saWFudAo+IE1pY3Jv\n" + "c2VydmVyIE4zNmxcbiIpOwo+ICsgICAgICAgLyogRGVmaW5lIHRoZSA0IHZpcnR1YWwgYWRhcHRl\n" + "cnMgYW5kIGFsZ29yaXRobXMgc3RydWN0dXJlcyAqLwo+ICsgICAgICAgaWYgKCEobjM2bF9hZGFw\n" + "dGVyID0ga3phbGxvYyg1ICogc2l6ZW9mKHN0cnVjdCBpMmNfYWRhcHRlciksCj4gKyAgICAgICAg\n" + "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKSkpIHsKPiArICAgICAgICAg\n" + "ICAgICAgZXJyb3IgPSAtRU5PTUVNOwo+ICsgICAgICAgICAgICAgICBnb3RvIEVSUk9SMTsKPiAr\n" + "ICAgICAgIH0KPiArICAgICAgIGlmICghKG4zNmxfYWxnbyA9IGt6YWxsb2MoNSAqIHNpemVvZihz\n" + "dHJ1Y3QgaTJjX2FsZ29yaXRobSksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" + "ICBHRlBfS0VSTkVMKSkpIHsKPiArICAgICAgICAgICAgICAgZXJyb3IgPSAtRU5PTUVNOwo+ICsg\n" + "ICAgICAgICAgICAgICBnb3RvIEVSUk9SMjsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICAvKiBG\n" + "aWxsIGluIHRoZSBuZXcgc3RydWN0dXJlcyAqLwo+ICsgICAgICAgbjM2bF9hbGdvWzBdID0gKihw\n" + "aWl4NF9hZGFwdGVyLmFsZ28pOwo+ICsgICAgICAgbjM2bF9hbGdvWzBdLnNtYnVzX3hmZXIgPSBw\n" + "aWl4NF9hY2Nlc3NfdmlydDA7Cj4gKyAgICAgICBuMzZsX2FkYXB0ZXJbMF0gPSBwaWl4NF9hZGFw\n" + "dGVyOwo+ICsgICAgICAgc25wcmludGYobjM2bF9hZGFwdGVyWzBdLm5hbWUsIHNpemVvZihuMzZs\n" + "X2FkYXB0ZXJbMF0ubmFtZSksCj4gKyAgICAgICAgICAgICAgICAiU01CdXMgcGlpeDQgYWRhcHRl\n" + "ciAoU0RBMCkiKTsKPiArICAgICAgIG4zNmxfYWRhcHRlclswXS5hbGdvID0gbjM2bF9hbGdvOwo+\n" + "ICsgICAgICAgbjM2bF9hZGFwdGVyWzBdLmRldi5wYXJlbnQgPSBwaWl4NF9hZGFwdGVyLmRldi5w\n" + "YXJlbnQ7Cj4gKyAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7Cj4gKyAgICAgICAgICAg\n" + "ICAgIG4zNmxfYWxnb1tpXSA9ICoocGlpeDRfYWRhcHRlci5hbGdvKTsKPiArICAgICAgICAgICAg\n" + "ICAgbjM2bF9hZGFwdGVyW2ldID0gcGlpeDRfYWRhcHRlcjsKPiArICAgICAgICAgICAgICAgc25w\n" + "cmludGYobjM2bF9hZGFwdGVyW2ldLm5hbWUsIHNpemVvZihuMzZsX2FkYXB0ZXJbaV0ubmFtZSks\n" + "Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJTTUJ1cyBwaWl4NCBhZGFwdGVyIChTREElZCki\n" + "LCBpICsgMSk7Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlcltpXS5hbGdvID0gbjM2bF9h\n" + "bGdvK2k7Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlcltpXS5kZXYucGFyZW50ID0gcGlp\n" + "eDRfYWRhcHRlci5kZXYucGFyZW50Owo+ICsgICAgICAgfQo+ICsgICAgICAgbjM2bF9hbGdvWzFd\n" + "LnNtYnVzX3hmZXIgPSBwaWl4NF9hY2Nlc3NfdmlydDE7Cj4gKyAgICAgICBuMzZsX2FsZ29bMl0u\n" + "c21idXNfeGZlciA9IHBpaXg0X2FjY2Vzc192aXJ0MjsKPiArICAgICAgIG4zNmxfYWxnb1szXS5z\n" + "bWJ1c194ZmVyID0gcGlpeDRfYWNjZXNzX3ZpcnQzOwo+ICsKPiArICAgICAgIC8qIFJlZ2lzdGVy\n" + "IHZpcnR1YWwgYWRhcHRlcnMgKi8KPiArICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsK\n" + "PiArICAgICAgICAgICAgICAgZXJyb3IgPSBpMmNfYWRkX2FkYXB0ZXIobjM2bF9hZGFwdGVyK2kp\n" + "Owo+ICsgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKPiArICAgICAgICAgICAgICAgICAgICAg\n" + "ICBwcmludGsoS0VSTl9FUlIgImkyYy1waWl4NC1uMzZsOiAiCj4gKyAgICAgICAgICAgICAgICAg\n" + "ICAgICAgICAgICAgICJWaXJ0dWFsIGFkYXB0ZXIgJWQgcmVnaXN0cmF0aW9uICIKPiArICAgICAg\n" + "ICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZFxuIiwg\n" + "aSk7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpLS07IGkgPj0gMDsgaS0tKQo+ICsg\n" + "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTJjX2RlbF9hZGFwdGVyKG4zNmxfYWRhcHRl\n" + "citpKTsKPiArICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVSUk9SMzsKPiArICAgICAgICAg\n" + "ICAgICAgfQo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHJldHVybiAwOwo+ICsKPiArRVJST1Iz\n" + "Ogo+ICsgICAgICAga2ZyZWUobjM2bF9hbGdvKTsKPiArICAgICAgIG4zNmxfYWxnbyA9IE5VTEw7\n" + "Cj4gK0VSUk9SMjoKPiArICAgICAgIGtmcmVlKG4zNmxfYWRhcHRlcik7Cj4gKyAgICAgICBuMzZs\n" + "X2FkYXB0ZXIgPSBOVUxMOwo+ICtFUlJPUjE6Cj4gKyAgICAgICAvKiBSZXN0b3JlIHBoeXNpY2Fs\n" + "IGJ1cyAqLwo+ICsgICAgICAgaTJjX2FkZF9hZGFwdGVyKCZwaWl4NF9hZGFwdGVyKTsKPiArRVJS\n" + "T1IwOgo+ICsgICAgICAgcmV0dXJuIGVycm9yOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2V4\n" + "aXQgcGlpeDRfbjM2bF9leGl0KHZvaWQpCj4gK3sKPiArICAgICAgIGlmIChuMzZsX2FkYXB0ZXIp\n" + "IHsKPiArICAgICAgICAgICAgICAgaW50IGk7Cj4gKwo+ICsgICAgICAgICAgICAgICBmb3IgKGkg\n" + "PSAwOyBpIDwgNTsgaSsrKQo+ICsgICAgICAgICAgICAgICAgICAgICAgIGkyY19kZWxfYWRhcHRl\n" + "cihuMzZsX2FkYXB0ZXIraSk7Cj4gKyAgICAgICAgICAgICAgIGtmcmVlKG4zNmxfYWRhcHRlcik7\n" + "Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlciA9IE5VTEw7Cj4gKyAgICAgICB9Cj4gKyAg\n" + "ICAgICBrZnJlZShuMzZsX2FsZ28pOwo+ICsgICAgICAgbjM2bF9hbGdvID0gTlVMTDsKPiArCj4g\n" + "KyAgICAgICAvKiBSZXN0b3JlIHBoeXNpY2FsIGJ1cyAqLwo+ICsgICAgICAgaWYgKGkyY19hZGRf\n" + "YWRhcHRlcigmcGlpeDRfYWRhcHRlcikpCj4gKyAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VS\n" + "UiAiaTJjLXBpaXg0LW4zNmw6ICIKPiArICAgICAgICAgICAgICAgICAgICAgICJQaHlzaWNhbCBi\n" + "dXMgcmVzdG9yYXRpb24gZmFpbGVkXG4iKTsKPiArfQo+ICsKPiArTU9EVUxFX0FVVEhPUigiRWRk\n" + "aSBEZSBQaWVyaSA8ZWRkaUBkZXBpZXJpLm5ldCIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIm4z\n" + "NmwgU01CdXMgbXVsdGlwbGV4aW5nIik7Cj4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKPiArCj4g\n" + "K21vZHVsZV9pbml0KHBpaXg0X24zNmxfaW5pdCk7Cj4gK21vZHVsZV9leGl0KHBpaXg0X24zNmxf\n" + "ZXhpdCk7Cj4gCj4gCj4gT24gU3VuLCBOb3YgMjcsIDIwMTEgYXQgMTE6NTUgUE0sIEJlbiBEb29r\n" + "cyA8YmVuLWkyY0BmbHVmZi5vcmc+IHdyb3RlOgo+ID4KPiA+IE9uIEZyaSwgTm92IDI1LCAyMDEx\n" + "IGF0IDExOjA3OjIxUE0gKzAxMDAsIEVkZGkgRGUgUGllcmkgd3JvdGU6Cj4gPj4gVGhpcyBwYXRj\n" + "aCBhZGQgc3VwcG9ydCB0byBtdWx0aXBsZXhlZCBzbWJ1cyBmb3IgcHJvbGlhbnQgbWljcm9zZXJ2\n" + "ZXIKPiA+PiBOMzZMIGFuZCBtYXkgYmUgYXBwbGljYWJsZSB0byBvdGhlciBjb25maWd1cmF0aW9u\n" + "IGJhc2VkIG9uIHNiOHh4Cj4gPj4gc291dGhidXMuCj4gPj4KPiA+PiByb290QHByb2xpYW50Oi91\n" + "c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMgaTJjZGV0ZWN0IC1sCj4gPj4gaTJjLTAgICBzbWJ1cyAg\n" + "ICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBMCkgICAgICAgICAgICAgIFNNQnVzIGFk\n" + "YXB0ZXIKPiA+PiBpMmMtMSAgIHNtYnVzICAgICAgICAgICBTTUJ1cyBwaWl4NCBhZGFwdGVyIChT\n" + "REEyKSAgICAgICAgICAgICAgU01CdXMgYWRhcHRlcgo+ID4+IGkyYy0yICAgc21idXMgICAgICAg\n" + "ICAgIFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTMpICAgICAgICAgICAgICBTTUJ1cyBhZGFwdGVy\n" + "Cj4gPj4gaTJjLTMgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBNCkg\n" + "ICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiA+PiByb290QHByb2xpYW50Oi91c3Ivc3JjL2xt\n" + "LXNlbnNvcnMvZWRkaSMKPiA+Cj4gPiBwYXRjaCBzaG91bGQgZ28gaW5saW5lIHNvIGl0IGNhbiBi\n" + "ZSByZXZpZXdlZCwgdGhhbmtzLgo+ID4KPiA+IC0tCj4gPiBCZW4gRG9va3MsIGJlbkBmbHVmZi5v\n" + "cmcsIGh0dHA6Ly93d3cuZmx1ZmYub3JnL2Jlbi8KPiA+Cj4gPiBMYXJnZSBIYWRyb24gQ29sYWRh\n" + "OiBBIGxhcmdlIFBpbmEgQ29sYWRhIHRoYXQgbWFrZXMgdGhlIHVuaXZlcnNlIGRpc2FwcGVhci4K\n" + "PiA+Cj4gCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K\n" + "PiBsbS1zZW5zb3JzIG1haWxpbmcgbGlzdAo+IGxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKPiBo\n" + "dHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3JzCgpf\n" + "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3Jz\n" + "IG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1z\n" + ZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM -11c413220ba6cfe389f1cf7d4abb5872a8b5ea47676d7100d4e22573d5c9bced +2562e0e24e7ae6bc59a73b3eb42266dbca899f977a90594193c30697af3629ad
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.