From nobody Mon Feb 9 22:21:59 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1dmarc=pass fromdomain=outlook.com); dmarc=pass(p=none dis=none) header.from=outlook.com ARC-Seal: i=2; a=rsa-sha256; t=1601724489; cv=pass; d=zohomail.com; s=zohoarc; b=YA0WntUVPkKHYyCqP92BGR0Iyb8xRIiL+O08x+mEqEsu5DBtdSbXQcVlvZ8iCWy7YSy9RSehfKDSJFy7Rv/VVHX7NObKuo3VoIKR8iWylHclVObwKJIn4ugkiRRCYZ3OYIY6+4afzPYifJDE+ct2EJD8VwSv/myTvdRubSeN3Kc= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1601724489; h=Content-Type:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8HSG9QQ9bWf89qcfqcoySDiDW1Eh4tEFao55VbAQ6r8=; b=n8gjYYMPWj1YteY3SzpNIRKX0naQR2Wubf+a2dN+erd2cCwvST1hL2y4zcHjojaBGWAo5n/jrcmzonsIWM0CnV3pfMn8uhMIfuSgqcYsq0l5dy7H6VvNUp1v+8cXXrGOyRqGTcsCsi35xLP9RGZRxj9VADoyqkuA//raO23pyn4= ARC-Authentication-Results: i=2; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1dmarc=pass fromdomain=outlook.com); dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 160172448944757.66790110681973; Sat, 3 Oct 2020 04:28:09 -0700 (PDT) Received: from localhost ([::1]:52124 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kOfhu-0001JQ-Qf for importer@patchew.org; Sat, 03 Oct 2020 07:28:06 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:53042) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kOffu-0008Ou-0i for qemu-devel@nongnu.org; Sat, 03 Oct 2020 07:26:02 -0400 Received: from mail-mw2nam10olkn2053.outbound.protection.outlook.com ([40.92.42.53]:26004 helo=NAM10-MW2-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kOffp-0003iM-3V for qemu-devel@nongnu.org; Sat, 03 Oct 2020 07:26:01 -0400 Received: from DM6NAM10FT034.eop-nam10.prod.protection.outlook.com (2a01:111:e400:7e86::46) by DM6NAM10HT012.eop-nam10.prod.protection.outlook.com (2a01:111:e400:7e86::363) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3433.34; Sat, 3 Oct 2020 11:25:54 +0000 Received: from DM6PR16MB2473.namprd16.prod.outlook.com (2a01:111:e400:7e86::42) by DM6NAM10FT034.mail.protection.outlook.com (2a01:111:e400:7e86::372) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3433.34 via Frontend Transport; Sat, 3 Oct 2020 11:25:54 +0000 Received: from DM6PR16MB2473.namprd16.prod.outlook.com ([fe80::ec2c:246a:b4d4:48b1]) by DM6PR16MB2473.namprd16.prod.outlook.com ([fe80::ec2c:246a:b4d4:48b1%3]) with mapi id 15.20.3433.039; Sat, 3 Oct 2020 11:25:54 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IAjfJ49ZucyNmsVPLilMF3VlhzAu4TaZ50OyRIrMbJ7WrtQalqNH6S1krCIztqpVyD4tcftERoM41xCrJhldWSIjgdtVHbjuvY+0wnBLjW0gshXCQK2xATXEu2enno+aC8lzaqwRlkRtcTP4xycK6l5LmvprCZTAXlzkqB0yancaOowmb4vJuqaVT6QDw/nsNb7wmii6ePeBITxo3SIS/3+kjNBSsyyeLzaIl/SMvixW/B/yZELAkhfulWidkLPTcoMOGC1IjxEx8+E85RsfT8NHYRur0GZG0d7uqSG6Gxg6bQOQX/BZ3I4sxW1LTuiYurQazlF2EXfJH8vweJYgLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8HSG9QQ9bWf89qcfqcoySDiDW1Eh4tEFao55VbAQ6r8=; b=LMUQ+wPSsD+ZTdOWMFZk7HzUT9xxaiuqxLuxhwj1rzy8IH9+JTbxWFZRY/vhZUxbWdnSQ5cMtRtpvotPeA7uBeHfNOWIhWO8uoqvvK69dUXf3xpLYGFnTJZhMIpCn4kpTmyG1GquZRFNWnGgYgsaINA0BltUzozVPSbqEikN2ZPJS/aqFDvT6Oehpk3zSMuRjtpI7lRNlKOTnrLNcSdVrLdHGSRnKPyVgJkCjHjb6FZY+DRRl2I0ooEQ37WHkPiFLD0uo3cd4IZLGUh5hznVeXRkhMr1Ef2q7qPx5WM7Ayyl1HYLT1anmTFTpa6p6CTPCm6Iqu+QNLsNLo85+CmjMg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8HSG9QQ9bWf89qcfqcoySDiDW1Eh4tEFao55VbAQ6r8=; b=Bl/sJwzV6Q07S5u6zEp/SfbA9rVcYn9jP6SjKqjiJFNEzUpZ5PFMzu8X4xhK36QtwZnOfHAoKp8vf3jvhddpeTjdbJfGfpXXqVul2ugQCOSQS1HS9i4e+FRT59uMp+xXBxjYNLGw52F5Bhc6drPdP906jVUDe+YqMeiHPr/3sMCBBGEePbuiArbsbiONecDO3iF2UHIpPUQ6EsKF1n7rTvOZ668qAE6J7u7t+83iuiI66XiLVlWqCbS4XnYHgq63HnTPeQKHP4L731hKZRTZll7PrwpH4YE4svnPIMJs38YF974DnUdb2M/wJJ74mZ4eCMgHUeYSQpjYzmoEu0ufPg== From: Hee-cheol Yang To: =?utf-8?B?UGhpbGlwcGUgTWF0aGlldS1EYXVkw6k=?= , "qemu-devel@nongnu.org" Subject: [PATCH v2] hw/avr: Add limited support for avr gpio registers Thread-Topic: [PATCH v2] hw/avr: Add limited support for avr gpio registers Thread-Index: AQHWmXfyJKHwqoAMkUKhft9k1itSLQ== Date: Sat, 3 Oct 2020 11:25:49 +0000 Message-ID: References: , <45f921ac-39d5-2650-9b52-382acecf71d7@amsat.org> In-Reply-To: <45f921ac-39d5-2650-9b52-382acecf71d7@amsat.org> Accept-Language: ko-KR, en-US Content-Language: ko-KR X-MS-Has-Attach: X-MS-TNEF-Correlator: x-incomingtopheadermarker: OriginalChecksum:70CE9467318E55271F3B164732D8D071728454A38278585A7B1A31F25147A957; UpperCasedChecksum:8FE7A0B8F1DCACC98849F509AA5104683E80D76C5B150E751061A4FF4E51D5BA; SizeAsReceived:9168; Count:45 x-ms-exchange-messagesentrepresentingtype: 1 x-tmn: [lrmeh4xVIUKqkOTgD9Qs21OfGacK93t0] x-ms-publictraffictype: Email x-incomingheadercount: 45 x-eopattributedmessage: 0 x-ms-office365-filtering-correlation-id: dad8388b-c5ca-4135-6e34-08d8678f173d x-ms-exchange-slblob-mailprops: =?utf-8?B?MndaaWFlUlpTYXkxaFhESE1YdGZhdW5uSGw5OUdlUlcyMUc4NWxRdmJrK3kx?= =?utf-8?B?Vnp4ZHJ5ZGFhSzc1OHlDOXZETGRXNm8wMHA2UXd3K0NGM1RnanhnYUo0dWtY?= =?utf-8?B?ZVpSVFpHK2JkdU1sSzZ4cVF4aDJldlFoakl4RzZzS2NaWWpjTEVQODZhSUI4?= =?utf-8?B?ZW85NkwrTWEwdVJmcFpFZVorTVhmSzJPTlB3QXZ4VXNYWDZ2RHhrU1dhWGJ2?= =?utf-8?B?UytINStRMkxWU0Z2UnNVQzIrWXZGaUo2NzgyR3EyWXBEM2NJdVdCajdpcUFJ?= =?utf-8?B?QjNXeUdZU1lENW1UcEFOVDltdWJNYytsUzc3SUVZdU1oN00rT3pTdGxqOCtp?= =?utf-8?B?U3luZnY1aFdnenk3bXh5ZTV6aTFreFpPRjRub1NrQ25KV25jaFhwVXVBM1V2?= =?utf-8?B?Z0lic3laYUNPQWdKUEgvbCtXQ0hsbXZjK0s2RkMvdnpIdTMxdG1ScnYwYUJS?= =?utf-8?B?VWdmdkcyTHV1NGI0aXFnRGxBZkRZQWRXYkNXbzFyWTN4NzU0L2VmR0JYNjdB?= =?utf-8?B?MW9LclRSL1VISmplUTIyaldKUUEwaVAxSGxpbGdOZ0ZOS09wcFdXam56N29H?= =?utf-8?B?cnBINTA3SGU0aEgzdGJjTVc5eVBpRmxxN0s1T3gxeHlLUDVvWW1iNGdSYWwy?= =?utf-8?B?bEx0UVRFMjhFbUdYU01ONXo5YTdEemhGVUFUdTMvQmxTcXRMOU5EdlRuN1Qv?= =?utf-8?B?d2UvdDcrRTR2UzFEM1VkYW9ZSmlabmxOeHZxeDIzTXZVRzNqQWNlZVo3aUZm?= =?utf-8?B?LzVBTkgzNXlNUDMwSmd2OFdxTFF6aXRzMHhOMGsyOGd0RklJSHRyTkVsSnRY?= =?utf-8?B?WHl1ZTVPNTZoYmFRR1lsWVdMVTZEZThibTVsODdobzRBQVZOa3lrNXBuREsz?= =?utf-8?B?WWhNc3ZESTE3MnQxc2hzV0hDN1NSZFdaWDdZNlAyVzczcXdxVWlQNzJTZlpS?= =?utf-8?B?YndXbjRkeXFQaXRLSzg3akNTQW1zMkRORWNiTWVDRzM1czRSRW9EM1VkZ1JM?= =?utf-8?B?UnRyQkh6bjUxZzBGaGkxNGRzWVpVaEc2Si9MbllXSFM2bWNwRmRRM1p0Z2Vx?= =?utf-8?B?cUxOVWs4Q2hOcGpTRS9zUjdhRHZ2elVac0p3dW1tYW5OcndoZkRRUlpPZTZU?= =?utf-8?B?ang5ME9taS9hSlJJTEpxV0RoZDB3TE8wa04zeklSdHZNcmxHT2dpY0gvTTVa?= =?utf-8?B?R3lKNmdMWHZIc2NZNWZUancwbU5xSmNzSmVlZGVsSFhSTkExOVhnMVBsU2hS?= =?utf-8?B?K1JyY2poTWUrdEhZTytxbWsyaGoyV2VreXpHMTNFTHlodmRTaGJxOUZqYnpi?= =?utf-8?B?UVZuWmdZeXhVeURhSklaa3o1L2lZQys2THNiQ3o5Wm9LamE3NDhiN0g0UGZh?= =?utf-8?B?aTYxTUpnZXRmMmVKM3lialdMYkxHY1Y2ZGNBd3ZiSGVGWDJKYUVwU2NoYklK?= =?utf-8?Q?T+B3LiQBf3xqMRjKIH8=3D?= x-ms-traffictypediagnostic: DM6NAM10HT012: x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: ExwygtoIpz4wnor6QBHOs+YcUcDIAahltudqrrFmGTVtfqW09OyLR7s2WDPs6MBD59WdsQB/cHmssw+Ck6p1FVH7PwQkhbyKL4CaSfHmsrwwgA/HFWg4hUHQpWmZlLiNdQi0h5Dbd+xV2zIR2L6guRTURft8FP4DaIIXCwMyJ3SDEaBkBHCYYYYtHvGFbdKmOS5PnVq9s0WVnIhiV9R6YswlHV9ouGlCHaDDYdIyq/WWi4HKsomNsTkN+vLF3iUO x-ms-exchange-antispam-messagedata: /9iP7C3dafFdVbPsrtbShvV3yPlCCMk0tg4XQPyIfdzu22ChfKHZq9NRb3FX1+TmoGu2esfDTUuyjAbfA7MA//mGbpEkpF5lnOwbMYHO98MAKVTmY/al9uwn2O/2nOz/xXfJ9V8SQ81w3PmrTqCO2Q== x-ms-exchange-transport-forked: True Content-Type: multipart/alternative; boundary="_000_DM6PR16MB247387BA8035F7591182CA51E60E0DM6PR16MB2473namp_" MIME-Version: 1.0 X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-AuthSource: DM6NAM10FT034.eop-nam10.prod.protection.outlook.com X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: dad8388b-c5ca-4135-6e34-08d8678f173d X-MS-Exchange-CrossTenant-originalarrivaltime: 03 Oct 2020 11:25:51.9613 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Internet X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-rms-persistedconsumerorg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6NAM10HT012 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=40.92.42.53; envelope-from=heecheol.yang@outlook.com; helo=NAM10-MW2-obe.outbound.protection.outlook.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/03 07:25:55 X-ACL-Warn: Detected OS = Windows NT kernel [generic] [fuzzy] X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, FREEMAIL_REPLY=1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "S.E.Harris@kent.ac.uk" , "mrolnik@gmail.com" , Hee-cheol Yang Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @outlook.com) --_000_DM6PR16MB247387BA8035F7591182CA51E60E0DM6PR16MB2473namp_ Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Hello, Thank you very much for your prompt and kind review. This is my next version of the patch. Here are what I changed from the prev= ious one: * Remove unnecessary header inclusions * Replace codes for unreachable conditions with g_assert_not_reached() = function * Remove 'enable' field from AVRGPIOState structure: It is actually unn= ecessary. I copied this field from AVRUSARTState structure. I am afraid that there is an encoding issue even though I tried to do it co= rrectly. Sorry in advance for this issue again. With best regards Heecheol Yang. diff --git a/hw/avr/Kconfig b/hw/avr/Kconfig index d31298c3cc..16a57ced11 100644 --- a/hw/avr/Kconfig +++ b/hw/avr/Kconfig @@ -3,6 +3,7 @@ config AVR_ATMEGA_MCU select AVR_TIMER16 select AVR_USART select AVR_POWER + select AVR_GPIO config ARDUINO select AVR_ATMEGA_MCU diff --git a/hw/avr/atmega.c b/hw/avr/atmega.c index 44c6afebbb..ad942028fd 100644 --- a/hw/avr/atmega.c +++ b/hw/avr/atmega.c @@ -283,8 +283,11 @@ static void atmega_realize(DeviceState *dev, Error **e= rrp) continue; } devname =3D g_strdup_printf("atmega-gpio-%c", 'a' + (char)i); - create_unimplemented_device(devname, - OFFSET_DATA + mc->dev[idx].addr, 3); + object_initialize_child(OBJECT(dev), devname, &s->gpio[i], + TYPE_AVR_GPIO); + sysbus_realize(SYS_BUS_DEVICE(&s->gpio[i]), &error_abort); + sysbus_mmio_map(SYS_BUS_DEVICE(&s->gpio[i]), 0, + OFFSET_DATA + mc->dev[idx].addr); g_free(devname); } diff --git a/hw/avr/atmega.h b/hw/avr/atmega.h index a99ee15c7e..e2289d5744 100644 --- a/hw/avr/atmega.h +++ b/hw/avr/atmega.h @@ -13,6 +13,7 @@ #include "hw/char/avr_usart.h" #include "hw/timer/avr_timer16.h" +#include "hw/gpio/avr_gpio.h" #include "hw/misc/avr_power.h" #include "target/avr/cpu.h" #include "qom/object.h" @@ -44,6 +45,7 @@ struct AtmegaMcuState { DeviceState *io; AVRMaskState pwr[POWER_MAX]; AVRUsartState usart[USART_MAX]; + AVRGPIOState gpio[GPIO_MAX]; AVRTimer16State timer[TIMER_MAX]; uint64_t xtal_freq_hz; }; diff --git a/hw/gpio/Kconfig b/hw/gpio/Kconfig index b6fdaa2586..1752d0ce56 100644 --- a/hw/gpio/Kconfig +++ b/hw/gpio/Kconfig @@ -10,3 +10,6 @@ config GPIO_KEY config SIFIVE_GPIO bool + +config AVR_GPIO + bool diff --git a/hw/gpio/avr_gpio.c b/hw/gpio/avr_gpio.c new file mode 100644 index 0000000000..6ca8e8703a --- /dev/null +++ b/hw/gpio/avr_gpio.c @@ -0,0 +1,112 @@ +/* + * AVR processors GPIO registers emulation. + * + * Copyright (C) 2020 Heecheol Yang + * + * 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 or + * (at your option) version 3 of the License. + * + * 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, see . + */ +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "qemu/module.h" +#include "qapi/error.h" +#include "hw/sysbus.h" +#include "hw/irq.h" +#include "hw/gpio/avr_gpio.h" +#include "hw/qdev-properties.h" + +static void avr_gpio_reset(DeviceState *dev) +{ + AVRGPIOState *gpio =3D AVR_GPIO(dev); + gpio->ddr_val =3D 0u; + gpio->port_val =3D 0u; +} +static uint64_t avr_gpio_read(void *opaque, hwaddr offset, unsigned int si= ze) +{ + AVRGPIOState *s =3D (AVRGPIOState *)opaque; + switch (offset) { + case GPIO_PIN: + /* Not implemented yet */ + break; + case GPIO_DDR: + return s->ddr_val; + break; + case GPIO_PORT: + return s->port_val; + default: + g_assert_not_reached(); + break; + } + return 0; +} + +static void avr_gpio_write(void *opaque, hwaddr offset, uint64_t value, + unsigned int size) +{ + AVRGPIOState *s =3D (AVRGPIOState *)opaque; + switch (offset) { + case GPIO_PIN: + /* Not implemented yet */ + break; + case GPIO_DDR: + s->ddr_val =3D value & 0xF; + break; + case GPIO_PORT: + s->port_val =3D value & 0xF; + break; + default: + g_assert_not_reached(); + break; + } +} + +static const MemoryRegionOps avr_gpio_ops =3D { + .read =3D avr_gpio_read, + .write =3D avr_gpio_write, + .endianness =3D DEVICE_NATIVE_ENDIAN, +}; + +static void avr_gpio_init(Object *obj) +{ + AVRGPIOState *s =3D AVR_GPIO(obj); + memory_region_init_io(&s->mmio, obj, &avr_gpio_ops, s, TYPE_AVR_GPIO, = 3); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} +static void avr_gpio_realize(DeviceState *dev, Error **errp) +{ + avr_gpio_reset(dev); +} + + +static void avr_gpio_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->reset =3D avr_gpio_reset; + dc->realize =3D avr_gpio_realize; +} + +static const TypeInfo avr_gpio_info =3D { + .name =3D TYPE_AVR_GPIO, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(AVRGPIOState), + .instance_init =3D avr_gpio_init, + .class_init =3D avr_gpio_class_init, +}; + +static void avr_gpio_register_types(void) +{ + type_register_static(&avr_gpio_info); +} + +type_init(avr_gpio_register_types) diff --git a/hw/gpio/meson.build b/hw/gpio/meson.build index 86cae9a0f3..258bd5dcfc 100644 --- a/hw/gpio/meson.build +++ b/hw/gpio/meson.build @@ -11,3 +11,5 @@ softmmu_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_= gpio.c')) softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_gpio.c')) softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_gpio.c')) softmmu_ss.add(when: 'CONFIG_SIFIVE_GPIO', if_true: files('sifive_gpio.c')) + +softmmu_ss.add(when: 'CONFIG_AVR_GPIO', if_true: files('avr_gpio.c')) diff --git a/include/hw/gpio/avr_gpio.h b/include/hw/gpio/avr_gpio.h new file mode 100644 index 0000000000..84d783f8fc --- /dev/null +++ b/include/hw/gpio/avr_gpio.h @@ -0,0 +1,46 @@ +/* + * AVR processors GPIO registers definition. + * + * Copyright (C) 2020 Heecheol Yang + * + * 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 or + * (at your option) version 3 of the License. + * + * 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, see . + */ + +#ifndef AVR_GPIO_H +#define AVR_GPIO_H + +#include "hw/sysbus.h" +#include "qom/object.h" + +/* Offsets of registers. */ +#define GPIO_PIN 0x00 +#define GPIO_DDR 0x01 +#define GPIO_PORT 0x02 + +#define TYPE_AVR_GPIO "avr-gpio" +OBJECT_DECLARE_SIMPLE_TYPE(AVRGPIOState, AVR_GPIO) + +struct AVRGPIOState { + /*< private >*/ + SysBusDevice parent_obj; + + /*< public >*/ + MemoryRegion mmio; + + uint8_t ddr_val; + uint8_t port_val; + +}; + +#endif /* AVR_GPIO_H */ ________________________________ =EB=B3=B4=EB=82=B8 =EC=82=AC=EB=9E=8C: Philippe Mathieu-Daud=C3=A9 =EB=8C=80=EC=8B=A0 Philippe Mathieu-Daud=C3=A9 =EB=B3=B4=EB=82=B8 =EB=82=A0=EC=A7=9C: 2020=EB=85=84 10=EC=9B=94 3=EC=9D=BC= =ED=86=A0=EC=9A=94=EC=9D=BC =EC=98=A4=EC=A0=84 12:48 =EB=B0=9B=EB=8A=94 =EC=82=AC=EB=9E=8C: Heecheol Yang ; qemu-devel@nongnu.org =EC=B0=B8=EC=A1=B0: S.E.Harris@kent.ac.uk ; mrolnik@= gmail.com =EC=A0=9C=EB=AA=A9: Re: [PATCH] hw/avr: Add limited support for avr gpio re= gisters Hi Yang, On 10/2/20 5:24 PM, Heecheol Yang wrote: > Add some of these features for avr gpio: > > =C3=82 - GPIO I/O : PORTx registers > =C3=82 - Data Direction : DDRx registers > > Following things are not supported yet: > =C3=82 - PINx registers > =C3=82 - MCUR registers > =C3=82 - Even though read/write for DDRx registers are > =C3=82 =C3=82 =C3=82 implemented, actual direction controls are not > =C3=82 =C3=82 =C3=82 supported yet. Thanks for your patch, however its encoding seems completely broken, and I can not test it. Similar problem occurred to the patchew automatic script: https://patchew.org/QEMU/DM6PR16MB24737F911BD260F1FA8EBC37E6310@DM6PR16MB24= 73.namprd16.prod.outlook.com/ This might be useful: https://wiki.qemu.org/Contribute/SubmitAPatch#Use_git_format-patch Anyway I'll try to review what I can follow. > > Signed-off-by: Heecheol Yang > --- > =C3=82 hw/avr/Kconfig=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 |=C3=82 =C3=82 1 + > =C3=82 hw/avr/atmega.c=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 =C3=82 =C3=82 |=C3=82 =C3=82 7 ++- > =C3=82 hw/avr/atmega.h=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 =C3=82 =C3=82 |=C3=82 =C3=82 2 + > =C3=82 hw/gpio/Kconfig=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 =C3=82 =C3=82 |=C3=82 =C3=82 3 + > =C3=82 hw/gpio/avr_gpio.c=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3= =82 =C3=82 | 117 +++++++++++++++++++++++++++++++++++++ > =C3=82 hw/gpio/meson.build=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3= =82 |=C3=82 =C3=82 2 + > =C3=82 include/hw/gpio/avr_gpio.h |=C3=82 48 +++++++++++++++ > =C3=82 7 files changed, 178 insertions(+), 2 deletions(-) > =C3=82 create mode 100644 hw/gpio/avr_gpio.c > =C3=82 create mode 100644 include/hw/gpio/avr_gpio.h > > diff --git a/hw/avr/Kconfig b/hw/avr/Kconfig > index d31298c3cc..16a57ced11 100644 > --- a/hw/avr/Kconfig > +++ b/hw/avr/Kconfig > @@ -3,6 +3,7 @@ config AVR_ATMEGA_MCU > =C3=82 =C3=82 =C3=82 =C3=82 select AVR_TIMER16 > =C3=82 =C3=82 =C3=82 =C3=82 select AVR_USART > =C3=82 =C3=82 =C3=82 =C3=82 select AVR_POWER > +=C3=82 =C3=82 =C3=82 select AVR_GPIO > > =C3=82 config ARDUINO > =C3=82 =C3=82 =C3=82 =C3=82 select AVR_ATMEGA_MCU > diff --git a/hw/avr/atmega.c b/hw/avr/atmega.c > index 44c6afebbb..ad942028fd 100644 > --- a/hw/avr/atmega.c > +++ b/hw/avr/atmega.c > @@ -283,8 +283,11 @@ static void atmega_realize(DeviceState *dev, Error > **errp) > =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 continue; > =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 } > =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 devname =3D g_s= trdup_printf("atmega-gpio-%c", 'a' + (char)i); > -=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 create_unimplemented_d= evice(devname, > -=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3= =82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 =C3=82 =C3=82 OFFSET_DATA + mc->dev[idx].addr, 3); > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 object_initialize_chil= d(OBJECT(dev), devname, &s->gpio[i], > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3= =82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 TYPE_AVR_GPIO); > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 sysbus_realize(SYS_BUS= _DEVICE(&s->gpio[i]), &error_abort); > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 sysbus_mmio_map(SYS_BU= S_DEVICE(&s->gpio[i]), 0, > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 OFFSET_DATA + mc->dev[idx].addr); > =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 g_free(devname); > =C3=82 =C3=82 =C3=82 =C3=82 } > > diff --git a/hw/avr/atmega.h b/hw/avr/atmega.h > index a99ee15c7e..e2289d5744 100644 > --- a/hw/avr/atmega.h > +++ b/hw/avr/atmega.h > @@ -13,6 +13,7 @@ > > =C3=82 #include "hw/char/avr_usart.h" > =C3=82 #include "hw/timer/avr_timer16.h" > +#include "hw/gpio/avr_gpio.h" > =C3=82 #include "hw/misc/avr_power.h" > =C3=82 #include "target/avr/cpu.h" > =C3=82 #include "qom/object.h" > @@ -44,6 +45,7 @@ struct AtmegaMcuState { > =C3=82 =C3=82 =C3=82 =C3=82 DeviceState *io; > =C3=82 =C3=82 =C3=82 =C3=82 AVRMaskState pwr[POWER_MAX]; > =C3=82 =C3=82 =C3=82 =C3=82 AVRUsartState usart[USART_MAX]; > +=C3=82 =C3=82 =C3=82 AVRGPIOState gpio[GPIO_MAX]; > =C3=82 =C3=82 =C3=82 =C3=82 AVRTimer16State timer[TIMER_MAX]; > =C3=82 =C3=82 =C3=82 =C3=82 uint64_t xtal_freq_hz; > =C3=82 }; > diff --git a/hw/gpio/Kconfig b/hw/gpio/Kconfig > index b6fdaa2586..1752d0ce56 100644 > --- a/hw/gpio/Kconfig > +++ b/hw/gpio/Kconfig > @@ -10,3 +10,6 @@ config GPIO_KEY > > =C3=82 config SIFIVE_GPIO > =C3=82 =C3=82 =C3=82 =C3=82 bool > + > +config AVR_GPIO > +=C3=82 =C3=82 =C3=82 bool > diff --git a/hw/gpio/avr_gpio.c b/hw/gpio/avr_gpio.c > new file mode 100644 > index 0000000000..7114216847 > --- /dev/null > +++ b/hw/gpio/avr_gpio.c > @@ -0,0 +1,117 @@ > +/* > + * AVR processors GPIO registers emulation. > + * > + * Copyright (C) 2020 Heecheol Yang > + * > + * 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 or > + * (at your option) version 3 of the License. > + * > + * 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, see . > + */ > +#include "qemu/osdep.h" > +#include "qemu/log.h" > +#include "qemu/module.h" > +#include "qemu/timer.h" "qemu/timer.h" not needed. > +#include "qapi/error.h" > +#include "hw/sysbus.h" > +#include "hw/irq.h" > +#include "hw/gpio/avr_gpio.h" > +#include "hw/qdev-properties.h" > +#include "chardev/char-fe.h" "chardev/char-fe.h" not needed. > + > +static void avr_gpio_reset(DeviceState *dev) > +{ > +=C3=82 =C3=82 =C3=82 AVRGPIOState *gpio =3D AVR_GPIO(dev); > +=C3=82 =C3=82 =C3=82 gpio->ddr_val =3D 0u; > +=C3=82 =C3=82 =C3=82 gpio->port_val =3D 0u; > +} > +static uint64_t avr_gpio_read(void *opaque, hwaddr offset, unsigned int > size) > +{ > +=C3=82 =C3=82 =C3=82 AVRGPIOState *s =3D (AVRGPIOState *)opaque; > +=C3=82 =C3=82 =C3=82 switch (offset) { > +=C3=82 =C3=82 =C3=82 case GPIO_PIN: > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 /* Not implemented yet= */ Please use: qemu_log_mask(LOG_UNIMP, ... > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 break; > +=C3=82 =C3=82 =C3=82 case GPIO_DDR: > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 return s->ddr_val; > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 break; > +=C3=82 =C3=82 =C3=82 case GPIO_PORT: > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 return s->port_val; > +=C3=82 =C3=82 =C3=82 default: > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 qemu_log_mask(LOG_GUES= T_ERROR, "%s: Bad offset %lx\n", > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 __func__, offset); > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 break; This can not happen, so I'd simply use: g_assert_not_reached(); > +=C3=82 =C3=82 =C3=82 } > +=C3=82 =C3=82 =C3=82 return 0; > +} > + > +static void avr_gpio_write(void *opaque, hwaddr offset, uint64_t value, > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3= =82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 unsigned int size) > +{ > +=C3=82 =C3=82 =C3=82 AVRGPIOState *s =3D (AVRGPIOState *)opaque; > +=C3=82 =C3=82 =C3=82 switch (offset) { > +=C3=82 =C3=82 =C3=82 case GPIO_PIN: > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 /* Not implemented yet= */ > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 break; > +=C3=82 =C3=82 =C3=82 case GPIO_DDR: > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 s->ddr_val =3D value &= 0xF; > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 break; > +=C3=82 =C3=82 =C3=82 case GPIO_PORT: > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 s->port_val =3D value = & 0xF; > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 break; > +=C3=82 =C3=82 =C3=82 default: > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 qemu_log_mask(LOG_GUES= T_ERROR, "%s: Bad offset %lx\n", > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 __func__, offset); > +=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 break; > +=C3=82 =C3=82 =C3=82 } Similar comments than avr_gpio_read(). > +} > + > +static const MemoryRegionOps avr_gpio_ops =3D { > +=C3=82 =C3=82 =C3=82 .read =3D avr_gpio_read, > +=C3=82 =C3=82 =C3=82 .write =3D avr_gpio_write, > +=C3=82 =C3=82 =C3=82 .endianness =3D DEVICE_NATIVE_ENDIAN, > +}; > + > +static void avr_gpio_init(Object *obj) > +{ > +=C3=82 =C3=82 =C3=82 AVRGPIOState *s =3D AVR_GPIO(obj); > +=C3=82 =C3=82 =C3=82 memory_region_init_io(&s->mmio, obj, &avr_gpio_ops= , s, > TYPE_AVR_GPIO, 3); > +=C3=82 =C3=82 =C3=82 sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); > +=C3=82 =C3=82 =C3=82 s->enabled =3D true; > +} > +static void avr_gpio_realize(DeviceState *dev, Error **errp) > +{ > +=C3=82 =C3=82 =C3=82 avr_gpio_reset(dev); > +} > + > + > +static void avr_gpio_class_init(ObjectClass *klass, void *data) > +{ > +=C3=82 =C3=82 =C3=82 DeviceClass *dc =3D DEVICE_CLASS(klass); > + > +=C3=82 =C3=82 =C3=82 dc->reset =3D avr_gpio_reset; > +=C3=82 =C3=82 =C3=82 dc->realize =3D avr_gpio_realize; > +} > + > +static const TypeInfo avr_gpio_info =3D { > +=C3=82 =C3=82 =C3=82 .name=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3= =82 =C3=82 =C3=82 =3D TYPE_AVR_GPIO, > +=C3=82 =C3=82 =C3=82 .parent=C3=82 =C3=82 =C3=82 =C3=82 =C3=82 =C3=82 = =C3=82 =3D TYPE_SYS_BUS_DEVICE, > +=C3=82 =C3=82 =C3=82 .instance_size =3D sizeof(AVRGPIOState), > +=C3=82 =C3=82 =C3=82 .instance_init =3D avr_gpio_init, > +=C3=82 =C3=82 =C3=82 .class_init=C3=82 =C3=82 =C3=82 =3D avr_gpio_clas= s_init, > +}; > + > +static void avr_gpio_register_types(void) > +{ > +=C3=82 =C3=82 =C3=82 type_register_static(&avr_gpio_info); > +} > + > +type_init(avr_gpio_register_types) > diff --git a/hw/gpio/meson.build b/hw/gpio/meson.build > index 86cae9a0f3..258bd5dcfc 100644 > --- a/hw/gpio/meson.build > +++ b/hw/gpio/meson.build > @@ -11,3 +11,5 @@ softmmu_ss.add(when: 'CONFIG_OMAP', if_true: > files('omap_gpio.c')) > =C3=82 softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_gpio= .c')) > =C3=82 softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_gpio.c')) > =C3=82 softmmu_ss.add(when: 'CONFIG_SIFIVE_GPIO', if_true: > files('sifive_gpio.c')) > + > +softmmu_ss.add(when: 'CONFIG_AVR_GPIO', if_true: files('avr_gpio.c')) > diff --git a/include/hw/gpio/avr_gpio.h b/include/hw/gpio/avr_gpio.h > new file mode 100644 > index 0000000000..45d42753c8 > --- /dev/null > +++ b/include/hw/gpio/avr_gpio.h > @@ -0,0 +1,48 @@ > +/* > + * AVR processors GPIO registers definition. > + * > + * Copyright (C) 2020 Heecheol Yang > + * > + * 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 or > + * (at your option) version 3 of the License. > + * > + * 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, see . > + */ > + > +#ifndef AVR_GPIO_H > +#define AVR_GPIO_H > + > +#include "hw/sysbus.h" > +#include "qom/object.h" > +#include "chardev/char-fe.h" "chardev/char-fe.h" not needed. > + > +/* Offsets of registers. */ > +#define GPIO_PIN=C3=82 =C3=82 0x00 > +#define GPIO_DDR=C3=82 =C3=82 0x01 > +#define GPIO_PORT=C3=82 0x02 > + > +#define TYPE_AVR_GPIO "avr-gpio" > +OBJECT_DECLARE_SIMPLE_TYPE(AVRGPIOState, AVR_GPIO) > + > +struct AVRGPIOState { > +=C3=82 =C3=82 =C3=82 /*< private >*/ > +=C3=82 =C3=82 =C3=82 SysBusDevice parent_obj; > + > +=C3=82 =C3=82 =C3=82 /*< public >*/ > +=C3=82 =C3=82 =C3=82 MemoryRegion mmio; > + > +=C3=82 =C3=82 =C3=82 uint8_t ddr_val; > +=C3=82 =C3=82 =C3=82 uint8_t port_val; > +=C3=82 =C3=82 =C3=82 bool enabled; What is 'enabled' for? > + > +}; > + > +#endif /* AVR_GPIO_H */ > -- > 2.17.1 Regards, Phil. --_000_DM6PR16MB247387BA8035F7591182CA51E60E0DM6PR16MB2473namp_ Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0i dGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgc3R5bGU9 ImRpc3BsYXk6bm9uZTsiPiBQIHttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowO30gPC9zdHls ZT4NCjwvaGVhZD4NCjxib2R5IGRpcj0ibHRyIj4NCjxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OiBH dWxpbSwg6rW066a8LCAmcXVvdDtOYW51bSBHb3RoaWMmcXVvdDssIHNhbnMtc2VyaWY7IGZvbnQt c2l6ZTogMTJwdDsgY29sb3I6IHJnYigwLCAwLCAwKTsiPg0KSGVsbG8sIFRoYW5rIHlvdSB2ZXJ5 IG11Y2ggZm9yIHlvdXIgcHJvbXB0IGFuZCBraW5kIHJldmlldy48L2Rpdj4NCjxkaXYgc3R5bGU9 ImZvbnQtZmFtaWx5OiBHdWxpbSwg6rW066a8LCAmcXVvdDtOYW51bSBHb3RoaWMmcXVvdDssIHNh bnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgY29sb3I6IHJnYigwLCAwLCAwKTsiPg0KVGhpcyBp cyBteSBuZXh0IHZlcnNpb24gb2YgdGhlIHBhdGNoLiBIZXJlIGFyZSB3aGF0IEkgY2hhbmdlZCBm cm9tIHRoZSBwcmV2aW91cyBvbmU6PC9kaXY+DQo8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogR3Vs aW0sIOq1tOumvCwgJnF1b3Q7TmFudW0gR290aGljJnF1b3Q7LCBzYW5zLXNlcmlmOyBmb250LXNp emU6IDEycHQ7IGNvbG9yOiByZ2IoMCwgMCwgMCk7Ij4NCjxicj4NCjwvZGl2Pg0KPGRpdiBzdHls ZT0iZm9udC1mYW1pbHk6IEd1bGltLCDqtbTrprwsICZxdW90O05hbnVtIEdvdGhpYyZxdW90Oywg c2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBjb2xvcjogcmdiKDAsIDAsIDApOyI+DQo8dWw+ DQo8bGk+UmVtb3ZlIHVubmVjZXNzYXJ5IGhlYWRlciBpbmNsdXNpb25zPC9saT48bGk+UmVwbGFj ZSBjb2RlcyBmb3IgdW5yZWFjaGFibGUgY29uZGl0aW9ucyB3aXRoIGdfYXNzZXJ0X25vdF9yZWFj aGVkKCkgZnVuY3Rpb248L2xpPjxsaT5SZW1vdmUgJ2VuYWJsZScgZmllbGQgZnJvbSBBVlJHUElP U3RhdGUgc3RydWN0dXJlOiBJdCBpcyBhY3R1YWxseSB1bm5lY2Vzc2FyeS4gSSBjb3BpZWQgdGhp cyBmaWVsZCBmcm9tIEFWUlVTQVJUU3RhdGUgc3RydWN0dXJlLjwvbGk+PC91bD4NCjxkaXY+PGJy Pg0KPC9kaXY+DQo8ZGl2PkkgYW0gYWZyYWlkIHRoYXQgdGhlcmUgaXMgYW4gZW5jb2RpbmcgaXNz dWUgZXZlbiB0aG91Z2ggSSB0cmllZCB0byBkbyBpdCBjb3JyZWN0bHkuJm5ic3A7PC9kaXY+DQo8 ZGl2PlNvcnJ5IGluIGFkdmFuY2UgZm9yIHRoaXMgaXNzdWUgYWdhaW4uPC9kaXY+DQo8ZGl2Pjxi cj4NCjwvZGl2Pg0KPGRpdj5XaXRoIGJlc3QgcmVnYXJkcyZuYnNwOzwvZGl2Pg0KPGRpdj5IZWVj aGVvbCBZYW5nLjwvZGl2Pg0KPGRpdj48YnI+DQo8L2Rpdj4NCjxkaXY+ZGlmZiAtLWdpdCBhL2h3 L2F2ci9LY29uZmlnIGIvaHcvYXZyL0tjb25maWcNCjxkaXY+aW5kZXggZDMxMjk4YzNjYy4uMTZh NTdjZWQxMSAxMDA2NDQ8L2Rpdj4NCjxkaXY+LS0tIGEvaHcvYXZyL0tjb25maWc8L2Rpdj4NCjxk aXY+KysrIGIvaHcvYXZyL0tjb25maWc8L2Rpdj4NCjxkaXY+QEAgLTMsNiArMyw3IEBAIGNvbmZp ZyBBVlJfQVRNRUdBX01DVTwvZGl2Pg0KPGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwO3NlbGVjdCBB VlJfVElNRVIxNjwvZGl2Pg0KPGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwO3NlbGVjdCBBVlJfVVNB UlQ8L2Rpdj4NCjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDtzZWxlY3QgQVZSX1BPV0VSPC9kaXY+ DQo8ZGl2PisgJm5ic3A7ICZuYnNwO3NlbGVjdCBBVlJfR1BJTzwvZGl2Pg0KPGRpdj4mbmJzcDs8 L2Rpdj4NCjxkaXY+Jm5ic3A7Y29uZmlnIEFSRFVJTk88L2Rpdj4NCjxkaXY+Jm5ic3A7ICZuYnNw OyAmbmJzcDtzZWxlY3QgQVZSX0FUTUVHQV9NQ1U8L2Rpdj4NCjxkaXY+ZGlmZiAtLWdpdCBhL2h3 L2F2ci9hdG1lZ2EuYyBiL2h3L2F2ci9hdG1lZ2EuYzwvZGl2Pg0KPGRpdj5pbmRleCA0NGM2YWZl YmJiLi5hZDk0MjAyOGZkIDEwMDY0NDwvZGl2Pg0KPGRpdj4tLS0gYS9ody9hdnIvYXRtZWdhLmM8 L2Rpdj4NCjxkaXY+KysrIGIvaHcvYXZyL2F0bWVnYS5jPC9kaXY+DQo8ZGl2PkBAIC0yODMsOCAr MjgzLDExIEBAIHN0YXRpYyB2b2lkIGF0bWVnYV9yZWFsaXplKERldmljZVN0YXRlICpkZXYsIEVy cm9yICoqZXJycCk8L2Rpdj4NCjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7Y29udGludWU7PC9kaXY+DQo8ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwOyAmbmJzcDt9PC9kaXY+DQo8ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm bmJzcDtkZXZuYW1lID0gZ19zdHJkdXBfcHJpbnRmKCZxdW90O2F0bWVnYS1ncGlvLSVjJnF1b3Q7 LCAnYScgKyAoY2hhcilpKTs8L2Rpdj4NCjxkaXY+LSAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDtjcmVhdGVfdW5pbXBsZW1lbnRlZF9kZXZpY2UoZGV2bmFtZSw8L2Rpdj4NCjxkaXY+LSAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 ICZuYnNwO09GRlNFVF9EQVRBICsgbWMtJmd0O2RldltpZHhdLmFkZHIsIDMpOzwvZGl2Pg0KPGRp dj4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO29iamVjdF9pbml0aWFsaXplX2NoaWxkKE9C SkVDVChkZXYpLCBkZXZuYW1lLCAmYW1wO3MtJmd0O2dwaW9baV0sPC9kaXY+DQo8ZGl2PisgJm5i c3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJz cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7VFlQRV9B VlJfR1BJTyk7PC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7c3lzYnVz X3JlYWxpemUoU1lTX0JVU19ERVZJQ0UoJmFtcDtzLSZndDtncGlvW2ldKSwgJmFtcDtlcnJvcl9h Ym9ydCk7PC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7c3lzYnVzX21t aW9fbWFwKFNZU19CVVNfREVWSUNFKCZhbXA7cy0mZ3Q7Z3Bpb1tpXSksIDAsPC9kaXY+DQo8ZGl2 PisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtPRkZTRVRfREFUQSAr IG1jLSZndDtkZXZbaWR4XS5hZGRyKTs8L2Rpdj4NCjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwO2dfZnJlZShkZXZuYW1lKTs8L2Rpdj4NCjxkaXY+Jm5ic3A7ICZuYnNwOyAm bmJzcDt9PC9kaXY+DQo8ZGl2PiZuYnNwOzwvZGl2Pg0KPGRpdj5kaWZmIC0tZ2l0IGEvaHcvYXZy L2F0bWVnYS5oIGIvaHcvYXZyL2F0bWVnYS5oPC9kaXY+DQo8ZGl2PmluZGV4IGE5OWVlMTVjN2Uu LmUyMjg5ZDU3NDQgMTAwNjQ0PC9kaXY+DQo8ZGl2Pi0tLSBhL2h3L2F2ci9hdG1lZ2EuaDwvZGl2 Pg0KPGRpdj4rKysgYi9ody9hdnIvYXRtZWdhLmg8L2Rpdj4NCjxkaXY+QEAgLTEzLDYgKzEzLDcg QEA8L2Rpdj4NCjxkaXY+Jm5ic3A7PC9kaXY+DQo8ZGl2PiZuYnNwOyNpbmNsdWRlICZxdW90O2h3 L2NoYXIvYXZyX3VzYXJ0LmgmcXVvdDs8L2Rpdj4NCjxkaXY+Jm5ic3A7I2luY2x1ZGUgJnF1b3Q7 aHcvdGltZXIvYXZyX3RpbWVyMTYuaCZxdW90OzwvZGl2Pg0KPGRpdj4rI2luY2x1ZGUgJnF1b3Q7 aHcvZ3Bpby9hdnJfZ3Bpby5oJnF1b3Q7PC9kaXY+DQo8ZGl2PiZuYnNwOyNpbmNsdWRlICZxdW90 O2h3L21pc2MvYXZyX3Bvd2VyLmgmcXVvdDs8L2Rpdj4NCjxkaXY+Jm5ic3A7I2luY2x1ZGUgJnF1 b3Q7dGFyZ2V0L2F2ci9jcHUuaCZxdW90OzwvZGl2Pg0KPGRpdj4mbmJzcDsjaW5jbHVkZSAmcXVv dDtxb20vb2JqZWN0LmgmcXVvdDs8L2Rpdj4NCjxkaXY+QEAgLTQ0LDYgKzQ1LDcgQEAgc3RydWN0 IEF0bWVnYU1jdVN0YXRlIHs8L2Rpdj4NCjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDtEZXZpY2VT dGF0ZSAqaW87PC9kaXY+DQo8ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7QVZSTWFza1N0YXRlIHB3 cltQT1dFUl9NQVhdOzwvZGl2Pg0KPGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwO0FWUlVzYXJ0U3Rh dGUgdXNhcnRbVVNBUlRfTUFYXTs8L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7QVZSR1BJT1N0 YXRlIGdwaW9bR1BJT19NQVhdOzwvZGl2Pg0KPGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwO0FWUlRp bWVyMTZTdGF0ZSB0aW1lcltUSU1FUl9NQVhdOzwvZGl2Pg0KPGRpdj4mbmJzcDsgJm5ic3A7ICZu YnNwO3VpbnQ2NF90IHh0YWxfZnJlcV9oejs8L2Rpdj4NCjxkaXY+Jm5ic3A7fTs8L2Rpdj4NCjxk aXY+ZGlmZiAtLWdpdCBhL2h3L2dwaW8vS2NvbmZpZyBiL2h3L2dwaW8vS2NvbmZpZzwvZGl2Pg0K PGRpdj5pbmRleCBiNmZkYWEyNTg2Li4xNzUyZDBjZTU2IDEwMDY0NDwvZGl2Pg0KPGRpdj4tLS0g YS9ody9ncGlvL0tjb25maWc8L2Rpdj4NCjxkaXY+KysrIGIvaHcvZ3Bpby9LY29uZmlnPC9kaXY+ DQo8ZGl2PkBAIC0xMCwzICsxMCw2IEBAIGNvbmZpZyBHUElPX0tFWTwvZGl2Pg0KPGRpdj4mbmJz cDs8L2Rpdj4NCjxkaXY+Jm5ic3A7Y29uZmlnIFNJRklWRV9HUElPPC9kaXY+DQo8ZGl2PiZuYnNw OyAmbmJzcDsgJm5ic3A7Ym9vbDwvZGl2Pg0KPGRpdj4rPC9kaXY+DQo8ZGl2Pitjb25maWcgQVZS X0dQSU88L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7Ym9vbDwvZGl2Pg0KPGRpdj5kaWZmIC0t Z2l0IGEvaHcvZ3Bpby9hdnJfZ3Bpby5jIGIvaHcvZ3Bpby9hdnJfZ3Bpby5jPC9kaXY+DQo8ZGl2 Pm5ldyBmaWxlIG1vZGUgMTAwNjQ0PC9kaXY+DQo8ZGl2PmluZGV4IDAwMDAwMDAwMDAuLjZjYThl ODcwM2E8L2Rpdj4NCjxkaXY+LS0tIC9kZXYvbnVsbDwvZGl2Pg0KPGRpdj4rKysgYi9ody9ncGlv L2F2cl9ncGlvLmM8L2Rpdj4NCjxkaXY+QEAgLTAsMCArMSwxMTIgQEA8L2Rpdj4NCjxkaXY+Ky8q PC9kaXY+DQo8ZGl2PisgKiBBVlIgcHJvY2Vzc29ycyBHUElPIHJlZ2lzdGVycyBlbXVsYXRpb24u PC9kaXY+DQo8ZGl2PisgKjwvZGl2Pg0KPGRpdj4rICogQ29weXJpZ2h0IChDKSAyMDIwIEhlZWNo ZW9sIFlhbmcgJmx0O2hlZWNoZW9sLnlhbmdAb3V0bG9vay5jb20mZ3Q7PC9kaXY+DQo8ZGl2Pisg KjwvZGl2Pg0KPGRpdj4rICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vcjwvZGl2Pg0KPGRpdj4rICogbW9kaWZ5IGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXM8L2Rpdj4NCjxkaXY+ KyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy c2lvbiAyIG9yPC9kaXY+DQo8ZGl2PisgKiAoYXQgeW91ciBvcHRpb24pIHZlcnNpb24gMyBvZiB0 aGUgTGljZW5zZS48L2Rpdj4NCjxkaXY+KyAqPC9kaXY+DQo8ZGl2PisgKiBUaGlzIHByb2dyYW0g aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCw8L2Rpdj4N CjxkaXY+KyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mPC9kaXY+DQo8ZGl2PisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICZuYnNwO1NlZSB0aGU8L2Rpdj4NCjxkaXY+KyAq IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuPC9kaXY+DQo8ZGl2 PisgKjwvZGl2Pg0KPGRpdj4rICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmc8L2Rpdj4NCjxkaXY+KyAqIHdpdGgg dGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSAmbHQ7aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2Vz LyZndDsuPC9kaXY+DQo8ZGl2PisgKi88L2Rpdj4NCjxkaXY+KyNpbmNsdWRlICZxdW90O3FlbXUv b3NkZXAuaCZxdW90OzwvZGl2Pg0KPGRpdj4rI2luY2x1ZGUgJnF1b3Q7cWVtdS9sb2cuaCZxdW90 OzwvZGl2Pg0KPGRpdj4rI2luY2x1ZGUgJnF1b3Q7cWVtdS9tb2R1bGUuaCZxdW90OzwvZGl2Pg0K PGRpdj4rI2luY2x1ZGUgJnF1b3Q7cWFwaS9lcnJvci5oJnF1b3Q7PC9kaXY+DQo8ZGl2PisjaW5j bHVkZSAmcXVvdDtody9zeXNidXMuaCZxdW90OzwvZGl2Pg0KPGRpdj4rI2luY2x1ZGUgJnF1b3Q7 aHcvaXJxLmgmcXVvdDs8L2Rpdj4NCjxkaXY+KyNpbmNsdWRlICZxdW90O2h3L2dwaW8vYXZyX2dw aW8uaCZxdW90OzwvZGl2Pg0KPGRpdj4rI2luY2x1ZGUgJnF1b3Q7aHcvcWRldi1wcm9wZXJ0aWVz LmgmcXVvdDs8L2Rpdj4NCjxkaXY+KzwvZGl2Pg0KPGRpdj4rc3RhdGljIHZvaWQgYXZyX2dwaW9f cmVzZXQoRGV2aWNlU3RhdGUgKmRldik8L2Rpdj4NCjxkaXY+K3s8L2Rpdj4NCjxkaXY+KyAmbmJz cDsgJm5ic3A7QVZSR1BJT1N0YXRlICpncGlvID0gQVZSX0dQSU8oZGV2KTs8L2Rpdj4NCjxkaXY+ KyAmbmJzcDsgJm5ic3A7Z3Bpby0mZ3Q7ZGRyX3ZhbCA9IDB1OzwvZGl2Pg0KPGRpdj4rICZuYnNw OyAmbmJzcDtncGlvLSZndDtwb3J0X3ZhbCA9IDB1OzwvZGl2Pg0KPGRpdj4rfTwvZGl2Pg0KPGRp dj4rc3RhdGljIHVpbnQ2NF90IGF2cl9ncGlvX3JlYWQodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zm c2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSk8L2Rpdj4NCjxkaXY+K3s8L2Rpdj4NCjxkaXY+KyAmbmJz cDsgJm5ic3A7QVZSR1BJT1N0YXRlICpzID0gKEFWUkdQSU9TdGF0ZSAqKW9wYXF1ZTs8L2Rpdj4N CjxkaXY+KyAmbmJzcDsgJm5ic3A7c3dpdGNoIChvZmZzZXQpIHs8L2Rpdj4NCjxkaXY+KyAmbmJz cDsgJm5ic3A7Y2FzZSBHUElPX1BJTjo8L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7ICZuYnNw OyAmbmJzcDsvKiBOb3QgaW1wbGVtZW50ZWQgeWV0ICovPC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZu YnNwOyAmbmJzcDsgJm5ic3A7YnJlYWs7PC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZuYnNwO2Nhc2Ug R1BJT19ERFI6PC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7cmV0dXJu IHMtJmd0O2Rkcl92YWw7PC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 YnJlYWs7PC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZuYnNwO2Nhc2UgR1BJT19QT1JUOjwvZGl2Pg0K PGRpdj4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO3JldHVybiBzLSZndDtwb3J0X3ZhbDs8 L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7ZGVmYXVsdDo8L2Rpdj4NCjxkaXY+KyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDtnX2Fzc2VydF9ub3RfcmVhY2hlZCgpOzwvZGl2Pg0KPGRpdj4r ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO2JyZWFrOzwvZGl2Pg0KPGRpdj4rICZuYnNwOyAm bmJzcDt9PC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZuYnNwO3JldHVybiAwOzwvZGl2Pg0KPGRpdj4r fTwvZGl2Pg0KPGRpdj4rPC9kaXY+DQo8ZGl2PitzdGF0aWMgdm9pZCBhdnJfZ3Bpb193cml0ZSh2 b2lkICpvcGFxdWUsIGh3YWRkciBvZmZzZXQsIHVpbnQ2NF90IHZhbHVlLDwvZGl2Pg0KPGRpdj4r ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsg Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO3Vu c2lnbmVkIGludCBzaXplKTwvZGl2Pg0KPGRpdj4rezwvZGl2Pg0KPGRpdj4rICZuYnNwOyAmbmJz cDtBVlJHUElPU3RhdGUgKnMgPSAoQVZSR1BJT1N0YXRlICopb3BhcXVlOzwvZGl2Pg0KPGRpdj4r ICZuYnNwOyAmbmJzcDtzd2l0Y2ggKG9mZnNldCkgezwvZGl2Pg0KPGRpdj4rICZuYnNwOyAmbmJz cDtjYXNlIEdQSU9fUElOOjwvZGl2Pg0KPGRpdj4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw Oy8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi88L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7ICZu YnNwOyAmbmJzcDticmVhazs8L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7Y2FzZSBHUElPX0RE Ujo8L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtzLSZndDtkZHJfdmFs ID0gdmFsdWUgJmFtcDsgMHhGOzwvZGl2Pg0KPGRpdj4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu YnNwO2JyZWFrOzwvZGl2Pg0KPGRpdj4rICZuYnNwOyAmbmJzcDtjYXNlIEdQSU9fUE9SVDo8L2Rp dj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtzLSZndDtwb3J0X3ZhbCA9IHZh bHVlICZhbXA7IDB4Rjs8L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDti cmVhazs8L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7ZGVmYXVsdDo8L2Rpdj4NCjxkaXY+KyAm bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDtnX2Fzc2VydF9ub3RfcmVhY2hlZCgpOzwvZGl2Pg0K PGRpdj4rICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwO2JyZWFrOzwvZGl2Pg0KPGRpdj4rICZu YnNwOyAmbmJzcDt9PC9kaXY+DQo8ZGl2Pit9PC9kaXY+DQo8ZGl2Pis8L2Rpdj4NCjxkaXY+K3N0 YXRpYyBjb25zdCBNZW1vcnlSZWdpb25PcHMgYXZyX2dwaW9fb3BzID0gezwvZGl2Pg0KPGRpdj4r ICZuYnNwOyAmbmJzcDsucmVhZCA9IGF2cl9ncGlvX3JlYWQsPC9kaXY+DQo8ZGl2PisgJm5ic3A7 ICZuYnNwOy53cml0ZSA9IGF2cl9ncGlvX3dyaXRlLDwvZGl2Pg0KPGRpdj4rICZuYnNwOyAmbmJz cDsuZW5kaWFubmVzcyA9IERFVklDRV9OQVRJVkVfRU5ESUFOLDwvZGl2Pg0KPGRpdj4rfTs8L2Rp dj4NCjxkaXY+KzwvZGl2Pg0KPGRpdj4rc3RhdGljIHZvaWQgYXZyX2dwaW9faW5pdChPYmplY3Qg Km9iaik8L2Rpdj4NCjxkaXY+K3s8L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7QVZSR1BJT1N0 YXRlICpzID0gQVZSX0dQSU8ob2JqKTs8L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7bWVtb3J5 X3JlZ2lvbl9pbml0X2lvKCZhbXA7cy0mZ3Q7bW1pbywgb2JqLCAmYW1wO2F2cl9ncGlvX29wcywg cywgVFlQRV9BVlJfR1BJTywgMyk7PC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZuYnNwO3N5c2J1c19p bml0X21taW8oU1lTX0JVU19ERVZJQ0Uob2JqKSwgJmFtcDtzLSZndDttbWlvKTs8L2Rpdj4NCjxk aXY+K308L2Rpdj4NCjxkaXY+K3N0YXRpYyB2b2lkIGF2cl9ncGlvX3JlYWxpemUoRGV2aWNlU3Rh dGUgKmRldiwgRXJyb3IgKiplcnJwKTwvZGl2Pg0KPGRpdj4rezwvZGl2Pg0KPGRpdj4rICZuYnNw OyAmbmJzcDthdnJfZ3Bpb19yZXNldChkZXYpOzwvZGl2Pg0KPGRpdj4rfTwvZGl2Pg0KPGRpdj4r PC9kaXY+DQo8ZGl2Pis8L2Rpdj4NCjxkaXY+K3N0YXRpYyB2b2lkIGF2cl9ncGlvX2NsYXNzX2lu aXQoT2JqZWN0Q2xhc3MgKmtsYXNzLCB2b2lkICpkYXRhKTwvZGl2Pg0KPGRpdj4rezwvZGl2Pg0K PGRpdj4rICZuYnNwOyAmbmJzcDtEZXZpY2VDbGFzcyAqZGMgPSBERVZJQ0VfQ0xBU1Moa2xhc3Mp OzwvZGl2Pg0KPGRpdj4rPC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZuYnNwO2RjLSZndDtyZXNldCA9 IGF2cl9ncGlvX3Jlc2V0OzwvZGl2Pg0KPGRpdj4rICZuYnNwOyAmbmJzcDtkYy0mZ3Q7cmVhbGl6 ZSA9IGF2cl9ncGlvX3JlYWxpemU7PC9kaXY+DQo8ZGl2Pit9PC9kaXY+DQo8ZGl2Pis8L2Rpdj4N CjxkaXY+K3N0YXRpYyBjb25zdCBUeXBlSW5mbyBhdnJfZ3Bpb19pbmZvID0gezwvZGl2Pg0KPGRp dj4rICZuYnNwOyAmbmJzcDsubmFtZSAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7 PSBUWVBFX0FWUl9HUElPLDwvZGl2Pg0KPGRpdj4rICZuYnNwOyAmbmJzcDsucGFyZW50ICZuYnNw OyAmbmJzcDsgJm5ic3A7ICZuYnNwOz0gVFlQRV9TWVNfQlVTX0RFVklDRSw8L2Rpdj4NCjxkaXY+ KyAmbmJzcDsgJm5ic3A7Lmluc3RhbmNlX3NpemUgPSBzaXplb2YoQVZSR1BJT1N0YXRlKSw8L2Rp dj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7Lmluc3RhbmNlX2luaXQgPSBhdnJfZ3Bpb19pbml0LDwv ZGl2Pg0KPGRpdj4rICZuYnNwOyAmbmJzcDsuY2xhc3NfaW5pdCAmbmJzcDsgJm5ic3A7PSBhdnJf Z3Bpb19jbGFzc19pbml0LDwvZGl2Pg0KPGRpdj4rfTs8L2Rpdj4NCjxkaXY+KzwvZGl2Pg0KPGRp dj4rc3RhdGljIHZvaWQgYXZyX2dwaW9fcmVnaXN0ZXJfdHlwZXModm9pZCk8L2Rpdj4NCjxkaXY+ K3s8L2Rpdj4NCjxkaXY+KyAmbmJzcDsgJm5ic3A7dHlwZV9yZWdpc3Rlcl9zdGF0aWMoJmFtcDth dnJfZ3Bpb19pbmZvKTs8L2Rpdj4NCjxkaXY+K308L2Rpdj4NCjxkaXY+KzwvZGl2Pg0KPGRpdj4r dHlwZV9pbml0KGF2cl9ncGlvX3JlZ2lzdGVyX3R5cGVzKTwvZGl2Pg0KPGRpdj5kaWZmIC0tZ2l0 IGEvaHcvZ3Bpby9tZXNvbi5idWlsZCBiL2h3L2dwaW8vbWVzb24uYnVpbGQ8L2Rpdj4NCjxkaXY+ aW5kZXggODZjYWU5YTBmMy4uMjU4YmQ1ZGNmYyAxMDA2NDQ8L2Rpdj4NCjxkaXY+LS0tIGEvaHcv Z3Bpby9tZXNvbi5idWlsZDwvZGl2Pg0KPGRpdj4rKysgYi9ody9ncGlvL21lc29uLmJ1aWxkPC9k aXY+DQo8ZGl2PkBAIC0xMSwzICsxMSw1IEBAIHNvZnRtbXVfc3MuYWRkKHdoZW46ICdDT05GSUdf T01BUCcsIGlmX3RydWU6IGZpbGVzKCdvbWFwX2dwaW8uYycpKTwvZGl2Pg0KPGRpdj4mbmJzcDtz b2Z0bW11X3NzLmFkZCh3aGVuOiAnQ09ORklHX1JBU1BJJywgaWZfdHJ1ZTogZmlsZXMoJ2JjbTI4 MzVfZ3Bpby5jJykpPC9kaXY+DQo8ZGl2PiZuYnNwO3NvZnRtbXVfc3MuYWRkKHdoZW46ICdDT05G SUdfQVNQRUVEX1NPQycsIGlmX3RydWU6IGZpbGVzKCdhc3BlZWRfZ3Bpby5jJykpPC9kaXY+DQo8 ZGl2PiZuYnNwO3NvZnRtbXVfc3MuYWRkKHdoZW46ICdDT05GSUdfU0lGSVZFX0dQSU8nLCBpZl90 cnVlOiBmaWxlcygnc2lmaXZlX2dwaW8uYycpKTwvZGl2Pg0KPGRpdj4rPC9kaXY+DQo8ZGl2Pitz b2Z0bW11X3NzLmFkZCh3aGVuOiAnQ09ORklHX0FWUl9HUElPJywgaWZfdHJ1ZTogZmlsZXMoJ2F2 cl9ncGlvLmMnKSk8L2Rpdj4NCjxkaXY+ZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHcvZ3Bpby9hdnJf Z3Bpby5oIGIvaW5jbHVkZS9ody9ncGlvL2F2cl9ncGlvLmg8L2Rpdj4NCjxkaXY+bmV3IGZpbGUg bW9kZSAxMDA2NDQ8L2Rpdj4NCjxkaXY+aW5kZXggMDAwMDAwMDAwMC4uODRkNzgzZjhmYzwvZGl2 Pg0KPGRpdj4tLS0gL2Rldi9udWxsPC9kaXY+DQo8ZGl2PisrKyBiL2luY2x1ZGUvaHcvZ3Bpby9h dnJfZ3Bpby5oPC9kaXY+DQo8ZGl2PkBAIC0wLDAgKzEsNDYgQEA8L2Rpdj4NCjxkaXY+Ky8qPC9k aXY+DQo8ZGl2PisgKiBBVlIgcHJvY2Vzc29ycyBHUElPIHJlZ2lzdGVycyBkZWZpbml0aW9uLjwv ZGl2Pg0KPGRpdj4rICo8L2Rpdj4NCjxkaXY+KyAqIENvcHlyaWdodCAoQykgMjAyMCBIZWVjaGVv bCBZYW5nICZsdDtoZWVjaGVvbC55YW5nQG91dGxvb2suY29tJmd0OzwvZGl2Pg0KPGRpdj4rICo8 L2Rpdj4NCjxkaXY+KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3I8L2Rpdj4NCjxkaXY+KyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzPC9kaXY+DQo8ZGl2Pisg KiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMiBvcjwvZGl2Pg0KPGRpdj4rICogKGF0IHlvdXIgb3B0aW9uKSB2ZXJzaW9uIDMgb2YgdGhl IExpY2Vuc2UuPC9kaXY+DQo8ZGl2PisgKjwvZGl2Pg0KPGRpdj4rICogVGhpcyBwcm9ncmFtIGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsPC9kaXY+DQo8 ZGl2PisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZjwvZGl2Pg0KPGRpdj4rICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAmbmJzcDtTZWUgdGhlPC9kaXY+DQo8ZGl2PisgKiBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLjwvZGl2Pg0KPGRpdj4r ICo8L2Rpdj4NCjxkaXY+KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nPC9kaXY+DQo8ZGl2PisgKiB3aXRoIHRo aXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgJmx0O2h0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8m Z3Q7LjwvZGl2Pg0KPGRpdj4rICovPC9kaXY+DQo8ZGl2Pis8L2Rpdj4NCjxkaXY+KyNpZm5kZWYg QVZSX0dQSU9fSDwvZGl2Pg0KPGRpdj4rI2RlZmluZSBBVlJfR1BJT19IPC9kaXY+DQo8ZGl2Pis8 L2Rpdj4NCjxkaXY+KyNpbmNsdWRlICZxdW90O2h3L3N5c2J1cy5oJnF1b3Q7PC9kaXY+DQo8ZGl2 PisjaW5jbHVkZSAmcXVvdDtxb20vb2JqZWN0LmgmcXVvdDs8L2Rpdj4NCjxkaXY+KzwvZGl2Pg0K PGRpdj4rLyogT2Zmc2V0cyBvZiByZWdpc3RlcnMuICovPC9kaXY+DQo8ZGl2PisjZGVmaW5lIEdQ SU9fUElOICZuYnNwOyAweDAwPC9kaXY+DQo8ZGl2PisjZGVmaW5lIEdQSU9fRERSICZuYnNwOyAw eDAxPC9kaXY+DQo8ZGl2PisjZGVmaW5lIEdQSU9fUE9SVCAmbmJzcDsweDAyPC9kaXY+DQo8ZGl2 Pis8L2Rpdj4NCjxkaXY+KyNkZWZpbmUgVFlQRV9BVlJfR1BJTyAmcXVvdDthdnItZ3BpbyZxdW90 OzwvZGl2Pg0KPGRpdj4rT0JKRUNUX0RFQ0xBUkVfU0lNUExFX1RZUEUoQVZSR1BJT1N0YXRlLCBB VlJfR1BJTyk8L2Rpdj4NCjxkaXY+KzwvZGl2Pg0KPGRpdj4rc3RydWN0IEFWUkdQSU9TdGF0ZSB7 PC9kaXY+DQo8ZGl2PisgJm5ic3A7ICZuYnNwOy8qJmx0OyBwcml2YXRlICZndDsqLzwvZGl2Pg0K PGRpdj4rICZuYnNwOyAmbmJzcDtTeXNCdXNEZXZpY2UgcGFyZW50X29iajs8L2Rpdj4NCjxkaXY+ KzwvZGl2Pg0KPGRpdj4rICZuYnNwOyAmbmJzcDsvKiZsdDsgcHVibGljICZndDsqLzwvZGl2Pg0K PGRpdj4rICZuYnNwOyAmbmJzcDtNZW1vcnlSZWdpb24gbW1pbzs8L2Rpdj4NCjxkaXY+KzwvZGl2 Pg0KPGRpdj4rICZuYnNwOyAmbmJzcDt1aW50OF90IGRkcl92YWw7PC9kaXY+DQo8ZGl2PisgJm5i c3A7ICZuYnNwO3VpbnQ4X3QgcG9ydF92YWw7PC9kaXY+DQo8ZGl2Pis8L2Rpdj4NCjxkaXY+K307 PC9kaXY+DQo8ZGl2Pis8L2Rpdj4NCisjZW5kaWYgLyogQVZSX0dQSU9fSCAqLzxicj4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2Pg0KPGRpdiBpZD0iYXBwZW5kb25zZW5kIj48L2Rpdj4NCjxkaXYgc3R5 bGU9ImZvbnQtZmFtaWx5Okd1bGltLOq1tOumvCwmcXVvdDtOYW51bSBHb3RoaWMmcXVvdDssc2Fu cy1zZXJpZjsgZm9udC1zaXplOjEycHQ7IGNvbG9yOnJnYigwLDAsMCkiPg0KPGJyPg0KPC9kaXY+ DQo8aHIgdGFiaW5kZXg9Ii0xIiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7IHdpZHRoOjk4 JSI+DQo8ZGl2IGlkPSJkaXZScGx5RndkTXNnIiBkaXI9Imx0ciI+PGZvbnQgZmFjZT0iQ2FsaWJy aSwgc2Fucy1zZXJpZiIgY29sb3I9IiMwMDAwMDAiIHN0eWxlPSJmb250LXNpemU6MTFwdCI+PGI+ 67O064K4IOyCrOuejDo8L2I+IFBoaWxpcHBlIE1hdGhpZXUtRGF1ZMOpICZsdDtmNGJ1Z0BhbXNh dC5vcmcmZ3Q7IOuMgOyLoCBQaGlsaXBwZSBNYXRoaWV1LURhdWTDqSAmbHQ7cGhpbGlwcGUubWF0 aGlldS5kYXVkZUBnbWFpbC5jb20mZ3Q7PGJyPg0KPGI+67O064K4IOuCoOynnDo8L2I+IDIwMjDr hYQgMTDsm5QgM+ydvCDthqDsmpTsnbwg7Jik7KCEIDEyOjQ4PGJyPg0KPGI+67Cb64qUIOyCrOue jDo8L2I+IEhlZWNoZW9sIFlhbmcgJmx0O2hlZWNoZW9sLnlhbmdAb3V0bG9vay5jb20mZ3Q7OyBx ZW11LWRldmVsQG5vbmdudS5vcmcgJmx0O3FlbXUtZGV2ZWxAbm9uZ251Lm9yZyZndDs8YnI+DQo8 Yj7ssLjsobA6PC9iPiBTLkUuSGFycmlzQGtlbnQuYWMudWsgJmx0O1MuRS5IYXJyaXNAa2VudC5h Yy51ayZndDs7IG1yb2xuaWtAZ21haWwuY29tICZsdDttcm9sbmlrQGdtYWlsLmNvbSZndDs8YnI+ DQo8Yj7soJzrqqk6PC9iPiBSZTogW1BBVENIXSBody9hdnI6IEFkZCBsaW1pdGVkIHN1cHBvcnQg Zm9yIGF2ciBncGlvIHJlZ2lzdGVyczwvZm9udD4NCjxkaXY+Jm5ic3A7PC9kaXY+DQo8L2Rpdj4N CjxkaXYgY2xhc3M9IkJvZHlGcmFnbWVudCI+PGZvbnQgc2l6ZT0iMiI+PHNwYW4gc3R5bGU9ImZv bnQtc2l6ZToxMXB0Ij4NCjxkaXYgY2xhc3M9IlBsYWluVGV4dCI+SGkgWWFuZyw8YnI+DQo8YnI+ DQpPbiAxMC8yLzIwIDU6MjQgUE0sIEhlZWNoZW9sIFlhbmcgd3JvdGU6PGJyPg0KJmd0OyBBZGQg c29tZSBvZiB0aGVzZSBmZWF0dXJlcyBmb3IgYXZyIGdwaW86PGJyPg0KJmd0Ozxicj4NCiZndDsm bmJzcDsgw4ImbmJzcDsgLSBHUElPIEkvTyA6IFBPUlR4IHJlZ2lzdGVyczxicj4NCiZndDsmbmJz cDsgw4ImbmJzcDsgLSBEYXRhIERpcmVjdGlvbiA6IEREUnggcmVnaXN0ZXJzPGJyPg0KJmd0Ozxi cj4NCiZndDsgRm9sbG93aW5nIHRoaW5ncyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQ6PGJyPg0KJmd0 OyZuYnNwOyDDgiZuYnNwOyAtIFBJTnggcmVnaXN0ZXJzPGJyPg0KJmd0OyZuYnNwOyDDgiZuYnNw OyAtIE1DVVIgcmVnaXN0ZXJzPGJyPg0KJmd0OyZuYnNwOyDDgiZuYnNwOyAtIEV2ZW4gdGhvdWdo IHJlYWQvd3JpdGUgZm9yIEREUnggcmVnaXN0ZXJzIGFyZTxicj4NCiZndDsmbmJzcDsgw4Igw4Ig w4ImbmJzcDsgaW1wbGVtZW50ZWQsIGFjdHVhbCBkaXJlY3Rpb24gY29udHJvbHMgYXJlIG5vdDxi cj4NCiZndDsmbmJzcDsgw4Igw4Igw4ImbmJzcDsgc3VwcG9ydGVkIHlldC48YnI+DQo8YnI+DQpU aGFua3MgZm9yIHlvdXIgcGF0Y2gsIGhvd2V2ZXIgaXRzIGVuY29kaW5nIHNlZW1zPGJyPg0KY29t cGxldGVseSBicm9rZW4sIGFuZCBJIGNhbiBub3QgdGVzdCBpdC4gU2ltaWxhcjxicj4NCnByb2Js ZW0gb2NjdXJyZWQgdG8gdGhlIHBhdGNoZXcgYXV0b21hdGljIHNjcmlwdDo8YnI+DQo8YnI+DQo8 YSBocmVmPSJodHRwczovL3BhdGNoZXcub3JnL1FFTVUvRE02UFIxNk1CMjQ3MzdGOTExQkQyNjBG MUZBOEVCQzM3RTYzMTBARE02UFIxNk1CMjQ3My5uYW1wcmQxNi5wcm9kLm91dGxvb2suY29tLyI+ aHR0cHM6Ly9wYXRjaGV3Lm9yZy9RRU1VL0RNNlBSMTZNQjI0NzM3RjkxMUJEMjYwRjFGQThFQkMz N0U2MzEwQERNNlBSMTZNQjI0NzMubmFtcHJkMTYucHJvZC5vdXRsb29rLmNvbS88L2E+PGJyPg0K PGJyPg0KVGhpcyBtaWdodCBiZSB1c2VmdWw6PGJyPg0KPGEgaHJlZj0iaHR0cHM6Ly93aWtpLnFl bXUub3JnL0NvbnRyaWJ1dGUvU3VibWl0QVBhdGNoI1VzZV9naXRfZm9ybWF0LXBhdGNoIj5odHRw czovL3dpa2kucWVtdS5vcmcvQ29udHJpYnV0ZS9TdWJtaXRBUGF0Y2gjVXNlX2dpdF9mb3JtYXQt cGF0Y2g8L2E+PGJyPg0KPGJyPg0KQW55d2F5IEknbGwgdHJ5IHRvIHJldmlldyB3aGF0IEkgY2Fu IGZvbGxvdy48YnI+DQo8YnI+DQomZ3Q7PGJyPg0KJmd0OyBTaWduZWQtb2ZmLWJ5OiBIZWVjaGVv bCBZYW5nICZsdDtoZWVjaGVvbC55YW5nQG91dGxvb2suY29tJmd0Ozxicj4NCiZndDsgLS0tPGJy Pg0KJmd0OyZuYnNwOyDDgiBody9hdnIvS2NvbmZpZ8OCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOC IMOCIMOCIMOCJm5ic3A7IHzDgiDDgiZuYnNwOyAxICs8YnI+DQomZ3Q7Jm5ic3A7IMOCIGh3L2F2 ci9hdG1lZ2EuY8OCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCJm5ic3A7IHzDgiDDgiZu YnNwOyA3ICsrLTxicj4NCiZndDsmbmJzcDsgw4IgaHcvYXZyL2F0bWVnYS5ow4Igw4Igw4Igw4Ig w4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJzcDsgfMOCIMOCJm5ic3A7IDIgKzxicj4NCiZndDsmbmJz cDsgw4IgaHcvZ3Bpby9LY29uZmlnw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJz cDsgfMOCIMOCJm5ic3A7IDMgKzxicj4NCiZndDsmbmJzcDsgw4IgaHcvZ3Bpby9hdnJfZ3Bpby5j w4Igw4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJzcDsgfCAxMTc8YnI+DQorKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrPGJyPg0KJmd0OyZuYnNwOyDDgiBody9ncGlvL21lc29uLmJ1 aWxkw4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJzcDsgfMOCIMOCJm5ic3A7IDIgKzxicj4NCiZndDsm bmJzcDsgw4IgaW5jbHVkZS9ody9ncGlvL2F2cl9ncGlvLmggfMOCJm5ic3A7IDQ4ICsrKysrKysr KysrKysrKzxicj4NCiZndDsmbmJzcDsgw4IgNyBmaWxlcyBjaGFuZ2VkLCAxNzggaW5zZXJ0aW9u cygrKSwgMiBkZWxldGlvbnMoLSk8YnI+DQomZ3Q7Jm5ic3A7IMOCIGNyZWF0ZSBtb2RlIDEwMDY0 NCBody9ncGlvL2F2cl9ncGlvLmM8YnI+DQomZ3Q7Jm5ic3A7IMOCIGNyZWF0ZSBtb2RlIDEwMDY0 NCBpbmNsdWRlL2h3L2dwaW8vYXZyX2dwaW8uaDxicj4NCiZndDs8YnI+DQomZ3Q7IGRpZmYgLS1n aXQgYS9ody9hdnIvS2NvbmZpZyBiL2h3L2F2ci9LY29uZmlnPGJyPg0KJmd0OyBpbmRleCBkMzEy OThjM2NjLi4xNmE1N2NlZDExIDEwMDY0NDxicj4NCiZndDsgLS0tIGEvaHcvYXZyL0tjb25maWc8 YnI+DQomZ3Q7ICsrKyBiL2h3L2F2ci9LY29uZmlnPGJyPg0KJmd0OyBAQCAtMyw2ICszLDcgQEAg Y29uZmlnIEFWUl9BVE1FR0FfTUNVPGJyPg0KJmd0OyZuYnNwOyDDgiDDgiDDgiDDgiZuYnNwOyBz ZWxlY3QgQVZSX1RJTUVSMTY8YnI+DQomZ3Q7Jm5ic3A7IMOCIMOCIMOCIMOCJm5ic3A7IHNlbGVj dCBBVlJfVVNBUlQ8YnI+DQomZ3Q7Jm5ic3A7IMOCIMOCIMOCIMOCJm5ic3A7IHNlbGVjdCBBVlJf UE9XRVI8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNwOyBzZWxlY3QgQVZSX0dQSU88YnI+DQomZ3Q7 PGJyPg0KJmd0OyZuYnNwOyDDgiBjb25maWcgQVJEVUlOTzxicj4NCiZndDsmbmJzcDsgw4Igw4Ig w4Igw4ImbmJzcDsgc2VsZWN0IEFWUl9BVE1FR0FfTUNVPGJyPg0KJmd0OyBkaWZmIC0tZ2l0IGEv aHcvYXZyL2F0bWVnYS5jIGIvaHcvYXZyL2F0bWVnYS5jPGJyPg0KJmd0OyBpbmRleCA0NGM2YWZl YmJiLi5hZDk0MjAyOGZkIDEwMDY0NDxicj4NCiZndDsgLS0tIGEvaHcvYXZyL2F0bWVnYS5jPGJy Pg0KJmd0OyArKysgYi9ody9hdnIvYXRtZWdhLmM8YnI+DQomZ3Q7IEBAIC0yODMsOCArMjgzLDEx IEBAIHN0YXRpYyB2b2lkIGF0bWVnYV9yZWFsaXplKERldmljZVN0YXRlICpkZXYsIEVycm9yPGJy Pg0KJmd0OyAqKmVycnApPGJyPg0KJmd0OyZuYnNwOyDDgiDDgiDDgiDDgiDDgiDDgiDDgiDDgiDD giDDgiDDgiDDgiZuYnNwOyBjb250aW51ZTs8YnI+DQomZ3Q7Jm5ic3A7IMOCIMOCIMOCIMOCIMOC IMOCIMOCIMOCJm5ic3A7IH08YnI+DQomZ3Q7Jm5ic3A7IMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOC Jm5ic3A7IGRldm5hbWUgPSBnX3N0cmR1cF9wcmludGYoJnF1b3Q7YXRtZWdhLWdwaW8tJWMmcXVv dDssICdhJyArPGJyPg0KKGNoYXIpaSk7PGJyPg0KJmd0OyAtw4Igw4Igw4Igw4Igw4Igw4Igw4Im bmJzcDsgY3JlYXRlX3VuaW1wbGVtZW50ZWRfZGV2aWNlKGRldm5hbWUsPGJyPg0KJmd0OyAtw4Ig w4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Ig w4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4I8YnI+DQombmJzcDtP RkZTRVRfREFUQSArIG1jLSZndDtkZXZbaWR4XS5hZGRyLCAzKTs8YnI+DQomZ3Q7ICvDgiDDgiDD giDDgiDDgiDDgiDDgiZuYnNwOyBvYmplY3RfaW5pdGlhbGl6ZV9jaGlsZChPQkpFQ1QoZGV2KSwg ZGV2bmFtZSwgJmFtcDtzLSZndDtncGlvW2ldLDxicj4NCiZndDsgK8OCIMOCIMOCIMOCIMOCIMOC IMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOC IMOCIMOCIMOCIMOCIMOCIMOCPGJyPg0KVFlQRV9BVlJfR1BJTyk7PGJyPg0KJmd0OyArw4Igw4Ig w4Igw4Igw4Igw4Igw4ImbmJzcDsgc3lzYnVzX3JlYWxpemUoU1lTX0JVU19ERVZJQ0UoJmFtcDtz LSZndDtncGlvW2ldKSwgJmFtcDtlcnJvcl9hYm9ydCk7PGJyPg0KJmd0OyArw4Igw4Igw4Igw4Ig w4Igw4Igw4ImbmJzcDsgc3lzYnVzX21taW9fbWFwKFNZU19CVVNfREVWSUNFKCZhbXA7cy0mZ3Q7 Z3Bpb1tpXSksIDAsPGJyPg0KJmd0OyArw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Im bmJzcDsgT0ZGU0VUX0RBVEEgKyBtYy0mZ3Q7ZGV2W2lkeF0uYWRkcik7PGJyPg0KJmd0OyZuYnNw OyDDgiDDgiDDgiDDgiDDgiDDgiDDgiDDgiZuYnNwOyBnX2ZyZWUoZGV2bmFtZSk7PGJyPg0KJmd0 OyZuYnNwOyDDgiDDgiDDgiDDgiZuYnNwOyB9PGJyPg0KJmd0Ozxicj4NCiZndDsgZGlmZiAtLWdp dCBhL2h3L2F2ci9hdG1lZ2EuaCBiL2h3L2F2ci9hdG1lZ2EuaDxicj4NCiZndDsgaW5kZXggYTk5 ZWUxNWM3ZS4uZTIyODlkNTc0NCAxMDA2NDQ8YnI+DQomZ3Q7IC0tLSBhL2h3L2F2ci9hdG1lZ2Eu aDxicj4NCiZndDsgKysrIGIvaHcvYXZyL2F0bWVnYS5oPGJyPg0KJmd0OyBAQCAtMTMsNiArMTMs NyBAQDxicj4NCiZndDs8YnI+DQomZ3Q7Jm5ic3A7IMOCICNpbmNsdWRlICZxdW90O2h3L2NoYXIv YXZyX3VzYXJ0LmgmcXVvdDs8YnI+DQomZ3Q7Jm5ic3A7IMOCICNpbmNsdWRlICZxdW90O2h3L3Rp bWVyL2F2cl90aW1lcjE2LmgmcXVvdDs8YnI+DQomZ3Q7ICsjaW5jbHVkZSAmcXVvdDtody9ncGlv L2F2cl9ncGlvLmgmcXVvdDs8YnI+DQomZ3Q7Jm5ic3A7IMOCICNpbmNsdWRlICZxdW90O2h3L21p c2MvYXZyX3Bvd2VyLmgmcXVvdDs8YnI+DQomZ3Q7Jm5ic3A7IMOCICNpbmNsdWRlICZxdW90O3Rh cmdldC9hdnIvY3B1LmgmcXVvdDs8YnI+DQomZ3Q7Jm5ic3A7IMOCICNpbmNsdWRlICZxdW90O3Fv bS9vYmplY3QuaCZxdW90Ozxicj4NCiZndDsgQEAgLTQ0LDYgKzQ1LDcgQEAgc3RydWN0IEF0bWVn YU1jdVN0YXRlIHs8YnI+DQomZ3Q7Jm5ic3A7IMOCIMOCIMOCIMOCJm5ic3A7IERldmljZVN0YXRl ICppbzs8YnI+DQomZ3Q7Jm5ic3A7IMOCIMOCIMOCIMOCJm5ic3A7IEFWUk1hc2tTdGF0ZSBwd3Jb UE9XRVJfTUFYXTs8YnI+DQomZ3Q7Jm5ic3A7IMOCIMOCIMOCIMOCJm5ic3A7IEFWUlVzYXJ0U3Rh dGUgdXNhcnRbVVNBUlRfTUFYXTs8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNwOyBBVlJHUElPU3Rh dGUgZ3Bpb1tHUElPX01BWF07PGJyPg0KJmd0OyZuYnNwOyDDgiDDgiDDgiDDgiZuYnNwOyBBVlJU aW1lcjE2U3RhdGUgdGltZXJbVElNRVJfTUFYXTs8YnI+DQomZ3Q7Jm5ic3A7IMOCIMOCIMOCIMOC Jm5ic3A7IHVpbnQ2NF90IHh0YWxfZnJlcV9oejs8YnI+DQomZ3Q7Jm5ic3A7IMOCIH07PGJyPg0K Jmd0OyBkaWZmIC0tZ2l0IGEvaHcvZ3Bpby9LY29uZmlnIGIvaHcvZ3Bpby9LY29uZmlnPGJyPg0K Jmd0OyBpbmRleCBiNmZkYWEyNTg2Li4xNzUyZDBjZTU2IDEwMDY0NDxicj4NCiZndDsgLS0tIGEv aHcvZ3Bpby9LY29uZmlnPGJyPg0KJmd0OyArKysgYi9ody9ncGlvL0tjb25maWc8YnI+DQomZ3Q7 IEBAIC0xMCwzICsxMCw2IEBAIGNvbmZpZyBHUElPX0tFWTxicj4NCiZndDs8YnI+DQomZ3Q7Jm5i c3A7IMOCIGNvbmZpZyBTSUZJVkVfR1BJTzxicj4NCiZndDsmbmJzcDsgw4Igw4Igw4Igw4ImbmJz cDsgYm9vbDxicj4NCiZndDsgKzxicj4NCiZndDsgK2NvbmZpZyBBVlJfR1BJTzxicj4NCiZndDsg K8OCIMOCIMOCJm5ic3A7IGJvb2w8YnI+DQomZ3Q7IGRpZmYgLS1naXQgYS9ody9ncGlvL2F2cl9n cGlvLmMgYi9ody9ncGlvL2F2cl9ncGlvLmM8YnI+DQomZ3Q7IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 PGJyPg0KJmd0OyBpbmRleCAwMDAwMDAwMDAwLi43MTE0MjE2ODQ3PGJyPg0KJmd0OyAtLS0gL2Rl di9udWxsPGJyPg0KJmd0OyArKysgYi9ody9ncGlvL2F2cl9ncGlvLmM8YnI+DQomZ3Q7IEBAIC0w LDAgKzEsMTE3IEBAPGJyPg0KJmd0OyArLyo8YnI+DQomZ3Q7ICsgKiBBVlIgcHJvY2Vzc29ycyBH UElPIHJlZ2lzdGVycyBlbXVsYXRpb24uPGJyPg0KJmd0OyArICo8YnI+DQomZ3Q7ICsgKiBDb3B5 cmlnaHQgKEMpIDIwMjAgSGVlY2hlb2wgWWFuZyAmbHQ7aGVlY2hlb2wueWFuZ0BvdXRsb29rLmNv bSZndDs8YnI+DQomZ3Q7ICsgKjxicj4NCiZndDsgKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3I8YnI+DQomZ3Q7ICsgKiBtb2Rp ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh czxicj4NCiZndDsgKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u OyBlaXRoZXIgdmVyc2lvbiAyIG9yPGJyPg0KJmd0OyArICogKGF0IHlvdXIgb3B0aW9uKSB2ZXJz aW9uIDMgb2YgdGhlIExpY2Vuc2UuPGJyPg0KJmd0OyArICo8YnI+DQomZ3Q7ICsgKiBUaGlzIHBy b2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCw8 YnI+DQomZ3Q7ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg aW1wbGllZCB3YXJyYW50eSBvZjxicj4NCiZndDsgKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZTxicj4NCiZndDsgKyAqIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuPGJyPg0KJmd0OyArICo8YnI+ DQomZ3Q7ICsgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZTxicj4NCmFsb25nPGJyPg0KJmd0OyArICogd2l0aCB0aGlzIHBy b2dyYW07IGlmIG5vdCwgc2VlICZsdDs8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvbGljZW5z ZXMvIj5odHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPC9hPiZndDsuPGJyPg0KJmd0OyArICov PGJyPg0KJmd0OyArI2luY2x1ZGUgJnF1b3Q7cWVtdS9vc2RlcC5oJnF1b3Q7PGJyPg0KJmd0OyAr I2luY2x1ZGUgJnF1b3Q7cWVtdS9sb2cuaCZxdW90Ozxicj4NCiZndDsgKyNpbmNsdWRlICZxdW90 O3FlbXUvbW9kdWxlLmgmcXVvdDs8YnI+DQomZ3Q7ICsjaW5jbHVkZSAmcXVvdDtxZW11L3RpbWVy LmgmcXVvdDs8YnI+DQo8YnI+DQomcXVvdDtxZW11L3RpbWVyLmgmcXVvdDsgbm90IG5lZWRlZC48 YnI+DQo8YnI+DQomZ3Q7ICsjaW5jbHVkZSAmcXVvdDtxYXBpL2Vycm9yLmgmcXVvdDs8YnI+DQom Z3Q7ICsjaW5jbHVkZSAmcXVvdDtody9zeXNidXMuaCZxdW90Ozxicj4NCiZndDsgKyNpbmNsdWRl ICZxdW90O2h3L2lycS5oJnF1b3Q7PGJyPg0KJmd0OyArI2luY2x1ZGUgJnF1b3Q7aHcvZ3Bpby9h dnJfZ3Bpby5oJnF1b3Q7PGJyPg0KJmd0OyArI2luY2x1ZGUgJnF1b3Q7aHcvcWRldi1wcm9wZXJ0 aWVzLmgmcXVvdDs8YnI+DQomZ3Q7ICsjaW5jbHVkZSAmcXVvdDtjaGFyZGV2L2NoYXItZmUuaCZx dW90Ozxicj4NCjxicj4NCiZxdW90O2NoYXJkZXYvY2hhci1mZS5oJnF1b3Q7IG5vdCBuZWVkZWQu PGJyPg0KPGJyPg0KJmd0OyArPGJyPg0KJmd0OyArc3RhdGljIHZvaWQgYXZyX2dwaW9fcmVzZXQo RGV2aWNlU3RhdGUgKmRldik8YnI+DQomZ3Q7ICt7PGJyPg0KJmd0OyArw4Igw4Igw4ImbmJzcDsg QVZSR1BJT1N0YXRlICpncGlvID0gQVZSX0dQSU8oZGV2KTs8YnI+DQomZ3Q7ICvDgiDDgiDDgiZu YnNwOyBncGlvLSZndDtkZHJfdmFsID0gMHU7PGJyPg0KJmd0OyArw4Igw4Igw4ImbmJzcDsgZ3Bp by0mZ3Q7cG9ydF92YWwgPSAwdTs8YnI+DQomZ3Q7ICt9PGJyPg0KJmd0OyArc3RhdGljIHVpbnQ2 NF90IGF2cl9ncGlvX3JlYWQodm9pZCAqb3BhcXVlLCBod2FkZHIgb2Zmc2V0LCB1bnNpZ25lZCBp bnQ8YnI+DQomZ3Q7IHNpemUpPGJyPg0KJmd0OyArezxicj4NCiZndDsgK8OCIMOCIMOCJm5ic3A7 IEFWUkdQSU9TdGF0ZSAqcyA9IChBVlJHUElPU3RhdGUgKilvcGFxdWU7PGJyPg0KJmd0OyArw4Ig w4Igw4ImbmJzcDsgc3dpdGNoIChvZmZzZXQpIHs8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNwOyBj YXNlIEdQSU9fUElOOjxicj4NCiZndDsgK8OCIMOCIMOCIMOCIMOCIMOCIMOCJm5ic3A7IC8qIE5v dCBpbXBsZW1lbnRlZCB5ZXQgKi88YnI+DQo8YnI+DQpQbGVhc2UgdXNlOjxicj4NCjxicj4NCiZu YnNwOyZuYnNwOyBxZW11X2xvZ19tYXNrKExPR19VTklNUCwgLi4uPGJyPg0KPGJyPg0KJmd0OyAr w4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJzcDsgYnJlYWs7PGJyPg0KJmd0OyArw4Igw4Igw4ImbmJz cDsgY2FzZSBHUElPX0REUjo8YnI+DQomZ3Q7ICvDgiDDgiDDgiDDgiDDgiDDgiDDgiZuYnNwOyBy ZXR1cm4gcy0mZ3Q7ZGRyX3ZhbDs8YnI+DQomZ3Q7ICvDgiDDgiDDgiDDgiDDgiDDgiDDgiZuYnNw OyBicmVhazs8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNwOyBjYXNlIEdQSU9fUE9SVDo8YnI+DQom Z3Q7ICvDgiDDgiDDgiDDgiDDgiDDgiDDgiZuYnNwOyByZXR1cm4gcy0mZ3Q7cG9ydF92YWw7PGJy Pg0KJmd0OyArw4Igw4Igw4ImbmJzcDsgZGVmYXVsdDo8YnI+DQomZ3Q7ICvDgiDDgiDDgiDDgiDD giDDgiDDgiZuYnNwOyBxZW11X2xvZ19tYXNrKExPR19HVUVTVF9FUlJPUiwgJnF1b3Q7JXM6IEJh ZCBvZmZzZXQgJWx4XG4mcXVvdDssPGJyPg0KJmd0OyArw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Ig w4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJzcDsgX19mdW5jX18sIG9mZnNldCk7PGJyPg0KJmd0OyAr w4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJzcDsgYnJlYWs7PGJyPg0KPGJyPg0KVGhpcyBjYW4gbm90 IGhhcHBlbiwgc28gSSdkIHNpbXBseSB1c2U6PGJyPg0KPGJyPg0KJm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7IGdfYXNzZXJ0X25vdF9yZWFjaGVkKCk7PGJyPg0KPGJyPg0KJmd0OyArw4Igw4Igw4Im bmJzcDsgfTxicj4NCiZndDsgK8OCIMOCIMOCJm5ic3A7IHJldHVybiAwOzxicj4NCiZndDsgK308 YnI+DQomZ3Q7ICs8YnI+DQomZ3Q7ICtzdGF0aWMgdm9pZCBhdnJfZ3Bpb193cml0ZSh2b2lkICpv cGFxdWUsIGh3YWRkciBvZmZzZXQsIHVpbnQ2NF90IHZhbHVlLDxicj4NCiZndDsgK8OCIMOCIMOC IMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOC IMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCIMOCPGJyPg0KdW5zaWduZWQgaW50IHNpemUpPGJyPg0K Jmd0OyArezxicj4NCiZndDsgK8OCIMOCIMOCJm5ic3A7IEFWUkdQSU9TdGF0ZSAqcyA9IChBVlJH UElPU3RhdGUgKilvcGFxdWU7PGJyPg0KJmd0OyArw4Igw4Igw4ImbmJzcDsgc3dpdGNoIChvZmZz ZXQpIHs8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNwOyBjYXNlIEdQSU9fUElOOjxicj4NCiZndDsg K8OCIMOCIMOCIMOCIMOCIMOCIMOCJm5ic3A7IC8qIE5vdCBpbXBsZW1lbnRlZCB5ZXQgKi88YnI+ DQomZ3Q7ICvDgiDDgiDDgiDDgiDDgiDDgiDDgiZuYnNwOyBicmVhazs8YnI+DQomZ3Q7ICvDgiDD giDDgiZuYnNwOyBjYXNlIEdQSU9fRERSOjxicj4NCiZndDsgK8OCIMOCIMOCIMOCIMOCIMOCIMOC Jm5ic3A7IHMtJmd0O2Rkcl92YWwgPSB2YWx1ZSAmYW1wOyAweEY7PGJyPg0KJmd0OyArw4Igw4Ig w4Igw4Igw4Igw4Igw4ImbmJzcDsgYnJlYWs7PGJyPg0KJmd0OyArw4Igw4Igw4ImbmJzcDsgY2Fz ZSBHUElPX1BPUlQ6PGJyPg0KJmd0OyArw4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJzcDsgcy0mZ3Q7 cG9ydF92YWwgPSB2YWx1ZSAmYW1wOyAweEY7PGJyPg0KJmd0OyArw4Igw4Igw4Igw4Igw4Igw4Ig w4ImbmJzcDsgYnJlYWs7PGJyPg0KJmd0OyArw4Igw4Igw4ImbmJzcDsgZGVmYXVsdDo8YnI+DQom Z3Q7ICvDgiDDgiDDgiDDgiDDgiDDgiDDgiZuYnNwOyBxZW11X2xvZ19tYXNrKExPR19HVUVTVF9F UlJPUiwgJnF1b3Q7JXM6IEJhZCBvZmZzZXQgJWx4XG4mcXVvdDssPGJyPg0KJmd0OyArw4Igw4Ig w4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJzcDsgX19mdW5jX18sIG9m ZnNldCk7PGJyPg0KJmd0OyArw4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJzcDsgYnJlYWs7PGJyPg0K Jmd0OyArw4Igw4Igw4ImbmJzcDsgfTxicj4NCjxicj4NClNpbWlsYXIgY29tbWVudHMgdGhhbiBh dnJfZ3Bpb19yZWFkKCkuPGJyPg0KPGJyPg0KJmd0OyArfTxicj4NCiZndDsgKzxicj4NCiZndDsg K3N0YXRpYyBjb25zdCBNZW1vcnlSZWdpb25PcHMgYXZyX2dwaW9fb3BzID0gezxicj4NCiZndDsg K8OCIMOCIMOCJm5ic3A7IC5yZWFkID0gYXZyX2dwaW9fcmVhZCw8YnI+DQomZ3Q7ICvDgiDDgiDD giZuYnNwOyAud3JpdGUgPSBhdnJfZ3Bpb193cml0ZSw8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNw OyAuZW5kaWFubmVzcyA9IERFVklDRV9OQVRJVkVfRU5ESUFOLDxicj4NCiZndDsgK307PGJyPg0K Jmd0OyArPGJyPg0KJmd0OyArc3RhdGljIHZvaWQgYXZyX2dwaW9faW5pdChPYmplY3QgKm9iaik8 YnI+DQomZ3Q7ICt7PGJyPg0KJmd0OyArw4Igw4Igw4ImbmJzcDsgQVZSR1BJT1N0YXRlICpzID0g QVZSX0dQSU8ob2JqKTs8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNwOyBtZW1vcnlfcmVnaW9uX2lu aXRfaW8oJmFtcDtzLSZndDttbWlvLCBvYmosICZhbXA7YXZyX2dwaW9fb3BzLCBzLDxicj4NCiZn dDsgVFlQRV9BVlJfR1BJTywgMyk7PGJyPg0KJmd0OyArw4Igw4Igw4ImbmJzcDsgc3lzYnVzX2lu aXRfbW1pbyhTWVNfQlVTX0RFVklDRShvYmopLCAmYW1wO3MtJmd0O21taW8pOzxicj4NCiZndDsg K8OCIMOCIMOCJm5ic3A7IHMtJmd0O2VuYWJsZWQgPSB0cnVlOzxicj4NCiZndDsgK308YnI+DQom Z3Q7ICtzdGF0aWMgdm9pZCBhdnJfZ3Bpb19yZWFsaXplKERldmljZVN0YXRlICpkZXYsIEVycm9y ICoqZXJycCk8YnI+DQomZ3Q7ICt7PGJyPg0KJmd0OyArw4Igw4Igw4ImbmJzcDsgYXZyX2dwaW9f cmVzZXQoZGV2KTs8YnI+DQomZ3Q7ICt9PGJyPg0KJmd0OyArPGJyPg0KJmd0OyArPGJyPg0KJmd0 OyArc3RhdGljIHZvaWQgYXZyX2dwaW9fY2xhc3NfaW5pdChPYmplY3RDbGFzcyAqa2xhc3MsIHZv aWQgKmRhdGEpPGJyPg0KJmd0OyArezxicj4NCiZndDsgK8OCIMOCIMOCJm5ic3A7IERldmljZUNs YXNzICpkYyA9IERFVklDRV9DTEFTUyhrbGFzcyk7PGJyPg0KJmd0OyArPGJyPg0KJmd0OyArw4Ig w4Igw4ImbmJzcDsgZGMtJmd0O3Jlc2V0ID0gYXZyX2dwaW9fcmVzZXQ7PGJyPg0KJmd0OyArw4Ig w4Igw4ImbmJzcDsgZGMtJmd0O3JlYWxpemUgPSBhdnJfZ3Bpb19yZWFsaXplOzxicj4NCiZndDsg K308YnI+DQomZ3Q7ICs8YnI+DQomZ3Q7ICtzdGF0aWMgY29uc3QgVHlwZUluZm8gYXZyX2dwaW9f aW5mbyA9IHs8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNwOyAubmFtZcOCIMOCIMOCIMOCIMOCIMOC IMOCIMOCIMOCJm5ic3A7ID0gVFlQRV9BVlJfR1BJTyw8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNw OyAucGFyZW50w4Igw4Igw4Igw4Igw4Igw4Igw4ImbmJzcDsgPSBUWVBFX1NZU19CVVNfREVWSUNF LDxicj4NCiZndDsgK8OCIMOCIMOCJm5ic3A7IC5pbnN0YW5jZV9zaXplID0gc2l6ZW9mKEFWUkdQ SU9TdGF0ZSksPGJyPg0KJmd0OyArw4Igw4Igw4ImbmJzcDsgLmluc3RhbmNlX2luaXQgPSBhdnJf Z3Bpb19pbml0LDxicj4NCiZndDsgK8OCIMOCIMOCJm5ic3A7IC5jbGFzc19pbml0w4Igw4Igw4Im bmJzcDsgPSBhdnJfZ3Bpb19jbGFzc19pbml0LDxicj4NCiZndDsgK307PGJyPg0KJmd0OyArPGJy Pg0KJmd0OyArc3RhdGljIHZvaWQgYXZyX2dwaW9fcmVnaXN0ZXJfdHlwZXModm9pZCk8YnI+DQom Z3Q7ICt7PGJyPg0KJmd0OyArw4Igw4Igw4ImbmJzcDsgdHlwZV9yZWdpc3Rlcl9zdGF0aWMoJmFt cDthdnJfZ3Bpb19pbmZvKTs8YnI+DQomZ3Q7ICt9PGJyPg0KJmd0OyArPGJyPg0KJmd0OyArdHlw ZV9pbml0KGF2cl9ncGlvX3JlZ2lzdGVyX3R5cGVzKTxicj4NCiZndDsgZGlmZiAtLWdpdCBhL2h3 L2dwaW8vbWVzb24uYnVpbGQgYi9ody9ncGlvL21lc29uLmJ1aWxkPGJyPg0KJmd0OyBpbmRleCA4 NmNhZTlhMGYzLi4yNThiZDVkY2ZjIDEwMDY0NDxicj4NCiZndDsgLS0tIGEvaHcvZ3Bpby9tZXNv bi5idWlsZDxicj4NCiZndDsgKysrIGIvaHcvZ3Bpby9tZXNvbi5idWlsZDxicj4NCiZndDsgQEAg LTExLDMgKzExLDUgQEAgc29mdG1tdV9zcy5hZGQod2hlbjogJ0NPTkZJR19PTUFQJywgaWZfdHJ1 ZTo8YnI+DQomZ3Q7IGZpbGVzKCdvbWFwX2dwaW8uYycpKTxicj4NCiZndDsmbmJzcDsgw4Igc29m dG1tdV9zcy5hZGQod2hlbjogJ0NPTkZJR19SQVNQSScsIGlmX3RydWU6IGZpbGVzKCdiY20yODM1 X2dwaW8uYycpKTxicj4NCiZndDsmbmJzcDsgw4Igc29mdG1tdV9zcy5hZGQod2hlbjogJ0NPTkZJ R19BU1BFRURfU09DJywgaWZfdHJ1ZTo8YnI+DQpmaWxlcygnYXNwZWVkX2dwaW8uYycpKTxicj4N CiZndDsmbmJzcDsgw4Igc29mdG1tdV9zcy5hZGQod2hlbjogJ0NPTkZJR19TSUZJVkVfR1BJTycs IGlmX3RydWU6PGJyPg0KJmd0OyBmaWxlcygnc2lmaXZlX2dwaW8uYycpKTxicj4NCiZndDsgKzxi cj4NCiZndDsgK3NvZnRtbXVfc3MuYWRkKHdoZW46ICdDT05GSUdfQVZSX0dQSU8nLCBpZl90cnVl OiBmaWxlcygnYXZyX2dwaW8uYycpKTxicj4NCiZndDsgZGlmZiAtLWdpdCBhL2luY2x1ZGUvaHcv Z3Bpby9hdnJfZ3Bpby5oIGIvaW5jbHVkZS9ody9ncGlvL2F2cl9ncGlvLmg8YnI+DQomZ3Q7IG5l dyBmaWxlIG1vZGUgMTAwNjQ0PGJyPg0KJmd0OyBpbmRleCAwMDAwMDAwMDAwLi40NWQ0Mjc1M2M4 PGJyPg0KJmd0OyAtLS0gL2Rldi9udWxsPGJyPg0KJmd0OyArKysgYi9pbmNsdWRlL2h3L2dwaW8v YXZyX2dwaW8uaDxicj4NCiZndDsgQEAgLTAsMCArMSw0OCBAQDxicj4NCiZndDsgKy8qPGJyPg0K Jmd0OyArICogQVZSIHByb2Nlc3NvcnMgR1BJTyByZWdpc3RlcnMgZGVmaW5pdGlvbi48YnI+DQom Z3Q7ICsgKjxicj4NCiZndDsgKyAqIENvcHlyaWdodCAoQykgMjAyMCBIZWVjaGVvbCBZYW5nICZs dDtoZWVjaGVvbC55YW5nQG91dGxvb2suY29tJmd0Ozxicj4NCiZndDsgKyAqPGJyPg0KJmd0OyAr ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vcjxicj4NCiZndDsgKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzPGJyPg0KJmd0OyArICogcHVibGlzaGVkIGJ5IHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb3I8YnI+DQomZ3Q7 ICsgKiAoYXQgeW91ciBvcHRpb24pIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZS48YnI+DQomZ3Q7 ICsgKjxicj4NCiZndDsgKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLDxicj4NCiZndDsgKyAqIGJ1dCBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mPGJyPg0KJmd0OyAr ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBT ZWUgdGhlPGJyPg0KJmd0OyArICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg ZGV0YWlscy48YnI+DQomZ3Q7ICsgKjxicj4NCiZndDsgKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlPGJyPg0KYWxvbmc8 YnI+DQomZ3Q7ICsgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgJmx0OzxhIGhyZWY9 Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8iPmh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNl cy88L2E+Jmd0Oy48YnI+DQomZ3Q7ICsgKi88YnI+DQomZ3Q7ICs8YnI+DQomZ3Q7ICsjaWZuZGVm IEFWUl9HUElPX0g8YnI+DQomZ3Q7ICsjZGVmaW5lIEFWUl9HUElPX0g8YnI+DQomZ3Q7ICs8YnI+ DQomZ3Q7ICsjaW5jbHVkZSAmcXVvdDtody9zeXNidXMuaCZxdW90Ozxicj4NCiZndDsgKyNpbmNs dWRlICZxdW90O3FvbS9vYmplY3QuaCZxdW90Ozxicj4NCiZndDsgKyNpbmNsdWRlICZxdW90O2No YXJkZXYvY2hhci1mZS5oJnF1b3Q7PGJyPg0KPGJyPg0KJnF1b3Q7Y2hhcmRldi9jaGFyLWZlLmgm cXVvdDsgbm90IG5lZWRlZC48YnI+DQo8YnI+DQomZ3Q7ICs8YnI+DQomZ3Q7ICsvKiBPZmZzZXRz IG9mIHJlZ2lzdGVycy4gKi88YnI+DQomZ3Q7ICsjZGVmaW5lIEdQSU9fUElOw4Igw4ImbmJzcDsg MHgwMDxicj4NCiZndDsgKyNkZWZpbmUgR1BJT19ERFLDgiDDgiZuYnNwOyAweDAxPGJyPg0KJmd0 OyArI2RlZmluZSBHUElPX1BPUlTDgiZuYnNwOyAweDAyPGJyPg0KJmd0OyArPGJyPg0KJmd0OyAr I2RlZmluZSBUWVBFX0FWUl9HUElPICZxdW90O2F2ci1ncGlvJnF1b3Q7PGJyPg0KJmd0OyArT0JK RUNUX0RFQ0xBUkVfU0lNUExFX1RZUEUoQVZSR1BJT1N0YXRlLCBBVlJfR1BJTyk8YnI+DQomZ3Q7 ICs8YnI+DQomZ3Q7ICtzdHJ1Y3QgQVZSR1BJT1N0YXRlIHs8YnI+DQomZ3Q7ICvDgiDDgiDDgiZu YnNwOyAvKiZsdDsgcHJpdmF0ZSAmZ3Q7Ki88YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNwOyBTeXNC dXNEZXZpY2UgcGFyZW50X29iajs8YnI+DQomZ3Q7ICs8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNw OyAvKiZsdDsgcHVibGljICZndDsqLzxicj4NCiZndDsgK8OCIMOCIMOCJm5ic3A7IE1lbW9yeVJl Z2lvbiBtbWlvOzxicj4NCiZndDsgKzxicj4NCiZndDsgK8OCIMOCIMOCJm5ic3A7IHVpbnQ4X3Qg ZGRyX3ZhbDs8YnI+DQomZ3Q7ICvDgiDDgiDDgiZuYnNwOyB1aW50OF90IHBvcnRfdmFsOzxicj4N CiZndDsgK8OCIMOCIMOCJm5ic3A7IGJvb2wgZW5hYmxlZDs8YnI+DQo8YnI+DQpXaGF0IGlzICdl bmFibGVkJyBmb3I/PGJyPg0KPGJyPg0KJmd0OyArPGJyPg0KJmd0OyArfTs8YnI+DQomZ3Q7ICs8 YnI+DQomZ3Q7ICsjZW5kaWYgLyogQVZSX0dQSU9fSCAqLzxicj4NCiZndDsgLS08YnI+DQomZ3Q7 IDIuMTcuMTxicj4NCjxicj4NClJlZ2FyZHMsPGJyPg0KPGJyPg0KUGhpbC48YnI+DQo8L2Rpdj4N Cjwvc3Bhbj48L2ZvbnQ+PC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== --_000_DM6PR16MB247387BA8035F7591182CA51E60E0DM6PR16MB2473namp_--