summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordianlujitao <dianlujitao@lineageos.org>2020-02-08 13:59:30 +0800
committerMichael Bestas <mkbestas@lineageos.org>2020-05-01 18:21:37 +0300
commit1a1279a83fd39034a3fdca21ed9064a4cd38d6b9 (patch)
tree060860ef4c95ab6dbd19739715d5058425b0ff75
parente8636ad7de158ecd66fc79700a39fb1058d1f917 (diff)
input: touchscreen: Import synaptics_dsx_force driver and firmware
Change-Id: I40f2a859ab86548a7da140cf2fc80de4640aacbf
-rw-r--r--drivers/input/touchscreen/Kconfig1
-rw-r--r--drivers/input/touchscreen/Makefile1
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/Kconfig124
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/Makefile17
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_active_pen.c630
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_core.c6105
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_core.h553
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_fw_update.c5506
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_gesture.c2305
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_i2c.c1106
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_proximity.c692
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_rmi_dev.c1058
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_rmi_hid_i2c.c1004
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_spi.c710
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_test_reporting.c8327
-rw-r--r--drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_video.c416
-rw-r--r--firmware/Makefile2
-rw-r--r--firmware/synaptics_jdi_3330_c8.fw.ihex8583
-rw-r--r--firmware/synaptics_jdi_3331_c8.fw.ihex8624
-rw-r--r--firmware/synaptics_sharp_4322_c8.fw.ihex8034
-rw-r--r--include/linux/input/synaptics_dsx.h103
21 files changed, 53900 insertions, 1 deletions
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index f6880aa6506f..4164678c225d 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -12,6 +12,7 @@ menuconfig INPUT_TOUCHSCREEN
if INPUT_TOUCHSCREEN
source "drivers/input/touchscreen/synaptics_dsx/Kconfig"
+source "drivers/input/touchscreen/synaptics_dsx_force/Kconfig"
# HMI_L8867_A01
source "drivers/input/touchscreen/nvt_touch_a/Kconfig"
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index 2ff3d100e7b5..5102c5ca1063 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -71,6 +71,7 @@ obj-$(CONFIG_TOUCHSCREEN_SUN4I) += sun4i-ts.o
obj-$(CONFIG_TOUCHSCREEN_SUR40) += sur40.o
obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_v21) += synaptics_dsx/
obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_TCM) += synaptics_tcm/
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FORCE) += synaptics_dsx_force/
obj-$(CONFIG_TOUCHSCREEN_NVT_D2S) += nvt_touch_d2s/
obj-$(CONFIG_TOUCHSCREEN_FOCAL_FT8719) += focal_ft8719/
obj-$(CONFIG_TOUCHSCREEN_NVT_A) += nvt_touch_a/
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/Kconfig b/drivers/input/touchscreen/synaptics_dsx_force/Kconfig
new file mode 100644
index 000000000000..b34228f5c1f9
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/Kconfig
@@ -0,0 +1,124 @@
+#
+# Synaptics DSX touchscreen driver configuration
+#
+menuconfig TOUCHSCREEN_SYNAPTICS_DSX_FORCE
+ bool "Synaptics DSX touchscreen"
+ default y
+ help
+ Say Y here if you have a Synaptics DSX touchscreen connected
+ to your system.
+
+ If unsure, say N.
+
+if TOUCHSCREEN_SYNAPTICS_DSX_FORCE
+
+choice
+ default TOUCHSCREEN_SYNAPTICS_DSX_I2C_FORCE
+ prompt "Synaptics DSX bus interface"
+config TOUCHSCREEN_SYNAPTICS_DSX_I2C_FORCE
+ bool "RMI over I2C"
+ depends on I2C
+config TOUCHSCREEN_SYNAPTICS_DSX_SPI_FORCE
+ bool "RMI over SPI"
+ depends on SPI_MASTER
+config TOUCHSCREEN_SYNAPTICS_DSX_RMI_HID_I2C_FORCE
+ bool "HID over I2C"
+ depends on I2C
+endchoice
+
+config TOUCHSCREEN_SYNAPTICS_DSX_CORE_FORCE
+ tristate "Synaptics DSX core driver module"
+ depends on I2C || SPI_MASTER
+ help
+ Say Y here to enable basic touch reporting functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_dsx_core.
+
+config TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_FORCE
+ tristate "Synaptics DSX RMI device module"
+ depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_FORCE
+ help
+ Say Y here to enable support for direct RMI register access.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_dsx_rmi_dev.
+
+config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_FORCE
+ tristate "Synaptics DSX firmware update module"
+ depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_FORCE
+ help
+ Say Y here to enable support for doing firmware update.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_dsx_fw_update.
+
+config TOUCHSCREEN_SYNAPTICS_DSX_TEST_REPORTING_FORCE
+ tristate "Synaptics DSX test reporting module"
+ depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_FORCE
+ help
+ Say Y here to enable support for retrieving production test reports.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_dsx_test_reporting.
+
+config TOUCHSCREEN_SYNAPTICS_DSX_PROXIMITY_FORCE
+ tristate "Synaptics DSX proximity module"
+ depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_FORCE
+ help
+ Say Y here to enable support for proximity functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_dsx_proximity.
+
+config TOUCHSCREEN_SYNAPTICS_DSX_ACTIVE_PEN_FORCE
+ tristate "Synaptics DSX active pen module"
+ depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_FORCE
+ help
+ Say Y here to enable support for active pen functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_dsx_active_pen.
+
+config TOUCHSCREEN_SYNAPTICS_DSX_GESTURE_FORCE
+ tristate "Synaptics DSX user defined gesture module"
+ depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_FORCE
+ help
+ Say Y here to enable support for user defined gesture functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_dsx_gesture.
+
+config TOUCHSCREEN_SYNAPTICS_DSX_VIDEO_FORCE
+ tristate "Synaptics DSX video module"
+ depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_FORCE
+ help
+ Say Y here to enable support for video communication functionality.
+
+ If unsure, say N.
+
+ To compile this driver as a module, choose M here: the
+ module will be called synaptics_dsx_video.
+
+config TOUCH_DEBUG_FS
+ bool "touch debugfs suport"
+ default n
+ depends on DEBUG_FS
+ help
+ Say Y here to enable support for touch debugfs.
+
+endif
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/Makefile b/drivers/input/touchscreen/synaptics_dsx_force/Makefile
new file mode 100644
index 000000000000..f613ea961569
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/Makefile
@@ -0,0 +1,17 @@
+#
+# Makefile for the Synaptics DSX touchscreen driver.
+#
+
+# Each configuration option enables a list of files.
+
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_I2C_FORCE) += synaptics_dsx_i2c.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_SPI_FORCE) += synaptics_dsx_spi.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_HID_I2C_FORCE) += synaptics_dsx_rmi_hid_i2c.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_FORCE) += synaptics_dsx_core.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_FORCE) += synaptics_dsx_rmi_dev.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_FORCE) += synaptics_dsx_fw_update.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_TEST_REPORTING_FORCE) += synaptics_dsx_test_reporting.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_PROXIMITY_FORCE) += synaptics_dsx_proximity.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_ACTIVE_PEN_FORCE) += synaptics_dsx_active_pen.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_GESTURE_FORCE) += synaptics_dsx_gesture.o
+obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_VIDEO_FORCE) += synaptics_dsx_video.o
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_active_pen.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_active_pen.c
new file mode 100644
index 000000000000..825b0f36e542
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_active_pen.c
@@ -0,0 +1,630 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+
+#define APEN_PHYS_NAME "synaptics_dsx/active_pen"
+
+#define ACTIVE_PEN_MAX_PRESSURE_16BIT 65535
+#define ACTIVE_PEN_MAX_PRESSURE_8BIT 255
+
+struct synaptics_rmi4_f12_query_8 {
+ union {
+ struct {
+ unsigned char size_of_query9;
+ struct {
+ unsigned char data0_is_present:1;
+ unsigned char data1_is_present:1;
+ unsigned char data2_is_present:1;
+ unsigned char data3_is_present:1;
+ unsigned char data4_is_present:1;
+ unsigned char data5_is_present:1;
+ unsigned char data6_is_present:1;
+ unsigned char data7_is_present:1;
+ } __packed;
+ };
+ unsigned char data[2];
+ };
+};
+
+struct apen_data_8b_pressure {
+ union {
+ struct {
+ unsigned char status_pen:1;
+ unsigned char status_invert:1;
+ unsigned char status_barrel:1;
+ unsigned char status_reserved:5;
+ unsigned char x_lsb;
+ unsigned char x_msb;
+ unsigned char y_lsb;
+ unsigned char y_msb;
+ unsigned char pressure_msb;
+ unsigned char battery_state;
+ unsigned char pen_id_0_7;
+ unsigned char pen_id_8_15;
+ unsigned char pen_id_16_23;
+ unsigned char pen_id_24_31;
+ } __packed;
+ unsigned char data[11];
+ };
+};
+
+struct apen_data {
+ union {
+ struct {
+ unsigned char status_pen:1;
+ unsigned char status_invert:1;
+ unsigned char status_barrel:1;
+ unsigned char status_reserved:5;
+ unsigned char x_lsb;
+ unsigned char x_msb;
+ unsigned char y_lsb;
+ unsigned char y_msb;
+ unsigned char pressure_lsb;
+ unsigned char pressure_msb;
+ unsigned char battery_state;
+ unsigned char pen_id_0_7;
+ unsigned char pen_id_8_15;
+ unsigned char pen_id_16_23;
+ unsigned char pen_id_24_31;
+ } __packed;
+ unsigned char data[12];
+ };
+};
+
+struct synaptics_rmi4_apen_handle {
+ bool apen_present;
+ unsigned char intr_mask;
+ unsigned char battery_state;
+ unsigned short query_base_addr;
+ unsigned short control_base_addr;
+ unsigned short data_base_addr;
+ unsigned short command_base_addr;
+ unsigned short apen_data_addr;
+ unsigned short max_pressure;
+ unsigned int pen_id;
+ struct input_dev *apen_dev;
+ struct apen_data *apen_data;
+ struct synaptics_rmi4_data *rmi4_data;
+};
+
+static struct synaptics_rmi4_apen_handle *apen;
+
+DECLARE_COMPLETION(apen_remove_complete);
+
+static void apen_lift(void)
+{
+ input_report_key(apen->apen_dev, BTN_TOUCH, 0);
+ input_report_key(apen->apen_dev, BTN_TOOL_PEN, 0);
+ input_report_key(apen->apen_dev, BTN_TOOL_RUBBER, 0);
+ input_sync(apen->apen_dev);
+ apen->apen_present = false;
+
+ return;
+}
+
+static void apen_report(void)
+{
+ int retval;
+ int x;
+ int y;
+ int pressure;
+ static int invert = -1;
+ struct apen_data_8b_pressure *apen_data_8b;
+ struct synaptics_rmi4_data *rmi4_data = apen->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ apen->apen_data_addr,
+ apen->apen_data->data,
+ sizeof(apen->apen_data->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read active pen data\n",
+ __func__);
+ return;
+ }
+
+ if (apen->apen_data->status_pen == 0) {
+ if (apen->apen_present)
+ apen_lift();
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: No active pen data\n",
+ __func__);
+
+ return;
+ }
+
+ x = (apen->apen_data->x_msb << 8) | (apen->apen_data->x_lsb);
+ y = (apen->apen_data->y_msb << 8) | (apen->apen_data->y_lsb);
+
+ if ((x == -1) && (y == -1)) {
+ if (apen->apen_present)
+ apen_lift();
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Active pen in range but no valid x & y\n",
+ __func__);
+
+ return;
+ }
+
+ if (!apen->apen_present)
+ invert = -1;
+
+ if (invert != -1 && invert != apen->apen_data->status_invert)
+ apen_lift();
+
+ invert = apen->apen_data->status_invert;
+
+ if (apen->max_pressure == ACTIVE_PEN_MAX_PRESSURE_16BIT) {
+ pressure = (apen->apen_data->pressure_msb << 8) |
+ apen->apen_data->pressure_lsb;
+ apen->battery_state = apen->apen_data->battery_state;
+ apen->pen_id = (apen->apen_data->pen_id_24_31 << 24) |
+ (apen->apen_data->pen_id_16_23 << 16) |
+ (apen->apen_data->pen_id_8_15 << 8) |
+ apen->apen_data->pen_id_0_7;
+ } else {
+ apen_data_8b = (struct apen_data_8b_pressure *)apen->apen_data;
+ pressure = apen_data_8b->pressure_msb;
+ apen->battery_state = apen_data_8b->battery_state;
+ apen->pen_id = (apen_data_8b->pen_id_24_31 << 24) |
+ (apen_data_8b->pen_id_16_23 << 16) |
+ (apen_data_8b->pen_id_8_15 << 8) |
+ apen_data_8b->pen_id_0_7;
+ }
+
+ input_report_key(apen->apen_dev, BTN_TOUCH, pressure > 0 ? 1 : 0);
+ input_report_key(apen->apen_dev,
+ apen->apen_data->status_invert > 0 ?
+ BTN_TOOL_RUBBER : BTN_TOOL_PEN, 1);
+ input_report_key(apen->apen_dev,
+ BTN_STYLUS, apen->apen_data->status_barrel > 0 ?
+ 1 : 0);
+ input_report_abs(apen->apen_dev, ABS_X, x);
+ input_report_abs(apen->apen_dev, ABS_Y, y);
+ input_report_abs(apen->apen_dev, ABS_PRESSURE, pressure);
+
+ input_sync(apen->apen_dev);
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Active pen: "
+ "status = %d, "
+ "invert = %d, "
+ "barrel = %d, "
+ "x = %d, "
+ "y = %d, "
+ "pressure = %d\n",
+ __func__,
+ apen->apen_data->status_pen,
+ apen->apen_data->status_invert,
+ apen->apen_data->status_barrel,
+ x, y, pressure);
+
+ apen->apen_present = true;
+
+ return;
+}
+
+static void apen_set_params(void)
+{
+ input_set_abs_params(apen->apen_dev, ABS_X, 0,
+ apen->rmi4_data->sensor_max_x, 0, 0);
+ input_set_abs_params(apen->apen_dev, ABS_Y, 0,
+ apen->rmi4_data->sensor_max_y, 0, 0);
+ input_set_abs_params(apen->apen_dev, ABS_PRESSURE, 0,
+ apen->max_pressure, 0, 0);
+
+ return;
+}
+
+static int apen_pressure(struct synaptics_rmi4_f12_query_8 *query_8)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char data_reg_presence;
+ unsigned char size_of_query_9;
+ unsigned char *query_9;
+ unsigned char *data_desc;
+ struct synaptics_rmi4_data *rmi4_data = apen->rmi4_data;
+
+ data_reg_presence = query_8->data[1];
+
+ size_of_query_9 = query_8->size_of_query9;
+ query_9 = kmalloc(size_of_query_9, GFP_KERNEL);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ apen->query_base_addr + 9,
+ query_9,
+ size_of_query_9);
+ if (retval < 0)
+ goto exit;
+
+ data_desc = query_9;
+
+ for (ii = 0; ii < 6; ii++) {
+ if (!(data_reg_presence & (1 << ii)))
+ continue; /* The data register is not present */
+ data_desc++; /* Jump over the size entry */
+ while (*data_desc & (1 << 7))
+ data_desc++;
+ data_desc++; /* Go to the next descriptor */
+ }
+
+ data_desc++; /* Jump over the size entry */
+ /* Check for the presence of subpackets 1 and 2 */
+ if ((*data_desc & (3 << 1)) == (3 << 1))
+ apen->max_pressure = ACTIVE_PEN_MAX_PRESSURE_16BIT;
+ else
+ apen->max_pressure = ACTIVE_PEN_MAX_PRESSURE_8BIT;
+
+exit:
+ kfree(query_9);
+
+ return retval;
+}
+
+static int apen_reg_init(void)
+{
+ int retval;
+ unsigned char data_offset;
+ unsigned char size_of_query8;
+ struct synaptics_rmi4_f12_query_8 query_8;
+ struct synaptics_rmi4_data *rmi4_data = apen->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ apen->query_base_addr + 7,
+ &size_of_query8,
+ sizeof(size_of_query8));
+ if (retval < 0)
+ return retval;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ apen->query_base_addr + 8,
+ query_8.data,
+ sizeof(query_8.data));
+ if (retval < 0)
+ return retval;
+
+ if ((size_of_query8 >= 2) && (query_8.data6_is_present)) {
+ data_offset = query_8.data0_is_present +
+ query_8.data1_is_present +
+ query_8.data2_is_present +
+ query_8.data3_is_present +
+ query_8.data4_is_present +
+ query_8.data5_is_present;
+ apen->apen_data_addr = apen->data_base_addr + data_offset;
+ retval = apen_pressure(&query_8);
+ if (retval < 0)
+ return retval;
+ } else {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Active pen support unavailable\n",
+ __func__);
+ retval = -ENODEV;
+ }
+
+ return retval;
+}
+
+static int apen_scan_pdt(void)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char page;
+ unsigned char intr_count = 0;
+ unsigned char intr_off;
+ unsigned char intr_src;
+ unsigned short addr;
+ struct synaptics_rmi4_fn_desc fd;
+ struct synaptics_rmi4_data *rmi4_data = apen->rmi4_data;
+
+ for (page = 0; page < PAGES_TO_SERVICE; page++) {
+ for (addr = PDT_START; addr > PDT_END; addr -= PDT_ENTRY_SIZE) {
+ addr |= (page << 8);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ addr,
+ (unsigned char *)&fd,
+ sizeof(fd));
+ if (retval < 0)
+ return retval;
+
+ addr &= ~(MASK_8BIT << 8);
+
+ if (fd.fn_number) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Found F%02x\n",
+ __func__, fd.fn_number);
+ switch (fd.fn_number) {
+ case SYNAPTICS_RMI4_F12:
+ goto f12_found;
+ break;
+ }
+ } else {
+ break;
+ }
+
+ intr_count += fd.intr_src_count;
+ }
+ }
+
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to find F12\n",
+ __func__);
+ return -EINVAL;
+
+f12_found:
+ apen->query_base_addr = fd.query_base_addr | (page << 8);
+ apen->control_base_addr = fd.ctrl_base_addr | (page << 8);
+ apen->data_base_addr = fd.data_base_addr | (page << 8);
+ apen->command_base_addr = fd.cmd_base_addr | (page << 8);
+
+ retval = apen_reg_init();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to initialize active pen registers\n",
+ __func__);
+ return retval;
+ }
+
+ apen->intr_mask = 0;
+ intr_src = fd.intr_src_count;
+ intr_off = intr_count % 8;
+ for (ii = intr_off;
+ ii < (intr_src + intr_off);
+ ii++) {
+ apen->intr_mask |= 1 << ii;
+ }
+
+ rmi4_data->intr_mask[0] |= apen->intr_mask;
+
+ addr = rmi4_data->f01_ctrl_base_addr + 1;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ addr,
+ &(rmi4_data->intr_mask[0]),
+ sizeof(rmi4_data->intr_mask[0]));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set interrupt enable bit\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static void synaptics_rmi4_apen_attn(struct synaptics_rmi4_data *rmi4_data,
+ unsigned char intr_mask)
+{
+ if (!apen)
+ return;
+
+ if (apen->intr_mask & intr_mask)
+ apen_report();
+
+ return;
+}
+
+static int synaptics_rmi4_apen_init(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+
+ if (apen) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Handle already exists\n",
+ __func__);
+ return 0;
+ }
+
+ apen = kzalloc(sizeof(*apen), GFP_KERNEL);
+ if (!apen) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for apen\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ apen->apen_data = kzalloc(sizeof(*(apen->apen_data)), GFP_KERNEL);
+ if (!apen->apen_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for apen_data\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit_free_apen;
+ }
+
+ apen->rmi4_data = rmi4_data;
+
+ retval = apen_scan_pdt();
+ if (retval < 0)
+ goto exit_free_apen_data;
+
+ apen->apen_dev = input_allocate_device();
+ if (apen->apen_dev == NULL) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to allocate active pen device\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit_free_apen_data;
+ }
+
+ apen->apen_dev->name = ACTIVE_PEN_DRIVER_NAME;
+ apen->apen_dev->phys = APEN_PHYS_NAME;
+ apen->apen_dev->id.product = SYNAPTICS_DSX_DRIVER_PRODUCT;
+ apen->apen_dev->id.version = SYNAPTICS_DSX_DRIVER_VERSION;
+ apen->apen_dev->dev.parent = rmi4_data->pdev->dev.parent;
+ input_set_drvdata(apen->apen_dev, rmi4_data);
+
+ set_bit(EV_KEY, apen->apen_dev->evbit);
+ set_bit(EV_ABS, apen->apen_dev->evbit);
+ set_bit(BTN_TOUCH, apen->apen_dev->keybit);
+ set_bit(BTN_TOOL_PEN, apen->apen_dev->keybit);
+ set_bit(BTN_TOOL_RUBBER, apen->apen_dev->keybit);
+ set_bit(BTN_STYLUS, apen->apen_dev->keybit);
+#ifdef INPUT_PROP_DIRECT
+ set_bit(INPUT_PROP_DIRECT, apen->apen_dev->propbit);
+#endif
+
+ apen_set_params();
+
+ retval = input_register_device(apen->apen_dev);
+ if (retval) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to register active pen device\n",
+ __func__);
+ goto exit_free_input_device;
+ }
+
+ return 0;
+
+exit_free_input_device:
+ input_free_device(apen->apen_dev);
+
+exit_free_apen_data:
+ kfree(apen->apen_data);
+
+exit_free_apen:
+ kfree(apen);
+ apen = NULL;
+
+exit:
+ return retval;
+}
+
+static void synaptics_rmi4_apen_remove(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!apen)
+ goto exit;
+
+ input_unregister_device(apen->apen_dev);
+ kfree(apen->apen_data);
+ kfree(apen);
+ apen = NULL;
+
+exit:
+ complete(&apen_remove_complete);
+
+ return;
+}
+
+static void synaptics_rmi4_apen_reset(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!apen) {
+ synaptics_rmi4_apen_init(rmi4_data);
+ return;
+ }
+
+ apen_lift();
+
+ apen_scan_pdt();
+
+ return;
+}
+
+static void synaptics_rmi4_apen_reinit(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!apen)
+ return;
+
+ apen_lift();
+
+ return;
+}
+
+static void synaptics_rmi4_apen_e_suspend(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!apen)
+ return;
+
+ apen_lift();
+
+ return;
+}
+
+static void synaptics_rmi4_apen_suspend(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!apen)
+ return;
+
+ apen_lift();
+
+ return;
+}
+
+static struct synaptics_rmi4_exp_fn active_pen_module = {
+ .fn_type = RMI_ACTIVE_PEN,
+ .init = synaptics_rmi4_apen_init,
+ .remove = synaptics_rmi4_apen_remove,
+ .reset = synaptics_rmi4_apen_reset,
+ .reinit = synaptics_rmi4_apen_reinit,
+ .early_suspend = synaptics_rmi4_apen_e_suspend,
+ .suspend = synaptics_rmi4_apen_suspend,
+ .resume = NULL,
+ .late_resume = NULL,
+ .attn = synaptics_rmi4_apen_attn,
+};
+
+static int __init rmi4_active_pen_module_init(void)
+{
+ synaptics_rmi4_new_function_force(&active_pen_module, true);
+
+ return 0;
+}
+
+static void __exit rmi4_active_pen_module_exit(void)
+{
+ synaptics_rmi4_new_function_force(&active_pen_module, false);
+
+ wait_for_completion(&apen_remove_complete);
+
+ return;
+}
+
+module_init(rmi4_active_pen_module_init);
+module_exit(rmi4_active_pen_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX Active Pen Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_core.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_core.c
new file mode 100644
index 000000000000..b23534981541
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_core.c
@@ -0,0 +1,6105 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/gpio.h>
+#include <linux/platform_device.h>
+#include <linux/regulator/consumer.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+#ifdef KERNEL_ABOVE_2_6_38
+#include <linux/input/mt.h>
+#endif
+
+#if defined(CONFIG_SECURE_TOUCH)
+#include <linux/pm_runtime.h>
+#include <linux/errno.h>
+#endif
+
+#ifdef CONFIG_TOUCH_DEBUG_FS
+#include <linux/fs.h>
+#include <linux/debugfs.h>
+#include <linux/uaccess.h>
+#endif
+#include <linux/mdss_io_util.h>
+
+#define INPUT_PHYS_NAME "synaptics_dsx/touch_input"
+#define STYLUS_PHYS_NAME "synaptics_dsx/stylus"
+
+#define VIRTUAL_KEY_MAP_FILE_NAME "virtualkeys." PLATFORM_DRIVER_NAME
+
+#ifdef KERNEL_ABOVE_2_6_38
+#define TYPE_B_PROTOCOL
+#endif
+
+#define WAKEUP_GESTURE false
+
+
+#define REPORT_2D_Z
+#define REPORT_2D_W
+
+#define REPORT_2D_PRESSURE
+
+
+#define F12_DATA_15_WORKAROUND
+
+#define IGNORE_FN_INIT_FAILURE
+/*
+#define FB_READY_RESET
+#define FB_READY_WAIT_MS 100
+#define FB_READY_TIMEOUT_S 30
+*/
+#define RPT_TYPE (1 << 0)
+#define RPT_X_LSB (1 << 1)
+#define RPT_X_MSB (1 << 2)
+#define RPT_Y_LSB (1 << 3)
+#define RPT_Y_MSB (1 << 4)
+#define RPT_Z (1 << 5)
+#define RPT_WX (1 << 6)
+#define RPT_WY (1 << 7)
+#define RPT_DEFAULT (RPT_TYPE | RPT_X_LSB | RPT_X_MSB | RPT_Y_LSB | RPT_Y_MSB)
+
+#define REBUILD_WORK_DELAY_MS 500 /* ms */
+
+#define EXP_FN_WORK_DELAY_MS 500 /* ms */
+#define MAX_F11_TOUCH_WIDTH 15
+#define MAX_F12_TOUCH_WIDTH 255
+#define MAX_F12_TOUCH_PRESSURE 255
+
+#define CHECK_STATUS_TIMEOUT_MS 100
+
+#define F01_STD_QUERY_LEN 21
+#define F01_BUID_ID_OFFSET 18
+#define F01_PROD_ID_OFFSET 11
+
+#define STATUS_NO_ERROR 0x00
+#define STATUS_RESET_OCCURRED 0x01
+#define STATUS_INVALID_CONFIG 0x02
+#define STATUS_DEVICE_FAILURE 0x03
+#define STATUS_CONFIG_CRC_FAILURE 0x04
+#define STATUS_FIRMWARE_CRC_FAILURE 0x05
+#define STATUS_CRC_IN_PROGRESS 0x06
+
+#define NORMAL_OPERATION (0 << 0)
+#define SENSOR_SLEEP (1 << 0)
+#define NO_SLEEP_OFF (0 << 2)
+#define NO_SLEEP_ON (1 << 2)
+#define CONFIGURED (1 << 7)
+
+#define F11_CONTINUOUS_MODE 0x00
+#define F11_WAKEUP_GESTURE_MODE 0x04
+#define F12_CONTINUOUS_MODE 0x00
+#define F12_WAKEUP_GESTURE_MODE 0x02
+#define F12_UDG_DETECT 0x0f
+#define F12_HOMEKEY_DETECT 0x0c
+
+#define DOUBLE_TAP 0x01
+#define HOMEKEY_WAKEUP 0x80
+
+#define INPUT_EVENT_START 0
+#define INPUT_EVENT_SENSITIVE_MODE_OFF 0
+#define INPUT_EVENT_SENSITIVE_MODE_ON 1
+#define INPUT_EVENT_STYLUS_MODE_OFF 2
+#define INPUT_EVENT_STYLUS_MODE_ON 3
+#define INPUT_EVENT_WAKUP_MODE_OFF 4
+#define INPUT_EVENT_WAKUP_MODE_ON 5
+#define INPUT_EVENT_COVER_MODE_OFF 6
+#define INPUT_EVENT_COVER_MODE_ON 7
+#define INPUT_EVENT_POCKET_MODE_OFF 8
+#define INPUT_EVENT_POCKET_MODE_ON 9
+#define INPUT_EVENT_END 9
+
+#define BUTTON_WG_EN 1
+
+static int synaptics_rmi4_check_status(struct synaptics_rmi4_data *rmi4_data,
+ bool *was_in_bl_mode);
+static int synaptics_rmi4_free_fingers(struct synaptics_rmi4_data *rmi4_data);
+static int synaptics_rmi4_reinit_device(struct synaptics_rmi4_data *rmi4_data);
+static int synaptics_rmi4_reset_device(struct synaptics_rmi4_data *rmi4_data,
+ bool rebuild);
+static void synaptics_rmi4_sleep_enable(struct synaptics_rmi4_data *rmi4_data,
+ bool enable);
+static void synaptics_rmi4_wakeup_gesture(struct synaptics_rmi4_data *rmi4_data,
+ bool enable);
+static int synaptics_rmi4_irq_enable(struct synaptics_rmi4_data *rmi4_data,
+ bool enable, bool attn_only);
+static void synaptics_rmi4_wakeup_reconfigure(struct synaptics_rmi4_data *rmi4_data,
+ bool enable);
+
+#if defined(CONFIG_SECURE_TOUCH)
+static ssize_t synaptics_secure_touch_enable_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_secure_touch_enable_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t synaptics_secure_touch_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+#endif
+
+#ifdef CONFIG_FB
+static int synaptics_rmi4_fb_notifier_cb(struct notifier_block *self,
+ unsigned long event, void *data);
+static int synaptics_rmi4_fb_notifier_cb_tddi(struct notifier_block *self,
+ unsigned long event, void *data);
+#endif
+
+#define DISP_REG_VDD (1<<0)
+#define DISP_REG_LAB (1<<1)
+#define DISP_REG_IBB (1<<2)
+#define DISP_REG_ALL (DISP_REG_VDD | DISP_REG_LAB | DISP_REG_IBB)
+
+static void mdss_regulator_ctrl(struct synaptics_rmi4_data *rmi4_data, unsigned int flag, bool enable);
+static void mdss_reset_ctrl(const struct synaptics_dsx_board_data *bdata, bool on);
+static void mdss_reset_action(const struct synaptics_dsx_board_data *bdata);
+
+#ifdef CONFIG_HAS_EARLYSUSPEND
+#ifndef CONFIG_FB
+#define USE_EARLYSUSPEND
+#endif
+#endif
+
+#ifdef USE_EARLYSUSPEND
+static void synaptics_rmi4_early_suspend(struct early_suspend *h);
+
+static void synaptics_rmi4_late_resume(struct early_suspend *h);
+#endif
+static irqreturn_t synaptics_rmi4_irq(int irq, void *data);
+static int synaptics_rmi4_suspend(struct device *dev);
+static void synaptics_rmi4_pocketmode(struct synaptics_rmi4_data *rmi4_data, bool onoff);
+
+static int synaptics_rmi4_resume(struct device *dev);
+
+static ssize_t synaptics_rmi4_f01_reset_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t synaptics_rmi4_f01_productinfo_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_rmi4_f01_buildid_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_rmi4_f01_flashprog_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_rmi4_0dbutton_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_rmi4_0dbutton_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t synaptics_rmi4_suspend_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t synaptics_rmi4_wake_gesture_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_rmi4_wake_gesture_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t synaptics_rmi4_irq_enable_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_rmi4_irq_enable_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t synaptics_rmi4_pocketmode_on_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_rmi4_pocketmode_on_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t synaptics_rmi4_panel_color_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_rmi4_panel_vendor_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_rmi4_virtual_key_map_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf);
+
+struct synaptics_rmi4_f01_device_status {
+ union {
+ struct {
+ unsigned char status_code:4;
+ unsigned char reserved:2;
+ unsigned char flash_prog:1;
+ unsigned char unconfigured:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct synaptics_rmi4_f11_query_0_5 {
+ union {
+ struct {
+ /* query 0 */
+ unsigned char f11_query0_b0__2:3;
+ unsigned char has_query_9:1;
+ unsigned char has_query_11:1;
+ unsigned char has_query_12:1;
+ unsigned char has_query_27:1;
+ unsigned char has_query_28:1;
+
+ /* query 1 */
+ unsigned char num_of_fingers:3;
+ unsigned char has_rel:1;
+ unsigned char has_abs:1;
+ unsigned char has_gestures:1;
+ unsigned char has_sensitibity_adjust:1;
+ unsigned char f11_query1_b7:1;
+
+ /* query 2 */
+ unsigned char num_of_x_electrodes;
+
+ /* query 3 */
+ unsigned char num_of_y_electrodes;
+
+ /* query 4 */
+ unsigned char max_electrodes:7;
+ unsigned char f11_query4_b7:1;
+
+ /* query 5 */
+ unsigned char abs_data_size:2;
+ unsigned char has_anchored_finger:1;
+ unsigned char has_adj_hyst:1;
+ unsigned char has_dribble:1;
+ unsigned char has_bending_correction:1;
+ unsigned char has_large_object_suppression:1;
+ unsigned char has_jitter_filter:1;
+ } __packed;
+ unsigned char data[6];
+ };
+};
+
+struct synaptics_rmi4_f11_query_7_8 {
+ union {
+ struct {
+ /* query 7 */
+ unsigned char has_single_tap:1;
+ unsigned char has_tap_and_hold:1;
+ unsigned char has_double_tap:1;
+ unsigned char has_early_tap:1;
+ unsigned char has_flick:1;
+ unsigned char has_press:1;
+ unsigned char has_pinch:1;
+ unsigned char has_chiral_scroll:1;
+
+ /* query 8 */
+ unsigned char has_palm_detect:1;
+ unsigned char has_rotate:1;
+ unsigned char has_touch_shapes:1;
+ unsigned char has_scroll_zones:1;
+ unsigned char individual_scroll_zones:1;
+ unsigned char has_multi_finger_scroll:1;
+ unsigned char has_multi_finger_scroll_edge_motion:1;
+ unsigned char has_multi_finger_scroll_inertia:1;
+ } __packed;
+ unsigned char data[2];
+ };
+};
+
+struct synaptics_rmi4_f11_query_9 {
+ union {
+ struct {
+ unsigned char has_pen:1;
+ unsigned char has_proximity:1;
+ unsigned char has_large_object_sensitivity:1;
+ unsigned char has_suppress_on_large_object_detect:1;
+ unsigned char has_two_pen_thresholds:1;
+ unsigned char has_contact_geometry:1;
+ unsigned char has_pen_hover_discrimination:1;
+ unsigned char has_pen_hover_and_edge_filters:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct synaptics_rmi4_f11_query_12 {
+ union {
+ struct {
+ unsigned char has_small_object_detection:1;
+ unsigned char has_small_object_detection_tuning:1;
+ unsigned char has_8bit_w:1;
+ unsigned char has_2d_adjustable_mapping:1;
+ unsigned char has_general_information_2:1;
+ unsigned char has_physical_properties:1;
+ unsigned char has_finger_limit:1;
+ unsigned char has_linear_cofficient_2:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct synaptics_rmi4_f11_query_27 {
+ union {
+ struct {
+ unsigned char f11_query27_b0:1;
+ unsigned char has_pen_position_correction:1;
+ unsigned char has_pen_jitter_filter_coefficient:1;
+ unsigned char has_group_decomposition:1;
+ unsigned char has_wakeup_gesture:1;
+ unsigned char has_small_finger_correction:1;
+ unsigned char has_data_37:1;
+ unsigned char f11_query27_b7:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct synaptics_rmi4_f11_ctrl_6_9 {
+ union {
+ struct {
+ unsigned char sensor_max_x_pos_7_0;
+ unsigned char sensor_max_x_pos_11_8:4;
+ unsigned char f11_ctrl7_b4__7:4;
+ unsigned char sensor_max_y_pos_7_0;
+ unsigned char sensor_max_y_pos_11_8:4;
+ unsigned char f11_ctrl9_b4__7:4;
+ } __packed;
+ unsigned char data[4];
+ };
+};
+
+struct synaptics_rmi4_f11_data_1_5 {
+ union {
+ struct {
+ unsigned char x_position_11_4;
+ unsigned char y_position_11_4;
+ unsigned char x_position_3_0:4;
+ unsigned char y_position_3_0:4;
+ unsigned char wx:4;
+ unsigned char wy:4;
+ unsigned char z;
+ } __packed;
+ unsigned char data[5];
+ };
+};
+
+struct synaptics_rmi4_f12_query_5 {
+ union {
+ struct {
+ unsigned char size_of_query6;
+ struct {
+ unsigned char ctrl0_is_present:1;
+ unsigned char ctrl1_is_present:1;
+ unsigned char ctrl2_is_present:1;
+ unsigned char ctrl3_is_present:1;
+ unsigned char ctrl4_is_present:1;
+ unsigned char ctrl5_is_present:1;
+ unsigned char ctrl6_is_present:1;
+ unsigned char ctrl7_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl8_is_present:1;
+ unsigned char ctrl9_is_present:1;
+ unsigned char ctrl10_is_present:1;
+ unsigned char ctrl11_is_present:1;
+ unsigned char ctrl12_is_present:1;
+ unsigned char ctrl13_is_present:1;
+ unsigned char ctrl14_is_present:1;
+ unsigned char ctrl15_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl16_is_present:1;
+ unsigned char ctrl17_is_present:1;
+ unsigned char ctrl18_is_present:1;
+ unsigned char ctrl19_is_present:1;
+ unsigned char ctrl20_is_present:1;
+ unsigned char ctrl21_is_present:1;
+ unsigned char ctrl22_is_present:1;
+ unsigned char ctrl23_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl24_is_present:1;
+ unsigned char ctrl25_is_present:1;
+ unsigned char ctrl26_is_present:1;
+ unsigned char ctrl27_is_present:1;
+ unsigned char ctrl28_is_present:1;
+ unsigned char ctrl29_is_present:1;
+ unsigned char ctrl30_is_present:1;
+ unsigned char ctrl31_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl32_is_present:1;
+ unsigned char ctrl33_is_present:1;
+ unsigned char ctrl34_is_present:1;
+ unsigned char ctrl35_is_present:1;
+ unsigned char ctrl36_is_present:1;
+ unsigned char ctrl37_is_present:1;
+ unsigned char ctrl38_is_present:1;
+ unsigned char ctrl39_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl40_is_present:1;
+ unsigned char ctrl41_is_present:1;
+ unsigned char ctrl42_is_present:1;
+ unsigned char ctrl43_is_present:1;
+ unsigned char ctrl44_is_present:1;
+ unsigned char ctrl45_is_present:1;
+ unsigned char ctrl46_is_present:1;
+ unsigned char ctrl47_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl48_is_present:1;
+ unsigned char ctrl49_is_present:1;
+ unsigned char ctrl50_is_present:1;
+ unsigned char ctrl51_is_present:1;
+ unsigned char ctrl52_is_present:1;
+ unsigned char ctrl53_is_present:1;
+ unsigned char ctrl54_is_present:1;
+ unsigned char ctrl55_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl56_is_present:1;
+ unsigned char ctrl57_is_present:1;
+ unsigned char ctrl58_is_present:1;
+ unsigned char ctrl59_is_present:1;
+ unsigned char ctrl60_is_present:1;
+ unsigned char ctrl61_is_present:1;
+ unsigned char ctrl62_is_present:1;
+ unsigned char ctrl63_is_present:1;
+ } __packed;
+ };
+ unsigned char data[9];
+ };
+};
+
+struct synaptics_rmi4_f12_query_8 {
+ union {
+ struct {
+ unsigned char size_of_query9;
+ struct {
+ unsigned char data0_is_present:1;
+ unsigned char data1_is_present:1;
+ unsigned char data2_is_present:1;
+ unsigned char data3_is_present:1;
+ unsigned char data4_is_present:1;
+ unsigned char data5_is_present:1;
+ unsigned char data6_is_present:1;
+ unsigned char data7_is_present:1;
+ } __packed;
+ struct {
+ unsigned char data8_is_present:1;
+ unsigned char data9_is_present:1;
+ unsigned char data10_is_present:1;
+ unsigned char data11_is_present:1;
+ unsigned char data12_is_present:1;
+ unsigned char data13_is_present:1;
+ unsigned char data14_is_present:1;
+ unsigned char data15_is_present:1;
+ } __packed;
+ struct {
+ unsigned char data16_is_present:1;
+ unsigned char data17_is_present:1;
+ unsigned char data18_is_present:1;
+ unsigned char data19_is_present:1;
+ unsigned char data20_is_present:1;
+ unsigned char data21_is_present:1;
+ unsigned char data22_is_present:1;
+ unsigned char data23_is_present:1;
+ } __packed;
+ struct {
+ unsigned char data24_is_present:1;
+ unsigned char data25_is_present:1;
+ unsigned char data26_is_present:1;
+ unsigned char data27_is_present:1;
+ unsigned char data28_is_present:1;
+ unsigned char data29_is_present:1;
+ unsigned char data30_is_present:1;
+ unsigned char data31_is_present:1;
+ } __packed;
+ };
+ unsigned char data[5];
+ };
+};
+
+struct synaptics_rmi4_f12_ctrl_8 {
+ union {
+ struct {
+ unsigned char max_x_coord_lsb;
+ unsigned char max_x_coord_msb;
+ unsigned char max_y_coord_lsb;
+ unsigned char max_y_coord_msb;
+ unsigned char rx_pitch_lsb;
+ unsigned char rx_pitch_msb;
+ unsigned char tx_pitch_lsb;
+ unsigned char tx_pitch_msb;
+ unsigned char low_rx_clip;
+ unsigned char high_rx_clip;
+ unsigned char low_tx_clip;
+ unsigned char high_tx_clip;
+ unsigned char num_of_rx;
+ unsigned char num_of_tx;
+ };
+ unsigned char data[14];
+ };
+};
+
+struct synaptics_rmi4_f12_ctrl_23 {
+ union {
+ struct {
+ unsigned char finger_enable:1;
+ unsigned char active_stylus_enable:1;
+ unsigned char palm_enable:1;
+ unsigned char unclassified_object_enable:1;
+ unsigned char hovering_finger_enable:1;
+ unsigned char gloved_finger_enable:1;
+ unsigned char f12_ctr23_00_b6__7:2;
+ unsigned char max_reported_objects;
+ unsigned char f12_ctr23_02_b0:1;
+ unsigned char report_active_stylus_as_finger:1;
+ unsigned char report_palm_as_finger:1;
+ unsigned char report_unclassified_object_as_finger:1;
+ unsigned char report_hovering_finger_as_finger:1;
+ unsigned char report_gloved_finger_as_finger:1;
+ unsigned char report_narrow_object_swipe_as_finger:1;
+ unsigned char report_handedge_as_finger:1;
+ unsigned char cover_enable:1;
+ unsigned char stylus_enable:1;
+ unsigned char eraser_enable:1;
+ unsigned char small_object_enable:1;
+ unsigned char f12_ctr23_03_b4__7:4;
+ unsigned char report_cover_as_finger:1;
+ unsigned char report_stylus_as_finger:1;
+ unsigned char report_eraser_as_finger:1;
+ unsigned char report_small_object_as_finger:1;
+ unsigned char f12_ctr23_04_b4__7:4;
+ };
+ unsigned char data[5];
+ };
+};
+
+struct synaptics_rmi4_f12_ctrl_31 {
+ union {
+ struct {
+ unsigned char max_x_coord_lsb;
+ unsigned char max_x_coord_msb;
+ unsigned char max_y_coord_lsb;
+ unsigned char max_y_coord_msb;
+ unsigned char rx_pitch_lsb;
+ unsigned char rx_pitch_msb;
+ unsigned char rx_clip_low;
+ unsigned char rx_clip_high;
+ unsigned char wedge_clip_low;
+ unsigned char wedge_clip_high;
+ unsigned char num_of_p;
+ unsigned char num_of_q;
+ };
+ unsigned char data[12];
+ };
+};
+
+struct synaptics_rmi4_f12_ctrl_58 {
+ union {
+ struct {
+ unsigned char reporting_format;
+ unsigned char f12_ctr58_00_reserved;
+ unsigned char min_force_lsb;
+ unsigned char min_force_msb;
+ unsigned char max_force_lsb;
+ unsigned char max_force_msb;
+ unsigned char light_press_threshold_lsb;
+ unsigned char light_press_threshold_msb;
+ unsigned char light_press_hysteresis_lsb;
+ unsigned char light_press_hysteresis_msb;
+ unsigned char hard_press_threshold_lsb;
+ unsigned char hard_press_threshold_msb;
+ unsigned char hard_press_hysteresis_lsb;
+ unsigned char hard_press_hysteresis_msb;
+ };
+ unsigned char data[14];
+ };
+};
+
+struct synaptics_rmi4_f12_finger_data {
+ unsigned char object_type_and_status;
+ unsigned char x_lsb;
+ unsigned char x_msb;
+ unsigned char y_lsb;
+ unsigned char y_msb;
+#ifdef REPORT_2D_Z
+ unsigned char z;
+#endif
+#ifdef REPORT_2D_W
+ unsigned char wx;
+ unsigned char wy;
+#endif
+};
+
+struct synaptics_rmi4_f1a_query {
+ union {
+ struct {
+ unsigned char max_button_count:3;
+ unsigned char f1a_query0_b3__4:2;
+ unsigned char has_query4:1;
+ unsigned char has_query3:1;
+ unsigned char has_query2:1;
+ unsigned char has_general_control:1;
+ unsigned char has_interrupt_enable:1;
+ unsigned char has_multibutton_select:1;
+ unsigned char has_tx_rx_map:1;
+ unsigned char has_perbutton_threshold:1;
+ unsigned char has_release_threshold:1;
+ unsigned char has_strongestbtn_hysteresis:1;
+ unsigned char has_filter_strength:1;
+ } __packed;
+ unsigned char data[2];
+ };
+};
+
+struct synaptics_rmi4_f1a_query_4 {
+ union {
+ struct {
+ unsigned char has_ctrl19:1;
+ unsigned char f1a_query4_b1__4:4;
+ unsigned char has_ctrl24:1;
+ unsigned char f1a_query4_b6__7:2;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct synaptics_rmi4_f1a_control_0 {
+ union {
+ struct {
+ unsigned char multibutton_report:2;
+ unsigned char filter_mode:2;
+ unsigned char reserved:4;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct synaptics_rmi4_f1a_control {
+ struct synaptics_rmi4_f1a_control_0 general_control;
+ unsigned char button_int_enable;
+ unsigned char multi_button;
+ unsigned char *txrx_map;
+ unsigned char *button_threshold;
+ unsigned char button_release_threshold;
+ unsigned char strongest_button_hysteresis;
+ unsigned char filter_strength;
+};
+
+struct synaptics_rmi4_f1a_handle {
+ int button_bitmask_size;
+ unsigned char max_count;
+ unsigned char valid_button_count;
+ unsigned char *button_data_buffer;
+ unsigned char *button_map;
+ struct synaptics_rmi4_f1a_query button_query;
+ struct synaptics_rmi4_f1a_control button_control;
+};
+
+struct synaptics_rmi4_exp_fhandler {
+ struct synaptics_rmi4_exp_fn *exp_fn;
+ bool insert;
+ bool remove;
+ struct list_head link;
+};
+
+struct synaptics_rmi4_exp_fn_data {
+ bool initialized;
+ bool queue_work;
+ struct mutex mutex;
+ struct list_head list;
+ struct delayed_work work;
+ struct workqueue_struct *workqueue;
+ struct synaptics_rmi4_data *rmi4_data;
+};
+
+static struct synaptics_rmi4_exp_fn_data exp_data;
+
+static struct synaptics_dsx_button_map *vir_button_map;
+
+static struct device_attribute attrs[] = {
+ __ATTR(reset, S_IWUSR,
+ synaptics_rmi4_show_error,
+ synaptics_rmi4_f01_reset_store),
+ __ATTR(productinfo, S_IRUGO,
+ synaptics_rmi4_f01_productinfo_show,
+ synaptics_rmi4_store_error),
+ __ATTR(buildid, S_IRUGO,
+ synaptics_rmi4_f01_buildid_show,
+ synaptics_rmi4_store_error),
+ __ATTR(flashprog, S_IRUGO,
+ synaptics_rmi4_f01_flashprog_show,
+ synaptics_rmi4_store_error),
+ __ATTR(0dbutton, (S_IRUGO | S_IWUSR),
+ synaptics_rmi4_0dbutton_show,
+ synaptics_rmi4_0dbutton_store),
+ __ATTR(suspend, S_IWUSR,
+ synaptics_rmi4_show_error,
+ synaptics_rmi4_suspend_store),
+ __ATTR(wake_gesture, (S_IRUGO | S_IWUSR),
+ synaptics_rmi4_wake_gesture_show,
+ synaptics_rmi4_wake_gesture_store),
+ __ATTR(irq_enable, (S_IRUGO | S_IWUSR),
+ synaptics_rmi4_irq_enable_show,
+ synaptics_rmi4_irq_enable_store),
+ __ATTR(pocketmode_on, (S_IRUGO | S_IWUSR),
+ synaptics_rmi4_pocketmode_on_show,
+ synaptics_rmi4_pocketmode_on_store),
+};
+
+#if defined(CONFIG_SECURE_TOUCH)
+static DEVICE_ATTR(secure_touch_enable, (S_IRUGO | S_IWUSR | S_IWGRP), synaptics_secure_touch_enable_show, synaptics_secure_touch_enable_store);
+static DEVICE_ATTR(secure_touch, S_IRUGO , synaptics_secure_touch_show, NULL);
+
+static int synaptics_secure_touch_clk_prepare_enable(
+ struct synaptics_rmi4_data *rmi4_data)
+{
+ int ret;
+
+ ret = clk_prepare_enable(rmi4_data->iface_clk);
+ if (ret) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "error on clk_prepare_enable(iface_clk):%d\n", ret);
+ return ret;
+ }
+
+ ret = clk_prepare_enable(rmi4_data->core_clk);
+ if (ret) {
+ clk_disable_unprepare(rmi4_data->iface_clk);
+ dev_err(rmi4_data->pdev->dev.parent,
+ "error clk_prepare_enable(core_clk):%d\n", ret);
+ }
+ return ret;
+}
+
+static void synaptics_secure_touch_clk_disable_unprepare(
+ struct synaptics_rmi4_data *rmi4_data)
+{
+ clk_disable_unprepare(rmi4_data->core_clk);
+ clk_disable_unprepare(rmi4_data->iface_clk);
+}
+
+static void synaptics_secure_touch_init(struct synaptics_rmi4_data *data)
+{
+ int ret = 0;
+
+ data->st_initialized = 0;
+ init_completion(&data->st_powerdown);
+ init_completion(&data->st_irq_processed);
+ /* Get clocks */
+ data->core_clk = clk_get(data->pdev->dev.parent, "core_clk");
+ if (IS_ERR(data->core_clk)) {
+ ret = PTR_ERR(data->core_clk);
+ dev_err(data->pdev->dev.parent,
+ "%s: error on clk_get(core_clk):%d\n", __func__, ret);
+ return;
+ }
+
+ data->iface_clk = clk_get(data->pdev->dev.parent, "iface_clk");
+ if (IS_ERR(data->iface_clk)) {
+ ret = PTR_ERR(data->iface_clk);
+ dev_err(data->pdev->dev.parent,
+ "%s: error on clk_get(iface_clk)\n", __func__);
+ goto err_iface_clk;
+ }
+
+ data->st_initialized = 1;
+ return;
+
+err_iface_clk:
+ clk_put(data->core_clk);
+ data->core_clk = NULL;
+}
+static void synaptics_secure_touch_notify(struct synaptics_rmi4_data *data)
+{
+ sysfs_notify(&data->pdev->dev.parent->kobj, NULL, "secure_touch");
+}
+static irqreturn_t synaptics_filter_interrupt(struct synaptics_rmi4_data *data)
+{
+ if (atomic_read(&data->st_enabled)) {
+ if (atomic_cmpxchg(&data->st_pending_irqs, 0, 1) == 0) {
+ synaptics_secure_touch_notify(data);
+ wait_for_completion_interruptible(
+ &data->st_irq_processed);
+ }
+ return IRQ_HANDLED;
+ }
+ return IRQ_NONE;
+}
+static void synaptics_secure_touch_stop(
+ struct synaptics_rmi4_data *data,
+ int blocking)
+{
+ if (atomic_read(&data->st_enabled)) {
+ atomic_set(&data->st_pending_irqs, -1);
+ synaptics_secure_touch_notify(data);
+ if (blocking)
+ wait_for_completion_interruptible(&data->st_powerdown);
+ }
+}
+#else
+static void synaptics_secure_touch_init(struct synaptics_rmi4_data *data)
+{
+}
+static irqreturn_t synaptics_filter_interrupt(struct synaptics_rmi4_data *data)
+{
+ return IRQ_NONE;
+}
+static void synaptics_secure_touch_stop(
+ struct synaptics_rmi4_data *data,
+ int blocking)
+{
+}
+#endif
+
+#if defined(CONFIG_SECURE_TOUCH)
+static ssize_t synaptics_secure_touch_enable_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct synaptics_rmi4_data *data = dev_get_drvdata(dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%d", atomic_read(&data->st_enabled));
+}
+/*
+ * Accept only "0" and "1" valid values.
+ * "0" will reset the st_enabled flag, then wake up the reading process and
+ * the interrupt handler.
+ * The bus driver is notified via pm_runtime that it is not required to stay
+ * awake anymore.
+ * It will also make sure the queue of events is emptied in the controller,
+ * in case a touch happened in between the secure touch being disabled and
+ * the local ISR being ungated.
+ * "1" will set the st_enabled flag and clear the st_pending_irqs flag.
+ * The bus driver is requested via pm_runtime to stay awake.
+ */
+static ssize_t synaptics_secure_touch_enable_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct synaptics_rmi4_data *data = dev_get_drvdata(dev);
+ struct i2c_client *client = container_of(data->pdev->dev.parent, struct i2c_client, dev);
+ struct device *adapter = client->adapter->dev.parent;
+ unsigned long value;
+ int err = 0;
+
+ if (count > 2)
+ return -EINVAL;
+
+ err = kstrtoul(buf, 10, &value);
+ if (err != 0)
+ return err;
+
+ if (!data->st_initialized)
+ return -EIO;
+
+ err = count;
+
+ switch (value) {
+ case 0:
+ if (atomic_read(&data->st_enabled) == 0)
+ break;
+
+ synaptics_secure_touch_clk_disable_unprepare(data);
+ pm_runtime_put_sync(adapter);
+ atomic_set(&data->st_enabled, 0);
+ synaptics_secure_touch_notify(data);
+ complete(&data->st_irq_processed);
+ synaptics_rmi4_irq(data->irq, data);
+ complete(&data->st_powerdown);
+
+ break;
+ case 1:
+ if (atomic_read(&data->st_enabled)) {
+ err = -EBUSY;
+ break;
+ }
+
+ synchronize_irq(data->irq);
+ if (pm_runtime_get_sync(adapter) < 0) {
+ dev_err(data->pdev->dev.parent, "pm_runtime_get_sync failed\n");
+ err = -EIO;
+ break;
+ }
+
+ if (synaptics_secure_touch_clk_prepare_enable(data) < 0) {
+ pm_runtime_put_sync(adapter);
+ err = -EIO;
+ break;
+ }
+ reinit_completion(&data->st_powerdown);
+ reinit_completion(&data->st_irq_processed);
+ atomic_set(&data->st_enabled, 1);
+ atomic_set(&data->st_pending_irqs, 0);
+ break;
+ default:
+ dev_err(data->pdev->dev.parent,
+ "unsupported value: %lu\n", value);
+ err = -EINVAL;
+ break;
+ }
+ return err;
+}
+
+/*
+ * This function returns whether there are pending interrupts, or
+ * other error conditions that need to be signaled to the userspace library,
+ * according tot he following logic:
+ * - st_enabled is 0 if secure touch is not enabled, returning -EBADF
+ * - st_pending_irqs is -1 to signal that secure touch is in being stopped,
+ * returning -EINVAL
+ * - st_pending_irqs is 1 to signal that there is a pending irq, returning
+ * the value "1" to the sysfs read operation
+ * - st_pending_irqs is 0 (only remaining case left) if the pending interrupt
+ * has been processed, so the interrupt handler can be allowed to continue.
+ */
+static ssize_t synaptics_secure_touch_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct synaptics_rmi4_data *data = dev_get_drvdata(dev);
+ int val = 0;
+
+ if (atomic_read(&data->st_enabled) == 0)
+ return -EBADF;
+
+ if (atomic_cmpxchg(&data->st_pending_irqs, -1, 0) == -1)
+ return -EINVAL;
+
+ if (atomic_cmpxchg(&data->st_pending_irqs, 1, 0) == 1)
+ val = 1;
+ else
+ complete(&data->st_irq_processed);
+
+ return scnprintf(buf, PAGE_SIZE, "%u", val);
+
+}
+#endif
+
+static DEVICE_ATTR(panel_color, S_IRUSR, synaptics_rmi4_panel_color_show, NULL);
+static DEVICE_ATTR(panel_vendor, S_IRUSR, synaptics_rmi4_panel_vendor_show, NULL);
+
+static struct kobj_attribute virtual_key_map_attr = {
+ .attr = {
+ .name = VIRTUAL_KEY_MAP_FILE_NAME,
+ .mode = S_IRUGO,
+ },
+ .show = synaptics_rmi4_virtual_key_map_show,
+};
+
+static ssize_t synaptics_rmi4_f01_reset_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int reset;
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ if (sscanf(buf, "%u", &reset) != 1)
+ return -EINVAL;
+
+ if (reset != 1)
+ return -EINVAL;
+
+ retval = synaptics_rmi4_reset_device(rmi4_data, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to issue reset command, error = %d\n",
+ __func__, retval);
+ return retval;
+ }
+
+ return count;
+}
+
+static ssize_t synaptics_rmi4_f01_productinfo_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ return snprintf(buf, PAGE_SIZE, "0x%02x 0x%02x\n",
+ (rmi4_data->rmi4_mod_info.product_info[0]),
+ (rmi4_data->rmi4_mod_info.product_info[1]));
+}
+
+static ssize_t synaptics_rmi4_f01_buildid_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n",
+ rmi4_data->firmware_id);
+}
+
+static ssize_t synaptics_rmi4_f01_flashprog_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ struct synaptics_rmi4_f01_device_status device_status;
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_data_base_addr,
+ device_status.data,
+ sizeof(device_status.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read device status, error = %d\n",
+ __func__, retval);
+ return retval;
+ }
+
+ return snprintf(buf, PAGE_SIZE, "%u\n",
+ device_status.flash_prog);
+}
+
+static ssize_t synaptics_rmi4_0dbutton_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n",
+ rmi4_data->button_0d_enabled);
+}
+
+static ssize_t synaptics_rmi4_0dbutton_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ unsigned char ii;
+ unsigned char intr_enable;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+ struct synaptics_rmi4_device_info *rmi;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ input = input > 0 ? 1 : 0;
+
+ if (rmi4_data->button_0d_enabled == input)
+ return count;
+
+ if (list_empty(&rmi->support_fn_list))
+ return -ENODEV;
+
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->fn_number == SYNAPTICS_RMI4_F1A) {
+ ii = fhandler->intr_reg_num;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr + 1 + ii,
+ &intr_enable,
+ sizeof(intr_enable));
+ if (retval < 0)
+ return retval;
+
+ if (input == 1)
+ intr_enable |= fhandler->intr_mask;
+ else
+ intr_enable &= ~fhandler->intr_mask;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr + 1 + ii,
+ &intr_enable,
+ sizeof(intr_enable));
+ if (retval < 0)
+ return retval;
+ }
+ }
+
+ rmi4_data->button_0d_enabled = input;
+
+ return count;
+}
+
+static ssize_t synaptics_rmi4_suspend_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input == 1)
+ synaptics_rmi4_suspend(dev);
+ else if (input == 0)
+ synaptics_rmi4_resume(dev);
+ else
+ return -EINVAL;
+
+ return count;
+}
+
+static ssize_t synaptics_rmi4_wake_gesture_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n",
+ rmi4_data->enable_wakeup_gesture);
+}
+
+static ssize_t synaptics_rmi4_wake_gesture_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (bdata->cut_off_power) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Unable to switch wakeup gesture mode\n", __func__);
+ return count;
+ }
+
+ input = input > 0 ? 1 : 0;
+
+ if (rmi4_data->f11_wakeup_gesture || rmi4_data->f12_wakeup_gesture)
+ rmi4_data->enable_wakeup_gesture = input;
+
+ if (rmi4_data->suspend)
+ synaptics_rmi4_wakeup_reconfigure(rmi4_data, (bool)input);
+
+ return count;
+}
+
+static ssize_t synaptics_rmi4_irq_enable_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n",
+ rmi4_data->irq_enabled);
+}
+
+static ssize_t synaptics_rmi4_irq_enable_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+ if (input)
+ enable_irq(rmi4_data->irq);
+ else
+ disable_irq(rmi4_data->irq);
+
+ return count;
+}
+
+static ssize_t synaptics_rmi4_pocketmode_on_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n",
+ rmi4_data->pocketmode_on);
+}
+
+static ssize_t synaptics_rmi4_pocketmode_on_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+ if (input)
+ rmi4_data->pocketmode_on = true;
+ else
+ rmi4_data->pocketmode_on = false;
+ synaptics_rmi4_pocketmode(rmi4_data, rmi4_data->pocketmode_on);
+
+ return count;
+}
+
+static ssize_t synaptics_rmi4_panel_color_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ return snprintf(buf, PAGE_SIZE, "%c\n",
+ rmi4_data->lockdown_info[2]);
+}
+
+static ssize_t synaptics_rmi4_panel_vendor_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+
+ return snprintf(buf, PAGE_SIZE, "%c\n",
+ rmi4_data->lockdown_info[0]);
+}
+
+static ssize_t synaptics_rmi4_virtual_key_map_show(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
+{
+ int ii;
+ int cnt;
+ int count = 0;
+
+ for (ii = 0; ii < vir_button_map->nbuttons; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, "0x01:%d:%d:%d:%d:%d\n",
+ vir_button_map->map[ii * 5 + 0],
+ vir_button_map->map[ii * 5 + 1],
+ vir_button_map->map[ii * 5 + 2],
+ vir_button_map->map[ii * 5 + 3],
+ vir_button_map->map[ii * 5 + 4]);
+ buf += cnt;
+ count += cnt;
+ }
+
+ return count;
+}
+
+static int synaptics_rmi4_f11_abs_report(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler)
+{
+ int retval;
+ unsigned char touch_count = 0; /* number of touch points */
+ unsigned char reg_index;
+ unsigned char finger;
+ unsigned char fingers_supported;
+ unsigned char num_of_finger_status_regs;
+ unsigned char finger_shift;
+ unsigned char finger_status;
+ unsigned char finger_status_reg[3];
+ unsigned char detected_gestures;
+ unsigned short data_addr;
+ unsigned short data_offset;
+ int x;
+ int y;
+ int wx;
+ int wy;
+ int temp;
+ struct synaptics_rmi4_f11_data_1_5 data;
+ struct synaptics_rmi4_f11_extra_data *extra_data;
+
+ /*
+ * The number of finger status registers is determined by the
+ * maximum number of fingers supported - 2 bits per finger. So
+ * the number of finger status registers to read is:
+ * register_count = ceil(max_num_of_fingers / 4)
+ */
+ fingers_supported = fhandler->num_of_data_points;
+ num_of_finger_status_regs = (fingers_supported + 3) / 4;
+ data_addr = fhandler->full_addr.data_base;
+
+ extra_data = (struct synaptics_rmi4_f11_extra_data *)fhandler->extra;
+
+ if (rmi4_data->suspend && rmi4_data->wakeup_en) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_addr + extra_data->data38_offset,
+ &detected_gestures,
+ sizeof(detected_gestures));
+ if (retval < 0)
+ return 0;
+
+ if (detected_gestures) {
+ input_report_key(rmi4_data->input_dev, KEY_WAKEUP, 1);
+ input_sync(rmi4_data->input_dev);
+ input_report_key(rmi4_data->input_dev, KEY_WAKEUP, 0);
+ input_sync(rmi4_data->input_dev);
+ }
+
+ return 0;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_addr,
+ finger_status_reg,
+ num_of_finger_status_regs);
+ if (retval < 0)
+ return 0;
+
+ mutex_lock(&(rmi4_data->rmi4_report_mutex));
+
+ for (finger = 0; finger < fingers_supported; finger++) {
+ reg_index = finger / 4;
+ finger_shift = (finger % 4) * 2;
+ finger_status = (finger_status_reg[reg_index] >> finger_shift)
+ & MASK_2BIT;
+
+ /*
+ * Each 2-bit finger status field represents the following:
+ * 00 = finger not present
+ * 01 = finger present and data accurate
+ * 10 = finger present but data may be inaccurate
+ * 11 = reserved
+ */
+#ifdef TYPE_B_PROTOCOL
+ input_mt_slot(rmi4_data->input_dev, finger);
+ input_mt_report_slot_state(rmi4_data->input_dev,
+ MT_TOOL_FINGER, finger_status);
+#endif
+
+ if (finger_status) {
+ data_offset = data_addr +
+ num_of_finger_status_regs +
+ (finger * sizeof(data.data));
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_offset,
+ data.data,
+ sizeof(data.data));
+ if (retval < 0) {
+ touch_count = 0;
+ goto exit;
+ }
+
+ x = (data.x_position_11_4 << 4) | data.x_position_3_0;
+ y = (data.y_position_11_4 << 4) | data.y_position_3_0;
+ wx = data.wx;
+ wy = data.wy;
+
+ if (rmi4_data->hw_if->board_data->swap_axes) {
+ temp = x;
+ x = y;
+ y = temp;
+ temp = wx;
+ wx = wy;
+ wy = temp;
+ }
+
+ if (rmi4_data->hw_if->board_data->x_flip)
+ x = rmi4_data->sensor_max_x - x;
+ if (rmi4_data->hw_if->board_data->y_flip)
+ y = rmi4_data->sensor_max_y - y;
+
+ input_report_key(rmi4_data->input_dev,
+ BTN_TOUCH, 1);
+ input_report_key(rmi4_data->input_dev,
+ BTN_TOOL_FINGER, 1);
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_POSITION_X, x);
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_POSITION_Y, y);
+#ifdef REPORT_2D_W
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_TOUCH_MAJOR, max(wx, wy));
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_TOUCH_MINOR, min(wx, wy));
+#endif
+#ifndef TYPE_B_PROTOCOL
+ input_mt_sync(rmi4_data->input_dev);
+#endif
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Finger %d: "
+ "status = 0x%02x, "
+ "x = %d, "
+ "y = %d, "
+ "wx = %d, "
+ "wy = %d\n",
+ __func__, finger,
+ finger_status,
+ x, y, wx, wy);
+
+ touch_count++;
+ }
+ }
+
+ if (touch_count == 0) {
+ input_report_key(rmi4_data->input_dev,
+ BTN_TOUCH, 0);
+ input_report_key(rmi4_data->input_dev,
+ BTN_TOOL_FINGER, 0);
+#ifndef TYPE_B_PROTOCOL
+ input_mt_sync(rmi4_data->input_dev);
+#endif
+ }
+
+ input_sync(rmi4_data->input_dev);
+
+exit:
+ mutex_unlock(&(rmi4_data->rmi4_report_mutex));
+
+ return touch_count;
+}
+
+static int synaptics_rmi4_f12_abs_report(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler)
+{
+ int retval;
+ unsigned char touch_count = 0; /* number of touch points */
+ unsigned char index;
+ unsigned char finger;
+ unsigned char fingers_to_process;
+ unsigned char finger_status;
+ unsigned char size_of_2d_data;
+ unsigned char gesture_type;
+ unsigned short data_addr;
+ int x;
+ int y;
+ int wx;
+ int wy;
+ int temp;
+#if defined(REPORT_2D_PRESSURE) || defined(F51_DISCRETE_FORCE)
+ int pressure;
+#endif
+ int touchs;
+#ifdef REPORT_2D_PRESSURE
+ unsigned char f_fingers;
+ unsigned char f_lsb;
+ unsigned char f_msb;
+ unsigned char *f_data;
+#endif
+#ifdef F51_DISCRETE_FORCE
+ unsigned char force_level;
+#endif
+ struct synaptics_rmi4_f12_extra_data *extra_data;
+ struct synaptics_rmi4_f12_finger_data *data;
+ struct synaptics_rmi4_f12_finger_data *finger_data;
+ static unsigned char finger_presence;
+ static unsigned char stylus_presence;
+#ifdef F12_DATA_15_WORKAROUND
+ static unsigned char objects_already_present;
+#endif
+
+ if (rmi4_data->input_dev == NULL) {
+ dev_err(rmi4_data->pdev->dev.parent, "input_dev is NULL, do not report data\n");
+
+ return 0;
+ }
+
+ fingers_to_process = fhandler->num_of_data_points;
+ data_addr = fhandler->full_addr.data_base;
+ extra_data = (struct synaptics_rmi4_f12_extra_data *)fhandler->extra;
+ size_of_2d_data = sizeof(struct synaptics_rmi4_f12_finger_data);
+
+ if (rmi4_data->suspend && rmi4_data->wakeup_en) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_addr + extra_data->data4_offset,
+ rmi4_data->gesture_detection,
+ sizeof(rmi4_data->gesture_detection));
+ if (retval < 0)
+ return 0;
+
+ gesture_type = rmi4_data->gesture_detection[0];
+ if (gesture_type && gesture_type != F12_UDG_DETECT) {
+ input_report_key(rmi4_data->input_dev, KEY_WAKEUP, 1);
+ input_sync(rmi4_data->input_dev);
+ input_report_key(rmi4_data->input_dev, KEY_WAKEUP, 0);
+ input_sync(rmi4_data->input_dev);
+ dev_err(rmi4_data->pdev->dev.parent, "double click send input event\n");
+ }
+
+ return 0;
+ }
+
+ /* Determine the total number of fingers to process */
+ if (extra_data->data15_size) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_addr + extra_data->data15_offset,
+ extra_data->data15_data,
+ extra_data->data15_size);
+ if (retval < 0)
+ return 0;
+
+ /* Start checking from the highest bit */
+ index = extra_data->data15_size - 1; /* Highest byte */
+ finger = (fingers_to_process - 1) % 8; /* Highest bit */
+ do {
+ if (extra_data->data15_data[index] & (1 << finger))
+ break;
+
+ if (finger) {
+ finger--;
+ } else if (index > 0) {
+ index--; /* Move to the next lower byte */
+ finger = 7;
+ }
+
+ fingers_to_process--;
+ } while (fingers_to_process);
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Number of fingers to process = %d\n",
+ __func__, fingers_to_process);
+ }
+
+#ifdef F12_DATA_15_WORKAROUND
+ fingers_to_process = max(fingers_to_process, objects_already_present);
+#endif
+
+ if (!fingers_to_process) {
+ synaptics_rmi4_free_fingers(rmi4_data);
+ finger_presence = 0;
+ stylus_presence = 0;
+ rmi4_data->touchs = 0;
+ return 0;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_addr + extra_data->data1_offset,
+ (unsigned char *)fhandler->data,
+ fingers_to_process * size_of_2d_data);
+ if (retval < 0)
+ return 0;
+
+ data = (struct synaptics_rmi4_f12_finger_data *)fhandler->data;
+
+#ifdef REPORT_2D_PRESSURE
+ if (rmi4_data->report_pressure) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_addr + extra_data->data29_offset,
+ extra_data->data29_data,
+ extra_data->data29_size);
+ if (retval < 0)
+ return 0;
+ }
+#endif
+
+ mutex_lock(&(rmi4_data->rmi4_report_mutex));
+
+ for (finger = 0; finger < fingers_to_process; finger++) {
+ finger_data = data + finger;
+ finger_status = finger_data->object_type_and_status;
+
+#ifdef F12_DATA_15_WORKAROUND
+ objects_already_present = finger + 1;
+#endif
+
+ x = (finger_data->x_msb << 8) | (finger_data->x_lsb);
+ y = (finger_data->y_msb << 8) | (finger_data->y_lsb);
+#ifdef REPORT_2D_W
+ wx = finger_data->wx;
+ wy = finger_data->wy;
+#endif
+
+ if (rmi4_data->hw_if->board_data->swap_axes) {
+ temp = x;
+ x = y;
+ y = temp;
+ temp = wx;
+ wx = wy;
+ wy = temp;
+ }
+
+ if (rmi4_data->hw_if->board_data->x_flip)
+ x = rmi4_data->sensor_max_x - x;
+ if (rmi4_data->hw_if->board_data->y_flip)
+ y = rmi4_data->sensor_max_y - y;
+
+ switch (finger_status) {
+ case F12_FINGER_STATUS:
+ case F12_GLOVED_FINGER_STATUS:
+ if (stylus_presence) /* Stylus has priority over fingers */
+ break;
+#ifdef TYPE_B_PROTOCOL
+ input_mt_slot(rmi4_data->input_dev, finger);
+ input_mt_report_slot_state(rmi4_data->input_dev,
+ MT_TOOL_FINGER, 1);
+#endif
+
+ input_report_key(rmi4_data->input_dev,
+ BTN_TOUCH, 1);
+ input_report_key(rmi4_data->input_dev,
+ BTN_TOOL_FINGER, 1);
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_POSITION_X, x);
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_POSITION_Y, y);
+#ifdef REPORT_2D_W
+ if (rmi4_data->wedge_sensor) {
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_TOUCH_MAJOR, wx);
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_TOUCH_MINOR, wx);
+ } else {
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_TOUCH_MAJOR,
+ max(wx, wy));
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_TOUCH_MINOR,
+ min(wx, wy));
+ }
+#endif
+#ifdef REPORT_2D_PRESSURE
+ if (rmi4_data->report_pressure) {
+ f_fingers = extra_data->data29_size / 2;
+ f_data = extra_data->data29_data;
+ if (finger + 1 > f_fingers) {
+ pressure = 1;
+ } else {
+ f_lsb = finger * 2;
+ f_msb = finger * 2 + 1;
+ pressure = (int)f_data[f_lsb] << 0 |
+ (int)f_data[f_msb] << 8;
+ }
+ pressure = pressure > 0 ? pressure : 1;
+ if (pressure > rmi4_data->force_max)
+ pressure = rmi4_data->force_max;
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_PRESSURE, pressure);
+ }
+#elif defined(F51_DISCRETE_FORCE)
+ if (finger == 0) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ FORCE_LEVEL_ADDR,
+ &force_level,
+ sizeof(force_level));
+ if (retval < 0)
+ return 0;
+ pressure = force_level > 0 ? force_level : 1;
+ } else {
+ pressure = 1;
+ }
+ input_report_abs(rmi4_data->input_dev,
+ ABS_MT_PRESSURE, pressure);
+#endif
+#ifndef TYPE_B_PROTOCOL
+ input_mt_sync(rmi4_data->input_dev);
+#endif
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Finger %d: "
+ "status = 0x%02x, "
+ "x = %d, "
+ "y = %d, "
+ "wx = %d, "
+ "wy = %d\n",
+ __func__, finger,
+ finger_status,
+ x, y, wx, wy);
+
+ finger_presence = 1;
+ touch_count++;
+ touchs |= BIT(finger);
+ rmi4_data->touchs |= BIT(finger);
+ break;
+ case F12_PALM_STATUS:
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Finger %d: "
+ "x = %d, "
+ "y = %d, "
+ "wx = %d, "
+ "wy = %d\n",
+ __func__, finger,
+ x, y, wx, wy);
+ break;
+ case F12_STYLUS_STATUS:
+ case F12_ERASER_STATUS:
+ if (finger_presence) { /* Stylus has priority over fingers */
+ mutex_unlock(&(rmi4_data->rmi4_report_mutex));
+ synaptics_rmi4_free_fingers(rmi4_data);
+ mutex_lock(&(rmi4_data->rmi4_report_mutex));
+ finger_presence = 0;
+ }
+ if (stylus_presence) {/* Allow one stylus at a timee */
+ if (finger + 1 != stylus_presence)
+ break;
+ }
+ input_report_key(rmi4_data->stylus_dev,
+ BTN_TOUCH, 1);
+ if (finger_status == F12_STYLUS_STATUS) {
+ input_report_key(rmi4_data->stylus_dev,
+ BTN_TOOL_PEN, 1);
+ } else {
+ input_report_key(rmi4_data->stylus_dev,
+ BTN_TOOL_RUBBER, 1);
+ }
+ input_report_abs(rmi4_data->stylus_dev,
+ ABS_X, x);
+ input_report_abs(rmi4_data->stylus_dev,
+ ABS_Y, y);
+
+ stylus_presence = finger + 1;
+ touch_count++;
+ break;
+ default:
+#ifdef TYPE_B_PROTOCOL
+ input_mt_slot(rmi4_data->input_dev, finger);
+ input_mt_report_slot_state(rmi4_data->input_dev,
+ MT_TOOL_FINGER, 0);
+#endif
+ rmi4_data->touchs &= ~BIT(finger);
+ touchs &= ~BIT(finger);
+ break;
+ }
+ }
+
+ for (finger = 0; finger < fhandler->num_of_data_points; finger++) {
+ if (BIT(finger) & (rmi4_data->touchs ^ touchs)) {
+ input_mt_slot(rmi4_data->input_dev, finger);
+ input_mt_report_slot_state(rmi4_data->input_dev,
+ MT_TOOL_FINGER, 0);
+ }
+ }
+
+ if (touch_count == 0) {
+ finger_presence = 0;
+#ifdef F12_DATA_15_WORKAROUND
+ objects_already_present = 0;
+#endif
+ input_report_key(rmi4_data->input_dev,
+ BTN_TOUCH, 0);
+ input_report_key(rmi4_data->input_dev,
+ BTN_TOOL_FINGER, 0);
+#ifndef TYPE_B_PROTOCOL
+ input_mt_sync(rmi4_data->input_dev);
+#endif
+
+ if (rmi4_data->stylus_enable) {
+ stylus_presence = 0;
+ input_report_key(rmi4_data->stylus_dev,
+ BTN_TOUCH, 0);
+ input_report_key(rmi4_data->stylus_dev,
+ BTN_TOOL_PEN, 0);
+ if (rmi4_data->eraser_enable) {
+ input_report_key(rmi4_data->stylus_dev,
+ BTN_TOOL_RUBBER, 0);
+ }
+ }
+
+ rmi4_data->touchs = 0;
+ }
+
+ input_sync(rmi4_data->input_dev);
+
+ mutex_unlock(&(rmi4_data->rmi4_report_mutex));
+
+ return touch_count;
+}
+
+static void synaptics_rmi4_f1a_report(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler)
+{
+ int retval;
+ unsigned char touch_count = 0;
+ unsigned char button;
+ unsigned char index;
+ unsigned char shift;
+ unsigned char status;
+ unsigned char *data;
+ unsigned short data_addr = fhandler->full_addr.data_base;
+ struct synaptics_rmi4_f1a_handle *f1a = fhandler->data;
+ static unsigned char do_once = 1;
+#ifdef NO_0D_WHILE_2D
+ static bool before_2d_status[MAX_NUMBER_OF_BUTTONS];
+ static bool while_2d_status[MAX_NUMBER_OF_BUTTONS];
+#endif
+
+ if (do_once) {
+#ifdef NO_0D_WHILE_2D
+ memset(before_2d_status, 0, sizeof(before_2d_status));
+ memset(while_2d_status, 0, sizeof(while_2d_status));
+#endif
+ do_once = 0;
+ }
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: touchkey interrupt event\n",
+ __func__);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_addr,
+ f1a->button_data_buffer,
+ f1a->button_bitmask_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read button data registers\n",
+ __func__);
+ return;
+ }
+
+ data = f1a->button_data_buffer;
+
+ mutex_lock(&(rmi4_data->rmi4_report_mutex));
+
+ for (button = 0; button < f1a->valid_button_count; button++) {
+ index = button / 8;
+ shift = button % 8;
+ status = ((data[index] >> shift) & MASK_1BIT);
+
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Button %d (code %d) ->%d\n",
+ __func__, button,
+ f1a->button_map[button],
+ status);
+#ifdef NO_0D_WHILE_2D
+ if (rmi4_data->fingers_on_2d == false) {
+ if (status == 1) {
+ before_2d_status[button] = 1;
+ } else {
+ if (while_2d_status[button] == 1) {
+ while_2d_status[button] = 0;
+ continue;
+ } else {
+ before_2d_status[button] = 0;
+ }
+ }
+
+ touch_count++;
+ input_report_key(rmi4_data->input_dev,
+ f1a->button_map[button],
+ status);
+ } else {
+ if (before_2d_status[button] == 1) {
+ before_2d_status[button] = 0;
+ touch_count++;
+ input_report_key(rmi4_data->input_dev,
+ f1a->button_map[button],
+ status);
+ } else {
+ if (status == 1)
+ while_2d_status[button] = 1;
+ else
+ while_2d_status[button] = 0;
+ }
+ }
+#else
+ touch_count++;
+ input_report_key(rmi4_data->input_dev,
+ f1a->button_map[button],
+ status);
+#endif
+ }
+
+ if (touch_count)
+ input_sync(rmi4_data->input_dev);
+
+ mutex_unlock(&(rmi4_data->rmi4_report_mutex));
+
+ return;
+}
+
+static void synaptics_rmi4_report_touch(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler)
+{
+ unsigned char touch_count_2d;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Function %02x reporting\n",
+ __func__, fhandler->fn_number);
+
+ switch (fhandler->fn_number) {
+ case SYNAPTICS_RMI4_F11:
+ touch_count_2d = synaptics_rmi4_f11_abs_report(rmi4_data,
+ fhandler);
+
+ if (touch_count_2d)
+ rmi4_data->fingers_on_2d = true;
+ else
+ rmi4_data->fingers_on_2d = false;
+ break;
+ case SYNAPTICS_RMI4_F12:
+ touch_count_2d = synaptics_rmi4_f12_abs_report(rmi4_data,
+ fhandler);
+
+ if (touch_count_2d)
+ rmi4_data->fingers_on_2d = true;
+ else
+ rmi4_data->fingers_on_2d = false;
+ break;
+ case SYNAPTICS_RMI4_F1A:
+ synaptics_rmi4_f1a_report(rmi4_data, fhandler);
+ break;
+ default:
+ break;
+ }
+
+ return;
+}
+
+static void synaptics_rmi4_tddi_reset_work(struct work_struct *work)
+{
+ struct synaptics_rmi4_data *rmi4_data = container_of(work, struct synaptics_rmi4_data,
+ tddi_reset_work.work);
+
+ pr_info("%s: START\n", __func__);
+
+ rmi4_data->irq_enabled = false;
+ disable_irq_nosync(rmi4_data->irq);
+
+ mdss_fb_prim_panel_recover();
+
+ enable_irq(rmi4_data->irq);
+ rmi4_data->irq_enabled = true;
+
+ pr_info("%s: DONE\n", __func__);
+}
+
+
+static void synaptics_rmi4_sensor_report(struct synaptics_rmi4_data *rmi4_data,
+ bool report)
+{
+ int retval;
+ unsigned char data[MAX_INTR_REGISTERS + 1];
+ unsigned char *intr = &data[1];
+ bool was_in_bl_mode;
+ struct synaptics_rmi4_f01_device_status status;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+ struct synaptics_rmi4_device_info *rmi;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ /*
+ * Get interrupt status information from F01 Data1 register to
+ * determine the source(s) that are flagging the interrupt.
+ */
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_data_base_addr,
+ data,
+ rmi4_data->num_of_intr_regs + 1);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read interrupt status\n",
+ __func__);
+ return;
+ }
+
+ status.data[0] = data[0];
+ if (status.status_code == STATUS_CRC_IN_PROGRESS) {
+ retval = synaptics_rmi4_check_status(rmi4_data,
+ &was_in_bl_mode);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to check status\n",
+ __func__);
+ return;
+ }
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_data_base_addr,
+ status.data,
+ sizeof(status.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read device status\n",
+ __func__);
+ return;
+ }
+ }else if (status.status_code == STATUS_FIRMWARE_CRC_FAILURE) {
+ if (rmi4_data->chip_is_tddi) {
+ schedule_delayed_work(&rmi4_data->tddi_reset_work, msecs_to_jiffies(5));
+ return;
+ }
+ }
+ if (status.unconfigured && !status.flash_prog) {
+ pr_notice("%s: spontaneous reset detected\n", __func__);
+ retval = synaptics_rmi4_reinit_device(rmi4_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to reinit device\n",
+ __func__);
+ }
+ }
+
+ if (!report)
+ return;
+
+ /*
+ * Traverse the function handler list and service the source(s)
+ * of the interrupt accordingly.
+ */
+ if (!list_empty(&rmi->support_fn_list)) {
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->num_of_data_sources) {
+ if (fhandler->intr_mask &
+ intr[fhandler->intr_reg_num]) {
+ synaptics_rmi4_report_touch(rmi4_data,
+ fhandler);
+ }
+ }
+ }
+ }
+
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link) {
+ if (!exp_fhandler->insert &&
+ !exp_fhandler->remove &&
+ (exp_fhandler->exp_fn->attn != NULL))
+ exp_fhandler->exp_fn->attn(rmi4_data, intr[0]);
+ }
+ }
+ mutex_unlock(&exp_data.mutex);
+
+ return;
+}
+
+static irqreturn_t synaptics_rmi4_irq(int irq, void *data)
+{
+ struct synaptics_rmi4_data *rmi4_data = data;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (gpio_get_value(bdata->irq_gpio) != bdata->irq_on_state)
+ goto exit;
+
+ if (IRQ_HANDLED == synaptics_filter_interrupt(data))
+ return IRQ_HANDLED;
+
+ synaptics_rmi4_sensor_report(rmi4_data, true);
+
+exit:
+ return IRQ_HANDLED;
+}
+
+static int synaptics_rmi4_int_enable(struct synaptics_rmi4_data *rmi4_data,
+ bool enable)
+{
+ int retval = 0;
+ unsigned char ii;
+ unsigned char zero = 0x00;
+ unsigned char *intr_mask;
+ unsigned short intr_addr;
+
+ intr_mask = rmi4_data->intr_mask;
+
+ for (ii = 0; ii < rmi4_data->num_of_intr_regs; ii++) {
+ if (intr_mask[ii] != 0x00) {
+ intr_addr = rmi4_data->f01_ctrl_base_addr + 1 + ii;
+ if (enable) {
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ intr_addr,
+ &(intr_mask[ii]),
+ sizeof(intr_mask[ii]));
+ if (retval < 0)
+ return retval;
+ } else {
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ intr_addr,
+ &zero,
+ sizeof(zero));
+ if (retval < 0)
+ return retval;
+ }
+ }
+ }
+
+ return retval;
+}
+
+static int synaptics_rmi4_irq_enable(struct synaptics_rmi4_data *rmi4_data,
+ bool enable, bool attn_only)
+{
+ int retval = 0;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (attn_only) {
+ retval = synaptics_rmi4_int_enable(rmi4_data, enable);
+ return retval;
+ }
+
+ if (enable) {
+ if (rmi4_data->irq_enabled)
+ return retval;
+
+ retval = synaptics_rmi4_int_enable(rmi4_data, false);
+ if (retval < 0)
+ return retval;
+
+ /* Process and clear interrupts */
+ synaptics_rmi4_sensor_report(rmi4_data, false);
+
+ retval = request_threaded_irq(rmi4_data->irq, NULL,
+ synaptics_rmi4_irq, bdata->irq_flags,
+ PLATFORM_DRIVER_NAME, rmi4_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create irq thread\n",
+ __func__);
+ return retval;
+ }
+
+ retval = synaptics_rmi4_int_enable(rmi4_data, true);
+ if (retval < 0)
+ return retval;
+
+ rmi4_data->irq_enabled = true;
+ } else {
+ if (rmi4_data->irq_enabled) {
+ disable_irq(rmi4_data->irq);
+ free_irq(rmi4_data->irq, rmi4_data);
+ rmi4_data->irq_enabled = false;
+ }
+ }
+
+ return retval;
+}
+
+static void synaptics_rmi4_set_intr_mask(struct synaptics_rmi4_fn *fhandler,
+ struct synaptics_rmi4_fn_desc *fd,
+ unsigned int intr_count)
+{
+ unsigned char ii;
+ unsigned char intr_offset;
+
+ fhandler->intr_reg_num = (intr_count + 7) / 8;
+ if (fhandler->intr_reg_num != 0)
+ fhandler->intr_reg_num -= 1;
+
+ /* Set an enable bit for each data source */
+ intr_offset = intr_count % 8;
+ fhandler->intr_mask = 0;
+ for (ii = intr_offset;
+ ii < (fd->intr_src_count + intr_offset);
+ ii++)
+ fhandler->intr_mask |= 1 << ii;
+
+ return;
+}
+
+static int synaptics_rmi4_query_product_id(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned short lockdown_addr;
+
+ /* Product ID addr starts from F01_RMI_QUERY11 */
+ lockdown_addr = rmi4_data->f01_query_base_addr + F01_PROD_ID_OFFSET;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ lockdown_addr,
+ rmi4_data->lockdown_info,
+ LOCKDOWN_INFO_SIZE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "Failed reading reg %d\n",
+ lockdown_addr);
+ return retval;
+ }
+
+ dev_info(rmi4_data->pdev->dev.parent,
+ "Lockdown info: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X",
+ rmi4_data->lockdown_info[0], rmi4_data->lockdown_info[1],
+ rmi4_data->lockdown_info[2], rmi4_data->lockdown_info[3],
+ rmi4_data->lockdown_info[4], rmi4_data->lockdown_info[5],
+ rmi4_data->lockdown_info[6], rmi4_data->lockdown_info[7]);
+
+ return 0;
+}
+
+static int synaptics_rmi4_query_chip_id(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval, i;
+ unsigned short chipdata_addr;
+ unsigned char query_data[8] = {0};
+
+ chipdata_addr = rmi4_data->f01_query_base_addr + F01_PROD_ID_OFFSET;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ chipdata_addr,
+ query_data,
+ 8);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "Failed reading reg %d\n",
+ chipdata_addr);
+ return retval;
+ }
+
+ dev_info(rmi4_data->pdev->dev.parent,
+ "chip info: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X",
+ query_data[0], query_data[1],
+ query_data[2], query_data[3],
+ query_data[4], query_data[5],
+ query_data[6], query_data[7]);
+
+ for (i = 0; i < rmi4_data->hw_if->board_data->config_array_size; i++) {
+ if (!memcmp(rmi4_data->hw_if->board_data->config_array[i].chip_id_name,
+ query_data,
+ strlen(rmi4_data->hw_if->board_data->config_array[i].chip_id_name))) {
+ rmi4_data->chip_id = rmi4_data->hw_if->board_data->config_array[i].chip_id;
+ rmi4_data->chip_is_tddi = rmi4_data->hw_if->board_data->config_array[i].chip_is_tddi;
+ rmi4_data->open_test_b7 = rmi4_data->hw_if->board_data->config_array[i].open_test_b7;
+ rmi4_data->short_test_extend = rmi4_data->hw_if->board_data->config_array[i].short_test_extend;
+ rmi4_data->factory_param = rmi4_data->hw_if->board_data->config_array[i].factory_param;
+ rmi4_data->panel_power_seq = rmi4_data->hw_if->board_data->config_array[i].panel_power_seq;
+ if (rmi4_data->chip_is_tddi)
+ rmi4_data->hw_if->board_data->reset_gpio = -1;
+ break;
+ }
+ }
+
+ if (i >= rmi4_data->hw_if->board_data->config_array_size) {
+ dev_err(rmi4_data->pdev->dev.parent, "failed to match the chip id\n");
+ rmi4_data->chip_id = -1; /* Set chip_id -1 to ensure it won't do firmware upgrading */
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int synaptics_rmi4_f01_init(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler,
+ struct synaptics_rmi4_fn_desc *fd,
+ unsigned int intr_count)
+{
+ fhandler->fn_number = fd->fn_number;
+ fhandler->num_of_data_sources = fd->intr_src_count;
+ fhandler->data = NULL;
+ fhandler->extra = NULL;
+
+ synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count);
+
+ rmi4_data->f01_query_base_addr = fd->query_base_addr;
+ rmi4_data->f01_ctrl_base_addr = fd->ctrl_base_addr;
+ rmi4_data->f01_data_base_addr = fd->data_base_addr;
+ rmi4_data->f01_cmd_base_addr = fd->cmd_base_addr;
+
+ if (rmi4_data->hw_if->board_data->lockdown_area == LOCKDOWN_AREA_PRODUCT_ID)
+ synaptics_rmi4_query_product_id(rmi4_data);
+
+ return 0;
+}
+
+static int synaptics_rmi4_f11_init(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler,
+ struct synaptics_rmi4_fn_desc *fd,
+ unsigned int intr_count)
+{
+ int retval;
+ int temp;
+ unsigned char offset;
+ unsigned char fingers_supported;
+ struct synaptics_rmi4_f11_extra_data *extra_data;
+ struct synaptics_rmi4_f11_query_0_5 query_0_5;
+ struct synaptics_rmi4_f11_query_7_8 query_7_8;
+ struct synaptics_rmi4_f11_query_9 query_9;
+ struct synaptics_rmi4_f11_query_12 query_12;
+ struct synaptics_rmi4_f11_query_27 query_27;
+ struct synaptics_rmi4_f11_ctrl_6_9 control_6_9;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ fhandler->fn_number = fd->fn_number;
+ fhandler->num_of_data_sources = fd->intr_src_count;
+ fhandler->extra = kmalloc(sizeof(*extra_data), GFP_KERNEL);
+ if (!fhandler->extra) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for fhandler->extra\n",
+ __func__);
+ return -ENOMEM;
+ }
+ extra_data = (struct synaptics_rmi4_f11_extra_data *)fhandler->extra;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base,
+ query_0_5.data,
+ sizeof(query_0_5.data));
+ if (retval < 0)
+ return retval;
+
+ /* Maximum number of fingers supported */
+ if (query_0_5.num_of_fingers <= 4)
+ fhandler->num_of_data_points = query_0_5.num_of_fingers + 1;
+ else if (query_0_5.num_of_fingers == 5)
+ fhandler->num_of_data_points = 10;
+
+ rmi4_data->num_of_fingers = fhandler->num_of_data_points;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.ctrl_base + 6,
+ control_6_9.data,
+ sizeof(control_6_9.data));
+ if (retval < 0)
+ return retval;
+
+ /* Maximum x and y */
+ rmi4_data->sensor_max_x = control_6_9.sensor_max_x_pos_7_0 |
+ (control_6_9.sensor_max_x_pos_11_8 << 8);
+ rmi4_data->sensor_max_y = control_6_9.sensor_max_y_pos_7_0 |
+ (control_6_9.sensor_max_y_pos_11_8 << 8);
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Function %02x max x = %d max y = %d\n",
+ __func__, fhandler->fn_number,
+ rmi4_data->sensor_max_x,
+ rmi4_data->sensor_max_y);
+
+ rmi4_data->max_touch_width = MAX_F11_TOUCH_WIDTH;
+
+ if (bdata->swap_axes) {
+ temp = rmi4_data->sensor_max_x;
+ rmi4_data->sensor_max_x = rmi4_data->sensor_max_y;
+ rmi4_data->sensor_max_y = temp;
+ }
+
+ synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count);
+
+ fhandler->data = NULL;
+
+ offset = sizeof(query_0_5.data);
+
+ /* query 6 */
+ if (query_0_5.has_rel)
+ offset += 1;
+
+ /* queries 7 8 */
+ if (query_0_5.has_gestures) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base + offset,
+ query_7_8.data,
+ sizeof(query_7_8.data));
+ if (retval < 0)
+ return retval;
+
+ offset += sizeof(query_7_8.data);
+ }
+
+ /* query 9 */
+ if (query_0_5.has_query_9) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base + offset,
+ query_9.data,
+ sizeof(query_9.data));
+ if (retval < 0)
+ return retval;
+
+ offset += sizeof(query_9.data);
+ }
+
+ /* query 10 */
+ if (query_0_5.has_gestures && query_7_8.has_touch_shapes)
+ offset += 1;
+
+ /* query 11 */
+ if (query_0_5.has_query_11)
+ offset += 1;
+
+ /* query 12 */
+ if (query_0_5.has_query_12) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base + offset,
+ query_12.data,
+ sizeof(query_12.data));
+ if (retval < 0)
+ return retval;
+
+ offset += sizeof(query_12.data);
+ }
+
+ /* query 13 */
+ if (query_0_5.has_jitter_filter)
+ offset += 1;
+
+ /* query 14 */
+ if (query_0_5.has_query_12 && query_12.has_general_information_2)
+ offset += 1;
+
+ /* queries 15 16 17 18 19 20 21 22 23 24 25 26*/
+ if (query_0_5.has_query_12 && query_12.has_physical_properties)
+ offset += 12;
+
+ /* query 27 */
+ if (query_0_5.has_query_27) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base + offset,
+ query_27.data,
+ sizeof(query_27.data));
+ if (retval < 0)
+ return retval;
+
+ rmi4_data->f11_wakeup_gesture = query_27.has_wakeup_gesture;
+ }
+
+ if (!rmi4_data->f11_wakeup_gesture)
+ return retval;
+
+ /* data 0 */
+ fingers_supported = fhandler->num_of_data_points;
+ offset = (fingers_supported + 3) / 4;
+
+ /* data 1 2 3 4 5 */
+ offset += 5 * fingers_supported;
+
+ /* data 6 7 */
+ if (query_0_5.has_rel)
+ offset += 2 * fingers_supported;
+
+ /* data 8 */
+ if (query_0_5.has_gestures && query_7_8.data[0])
+ offset += 1;
+
+ /* data 9 */
+ if (query_0_5.has_gestures && (query_7_8.data[0] || query_7_8.data[1]))
+ offset += 1;
+
+ /* data 10 */
+ if (query_0_5.has_gestures &&
+ (query_7_8.has_pinch || query_7_8.has_flick))
+ offset += 1;
+
+ /* data 11 12 */
+ if (query_0_5.has_gestures &&
+ (query_7_8.has_flick || query_7_8.has_rotate))
+ offset += 2;
+
+ /* data 13 */
+ if (query_0_5.has_gestures && query_7_8.has_touch_shapes)
+ offset += (fingers_supported + 3) / 4;
+
+ /* data 14 15 */
+ if (query_0_5.has_gestures &&
+ (query_7_8.has_scroll_zones ||
+ query_7_8.has_multi_finger_scroll ||
+ query_7_8.has_chiral_scroll))
+ offset += 2;
+
+ /* data 16 17 */
+ if (query_0_5.has_gestures &&
+ (query_7_8.has_scroll_zones &&
+ query_7_8.individual_scroll_zones))
+ offset += 2;
+
+ /* data 18 19 20 21 22 23 24 25 26 27 */
+ if (query_0_5.has_query_9 && query_9.has_contact_geometry)
+ offset += 10 * fingers_supported;
+
+ /* data 28 */
+ if (query_0_5.has_bending_correction ||
+ query_0_5.has_large_object_suppression)
+ offset += 1;
+
+ /* data 29 30 31 */
+ if (query_0_5.has_query_9 && query_9.has_pen_hover_discrimination)
+ offset += 3;
+
+ /* data 32 */
+ if (query_0_5.has_query_12 &&
+ query_12.has_small_object_detection_tuning)
+ offset += 1;
+
+ /* data 33 34 */
+ if (query_0_5.has_query_27 && query_27.f11_query27_b0)
+ offset += 2;
+
+ /* data 35 */
+ if (query_0_5.has_query_12 && query_12.has_8bit_w)
+ offset += fingers_supported;
+
+ /* data 36 */
+ if (query_0_5.has_bending_correction)
+ offset += 1;
+
+ /* data 37 */
+ if (query_0_5.has_query_27 && query_27.has_data_37)
+ offset += 1;
+
+ /* data 38 */
+ if (query_0_5.has_query_27 && query_27.has_wakeup_gesture)
+ extra_data->data38_offset = offset;
+
+ return retval;
+}
+
+static int synaptics_rmi4_f12_set_enables(struct synaptics_rmi4_data *rmi4_data,
+ unsigned short ctrl28)
+{
+ int retval;
+ static unsigned short ctrl_28_address;
+
+ if (ctrl28)
+ ctrl_28_address = ctrl28;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ ctrl_28_address,
+ &rmi4_data->report_enable,
+ sizeof(rmi4_data->report_enable));
+ if (retval < 0)
+ return retval;
+
+ return retval;
+}
+
+static int synaptics_rmi4_f12_find_sub(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler,
+ unsigned char *presence, unsigned char presence_size,
+ unsigned char structure_offset, unsigned char reg,
+ unsigned char sub)
+{
+ int retval;
+ unsigned char cnt;
+ unsigned char regnum;
+ unsigned char bitnum;
+ unsigned char p_index;
+ unsigned char s_index;
+ unsigned char offset;
+ unsigned char max_reg;
+ unsigned char *structure;
+
+ max_reg = (presence_size - 1) * 8 - 1;
+
+ if (reg > max_reg) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Register number (%d) over limit\n",
+ __func__, reg);
+ return -EINVAL;
+ }
+
+ p_index = reg / 8 + 1;
+ bitnum = reg % 8;
+ if ((presence[p_index] & (1 << bitnum)) == 0x00) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Register %d is not present\n",
+ __func__, reg);
+ return -EINVAL;
+ }
+
+ structure = kmalloc(presence[0], GFP_KERNEL);
+ if (!structure) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for structure register\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base + structure_offset,
+ structure,
+ presence[0]);
+ if (retval < 0)
+ goto exit;
+
+ s_index = 0;
+
+ for (regnum = 0; regnum < reg; regnum++) {
+ p_index = regnum / 8 + 1;
+ bitnum = regnum % 8;
+ if ((presence[p_index] & (1 << bitnum)) == 0x00)
+ continue;
+
+ if (structure[s_index] == 0x00)
+ s_index += 3;
+ else
+ s_index++;
+
+ while (structure[s_index] & ~MASK_7BIT)
+ s_index++;
+
+ s_index++;
+ }
+
+ cnt = 0;
+ s_index++;
+ offset = sub / 7;
+ bitnum = sub % 7;
+
+ do {
+ if (cnt == offset) {
+ if (structure[s_index + cnt] & (1 << bitnum))
+ retval = 1;
+ else
+ retval = 0;
+ goto exit;
+ }
+ cnt++;
+ } while (structure[s_index + cnt - 1] & ~MASK_7BIT);
+
+ retval = 0;
+
+exit:
+ kfree(structure);
+
+ return retval;
+}
+
+static int synaptics_rmi4_f12_init(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler,
+ struct synaptics_rmi4_fn_desc *fd,
+ unsigned int intr_count)
+{
+ int retval = 0;
+ int temp;
+ unsigned char subpacket;
+ unsigned char ctrl_23_size;
+ unsigned char size_of_2d_data;
+ unsigned char size_of_query5;
+ unsigned char size_of_query8;
+ unsigned char ctrl_8_offset;
+ unsigned char ctrl_20_offset;
+ unsigned char ctrl_23_offset;
+ unsigned char ctrl_26_offset;
+ unsigned char ctrl_27_offset;
+ unsigned char ctrl_28_offset;
+ unsigned char ctrl_31_offset;
+ unsigned char ctrl_47_offset;
+ unsigned char ctrl_58_offset;
+ unsigned char num_of_fingers;
+ struct synaptics_rmi4_f12_extra_data *extra_data;
+ struct synaptics_rmi4_f12_query_5 *query_5 = NULL;
+ struct synaptics_rmi4_f12_query_8 *query_8 = NULL;
+ struct synaptics_rmi4_f12_ctrl_8 *ctrl_8 = NULL;
+ struct synaptics_rmi4_f12_ctrl_23 *ctrl_23 = NULL;
+ struct synaptics_rmi4_f12_ctrl_31 *ctrl_31 = NULL;
+ struct synaptics_rmi4_f12_ctrl_58 *ctrl_58 = NULL;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ fhandler->fn_number = fd->fn_number;
+ fhandler->num_of_data_sources = fd->intr_src_count;
+ fhandler->extra = kmalloc(sizeof(*extra_data), GFP_KERNEL);
+ if (!fhandler->extra) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for fhandler->extra\n",
+ __func__);
+ return -ENOMEM;
+ }
+ extra_data = (struct synaptics_rmi4_f12_extra_data *)fhandler->extra;
+ size_of_2d_data = sizeof(struct synaptics_rmi4_f12_finger_data);
+
+ query_5 = kzalloc(sizeof(*query_5), GFP_KERNEL);
+ if (!query_5) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for query_5\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ query_8 = kzalloc(sizeof(*query_8), GFP_KERNEL);
+ if (!query_8) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for query_8\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ ctrl_8 = kzalloc(sizeof(*ctrl_8), GFP_KERNEL);
+ if (!ctrl_8) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for ctrl_8\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ ctrl_23 = kzalloc(sizeof(*ctrl_23), GFP_KERNEL);
+ if (!ctrl_23) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for ctrl_23\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ ctrl_31 = kzalloc(sizeof(*ctrl_31), GFP_KERNEL);
+ if (!ctrl_31) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for ctrl_31\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ ctrl_58 = kzalloc(sizeof(*ctrl_58), GFP_KERNEL);
+ if (!ctrl_58) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for ctrl_58\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base + 4,
+ &size_of_query5,
+ sizeof(size_of_query5));
+ if (retval < 0)
+ goto exit;
+
+ pr_err("%s %d: fhandler->full_addr.query_base = 0x%04x\n", __func__, __LINE__, fhandler->full_addr.query_base);
+ pr_err("%s %d: fhandler->full_addr.ctrl_base = 0x%04x\n", __func__, __LINE__, fhandler->full_addr.ctrl_base);
+ pr_err("%s %d: size_of_query5 = %d\n", __func__, __LINE__, size_of_query5);
+
+ if (size_of_query5 > sizeof(query_5->data))
+ size_of_query5 = sizeof(query_5->data);
+ memset(query_5->data, 0x00, sizeof(query_5->data));
+
+ pr_err("%s %d: size_of_query5 = %d\n", __func__, __LINE__, size_of_query5);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base + 5,
+ query_5->data,
+ size_of_query5);
+ if (retval < 0)
+ goto exit;
+
+ ctrl_8_offset = query_5->ctrl0_is_present +
+ query_5->ctrl1_is_present +
+ query_5->ctrl2_is_present +
+ query_5->ctrl3_is_present +
+ query_5->ctrl4_is_present +
+ query_5->ctrl5_is_present +
+ query_5->ctrl6_is_present +
+ query_5->ctrl7_is_present;
+
+ ctrl_20_offset = ctrl_8_offset +
+ query_5->ctrl8_is_present +
+ query_5->ctrl9_is_present +
+ query_5->ctrl10_is_present +
+ query_5->ctrl11_is_present +
+ query_5->ctrl12_is_present +
+ query_5->ctrl13_is_present +
+ query_5->ctrl14_is_present +
+ query_5->ctrl15_is_present +
+ query_5->ctrl16_is_present +
+ query_5->ctrl17_is_present +
+ query_5->ctrl18_is_present +
+ query_5->ctrl19_is_present;
+
+ ctrl_23_offset = ctrl_20_offset +
+ query_5->ctrl20_is_present +
+ query_5->ctrl21_is_present +
+ query_5->ctrl22_is_present;
+
+
+ ctrl_26_offset = ctrl_23_offset +
+ query_5->ctrl23_is_present +
+ query_5->ctrl24_is_present +
+ query_5->ctrl25_is_present;
+
+ ctrl_27_offset = ctrl_26_offset +
+ query_5->ctrl26_is_present;
+
+ ctrl_28_offset = ctrl_27_offset +
+ query_5->ctrl27_is_present;
+
+ ctrl_31_offset = ctrl_28_offset +
+ query_5->ctrl28_is_present +
+ query_5->ctrl29_is_present +
+ query_5->ctrl30_is_present;
+
+ ctrl_47_offset = ctrl_31_offset +
+ query_5->ctrl31_is_present +
+ query_5->ctrl32_is_present +
+ query_5->ctrl33_is_present +
+ query_5->ctrl34_is_present +
+ query_5->ctrl35_is_present +
+ query_5->ctrl36_is_present +
+ query_5->ctrl37_is_present +
+ query_5->ctrl38_is_present +
+ query_5->ctrl39_is_present +
+ query_5->ctrl40_is_present +
+ query_5->ctrl41_is_present +
+ query_5->ctrl42_is_present +
+ query_5->ctrl43_is_present +
+ query_5->ctrl44_is_present +
+ query_5->ctrl45_is_present +
+ query_5->ctrl46_is_present;
+ ctrl_58_offset = ctrl_47_offset +
+ query_5->ctrl47_is_present +
+ query_5->ctrl48_is_present +
+ query_5->ctrl49_is_present +
+ query_5->ctrl50_is_present +
+ query_5->ctrl51_is_present +
+ query_5->ctrl52_is_present +
+ query_5->ctrl53_is_present +
+ query_5->ctrl54_is_present +
+ query_5->ctrl55_is_present +
+ query_5->ctrl56_is_present +
+ query_5->ctrl57_is_present;
+
+ ctrl_23_size = 2;
+ for (subpacket = 2; subpacket <= 4; subpacket++) {
+ retval = synaptics_rmi4_f12_find_sub(rmi4_data,
+ fhandler, query_5->data, sizeof(query_5->data),
+ 6, 23, subpacket);
+ if (retval == 1)
+ ctrl_23_size++;
+ else if (retval < 0)
+ goto exit;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.ctrl_base + ctrl_23_offset,
+ ctrl_23->data,
+ ctrl_23_size);
+ if (retval < 0)
+ goto exit;
+
+ /* Maximum number of fingers supported */
+ fhandler->num_of_data_points = min_t(unsigned char,
+ ctrl_23->max_reported_objects,
+ (unsigned char)F12_FINGERS_TO_SUPPORT);
+
+ num_of_fingers = fhandler->num_of_data_points;
+ rmi4_data->num_of_fingers = num_of_fingers;
+
+ rmi4_data->stylus_enable = ctrl_23->stylus_enable;
+ rmi4_data->eraser_enable = ctrl_23->eraser_enable;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base + 7,
+ &size_of_query8,
+ sizeof(size_of_query8));
+ if (retval < 0)
+ goto exit;
+
+ if (size_of_query8 > sizeof(query_8->data))
+ size_of_query8 = sizeof(query_8->data);
+ memset(query_8->data, 0x00, sizeof(query_8->data));
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base + 8,
+ query_8->data,
+ size_of_query8);
+ if (retval < 0)
+ goto exit;
+
+ /* Determine the presence of the Data0 register */
+ extra_data->data1_offset = query_8->data0_is_present;
+
+ if ((size_of_query8 >= 3) && (query_8->data15_is_present)) {
+ extra_data->data15_offset = query_8->data0_is_present +
+ query_8->data1_is_present +
+ query_8->data2_is_present +
+ query_8->data3_is_present +
+ query_8->data4_is_present +
+ query_8->data5_is_present +
+ query_8->data6_is_present +
+ query_8->data7_is_present +
+ query_8->data8_is_present +
+ query_8->data9_is_present +
+ query_8->data10_is_present +
+ query_8->data11_is_present +
+ query_8->data12_is_present +
+ query_8->data13_is_present +
+ query_8->data14_is_present;
+ extra_data->data15_size = (num_of_fingers + 7) / 8;
+ } else {
+ extra_data->data15_size = 0;
+ }
+
+#ifdef REPORT_2D_PRESSURE
+ if ((size_of_query8 >= 5) && (query_8->data29_is_present)) {
+ extra_data->data29_offset = query_8->data0_is_present +
+ query_8->data1_is_present +
+ query_8->data2_is_present +
+ query_8->data3_is_present +
+ query_8->data4_is_present +
+ query_8->data5_is_present +
+ query_8->data6_is_present +
+ query_8->data7_is_present +
+ query_8->data8_is_present +
+ query_8->data9_is_present +
+ query_8->data10_is_present +
+ query_8->data11_is_present +
+ query_8->data12_is_present +
+ query_8->data13_is_present +
+ query_8->data14_is_present +
+ query_8->data15_is_present +
+ query_8->data16_is_present +
+ query_8->data17_is_present +
+ query_8->data18_is_present +
+ query_8->data19_is_present +
+ query_8->data20_is_present +
+ query_8->data21_is_present +
+ query_8->data22_is_present +
+ query_8->data23_is_present +
+ query_8->data24_is_present +
+ query_8->data25_is_present +
+ query_8->data26_is_present +
+ query_8->data27_is_present +
+ query_8->data28_is_present;
+ extra_data->data29_size = 0;
+ for (subpacket = 0; subpacket <= num_of_fingers; subpacket++) {
+ retval = synaptics_rmi4_f12_find_sub(rmi4_data,
+ fhandler, query_8->data,
+ sizeof(query_8->data),
+ 9, 29, subpacket);
+ if (retval == 1)
+ extra_data->data29_size += 2;
+ else if (retval < 0)
+ goto exit;
+ }
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.ctrl_base + ctrl_58_offset,
+ ctrl_58->data,
+ sizeof(ctrl_58->data));
+ if (retval < 0)
+ goto exit;
+
+ pr_err("%s %d: extra_data->data29_offset = %d\n", __func__, __LINE__, extra_data->data29_offset);
+ pr_err("%s %d: extra_data->data29_size = %d\n", __func__, __LINE__, extra_data->data29_size);
+ pr_err("%s %d: ctrl_58_offset = %d\n", __func__, __LINE__, ctrl_58_offset);
+
+ rmi4_data->force_min =
+ (int)(ctrl_58->min_force_lsb << 0) |
+ (int)(ctrl_58->min_force_msb << 8);
+ rmi4_data->force_max =
+ (int)(ctrl_58->max_force_lsb << 0) |
+ (int)(ctrl_58->max_force_msb << 8);
+
+ pr_err("%s %d: rmi4_data->force_min = %d\n", __func__, __LINE__, rmi4_data->force_min);
+ pr_err("%s %d: rmi4_data->force_max = %d\n", __func__, __LINE__, rmi4_data->force_max);
+
+ rmi4_data->report_pressure = true;
+ } else {
+ extra_data->data29_size = 0;
+ rmi4_data->report_pressure = false;
+ }
+#endif
+
+ rmi4_data->report_enable = RPT_DEFAULT;
+#ifdef REPORT_2D_Z
+ rmi4_data->report_enable |= RPT_Z;
+#endif
+#ifdef REPORT_2D_W
+ rmi4_data->report_enable |= (RPT_WX | RPT_WY);
+#endif
+
+ retval = synaptics_rmi4_f12_set_enables(rmi4_data,
+ fhandler->full_addr.ctrl_base + ctrl_28_offset);
+ if (retval < 0)
+ goto exit;
+
+ if (query_5->ctrl8_is_present) {
+ rmi4_data->wedge_sensor = false;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.ctrl_base + ctrl_8_offset,
+ ctrl_8->data,
+ sizeof(ctrl_8->data));
+ if (retval < 0)
+ goto exit;
+
+ /* Maximum x and y */
+ rmi4_data->sensor_max_x =
+ ((unsigned int)ctrl_8->max_x_coord_lsb << 0) |
+ ((unsigned int)ctrl_8->max_x_coord_msb << 8);
+ rmi4_data->sensor_max_y =
+ ((unsigned int)ctrl_8->max_y_coord_lsb << 0) |
+ ((unsigned int)ctrl_8->max_y_coord_msb << 8);
+
+ rmi4_data->max_touch_width = MAX_F12_TOUCH_WIDTH;
+ } else {
+ rmi4_data->wedge_sensor = true;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.ctrl_base + ctrl_31_offset,
+ ctrl_31->data,
+ sizeof(ctrl_31->data));
+ if (retval < 0)
+ goto exit;
+
+ /* Maximum x and y */
+ rmi4_data->sensor_max_x =
+ ((unsigned int)ctrl_31->max_x_coord_lsb << 0) |
+ ((unsigned int)ctrl_31->max_x_coord_msb << 8);
+ rmi4_data->sensor_max_y =
+ ((unsigned int)ctrl_31->max_y_coord_lsb << 0) |
+ ((unsigned int)ctrl_31->max_y_coord_msb << 8);
+
+ rmi4_data->max_touch_width = MAX_F12_TOUCH_WIDTH;
+ }
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Function %02x max x = %d max y = %d\n",
+ __func__, fhandler->fn_number,
+ rmi4_data->sensor_max_x,
+ rmi4_data->sensor_max_y);
+
+ if (bdata->swap_axes) {
+ temp = rmi4_data->sensor_max_x;
+ rmi4_data->sensor_max_x = rmi4_data->sensor_max_y;
+ rmi4_data->sensor_max_y = temp;
+ }
+
+ rmi4_data->f12_wakeup_gesture = query_5->ctrl27_is_present;
+ if (rmi4_data->f12_wakeup_gesture) {
+ extra_data->ctrl20_offset = ctrl_20_offset;
+ extra_data->data4_offset = query_8->data0_is_present +
+ query_8->data1_is_present +
+ query_8->data2_is_present +
+ query_8->data3_is_present;
+ }
+
+ synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count);
+
+ extra_data->ctrl26_offset = ctrl_26_offset;
+ extra_data->ctrl27_offset = ctrl_27_offset;
+
+ /* Allocate memory for finger data storage space */
+ fhandler->data_size = num_of_fingers * size_of_2d_data;
+ fhandler->data = kmalloc(fhandler->data_size, GFP_KERNEL);
+ if (!fhandler->data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for fhandler->data\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+exit:
+ kfree(query_5);
+ kfree(query_8);
+ kfree(ctrl_8);
+ kfree(ctrl_23);
+ kfree(ctrl_31);
+ kfree(ctrl_58);
+
+ return retval;
+}
+
+static int synaptics_rmi4_f1a_alloc_mem(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler)
+{
+ int retval;
+ struct synaptics_rmi4_f1a_handle *f1a;
+
+ f1a = kzalloc(sizeof(*f1a), GFP_KERNEL);
+ if (!f1a) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for function handle\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ fhandler->data = (void *)f1a;
+ fhandler->extra = NULL;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base,
+ f1a->button_query.data,
+ sizeof(f1a->button_query.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read query registers\n",
+ __func__);
+ return retval;
+ }
+
+ f1a->max_count = f1a->button_query.max_button_count + 1;
+
+ f1a->button_control.txrx_map = kzalloc(f1a->max_count * 2, GFP_KERNEL);
+ if (!f1a->button_control.txrx_map) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for tx rx mapping\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ f1a->button_bitmask_size = (f1a->max_count + 7) / 8;
+
+ f1a->button_data_buffer = kcalloc(f1a->button_bitmask_size,
+ sizeof(*(f1a->button_data_buffer)), GFP_KERNEL);
+ if (!f1a->button_data_buffer) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for data buffer\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ f1a->button_map = kcalloc(f1a->max_count,
+ sizeof(*(f1a->button_map)), GFP_KERNEL);
+ if (!f1a->button_map) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for button map\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ return 0;
+}
+
+static int synaptics_rmi4_f1a_button_map(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char offset = 0;
+ struct synaptics_rmi4_f1a_query_4 query_4;
+ struct synaptics_rmi4_f1a_handle *f1a = fhandler->data;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ offset = f1a->button_query.has_general_control +
+ f1a->button_query.has_interrupt_enable +
+ f1a->button_query.has_multibutton_select;
+
+ if (f1a->button_query.has_tx_rx_map) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.ctrl_base + offset,
+ f1a->button_control.txrx_map,
+ f1a->max_count * 2);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read tx rx mapping\n",
+ __func__);
+ return retval;
+ }
+
+ rmi4_data->button_txrx_mapping = f1a->button_control.txrx_map;
+ }
+
+ if (f1a->button_query.has_query4) {
+ offset = 2 + f1a->button_query.has_query2 +
+ f1a->button_query.has_query3;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.query_base + offset,
+ query_4.data,
+ sizeof(query_4.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read button features 4\n",
+ __func__);
+ return retval;
+ }
+
+ if (query_4.has_ctrl24)
+ rmi4_data->external_afe_buttons = true;
+ else
+ rmi4_data->external_afe_buttons = false;
+ }
+
+ if (!bdata->cap_button_map) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: cap_button_map is NULL in board file\n",
+ __func__);
+ return -ENODEV;
+ } else if (!bdata->cap_button_map->map) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Button map is missing in board file\n",
+ __func__);
+ return -ENODEV;
+ } else {
+ if (bdata->cap_button_map->nbuttons != f1a->max_count) {
+ f1a->valid_button_count = min(f1a->max_count,
+ bdata->cap_button_map->nbuttons);
+ } else {
+ f1a->valid_button_count = f1a->max_count;
+ }
+
+ for (ii = 0; ii < f1a->valid_button_count; ii++)
+ f1a->button_map[ii] = bdata->cap_button_map->map[ii];
+ }
+
+ return 0;
+}
+
+static void synaptics_rmi4_f1a_kfree(struct synaptics_rmi4_fn *fhandler)
+{
+ struct synaptics_rmi4_f1a_handle *f1a = fhandler->data;
+
+ if (f1a) {
+ kfree(f1a->button_control.txrx_map);
+ kfree(f1a->button_data_buffer);
+ kfree(f1a->button_map);
+ kfree(f1a);
+ fhandler->data = NULL;
+ }
+
+ return;
+}
+
+static int synaptics_rmi4_f1a_init(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler,
+ struct synaptics_rmi4_fn_desc *fd,
+ unsigned int intr_count)
+{
+ int retval;
+
+ fhandler->fn_number = fd->fn_number;
+ fhandler->num_of_data_sources = fd->intr_src_count;
+
+ synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count);
+
+ retval = synaptics_rmi4_f1a_alloc_mem(rmi4_data, fhandler);
+ if (retval < 0)
+ goto error_exit;
+
+ retval = synaptics_rmi4_f1a_button_map(rmi4_data, fhandler);
+ if (retval < 0)
+ goto error_exit;
+
+ rmi4_data->button_0d_enabled = 1;
+
+ return 0;
+
+error_exit:
+ synaptics_rmi4_f1a_kfree(fhandler);
+
+ return retval;
+}
+
+static void synaptics_rmi4_empty_fn_list(struct synaptics_rmi4_data *rmi4_data)
+{
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_fn *fhandler_temp;
+ struct synaptics_rmi4_device_info *rmi;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ if (!list_empty(&rmi->support_fn_list)) {
+ list_for_each_entry_safe(fhandler,
+ fhandler_temp,
+ &rmi->support_fn_list,
+ link) {
+ if (fhandler->fn_number == SYNAPTICS_RMI4_F1A) {
+ synaptics_rmi4_f1a_kfree(fhandler);
+ } else {
+ kfree(fhandler->extra);
+ kfree(fhandler->data);
+ }
+ list_del(&fhandler->link);
+ kfree(fhandler);
+ }
+ }
+ INIT_LIST_HEAD(&rmi->support_fn_list);
+
+ return;
+}
+
+static int synaptics_rmi4_check_status(struct synaptics_rmi4_data *rmi4_data,
+ bool *was_in_bl_mode)
+{
+ int retval;
+ int timeout = CHECK_STATUS_TIMEOUT_MS;
+ struct synaptics_rmi4_f01_device_status status;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_data_base_addr,
+ status.data,
+ sizeof(status.data));
+ if (retval < 0)
+ return retval;
+
+ while (status.status_code == STATUS_CRC_IN_PROGRESS) {
+ if (timeout > 0)
+ msleep(20);
+ else
+ return -EINVAL;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_data_base_addr,
+ status.data,
+ sizeof(status.data));
+ if (retval < 0)
+ return retval;
+
+ timeout -= 20;
+ }
+
+ if (timeout != CHECK_STATUS_TIMEOUT_MS)
+ *was_in_bl_mode = true;
+
+ if (status.flash_prog == 1) {
+ rmi4_data->flash_prog_mode = true;
+ pr_notice("%s: In flash prog mode, status = 0x%02x\n",
+ __func__,
+ status.status_code);
+ } else {
+ rmi4_data->flash_prog_mode = false;
+ }
+
+ return 0;
+}
+
+static void synaptics_rmi4_set_configured(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned char device_ctrl;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set configured\n",
+ __func__);
+ return;
+ }
+
+ rmi4_data->no_sleep_setting = device_ctrl & NO_SLEEP_ON;
+ device_ctrl |= CONFIGURED;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set configured\n",
+ __func__);
+ }
+
+ return;
+}
+
+static int synaptics_rmi4_alloc_fh(struct synaptics_rmi4_fn **fhandler,
+ struct synaptics_rmi4_fn_desc *rmi_fd, int page_number)
+{
+ *fhandler = kzalloc(sizeof(**fhandler), GFP_KERNEL);
+ if (!(*fhandler))
+ return -ENOMEM;
+
+ (*fhandler)->full_addr.data_base =
+ (rmi_fd->data_base_addr |
+ (page_number << 8));
+ (*fhandler)->full_addr.ctrl_base =
+ (rmi_fd->ctrl_base_addr |
+ (page_number << 8));
+ (*fhandler)->full_addr.cmd_base =
+ (rmi_fd->cmd_base_addr |
+ (page_number << 8));
+ (*fhandler)->full_addr.query_base =
+ (rmi_fd->query_base_addr |
+ (page_number << 8));
+
+ return 0;
+}
+
+static int synaptics_rmi4_query_device(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned char page_number;
+ unsigned char intr_count;
+ unsigned char f01_query[F01_STD_QUERY_LEN];
+ unsigned short pdt_entry_addr;
+ bool f01found;
+ bool f35found;
+ bool was_in_bl_mode;
+ struct synaptics_rmi4_fn_desc rmi_fd;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_device_info *rmi;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+rescan_pdt:
+ f01found = false;
+ f35found = false;
+ was_in_bl_mode = false;
+ intr_count = 0;
+ INIT_LIST_HEAD(&rmi->support_fn_list);
+
+ /* Scan the page description tables of the pages to service */
+ for (page_number = 0; page_number < PAGES_TO_SERVICE; page_number++) {
+ for (pdt_entry_addr = PDT_START; pdt_entry_addr > PDT_END;
+ pdt_entry_addr -= PDT_ENTRY_SIZE) {
+ pdt_entry_addr |= (page_number << 8);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ pdt_entry_addr,
+ (unsigned char *)&rmi_fd,
+ sizeof(rmi_fd));
+ if (retval < 0)
+ return retval;
+
+ pdt_entry_addr &= ~(MASK_8BIT << 8);
+
+ fhandler = NULL;
+
+ if (rmi_fd.fn_number == 0) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Reached end of PDT\n",
+ __func__);
+ break;
+ }
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: F%02x found (page %d)\n",
+ __func__, rmi_fd.fn_number,
+ page_number);
+
+ switch (rmi_fd.fn_number) {
+ case SYNAPTICS_RMI4_F01:
+ if (rmi_fd.intr_src_count == 0)
+ break;
+
+ f01found = true;
+
+ retval = synaptics_rmi4_alloc_fh(&fhandler,
+ &rmi_fd, page_number);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc for F%d\n",
+ __func__,
+ rmi_fd.fn_number);
+ return retval;
+ }
+
+ retval = synaptics_rmi4_f01_init(rmi4_data,
+ fhandler, &rmi_fd, intr_count);
+ if (retval < 0)
+ return retval;
+
+ retval = synaptics_rmi4_check_status(rmi4_data,
+ &was_in_bl_mode);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to check status\n",
+ __func__);
+ return retval;
+ }
+
+ if (was_in_bl_mode) {
+ kfree(fhandler);
+ fhandler = NULL;
+ goto rescan_pdt;
+ }
+
+ if (rmi4_data->flash_prog_mode)
+ goto flash_prog_mode;
+
+ break;
+ case SYNAPTICS_RMI4_F11:
+ if (rmi_fd.intr_src_count == 0)
+ break;
+
+ retval = synaptics_rmi4_alloc_fh(&fhandler,
+ &rmi_fd, page_number);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc for F%d\n",
+ __func__,
+ rmi_fd.fn_number);
+ return retval;
+ }
+
+ retval = synaptics_rmi4_f11_init(rmi4_data,
+ fhandler, &rmi_fd, intr_count);
+ if (retval < 0)
+ return retval;
+ break;
+ case SYNAPTICS_RMI4_F12:
+ if (rmi_fd.intr_src_count == 0)
+ break;
+
+ retval = synaptics_rmi4_alloc_fh(&fhandler,
+ &rmi_fd, page_number);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc for F%d\n",
+ __func__,
+ rmi_fd.fn_number);
+ return retval;
+ }
+
+ retval = synaptics_rmi4_f12_init(rmi4_data,
+ fhandler, &rmi_fd, intr_count);
+ if (retval < 0)
+ return retval;
+ break;
+ case SYNAPTICS_RMI4_F1A:
+ if (rmi_fd.intr_src_count == 0)
+ break;
+
+ retval = synaptics_rmi4_alloc_fh(&fhandler,
+ &rmi_fd, page_number);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc for F%d\n",
+ __func__,
+ rmi_fd.fn_number);
+ return retval;
+ }
+
+ retval = synaptics_rmi4_f1a_init(rmi4_data,
+ fhandler, &rmi_fd, intr_count);
+ if (retval < 0) {
+#ifdef IGNORE_FN_INIT_FAILURE
+ kfree(fhandler);
+ fhandler = NULL;
+#else
+ return retval;
+#endif
+ }
+ break;
+ case SYNAPTICS_RMI4_F35:
+ f35found = true;
+ break;
+#ifdef F51_DISCRETE_FORCE
+ case SYNAPTICS_RMI4_F51:
+ rmi4_data->f51_query_base_addr =
+ rmi_fd.query_base_addr |
+ (page_number << 8);
+ break;
+#endif
+ }
+
+ /* Accumulate the interrupt count */
+ intr_count += rmi_fd.intr_src_count;
+
+ if (fhandler && rmi_fd.intr_src_count) {
+ list_add_tail(&fhandler->link,
+ &rmi->support_fn_list);
+ }
+ }
+ }
+
+ if (!f01found) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to find F01\n",
+ __func__);
+ if (!f35found) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to find F35\n",
+ __func__);
+ return -EINVAL;
+ } else {
+ pr_notice("%s: In microbootloader mode\n",
+ __func__);
+ return 0;
+ }
+ }
+
+flash_prog_mode:
+ rmi4_data->num_of_intr_regs = (intr_count + 7) / 8;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Number of interrupt registers = %d\n",
+ __func__, rmi4_data->num_of_intr_regs);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_query_base_addr,
+ f01_query,
+ sizeof(f01_query));
+ if (retval < 0)
+ return retval;
+
+ /* RMI Version 4.0 currently supported */
+ rmi->version_major = 4;
+ rmi->version_minor = 0;
+
+ rmi->manufacturer_id = f01_query[0];
+ rmi->product_props = f01_query[1];
+ rmi->product_info[0] = f01_query[2];
+ rmi->product_info[1] = f01_query[3];
+ retval = secure_memcpy(rmi->product_id_string,
+ sizeof(rmi->product_id_string),
+ &f01_query[11],
+ sizeof(f01_query) - 11,
+ PRODUCT_ID_SIZE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy product ID string\n",
+ __func__);
+ }
+
+ if (rmi->manufacturer_id != 1) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Non-Synaptics device found, manufacturer ID = %d\n",
+ __func__, rmi->manufacturer_id);
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_query_base_addr + F01_BUID_ID_OFFSET,
+ rmi->build_id,
+ sizeof(rmi->build_id));
+ if (retval < 0)
+ return retval;
+
+ rmi4_data->firmware_id = (unsigned int)rmi->build_id[0] +
+ (unsigned int)rmi->build_id[1] * 0x100 +
+ (unsigned int)rmi->build_id[2] * 0x10000;
+
+ memset(rmi4_data->intr_mask, 0x00, sizeof(rmi4_data->intr_mask));
+
+ /*
+ * Map out the interrupt bit masks for the interrupt sources
+ * from the registered function handlers.
+ */
+ if (!list_empty(&rmi->support_fn_list)) {
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->num_of_data_sources) {
+ rmi4_data->intr_mask[fhandler->intr_reg_num] |=
+ fhandler->intr_mask;
+ }
+ }
+ }
+
+ if (rmi4_data->f11_wakeup_gesture || rmi4_data->f12_wakeup_gesture)
+ rmi4_data->enable_wakeup_gesture = WAKEUP_GESTURE;
+ else
+ rmi4_data->enable_wakeup_gesture = false;
+
+ synaptics_rmi4_set_configured(rmi4_data);
+
+ return 0;
+}
+
+static int synaptics_rmi4_gpio_setup(int gpio, bool config, int dir, int state, const char *label)
+{
+ int retval = 0;
+
+ if (config) {
+ retval = gpio_request(gpio, label);
+ if (retval) {
+ pr_err("%s: Failed to get gpio %d (code: %d)",
+ __func__, gpio, retval);
+ return retval;
+ }
+
+ if (dir == 0)
+ retval = gpio_direction_input(gpio);
+ else
+ retval = gpio_direction_output(gpio, state);
+ if (retval) {
+ pr_err("%s: Failed to set gpio %d direction",
+ __func__, gpio);
+ return retval;
+ }
+ } else {
+ gpio_free(gpio);
+ }
+
+ return retval;
+}
+
+static int synaptics_rmi4_pinctrl_init(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+
+ /* Get pinctrl if target uses pinctrl */
+ rmi4_data->ts_pinctrl = devm_pinctrl_get((rmi4_data->pdev->dev.parent));
+ if (IS_ERR_OR_NULL(rmi4_data->ts_pinctrl)) {
+ retval = PTR_ERR(rmi4_data->ts_pinctrl);
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "Target does not use pinctrl %d\n", retval);
+ goto err_pinctrl_get;
+ }
+
+ rmi4_data->pinctrl_state_active
+ = pinctrl_lookup_state(rmi4_data->ts_pinctrl, PINCTRL_STATE_ACTIVE);
+ if (IS_ERR_OR_NULL(rmi4_data->pinctrl_state_active)) {
+ retval = PTR_ERR(rmi4_data->pinctrl_state_active);
+ dev_err(rmi4_data->pdev->dev.parent,
+ "Can not lookup %s pinstate %d\n",
+ PINCTRL_STATE_ACTIVE, retval);
+ goto err_pinctrl_lookup;
+ }
+
+ rmi4_data->pinctrl_state_suspend
+ = pinctrl_lookup_state(rmi4_data->ts_pinctrl, PINCTRL_STATE_SUSPEND);
+ if (IS_ERR_OR_NULL(rmi4_data->pinctrl_state_suspend)) {
+ retval = PTR_ERR(rmi4_data->pinctrl_state_suspend);
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "Can not lookup %s pinstate %d\n",
+ PINCTRL_STATE_SUSPEND, retval);
+ goto err_pinctrl_lookup;
+ }
+
+ return 0;
+
+err_pinctrl_lookup:
+ devm_pinctrl_put(rmi4_data->ts_pinctrl);
+err_pinctrl_get:
+ rmi4_data->ts_pinctrl = NULL;
+ return retval;
+}
+
+static void synaptics_rmi4_set_params(struct synaptics_rmi4_data *rmi4_data)
+{
+ unsigned char ii;
+ struct synaptics_rmi4_f1a_handle *f1a;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_device_info *rmi;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ input_set_abs_params(rmi4_data->input_dev,
+ ABS_MT_POSITION_X, 0,
+ rmi4_data->sensor_max_x, 0, 0);
+ input_set_abs_params(rmi4_data->input_dev,
+ ABS_MT_POSITION_Y, 0,
+ rmi4_data->sensor_max_y, 0, 0);
+#ifdef REPORT_2D_W
+ input_set_abs_params(rmi4_data->input_dev,
+ ABS_MT_TOUCH_MAJOR, 0,
+ rmi4_data->max_touch_width, 0, 0);
+ input_set_abs_params(rmi4_data->input_dev,
+ ABS_MT_TOUCH_MINOR, 0,
+ rmi4_data->max_touch_width, 0, 0);
+#endif
+
+#ifdef REPORT_2D_PRESSURE
+ if (rmi4_data->report_pressure) {
+ input_set_abs_params(rmi4_data->input_dev,
+ ABS_MT_PRESSURE, rmi4_data->force_min,
+ rmi4_data->force_max, 0, 0);
+ }
+#elif defined(F51_DISCRETE_FORCE)
+ input_set_abs_params(rmi4_data->input_dev,
+ ABS_MT_PRESSURE, 0,
+ FORCE_LEVEL_MAX, 0, 0);
+#endif
+
+#ifdef TYPE_B_PROTOCOL
+#ifdef KERNEL_ABOVE_3_6
+ input_mt_init_slots(rmi4_data->input_dev,
+ rmi4_data->num_of_fingers, INPUT_MT_DIRECT);
+#else
+ input_mt_init_slots(rmi4_data->input_dev,
+ rmi4_data->num_of_fingers);
+#endif
+#endif
+
+ f1a = NULL;
+ if (!list_empty(&rmi->support_fn_list)) {
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->fn_number == SYNAPTICS_RMI4_F1A)
+ f1a = fhandler->data;
+ }
+ }
+
+ if (f1a) {
+ for (ii = 0; ii < f1a->valid_button_count; ii++) {
+ set_bit(f1a->button_map[ii],
+ rmi4_data->input_dev->keybit);
+ input_set_capability(rmi4_data->input_dev,
+ EV_KEY, f1a->button_map[ii]);
+ }
+ }
+
+ if (vir_button_map->nbuttons) {
+ for (ii = 0; ii < vir_button_map->nbuttons; ii++) {
+ set_bit(vir_button_map->map[ii * 5],
+ rmi4_data->input_dev->keybit);
+ input_set_capability(rmi4_data->input_dev,
+ EV_KEY, vir_button_map->map[ii * 5]);
+ }
+ }
+
+ if (rmi4_data->f11_wakeup_gesture || rmi4_data->f12_wakeup_gesture) {
+ set_bit(KEY_WAKEUP, rmi4_data->input_dev->keybit);
+ input_set_capability(rmi4_data->input_dev, EV_KEY, KEY_WAKEUP);
+ }
+
+ return;
+}
+
+/* Re-configure touch settings when wakeup gesture mode is switched in suspend */
+static void synaptics_rmi4_wakeup_reconfigure(struct synaptics_rmi4_data *rmi4_data,
+ bool enable)
+{
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+
+ synaptics_rmi4_sleep_enable(rmi4_data, !enable);
+
+ if (enable) {
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_ALL, true);
+ mdss_reset_ctrl(rmi4_data->hw_if->board_data, true);
+ }
+
+ synaptics_rmi4_wakeup_gesture(rmi4_data, enable);
+
+ if (!enable) {
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_ALL, false);
+ mdss_reset_ctrl(rmi4_data->hw_if->board_data, false);
+ }
+
+ synaptics_rmi4_irq_enable(rmi4_data, enable, false);
+
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link) {
+ if (enable) {
+ if (exp_fhandler->exp_fn->resume != NULL)
+ exp_fhandler->exp_fn->resume(rmi4_data);
+ } else {
+ if (exp_fhandler->exp_fn->suspend != NULL)
+ exp_fhandler->exp_fn->suspend(rmi4_data);
+ }
+ }
+ }
+ mutex_unlock(&exp_data.mutex);
+}
+
+static void synaptics_key_ctrl(struct synaptics_rmi4_data *rmi4_data, bool enable)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char intr_enable;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_device_info *rmi;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ if (list_empty(&rmi->support_fn_list))
+ return ;
+
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->fn_number == SYNAPTICS_RMI4_F1A) {
+ ii = fhandler->intr_reg_num;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr + 1 + ii,
+ &intr_enable,
+ sizeof(intr_enable));
+ if (retval < 0)
+ return ;
+
+ if (enable == true)
+ intr_enable |= fhandler->intr_mask;
+ else
+ intr_enable &= ~fhandler->intr_mask;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr + 1 + ii,
+ &intr_enable,
+ sizeof(intr_enable));
+ if (retval < 0)
+ return ;
+ }
+ }
+
+ return ;
+}
+
+static void cover_mode_set(struct synaptics_rmi4_data *rmi4_data, int enable)
+{
+ struct synaptics_rmi4_f12_extra_data *extra_data;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_device_info *rmi;
+ int retval;
+ unsigned char ctrl26_value;
+
+ mutex_lock(&rmi4_data->rmi4_cover_mutex);
+
+ if (rmi4_data->suspend)
+ goto end;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->fn_number == SYNAPTICS_RMI4_F12)
+ break;
+ }
+
+ extra_data = (struct synaptics_rmi4_f12_extra_data *)fhandler->extra;
+
+ if (enable == INPUT_EVENT_COVER_MODE_OFF) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.ctrl_base + extra_data->ctrl26_offset,
+ &ctrl26_value,
+ 1);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read ctrl26 reg\n",
+ __func__);
+ goto end;
+ }
+
+ ctrl26_value &= 0xfc;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ fhandler->full_addr.ctrl_base + extra_data->ctrl26_offset,
+ &ctrl26_value,
+ 1);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to close cover mode\n",
+ __func__);
+ goto end;
+ }
+
+ synaptics_key_ctrl(rmi4_data, true);
+ rmi4_data->enable_cover_mode = 0;
+ } else {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.ctrl_base + extra_data->ctrl26_offset,
+ &ctrl26_value,
+ 1);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read ctrl26 reg\n",
+ __func__);
+ goto end;
+ }
+
+ ctrl26_value |= 0x03;
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ fhandler->full_addr.ctrl_base + extra_data->ctrl26_offset,
+ &ctrl26_value,
+ 1);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to change cover mode\n",
+ __func__);
+ goto end;
+ }
+
+ synaptics_key_ctrl(rmi4_data, false);
+ };
+end:
+ mutex_unlock(&rmi4_data->rmi4_cover_mutex);
+}
+
+static void synaptics_rmi4_switch_mode_work(struct work_struct *work)
+{
+ struct synaptics_rmi4_mode_switch *ms = container_of(work, struct synaptics_rmi4_mode_switch, switch_mode_work);
+ struct synaptics_rmi4_data *rmi4_data = ms->data;
+ const struct synaptics_dsx_board_data *bdata = rmi4_data->hw_if->board_data;
+ unsigned char value = ms->mode;
+
+ if (value >= INPUT_EVENT_WAKUP_MODE_OFF && value <= INPUT_EVENT_WAKUP_MODE_ON) {
+ if (bdata->cut_off_power) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Unable to switch wakeup gesture mode\n", __func__);
+ return;
+ }
+
+ rmi4_data->enable_wakeup_gesture = value - INPUT_EVENT_WAKUP_MODE_OFF;
+ } else if (value >= INPUT_EVENT_COVER_MODE_OFF && value <= INPUT_EVENT_COVER_MODE_ON) {
+ rmi4_data->enable_cover_mode = value;
+ cover_mode_set(rmi4_data, rmi4_data->enable_cover_mode);
+ } else if (value >= INPUT_EVENT_POCKET_MODE_OFF && value <= INPUT_EVENT_POCKET_MODE_ON) {
+ rmi4_data->pocketmode_on = value - INPUT_EVENT_POCKET_MODE_OFF;
+ synaptics_rmi4_pocketmode(rmi4_data, rmi4_data->pocketmode_on);
+ } else {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "Does not support touch mode %d\n", value);
+ }
+
+ if (ms != NULL) {
+ kfree(ms);
+ ms = NULL;
+ }
+}
+
+static int synaptics_rmi4_input_event(struct input_dev *dev,
+ unsigned int type, unsigned int code, int value)
+{
+ struct synaptics_rmi4_data *rmi4_data = input_get_drvdata(dev);
+ struct synaptics_rmi4_mode_switch *ms;
+
+ if (type == EV_SYN && code == SYN_CONFIG) {
+ dev_info(rmi4_data->pdev->dev.parent,
+ "Set input event value = %d\n", value);
+
+ if (value >= INPUT_EVENT_START && value <= INPUT_EVENT_END) {
+ ms = (struct synaptics_rmi4_mode_switch *)kmalloc(sizeof(struct synaptics_rmi4_mode_switch),
+ GFP_ATOMIC);
+ if (ms != NULL) {
+ ms->data = rmi4_data;
+ ms->mode = (unsigned char)value;
+ INIT_WORK(&ms->switch_mode_work, synaptics_rmi4_switch_mode_work);
+ schedule_work(&ms->switch_mode_work);
+ } else {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "Failed in allocating memory for switching mode!\n");
+ return -ENOMEM;
+ }
+ } else {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "Invalid event value %d\n", value);
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
+static int synaptics_rmi4_set_input_dev(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ rmi4_data->input_dev = input_allocate_device();
+ if (rmi4_data->input_dev == NULL) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to allocate input device\n",
+ __func__);
+ retval = -ENOMEM;
+ goto err_input_device;
+ }
+
+ retval = synaptics_rmi4_query_device(rmi4_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to query device\n",
+ __func__);
+ goto err_query_device;
+ }
+
+ rmi4_data->input_dev->name = PLATFORM_DRIVER_NAME;
+ rmi4_data->input_dev->phys = INPUT_PHYS_NAME;
+ rmi4_data->input_dev->id.product = SYNAPTICS_DSX_DRIVER_PRODUCT;
+ rmi4_data->input_dev->id.version = SYNAPTICS_DSX_DRIVER_VERSION;
+ rmi4_data->input_dev->dev.parent = rmi4_data->pdev->dev.parent;
+ rmi4_data->input_dev->event = synaptics_rmi4_input_event;
+ input_set_drvdata(rmi4_data->input_dev, rmi4_data);
+
+ set_bit(EV_SYN, rmi4_data->input_dev->evbit);
+ set_bit(EV_KEY, rmi4_data->input_dev->evbit);
+ set_bit(EV_ABS, rmi4_data->input_dev->evbit);
+ set_bit(BTN_TOUCH, rmi4_data->input_dev->keybit);
+ set_bit(BTN_TOOL_FINGER, rmi4_data->input_dev->keybit);
+#ifdef INPUT_PROP_DIRECT
+ set_bit(INPUT_PROP_DIRECT, rmi4_data->input_dev->propbit);
+#endif
+
+ if (bdata->max_y_for_2d >= 0)
+ rmi4_data->sensor_max_y = bdata->max_y_for_2d;
+
+ synaptics_rmi4_set_params(rmi4_data);
+
+ retval = input_register_device(rmi4_data->input_dev);
+ if (retval) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to register input device\n",
+ __func__);
+ goto err_register_input;
+ }
+
+ if (!rmi4_data->stylus_enable)
+ return 0;
+
+ rmi4_data->stylus_dev = input_allocate_device();
+ if (rmi4_data->stylus_dev == NULL) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to allocate stylus device\n",
+ __func__);
+ retval = -ENOMEM;
+ goto err_stylus_device;
+ }
+
+ rmi4_data->stylus_dev->name = STYLUS_DRIVER_NAME;
+ rmi4_data->stylus_dev->phys = STYLUS_PHYS_NAME;
+ rmi4_data->stylus_dev->id.product = SYNAPTICS_DSX_DRIVER_PRODUCT;
+ rmi4_data->stylus_dev->id.version = SYNAPTICS_DSX_DRIVER_VERSION;
+ rmi4_data->stylus_dev->dev.parent = rmi4_data->pdev->dev.parent;
+ input_set_drvdata(rmi4_data->stylus_dev, rmi4_data);
+
+ set_bit(EV_KEY, rmi4_data->stylus_dev->evbit);
+ set_bit(EV_ABS, rmi4_data->stylus_dev->evbit);
+ set_bit(BTN_TOUCH, rmi4_data->stylus_dev->keybit);
+ set_bit(BTN_TOOL_PEN, rmi4_data->stylus_dev->keybit);
+ if (rmi4_data->eraser_enable)
+ set_bit(BTN_TOOL_RUBBER, rmi4_data->stylus_dev->keybit);
+#ifdef INPUT_PROP_DIRECT
+ set_bit(INPUT_PROP_DIRECT, rmi4_data->stylus_dev->propbit);
+#endif
+
+ input_set_abs_params(rmi4_data->stylus_dev, ABS_X, 0,
+ rmi4_data->sensor_max_x, 0, 0);
+ input_set_abs_params(rmi4_data->stylus_dev, ABS_Y, 0,
+ rmi4_data->sensor_max_y, 0, 0);
+
+ retval = input_register_device(rmi4_data->stylus_dev);
+ if (retval) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to register stylus device\n",
+ __func__);
+ goto err_register_stylus;
+ }
+
+ return 0;
+
+err_register_stylus:
+ rmi4_data->stylus_dev = NULL;
+
+err_stylus_device:
+ input_unregister_device(rmi4_data->input_dev);
+ rmi4_data->input_dev = NULL;
+
+err_register_input:
+err_query_device:
+ synaptics_rmi4_empty_fn_list(rmi4_data);
+ input_free_device(rmi4_data->input_dev);
+
+err_input_device:
+ return retval;
+}
+
+static int synaptics_rmi4_set_gpio(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ retval = synaptics_rmi4_gpio_setup(
+ bdata->irq_gpio,
+ true, 0, 0, bdata->irq_gpio_name);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to configure attention GPIO\n",
+ __func__);
+ goto err_gpio_irq;
+ }
+
+ if (bdata->power_gpio >= 0) {
+ retval = synaptics_rmi4_gpio_setup(
+ bdata->power_gpio,
+ true, 1, !bdata->power_on_state, bdata->power_gpio_name);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to configure power GPIO\n",
+ __func__);
+ goto err_gpio_power;
+ }
+ }
+
+ if (bdata->reset_gpio >= 0) {
+ retval = synaptics_rmi4_gpio_setup(
+ bdata->reset_gpio,
+ true, 1, bdata->reset_on_state, bdata->reset_gpio_name);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to configure reset GPIO\n",
+ __func__);
+ goto err_gpio_reset;
+ }
+ }
+
+ if (bdata->power_gpio >= 0) {
+ gpio_set_value(bdata->power_gpio, bdata->power_on_state);
+ msleep(bdata->power_delay_ms);
+ }
+
+ if (bdata->reset_gpio >= 0) {
+ gpio_set_value(bdata->reset_gpio, bdata->reset_on_state);
+ msleep(bdata->reset_active_ms);
+ gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state);
+ msleep(bdata->reset_delay_ms);
+ }
+
+ return 0;
+
+err_gpio_reset:
+ if (bdata->power_gpio >= 0)
+ synaptics_rmi4_gpio_setup(bdata->power_gpio, false, 0, 0, NULL);
+
+err_gpio_power:
+ synaptics_rmi4_gpio_setup(bdata->irq_gpio, false, 0, 0, NULL);
+
+err_gpio_irq:
+ return retval;
+}
+
+static int synaptics_rmi4_get_reg(struct synaptics_rmi4_data *rmi4_data,
+ bool get)
+{
+ int retval;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (!get) {
+ retval = 0;
+ goto regulator_put;
+ }
+
+ if ((bdata->pwr_reg_name != NULL) && (*bdata->pwr_reg_name != 0)) {
+ rmi4_data->pwr_reg = regulator_get(rmi4_data->pdev->dev.parent,
+ bdata->pwr_reg_name);
+ if (IS_ERR(rmi4_data->pwr_reg)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to get power regulator\n",
+ __func__);
+ retval = PTR_ERR(rmi4_data->pwr_reg);
+ goto regulator_put;
+ }
+ }
+
+ if ((bdata->lab_reg_name != NULL) && (*bdata->lab_reg_name != 0)) {
+ rmi4_data->lab_reg = regulator_get(rmi4_data->pdev->dev.parent,
+ bdata->lab_reg_name);
+ if (IS_ERR(rmi4_data->lab_reg)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to get lab regulator\n",
+ __func__);
+ retval = PTR_ERR(rmi4_data->lab_reg);
+ goto regulator_put;
+ }
+ }
+
+ if ((bdata->ibb_reg_name != NULL) && (*bdata->ibb_reg_name != 0)) {
+ rmi4_data->ibb_reg = regulator_get(rmi4_data->pdev->dev.parent,
+ bdata->ibb_reg_name);
+ if (IS_ERR(rmi4_data->ibb_reg)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to get ibb regulator\n",
+ __func__);
+ retval = PTR_ERR(rmi4_data->ibb_reg);
+ goto regulator_put;
+ }
+ }
+
+ if ((bdata->disp_reg_name != NULL) && (*bdata->disp_reg_name != 0)) {
+ rmi4_data->disp_reg = regulator_get(rmi4_data->pdev->dev.parent,
+ bdata->disp_reg_name);
+ if (IS_ERR(rmi4_data->disp_reg)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to get vddio regulator\n",
+ __func__);
+ retval = PTR_ERR(rmi4_data->disp_reg);
+ goto regulator_put;
+ }
+ }
+
+ if ((bdata->bus_reg_name != NULL) && (*bdata->bus_reg_name != 0)) {
+ rmi4_data->bus_reg = regulator_get(rmi4_data->pdev->dev.parent,
+ bdata->bus_reg_name);
+ if (IS_ERR(rmi4_data->bus_reg)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to get bus pullup regulator\n",
+ __func__);
+ retval = PTR_ERR(rmi4_data->bus_reg);
+ goto regulator_put;
+ }
+ }
+
+ return 0;
+
+regulator_put:
+ if (rmi4_data->pwr_reg) {
+ regulator_put(rmi4_data->pwr_reg);
+ rmi4_data->pwr_reg = NULL;
+ }
+
+ if (rmi4_data->lab_reg) {
+ regulator_put(rmi4_data->lab_reg);
+ rmi4_data->lab_reg = NULL;
+ }
+ if (rmi4_data->ibb_reg) {
+ regulator_put(rmi4_data->ibb_reg);
+ rmi4_data->ibb_reg = NULL;
+ }
+ if (rmi4_data->disp_reg) {
+ regulator_put(rmi4_data->disp_reg);
+ rmi4_data->disp_reg = NULL;
+ }
+
+ if (rmi4_data->bus_reg) {
+ regulator_put(rmi4_data->bus_reg);
+ rmi4_data->bus_reg = NULL;
+ }
+
+ return retval;
+}
+
+static int synaptics_rmi4_enable_reg(struct synaptics_rmi4_data *rmi4_data,
+ bool enable)
+{
+ int retval;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (!enable) {
+ retval = 0;
+ goto disable_pwr_reg;
+ }
+
+ if (rmi4_data->bus_reg) {
+ retval = regulator_enable(rmi4_data->bus_reg);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to enable bus pullup regulator\n",
+ __func__);
+ goto exit;
+ }
+ }
+
+ if (rmi4_data->disp_reg) {
+ retval = regulator_enable(rmi4_data->disp_reg);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to enable disp regulator\n",
+ __func__);
+ goto disable_bus_reg;
+ }
+ }
+
+ if (rmi4_data->pwr_reg) {
+ retval = regulator_enable(rmi4_data->pwr_reg);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to enable power regulator\n",
+ __func__);
+ goto disable_disp_reg;
+ }
+ msleep(bdata->power_delay_ms);
+ }
+
+ return 0;
+
+disable_pwr_reg:
+ if (rmi4_data->pwr_reg)
+ regulator_disable(rmi4_data->pwr_reg);
+
+disable_disp_reg:
+ if (rmi4_data->disp_reg)
+ regulator_disable(rmi4_data->disp_reg);
+
+disable_bus_reg:
+ if (rmi4_data->bus_reg)
+ regulator_disable(rmi4_data->bus_reg);
+
+exit:
+ return retval;
+}
+
+static int synaptics_rmi4_free_fingers(struct synaptics_rmi4_data *rmi4_data)
+{
+ unsigned char ii;
+ struct synaptics_rmi4_device_info *rmi;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_f1a_handle *f1a = NULL;
+
+ mutex_lock(&(rmi4_data->rmi4_report_mutex));
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+#ifdef TYPE_B_PROTOCOL
+ for (ii = 0; ii < rmi4_data->num_of_fingers; ii++) {
+ input_mt_slot(rmi4_data->input_dev, ii);
+ input_mt_report_slot_state(rmi4_data->input_dev,
+ MT_TOOL_FINGER, 0);
+ }
+#endif
+ input_report_key(rmi4_data->input_dev,
+ BTN_TOUCH, 0);
+ input_report_key(rmi4_data->input_dev,
+ BTN_TOOL_FINGER, 0);
+#ifndef TYPE_B_PROTOCOL
+ input_mt_sync(rmi4_data->input_dev);
+#endif
+ input_sync(rmi4_data->input_dev);
+
+ if (rmi4_data->stylus_enable) {
+ input_report_key(rmi4_data->stylus_dev,
+ BTN_TOUCH, 0);
+ input_report_key(rmi4_data->stylus_dev,
+ BTN_TOOL_PEN, 0);
+ if (rmi4_data->eraser_enable) {
+ input_report_key(rmi4_data->stylus_dev,
+ BTN_TOOL_RUBBER, 0);
+ }
+ input_sync(rmi4_data->stylus_dev);
+ }
+
+ if (!list_empty(&rmi->support_fn_list)) {
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->fn_number == SYNAPTICS_RMI4_F1A)
+ f1a = fhandler->data;
+ }
+ }
+
+ for (ii = 0; ii < f1a->valid_button_count; ii++) {
+ input_report_key(rmi4_data->input_dev, f1a->button_map[ii], 0);
+ input_sync(rmi4_data->input_dev);
+ }
+
+ rmi4_data->touchs = 0;
+
+ mutex_unlock(&(rmi4_data->rmi4_report_mutex));
+
+ rmi4_data->fingers_on_2d = false;
+
+ return 0;
+}
+
+static int synaptics_rmi4_sw_reset(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned char command = 0x01;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ rmi4_data->f01_cmd_base_addr,
+ &command,
+ sizeof(command));
+ if (retval < 0)
+ return retval;
+
+ msleep(rmi4_data->hw_if->board_data->reset_delay_ms);
+
+ if (rmi4_data->hw_if->ui_hw_init) {
+ retval = rmi4_data->hw_if->ui_hw_init(rmi4_data);
+ if (retval < 0)
+ return retval;
+ }
+
+ return 0;
+}
+
+static void synaptics_rmi4_rebuild_work(struct work_struct *work)
+{
+ int retval;
+ unsigned char attr_count;
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+ struct delayed_work *delayed_work =
+ container_of(work, struct delayed_work, work);
+ struct synaptics_rmi4_data *rmi4_data =
+ container_of(delayed_work, struct synaptics_rmi4_data,
+ rb_work);
+
+ mutex_lock(&(rmi4_data->rmi4_reset_mutex));
+
+ mutex_lock(&exp_data.mutex);
+
+ synaptics_rmi4_irq_enable(rmi4_data, false, false);
+
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link)
+ if (exp_fhandler->exp_fn->remove != NULL)
+ exp_fhandler->exp_fn->remove(rmi4_data);
+ }
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ sysfs_remove_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ }
+
+ synaptics_rmi4_free_fingers(rmi4_data);
+ synaptics_rmi4_empty_fn_list(rmi4_data);
+ input_unregister_device(rmi4_data->input_dev);
+ rmi4_data->input_dev = NULL;
+ if (rmi4_data->stylus_enable) {
+ input_unregister_device(rmi4_data->stylus_dev);
+ rmi4_data->stylus_dev = NULL;
+ }
+
+ retval = synaptics_rmi4_sw_reset(rmi4_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to issue reset command\n",
+ __func__);
+ goto exit;
+ }
+
+ retval = synaptics_rmi4_set_input_dev(rmi4_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set up input device\n",
+ __func__);
+ goto exit;
+ }
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ goto exit;
+ }
+ }
+
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link)
+ if (exp_fhandler->exp_fn->init != NULL)
+ exp_fhandler->exp_fn->init(rmi4_data);
+ }
+
+ retval = 0;
+
+exit:
+ synaptics_rmi4_irq_enable(rmi4_data, true, false);
+
+ mutex_unlock(&exp_data.mutex);
+
+ mutex_unlock(&(rmi4_data->rmi4_reset_mutex));
+
+ return;
+}
+
+static int synaptics_rmi4_reinit_device(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+ struct synaptics_rmi4_device_info *rmi;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ mutex_lock(&(rmi4_data->rmi4_reset_mutex));
+
+ synaptics_rmi4_free_fingers(rmi4_data);
+
+ if (!list_empty(&rmi->support_fn_list)) {
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->fn_number == SYNAPTICS_RMI4_F12) {
+ synaptics_rmi4_f12_set_enables(rmi4_data, 0);
+ break;
+ }
+ }
+ }
+
+ retval = synaptics_rmi4_int_enable(rmi4_data, true);
+ if (retval < 0)
+ goto exit;
+
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link)
+ if (exp_fhandler->exp_fn->reinit != NULL)
+ exp_fhandler->exp_fn->reinit(rmi4_data);
+ }
+ mutex_unlock(&exp_data.mutex);
+
+ synaptics_rmi4_set_configured(rmi4_data);
+
+ retval = 0;
+
+exit:
+ mutex_unlock(&(rmi4_data->rmi4_reset_mutex));
+ return retval;
+}
+
+static int synaptics_rmi4_reset_device(struct synaptics_rmi4_data *rmi4_data,
+ bool rebuild)
+{
+ int retval;
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+
+ if (rebuild) {
+ queue_delayed_work(rmi4_data->rb_workqueue,
+ &rmi4_data->rb_work,
+ msecs_to_jiffies(REBUILD_WORK_DELAY_MS));
+ return 0;
+ }
+
+ mutex_lock(&(rmi4_data->rmi4_reset_mutex));
+
+ synaptics_rmi4_irq_enable(rmi4_data, false, false);
+
+ retval = synaptics_rmi4_sw_reset(rmi4_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to issue reset command\n",
+ __func__);
+ goto exit;
+ }
+
+ synaptics_rmi4_free_fingers(rmi4_data);
+
+ synaptics_rmi4_empty_fn_list(rmi4_data);
+
+ retval = synaptics_rmi4_query_device(rmi4_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to query device\n",
+ __func__);
+ goto exit;
+ }
+
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link)
+ if (exp_fhandler->exp_fn->reset != NULL)
+ exp_fhandler->exp_fn->reset(rmi4_data);
+ }
+ mutex_unlock(&exp_data.mutex);
+
+ retval = 0;
+
+exit:
+ synaptics_rmi4_irq_enable(rmi4_data, true, false);
+
+ mutex_unlock(&(rmi4_data->rmi4_reset_mutex));
+
+ return retval;
+}
+
+#ifdef FB_READY_RESET
+static void synaptics_rmi4_reset_work(struct work_struct *work)
+{
+ int retval;
+ unsigned int timeout;
+ struct synaptics_rmi4_data *rmi4_data =
+ container_of(work, struct synaptics_rmi4_data,
+ reset_work);
+
+ timeout = FB_READY_TIMEOUT_S * 1000 / FB_READY_WAIT_MS + 1;
+
+ while (!rmi4_data->fb_ready) {
+ msleep(FB_READY_WAIT_MS);
+ timeout--;
+ if (timeout == 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Timed out waiting for FB ready\n",
+ __func__);
+ return;
+ }
+ }
+
+ mutex_lock(&rmi4_data->rmi4_exp_init_mutex);
+
+ retval = synaptics_rmi4_reset_device(rmi4_data, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to issue reset command\n",
+ __func__);
+ }
+
+ mutex_unlock(&rmi4_data->rmi4_exp_init_mutex);
+
+ return;
+}
+#endif
+
+static void synaptics_rmi4_sleep_enable(struct synaptics_rmi4_data *rmi4_data,
+ bool enable)
+{
+ int retval;
+ unsigned char device_ctrl;
+ unsigned char no_sleep_setting = rmi4_data->no_sleep_setting;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read device control\n",
+ __func__);
+ return;
+ }
+
+ device_ctrl = device_ctrl & ~MASK_3BIT;
+ if (enable)
+ device_ctrl = device_ctrl | NO_SLEEP_OFF | SENSOR_SLEEP;
+ else
+ device_ctrl = device_ctrl | no_sleep_setting | NORMAL_OPERATION;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write device control\n",
+ __func__);
+ return;
+ }
+
+ rmi4_data->sensor_sleep = enable;
+
+ return;
+}
+
+static void synaptics_rmi4_exp_fn_work(struct work_struct *work)
+{
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler_temp;
+ struct synaptics_rmi4_data *rmi4_data = exp_data.rmi4_data;
+
+ mutex_lock(&rmi4_data->rmi4_exp_init_mutex);
+ mutex_lock(&rmi4_data->rmi4_reset_mutex);
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry_safe(exp_fhandler,
+ exp_fhandler_temp,
+ &exp_data.list,
+ link) {
+ if ((exp_fhandler->exp_fn->init != NULL) &&
+ exp_fhandler->insert) {
+ exp_fhandler->exp_fn->init(rmi4_data);
+ exp_fhandler->insert = false;
+ } else if ((exp_fhandler->exp_fn->remove != NULL) &&
+ exp_fhandler->remove) {
+ exp_fhandler->exp_fn->remove(rmi4_data);
+ list_del(&exp_fhandler->link);
+ kfree(exp_fhandler);
+ }
+ }
+ }
+ mutex_unlock(&exp_data.mutex);
+ mutex_unlock(&rmi4_data->rmi4_reset_mutex);
+ mutex_unlock(&rmi4_data->rmi4_exp_init_mutex);
+
+ return;
+}
+
+void synaptics_rmi4_new_function_force(struct synaptics_rmi4_exp_fn *exp_fn,
+ bool insert)
+{
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+
+ if (!exp_data.initialized) {
+ mutex_init(&exp_data.mutex);
+ INIT_LIST_HEAD(&exp_data.list);
+ exp_data.initialized = true;
+ }
+
+ mutex_lock(&exp_data.mutex);
+ if (insert) {
+ exp_fhandler = kzalloc(sizeof(*exp_fhandler), GFP_KERNEL);
+ if (!exp_fhandler) {
+ pr_err("%s: Failed to alloc mem for expansion function\n",
+ __func__);
+ goto exit;
+ }
+ exp_fhandler->exp_fn = exp_fn;
+ exp_fhandler->insert = true;
+ exp_fhandler->remove = false;
+ list_add_tail(&exp_fhandler->link, &exp_data.list);
+ } else if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link) {
+ if (exp_fhandler->exp_fn->fn_type == exp_fn->fn_type) {
+ exp_fhandler->insert = false;
+ exp_fhandler->remove = true;
+ goto exit;
+ }
+ }
+ }
+
+exit:
+ mutex_unlock(&exp_data.mutex);
+
+ if (exp_data.queue_work) {
+ queue_delayed_work(exp_data.workqueue,
+ &exp_data.work,
+ msecs_to_jiffies(EXP_FN_WORK_DELAY_MS));
+ }
+
+ return;
+}
+
+#ifdef CONFIG_TOUCH_DEBUG_FS
+static int synaptics_tpdbg_suspend(struct synaptics_rmi4_data *rmi4_data)
+{
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+
+ synaptics_rmi4_irq_enable(rmi4_data, false, false);
+ if (!rmi4_data->enable_wakeup_gesture)
+ synaptics_rmi4_sleep_enable(rmi4_data, true);
+
+ if (rmi4_data->enable_wakeup_gesture) {
+ msleep(300);
+ synaptics_rmi4_wakeup_gesture(rmi4_data, true);
+ synaptics_rmi4_irq_enable(rmi4_data, true, false);
+ goto exit;
+ }
+
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link)
+ if (exp_fhandler->exp_fn->suspend != NULL)
+ exp_fhandler->exp_fn->suspend(rmi4_data);
+ }
+ mutex_unlock(&exp_data.mutex);
+
+exit:
+ return 0;
+}
+
+static int synaptics_tpdbg_resume(struct synaptics_rmi4_data *rmi4_data)
+{
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (rmi4_data->enable_wakeup_gesture) {
+ synaptics_rmi4_wakeup_gesture(rmi4_data, false);
+ if (bdata->reset_gpio >= 0) {
+ gpio_set_value(bdata->reset_gpio, bdata->reset_on_state);
+ msleep(bdata->reset_active_ms);
+ gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state);
+ msleep(bdata->reset_delay_ms);
+ }
+ } else {
+ rmi4_data->current_page = MASK_8BIT;
+ if (bdata->reset_gpio >= 0) {
+ gpio_set_value(bdata->reset_gpio, bdata->reset_on_state);
+ msleep(bdata->reset_active_ms);
+ gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state);
+ msleep(bdata->reset_delay_ms);
+ }
+
+ synaptics_rmi4_sleep_enable(rmi4_data, false);
+ synaptics_rmi4_irq_enable(rmi4_data, true, false);
+
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link)
+ if (exp_fhandler->exp_fn->resume != NULL)
+ exp_fhandler->exp_fn->resume(rmi4_data);
+ }
+ mutex_unlock(&exp_data.mutex);
+ }
+
+ return 0;
+}
+
+static void tpdbg_shutdown(struct synaptics_rmi4_data *rmi4_data, bool sleep)
+{
+ synaptics_rmi4_sleep_enable(rmi4_data, sleep);
+}
+
+static void tpdbg_suspend(struct synaptics_rmi4_data *rmi4_data, bool enable)
+{
+ if (enable)
+ synaptics_tpdbg_suspend(rmi4_data);
+ else
+ synaptics_tpdbg_resume(rmi4_data);
+}
+
+static int tpdbg_open(struct inode *inode, struct file *file)
+{
+ file->private_data = inode->i_private;
+
+ return 0;
+}
+
+ssize_t tpdbg_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
+{
+ const char *str = "cmd support as below:\n \
+ \necho \"irq-disable\" or \"irq-enable\" to ctrl irq\n \
+ \necho \"tp-sd-en\" of \"tp-sd-off\" to ctrl panel in or off sleep mode\n \
+ \necho \"tp-suspend-en\" or \"tp-suspend-off\" to ctrl panel in or off suspend status\n";
+
+ loff_t pos = *ppos;
+ int len = strlen(str);
+
+ if (pos < 0)
+ return -EINVAL;
+ if (pos >= len)
+ return 0;
+
+ if (copy_to_user(buf, str, len))
+ return -EFAULT;
+
+ *ppos = pos + len;
+
+ return len;
+}
+
+ssize_t tpdbg_write(struct file *file, const char __user *buf, size_t size, loff_t *ppos)
+{
+ struct synaptics_rmi4_data *rmi4_data = file->private_data;
+ char *cmd = kzalloc(size + 1, GFP_KERNEL);
+ int ret = size;
+
+ if (!cmd)
+ return -ENOMEM;
+
+ if (copy_from_user(cmd, buf, size)) {
+ ret = -EFAULT;
+ goto out;
+ }
+
+ cmd[size] = '\0';
+
+ if (!strncmp(cmd, "irq-disable", 11))
+ disable_irq(rmi4_data->irq);
+ else if (!strncmp(cmd, "irq-enable", 10))
+ enable_irq(rmi4_data->irq);
+ else if (!strncmp(cmd, "tp-sd-en", 8))
+ tpdbg_shutdown(rmi4_data, true);
+ else if (!strncmp(cmd, "tp-sd-off", 9))
+ tpdbg_shutdown(rmi4_data, false);
+ else if (!strncmp(cmd, "tp-suspend-en", 13))
+ tpdbg_suspend(rmi4_data, true);
+ else if (!strncmp(cmd, "tp-suspend-off", 14))
+ tpdbg_suspend(rmi4_data, false);
+out:
+ kfree(cmd);
+
+ return ret;
+}
+
+int tpdbg_release (struct inode *inode, struct file *file)
+{
+ file->private_data = NULL;
+
+ return 0;
+}
+
+static const struct file_operations tpdbg_operations = {
+ .owner = THIS_MODULE,
+ .open = tpdbg_open,
+ .read = tpdbg_read,
+ .write = tpdbg_write,
+ .release = tpdbg_release,
+};
+#endif
+
+static int synaptics_rmi4_probe(struct platform_device *pdev)
+{
+ int retval;
+ unsigned char attr_count;
+ struct synaptics_rmi4_data *rmi4_data;
+ const struct synaptics_dsx_hw_interface *hw_if;
+ const struct synaptics_dsx_board_data *bdata;
+
+ hw_if = pdev->dev.platform_data;
+ if (!hw_if) {
+ dev_err(&pdev->dev,
+ "%s: No hardware interface found\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ bdata = hw_if->board_data;
+ if (!bdata) {
+ dev_err(&pdev->dev,
+ "%s: No board data found\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ rmi4_data = kzalloc(sizeof(*rmi4_data), GFP_KERNEL);
+ if (!rmi4_data) {
+ dev_err(&pdev->dev,
+ "%s: Failed to alloc mem for rmi4_data\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ rmi4_data->pdev = pdev;
+ rmi4_data->current_page = MASK_8BIT;
+ rmi4_data->hw_if = hw_if;
+ rmi4_data->suspend = false;
+ rmi4_data->irq_enabled = false;
+ rmi4_data->fingers_on_2d = false;
+ rmi4_data->wakeup_en = false;
+
+ rmi4_data->reset_device = synaptics_rmi4_reset_device;
+ rmi4_data->irq_enable = synaptics_rmi4_irq_enable;
+ rmi4_data->sleep_enable = synaptics_rmi4_sleep_enable;
+
+ mutex_init(&(rmi4_data->rmi4_reset_mutex));
+ mutex_init(&(rmi4_data->rmi4_report_mutex));
+ mutex_init(&(rmi4_data->rmi4_io_ctrl_mutex));
+ mutex_init(&(rmi4_data->rmi4_exp_init_mutex));
+ mutex_init(&(rmi4_data->rmi4_irq_enable_mutex));
+ mutex_init(&(rmi4_data->rmi4_cover_mutex));
+
+ init_completion(&rmi4_data->dump_completion);
+
+ platform_set_drvdata(pdev, rmi4_data);
+
+ vir_button_map = bdata->vir_button_map;
+
+ retval = synaptics_rmi4_get_reg(rmi4_data, true);
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to get regulators\n",
+ __func__);
+ goto err_get_reg;
+ }
+
+ retval = synaptics_rmi4_enable_reg(rmi4_data, true);
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to enable regulators\n",
+ __func__);
+ goto err_enable_reg;
+ }
+
+ retval = synaptics_rmi4_pinctrl_init(rmi4_data);
+ if (!retval && rmi4_data->ts_pinctrl) {
+ retval = pinctrl_select_state(rmi4_data->ts_pinctrl,
+ rmi4_data->pinctrl_state_active);
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to select %s pinstate %d\n",
+ __func__, PINCTRL_STATE_ACTIVE, retval);
+ goto err_pinctrl_init;
+ }
+ } else {
+ dev_err(&pdev->dev,
+ "%s: Failed to init pinctrl\n",
+ __func__);
+ goto err_pinctrl_init;
+ }
+
+ retval = synaptics_rmi4_set_gpio(rmi4_data);
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to set up GPIO's\n",
+ __func__);
+ goto err_set_gpio;
+ }
+
+ if (hw_if->ui_hw_init) {
+ retval = hw_if->ui_hw_init(rmi4_data);
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to initialize hardware interface\n",
+ __func__);
+ goto err_ui_hw_init;
+ }
+ }
+
+ retval = synaptics_rmi4_set_input_dev(rmi4_data);
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to set up input device\n",
+ __func__);
+ goto err_set_input_dev;
+ }
+
+ synaptics_rmi4_query_chip_id(rmi4_data);
+
+#ifdef CONFIG_FB
+ if (!rmi4_data->chip_is_tddi)
+ rmi4_data->fb_notifier.notifier_call = synaptics_rmi4_fb_notifier_cb;
+ else
+ rmi4_data->fb_notifier.notifier_call = synaptics_rmi4_fb_notifier_cb_tddi;
+ retval = fb_register_client(&rmi4_data->fb_notifier);
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to register fb notifier client\n",
+ __func__);
+ }
+#endif
+ if (rmi4_data->chip_is_tddi)
+ INIT_DELAYED_WORK(&rmi4_data->tddi_reset_work, synaptics_rmi4_tddi_reset_work);
+
+#ifdef USE_EARLYSUSPEND
+ rmi4_data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1;
+ rmi4_data->early_suspend.suspend = synaptics_rmi4_early_suspend;
+ rmi4_data->early_suspend.resume = synaptics_rmi4_late_resume;
+ register_early_suspend(&rmi4_data->early_suspend);
+#endif
+
+ if (!exp_data.initialized) {
+ mutex_init(&exp_data.mutex);
+ INIT_LIST_HEAD(&exp_data.list);
+ exp_data.initialized = true;
+ }
+
+ rmi4_data->irq = gpio_to_irq(bdata->irq_gpio);
+
+ retval = synaptics_rmi4_irq_enable(rmi4_data, true, false);
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to enable attention interrupt\n",
+ __func__);
+ goto err_enable_irq;
+ }
+
+ if (vir_button_map->nbuttons) {
+ rmi4_data->board_prop_dir = kobject_create_and_add(
+ "board_properties", NULL);
+ if (!rmi4_data->board_prop_dir) {
+ dev_err(&pdev->dev,
+ "%s: Failed to create board_properties directory\n",
+ __func__);
+ goto err_virtual_buttons;
+ } else {
+ retval = sysfs_create_file(rmi4_data->board_prop_dir,
+ &virtual_key_map_attr.attr);
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to create virtual key map file\n",
+ __func__);
+ goto err_virtual_buttons;
+ }
+ }
+ }
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ goto err_sysfs;
+ }
+ }
+
+ retval = sysfs_create_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_panel_color.attr);
+
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ goto err_sysfs;
+ }
+
+#if defined(CONFIG_SECURE_TOUCH)
+ retval = sysfs_create_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_secure_touch.attr);
+
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ goto err_sysfs_secure;
+ }
+
+ retval = sysfs_create_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_secure_touch_enable.attr);
+
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ goto err_sysfs_secure_enable;
+ }
+#endif
+
+ retval = sysfs_create_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_panel_vendor.attr);
+
+ if (retval < 0) {
+ dev_err(&pdev->dev,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ goto err_sysfs_panel_vendor;
+ }
+
+#ifdef CONFIG_TOUCH_DEBUG_FS
+ rmi4_data->debugfs = debugfs_create_dir("tp_debug", NULL);
+ if (rmi4_data->debugfs) {
+ debugfs_create_file("switch_state", 0660, rmi4_data->debugfs, rmi4_data, &tpdbg_operations);
+ }
+#endif
+
+ dev_set_drvdata(rmi4_data->pdev->dev.parent, rmi4_data);
+
+ rmi4_data->rb_workqueue =
+ create_singlethread_workqueue("dsx_rebuild_workqueue");
+ INIT_DELAYED_WORK(&rmi4_data->rb_work, synaptics_rmi4_rebuild_work);
+
+ exp_data.workqueue = create_singlethread_workqueue("dsx_exp_workqueue");
+ INIT_DELAYED_WORK(&exp_data.work, synaptics_rmi4_exp_fn_work);
+ exp_data.rmi4_data = rmi4_data;
+ exp_data.queue_work = true;
+ queue_delayed_work(exp_data.workqueue,
+ &exp_data.work,
+ 0);
+
+#ifdef FB_READY_RESET
+ rmi4_data->reset_workqueue =
+ create_singlethread_workqueue("dsx_reset_workqueue");
+ INIT_WORK(&rmi4_data->reset_work, synaptics_rmi4_reset_work);
+ queue_work(rmi4_data->reset_workqueue, &rmi4_data->reset_work);
+#endif
+
+ device_init_wakeup(&pdev->dev, 1);
+
+ synaptics_secure_touch_init(rmi4_data);
+ synaptics_secure_touch_stop(rmi4_data, 1);
+
+ return retval;
+
+
+err_sysfs_panel_vendor:
+#if defined(CONFIG_SECURE_TOUCH)
+ sysfs_remove_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_secure_touch_enable.attr);
+err_sysfs_secure_enable:
+ sysfs_remove_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_secure_touch.attr);
+err_sysfs_secure:
+ sysfs_remove_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_panel_color.attr);
+#endif
+err_sysfs:
+ for (attr_count--; attr_count >= 0; attr_count--) {
+ sysfs_remove_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ }
+
+err_virtual_buttons:
+ if (rmi4_data->board_prop_dir) {
+ sysfs_remove_file(rmi4_data->board_prop_dir,
+ &virtual_key_map_attr.attr);
+ kobject_put(rmi4_data->board_prop_dir);
+ }
+
+ synaptics_rmi4_irq_enable(rmi4_data, false, false);
+
+err_enable_irq:
+#ifdef CONFIG_FB
+ fb_unregister_client(&rmi4_data->fb_notifier);
+#endif
+
+#ifdef USE_EARLYSUSPEND
+ unregister_early_suspend(&rmi4_data->early_suspend);
+#endif
+
+ synaptics_rmi4_empty_fn_list(rmi4_data);
+ input_unregister_device(rmi4_data->input_dev);
+ rmi4_data->input_dev = NULL;
+ if (rmi4_data->stylus_enable) {
+ input_unregister_device(rmi4_data->stylus_dev);
+ rmi4_data->stylus_dev = NULL;
+ }
+
+err_set_input_dev:
+ synaptics_rmi4_gpio_setup(bdata->irq_gpio, false, 0, 0, NULL);
+
+ if (bdata->reset_gpio >= 0)
+ synaptics_rmi4_gpio_setup(bdata->reset_gpio, false, 0, 0, NULL);
+
+ if (bdata->power_gpio >= 0)
+ synaptics_rmi4_gpio_setup(bdata->power_gpio, false, 0, 0, NULL);
+
+err_ui_hw_init:
+err_set_gpio:
+ synaptics_rmi4_enable_reg(rmi4_data, false);
+
+err_pinctrl_init:
+ if (rmi4_data->ts_pinctrl) {
+ devm_pinctrl_put(rmi4_data->ts_pinctrl);
+ rmi4_data->ts_pinctrl = NULL;
+ }
+
+err_enable_reg:
+ synaptics_rmi4_get_reg(rmi4_data, false);
+
+err_get_reg:
+ kfree(rmi4_data);
+
+ return retval;
+}
+
+static int synaptics_rmi4_remove(struct platform_device *pdev)
+{
+ unsigned char attr_count;
+ struct synaptics_rmi4_data *rmi4_data = platform_get_drvdata(pdev);
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+#ifdef CONFIG_SYNAPTICS_TOUCH_COUNT_DUMP
+ if (bdata->dump_click_count) {
+ if (!rmi4_data->current_clicknum_file) {
+ kfree(rmi4_data->current_clicknum_file);
+ rmi4_data->current_clicknum_file = NULL;
+ }
+ }
+#endif
+#ifdef FB_READY_RESET
+ cancel_work_sync(&rmi4_data->reset_work);
+ flush_workqueue(rmi4_data->reset_workqueue);
+ destroy_workqueue(rmi4_data->reset_workqueue);
+#endif
+
+ cancel_delayed_work_sync(&exp_data.work);
+ flush_workqueue(exp_data.workqueue);
+ destroy_workqueue(exp_data.workqueue);
+
+ cancel_delayed_work_sync(&rmi4_data->rb_work);
+ flush_workqueue(rmi4_data->rb_workqueue);
+ destroy_workqueue(rmi4_data->rb_workqueue);
+
+#ifdef CONFIG_TOUCH_DEBUG_FS
+ debugfs_remove_recursive(rmi4_data->debugfs);
+#endif
+
+ sysfs_remove_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_panel_vendor.attr);
+#if defined(CONFIG_SECURE_TOUCH)
+ sysfs_remove_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_secure_touch_enable.attr);
+ sysfs_remove_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_secure_touch.attr);
+#endif
+ sysfs_remove_file(&rmi4_data->pdev->dev.parent->kobj, &dev_attr_panel_color.attr);
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ sysfs_remove_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ }
+
+ if (rmi4_data->board_prop_dir) {
+ sysfs_remove_file(rmi4_data->board_prop_dir,
+ &virtual_key_map_attr.attr);
+ kobject_put(rmi4_data->board_prop_dir);
+ }
+
+ synaptics_rmi4_irq_enable(rmi4_data, false, false);
+
+#ifdef CONFIG_FB
+ fb_unregister_client(&rmi4_data->fb_notifier);
+#endif
+
+#ifdef USE_EARLYSUSPEND
+ unregister_early_suspend(&rmi4_data->early_suspend);
+#endif
+
+ synaptics_rmi4_empty_fn_list(rmi4_data);
+ input_unregister_device(rmi4_data->input_dev);
+ rmi4_data->input_dev = NULL;
+ if (rmi4_data->stylus_enable) {
+ input_unregister_device(rmi4_data->stylus_dev);
+ rmi4_data->stylus_dev = NULL;
+ }
+
+ synaptics_rmi4_gpio_setup(bdata->irq_gpio, false, 0, 0, NULL);
+
+ if (bdata->reset_gpio >= 0)
+ synaptics_rmi4_gpio_setup(bdata->reset_gpio, false, 0, 0, NULL);
+
+ if (bdata->power_gpio >= 0)
+ synaptics_rmi4_gpio_setup(bdata->power_gpio, false, 0, 0, NULL);
+
+ synaptics_rmi4_enable_reg(rmi4_data, false);
+ synaptics_rmi4_get_reg(rmi4_data, false);
+
+ kfree(rmi4_data);
+
+ return 0;
+}
+
+static void synaptics_rmi4_f11_wg(struct synaptics_rmi4_data *rmi4_data,
+ bool enable)
+{
+ int retval;
+ unsigned char reporting_control;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_device_info *rmi;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->fn_number == SYNAPTICS_RMI4_F11)
+ break;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.ctrl_base,
+ &reporting_control,
+ sizeof(reporting_control));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to change reporting mode\n",
+ __func__);
+ return;
+ }
+
+ reporting_control = (reporting_control & ~MASK_3BIT);
+ if (enable)
+ reporting_control |= F11_WAKEUP_GESTURE_MODE;
+ else
+ reporting_control |= F11_CONTINUOUS_MODE;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ fhandler->full_addr.ctrl_base,
+ &reporting_control,
+ sizeof(reporting_control));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to change reporting mode\n",
+ __func__);
+ return;
+ }
+
+ return;
+}
+
+static void mdss_regulator_ctrl(struct synaptics_rmi4_data *rmi4_data, unsigned int flag, bool enable)
+{
+ int retval = 0;
+ static unsigned int status;
+
+ if (rmi4_data == NULL)
+ return;
+ if (!rmi4_data->hw_if->board_data->panel_is_incell)
+ return;
+
+ if (enable) {
+ if (rmi4_data->disp_reg && (flag & DISP_REG_VDD) && !(status & DISP_REG_VDD)) {
+ retval = regulator_enable(rmi4_data->disp_reg);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to enable disp regulator\n",
+ __func__);
+ return;
+ }
+
+ status |= DISP_REG_VDD;
+ }
+
+ if (rmi4_data->lab_reg && (flag & DISP_REG_LAB) && !(status & DISP_REG_LAB)) {
+ retval = regulator_enable(rmi4_data->lab_reg);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to enable lab regulator\n",
+ __func__);
+ return;
+ }
+
+ status |= DISP_REG_LAB;
+ }
+
+ if (rmi4_data->ibb_reg && (flag & DISP_REG_IBB) && !(status & DISP_REG_IBB)) {
+ retval = regulator_enable(rmi4_data->ibb_reg);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to enable ibb regulator\n",
+ __func__);
+ return;
+ }
+
+ status |= DISP_REG_IBB;
+ }
+ } else {
+ if (rmi4_data->ibb_reg && (flag & DISP_REG_IBB) && (status & DISP_REG_IBB)) {
+ retval = regulator_disable(rmi4_data->ibb_reg);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to disable ibb regulator\n",
+ __func__);
+ return;
+ }
+
+ status &= ~DISP_REG_IBB;
+ }
+
+ if (rmi4_data->lab_reg && (flag & DISP_REG_LAB) && (status & DISP_REG_LAB)) {
+ retval = regulator_disable(rmi4_data->lab_reg);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to disable lab regulator\n",
+ __func__);
+ return;
+ }
+
+ status &= ~DISP_REG_LAB;
+ }
+
+ if (rmi4_data->disp_reg && (flag & DISP_REG_VDD) && (status & DISP_REG_VDD)) {
+ retval = regulator_disable(rmi4_data->disp_reg);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to disable disp regulator\n",
+ __func__);
+ return;
+ }
+
+ status &= ~DISP_REG_VDD;
+ }
+ }
+}
+
+static void mdss_reset_ctrl(const struct synaptics_dsx_board_data *bdata, bool on)
+{
+ if (!bdata->panel_is_incell)
+ return;
+
+ if (bdata->mdss_reset > 0) {
+ if (on)
+ gpio_set_value(bdata->mdss_reset, bdata->mdss_reset_state);
+ else
+ gpio_set_value(bdata->mdss_reset, !bdata->mdss_reset_state);
+ }
+}
+
+#if 0
+static void mdss_panel_poweron(struct synaptics_rmi4_data *rmi4_data, bool enable)
+{
+ if (!rmi4_data->hw_if->board_data->panel_is_incell)
+ return;
+
+ if (enable) {
+#if 0
+ /*disp regulator always on, so do not control this regulator*/
+ if (rmi4_data->panel_power_seq.disp_pre_on_sleep)
+ msleep(rmi4_data->panel_power_seq.disp_pre_on_sleep);
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_VDD, true);
+ if (rmi4_data->panel_power_seq.disp_post_on_sleep)
+ msleep(rmi4_data->panel_power_seq.disp_post_on_sleep);
+#endif
+ if (rmi4_data->panel_power_seq.lab_pre_on_sleep)
+ msleep(rmi4_data->panel_power_seq.lab_pre_on_sleep);
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_LAB, true);
+ if (rmi4_data->panel_power_seq.lab_post_on_sleep)
+ msleep(rmi4_data->panel_power_seq.lab_post_on_sleep);
+
+ if (rmi4_data->panel_power_seq.ibb_pre_on_sleep)
+ msleep(rmi4_data->panel_power_seq.ibb_pre_on_sleep);
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_IBB, true);
+ if (rmi4_data->panel_power_seq.ibb_post_on_sleep)
+ msleep(rmi4_data->panel_power_seq.ibb_post_on_sleep);
+ } else {
+ if (rmi4_data->panel_power_seq.ibb_pre_off_sleep)
+ msleep(rmi4_data->panel_power_seq.ibb_pre_off_sleep);
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_IBB, false);
+ if (rmi4_data->panel_power_seq.ibb_post_off_sleep)
+ msleep(rmi4_data->panel_power_seq.ibb_post_off_sleep);
+
+ if (rmi4_data->panel_power_seq.lab_pre_off_sleep)
+ msleep(rmi4_data->panel_power_seq.lab_pre_off_sleep);
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_LAB, false);
+ if (rmi4_data->panel_power_seq.lab_post_off_sleep)
+ msleep(rmi4_data->panel_power_seq.lab_post_off_sleep);
+#if 0
+ /*disp regulator always on, so do not control this regulator*/
+ if (rmi4_data->panel_power_seq.disp_pre_off_sleep)
+ msleep(rmi4_data->panel_power_seq.disp_pre_off_sleep);
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_VDD, false);
+ if (rmi4_data->panel_power_seq.disp_post_off_sleep)
+ msleep(rmi4_data->panel_power_seq.disp_post_off_sleep);
+#endif
+ }
+ pr_debug("power %s seq:\n", enable ? "on" : "off");
+#if 0
+ /*disp regulator always on, so do not control this regulator*/
+ pr_debug("IOVDD: preonsleep=%d,postonsleep=%d,preoffsleep=%d,postoffsleep=%d\n",
+ rmi4_data->panel_power_seq.disp_pre_on_sleep,
+ rmi4_data->panel_power_seq.disp_post_on_sleep,
+ rmi4_data->panel_power_seq.disp_pre_off_sleep,
+ rmi4_data->panel_power_seq.disp_post_off_sleep);
+#endif
+ pr_debug("LAB: preonsleep=%d,postonsleep=%d,preoffsleep=%d,postoffsleep=%d\n",
+ rmi4_data->panel_power_seq.lab_pre_on_sleep,
+ rmi4_data->panel_power_seq.lab_post_on_sleep,
+ rmi4_data->panel_power_seq.lab_pre_off_sleep,
+ rmi4_data->panel_power_seq.lab_post_off_sleep);
+ pr_debug("IBB: preonsleep=%d,postonsleep=%d,preoffsleep=%d,postoffsleep=%d\n",
+ rmi4_data->panel_power_seq.ibb_pre_on_sleep,
+ rmi4_data->panel_power_seq.ibb_post_on_sleep,
+ rmi4_data->panel_power_seq.ibb_pre_off_sleep,
+ rmi4_data->panel_power_seq.ibb_post_off_sleep);
+}
+#endif
+
+static void mdss_reset_action(const struct synaptics_dsx_board_data *bdata)
+{
+ if (bdata->mdss_reset > 0) {
+ gpio_set_value(bdata->mdss_reset, !bdata->mdss_reset_state);
+ msleep(10);
+ gpio_set_value(bdata->mdss_reset, bdata->mdss_reset_state);
+ msleep(10);
+ }
+}
+
+static void synaptics_rmi4_f12_wg(struct synaptics_rmi4_data *rmi4_data,
+ bool enable)
+{
+ int retval;
+ unsigned char offset;
+ unsigned char reporting_control[3];
+ struct synaptics_rmi4_f12_extra_data *extra_data;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_device_info *rmi;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->fn_number == SYNAPTICS_RMI4_F12)
+ break;
+ }
+
+ extra_data = (struct synaptics_rmi4_f12_extra_data *)fhandler->extra;
+ offset = extra_data->ctrl20_offset;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fhandler->full_addr.ctrl_base + offset,
+ reporting_control,
+ sizeof(reporting_control));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to change reporting mode\n",
+ __func__);
+ return;
+ }
+
+ if (enable)
+ reporting_control[2] = F12_WAKEUP_GESTURE_MODE;
+ else
+ reporting_control[2] = F12_CONTINUOUS_MODE;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ fhandler->full_addr.ctrl_base + offset,
+ reporting_control,
+ sizeof(reporting_control));
+
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to change reporting mode\n",
+ __func__);
+ return;
+ }
+
+ return;
+}
+
+static void synaptics_rmi4_wakeup_gesture(struct synaptics_rmi4_data *rmi4_data,
+ bool enable)
+{
+ if (rmi4_data->f11_wakeup_gesture)
+ synaptics_rmi4_f11_wg(rmi4_data, enable);
+ else if (rmi4_data->f12_wakeup_gesture)
+ synaptics_rmi4_f12_wg(rmi4_data, enable);
+
+ return;
+}
+
+#ifdef CONFIG_FB
+static int synaptics_rmi4_fb_notifier_cb(struct notifier_block *self,
+ unsigned long event, void *data)
+{
+ int *transition;
+ struct fb_event *evdata = data;
+ struct synaptics_rmi4_data *rmi4_data =
+ container_of(self, struct synaptics_rmi4_data,
+ fb_notifier);
+
+ const struct synaptics_dsx_board_data *bdata = NULL;
+
+ if (rmi4_data->hw_if->board_data)
+ bdata = rmi4_data->hw_if->board_data;
+ else
+ return 0;
+
+ /* Receive notifications from primary panel only */
+ if (evdata && evdata->data && rmi4_data && mdss_panel_is_prim(evdata->info)) {
+ if (event == FB_EVENT_BLANK) {
+ transition = evdata->data;
+ if ((*transition == FB_BLANK_POWERDOWN) || (*transition == FB_BLANK_NORMAL)) {
+ synaptics_rmi4_suspend(&rmi4_data->pdev->dev);
+ if (rmi4_data->pocketmode_on)
+ synaptics_rmi4_pocketmode(rmi4_data, rmi4_data->pocketmode_on);
+ rmi4_data->fb_ready = false;
+ } else if ((*transition == FB_BLANK_UNBLANK) || (*transition == FB_BLANK_NORMAL)) {
+ synaptics_rmi4_resume(&rmi4_data->pdev->dev);
+ rmi4_data->fb_ready = true;
+ if (rmi4_data->wakeup_en) {
+ mdss_panel_reset_skip_enable(false);
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_ALL, false);
+ mdss_dsi_ulps_suspend_enable(false);
+ mdss_dsi_ulps_enable(false);
+ rmi4_data->wakeup_en = false;
+ }
+
+ rmi4_data->disable_data_dump = false;
+ }
+ } else if (event == FB_EARLY_EVENT_BLANK) {
+ transition = evdata->data;
+ if ((*transition == FB_BLANK_POWERDOWN) || (*transition == FB_BLANK_NORMAL)) {
+ rmi4_data->disable_data_dump = true;
+ if (rmi4_data->dump_flags) {
+ reinit_completion(&rmi4_data->dump_completion);
+ wait_for_completion_timeout(&rmi4_data->dump_completion, 4 * HZ);
+ }
+
+ if (rmi4_data->enable_wakeup_gesture) {
+ rmi4_data->wakeup_en = true;
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_ALL, true);
+ mdss_panel_reset_skip_enable(true);
+ pr_debug("Enable suspend ulps\n");
+ mdss_dsi_ulps_enable(true);
+ mdss_dsi_ulps_suspend_enable(true);
+ }
+ } else if ((*transition == FB_BLANK_UNBLANK) || (*transition == FB_BLANK_NORMAL)) {
+ if (bdata->reset_gpio >= 0 && rmi4_data->suspend) {
+ gpio_set_value(bdata->reset_gpio, bdata->reset_on_state);
+ msleep(bdata->reset_active_ms);
+ gpio_set_value(bdata->reset_gpio, !bdata->reset_on_state);
+ }
+ if (rmi4_data->wakeup_en) {
+ mdss_reset_action(bdata);
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int synaptics_rmi4_fb_notifier_cb_tddi(struct notifier_block *self,
+ unsigned long event, void *data)
+{
+ int *transition;
+ struct fb_event *evdata = data;
+ struct synaptics_rmi4_data *rmi4_data =
+ container_of(self, struct synaptics_rmi4_data,
+ fb_notifier);
+
+ if (mdss_prim_panel_is_dead()) {
+ dev_err(rmi4_data->pdev->dev.parent, "%s: panel is dead\n", __func__);
+ return 0;
+ }
+ /* Receive notifications from primary panel only */
+ if (evdata && evdata->data && rmi4_data && mdss_panel_is_prim(evdata->info)) {
+ if (event == FB_EVENT_BLANK) {
+ transition = evdata->data;
+ if ((*transition == FB_BLANK_UNBLANK) || (*transition == FB_BLANK_NORMAL)) {
+ if (rmi4_data->wakeup_en) {
+ mdss_panel_reset_skip_enable(false);
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_ALL, false);
+ rmi4_data->wakeup_en = false;
+ } else {
+ synaptics_rmi4_resume(&rmi4_data->pdev->dev);
+ rmi4_data->fb_ready = true;
+ }
+
+ rmi4_data->disable_data_dump = false;
+ } else if ((*transition == FB_BLANK_POWERDOWN) || (*transition == FB_BLANK_NORMAL)) {
+ if (rmi4_data->wakeup_en) {
+ synaptics_rmi4_suspend(&rmi4_data->pdev->dev);
+ rmi4_data->fb_ready = true;
+ }
+ if (rmi4_data->pocketmode_on)
+ synaptics_rmi4_pocketmode(rmi4_data, rmi4_data->pocketmode_on);
+ }
+ } else if (event == FB_EARLY_EVENT_BLANK) {
+ transition = evdata->data;
+ if (*transition == FB_BLANK_UNBLANK) {
+ if (rmi4_data->wakeup_en) {
+ synaptics_rmi4_resume(&rmi4_data->pdev->dev);
+ rmi4_data->fb_ready = true;
+ msleep(30);
+ }
+ } else if ((*transition == FB_BLANK_POWERDOWN) || (*transition == FB_BLANK_NORMAL)) {
+ rmi4_data->disable_data_dump = true;
+ if (rmi4_data->dump_flags) {
+ reinit_completion(&rmi4_data->dump_completion);
+ wait_for_completion_timeout(&rmi4_data->dump_completion, 4 * HZ);
+ }
+
+ if (rmi4_data->enable_wakeup_gesture) {
+ rmi4_data->wakeup_en = true;
+ mdss_panel_reset_skip_enable(true);
+ mdss_regulator_ctrl(rmi4_data, DISP_REG_ALL, true);
+ }
+
+ if (!rmi4_data->wakeup_en) {
+ synaptics_rmi4_suspend(&rmi4_data->pdev->dev);
+ rmi4_data->fb_ready = false;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+#endif
+
+#ifdef USE_EARLYSUSPEND
+static void synaptics_rmi4_early_suspend(struct early_suspend *h)
+{
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+ struct synaptics_rmi4_data *rmi4_data =
+ container_of(h, struct synaptics_rmi4_data,
+ early_suspend);
+
+ if (rmi4_data->stay_awake)
+ return;
+
+ if (rmi4_data->enable_wakeup_gesture) {
+ synaptics_rmi4_wakeup_gesture(rmi4_data, true);
+ enable_irq_wake(rmi4_data->irq);
+ goto exit;
+ }
+
+ synaptics_rmi4_irq_enable(rmi4_data, false, false);
+ synaptics_rmi4_sleep_enable(rmi4_data, true);
+ synaptics_rmi4_free_fingers(rmi4_data);
+
+exit:
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link)
+ if (exp_fhandler->exp_fn->early_suspend != NULL)
+ exp_fhandler->exp_fn->early_suspend(rmi4_data);
+ }
+ mutex_unlock(&exp_data.mutex);
+
+ rmi4_data->suspend = true;
+
+ return;
+}
+
+static void synaptics_rmi4_late_resume(struct early_suspend *h)
+{
+#ifdef FB_READY_RESET
+ int retval;
+#endif
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+ struct synaptics_rmi4_data *rmi4_data =
+ container_of(h, struct synaptics_rmi4_data,
+ early_suspend);
+
+ if (rmi4_data->stay_awake)
+ return;
+
+ if (rmi4_data->enable_wakeup_gesture) {
+ synaptics_rmi4_wakeup_gesture(rmi4_data, false);
+ disable_irq_wake(rmi4_data->irq);
+ goto exit;
+ }
+
+ rmi4_data->current_page = MASK_8BIT;
+
+ if (rmi4_data->suspend) {
+ synaptics_rmi4_sleep_enable(rmi4_data, false);
+ synaptics_rmi4_irq_enable(rmi4_data, true, false);
+ }
+
+exit:
+#ifdef FB_READY_RESET
+ if (rmi4_data->suspend) {
+ retval = synaptics_rmi4_reset_device(rmi4_data, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to issue reset command\n",
+ __func__);
+ }
+ }
+#endif
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link)
+ if (exp_fhandler->exp_fn->late_resume != NULL)
+ exp_fhandler->exp_fn->late_resume(rmi4_data);
+ }
+ mutex_unlock(&exp_data.mutex);
+
+ rmi4_data->suspend = false;
+
+ return;
+}
+#endif
+
+static void synaptics_rmi4_pocketmode(struct synaptics_rmi4_data *rmi4_data, bool onoff)
+{
+ if (!rmi4_data->wakeup_en)
+ return;
+ synaptics_rmi4_sleep_enable(rmi4_data, onoff);
+}
+
+static int synaptics_rmi4_suspend(struct device *dev)
+{
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (rmi4_data->stay_awake || rmi4_data->suspend)
+ return 0;
+
+ if (!rmi4_data->wakeup_en && rmi4_data->ts_pinctrl) {
+ if (pinctrl_select_state(rmi4_data->ts_pinctrl,
+ rmi4_data->pinctrl_state_suspend) < 0)
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to select %s pinstate\n",
+ __func__, PINCTRL_STATE_SUSPEND);
+ }
+
+ if (bdata->cut_off_power || (rmi4_data->chip_is_tddi && !rmi4_data->wakeup_en)) {
+ if (rmi4_data->fw_updating)
+ return 0;
+
+ synaptics_rmi4_irq_enable(rmi4_data, false, false);
+
+ if (bdata->power_gpio >= 0)
+ gpio_set_value(bdata->power_gpio,
+ !bdata->power_on_state);
+
+ if (bdata->reset_gpio >= 0) {
+ gpio_set_value(bdata->reset_gpio,
+ bdata->reset_on_state);
+ mdelay(bdata->reset_active_ms);
+ }
+
+ synaptics_rmi4_enable_reg(rmi4_data, false);
+ } else {
+ synaptics_secure_touch_stop(rmi4_data, 1);
+
+ synaptics_rmi4_irq_enable(rmi4_data, false, false);
+
+ if (!rmi4_data->wakeup_en)
+ synaptics_rmi4_sleep_enable(rmi4_data, true);
+ else {
+ if (!rmi4_data->chip_is_tddi)
+ msleep(300);
+ else
+ msleep(120);
+ synaptics_rmi4_wakeup_gesture(rmi4_data, true);
+ synaptics_rmi4_irq_enable(rmi4_data, true, false);
+ goto exit;
+ }
+
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link)
+ if (exp_fhandler->exp_fn->suspend != NULL)
+ exp_fhandler->exp_fn->suspend(rmi4_data);
+ }
+ mutex_unlock(&exp_data.mutex);
+ }
+
+exit:
+ synaptics_rmi4_free_fingers(rmi4_data);
+
+ rmi4_data->suspend = true;
+
+ return 0;
+}
+
+static int synaptics_rmi4_resume(struct device *dev)
+{
+#ifdef FB_READY_RESET
+ int retval;
+#endif
+ struct synaptics_rmi4_exp_fhandler *exp_fhandler;
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+#ifdef CONFIG_FB
+ static int skip;
+
+ if (skip == 0) {
+ skip = 1;
+ return 0;
+ }
+#endif
+
+ if (rmi4_data->stay_awake || !rmi4_data->suspend)
+ return 0;
+
+ if (!rmi4_data->wakeup_en && rmi4_data->ts_pinctrl) {
+ if (pinctrl_select_state(rmi4_data->ts_pinctrl,
+ rmi4_data->pinctrl_state_active) < 0)
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to select %s pinstate\n",
+ __func__, PINCTRL_STATE_ACTIVE);
+ }
+
+ if (bdata->cut_off_power || (rmi4_data->chip_is_tddi && !rmi4_data->wakeup_en)) {
+ synaptics_rmi4_enable_reg(rmi4_data, true);
+
+ if (bdata->power_gpio >= 0) {
+ gpio_set_value(bdata->power_gpio,
+ bdata->power_on_state);
+ mdelay(bdata->power_delay_ms);
+ }
+
+ if (bdata->reset_gpio >= 0) {
+ gpio_set_value(bdata->reset_gpio,
+ !bdata->reset_on_state);
+ mdelay(bdata->reset_delay_ms);
+ }
+
+ synaptics_rmi4_irq_enable(rmi4_data, true, false);
+ } else {
+ synaptics_secure_touch_stop(rmi4_data, 0);
+
+ if (rmi4_data->wakeup_en) {
+ synaptics_rmi4_wakeup_gesture(rmi4_data, false);
+ } else {
+ rmi4_data->current_page = MASK_8BIT;
+
+ synaptics_rmi4_sleep_enable(rmi4_data, false);
+ synaptics_rmi4_irq_enable(rmi4_data, true, false);
+
+#ifdef FB_READY_RESET
+ retval = synaptics_rmi4_reset_device(rmi4_data, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to issue reset command\n",
+ __func__);
+ }
+#endif
+ mutex_lock(&exp_data.mutex);
+ if (!list_empty(&exp_data.list)) {
+ list_for_each_entry(exp_fhandler, &exp_data.list, link)
+ if (exp_fhandler->exp_fn->resume != NULL)
+ exp_fhandler->exp_fn->resume(rmi4_data);
+ }
+ mutex_unlock(&exp_data.mutex);
+ }
+ }
+
+ rmi4_data->suspend = false;
+
+ if (rmi4_data->enable_cover_mode)
+ cover_mode_set(rmi4_data, rmi4_data->enable_cover_mode);
+
+ return 0;
+}
+
+#ifdef CONFIG_PM
+static int synaptics_rmi4_pm_suspend(struct device *dev)
+{
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (device_may_wakeup(dev) &&
+ rmi4_data->wakeup_en &&
+ !bdata->cut_off_power) {
+ dev_info(rmi4_data->pdev->dev.parent,
+ "Enable touch irq wake\n");
+ disable_irq(rmi4_data->irq);
+ enable_irq_wake(rmi4_data->irq);
+ }
+
+ return 0;
+
+}
+
+static int synaptics_rmi4_pm_resume(struct device *dev)
+{
+ struct synaptics_rmi4_data *rmi4_data = dev_get_drvdata(dev);
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (device_may_wakeup(dev) &&
+ rmi4_data->wakeup_en &&
+ !bdata->cut_off_power) {
+ dev_info(rmi4_data->pdev->dev.parent,
+ "Disable touch irq wake\n");
+ disable_irq_wake(rmi4_data->irq);
+ enable_irq(rmi4_data->irq);
+ }
+
+ return 0;
+}
+
+static const struct dev_pm_ops synaptics_rmi4_dev_pm_ops = {
+ .suspend = synaptics_rmi4_pm_suspend,
+ .resume = synaptics_rmi4_pm_resume,
+};
+#endif
+
+static struct platform_driver synaptics_rmi4_driver = {
+ .driver = {
+ .name = PLATFORM_DRIVER_FORCE,
+ .owner = THIS_MODULE,
+#ifdef CONFIG_PM
+ .pm = &synaptics_rmi4_dev_pm_ops,
+#endif
+ },
+ .probe = synaptics_rmi4_probe,
+ .remove = synaptics_rmi4_remove,
+};
+
+static int __init synaptics_rmi4_init(void)
+{
+ int retval;
+
+ retval = synaptics_rmi4_bus_init_force();
+ if (retval)
+ return retval;
+
+ return platform_driver_register(&synaptics_rmi4_driver);
+}
+
+static void __exit synaptics_rmi4_exit(void)
+{
+ platform_driver_unregister(&synaptics_rmi4_driver);
+
+ synaptics_rmi4_bus_exit_force();
+
+ return;
+}
+
+module_init(synaptics_rmi4_init);
+module_exit(synaptics_rmi4_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX Touch Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_core.h b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_core.h
new file mode 100644
index 000000000000..020e618da2d2
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_core.h
@@ -0,0 +1,553 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#ifndef _SYNAPTICS_DSX_RMI4_H_
+#define _SYNAPTICS_DSX_RMI4_H_
+
+#define SYNAPTICS_DS4 (1 << 0)
+#define SYNAPTICS_DS5 (1 << 1)
+#define SYNAPTICS_DSX_DRIVER_PRODUCT (SYNAPTICS_DS4 | SYNAPTICS_DS5)
+#define SYNAPTICS_DSX_DRIVER_VERSION 0x2065
+
+#include <linux/version.h>
+#ifdef CONFIG_FB
+#include <linux/notifier.h>
+#include <linux/fb.h>
+#endif
+#ifdef CONFIG_HAS_EARLYSUSPEND
+#include <linux/earlysuspend.h>
+#endif
+
+#if defined(CONFIG_SECURE_TOUCH)
+#include <linux/completion.h>
+#include <linux/atomic.h>
+#include <linux/clk.h>
+#endif
+#include <linux/input/synaptics_dsx.h>
+
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38))
+#define KERNEL_ABOVE_2_6_38
+#endif
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0))
+#define KERNEL_ABOVE_3_6
+#endif
+
+#ifdef KERNEL_ABOVE_2_6_38
+#define sstrtoul(...) kstrtoul(__VA_ARGS__)
+#else
+#define sstrtoul(...) strict_strtoul(__VA_ARGS__)
+#endif
+
+#define PDT_PROPS (0X00EF)
+#define PDT_START (0x00E9)
+#define PDT_END (0x00D0)
+#define PDT_ENTRY_SIZE (0x0006)
+#define PAGES_TO_SERVICE (10)
+#define PAGE_SELECT_LEN (2)
+#define ADDRESS_LEN (2)
+
+#define SYNAPTICS_RMI4_F01 (0x01)
+#define SYNAPTICS_RMI4_F11 (0x11)
+#define SYNAPTICS_RMI4_F12 (0x12)
+#define SYNAPTICS_RMI4_F1A (0x1A)
+#define SYNAPTICS_RMI4_F34 (0x34)
+#define SYNAPTICS_RMI4_F35 (0x35)
+#define SYNAPTICS_RMI4_F38 (0x38)
+#define SYNAPTICS_RMI4_F51 (0x51)
+#define SYNAPTICS_RMI4_F54 (0x54)
+#define SYNAPTICS_RMI4_F55 (0x55)
+#define SYNAPTICS_RMI4_FDB (0xDB)
+
+#define PRODUCT_INFO_SIZE 2
+#define PRODUCT_ID_SIZE 10
+#define BUILD_ID_SIZE 3
+#define LOCKDOWN_INFO_SIZE 8
+
+#define F12_FINGERS_TO_SUPPORT 10
+#define F12_NO_OBJECT_STATUS 0x00
+#define F12_FINGER_STATUS 0x01
+#define F12_ACTIVE_STYLUS_STATUS 0x02
+#define F12_PALM_STATUS 0x03
+#define F12_HOVERING_FINGER_STATUS 0x05
+#define F12_GLOVED_FINGER_STATUS 0x06
+#define F12_NARROW_OBJECT_STATUS 0x07
+#define F12_HAND_EDGE_STATUS 0x08
+#define F12_COVER_STATUS 0x0A
+#define F12_STYLUS_STATUS 0x0B
+#define F12_ERASER_STATUS 0x0C
+#define F12_SMALL_OBJECT_STATUS 0x0D
+
+#define F12_GESTURE_DETECTION_LEN 5
+
+#define MAX_NUMBER_OF_BUTTONS 4
+#define MAX_INTR_REGISTERS 4
+
+#define MASK_16BIT 0xFFFF
+#define MASK_8BIT 0xFF
+#define MASK_7BIT 0x7F
+#define MASK_6BIT 0x3F
+#define MASK_5BIT 0x1F
+#define MASK_4BIT 0x0F
+#define MASK_3BIT 0x07
+#define MASK_2BIT 0x03
+#define MASK_1BIT 0x01
+
+#define PINCTRL_STATE_ACTIVE "pmx_ts_active"
+#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend"
+#ifdef CONFIG_SYNAPTICS_TOUCH_COUNT_DUMP
+#define TOUCH_COUNT_FILE_MAXSIZE 50
+#endif
+
+enum exp_fn {
+ RMI_DEV = 0,
+ RMI_FW_UPDATER,
+ RMI_TEST_REPORTING,
+ RMI_PROXIMITY,
+ RMI_ACTIVE_PEN,
+ RMI_GESTURE,
+ RMI_VIDEO,
+ RMI_DEBUG,
+ RMI_LAST,
+};
+
+/*
+ * struct synaptics_rmi4_fn_desc - function descriptor fields in PDT entry
+ * @query_base_addr: base address for query registers
+ * @cmd_base_addr: base address for command registers
+ * @ctrl_base_addr: base address for control registers
+ * @data_base_addr: base address for data registers
+ * @intr_src_count: number of interrupt sources
+ * @fn_version: version of function
+ * @fn_number: function number
+ */
+struct synaptics_rmi4_fn_desc {
+ union {
+ struct {
+ unsigned char query_base_addr;
+ unsigned char cmd_base_addr;
+ unsigned char ctrl_base_addr;
+ unsigned char data_base_addr;
+ unsigned char intr_src_count:3;
+ unsigned char reserved_1:2;
+ unsigned char fn_version:2;
+ unsigned char reserved_2:1;
+ unsigned char fn_number;
+ } __packed;
+ unsigned char data[6];
+ };
+};
+
+/*
+ * synaptics_rmi4_fn_full_addr - full 16-bit base addresses
+ * @query_base: 16-bit base address for query registers
+ * @cmd_base: 16-bit base address for command registers
+ * @ctrl_base: 16-bit base address for control registers
+ * @data_base: 16-bit base address for data registers
+ */
+struct synaptics_rmi4_fn_full_addr {
+ unsigned short query_base;
+ unsigned short cmd_base;
+ unsigned short ctrl_base;
+ unsigned short data_base;
+};
+
+/*
+ * struct synaptics_rmi4_f11_extra_data - extra data of F$11
+ * @data38_offset: offset to F11_2D_DATA38 register
+ */
+struct synaptics_rmi4_f11_extra_data {
+ unsigned char data38_offset;
+};
+
+/*
+ * struct synaptics_rmi4_f12_extra_data - extra data of F$12
+ * @data1_offset: offset to F12_2D_DATA01 register
+ * @data4_offset: offset to F12_2D_DATA04 register
+ * @data15_offset: offset to F12_2D_DATA15 register
+ * @data15_size: size of F12_2D_DATA15 register
+ * @data15_data: buffer for reading F12_2D_DATA15 register
+ * @data29_offset: offset to F12_2D_DATA29 register
+ * @data29_size: size of F12_2D_DATA29 register
+ * @data29_data: buffer for reading F12_2D_DATA29 register
+ * @ctrl20_offset: offset to F12_2D_CTRL20 register
+ */
+struct synaptics_rmi4_f12_extra_data {
+ unsigned char data1_offset;
+ unsigned char data4_offset;
+ unsigned char data15_offset;
+ unsigned char data15_size;
+ unsigned char data15_data[(F12_FINGERS_TO_SUPPORT + 7) / 8];
+ unsigned char data29_offset;
+ unsigned char data29_size;
+ unsigned char data29_data[F12_FINGERS_TO_SUPPORT * 2];
+ unsigned char ctrl20_offset;
+ unsigned char ctrl26_offset;
+ unsigned char ctrl27_offset;
+};
+
+/*
+ * struct synaptics_rmi4_fn - RMI function handler
+ * @fn_number: function number
+ * @num_of_data_sources: number of data sources
+ * @num_of_data_points: maximum number of fingers supported
+ * @intr_reg_num: index to associated interrupt register
+ * @intr_mask: interrupt mask
+ * @full_addr: full 16-bit base addresses of function registers
+ * @link: linked list for function handlers
+ * @data_size: size of private data
+ * @data: pointer to private data
+ * @extra: pointer to extra data
+ */
+struct synaptics_rmi4_fn {
+ unsigned char fn_number;
+ unsigned char num_of_data_sources;
+ unsigned char num_of_data_points;
+ unsigned char intr_reg_num;
+ unsigned char intr_mask;
+ struct synaptics_rmi4_fn_full_addr full_addr;
+ struct list_head link;
+ int data_size;
+ void *data;
+ void *extra;
+};
+
+/*
+ * struct synaptics_rmi4_device_info - device information
+ * @version_major: RMI protocol major version number
+ * @version_minor: RMI protocol minor version number
+ * @manufacturer_id: manufacturer ID
+ * @product_props: product properties
+ * @product_info: product information
+ * @product_id_string: product ID
+ * @build_id: firmware build ID
+ * @support_fn_list: linked list for function handlers
+ */
+struct synaptics_rmi4_device_info {
+ unsigned int version_major;
+ unsigned int version_minor;
+ unsigned char manufacturer_id;
+ unsigned char product_props;
+ unsigned char product_info[PRODUCT_INFO_SIZE];
+ unsigned char product_id_string[PRODUCT_ID_SIZE + 1];
+ unsigned char build_id[BUILD_ID_SIZE];
+ struct list_head support_fn_list;
+};
+
+/*
+ * struct synaptics_rmi4_data - RMI4 device instance data
+ * @pdev: pointer to platform device
+ * @input_dev: pointer to associated input device
+ * @stylus_dev: pointer to associated stylus device
+ * @hw_if: pointer to hardware interface data
+ * @rmi4_mod_info: device information
+ * @board_prop_dir: /sys/board_properties directory for virtual key map file
+ * @pwr_reg: pointer to regulator for power control
+ * @lab_reg: pointer to regulator for LCD lab control
+ * @ibb_reg: pointer to regulator for LCD ibb control
+ * @disp_reg: pointer to regulator for LCD disp control
+ * @bus_reg: pointer to regulator for bus pullup control
+ * @rmi4_reset_mutex: mutex for software reset
+ * @rmi4_report_mutex: mutex for input event reporting
+ * @rmi4_io_ctrl_mutex: mutex for communication interface I/O
+ * @rmi4_exp_init_mutex: mutex for expansion function module initialization
+ * @rmi4_irq_enable_mutex: mutex for enabling/disabling interrupt
+ * @rb_work: work for rebuilding input device
+ * @rb_workqueue: workqueue for rebuilding input device
+ * @fb_notifier: framebuffer notifier client
+ * @reset_work: work for issuing reset after display framebuffer ready
+ * @reset_workqueue: workqueue for issuing reset after display framebuffer ready
+ * @early_suspend: early suspend power management
+ * @current_page: current RMI page for register access
+ * @button_0d_enabled: switch for enabling 0d button support
+ * @num_of_tx: number of Tx channels for 2D touch
+ * @num_of_rx: number of Rx channels for 2D touch
+ * @num_of_fingers: maximum number of fingers for 2D touch
+ * @max_touch_width: maximum touch width
+ * @report_enable: input data to report for F$12
+ * @no_sleep_setting: default setting of NoSleep in F01_RMI_CTRL00 register
+ * @gesture_detection: detected gesture type and properties
+ * @intr_mask: interrupt enable mask
+ * @button_txrx_mapping: Tx Rx mapping of 0D buttons
+ * @num_of_intr_regs: number of interrupt registers
+ * @f01_query_base_addr: query base address for f$01
+ * @f01_cmd_base_addr: command base address for f$01
+ * @f01_ctrl_base_addr: control base address for f$01
+ * @f01_data_base_addr: data base address for f$01
+ * @firmware_id: firmware build ID
+ * @irq: attention interrupt
+ * @sensor_max_x: maximum x coordinate for 2D touch
+ * @sensor_max_y: maximum y coordinate for 2D touch
+ * @flash_prog_mode: flag to indicate flash programming mode status
+ * @irq_enabled: flag to indicate attention interrupt enable status
+ * @fingers_on_2d: flag to indicate presence of fingers in 2D area
+ * @suspend: flag to indicate whether in suspend state
+ * @sensor_sleep: flag to indicate sleep state of sensor
+ * @stay_awake: flag to indicate whether to stay awake during suspend
+ * @fb_ready: flag to indicate whether display framebuffer in ready state
+ * @f11_wakeup_gesture: flag to indicate support for wakeup gestures in F$11
+ * @f12_wakeup_gesture: flag to indicate support for wakeup gestures in F$12
+ * @enable_wakeup_gesture: flag to indicate usage of wakeup gestures
+ * @wedge_sensor: flag to indicate use of wedge sensor
+ * @report_pressure: flag to indicate reporting of pressure data
+ * @stylus_enable: flag to indicate reporting of stylus data
+ * @eraser_enable: flag to indicate reporting of eraser data
+ * @external_afe_buttons: flag to indicate presence of external AFE buttons
+ * @reset_device: pointer to device reset function
+ * @irq_enable: pointer to interrupt enable function
+ * @sleep_enable: pointer to sleep enable function
+ * @report_touch: pointer to touch reporting function
+ */
+struct synaptics_rmi4_data {
+ struct platform_device *pdev;
+ struct input_dev *input_dev;
+ struct input_dev *stylus_dev;
+ const struct synaptics_dsx_hw_interface *hw_if;
+ struct synaptics_rmi4_device_info rmi4_mod_info;
+ struct kobject *board_prop_dir;
+ struct regulator *pwr_reg;
+ struct regulator *lab_reg;
+ struct regulator *ibb_reg;
+ struct regulator *disp_reg;
+ struct regulator *bus_reg;
+ struct mutex rmi4_reset_mutex;
+ struct mutex rmi4_report_mutex;
+ struct mutex rmi4_io_ctrl_mutex;
+ struct mutex rmi4_exp_init_mutex;
+ struct mutex rmi4_cover_mutex;
+ struct mutex rmi4_irq_enable_mutex;
+ struct delayed_work rb_work;
+ struct workqueue_struct *rb_workqueue;
+ struct synaptics_dsx_panel_power_seq panel_power_seq;
+#ifdef CONFIG_FB
+ struct notifier_block fb_notifier;
+ struct work_struct reset_work;
+ struct workqueue_struct *reset_workqueue;
+#endif
+#ifdef CONFIG_HAS_EARLYSUSPEND
+ struct early_suspend early_suspend;
+#endif
+ struct delayed_work tddi_reset_work;
+ unsigned char current_page;
+ unsigned char button_0d_enabled;
+ unsigned char num_of_tx;
+ unsigned char num_of_rx;
+ unsigned char num_of_fingers;
+ unsigned char max_touch_width;
+ unsigned char report_enable;
+ unsigned char no_sleep_setting;
+ unsigned char gesture_detection[F12_GESTURE_DETECTION_LEN];
+ unsigned char intr_mask[MAX_INTR_REGISTERS];
+ unsigned char *button_txrx_mapping;
+ unsigned short num_of_intr_regs;
+ unsigned short f01_query_base_addr;
+ unsigned short f01_cmd_base_addr;
+ unsigned short f01_ctrl_base_addr;
+ unsigned short f01_data_base_addr;
+#ifdef F51_DISCRETE_FORCE
+ unsigned short f51_query_base_addr;
+#endif
+ unsigned int hw_version;
+ unsigned int firmware_id;
+ unsigned char lockdown_info[LOCKDOWN_INFO_SIZE];
+ unsigned char valid_button_count;
+ unsigned char enable_cover_mode;
+ int irq;
+ int sensor_max_x;
+ int sensor_max_y;
+ int force_min;
+ int force_max;
+ int chip_id;
+ int touchs;
+ bool flash_prog_mode;
+ bool irq_enabled;
+ bool fingers_on_2d;
+ bool suspend;
+ bool sensor_sleep;
+ bool stay_awake;
+ bool fb_ready;
+ bool f11_wakeup_gesture;
+ bool f12_wakeup_gesture;
+ bool enable_wakeup_gesture;
+ bool wedge_sensor;
+ bool report_pressure;
+ bool stylus_enable;
+ bool eraser_enable;
+ bool external_afe_buttons;
+ bool fw_updating;
+ bool wakeup_en;
+ bool chip_is_tddi;
+ bool open_test_b7;
+ bool short_test_extend;
+ bool disable_data_dump;
+ bool dump_flags;
+ int (*reset_device)(struct synaptics_rmi4_data *rmi4_data,
+ bool rebuild);
+ int (*irq_enable)(struct synaptics_rmi4_data *rmi4_data, bool enable,
+ bool attn_only);
+ void (*sleep_enable)(struct synaptics_rmi4_data *rmi4_data,
+ bool enable);
+ void (*report_touch)(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn *fhandler);
+ struct pinctrl *ts_pinctrl;
+ struct pinctrl_state *pinctrl_state_active;
+ struct pinctrl_state *pinctrl_state_suspend;
+ struct synaptics_dsx_factory_param *factory_param;
+
+ struct completion dump_completion;
+#ifdef CONFIG_TOUCH_DEBUG_FS
+ struct dentry *debugfs;
+#endif
+ struct delayed_work event_check;
+ struct workqueue_struct *event_wq;
+#if defined(CONFIG_SECURE_TOUCH)
+ atomic_t st_enabled;
+ atomic_t st_pending_irqs;
+ bool st_initialized;
+ struct completion st_powerdown;
+ struct completion st_irq_processed;
+ struct clk *core_clk;
+ struct clk *iface_clk;
+#endif
+#ifdef CONFIG_SYNAPTICS_TOUCH_COUNT_DUMP
+ char *current_clicknum_file;
+#endif
+ bool pocketmode_on;
+};
+
+struct synaptics_dsx_bus_access {
+ unsigned char type;
+ int (*read)(struct synaptics_rmi4_data *rmi4_data, unsigned short addr,
+ unsigned char *data, unsigned short length);
+ int (*write)(struct synaptics_rmi4_data *rmi4_data, unsigned short addr,
+ unsigned char *data, unsigned short length);
+};
+
+struct synaptics_dsx_hw_interface {
+ struct synaptics_dsx_board_data *board_data;
+ const struct synaptics_dsx_bus_access *bus_access;
+ int (*bl_hw_init)(struct synaptics_rmi4_data *rmi4_data);
+ int (*ui_hw_init)(struct synaptics_rmi4_data *rmi4_data);
+};
+
+struct synaptics_rmi4_exp_fn {
+ enum exp_fn fn_type;
+ int (*init)(struct synaptics_rmi4_data *rmi4_data);
+ void (*remove)(struct synaptics_rmi4_data *rmi4_data);
+ void (*reset)(struct synaptics_rmi4_data *rmi4_data);
+ void (*reinit)(struct synaptics_rmi4_data *rmi4_data);
+ void (*early_suspend)(struct synaptics_rmi4_data *rmi4_data);
+ void (*suspend)(struct synaptics_rmi4_data *rmi4_data);
+ void (*resume)(struct synaptics_rmi4_data *rmi4_data);
+ void (*late_resume)(struct synaptics_rmi4_data *rmi4_data);
+ void (*attn)(struct synaptics_rmi4_data *rmi4_data,
+ unsigned char intr_mask);
+};
+
+struct synaptics_rmi4_mode_switch {
+ struct synaptics_rmi4_data *data;
+ unsigned char mode;
+ struct work_struct switch_mode_work;
+};
+
+int synaptics_rmi4_bus_init_force(void);
+
+void synaptics_rmi4_bus_exit_force(void);
+
+void synaptics_rmi4_new_function_force(struct synaptics_rmi4_exp_fn *exp_fn_module,
+ bool insert);
+
+int synaptics_fw_updater(const unsigned char *fw_data);
+
+static inline int synaptics_rmi4_reg_read(
+ struct synaptics_rmi4_data *rmi4_data,
+ unsigned short addr,
+ unsigned char *data,
+ unsigned short len)
+{
+ return rmi4_data->hw_if->bus_access->read(rmi4_data, addr, data, len);
+}
+
+static inline int synaptics_rmi4_reg_write(
+ struct synaptics_rmi4_data *rmi4_data,
+ unsigned short addr,
+ unsigned char *data,
+ unsigned short len)
+{
+ return rmi4_data->hw_if->bus_access->write(rmi4_data, addr, data, len);
+}
+
+static inline ssize_t synaptics_rmi4_show_error(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ dev_warn(dev, "%s Attempted to read from write-only attribute %s\n",
+ __func__, attr->attr.name);
+ return -EPERM;
+}
+
+static inline ssize_t synaptics_rmi4_store_error(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ dev_warn(dev, "%s Attempted to write to read-only attribute %s\n",
+ __func__, attr->attr.name);
+ return -EPERM;
+}
+
+static inline int secure_memcpy(unsigned char *dest, unsigned int dest_size,
+ const unsigned char *src, unsigned int src_size,
+ unsigned int count)
+{
+ if (dest == NULL || src == NULL)
+ return -EINVAL;
+
+ if (count > dest_size || count > src_size)
+ return -EINVAL;
+
+ memcpy((void *)dest, (const void *)src, count);
+
+ return 0;
+}
+
+static inline void batohs(unsigned short *dest, unsigned char *src)
+{
+ *dest = src[1] * 0x100 + src[0];
+}
+
+static inline void hstoba(unsigned char *dest, unsigned short src)
+{
+ dest[0] = src % 0x100;
+ dest[1] = src / 0x100;
+}
+
+#endif
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_fw_update.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_fw_update.c
new file mode 100644
index 000000000000..2b97adfc515b
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_fw_update.c
@@ -0,0 +1,5506 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/firmware.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+
+#define FW_IHEX_NAME "synaptics/startup_fw_update.bin"
+#define FW_IMAGE_NAME "synaptics/startup_fw_update.img"
+#define DO_STARTUP_FW_UPDATE
+
+/*
+#ifdef DO_STARTUP_FW_UPDATE
+#ifdef CONFIG_FB
+#define WAIT_FOR_FB_READY
+#define FB_READY_WAIT_MS 100
+#define FB_READY_TIMEOUT_S 30
+#endif
+#endif
+*/
+#define MAX_WRITE_SIZE 4096
+
+#define FORCE_UPDATE false
+#define DO_LOCKDOWN false
+
+#define MAX_IMAGE_NAME_LEN 256
+#define MAX_FIRMWARE_ID_LEN 10
+
+#define IMAGE_HEADER_VERSION_05 0x05
+#define IMAGE_HEADER_VERSION_06 0x06
+#define IMAGE_HEADER_VERSION_10 0x10
+
+#define IMAGE_AREA_OFFSET 0x100
+#define LOCKDOWN_SIZE 0x50
+
+#define MAX_UTILITY_PARAMS 20
+
+#define V5V6_BOOTLOADER_ID_OFFSET 0
+#define V5V6_CONFIG_ID_SIZE 4
+
+#define V5_PROPERTIES_OFFSET 2
+#define V5_BLOCK_SIZE_OFFSET 3
+#define V5_BLOCK_COUNT_OFFSET 5
+#define V5_BLOCK_NUMBER_OFFSET 0
+#define V5_BLOCK_DATA_OFFSET 2
+
+#define V6_PROPERTIES_OFFSET 1
+#define V6_BLOCK_SIZE_OFFSET 2
+#define V6_BLOCK_COUNT_OFFSET 3
+#define V6_PROPERTIES_2_OFFSET 4
+#define V6_BLOCK_NUMBER_OFFSET 0
+#define V6_BLOCK_DATA_OFFSET 1
+#define V6_FLASH_COMMAND_OFFSET 2
+#define V6_FLASH_STATUS_OFFSET 3
+
+#define V7_CONFIG_ID_SIZE 32
+
+#define V7_FLASH_STATUS_OFFSET 0
+#define V7_PARTITION_ID_OFFSET 1
+#define V7_BLOCK_NUMBER_OFFSET 2
+#define V7_TRANSFER_LENGTH_OFFSET 3
+#define V7_COMMAND_OFFSET 4
+#define V7_PAYLOAD_OFFSET 5
+
+#define V7_PARTITION_SUPPORT_BYTES 4
+
+#define F35_ERROR_CODE_OFFSET 0
+#define F35_FLASH_STATUS_OFFSET 5
+#define F35_CHUNK_NUM_LSB_OFFSET 0
+#define F35_CHUNK_NUM_MSB_OFFSET 1
+#define F35_CHUNK_DATA_OFFSET 2
+#define F35_CHUNK_COMMAND_OFFSET 18
+
+#define F35_CHUNK_SIZE 16
+#define F35_ERASE_ALL_WAIT_MS 5000
+#define F35_RESET_WAIT_MS 250
+
+#define SLEEP_MODE_NORMAL (0x00)
+#define SLEEP_MODE_SENSOR_SLEEP (0x01)
+#define SLEEP_MODE_RESERVED0 (0x02)
+#define SLEEP_MODE_RESERVED1 (0x03)
+
+#define ENABLE_WAIT_MS (1 * 1000)
+#define WRITE_WAIT_MS (3 * 1000)
+#define ERASE_WAIT_MS (5 * 1000)
+
+#define MIN_SLEEP_TIME_US 50
+#define MAX_SLEEP_TIME_US 100
+
+#define INT_DISABLE_WAIT_MS 20
+#define ENTER_FLASH_PROG_WAIT_MS 20
+
+static int fwu_do_reflash(void);
+
+static int fwu_recovery_check_status(void);
+
+static int fwu_read_f34_blocks(unsigned short block_cnt, unsigned char cmd);
+
+static ssize_t fwu_sysfs_show_image(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t fwu_sysfs_store_image(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t fwu_sysfs_do_recovery_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t fwu_sysfs_do_reflash_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t fwu_sysfs_write_config_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t fwu_sysfs_read_config_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t fwu_sysfs_config_area_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t fwu_sysfs_image_name_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t fwu_sysfs_image_size_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t fwu_sysfs_block_size_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t fwu_sysfs_firmware_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t fwu_sysfs_configuration_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t fwu_sysfs_disp_config_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t fwu_sysfs_perm_config_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t fwu_sysfs_bl_config_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t fwu_sysfs_guest_code_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t fwu_sysfs_write_guest_code_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static void firmware_force_update(struct synaptics_rmi4_data *rmi4_data);
+
+enum f34_version {
+ F34_V0 = 0,
+ F34_V1,
+ F34_V2,
+};
+
+enum bl_version {
+ BL_V5 = 5,
+ BL_V6 = 6,
+ BL_V7 = 7,
+ BL_V8 = 8,
+};
+
+enum flash_area {
+ NONE = 0,
+ UI_FIRMWARE,
+ UI_CONFIG,
+};
+
+enum update_mode {
+ NORMAL = 1,
+ FORCE = 2,
+ LOCKDOWN = 8,
+};
+
+enum config_area {
+ UI_CONFIG_AREA = 0,
+ PM_CONFIG_AREA,
+ BL_CONFIG_AREA,
+ DP_CONFIG_AREA,
+ FLASH_CONFIG_AREA,
+ INVALID_CONFIG_AREA = 0xff,
+};
+
+enum v7_status {
+ SUCCESS = 0x00,
+ DEVICE_NOT_IN_BOOTLOADER_MODE,
+ INVALID_PARTITION,
+ INVALID_COMMAND,
+ INVALID_BLOCK_OFFSET,
+ INVALID_TRANSFER,
+ NOT_ERASED,
+ FLASH_PROGRAMMING_KEY_INCORRECT,
+ BAD_PARTITION_TABLE,
+ CHECKSUM_FAILED,
+ FLASH_HARDWARE_FAILURE = 0x1f,
+};
+
+enum v7_partition_id {
+ BOOTLOADER_PARTITION = 0x01,
+ DEVICE_CONFIG_PARTITION,
+ FLASH_CONFIG_PARTITION,
+ MANUFACTURING_BLOCK_PARTITION,
+ GUEST_SERIALIZATION_PARTITION,
+ GLOBAL_PARAMETERS_PARTITION,
+ CORE_CODE_PARTITION,
+ CORE_CONFIG_PARTITION,
+ GUEST_CODE_PARTITION,
+ DISPLAY_CONFIG_PARTITION,
+ EXTERNAL_TOUCH_AFE_CONFIG_PARTITION,
+ UTILITY_PARAMETER_PARTITION,
+};
+
+enum v7_flash_command {
+ CMD_V7_IDLE = 0x00,
+ CMD_V7_ENTER_BL,
+ CMD_V7_READ,
+ CMD_V7_WRITE,
+ CMD_V7_ERASE,
+ CMD_V7_ERASE_AP,
+ CMD_V7_SENSOR_ID,
+};
+
+enum v5v6_flash_command {
+ CMD_V5V6_IDLE = 0x0,
+ CMD_V5V6_WRITE_FW = 0x2,
+ CMD_V5V6_ERASE_ALL = 0x3,
+ CMD_V5V6_WRITE_LOCKDOWN = 0x4,
+ CMD_V5V6_READ_CONFIG = 0x5,
+ CMD_V5V6_WRITE_CONFIG = 0x6,
+ CMD_V5V6_ERASE_UI_CONFIG = 0x7,
+ CMD_V5V6_ERASE_BL_CONFIG = 0x9,
+ CMD_V5V6_ERASE_DISP_CONFIG = 0xa,
+ CMD_V5V6_ERASE_GUEST_CODE = 0xb,
+ CMD_V5V6_WRITE_GUEST_CODE = 0xc,
+ CMD_V5V6_ENABLE_FLASH_PROG = 0xf,
+ CMD_V5V6_READ_LOCKDOWN_DATA = 0x1b,
+};
+
+enum flash_command {
+ CMD_IDLE = 0,
+ CMD_WRITE_FW,
+ CMD_WRITE_CONFIG,
+ CMD_WRITE_LOCKDOWN,
+ CMD_WRITE_GUEST_CODE,
+ CMD_WRITE_BOOTLOADER,
+ CMD_WRITE_UTILITY_PARAM,
+ CMD_READ_CONFIG,
+ CMD_ERASE_ALL,
+ CMD_ERASE_UI_FIRMWARE,
+ CMD_ERASE_UI_CONFIG,
+ CMD_ERASE_BL_CONFIG,
+ CMD_ERASE_DISP_CONFIG,
+ CMD_ERASE_FLASH_CONFIG,
+ CMD_ERASE_GUEST_CODE,
+ CMD_ERASE_BOOTLOADER,
+ CMD_ERASE_UTILITY_PARAMETER,
+ CMD_ENABLE_FLASH_PROG,
+ CMD_READ_LOCKDOWN_DATA,
+};
+
+enum f35_flash_command {
+ CMD_F35_IDLE = 0x0,
+ CMD_F35_RESERVED = 0x1,
+ CMD_F35_WRITE_CHUNK = 0x2,
+ CMD_F35_ERASE_ALL = 0x3,
+ CMD_F35_RESET = 0x10,
+};
+
+enum container_id {
+ TOP_LEVEL_CONTAINER = 0,
+ UI_CONTAINER,
+ UI_CONFIG_CONTAINER,
+ BL_CONTAINER,
+ BL_IMAGE_CONTAINER,
+ BL_CONFIG_CONTAINER,
+ BL_LOCKDOWN_INFO_CONTAINER,
+ PERMANENT_CONFIG_CONTAINER,
+ GUEST_CODE_CONTAINER,
+ BL_PROTOCOL_DESCRIPTOR_CONTAINER,
+ UI_PROTOCOL_DESCRIPTOR_CONTAINER,
+ RMI_SELF_DISCOVERY_CONTAINER,
+ RMI_PAGE_CONTENT_CONTAINER,
+ GENERAL_INFORMATION_CONTAINER,
+ DEVICE_CONFIG_CONTAINER,
+ FLASH_CONFIG_CONTAINER,
+ GUEST_SERIALIZATION_CONTAINER,
+ GLOBAL_PARAMETERS_CONTAINER,
+ CORE_CODE_CONTAINER,
+ CORE_CONFIG_CONTAINER,
+ DISPLAY_CONFIG_CONTAINER,
+ EXTERNAL_TOUCH_AFE_CONFIG_CONTAINER,
+ UTILITY_CONTAINER,
+ UTILITY_PARAMETER_CONTAINER,
+};
+
+enum utility_parameter_id {
+ UNUSED = 0,
+ FORCE_PARAMETER,
+ ANTI_BENDING_PARAMETER,
+};
+
+struct pdt_properties {
+ union {
+ struct {
+ unsigned char reserved_1:6;
+ unsigned char has_bsr:1;
+ unsigned char reserved_2:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct partition_table {
+ unsigned char partition_id:5;
+ unsigned char byte_0_reserved:3;
+ unsigned char byte_1_reserved;
+ unsigned char partition_length_7_0;
+ unsigned char partition_length_15_8;
+ unsigned char start_physical_address_7_0;
+ unsigned char start_physical_address_15_8;
+ unsigned char partition_properties_7_0;
+ unsigned char partition_properties_15_8;
+} __packed;
+
+struct f01_device_control {
+ union {
+ struct {
+ unsigned char sleep_mode:2;
+ unsigned char nosleep:1;
+ unsigned char reserved:2;
+ unsigned char charger_connected:1;
+ unsigned char report_rate:1;
+ unsigned char configured:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f34_v7_query_0 {
+ union {
+ struct {
+ unsigned char subpacket_1_size:3;
+ unsigned char has_config_id:1;
+ unsigned char f34_query0_b4:1;
+ unsigned char has_thqa:1;
+ unsigned char f34_query0_b6__7:2;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f34_v7_query_1_7 {
+ union {
+ struct {
+ /* query 1 */
+ unsigned char bl_minor_revision;
+ unsigned char bl_major_revision;
+
+ /* query 2 */
+ unsigned char bl_fw_id_7_0;
+ unsigned char bl_fw_id_15_8;
+ unsigned char bl_fw_id_23_16;
+ unsigned char bl_fw_id_31_24;
+
+ /* query 3 */
+ unsigned char minimum_write_size;
+ unsigned char block_size_7_0;
+ unsigned char block_size_15_8;
+ unsigned char flash_page_size_7_0;
+ unsigned char flash_page_size_15_8;
+
+ /* query 4 */
+ unsigned char adjustable_partition_area_size_7_0;
+ unsigned char adjustable_partition_area_size_15_8;
+
+ /* query 5 */
+ unsigned char flash_config_length_7_0;
+ unsigned char flash_config_length_15_8;
+
+ /* query 6 */
+ unsigned char payload_length_7_0;
+ unsigned char payload_length_15_8;
+
+ /* query 7 */
+ unsigned char f34_query7_b0:1;
+ unsigned char has_bootloader:1;
+ unsigned char has_device_config:1;
+ unsigned char has_flash_config:1;
+ unsigned char has_manufacturing_block:1;
+ unsigned char has_guest_serialization:1;
+ unsigned char has_global_parameters:1;
+ unsigned char has_core_code:1;
+ unsigned char has_core_config:1;
+ unsigned char has_guest_code:1;
+ unsigned char has_display_config:1;
+ unsigned char f34_query7_b11__15:5;
+ unsigned char f34_query7_b16__23;
+ unsigned char f34_query7_b24__31;
+ } __packed;
+ unsigned char data[21];
+ };
+};
+
+struct f34_v7_data0 {
+ union {
+ struct {
+ unsigned char operation_status:5;
+ unsigned char device_cfg_status:2;
+ unsigned char bl_mode:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f34_v7_data_1_5 {
+ union {
+ struct {
+ unsigned char partition_id:5;
+ unsigned char f34_data1_b5__7:3;
+ unsigned char block_offset_7_0;
+ unsigned char block_offset_15_8;
+ unsigned char transfer_length_7_0;
+ unsigned char transfer_length_15_8;
+ unsigned char command;
+ unsigned char payload_0;
+ unsigned char payload_1;
+ } __packed;
+ unsigned char data[8];
+ };
+};
+
+struct f34_v5v6_flash_properties {
+ union {
+ struct {
+ unsigned char reg_map:1;
+ unsigned char unlocked:1;
+ unsigned char has_config_id:1;
+ unsigned char has_pm_config:1;
+ unsigned char has_bl_config:1;
+ unsigned char has_disp_config:1;
+ unsigned char has_ctrl1:1;
+ unsigned char has_query4:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f34_v5v6_flash_properties_2 {
+ union {
+ struct {
+ unsigned char has_guest_code:1;
+ unsigned char f34_query4_b1:1;
+ unsigned char has_gesture_config_area:1;
+ unsigned char has_force_config_block:1;
+ unsigned char has_lockdown_data_block:1;
+ unsigned char has_lcm_data_block:1;
+ unsigned char has_oem_data_block:1;
+ unsigned char f34_query4_b7:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct register_offset {
+ unsigned char properties;
+ unsigned char properties_2;
+ unsigned char block_size;
+ unsigned char block_count;
+ unsigned char flash_status;
+ unsigned char partition_id;
+ unsigned char block_number;
+ unsigned char transfer_length;
+ unsigned char flash_cmd;
+ unsigned char payload;
+};
+
+struct block_count {
+ unsigned short ui_firmware;
+ unsigned short ui_config;
+ unsigned short dp_config;
+ unsigned short pm_config;
+ unsigned short fl_config;
+ unsigned short bl_image;
+ unsigned short bl_config;
+ unsigned short utility_param;
+ unsigned short lockdown;
+ unsigned short guest_code;
+ unsigned short lockdown_data;
+ unsigned short total_count;
+};
+
+struct physical_address {
+ unsigned short ui_firmware;
+ unsigned short ui_config;
+ unsigned short dp_config;
+ unsigned short pm_config;
+ unsigned short fl_config;
+ unsigned short bl_image;
+ unsigned short bl_config;
+ unsigned short utility_param;
+ unsigned short lockdown;
+ unsigned short guest_code;
+};
+
+struct container_descriptor {
+ unsigned char content_checksum[4];
+ unsigned char container_id[2];
+ unsigned char minor_version;
+ unsigned char major_version;
+ unsigned char reserved_08;
+ unsigned char reserved_09;
+ unsigned char reserved_0a;
+ unsigned char reserved_0b;
+ unsigned char container_option_flags[4];
+ unsigned char content_options_length[4];
+ unsigned char content_options_address[4];
+ unsigned char content_length[4];
+ unsigned char content_address[4];
+};
+
+struct image_header_10 {
+ unsigned char checksum[4];
+ unsigned char reserved_04;
+ unsigned char reserved_05;
+ unsigned char minor_header_version;
+ unsigned char major_header_version;
+ unsigned char reserved_08;
+ unsigned char reserved_09;
+ unsigned char reserved_0a;
+ unsigned char reserved_0b;
+ unsigned char top_level_container_start_addr[4];
+};
+
+struct image_header_05_06 {
+ /* 0x00 - 0x0f */
+ unsigned char checksum[4];
+ unsigned char reserved_04;
+ unsigned char reserved_05;
+ unsigned char options_firmware_id:1;
+ unsigned char options_bootloader:1;
+ unsigned char options_guest_code:1;
+ unsigned char options_tddi:1;
+ unsigned char options_reserved:4;
+ unsigned char header_version;
+ unsigned char firmware_size[4];
+ unsigned char config_size[4];
+ /* 0x10 - 0x1f */
+ unsigned char product_id[PRODUCT_ID_SIZE];
+ unsigned char package_id[2];
+ unsigned char package_id_revision[2];
+ unsigned char product_info[PRODUCT_INFO_SIZE];
+ /* 0x20 - 0x2f */
+ unsigned char bootloader_addr[4];
+ unsigned char bootloader_size[4];
+ unsigned char ui_addr[4];
+ unsigned char ui_size[4];
+ /* 0x30 - 0x3f */
+ unsigned char ds_id[16];
+ /* 0x40 - 0x4f */
+ union {
+ struct {
+ unsigned char cstmr_product_id[PRODUCT_ID_SIZE];
+ unsigned char reserved_4a_4f[6];
+ };
+ struct {
+ unsigned char dsp_cfg_addr[4];
+ unsigned char dsp_cfg_size[4];
+ unsigned char reserved_48_4f[8];
+ };
+ };
+ /* 0x50 - 0x53 */
+ unsigned char firmware_id[4];
+};
+
+struct block_data {
+ unsigned int size;
+ const unsigned char *data;
+};
+
+struct image_metadata {
+ bool contains_firmware_id;
+ bool contains_bootloader;
+ bool contains_guest_code;
+ bool contains_disp_config;
+ bool contains_perm_config;
+ bool contains_flash_config;
+ bool contains_utility_param;
+ unsigned int firmware_id;
+ unsigned int checksum;
+ unsigned int bootloader_size;
+ unsigned int disp_config_offset;
+ unsigned char bl_version;
+ unsigned char product_id[PRODUCT_ID_SIZE + 1];
+ unsigned char cstmr_product_id[PRODUCT_ID_SIZE + 1];
+ unsigned char utility_param_id[MAX_UTILITY_PARAMS];
+ struct block_data bootloader;
+ struct block_data utility;
+ struct block_data ui_firmware;
+ struct block_data ui_config;
+ struct block_data dp_config;
+ struct block_data pm_config;
+ struct block_data fl_config;
+ struct block_data bl_image;
+ struct block_data bl_config;
+ struct block_data utility_param[MAX_UTILITY_PARAMS];
+ struct block_data lockdown;
+ struct block_data guest_code;
+ struct block_count blkcount;
+ struct physical_address phyaddr;
+};
+
+struct synaptics_rmi4_fwu_handle {
+ enum bl_version bl_version;
+ bool initialized;
+ bool in_bl_mode;
+ bool in_ub_mode;
+ bool bl_mode_device;
+ bool force_update;
+ bool do_lockdown;
+ bool has_guest_code;
+ bool has_lockdown_data;
+ bool has_utility_param;
+ bool new_partition_table;
+ bool incompatible_partition_tables;
+ bool write_bootloader;
+ unsigned int data_pos;
+ unsigned char *ext_data_source;
+ unsigned char *read_config_buf;
+ unsigned char intr_mask;
+ unsigned char command;
+ unsigned char bootloader_id[2];
+ unsigned char config_id[32];
+ unsigned char flash_status;
+ unsigned char partitions;
+#ifdef F51_DISCRETE_FORCE
+ unsigned char *cal_data;
+ unsigned short cal_data_off;
+ unsigned short cal_data_size;
+ unsigned short cal_data_buf_size;
+ unsigned short cal_packet_data_size;
+#endif
+ unsigned short block_size;
+ unsigned short config_size;
+ unsigned short config_area;
+ unsigned short config_block_count;
+ unsigned short flash_config_length;
+ unsigned short payload_length;
+ unsigned short partition_table_bytes;
+ unsigned short read_config_buf_size;
+ const unsigned char *config_data;
+ const unsigned char *image;
+ unsigned char *image_name;
+ unsigned int image_size;
+ struct image_metadata img;
+ struct register_offset off;
+ struct block_count blkcount;
+ struct physical_address phyaddr;
+ struct f34_v5v6_flash_properties flash_properties;
+ struct synaptics_rmi4_fn_desc f34_fd;
+ struct synaptics_rmi4_fn_desc f35_fd;
+ struct synaptics_rmi4_data *rmi4_data;
+ struct workqueue_struct *fwu_workqueue;
+ struct work_struct fwu_work;
+};
+
+static struct bin_attribute dev_attr_data = {
+ .attr = {
+ .name = "data",
+ .mode = (S_IRUGO | S_IWUGO),
+ },
+ .size = 0,
+ .read = fwu_sysfs_show_image,
+ .write = fwu_sysfs_store_image,
+};
+
+static struct device_attribute attrs[] = {
+ __ATTR(dorecovery, S_IWUSR,
+ synaptics_rmi4_show_error,
+ fwu_sysfs_do_recovery_store),
+ __ATTR(doreflash, S_IWUSR,
+ synaptics_rmi4_show_error,
+ fwu_sysfs_do_reflash_store),
+ __ATTR(writeconfig, S_IWUSR,
+ synaptics_rmi4_show_error,
+ fwu_sysfs_write_config_store),
+ __ATTR(readconfig, S_IWUSR,
+ synaptics_rmi4_show_error,
+ fwu_sysfs_read_config_store),
+ __ATTR(configarea, S_IWUSR,
+ synaptics_rmi4_show_error,
+ fwu_sysfs_config_area_store),
+ __ATTR(imagename, S_IWUSR,
+ synaptics_rmi4_show_error,
+ fwu_sysfs_image_name_store),
+ __ATTR(imagesize, S_IWUSR,
+ synaptics_rmi4_show_error,
+ fwu_sysfs_image_size_store),
+ __ATTR(blocksize, S_IRUGO,
+ fwu_sysfs_block_size_show,
+ synaptics_rmi4_store_error),
+ __ATTR(fwblockcount, S_IRUGO,
+ fwu_sysfs_firmware_block_count_show,
+ synaptics_rmi4_store_error),
+ __ATTR(configblockcount, S_IRUGO,
+ fwu_sysfs_configuration_block_count_show,
+ synaptics_rmi4_store_error),
+ __ATTR(dispconfigblockcount, S_IRUGO,
+ fwu_sysfs_disp_config_block_count_show,
+ synaptics_rmi4_store_error),
+ __ATTR(permconfigblockcount, S_IRUGO,
+ fwu_sysfs_perm_config_block_count_show,
+ synaptics_rmi4_store_error),
+ __ATTR(blconfigblockcount, S_IRUGO,
+ fwu_sysfs_bl_config_block_count_show,
+ synaptics_rmi4_store_error),
+ __ATTR(guestcodeblockcount, S_IRUGO,
+ fwu_sysfs_guest_code_block_count_show,
+ synaptics_rmi4_store_error),
+ __ATTR(writeguestcode, S_IWUSR,
+ synaptics_rmi4_show_error,
+ fwu_sysfs_write_guest_code_store),
+};
+
+static struct synaptics_rmi4_fwu_handle *fwu;
+
+DECLARE_COMPLETION(fwu_remove_complete_force);
+static int fwu_read_f34_guest_serialization_partition(void);
+
+static void calculate_checksum(unsigned short *data, unsigned long len,
+ unsigned long *result)
+{
+ unsigned long temp;
+ unsigned long sum1 = 0xffff;
+ unsigned long sum2 = 0xffff;
+
+ *result = 0xffffffff;
+
+ while (len--) {
+ temp = *data;
+ sum1 += temp;
+ sum2 += sum1;
+ sum1 = (sum1 & 0xffff) + (sum1 >> 16);
+ sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+ data++;
+ }
+
+ *result = sum2 << 16 | sum1;
+
+ return;
+}
+
+static void convert_to_little_endian(unsigned char *dest, unsigned long src)
+{
+ dest[0] = (unsigned char)(src & 0xff);
+ dest[1] = (unsigned char)((src >> 8) & 0xff);
+ dest[2] = (unsigned char)((src >> 16) & 0xff);
+ dest[3] = (unsigned char)((src >> 24) & 0xff);
+
+ return;
+}
+
+static unsigned int le_to_uint(const unsigned char *ptr)
+{
+ return (unsigned int)ptr[0] +
+ (unsigned int)ptr[1] * 0x100 +
+ (unsigned int)ptr[2] * 0x10000 +
+ (unsigned int)ptr[3] * 0x1000000;
+}
+
+#ifdef F51_DISCRETE_FORCE
+static int fwu_f51_force_data_init(void)
+{
+ int retval;
+ unsigned char query_count;
+ unsigned char packet_info;
+ unsigned char offset[2];
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f51_query_base_addr + 7,
+ offset,
+ sizeof(offset));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read force data offset\n",
+ __func__);
+ return retval;
+ }
+
+ fwu->cal_data_off = offset[0] | offset[1] << 8;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f51_query_base_addr,
+ &query_count,
+ sizeof(query_count));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read number of F51 query registers\n",
+ __func__);
+ return retval;
+ }
+
+ if (query_count >= 10) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f51_query_base_addr + 9,
+ &packet_info,
+ sizeof(packet_info));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read F51 packet register info\n",
+ __func__);
+ return retval;
+ }
+
+ if (packet_info & MASK_1BIT) {
+ fwu->cal_packet_data_size = packet_info >> 1;
+ fwu->cal_packet_data_size *= 2;
+ } else {
+ fwu->cal_packet_data_size = 0;
+ }
+ } else {
+ fwu->cal_packet_data_size = 0;
+ }
+
+ fwu->cal_data_size = CAL_DATA_SIZE + fwu->cal_packet_data_size;
+ if (fwu->cal_data_size > fwu->cal_data_buf_size) {
+ kfree(fwu->cal_data);
+ fwu->cal_data_buf_size = fwu->cal_data_size;
+ fwu->cal_data = kmalloc(fwu->cal_data_buf_size, GFP_KERNEL);
+ if (!fwu->cal_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for fwu->cal_data\n",
+ __func__);
+ fwu->cal_data_buf_size = 0;
+ return -ENOMEM;
+ }
+ }
+
+ return 0;
+}
+#endif
+
+static int fwu_allocate_read_config_buf(unsigned int count)
+{
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (count > fwu->read_config_buf_size) {
+ kfree(fwu->read_config_buf);
+ fwu->read_config_buf = kzalloc(count, GFP_KERNEL);
+ if (!fwu->read_config_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for fwu->read_config_buf\n",
+ __func__);
+ fwu->read_config_buf_size = 0;
+ return -ENOMEM;
+ }
+ fwu->read_config_buf_size = count;
+ }
+
+ return 0;
+}
+
+static void fwu_compare_partition_tables(void)
+{
+ fwu->incompatible_partition_tables = false;
+
+ if (fwu->phyaddr.bl_image != fwu->img.phyaddr.bl_image)
+ fwu->incompatible_partition_tables = true;
+ else if (fwu->phyaddr.lockdown != fwu->img.phyaddr.lockdown)
+ fwu->incompatible_partition_tables = true;
+ else if (fwu->phyaddr.bl_config != fwu->img.phyaddr.bl_config)
+ fwu->incompatible_partition_tables = true;
+ else if (fwu->phyaddr.utility_param != fwu->img.phyaddr.utility_param)
+ fwu->incompatible_partition_tables = true;
+
+ if (fwu->bl_version == BL_V7) {
+ if (fwu->phyaddr.fl_config != fwu->img.phyaddr.fl_config)
+ fwu->incompatible_partition_tables = true;
+ }
+
+ fwu->new_partition_table = false;
+
+ if (fwu->phyaddr.ui_firmware != fwu->img.phyaddr.ui_firmware)
+ fwu->new_partition_table = true;
+ else if (fwu->phyaddr.ui_config != fwu->img.phyaddr.ui_config)
+ fwu->new_partition_table = true;
+
+ if (fwu->flash_properties.has_disp_config) {
+ if (fwu->phyaddr.dp_config != fwu->img.phyaddr.dp_config)
+ fwu->new_partition_table = true;
+ }
+
+ if (fwu->has_guest_code) {
+ if (fwu->phyaddr.guest_code != fwu->img.phyaddr.guest_code)
+ fwu->new_partition_table = true;
+ }
+
+ return;
+}
+
+static void fwu_parse_partition_table(const unsigned char *partition_table,
+ struct block_count *blkcount, struct physical_address *phyaddr)
+{
+ unsigned char ii;
+ unsigned char index;
+ unsigned char offset;
+ unsigned short partition_length;
+ unsigned short physical_address;
+ struct partition_table *ptable;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ for (ii = 0; ii < fwu->partitions; ii++) {
+ index = ii * 8 + 2;
+ ptable = (struct partition_table *)&partition_table[index];
+ partition_length = ptable->partition_length_15_8 << 8 |
+ ptable->partition_length_7_0;
+ physical_address = ptable->start_physical_address_15_8 << 8 |
+ ptable->start_physical_address_7_0;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Partition entry %d:\n",
+ __func__, ii);
+ for (offset = 0; offset < 8; offset++) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: 0x%02x\n",
+ __func__,
+ partition_table[index + offset]);
+ }
+ switch (ptable->partition_id) {
+ case CORE_CODE_PARTITION:
+ blkcount->ui_firmware = partition_length;
+ phyaddr->ui_firmware = physical_address;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Core code block count: %d\n",
+ __func__, blkcount->ui_firmware);
+ blkcount->total_count += partition_length;
+ break;
+ case CORE_CONFIG_PARTITION:
+ blkcount->ui_config = partition_length;
+ phyaddr->ui_config = physical_address;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Core config block count: %d\n",
+ __func__, blkcount->ui_config);
+ blkcount->total_count += partition_length;
+ break;
+ case BOOTLOADER_PARTITION:
+ blkcount->bl_image = partition_length;
+ phyaddr->bl_image = physical_address;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Bootloader block count: %d\n",
+ __func__, blkcount->bl_image);
+ blkcount->total_count += partition_length;
+ break;
+ case UTILITY_PARAMETER_PARTITION:
+ blkcount->utility_param = partition_length;
+ phyaddr->utility_param = physical_address;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Utility parameter block count: %d\n",
+ __func__, blkcount->utility_param);
+ blkcount->total_count += partition_length;
+ break;
+ case DISPLAY_CONFIG_PARTITION:
+ blkcount->dp_config = partition_length;
+ phyaddr->dp_config = physical_address;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Display config block count: %d\n",
+ __func__, blkcount->dp_config);
+ blkcount->total_count += partition_length;
+ break;
+ case FLASH_CONFIG_PARTITION:
+ blkcount->fl_config = partition_length;
+ phyaddr->fl_config = physical_address;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Flash config block count: %d\n",
+ __func__, blkcount->fl_config);
+ blkcount->total_count += partition_length;
+ break;
+ case GUEST_CODE_PARTITION:
+ blkcount->guest_code = partition_length;
+ phyaddr->guest_code = physical_address;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Guest code block count: %d\n",
+ __func__, blkcount->guest_code);
+ blkcount->total_count += partition_length;
+ break;
+ case GUEST_SERIALIZATION_PARTITION:
+ blkcount->pm_config = partition_length;
+ phyaddr->pm_config = physical_address;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Guest serialization block count: %d\n",
+ __func__, blkcount->pm_config);
+ blkcount->total_count += partition_length;
+ break;
+ case GLOBAL_PARAMETERS_PARTITION:
+ blkcount->bl_config = partition_length;
+ phyaddr->bl_config = physical_address;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Global parameters block count: %d\n",
+ __func__, blkcount->bl_config);
+ blkcount->total_count += partition_length;
+ break;
+ case DEVICE_CONFIG_PARTITION:
+ blkcount->lockdown = partition_length;
+ phyaddr->lockdown = physical_address;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Device config block count: %d\n",
+ __func__, blkcount->lockdown);
+ blkcount->total_count += partition_length;
+ break;
+ };
+ }
+
+ return;
+}
+
+static void fwu_parse_image_header_10_utility(const unsigned char *image)
+{
+ unsigned char ii;
+ unsigned char num_of_containers;
+ unsigned int addr;
+ unsigned int container_id;
+ unsigned int length;
+ const unsigned char *content;
+ struct container_descriptor *descriptor;
+
+ num_of_containers = fwu->img.utility.size / 4;
+
+ for (ii = 0; ii < num_of_containers; ii++) {
+ if (ii >= MAX_UTILITY_PARAMS)
+ continue;
+ addr = le_to_uint(fwu->img.utility.data + (ii * 4));
+ descriptor = (struct container_descriptor *)(image + addr);
+ container_id = descriptor->container_id[0] |
+ descriptor->container_id[1] << 8;
+ content = image + le_to_uint(descriptor->content_address);
+ length = le_to_uint(descriptor->content_length);
+ switch (container_id) {
+ case UTILITY_PARAMETER_CONTAINER:
+ fwu->img.utility_param[ii].data = content;
+ fwu->img.utility_param[ii].size = length;
+ fwu->img.utility_param_id[ii] = content[0];
+ break;
+ default:
+ break;
+ };
+ }
+
+ return;
+}
+
+static void fwu_parse_image_header_10_bootloader(const unsigned char *image)
+{
+ unsigned char ii;
+ unsigned char num_of_containers;
+ unsigned int addr;
+ unsigned int container_id;
+ unsigned int length;
+ const unsigned char *content;
+ struct container_descriptor *descriptor;
+
+ num_of_containers = (fwu->img.bootloader.size - 4) / 4;
+
+ for (ii = 1; ii <= num_of_containers; ii++) {
+ addr = le_to_uint(fwu->img.bootloader.data + (ii * 4));
+ descriptor = (struct container_descriptor *)(image + addr);
+ container_id = descriptor->container_id[0] |
+ descriptor->container_id[1] << 8;
+ content = image + le_to_uint(descriptor->content_address);
+ length = le_to_uint(descriptor->content_length);
+ switch (container_id) {
+ case BL_IMAGE_CONTAINER:
+ fwu->img.bl_image.data = content;
+ fwu->img.bl_image.size = length;
+ break;
+ case BL_CONFIG_CONTAINER:
+ case GLOBAL_PARAMETERS_CONTAINER:
+ fwu->img.bl_config.data = content;
+ fwu->img.bl_config.size = length;
+ break;
+ case BL_LOCKDOWN_INFO_CONTAINER:
+ case DEVICE_CONFIG_CONTAINER:
+ fwu->img.lockdown.data = content;
+ fwu->img.lockdown.size = length;
+ break;
+ default:
+ break;
+ };
+ }
+
+ return;
+}
+
+static void fwu_parse_image_header_10(void)
+{
+ unsigned char ii;
+ unsigned char num_of_containers;
+ unsigned int addr;
+ unsigned int offset;
+ unsigned int container_id;
+ unsigned int length;
+ const unsigned char *image;
+ const unsigned char *content;
+ struct container_descriptor *descriptor;
+ struct image_header_10 *header;
+
+ image = fwu->image;
+ header = (struct image_header_10 *)image;
+
+ fwu->img.checksum = le_to_uint(header->checksum);
+
+ /* address of top level container */
+ offset = le_to_uint(header->top_level_container_start_addr);
+ descriptor = (struct container_descriptor *)(image + offset);
+
+ /* address of top level container content */
+ offset = le_to_uint(descriptor->content_address);
+ num_of_containers = le_to_uint(descriptor->content_length) / 4;
+
+ for (ii = 0; ii < num_of_containers; ii++) {
+ addr = le_to_uint(image + offset);
+ offset += 4;
+ descriptor = (struct container_descriptor *)(image + addr);
+ container_id = descriptor->container_id[0] |
+ descriptor->container_id[1] << 8;
+ content = image + le_to_uint(descriptor->content_address);
+ length = le_to_uint(descriptor->content_length);
+ switch (container_id) {
+ case UI_CONTAINER:
+ case CORE_CODE_CONTAINER:
+ fwu->img.ui_firmware.data = content;
+ fwu->img.ui_firmware.size = length;
+ break;
+ case UI_CONFIG_CONTAINER:
+ case CORE_CONFIG_CONTAINER:
+ fwu->img.ui_config.data = content;
+ fwu->img.ui_config.size = length;
+ break;
+ case BL_CONTAINER:
+ fwu->img.bl_version = *content;
+ fwu->img.bootloader.data = content;
+ fwu->img.bootloader.size = length;
+ fwu_parse_image_header_10_bootloader(image);
+ break;
+ case UTILITY_CONTAINER:
+ fwu->img.utility.data = content;
+ fwu->img.utility.size = length;
+ fwu_parse_image_header_10_utility(image);
+ break;
+ case GUEST_CODE_CONTAINER:
+ fwu->img.contains_guest_code = true;
+ fwu->img.guest_code.data = content;
+ fwu->img.guest_code.size = length;
+ break;
+ case DISPLAY_CONFIG_CONTAINER:
+ fwu->img.contains_disp_config = true;
+ fwu->img.dp_config.data = content;
+ fwu->img.dp_config.size = length;
+ break;
+ case PERMANENT_CONFIG_CONTAINER:
+ case GUEST_SERIALIZATION_CONTAINER:
+ fwu->img.contains_perm_config = true;
+ fwu->img.pm_config.data = content;
+ fwu->img.pm_config.size = length;
+ break;
+ case FLASH_CONFIG_CONTAINER:
+ fwu->img.contains_flash_config = true;
+ fwu->img.fl_config.data = content;
+ fwu->img.fl_config.size = length;
+ break;
+ case GENERAL_INFORMATION_CONTAINER:
+ fwu->img.contains_firmware_id = true;
+ fwu->img.firmware_id = le_to_uint(content + 4);
+ break;
+ default:
+ break;
+ }
+ }
+
+ return;
+}
+
+static void fwu_parse_image_header_05_06(void)
+{
+ int retval;
+ const unsigned char *image;
+ struct image_header_05_06 *header;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ image = fwu->image;
+ header = (struct image_header_05_06 *)image;
+
+ fwu->img.checksum = le_to_uint(header->checksum);
+
+ fwu->img.bl_version = header->header_version;
+
+ fwu->img.contains_bootloader = header->options_bootloader;
+ if (fwu->img.contains_bootloader)
+ fwu->img.bootloader_size = le_to_uint(header->bootloader_size);
+
+ fwu->img.ui_firmware.size = le_to_uint(header->firmware_size);
+ if (fwu->img.ui_firmware.size) {
+ fwu->img.ui_firmware.data = image + IMAGE_AREA_OFFSET;
+ if (fwu->img.contains_bootloader)
+ fwu->img.ui_firmware.data += fwu->img.bootloader_size;
+ }
+
+ if ((fwu->img.bl_version == BL_V6) && header->options_tddi)
+ fwu->img.ui_firmware.data = image + IMAGE_AREA_OFFSET;
+
+ fwu->img.ui_config.size = le_to_uint(header->config_size);
+ if (fwu->img.ui_config.size) {
+ fwu->img.ui_config.data = fwu->img.ui_firmware.data +
+ fwu->img.ui_firmware.size;
+ }
+
+ if (fwu->img.contains_bootloader || header->options_tddi)
+ fwu->img.contains_disp_config = true;
+ else
+ fwu->img.contains_disp_config = false;
+
+ if (fwu->img.contains_disp_config) {
+ fwu->img.disp_config_offset = le_to_uint(header->dsp_cfg_addr);
+ fwu->img.dp_config.size = le_to_uint(header->dsp_cfg_size);
+ fwu->img.dp_config.data = image + fwu->img.disp_config_offset;
+ } else {
+ retval = secure_memcpy(fwu->img.cstmr_product_id,
+ sizeof(fwu->img.cstmr_product_id),
+ header->cstmr_product_id,
+ sizeof(header->cstmr_product_id),
+ PRODUCT_ID_SIZE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy custom product ID string\n",
+ __func__);
+ }
+ fwu->img.cstmr_product_id[PRODUCT_ID_SIZE] = 0;
+ }
+
+ fwu->img.contains_firmware_id = header->options_firmware_id;
+ if (fwu->img.contains_firmware_id)
+ fwu->img.firmware_id = le_to_uint(header->firmware_id);
+
+ retval = secure_memcpy(fwu->img.product_id,
+ sizeof(fwu->img.product_id),
+ header->product_id,
+ sizeof(header->product_id),
+ PRODUCT_ID_SIZE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy product ID string\n",
+ __func__);
+ }
+ fwu->img.product_id[PRODUCT_ID_SIZE] = 0;
+
+ fwu->img.lockdown.size = LOCKDOWN_SIZE;
+ fwu->img.lockdown.data = image + IMAGE_AREA_OFFSET - LOCKDOWN_SIZE;
+
+ return;
+}
+
+static int fwu_parse_image_info(void)
+{
+ struct image_header_10 *header;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ header = (struct image_header_10 *)fwu->image;
+
+ memset(&fwu->img, 0x00, sizeof(fwu->img));
+
+ switch (header->major_header_version) {
+ case IMAGE_HEADER_VERSION_10:
+ fwu_parse_image_header_10();
+ break;
+ case IMAGE_HEADER_VERSION_05:
+ case IMAGE_HEADER_VERSION_06:
+ fwu_parse_image_header_05_06();
+ break;
+ default:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Unsupported image file format (0x%02x)\n",
+ __func__, header->major_header_version);
+ return -EINVAL;
+ }
+
+ if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8) {
+ if (!fwu->img.contains_flash_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: No flash config found in firmware image\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ fwu_parse_partition_table(fwu->img.fl_config.data,
+ &fwu->img.blkcount, &fwu->img.phyaddr);
+
+ if (fwu->img.blkcount.utility_param)
+ fwu->img.contains_utility_param = true;
+
+ fwu_compare_partition_tables();
+ } else {
+ fwu->new_partition_table = false;
+ fwu->incompatible_partition_tables = false;
+ }
+
+ return 0;
+}
+
+static int fwu_read_flash_status(void)
+{
+ int retval;
+ unsigned char status;
+ unsigned char command;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fwu->f34_fd.data_base_addr + fwu->off.flash_status,
+ &status,
+ sizeof(status));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read flash status\n",
+ __func__);
+ return retval;
+ }
+
+ fwu->in_bl_mode = status >> 7;
+
+ if (fwu->bl_version == BL_V5)
+ fwu->flash_status = (status >> 4) & MASK_3BIT;
+ else if (fwu->bl_version == BL_V6)
+ fwu->flash_status = status & MASK_3BIT;
+ else if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8)
+ fwu->flash_status = status & MASK_5BIT;
+
+ if (fwu->write_bootloader)
+ fwu->flash_status = 0x00;
+
+ if (fwu->flash_status != 0x00) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Flash status = %d, command = 0x%02x, config area = 0x%02x\n",
+ __func__, fwu->flash_status, fwu->command, fwu->config_area);
+ }
+
+ if (fwu->flash_status == 0x08)
+ fwu->flash_status = 0;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fwu->f34_fd.data_base_addr + fwu->off.flash_cmd,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read flash command\n",
+ __func__);
+ return retval;
+ }
+
+ if (fwu->bl_version == BL_V5)
+ fwu->command = command & MASK_4BIT;
+ else if (fwu->bl_version == BL_V6)
+ fwu->command = command & MASK_6BIT;
+ else if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8)
+ fwu->command = command;
+
+ if (fwu->write_bootloader)
+ fwu->command = 0x00;
+
+ return 0;
+}
+
+static int fwu_wait_for_idle(int timeout_ms, bool poll)
+{
+ int count = 0;
+ int timeout_count = ((timeout_ms * 1000) / MAX_SLEEP_TIME_US) + 1;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ do {
+ usleep_range(MIN_SLEEP_TIME_US, MAX_SLEEP_TIME_US);
+
+ count++;
+ if (poll || (count == timeout_count))
+ fwu_read_flash_status();
+
+ if ((fwu->command == CMD_IDLE) && (fwu->flash_status == 0x00))
+ return 0;
+ } while (count < timeout_count);
+
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Timed out waiting for idle status\n",
+ __func__);
+
+ return -ETIMEDOUT;
+}
+
+static int fwu_write_f34_v7_command_single_transaction(unsigned char cmd)
+{
+ int retval;
+ unsigned char data_base;
+ struct f34_v7_data_1_5 data_1_5;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f34_fd.data_base_addr;
+
+ memset(data_1_5.data, 0x00, sizeof(data_1_5.data));
+
+ switch (cmd) {
+ case CMD_ERASE_ALL:
+ data_1_5.partition_id = CORE_CODE_PARTITION;
+ data_1_5.command = CMD_V7_ERASE_AP;
+ break;
+ case CMD_ERASE_UI_FIRMWARE:
+ data_1_5.partition_id = CORE_CODE_PARTITION;
+ data_1_5.command = CMD_V7_ERASE;
+ break;
+ case CMD_ERASE_BL_CONFIG:
+ data_1_5.partition_id = GLOBAL_PARAMETERS_PARTITION;
+ data_1_5.command = CMD_V7_ERASE;
+ break;
+ case CMD_ERASE_UI_CONFIG:
+ data_1_5.partition_id = CORE_CONFIG_PARTITION;
+ data_1_5.command = CMD_V7_ERASE;
+ break;
+ case CMD_ERASE_DISP_CONFIG:
+ data_1_5.partition_id = DISPLAY_CONFIG_PARTITION;
+ data_1_5.command = CMD_V7_ERASE;
+ break;
+ case CMD_ERASE_FLASH_CONFIG:
+ data_1_5.partition_id = FLASH_CONFIG_PARTITION;
+ data_1_5.command = CMD_V7_ERASE;
+ break;
+ case CMD_ERASE_GUEST_CODE:
+ data_1_5.partition_id = GUEST_CODE_PARTITION;
+ data_1_5.command = CMD_V7_ERASE;
+ break;
+ case CMD_ERASE_BOOTLOADER:
+ data_1_5.partition_id = BOOTLOADER_PARTITION;
+ data_1_5.command = CMD_V7_ERASE;
+ break;
+ case CMD_ERASE_UTILITY_PARAMETER:
+ data_1_5.partition_id = UTILITY_PARAMETER_PARTITION;
+ data_1_5.command = CMD_V7_ERASE;
+ break;
+ case CMD_ENABLE_FLASH_PROG:
+ data_1_5.partition_id = BOOTLOADER_PARTITION;
+ data_1_5.command = CMD_V7_ENTER_BL;
+ break;
+ };
+
+ data_1_5.payload_0 = fwu->bootloader_id[0];
+ data_1_5.payload_1 = fwu->bootloader_id[1];
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.partition_id,
+ data_1_5.data,
+ sizeof(data_1_5.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write single transaction command\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static int fwu_write_f34_v7_command(unsigned char cmd)
+{
+ int retval;
+ unsigned char data_base;
+ unsigned char command;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f34_fd.data_base_addr;
+
+ switch (cmd) {
+ case CMD_WRITE_FW:
+ case CMD_WRITE_CONFIG:
+ case CMD_WRITE_LOCKDOWN:
+ case CMD_WRITE_GUEST_CODE:
+ case CMD_WRITE_BOOTLOADER:
+ case CMD_WRITE_UTILITY_PARAM:
+ command = CMD_V7_WRITE;
+ break;
+ case CMD_READ_CONFIG:
+ command = CMD_V7_READ;
+ break;
+ case CMD_ERASE_ALL:
+ command = CMD_V7_ERASE_AP;
+ break;
+ case CMD_ERASE_UI_FIRMWARE:
+ case CMD_ERASE_BL_CONFIG:
+ case CMD_ERASE_UI_CONFIG:
+ case CMD_ERASE_DISP_CONFIG:
+ case CMD_ERASE_FLASH_CONFIG:
+ case CMD_ERASE_GUEST_CODE:
+ case CMD_ERASE_BOOTLOADER:
+ case CMD_ERASE_UTILITY_PARAMETER:
+ command = CMD_V7_ERASE;
+ break;
+ case CMD_ENABLE_FLASH_PROG:
+ command = CMD_V7_ENTER_BL;
+ break;
+ default:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Invalid command 0x%02x\n",
+ __func__, cmd);
+ return -EINVAL;
+ };
+
+ fwu->command = command;
+
+ switch (cmd) {
+ case CMD_ERASE_ALL:
+ case CMD_ERASE_UI_FIRMWARE:
+ case CMD_ERASE_BL_CONFIG:
+ case CMD_ERASE_UI_CONFIG:
+ case CMD_ERASE_DISP_CONFIG:
+ case CMD_ERASE_FLASH_CONFIG:
+ case CMD_ERASE_GUEST_CODE:
+ case CMD_ERASE_BOOTLOADER:
+ case CMD_ERASE_UTILITY_PARAMETER:
+ case CMD_ENABLE_FLASH_PROG:
+ retval = fwu_write_f34_v7_command_single_transaction(cmd);
+ if (retval < 0)
+ return retval;
+ else
+ return 0;
+ default:
+ break;
+ };
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.flash_cmd,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write flash command\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static int fwu_write_f34_v5v6_command(unsigned char cmd)
+{
+ int retval;
+ unsigned char data_base;
+ unsigned char command;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f34_fd.data_base_addr;
+
+ switch (cmd) {
+ case CMD_IDLE:
+ command = CMD_V5V6_IDLE;
+ break;
+ case CMD_WRITE_FW:
+ command = CMD_V5V6_WRITE_FW;
+ break;
+ case CMD_WRITE_CONFIG:
+ command = CMD_V5V6_WRITE_CONFIG;
+ break;
+ case CMD_WRITE_LOCKDOWN:
+ command = CMD_V5V6_WRITE_LOCKDOWN;
+ break;
+ case CMD_WRITE_GUEST_CODE:
+ command = CMD_V5V6_WRITE_GUEST_CODE;
+ break;
+ case CMD_READ_CONFIG:
+ command = CMD_V5V6_READ_CONFIG;
+ break;
+ case CMD_ERASE_ALL:
+ command = CMD_V5V6_ERASE_ALL;
+ break;
+ case CMD_ERASE_UI_CONFIG:
+ command = CMD_V5V6_ERASE_UI_CONFIG;
+ break;
+ case CMD_ERASE_DISP_CONFIG:
+ command = CMD_V5V6_ERASE_DISP_CONFIG;
+ break;
+ case CMD_ERASE_GUEST_CODE:
+ command = CMD_V5V6_ERASE_GUEST_CODE;
+ break;
+ case CMD_ENABLE_FLASH_PROG:
+ command = CMD_V5V6_ENABLE_FLASH_PROG;
+ break;
+ case CMD_READ_LOCKDOWN_DATA:
+ command = CMD_V5V6_READ_LOCKDOWN_DATA;
+ break;
+ default:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Invalid command 0x%02x\n",
+ __func__, cmd);
+ return -EINVAL;
+ }
+
+ switch (cmd) {
+ case CMD_ERASE_ALL:
+ case CMD_ERASE_UI_CONFIG:
+ case CMD_ERASE_DISP_CONFIG:
+ case CMD_ERASE_GUEST_CODE:
+ case CMD_ENABLE_FLASH_PROG:
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.payload,
+ fwu->bootloader_id,
+ sizeof(fwu->bootloader_id));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write bootloader ID\n",
+ __func__);
+ return retval;
+ }
+ break;
+ default:
+ break;
+ };
+
+ fwu->command = command;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.flash_cmd,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write command 0x%02x\n",
+ __func__, command);
+ return retval;
+ }
+
+ return 0;
+}
+
+static int fwu_write_f34_command(unsigned char cmd)
+{
+ int retval;
+
+ if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8)
+ retval = fwu_write_f34_v7_command(cmd);
+ else
+ retval = fwu_write_f34_v5v6_command(cmd);
+
+ return retval;
+}
+
+static int fwu_write_f34_v7_partition_id(unsigned char cmd)
+{
+ int retval;
+ unsigned char data_base;
+ unsigned char partition;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f34_fd.data_base_addr;
+
+ switch (cmd) {
+ case CMD_WRITE_FW:
+ partition = CORE_CODE_PARTITION;
+ break;
+ case CMD_WRITE_CONFIG:
+ case CMD_READ_CONFIG:
+ if (fwu->config_area == UI_CONFIG_AREA)
+ partition = CORE_CONFIG_PARTITION;
+ else if (fwu->config_area == DP_CONFIG_AREA)
+ partition = DISPLAY_CONFIG_PARTITION;
+ else if (fwu->config_area == PM_CONFIG_AREA)
+ partition = GUEST_SERIALIZATION_PARTITION;
+ else if (fwu->config_area == BL_CONFIG_AREA)
+ partition = GLOBAL_PARAMETERS_PARTITION;
+ else if (fwu->config_area == FLASH_CONFIG_AREA)
+ partition = FLASH_CONFIG_PARTITION;
+ break;
+ case CMD_WRITE_LOCKDOWN:
+ partition = DEVICE_CONFIG_PARTITION;
+ break;
+ case CMD_WRITE_GUEST_CODE:
+ partition = GUEST_CODE_PARTITION;
+ break;
+ case CMD_WRITE_BOOTLOADER:
+ partition = BOOTLOADER_PARTITION;
+ break;
+ case CMD_WRITE_UTILITY_PARAM:
+ partition = UTILITY_PARAMETER_PARTITION;
+ break;
+ case CMD_ERASE_ALL:
+ partition = CORE_CODE_PARTITION;
+ break;
+ case CMD_ERASE_BL_CONFIG:
+ partition = GLOBAL_PARAMETERS_PARTITION;
+ break;
+ case CMD_ERASE_UI_CONFIG:
+ partition = CORE_CONFIG_PARTITION;
+ break;
+ case CMD_ERASE_DISP_CONFIG:
+ partition = DISPLAY_CONFIG_PARTITION;
+ break;
+ case CMD_ERASE_FLASH_CONFIG:
+ partition = FLASH_CONFIG_PARTITION;
+ break;
+ case CMD_ERASE_GUEST_CODE:
+ partition = GUEST_CODE_PARTITION;
+ break;
+ case CMD_ERASE_BOOTLOADER:
+ partition = BOOTLOADER_PARTITION;
+ break;
+ case CMD_ENABLE_FLASH_PROG:
+ partition = BOOTLOADER_PARTITION;
+ break;
+ default:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Invalid command 0x%02x\n",
+ __func__, cmd);
+ return -EINVAL;
+ };
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.partition_id,
+ &partition,
+ sizeof(partition));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write partition ID\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static int fwu_write_f34_partition_id(unsigned char cmd)
+{
+ int retval;
+
+ if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8)
+ retval = fwu_write_f34_v7_partition_id(cmd);
+ else
+ retval = 0;
+
+ return retval;
+}
+
+static int fwu_read_f34_v7_partition_table(unsigned char *partition_table)
+{
+ int retval;
+ unsigned char data_base;
+ unsigned char length[2];
+ unsigned short block_number = 0;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f34_fd.data_base_addr;
+
+ fwu->config_area = FLASH_CONFIG_AREA;
+
+ retval = fwu_write_f34_partition_id(CMD_READ_CONFIG);
+ if (retval < 0)
+ return retval;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.block_number,
+ (unsigned char *)&block_number,
+ sizeof(block_number));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write block number\n",
+ __func__);
+ return retval;
+ }
+
+ length[0] = (unsigned char)(fwu->flash_config_length & MASK_8BIT);
+ length[1] = (unsigned char)(fwu->flash_config_length >> 8);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.transfer_length,
+ length,
+ sizeof(length));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write transfer length\n",
+ __func__);
+ return retval;
+ }
+
+ retval = fwu_write_f34_command(CMD_READ_CONFIG);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write command\n",
+ __func__);
+ return retval;
+ }
+
+ retval = fwu_wait_for_idle(WRITE_WAIT_MS, true);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to wait for idle status\n",
+ __func__);
+ return retval;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_base + fwu->off.payload,
+ partition_table,
+ fwu->partition_table_bytes);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read block data\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static int fwu_read_f34_v7_queries(void)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char query_base;
+ unsigned char index;
+ unsigned char offset;
+ unsigned char *ptable;
+ struct f34_v7_query_0 query_0;
+ struct f34_v7_query_1_7 query_1_7;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ query_base = fwu->f34_fd.query_base_addr;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ query_base,
+ query_0.data,
+ sizeof(query_0.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read query 0\n",
+ __func__);
+ return retval;
+ }
+
+ offset = query_0.subpacket_1_size + 1;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ query_base + offset,
+ query_1_7.data,
+ sizeof(query_1_7.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read queries 1 to 7\n",
+ __func__);
+ return retval;
+ }
+
+ fwu->bootloader_id[0] = query_1_7.bl_minor_revision;
+ fwu->bootloader_id[1] = query_1_7.bl_major_revision;
+
+ if (fwu->bootloader_id[1] == BL_V8)
+ fwu->bl_version = BL_V8;
+
+ fwu->block_size = query_1_7.block_size_15_8 << 8 |
+ query_1_7.block_size_7_0;
+
+ fwu->flash_config_length = query_1_7.flash_config_length_15_8 << 8 |
+ query_1_7.flash_config_length_7_0;
+
+ fwu->payload_length = query_1_7.payload_length_15_8 << 8 |
+ query_1_7.payload_length_7_0;
+
+ fwu->off.flash_status = V7_FLASH_STATUS_OFFSET;
+ fwu->off.partition_id = V7_PARTITION_ID_OFFSET;
+ fwu->off.block_number = V7_BLOCK_NUMBER_OFFSET;
+ fwu->off.transfer_length = V7_TRANSFER_LENGTH_OFFSET;
+ fwu->off.flash_cmd = V7_COMMAND_OFFSET;
+ fwu->off.payload = V7_PAYLOAD_OFFSET;
+
+ index = sizeof(query_1_7.data) - V7_PARTITION_SUPPORT_BYTES;
+
+ fwu->partitions = 0;
+ for (offset = 0; offset < V7_PARTITION_SUPPORT_BYTES; offset++) {
+ for (ii = 0; ii < 8; ii++) {
+ if (query_1_7.data[index + offset] & (1 << ii))
+ fwu->partitions++;
+ }
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Supported partitions: 0x%02x\n",
+ __func__, query_1_7.data[index + offset]);
+ }
+
+ fwu->partition_table_bytes = fwu->partitions * 8 + 2;
+
+ ptable = kzalloc(fwu->partition_table_bytes, GFP_KERNEL);
+ if (!ptable) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for partition table\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ retval = fwu_read_f34_v7_partition_table(ptable);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read partition table\n",
+ __func__);
+ kfree(ptable);
+ return retval;
+ }
+
+ fwu_parse_partition_table(ptable, &fwu->blkcount, &fwu->phyaddr);
+
+ if (fwu->blkcount.dp_config)
+ fwu->flash_properties.has_disp_config = 1;
+ else
+ fwu->flash_properties.has_disp_config = 0;
+
+ if (fwu->blkcount.pm_config)
+ fwu->flash_properties.has_pm_config = 1;
+ else
+ fwu->flash_properties.has_pm_config = 0;
+
+ if (fwu->blkcount.bl_config)
+ fwu->flash_properties.has_bl_config = 1;
+ else
+ fwu->flash_properties.has_bl_config = 0;
+
+ if (fwu->blkcount.guest_code)
+ fwu->has_guest_code = 1;
+ else
+ fwu->has_guest_code = 0;
+
+ if (fwu->blkcount.utility_param)
+ fwu->has_utility_param = 1;
+ else
+ fwu->has_utility_param = 0;
+
+ kfree(ptable);
+
+ if (rmi4_data->hw_if->board_data->lockdown_area == LOCKDOWN_AREA_GUEST_SERIALIZATION)
+ fwu_read_f34_guest_serialization_partition();
+
+ return 0;
+}
+
+static int fwu_read_f34_lockdown_data(void)
+{
+ int retval = 0;
+ unsigned short block_count;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (!fwu->has_lockdown_data)
+ return -EINVAL;
+
+ block_count = fwu->blkcount.lockdown_data;
+ fwu->config_area = UI_CONFIG_AREA;
+ fwu->config_size = fwu->block_size * block_count;
+
+ retval = fwu_allocate_read_config_buf(fwu->config_size);
+ if (retval < 0)
+ return retval;
+
+ retval = fwu_read_f34_blocks(block_count, CMD_READ_LOCKDOWN_DATA);
+ if (retval < 0)
+ return retval;
+
+ secure_memcpy(rmi4_data->lockdown_info, LOCKDOWN_INFO_SIZE,
+ &fwu->read_config_buf[4], fwu->read_config_buf_size, LOCKDOWN_INFO_SIZE);
+
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Lockdown info: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
+ __func__, fwu->read_config_buf[4], fwu->read_config_buf[5],
+ fwu->read_config_buf[6], fwu->read_config_buf[7],
+ fwu->read_config_buf[8], fwu->read_config_buf[9],
+ fwu->read_config_buf[10], fwu->read_config_buf[11]);
+
+ return retval;
+}
+
+static int fwu_read_f34_v5v6_queries(void)
+{
+ int retval;
+ unsigned char count;
+ unsigned char query_base;
+ unsigned char buf[10];
+ struct f34_v5v6_flash_properties_2 properties_2;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ query_base = fwu->f34_fd.query_base_addr;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ query_base + V5V6_BOOTLOADER_ID_OFFSET,
+ fwu->bootloader_id,
+ sizeof(fwu->bootloader_id));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read bootloader ID\n",
+ __func__);
+ return retval;
+ }
+
+ if (fwu->bl_version == BL_V5) {
+ fwu->off.properties = V5_PROPERTIES_OFFSET;
+ fwu->off.block_size = V5_BLOCK_SIZE_OFFSET;
+ fwu->off.block_count = V5_BLOCK_COUNT_OFFSET;
+ fwu->off.block_number = V5_BLOCK_NUMBER_OFFSET;
+ fwu->off.payload = V5_BLOCK_DATA_OFFSET;
+ } else if (fwu->bl_version == BL_V6) {
+ fwu->off.properties = V6_PROPERTIES_OFFSET;
+ fwu->off.properties_2 = V6_PROPERTIES_2_OFFSET;
+ fwu->off.block_size = V6_BLOCK_SIZE_OFFSET;
+ fwu->off.block_count = V6_BLOCK_COUNT_OFFSET;
+ fwu->off.block_number = V6_BLOCK_NUMBER_OFFSET;
+ fwu->off.payload = V6_BLOCK_DATA_OFFSET;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ query_base + fwu->off.block_size,
+ buf,
+ 2);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read block size info\n",
+ __func__);
+ return retval;
+ }
+
+ batohs(&fwu->block_size, &(buf[0]));
+
+ if (fwu->bl_version == BL_V5) {
+ fwu->off.flash_cmd = fwu->off.payload + fwu->block_size;
+ fwu->off.flash_status = fwu->off.flash_cmd;
+ } else if (fwu->bl_version == BL_V6) {
+ fwu->off.flash_cmd = V6_FLASH_COMMAND_OFFSET;
+ fwu->off.flash_status = V6_FLASH_STATUS_OFFSET;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ query_base + fwu->off.properties,
+ fwu->flash_properties.data,
+ sizeof(fwu->flash_properties.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read flash properties\n",
+ __func__);
+ return retval;
+ }
+
+ count = 4;
+
+ if (fwu->flash_properties.has_pm_config)
+ count += 2;
+
+ if (fwu->flash_properties.has_bl_config)
+ count += 2;
+
+ if (fwu->flash_properties.has_disp_config)
+ count += 2;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ query_base + fwu->off.block_count,
+ buf,
+ count);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read block count info\n",
+ __func__);
+ return retval;
+ }
+
+ batohs(&fwu->blkcount.ui_firmware, &(buf[0]));
+ batohs(&fwu->blkcount.ui_config, &(buf[2]));
+
+ count = 4;
+
+ if (fwu->flash_properties.has_pm_config) {
+ batohs(&fwu->blkcount.pm_config, &(buf[count]));
+ count += 2;
+ }
+
+ if (fwu->flash_properties.has_bl_config) {
+ batohs(&fwu->blkcount.bl_config, &(buf[count]));
+ count += 2;
+ }
+
+ if (fwu->flash_properties.has_disp_config)
+ batohs(&fwu->blkcount.dp_config, &(buf[count]));
+
+ fwu->has_guest_code = false;
+
+ fwu->has_lockdown_data = false;
+
+ if (fwu->flash_properties.has_query4) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ query_base + fwu->off.properties_2,
+ properties_2.data,
+ sizeof(properties_2.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read flash properties 2\n",
+ __func__);
+ return retval;
+ }
+
+ count = 0;
+
+ if (properties_2.has_guest_code) {
+ count++;
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ query_base + fwu->off.properties_2 + count,
+ buf,
+ 2);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read guest code block count\n",
+ __func__);
+ return retval;
+ }
+
+ batohs(&fwu->blkcount.guest_code, &(buf[0]));
+ fwu->has_guest_code = true;
+ }
+
+ if (properties_2.has_gesture_config_area)
+ count++;
+
+ if (properties_2.has_force_config_block)
+ count++;
+
+ if (properties_2.has_lockdown_data_block) {
+ count++;
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ query_base + fwu->off.properties_2 + count,
+ buf,
+ 2);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read lockdown data block count\n",
+ __func__);
+ return retval;
+ }
+
+ batohs(&fwu->blkcount.lockdown_data, &(buf[0]));
+ fwu->has_lockdown_data = true;
+
+ fwu_read_f34_lockdown_data();
+ }
+ }
+
+ fwu->has_utility_param = false;
+
+ return 0;
+}
+
+static int fwu_read_f34_queries(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+ u8 *tp_maker = NULL;
+
+ memset(&fwu->blkcount, 0x00, sizeof(fwu->blkcount));
+ memset(&fwu->phyaddr, 0x00, sizeof(fwu->phyaddr));
+
+ if (fwu->bl_version == BL_V7)
+ retval = fwu_read_f34_v7_queries();
+ else
+ retval = fwu_read_f34_v5v6_queries();
+
+ tp_maker = kzalloc(20, GFP_KERNEL);
+ if (tp_maker == NULL)
+ dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc vendor name memory\n", __func__);
+ else {
+ kfree(tp_maker);
+ tp_maker = NULL;
+ }
+ return retval;
+}
+
+static int fwu_write_f34_v7_blocks(unsigned char *block_ptr,
+ unsigned short block_cnt, unsigned char command)
+{
+ int retval;
+ unsigned char data_base;
+ unsigned char length[2];
+ unsigned short transfer;
+ unsigned short remaining = block_cnt;
+ unsigned short block_number = 0;
+ unsigned short left_bytes;
+ unsigned short write_size;
+ unsigned short max_write_size;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f34_fd.data_base_addr;
+
+ retval = fwu_write_f34_partition_id(command);
+ if (retval < 0)
+ return retval;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.block_number,
+ (unsigned char *)&block_number,
+ sizeof(block_number));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write block number\n",
+ __func__);
+ return retval;
+ }
+
+ do {
+ if (remaining / fwu->payload_length)
+ transfer = fwu->payload_length;
+ else
+ transfer = remaining;
+
+ length[0] = (unsigned char)(transfer & MASK_8BIT);
+ length[1] = (unsigned char)(transfer >> 8);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.transfer_length,
+ length,
+ sizeof(length));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write transfer length (remaining = %d)\n",
+ __func__, remaining);
+ return retval;
+ }
+
+ retval = fwu_write_f34_command(command);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write command (remaining = %d)\n",
+ __func__, remaining);
+ return retval;
+ }
+
+#ifdef MAX_WRITE_SIZE
+ max_write_size = MAX_WRITE_SIZE;
+ if (max_write_size >= transfer * fwu->block_size)
+ max_write_size = transfer * fwu->block_size;
+ else if (max_write_size > fwu->block_size)
+ max_write_size -= max_write_size % fwu->block_size;
+ else
+ max_write_size = fwu->block_size;
+#else
+ max_write_size = transfer * fwu->block_size;
+#endif
+ left_bytes = transfer * fwu->block_size;
+
+ do {
+ if (left_bytes / max_write_size)
+ write_size = max_write_size;
+ else
+ write_size = left_bytes;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.payload,
+ block_ptr,
+ write_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write block data (remaining = %d)\n",
+ __func__, remaining);
+ return retval;
+ }
+
+ block_ptr += write_size;
+ left_bytes -= write_size;
+ } while (left_bytes);
+
+ retval = fwu_wait_for_idle(WRITE_WAIT_MS, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to wait for idle status (remaining = %d)\n",
+ __func__, remaining);
+ return retval;
+ }
+
+ remaining -= transfer;
+ } while (remaining);
+
+ return 0;
+}
+
+static int fwu_write_f34_v5v6_blocks(unsigned char *block_ptr,
+ unsigned short block_cnt, unsigned char command)
+{
+ int retval;
+ unsigned char data_base;
+ unsigned char block_number[] = {0, 0};
+ unsigned short blk;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f34_fd.data_base_addr;
+
+ block_number[1] |= (fwu->config_area << 5);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.block_number,
+ block_number,
+ sizeof(block_number));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write block number\n",
+ __func__);
+ return retval;
+ }
+
+ for (blk = 0; blk < block_cnt; blk++) {
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.payload,
+ block_ptr,
+ fwu->block_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write block data (block %d)\n",
+ __func__, blk);
+ return retval;
+ }
+
+ retval = fwu_write_f34_command(command);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write command for block %d\n",
+ __func__, blk);
+ return retval;
+ }
+
+ retval = fwu_wait_for_idle(WRITE_WAIT_MS, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to wait for idle status (block %d)\n",
+ __func__, blk);
+ return retval;
+ }
+
+ block_ptr += fwu->block_size;
+ }
+
+ return 0;
+}
+
+static int fwu_write_f34_blocks(unsigned char *block_ptr,
+ unsigned short block_cnt, unsigned char cmd)
+{
+ int retval;
+
+ if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8)
+ retval = fwu_write_f34_v7_blocks(block_ptr, block_cnt, cmd);
+ else
+ retval = fwu_write_f34_v5v6_blocks(block_ptr, block_cnt, cmd);
+
+ return retval;
+}
+
+static int fwu_read_f34_v7_blocks(unsigned short block_cnt,
+ unsigned char command)
+{
+ int retval;
+ unsigned char data_base;
+ unsigned char length[2];
+ unsigned short transfer;
+ unsigned short remaining = block_cnt;
+ unsigned short block_number = 0;
+ unsigned short index = 0;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f34_fd.data_base_addr;
+
+ retval = fwu_write_f34_partition_id(command);
+ if (retval < 0)
+ return retval;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.block_number,
+ (unsigned char *)&block_number,
+ sizeof(block_number));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write block number\n",
+ __func__);
+ return retval;
+ }
+
+ do {
+ if (remaining / fwu->payload_length)
+ transfer = fwu->payload_length;
+ else
+ transfer = remaining;
+
+ length[0] = (unsigned char)(transfer & MASK_8BIT);
+ length[1] = (unsigned char)(transfer >> 8);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.transfer_length,
+ length,
+ sizeof(length));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write transfer length (remaining = %d)\n",
+ __func__, remaining);
+ return retval;
+ }
+
+ retval = fwu_write_f34_command(command);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write command (remaining = %d)\n",
+ __func__, remaining);
+ return retval;
+ }
+
+ retval = fwu_wait_for_idle(WRITE_WAIT_MS, true);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to wait for idle status (remaining = %d)\n",
+ __func__, remaining);
+ return retval;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_base + fwu->off.payload,
+ &fwu->read_config_buf[index],
+ transfer * fwu->block_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read block data (remaining = %d)\n",
+ __func__, remaining);
+ return retval;
+ }
+
+ index += (transfer * fwu->block_size);
+ remaining -= transfer;
+ } while (remaining);
+
+ return 0;
+}
+
+static int fwu_read_f34_v5v6_blocks(unsigned short block_cnt,
+ unsigned char command)
+{
+ int retval;
+ unsigned char data_base;
+ unsigned char block_number[] = {0, 0};
+ unsigned short blk;
+ unsigned short index = 0;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f34_fd.data_base_addr;
+
+ block_number[1] |= (fwu->config_area << 5);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ data_base + fwu->off.block_number,
+ block_number,
+ sizeof(block_number));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write block number\n",
+ __func__);
+ return retval;
+ }
+
+ for (blk = 0; blk < block_cnt; blk++) {
+ retval = fwu_write_f34_command(command);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write read config command\n",
+ __func__);
+ return retval;
+ }
+
+ retval = fwu_wait_for_idle(WRITE_WAIT_MS, true);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to wait for idle status\n",
+ __func__);
+ return retval;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_base + fwu->off.payload,
+ &fwu->read_config_buf[index],
+ fwu->block_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read block data (block %d)\n",
+ __func__, blk);
+ return retval;
+ }
+
+ index += fwu->block_size;
+ }
+
+ return 0;
+}
+
+static int fwu_read_f34_blocks(unsigned short block_cnt, unsigned char cmd)
+{
+ int retval;
+
+ if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8)
+ retval = fwu_read_f34_v7_blocks(block_cnt, cmd);
+ else
+ retval = fwu_read_f34_v5v6_blocks(block_cnt, cmd);
+
+ return retval;
+}
+
+static int fwu_read_f34_guest_serialization_partition(void)
+{
+ int retval = 0;
+ unsigned short block_count;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ fwu->config_area = PM_CONFIG_AREA;
+ if (!fwu->flash_properties.has_pm_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Permanent configuration not supported\n",
+ __func__);
+ return -EINVAL;
+ }
+ block_count = fwu->blkcount.pm_config;
+
+ fwu->config_size = fwu->block_size * block_count;
+ kfree(fwu->read_config_buf);
+ fwu->read_config_buf = kzalloc(fwu->config_size, GFP_KERNEL);
+ if (!fwu->read_config_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for fwu->read_config_buf\n",
+ __func__);
+ fwu->read_config_buf_size = 0;
+ retval = -ENOMEM;
+ return retval;
+ }
+ fwu->read_config_buf_size = fwu->config_size;
+
+ retval = fwu_read_f34_blocks(block_count, CMD_READ_CONFIG);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to get guest serialization partition\n",
+ __func__);
+ return retval;
+ }
+
+ secure_memcpy(rmi4_data->lockdown_info, LOCKDOWN_INFO_SIZE,
+ fwu->read_config_buf, fwu->read_config_buf_size, LOCKDOWN_INFO_SIZE);
+
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Lockdown info: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
+ __func__, fwu->read_config_buf[0], fwu->read_config_buf[1],
+ fwu->read_config_buf[2], fwu->read_config_buf[3],
+ fwu->read_config_buf[4], fwu->read_config_buf[5],
+ fwu->read_config_buf[6], fwu->read_config_buf[7]);
+
+ return retval;
+}
+
+static int fwu_get_image_firmware_id(unsigned int *fw_id)
+{
+ int retval;
+ unsigned char index = 0;
+ char *strptr;
+ char *firmware_id;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (fwu->img.contains_firmware_id) {
+ *fw_id = fwu->img.firmware_id;
+ } else {
+ strptr = strnstr(fwu->image_name, "PR", MAX_IMAGE_NAME_LEN);
+ if (!strptr) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: No valid PR number (PRxxxxxxx) "
+ "found in image file name (%s)\n",
+ __func__, fwu->image_name);
+ return -EINVAL;
+ }
+
+ strptr += 2;
+ firmware_id = kzalloc(MAX_FIRMWARE_ID_LEN, GFP_KERNEL);
+ if (!firmware_id) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for firmware_id\n",
+ __func__);
+ return -ENOMEM;
+ }
+ while (strptr[index] >= '0' && strptr[index] <= '9') {
+ firmware_id[index] = strptr[index];
+ index++;
+ }
+
+ retval = sstrtoul(firmware_id, 10, (unsigned long *)fw_id);
+ kfree(firmware_id);
+ if (retval) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to obtain image firmware ID\n",
+ __func__);
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
+static int fwu_get_device_config_id(void)
+{
+ int retval;
+ unsigned char config_id_size;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8)
+ config_id_size = V7_CONFIG_ID_SIZE;
+ else
+ config_id_size = V5V6_CONFIG_ID_SIZE;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fwu->f34_fd.ctrl_base_addr,
+ fwu->config_id,
+ config_id_size);
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+static enum flash_area fwu_go_nogo(void)
+{
+ int retval;
+ enum flash_area flash_area = NONE;
+ unsigned char ii;
+ unsigned char config_id_size;
+ unsigned int device_fw_id;
+ unsigned int image_fw_id;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (fwu->force_update) {
+ flash_area = UI_FIRMWARE;
+ goto exit;
+ }
+
+ /* Update both UI and config if device is in bootloader mode */
+ if (fwu->bl_mode_device) {
+ flash_area = UI_FIRMWARE;
+ goto exit;
+ }
+
+ /* Get device firmware ID */
+ device_fw_id = rmi4_data->firmware_id;
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Device firmware ID = %d\n",
+ __func__, device_fw_id);
+
+ /* Get image firmware ID */
+ retval = fwu_get_image_firmware_id(&image_fw_id);
+ if (retval < 0) {
+ flash_area = NONE;
+ goto exit;
+ }
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Image firmware ID = %d\n",
+ __func__, image_fw_id);
+
+ if (image_fw_id != device_fw_id) {
+ flash_area = UI_FIRMWARE;
+ goto exit;
+ }
+
+ /* Get device config ID */
+ retval = fwu_get_device_config_id();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read device config ID\n",
+ __func__);
+ flash_area = NONE;
+ goto exit;
+ }
+
+ if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8)
+ config_id_size = V7_CONFIG_ID_SIZE;
+ else
+ config_id_size = V5V6_CONFIG_ID_SIZE;
+
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Device firmware Config ID = %02x%02x%02x%02x\n",
+ __func__, fwu->config_id[0], fwu->config_id[1], fwu->config_id[2], fwu->config_id[3]);
+
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Image firmware Config ID = %02x%02x%02x%02x\n",
+ __func__, fwu->img.ui_config.data[0], fwu->img.ui_config.data[1],
+ fwu->img.ui_config.data[2], fwu->img.ui_config.data[3]);
+
+ for (ii = 0; ii < config_id_size; ii++) {
+ if (fwu->img.ui_config.data[ii] != fwu->config_id[ii]) {
+ flash_area = UI_CONFIG;
+ goto exit;
+ }
+ }
+
+ flash_area = NONE;
+
+exit:
+ if (flash_area == NONE) {
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: No need to do reflash\n",
+ __func__);
+ } else {
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Updating %s\n",
+ __func__,
+ flash_area == UI_FIRMWARE ?
+ "UI firmware and config" :
+ "UI config only");
+ }
+
+ return flash_area;
+}
+
+static int fwu_scan_pdt(void)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char intr_count = 0;
+ unsigned char intr_off;
+ unsigned char intr_src;
+ unsigned short addr;
+ bool f01found = false;
+ bool f34found = false;
+ bool f35found = false;
+ struct synaptics_rmi4_fn_desc rmi_fd;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ fwu->in_ub_mode = false;
+
+ for (addr = PDT_START; addr > PDT_END; addr -= PDT_ENTRY_SIZE) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ addr,
+ (unsigned char *)&rmi_fd,
+ sizeof(rmi_fd));
+ if (retval < 0)
+ return retval;
+
+ if (rmi_fd.fn_number) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Found F%02x\n",
+ __func__, rmi_fd.fn_number);
+ switch (rmi_fd.fn_number) {
+ case SYNAPTICS_RMI4_F01:
+ f01found = true;
+
+ rmi4_data->f01_query_base_addr =
+ rmi_fd.query_base_addr;
+ rmi4_data->f01_ctrl_base_addr =
+ rmi_fd.ctrl_base_addr;
+ rmi4_data->f01_data_base_addr =
+ rmi_fd.data_base_addr;
+ rmi4_data->f01_cmd_base_addr =
+ rmi_fd.cmd_base_addr;
+ break;
+ case SYNAPTICS_RMI4_F34:
+ f34found = true;
+ fwu->f34_fd.query_base_addr =
+ rmi_fd.query_base_addr;
+ fwu->f34_fd.ctrl_base_addr =
+ rmi_fd.ctrl_base_addr;
+ fwu->f34_fd.data_base_addr =
+ rmi_fd.data_base_addr;
+
+ switch (rmi_fd.fn_version) {
+ case F34_V0:
+ fwu->bl_version = BL_V5;
+ break;
+ case F34_V1:
+ fwu->bl_version = BL_V6;
+ break;
+ case F34_V2:
+ fwu->bl_version = BL_V7;
+ break;
+ default:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Unrecognized F34 version\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ fwu->intr_mask = 0;
+ intr_src = rmi_fd.intr_src_count;
+ intr_off = intr_count % 8;
+ for (ii = intr_off;
+ ii < (intr_src + intr_off);
+ ii++) {
+ fwu->intr_mask |= 1 << ii;
+ }
+ break;
+ case SYNAPTICS_RMI4_F35:
+ f35found = true;
+ fwu->f35_fd.query_base_addr =
+ rmi_fd.query_base_addr;
+ fwu->f35_fd.ctrl_base_addr =
+ rmi_fd.ctrl_base_addr;
+ fwu->f35_fd.data_base_addr =
+ rmi_fd.data_base_addr;
+ fwu->f35_fd.cmd_base_addr =
+ rmi_fd.cmd_base_addr;
+ break;
+ }
+ } else {
+ break;
+ }
+
+ intr_count += rmi_fd.intr_src_count;
+ }
+
+ if (!f01found || !f34found) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to find both F01 and F34\n",
+ __func__);
+ if (!f35found) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to find F35\n",
+ __func__);
+ return -EINVAL;
+ } else {
+ fwu->in_ub_mode = true;
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: In microbootloader mode\n",
+ __func__);
+ fwu_recovery_check_status();
+ return 0;
+ }
+ }
+
+ rmi4_data->intr_mask[0] |= fwu->intr_mask;
+
+ addr = rmi4_data->f01_ctrl_base_addr + 1;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ addr,
+ &(rmi4_data->intr_mask[0]),
+ sizeof(rmi4_data->intr_mask[0]));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set interrupt enable bit\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static int fwu_enter_flash_prog(void)
+{
+ int retval;
+ struct f01_device_control f01_device_control;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = fwu_read_flash_status();
+ if (retval < 0)
+ return retval;
+
+ if (fwu->in_bl_mode)
+ return 0;
+
+ retval = rmi4_data->irq_enable(rmi4_data, false, true);
+ if (retval < 0)
+ return retval;
+
+ msleep(INT_DISABLE_WAIT_MS);
+
+ retval = fwu_write_f34_command(CMD_ENABLE_FLASH_PROG);
+ if (retval < 0)
+ return retval;
+
+ retval = fwu_wait_for_idle(ENABLE_WAIT_MS, false);
+ if (retval < 0)
+ return retval;
+
+ if (!fwu->in_bl_mode) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: BL mode not entered\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ if (rmi4_data->hw_if->bl_hw_init) {
+ retval = rmi4_data->hw_if->bl_hw_init(rmi4_data);
+ if (retval < 0)
+ return retval;
+ }
+
+ retval = fwu_scan_pdt();
+ if (retval < 0)
+ return retval;
+
+ pr_err("%s: fwu->in_ub_mode = %d\n", __func__, fwu->in_ub_mode);
+
+ retval = fwu_read_f34_queries();
+ if (retval < 0)
+ return retval;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ f01_device_control.data,
+ sizeof(f01_device_control.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read F01 device control\n",
+ __func__);
+ return retval;
+ }
+
+ f01_device_control.nosleep = true;
+ f01_device_control.sleep_mode = SLEEP_MODE_NORMAL;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ f01_device_control.data,
+ sizeof(f01_device_control.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write F01 device control\n",
+ __func__);
+ return retval;
+ }
+
+ msleep(ENTER_FLASH_PROG_WAIT_MS);
+
+ return retval;
+}
+
+static int fwu_check_ui_firmware_size(void)
+{
+ unsigned short block_count;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ block_count = fwu->img.ui_firmware.size / fwu->block_size;
+
+ if (block_count != fwu->blkcount.ui_firmware) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: UI firmware size mismatch\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int fwu_check_ui_configuration_size(void)
+{
+ unsigned short block_count;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ block_count = fwu->img.ui_config.size / fwu->block_size;
+
+ if (block_count != fwu->blkcount.ui_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: UI configuration size mismatch\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int fwu_check_dp_configuration_size(void)
+{
+ unsigned short block_count;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ block_count = fwu->img.dp_config.size / fwu->block_size;
+
+ if (block_count != fwu->blkcount.dp_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Display configuration size mismatch\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int fwu_check_pm_configuration_size(void)
+{
+ unsigned short block_count;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ block_count = fwu->img.pm_config.size / fwu->block_size;
+
+ if (block_count != fwu->blkcount.pm_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Permanent configuration size mismatch\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int fwu_check_bl_configuration_size(void)
+{
+ unsigned short block_count;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ block_count = fwu->img.bl_config.size / fwu->block_size;
+
+ if (block_count != fwu->blkcount.bl_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Bootloader configuration size mismatch\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int fwu_check_guest_code_size(void)
+{
+ unsigned short block_count;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ block_count = fwu->img.guest_code.size / fwu->block_size;
+ if (block_count != fwu->blkcount.guest_code) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Guest code size mismatch\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int fwu_erase_configuration(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ switch (fwu->config_area) {
+ case UI_CONFIG_AREA:
+ retval = fwu_write_f34_command(CMD_ERASE_UI_CONFIG);
+ if (retval < 0)
+ return retval;
+ break;
+ case DP_CONFIG_AREA:
+ retval = fwu_write_f34_command(CMD_ERASE_DISP_CONFIG);
+ if (retval < 0)
+ return retval;
+ break;
+ case BL_CONFIG_AREA:
+ retval = fwu_write_f34_command(CMD_ERASE_BL_CONFIG);
+ if (retval < 0)
+ return retval;
+ break;
+ case FLASH_CONFIG_AREA:
+ retval = fwu_write_f34_command(CMD_ERASE_FLASH_CONFIG);
+ if (retval < 0)
+ return retval;
+ break;
+ default:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Invalid config area\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Erase command written\n",
+ __func__);
+
+ retval = fwu_wait_for_idle(ERASE_WAIT_MS, false);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Idle status detected\n",
+ __func__);
+
+ return retval;
+}
+
+static int fwu_erase_bootloader(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = fwu_write_f34_command(CMD_ERASE_BOOTLOADER);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Erase command written\n",
+ __func__);
+
+ retval = fwu_wait_for_idle(ERASE_WAIT_MS, false);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Idle status detected\n",
+ __func__);
+
+ return 0;
+}
+
+static int fwu_erase_utility_parameter(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = fwu_write_f34_command(CMD_ERASE_UTILITY_PARAMETER);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Erase command written\n",
+ __func__);
+
+ retval = fwu_wait_for_idle(ERASE_WAIT_MS, false);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Idle status detected\n",
+ __func__);
+
+ return 0;
+}
+
+static int fwu_erase_guest_code(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = fwu_write_f34_command(CMD_ERASE_GUEST_CODE);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Erase command written\n",
+ __func__);
+
+ retval = fwu_wait_for_idle(ERASE_WAIT_MS, false);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Idle status detected\n",
+ __func__);
+
+ return 0;
+}
+
+static int fwu_erase_all(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (fwu->bl_version == BL_V7) {
+ fwu->config_area = INVALID_CONFIG_AREA;
+ retval = fwu_write_f34_command(CMD_ERASE_UI_FIRMWARE);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Erase command written\n",
+ __func__);
+
+ retval = fwu_wait_for_idle(ERASE_WAIT_MS, false);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Idle status detected\n",
+ __func__);
+
+ pr_err("erased core code\n");
+
+ fwu->config_area = UI_CONFIG_AREA;
+ retval = fwu_erase_configuration();
+ if (retval < 0)
+ return retval;
+
+ pr_err("erased core config\n");
+ } else {
+ retval = fwu_write_f34_command(CMD_ERASE_ALL);
+ if (retval < 0)
+ return retval;
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Erase all command written\n",
+ __func__);
+
+ retval = fwu_wait_for_idle(ERASE_WAIT_MS, false);
+ if (!(fwu->bl_version == BL_V8 &&
+ fwu->flash_status == BAD_PARTITION_TABLE)) {
+ if (retval < 0)
+ return retval;
+ }
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Idle status detected\n",
+ __func__);
+
+ if (fwu->bl_version == BL_V8)
+ return 0;
+ }
+
+ if (fwu->flash_properties.has_disp_config &&
+ fwu->img.contains_disp_config) {
+ fwu->config_area = DP_CONFIG_AREA;
+ retval = fwu_erase_configuration();
+ if (retval < 0)
+ return retval;
+ }
+
+ if (fwu->has_guest_code && fwu->img.contains_guest_code) {
+ retval = fwu_erase_guest_code();
+ if (retval < 0)
+ return retval;
+ }
+
+ return 0;
+}
+
+static int fwu_write_firmware(void)
+{
+ unsigned short firmware_block_count;
+
+ firmware_block_count = fwu->img.ui_firmware.size / fwu->block_size;
+
+ pr_err("core code block count = %d\n", firmware_block_count);
+
+ return fwu_write_f34_blocks((unsigned char *)fwu->img.ui_firmware.data,
+ firmware_block_count, CMD_WRITE_FW);
+}
+
+static int fwu_write_bootloader(void)
+{
+ int retval;
+ unsigned short bootloader_block_count;
+
+ bootloader_block_count = fwu->img.bl_image.size / fwu->block_size;
+
+ pr_err("bootloader block count = %d\n", bootloader_block_count);
+
+ fwu->write_bootloader = true;
+ retval = fwu_write_f34_blocks((unsigned char *)fwu->img.bl_image.data,
+ bootloader_block_count, CMD_WRITE_BOOTLOADER);
+ fwu->write_bootloader = false;
+
+ return retval;
+}
+
+static int fwu_write_utility_parameter(void)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char checksum_array[4];
+ unsigned char *pbuf;
+ unsigned short remaining_size;
+ unsigned short utility_param_size;
+ unsigned long checksum;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ utility_param_size = fwu->blkcount.utility_param * fwu->block_size;
+ retval = fwu_allocate_read_config_buf(utility_param_size);
+ if (retval < 0)
+ return retval;
+ memset(fwu->read_config_buf, 0x00, utility_param_size);
+
+ pbuf = fwu->read_config_buf;
+ remaining_size = utility_param_size - 4;
+
+ for (ii = 0; ii < MAX_UTILITY_PARAMS; ii++) {
+ if (fwu->img.utility_param_id[ii] == UNUSED)
+ continue;
+
+#ifdef F51_DISCRETE_FORCE
+ if (fwu->img.utility_param_id[ii] == FORCE_PARAMETER) {
+ if (fwu->bl_mode_device) {
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Device in bootloader mode, skipping calibration data restoration\n",
+ __func__);
+ goto image_param;
+ }
+ retval = secure_memcpy(&(pbuf[4]),
+ remaining_size - 4,
+ fwu->cal_data,
+ fwu->cal_data_buf_size,
+ fwu->cal_data_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy force calibration data\n",
+ __func__);
+ return retval;
+ }
+ pbuf[0] = FORCE_PARAMETER;
+ pbuf[1] = 0x00;
+ pbuf[2] = (4 + fwu->cal_data_size) / 2;
+ pbuf += (fwu->cal_data_size + 4);
+ remaining_size -= (fwu->cal_data_size + 4);
+ continue;
+ }
+image_param:
+#endif
+
+ retval = secure_memcpy(pbuf,
+ remaining_size,
+ fwu->img.utility_param[ii].data,
+ fwu->img.utility_param[ii].size,
+ fwu->img.utility_param[ii].size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy utility parameter data\n",
+ __func__);
+ return retval;
+ }
+ pbuf += fwu->img.utility_param[ii].size;
+ remaining_size -= fwu->img.utility_param[ii].size;
+ }
+
+ calculate_checksum((unsigned short *)fwu->read_config_buf,
+ ((utility_param_size - 4) / 2),
+ &checksum);
+
+ convert_to_little_endian(checksum_array, checksum);
+
+ fwu->read_config_buf[utility_param_size - 4] = checksum_array[0];
+ fwu->read_config_buf[utility_param_size - 3] = checksum_array[1];
+ fwu->read_config_buf[utility_param_size - 2] = checksum_array[2];
+ fwu->read_config_buf[utility_param_size - 1] = checksum_array[3];
+
+ pr_err("utility parameter block count = %d\n", fwu->blkcount.utility_param);
+
+ retval = fwu_write_f34_blocks((unsigned char *)fwu->read_config_buf,
+ fwu->blkcount.utility_param, CMD_WRITE_UTILITY_PARAM);
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+static int fwu_write_configuration(void)
+{
+ return fwu_write_f34_blocks((unsigned char *)fwu->config_data,
+ fwu->config_block_count, CMD_WRITE_CONFIG);
+}
+
+static int fwu_write_ui_configuration(void)
+{
+ fwu->config_area = UI_CONFIG_AREA;
+ fwu->config_data = fwu->img.ui_config.data;
+ fwu->config_size = fwu->img.ui_config.size;
+ fwu->config_block_count = fwu->config_size / fwu->block_size;
+
+ pr_err("core config block count = %d\n", fwu->config_block_count);
+
+ return fwu_write_configuration();
+}
+
+static int fwu_write_dp_configuration(void)
+{
+ fwu->config_area = DP_CONFIG_AREA;
+ fwu->config_data = fwu->img.dp_config.data;
+ fwu->config_size = fwu->img.dp_config.size;
+ fwu->config_block_count = fwu->config_size / fwu->block_size;
+
+ return fwu_write_configuration();
+}
+
+static int fwu_write_pm_configuration(void)
+{
+ fwu->config_area = PM_CONFIG_AREA;
+ fwu->config_data = fwu->img.pm_config.data;
+ fwu->config_size = fwu->img.pm_config.size;
+ fwu->config_block_count = fwu->config_size / fwu->block_size;
+
+ return fwu_write_configuration();
+}
+
+static int fwu_write_flash_configuration(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ fwu->config_area = FLASH_CONFIG_AREA;
+ fwu->config_data = fwu->img.fl_config.data;
+ fwu->config_size = fwu->img.fl_config.size;
+ fwu->config_block_count = fwu->config_size / fwu->block_size;
+
+ if (fwu->config_block_count != fwu->blkcount.fl_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Flash configuration size mismatch\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ retval = fwu_erase_configuration();
+ if (retval < 0)
+ return retval;
+
+ retval = fwu_write_configuration();
+ if (retval < 0)
+ return retval;
+
+ rmi4_data->reset_device(rmi4_data, false);
+
+ return 0;
+}
+
+static int fwu_write_guest_code(void)
+{
+ int retval;
+ unsigned short guest_code_block_count;
+
+ guest_code_block_count = fwu->img.guest_code.size / fwu->block_size;
+
+ retval = fwu_write_f34_blocks((unsigned char *)fwu->img.guest_code.data,
+ guest_code_block_count, CMD_WRITE_GUEST_CODE);
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+static int fwu_write_lockdown(void)
+{
+ unsigned short lockdown_block_count;
+
+ lockdown_block_count = fwu->img.lockdown.size / fwu->block_size;
+
+ return fwu_write_f34_blocks((unsigned char *)fwu->img.lockdown.data,
+ lockdown_block_count, CMD_WRITE_LOCKDOWN);
+}
+
+static int fwu_write_partition_table_v8(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ fwu->config_area = FLASH_CONFIG_AREA;
+ fwu->config_data = fwu->img.fl_config.data;
+ fwu->config_size = fwu->img.fl_config.size;
+ fwu->config_block_count = fwu->config_size / fwu->block_size;
+
+ if (fwu->config_block_count != fwu->blkcount.fl_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Flash configuration size mismatch\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ retval = fwu_write_configuration();
+ if (retval < 0)
+ return retval;
+
+ rmi4_data->reset_device(rmi4_data, false);
+
+ return 0;
+}
+
+static int fwu_write_partition_table_v7(void)
+{
+ int retval;
+ unsigned short block_count;
+
+ block_count = fwu->blkcount.bl_config;
+ fwu->config_area = BL_CONFIG_AREA;
+ fwu->config_size = fwu->block_size * block_count;
+
+ retval = fwu_allocate_read_config_buf(fwu->config_size);
+ if (retval < 0)
+ return retval;
+
+ retval = fwu_read_f34_blocks(block_count, CMD_READ_CONFIG);
+ if (retval < 0)
+ return retval;
+
+ retval = fwu_erase_configuration();
+ if (retval < 0)
+ return retval;
+
+ retval = fwu_write_flash_configuration();
+ if (retval < 0)
+ return retval;
+
+ fwu->config_area = BL_CONFIG_AREA;
+ fwu->config_data = fwu->read_config_buf;
+ fwu->config_size = fwu->img.bl_config.size;
+ fwu->config_block_count = fwu->config_size / fwu->block_size;
+
+ retval = fwu_write_configuration();
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+static int fwu_write_bl_area_v7(void)
+{
+ int retval;
+ bool has_utility_param;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ has_utility_param = fwu->has_utility_param;
+
+ if (fwu->has_utility_param) {
+ retval = fwu_erase_utility_parameter();
+ if (retval < 0)
+ return retval;
+
+ pr_err("erased utility parameter\n");
+ }
+
+ fwu->config_area = BL_CONFIG_AREA;
+ retval = fwu_erase_configuration();
+ if (retval < 0)
+ return retval;
+
+ pr_err("erased bootloader config\n");
+
+ fwu->config_area = FLASH_CONFIG_AREA;
+ retval = fwu_erase_configuration();
+ if (retval < 0)
+ return retval;
+
+ pr_err("erased flash config\n");
+
+ retval = fwu_erase_bootloader();
+ if (retval < 0)
+ return retval;
+
+ pr_err("erased bootloader\n");
+
+ retval = fwu_write_bootloader();
+ if (retval < 0)
+ return retval;
+
+ pr_err("bootloader written\n");
+
+ msleep(rmi4_data->hw_if->board_data->reset_delay_ms);
+ rmi4_data->reset_device(rmi4_data, false);
+
+ pr_err("reset after writing bootloader\n");
+
+ fwu->config_area = FLASH_CONFIG_AREA;
+ fwu->config_data = fwu->img.fl_config.data;
+ fwu->config_size = fwu->img.fl_config.size;
+ fwu->config_block_count = fwu->config_size / fwu->block_size;
+ pr_err("flash config block count = %d\n", fwu->config_block_count);
+ retval = fwu_write_configuration();
+ if (retval < 0)
+ return retval;
+
+ pr_err("flash config written\n");
+
+ rmi4_data->reset_device(rmi4_data, false);
+
+ pr_err("reset after writing flash config\n");
+
+ fwu->config_area = BL_CONFIG_AREA;
+ fwu->config_data = fwu->img.bl_config.data;
+ fwu->config_size = fwu->img.bl_config.size;
+ fwu->config_block_count = fwu->config_size / fwu->block_size;
+ pr_err("bootloader config block count = %d\n", fwu->config_block_count);
+ retval = fwu_write_configuration();
+ if (retval < 0)
+ return retval;
+
+ pr_err("bootloader config written\n");
+
+ if (fwu->img.contains_utility_param) {
+ retval = fwu_write_utility_parameter();
+ if (retval < 0)
+ return retval;
+
+ pr_err("utility parameter written\n");
+ }
+
+ return 0;
+}
+
+static int fwu_do_reflash(void)
+{
+ int retval;
+ bool do_bl_update = false;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (!fwu->new_partition_table) {
+ retval = fwu_check_ui_firmware_size();
+ if (retval < 0)
+ return retval;
+
+ retval = fwu_check_ui_configuration_size();
+ if (retval < 0)
+ return retval;
+
+ if (fwu->flash_properties.has_disp_config &&
+ fwu->img.contains_disp_config) {
+ retval = fwu_check_dp_configuration_size();
+ if (retval < 0)
+ return retval;
+ }
+
+ if (fwu->has_guest_code && fwu->img.contains_guest_code) {
+ retval = fwu_check_guest_code_size();
+ if (retval < 0)
+ return retval;
+ }
+ } else if (fwu->bl_version == BL_V7) {
+ retval = fwu_check_bl_configuration_size();
+ if (retval < 0)
+ return retval;
+ }
+
+ if (!fwu->has_utility_param && fwu->img.contains_utility_param) {
+ if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8)
+ do_bl_update = true;
+ }
+
+ if (fwu->has_utility_param && !fwu->img.contains_utility_param) {
+ if (fwu->bl_version == BL_V7 || fwu->bl_version == BL_V8)
+ do_bl_update = true;
+ }
+
+ pr_err("fwu->has_utility_param = %d\n", fwu->has_utility_param);
+ pr_err("fwu->img.contains_utility_param = %d\n", fwu->img.contains_utility_param);
+ pr_err("do_bl_update = %d\n", do_bl_update);
+
+ if (!do_bl_update && fwu->incompatible_partition_tables) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Incompatible partition tables\n",
+ __func__);
+ return -EINVAL;
+ } else if (!do_bl_update && fwu->new_partition_table) {
+ if (!fwu->force_update) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Partition table mismatch\n",
+ __func__);
+ return -EINVAL;
+ }
+ }
+
+ retval = fwu_erase_all();
+ if (retval < 0)
+ return retval;
+
+ if (do_bl_update) {
+ retval = fwu_write_bl_area_v7();
+ if (retval < 0)
+ return retval;
+ pr_notice("%s: Bootloader area programmed\n", __func__);
+ } else if (fwu->bl_version == BL_V7 && fwu->new_partition_table) {
+ retval = fwu_write_partition_table_v7();
+ if (retval < 0)
+ return retval;
+ pr_notice("%s: Partition table programmed\n", __func__);
+ } else if (fwu->bl_version == BL_V8) {
+ retval = fwu_write_partition_table_v8();
+ if (retval < 0)
+ return retval;
+ pr_notice("%s: Partition table programmed\n", __func__);
+ }
+
+ retval = fwu_write_firmware();
+ if (retval < 0)
+ return retval;
+ pr_notice("%s: Firmware programmed\n", __func__);
+
+ fwu->config_area = UI_CONFIG_AREA;
+ retval = fwu_write_ui_configuration();
+ if (retval < 0)
+ return retval;
+ pr_notice("%s: Configuration programmed\n", __func__);
+
+ if (fwu->flash_properties.has_disp_config &&
+ fwu->img.contains_disp_config) {
+ retval = fwu_write_dp_configuration();
+ if (retval < 0)
+ return retval;
+ pr_notice("%s: Display configuration programmed\n", __func__);
+ }
+
+ if (fwu->has_guest_code && fwu->img.contains_guest_code) {
+ retval = fwu_write_guest_code();
+ if (retval < 0)
+ return retval;
+ pr_notice("%s: Guest code programmed\n", __func__);
+ }
+
+ return retval;
+}
+
+static int fwu_do_read_config(void)
+{
+ int retval;
+ unsigned short block_count;
+ unsigned short config_area;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ switch (fwu->config_area) {
+ case UI_CONFIG_AREA:
+ block_count = fwu->blkcount.ui_config;
+ break;
+ case DP_CONFIG_AREA:
+ if (!fwu->flash_properties.has_disp_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Display configuration not supported\n",
+ __func__);
+ return -EINVAL;
+ }
+ block_count = fwu->blkcount.dp_config;
+ break;
+ case PM_CONFIG_AREA:
+ if (!fwu->flash_properties.has_pm_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Permanent configuration not supported\n",
+ __func__);
+ return -EINVAL;
+ }
+ block_count = fwu->blkcount.pm_config;
+ break;
+ case BL_CONFIG_AREA:
+ if (!fwu->flash_properties.has_bl_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Bootloader configuration not supported\n",
+ __func__);
+ return -EINVAL;
+ }
+ block_count = fwu->blkcount.bl_config;
+ break;
+ default:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Invalid config area\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ if (block_count == 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Invalid block count\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ mutex_lock(&rmi4_data->rmi4_exp_init_mutex);
+
+ if (fwu->bl_version == BL_V5 || fwu->bl_version == BL_V6) {
+ config_area = fwu->config_area;
+ retval = fwu_enter_flash_prog();
+ fwu->config_area = config_area;
+ if (retval < 0)
+ goto exit;
+ }
+
+ fwu->config_size = fwu->block_size * block_count;
+
+ retval = fwu_allocate_read_config_buf(fwu->config_size);
+ if (retval < 0)
+ goto exit;
+
+ retval = fwu_read_f34_blocks(block_count, CMD_READ_CONFIG);
+
+exit:
+ if (fwu->bl_version == BL_V5 || fwu->bl_version == BL_V6)
+ rmi4_data->reset_device(rmi4_data, false);
+
+ mutex_unlock(&rmi4_data->rmi4_exp_init_mutex);
+
+ return retval;
+}
+
+static int fwu_do_lockdown_v7(void)
+{
+ int retval;
+ struct f34_v7_data0 status;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = fwu_enter_flash_prog();
+ if (retval < 0)
+ return retval;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fwu->f34_fd.data_base_addr + fwu->off.flash_status,
+ status.data,
+ sizeof(status.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read flash status\n",
+ __func__);
+ return retval;
+ }
+
+ if (status.device_cfg_status == 2) {
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Device already locked down\n",
+ __func__);
+ return 0;
+ }
+
+ retval = fwu_write_lockdown();
+ if (retval < 0)
+ return retval;
+
+ pr_notice("%s: Lockdown programmed\n", __func__);
+
+ return retval;
+}
+
+static int fwu_do_lockdown_v5v6(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = fwu_enter_flash_prog();
+ if (retval < 0)
+ return retval;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fwu->f34_fd.query_base_addr + fwu->off.properties,
+ fwu->flash_properties.data,
+ sizeof(fwu->flash_properties.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read flash properties\n",
+ __func__);
+ return retval;
+ }
+
+ if (fwu->flash_properties.unlocked == 0) {
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Device already locked down\n",
+ __func__);
+ return 0;
+ }
+
+ retval = fwu_write_lockdown();
+ if (retval < 0)
+ return retval;
+
+ pr_notice("%s: Lockdown programmed\n", __func__);
+
+ return retval;
+}
+
+#ifdef F51_DISCRETE_FORCE
+static int fwu_do_restore_f51_cal_data(void)
+{
+ int retval;
+ unsigned char checksum_array[4];
+ unsigned short block_count;
+ unsigned long checksum;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ block_count = fwu->blkcount.ui_config;
+ fwu->config_size = fwu->block_size * block_count;
+ fwu->config_area = UI_CONFIG_AREA;
+
+ retval = fwu_allocate_read_config_buf(fwu->config_size);
+ if (retval < 0)
+ return retval;
+
+ retval = fwu_read_f34_blocks(block_count, CMD_READ_CONFIG);
+ if (retval < 0)
+ return retval;
+
+ retval = secure_memcpy(&fwu->read_config_buf[fwu->cal_data_off],
+ fwu->cal_data_size, fwu->cal_data,
+ fwu->cal_data_buf_size, fwu->cal_data_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to restore calibration data\n",
+ __func__);
+ return retval;
+ }
+
+ calculate_checksum((unsigned short *)fwu->read_config_buf,
+ ((fwu->config_size - 4) / 2),
+ &checksum);
+
+ convert_to_little_endian(checksum_array, checksum);
+
+ fwu->read_config_buf[fwu->config_size - 4] = checksum_array[0];
+ fwu->read_config_buf[fwu->config_size - 3] = checksum_array[1];
+ fwu->read_config_buf[fwu->config_size - 2] = checksum_array[2];
+ fwu->read_config_buf[fwu->config_size - 1] = checksum_array[3];
+
+ retval = fwu_enter_flash_prog();
+ if (retval < 0)
+ return retval;
+
+ fwu->config_area = UI_CONFIG_AREA;
+ fwu->config_data = fwu->read_config_buf;
+ fwu->config_block_count = fwu->config_size / fwu->block_size;
+
+ retval = fwu_erase_configuration();
+ if (retval < 0)
+ return retval;
+
+ retval = fwu_write_configuration();
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+#endif
+
+static int fwu_start_write_guest_code(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = fwu_parse_image_info();
+ if (retval < 0)
+ return -EINVAL;
+
+ if (!fwu->has_guest_code) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Guest code not supported\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ if (!fwu->img.contains_guest_code) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: No guest code in firmware image\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ if (rmi4_data->sensor_sleep) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Sensor sleeping\n",
+ __func__);
+ return -ENODEV;
+ }
+
+ rmi4_data->stay_awake = true;
+
+ mutex_lock(&rmi4_data->rmi4_exp_init_mutex);
+
+ pr_notice("%s: Start of write guest code process\n", __func__);
+
+ retval = fwu_enter_flash_prog();
+ if (retval < 0)
+ goto exit;
+
+ retval = fwu_check_guest_code_size();
+ if (retval < 0)
+ goto exit;
+
+ retval = fwu_erase_guest_code();
+ if (retval < 0)
+ goto exit;
+
+ retval = fwu_write_guest_code();
+ if (retval < 0)
+ goto exit;
+
+ pr_notice("%s: Guest code programmed\n", __func__);
+
+exit:
+ rmi4_data->reset_device(rmi4_data, false);
+
+ pr_notice("%s: End of write guest code process\n", __func__);
+
+ mutex_unlock(&rmi4_data->rmi4_exp_init_mutex);
+
+ rmi4_data->stay_awake = false;
+
+ return retval;
+}
+
+static int fwu_start_write_config(void)
+{
+ int retval;
+ unsigned short config_area;
+ unsigned int device_fw_id;
+ unsigned int image_fw_id;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = fwu_parse_image_info();
+ if (retval < 0)
+ return -EINVAL;
+
+ switch (fwu->config_area) {
+ case UI_CONFIG_AREA:
+ device_fw_id = rmi4_data->firmware_id;
+ retval = fwu_get_image_firmware_id(&image_fw_id);
+ if (retval < 0)
+ return retval;
+ if (device_fw_id != image_fw_id) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Device and image firmware IDs don't match\n",
+ __func__);
+ return -EINVAL;
+ }
+ retval = fwu_check_ui_configuration_size();
+ if (retval < 0)
+ return retval;
+ break;
+ case DP_CONFIG_AREA:
+ if (!fwu->flash_properties.has_disp_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Display configuration not supported\n",
+ __func__);
+ return -EINVAL;
+ }
+ if (!fwu->img.contains_disp_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: No display configuration in firmware image\n",
+ __func__);
+ return -EINVAL;
+ }
+ retval = fwu_check_dp_configuration_size();
+ if (retval < 0)
+ return retval;
+ break;
+ case PM_CONFIG_AREA:
+ if (!fwu->flash_properties.has_pm_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Permanent configuration not supported\n",
+ __func__);
+ return -EINVAL;
+ }
+ if (!fwu->img.contains_perm_config) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: No permanent configuration in firmware image\n",
+ __func__);
+ return -EINVAL;
+ }
+ retval = fwu_check_pm_configuration_size();
+ if (retval < 0)
+ return retval;
+ break;
+ default:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Configuration not supported\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ if (rmi4_data->sensor_sleep) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Sensor sleeping\n",
+ __func__);
+ return -ENODEV;
+ }
+
+ rmi4_data->stay_awake = true;
+
+ mutex_lock(&rmi4_data->rmi4_exp_init_mutex);
+
+ pr_notice("%s: Start of write config process\n", __func__);
+
+ config_area = fwu->config_area;
+
+ retval = fwu_enter_flash_prog();
+ if (retval < 0)
+ goto exit;
+
+ fwu->config_area = config_area;
+
+ if (fwu->config_area != PM_CONFIG_AREA) {
+ retval = fwu_erase_configuration();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to erase config\n",
+ __func__);
+ goto exit;
+ }
+ }
+
+ switch (fwu->config_area) {
+ case UI_CONFIG_AREA:
+ retval = fwu_write_ui_configuration();
+ if (retval < 0)
+ goto exit;
+ break;
+ case DP_CONFIG_AREA:
+ retval = fwu_write_dp_configuration();
+ if (retval < 0)
+ goto exit;
+ break;
+ case PM_CONFIG_AREA:
+ retval = fwu_write_pm_configuration();
+ if (retval < 0)
+ goto exit;
+ break;
+ }
+
+ pr_notice("%s: Config written\n", __func__);
+
+exit:
+ switch (fwu->config_area) {
+ case UI_CONFIG_AREA:
+ rmi4_data->reset_device(rmi4_data, true);
+ break;
+ case DP_CONFIG_AREA:
+ case PM_CONFIG_AREA:
+ rmi4_data->reset_device(rmi4_data, false);
+ break;
+ }
+
+ pr_notice("%s: End of write config process\n", __func__);
+
+ mutex_unlock(&rmi4_data->rmi4_exp_init_mutex);
+
+ rmi4_data->stay_awake = false;
+
+ return retval;
+}
+
+static const char *fwu_get_firmware_name(struct synaptics_rmi4_data *rmi4_data)
+{
+ const char *fw_name = NULL;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+ int i, j, def = -1;
+ bool found = false;
+
+ if (bdata->tp_id_num != 0) {
+ for (i = 0; i < bdata->config_array_size; i++) {
+ found = true;
+ if (rmi4_data->chip_id != bdata->config_array[i].chip_id)
+ continue;
+ else
+ def = i;
+
+ for (j = 0; j < bdata->tp_id_num; j++) {
+ if (bdata->config_array[i].tp_ids[j] !=
+ rmi4_data->lockdown_info[bdata->tp_id_bytes[j]]) {
+ found = false;
+ break;
+ }
+ }
+
+ if (found) {
+ fw_name = bdata->config_array[i].fw_name;
+ break;
+ }
+ }
+ }
+
+ if (!fw_name && (def >= 0))
+ fw_name = bdata->config_array[def].fw_name;
+
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Choose firmware %s\n", __func__, fw_name);
+#ifdef CONFIG_SYNAPTICS_TOUCH_COUNT_DUMP
+ if (bdata->dump_click_count) {
+ rmi4_data->current_clicknum_file = kzalloc(TOUCH_COUNT_FILE_MAXSIZE, GFP_KERNEL);
+ }
+#endif
+ return fw_name;
+}
+
+static int fwu_start_reflash(void)
+{
+ int retval = 0;
+ enum flash_area flash_area;
+ bool do_rebuild = false;
+ const struct firmware *fw_entry = NULL;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+ const char *fw_name;
+
+ if (rmi4_data->sensor_sleep) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Sensor sleeping\n",
+ __func__);
+ return -ENODEV;
+ }
+
+ fw_name = fwu_get_firmware_name(rmi4_data);
+
+ if (fw_name == NULL) {
+ dev_err(rmi4_data->pdev->dev.parent, "%s: do not found fw to update\n", __func__);
+
+ return -EINVAL;
+ }
+
+
+ rmi4_data->stay_awake = true;
+
+ mutex_lock(&rmi4_data->rmi4_exp_init_mutex);
+
+ dev_info(rmi4_data->pdev->dev.parent, "%s: Start of reflash process\n", __func__);
+
+ if (fwu->image == NULL) {
+ retval = secure_memcpy(fwu->image_name, MAX_IMAGE_NAME_LEN,
+ fw_name, sizeof(FW_IMAGE_NAME),
+ strlen(fw_name));
+
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy image file name\n",
+ __func__);
+ goto exit;
+ }
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Requesting firmware image %s\n",
+ __func__, fwu->image_name);
+
+ retval = request_firmware(&fw_entry, fwu->image_name,
+ rmi4_data->pdev->dev.parent);
+ if (retval != 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Firmware image %s not available\n",
+ __func__, fwu->image_name);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Firmware image size = %ld\n",
+ __func__, fw_entry->size);
+
+ fwu->image = fw_entry->data;
+ }
+
+ retval = fwu_parse_image_info();
+ if (retval < 0)
+ goto exit;
+
+ if (fwu->blkcount.total_count != fwu->img.blkcount.total_count) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Flash size mismatch\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (fwu->bl_version != fwu->img.bl_version) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Bootloader version mismatch\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ retval = fwu_read_flash_status();
+ if (retval < 0)
+ goto exit;
+
+ if (fwu->in_bl_mode) {
+ fwu->bl_mode_device = true;
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Device in bootloader mode\n",
+ __func__);
+ } else {
+ fwu->bl_mode_device = false;
+ }
+
+ flash_area = fwu_go_nogo();
+
+ if (flash_area != NONE) {
+ retval = fwu_enter_flash_prog();
+ if (retval < 0) {
+ rmi4_data->reset_device(rmi4_data, false);
+ goto exit;
+ }
+ }
+
+#ifdef F51_DISCRETE_FORCE
+ if (flash_area != NONE && !fwu->bl_mode_device) {
+ fwu->config_size = fwu->block_size * fwu->blkcount.ui_config;
+ fwu->config_area = UI_CONFIG_AREA;
+
+ retval = fwu_allocate_read_config_buf(fwu->config_size);
+ if (retval < 0) {
+ rmi4_data->reset_device(rmi4_data, false);
+ goto exit;
+ }
+
+ retval = fwu_read_f34_blocks(fwu->blkcount.ui_config,
+ CMD_READ_CONFIG);
+ if (retval < 0) {
+ rmi4_data->reset_device(rmi4_data, false);
+ goto exit;
+ }
+
+ retval = secure_memcpy(fwu->cal_data, fwu->cal_data_buf_size,
+ &fwu->read_config_buf[fwu->cal_data_off],
+ fwu->cal_data_size, fwu->cal_data_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to save calibration data\n",
+ __func__);
+ rmi4_data->reset_device(rmi4_data, false);
+ goto exit;
+ }
+ }
+#endif
+
+ switch (flash_area) {
+ case UI_FIRMWARE:
+ do_rebuild = true;
+ retval = fwu_do_reflash();
+#ifdef F51_DISCRETE_FORCE
+ if (retval < 0)
+ break;
+
+ if (fwu->has_utility_param || fwu->img.contains_utility_param)
+ break;
+
+ rmi4_data->reset_device(rmi4_data, false);
+
+ if (fwu->bl_mode_device || fwu->in_bl_mode) {
+ dev_info(rmi4_data->pdev->dev.parent,
+ "%s: Device in bootloader mode, skipping calibration data restoration\n",
+ __func__);
+ break;
+ }
+
+ retval = fwu_do_restore_f51_cal_data();
+#endif
+ break;
+ case UI_CONFIG:
+ do_rebuild = true;
+ retval = fwu_check_ui_configuration_size();
+ if (retval < 0)
+ break;
+ fwu->config_area = UI_CONFIG_AREA;
+ retval = fwu_erase_configuration();
+ if (retval < 0)
+ break;
+ retval = fwu_write_ui_configuration();
+#ifdef F51_DISCRETE_FORCE
+ if (retval < 0)
+ break;
+
+ if (fwu->has_utility_param)
+ break;
+
+ retval = fwu_do_restore_f51_cal_data();
+#endif
+ break;
+ case NONE:
+ default:
+ break;
+ }
+
+ if (retval < 0) {
+ do_rebuild = false;
+ rmi4_data->reset_device(rmi4_data, false);
+ pr_err("%s: fwu->in_ub_mode = %d\n", __func__, fwu->in_ub_mode);
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do reflash\n",
+ __func__);
+ goto exit;
+ }
+
+ if (fwu->do_lockdown && (fwu->img.lockdown.data != NULL)) {
+ switch (fwu->bl_version) {
+ case BL_V5:
+ case BL_V6:
+ retval = fwu_do_lockdown_v5v6();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do lockdown\n",
+ __func__);
+ }
+ rmi4_data->reset_device(rmi4_data, false);
+ break;
+ case BL_V7:
+ case BL_V8:
+ retval = fwu_do_lockdown_v7();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do lockdown\n",
+ __func__);
+ }
+ rmi4_data->reset_device(rmi4_data, false);
+ break;
+ default:
+ break;
+ }
+ }
+
+exit:
+ if (fw_entry)
+ release_firmware(fw_entry);
+
+ if (do_rebuild)
+ rmi4_data->reset_device(rmi4_data, true);
+
+ pr_notice("%s: End of reflash process\n", __func__);
+
+ mutex_unlock(&rmi4_data->rmi4_exp_init_mutex);
+
+ rmi4_data->stay_awake = false;
+
+ return retval;
+}
+
+static int fwu_recovery_check_status(void)
+{
+ int retval;
+ unsigned char data_base;
+ unsigned char status;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f35_fd.data_base_addr;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_base + F35_ERROR_CODE_OFFSET,
+ &status,
+ 1);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read status\n",
+ __func__);
+ return retval;
+ }
+
+ status = status & MASK_5BIT;
+
+ if (status != 0x00) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Recovery mode status = %d\n",
+ __func__, status);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int fwu_recovery_erase_completion(void)
+{
+ int retval;
+ unsigned char data_base;
+ unsigned char command;
+ unsigned char status;
+ unsigned int timeout = F35_ERASE_ALL_WAIT_MS / 20;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ data_base = fwu->f35_fd.data_base_addr;
+
+ do {
+ command = 0x01;
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ fwu->f35_fd.cmd_base_addr,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to issue command\n",
+ __func__);
+ return retval;
+ }
+
+ do {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ fwu->f35_fd.cmd_base_addr,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read command status\n",
+ __func__);
+ return retval;
+ }
+
+ if ((command & 0x01) == 0x00)
+ break;
+
+ msleep(20);
+ timeout--;
+ } while (timeout > 0);
+
+ if (timeout == 0)
+ goto exit;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ data_base + F35_FLASH_STATUS_OFFSET,
+ &status,
+ sizeof(status));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read flash status\n",
+ __func__);
+ return retval;
+ }
+
+ if ((status & 0x01) == 0x00)
+ break;
+
+ msleep(20);
+ timeout--;
+ } while (timeout > 0);
+
+exit:
+ if (timeout == 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Timed out waiting for flash erase completion\n",
+ __func__);
+ return -ETIMEDOUT;
+ }
+
+ return 0;
+}
+
+static int fwu_recovery_erase_all(void)
+{
+ int retval;
+ unsigned char ctrl_base;
+ unsigned char command = CMD_F35_ERASE_ALL;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ ctrl_base = fwu->f35_fd.ctrl_base_addr;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ ctrl_base + F35_CHUNK_COMMAND_OFFSET,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to issue erase all command\n",
+ __func__);
+ return retval;
+ }
+
+ if (fwu->f35_fd.cmd_base_addr) {
+ retval = fwu_recovery_erase_completion();
+ if (retval < 0)
+ return retval;
+ } else {
+ msleep(F35_ERASE_ALL_WAIT_MS);
+ }
+
+ retval = fwu_recovery_check_status();
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+static int fwu_recovery_write_chunk(void)
+{
+ int retval;
+ unsigned char ctrl_base;
+ unsigned char chunk_number[] = {0, 0};
+ unsigned char chunk_spare;
+ unsigned char chunk_size;
+ unsigned char buf[F35_CHUNK_SIZE + 1];
+ unsigned short chunk;
+ unsigned short chunk_total;
+ unsigned short bytes_written = 0;
+ unsigned char *chunk_ptr = (unsigned char *)fwu->image;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ ctrl_base = fwu->f35_fd.ctrl_base_addr;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ ctrl_base + F35_CHUNK_NUM_LSB_OFFSET,
+ chunk_number,
+ sizeof(chunk_number));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write chunk number\n",
+ __func__);
+ return retval;
+ }
+
+ buf[sizeof(buf) - 1] = CMD_F35_WRITE_CHUNK;
+
+ chunk_total = fwu->image_size / F35_CHUNK_SIZE;
+ chunk_spare = fwu->image_size % F35_CHUNK_SIZE;
+ if (chunk_spare)
+ chunk_total++;
+
+ for (chunk = 0; chunk < chunk_total; chunk++) {
+ if (chunk_spare && chunk == chunk_total - 1)
+ chunk_size = chunk_spare;
+ else
+ chunk_size = F35_CHUNK_SIZE;
+
+ memset(buf, 0x00, F35_CHUNK_SIZE);
+ secure_memcpy(buf, sizeof(buf), chunk_ptr,
+ fwu->image_size - bytes_written,
+ chunk_size);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ ctrl_base + F35_CHUNK_DATA_OFFSET,
+ buf,
+ sizeof(buf));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write chunk data (chunk %d)\n",
+ __func__, chunk);
+ return retval;
+ }
+ chunk_ptr += chunk_size;
+ bytes_written += chunk_size;
+ }
+
+ retval = fwu_recovery_check_status();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write chunk data\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static int fwu_recovery_reset(void)
+{
+ int retval;
+ unsigned char ctrl_base;
+ unsigned char command = CMD_F35_RESET;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ ctrl_base = fwu->f35_fd.ctrl_base_addr;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ ctrl_base + F35_CHUNK_COMMAND_OFFSET,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to issue reset command\n",
+ __func__);
+ return retval;
+ }
+
+ msleep(F35_RESET_WAIT_MS);
+
+ return 0;
+}
+
+static int fwu_start_recovery(void)
+{
+ int retval;
+ const struct firmware *fw_entry = NULL;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (rmi4_data->sensor_sleep) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Sensor sleeping\n",
+ __func__);
+ return -ENODEV;
+ }
+
+ rmi4_data->stay_awake = true;
+
+ mutex_lock(&rmi4_data->rmi4_exp_init_mutex);
+
+ pr_notice("%s: Start of recovery process\n", __func__);
+
+ if (fwu->image == NULL) {
+ retval = secure_memcpy(fwu->image_name, MAX_IMAGE_NAME_LEN,
+ FW_IHEX_NAME, sizeof(FW_IHEX_NAME),
+ sizeof(FW_IHEX_NAME));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy ihex file name\n",
+ __func__);
+ goto exit;
+ }
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Requesting firmware ihex %s\n",
+ __func__, fwu->image_name);
+
+ retval = request_firmware(&fw_entry, fwu->image_name,
+ rmi4_data->pdev->dev.parent);
+ if (retval != 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Firmware ihex %s not available\n",
+ __func__, fwu->image_name);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Firmware image size = %d\n",
+ __func__, (unsigned int)fw_entry->size);
+
+ fwu->image = fw_entry->data;
+ fwu->image_size = fw_entry->size;
+ }
+
+ retval = rmi4_data->irq_enable(rmi4_data, false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to disable interrupt\n",
+ __func__);
+ goto exit;
+ }
+
+ retval = fwu_recovery_erase_all();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do erase all in recovery mode\n",
+ __func__);
+ goto exit;
+ }
+
+ pr_notice("%s: External flash erased\n", __func__);
+
+ retval = fwu_recovery_write_chunk();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write chunk data in recovery mode\n",
+ __func__);
+ goto exit;
+ }
+
+ pr_notice("%s: Chunk data programmed\n", __func__);
+
+ retval = fwu_recovery_reset();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to reset device in recovery mode\n",
+ __func__);
+ goto exit;
+ }
+
+ pr_notice("%s: Recovery mode reset issued\n", __func__);
+
+ rmi4_data->reset_device(rmi4_data, true);
+
+ retval = 0;
+
+exit:
+ if (fw_entry)
+ release_firmware(fw_entry);
+
+ pr_notice("%s: End of recovery process\n", __func__);
+
+ mutex_unlock(&rmi4_data->rmi4_exp_init_mutex);
+
+ rmi4_data->stay_awake = false;
+
+ return retval;
+}
+
+int synaptics_fw_updater_force(const unsigned char *fw_data)
+{
+ int retval;
+
+ if (!fwu)
+ return -ENODEV;
+
+ if (!fwu->initialized)
+ return -ENODEV;
+
+ if (fwu->in_ub_mode)
+ return -ENODEV;
+
+ fwu->rmi4_data->fw_updating = true;
+ fwu->image = fw_data;
+
+ retval = fwu_start_reflash();
+
+ fwu->image = NULL;
+ fwu->rmi4_data->fw_updating = false;
+
+ return retval;
+}
+EXPORT_SYMBOL(synaptics_fw_updater_force);
+
+#ifdef DO_STARTUP_FW_UPDATE
+static void fwu_startup_fw_update_work(struct work_struct *work)
+{
+ static unsigned char do_once = 1;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+#ifdef WAIT_FOR_FB_READY
+ unsigned int timeout;
+#endif
+ if (!do_once)
+ return;
+ do_once = 0;
+#ifdef WAIT_FOR_FB_READY
+ timeout = FB_READY_TIMEOUT_S * 1000 / FB_READY_WAIT_MS + 1;
+
+ while (!rmi4_data->fb_ready) {
+ msleep(FB_READY_WAIT_MS);
+ timeout--;
+ if (timeout == 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Timed out waiting for FB ready\n",
+ __func__);
+ return;
+ }
+ }
+#endif
+
+ synaptics_fw_updater_force(NULL);
+
+ if (rmi4_data->chip_is_tddi)
+ firmware_force_update(rmi4_data);
+
+ return;
+}
+#endif
+
+static ssize_t fwu_sysfs_show_image(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (count < fwu->config_size) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Not enough space (%ld bytes) in buffer\n",
+ __func__, count);
+ return -EINVAL;
+ }
+
+ retval = secure_memcpy(buf, count, fwu->read_config_buf,
+ fwu->read_config_buf_size, fwu->config_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy config data\n",
+ __func__);
+ return retval;
+ }
+
+ return fwu->config_size;
+}
+
+static ssize_t fwu_sysfs_store_image(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = secure_memcpy(&fwu->ext_data_source[fwu->data_pos],
+ fwu->image_size - fwu->data_pos, buf, count, count);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy image data\n",
+ __func__);
+ return retval;
+ }
+
+ fwu->data_pos += count;
+
+ return count;
+}
+
+static ssize_t fwu_sysfs_do_recovery_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1) {
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ retval = fwu_scan_pdt();
+ if (retval < 0)
+ goto exit;
+
+ pr_err("%s: fwu->in_ub_mode = %d\n", __func__, fwu->in_ub_mode);
+
+ if (!fwu->in_ub_mode) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Not in microbootloader mode\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (!fwu->ext_data_source)
+ return -EINVAL;
+ else
+ fwu->image = fwu->ext_data_source;
+
+ retval = fwu_start_recovery();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do recovery\n",
+ __func__);
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ kfree(fwu->ext_data_source);
+ fwu->ext_data_source = NULL;
+ fwu->image = NULL;
+ return retval;
+}
+
+static ssize_t fwu_sysfs_do_reflash_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1) {
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (fwu->in_ub_mode) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: In microbootloader mode\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (!fwu->ext_data_source)
+ return -EINVAL;
+ else
+ fwu->image = fwu->ext_data_source;
+
+ if (input & LOCKDOWN) {
+ fwu->do_lockdown = true;
+ input &= ~LOCKDOWN;
+ }
+
+ if ((input != NORMAL) && (input != FORCE)) {
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (input == FORCE)
+ fwu->force_update = true;
+
+ retval = synaptics_fw_updater_force(fwu->image);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do reflash\n",
+ __func__);
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ kfree(fwu->ext_data_source);
+ fwu->ext_data_source = NULL;
+ fwu->image = NULL;
+ fwu->force_update = FORCE_UPDATE;
+ fwu->do_lockdown = DO_LOCKDOWN;
+ return retval;
+}
+
+static ssize_t fwu_sysfs_write_config_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1) {
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (input != 1) {
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (fwu->in_ub_mode) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: In microbootloader mode\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (!fwu->ext_data_source)
+ return -EINVAL;
+ else
+ fwu->image = fwu->ext_data_source;
+
+ retval = fwu_start_write_config();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write config\n",
+ __func__);
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ kfree(fwu->ext_data_source);
+ fwu->ext_data_source = NULL;
+ fwu->image = NULL;
+ return retval;
+}
+
+static ssize_t fwu_sysfs_read_config_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input != 1)
+ return -EINVAL;
+
+ if (fwu->in_ub_mode) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: In microbootloader mode\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ retval = fwu_do_read_config();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read config\n",
+ __func__);
+ return retval;
+ }
+
+ return count;
+}
+
+static ssize_t fwu_sysfs_config_area_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long config_area;
+
+ retval = sstrtoul(buf, 10, &config_area);
+ if (retval)
+ return retval;
+
+ fwu->config_area = config_area;
+
+ return count;
+}
+
+static ssize_t fwu_sysfs_image_name_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = secure_memcpy(fwu->image_name, MAX_IMAGE_NAME_LEN,
+ buf, count, count);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy image file name\n",
+ __func__);
+ return retval;
+ }
+
+ return count;
+}
+
+static ssize_t fwu_sysfs_image_size_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long size;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &size);
+ if (retval)
+ return retval;
+
+ fwu->image_size = size;
+ fwu->data_pos = 0;
+
+ kfree(fwu->ext_data_source);
+ fwu->ext_data_source = kzalloc(fwu->image_size, GFP_KERNEL);
+ if (!fwu->ext_data_source) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for image data\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ return count;
+}
+
+static ssize_t fwu_sysfs_block_size_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", fwu->block_size);
+}
+
+static ssize_t fwu_sysfs_firmware_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", fwu->blkcount.ui_firmware);
+}
+
+static ssize_t fwu_sysfs_configuration_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", fwu->blkcount.ui_config);
+}
+
+static ssize_t fwu_sysfs_disp_config_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", fwu->blkcount.dp_config);
+}
+
+static ssize_t fwu_sysfs_perm_config_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", fwu->blkcount.pm_config);
+}
+
+static ssize_t fwu_sysfs_bl_config_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", fwu->blkcount.bl_config);
+}
+
+static ssize_t fwu_sysfs_guest_code_block_count_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", fwu->blkcount.guest_code);
+}
+
+static ssize_t fwu_sysfs_write_guest_code_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1) {
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (input != 1) {
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (fwu->in_ub_mode) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: In microbootloader mode\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (!fwu->ext_data_source)
+ return -EINVAL;
+ else
+ fwu->image = fwu->ext_data_source;
+
+ retval = fwu_start_write_guest_code();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write guest code\n",
+ __func__);
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ kfree(fwu->ext_data_source);
+ fwu->ext_data_source = NULL;
+ fwu->image = NULL;
+ return retval;
+}
+
+static void synaptics_rmi4_fwu_attn(struct synaptics_rmi4_data *rmi4_data,
+ unsigned char intr_mask)
+{
+ if (!fwu)
+ return;
+
+ if (fwu->intr_mask & intr_mask)
+ fwu_read_flash_status();
+
+ return;
+}
+
+static void firmware_force_update(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ const struct firmware *fw_entry = NULL;
+ const struct synaptics_dsx_board_data *bdata = rmi4_data->hw_if->board_data;
+ if (!fwu->in_ub_mode)
+ return;
+
+ retval = request_firmware(&fw_entry, bdata->backup_fw_name,
+ rmi4_data->pdev->dev.parent);
+ if (retval != 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Firmware image %s not available\n",
+ __func__, fwu->image_name);
+ return;
+ }
+
+ fwu->image = fw_entry->data;
+ fwu->image_size = fw_entry->size;
+
+ retval = fwu_start_recovery();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do recovery\n",
+ __func__);
+ release_firmware(fw_entry);
+ return;
+ }
+
+ release_firmware(fw_entry);
+
+ return;
+}
+
+static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned char attr_count;
+ struct pdt_properties pdt_props;
+
+ if (fwu) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Handle already exists\n",
+ __func__);
+ return 0;
+ }
+
+ fwu = kzalloc(sizeof(*fwu), GFP_KERNEL);
+ if (!fwu) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for fwu\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ fwu->image_name = kzalloc(MAX_IMAGE_NAME_LEN, GFP_KERNEL);
+ if (!fwu->image_name) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for image name\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit_free_fwu;
+ }
+
+ fwu->rmi4_data = rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ PDT_PROPS,
+ pdt_props.data,
+ sizeof(pdt_props.data));
+ if (retval < 0) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read PDT properties, assuming 0x00\n",
+ __func__);
+ } else if (pdt_props.has_bsr) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Reflash for LTS not currently supported\n",
+ __func__);
+ retval = -ENODEV;
+ goto exit_free_mem;
+ }
+
+ retval = fwu_scan_pdt();
+ if (retval < 0)
+ goto exit_free_mem;
+
+ pr_err("%s: fwu->in_ub_mode = %d\n", __func__, fwu->in_ub_mode);
+
+ if (!fwu->in_ub_mode) {
+ retval = fwu_read_f34_queries();
+ if (retval < 0)
+ goto exit_free_mem;
+
+ retval = fwu_get_device_config_id();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read device config ID\n",
+ __func__);
+ goto exit_free_mem;
+ }
+ }
+
+ fwu->force_update = FORCE_UPDATE;
+ fwu->do_lockdown = DO_LOCKDOWN;
+ fwu->initialized = true;
+
+ retval = sysfs_create_bin_file(&rmi4_data->input_dev->dev.kobj,
+ &dev_attr_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs bin file\n",
+ __func__);
+ goto exit_free_mem;
+ }
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ retval = -ENODEV;
+ goto exit_remove_attrs;
+ }
+ }
+
+#ifdef DO_STARTUP_FW_UPDATE
+ fwu->fwu_workqueue = create_singlethread_workqueue("fwu_workqueue");
+ INIT_WORK(&fwu->fwu_work, fwu_startup_fw_update_work);
+ queue_work(fwu->fwu_workqueue,
+ &fwu->fwu_work);
+#endif
+
+#ifdef F51_DISCRETE_FORCE
+ fwu_read_flash_status();
+ if (!fwu->in_bl_mode) {
+ retval = fwu_f51_force_data_init();
+ if (retval < 0)
+ goto exit_remove_attrs;
+ }
+#endif
+
+ return 0;
+
+exit_remove_attrs:
+ for (attr_count--; attr_count >= 0; attr_count--) {
+ sysfs_remove_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ }
+
+ sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data);
+
+exit_free_mem:
+ kfree(fwu->image_name);
+
+exit_free_fwu:
+ kfree(fwu);
+ fwu = NULL;
+
+exit:
+ return retval;
+}
+
+static void synaptics_rmi4_fwu_remove(struct synaptics_rmi4_data *rmi4_data)
+{
+ unsigned char attr_count;
+
+ if (!fwu)
+ goto exit;
+
+#ifdef DO_STARTUP_FW_UPDATE
+ cancel_work_sync(&fwu->fwu_work);
+ flush_workqueue(fwu->fwu_workqueue);
+ destroy_workqueue(fwu->fwu_workqueue);
+#endif
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ sysfs_remove_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ }
+
+ sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data);
+
+#ifdef F51_DISCRETE_FORCE
+ kfree(fwu->cal_data);
+#endif
+ kfree(fwu->read_config_buf);
+ kfree(fwu->image_name);
+ kfree(fwu);
+ fwu = NULL;
+
+exit:
+ complete(&fwu_remove_complete_force);
+
+ return;
+}
+
+static void synaptics_rmi4_fwu_reset(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+
+ if (!fwu) {
+ synaptics_rmi4_fwu_init(rmi4_data);
+ return;
+ }
+
+ retval = fwu_scan_pdt();
+ if (retval < 0)
+ return;
+
+ pr_err("%s: fwu->in_ub_mode = %d\n", __func__, fwu->in_ub_mode);
+
+ if (!fwu->in_ub_mode)
+ fwu_read_f34_queries();
+
+#ifdef F51_DISCRETE_FORCE
+ fwu_read_flash_status();
+ if (!fwu->in_bl_mode)
+ fwu_f51_force_data_init();
+#endif
+
+ return;
+}
+
+#if 0
+static void synaptics_rmi4_fwu_resume(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+
+ if (!fwu)
+ return;
+
+ retval = fwu_scan_pdt();
+ if (retval < 0)
+ return;
+
+ pr_err("%s: fwu->in_ub_mode = %d\n", __func__, fwu->in_ub_mode);
+
+ if (!fwu->in_ub_mode)
+ fwu_read_f34_queries();
+
+ return;
+}
+#endif
+
+static struct synaptics_rmi4_exp_fn fwu_module = {
+ .fn_type = RMI_FW_UPDATER,
+ .init = synaptics_rmi4_fwu_init,
+ .remove = synaptics_rmi4_fwu_remove,
+ .reset = synaptics_rmi4_fwu_reset,
+ .reinit = NULL,
+ .early_suspend = NULL,
+ .suspend = NULL,
+ .resume = NULL,
+ .late_resume = NULL,
+ .attn = synaptics_rmi4_fwu_attn,
+};
+
+static int __init rmi4_fw_update_module_init(void)
+{
+ synaptics_rmi4_new_function_force(&fwu_module, true);
+
+ return 0;
+}
+
+static void __exit rmi4_fw_update_module_exit(void)
+{
+ synaptics_rmi4_new_function_force(&fwu_module, false);
+
+ wait_for_completion(&fwu_remove_complete_force);
+
+ return;
+}
+
+module_init(rmi4_fw_update_module_init);
+module_exit(rmi4_fw_update_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX FW Update Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_gesture.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_gesture.c
new file mode 100644
index 000000000000..d37f110fd13c
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_gesture.c
@@ -0,0 +1,2305 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+
+#define GESTURE_PHYS_NAME "synaptics_dsx/gesture"
+
+#define TUNING_SYSFS_DIR_NAME "tuning"
+
+#define STORE_GESTURES
+#ifdef STORE_GESTURES
+#define GESTURES_TO_STORE 10
+#endif
+
+#define CTRL23_FINGER_REPORT_ENABLE_BIT 0
+#define CTRL27_UDG_ENABLE_BIT 4
+#define WAKEUP_GESTURE_MODE 0x02
+
+static ssize_t udg_sysfs_engine_enable_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_detection_enable_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_detection_score_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_detection_index_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_registration_enable_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_registration_begin_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_registration_status_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_template_size_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_template_max_index_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_template_detection_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_template_index_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_template_valid_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_template_valid_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_template_clear_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_trace_size_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_template_data_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t udg_sysfs_template_data_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t udg_sysfs_trace_data_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t udg_sysfs_template_displacement_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_template_displacement_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_rotation_invariance_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_rotation_invariance_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_scale_invariance_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_scale_invariance_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_threshold_factor_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_threshold_factor_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_match_metric_threshold_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_match_metric_threshold_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t udg_sysfs_max_inter_stroke_time_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t udg_sysfs_max_inter_stroke_time_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static int udg_read_tuning_params(void);
+
+static int udg_write_tuning_params(void);
+
+static int udg_detection_enable(bool enable);
+
+static int udg_engine_enable(bool enable);
+
+static int udg_set_index(unsigned char index);
+
+#ifdef STORE_GESTURES
+static int udg_read_valid_data(void);
+static int udg_write_valid_data(void);
+static int udg_read_template_data(unsigned char index);
+static int udg_write_template_data(void);
+#endif
+
+enum gesture_type {
+ DETECTION = 0x0f,
+ REGISTRATION = 0x10,
+};
+
+struct udg_tuning {
+ union {
+ struct {
+ unsigned char maximum_number_of_templates;
+ unsigned char template_size;
+ unsigned char template_disp_lsb;
+ unsigned char template_disp_msb;
+ unsigned char rotation_inv_lsb;
+ unsigned char rotation_inv_msb;
+ unsigned char scale_inv_lsb;
+ unsigned char scale_inv_msb;
+ unsigned char thres_factor_lsb;
+ unsigned char thres_factor_msb;
+ unsigned char metric_thres_lsb;
+ unsigned char metric_thres_msb;
+ unsigned char inter_stroke_lsb;
+ unsigned char inter_stroke_msb;
+ } __packed;
+ unsigned char data[14];
+ };
+};
+
+struct udg_addr {
+ unsigned short data_4;
+ unsigned short ctrl_18;
+ unsigned short ctrl_20;
+ unsigned short ctrl_23;
+ unsigned short ctrl_27;
+ unsigned short ctrl_41;
+ unsigned short trace_x;
+ unsigned short trace_y;
+ unsigned short trace_segment;
+ unsigned short template_helper;
+ unsigned short template_data;
+ unsigned short template_flags;
+};
+
+struct synaptics_rmi4_f12_query_0 {
+ union {
+ struct {
+ struct {
+ unsigned char has_register_descriptors:1;
+ unsigned char has_closed_cover:1;
+ unsigned char has_fast_glove_detect:1;
+ unsigned char has_dribble:1;
+ unsigned char has_4p4_jitter_filter_strength:1;
+ unsigned char f12_query0_s0_b5__7:3;
+ } __packed;
+ struct {
+ unsigned char max_num_templates:4;
+ unsigned char f12_query0_s1_b4__7:4;
+ unsigned char template_size_lsb;
+ unsigned char template_size_msb;
+ } __packed;
+ };
+ unsigned char data[4];
+ };
+};
+
+struct synaptics_rmi4_f12_query_5 {
+ union {
+ struct {
+ unsigned char size_of_query6;
+ struct {
+ unsigned char ctrl0_is_present:1;
+ unsigned char ctrl1_is_present:1;
+ unsigned char ctrl2_is_present:1;
+ unsigned char ctrl3_is_present:1;
+ unsigned char ctrl4_is_present:1;
+ unsigned char ctrl5_is_present:1;
+ unsigned char ctrl6_is_present:1;
+ unsigned char ctrl7_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl8_is_present:1;
+ unsigned char ctrl9_is_present:1;
+ unsigned char ctrl10_is_present:1;
+ unsigned char ctrl11_is_present:1;
+ unsigned char ctrl12_is_present:1;
+ unsigned char ctrl13_is_present:1;
+ unsigned char ctrl14_is_present:1;
+ unsigned char ctrl15_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl16_is_present:1;
+ unsigned char ctrl17_is_present:1;
+ unsigned char ctrl18_is_present:1;
+ unsigned char ctrl19_is_present:1;
+ unsigned char ctrl20_is_present:1;
+ unsigned char ctrl21_is_present:1;
+ unsigned char ctrl22_is_present:1;
+ unsigned char ctrl23_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl24_is_present:1;
+ unsigned char ctrl25_is_present:1;
+ unsigned char ctrl26_is_present:1;
+ unsigned char ctrl27_is_present:1;
+ unsigned char ctrl28_is_present:1;
+ unsigned char ctrl29_is_present:1;
+ unsigned char ctrl30_is_present:1;
+ unsigned char ctrl31_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl32_is_present:1;
+ unsigned char ctrl33_is_present:1;
+ unsigned char ctrl34_is_present:1;
+ unsigned char ctrl35_is_present:1;
+ unsigned char ctrl36_is_present:1;
+ unsigned char ctrl37_is_present:1;
+ unsigned char ctrl38_is_present:1;
+ unsigned char ctrl39_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl40_is_present:1;
+ unsigned char ctrl41_is_present:1;
+ unsigned char ctrl42_is_present:1;
+ unsigned char ctrl43_is_present:1;
+ unsigned char ctrl44_is_present:1;
+ unsigned char ctrl45_is_present:1;
+ unsigned char ctrl46_is_present:1;
+ unsigned char ctrl47_is_present:1;
+ } __packed;
+ };
+ unsigned char data[7];
+ };
+};
+
+struct synaptics_rmi4_f12_query_8 {
+ union {
+ struct {
+ unsigned char size_of_query9;
+ struct {
+ unsigned char data0_is_present:1;
+ unsigned char data1_is_present:1;
+ unsigned char data2_is_present:1;
+ unsigned char data3_is_present:1;
+ unsigned char data4_is_present:1;
+ unsigned char data5_is_present:1;
+ unsigned char data6_is_present:1;
+ unsigned char data7_is_present:1;
+ } __packed;
+ struct {
+ unsigned char data8_is_present:1;
+ unsigned char data9_is_present:1;
+ unsigned char data10_is_present:1;
+ unsigned char data11_is_present:1;
+ unsigned char data12_is_present:1;
+ unsigned char data13_is_present:1;
+ unsigned char data14_is_present:1;
+ unsigned char data15_is_present:1;
+ } __packed;
+ struct {
+ unsigned char data16_is_present:1;
+ unsigned char data17_is_present:1;
+ unsigned char data18_is_present:1;
+ unsigned char data19_is_present:1;
+ unsigned char data20_is_present:1;
+ unsigned char data21_is_present:1;
+ unsigned char data22_is_present:1;
+ unsigned char data23_is_present:1;
+ } __packed;
+ };
+ unsigned char data[4];
+ };
+};
+
+struct synaptics_rmi4_f12_control_41 {
+ union {
+ struct {
+ unsigned char enable_registration:1;
+ unsigned char template_index:4;
+ unsigned char begin:1;
+ unsigned char f12_ctrl41_b6__7:2;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct synaptics_rmi4_udg_handle {
+ atomic_t attn_event;
+ unsigned char intr_mask;
+ unsigned char report_flags;
+ unsigned char object_type_enable1;
+ unsigned char object_type_enable2;
+ unsigned char trace_size;
+ unsigned char template_index;
+ unsigned char max_num_templates;
+ unsigned char detection_score;
+ unsigned char detection_index;
+ unsigned char detection_status;
+ unsigned char registration_status;
+ unsigned char *ctrl_buf;
+ unsigned char *trace_data_buf;
+ unsigned char *template_data_buf;
+#ifdef STORE_GESTURES
+ unsigned char gestures_to_store;
+ unsigned char *storage_buf;
+ unsigned char valid_buf[2];
+#endif
+ unsigned short trace_data_buf_size;
+ unsigned short template_size;
+ unsigned short template_data_size;
+ unsigned short query_base_addr;
+ unsigned short control_base_addr;
+ unsigned short data_base_addr;
+ unsigned short command_base_addr;
+ unsigned short ctrl_18_sub10_off;
+ unsigned short ctrl_20_sub1_off;
+ unsigned short ctrl_23_sub3_off;
+ unsigned short ctrl_27_sub5_off;
+ struct input_dev *udg_dev;
+ struct kobject *tuning_dir;
+ struct udg_addr addr;
+ struct udg_tuning tuning;
+ struct synaptics_rmi4_data *rmi4_data;
+};
+
+static struct device_attribute attrs[] = {
+ __ATTR(engine_enable, S_IWUSR,
+ synaptics_rmi4_show_error,
+ udg_sysfs_engine_enable_store),
+ __ATTR(detection_enable, S_IWUSR,
+ synaptics_rmi4_show_error,
+ udg_sysfs_detection_enable_store),
+ __ATTR(detection_score, S_IRUGO,
+ udg_sysfs_detection_score_show,
+ synaptics_rmi4_store_error),
+ __ATTR(detection_index, S_IRUGO,
+ udg_sysfs_detection_index_show,
+ synaptics_rmi4_store_error),
+ __ATTR(registration_enable, S_IWUSR,
+ synaptics_rmi4_show_error,
+ udg_sysfs_registration_enable_store),
+ __ATTR(registration_begin, S_IWUSR,
+ synaptics_rmi4_show_error,
+ udg_sysfs_registration_begin_store),
+ __ATTR(registration_status, S_IRUGO,
+ udg_sysfs_registration_status_show,
+ synaptics_rmi4_store_error),
+ __ATTR(template_size, S_IRUGO,
+ udg_sysfs_template_size_show,
+ synaptics_rmi4_store_error),
+ __ATTR(template_max_index, S_IRUGO,
+ udg_sysfs_template_max_index_show,
+ synaptics_rmi4_store_error),
+ __ATTR(template_detection, S_IRUGO,
+ udg_sysfs_template_detection_show,
+ synaptics_rmi4_store_error),
+ __ATTR(template_index, S_IWUSR,
+ synaptics_rmi4_show_error,
+ udg_sysfs_template_index_store),
+ __ATTR(template_valid, (S_IRUGO | S_IWUSR),
+ udg_sysfs_template_valid_show,
+ udg_sysfs_template_valid_store),
+ __ATTR(template_clear, S_IWUSR,
+ synaptics_rmi4_show_error,
+ udg_sysfs_template_clear_store),
+ __ATTR(trace_size, S_IRUGO,
+ udg_sysfs_trace_size_show,
+ synaptics_rmi4_store_error),
+};
+
+static struct bin_attribute template_data = {
+ .attr = {
+ .name = "template_data",
+ .mode = (S_IRUGO | S_IWUSR),
+ },
+ .size = 0,
+ .read = udg_sysfs_template_data_show,
+ .write = udg_sysfs_template_data_store,
+};
+
+static struct bin_attribute trace_data = {
+ .attr = {
+ .name = "trace_data",
+ .mode = S_IRUGO,
+ },
+ .size = 0,
+ .read = udg_sysfs_trace_data_show,
+ .write = NULL,
+};
+
+static struct device_attribute params[] = {
+ __ATTR(template_displacement, (S_IRUGO | S_IWUSR),
+ udg_sysfs_template_displacement_show,
+ udg_sysfs_template_displacement_store),
+ __ATTR(rotation_invariance, (S_IRUGO | S_IWUSR),
+ udg_sysfs_rotation_invariance_show,
+ udg_sysfs_rotation_invariance_store),
+ __ATTR(scale_invariance, (S_IRUGO | S_IWUSR),
+ udg_sysfs_scale_invariance_show,
+ udg_sysfs_scale_invariance_store),
+ __ATTR(threshold_factor, (S_IRUGO | S_IWUSR),
+ udg_sysfs_threshold_factor_show,
+ udg_sysfs_threshold_factor_store),
+ __ATTR(match_metric_threshold, (S_IRUGO | S_IWUSR),
+ udg_sysfs_match_metric_threshold_show,
+ udg_sysfs_match_metric_threshold_store),
+ __ATTR(max_inter_stroke_time, (S_IRUGO | S_IWUSR),
+ udg_sysfs_max_inter_stroke_time_show,
+ udg_sysfs_max_inter_stroke_time_store),
+};
+
+static struct synaptics_rmi4_udg_handle *udg;
+
+static unsigned char ctrl_18_sub_size[] = {10, 10, 10, 2, 3, 4, 3, 3, 1, 1};
+static unsigned char ctrl_20_sub_size[] = {2};
+static unsigned char ctrl_23_sub_size[] = {1, 1, 1};
+static unsigned char ctrl_27_sub_size[] = {1, 5, 2, 1, 7};
+
+DECLARE_COMPLETION(udg_remove_complete);
+
+static ssize_t udg_sysfs_engine_enable_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ bool enable;
+ unsigned int input;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input == 1)
+ enable = true;
+ else if (input == 0)
+ enable = false;
+ else
+ return -EINVAL;
+
+ retval = udg_engine_enable(enable);
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t udg_sysfs_detection_enable_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ bool enable;
+ unsigned int input;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input == 1)
+ enable = true;
+ else if (input == 0)
+ enable = false;
+ else
+ return -EINVAL;
+
+ udg->detection_status = 0;
+
+ retval = udg_detection_enable(enable);
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t udg_sysfs_detection_score_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", udg->detection_score);
+}
+
+static ssize_t udg_sysfs_detection_index_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", udg->detection_index);
+}
+
+static ssize_t udg_sysfs_registration_enable_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ bool enable;
+ unsigned int input;
+ struct synaptics_rmi4_f12_control_41 control_41;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input == 1)
+ enable = true;
+ else if (input == 0)
+ enable = false;
+ else
+ return -EINVAL;
+
+ if (enable) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_23,
+ udg->ctrl_buf,
+ udg->ctrl_23_sub3_off + 1);
+ if (retval < 0)
+ return retval;
+
+ udg->ctrl_buf[0] = 0;
+ udg->ctrl_buf[0] |= (1 << CTRL23_FINGER_REPORT_ENABLE_BIT);
+ if (udg->ctrl_23_sub3_off)
+ udg->ctrl_buf[udg->ctrl_23_sub3_off] = 0;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.ctrl_23,
+ udg->ctrl_buf,
+ udg->ctrl_23_sub3_off + 1);
+ if (retval < 0)
+ return retval;
+ } else {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_23,
+ udg->ctrl_buf,
+ udg->ctrl_23_sub3_off + 1);
+ if (retval < 0)
+ return retval;
+
+ udg->ctrl_buf[0] = udg->object_type_enable1;
+ if (udg->ctrl_23_sub3_off) {
+ udg->ctrl_buf[udg->ctrl_23_sub3_off] =
+ udg->object_type_enable2;
+ }
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.ctrl_23,
+ udg->ctrl_buf,
+ udg->ctrl_23_sub3_off + 1);
+ if (retval < 0)
+ return retval;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_41,
+ control_41.data,
+ sizeof(control_41.data));
+ if (retval < 0)
+ return retval;
+
+ control_41.enable_registration = enable ? 1 : 0;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.ctrl_41,
+ control_41.data,
+ sizeof(control_41.data));
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t udg_sysfs_registration_begin_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ bool begin;
+ unsigned int input;
+ struct synaptics_rmi4_f12_control_41 control_41;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input == 1)
+ begin = true;
+ else if (input == 0)
+ begin = false;
+ else
+ return -EINVAL;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_41,
+ control_41.data,
+ sizeof(control_41.data));
+ if (retval < 0)
+ return retval;
+
+ control_41.begin = begin ? 1 : 0;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.ctrl_41,
+ control_41.data,
+ sizeof(control_41.data));
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t udg_sysfs_registration_status_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "0x%02x\n", udg->registration_status);
+}
+
+static ssize_t udg_sysfs_template_size_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", udg->template_size);
+}
+
+static ssize_t udg_sysfs_template_max_index_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", udg->max_num_templates - 1);
+}
+
+static ssize_t udg_sysfs_template_detection_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ int attn_event;
+ unsigned char detection_status;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ attn_event = atomic_read(&udg->attn_event);
+ atomic_set(&udg->attn_event, 0);
+
+ if (attn_event == 0)
+ return snprintf(buf, PAGE_SIZE, "0\n");
+
+ if (udg->detection_status == 0) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.data_4,
+ rmi4_data->gesture_detection,
+ sizeof(rmi4_data->gesture_detection));
+ if (retval < 0)
+ return retval;
+
+ udg->detection_status = rmi4_data->gesture_detection[0];
+ }
+
+ detection_status = udg->detection_status;
+ udg->detection_status = 0;
+
+ switch (detection_status) {
+ case DETECTION:
+ udg->detection_score = rmi4_data->gesture_detection[1];
+ udg->detection_index = rmi4_data->gesture_detection[4];
+ udg->trace_size = rmi4_data->gesture_detection[3];
+ break;
+ case REGISTRATION:
+ udg->registration_status = rmi4_data->gesture_detection[1];
+ udg->trace_size = rmi4_data->gesture_detection[3];
+ break;
+ default:
+ return snprintf(buf, PAGE_SIZE, "0\n");
+ }
+
+ return snprintf(buf, PAGE_SIZE, "0x%02x\n", detection_status);
+}
+
+static ssize_t udg_sysfs_template_index_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long index;
+
+ retval = sstrtoul(buf, 10, &index);
+ if (retval)
+ return retval;
+
+ retval = udg_set_index((unsigned char)index);
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t udg_sysfs_template_valid_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned char valid;
+ unsigned char offset;
+ unsigned char byte_num;
+ unsigned char template_flags[2];
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ byte_num = udg->template_index / 8;
+ offset = udg->template_index % 8;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.template_flags,
+ template_flags,
+ sizeof(template_flags));
+ if (retval < 0)
+ return retval;
+
+ valid = (template_flags[byte_num] & (1 << offset)) >> offset;
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", valid);
+}
+
+static ssize_t udg_sysfs_template_valid_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long valid;
+ unsigned char offset;
+ unsigned char byte_num;
+ unsigned char template_flags[2];
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &valid);
+ if (retval)
+ return retval;
+
+ if (valid > 0)
+ valid = 1;
+
+ byte_num = udg->template_index / 8;
+ offset = udg->template_index % 8;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.template_flags,
+ template_flags,
+ sizeof(template_flags));
+ if (retval < 0)
+ return retval;
+
+ if (valid)
+ template_flags[byte_num] |= (1 << offset);
+ else
+ template_flags[byte_num] &= ~(1 << offset);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.template_flags,
+ template_flags,
+ sizeof(template_flags));
+ if (retval < 0)
+ return retval;
+
+#ifdef STORE_GESTURES
+ udg_read_valid_data();
+#endif
+
+ return count;
+}
+
+static ssize_t udg_sysfs_template_clear_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ const char cmd[] = {'0', 0};
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input != 1)
+ return -EINVAL;
+
+ memset(udg->template_data_buf, 0x00, udg->template_data_size);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.template_data,
+ udg->template_data_buf,
+ udg->template_data_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to clear template data\n",
+ __func__);
+ return retval;
+ }
+
+ retval = udg_sysfs_template_valid_store(dev, attr, cmd, 1);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to clear valid bit\n",
+ __func__);
+ return retval;
+ }
+
+#ifdef STORE_GESTURES
+ udg_read_template_data(udg->template_index);
+ udg_read_valid_data();
+#endif
+
+ return count;
+}
+
+static ssize_t udg_sysfs_trace_size_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", udg->trace_size);
+}
+
+static ssize_t udg_sysfs_trace_data_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ unsigned short index = 0;
+ unsigned short trace_data_size;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ trace_data_size = udg->trace_size * 5;
+
+ if (trace_data_size == 0)
+ return -EINVAL;
+
+ if (count < trace_data_size) {
+ return -EINVAL;
+ }
+
+ if (udg->trace_data_buf_size < trace_data_size) {
+ if (udg->trace_data_buf_size)
+ kfree(udg->trace_data_buf);
+ udg->trace_data_buf = kzalloc(trace_data_size, GFP_KERNEL);
+ if (!udg->trace_data_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for trace data buffer\n",
+ __func__);
+ udg->trace_data_buf_size = 0;
+ return -ENOMEM;
+ }
+ udg->trace_data_buf_size = trace_data_size;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.trace_x,
+ &udg->trace_data_buf[index],
+ udg->trace_size * 2);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read trace X data\n",
+ __func__);
+ return retval;
+ } else {
+ index += udg->trace_size * 2;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.trace_y,
+ &udg->trace_data_buf[index],
+ udg->trace_size * 2);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read trace Y data\n",
+ __func__);
+ return retval;
+ } else {
+ index += udg->trace_size * 2;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.trace_segment,
+ &udg->trace_data_buf[index],
+ udg->trace_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read trace segment data\n",
+ __func__);
+ return retval;
+ }
+
+ retval = secure_memcpy(buf, count, udg->trace_data_buf,
+ udg->trace_data_buf_size, trace_data_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy trace data\n",
+ __func__);
+ return retval;
+ }
+
+ return trace_data_size;
+}
+
+static ssize_t udg_sysfs_template_data_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ if (count < udg->template_data_size) {
+ return -EINVAL;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.template_data,
+ udg->template_data_buf,
+ udg->template_data_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read template data\n",
+ __func__);
+ return retval;
+ }
+
+ retval = secure_memcpy(buf, count, udg->template_data_buf,
+ udg->template_data_size, udg->template_data_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy template data\n",
+ __func__);
+ return retval;
+ }
+
+#ifdef STORE_GESTURES
+ udg_read_template_data(udg->template_index);
+ udg_read_valid_data();
+#endif
+
+ return udg->template_data_size;
+}
+
+static ssize_t udg_sysfs_template_data_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ retval = secure_memcpy(udg->template_data_buf, udg->template_data_size,
+ buf, count, count);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy template data\n",
+ __func__);
+ return retval;
+ }
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.template_data,
+ udg->template_data_buf,
+ count);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write template data\n",
+ __func__);
+ return retval;
+ }
+
+#ifdef STORE_GESTURES
+ udg_read_template_data(udg->template_index);
+ udg_read_valid_data();
+#endif
+
+ return count;
+}
+
+static ssize_t udg_sysfs_template_displacement_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned short template_displacement;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ template_displacement =
+ ((unsigned short)udg->tuning.template_disp_lsb << 0) |
+ ((unsigned short)udg->tuning.template_disp_msb << 8);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", template_displacement);
+}
+
+static ssize_t udg_sysfs_template_displacement_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long input;
+
+ retval = sstrtoul(buf, 10, &input);
+ if (retval)
+ return retval;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ udg->tuning.template_disp_lsb = (unsigned char)(input >> 0);
+ udg->tuning.template_disp_msb = (unsigned char)(input >> 8);
+
+ retval = udg_write_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t udg_sysfs_rotation_invariance_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned short rotation_invariance;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ rotation_invariance =
+ ((unsigned short)udg->tuning.rotation_inv_lsb << 0) |
+ ((unsigned short)udg->tuning.rotation_inv_msb << 8);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", rotation_invariance);
+}
+
+static ssize_t udg_sysfs_rotation_invariance_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long input;
+
+ retval = sstrtoul(buf, 10, &input);
+ if (retval)
+ return retval;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ udg->tuning.rotation_inv_lsb = (unsigned char)(input >> 0);
+ udg->tuning.rotation_inv_msb = (unsigned char)(input >> 8);
+
+ retval = udg_write_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t udg_sysfs_scale_invariance_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned short scale_invariance;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ scale_invariance =
+ ((unsigned short)udg->tuning.scale_inv_lsb << 0) |
+ ((unsigned short)udg->tuning.scale_inv_msb << 8);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", scale_invariance);
+}
+
+static ssize_t udg_sysfs_scale_invariance_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long input;
+
+ retval = sstrtoul(buf, 10, &input);
+ if (retval)
+ return retval;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ udg->tuning.scale_inv_lsb = (unsigned char)(input >> 0);
+ udg->tuning.scale_inv_msb = (unsigned char)(input >> 8);
+
+ retval = udg_write_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t udg_sysfs_threshold_factor_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned short threshold_factor;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ threshold_factor =
+ ((unsigned short)udg->tuning.thres_factor_lsb << 0) |
+ ((unsigned short)udg->tuning.thres_factor_msb << 8);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", threshold_factor);
+}
+
+static ssize_t udg_sysfs_threshold_factor_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long input;
+
+ retval = sstrtoul(buf, 10, &input);
+ if (retval)
+ return retval;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ udg->tuning.thres_factor_lsb = (unsigned char)(input >> 0);
+ udg->tuning.thres_factor_msb = (unsigned char)(input >> 8);
+
+ retval = udg_write_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t udg_sysfs_match_metric_threshold_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned short match_metric_threshold;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ match_metric_threshold =
+ ((unsigned short)udg->tuning.metric_thres_lsb << 0) |
+ ((unsigned short)udg->tuning.metric_thres_msb << 8);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", match_metric_threshold);
+}
+
+static ssize_t udg_sysfs_match_metric_threshold_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long input;
+
+ retval = sstrtoul(buf, 10, &input);
+ if (retval)
+ return retval;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ udg->tuning.metric_thres_lsb = (unsigned char)(input >> 0);
+ udg->tuning.metric_thres_msb = (unsigned char)(input >> 8);
+
+ retval = udg_write_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t udg_sysfs_max_inter_stroke_time_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned short max_inter_stroke_time;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ max_inter_stroke_time =
+ ((unsigned short)udg->tuning.inter_stroke_lsb << 0) |
+ ((unsigned short)udg->tuning.inter_stroke_msb << 8);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", max_inter_stroke_time);
+}
+
+static ssize_t udg_sysfs_max_inter_stroke_time_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long input;
+
+ retval = sstrtoul(buf, 10, &input);
+ if (retval)
+ return retval;
+
+ retval = udg_read_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ udg->tuning.inter_stroke_lsb = (unsigned char)(input >> 0);
+ udg->tuning.inter_stroke_msb = (unsigned char)(input >> 8);
+
+ retval = udg_write_tuning_params();
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static int udg_ctrl_subpacket(unsigned char ctrlreg,
+ unsigned char subpacket,
+ struct synaptics_rmi4_f12_query_5 *query_5)
+{
+ int retval;
+ unsigned char cnt;
+ unsigned char regnum;
+ unsigned char bitnum;
+ unsigned char q5_index;
+ unsigned char q6_index;
+ unsigned char offset;
+ unsigned char max_ctrlreg;
+ unsigned char *query_6;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ max_ctrlreg = (sizeof(query_5->data) - 1) * 8 - 1;
+
+ if (ctrlreg > max_ctrlreg) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Control register number (%d) over limit\n",
+ __func__, ctrlreg);
+ return -EINVAL;
+ }
+
+ q5_index = ctrlreg / 8 + 1;
+ bitnum = ctrlreg % 8;
+ if ((query_5->data[q5_index] & (1 << bitnum)) == 0x00) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Control %d is not present\n",
+ __func__, ctrlreg);
+ return -EINVAL;
+ }
+
+ query_6 = kmalloc(query_5->size_of_query6, GFP_KERNEL);
+ if (!query_6) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for query 6\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->query_base_addr + 6,
+ query_6,
+ query_5->size_of_query6);
+ if (retval < 0)
+ goto exit;
+
+ q6_index = 0;
+
+ for (regnum = 0; regnum < ctrlreg; regnum++) {
+ q5_index = regnum / 8 + 1;
+ bitnum = regnum % 8;
+ if ((query_5->data[q5_index] & (1 << bitnum)) == 0x00)
+ continue;
+
+ if (query_6[q6_index] == 0x00)
+ q6_index += 3;
+ else
+ q6_index++;
+
+ while (query_6[q6_index] & ~MASK_7BIT)
+ q6_index++;
+
+ q6_index++;
+ }
+
+ cnt = 0;
+ q6_index++;
+ offset = subpacket / 7;
+ bitnum = subpacket % 7;
+
+ do {
+ if (cnt == offset) {
+ if (query_6[q6_index + cnt] & (1 << bitnum))
+ retval = 1;
+ else
+ retval = 0;
+ goto exit;
+ }
+ cnt++;
+ } while (query_6[q6_index + cnt - 1] & ~MASK_7BIT);
+
+ retval = 0;
+
+exit:
+ kfree(query_6);
+
+ return retval;
+}
+
+static int udg_read_tuning_params(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_18,
+ udg->ctrl_buf,
+ udg->ctrl_18_sub10_off + sizeof(struct udg_tuning));
+ if (retval < 0)
+ return retval;
+
+ secure_memcpy(udg->tuning.data,
+ sizeof(udg->tuning.data),
+ (unsigned char *)&udg->ctrl_buf[udg->ctrl_18_sub10_off],
+ sizeof(struct udg_tuning),
+ sizeof(struct udg_tuning));
+
+ return 0;
+}
+
+static int udg_write_tuning_params(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ secure_memcpy((unsigned char *)&udg->ctrl_buf[udg->ctrl_18_sub10_off],
+ sizeof(struct udg_tuning),
+ udg->tuning.data,
+ sizeof(udg->tuning.data),
+ sizeof(struct udg_tuning));
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.ctrl_18,
+ udg->ctrl_buf,
+ udg->ctrl_18_sub10_off + sizeof(struct udg_tuning));
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+static int udg_detection_enable(bool enable)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_20,
+ udg->ctrl_buf,
+ udg->ctrl_20_sub1_off + 1);
+ if (retval < 0)
+ return retval;
+
+ if (enable)
+ udg->ctrl_buf[udg->ctrl_20_sub1_off] = WAKEUP_GESTURE_MODE;
+ else
+ udg->ctrl_buf[udg->ctrl_20_sub1_off] = udg->report_flags;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.ctrl_20,
+ udg->ctrl_buf,
+ udg->ctrl_20_sub1_off + 1);
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+static int udg_engine_enable(bool enable)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ if (enable) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_27,
+ udg->ctrl_buf,
+ udg->ctrl_27_sub5_off + 1);
+ if (retval < 0)
+ return retval;
+
+ udg->ctrl_buf[udg->ctrl_27_sub5_off] |=
+ (1 << CTRL27_UDG_ENABLE_BIT);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.ctrl_27,
+ udg->ctrl_buf,
+ udg->ctrl_27_sub5_off + 1);
+ if (retval < 0)
+ return retval;
+ } else {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_27,
+ udg->ctrl_buf,
+ udg->ctrl_27_sub5_off + 1);
+ if (retval < 0)
+ return retval;
+
+ udg->ctrl_buf[udg->ctrl_27_sub5_off] &=
+ ~(1 << CTRL27_UDG_ENABLE_BIT);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.ctrl_27,
+ udg->ctrl_buf,
+ udg->ctrl_27_sub5_off + 1);
+ if (retval < 0)
+ return retval;
+ }
+
+ return 0;
+}
+
+static void udg_report(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ atomic_set(&udg->attn_event, 1);
+
+ if (rmi4_data->suspend) {
+ if (rmi4_data->gesture_detection[0] == 0) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.data_4,
+ rmi4_data->gesture_detection,
+ sizeof(rmi4_data->gesture_detection));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read gesture detection\n",
+ __func__);
+ return;
+ }
+ }
+
+ udg->detection_status = rmi4_data->gesture_detection[0];
+ rmi4_data->gesture_detection[0] = 0;
+
+ if (udg->detection_status == DETECTION) {
+ input_report_key(udg->udg_dev, KEY_WAKEUP, 1);
+ input_sync(udg->udg_dev);
+ input_report_key(udg->udg_dev, KEY_WAKEUP, 0);
+ input_sync(udg->udg_dev);
+ rmi4_data->suspend = false;
+ }
+ }
+
+ return;
+}
+
+static int udg_set_index(unsigned char index)
+{
+ int retval;
+ struct synaptics_rmi4_f12_control_41 control_41;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ if (index >= udg->max_num_templates)
+ return -EINVAL;
+
+ udg->template_index = index;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_41,
+ control_41.data,
+ sizeof(control_41.data));
+ if (retval < 0)
+ return retval;
+
+ control_41.template_index = udg->template_index;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.ctrl_41,
+ control_41.data,
+ sizeof(control_41.data));
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+#ifdef STORE_GESTURES
+static int udg_read_valid_data(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.template_flags,
+ udg->valid_buf,
+ sizeof(udg->valid_buf));
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+static int udg_write_valid_data(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.template_flags,
+ udg->valid_buf,
+ sizeof(udg->valid_buf));
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+static int udg_read_template_data(unsigned char index)
+{
+ int retval;
+ unsigned char *storage;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ udg_set_index(index);
+ storage = &(udg->storage_buf[index * udg->template_data_size]);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.template_data,
+ storage,
+ udg->template_data_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read template data\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static int udg_write_template_data(void)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char *storage;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ for (ii = 0; ii < udg->gestures_to_store; ii++) {
+ udg_set_index(ii);
+ storage = &(udg->storage_buf[ii * udg->template_data_size]);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ udg->addr.template_data,
+ storage,
+ udg->template_data_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write template data\n",
+ __func__);
+ return retval;
+ }
+ }
+
+ return 0;
+}
+#endif
+
+static int udg_reg_init(void)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char data_offset;
+ unsigned char size_of_query;
+ unsigned char ctrl_18_offset;
+ unsigned char ctrl_20_offset;
+ unsigned char ctrl_23_offset;
+ unsigned char ctrl_27_offset;
+ unsigned char ctrl_41_offset;
+ struct synaptics_rmi4_f12_query_0 query_0;
+ struct synaptics_rmi4_f12_query_5 query_5;
+ struct synaptics_rmi4_f12_query_8 query_8;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->query_base_addr + 7,
+ &size_of_query,
+ sizeof(size_of_query));
+ if (retval < 0)
+ return retval;
+
+ if (size_of_query < 4) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: User defined gesture support unavailable "
+ "(missing data registers)\n",
+ __func__);
+ retval = -ENODEV;
+ return retval;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->query_base_addr + 8,
+ query_8.data,
+ sizeof(query_8.data));
+ if (retval < 0)
+ return retval;
+
+ if ((query_8.data16_is_present) &&
+ (query_8.data17_is_present) &&
+ (query_8.data18_is_present) &&
+ (query_8.data19_is_present) &&
+ (query_8.data20_is_present) &&
+ (query_8.data21_is_present)) {
+ data_offset = query_8.data0_is_present +
+ query_8.data1_is_present +
+ query_8.data2_is_present +
+ query_8.data3_is_present;
+ udg->addr.data_4 = udg->data_base_addr + data_offset;
+ data_offset = data_offset +
+ query_8.data4_is_present +
+ query_8.data5_is_present +
+ query_8.data6_is_present +
+ query_8.data7_is_present +
+ query_8.data8_is_present +
+ query_8.data9_is_present +
+ query_8.data10_is_present +
+ query_8.data11_is_present +
+ query_8.data12_is_present +
+ query_8.data13_is_present +
+ query_8.data14_is_present +
+ query_8.data15_is_present;
+ udg->addr.trace_x = udg->data_base_addr + data_offset;
+ udg->addr.trace_y = udg->addr.trace_x + 1;
+ udg->addr.trace_segment = udg->addr.trace_y + 1;
+ udg->addr.template_helper = udg->addr.trace_segment + 1;
+ udg->addr.template_data = udg->addr.template_helper + 1;
+ udg->addr.template_flags = udg->addr.template_data + 1;
+ } else {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: User defined gesture support unavailable "
+ "(missing data registers)\n",
+ __func__);
+ retval = -ENODEV;
+ return retval;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->query_base_addr + 4,
+ &size_of_query,
+ sizeof(size_of_query));
+ if (retval < 0)
+ return retval;
+
+ if (size_of_query < 7) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: User defined gesture support unavailable "
+ "(missing control registers)\n",
+ __func__);
+ retval = -ENODEV;
+ return retval;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->query_base_addr + 5,
+ query_5.data,
+ sizeof(query_5.data));
+ if (retval < 0)
+ return retval;
+
+ ctrl_18_offset = query_5.ctrl0_is_present +
+ query_5.ctrl1_is_present +
+ query_5.ctrl2_is_present +
+ query_5.ctrl3_is_present +
+ query_5.ctrl4_is_present +
+ query_5.ctrl5_is_present +
+ query_5.ctrl6_is_present +
+ query_5.ctrl7_is_present +
+ query_5.ctrl8_is_present +
+ query_5.ctrl9_is_present +
+ query_5.ctrl10_is_present +
+ query_5.ctrl11_is_present +
+ query_5.ctrl12_is_present +
+ query_5.ctrl13_is_present +
+ query_5.ctrl14_is_present +
+ query_5.ctrl15_is_present +
+ query_5.ctrl16_is_present +
+ query_5.ctrl17_is_present;
+
+ ctrl_20_offset = ctrl_18_offset +
+ query_5.ctrl18_is_present +
+ query_5.ctrl19_is_present;
+
+ ctrl_23_offset = ctrl_20_offset +
+ query_5.ctrl20_is_present +
+ query_5.ctrl21_is_present +
+ query_5.ctrl22_is_present;
+
+ ctrl_27_offset = ctrl_23_offset+
+ query_5.ctrl23_is_present +
+ query_5.ctrl24_is_present +
+ query_5.ctrl25_is_present +
+ query_5.ctrl26_is_present;
+
+ ctrl_41_offset = ctrl_27_offset+
+ query_5.ctrl27_is_present +
+ query_5.ctrl28_is_present +
+ query_5.ctrl29_is_present +
+ query_5.ctrl30_is_present +
+ query_5.ctrl31_is_present +
+ query_5.ctrl32_is_present +
+ query_5.ctrl33_is_present +
+ query_5.ctrl34_is_present +
+ query_5.ctrl35_is_present +
+ query_5.ctrl36_is_present +
+ query_5.ctrl37_is_present +
+ query_5.ctrl38_is_present +
+ query_5.ctrl39_is_present +
+ query_5.ctrl40_is_present;
+
+ udg->addr.ctrl_18 = udg->control_base_addr + ctrl_18_offset;
+ udg->addr.ctrl_20 = udg->control_base_addr + ctrl_20_offset;
+ udg->addr.ctrl_23 = udg->control_base_addr + ctrl_23_offset;
+ udg->addr.ctrl_27 = udg->control_base_addr + ctrl_27_offset;
+ udg->addr.ctrl_41 = udg->control_base_addr + ctrl_41_offset;
+
+ udg->ctrl_18_sub10_off = 0;
+ for (ii = 0; ii < 10; ii++) {
+ retval = udg_ctrl_subpacket(18, ii, &query_5);
+ if (retval == 1)
+ udg->ctrl_18_sub10_off += ctrl_18_sub_size[ii];
+ else if (retval < 0)
+ return retval;
+ }
+
+ udg->ctrl_20_sub1_off = 0;
+ for (ii = 0; ii < 1; ii++) {
+ retval = udg_ctrl_subpacket(20, ii, &query_5);
+ if (retval == 1)
+ udg->ctrl_20_sub1_off += ctrl_20_sub_size[ii];
+ else if (retval < 0)
+ return retval;
+ }
+
+ udg->ctrl_23_sub3_off = 0;
+ for (ii = 0; ii < 3; ii++) {
+ retval = udg_ctrl_subpacket(23, ii, &query_5);
+ if (retval == 1)
+ udg->ctrl_23_sub3_off += ctrl_23_sub_size[ii];
+ else if (retval < 0)
+ return retval;
+ }
+
+ retval = udg_ctrl_subpacket(23, 3, &query_5);
+ if (retval == 0)
+ udg->ctrl_23_sub3_off = 0;
+ else if (retval < 0)
+ return retval;
+
+ udg->ctrl_27_sub5_off = 0;
+ for (ii = 0; ii < 5; ii++) {
+ retval = udg_ctrl_subpacket(27, ii, &query_5);
+ if (retval == 1)
+ udg->ctrl_27_sub5_off += ctrl_27_sub_size[ii];
+ else if (retval < 0)
+ return retval;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->query_base_addr + 0,
+ query_0.data,
+ sizeof(query_0.data));
+ if (retval < 0)
+ return retval;
+
+ udg->max_num_templates = query_0.max_num_templates;
+ udg->template_size =
+ ((unsigned short)query_0.template_size_lsb << 0) |
+ ((unsigned short)query_0.template_size_msb << 8);
+ udg->template_data_size = udg->template_size * 4 * 2 + 4 + 1;
+
+#ifdef STORE_GESTURES
+ udg->gestures_to_store = udg->max_num_templates;
+ if (GESTURES_TO_STORE < udg->gestures_to_store)
+ udg->gestures_to_store = GESTURES_TO_STORE;
+#endif
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_20,
+ udg->ctrl_buf,
+ udg->ctrl_20_sub1_off + 1);
+ if (retval < 0)
+ return retval;
+
+ udg->report_flags = udg->ctrl_buf[udg->ctrl_20_sub1_off];
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ udg->addr.ctrl_23,
+ udg->ctrl_buf,
+ udg->ctrl_23_sub3_off + 1);
+ if (retval < 0)
+ return retval;
+
+ udg->object_type_enable1 = udg->ctrl_buf[0];
+ if (udg->ctrl_23_sub3_off)
+ udg->object_type_enable2 = udg->ctrl_buf[udg->ctrl_23_sub3_off];
+
+ return retval;
+}
+
+static int udg_scan_pdt(void)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char page;
+ unsigned char intr_count = 0;
+ unsigned char intr_off;
+ unsigned char intr_src;
+ unsigned short addr;
+ struct synaptics_rmi4_fn_desc fd;
+ struct synaptics_rmi4_data *rmi4_data = udg->rmi4_data;
+
+ for (page = 0; page < PAGES_TO_SERVICE; page++) {
+ for (addr = PDT_START; addr > PDT_END; addr -= PDT_ENTRY_SIZE) {
+ addr |= (page << 8);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ addr,
+ (unsigned char *)&fd,
+ sizeof(fd));
+ if (retval < 0)
+ return retval;
+
+ addr &= ~(MASK_8BIT << 8);
+
+ if (fd.fn_number) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Found F%02x\n",
+ __func__, fd.fn_number);
+ switch (fd.fn_number) {
+ case SYNAPTICS_RMI4_F12:
+ goto f12_found;
+ break;
+ }
+ } else {
+ break;
+ }
+
+ intr_count += fd.intr_src_count;
+ }
+ }
+
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to find F12\n",
+ __func__);
+ return -EINVAL;
+
+f12_found:
+ udg->query_base_addr = fd.query_base_addr | (page << 8);
+ udg->control_base_addr = fd.ctrl_base_addr | (page << 8);
+ udg->data_base_addr = fd.data_base_addr | (page << 8);
+ udg->command_base_addr = fd.cmd_base_addr | (page << 8);
+
+ retval = udg_reg_init();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to initialize user defined gesture registers\n",
+ __func__);
+ return retval;
+ }
+
+ udg->intr_mask = 0;
+ intr_src = fd.intr_src_count;
+ intr_off = intr_count % 8;
+ for (ii = intr_off;
+ ii < (intr_src + intr_off);
+ ii++) {
+ udg->intr_mask |= 1 << ii;
+ }
+
+ rmi4_data->intr_mask[0] |= udg->intr_mask;
+
+ addr = rmi4_data->f01_ctrl_base_addr + 1;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ addr,
+ &rmi4_data->intr_mask[0],
+ sizeof(rmi4_data->intr_mask[0]));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set interrupt enable bit\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static void synaptics_rmi4_udg_attn(struct synaptics_rmi4_data *rmi4_data,
+ unsigned char intr_mask)
+{
+ if (!udg)
+ return;
+
+ if (udg->intr_mask & intr_mask)
+ udg_report();
+
+ return;
+}
+
+static int synaptics_rmi4_udg_init(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char size;
+ unsigned char attr_count;
+ unsigned char param_count;
+
+ if (udg) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Handle already exists\n",
+ __func__);
+ return 0;
+ }
+
+ udg = kzalloc(sizeof(*udg), GFP_KERNEL);
+ if (!udg) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for udg\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ size = 0;
+ for (ii = 0; ii < sizeof(ctrl_18_sub_size); ii++)
+ size += ctrl_18_sub_size[ii];
+ size += sizeof(struct udg_tuning);
+ udg->ctrl_buf = kzalloc(size, GFP_KERNEL);
+ if (!udg->ctrl_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for ctrl_buf\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit_free_udg;
+ }
+
+ udg->rmi4_data = rmi4_data;
+
+ retval = udg_scan_pdt();
+ if (retval < 0)
+ goto exit_free_ctrl_buf;
+
+ udg->template_data_buf = kzalloc(udg->template_data_size, GFP_KERNEL);
+ if (!udg->template_data_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for template_data_buf\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit_free_ctrl_buf;
+ }
+
+#ifdef STORE_GESTURES
+ udg->storage_buf = kzalloc(
+ udg->template_data_size * udg->gestures_to_store,
+ GFP_KERNEL);
+ if (!udg->storage_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for storage_buf\n",
+ __func__);
+ kfree(udg->template_data_buf);
+ retval = -ENOMEM;
+ goto exit_free_ctrl_buf;
+ }
+#endif
+
+ udg->udg_dev = input_allocate_device();
+ if (udg->udg_dev == NULL) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to allocate gesture device\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit_free_template_data_buf;
+ }
+
+ udg->udg_dev->name = GESTURE_DRIVER_NAME;
+ udg->udg_dev->phys = GESTURE_PHYS_NAME;
+ udg->udg_dev->id.product = SYNAPTICS_DSX_DRIVER_PRODUCT;
+ udg->udg_dev->id.version = SYNAPTICS_DSX_DRIVER_VERSION;
+ udg->udg_dev->dev.parent = rmi4_data->pdev->dev.parent;
+ input_set_drvdata(udg->udg_dev, rmi4_data);
+
+ set_bit(EV_KEY, udg->udg_dev->evbit);
+ set_bit(KEY_WAKEUP, udg->udg_dev->keybit);
+ input_set_capability(udg->udg_dev, EV_KEY, KEY_WAKEUP);
+
+ retval = input_register_device(udg->udg_dev);
+ if (retval) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to register gesture device\n",
+ __func__);
+ input_free_device(udg->udg_dev);
+ goto exit_free_template_data_buf;
+ }
+
+ udg->tuning_dir = kobject_create_and_add(TUNING_SYSFS_DIR_NAME,
+ &udg->udg_dev->dev.kobj);
+ if (!udg->tuning_dir) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create tuning sysfs directory\n",
+ __func__);
+ goto exit_unregister_input_device;
+ }
+
+ retval = sysfs_create_bin_file(&udg->udg_dev->dev.kobj, &template_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create template data bin file\n",
+ __func__);
+ goto exit_remove_sysfs_directory;
+ }
+
+ retval = sysfs_create_bin_file(&udg->udg_dev->dev.kobj, &trace_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create trace data bin file\n",
+ __func__);
+ goto exit_remove_bin_file;
+ }
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ retval = sysfs_create_file(&udg->udg_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ retval = -ENODEV;
+ goto exit_remove_attrs;
+ }
+ }
+
+ for (param_count = 0; param_count < ARRAY_SIZE(params); param_count++) {
+ retval = sysfs_create_file(udg->tuning_dir,
+ &params[param_count].attr);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create tuning parameters\n",
+ __func__);
+ retval = -ENODEV;
+ goto exit_remove_params;
+ }
+ }
+
+ retval = udg_engine_enable(true);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to enable gesture engine\n",
+ __func__);
+ goto exit_remove_params;
+ }
+
+ return 0;
+
+exit_remove_params:
+ for (param_count--; param_count >= 0; param_count--) {
+ sysfs_remove_file(udg->tuning_dir,
+ &params[param_count].attr);
+ }
+
+exit_remove_attrs:
+ for (attr_count--; attr_count >= 0; attr_count--) {
+ sysfs_remove_file(&udg->udg_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ }
+
+ sysfs_remove_bin_file(&udg->udg_dev->dev.kobj, &trace_data);
+
+exit_remove_bin_file:
+ sysfs_remove_bin_file(&udg->udg_dev->dev.kobj, &template_data);
+
+exit_remove_sysfs_directory:
+ kobject_put(udg->tuning_dir);
+
+exit_unregister_input_device:
+ input_unregister_device(udg->udg_dev);
+
+exit_free_template_data_buf:
+#ifdef STORE_GESTURES
+ kfree(udg->storage_buf);
+#endif
+ kfree(udg->template_data_buf);
+
+exit_free_ctrl_buf:
+ kfree(udg->ctrl_buf);
+
+exit_free_udg:
+ kfree(udg);
+ udg = NULL;
+
+exit:
+ return retval;
+}
+
+static void synaptics_rmi4_udg_remove(struct synaptics_rmi4_data *rmi4_data)
+{
+ unsigned char count;
+
+ if (!udg)
+ goto exit;
+
+ for (count = 0; count < ARRAY_SIZE(params); count++) {
+ sysfs_remove_file(udg->tuning_dir,
+ &params[count].attr);
+ }
+
+ for (count = 0; count < ARRAY_SIZE(attrs); count++) {
+ sysfs_remove_file(&udg->udg_dev->dev.kobj,
+ &attrs[count].attr);
+ }
+
+ sysfs_remove_bin_file(&udg->udg_dev->dev.kobj, &trace_data);
+ sysfs_remove_bin_file(&udg->udg_dev->dev.kobj, &template_data);
+ kobject_put(udg->tuning_dir);
+
+ input_unregister_device(udg->udg_dev);
+#ifdef STORE_GESTURES
+ kfree(udg->storage_buf);
+#endif
+ kfree(udg->template_data_buf);
+ kfree(udg->trace_data_buf);
+ kfree(udg->ctrl_buf);
+ kfree(udg);
+ udg = NULL;
+
+exit:
+ complete(&udg_remove_complete);
+
+ return;
+}
+
+static void synaptics_rmi4_udg_reset(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!udg) {
+ synaptics_rmi4_udg_init(rmi4_data);
+ return;
+ }
+
+ udg_scan_pdt();
+ udg_engine_enable(true);
+#ifdef STORE_GESTURES
+ udg_write_template_data();
+ udg_write_valid_data();
+#endif
+
+ return;
+}
+
+static void synaptics_rmi4_udg_reinit(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!udg)
+ return;
+
+ udg_engine_enable(true);
+#ifdef STORE_GESTURES
+ udg_write_template_data();
+ udg_write_valid_data();
+#endif
+
+ return;
+}
+
+static void synaptics_rmi4_udg_e_suspend(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!udg)
+ return;
+
+ rmi4_data->sleep_enable(rmi4_data, false);
+ rmi4_data->irq_enable(rmi4_data, true, false);
+ enable_irq_wake(rmi4_data->irq);
+
+ udg_engine_enable(true);
+ udg_detection_enable(true);
+
+ return;
+}
+
+static void synaptics_rmi4_udg_suspend(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!udg)
+ return;
+
+ rmi4_data->sleep_enable(rmi4_data, false);
+ rmi4_data->irq_enable(rmi4_data, true, false);
+ enable_irq_wake(rmi4_data->irq);
+
+ udg_engine_enable(true);
+ udg_detection_enable(true);
+
+ return;
+}
+
+static void synaptics_rmi4_udg_resume(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!udg)
+ return;
+
+ disable_irq_wake(rmi4_data->irq);
+ udg_detection_enable(false);
+
+ return;
+}
+
+static void synaptics_rmi4_udg_l_resume(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!udg)
+ return;
+
+ disable_irq_wake(rmi4_data->irq);
+ udg_detection_enable(false);
+
+ return;
+}
+
+static struct synaptics_rmi4_exp_fn gesture_module = {
+ .fn_type = RMI_GESTURE,
+ .init = synaptics_rmi4_udg_init,
+ .remove = synaptics_rmi4_udg_remove,
+ .reset = synaptics_rmi4_udg_reset,
+ .reinit = synaptics_rmi4_udg_reinit,
+ .early_suspend = synaptics_rmi4_udg_e_suspend,
+ .suspend = synaptics_rmi4_udg_suspend,
+ .resume = synaptics_rmi4_udg_resume,
+ .late_resume = synaptics_rmi4_udg_l_resume,
+ .attn = synaptics_rmi4_udg_attn,
+};
+
+static int __init rmi4_gesture_module_init(void)
+{
+ synaptics_rmi4_new_function_force(&gesture_module, true);
+
+ return 0;
+}
+
+static void __exit rmi4_gesture_module_exit(void)
+{
+ synaptics_rmi4_new_function_force(&gesture_module, false);
+
+ wait_for_completion(&udg_remove_complete);
+
+ return;
+}
+
+module_init(rmi4_gesture_module_init);
+module_exit(rmi4_gesture_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX User Defined Gesture Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_i2c.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_i2c.c
new file mode 100644
index 000000000000..5201665e4d46
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_i2c.c
@@ -0,0 +1,1106 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/i2c.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/types.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+
+#define SYN_I2C_RETRY_TIMES 4
+
+#define I2C_BURST_LIMIT 2048
+
+#define MAX_WRITE_SIZE 4096
+
+static unsigned char *wr_buf;
+
+static struct synaptics_dsx_hw_interface hw_if;
+
+static struct platform_device *synaptics_dsx_i2c_device;
+
+#ifdef CONFIG_OF
+static void dump_dt(struct device *dev, struct synaptics_dsx_board_data *bdata)
+{
+#if 0
+ int i, j;
+ char tmp[256] = {0};
+ dev_dbg(dev, "START of device tree dump:\n");
+ dev_dbg(dev, "power_gpio = %d\n", bdata->power_gpio);
+ dev_dbg(dev, "reset_gpio = %d\n", bdata->reset_gpio);
+ dev_dbg(dev, "irq_gpio = %d\n", bdata->irq_gpio);
+ dev_dbg(dev, "power_on_state = %d\n", (int)bdata->power_on_state);
+ dev_dbg(dev, "reset_on_state = %d\n", (int)bdata->reset_on_state);
+ dev_dbg(dev, "power_delay_ms = %d\n", (int)bdata->power_delay_ms);
+ dev_dbg(dev, "reset_delay_ms = %d\n", (int)bdata->reset_delay_ms);
+ dev_dbg(dev, "reset_active_ms = %d\n", (int)bdata->reset_active_ms);
+ dev_dbg(dev, "cut_off_power = %d\n", (int)bdata->cut_off_power);
+ dev_dbg(dev, "swap_axes = %d\n", (int)bdata->swap_axes);
+ dev_dbg(dev, "x_flip = %d\n", (int)bdata->x_flip);
+ dev_dbg(dev, "y_flip = %d\n", (int)bdata->y_flip);
+ dev_dbg(dev, "ub_i2c_addr = %d\n", (int)bdata->ub_i2c_addr);
+ dev_dbg(dev, "lockdown_area = %d\n", (int)bdata->lockdown_area);
+
+ for (i = 0; i < bdata->tp_id_num; i++)
+ snprintf(tmp, 256, "%s %d", tmp, bdata->tp_id_bytes[i]);
+ dev_dbg(dev, "tp_id_bytes =%s\n", tmp);
+
+ dev_dbg(dev, "config_array_size = %d\n", (int)bdata->config_array_size);
+ for (i = 0; i < bdata->config_array_size; i++) {
+ memset(tmp, 0, sizeof(tmp));
+ for (j = 0; j < bdata->tp_id_num; j++)
+ snprintf(tmp, 256, "%s 0x%0x", tmp, bdata->config_array[i].tp_ids[j]);
+ dev_dbg(dev, "config[%d].tp_id =%s", i, tmp);
+
+ dev_dbg(dev, "config[%d].fw_name = %s\n", i, bdata->config_array[i].fw_name);
+ }
+ dev_dbg(dev, "END of device tree dump\n");
+#endif
+}
+
+static int parse_dt(struct device *dev, struct synaptics_dsx_board_data *bdata)
+{
+ int retval;
+ u32 value;
+ const char *name;
+ struct synaptics_dsx_config_info *config_info;
+ struct synaptics_dsx_factory_param *factory_param;
+ struct property *prop;
+ struct device_node *temp, *np = dev->of_node;
+
+ bdata->irq_gpio = of_get_named_gpio_flags(np,
+ "synaptics,irq-gpio", 0, NULL);
+ if (bdata->irq_gpio < 0)
+ return -EINVAL;
+
+ retval = of_property_read_u32(np, "synaptics,irq-on-state",
+ &value);
+ if (retval < 0)
+ bdata->irq_on_state = 0;
+ else
+ bdata->irq_on_state = value;
+
+ retval = of_property_read_u32(np, "synaptics,irq-flags", &value);
+ if (retval < 0)
+ return retval;
+ else
+ bdata->irq_flags = value;
+
+ retval = of_property_read_string(np, "synaptics,pwr-reg-name", &name);
+ if (retval == -EINVAL)
+ bdata->pwr_reg_name = NULL;
+ else if (retval < 0)
+ return retval;
+ else
+ bdata->pwr_reg_name = name;
+
+ retval = of_property_read_string(np, "synaptics,bus-reg-name", &name);
+ if (retval == -EINVAL)
+ bdata->bus_reg_name = NULL;
+ else if (retval < 0)
+ return retval;
+ else
+ bdata->bus_reg_name = name;
+
+ bdata->panel_is_incell = of_property_read_bool(np, "synaptics,panel-is-incell");
+
+ if (bdata->panel_is_incell) {
+ retval = of_property_read_string(np, "synaptics,lab-reg-name", &name);
+ if (retval == -EINVAL)
+ bdata->lab_reg_name = NULL;
+ else if (retval < 0)
+ return retval;
+ else
+ bdata->lab_reg_name = name;
+
+ retval = of_property_read_string(np, "synaptics,ibb-reg-name", &name);
+ if (retval == -EINVAL)
+ bdata->ibb_reg_name = NULL;
+ else if (retval < 0)
+ return retval;
+ else
+ bdata->ibb_reg_name = name;
+
+ retval = of_property_read_string(np, "synaptics,disp-reg-name", &name);
+ if (retval == -EINVAL)
+ bdata->disp_reg_name = NULL;
+ else if (retval < 0)
+ return retval;
+ else
+ bdata->disp_reg_name = name;
+ }
+
+ retval = of_property_read_string(np, "synaptics,power-gpio-name", &name);
+ if (retval == -EINVAL)
+ bdata->power_gpio_name = NULL;
+ else if (retval < 0)
+ return retval;
+ else
+ bdata->power_gpio_name = name;
+
+ retval = of_property_read_string(np, "synaptics,reset-gpio-name", &name);
+ if (retval == -EINVAL)
+ bdata->reset_gpio_name = NULL;
+ else if (retval < 0)
+ return retval;
+ else
+ bdata->reset_gpio_name = name;
+
+ retval = of_property_read_string(np, "synaptics,irq-gpio-name", &name);
+ if (retval == -EINVAL)
+ bdata->irq_gpio_name = NULL;
+ else if (retval < 0)
+ return retval;
+ else
+ bdata->irq_gpio_name = name;
+
+ bdata->cut_off_power = of_property_read_bool(np, "synaptics,cut-off-power");
+
+ bdata->power_gpio = of_get_named_gpio_flags(np,
+ "synaptics,power-gpio", 0, NULL);
+ if (bdata->power_gpio >= 0) {
+ retval = of_property_read_u32(np, "synaptics,power-on-state",
+ &value);
+ if (retval < 0)
+ return retval;
+ else
+ bdata->power_on_state = value;
+ } else
+ bdata->power_gpio = -1;
+
+ retval = of_property_read_u32(np, "synaptics,power-delay-ms",
+ &value);
+ if (retval < 0)
+ bdata->power_delay_ms = 0; /* No power delay by default */
+ else
+ bdata->power_delay_ms = value;
+
+ bdata->mdss_reset = of_get_named_gpio_flags(np,
+ "synaptics,mdss-dsi-reset", 0, NULL);
+ if (bdata->mdss_reset >= 0) {
+ retval = of_property_read_u32(np, "synaptics,mdss-reset-state",
+ &value);
+ if (retval < 0)
+ return retval;
+ else
+ bdata->mdss_reset_state = value;
+ } else
+ bdata->mdss_reset = -1;
+
+ bdata->reset_gpio = of_get_named_gpio_flags(np,
+ "synaptics,reset-gpio", 0, NULL);
+ if (bdata->reset_gpio >= 0) {
+ retval = of_property_read_u32(np, "synaptics,reset-on-state",
+ &value);
+ if (retval < 0)
+ return retval;
+ else
+ bdata->reset_on_state = value;
+
+ retval = of_property_read_u32(np, "synaptics,reset-active-ms",
+ &value);
+ if (retval < 0)
+ return retval;
+ else
+ bdata->reset_active_ms = value;
+ } else
+ bdata->reset_gpio = -1;
+
+ retval = of_property_read_u32(np, "synaptics,reset-delay-ms",
+ &value);
+ if (retval < 0)
+ bdata->reset_delay_ms = 0; /* No reset delay by default */
+ else
+ bdata->reset_delay_ms = value;
+
+ retval = of_property_read_u32(np, "synaptics,max-y-for-2d",
+ &value);
+ if (retval < 0)
+ bdata->max_y_for_2d = -1;
+ else
+ bdata->max_y_for_2d = value;
+
+ bdata->swap_axes = of_property_read_bool(np, "synaptics,swap-axes");
+
+ bdata->x_flip = of_property_read_bool(np, "synaptics,x-flip");
+
+ bdata->y_flip = of_property_read_bool(np, "synaptics,y-flip");
+
+ retval = of_property_read_u32(np, "synaptics,ub-i2c-addr",
+ &value);
+ if (retval < 0)
+ bdata->ub_i2c_addr = -1;
+ else
+ bdata->ub_i2c_addr = (unsigned short)value;
+
+ retval = of_property_read_string(np, "synaptics,backup-fw", &name);
+ if (retval == -EINVAL)
+ bdata->backup_fw_name = NULL;
+ else if (retval < 0)
+ return retval;
+ else
+ bdata->backup_fw_name = name;
+
+ prop = of_find_property(np, "synaptics,cap-button-codes", NULL);
+ if (prop && prop->length) {
+ bdata->cap_button_map->map = devm_kzalloc(dev,
+ prop->length,
+ GFP_KERNEL);
+ if (!bdata->cap_button_map->map)
+ return -ENOMEM;
+ bdata->cap_button_map->nbuttons = prop->length / sizeof(u32);
+ retval = of_property_read_u32_array(np,
+ "synaptics,cap-button-codes",
+ bdata->cap_button_map->map,
+ bdata->cap_button_map->nbuttons);
+ if (retval < 0) {
+ bdata->cap_button_map->nbuttons = 0;
+ bdata->cap_button_map->map = NULL;
+ }
+ } else {
+ bdata->cap_button_map->nbuttons = 0;
+ bdata->cap_button_map->map = NULL;
+ }
+
+ retval = of_property_read_string(np, "synaptics,short-jdi-25", &bdata->short_test25);
+ if (retval && (retval != -EINVAL)) {
+ dev_err(dev, "Unable to read jdi short type 25 value\n");
+ bdata->short_test25 = NULL;
+ }
+
+ retval = of_property_read_string(np, "synaptics,short-jdi-26", &bdata->short_test26);
+ if (retval && (retval != -EINVAL)) {
+ dev_err(dev, "Unable to read jdi short type 26 value\n");
+ bdata->short_test26 = NULL;
+ }
+
+ prop = of_find_property(np, "synaptics,vir-button-codes", NULL);
+ if (prop && prop->length) {
+ bdata->vir_button_map->map = devm_kzalloc(dev,
+ prop->length,
+ GFP_KERNEL);
+ if (!bdata->vir_button_map->map)
+ return -ENOMEM;
+ bdata->vir_button_map->nbuttons = prop->length / sizeof(u32);
+ bdata->vir_button_map->nbuttons /= 5;
+ retval = of_property_read_u32_array(np,
+ "synaptics,vir-button-codes",
+ bdata->vir_button_map->map,
+ bdata->vir_button_map->nbuttons * 5);
+ if (retval < 0) {
+ bdata->vir_button_map->nbuttons = 0;
+ bdata->vir_button_map->map = NULL;
+ }
+ } else {
+ bdata->vir_button_map->nbuttons = 0;
+ bdata->vir_button_map->map = NULL;
+ }
+
+ if (of_property_read_bool(np, "synaptics,product-id-as-lockdown"))
+ bdata->lockdown_area = LOCKDOWN_AREA_PRODUCT_ID;
+ else if (of_property_read_bool(np, "synaptics,guest-serialization-as-lockdown"))
+ bdata->lockdown_area = LOCKDOWN_AREA_GUEST_SERIALIZATION;
+ else
+ bdata->lockdown_area = LOCKDOWN_AREA_UNKNOWN;
+
+ prop = of_find_property(np, "synaptics,tp-id-byte", NULL);
+ if (prop && prop->length) {
+ bdata->tp_id_bytes = devm_kzalloc(dev,
+ prop->length,
+ GFP_KERNEL);
+ if (!bdata->tp_id_bytes)
+ return -ENOMEM;
+ bdata->tp_id_num = prop->length / sizeof(u8);
+ retval = of_property_read_u8_array(np,
+ "synaptics,tp-id-byte",
+ bdata->tp_id_bytes,
+ bdata->tp_id_num);
+ if (retval < 0) {
+ bdata->tp_id_num = 0;
+ bdata->tp_id_bytes = NULL;
+ }
+ } else {
+ dev_err(dev, "Don't know which byte of lockdown info to distinguish TP\n");
+ bdata->tp_id_num = 0;
+ bdata->tp_id_bytes = NULL;
+ }
+#ifdef CONFIG_SYNAPTICS_TOUCH_COUNT_DUMP
+ bdata->dump_click_count = of_property_read_bool(np, "synaptics,dump-click-count");
+#endif
+
+ retval = of_property_read_u32(np, "synaptics,config-array-size",
+ &bdata->config_array_size);
+ if (retval < 0) {
+ dev_err(dev, "Cannot get config array size\n");
+ return retval;
+ }
+
+ bdata->config_array = devm_kzalloc(dev, bdata->config_array_size *
+ sizeof(struct synaptics_dsx_config_info), GFP_KERNEL);
+ if (!bdata->config_array) {
+ dev_err(dev, "Unable to allocate memory\n");
+ return -ENOMEM;
+ }
+
+ config_info = bdata->config_array;
+ for_each_child_of_node(np, temp) {
+ retval = of_property_read_u32(temp, "synaptics,chip-id",
+ &value);
+ if (retval < 0)
+ config_info->chip_id = -1;
+ else
+ config_info->chip_id = value;
+
+ retval = of_property_read_string(temp, "synaptics,chip-id-name",
+ &config_info->chip_id_name);
+ if (retval && (retval != -EINVAL)) {
+ dev_err(dev, "Unable to read chip id name\n");
+ return retval;
+ }
+
+ config_info->chip_is_tddi = of_property_read_bool(temp, "synaptics,chip-is-tddi");
+ config_info->open_test_b7 = of_property_read_bool(temp, "synaptics,open-test-b7");
+ config_info->short_test_extend = of_property_read_bool(temp, "synaptics,short-test-extend");
+ config_info->is_factory_param = of_property_read_bool(temp, "synaptics,factory-param");
+
+ if (config_info->is_factory_param) {
+ factory_param = devm_kzalloc(dev, bdata->config_array_size *
+ sizeof(struct synaptics_dsx_factory_param), GFP_KERNEL);
+ if (!factory_param) {
+ dev_err(dev, "Unable to allocate memory\n");
+ return -ENOMEM;
+ }
+
+ config_info->factory_param = factory_param;
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-short-limit_b", &value);
+ if (!retval) {
+ factory_param->tddi_short_limit_b = value;
+ } else {
+ factory_param->tddi_short_limit_b = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-noise-limit", &value);
+ if (!retval) {
+ factory_param->tddi_noise_limit = value;
+ } else {
+ factory_param->tddi_noise_limit = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-extend-ee-short-reset-dur", &value);
+ if (!retval) {
+ factory_param->tddi_extend_ee_short_reset_dur = value;
+ } else {
+ factory_param->tddi_extend_ee_short_reset_dur = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-extend-ee-short-int_dur", &value);
+ if (!retval) {
+ factory_param->tddi_extend_ee_short_int_dur = value;
+ } else {
+ factory_param->tddi_extend_ee_short_int_dur = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-extend-ee-short-tx-on-count", &value);
+ if (!retval) {
+ factory_param->tddi_extend_ee_short_tx_on_count = value;
+ } else {
+ factory_param->tddi_extend_ee_short_tx_on_count = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-extend-ee-short-rx-on-count", &value);
+ if (!retval) {
+ factory_param->tddi_extend_ee_short_rx_on_count = value;
+ } else {
+ factory_param->tddi_extend_ee_short_rx_on_count = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-extend-ee-short-test-limit-part1", &value);
+ if (!retval) {
+ factory_param->tddi_extend_ee_short_test_limit_part1 = value;
+ } else {
+ factory_param->tddi_extend_ee_short_test_limit_part1 = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-extend-ee-short-test-limit-part2", &value);
+ if (!retval) {
+ factory_param->tddi_extend_ee_short_test_limit_part2 = value;
+ } else {
+ factory_param->tddi_extend_ee_short_test_limit_part2 = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-open-test-int-dur-one", &value);
+ if (!retval) {
+ factory_param->tddi_open_test_int_dur_one = value;
+ } else {
+ factory_param->tddi_open_test_int_dur_one = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-open-test-int-dur-two", &value);
+ if (!retval) {
+ factory_param->tddi_open_test_int_dur_two = value;
+ } else {
+ factory_param->tddi_open_test_int_dur_two = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-open-test-limit-phase2-lower", &value);
+ if (!retval) {
+ factory_param->tddi_open_test_limit_phase2_lower = value;
+ } else {
+ factory_param->tddi_open_test_limit_phase2_lower = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-b7-open-test-int-dur-one", &value);
+ if (!retval) {
+ factory_param->tddi_b7_open_test_int_dur_one = value;
+ } else {
+ factory_param->tddi_b7_open_test_int_dur_one = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-b7-open-test-int-dur-two", &value);
+ if (!retval) {
+ factory_param->tddi_b7_open_test_int_dur_two = value;
+ } else {
+ factory_param->tddi_b7_open_test_int_dur_two = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-b7-open-test-limit-phase2-lower", &value);
+ if (!retval) {
+ factory_param->tddi_b7_open_test_limit_phase2_lower = value;
+ } else {
+ factory_param->tddi_b7_open_test_limit_phase2_lower = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,tddi-b7-open-test-limit-phase2-upper", &value);
+ if (!retval) {
+ factory_param->tddi_b7_open_test_limit_phase2_upper = value;
+ } else {
+ factory_param->tddi_b7_open_test_limit_phase2_upper = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,button-count", &value);
+ if (!retval) {
+ factory_param->button_count = value;
+ } else {
+ factory_param->button_count = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,abs-0d-open-factor", &value);
+ if (!retval) {
+ factory_param->abs_0d_open_factor = value;
+ } else {
+ factory_param->abs_0d_open_factor = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,abs-0d-open-test-limit", &value);
+ if (!retval) {
+ factory_param->abs_0d_open_test_limit = value;
+ } else {
+ factory_param->abs_0d_open_test_limit = 0;
+ }
+ }
+
+ if (bdata->panel_is_incell) {
+ retval = of_property_read_u32(temp,
+ "synaptics,disp-pre-on-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.disp_pre_on_sleep = value;
+ } else {
+ config_info->panel_power_seq.disp_pre_on_sleep = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,disp-post-on-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.disp_post_on_sleep = value;
+ } else {
+ config_info->panel_power_seq.disp_post_on_sleep = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,disp-pre-off-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.disp_pre_off_sleep = value;
+ } else {
+ config_info->panel_power_seq.disp_pre_off_sleep = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,disp-post-off-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.disp_post_off_sleep = value;
+ } else {
+ config_info->panel_power_seq.disp_post_off_sleep = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,lab-pre-on-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.lab_pre_on_sleep = value;
+ } else {
+ config_info->panel_power_seq.lab_pre_on_sleep = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,lab-post-on-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.lab_post_on_sleep = value;
+ } else {
+ config_info->panel_power_seq.lab_post_on_sleep = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,lab-pre-off-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.lab_pre_off_sleep = value;
+ } else {
+ config_info->panel_power_seq.lab_pre_off_sleep = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,lab-post-off-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.lab_post_off_sleep = value;
+ } else {
+ config_info->panel_power_seq.lab_post_off_sleep = 0;
+ }
+ retval = of_property_read_u32(temp,
+ "synaptics,ibb-pre-on-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.ibb_pre_on_sleep = value;
+ } else {
+ config_info->panel_power_seq.ibb_pre_on_sleep = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,ibb-post-on-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.ibb_post_on_sleep = value;
+ } else {
+ config_info->panel_power_seq.ibb_post_on_sleep = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,ibb-pre-off-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.ibb_pre_off_sleep = value;
+ } else {
+ config_info->panel_power_seq.ibb_pre_off_sleep = 0;
+ }
+
+ retval = of_property_read_u32(temp,
+ "synaptics,ibb-post-off-sleep", &value);
+ if (!retval) {
+ config_info->panel_power_seq.ibb_post_off_sleep = value;
+ } else {
+ config_info->panel_power_seq.ibb_post_off_sleep = 0;
+ }
+ }
+
+ prop = of_find_property(temp, "synaptics,tp-id", NULL);
+ if (prop && prop->length) {
+ if (bdata->tp_id_num != prop->length / sizeof(u8)) {
+ dev_err(dev, "Invalid TP id length\n");
+ return -EINVAL;
+ }
+ config_info->tp_ids = devm_kzalloc(dev,
+ prop->length,
+ GFP_KERNEL);
+ if (!config_info->tp_ids)
+ return -ENOMEM;
+ retval = of_property_read_u8_array(temp,
+ "synaptics,tp-id",
+ config_info->tp_ids,
+ bdata->tp_id_num);
+ if (retval < 0) {
+ dev_err(dev, "Error reading TP id\n");
+ return -EINVAL;
+ }
+ } else if (bdata->tp_id_num == 0) {
+ /* No TP id indicated, skip */
+ config_info->tp_ids = NULL;
+ } else {
+ dev_err(dev, "Cannot find TP id\n");
+ return -EINVAL;
+ }
+
+ retval = of_property_read_string(temp, "synaptics,fw-name",
+ &config_info->fw_name);
+ if (retval && (retval != -EINVAL)) {
+ dev_err(dev, "Unable to read firmware name\n");
+ return retval;
+ }
+#ifdef CONFIG_SYNAPTICS_TOUCH_COUNT_DUMP
+ if (bdata->dump_click_count) {
+ retval = of_property_read_string(temp, "synaptics,clicknum-file-name",
+ &config_info->clicknum_file_name);
+ if (retval && (retval != -EINVAL)) {
+ dev_err(dev, "Unable to read click count file name\n");
+ } else
+ dev_err(dev, "%s\n", config_info->clicknum_file_name);
+ }
+#endif
+ config_info++;
+ };
+
+ dump_dt(dev, bdata);
+ return 0;
+}
+#endif
+
+static int synaptics_rmi4_i2c_alloc_buf(struct synaptics_rmi4_data *rmi4_data,
+ unsigned int count)
+{
+ static unsigned int buf_size;
+
+ if (count > buf_size) {
+ if (buf_size)
+ kfree(wr_buf);
+ wr_buf = kzalloc(count, GFP_KERNEL);
+ if (!wr_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for buffer\n",
+ __func__);
+ buf_size = 0;
+ return -ENOMEM;
+ }
+ buf_size = count;
+ }
+
+ return 0;
+}
+
+static void synaptics_rmi4_i2c_check_addr(struct synaptics_rmi4_data *rmi4_data,
+ struct i2c_client *i2c)
+{
+ if (hw_if.board_data->ub_i2c_addr == -1)
+ return;
+
+ if (hw_if.board_data->i2c_addr == i2c->addr)
+ hw_if.board_data->i2c_addr = hw_if.board_data->ub_i2c_addr;
+ else
+ hw_if.board_data->i2c_addr = i2c->addr;
+
+ return;
+}
+
+static int synaptics_rmi4_i2c_set_page(struct synaptics_rmi4_data *rmi4_data,
+ unsigned short addr)
+{
+ int retval;
+ unsigned char retry;
+ unsigned char buf[PAGE_SELECT_LEN];
+ unsigned char page;
+ struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent);
+ struct i2c_msg msg[1];
+
+ msg[0].addr = hw_if.board_data->i2c_addr;
+ msg[0].flags = 0;
+ msg[0].len = PAGE_SELECT_LEN;
+ msg[0].buf = buf;
+
+ page = ((addr >> 8) & MASK_8BIT);
+ buf[0] = MASK_8BIT;
+ buf[1] = page;
+
+ if (page != rmi4_data->current_page) {
+ for (retry = 0; retry < SYN_I2C_RETRY_TIMES; retry++) {
+ if (i2c_transfer(i2c->adapter, msg, 1) == 1) {
+ rmi4_data->current_page = page;
+ retval = PAGE_SELECT_LEN;
+ break;
+ }
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: I2C retry %d\n",
+ __func__, retry + 1);
+
+ if (retry != SYN_I2C_RETRY_TIMES)
+ msleep(5);
+
+ if (retry == SYN_I2C_RETRY_TIMES / 2) {
+ synaptics_rmi4_i2c_check_addr(rmi4_data, i2c);
+ msg[0].addr = hw_if.board_data->i2c_addr;
+ }
+ }
+ } else {
+ retval = PAGE_SELECT_LEN;
+ }
+
+ return retval;
+}
+
+static int synaptics_rmi4_i2c_read(struct synaptics_rmi4_data *rmi4_data,
+ unsigned short addr, unsigned char *data, unsigned short length)
+{
+ int retval;
+ unsigned char retry;
+ unsigned char buf;
+ unsigned short i2c_addr;
+ unsigned short data_offset = 0;
+ struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent);
+ struct i2c_adapter *adap = i2c->adapter;
+ struct i2c_msg msg[2];
+ unsigned short index = 0;
+ unsigned short read_size;
+ unsigned short max_read_size;
+ unsigned short left_bytes = length;
+
+ mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ retval = synaptics_rmi4_i2c_set_page(rmi4_data, addr);
+ if (retval != PAGE_SELECT_LEN) {
+ retval = -EIO;
+ goto exit;
+ }
+
+ msg[0].addr = hw_if.board_data->i2c_addr;
+ msg[0].flags = 0;
+ msg[0].len = 1;
+ msg[0].buf = &buf;
+
+ msg[1].addr = hw_if.board_data->i2c_addr;
+ msg[1].flags = I2C_M_RD;
+
+#ifdef I2C_BURST_LIMIT
+ max_read_size = I2C_BURST_LIMIT;
+#else
+ max_read_size = length;
+#endif
+
+ do {
+ if (left_bytes / max_read_size)
+ read_size = max_read_size;
+ else
+ read_size = left_bytes;
+
+ msg[1].len = read_size;
+ msg[1].buf = &data[data_offset + index];
+
+ buf = addr & MASK_8BIT;
+
+ for (retry = 0; retry < SYN_I2C_RETRY_TIMES; retry++) {
+ if (left_bytes == length) {
+ retval = i2c_transfer(adap, &msg[0], 2);
+ if (retval == 2)
+ break;
+ } else {
+ retval = i2c_transfer(adap, &msg[1], 1);
+ if (retval == 1)
+ break;
+ }
+
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: I2C retry %d\n",
+ __func__, retry + 1);
+ msleep(20);
+
+ if (retry == SYN_I2C_RETRY_TIMES / 2) {
+ synaptics_rmi4_i2c_check_addr(rmi4_data, i2c);
+ i2c_addr = hw_if.board_data->i2c_addr;
+ msg[0].addr = i2c_addr;
+ msg[1].addr = i2c_addr;
+ }
+ }
+
+ if (retry == SYN_I2C_RETRY_TIMES) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: I2C read over retry limit\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ index += read_size;
+ left_bytes -= read_size;
+ } while (left_bytes);
+
+ retval = length;
+
+exit:
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ return retval;
+}
+
+static int synaptics_rmi4_i2c_write(struct synaptics_rmi4_data *rmi4_data,
+ unsigned short addr, unsigned char *data, unsigned short length)
+{
+ int retval;
+ unsigned char retry;
+ struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent);
+ struct i2c_msg msg[1];
+ unsigned short index = 0;
+ unsigned short write_size;
+ unsigned short max_write_size;
+ unsigned short left_bytes = length;
+
+#ifdef MAX_WRITE_SIZE
+ max_write_size = MAX_WRITE_SIZE;
+#else
+ max_write_size = length;
+#endif
+
+ retval = synaptics_rmi4_i2c_alloc_buf(rmi4_data, max_write_size + 1);
+ if (retval < 0)
+ return retval;
+
+ mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ retval = synaptics_rmi4_i2c_set_page(rmi4_data, addr);
+ if (retval != PAGE_SELECT_LEN) {
+ retval = -EIO;
+ goto exit;
+ }
+
+ do {
+ if (left_bytes / max_write_size)
+ write_size = max_write_size;
+ else
+ write_size = left_bytes;
+
+ msg[0].addr = hw_if.board_data->i2c_addr;
+ msg[0].flags = 0;
+ msg[0].len = write_size + 1;
+ msg[0].buf = wr_buf;
+
+ wr_buf[0] = addr & MASK_8BIT;
+ retval = secure_memcpy(&wr_buf[1], write_size, &data[index], write_size, write_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy data\n",
+ __func__);
+ goto exit;
+ }
+
+ for (retry = 0; retry < SYN_I2C_RETRY_TIMES; retry++) {
+ if (i2c_transfer(i2c->adapter, msg, 1) == 1) {
+ retval = length;
+ break;
+ }
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: I2C retry %d\n",
+ __func__, retry + 1);
+ msleep(20);
+
+ if (retry == SYN_I2C_RETRY_TIMES / 2) {
+ synaptics_rmi4_i2c_check_addr(rmi4_data, i2c);
+ msg[0].addr = hw_if.board_data->i2c_addr;
+ }
+ }
+
+ if (retry == SYN_I2C_RETRY_TIMES) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: I2C write over retry limit\n",
+ __func__);
+ retval = -EIO;
+ }
+
+ index += write_size;
+ left_bytes -= write_size;
+ } while (left_bytes);
+
+exit:
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ return retval;
+}
+
+static struct synaptics_dsx_bus_access bus_access = {
+ .type = BUS_I2C,
+ .read = synaptics_rmi4_i2c_read,
+ .write = synaptics_rmi4_i2c_write,
+};
+
+static void synaptics_rmi4_i2c_dev_release(struct device *dev)
+{
+ kfree(synaptics_dsx_i2c_device);
+
+ return;
+}
+
+static int synaptics_rmi4_i2c_probe(struct i2c_client *client,
+ const struct i2c_device_id *dev_id)
+{
+ int retval;
+
+ if (!i2c_check_functionality(client->adapter,
+ I2C_FUNC_SMBUS_BYTE_DATA)) {
+ dev_err(&client->dev,
+ "%s: SMBus byte data commands not supported by host\n",
+ __func__);
+ return -EIO;
+ }
+
+ synaptics_dsx_i2c_device = kzalloc(
+ sizeof(struct platform_device),
+ GFP_KERNEL);
+ if (!synaptics_dsx_i2c_device) {
+ dev_err(&client->dev,
+ "%s: Failed to allocate memory for synaptics_dsx_i2c_device\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+#ifdef CONFIG_OF
+ if (client->dev.of_node) {
+ hw_if.board_data = devm_kzalloc(&client->dev,
+ sizeof(struct synaptics_dsx_board_data),
+ GFP_KERNEL);
+ if (!hw_if.board_data) {
+ dev_err(&client->dev,
+ "%s: Failed to allocate memory for board data\n",
+ __func__);
+ return -ENOMEM;
+ }
+ hw_if.board_data->cap_button_map = devm_kzalloc(&client->dev,
+ sizeof(struct synaptics_dsx_button_map),
+ GFP_KERNEL);
+ if (!hw_if.board_data->cap_button_map) {
+ dev_err(&client->dev,
+ "%s: Failed to allocate memory for 0D button map\n",
+ __func__);
+ return -ENOMEM;
+ }
+ hw_if.board_data->vir_button_map = devm_kzalloc(&client->dev,
+ sizeof(struct synaptics_dsx_button_map),
+ GFP_KERNEL);
+ if (!hw_if.board_data->vir_button_map) {
+ dev_err(&client->dev,
+ "%s: Failed to allocate memory for virtual button map\n",
+ __func__);
+ return -ENOMEM;
+ }
+ parse_dt(&client->dev, hw_if.board_data);
+ }
+#else
+ hw_if.board_data = client->dev.platform_data;
+#endif
+
+ hw_if.bus_access = &bus_access;
+ hw_if.board_data->i2c_addr = client->addr;
+
+ synaptics_dsx_i2c_device->name = PLATFORM_DRIVER_FORCE;
+ synaptics_dsx_i2c_device->id = 0;
+ synaptics_dsx_i2c_device->num_resources = 0;
+ synaptics_dsx_i2c_device->dev.parent = &client->dev;
+ synaptics_dsx_i2c_device->dev.platform_data = &hw_if;
+ synaptics_dsx_i2c_device->dev.release = synaptics_rmi4_i2c_dev_release;
+
+ retval = platform_device_register(synaptics_dsx_i2c_device);
+ if (retval) {
+ dev_err(&client->dev,
+ "%s: Failed to register platform device\n",
+ __func__);
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
+static int synaptics_rmi4_i2c_remove(struct i2c_client *client)
+{
+ platform_device_unregister(synaptics_dsx_i2c_device);
+
+ return 0;
+}
+
+static const struct i2c_device_id synaptics_rmi4_id_table[] = {
+ {I2C_DRIVER_FORCE, 0},
+ {},
+};
+MODULE_DEVICE_TABLE(i2c, synaptics_rmi4_id_table);
+
+#ifdef CONFIG_OF
+static struct of_device_id synaptics_rmi4_of_match_table_force[] = {
+ {
+ .compatible = "synaptics,dsx-i2c-force",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, synaptics_rmi4_of_match_table_force);
+#else
+#define synaptics_rmi4_of_match_table NULL
+#endif
+
+static struct i2c_driver synaptics_rmi4_i2c_driver = {
+ .driver = {
+ .name = "synaptics_dsi_force",
+ .owner = THIS_MODULE,
+ .of_match_table = synaptics_rmi4_of_match_table_force,
+ },
+ .probe = synaptics_rmi4_i2c_probe,
+ .remove = synaptics_rmi4_i2c_remove,
+ .id_table = synaptics_rmi4_id_table,
+};
+
+int synaptics_rmi4_bus_init_force(void)
+{
+ return i2c_add_driver(&synaptics_rmi4_i2c_driver);
+}
+
+void synaptics_rmi4_bus_exit_force(void)
+{
+ kfree(wr_buf);
+
+ i2c_del_driver(&synaptics_rmi4_i2c_driver);
+
+ return;
+}
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX I2C Bus Support Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_proximity.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_proximity.c
new file mode 100644
index 000000000000..7344812fbf52
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_proximity.c
@@ -0,0 +1,692 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+
+#define PROX_PHYS_NAME "synaptics_dsx/proximity"
+
+#define HOVER_Z_MAX (255)
+
+#define HOVERING_FINGER_EN (1 << 4)
+
+static ssize_t synaptics_rmi4_hover_finger_en_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t synaptics_rmi4_hover_finger_en_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static struct device_attribute attrs[] = {
+ __ATTR(hover_finger_en, (S_IRUGO | S_IWUGO),
+ synaptics_rmi4_hover_finger_en_show,
+ synaptics_rmi4_hover_finger_en_store),
+};
+
+struct synaptics_rmi4_f12_query_5 {
+ union {
+ struct {
+ unsigned char size_of_query6;
+ struct {
+ unsigned char ctrl0_is_present:1;
+ unsigned char ctrl1_is_present:1;
+ unsigned char ctrl2_is_present:1;
+ unsigned char ctrl3_is_present:1;
+ unsigned char ctrl4_is_present:1;
+ unsigned char ctrl5_is_present:1;
+ unsigned char ctrl6_is_present:1;
+ unsigned char ctrl7_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl8_is_present:1;
+ unsigned char ctrl9_is_present:1;
+ unsigned char ctrl10_is_present:1;
+ unsigned char ctrl11_is_present:1;
+ unsigned char ctrl12_is_present:1;
+ unsigned char ctrl13_is_present:1;
+ unsigned char ctrl14_is_present:1;
+ unsigned char ctrl15_is_present:1;
+ } __packed;
+ struct {
+ unsigned char ctrl16_is_present:1;
+ unsigned char ctrl17_is_present:1;
+ unsigned char ctrl18_is_present:1;
+ unsigned char ctrl19_is_present:1;
+ unsigned char ctrl20_is_present:1;
+ unsigned char ctrl21_is_present:1;
+ unsigned char ctrl22_is_present:1;
+ unsigned char ctrl23_is_present:1;
+ } __packed;
+ };
+ unsigned char data[4];
+ };
+};
+
+struct synaptics_rmi4_f12_query_8 {
+ union {
+ struct {
+ unsigned char size_of_query9;
+ struct {
+ unsigned char data0_is_present:1;
+ unsigned char data1_is_present:1;
+ unsigned char data2_is_present:1;
+ unsigned char data3_is_present:1;
+ unsigned char data4_is_present:1;
+ unsigned char data5_is_present:1;
+ unsigned char data6_is_present:1;
+ unsigned char data7_is_present:1;
+ } __packed;
+ };
+ unsigned char data[2];
+ };
+};
+
+struct prox_finger_data {
+ union {
+ struct {
+ unsigned char object_type_and_status;
+ unsigned char x_lsb;
+ unsigned char x_msb;
+ unsigned char y_lsb;
+ unsigned char y_msb;
+ unsigned char z;
+ } __packed;
+ unsigned char proximity_data[6];
+ };
+};
+
+struct synaptics_rmi4_prox_handle {
+ bool hover_finger_present;
+ bool hover_finger_en;
+ unsigned char intr_mask;
+ unsigned short query_base_addr;
+ unsigned short control_base_addr;
+ unsigned short data_base_addr;
+ unsigned short command_base_addr;
+ unsigned short hover_finger_en_addr;
+ unsigned short hover_finger_data_addr;
+ struct input_dev *prox_dev;
+ struct prox_finger_data *finger_data;
+ struct synaptics_rmi4_data *rmi4_data;
+};
+
+static struct synaptics_rmi4_prox_handle *prox;
+
+DECLARE_COMPLETION(prox_remove_complete);
+
+static void prox_hover_finger_lift(void)
+{
+ input_report_key(prox->prox_dev, BTN_TOUCH, 0);
+ input_report_key(prox->prox_dev, BTN_TOOL_FINGER, 0);
+ input_sync(prox->prox_dev);
+ prox->hover_finger_present = false;
+
+ return;
+}
+
+static void prox_hover_finger_report(void)
+{
+ int retval;
+ int x;
+ int y;
+ int z;
+ struct prox_finger_data *data;
+ struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data;
+
+ data = prox->finger_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ prox->hover_finger_data_addr,
+ data->proximity_data,
+ sizeof(data->proximity_data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read hovering finger data\n",
+ __func__);
+ return;
+ }
+
+ if (data->object_type_and_status != F12_HOVERING_FINGER_STATUS) {
+ if (prox->hover_finger_present)
+ prox_hover_finger_lift();
+
+ return;
+ }
+
+ x = (data->x_msb << 8) | (data->x_lsb);
+ y = (data->y_msb << 8) | (data->y_lsb);
+ z = HOVER_Z_MAX - data->z;
+
+ input_report_key(prox->prox_dev, BTN_TOUCH, 0);
+ input_report_key(prox->prox_dev, BTN_TOOL_FINGER, 1);
+ input_report_abs(prox->prox_dev, ABS_X, x);
+ input_report_abs(prox->prox_dev, ABS_Y, y);
+ input_report_abs(prox->prox_dev, ABS_DISTANCE, z);
+
+ input_sync(prox->prox_dev);
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: x = %d y = %d z = %d\n",
+ __func__, x, y, z);
+
+ prox->hover_finger_present = true;
+
+ return;
+}
+
+static int prox_set_hover_finger_en(void)
+{
+ int retval;
+ unsigned char object_report_enable;
+ struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ prox->hover_finger_en_addr,
+ &object_report_enable,
+ sizeof(object_report_enable));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read from object report enable register\n",
+ __func__);
+ return retval;
+ }
+
+ if (prox->hover_finger_en)
+ object_report_enable |= HOVERING_FINGER_EN;
+ else
+ object_report_enable &= ~HOVERING_FINGER_EN;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ prox->hover_finger_en_addr,
+ &object_report_enable,
+ sizeof(object_report_enable));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write to object report enable register\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static void prox_set_params(void)
+{
+ input_set_abs_params(prox->prox_dev, ABS_X, 0,
+ prox->rmi4_data->sensor_max_x, 0, 0);
+ input_set_abs_params(prox->prox_dev, ABS_Y, 0,
+ prox->rmi4_data->sensor_max_y, 0, 0);
+ input_set_abs_params(prox->prox_dev, ABS_DISTANCE, 0,
+ HOVER_Z_MAX, 0, 0);
+
+ return;
+}
+
+static int prox_reg_init(void)
+{
+ int retval;
+ unsigned char ctrl_23_offset;
+ unsigned char data_1_offset;
+ struct synaptics_rmi4_f12_query_5 query_5;
+ struct synaptics_rmi4_f12_query_8 query_8;
+ struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ prox->query_base_addr + 5,
+ query_5.data,
+ sizeof(query_5.data));
+ if (retval < 0)
+ return retval;
+
+ ctrl_23_offset = query_5.ctrl0_is_present +
+ query_5.ctrl1_is_present +
+ query_5.ctrl2_is_present +
+ query_5.ctrl3_is_present +
+ query_5.ctrl4_is_present +
+ query_5.ctrl5_is_present +
+ query_5.ctrl6_is_present +
+ query_5.ctrl7_is_present +
+ query_5.ctrl8_is_present +
+ query_5.ctrl9_is_present +
+ query_5.ctrl10_is_present +
+ query_5.ctrl11_is_present +
+ query_5.ctrl12_is_present +
+ query_5.ctrl13_is_present +
+ query_5.ctrl14_is_present +
+ query_5.ctrl15_is_present +
+ query_5.ctrl16_is_present +
+ query_5.ctrl17_is_present +
+ query_5.ctrl18_is_present +
+ query_5.ctrl19_is_present +
+ query_5.ctrl20_is_present +
+ query_5.ctrl21_is_present +
+ query_5.ctrl22_is_present;
+
+ prox->hover_finger_en_addr = prox->control_base_addr + ctrl_23_offset;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ prox->query_base_addr + 8,
+ query_8.data,
+ sizeof(query_8.data));
+ if (retval < 0)
+ return retval;
+
+ data_1_offset = query_8.data0_is_present;
+ prox->hover_finger_data_addr = prox->data_base_addr + data_1_offset;
+
+ return retval;
+}
+
+static int prox_scan_pdt(void)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char page;
+ unsigned char intr_count = 0;
+ unsigned char intr_off;
+ unsigned char intr_src;
+ unsigned short addr;
+ struct synaptics_rmi4_fn_desc fd;
+ struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data;
+
+ for (page = 0; page < PAGES_TO_SERVICE; page++) {
+ for (addr = PDT_START; addr > PDT_END; addr -= PDT_ENTRY_SIZE) {
+ addr |= (page << 8);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ addr,
+ (unsigned char *)&fd,
+ sizeof(fd));
+ if (retval < 0)
+ return retval;
+
+ addr &= ~(MASK_8BIT << 8);
+
+ if (fd.fn_number) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Found F%02x\n",
+ __func__, fd.fn_number);
+ switch (fd.fn_number) {
+ case SYNAPTICS_RMI4_F12:
+ goto f12_found;
+ break;
+ }
+ } else {
+ break;
+ }
+
+ intr_count += fd.intr_src_count;
+ }
+ }
+
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to find F12\n",
+ __func__);
+ return -EINVAL;
+
+f12_found:
+ prox->query_base_addr = fd.query_base_addr | (page << 8);
+ prox->control_base_addr = fd.ctrl_base_addr | (page << 8);
+ prox->data_base_addr = fd.data_base_addr | (page << 8);
+ prox->command_base_addr = fd.cmd_base_addr | (page << 8);
+
+ retval = prox_reg_init();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to initialize proximity registers\n",
+ __func__);
+ return retval;
+ }
+
+ prox->intr_mask = 0;
+ intr_src = fd.intr_src_count;
+ intr_off = intr_count % 8;
+ for (ii = intr_off;
+ ii < (intr_src + intr_off);
+ ii++) {
+ prox->intr_mask |= 1 << ii;
+ }
+
+ rmi4_data->intr_mask[0] |= prox->intr_mask;
+
+ addr = rmi4_data->f01_ctrl_base_addr + 1;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ addr,
+ &(rmi4_data->intr_mask[0]),
+ sizeof(rmi4_data->intr_mask[0]));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set interrupt enable bit\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static ssize_t synaptics_rmi4_hover_finger_en_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ if (!prox)
+ return -ENODEV;
+
+ return snprintf(buf, PAGE_SIZE, "%u\n",
+ prox->hover_finger_en);
+}
+
+static ssize_t synaptics_rmi4_hover_finger_en_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data;
+
+ if (!prox)
+ return -ENODEV;
+
+ if (sscanf(buf, "%x", &input) != 1)
+ return -EINVAL;
+
+ if (input == 1)
+ prox->hover_finger_en = true;
+ else if (input == 0)
+ prox->hover_finger_en = false;
+ else
+ return -EINVAL;
+
+ retval = prox_set_hover_finger_en();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to change hovering finger enable setting\n",
+ __func__);
+ return retval;
+ }
+
+ return count;
+}
+
+int synaptics_rmi4_prox_hover_finger_en(bool enable)
+{
+ int retval;
+
+ if (!prox)
+ return -ENODEV;
+
+ prox->hover_finger_en = enable;
+
+ retval = prox_set_hover_finger_en();
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+EXPORT_SYMBOL(synaptics_rmi4_prox_hover_finger_en);
+
+static void synaptics_rmi4_prox_attn(struct synaptics_rmi4_data *rmi4_data,
+ unsigned char intr_mask)
+{
+ if (!prox)
+ return;
+
+ if (prox->intr_mask & intr_mask)
+ prox_hover_finger_report();
+
+ return;
+}
+
+static int synaptics_rmi4_prox_init(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned char attr_count;
+
+ if (prox) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Handle already exists\n",
+ __func__);
+ return 0;
+ }
+
+ prox = kzalloc(sizeof(*prox), GFP_KERNEL);
+ if (!prox) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for prox\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ prox->finger_data = kzalloc(sizeof(*(prox->finger_data)), GFP_KERNEL);
+ if (!prox->finger_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for finger_data\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit_free_prox;
+ }
+
+ prox->rmi4_data = rmi4_data;
+
+ retval = prox_scan_pdt();
+ if (retval < 0)
+ goto exit_free_finger_data;
+
+ prox->hover_finger_en = true;
+
+ retval = prox_set_hover_finger_en();
+ if (retval < 0)
+ return retval;
+
+ prox->prox_dev = input_allocate_device();
+ if (prox->prox_dev == NULL) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to allocate proximity device\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit_free_finger_data;
+ }
+
+ prox->prox_dev->name = PROXIMITY_DRIVER_NAME;
+ prox->prox_dev->phys = PROX_PHYS_NAME;
+ prox->prox_dev->id.product = SYNAPTICS_DSX_DRIVER_PRODUCT;
+ prox->prox_dev->id.version = SYNAPTICS_DSX_DRIVER_VERSION;
+ prox->prox_dev->dev.parent = rmi4_data->pdev->dev.parent;
+ input_set_drvdata(prox->prox_dev, rmi4_data);
+
+ set_bit(EV_KEY, prox->prox_dev->evbit);
+ set_bit(EV_ABS, prox->prox_dev->evbit);
+ set_bit(BTN_TOUCH, prox->prox_dev->keybit);
+ set_bit(BTN_TOOL_FINGER, prox->prox_dev->keybit);
+#ifdef INPUT_PROP_DIRECT
+ set_bit(INPUT_PROP_DIRECT, prox->prox_dev->propbit);
+#endif
+
+ prox_set_params();
+
+ retval = input_register_device(prox->prox_dev);
+ if (retval) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to register proximity device\n",
+ __func__);
+ goto exit_free_input_device;
+ }
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ goto exit_free_sysfs;
+ }
+ }
+
+ return 0;
+
+exit_free_sysfs:
+ for (attr_count--; attr_count >= 0; attr_count--) {
+ sysfs_remove_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ }
+
+ input_unregister_device(prox->prox_dev);
+ prox->prox_dev = NULL;
+
+exit_free_input_device:
+ if (prox->prox_dev)
+ input_free_device(prox->prox_dev);
+
+exit_free_finger_data:
+ kfree(prox->finger_data);
+
+exit_free_prox:
+ kfree(prox);
+ prox = NULL;
+
+exit:
+ return retval;
+}
+
+static void synaptics_rmi4_prox_remove(struct synaptics_rmi4_data *rmi4_data)
+{
+ unsigned char attr_count;
+
+ if (!prox)
+ goto exit;
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ sysfs_remove_file(&rmi4_data->input_dev->dev.kobj,
+ &attrs[attr_count].attr);
+ }
+
+ input_unregister_device(prox->prox_dev);
+ kfree(prox->finger_data);
+ kfree(prox);
+ prox = NULL;
+
+exit:
+ complete(&prox_remove_complete);
+
+ return;
+}
+
+static void synaptics_rmi4_prox_reset(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!prox) {
+ synaptics_rmi4_prox_init(rmi4_data);
+ return;
+ }
+
+ prox_hover_finger_lift();
+
+ prox_scan_pdt();
+
+ prox_set_hover_finger_en();
+
+ return;
+}
+
+static void synaptics_rmi4_prox_reinit(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!prox)
+ return;
+
+ prox_hover_finger_lift();
+
+ prox_set_hover_finger_en();
+
+ return;
+}
+
+static void synaptics_rmi4_prox_e_suspend(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!prox)
+ return;
+
+ prox_hover_finger_lift();
+
+ return;
+}
+
+static void synaptics_rmi4_prox_suspend(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!prox)
+ return;
+
+ prox_hover_finger_lift();
+
+ return;
+}
+
+static struct synaptics_rmi4_exp_fn proximity_module = {
+ .fn_type = RMI_PROXIMITY,
+ .init = synaptics_rmi4_prox_init,
+ .remove = synaptics_rmi4_prox_remove,
+ .reset = synaptics_rmi4_prox_reset,
+ .reinit = synaptics_rmi4_prox_reinit,
+ .early_suspend = synaptics_rmi4_prox_e_suspend,
+ .suspend = synaptics_rmi4_prox_suspend,
+ .resume = NULL,
+ .late_resume = NULL,
+ .attn = synaptics_rmi4_prox_attn,
+};
+
+static int __init rmi4_proximity_module_init(void)
+{
+ synaptics_rmi4_new_function_force(&proximity_module, true);
+
+ return 0;
+}
+
+static void __exit rmi4_proximity_module_exit(void)
+{
+ synaptics_rmi4_new_function_force(&proximity_module, false);
+
+ wait_for_completion(&prox_remove_complete);
+
+ return;
+}
+
+module_init(rmi4_proximity_module_init);
+module_exit(rmi4_proximity_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX Proximity Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_rmi_dev.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_rmi_dev.c
new file mode 100644
index 000000000000..ca4b8abcfc8b
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_rmi_dev.c
@@ -0,0 +1,1058 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/signal.h>
+#include <linux/sched.h>
+#include <linux/gpio.h>
+#include <linux/uaccess.h>
+#include <linux/cdev.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+
+#define CHAR_DEVICE_NAME "rmi"
+#define DEVICE_CLASS_NAME "rmidev"
+#define SYSFS_FOLDER_NAME "rmidev"
+#define DEV_NUMBER 1
+#define REG_ADDR_LIMIT 0xFFFF
+
+static ssize_t rmidev_sysfs_data_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t rmidev_sysfs_data_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static ssize_t rmidev_sysfs_open_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t rmidev_sysfs_release_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t rmidev_sysfs_attn_state_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t rmidev_sysfs_pid_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t rmidev_sysfs_pid_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t rmidev_sysfs_term_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t rmidev_sysfs_intr_mask_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t rmidev_sysfs_intr_mask_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t rmidev_sysfs_concurrent_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
+
+static ssize_t rmidev_sysfs_concurrent_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+struct rmidev_handle {
+ dev_t dev_no;
+ pid_t pid;
+ unsigned char intr_mask;
+ unsigned char *tmpbuf;
+ unsigned int tmpbuf_size;
+ struct device dev;
+ struct synaptics_rmi4_data *rmi4_data;
+ struct kobject *sysfs_dir;
+ struct siginfo interrupt_signal;
+ struct siginfo terminate_signal;
+ struct task_struct *task;
+ void *data;
+ bool concurrent;
+};
+
+struct rmidev_data {
+ int ref_count;
+ struct cdev main_dev;
+ struct class *device_class;
+ struct mutex file_mutex;
+ struct rmidev_handle *rmi_dev;
+};
+
+static struct bin_attribute attr_data = {
+ .attr = {
+ .name = "data",
+ .mode = (S_IRUGO | S_IWUGO),
+ },
+ .size = 0,
+ .read = rmidev_sysfs_data_show,
+ .write = rmidev_sysfs_data_store,
+};
+
+static struct device_attribute attrs[] = {
+ __ATTR(open, S_IWUSR,
+ synaptics_rmi4_show_error,
+ rmidev_sysfs_open_store),
+ __ATTR(release, S_IWUSR,
+ synaptics_rmi4_show_error,
+ rmidev_sysfs_release_store),
+ __ATTR(attn_state, S_IRUGO,
+ rmidev_sysfs_attn_state_show,
+ synaptics_rmi4_store_error),
+ __ATTR(pid, S_IRUGO | S_IWUSR,
+ rmidev_sysfs_pid_show,
+ rmidev_sysfs_pid_store),
+ __ATTR(term, S_IWUSR,
+ synaptics_rmi4_show_error,
+ rmidev_sysfs_term_store),
+ __ATTR(intr_mask, S_IRUGO | S_IWUSR,
+ rmidev_sysfs_intr_mask_show,
+ rmidev_sysfs_intr_mask_store),
+ __ATTR(concurrent, S_IRUGO | S_IWUSR,
+ rmidev_sysfs_concurrent_show,
+ rmidev_sysfs_concurrent_store),
+};
+
+static int rmidev_major_num;
+
+static struct class *rmidev_device_class;
+
+static struct rmidev_handle *rmidev;
+
+DECLARE_COMPLETION(rmidev_remove_complete_force);
+
+static irqreturn_t rmidev_sysfs_irq(int irq, void *data)
+{
+ struct synaptics_rmi4_data *rmi4_data = data;
+
+ sysfs_notify(&rmi4_data->input_dev->dev.kobj,
+ SYSFS_FOLDER_NAME, "attn_state");
+
+ return IRQ_HANDLED;
+}
+
+static int rmidev_sysfs_irq_enable(struct synaptics_rmi4_data *rmi4_data,
+ bool enable)
+{
+ int retval = 0;
+ unsigned char intr_status[MAX_INTR_REGISTERS];
+ unsigned long irq_flags = IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING |
+ IRQF_ONESHOT;
+
+ mutex_lock(&(rmi4_data->rmi4_irq_enable_mutex));
+
+ if (enable) {
+ if (rmi4_data->irq_enabled) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Interrupt already enabled\n",
+ __func__);
+ goto exit;
+ }
+
+ /* Clear interrupts first */
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_data_base_addr + 1,
+ intr_status,
+ rmi4_data->num_of_intr_regs);
+ if (retval < 0)
+ goto exit;
+
+ retval = request_threaded_irq(rmi4_data->irq, NULL,
+ rmidev_sysfs_irq, irq_flags,
+ PLATFORM_DRIVER_NAME, rmi4_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create irq thread\n",
+ __func__);
+ goto exit;
+ }
+
+ rmi4_data->irq_enabled = true;
+ } else {
+ if (rmi4_data->irq_enabled) {
+ disable_irq(rmi4_data->irq);
+ free_irq(rmi4_data->irq, rmi4_data);
+ rmi4_data->irq_enabled = false;
+ }
+ }
+
+exit:
+ mutex_unlock(&(rmi4_data->rmi4_irq_enable_mutex));
+
+ return retval;
+}
+
+static ssize_t rmidev_sysfs_data_show(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ unsigned char intr_status = 0;
+ unsigned int length = (unsigned int)count;
+ unsigned short address = (unsigned short)pos;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_device_info *rmi;
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ if (length > (REG_ADDR_LIMIT - address)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Out of register map limit\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ if (length) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ address,
+ (unsigned char *)buf,
+ length);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read data\n",
+ __func__);
+ return retval;
+ }
+ } else {
+ return -EINVAL;
+ }
+
+ if (!rmidev->concurrent)
+ goto exit;
+
+ if (address != rmi4_data->f01_data_base_addr)
+ goto exit;
+
+ if (length <= 1)
+ goto exit;
+
+ intr_status = buf[1];
+
+ if (!list_empty(&rmi->support_fn_list)) {
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->num_of_data_sources) {
+ if (fhandler->intr_mask & intr_status) {
+ rmi4_data->report_touch(rmi4_data,
+ fhandler);
+ }
+ }
+ }
+ }
+
+exit:
+ return length;
+}
+
+static ssize_t rmidev_sysfs_data_store(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count)
+{
+ int retval;
+ unsigned int length = (unsigned int)count;
+ unsigned short address = (unsigned short)pos;
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+
+ if (length > (REG_ADDR_LIMIT - address)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Out of register map limit\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ if (length) {
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ address,
+ (unsigned char *)buf,
+ length);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write data\n",
+ __func__);
+ return retval;
+ }
+ } else {
+ return -EINVAL;
+ }
+
+ return length;
+}
+
+static ssize_t rmidev_sysfs_open_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input != 1)
+ return -EINVAL;
+
+ if (rmi4_data->sensor_sleep) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Sensor sleeping\n",
+ __func__);
+ return -ENODEV;
+ }
+
+ rmi4_data->stay_awake = true;
+
+ rmi4_data->irq_enable(rmi4_data, false, false);
+ rmidev_sysfs_irq_enable(rmi4_data, true);
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Attention interrupt disabled\n",
+ __func__);
+
+ return count;
+}
+
+static ssize_t rmidev_sysfs_release_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input != 1)
+ return -EINVAL;
+
+ rmidev_sysfs_irq_enable(rmi4_data, false);
+
+ rmi4_data->reset_device(rmi4_data, false);
+
+ rmi4_data->stay_awake = false;
+
+ return count;
+}
+
+static ssize_t rmidev_sysfs_attn_state_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int attn_state;
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ attn_state = gpio_get_value(bdata->irq_gpio);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", attn_state);
+}
+
+static ssize_t rmidev_sysfs_pid_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", rmidev->pid);
+}
+
+static ssize_t rmidev_sysfs_pid_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ rmidev->pid = input;
+
+ if (rmidev->pid) {
+ rmidev->task = pid_task(find_vpid(rmidev->pid), PIDTYPE_PID);
+ if (!rmidev->task) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to locate PID of data logging tool\n",
+ __func__);
+ return -EINVAL;
+ }
+ }
+
+ return count;
+}
+
+static ssize_t rmidev_sysfs_term_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ if (input != 1)
+ return -EINVAL;
+
+ if (rmidev->pid)
+ send_sig_info(SIGTERM, &rmidev->terminate_signal, rmidev->task);
+
+ return count;
+}
+
+static ssize_t rmidev_sysfs_intr_mask_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "0x%02x\n", rmidev->intr_mask);
+}
+
+static ssize_t rmidev_sysfs_intr_mask_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ rmidev->intr_mask = (unsigned char)input;
+
+ return count;
+}
+
+static ssize_t rmidev_sysfs_concurrent_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%d\n", rmidev->concurrent);
+}
+
+static ssize_t rmidev_sysfs_concurrent_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+
+ if (sscanf(buf, "%u", &input) != 1)
+ return -EINVAL;
+
+ rmidev->concurrent = input > 0 ? true : false;
+
+ return count;
+}
+
+static int rmidev_allocate_buffer(int count)
+{
+ if (count + 1 > rmidev->tmpbuf_size) {
+ if (rmidev->tmpbuf_size)
+ kfree(rmidev->tmpbuf);
+ rmidev->tmpbuf = kzalloc(count + 1, GFP_KERNEL);
+ if (!rmidev->tmpbuf) {
+ dev_err(rmidev->rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for buffer\n",
+ __func__);
+ rmidev->tmpbuf_size = 0;
+ return -ENOMEM;
+ }
+ rmidev->tmpbuf_size = count + 1;
+ }
+
+ return 0;
+}
+
+/*
+ * rmidev_llseek - set register address to access for RMI device
+ *
+ * @filp: pointer to file structure
+ * @off:
+ * if whence == SEEK_SET,
+ * off: 16-bit RMI register address
+ * if whence == SEEK_CUR,
+ * off: offset from current position
+ * if whence == SEEK_END,
+ * off: offset from end position (0xFFFF)
+ * @whence: SEEK_SET, SEEK_CUR, or SEEK_END
+ */
+static loff_t rmidev_llseek(struct file *filp, loff_t off, int whence)
+{
+ loff_t newpos;
+ struct rmidev_data *dev_data = filp->private_data;
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+
+ if (IS_ERR(dev_data)) {
+ pr_err("%s: Pointer of char device data is invalid", __func__);
+ return -EBADF;
+ }
+
+ mutex_lock(&(dev_data->file_mutex));
+
+ switch (whence) {
+ case SEEK_SET:
+ newpos = off;
+ break;
+ case SEEK_CUR:
+ newpos = filp->f_pos + off;
+ break;
+ case SEEK_END:
+ newpos = REG_ADDR_LIMIT + off;
+ break;
+ default:
+ newpos = -EINVAL;
+ goto clean_up;
+ }
+
+ if (newpos < 0 || newpos > REG_ADDR_LIMIT) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: New position 0x%04x is invalid\n",
+ __func__, (unsigned int)newpos);
+ newpos = -EINVAL;
+ goto clean_up;
+ }
+
+ filp->f_pos = newpos;
+
+clean_up:
+ mutex_unlock(&(dev_data->file_mutex));
+
+ return newpos;
+}
+
+/*
+ * rmidev_read: read register data from RMI device
+ *
+ * @filp: pointer to file structure
+ * @buf: pointer to user space buffer
+ * @count: number of bytes to read
+ * @f_pos: starting RMI register address
+ */
+static ssize_t rmidev_read(struct file *filp, char __user *buf,
+ size_t count, loff_t *f_pos)
+{
+ ssize_t retval;
+ unsigned char intr_status = 0;
+ unsigned short address;
+ struct rmidev_data *dev_data = filp->private_data;
+ struct synaptics_rmi4_fn *fhandler;
+ struct synaptics_rmi4_device_info *rmi;
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+
+ rmi = &(rmi4_data->rmi4_mod_info);
+
+ if (IS_ERR(dev_data)) {
+ pr_err("%s: Pointer of char device data is invalid", __func__);
+ return -EBADF;
+ }
+
+ if (count == 0)
+ return 0;
+
+ if (count > (REG_ADDR_LIMIT - *f_pos))
+ count = REG_ADDR_LIMIT - *f_pos;
+
+ address = (unsigned short)(*f_pos);
+
+ mutex_lock(&(dev_data->file_mutex));
+
+ rmidev_allocate_buffer(count);
+
+ retval = synaptics_rmi4_reg_read(rmidev->rmi4_data,
+ *f_pos,
+ rmidev->tmpbuf,
+ count);
+ if (retval < 0)
+ goto clean_up;
+
+ if (copy_to_user(buf, rmidev->tmpbuf, count))
+ retval = -EFAULT;
+ else
+ *f_pos += retval;
+
+ if (!rmidev->concurrent)
+ goto clean_up;
+
+ if (address != rmi4_data->f01_data_base_addr)
+ goto clean_up;
+
+ if (count <= 1)
+ goto clean_up;
+
+ intr_status = rmidev->tmpbuf[1];
+
+ if (!list_empty(&rmi->support_fn_list)) {
+ list_for_each_entry(fhandler, &rmi->support_fn_list, link) {
+ if (fhandler->num_of_data_sources) {
+ if (fhandler->intr_mask & intr_status) {
+ rmi4_data->report_touch(rmi4_data,
+ fhandler);
+ }
+ }
+ }
+ }
+
+clean_up:
+ mutex_unlock(&(dev_data->file_mutex));
+
+ return retval;
+}
+
+/*
+ * rmidev_write: write register data to RMI device
+ *
+ * @filp: pointer to file structure
+ * @buf: pointer to user space buffer
+ * @count: number of bytes to write
+ * @f_pos: starting RMI register address
+ */
+static ssize_t rmidev_write(struct file *filp, const char __user *buf,
+ size_t count, loff_t *f_pos)
+{
+ ssize_t retval;
+ struct rmidev_data *dev_data = filp->private_data;
+
+ if (IS_ERR(dev_data)) {
+ pr_err("%s: Pointer of char device data is invalid", __func__);
+ return -EBADF;
+ }
+
+ if (count == 0)
+ return 0;
+
+ if (count > (REG_ADDR_LIMIT - *f_pos))
+ count = REG_ADDR_LIMIT - *f_pos;
+
+ mutex_lock(&(dev_data->file_mutex));
+
+ rmidev_allocate_buffer(count);
+
+ if (copy_from_user(rmidev->tmpbuf, buf, count)) {
+ mutex_unlock(&(dev_data->file_mutex));
+ return -EFAULT;
+ }
+
+ retval = synaptics_rmi4_reg_write(rmidev->rmi4_data,
+ *f_pos,
+ rmidev->tmpbuf,
+ count);
+ if (retval >= 0)
+ *f_pos += retval;
+
+ mutex_unlock(&(dev_data->file_mutex));
+
+ return retval;
+}
+
+static int rmidev_open(struct inode *inp, struct file *filp)
+{
+ int retval = 0;
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+ struct rmidev_data *dev_data =
+ container_of(inp->i_cdev, struct rmidev_data, main_dev);
+
+ if (!dev_data)
+ return -EACCES;
+
+ if (rmi4_data->sensor_sleep) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Sensor sleeping\n",
+ __func__);
+ return -ENODEV;
+ }
+
+ rmi4_data->stay_awake = true;
+
+ filp->private_data = dev_data;
+
+ mutex_lock(&(dev_data->file_mutex));
+
+ rmi4_data->irq_enable(rmi4_data, false, false);
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Attention interrupt disabled\n",
+ __func__);
+
+ if (dev_data->ref_count < 1)
+ dev_data->ref_count++;
+ else
+ retval = -EACCES;
+
+ mutex_unlock(&(dev_data->file_mutex));
+
+ return retval;
+}
+
+static int rmidev_release(struct inode *inp, struct file *filp)
+{
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+ struct rmidev_data *dev_data =
+ container_of(inp->i_cdev, struct rmidev_data, main_dev);
+
+ if (!dev_data)
+ return -EACCES;
+
+ mutex_lock(&(dev_data->file_mutex));
+
+ dev_data->ref_count--;
+ if (dev_data->ref_count < 0)
+ dev_data->ref_count = 0;
+
+ rmi4_data->irq_enable(rmi4_data, true, false);
+
+ rmi4_data->stay_awake = false;
+
+ mutex_unlock(&(dev_data->file_mutex));
+
+ return 0;
+}
+
+static const struct file_operations rmidev_fops = {
+ .owner = THIS_MODULE,
+ .llseek = rmidev_llseek,
+ .read = rmidev_read,
+ .write = rmidev_write,
+ .open = rmidev_open,
+ .release = rmidev_release,
+};
+
+static void rmidev_device_cleanup(struct rmidev_data *dev_data)
+{
+ dev_t devno;
+ struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data;
+
+ if (dev_data) {
+ devno = dev_data->main_dev.dev;
+
+ if (dev_data->device_class)
+ device_destroy(dev_data->device_class, devno);
+
+ cdev_del(&dev_data->main_dev);
+
+ unregister_chrdev_region(devno, 1);
+
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: rmidev device removed\n",
+ __func__);
+ }
+
+ return;
+}
+
+static char *rmi_char_devnode(struct device *dev, umode_t *mode)
+{
+ if (!mode)
+ return NULL;
+
+ *mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
+
+ return kasprintf(GFP_KERNEL, "rmi/%s", dev_name(dev));
+}
+
+static int rmidev_create_device_class(void)
+{
+ if (rmidev_device_class != NULL)
+ return 0;
+
+ rmidev_device_class = class_create(THIS_MODULE, DEVICE_CLASS_NAME);
+
+ if (IS_ERR(rmidev_device_class)) {
+ pr_err("%s: Failed to create /dev/%s\n",
+ __func__, CHAR_DEVICE_NAME);
+ return -ENODEV;
+ }
+
+ rmidev_device_class->devnode = rmi_char_devnode;
+
+ return 0;
+}
+
+static void rmidev_attn(struct synaptics_rmi4_data *rmi4_data,
+ unsigned char intr_mask)
+{
+ if (!rmidev)
+ return;
+
+ if (rmidev->pid && (rmidev->intr_mask & intr_mask))
+ send_sig_info(SIGIO, &rmidev->interrupt_signal, rmidev->task);
+
+ return;
+}
+
+static int rmidev_init_device(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ dev_t dev_no;
+ unsigned char attr_count;
+ struct rmidev_data *dev_data;
+ struct device *device_ptr;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (rmidev) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Handle already exists\n",
+ __func__);
+ return 0;
+ }
+
+ rmidev = kzalloc(sizeof(*rmidev), GFP_KERNEL);
+ if (!rmidev) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for rmidev\n",
+ __func__);
+ retval = -ENOMEM;
+ goto err_rmidev;
+ }
+
+ rmidev->rmi4_data = rmi4_data;
+
+ memset(&rmidev->interrupt_signal, 0, sizeof(rmidev->interrupt_signal));
+ rmidev->interrupt_signal.si_signo = SIGIO;
+ rmidev->interrupt_signal.si_code = SI_USER;
+
+ memset(&rmidev->terminate_signal, 0, sizeof(rmidev->terminate_signal));
+ rmidev->terminate_signal.si_signo = SIGTERM;
+ rmidev->terminate_signal.si_code = SI_USER;
+
+ retval = rmidev_create_device_class();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create device class\n",
+ __func__);
+ goto err_device_class;
+ }
+
+ if (rmidev_major_num) {
+ dev_no = MKDEV(rmidev_major_num, DEV_NUMBER);
+ retval = register_chrdev_region(dev_no, 1, CHAR_DEVICE_NAME);
+ } else {
+ retval = alloc_chrdev_region(&dev_no, 0, 1, CHAR_DEVICE_NAME);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to allocate char device region\n",
+ __func__);
+ goto err_device_region;
+ }
+
+ rmidev_major_num = MAJOR(dev_no);
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Major number of rmidev = %d\n",
+ __func__, rmidev_major_num);
+ }
+
+ dev_data = kzalloc(sizeof(*dev_data), GFP_KERNEL);
+ if (!dev_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for dev_data\n",
+ __func__);
+ retval = -ENOMEM;
+ goto err_dev_data;
+ }
+
+ mutex_init(&dev_data->file_mutex);
+ dev_data->rmi_dev = rmidev;
+ rmidev->data = dev_data;
+
+ cdev_init(&dev_data->main_dev, &rmidev_fops);
+
+ retval = cdev_add(&dev_data->main_dev, dev_no, 1);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to add rmi char device\n",
+ __func__);
+ goto err_char_device;
+ }
+
+ dev_set_name(&rmidev->dev, "rmidev%d", MINOR(dev_no));
+ dev_data->device_class = rmidev_device_class;
+
+ device_ptr = device_create(dev_data->device_class, NULL, dev_no,
+ NULL, CHAR_DEVICE_NAME"%d", MINOR(dev_no));
+ if (IS_ERR(device_ptr)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create rmi char device\n",
+ __func__);
+ retval = -ENODEV;
+ goto err_char_device;
+ }
+
+ retval = gpio_export(bdata->irq_gpio, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to export attention gpio\n",
+ __func__);
+ } else {
+ retval = gpio_export_link(&(rmi4_data->input_dev->dev),
+ "attn", bdata->irq_gpio);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s Failed to create gpio symlink\n",
+ __func__);
+ } else {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Exported attention gpio %d\n",
+ __func__, bdata->irq_gpio);
+ }
+ }
+
+ rmidev->sysfs_dir = kobject_create_and_add(SYSFS_FOLDER_NAME,
+ &rmi4_data->input_dev->dev.kobj);
+ if (!rmidev->sysfs_dir) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs directory\n",
+ __func__);
+ retval = -ENODEV;
+ goto err_sysfs_dir;
+ }
+
+ retval = sysfs_create_bin_file(rmidev->sysfs_dir,
+ &attr_data);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs bin file\n",
+ __func__);
+ goto err_sysfs_bin;
+ }
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ retval = sysfs_create_file(rmidev->sysfs_dir,
+ &attrs[attr_count].attr);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ retval = -ENODEV;
+ goto err_sysfs_attrs;
+ }
+ }
+
+ return 0;
+
+err_sysfs_attrs:
+ for (attr_count--; attr_count >= 0; attr_count--)
+ sysfs_remove_file(rmidev->sysfs_dir, &attrs[attr_count].attr);
+
+ sysfs_remove_bin_file(rmidev->sysfs_dir, &attr_data);
+
+err_sysfs_bin:
+ kobject_put(rmidev->sysfs_dir);
+
+err_sysfs_dir:
+err_char_device:
+ rmidev_device_cleanup(dev_data);
+ kfree(dev_data);
+
+err_dev_data:
+ unregister_chrdev_region(dev_no, 1);
+
+err_device_region:
+ if (rmidev_device_class != NULL) {
+ class_destroy(rmidev_device_class);
+ rmidev_device_class = NULL;
+ }
+
+err_device_class:
+ kfree(rmidev);
+ rmidev = NULL;
+
+err_rmidev:
+ return retval;
+}
+
+static void rmidev_remove_device(struct synaptics_rmi4_data *rmi4_data)
+{
+ unsigned char attr_count;
+ struct rmidev_data *dev_data;
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ if (!rmidev)
+ goto exit;
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++)
+ sysfs_remove_file(rmidev->sysfs_dir, &attrs[attr_count].attr);
+
+ sysfs_remove_bin_file(rmidev->sysfs_dir, &attr_data);
+
+ kobject_put(rmidev->sysfs_dir);
+
+ gpio_unexport(bdata->irq_gpio);
+
+ dev_data = rmidev->data;
+ if (dev_data) {
+ rmidev_device_cleanup(dev_data);
+ kfree(dev_data);
+ }
+
+ unregister_chrdev_region(rmidev->dev_no, 1);
+
+ if (rmidev_device_class != NULL) {
+ class_destroy(rmidev_device_class);
+ rmidev_device_class = NULL;
+ }
+
+ kfree(rmidev->tmpbuf);
+
+ kfree(rmidev);
+ rmidev = NULL;
+
+exit:
+ complete(&rmidev_remove_complete_force);
+
+ return;
+}
+
+static struct synaptics_rmi4_exp_fn rmidev_module = {
+ .fn_type = RMI_DEV,
+ .init = rmidev_init_device,
+ .remove = rmidev_remove_device,
+ .reset = NULL,
+ .reinit = NULL,
+ .early_suspend = NULL,
+ .suspend = NULL,
+ .resume = NULL,
+ .late_resume = NULL,
+ .attn = rmidev_attn,
+};
+
+static int __init rmidev_module_init(void)
+{
+ synaptics_rmi4_new_function_force(&rmidev_module, true);
+
+ return 0;
+}
+
+static void __exit rmidev_module_exit(void)
+{
+ synaptics_rmi4_new_function_force(&rmidev_module, false);
+
+ wait_for_completion(&rmidev_remove_complete_force);
+
+ return;
+}
+
+module_init(rmidev_module_init);
+module_exit(rmidev_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX RMI Dev Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_rmi_hid_i2c.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_rmi_hid_i2c.c
new file mode 100644
index 000000000000..91e18ddb1ee7
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_rmi_hid_i2c.c
@@ -0,0 +1,1004 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/i2c.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/gpio.h>
+#include <linux/types.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+
+#define SYN_I2C_RETRY_TIMES 10
+
+#define REPORT_ID_GET_BLOB 0x07
+#define REPORT_ID_WRITE 0x09
+#define REPORT_ID_READ_ADDRESS 0x0a
+#define REPORT_ID_READ_DATA 0x0b
+#define REPORT_ID_SET_RMI_MODE 0x0f
+
+#define PREFIX_USAGE_PAGE_1BYTE 0x05
+#define PREFIX_USAGE_PAGE_2BYTES 0x06
+#define PREFIX_USAGE 0x09
+#define PREFIX_REPORT_ID 0x85
+#define PREFIX_REPORT_COUNT_1BYTE 0x95
+#define PREFIX_REPORT_COUNT_2BYTES 0x96
+
+#define USAGE_GET_BLOB 0xc5
+#define USAGE_WRITE 0x02
+#define USAGE_READ_ADDRESS 0x03
+#define USAGE_READ_DATA 0x04
+#define USAGE_SET_MODE 0x06
+
+#define FEATURE_REPORT_TYPE 0x03
+
+#define VENDOR_DEFINED_PAGE 0xff00
+
+#define BLOB_REPORT_SIZE 256
+
+#define RESET_COMMAND 0x01
+#define GET_REPORT_COMMAND 0x02
+#define SET_REPORT_COMMAND 0x03
+#define SET_POWER_COMMAND 0x08
+
+#define FINGER_MODE 0x00
+#define RMI_MODE 0x02
+
+struct hid_report_info {
+ unsigned char get_blob_id;
+ unsigned char write_id;
+ unsigned char read_addr_id;
+ unsigned char read_data_id;
+ unsigned char set_mode_id;
+ unsigned int blob_size;
+};
+
+static struct hid_report_info hid_report;
+
+struct hid_device_descriptor {
+ unsigned short device_descriptor_length;
+ unsigned short format_version;
+ unsigned short report_descriptor_length;
+ unsigned short report_descriptor_index;
+ unsigned short input_register_index;
+ unsigned short input_report_max_length;
+ unsigned short output_register_index;
+ unsigned short output_report_max_length;
+ unsigned short command_register_index;
+ unsigned short data_register_index;
+ unsigned short vendor_id;
+ unsigned short product_id;
+ unsigned short version_id;
+ unsigned int reserved;
+};
+
+static struct hid_device_descriptor hid_dd;
+
+struct i2c_rw_buffer {
+ unsigned char *read;
+ unsigned char *write;
+ unsigned short read_size;
+ unsigned short write_size;
+};
+
+static struct i2c_rw_buffer buffer;
+
+#ifdef CONFIG_OF
+static int parse_dt(struct device *dev, struct synaptics_dsx_board_data *bdata)
+{
+ int retval;
+ u32 value;
+ const char *name;
+ struct property *prop;
+ struct device_node *np = dev->of_node;
+
+ bdata->irq_gpio = of_get_named_gpio_flags(np,
+ "synaptics,irq-gpio", 0,
+ (enum of_gpio_flags *)&bdata->irq_flags);
+
+ retval = of_property_read_u32(np, "synaptics,irq-on-state",
+ &value);
+ if (retval < 0)
+ bdata->irq_on_state = 0;
+ else
+ bdata->irq_on_state = value;
+
+ retval = of_property_read_string(np, "synaptics,pwr-reg-name", &name);
+ if (retval < 0)
+ bdata->pwr_reg_name = NULL;
+ else
+ bdata->pwr_reg_name = name;
+
+ retval = of_property_read_string(np, "synaptics,bus-reg-name", &name);
+ if (retval < 0)
+ bdata->bus_reg_name = NULL;
+ else
+ bdata->bus_reg_name = name;
+
+ prop = of_find_property(np, "synaptics,power-gpio", NULL);
+ if (prop && prop->length) {
+ bdata->power_gpio = of_get_named_gpio_flags(np,
+ "synaptics,power-gpio", 0, NULL);
+ retval = of_property_read_u32(np, "synaptics,power-on-state",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,power-on-state property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->power_on_state = value;
+ }
+ } else {
+ bdata->power_gpio = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,power-delay-ms", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,power-delay-ms",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,power-delay-ms property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->power_delay_ms = value;
+ }
+ } else {
+ bdata->power_delay_ms = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-gpio", NULL);
+ if (prop && prop->length) {
+ bdata->reset_gpio = of_get_named_gpio_flags(np,
+ "synaptics,reset-gpio", 0, NULL);
+ retval = of_property_read_u32(np, "synaptics,reset-on-state",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,reset-on-state property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->reset_on_state = value;
+ }
+ retval = of_property_read_u32(np, "synaptics,reset-active-ms",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,reset-active-ms property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->reset_active_ms = value;
+ }
+ } else {
+ bdata->reset_gpio = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-delay-ms", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,reset-delay-ms",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,reset-delay-ms property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->reset_delay_ms = value;
+ }
+ } else {
+ bdata->reset_delay_ms = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,dev-dscrptr-addr", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,dev-dscrptr-addr",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,dev-dscrptr-addr property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->device_descriptor_addr = (unsigned short)value;
+ }
+ } else {
+ bdata->device_descriptor_addr = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,max-y-for-2d", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,max-y-for-2d",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,max-y-for-2d property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->max_y_for_2d = value;
+ }
+ } else {
+ bdata->max_y_for_2d = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,swap-axes", NULL);
+ bdata->swap_axes = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,x-flip", NULL);
+ bdata->x_flip = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,y-flip", NULL);
+ bdata->y_flip = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,ub-i2c-addr", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,ub-i2c-addr",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,ub-i2c-addr property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->ub_i2c_addr = (unsigned short)value;
+ }
+ } else {
+ bdata->ub_i2c_addr = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,cap-button-codes", NULL);
+ if (prop && prop->length) {
+ bdata->cap_button_map->map = devm_kzalloc(dev,
+ prop->length,
+ GFP_KERNEL);
+ if (!bdata->cap_button_map->map)
+ return -ENOMEM;
+ bdata->cap_button_map->nbuttons = prop->length / sizeof(u32);
+ retval = of_property_read_u32_array(np,
+ "synaptics,cap-button-codes",
+ bdata->cap_button_map->map,
+ bdata->cap_button_map->nbuttons);
+ if (retval < 0) {
+ bdata->cap_button_map->nbuttons = 0;
+ bdata->cap_button_map->map = NULL;
+ }
+ } else {
+ bdata->cap_button_map->nbuttons = 0;
+ bdata->cap_button_map->map = NULL;
+ }
+
+ prop = of_find_property(np, "synaptics,vir-button-codes", NULL);
+ if (prop && prop->length) {
+ bdata->vir_button_map->map = devm_kzalloc(dev,
+ prop->length,
+ GFP_KERNEL);
+ if (!bdata->vir_button_map->map)
+ return -ENOMEM;
+ bdata->vir_button_map->nbuttons = prop->length / sizeof(u32);
+ bdata->vir_button_map->nbuttons /= 5;
+ retval = of_property_read_u32_array(np,
+ "synaptics,vir-button-codes",
+ bdata->vir_button_map->map,
+ bdata->vir_button_map->nbuttons * 5);
+ if (retval < 0) {
+ bdata->vir_button_map->nbuttons = 0;
+ bdata->vir_button_map->map = NULL;
+ }
+ } else {
+ bdata->vir_button_map->nbuttons = 0;
+ bdata->vir_button_map->map = NULL;
+ }
+
+ return 0;
+}
+#endif
+
+static int do_i2c_transfer(struct i2c_client *client, struct i2c_msg *msg)
+{
+ unsigned char retry;
+
+ for (retry = 0; retry < SYN_I2C_RETRY_TIMES; retry++) {
+ if (i2c_transfer(client->adapter, msg, 1) == 1)
+ break;
+ dev_err(&client->dev,
+ "%s: I2C retry %d\n",
+ __func__, retry + 1);
+ msleep(20);
+ }
+
+ if (retry == SYN_I2C_RETRY_TIMES) {
+ dev_err(&client->dev,
+ "%s: I2C transfer over retry limit\n",
+ __func__);
+ return -EIO;
+ }
+
+ return 0;
+}
+
+static int check_buffer(unsigned char **buffer, unsigned short *buffer_size,
+ unsigned short length)
+{
+ if (*buffer_size < length) {
+ if (*buffer_size)
+ kfree(*buffer);
+ *buffer = kzalloc(length, GFP_KERNEL);
+ if (!(*buffer))
+ return -ENOMEM;
+ *buffer_size = length;
+ }
+
+ return 0;
+}
+
+static int generic_read(struct i2c_client *client, unsigned short length)
+{
+ int retval;
+ struct i2c_msg msg[] = {
+ {
+ .addr = client->addr,
+ .flags = I2C_M_RD,
+ .len = length,
+ }
+ };
+
+ check_buffer(&buffer.read, &buffer.read_size, length);
+ msg[0].buf = buffer.read;
+
+ retval = do_i2c_transfer(client, msg);
+
+ return retval;
+}
+
+static int generic_write(struct i2c_client *client, unsigned short length)
+{
+ int retval;
+ struct i2c_msg msg[] = {
+ {
+ .addr = client->addr,
+ .flags = 0,
+ .len = length,
+ .buf = buffer.write,
+ }
+ };
+
+ retval = do_i2c_transfer(client, msg);
+
+ return retval;
+}
+
+static void traverse_report_descriptor(unsigned int *index)
+{
+ unsigned char size;
+ unsigned char *buf = buffer.read;
+
+ size = buf[*index] & MASK_2BIT;
+ switch (size) {
+ case 0: /* 0 bytes */
+ *index += 1;
+ break;
+ case 1: /* 1 byte */
+ *index += 2;
+ break;
+ case 2: /* 2 bytes */
+ *index += 3;
+ break;
+ case 3: /* 4 bytes */
+ *index += 5;
+ break;
+ default:
+ break;
+ }
+
+ return;
+}
+
+static void find_blob_size(unsigned int index)
+{
+ unsigned int ii = index;
+ unsigned char *buf = buffer.read;
+
+ while (ii < hid_dd.report_descriptor_length) {
+ if (buf[ii] == PREFIX_REPORT_COUNT_1BYTE) {
+ hid_report.blob_size = buf[ii + 1];
+ return;
+ } else if (buf[ii] == PREFIX_REPORT_COUNT_2BYTES) {
+ hid_report.blob_size = buf[ii + 1] | (buf[ii + 2] << 8);
+ return;
+ }
+ traverse_report_descriptor(&ii);
+ }
+
+ return;
+}
+
+static void find_reports(unsigned int index)
+{
+ unsigned int ii = index;
+ unsigned char *buf = buffer.read;
+ static unsigned int report_id_index;
+ static unsigned char report_id;
+ static unsigned short usage_page;
+
+ if (buf[ii] == PREFIX_REPORT_ID) {
+ report_id = buf[ii + 1];
+ report_id_index = ii;
+ return;
+ }
+
+ if (buf[ii] == PREFIX_USAGE_PAGE_1BYTE) {
+ usage_page = buf[ii + 1];
+ return;
+ } else if (buf[ii] == PREFIX_USAGE_PAGE_2BYTES) {
+ usage_page = buf[ii + 1] | (buf[ii + 2] << 8);
+ return;
+ }
+
+ if ((usage_page == VENDOR_DEFINED_PAGE) && (buf[ii] == PREFIX_USAGE)) {
+ switch (buf[ii + 1]) {
+ case USAGE_GET_BLOB:
+ hid_report.get_blob_id = report_id;
+ find_blob_size(report_id_index);
+ break;
+ case USAGE_WRITE:
+ hid_report.write_id = report_id;
+ break;
+ case USAGE_READ_ADDRESS:
+ hid_report.read_addr_id = report_id;
+ break;
+ case USAGE_READ_DATA:
+ hid_report.read_data_id = report_id;
+ break;
+ case USAGE_SET_MODE:
+ hid_report.set_mode_id = report_id;
+ break;
+ default:
+ break;
+ }
+ }
+
+ return;
+}
+
+static int parse_report_descriptor(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned int ii = 0;
+ unsigned char *buf;
+ struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent);
+
+ buffer.write[0] = hid_dd.report_descriptor_index & MASK_8BIT;
+ buffer.write[1] = hid_dd.report_descriptor_index >> 8;
+ retval = generic_write(i2c, 2);
+ if (retval < 0)
+ return retval;
+ retval = generic_read(i2c, hid_dd.report_descriptor_length);
+ if (retval < 0)
+ return retval;
+
+ buf = buffer.read;
+
+ hid_report.get_blob_id = REPORT_ID_GET_BLOB;
+ hid_report.write_id = REPORT_ID_WRITE;
+ hid_report.read_addr_id = REPORT_ID_READ_ADDRESS;
+ hid_report.read_data_id = REPORT_ID_READ_DATA;
+ hid_report.set_mode_id = REPORT_ID_SET_RMI_MODE;
+ hid_report.blob_size = BLOB_REPORT_SIZE;
+
+ while (ii < hid_dd.report_descriptor_length) {
+ find_reports(ii);
+ traverse_report_descriptor(&ii);
+ }
+
+ return 0;
+}
+
+static int switch_to_rmi(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent);
+
+ mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ check_buffer(&buffer.write, &buffer.write_size, 11);
+
+ /* set rmi mode */
+ buffer.write[0] = hid_dd.command_register_index & MASK_8BIT;
+ buffer.write[1] = hid_dd.command_register_index >> 8;
+ buffer.write[2] = (FEATURE_REPORT_TYPE << 4) | hid_report.set_mode_id;
+ buffer.write[3] = SET_REPORT_COMMAND;
+ buffer.write[4] = hid_report.set_mode_id;
+ buffer.write[5] = hid_dd.data_register_index & MASK_8BIT;
+ buffer.write[6] = hid_dd.data_register_index >> 8;
+ buffer.write[7] = 0x04;
+ buffer.write[8] = 0x00;
+ buffer.write[9] = hid_report.set_mode_id;
+ buffer.write[10] = RMI_MODE;
+
+ retval = generic_write(i2c, 11);
+
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ return retval;
+}
+
+static int check_report_mode(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned short report_size;
+ struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent);
+
+ mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ check_buffer(&buffer.write, &buffer.write_size, 7);
+
+ buffer.write[0] = hid_dd.command_register_index & MASK_8BIT;
+ buffer.write[1] = hid_dd.command_register_index >> 8;
+ buffer.write[2] = (FEATURE_REPORT_TYPE << 4) | hid_report.set_mode_id;
+ buffer.write[3] = GET_REPORT_COMMAND;
+ buffer.write[4] = hid_report.set_mode_id;
+ buffer.write[5] = hid_dd.data_register_index & MASK_8BIT;
+ buffer.write[6] = hid_dd.data_register_index >> 8;
+
+ retval = generic_write(i2c, 7);
+ if (retval < 0)
+ goto exit;
+
+ retval = generic_read(i2c, 2);
+ if (retval < 0)
+ goto exit;
+
+ report_size = (buffer.read[1] << 8) | buffer.read[0];
+
+ retval = generic_write(i2c, 7);
+ if (retval < 0)
+ goto exit;
+
+ retval = generic_read(i2c, report_size);
+ if (retval < 0)
+ goto exit;
+
+ retval = buffer.read[3];
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Report mode = %d\n",
+ __func__, retval);
+
+exit:
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ return retval;
+}
+
+static int hid_i2c_init(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent);
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ check_buffer(&buffer.write, &buffer.write_size, 6);
+
+ /* read device descriptor */
+ buffer.write[0] = bdata->device_descriptor_addr & MASK_8BIT;
+ buffer.write[1] = bdata->device_descriptor_addr >> 8;
+ retval = generic_write(i2c, 2);
+ if (retval < 0)
+ goto exit;
+ retval = generic_read(i2c, sizeof(hid_dd));
+ if (retval < 0)
+ goto exit;
+ retval = secure_memcpy((unsigned char *)&hid_dd,
+ sizeof(struct hid_device_descriptor),
+ buffer.read,
+ buffer.read_size,
+ sizeof(hid_dd));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy device descriptor data\n",
+ __func__);
+ goto exit;
+ }
+
+ retval = parse_report_descriptor(rmi4_data);
+ if (retval < 0)
+ goto exit;
+
+ /* set power */
+ buffer.write[0] = hid_dd.command_register_index & MASK_8BIT;
+ buffer.write[1] = hid_dd.command_register_index >> 8;
+ buffer.write[2] = 0x00;
+ buffer.write[3] = SET_POWER_COMMAND;
+ retval = generic_write(i2c, 4);
+ if (retval < 0)
+ goto exit;
+
+ /* reset */
+ buffer.write[0] = hid_dd.command_register_index & MASK_8BIT;
+ buffer.write[1] = hid_dd.command_register_index >> 8;
+ buffer.write[2] = 0x00;
+ buffer.write[3] = RESET_COMMAND;
+ retval = generic_write(i2c, 4);
+ if (retval < 0)
+ goto exit;
+
+ while (gpio_get_value(bdata->irq_gpio))
+ msleep(20);
+
+ retval = generic_read(i2c, hid_dd.input_report_max_length);
+ if (retval < 0)
+ goto exit;
+
+ /* get blob */
+ buffer.write[0] = hid_dd.command_register_index & MASK_8BIT;
+ buffer.write[1] = hid_dd.command_register_index >> 8;
+ buffer.write[2] = (FEATURE_REPORT_TYPE << 4) | hid_report.get_blob_id;
+ buffer.write[3] = 0x02;
+ buffer.write[4] = hid_dd.data_register_index & MASK_8BIT;
+ buffer.write[5] = hid_dd.data_register_index >> 8;
+
+ retval = generic_write(i2c, 6);
+ if (retval < 0)
+ goto exit;
+
+ msleep(20);
+
+ retval = generic_read(i2c, hid_report.blob_size + 3);
+ if (retval < 0)
+ goto exit;
+
+exit:
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to initialize HID/I2C interface\n",
+ __func__);
+ return retval;
+ }
+
+ retval = switch_to_rmi(rmi4_data);
+
+ return retval;
+}
+
+static int synaptics_rmi4_i2c_read(struct synaptics_rmi4_data *rmi4_data,
+ unsigned short addr, unsigned char *data, unsigned short length)
+{
+ int retval;
+ unsigned char retry;
+ unsigned char recover = 1;
+ unsigned short report_length;
+ struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent);
+ struct i2c_msg msg[] = {
+ {
+ .addr = i2c->addr,
+ .flags = 0,
+ .len = hid_dd.output_report_max_length + 2,
+ },
+ {
+ .addr = i2c->addr,
+ .flags = I2C_M_RD,
+ .len = length + 4,
+ },
+ };
+
+recover:
+ mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ check_buffer(&buffer.write, &buffer.write_size,
+ hid_dd.output_report_max_length + 2);
+ msg[0].buf = buffer.write;
+ buffer.write[0] = hid_dd.output_register_index & MASK_8BIT;
+ buffer.write[1] = hid_dd.output_register_index >> 8;
+ buffer.write[2] = hid_dd.output_report_max_length & MASK_8BIT;
+ buffer.write[3] = hid_dd.output_report_max_length >> 8;
+ buffer.write[4] = hid_report.read_addr_id;
+ buffer.write[5] = 0x00;
+ buffer.write[6] = addr & MASK_8BIT;
+ buffer.write[7] = addr >> 8;
+ buffer.write[8] = length & MASK_8BIT;
+ buffer.write[9] = length >> 8;
+
+ check_buffer(&buffer.read, &buffer.read_size, length + 4);
+ msg[1].buf = buffer.read;
+
+ retval = do_i2c_transfer(i2c, &msg[0]);
+ if (retval != 0)
+ goto exit;
+
+ retry = 0;
+ do {
+ retval = do_i2c_transfer(i2c, &msg[1]);
+ if (retval == 0)
+ retval = length;
+ else
+ goto exit;
+
+ report_length = (buffer.read[1] << 8) | buffer.read[0];
+ if (report_length == hid_dd.input_report_max_length) {
+ retval = secure_memcpy(&data[0], length,
+ &buffer.read[4], buffer.read_size - 4,
+ length);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy data\n",
+ __func__);
+ } else {
+ retval = length;
+ }
+ goto exit;
+ }
+
+ msleep(20);
+ retry++;
+ } while (retry < SYN_I2C_RETRY_TIMES);
+
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to receive read report\n",
+ __func__);
+ retval = -EIO;
+
+exit:
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ if ((retval != length) && (recover == 1)) {
+ recover = 0;
+ if (check_report_mode(rmi4_data) != RMI_MODE) {
+ retval = hid_i2c_init(rmi4_data);
+ if (retval == 0)
+ goto recover;
+ }
+ }
+
+ return retval;
+}
+
+static int synaptics_rmi4_i2c_write(struct synaptics_rmi4_data *rmi4_data,
+ unsigned short addr, unsigned char *data, unsigned short length)
+{
+ int retval;
+ unsigned char recover = 1;
+ unsigned char msg_length;
+ struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent);
+ struct i2c_msg msg[] = {
+ {
+ .addr = i2c->addr,
+ .flags = 0,
+ }
+ };
+
+ if ((length + 10) < (hid_dd.output_report_max_length + 2))
+ msg_length = hid_dd.output_report_max_length + 2;
+ else
+ msg_length = length + 10;
+
+recover:
+ mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ check_buffer(&buffer.write, &buffer.write_size, msg_length);
+ msg[0].len = msg_length;
+ msg[0].buf = buffer.write;
+ buffer.write[0] = hid_dd.output_register_index & MASK_8BIT;
+ buffer.write[1] = hid_dd.output_register_index >> 8;
+ buffer.write[2] = hid_dd.output_report_max_length & MASK_8BIT;
+ buffer.write[3] = hid_dd.output_report_max_length >> 8;
+ buffer.write[4] = hid_report.write_id;
+ buffer.write[5] = 0x00;
+ buffer.write[6] = addr & MASK_8BIT;
+ buffer.write[7] = addr >> 8;
+ buffer.write[8] = length & MASK_8BIT;
+ buffer.write[9] = length >> 8;
+ retval = secure_memcpy(&buffer.write[10], buffer.write_size - 10,
+ &data[0], length, length);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy data\n",
+ __func__);
+ } else {
+ retval = do_i2c_transfer(i2c, msg);
+ if (retval == 0)
+ retval = length;
+ }
+
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ if ((retval != length) && (recover == 1)) {
+ recover = 0;
+ if (check_report_mode(rmi4_data) != RMI_MODE) {
+ retval = hid_i2c_init(rmi4_data);
+ if (retval == 0)
+ goto recover;
+ }
+ }
+
+ return retval;
+}
+
+static struct synaptics_dsx_bus_access bus_access = {
+ .type = BUS_I2C,
+ .read = synaptics_rmi4_i2c_read,
+ .write = synaptics_rmi4_i2c_write,
+};
+
+static struct synaptics_dsx_hw_interface hw_if;
+
+static struct platform_device *synaptics_dsx_i2c_device;
+
+static void synaptics_rmi4_i2c_dev_release(struct device *dev)
+{
+ kfree(synaptics_dsx_i2c_device);
+
+ return;
+}
+
+static int synaptics_rmi4_i2c_probe(struct i2c_client *client,
+ const struct i2c_device_id *dev_id)
+{
+ int retval;
+
+ if (!i2c_check_functionality(client->adapter,
+ I2C_FUNC_SMBUS_BYTE_DATA)) {
+ dev_err(&client->dev,
+ "%s: SMBus byte data commands not supported by host\n",
+ __func__);
+ return -EIO;
+ }
+
+ synaptics_dsx_i2c_device = kzalloc(
+ sizeof(struct platform_device),
+ GFP_KERNEL);
+ if (!synaptics_dsx_i2c_device) {
+ dev_err(&client->dev,
+ "%s: Failed to allocate memory for synaptics_dsx_i2c_device\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+#ifdef CONFIG_OF
+ if (client->dev.of_node) {
+ hw_if.board_data = devm_kzalloc(&client->dev,
+ sizeof(struct synaptics_dsx_board_data),
+ GFP_KERNEL);
+ if (!hw_if.board_data) {
+ dev_err(&client->dev,
+ "%s: Failed to allocate memory for board data\n",
+ __func__);
+ return -ENOMEM;
+ }
+ hw_if.board_data->cap_button_map = devm_kzalloc(&client->dev,
+ sizeof(struct synaptics_dsx_button_map),
+ GFP_KERNEL);
+ if (!hw_if.board_data->cap_button_map) {
+ dev_err(&client->dev,
+ "%s: Failed to allocate memory for 0D button map\n",
+ __func__);
+ return -ENOMEM;
+ }
+ hw_if.board_data->vir_button_map = devm_kzalloc(&client->dev,
+ sizeof(struct synaptics_dsx_button_map),
+ GFP_KERNEL);
+ if (!hw_if.board_data->vir_button_map) {
+ dev_err(&client->dev,
+ "%s: Failed to allocate memory for virtual button map\n",
+ __func__);
+ return -ENOMEM;
+ }
+ parse_dt(&client->dev, hw_if.board_data);
+ }
+#else
+ hw_if.board_data = client->dev.platform_data;
+#endif
+
+ hw_if.bus_access = &bus_access;
+ hw_if.bl_hw_init = switch_to_rmi;
+ hw_if.ui_hw_init = hid_i2c_init;
+
+ synaptics_dsx_i2c_device->name = PLATFORM_DRIVER_NAME;
+ synaptics_dsx_i2c_device->id = 0;
+ synaptics_dsx_i2c_device->num_resources = 0;
+ synaptics_dsx_i2c_device->dev.parent = &client->dev;
+ synaptics_dsx_i2c_device->dev.platform_data = &hw_if;
+ synaptics_dsx_i2c_device->dev.release = synaptics_rmi4_i2c_dev_release;
+
+ retval = platform_device_register(synaptics_dsx_i2c_device);
+ if (retval) {
+ dev_err(&client->dev,
+ "%s: Failed to register platform device\n",
+ __func__);
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
+static int synaptics_rmi4_i2c_remove(struct i2c_client *client)
+{
+ if (buffer.read_size)
+ kfree(buffer.read);
+
+ if (buffer.write_size)
+ kfree(buffer.write);
+
+ platform_device_unregister(synaptics_dsx_i2c_device);
+
+ return 0;
+}
+
+static const struct i2c_device_id synaptics_rmi4_id_table[] = {
+ {I2C_DRIVER_NAME, 0},
+ {},
+};
+MODULE_DEVICE_TABLE(i2c, synaptics_rmi4_id_table);
+
+#ifdef CONFIG_OF
+static struct of_device_id synaptics_rmi4_of_match_table[] = {
+ {
+ .compatible = "synaptics,dsx-rmi-hid-i2c",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, synaptics_rmi4_of_match_table);
+#else
+#define synaptics_rmi4_of_match_table NULL
+#endif
+
+static struct i2c_driver synaptics_rmi4_i2c_driver = {
+ .driver = {
+ .name = I2C_DRIVER_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = synaptics_rmi4_of_match_table,
+ },
+ .probe = synaptics_rmi4_i2c_probe,
+ .remove = synaptics_rmi4_i2c_remove,
+ .id_table = synaptics_rmi4_id_table,
+};
+
+int synaptics_rmi4_bus_init_force(void)
+{
+ return i2c_add_driver(&synaptics_rmi4_i2c_driver);
+}
+
+void synaptics_rmi4_bus_exit_force(void)
+{
+ i2c_del_driver(&synaptics_rmi4_i2c_driver);
+
+ return;
+}
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX I2C Bus Support Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_spi.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_spi.c
new file mode 100644
index 000000000000..b682fecd972c
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_spi.c
@@ -0,0 +1,710 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/spi/spi.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/types.h>
+#include <linux/of_gpio.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+
+#define SPI_READ 0x80
+#define SPI_WRITE 0x00
+
+static unsigned char *buf;
+
+static struct spi_transfer *xfer;
+
+#ifdef CONFIG_OF
+static int parse_dt(struct device *dev, struct synaptics_dsx_board_data *bdata)
+{
+ int retval;
+ u32 value;
+ const char *name;
+ struct property *prop;
+ struct device_node *np = dev->of_node;
+
+ bdata->irq_gpio = of_get_named_gpio_flags(np,
+ "synaptics,irq-gpio", 0,
+ (enum of_gpio_flags *)&bdata->irq_flags);
+
+ retval = of_property_read_u32(np, "synaptics,irq-on-state",
+ &value);
+ if (retval < 0)
+ bdata->irq_on_state = 0;
+ else
+ bdata->irq_on_state = value;
+
+ retval = of_property_read_string(np, "synaptics,pwr-reg-name", &name);
+ if (retval < 0)
+ bdata->pwr_reg_name = NULL;
+ else
+ bdata->pwr_reg_name = name;
+
+ retval = of_property_read_string(np, "synaptics,bus-reg-name", &name);
+ if (retval < 0)
+ bdata->bus_reg_name = NULL;
+ else
+ bdata->bus_reg_name = name;
+
+ prop = of_find_property(np, "synaptics,power-gpio", NULL);
+ if (prop && prop->length) {
+ bdata->power_gpio = of_get_named_gpio_flags(np,
+ "synaptics,power-gpio", 0, NULL);
+ retval = of_property_read_u32(np, "synaptics,power-on-state",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,power-on-state property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->power_on_state = value;
+ }
+ } else {
+ bdata->power_gpio = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,power-delay-ms", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,power-delay-ms",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,power-delay-ms property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->power_delay_ms = value;
+ }
+ } else {
+ bdata->power_delay_ms = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-gpio", NULL);
+ if (prop && prop->length) {
+ bdata->reset_gpio = of_get_named_gpio_flags(np,
+ "synaptics,reset-gpio", 0, NULL);
+ retval = of_property_read_u32(np, "synaptics,reset-on-state",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,reset-on-state property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->reset_on_state = value;
+ }
+ retval = of_property_read_u32(np, "synaptics,reset-active-ms",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,reset-active-ms property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->reset_active_ms = value;
+ }
+ } else {
+ bdata->reset_gpio = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,reset-delay-ms", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,reset-delay-ms",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,reset-delay-ms property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->reset_delay_ms = value;
+ }
+ } else {
+ bdata->reset_delay_ms = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,byte-delay-us", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,byte-delay-us",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,byte-delay-us property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->byte_delay_us = value;
+ }
+ } else {
+ bdata->byte_delay_us = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,block-delay-us", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,block-delay-us",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,block-delay-us property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->block_delay_us = value;
+ }
+ } else {
+ bdata->block_delay_us = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,address-delay-us", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,address-delay-us",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,address-delay-us property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->addr_delay_us = value;
+ }
+ } else {
+ bdata->addr_delay_us = 0;
+ }
+
+ prop = of_find_property(np, "synaptics,max-y-for-2d", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,max-y-for-2d",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,max-y-for-2d property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->max_y_for_2d = value;
+ }
+ } else {
+ bdata->max_y_for_2d = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,swap-axes", NULL);
+ bdata->swap_axes = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,x-flip", NULL);
+ bdata->x_flip = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,y-flip", NULL);
+ bdata->y_flip = prop > 0 ? true : false;
+
+ prop = of_find_property(np, "synaptics,ub-i2c-addr", NULL);
+ if (prop && prop->length) {
+ retval = of_property_read_u32(np, "synaptics,ub-i2c-addr",
+ &value);
+ if (retval < 0) {
+ dev_err(dev, "%s: Unable to read synaptics,ub-i2c-addr property\n",
+ __func__);
+ return retval;
+ } else {
+ bdata->ub_i2c_addr = (unsigned short)value;
+ }
+ } else {
+ bdata->ub_i2c_addr = -1;
+ }
+
+ prop = of_find_property(np, "synaptics,cap-button-codes", NULL);
+ if (prop && prop->length) {
+ bdata->cap_button_map->map = devm_kzalloc(dev,
+ prop->length,
+ GFP_KERNEL);
+ if (!bdata->cap_button_map->map)
+ return -ENOMEM;
+ bdata->cap_button_map->nbuttons = prop->length / sizeof(u32);
+ retval = of_property_read_u32_array(np,
+ "synaptics,cap-button-codes",
+ bdata->cap_button_map->map,
+ bdata->cap_button_map->nbuttons);
+ if (retval < 0) {
+ bdata->cap_button_map->nbuttons = 0;
+ bdata->cap_button_map->map = NULL;
+ }
+ } else {
+ bdata->cap_button_map->nbuttons = 0;
+ bdata->cap_button_map->map = NULL;
+ }
+
+ prop = of_find_property(np, "synaptics,vir-button-codes", NULL);
+ if (prop && prop->length) {
+ bdata->vir_button_map->map = devm_kzalloc(dev,
+ prop->length,
+ GFP_KERNEL);
+ if (!bdata->vir_button_map->map)
+ return -ENOMEM;
+ bdata->vir_button_map->nbuttons = prop->length / sizeof(u32);
+ bdata->vir_button_map->nbuttons /= 5;
+ retval = of_property_read_u32_array(np,
+ "synaptics,vir-button-codes",
+ bdata->vir_button_map->map,
+ bdata->vir_button_map->nbuttons * 5);
+ if (retval < 0) {
+ bdata->vir_button_map->nbuttons = 0;
+ bdata->vir_button_map->map = NULL;
+ }
+ } else {
+ bdata->vir_button_map->nbuttons = 0;
+ bdata->vir_button_map->map = NULL;
+ }
+
+ return 0;
+}
+#endif
+
+static int synaptics_rmi4_spi_alloc_buf(struct synaptics_rmi4_data *rmi4_data,
+ unsigned int size, unsigned int count)
+{
+ static unsigned int buf_size;
+ static unsigned int xfer_count;
+
+ if (size > buf_size) {
+ if (buf_size)
+ kfree(buf);
+ buf = kmalloc(size, GFP_KERNEL);
+ if (!buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for buf\n",
+ __func__);
+ buf_size = 0;
+ return -ENOMEM;
+ }
+ buf_size = size;
+ }
+
+ if (count > xfer_count) {
+ if (xfer_count)
+ kfree(xfer);
+ xfer = kcalloc(count, sizeof(struct spi_transfer), GFP_KERNEL);
+ if (!xfer) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for xfer\n",
+ __func__);
+ xfer_count = 0;
+ return -ENOMEM;
+ }
+ xfer_count = count;
+ } else {
+ memset(xfer, 0, count * sizeof(struct spi_transfer));
+ }
+
+ return 0;
+}
+
+static int synaptics_rmi4_spi_set_page(struct synaptics_rmi4_data *rmi4_data,
+ unsigned short addr)
+{
+ int retval;
+ unsigned int index;
+ unsigned int byte_count = PAGE_SELECT_LEN + 1;
+ unsigned char page;
+ struct spi_message msg;
+ struct spi_device *spi = to_spi_device(rmi4_data->pdev->dev.parent);
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ page = ((addr >> 8) & MASK_8BIT);
+ if ((page >> 7) == (rmi4_data->current_page >> 7))
+ return PAGE_SELECT_LEN;
+
+ spi_message_init(&msg);
+
+ retval = synaptics_rmi4_spi_alloc_buf(rmi4_data, byte_count,
+ byte_count);
+ if (retval < 0)
+ return retval;
+
+ buf[0] = SPI_WRITE;
+ buf[1] = MASK_8BIT;
+ buf[2] = page;
+
+ if (bdata->byte_delay_us == 0) {
+ xfer[0].len = byte_count;
+ xfer[0].tx_buf = &buf[0];
+ if (bdata->block_delay_us)
+ xfer[0].delay_usecs = bdata->block_delay_us;
+ spi_message_add_tail(&xfer[0], &msg);
+ } else {
+ for (index = 0; index < byte_count; index++) {
+ xfer[index].len = 1;
+ xfer[index].tx_buf = &buf[index];
+ if (index == 1)
+ xfer[index].delay_usecs = bdata->addr_delay_us;
+ else
+ xfer[index].delay_usecs = bdata->byte_delay_us;
+ spi_message_add_tail(&xfer[index], &msg);
+ }
+ if (bdata->block_delay_us)
+ xfer[index - 1].delay_usecs = bdata->block_delay_us;
+ }
+
+ retval = spi_sync(spi, &msg);
+ if (retval == 0) {
+ rmi4_data->current_page = page;
+ retval = PAGE_SELECT_LEN;
+ } else {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to complete SPI transfer, error = %d\n",
+ __func__, retval);
+ }
+
+ return retval;
+}
+
+static int synaptics_rmi4_spi_read(struct synaptics_rmi4_data *rmi4_data,
+ unsigned short addr, unsigned char *data, unsigned short length)
+{
+ int retval;
+ unsigned int index;
+ unsigned int byte_count = length + ADDRESS_LEN;
+ unsigned char txbuf[ADDRESS_LEN];
+ struct spi_message msg;
+ struct spi_device *spi = to_spi_device(rmi4_data->pdev->dev.parent);
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ spi_message_init(&msg);
+
+ txbuf[0] = (addr >> 8) | SPI_READ;
+ txbuf[1] = addr & MASK_8BIT;
+
+ mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ retval = synaptics_rmi4_spi_set_page(rmi4_data, addr);
+ if (retval != PAGE_SELECT_LEN) {
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+ return -EIO;
+ }
+
+ if (bdata->byte_delay_us == 0) {
+ retval = synaptics_rmi4_spi_alloc_buf(rmi4_data, length,
+ 2);
+ } else {
+ retval = synaptics_rmi4_spi_alloc_buf(rmi4_data, length,
+ byte_count);
+ }
+ if (retval < 0) {
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+ return retval;
+ }
+
+ if (bdata->byte_delay_us == 0) {
+ xfer[0].len = ADDRESS_LEN;
+ xfer[0].tx_buf = &txbuf[0];
+ spi_message_add_tail(&xfer[0], &msg);
+ xfer[1].len = length;
+ xfer[1].rx_buf = &buf[0];
+ if (bdata->block_delay_us)
+ xfer[1].delay_usecs = bdata->block_delay_us;
+ spi_message_add_tail(&xfer[1], &msg);
+ } else {
+ for (index = 0; index < byte_count; index++) {
+ xfer[index].len = 1;
+ if (index < ADDRESS_LEN)
+ xfer[index].tx_buf = &txbuf[index];
+ else
+ xfer[index].rx_buf = &buf[index - ADDRESS_LEN];
+ if (index == 1)
+ xfer[index].delay_usecs = bdata->addr_delay_us;
+ else
+ xfer[index].delay_usecs = bdata->byte_delay_us;
+ spi_message_add_tail(&xfer[index], &msg);
+ }
+ if (bdata->block_delay_us)
+ xfer[index - 1].delay_usecs = bdata->block_delay_us;
+ }
+
+ retval = spi_sync(spi, &msg);
+ if (retval == 0) {
+ retval = secure_memcpy(data, length, buf, length, length);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy data\n",
+ __func__);
+ } else {
+ retval = length;
+ }
+ } else {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to complete SPI transfer, error = %d\n",
+ __func__, retval);
+ }
+
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ return retval;
+}
+
+static int synaptics_rmi4_spi_write(struct synaptics_rmi4_data *rmi4_data,
+ unsigned short addr, unsigned char *data, unsigned short length)
+{
+ int retval;
+ unsigned int index;
+ unsigned int byte_count = length + ADDRESS_LEN;
+ struct spi_message msg;
+ struct spi_device *spi = to_spi_device(rmi4_data->pdev->dev.parent);
+ const struct synaptics_dsx_board_data *bdata =
+ rmi4_data->hw_if->board_data;
+
+ spi_message_init(&msg);
+
+ mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ retval = synaptics_rmi4_spi_set_page(rmi4_data, addr);
+ if (retval != PAGE_SELECT_LEN) {
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+ return -EIO;
+ }
+
+ if (bdata->byte_delay_us == 0) {
+ retval = synaptics_rmi4_spi_alloc_buf(rmi4_data, byte_count,
+ 1);
+ } else {
+ retval = synaptics_rmi4_spi_alloc_buf(rmi4_data, byte_count,
+ byte_count);
+ }
+ if (retval < 0) {
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+ return retval;
+ }
+
+ buf[0] = (addr >> 8) & ~SPI_READ;
+ buf[1] = addr & MASK_8BIT;
+ retval = secure_memcpy(&buf[ADDRESS_LEN],
+ byte_count - ADDRESS_LEN, data, length, length);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to copy data\n",
+ __func__);
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+ return retval;
+ }
+
+ if (bdata->byte_delay_us == 0) {
+ xfer[0].len = byte_count;
+ xfer[0].tx_buf = &buf[0];
+ if (bdata->block_delay_us)
+ xfer[0].delay_usecs = bdata->block_delay_us;
+ spi_message_add_tail(xfer, &msg);
+ } else {
+ for (index = 0; index < byte_count; index++) {
+ xfer[index].len = 1;
+ xfer[index].tx_buf = &buf[index];
+ if (index == 1)
+ xfer[index].delay_usecs = bdata->addr_delay_us;
+ else
+ xfer[index].delay_usecs = bdata->byte_delay_us;
+ spi_message_add_tail(&xfer[index], &msg);
+ }
+ if (bdata->block_delay_us)
+ xfer[index - 1].delay_usecs = bdata->block_delay_us;
+ }
+
+ retval = spi_sync(spi, &msg);
+ if (retval == 0) {
+ retval = length;
+ } else {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to complete SPI transfer, error = %d\n",
+ __func__, retval);
+ }
+
+ mutex_unlock(&rmi4_data->rmi4_io_ctrl_mutex);
+
+ return retval;
+}
+
+static struct synaptics_dsx_bus_access bus_access = {
+ .type = BUS_SPI,
+ .read = synaptics_rmi4_spi_read,
+ .write = synaptics_rmi4_spi_write,
+};
+
+static struct synaptics_dsx_hw_interface hw_if;
+
+static struct platform_device *synaptics_dsx_spi_device;
+
+static void synaptics_rmi4_spi_dev_release(struct device *dev)
+{
+ kfree(synaptics_dsx_spi_device);
+
+ return;
+}
+
+static int synaptics_rmi4_spi_probe(struct spi_device *spi)
+{
+ int retval;
+
+ if (spi->master->flags & SPI_MASTER_HALF_DUPLEX) {
+ dev_err(&spi->dev,
+ "%s: Full duplex not supported by host\n",
+ __func__);
+ return -EIO;
+ }
+
+ synaptics_dsx_spi_device = kzalloc(
+ sizeof(struct platform_device),
+ GFP_KERNEL);
+ if (!synaptics_dsx_spi_device) {
+ dev_err(&spi->dev,
+ "%s: Failed to allocate memory for synaptics_dsx_spi_device\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+#ifdef CONFIG_OF
+ if (spi->dev.of_node) {
+ hw_if.board_data = devm_kzalloc(&spi->dev,
+ sizeof(struct synaptics_dsx_board_data),
+ GFP_KERNEL);
+ if (!hw_if.board_data) {
+ dev_err(&spi->dev,
+ "%s: Failed to allocate memory for board data\n",
+ __func__);
+ return -ENOMEM;
+ }
+ hw_if.board_data->cap_button_map = devm_kzalloc(&spi->dev,
+ sizeof(struct synaptics_dsx_button_map),
+ GFP_KERNEL);
+ if (!hw_if.board_data->cap_button_map) {
+ dev_err(&spi->dev,
+ "%s: Failed to allocate memory for 0D button map\n",
+ __func__);
+ return -ENOMEM;
+ }
+ hw_if.board_data->vir_button_map = devm_kzalloc(&spi->dev,
+ sizeof(struct synaptics_dsx_button_map),
+ GFP_KERNEL);
+ if (!hw_if.board_data->vir_button_map) {
+ dev_err(&spi->dev,
+ "%s: Failed to allocate memory for virtual button map\n",
+ __func__);
+ return -ENOMEM;
+ }
+ parse_dt(&spi->dev, hw_if.board_data);
+ }
+#else
+ hw_if.board_data = spi->dev.platform_data;
+#endif
+
+ hw_if.bus_access = &bus_access;
+
+ spi->bits_per_word = 8;
+ spi->mode = SPI_MODE_3;
+
+ retval = spi_setup(spi);
+ if (retval < 0) {
+ dev_err(&spi->dev,
+ "%s: Failed to perform SPI setup\n",
+ __func__);
+ return retval;
+ }
+
+ synaptics_dsx_spi_device->name = PLATFORM_DRIVER_NAME;
+ synaptics_dsx_spi_device->id = 0;
+ synaptics_dsx_spi_device->num_resources = 0;
+ synaptics_dsx_spi_device->dev.parent = &spi->dev;
+ synaptics_dsx_spi_device->dev.platform_data = &hw_if;
+ synaptics_dsx_spi_device->dev.release = synaptics_rmi4_spi_dev_release;
+
+ retval = platform_device_register(synaptics_dsx_spi_device);
+ if (retval) {
+ dev_err(&spi->dev,
+ "%s: Failed to register platform device\n",
+ __func__);
+ return -ENODEV;
+ }
+
+ return 0;
+}
+
+static int synaptics_rmi4_spi_remove(struct spi_device *spi)
+{
+ platform_device_unregister(synaptics_dsx_spi_device);
+
+ return 0;
+}
+
+static const struct spi_device_id synaptics_rmi4_id_table[] = {
+ {SPI_DRIVER_NAME, 0},
+ {},
+};
+MODULE_DEVICE_TABLE(spi, synaptics_rmi4_id_table);
+
+#ifdef CONFIG_OF
+static struct of_device_id synaptics_rmi4_of_match_table[] = {
+ {
+ .compatible = "synaptics,dsx-spi",
+ },
+ {},
+};
+MODULE_DEVICE_TABLE(of, synaptics_rmi4_of_match_table);
+#else
+#define synaptics_rmi4_of_match_table NULL
+#endif
+
+static struct spi_driver synaptics_rmi4_spi_driver = {
+ .driver = {
+ .name = SPI_DRIVER_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = synaptics_rmi4_of_match_table,
+ },
+ .probe = synaptics_rmi4_spi_probe,
+ .remove = synaptics_rmi4_spi_remove,
+ .id_table = synaptics_rmi4_id_table,
+};
+
+
+int synaptics_rmi4_bus_init_force(void)
+{
+ return spi_register_driver(&synaptics_rmi4_spi_driver);
+}
+
+void synaptics_rmi4_bus_exit_force(void)
+{
+ kfree(buf);
+
+ kfree(xfer);
+
+ spi_unregister_driver(&synaptics_rmi4_spi_driver);
+
+ return;
+}
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX SPI Bus Support Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_test_reporting.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_test_reporting.c
new file mode 100644
index 000000000000..a1290128fd7f
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_test_reporting.c
@@ -0,0 +1,8327 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/ctype.h>
+#include <linux/hrtimer.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+#include <linux/proc_fs.h>
+#include <linux/vmalloc.h>
+#include <linux/uaccess.h>
+
+#define SYSFS_FOLDER_NAME "f54"
+
+/* #define USE_RT8 */
+
+#define GET_REPORT_TIMEOUT_S 3
+#define CALIBRATION_TIMEOUT_S 10
+#define COMMAND_TIMEOUT_100MS 30
+
+#define NO_SLEEP_OFF (0 << 2)
+#define NO_SLEEP_ON (1 << 2)
+
+#define STATUS_IDLE 0
+#define STATUS_BUSY 1
+#define STATUS_ERROR 2
+
+#define REPORT_INDEX_OFFSET 1
+#define REPORT_DATA_OFFSET 3
+
+#define SENSOR_RX_MAPPING_OFFSET 1
+#define SENSOR_TX_MAPPING_OFFSET 2
+
+#define COMMAND_GET_REPORT 1
+#define COMMAND_FORCE_CAL 2
+#define COMMAND_FORCE_UPDATE 4
+#define COMMAND_ENTER_INCELL_TEST_MODE 16
+
+#define CONTROL_NO_AUTO_CAL 1
+
+#define CONTROL_0_SIZE 1
+#define CONTROL_1_SIZE 1
+#define CONTROL_2_SIZE 2
+#define CONTROL_3_SIZE 1
+#define CONTROL_4_6_SIZE 3
+#define CONTROL_7_SIZE 1
+#define CONTROL_8_9_SIZE 3
+#define CONTROL_10_SIZE 1
+#define CONTROL_11_SIZE 2
+#define CONTROL_12_13_SIZE 2
+#define CONTROL_14_SIZE 1
+#define CONTROL_15_SIZE 1
+#define CONTROL_16_SIZE 1
+#define CONTROL_17_SIZE 1
+#define CONTROL_18_SIZE 1
+#define CONTROL_19_SIZE 1
+#define CONTROL_20_SIZE 1
+#define CONTROL_21_SIZE 2
+#define CONTROL_22_26_SIZE 7
+#define CONTROL_27_SIZE 1
+#define CONTROL_28_SIZE 2
+#define CONTROL_29_SIZE 1
+#define CONTROL_30_SIZE 1
+#define CONTROL_31_SIZE 1
+#define CONTROL_32_35_SIZE 8
+#define CONTROL_36_SIZE 1
+#define CONTROL_37_SIZE 1
+#define CONTROL_38_SIZE 1
+#define CONTROL_39_SIZE 1
+#define CONTROL_40_SIZE 1
+#define CONTROL_41_SIZE 1
+#define CONTROL_42_SIZE 2
+#define CONTROL_43_54_SIZE 13
+#define CONTROL_55_56_SIZE 2
+#define CONTROL_57_SIZE 1
+#define CONTROL_58_SIZE 1
+#define CONTROL_59_SIZE 2
+#define CONTROL_60_62_SIZE 3
+#define CONTROL_63_SIZE 1
+#define CONTROL_64_67_SIZE 4
+#define CONTROL_68_73_SIZE 8
+#define CONTROL_74_SIZE 2
+#define CONTROL_75_SIZE 1
+#define CONTROL_76_SIZE 1
+#define CONTROL_77_78_SIZE 2
+#define CONTROL_79_83_SIZE 5
+#define CONTROL_84_85_SIZE 2
+#define CONTROL_86_SIZE 1
+#define CONTROL_87_SIZE 1
+#define CONTROL_88_SIZE 1
+#define CONTROL_89_SIZE 1
+#define CONTROL_90_SIZE 1
+#define CONTROL_91_SIZE 1
+#define CONTROL_92_SIZE 1
+#define CONTROL_93_SIZE 1
+#define CONTROL_94_SIZE 1
+#define CONTROL_95_SIZE 1
+#define CONTROL_96_SIZE 1
+#define CONTROL_97_SIZE 1
+#define CONTROL_98_SIZE 1
+#define CONTROL_99_SIZE 1
+#define CONTROL_100_SIZE 1
+#define CONTROL_101_SIZE 1
+#define CONTROL_102_SIZE 1
+#define CONTROL_103_SIZE 1
+#define CONTROL_104_SIZE 1
+#define CONTROL_105_SIZE 1
+#define CONTROL_106_SIZE 1
+#define CONTROL_107_SIZE 1
+#define CONTROL_108_SIZE 1
+#define CONTROL_109_SIZE 1
+#define CONTROL_110_SIZE 1
+#define CONTROL_111_SIZE 1
+#define CONTROL_112_SIZE 1
+#define CONTROL_113_SIZE 1
+#define CONTROL_114_SIZE 1
+#define CONTROL_115_SIZE 1
+#define CONTROL_116_SIZE 1
+#define CONTROL_117_SIZE 1
+#define CONTROL_118_SIZE 1
+#define CONTROL_119_SIZE 1
+#define CONTROL_120_SIZE 1
+#define CONTROL_121_SIZE 1
+#define CONTROL_122_SIZE 1
+#define CONTROL_123_SIZE 1
+#define CONTROL_124_SIZE 1
+#define CONTROL_125_SIZE 1
+#define CONTROL_126_SIZE 1
+#define CONTROL_127_SIZE 1
+#define CONTROL_128_SIZE 1
+#define CONTROL_129_SIZE 1
+#define CONTROL_130_SIZE 1
+#define CONTROL_131_SIZE 1
+#define CONTROL_132_SIZE 1
+#define CONTROL_133_SIZE 1
+#define CONTROL_134_SIZE 1
+#define CONTROL_135_SIZE 1
+#define CONTROL_136_SIZE 1
+#define CONTROL_137_SIZE 1
+#define CONTROL_138_SIZE 1
+#define CONTROL_139_SIZE 1
+#define CONTROL_140_SIZE 1
+#define CONTROL_141_SIZE 1
+#define CONTROL_142_SIZE 1
+#define CONTROL_143_SIZE 1
+#define CONTROL_144_SIZE 1
+#define CONTROL_145_SIZE 1
+#define CONTROL_146_SIZE 1
+#define CONTROL_147_SIZE 1
+#define CONTROL_148_SIZE 1
+#define CONTROL_149_SIZE 1
+#define CONTROL_150_SIZE 1
+#define CONTROL_151_SIZE 1
+#define CONTROL_152_SIZE 1
+#define CONTROL_153_SIZE 1
+#define CONTROL_154_SIZE 1
+#define CONTROL_155_SIZE 1
+#define CONTROL_156_SIZE 1
+#define CONTROL_157_158_SIZE 2
+#define CONTROL_163_SIZE 1
+#define CONTROL_164_SIZE 1
+#define CONTROL_165_SIZE 1
+#define CONTROL_166_SIZE 1
+#define CONTROL_167_SIZE 1
+#define CONTROL_168_SIZE 1
+#define CONTROL_169_SIZE 1
+#define CONTROL_171_SIZE 1
+#define CONTROL_172_SIZE 1
+#define CONTROL_173_SIZE 1
+#define CONTROL_174_SIZE 1
+#define CONTROL_175_SIZE 1
+#define CONTROL_176_SIZE 1
+#define CONTROL_177_178_SIZE 2
+#define CONTROL_179_SIZE 1
+#define CONTROL_182_SIZE 1
+#define CONTROL_183_SIZE 1
+#define CONTROL_185_SIZE 1
+#define CONTROL_186_SIZE 1
+#define CONTROL_187_SIZE 1
+#define CONTROL_188_SIZE 1
+#define CONTROL_189_SIZE 1
+#define CONTROL_190_SIZE 1
+#define CONTROL_191_SIZE 1
+#define CONTROL_192_SIZE 1
+#define CONTROL_193_SIZE 1
+#define CONTROL_194_SIZE 1
+#define CONTROL_195_SIZE 1
+#define CONTROL_196_SIZE 1
+#define CONTROL_197_SIZE 1
+#define CONTROL_198_SIZE 1
+#define CONTROL_199_SIZE 1
+#define CONTROL_200_SIZE 1
+#define CONTROL_201_SIZE 1
+#define CONTROL_202_SIZE 1
+#define CONTROL_203_SIZE 1
+#define CONTROL_204_SIZE 1
+#define CONTROL_205_SIZE 1
+#define CONTROL_206_SIZE 1
+#define CONTROL_207_SIZE 1
+#define CONTROL_208_SIZE 1
+#define CONTROL_209_SIZE 1
+#define CONTROL_210_SIZE 1
+#define CONTROL_211_SIZE 1
+#define CONTROL_212_SIZE 1
+#define CONTROL_213_SIZE 1
+#define CONTROL_214_SIZE 1
+#define CONTROL_215_SIZE 1
+#define CONTROL_216_SIZE 1
+#define CONTROL_217_SIZE 1
+#define CONTROL_218_SIZE 1
+#define CONTROL_219_SIZE 1
+#define CONTROL_220_SIZE 1
+#define CONTROL_221_SIZE 1
+#define CONTROL_222_SIZE 1
+#define CONTROL_223_SIZE 1
+#define CONTROL_224_SIZE 1
+#define CONTROL_225_SIZE 1
+
+#define HIGH_RESISTANCE_DATA_SIZE 6
+#define FULL_RAW_CAP_MIN_MAX_DATA_SIZE 4
+#define TRX_OPEN_SHORT_DATA_SIZE 7
+
+
+#define F54_POLLING_GET_REPORT
+static char *factory_string[] = {
+ "tddi_short_limit_b",
+ "tddi_noise_limit",
+ "tddi_extend_ee_short_reset_dur",
+ "tddi_extend_ee_short_int_dur",
+ "tddi_extend_ee_short_tx_on_count",
+ "tddi_extend_ee_short_rx_on_count",
+ "tddi_extend_ee_short_test_limit_part1",
+ "tddi_extend_ee_short_test_limit_part2",
+ "tddi_open_test_int_dur_one",
+ "tddi_open_test_int_dur_two",
+ "tddi_open_test_limit_phase2_lower",
+ "tddi_b7_open_test_int_dur_one",
+ "tddi_b7_open_test_int_dur_two",
+ "tddi_b7_open_test_limit_phase2_lower",
+ "tddi_b7_open_test_limit_phase2_upper",
+ "button_count",
+ "abs_0d_open_factor",
+ "abs_0d_open_test_limit",
+ NULL,
+ };
+
+#if 0
+/* test limit config */
+#define TDDI_SHORT_LIMIT_B 150
+#define TDDI_NOISE_LIMIT 28
+
+/* #define ENABLE_EXTEND_EE_SHORT */
+#define TDDI_EXTEND_EE_SHORT_RESET_DUR 60
+#define TDDI_EXTEND_EE_SHORT_INT_DUR 150
+#define TDDI_EXTEND_EE_SHORT_TX_ON_COUNT 146
+#define TDDI_EXTEND_EE_SHORT_RX_ON_COUNT 146
+#define TDDI_EXTEND_EE_SHORT_TEST_LIMIT_PART1 100
+#define TDDI_EXTEND_EE_SHORT_TEST_LIMIT_PART2 96
+
+#define TDDI_OPEN_TEST_INT_DUR_ONE 145
+#define TDDI_OPEN_TEST_INT_DUR_TWO 15
+#define TDDI_OPEN_TEST_LIMIT_PHASE2_LOWER 50
+
+/* #define ENABLE_AMP_OPEN_B7 */
+#define TDDI_B7_OPEN_TEST_INT_DUR_ONE 23
+#define TDDI_B7_OPEN_TEST_INT_DUR_TWO 27
+#define TDDI_B7_OPEN_TEST_LIMIT_PHASE2_LOWER 0
+#define TDDI_B7_OPEN_TEST_LIMIT_PHASE2_UPPER 115
+
+#define BUTTON_COUNT 3
+#define ABS_0D_OPEN_FACTOR 8
+#define ABS_0D_OPEN_TEST_LIMIT 30
+/* test limit config - */
+#endif
+
+#define TEST_INVALID 0
+#define TEST_FAILED 1
+#define TEST_OK 2
+
+#define TEST_TYPE_20_333X "20"
+#define TEST_TYPE_25_333X "25"
+#define TEST_TYPE_26_333X "26"
+#define TEST_TYPE_02 "2"
+#define TEST_TYPE_03 "3"
+
+#define CHIP_ID_OFFSET 11
+
+#define concat(a, b) a##b
+
+#define attrify(propname) (&dev_attr_##propname.attr)
+
+#define show_prototype(propname)\
+static ssize_t concat(test_sysfs, _##propname##_show)(\
+ struct device *dev,\
+ struct device_attribute *attr,\
+ char *buf);\
+\
+static struct device_attribute dev_attr_##propname =\
+ __ATTR(propname, S_IRUGO,\
+ concat(test_sysfs, _##propname##_show),\
+ synaptics_rmi4_store_error);
+
+#define store_prototype(propname)\
+static ssize_t concat(test_sysfs, _##propname##_store)(\
+ struct device *dev,\
+ struct device_attribute *attr,\
+ const char *buf, size_t count);\
+\
+static struct device_attribute dev_attr_##propname =\
+ __ATTR(propname, (S_IWUSR | S_IWGRP),\
+ synaptics_rmi4_show_error,\
+ concat(test_sysfs, _##propname##_store));
+
+#define show_store_prototype(propname)\
+static ssize_t concat(test_sysfs, _##propname##_show)(\
+ struct device *dev,\
+ struct device_attribute *attr,\
+ char *buf);\
+\
+static ssize_t concat(test_sysfs, _##propname##_store)(\
+ struct device *dev,\
+ struct device_attribute *attr,\
+ const char *buf, size_t count);\
+\
+static struct device_attribute dev_attr_##propname =\
+ __ATTR(propname, (S_IRUGO | S_IWUSR | S_IWGRP),\
+ concat(test_sysfs, _##propname##_show),\
+ concat(test_sysfs, _##propname##_store));
+
+#define disable_cbc(ctrl_num)\
+do {\
+ retval = synaptics_rmi4_reg_read(rmi4_data,\
+ f54->control.ctrl_num->address,\
+ f54->control.ctrl_num->data,\
+ sizeof(f54->control.ctrl_num->data));\
+ if (retval < 0) {\
+ dev_err(rmi4_data->pdev->dev.parent,\
+ "%s: Failed to disable CBC (" #ctrl_num ")\n",\
+ __func__);\
+ return retval;\
+ } \
+ f54->control.ctrl_num->cbc_tx_carrier_selection = 0;\
+ retval = synaptics_rmi4_reg_write(rmi4_data,\
+ f54->control.ctrl_num->address,\
+ f54->control.ctrl_num->data,\
+ sizeof(f54->control.ctrl_num->data));\
+ if (retval < 0) {\
+ dev_err(rmi4_data->pdev->dev.parent,\
+ "%s: Failed to disable CBC (" #ctrl_num ")\n",\
+ __func__);\
+ return retval;\
+ } \
+} while (0)
+
+enum f54_report_types {
+ F54_8BIT_IMAGE = 1,
+ F54_16BIT_IMAGE = 2,
+ F54_RAW_16BIT_IMAGE = 3,
+ F54_HIGH_RESISTANCE = 4,
+ F54_TX_TO_TX_SHORTS = 5,
+ F54_RX_TO_RX_SHORTS_1 = 7,
+ F54_TRUE_BASELINE = 9,
+ F54_FULL_RAW_CAP_MIN_MAX = 13,
+ F54_RX_OPENS_1 = 14,
+ F54_TX_OPENS = 15,
+ F54_TX_TO_GND_SHORTS = 16,
+ F54_RX_TO_RX_SHORTS_2 = 17,
+ F54_RX_OPENS_2 = 18,
+ F54_FULL_RAW_CAP = 19,
+#ifdef USE_RT8
+ F54_FULL_RAW_CAP_NO_RX_COUPLING = 8,
+#else
+ F54_FULL_RAW_CAP_NO_RX_COUPLING = 20,
+#endif
+ F54_SENSOR_SPEED = 22,
+ F54_ADC_RANGE = 23,
+ F54_TRX_OPENS = 24,
+ F54_TRX_TO_GND_SHORTS = 25,
+ F54_TRX_SHORTS = 26,
+ F54_ABS_RAW_CAP = 38,
+ F54_ABS_DELTA_CAP = 40,
+ F54_ABS_HYBRID_DELTA_CAP = 59,
+ F54_ABS_HYBRID_RAW_CAP = 63,
+ F54_AMP_FULL_RAW_CAP = 78,
+ F54_AMP_RAW_ADC = 83,
+ /* td43xx start */
+ F54_TD43XX_FULL_RAW = 92,
+ F54_TD43XX_NOISE = 94,
+ F54_TD43XX_EE_SHORT = 95,
+ /* td43xx end */
+ F54_ABS_DOZE_NO_CBC_INCELL = 121,
+ INVALID_REPORT_TYPE = -1,
+};
+
+enum f54_afe_cal {
+ F54_AFE_CAL,
+ F54_AFE_IS_CAL,
+};
+
+struct f54_query {
+ union {
+ struct {
+ /* query 0 */
+ unsigned char num_of_rx_electrodes;
+
+ /* query 1 */
+ unsigned char num_of_tx_electrodes;
+
+ /* query 2 */
+ unsigned char f54_query2_b0__1:2;
+ unsigned char has_baseline:1;
+ unsigned char has_image8:1;
+ unsigned char f54_query2_b4__5:2;
+ unsigned char has_image16:1;
+ unsigned char f54_query2_b7:1;
+
+ /* queries 3.0 and 3.1 */
+ unsigned short clock_rate;
+
+ /* query 4 */
+ unsigned char touch_controller_family;
+
+ /* query 5 */
+ unsigned char has_pixel_touch_threshold_adjustment:1;
+ unsigned char f54_query5_b1__7:7;
+
+ /* query 6 */
+ unsigned char has_sensor_assignment:1;
+ unsigned char has_interference_metric:1;
+ unsigned char has_sense_frequency_control:1;
+ unsigned char has_firmware_noise_mitigation:1;
+ unsigned char has_ctrl11:1;
+ unsigned char has_two_byte_report_rate:1;
+ unsigned char has_one_byte_report_rate:1;
+ unsigned char has_relaxation_control:1;
+
+ /* query 7 */
+ unsigned char curve_compensation_mode:2;
+ unsigned char f54_query7_b2__7:6;
+
+ /* query 8 */
+ unsigned char f54_query8_b0:1;
+ unsigned char has_iir_filter:1;
+ unsigned char has_cmn_removal:1;
+ unsigned char has_cmn_maximum:1;
+ unsigned char has_touch_hysteresis:1;
+ unsigned char has_edge_compensation:1;
+ unsigned char has_per_frequency_noise_control:1;
+ unsigned char has_enhanced_stretch:1;
+
+ /* query 9 */
+ unsigned char has_force_fast_relaxation:1;
+ unsigned char has_multi_metric_state_machine:1;
+ unsigned char has_signal_clarity:1;
+ unsigned char has_variance_metric:1;
+ unsigned char has_0d_relaxation_control:1;
+ unsigned char has_0d_acquisition_control:1;
+ unsigned char has_status:1;
+ unsigned char has_slew_metric:1;
+
+ /* query 10 */
+ unsigned char has_h_blank:1;
+ unsigned char has_v_blank:1;
+ unsigned char has_long_h_blank:1;
+ unsigned char has_startup_fast_relaxation:1;
+ unsigned char has_esd_control:1;
+ unsigned char has_noise_mitigation2:1;
+ unsigned char has_noise_state:1;
+ unsigned char has_energy_ratio_relaxation:1;
+
+ /* query 11 */
+ unsigned char has_excessive_noise_reporting:1;
+ unsigned char has_slew_option:1;
+ unsigned char has_two_overhead_bursts:1;
+ unsigned char has_query13:1;
+ unsigned char has_one_overhead_burst:1;
+ unsigned char f54_query11_b5:1;
+ unsigned char has_ctrl88:1;
+ unsigned char has_query15:1;
+
+ /* query 12 */
+ unsigned char number_of_sensing_frequencies:4;
+ unsigned char f54_query12_b4__7:4;
+ } __packed;
+ unsigned char data[14];
+ };
+};
+
+struct f54_query_13 {
+ union {
+ struct {
+ unsigned char has_ctrl86:1;
+ unsigned char has_ctrl87:1;
+ unsigned char has_ctrl87_sub0:1;
+ unsigned char has_ctrl87_sub1:1;
+ unsigned char has_ctrl87_sub2:1;
+ unsigned char has_cidim:1;
+ unsigned char has_noise_mitigation_enhancement:1;
+ unsigned char has_rail_im:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_15 {
+ union {
+ struct {
+ unsigned char has_ctrl90:1;
+ unsigned char has_transmit_strength:1;
+ unsigned char has_ctrl87_sub3:1;
+ unsigned char has_query16:1;
+ unsigned char has_query20:1;
+ unsigned char has_query21:1;
+ unsigned char has_query22:1;
+ unsigned char has_query25:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_16 {
+ union {
+ struct {
+ unsigned char has_query17:1;
+ unsigned char has_data17:1;
+ unsigned char has_ctrl92:1;
+ unsigned char has_ctrl93:1;
+ unsigned char has_ctrl94_query18:1;
+ unsigned char has_ctrl95_query19:1;
+ unsigned char has_ctrl99:1;
+ unsigned char has_ctrl100:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_21 {
+ union {
+ struct {
+ unsigned char has_abs_rx:1;
+ unsigned char has_abs_tx:1;
+ unsigned char has_ctrl91:1;
+ unsigned char has_ctrl96:1;
+ unsigned char has_ctrl97:1;
+ unsigned char has_ctrl98:1;
+ unsigned char has_data19:1;
+ unsigned char has_query24_data18:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_22 {
+ union {
+ struct {
+ unsigned char has_packed_image:1;
+ unsigned char has_ctrl101:1;
+ unsigned char has_dynamic_sense_display_ratio:1;
+ unsigned char has_query23:1;
+ unsigned char has_ctrl103_query26:1;
+ unsigned char has_ctrl104:1;
+ unsigned char has_ctrl105:1;
+ unsigned char has_query28:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_23 {
+ union {
+ struct {
+ unsigned char has_ctrl102:1;
+ unsigned char has_ctrl102_sub1:1;
+ unsigned char has_ctrl102_sub2:1;
+ unsigned char has_ctrl102_sub4:1;
+ unsigned char has_ctrl102_sub5:1;
+ unsigned char has_ctrl102_sub9:1;
+ unsigned char has_ctrl102_sub10:1;
+ unsigned char has_ctrl102_sub11:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_25 {
+ union {
+ struct {
+ unsigned char has_ctrl106:1;
+ unsigned char has_ctrl102_sub12:1;
+ unsigned char has_ctrl107:1;
+ unsigned char has_ctrl108:1;
+ unsigned char has_ctrl109:1;
+ unsigned char has_data20:1;
+ unsigned char f54_query25_b6:1;
+ unsigned char has_query27:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_27 {
+ union {
+ struct {
+ unsigned char has_ctrl110:1;
+ unsigned char has_data21:1;
+ unsigned char has_ctrl111:1;
+ unsigned char has_ctrl112:1;
+ unsigned char has_ctrl113:1;
+ unsigned char has_data22:1;
+ unsigned char has_ctrl114:1;
+ unsigned char has_query29:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_29 {
+ union {
+ struct {
+ unsigned char has_ctrl115:1;
+ unsigned char has_ground_ring_options:1;
+ unsigned char has_lost_bursts_tuning:1;
+ unsigned char has_aux_exvcom2_select:1;
+ unsigned char has_ctrl116:1;
+ unsigned char has_data23:1;
+ unsigned char has_ctrl117:1;
+ unsigned char has_query30:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_30 {
+ union {
+ struct {
+ unsigned char has_ctrl118:1;
+ unsigned char has_ctrl119:1;
+ unsigned char has_ctrl120:1;
+ unsigned char has_ctrl121:1;
+ unsigned char has_ctrl122_query31:1;
+ unsigned char has_ctrl123:1;
+ unsigned char has_ctrl124:1;
+ unsigned char has_query32:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_32 {
+ union {
+ struct {
+ unsigned char has_ctrl125:1;
+ unsigned char has_ctrl126:1;
+ unsigned char has_ctrl127:1;
+ unsigned char has_abs_charge_pump_disable:1;
+ unsigned char has_query33:1;
+ unsigned char has_data24:1;
+ unsigned char has_query34:1;
+ unsigned char has_query35:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_33 {
+ union {
+ struct {
+ unsigned char has_ctrl128:1;
+ unsigned char has_ctrl129:1;
+ unsigned char has_ctrl130:1;
+ unsigned char has_ctrl131:1;
+ unsigned char has_ctrl132:1;
+ unsigned char has_ctrl133:1;
+ unsigned char has_ctrl134:1;
+ unsigned char has_query36:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_35 {
+ union {
+ struct {
+ unsigned char has_data25:1;
+ unsigned char has_ctrl135:1;
+ unsigned char has_ctrl136:1;
+ unsigned char has_ctrl137:1;
+ unsigned char has_ctrl138:1;
+ unsigned char has_ctrl139:1;
+ unsigned char has_data26:1;
+ unsigned char has_ctrl140:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_36 {
+ union {
+ struct {
+ unsigned char has_ctrl141:1;
+ unsigned char has_ctrl142:1;
+ unsigned char has_query37:1;
+ unsigned char has_ctrl143:1;
+ unsigned char has_ctrl144:1;
+ unsigned char has_ctrl145:1;
+ unsigned char has_ctrl146:1;
+ unsigned char has_query38:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_38 {
+ union {
+ struct {
+ unsigned char has_ctrl147:1;
+ unsigned char has_ctrl148:1;
+ unsigned char has_ctrl149:1;
+ unsigned char has_ctrl150:1;
+ unsigned char has_ctrl151:1;
+ unsigned char has_ctrl152:1;
+ unsigned char has_ctrl153:1;
+ unsigned char has_query39:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_39 {
+ union {
+ struct {
+ unsigned char has_ctrl154:1;
+ unsigned char has_ctrl155:1;
+ unsigned char has_ctrl156:1;
+ unsigned char has_ctrl160:1;
+ unsigned char has_ctrl157_ctrl158:1;
+ unsigned char f54_query39_b5__6:2;
+ unsigned char has_query40:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_40 {
+ union {
+ struct {
+ unsigned char has_ctrl169:1;
+ unsigned char has_ctrl163_query41:1;
+ unsigned char has_ctrl164:1;
+ unsigned char has_ctrl165_query42:1;
+ unsigned char has_ctrl166:1;
+ unsigned char has_ctrl167:1;
+ unsigned char has_ctrl168:1;
+ unsigned char has_query43:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_43 {
+ union {
+ struct {
+ unsigned char f54_query43_b0__1:2;
+ unsigned char has_ctrl171:1;
+ unsigned char has_ctrl172_query44_query45:1;
+ unsigned char has_ctrl173:1;
+ unsigned char has_ctrl174:1;
+ unsigned char has_ctrl175:1;
+ unsigned char has_query46:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_46 {
+ union {
+ struct {
+ unsigned char has_ctrl176:1;
+ unsigned char has_ctrl177_ctrl178:1;
+ unsigned char has_ctrl179:1;
+ unsigned char f54_query46_b3:1;
+ unsigned char has_data27:1;
+ unsigned char has_data28:1;
+ unsigned char f54_query46_b6:1;
+ unsigned char has_query47:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_47 {
+ union {
+ struct {
+ unsigned char f54_query47_b0:1;
+ unsigned char has_ctrl182:1;
+ unsigned char has_ctrl183:1;
+ unsigned char f54_query47_b3:1;
+ unsigned char has_ctrl185:1;
+ unsigned char has_ctrl186:1;
+ unsigned char has_ctrl187:1;
+ unsigned char has_query49:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_49 {
+ union {
+ struct {
+ unsigned char f54_query49_b0__1:2;
+ unsigned char has_ctrl188:1;
+ unsigned char has_data31:1;
+ unsigned char has_data32:1;
+ unsigned char has_ctrl189:1;
+ unsigned char has_ctrl190:1;
+ unsigned char has_query50:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_50 {
+ union {
+ struct {
+ unsigned char has_ctrl191:1;
+ unsigned char has_ctrl192:1;
+ unsigned char f54_query50_b2__4:3;
+ unsigned char has_ctrl194:1;
+ unsigned char has_ctrl195:1;
+ unsigned char has_query51:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_51 {
+ union {
+ struct {
+ unsigned char f54_query51_b0:1;
+ unsigned char has_ctrl196:1;
+ unsigned char f54_query51_b2:1;
+ unsigned char f54_query51_b3:1;
+ unsigned char f54_query51_b4:1;
+ unsigned char has_query53_query54_ctrl198:1;
+ unsigned char has_ctrl199:1;
+ unsigned char has_query55:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_55 {
+ union {
+ struct {
+ unsigned char has_query56:1;
+ unsigned char has_data33_data34:1;
+ unsigned char has_alternate_report_rate:1;
+ unsigned char has_ctrl200:1;
+ unsigned char has_ctrl201_ctrl202:1;
+ unsigned char has_ctrl203:1;
+ unsigned char has_ctrl204:1;
+ unsigned char has_query57:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_57 {
+ union {
+ struct {
+ unsigned char has_ctrl205:1;
+ unsigned char has_ctrl206:1;
+ unsigned char has_usb_bulk_read:1;
+ unsigned char has_ctrl207:1;
+ unsigned char has_ctrl208:1;
+ unsigned char has_ctrl209:1;
+ unsigned char has_ctrl210:1;
+ unsigned char has_query58:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_58 {
+ union {
+ struct {
+ unsigned char has_query59:1;
+ unsigned char has_query60:1;
+ unsigned char has_ctrl211:1;
+ unsigned char has_ctrl212:1;
+ unsigned char has_hybrid_abs_tx_axis_filtering:1;
+ unsigned char f54_query58_b5:1;
+ unsigned char has_ctrl213:1;
+ unsigned char has_query61:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_61 {
+ union {
+ struct {
+ unsigned char has_ctrl214:1;
+ unsigned char has_ctrl215_query62_query63:1;
+ unsigned char f54_query61_b2__4:3;
+ unsigned char has_ctrl218:1;
+ unsigned char has_hybrid_abs_buttons:1;
+ unsigned char has_query64:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_62 {
+ union {
+ struct {
+ unsigned char size_of_ctrl215_sub1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_63 {
+ union {
+ struct {
+ unsigned char size_of_ctrl215_sub2;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_64 {
+ union {
+ struct {
+ unsigned char f54_query64_b0:1;
+ unsigned char has_ctrl220:1;
+ unsigned char f54_query64_b2:1;
+ unsigned char has_ctrl222:1;
+ unsigned char has_ctrl219_sub1:1;
+ unsigned char has_ctrl103_sub3:1;
+ unsigned char has_ctrl224_ctrl226_ctrl227:1;
+ unsigned char has_query65:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_65 {
+ union {
+ struct {
+ unsigned char has_ctrl225:1;
+ unsigned char has_query66_ctrl231:1;
+ unsigned char has_ctrl232:1;
+ unsigned char has_query67:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_67 {
+ union {
+ struct {
+ unsigned char has_abs_doze_spatial_filter_enable:1;
+ unsigned char has_abs_doze_average_filter_enable:1;
+ unsigned char has_single_display_pulse:1;
+ unsigned char f54_query67_b3__6:4;
+ unsigned char has_query68:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_68 {
+ union {
+ struct {
+ unsigned char f54_query68_b0__4:5;
+ unsigned char has_freq_filter_bw_ext:1;
+ unsigned char f54_query68_b6:1;
+ unsigned char has_query69:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_query_69 {
+ union {
+ struct {
+ unsigned char has_ctrl240_sub0:1;
+ unsigned char has_ctrl240_sub1_sub2:1;
+ unsigned char has_ctrl240_sub3:1;
+ unsigned char has_ctrl240_sub4:1;
+ unsigned char burst_mode_report_type_enabled:1;
+ unsigned char f54_query69_b5__7:3;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f54_data_31 {
+ union {
+ struct {
+ unsigned char is_calibration_crc:1;
+ unsigned char calibration_crc:1;
+ unsigned char short_test_row_number:5;
+ } __packed;
+ struct {
+ unsigned char data[1];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_7 {
+ union {
+ struct {
+ unsigned char cbc_cap:3;
+ unsigned char cbc_polarity:1;
+ unsigned char cbc_tx_carrier_selection:1;
+ unsigned char f54_ctrl7_b5__7:3;
+ } __packed;
+ struct {
+ unsigned char data[1];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_41 {
+ union {
+ struct {
+ unsigned char no_signal_clarity:1;
+ unsigned char f54_ctrl41_b1__7:7;
+ } __packed;
+ struct {
+ unsigned char data[1];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_57 {
+ union {
+ struct {
+ unsigned char cbc_cap:3;
+ unsigned char cbc_polarity:1;
+ unsigned char cbc_tx_carrier_selection:1;
+ unsigned char f54_ctrl57_b5__7:3;
+ } __packed;
+ struct {
+ unsigned char data[1];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_86 {
+ union {
+ struct {
+ unsigned char enable_high_noise_state:1;
+ unsigned char dynamic_sense_display_ratio:2;
+ unsigned char f54_ctrl86_b3__7:5;
+ } __packed;
+ struct {
+ unsigned char data[1];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_88 {
+ union {
+ struct {
+ unsigned char tx_low_reference_polarity:1;
+ unsigned char tx_high_reference_polarity:1;
+ unsigned char abs_low_reference_polarity:1;
+ unsigned char abs_polarity:1;
+ unsigned char cbc_polarity:1;
+ unsigned char cbc_tx_carrier_selection:1;
+ unsigned char charge_pump_enable:1;
+ unsigned char cbc_abs_auto_servo:1;
+ } __packed;
+ struct {
+ unsigned char data[1];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+/* td43xx start */
+struct f54_control_91 {
+ union {
+ struct {
+ unsigned char reflo_transcap_capacitance;
+ unsigned char refhi_transcap_capacitance;
+ unsigned char receiver_feedback_capacitance;
+ unsigned char reference_receiver_feedback_capacitance;
+ unsigned char gain_ctrl;
+ } __packed;
+ struct {
+ unsigned char data[5];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_96 {
+ union {
+ struct {
+ unsigned char cbc_transcap[64];
+ } __packed;
+ struct {
+ unsigned char data[64];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_99 {
+ union {
+ struct {
+ unsigned char integration_duration_lsb;
+ unsigned char integration_duration_msb;
+ unsigned char reset_duration;
+ } __packed;
+ struct {
+ unsigned char data[3];
+ unsigned short address;
+ } __packed;
+ };
+};
+/* td43xx end */
+
+struct f54_control_110 {
+ union {
+ struct {
+ unsigned char active_stylus_rx_feedback_cap;
+ unsigned char active_stylus_rx_feedback_cap_reference;
+ unsigned char active_stylus_low_reference;
+ unsigned char active_stylus_high_reference;
+ unsigned char active_stylus_gain_control;
+ unsigned char active_stylus_gain_control_reference;
+ unsigned char active_stylus_timing_mode;
+ unsigned char active_stylus_discovery_bursts;
+ unsigned char active_stylus_detection_bursts;
+ unsigned char active_stylus_discovery_noise_multiplier;
+ unsigned char active_stylus_detection_envelope_min;
+ unsigned char active_stylus_detection_envelope_max;
+ unsigned char active_stylus_lose_count;
+ } __packed;
+ struct {
+ unsigned char data[13];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_149 {
+ union {
+ struct {
+ unsigned char trans_cbc_global_cap_enable:1;
+ unsigned char f54_ctrl149_b1__7:7;
+ } __packed;
+ struct {
+ unsigned char data[1];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_182 {
+ union {
+ struct {
+ unsigned char cbc_timing_ctrl_tx_lsb;
+ unsigned char cbc_timing_ctrl_tx_msb;
+ unsigned char cbc_timing_ctrl_rx_lsb;
+ unsigned char cbc_timing_ctrl_rx_msb;
+ } __packed;
+ struct {
+ unsigned char data[4];
+ unsigned short address;
+ } __packed;
+ };
+};
+struct f54_control_188 {
+ union {
+ struct {
+ unsigned char start_calibration:1;
+ unsigned char start_is_calibration:1;
+ unsigned char frequency:2;
+ unsigned char start_production_test:1;
+ unsigned char short_test_calibration:1;
+ unsigned char f54_ctrl188_b7:1;
+ } __packed;
+ struct {
+ unsigned char data[1];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_223 {
+ union {
+ struct {
+ unsigned char voltages_for_0d:8;
+ } __packed;
+ struct {
+ unsigned char data[1];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+struct f54_control_225 {
+ union {
+ struct {
+ unsigned char force_doze_mode:1;
+ unsigned char f54_ctrl225_b1__7:7;
+ } __packed;
+ struct {
+ unsigned char data[1];
+ unsigned short address;
+ } __packed;
+ };
+};
+
+
+struct f54_control {
+ struct f54_control_7 *reg_7;
+ struct f54_control_41 *reg_41;
+ struct f54_control_57 *reg_57;
+ struct f54_control_86 *reg_86;
+ struct f54_control_88 *reg_88;
+ struct f54_control_91 *reg_91;
+ struct f54_control_96 *reg_96;
+ struct f54_control_99 *reg_99;
+ struct f54_control_110 *reg_110;
+ struct f54_control_149 *reg_149;
+ struct f54_control_182 *reg_182;
+ struct f54_control_188 *reg_188;
+ struct f54_control_223 *reg_223;
+ struct f54_control_225 *reg_225;
+};
+
+struct synaptics_rmi4_f54_handle {
+ bool no_auto_cal;
+ bool skip_preparation;
+ char *data;
+ unsigned char status;
+ unsigned char intr_mask;
+ unsigned char intr_reg_num;
+ unsigned char tx_assigned;
+ unsigned char rx_assigned;
+ /* td43xx start */
+ unsigned char swap_sensor_side;
+ unsigned char left_mux_size;
+ unsigned char right_mux_size;
+ /* td43xx end */
+ unsigned char *report_data;
+ unsigned short query_base_addr;
+ unsigned short control_base_addr;
+ unsigned short data_base_addr;
+ unsigned short command_base_addr;
+ unsigned short fifoindex;
+ unsigned int report_size;
+ unsigned int data_buffer_size;
+ unsigned int data_pos;
+ int result_type;
+ enum f54_report_types report_type;
+ struct f54_query query;
+ struct f54_query_13 query_13;
+ struct f54_query_15 query_15;
+ struct f54_query_16 query_16;
+ struct f54_query_21 query_21;
+ struct f54_query_22 query_22;
+ struct f54_query_23 query_23;
+ struct f54_query_25 query_25;
+ struct f54_query_27 query_27;
+ struct f54_query_29 query_29;
+ struct f54_query_30 query_30;
+ struct f54_query_32 query_32;
+ struct f54_query_33 query_33;
+ struct f54_query_35 query_35;
+ struct f54_query_36 query_36;
+ struct f54_query_38 query_38;
+ struct f54_query_39 query_39;
+ struct f54_query_40 query_40;
+ struct f54_query_43 query_43;
+ struct f54_query_46 query_46;
+ struct f54_query_47 query_47;
+ struct f54_query_49 query_49;
+ struct f54_query_50 query_50;
+ struct f54_query_51 query_51;
+ struct f54_query_55 query_55;
+ struct f54_query_57 query_57;
+ struct f54_query_58 query_58;
+ struct f54_query_61 query_61;
+ struct f54_query_62 query_62;
+ struct f54_query_63 query_63;
+ struct f54_query_64 query_64;
+ struct f54_query_65 query_65;
+ struct f54_query_67 query_67;
+ struct f54_query_68 query_68;
+ struct f54_query_69 query_69;
+ struct f54_data_31 data_31;
+ struct f54_control control;
+ struct mutex status_mutex;
+ struct kobject *sysfs_dir;
+ struct hrtimer watchdog;
+ struct work_struct timeout_work;
+ struct work_struct test_report_work;
+ struct work_struct resume_touch_work;
+ struct workqueue_struct *test_report_workqueue;
+ struct synaptics_rmi4_data *rmi4_data;
+};
+
+struct f55_query {
+ union {
+ struct {
+ /* query 0 */
+ unsigned char num_of_rx_electrodes;
+
+ /* query 1 */
+ unsigned char num_of_tx_electrodes;
+
+ /* query 2 */
+ unsigned char has_sensor_assignment:1;
+ unsigned char has_edge_compensation:1;
+ unsigned char curve_compensation_mode:2;
+ unsigned char has_ctrl6:1;
+ unsigned char has_alternate_transmitter_assignment:1;
+ unsigned char has_single_layer_multi_touch:1;
+ unsigned char has_query5:1;
+ } __packed;
+ unsigned char data[3];
+ };
+};
+
+struct f55_query_3 {
+ union {
+ struct {
+ unsigned char has_ctrl8:1;
+ unsigned char has_ctrl9:1;
+ unsigned char has_oncell_pattern_support:1;
+ unsigned char has_data0:1;
+ unsigned char has_single_wide_pattern_support:1;
+ unsigned char has_mirrored_tx_pattern_support:1;
+ unsigned char has_discrete_pattern_support:1;
+ unsigned char has_query9:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f55_query_5 {
+ union {
+ struct {
+ unsigned char has_corner_compensation:1;
+ unsigned char has_ctrl12:1;
+ unsigned char has_trx_configuration:1;
+ unsigned char has_ctrl13:1;
+ unsigned char f55_query5_b4:1;
+ unsigned char has_ctrl14:1;
+ unsigned char has_basis_function:1;
+ unsigned char has_query17:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f55_query_17 {
+ union {
+ struct {
+ unsigned char f55_query17_b0:1;
+ unsigned char has_ctrl16:1;
+ unsigned char has_ctrl18_ctrl19:1;
+ unsigned char has_ctrl17:1;
+ unsigned char has_ctrl20:1;
+ unsigned char has_ctrl21:1;
+ unsigned char has_ctrl22:1;
+ unsigned char has_query18:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f55_query_18 {
+ union {
+ struct {
+ unsigned char has_ctrl23:1;
+ unsigned char has_ctrl24:1;
+ unsigned char has_query19:1;
+ unsigned char has_ctrl25:1;
+ unsigned char has_ctrl26:1;
+ unsigned char has_ctrl27_query20:1;
+ unsigned char has_ctrl28_query21:1;
+ unsigned char has_query22:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f55_query_22 {
+ union {
+ struct {
+ unsigned char has_ctrl29:1;
+ unsigned char has_query23:1;
+ unsigned char has_guard_disable:1;
+ unsigned char has_ctrl30:1;
+ unsigned char has_ctrl31:1;
+ unsigned char has_ctrl32:1;
+ unsigned char has_query24_through_query27:1;
+ unsigned char has_query28:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f55_query_23 {
+ union {
+ struct {
+ unsigned char amp_sensor_enabled:1;
+ unsigned char image_transposed:1;
+ unsigned char first_column_at_left_side:1;
+ unsigned char size_of_column2mux:5;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f55_query_28 {
+ union {
+ struct {
+ unsigned char f55_query28_b0__4:5;
+ unsigned char has_ctrl37:1;
+ unsigned char has_query29:1;
+ unsigned char has_query30:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f55_query_30 {
+ union {
+ struct {
+ unsigned char has_ctrl38:1;
+ unsigned char has_query31_query32:1;
+ unsigned char has_ctrl39:1;
+ unsigned char has_ctrl40:1;
+ unsigned char has_ctrl41:1;
+ unsigned char has_ctrl42:1;
+ unsigned char has_ctrl43_ctrl44:1;
+ unsigned char has_query33:1;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f55_query_33 {
+ union {
+ struct {
+ unsigned char has_extended_amp_pad:1;
+ unsigned char has_extended_amp_btn:1;
+ unsigned char has_ctrl45_ctrl46:1;
+ unsigned char f55_query33_b3:1;
+ unsigned char has_ctrl47_sub0_sub1:1;
+ unsigned char f55_query33_b5__7:3;
+ } __packed;
+ unsigned char data[1];
+ };
+};
+
+struct f55_control_43 {
+ union {
+ struct {
+ unsigned char swap_sensor_side:1;
+ unsigned char f55_ctrl43_b1__7:7;
+ unsigned char afe_l_mux_size:4;
+ unsigned char afe_r_mux_size:4;
+ } __packed;
+ unsigned char data[2];
+ };
+};
+
+struct synaptics_rmi4_f55_handle {
+ bool amp_sensor;
+ bool extended_amp;
+ bool extended_amp_btn;
+ bool has_force;
+ unsigned char size_of_column2mux;
+ unsigned char afe_mux_offset;
+ unsigned char force_tx_offset;
+ unsigned char force_rx_offset;
+ unsigned char *tx_assignment;
+ unsigned char *rx_assignment;
+ unsigned char *force_tx_assignment;
+ unsigned char *force_rx_assignment;
+ unsigned short query_base_addr;
+ unsigned short control_base_addr;
+ unsigned short data_base_addr;
+ unsigned short command_base_addr;
+ struct f55_query query;
+ struct f55_query_3 query_3;
+ struct f55_query_5 query_5;
+ struct f55_query_17 query_17;
+ struct f55_query_18 query_18;
+ struct f55_query_22 query_22;
+ struct f55_query_23 query_23;
+ struct f55_query_28 query_28;
+ struct f55_query_30 query_30;
+ struct f55_query_33 query_33;
+};
+
+show_prototype(num_of_mapped_tx)
+show_prototype(num_of_mapped_rx)
+show_prototype(tx_mapping)
+show_prototype(rx_mapping)
+show_prototype(force_tx_mapping)
+show_prototype(force_rx_mapping)
+show_prototype(report_size)
+show_prototype(status)
+store_prototype(do_preparation)
+store_prototype(force_cal)
+store_prototype(get_report)
+store_prototype(resume_touch)
+store_prototype(do_afe_calibration)
+show_store_prototype(report_type)
+show_store_prototype(fifoindex)
+show_store_prototype(no_auto_cal)
+show_store_prototype(read_report)
+/* td43xx start */
+show_store_prototype(td43xx_full_raw)
+show_store_prototype(td43xx_noise)
+show_store_prototype(tddi_extend_ee_short)
+show_store_prototype(td43xx_ee_short)
+show_store_prototype(td4722_b7_amp_open)
+show_store_prototype(td43xx_amp_open)
+show_store_prototype(abs_0d_open_w_autoservo)
+/* td43xx end */
+
+static struct attribute *attrs[] = {
+ attrify(num_of_mapped_tx),
+ attrify(num_of_mapped_rx),
+ attrify(tx_mapping),
+ attrify(rx_mapping),
+ attrify(force_tx_mapping),
+ attrify(force_rx_mapping),
+ attrify(report_size),
+ attrify(status),
+ attrify(do_preparation),
+ attrify(force_cal),
+ attrify(get_report),
+ attrify(resume_touch),
+ attrify(do_afe_calibration),
+ attrify(report_type),
+ attrify(fifoindex),
+ attrify(no_auto_cal),
+ attrify(read_report),
+ /* td43xx start */
+ attrify(td43xx_full_raw),
+ attrify(td43xx_noise),
+ attrify(tddi_extend_ee_short),
+ attrify(td43xx_ee_short),
+ attrify(td4722_b7_amp_open),
+ attrify(td43xx_amp_open),
+ attrify(abs_0d_open_w_autoservo),
+ /* td43xx end */
+ NULL,
+};
+
+static struct attribute_group attr_group = {
+ .attrs = attrs,
+};
+/*
+static ssize_t test_sysfs_data_read(struct file *data_file,
+ struct kobject *kobj, struct bin_attribute *attributes,
+ char *buf, loff_t pos, size_t count);
+
+static struct bin_attribute test_report_data = {
+ .attr = {
+ .name = "report_data",
+ .mode = S_IRUGO,
+ },
+ .size = 0,
+ .read = test_sysfs_data_read,
+};
+*/
+static struct synaptics_rmi4_f54_handle *f54;
+static struct synaptics_rmi4_f55_handle *f55;
+
+/* td43xx start */
+static unsigned char *td43xx_full_raw_data;
+static signed short *td43xx_noise_delta;
+static unsigned char *td43xx_ee_short_data;
+static unsigned char *td43xx_amp_open_data;
+/* td43xx end */
+static int *g_abs_0d_open_data_output;
+static char g_flag_read_report_fail;
+
+DECLARE_COMPLETION(test_remove_complete_force);
+
+static bool test_report_type_valid(enum f54_report_types report_type)
+{
+ switch (report_type) {
+ case F54_8BIT_IMAGE:
+ case F54_16BIT_IMAGE:
+ case F54_RAW_16BIT_IMAGE:
+ case F54_HIGH_RESISTANCE:
+ case F54_TX_TO_TX_SHORTS:
+ case F54_RX_TO_RX_SHORTS_1:
+ case F54_TRUE_BASELINE:
+ case F54_FULL_RAW_CAP_MIN_MAX:
+ case F54_RX_OPENS_1:
+ case F54_TX_OPENS:
+ case F54_TX_TO_GND_SHORTS:
+ case F54_RX_TO_RX_SHORTS_2:
+ case F54_RX_OPENS_2:
+ case F54_FULL_RAW_CAP:
+ case F54_FULL_RAW_CAP_NO_RX_COUPLING:
+ case F54_SENSOR_SPEED:
+ case F54_ADC_RANGE:
+ case F54_TRX_OPENS:
+ case F54_TRX_TO_GND_SHORTS:
+ case F54_TRX_SHORTS:
+ case F54_ABS_RAW_CAP:
+ case F54_ABS_DELTA_CAP:
+ case F54_ABS_HYBRID_DELTA_CAP:
+ case F54_ABS_HYBRID_RAW_CAP:
+ case F54_AMP_FULL_RAW_CAP:
+ case F54_AMP_RAW_ADC:
+ /* td43xx start */
+ case F54_TD43XX_FULL_RAW:
+ case F54_TD43XX_NOISE:
+ case F54_TD43XX_EE_SHORT:
+ /* td43xx end */
+ return true;
+ break;
+ case F54_ABS_DOZE_NO_CBC_INCELL:
+ if (f54->query_65.has_ctrl225) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ break;
+ default:
+ f54->report_type = INVALID_REPORT_TYPE;
+ f54->report_size = 0;
+ return false;
+ }
+}
+
+static void test_set_report_size(void)
+{
+ int retval;
+ unsigned char tx = f54->tx_assigned;
+ unsigned char rx = f54->rx_assigned;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ switch (f54->report_type) {
+ case F54_8BIT_IMAGE:
+ f54->report_size = tx * rx;
+ break;
+ case F54_16BIT_IMAGE:
+ case F54_RAW_16BIT_IMAGE:
+ case F54_TRUE_BASELINE:
+ case F54_FULL_RAW_CAP:
+ case F54_FULL_RAW_CAP_NO_RX_COUPLING:
+ case F54_SENSOR_SPEED:
+ case F54_AMP_FULL_RAW_CAP:
+ case F54_AMP_RAW_ADC:
+ /* td43xx start */
+ case F54_TD43XX_FULL_RAW:
+ case F54_TD43XX_NOISE:
+ /* td43xx end */
+ f54->report_size = 2 * tx * rx;
+ break;
+ /* td43xx start */
+ case F54_TD43XX_EE_SHORT:
+ f54->report_size = 2 * 2 * tx * rx;
+ break;
+ /* td43xx end */
+ case F54_HIGH_RESISTANCE:
+ f54->report_size = HIGH_RESISTANCE_DATA_SIZE;
+ break;
+ case F54_TX_TO_TX_SHORTS:
+ case F54_TX_OPENS:
+ case F54_TX_TO_GND_SHORTS:
+ f54->report_size = (tx + 7) / 8;
+ break;
+ case F54_RX_TO_RX_SHORTS_1:
+ case F54_RX_OPENS_1:
+ if (rx < tx)
+ f54->report_size = 2 * rx * rx;
+ else
+ f54->report_size = 2 * tx * rx;
+ break;
+ case F54_FULL_RAW_CAP_MIN_MAX:
+ f54->report_size = FULL_RAW_CAP_MIN_MAX_DATA_SIZE;
+ break;
+ case F54_RX_TO_RX_SHORTS_2:
+ case F54_RX_OPENS_2:
+ if (rx <= tx)
+ f54->report_size = 0;
+ else
+ f54->report_size = 2 * rx * (rx - tx);
+ break;
+ case F54_ADC_RANGE:
+ if (f54->query.has_signal_clarity) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->control.reg_41->address,
+ f54->control.reg_41->data,
+ sizeof(f54->control.reg_41->data));
+ if (retval < 0) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read control reg_41\n",
+ __func__);
+ f54->report_size = 0;
+ break;
+ }
+ if (!f54->control.reg_41->no_signal_clarity) {
+ if (tx % 4)
+ tx += 4 - (tx % 4);
+ }
+ }
+ f54->report_size = 2 * tx * rx;
+ break;
+ case F54_TRX_OPENS:
+ case F54_TRX_TO_GND_SHORTS:
+ case F54_TRX_SHORTS:
+ f54->report_size = TRX_OPEN_SHORT_DATA_SIZE;
+ break;
+ case F54_ABS_RAW_CAP:
+ case F54_ABS_DELTA_CAP:
+ case F54_ABS_HYBRID_DELTA_CAP:
+ case F54_ABS_HYBRID_RAW_CAP:
+ f54->report_size = 4 * (tx + rx);
+ break;
+ case F54_ABS_DOZE_NO_CBC_INCELL:
+ f54->report_size = 4 * (tx + rx);
+ break;
+ default:
+ f54->report_size = 0;
+ }
+
+ return;
+}
+
+static int test_set_interrupt(bool set)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char zero = 0x00;
+ unsigned char temp;
+ unsigned char *intr_mask;
+ unsigned short f01_ctrl_reg;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ intr_mask = rmi4_data->intr_mask;
+ f01_ctrl_reg = rmi4_data->f01_ctrl_base_addr + 1 + f54->intr_reg_num;
+
+ if (!set) {
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f01_ctrl_reg,
+ &zero,
+ sizeof(zero));
+ if (retval < 0)
+ return retval;
+ }
+
+ for (ii = 0; ii < rmi4_data->num_of_intr_regs; ii++) {
+ if (intr_mask[ii] != 0x00) {
+ f01_ctrl_reg = rmi4_data->f01_ctrl_base_addr + 1 + ii;
+ if (set) {
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f01_ctrl_reg,
+ &zero,
+ sizeof(zero));
+ if (retval < 0)
+ return retval;
+ } else {
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f01_ctrl_reg,
+ &(intr_mask[ii]),
+ sizeof(intr_mask[ii]));
+ if (retval < 0)
+ return retval;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f01_ctrl_reg,
+ &temp,
+ sizeof(temp));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read interrupt enable register\n",
+ __func__);
+ return retval;
+ }
+
+ pr_err("%s: intr_mask[%d] = 0x%02x\n", __func__, ii, intr_mask[ii]);
+ pr_err("%s: temp = 0x%02x\n", __func__, temp);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f01_ctrl_reg,
+ &(intr_mask[ii]),
+ sizeof(intr_mask[ii]));
+ if (retval < 0)
+ return retval;
+ }
+ }
+ }
+
+ f01_ctrl_reg = rmi4_data->f01_ctrl_base_addr + 1 + f54->intr_reg_num;
+
+ if (set) {
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f01_ctrl_reg,
+ &f54->intr_mask,
+ 1);
+ if (retval < 0)
+ return retval;
+ }
+
+ return 0;
+}
+
+static int test_wait_for_command_completion(void)
+{
+ int retval;
+ unsigned char value;
+ unsigned char timeout_count;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ timeout_count = 0;
+ do {
+ if (rmi4_data->suspend)
+ return -EINVAL;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->command_base_addr,
+ &value,
+ sizeof(value));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read command register\n",
+ __func__);
+ return retval;
+ }
+
+ if (value == 0x00)
+ break;
+
+ msleep(100);
+ timeout_count++;
+ } while (timeout_count < COMMAND_TIMEOUT_100MS);
+
+ if (timeout_count == COMMAND_TIMEOUT_100MS) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Timed out waiting for command completion\n",
+ __func__);
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: command = 0x%02x\n", __func__, value);
+ return -ETIMEDOUT;
+ }
+
+ return 0;
+}
+
+static int test_do_command(unsigned char command)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->command_base_addr,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write command\n",
+ __func__);
+ return retval;
+ }
+
+ retval = test_wait_for_command_completion();
+ if (retval < 0)
+ return retval;
+
+ return 0;
+}
+
+static int test_do_preparation(void)
+{
+ int retval;
+ unsigned char value;
+ unsigned char zero = 0x00;
+#ifndef USE_RT8
+ unsigned char device_ctrl;
+#endif
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+#ifndef USE_RT8
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set no sleep\n",
+ __func__);
+ return retval;
+ }
+
+ device_ctrl |= NO_SLEEP_ON;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set no sleep\n",
+ __func__);
+ return retval;
+ }
+
+#endif
+ if (f54->skip_preparation)
+ return 0;
+
+ switch (f54->report_type) {
+ case F54_16BIT_IMAGE:
+ case F54_RAW_16BIT_IMAGE:
+ case F54_SENSOR_SPEED:
+ case F54_ADC_RANGE:
+ case F54_ABS_RAW_CAP:
+ case F54_ABS_DELTA_CAP:
+ case F54_ABS_HYBRID_DELTA_CAP:
+ case F54_ABS_HYBRID_RAW_CAP:
+#ifdef USE_RT8
+ case F54_FULL_RAW_CAP_NO_RX_COUPLING:
+#endif
+ case F54_TD43XX_FULL_RAW:
+ break;
+ case F54_AMP_RAW_ADC:
+ if (f54->query_49.has_ctrl188) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->control.reg_188->address,
+ f54->control.reg_188->data,
+ sizeof(f54->control.reg_188->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set start production test\n",
+ __func__);
+ return retval;
+ }
+ f54->control.reg_188->start_production_test = 1;
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->control.reg_188->address,
+ f54->control.reg_188->data,
+ sizeof(f54->control.reg_188->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set start production test\n",
+ __func__);
+ return retval;
+ }
+ }
+ break;
+ case F54_ABS_DOZE_NO_CBC_INCELL:
+ if (f54->query_65.has_ctrl225) {
+ /* enable force doze mode */
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->control.reg_225->address,
+ &value,
+ sizeof(value));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: fail to read f54 ctrl225 reg\n",
+ __func__);
+ return retval;
+ }
+
+ if (!(value && 0x01)) {
+ value = (value | 0x01);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->control.reg_225->address,
+ &value,
+ sizeof(value));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: fail to set f54 ctrl225 reg\n",
+ __func__);
+ return retval;
+ }
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: fail to do force update\n",
+ __func__);
+ return retval;
+ }
+ }
+
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: fail to get f01 ctrl base reg\n",
+ __func__);
+ return retval;
+ }
+
+ device_ctrl &= 0xF8; /* clear the bit of no-sleep and set sleep mode = '00'*/
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: fail to set f01 ctrl base reg\n",
+ __func__);
+ return retval;
+ }
+
+ }
+ break;
+ default:
+ if (f54->query.touch_controller_family == 1)
+ disable_cbc(reg_7);
+ else if (f54->query.has_ctrl88)
+ disable_cbc(reg_88);
+
+ if (f54->query.has_0d_acquisition_control)
+ disable_cbc(reg_57);
+
+ if ((f54->query.has_query15) &&
+ (f54->query_15.has_query25) &&
+ (f54->query_25.has_query27) &&
+ (f54->query_27.has_query29) &&
+ (f54->query_29.has_query30) &&
+ (f54->query_30.has_query32) &&
+ (f54->query_32.has_query33) &&
+ (f54->query_33.has_query36) &&
+ (f54->query_36.has_query38) &&
+ (f54->query_38.has_ctrl149)) {
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->control.reg_149->address,
+ &zero,
+ sizeof(f54->control.reg_149->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to disable global CBC\n",
+ __func__);
+ return retval;
+ }
+ }
+
+ if (f54->query.has_signal_clarity) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->control.reg_41->address,
+ &value,
+ sizeof(f54->control.reg_41->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to disable signal clarity\n",
+ __func__);
+ return retval;
+ }
+ value |= 0x01;
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->control.reg_41->address,
+ &value,
+ sizeof(f54->control.reg_41->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to disable signal clarity\n",
+ __func__);
+ return retval;
+ }
+ }
+
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update\n",
+ __func__);
+ return retval;
+ }
+
+ retval = test_do_command(COMMAND_FORCE_CAL);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force cal\n",
+ __func__);
+ return retval;
+ }
+ }
+
+ return 0;
+}
+
+static int test_do_afe_calibration(enum f54_afe_cal mode)
+{
+ int retval;
+ unsigned char timeout = CALIBRATION_TIMEOUT_S;
+ unsigned char timeout_count = 0;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->control.reg_188->address,
+ f54->control.reg_188->data,
+ sizeof(f54->control.reg_188->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to start calibration\n",
+ __func__);
+ return retval;
+ }
+
+ if (mode == F54_AFE_CAL)
+ f54->control.reg_188->start_calibration = 1;
+ else if (mode == F54_AFE_IS_CAL)
+ f54->control.reg_188->start_is_calibration = 1;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->control.reg_188->address,
+ f54->control.reg_188->data,
+ sizeof(f54->control.reg_188->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to start calibration\n",
+ __func__);
+ return retval;
+ }
+
+ do {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->control.reg_188->address,
+ f54->control.reg_188->data,
+ sizeof(f54->control.reg_188->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to complete calibration\n",
+ __func__);
+ return retval;
+ }
+
+ if (mode == F54_AFE_CAL) {
+ if (!f54->control.reg_188->start_calibration)
+ break;
+ } else if (mode == F54_AFE_IS_CAL) {
+ if (!f54->control.reg_188->start_is_calibration)
+ break;
+ }
+
+ if (timeout_count == timeout) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Timed out waiting for calibration completion\n",
+ __func__);
+ return -EBUSY;
+ }
+
+ timeout_count++;
+ msleep(1000);
+ } while (true);
+
+ /* check CRC */
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->data_31.address,
+ f54->data_31.data,
+ sizeof(f54->data_31.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read calibration CRC\n",
+ __func__);
+ return retval;
+ }
+
+ if (mode == F54_AFE_CAL) {
+ if (f54->data_31.calibration_crc == 0)
+ return 0;
+ } else if (mode == F54_AFE_IS_CAL) {
+ if (f54->data_31.is_calibration_crc == 0)
+ return 0;
+ }
+
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read calibration CRC\n",
+ __func__);
+
+ return -EINVAL;
+}
+
+static int test_check_for_idle_status(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ switch (f54->status) {
+ case STATUS_IDLE:
+ retval = 0;
+ break;
+ case STATUS_BUSY:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Status busy\n",
+ __func__);
+ retval = -EINVAL;
+ break;
+ case STATUS_ERROR:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Status error\n",
+ __func__);
+ retval = -EINVAL;
+ break;
+ default:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Invalid status (%d)\n",
+ __func__, f54->status);
+ retval = -EINVAL;
+ }
+
+ return retval;
+}
+
+static void test_timeout_work(struct work_struct *work)
+{
+ int retval;
+ unsigned char command;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ mutex_lock(&f54->status_mutex);
+
+ if (f54->status == STATUS_BUSY) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->command_base_addr,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read command register\n",
+ __func__);
+ } else if (command & COMMAND_GET_REPORT) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Report type not supported by FW\n",
+ __func__);
+ } else {
+ queue_work(f54->test_report_workqueue,
+ &f54->test_report_work);
+ goto exit;
+ }
+ f54->status = STATUS_ERROR;
+ f54->report_size = 0;
+ }
+
+exit:
+ mutex_unlock(&f54->status_mutex);
+
+ return;
+}
+
+static enum hrtimer_restart test_get_report_timeout(struct hrtimer *timer)
+{
+ schedule_work(&(f54->timeout_work));
+
+ return HRTIMER_NORESTART;
+}
+
+static int test_do_resume_touch(void)
+{
+ int retval = 0;
+#ifndef USE_RT8
+ unsigned char device_ctrl;
+#endif
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+#ifndef USE_RT8
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to restore no sleep setting\n",
+ __func__);
+ return retval;
+ }
+
+ device_ctrl = device_ctrl & ~NO_SLEEP_ON;
+ device_ctrl |= rmi4_data->no_sleep_setting;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ rmi4_data->f01_ctrl_base_addr,
+ &device_ctrl,
+ sizeof(device_ctrl));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to restore no sleep setting\n",
+ __func__);
+ return retval;
+ }
+#endif
+ test_set_interrupt(false);
+
+ if (f54->skip_preparation)
+ return 0;
+
+ switch (f54->report_type) {
+ case F54_16BIT_IMAGE:
+ case F54_RAW_16BIT_IMAGE:
+ case F54_SENSOR_SPEED:
+ case F54_ADC_RANGE:
+ case F54_ABS_RAW_CAP:
+ case F54_ABS_DELTA_CAP:
+ case F54_ABS_HYBRID_DELTA_CAP:
+ case F54_ABS_HYBRID_RAW_CAP:
+#ifdef USE_RT8
+ case F54_FULL_RAW_CAP_NO_RX_COUPLING:
+#endif
+ case F54_TD43XX_FULL_RAW:
+ break;
+ case F54_ABS_DOZE_NO_CBC_INCELL:
+ rmi4_data->reset_device(rmi4_data, false);
+ break;
+ case F54_AMP_RAW_ADC:
+ if (f54->query_49.has_ctrl188) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->control.reg_188->address,
+ f54->control.reg_188->data,
+ sizeof(f54->control.reg_188->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set start production test\n",
+ __func__);
+ return retval;
+ }
+ f54->control.reg_188->start_production_test = 0;
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->control.reg_188->address,
+ f54->control.reg_188->data,
+ sizeof(f54->control.reg_188->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set start production test\n",
+ __func__);
+ return retval;
+ }
+ }
+ break;
+ default:
+ pr_err("%s: resetting device\n", __func__);
+ rmi4_data->reset_device(rmi4_data, false);
+ pr_err("%s: done resetting device\n", __func__);
+ }
+
+ return retval;
+}
+
+static void test_resume_touch_work(struct work_struct *work)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = test_do_resume_touch();
+ if (retval < 0)
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Resume touch failed\n", __func__);
+
+}
+
+static ssize_t test_sysfs_num_of_mapped_tx_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", f54->tx_assigned);
+}
+
+static ssize_t test_sysfs_num_of_mapped_rx_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", f54->rx_assigned);
+}
+
+static ssize_t test_sysfs_tx_mapping_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int cnt;
+ int count = 0;
+ unsigned char ii;
+ unsigned char tx_num;
+ unsigned char tx_electrodes;
+
+ if (!f55)
+ return -EINVAL;
+
+ tx_electrodes = f55->query.num_of_tx_electrodes;
+
+ for (ii = 0; ii < tx_electrodes; ii++) {
+ tx_num = f55->tx_assignment[ii];
+ if (tx_num == 0xff)
+ cnt = snprintf(buf, PAGE_SIZE - count, "xx ");
+ else
+ cnt = snprintf(buf, PAGE_SIZE - count, "%02u ", tx_num);
+ buf += cnt;
+ count += cnt;
+ }
+
+ snprintf(buf, PAGE_SIZE - count, "\n");
+ count++;
+
+ return count;
+}
+
+static ssize_t test_sysfs_rx_mapping_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int cnt;
+ int count = 0;
+ unsigned char ii;
+ unsigned char rx_num;
+ unsigned char rx_electrodes;
+
+ if (!f55)
+ return -EINVAL;
+
+ rx_electrodes = f55->query.num_of_rx_electrodes;
+
+ for (ii = 0; ii < rx_electrodes; ii++) {
+ rx_num = f55->rx_assignment[ii];
+ if (rx_num == 0xff)
+ cnt = snprintf(buf, PAGE_SIZE - count, "xx ");
+ else
+ cnt = snprintf(buf, PAGE_SIZE - count, "%02u ", rx_num);
+ buf += cnt;
+ count += cnt;
+ }
+
+ snprintf(buf, PAGE_SIZE - count, "\n");
+ count++;
+
+ return count;
+}
+
+static ssize_t test_sysfs_force_tx_mapping_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int cnt;
+ int count = 0;
+ unsigned char ii;
+ unsigned char tx_num;
+ unsigned char tx_electrodes;
+
+ if (!f55 || !f55->has_force)
+ return -EINVAL;
+
+ tx_electrodes = f55->query.num_of_tx_electrodes;
+
+ for (ii = 0; ii < tx_electrodes; ii++) {
+ tx_num = f55->force_tx_assignment[ii];
+ if (tx_num == 0xff)
+ cnt = snprintf(buf, PAGE_SIZE - count, "xx ");
+ else
+ cnt = snprintf(buf, PAGE_SIZE - count, "%02u ", tx_num);
+ buf += cnt;
+ count += cnt;
+ }
+
+ snprintf(buf, PAGE_SIZE - count, "\n");
+ count++;
+
+ return count;
+}
+
+static ssize_t test_sysfs_force_rx_mapping_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int cnt;
+ int count = 0;
+ unsigned char ii;
+ unsigned char rx_num;
+ unsigned char rx_electrodes;
+
+ if (!f55 || !f55->has_force)
+ return -EINVAL;
+
+ rx_electrodes = f55->query.num_of_rx_electrodes;
+
+ for (ii = 0; ii < rx_electrodes; ii++) {
+ rx_num = f55->force_rx_assignment[ii];
+ if (rx_num == 0xff)
+ cnt = snprintf(buf, PAGE_SIZE - count, "xx ");
+ else
+ cnt = snprintf(buf, PAGE_SIZE - count, "%02u ", rx_num);
+ buf += cnt;
+ count += cnt;
+ }
+
+ snprintf(buf, PAGE_SIZE - count, "\n");
+ count++;
+
+ return count;
+}
+
+static ssize_t test_sysfs_report_size_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", f54->report_size);
+}
+
+static ssize_t test_sysfs_status_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+
+ mutex_lock(&f54->status_mutex);
+
+ retval = snprintf(buf, PAGE_SIZE, "%u\n", f54->status);
+
+ mutex_unlock(&f54->status_mutex);
+
+ return retval;
+}
+
+static ssize_t test_sysfs_do_preparation_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting != 1)
+ return -EINVAL;
+
+ mutex_lock(&f54->status_mutex);
+
+ retval = test_check_for_idle_status();
+ if (retval < 0)
+ goto exit;
+
+ retval = test_do_preparation();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do preparation\n",
+ __func__);
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ mutex_unlock(&f54->status_mutex);
+
+ return retval;
+}
+
+static ssize_t test_sysfs_force_cal_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting != 1)
+ return -EINVAL;
+
+ mutex_lock(&f54->status_mutex);
+
+ retval = test_check_for_idle_status();
+ if (retval < 0)
+ goto exit;
+
+ retval = test_do_command(COMMAND_FORCE_CAL);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force cal\n",
+ __func__);
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ mutex_unlock(&f54->status_mutex);
+
+ return retval;
+}
+
+/* tddi f54 test reporting + */
+#ifdef F54_POLLING_GET_REPORT
+static ssize_t test_sysfs_get_report_polling(void)
+{
+ int retval = 0;
+ unsigned char report_index[2];
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = test_wait_for_command_completion();
+ if (retval < 0) {
+ retval = -EIO;
+ f54->status = STATUS_ERROR;
+ return retval;
+ }
+
+ test_set_report_size();
+ if (f54->report_size == 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Report data size = 0\n", __func__);
+ retval = -EIO;
+ f54->status = STATUS_ERROR;
+ return retval;
+ }
+
+ if (f54->data_buffer_size < f54->report_size) {
+ if (f54->data_buffer_size)
+ kfree(f54->report_data);
+ f54->report_data = kzalloc(f54->report_size, GFP_KERNEL);
+ if (!f54->report_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for data buffer\n", __func__);
+ f54->data_buffer_size = 0;
+ retval = -EIO;
+ f54->status = STATUS_ERROR;
+ return retval;
+ }
+ f54->data_buffer_size = f54->report_size;
+ }
+
+ report_index[0] = 0;
+ report_index[1] = 0;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->data_base_addr + REPORT_INDEX_OFFSET,
+ report_index,
+ sizeof(report_index));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write report data index\n", __func__);
+ retval = -EIO;
+ f54->status = STATUS_ERROR;
+ return retval;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->data_base_addr + REPORT_DATA_OFFSET,
+ f54->report_data,
+ f54->report_size);
+
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report data\n",
+ __func__);
+ retval = -EIO;
+ f54->status = STATUS_ERROR;
+ return retval;
+ }
+
+ f54->status = STATUS_IDLE;
+ return retval;
+}
+#endif
+/* tddi f54 test reporting - */
+
+
+static ssize_t test_sysfs_get_report_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned char command;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting != 1)
+ return -EINVAL;
+
+ mutex_lock(&f54->status_mutex);
+
+ retval = test_check_for_idle_status();
+ if (retval < 0)
+ goto exit;
+
+ if (!test_report_type_valid(f54->report_type)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Invalid report type\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ test_set_interrupt(true);
+
+ command = (unsigned char)COMMAND_GET_REPORT;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->command_base_addr,
+ &command,
+ sizeof(command));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write get report command\n",
+ __func__);
+ goto exit;
+ }
+
+/* tddi f54 test reporting + */
+#ifdef F54_POLLING_GET_REPORT
+
+ retval = test_sysfs_get_report_polling();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to get report image\n",
+ __func__);
+ goto exit;
+ }
+
+#else
+ f54->status = STATUS_BUSY;
+ f54->report_size = 0;
+ f54->data_pos = 0;
+/*
+ hrtimer_start(&f54->watchdog,
+ ktime_set(GET_REPORT_TIMEOUT_S, 0),
+ HRTIMER_MODE_REL);
+*/
+ retval = count;
+
+#endif
+
+exit:
+ mutex_unlock(&f54->status_mutex);
+
+ return retval;
+}
+
+static ssize_t test_sysfs_resume_touch_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting != 1)
+ return -EINVAL;
+
+ retval = test_do_resume_touch();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Resume touch failed\n", __func__);
+ return -EINVAL;
+ }
+
+ return count;
+}
+
+static ssize_t test_sysfs_do_afe_calibration_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (!f54->query_49.has_ctrl188) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: F54_ANALOG_Ctrl188 not found\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ if (setting == 0 || setting == 1)
+ retval = test_do_afe_calibration((enum f54_afe_cal)setting);
+ else
+ return -EINVAL;
+
+ if (retval)
+ return retval;
+ else
+ return count;
+}
+
+static ssize_t test_sysfs_report_type_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", f54->report_type);
+}
+
+static ssize_t test_sysfs_report_type_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned char data;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+#ifdef USE_RT8
+ static bool do_once;
+#endif
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ mutex_lock(&f54->status_mutex);
+
+ retval = test_check_for_idle_status();
+ if (retval < 0)
+ goto exit;
+
+#ifdef USE_RT8
+ if (setting == 20)
+ setting = 8;
+#endif
+
+ if (!test_report_type_valid((enum f54_report_types)setting)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Report type not supported by driver\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+#ifdef USE_RT8
+ if ((f54->report_type == F54_FULL_RAW_CAP_NO_RX_COUPLING) && do_once) {
+ rmi4_data->reset_device(rmi4_data, false);
+ msleep(1000);
+ retval = test_do_command(COMMAND_ENTER_INCELL_TEST_MODE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to enter incell test mode\n",
+ __func__);
+ goto exit;
+ }
+ msleep(100);
+ do_once = false;
+ }
+#endif
+
+ f54->report_type = (enum f54_report_types)setting;
+ data = (unsigned char)setting;
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->data_base_addr,
+ &data,
+ sizeof(data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write report type\n",
+ __func__);
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ mutex_unlock(&f54->status_mutex);
+
+ return retval;
+}
+
+static ssize_t test_sysfs_fifoindex_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int retval;
+ unsigned char data[2];
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->data_base_addr + REPORT_INDEX_OFFSET,
+ data,
+ sizeof(data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report index\n",
+ __func__);
+ return retval;
+ }
+
+ batohs(&f54->fifoindex, data);
+
+ return snprintf(buf, PAGE_SIZE, "%u\n", f54->fifoindex);
+}
+
+static ssize_t test_sysfs_fifoindex_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned char data[2];
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ f54->fifoindex = setting;
+
+ hstoba(data, (unsigned short)setting);
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->data_base_addr + REPORT_INDEX_OFFSET,
+ data,
+ sizeof(data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write report index\n",
+ __func__);
+ return retval;
+ }
+
+ return count;
+}
+
+static ssize_t test_sysfs_no_auto_cal_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PAGE_SIZE, "%u\n", f54->no_auto_cal);
+}
+
+static ssize_t test_sysfs_no_auto_cal_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned char data;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting > 1)
+ return -EINVAL;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->control_base_addr,
+ &data,
+ sizeof(data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read no auto cal setting\n",
+ __func__);
+ return retval;
+ }
+
+ if (setting)
+ data |= CONTROL_NO_AUTO_CAL;
+ else
+ data &= ~CONTROL_NO_AUTO_CAL;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->control_base_addr,
+ &data,
+ sizeof(data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write no auto cal setting\n",
+ __func__);
+ return retval;
+ }
+
+ f54->no_auto_cal = (setting == 1);
+
+ return count;
+}
+
+static ssize_t test_sysfs_read_report_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ unsigned int ii;
+ unsigned int jj;
+ int cnt;
+ int count = 0;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ char *report_data_8;
+ short *report_data_16;
+ int *report_data_32;
+ unsigned short *report_data_u16;
+ unsigned int *report_data_u32;
+
+ if (f54->report_data == NULL)
+ return -EINVAL;
+
+ pr_err("%s: f54->report_type = %d\n", __func__, f54->report_type);
+
+ switch (f54->report_type) {
+ case F54_8BIT_IMAGE:
+ report_data_8 = (char *)f54->report_data;
+ for (ii = 0; ii < f54->report_size; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, "%03d: %d\n",
+ ii, *report_data_8);
+ report_data_8++;
+ buf += cnt;
+ count += cnt;
+ }
+ break;
+ case F54_AMP_RAW_ADC:
+ report_data_u16 = (unsigned short *)f54->report_data;
+ cnt = snprintf(buf, PAGE_SIZE - count, "tx = %d\nrx = %d\n",
+ tx_num, rx_num);
+ buf += cnt;
+ count += cnt;
+
+ for (ii = 0; ii < tx_num; ii++) {
+ for (jj = 0; jj < (rx_num - 1); jj++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d ",
+ *report_data_u16);
+ report_data_u16++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d\n",
+ *report_data_u16);
+ report_data_u16++;
+ buf += cnt;
+ count += cnt;
+ }
+ break;
+ case F54_16BIT_IMAGE:
+ case F54_RAW_16BIT_IMAGE:
+ case F54_TRUE_BASELINE:
+ case F54_FULL_RAW_CAP:
+ case F54_FULL_RAW_CAP_NO_RX_COUPLING:
+ case F54_SENSOR_SPEED:
+ case F54_AMP_FULL_RAW_CAP:
+ /* td43xx start */
+ case F54_TD43XX_NOISE:
+ /* td43xx end */
+ report_data_16 = (short *)f54->report_data;
+ cnt = snprintf(buf, PAGE_SIZE - count, "tx = %d\nrx = %d\n",
+ tx_num, rx_num);
+ buf += cnt;
+ count += cnt;
+
+ for (ii = 0; ii < tx_num; ii++) {
+ for (jj = 0; jj < (rx_num - 1); jj++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d ",
+ *report_data_16);
+ report_data_16++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d\n",
+ *report_data_16);
+ report_data_16++;
+ buf += cnt;
+ count += cnt;
+ }
+ break;
+ /* tddi f54 test reporting + */
+ case F54_TD43XX_FULL_RAW:
+ report_data_u16 = (unsigned short *)f54->report_data;
+ cnt = snprintf(buf, PAGE_SIZE - count, "tx = %d\nrx = %d\n\n",
+ tx_num, rx_num);
+ buf += cnt;
+ count += cnt;
+
+ for (ii = 0; ii < tx_num; ii++) {
+ for (jj = 0; jj < (rx_num - 1); jj++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-5d ",
+ *report_data_u16);
+ report_data_u16++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-5d\n",
+ *report_data_u16);
+ report_data_u16++;
+ buf += cnt;
+ count += cnt;
+ }
+ break;
+ case F54_TD43XX_EE_SHORT:
+ report_data_u16 = (unsigned short *)f54->report_data;
+ cnt = snprintf(buf, PAGE_SIZE - count, "tx = %d\nrx = %d\n\n",
+ tx_num, rx_num);
+ buf += cnt;
+ count += cnt;
+
+ for (ii = 0; ii < tx_num; ii++) {
+ for (jj = 0; jj < (rx_num - 1); jj++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d ",
+ *report_data_u16);
+ report_data_u16++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d\n",
+ *report_data_u16);
+ report_data_u16++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < tx_num; ii++) {
+ for (jj = 0; jj < (rx_num - 1); jj++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d ",
+ *report_data_u16);
+ report_data_u16++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d\n",
+ *report_data_u16);
+ report_data_u16++;
+ buf += cnt;
+ count += cnt;
+ }
+ break;
+ /* tddi f54 test reporting - */
+ case F54_HIGH_RESISTANCE:
+ case F54_FULL_RAW_CAP_MIN_MAX:
+ report_data_16 = (short *)f54->report_data;
+ for (ii = 0; ii < f54->report_size; ii += 2) {
+ cnt = snprintf(buf, PAGE_SIZE - count, "%03d: %d\n",
+ ii / 2, *report_data_16);
+ report_data_16++;
+ buf += cnt;
+ count += cnt;
+ }
+ break;
+ case F54_ABS_RAW_CAP:
+ report_data_u32 = (unsigned int *)f54->report_data;
+ cnt = snprintf(buf, PAGE_SIZE - count, "rx ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < rx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %2d", ii);
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+
+ cnt = snprintf(buf, PAGE_SIZE - count, " ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < rx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %5u",
+ *report_data_u32);
+ report_data_u32++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+
+ cnt = snprintf(buf, PAGE_SIZE - count, "tx ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < tx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %2d", ii);
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+
+ cnt = snprintf(buf, PAGE_SIZE - count, " ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < tx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %5u",
+ *report_data_u32);
+ report_data_u32++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+ break;
+ case F54_ABS_DELTA_CAP:
+ case F54_ABS_HYBRID_DELTA_CAP:
+ case F54_ABS_HYBRID_RAW_CAP:
+ report_data_32 = (int *)f54->report_data;
+ cnt = snprintf(buf, PAGE_SIZE - count, "rx ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < rx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %2d", ii);
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+
+ cnt = snprintf(buf, PAGE_SIZE - count, " ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < rx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %5d",
+ *report_data_32);
+ report_data_32++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+
+ cnt = snprintf(buf, PAGE_SIZE - count, "tx ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < tx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %2d", ii);
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+
+ cnt = snprintf(buf, PAGE_SIZE - count, " ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < tx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %5d",
+ *report_data_32);
+ report_data_32++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+ break;
+ case F54_ABS_DOZE_NO_CBC_INCELL:
+ cnt = snprintf(buf, PAGE_SIZE - count, "tx = %d, rx = %d\n\n",
+ tx_num, rx_num);
+ buf += cnt;
+ count += cnt;
+
+ report_data_u32 = (unsigned int *)f54->report_data;
+ cnt = snprintf(buf, PAGE_SIZE - count, "rx ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < rx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %2d", ii);
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+
+ cnt = snprintf(buf, PAGE_SIZE - count, " ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < rx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %5u",
+ *report_data_u32);
+ report_data_u32++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+
+ cnt = snprintf(buf, PAGE_SIZE - count, "tx ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < tx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %2d", ii);
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+
+ cnt = snprintf(buf, PAGE_SIZE - count, " ");
+ buf += cnt;
+ count += cnt;
+ for (ii = 0; ii < tx_num; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, " %5u",
+ *report_data_u32);
+ report_data_u32++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "\n");
+ buf += cnt;
+ count += cnt;
+ break;
+ default:
+ for (ii = 0; ii < f54->report_size; ii++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, "%03d: 0x%02x\n",
+ ii, f54->report_data[ii]);
+ buf += cnt;
+ count += cnt;
+ }
+ }
+
+ snprintf(buf, PAGE_SIZE - count, "\n");
+ count++;
+
+ return count;
+}
+
+static ssize_t test_sysfs_read_report_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned char timeout = GET_REPORT_TIMEOUT_S * 10;
+ unsigned char timeout_count;
+ const char cmd[] = {'1', 0};
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ if (rmi4_data->suspend) {
+ return -EINVAL;
+ }
+
+ pr_err("%s\n", __func__);
+
+ pr_err("%s: f54->tx_assigned = %d\n", __func__, f54->tx_assigned);
+ pr_err("%s: f54->rx_assigned = %d\n", __func__, f54->rx_assigned);
+
+ retval = test_sysfs_report_type_store(dev, attr, buf, count);
+ if (retval < 0)
+ goto exit;
+
+ pr_err("%s: done test_sysfs_report_type_store\n", __func__);
+
+ retval = test_sysfs_do_preparation_store(dev, attr, cmd, 1);
+ if (retval < 0)
+ goto exit;
+
+ pr_err("%s: done test_sysfs_do_preparation_store\n", __func__);
+
+ retval = test_sysfs_get_report_store(dev, attr, cmd, 1);
+ if (retval < 0)
+ goto exit;
+
+ pr_err("%s: done test_sysfs_get_report_store\n", __func__);
+
+ retval = test_wait_for_command_completion();
+ if (retval < 0)
+ goto exit;
+
+ pr_err("%s: done test_wait_for_command_completion\n", __func__);
+
+ if (rmi4_data->chip_is_tddi)
+ queue_work(f54->test_report_workqueue, &f54->test_report_work);
+
+ timeout_count = 0;
+ do {
+ if (f54->status != STATUS_BUSY)
+ break;
+ msleep(100);
+ timeout_count++;
+ } while (timeout_count < timeout);
+
+ if ((f54->status != STATUS_IDLE) || (f54->report_size == 0)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ pr_err("%s: got report\n", __func__);
+
+ if (f54->rmi4_data->dump_flags) {
+ retval = test_sysfs_resume_touch_store(dev, attr, cmd, 1);
+ if (retval < 0)
+ goto exit;
+ } else
+ rmi4_data->reset_device(rmi4_data, false);
+
+ pr_err("%s: exiting\n", __func__);
+
+ return count;
+
+exit:
+ rmi4_data->reset_device(rmi4_data, false);
+ return retval;
+}
+
+/* td43xx start */
+static ssize_t test_sysfs_read_report_td43xx(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count,
+ bool do_preparation, bool do_reset)
+{
+ int retval;
+ unsigned char timeout = GET_REPORT_TIMEOUT_S * 10;
+ unsigned char timeout_count;
+ const char cmd[] = {'1', 0};
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = test_sysfs_report_type_store(dev, attr, buf, count);
+ if (retval < 0)
+ goto exit;
+
+ if (do_preparation) {
+ retval = test_sysfs_do_preparation_store(dev, attr, cmd, 1);
+ if (retval < 0)
+ goto exit;
+ }
+ retval = test_sysfs_get_report_store(dev, attr, cmd, 1);
+ if (retval < 0)
+ goto exit;
+
+ retval = test_wait_for_command_completion();
+ if (retval < 0)
+ goto exit;
+
+ queue_work(f54->test_report_workqueue, &f54->test_report_work);
+
+ timeout_count = 0;
+ do {
+ if (f54->status != STATUS_BUSY)
+ break;
+ msleep(100);
+ timeout_count++;
+ } while (timeout_count < timeout);
+
+ if ((f54->status != STATUS_IDLE) || (f54->report_size == 0)) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+
+ return count;
+
+exit:
+ if (do_reset)
+ rmi4_data->reset_device(rmi4_data, false);
+
+ return retval;
+}
+
+static short FindMedian(short *pdata, int num)
+{
+ int i, j;
+ short temp;
+ short *value;
+ short median;
+
+ value = (short *)kzalloc(num * sizeof(short), GFP_KERNEL);
+
+ for (i = 0; i < num; i++)
+ *(value + i) = *(pdata + i);
+
+ for (i = 1; i <= num - 1; i++) {
+ for (j = 1; j <= num - i; j++) {
+ if (*(value + j - 1) <= *(value + j)) {
+ temp = *(value + j - 1);
+ *(value + j - 1) = *(value + j);
+ *(value + j) = temp;
+ } else
+ continue;
+ }
+ }
+
+ if (num % 2 == 0)
+ median = (*(value + (num / 2 - 1)) + *(value + (num / 2)))/2;
+ else
+ median = *(value + (num / 2));
+
+ if (value)
+ kfree(value);
+
+ return median;
+}
+
+static int tddi_ratio_calculation(signed short *p_image)
+{
+ int retval = 0; int i, j;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ unsigned char left_size = f54->left_mux_size;
+ unsigned char right_size = f54->right_mux_size;
+ signed short *p_data_16;
+ signed short *p_left_median = NULL;
+ signed short *p_right_median = NULL;
+ signed short *p_left_column_buf = NULL;
+ signed short *p_right_column_buf = NULL;
+ signed int temp;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ if (!p_image) {
+ dev_err(rmi4_data->pdev->dev.parent, "%s: Fail. p_image is null\n", __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+
+ p_right_median = (signed short *) kzalloc(rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_right_median) {
+ dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc mem for p_right_median\n", __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_left_median = (signed short *) kzalloc(rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_left_median) {
+ dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc mem for p_left_median\n", __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_right_column_buf = (signed short *) kzalloc(right_size * rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_right_column_buf) {
+ dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc mem for p_right_column_buf\n", __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_left_column_buf = (signed short *) kzalloc(left_size * rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_left_column_buf) {
+ dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc mem for p_left_column_buf\n", __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+
+ if (f54->swap_sensor_side) {
+
+ p_data_16 = p_image;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < left_size; j++) {
+ p_left_column_buf[i * left_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+
+ p_data_16 = p_image + left_size * rx_num;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < right_size; j++) {
+ p_right_column_buf[i * right_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+ }
+ else {
+
+ p_data_16 = p_image;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < right_size; j++) {
+ p_right_column_buf[i * right_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+
+ p_data_16 = p_image + right_size * rx_num;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < left_size; j++) {
+ p_left_column_buf[i * left_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+ }
+
+
+ for (i = 0; i < rx_num; i++) {
+ p_left_median[i] = FindMedian(p_left_column_buf + i * left_size, left_size);
+ p_right_median[i] = FindMedian(p_right_column_buf + i * right_size, right_size);
+ }
+
+
+
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+
+ if (f54->swap_sensor_side) {
+
+ if (i < left_size) {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_left_median[j];
+ }
+ else {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_right_median[j];
+ }
+ }
+ else {
+
+ if (i < right_size) {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_right_median[j];
+ }
+ else {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_left_median[j];
+ }
+ }
+
+
+ p_image[i * rx_num + j] = temp;
+ }
+ }
+
+exit:
+ kfree(p_right_median);
+ kfree(p_left_median);
+ kfree(p_right_column_buf);
+ kfree(p_left_column_buf);
+ return retval;
+}
+static ssize_t test_sysfs_tddi_extend_ee_short_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ int i, j, offset;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ signed short *tddi_rt95_part_one = NULL;
+ signed short *tddi_rt95_part_two = NULL;
+ unsigned int buffer_size = tx_num * rx_num * 2;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+
+ struct f54_control control = f54->control;
+
+ struct f54_control_99 original_f54_ctrl99;
+ struct f54_control_182 original_f54_ctrl182;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting != 1 || !factory_param)
+ return -EINVAL;
+
+ /* allocate the g_tddi_ee_short_data_output */
+ if (td43xx_ee_short_data)
+ kfree(td43xx_ee_short_data);
+
+ td43xx_ee_short_data = kzalloc(tx_num * rx_num, GFP_KERNEL);
+ if (!td43xx_ee_short_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_ee_short_data\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+
+ tddi_rt95_part_one = kzalloc(buffer_size, GFP_KERNEL);
+ if (!tddi_rt95_part_one) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for tddi_rt95_part_one\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ tddi_rt95_part_two = kzalloc(buffer_size, GFP_KERNEL);
+ if (!tddi_rt95_part_two) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_rt95_part_two\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ g_flag_read_report_fail = 0;
+
+ /* step 1 */
+ /* keep the original integration and reset duration */
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ control.reg_99->address,
+ original_f54_ctrl99.data,
+ sizeof(original_f54_ctrl99.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read original data from f54_ctrl99\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ /* keep the original timing control */
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ control.reg_182->address,
+ original_f54_ctrl182.data,
+ sizeof(original_f54_ctrl182.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read original data from f54_ctrl182\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ /* step 2 */
+ /* Modify the Reset duration, Integration duration, and CBC Timing Control as well */
+ control.reg_99->integration_duration_lsb = factory_param->tddi_extend_ee_short_int_dur;
+ control.reg_99->integration_duration_msb = (factory_param->tddi_extend_ee_short_int_dur >> 8) & 0xff;
+ control.reg_99->reset_duration = factory_param->tddi_extend_ee_short_reset_dur;
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_99->address,
+ control.reg_99->data,
+ sizeof(control.reg_99->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set f54_ctrl99 in step 2\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ control.reg_182->cbc_timing_ctrl_tx_lsb = factory_param->tddi_extend_ee_short_tx_on_count;
+ control.reg_182->cbc_timing_ctrl_tx_msb = (factory_param->tddi_extend_ee_short_tx_on_count >> 8) & 0xff;
+ control.reg_182->cbc_timing_ctrl_rx_lsb = factory_param->tddi_extend_ee_short_rx_on_count;
+ control.reg_182->cbc_timing_ctrl_rx_msb = (factory_param->tddi_extend_ee_short_rx_on_count >> 8) & 0xff;
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_182->address,
+ control.reg_182->data,
+ sizeof(control.reg_182->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set f54_reg_182 in step 2\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ /* step 3 */
+ /* Force update */
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update in step 4\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ /* step 4 */
+ /* get report image 95 */
+ retval = test_sysfs_read_report_td43xx(dev, attr, "95", count,
+ false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report 95. exit\n", __func__);
+ retval = -EIO;
+ g_flag_read_report_fail = 1;
+ goto exit;
+ }
+
+
+ /* step 5 */
+ /* use the upper half as part 1 image */
+ /* the data should be lower than TEST_LIMIT_PART1 ( fail, if > TEST_LIMIT_PART1 ) */
+ for (i = 0, offset = 0; i < tx_num * rx_num; i++) {
+ tddi_rt95_part_one[i] = (signed short)(f54->report_data[offset]) |
+ ((signed short)(f54->report_data[offset + 1]) << 8);
+ offset += 2;
+ }
+
+
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+
+ if (tddi_rt95_part_one[i*rx_num + j] > factory_param->tddi_extend_ee_short_test_limit_part1) {
+ dev_err(f54->rmi4_data->pdev->dev.parent,
+ "%s: fail at (tx%-2d, rx%-2d) = %-4d in part 1 image (limit = %d)\n",
+ __func__, i, j, tddi_rt95_part_one[i*rx_num + j], factory_param->tddi_extend_ee_short_test_limit_part1);
+
+ tddi_rt95_part_one[i*rx_num + j] = 1;
+ }
+ else {
+ tddi_rt95_part_one[i*rx_num + j] = 0;
+ }
+ }
+ }
+
+ /* step 6 */
+ /* use the lower half as part 2 image */
+ /* and perform the calculation */
+ /* the calculated data should be over than TEST_LIMIT_PART2 ( fail, if < TEST_LIMIT_PART2 ) */
+ for (i = 0, offset = buffer_size; i < tx_num * rx_num; i++) {
+ tddi_rt95_part_two[i] = (signed short)(f54->report_data[offset]) |
+ ((signed short)(f54->report_data[offset + 1]) << 8);
+ offset += 2;
+ }
+
+
+ tddi_ratio_calculation(tddi_rt95_part_two);
+
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+
+ if (tddi_rt95_part_two[i*rx_num + j] < factory_param->tddi_extend_ee_short_test_limit_part2) {
+ dev_err(f54->rmi4_data->pdev->dev.parent,
+ "%s: fail at (tx%-2d, rx%-2d) = %-4d in part 2 image (limit = %d)\n",
+ __func__, i, j, tddi_rt95_part_two[i*rx_num + j], factory_param->tddi_extend_ee_short_test_limit_part2);
+
+ tddi_rt95_part_two[i*rx_num + j] = 1;
+ }
+ else {
+ tddi_rt95_part_two[i*rx_num + j] = 0;
+ }
+ }
+ }
+
+ /* step 7 */
+ /* filling out the g_tddi_ee_short_data_output */
+ /* 1: fail / 0 : pass */
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ td43xx_ee_short_data[i * rx_num + j] =
+ (unsigned char)(tddi_rt95_part_one[i * rx_num + j]) || tddi_rt95_part_two[i * rx_num + j];
+ }
+ }
+
+
+ /* step 8 */
+ /* restore the original setting */
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_99->address,
+ original_f54_ctrl99.data,
+ sizeof(original_f54_ctrl99.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to restore f54_ctrl99 data\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_182->address,
+ original_f54_ctrl182.data,
+ sizeof(original_f54_ctrl182.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to restore f54_ctrl182 data\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update in step 8\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ retval = count;
+
+exit:
+ kfree(tddi_rt95_part_one);
+ kfree(tddi_rt95_part_two);
+
+ return retval;
+}
+
+static ssize_t test_sysfs_tddi_extend_ee_short_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int i, j;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ int fail_count = 0;
+
+ if (!td43xx_ee_short_data)
+ return -EINVAL;
+
+
+
+ if (1 == g_flag_read_report_fail) {
+ kfree(td43xx_ee_short_data);
+ td43xx_ee_short_data = NULL;
+ return snprintf(buf, PAGE_SIZE, "\nERROR: fail to read report image\n");
+ }
+
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ if (td43xx_ee_short_data[i * rx_num + j] != 0) {
+
+ fail_count += 1;
+ }
+ }
+ }
+
+ kfree(td43xx_ee_short_data);
+ td43xx_ee_short_data = NULL;
+
+ return snprintf(buf, PAGE_SIZE, "%s\n", (fail_count == 0) ? "PASS" : "FAIL");
+}
+
+static ssize_t test_sysfs_td43xx_ee_short_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval = 0;
+ int i, j, offset;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ signed short *td43xx_rt95_part_one = NULL;
+ signed short *td43xx_rt95_part_two = NULL;
+ unsigned int td43xx_rt95_report_size = tx_num * rx_num * 2;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting != 1 || !factory_param)
+ return -EINVAL;
+
+ if (td43xx_ee_short_data)
+ kfree(td43xx_ee_short_data);
+ td43xx_ee_short_data = kzalloc(tx_num * rx_num, GFP_KERNEL);
+ if (!td43xx_ee_short_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_ee_short_data\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ g_flag_read_report_fail = 0;
+
+ td43xx_rt95_part_one = kzalloc(td43xx_rt95_report_size, GFP_KERNEL);
+ if (!td43xx_rt95_part_one) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_rt95_part_one\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ td43xx_rt95_part_two = kzalloc(td43xx_rt95_report_size, GFP_KERNEL);
+ if (!td43xx_rt95_part_two) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_rt95_part_two\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ retval = test_sysfs_read_report_td43xx(dev, attr, "95", count,
+ false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report 95. exit\n",
+ __func__);
+ retval = -EIO;
+ g_flag_read_report_fail = 1;
+ goto exit;
+ }
+ for (i = 0, offset = 0; i < tx_num * rx_num; i++) {
+ td43xx_rt95_part_one[i] = (signed short)(f54->report_data[offset]) |
+ ((signed short)(f54->report_data[offset + 1]) << 8);
+ offset += 2;
+ }
+
+ for (i = 0; i < tx_num * rx_num; i++) {
+ *(td43xx_rt95_part_one + i) =
+ (*(td43xx_rt95_part_one + i) > factory_param->tddi_short_limit_b) ? 1 : 0;
+ }
+
+ for (i = 0, offset = td43xx_rt95_report_size; i < tx_num * rx_num; i++) {
+ td43xx_rt95_part_two[i] = (signed short)(f54->report_data[offset]) |
+ ((signed short)(f54->report_data[offset + 1]) << 8);
+ offset += 2;
+ }
+
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ td43xx_ee_short_data[i * rx_num + j] = td43xx_rt95_part_one[i * rx_num + j];
+ }
+ }
+
+ retval = count;
+
+exit:
+ kfree(td43xx_rt95_part_one);
+ kfree(td43xx_rt95_part_two);
+
+ pr_err("%s: resetting device\n", __func__);
+ rmi4_data->reset_device(rmi4_data, false);
+ pr_err("%s: done resetting device\n", __func__);
+
+ return retval;
+}
+
+static ssize_t test_sysfs_td43xx_ee_short_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int i, j;
+ int tx_num = f54->tx_assigned - 1;
+ int rx_num = f54->rx_assigned;
+ bool result = 1;
+
+ if (!td43xx_ee_short_data)
+ return -EINVAL;
+
+
+ if (1 == g_flag_read_report_fail) {
+ kfree(td43xx_ee_short_data);
+ td43xx_ee_short_data = NULL;
+ return snprintf(buf, PAGE_SIZE, "ERROR: Fail to read RT95 image\n");
+ }
+
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ if (td43xx_ee_short_data[i * rx_num + j] != 0) {
+ result &= 0;
+ dev_err(f54->rmi4_data->pdev->dev.parent, "0x%02x\n", td43xx_ee_short_data[i * rx_num + j]);
+ }
+ }
+ }
+
+ kfree(td43xx_ee_short_data);
+ td43xx_ee_short_data = NULL;
+
+ return snprintf(buf, PAGE_SIZE, "%s\n", (result == 1) ? "PASS" : "FAIL");
+}
+
+static ssize_t test_sysfs_td43xx_noise_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval = 0;
+ int i, j, offset;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ int repeat;
+ int times = 5;
+ signed short report_data_16;
+ signed short *td43xx_noise_max = NULL;
+ signed short *td43xx_noise_min = NULL;
+ unsigned char *td43xx_noise_data = NULL;
+ unsigned int noise_report_size = tx_num * rx_num * 2;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval || (setting != 1))
+ return -EINVAL;
+
+ if (td43xx_noise_data)
+ kfree(td43xx_noise_data);
+ td43xx_noise_data = kzalloc(noise_report_size, GFP_KERNEL);
+ if (!td43xx_noise_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_noise_data\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ if (td43xx_noise_max)
+ kfree(td43xx_noise_data);
+ td43xx_noise_max = (unsigned short *)kzalloc(noise_report_size, GFP_KERNEL);
+ if (!td43xx_noise_max) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_noise_max\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ if (td43xx_noise_min)
+ kfree(td43xx_noise_min);
+ td43xx_noise_min = (unsigned short *) kzalloc(noise_report_size, GFP_KERNEL);
+ if (!td43xx_noise_min) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_noise_min\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ if (td43xx_noise_delta)
+ kfree(td43xx_noise_delta);
+ td43xx_noise_delta = (signed short *)kzalloc(noise_report_size, GFP_KERNEL);
+ if (!td43xx_noise_delta) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_noise_delta\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ for (repeat = 0; repeat < times; repeat++) {
+ retval = test_sysfs_read_report_td43xx(dev, attr, "94", count,
+ false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report 94 at %d round. exit\n",
+ __func__, repeat);
+ retval = -EIO;
+ goto exit;
+ }
+
+ memset(td43xx_noise_data, 0x00, noise_report_size);
+
+ secure_memcpy(td43xx_noise_data, noise_report_size,
+ f54->report_data, f54->report_size, f54->report_size);
+
+ for (i = 0, offset = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ report_data_16 =
+ (signed short)td43xx_noise_data[offset] +
+ ((signed short)td43xx_noise_data[offset+1] << 8);
+ offset += 2;
+ td43xx_noise_max[i*rx_num + j] =
+ max_t(signed short,
+ td43xx_noise_max[i*rx_num + j],
+ report_data_16);
+ td43xx_noise_min[i*rx_num + j] =
+ min_t(signed short,
+ td43xx_noise_min[i*rx_num + j],
+ report_data_16);
+ }
+ }
+ }
+
+ for (i = 0; i < tx_num; i++)
+ for (j = 0; j < rx_num; j++)
+ td43xx_noise_delta[i*rx_num + j] =
+ td43xx_noise_max[i*rx_num + j] -
+ td43xx_noise_min[i*rx_num + j];
+exit:
+ kfree(td43xx_noise_max);
+ kfree(td43xx_noise_min);
+ kfree(td43xx_noise_data);
+
+ return retval;
+}
+
+static ssize_t test_sysfs_td43xx_noise_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int i, j;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ bool result = 1;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+ unsigned int noise_upper_limit;
+
+ if (!factory_param)
+ return -EINVAL;
+
+ noise_upper_limit = factory_param->tddi_noise_limit;
+
+ if (!td43xx_noise_delta)
+ return -EINVAL;
+
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ if (td43xx_noise_delta[i * rx_num + j] > noise_upper_limit) {
+ result &= 0;
+ }
+ }
+ }
+
+ kfree(td43xx_noise_delta);
+ td43xx_noise_delta = NULL;
+ return snprintf(buf, PAGE_SIZE, "%s\n", (result == 1) ? "PASS" : "FAIL");
+}
+
+static ssize_t test_sysfs_td43xx_full_raw_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval = 0;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ unsigned int full_raw_report_size = tx_num * rx_num * 2;
+ unsigned long setting;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting != 1)
+ return -EINVAL;
+
+ if (td43xx_full_raw_data)
+ kfree(td43xx_full_raw_data);
+
+ td43xx_full_raw_data = kzalloc(full_raw_report_size, GFP_KERNEL);
+ if (!td43xx_full_raw_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_full_raw_data\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ retval = test_sysfs_read_report_td43xx(dev, attr, "92", count,
+ false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report 92. exit\n",
+ __func__);
+ return -EIO;
+ }
+
+ secure_memcpy(td43xx_full_raw_data, full_raw_report_size,
+ f54->report_data, f54->report_size, f54->report_size);
+
+ retval = count;
+
+ return retval;
+}
+
+static ssize_t test_sysfs_td43xx_full_raw_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ unsigned int ii;
+ unsigned int jj;
+ int cnt;
+ int count = 0;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ unsigned short *report_data_16;
+
+ if (!td43xx_full_raw_data)
+ return -EINVAL;
+
+ report_data_16 = (short *)td43xx_full_raw_data;
+ cnt = snprintf(buf, PAGE_SIZE - count, "tx = %d\nrx = %d\n",
+ tx_num, rx_num);
+ buf += cnt;
+ count += cnt;
+
+ for (ii = 0; ii < tx_num; ii++) {
+ for (jj = 0; jj < (rx_num - 1); jj++) {
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d ",
+ *report_data_16);
+ report_data_16++;
+ buf += cnt;
+ count += cnt;
+ }
+ cnt = snprintf(buf, PAGE_SIZE - count, "%-4d\n",
+ *report_data_16);
+ report_data_16++;
+ buf += cnt;
+ count += cnt;
+ }
+
+
+ kfree(td43xx_full_raw_data);
+ td43xx_full_raw_data = NULL;
+
+ snprintf(buf, PAGE_SIZE - count, "\n");
+ count++;
+
+ return count;
+}
+
+
+static int tddi_amp_open_data_testing_b7(signed short *p_image,
+ unsigned char *p_result,
+ bool is_b7)
+{
+ int retval = 0;
+ int i, j;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ unsigned char left_size = f54->left_mux_size;
+ unsigned char right_size = f54->right_mux_size;
+ signed short *p_data_16;
+ signed short *p_left_median = NULL;
+ signed short *p_right_median = NULL;
+ signed short *p_left_column_buf = NULL;
+ signed short *p_right_column_buf = NULL;
+ signed int temp;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+
+ if (!factory_param)
+ return -EINVAL;
+
+ if (!p_image) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Fail. p_image is null\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (!p_result) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Fail. p_result is null\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ if (f55->extended_amp_btn) {
+ tx_num -= 1;
+ }
+
+
+ p_right_median = (signed short *) kzalloc(rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_right_median) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for right_median\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_left_median = (signed short *) kzalloc(rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_left_median) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for left_median\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_right_column_buf = (signed short *) kzalloc(right_size * rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_right_column_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for left_column_buf\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_left_column_buf = (signed short *) kzalloc(left_size * rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_left_column_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for left_column_buf\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ if (f54->swap_sensor_side) {
+
+ p_data_16 = p_image;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < left_size; j++) {
+ p_left_column_buf[i * left_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+
+ p_data_16 = p_image + left_size * rx_num;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < right_size; j++) {
+ p_right_column_buf[i * right_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+ }
+ else {
+
+ p_data_16 = p_image;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < right_size; j++) {
+ p_right_column_buf[i * right_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+
+ p_data_16 = p_image + right_size * rx_num;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < left_size; j++) {
+ p_left_column_buf[i * left_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+ }
+
+
+ for (i = 0; i < rx_num; i++) {
+ p_left_median[i] = FindMedian(p_left_column_buf + i * left_size, left_size);
+ p_right_median[i] = FindMedian(p_right_column_buf + i * right_size, right_size);
+ }
+
+
+
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+
+ if (f54->swap_sensor_side) {
+
+ if (i < left_size) {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_left_median[j];
+ } else {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_right_median[j];
+ }
+ }
+ else {
+
+ if (i < right_size) {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_right_median[j];
+ } else {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_left_median[j];
+ }
+ }
+
+ p_result[i * rx_num + j] = 0;
+
+
+
+ if (is_b7) {
+ if ((temp < factory_param->tddi_b7_open_test_limit_phase2_lower) ||
+ (temp > factory_param->tddi_b7_open_test_limit_phase2_upper)) {
+ p_result[i * rx_num + j] = 1;
+
+ pr_info("%s : phase 2 failed at (tx%-2d, rx%-2d), data = %d\n",
+ __func__, i, j, temp);
+ }
+ }
+ else {
+ if (temp < factory_param->tddi_b7_open_test_limit_phase2_lower) {
+ p_result[i * rx_num + j] = 1;
+
+ pr_info("%s : phase 2 failed at (tx%-2d, rx%-2d), data = %d\n",
+ __func__, i, j, temp);
+ }
+ }
+ }
+ }
+
+exit:
+ kfree(p_right_median);
+ kfree(p_left_median);
+ kfree(p_right_column_buf);
+ kfree(p_left_column_buf);
+
+ return retval;
+}
+
+static ssize_t test_sysfs_td4722_b7_amp_open_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval = 0;
+ int i, j, k;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+
+ unsigned long setting;
+ unsigned char original_data_f54_ctrl99[3] = {0x00, 0x00, 0x00};
+ struct f54_control control = f54->control;
+ unsigned char *p_report_data_8 = NULL;
+ signed short *p_rt92_image_1 = NULL;
+ signed short *p_rt92_image_2 = NULL;
+ unsigned char *p_result_1 = NULL;
+ unsigned char *p_result_2 = NULL;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting != 1 || !factory_param)
+ return -EINVAL;
+
+ if (f55->extended_amp_btn) {
+ tx_num -= 1;
+ }
+
+ if (td43xx_amp_open_data)
+ kfree(td43xx_amp_open_data);
+ td43xx_amp_open_data = kzalloc(tx_num * rx_num, GFP_KERNEL);
+ if (!td43xx_amp_open_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_amp_open_data\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+
+ p_report_data_8 = kzalloc(tx_num * rx_num * 2, GFP_KERNEL);
+ if (!p_report_data_8) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_report_data_8\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_rt92_image_1 = kzalloc(tx_num * rx_num * sizeof(signed short), GFP_KERNEL);
+ if (!p_rt92_image_1) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_rt92_image_1\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_rt92_image_2 = kzalloc(tx_num * rx_num * sizeof(signed short), GFP_KERNEL);
+ if (!p_rt92_image_2) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_rt92_image_2\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_result_1 = kzalloc(tx_num * rx_num, GFP_KERNEL);
+ if (!p_result_1) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_result_1\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ p_result_2 = kzalloc(tx_num * rx_num, GFP_KERNEL);
+ if (!p_result_2) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_result_2\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+
+
+ if (f54->query.touch_controller_family != 2) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: not support touch controller family = 0 or 1 \n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ control.reg_99->address,
+ original_data_f54_ctrl99,
+ sizeof(original_data_f54_ctrl99));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read integration duration\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ g_flag_read_report_fail = 0;
+
+ /* step 1 */
+ /* set the in_iter_duration_1 setting */
+ /* and read the first rt92 image */
+ control.reg_99->integration_duration_lsb = factory_param->tddi_b7_open_test_int_dur_one;
+ control.reg_99->integration_duration_msb = (factory_param->tddi_b7_open_test_int_dur_one >> 8) & 0xff;
+ control.reg_99->reset_duration = original_data_f54_ctrl99[2];
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_99->address,
+ control.reg_99->data,
+ sizeof(control.reg_99->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write the integration duration to f54_ctrl_99 in step 1\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update in step 1\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ retval = test_sysfs_read_report_td43xx(dev, attr, "92", count,
+ false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report 92 in step 1. exit\n",
+ __func__);
+ g_flag_read_report_fail = 1;
+ retval = -EIO;
+ goto exit;
+ }
+
+ secure_memcpy(p_report_data_8, tx_num * rx_num * 2,
+ f54->report_data, f54->report_size, f54->report_size);
+
+
+ k = 0;
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ p_rt92_image_1[i * rx_num + j] =
+ (signed short)(p_report_data_8[k] & 0xff) | (signed short)(p_report_data_8[k + 1] << 8);
+
+ k += 2;
+ }
+ }
+
+
+ tddi_amp_open_data_testing_b7(p_rt92_image_1,
+ p_result_1,
+ true);
+
+ memset(p_report_data_8, 0x00, tx_num * rx_num * 2);
+
+ /* step 2 */
+ /* set the in_iter_duration_2 setting */
+ /* and read the second rt92 image */
+ control.reg_99->integration_duration_lsb = factory_param->tddi_b7_open_test_int_dur_two;
+ control.reg_99->integration_duration_msb = (factory_param->tddi_b7_open_test_int_dur_two >> 8) & 0xff;
+ control.reg_99->reset_duration = original_data_f54_ctrl99[2];
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_99->address,
+ control.reg_99->data,
+ sizeof(control.reg_99->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write the integration duration to f54_ctrl_99 in step 2\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update in step 2\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ retval = test_sysfs_read_report_td43xx(dev, attr, "92", count,
+ false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report 92 in step 2. exit\n",
+ __func__);
+ g_flag_read_report_fail = 1;
+ retval = -EIO;
+ goto exit;
+ }
+
+ secure_memcpy(p_report_data_8, tx_num * rx_num * 2,
+ f54->report_data, f54->report_size, f54->report_size);
+
+
+ k = 0;
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ p_rt92_image_2[i * rx_num + j] =
+ (signed short)(p_report_data_8[k] & 0xff) | (signed short)(p_report_data_8[k + 1] << 8);
+
+ k += 2;
+ }
+ }
+
+
+ tddi_amp_open_data_testing_b7(p_rt92_image_2,
+ p_result_2,
+ true);
+
+ /* restore the original settings */
+ control.reg_99->integration_duration_lsb = original_data_f54_ctrl99[0];
+ control.reg_99->integration_duration_msb = original_data_f54_ctrl99[1];
+ control.reg_99->reset_duration = original_data_f54_ctrl99[2];
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_99->address,
+ control.reg_99->data,
+ sizeof(control.reg_99->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write the integration duration to f54_ctrl_99 in restore phase\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update in restore phase\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ /* step 3 */
+ /* check the result */
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+
+ if ((1 == p_result_1[i * rx_num + j]) || (1 == p_result_2[i * rx_num + j]))
+ td43xx_amp_open_data[i * rx_num + j] = 1;
+ else
+ td43xx_amp_open_data[i * rx_num + j] = 0;
+ }
+ }
+
+ retval = count;
+
+
+exit:
+
+ kfree(p_rt92_image_1);
+ kfree(p_rt92_image_2);
+ kfree(p_report_data_8);
+ kfree(p_result_1);
+ kfree(p_result_2);
+
+ pr_err("%s: resetting device\n", __func__);
+ rmi4_data->reset_device(rmi4_data, false);
+ pr_err("%s: done resetting device\n", __func__);
+
+ return count;
+}
+
+static ssize_t test_sysfs_td4722_b7_amp_open_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int i, j;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ int result = 0;
+
+ if (f55->extended_amp_btn) {
+ tx_num -= 1;
+ }
+
+ if (!td43xx_amp_open_data)
+ return -EINVAL;
+
+
+ if (1 == g_flag_read_report_fail) {
+ kfree(td43xx_amp_open_data);
+ td43xx_amp_open_data = NULL;
+ return snprintf(buf, PAGE_SIZE, "ERROR: Fail to read RT92 image\n");
+ }
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ if (td43xx_amp_open_data[i * rx_num + j] != 0) {
+
+ result = 0;
+ break;
+ }
+ }
+ }
+
+ if ((i == tx_num) && (j == rx_num))
+ result = 1;
+
+ kfree(td43xx_amp_open_data);
+ td43xx_amp_open_data = NULL;
+
+ return snprintf(buf, PAGE_SIZE, "%s\n", (result == 1) ? "PASS" : "FAIL");
+}
+static int tddi_amp_open_data_testing(signed short *p_image)
+{
+ int retval = 0;
+ int i, j;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ unsigned char left_size = f54->left_mux_size;
+ unsigned char right_size = f54->right_mux_size;
+ signed short *p_data_16;
+ signed short *p_left_median = NULL;
+ signed short *p_right_median = NULL;
+ signed short *p_left_column_buf = NULL;
+ signed short *p_right_column_buf = NULL;
+ signed int temp;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+
+ if (!factory_param)
+ return -EINVAL;
+
+ if (!p_image) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Fail. p_image is null\n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ p_right_median = (signed short *) kzalloc(rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_right_median) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for right_median\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_left_median = (signed short *) kzalloc(rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_left_median) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for left_median\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_right_column_buf = (signed short *) kzalloc(right_size * rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_right_column_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for left_column_buf\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_left_column_buf = (signed short *) kzalloc(left_size * rx_num * sizeof(short), GFP_KERNEL);
+ if (!p_left_column_buf) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for left_column_buf\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+
+ if (f54->swap_sensor_side) {
+ p_data_16 = p_image;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < left_size; j++) {
+ p_left_column_buf[i * left_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+
+ p_data_16 = p_image + left_size * rx_num;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < right_size; j++) {
+ p_right_column_buf[i * right_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+
+ for (i = 0; i < rx_num; i++) {
+ p_left_median[i] = FindMedian(p_left_column_buf + i * left_size, left_size);
+ p_right_median[i] = FindMedian(p_right_column_buf + i * right_size, right_size);
+ }
+
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ if (i < left_size) {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_left_median[j];
+ } else {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_right_median[j];
+ }
+
+ if ((temp > 0) && temp < factory_param->tddi_open_test_limit_phase2_lower) {
+ td43xx_amp_open_data[i * rx_num + j] = 1;
+
+ pr_info("%s : phase 2 failed at (tx%-2d, rx%-2d), data = %d\n",
+ __func__, i, j, temp);
+ } else
+ td43xx_amp_open_data[i * rx_num + j] = 0;
+ }
+ }
+ } else {
+ p_data_16 = p_image;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < right_size; j++) {
+ p_right_column_buf[i * right_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+
+ p_data_16 = p_image + right_size * rx_num;
+ for (i = 0; i < rx_num; i++) {
+ for (j = 0; j < left_size; j++) {
+ p_left_column_buf[i * left_size + j] = p_data_16[j * rx_num + i];
+ }
+ }
+
+ for (i = 0; i < rx_num; i++) {
+ p_right_median[i] = FindMedian(p_right_column_buf + i * right_size, right_size);
+ p_left_median[i] = FindMedian(p_left_column_buf + i * left_size, left_size);
+ }
+
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ if (i < right_size) {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_right_median[j];
+ } else {
+ temp = (signed int) p_image[i * rx_num + j];
+ temp = temp * 100 / p_left_median[j];
+ }
+
+ if ((temp > 0) && (temp < factory_param->tddi_open_test_limit_phase2_lower)) {
+ td43xx_amp_open_data[i * rx_num + j] = 1;
+
+ pr_info("%s : phase 2 failed at (tx%-2d, rx%-2d), data = %d\n",
+ __func__, i, j, temp);
+ } else
+ td43xx_amp_open_data[i * rx_num + j] = 0;
+ }
+ }
+ }
+
+exit:
+ kfree(p_right_median);
+ kfree(p_left_median);
+ kfree(p_right_column_buf);
+ kfree(p_left_column_buf);
+
+ return retval;
+}
+
+static ssize_t test_sysfs_td43xx_amp_open_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval = 0;
+ int i, j, k;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+
+ unsigned long setting;
+ unsigned char original_data_f54_ctrl99[3] = {0x00, 0x00, 0x00};
+ struct f54_control control = f54->control;
+ unsigned char *p_report_data_8 = NULL;
+ signed short *p_rt92_delta_image = NULL;
+ signed short *p_rt92_image_1 = NULL;
+ signed short *p_rt92_image_2 = NULL;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting != 1 || !factory_param)
+ return -EINVAL;
+
+ if (f55->extended_amp_btn) {
+ tx_num -= 1;
+ }
+
+ if (td43xx_amp_open_data)
+ kfree(td43xx_amp_open_data);
+ td43xx_amp_open_data = kzalloc(tx_num * rx_num, GFP_KERNEL);
+ if (!td43xx_amp_open_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for td43xx_amp_open_data\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ p_report_data_8 = kzalloc(tx_num * rx_num * 2, GFP_KERNEL);
+ if (!p_report_data_8) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_report_data_8\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+ memset(p_report_data_8, 0x00, tx_num * rx_num * 2);
+
+ p_rt92_delta_image = kzalloc(tx_num * rx_num * sizeof(signed short), GFP_KERNEL);
+ if (!p_rt92_delta_image) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_rt92_delta_image\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+ memset(p_rt92_delta_image, 0x00, tx_num * rx_num * sizeof(signed short));
+
+ p_rt92_image_1 = kzalloc(tx_num * rx_num * sizeof(signed short), GFP_KERNEL);
+ if (!p_rt92_image_1) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_rt92_image_1\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+ memset(p_rt92_image_1, 0x00, tx_num * rx_num * sizeof(signed short));
+
+ p_rt92_image_2 = kzalloc(tx_num * rx_num * sizeof(signed short), GFP_KERNEL);
+ if (!p_rt92_image_2) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_rt92_image_2\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+ memset(p_rt92_image_2, 0x00, tx_num * rx_num * sizeof(signed short));
+
+ if (f54->query.touch_controller_family != 2) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: not support touch controller family = 0 or 1 \n",
+ __func__);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ control.reg_99->address,
+ original_data_f54_ctrl99,
+ sizeof(original_data_f54_ctrl99));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read integration duration\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ control.reg_99->integration_duration_lsb = factory_param->tddi_open_test_int_dur_one;
+ control.reg_99->integration_duration_msb = (factory_param->tddi_open_test_int_dur_one >> 8) & 0xff;
+ control.reg_99->reset_duration = original_data_f54_ctrl99[2];
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_99->address,
+ control.reg_99->data,
+ sizeof(control.reg_99->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write the integration duration to f54_ctrl_99 in step 1\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update in step 1\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ retval = test_sysfs_read_report_td43xx(dev, attr, "92", count,
+ false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report 92 in step 1. exit\n",
+ __func__);
+ g_flag_read_report_fail = 1;
+ retval = -EIO;
+ goto exit;
+ }
+
+ secure_memcpy(p_report_data_8, tx_num * rx_num * 2,
+ f54->report_data, f54->report_size, f54->report_size);
+
+ k = 0;
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ p_rt92_image_1[i * rx_num + j] =
+ (signed short)(p_report_data_8[k] & 0xff) | (signed short)(p_report_data_8[k + 1] << 8);
+ k += 2;
+ }
+ }
+
+ memset(p_report_data_8, 0x00, tx_num * rx_num * 2);
+
+ control.reg_99->integration_duration_lsb = factory_param->tddi_open_test_int_dur_two;
+ control.reg_99->integration_duration_msb = (factory_param->tddi_open_test_int_dur_two >> 8) & 0xff;
+ control.reg_99->reset_duration = original_data_f54_ctrl99[2];
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_99->address,
+ control.reg_99->data,
+ sizeof(control.reg_99->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write the integration duration to f54_ctrl_99 in step 2\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update in step 2\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ retval = test_sysfs_read_report_td43xx(dev, attr, "92", count,
+ false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report 92 in step 2. exit\n",
+ __func__);
+ g_flag_read_report_fail = 1;
+ retval = -EIO;
+ goto exit;
+ }
+
+ secure_memcpy(p_report_data_8, tx_num * rx_num * 2,
+ f54->report_data, f54->report_size, f54->report_size);
+
+ k = 0;
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ p_rt92_image_2[i * rx_num + j] =
+ (signed short)(p_report_data_8[k] & 0xff) | (signed short)(p_report_data_8[k + 1] << 8);
+
+ k += 2;
+ }
+ }
+
+ control.reg_99->integration_duration_lsb = original_data_f54_ctrl99[0];
+ control.reg_99->integration_duration_msb = original_data_f54_ctrl99[1];
+ control.reg_99->reset_duration = original_data_f54_ctrl99[2];
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_99->address,
+ control.reg_99->data,
+ sizeof(control.reg_99->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write the integration duration to f54_ctrl_99 in restore phase\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update in restore pahse\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ for (i = 0; i < tx_num * rx_num; i++) {
+ p_rt92_delta_image[i] = p_rt92_image_1[i] - p_rt92_image_2[i];
+ }
+
+ tddi_amp_open_data_testing(p_rt92_delta_image);
+
+ retval = count;
+
+exit:
+ kfree(p_rt92_image_1);
+ kfree(p_rt92_image_2);
+ kfree(p_rt92_delta_image);
+ kfree(p_report_data_8);
+
+ pr_err("%s: resetting device\n", __func__);
+ rmi4_data->reset_device(rmi4_data, false);
+ pr_err("%s: done resetting device\n", __func__);
+
+ return count;
+}
+
+static ssize_t test_sysfs_td43xx_amp_open_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int i, j;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ bool result = 1;
+
+ if (!td43xx_amp_open_data)
+ return -EINVAL;
+
+
+ if (1 == g_flag_read_report_fail) {
+ kfree(td43xx_amp_open_data);
+ td43xx_amp_open_data = NULL;
+ return snprintf(buf, PAGE_SIZE, "ERROR: Fail to read RT92 image\n");
+ }
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ if (td43xx_amp_open_data[i * rx_num + j] != 0) {
+
+ result &= 0;
+ }
+ }
+ }
+
+ kfree(td43xx_amp_open_data);
+ td43xx_amp_open_data = NULL;
+
+ return snprintf(buf, PAGE_SIZE, "%s\n", (result == 1) ? "PASS" : "FAIL");
+}
+
+
+
+static ssize_t test_sysfs_abs_0d_open_w_autoservo_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval = 0;
+ int i, j, k;
+ int tx_num = f54->tx_assigned;
+ int rx_num = f54->rx_assigned;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+ struct f54_control control = f54->control;
+ unsigned long setting;
+
+ unsigned char original_data_f54_ctr223 = 0x00;
+ unsigned char data = 0x00;
+
+ signed char *p_report_data_8 = NULL;
+ signed short *p_rt92_image_1 = NULL;
+ signed short *p_rt92_image_2 = NULL;
+
+ unsigned char button_count = rmi4_data->valid_button_count;
+
+ if (!factory_param)
+ return -EINVAL;
+
+ button_count = factory_param->button_count;
+
+ retval = sstrtoul(buf, 10, &setting);
+ if (retval)
+ return retval;
+
+ if (setting != 1)
+ return -EINVAL;
+
+ if (button_count == 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to get rmi button (count = %d)\n",
+ __func__, rmi4_data->valid_button_count);
+ retval = -EINVAL;
+ goto exit;
+ }
+
+ /* allocate the g_tddi_amp_open_data_output */
+ if (g_abs_0d_open_data_output)
+ kfree(g_abs_0d_open_data_output);
+ g_abs_0d_open_data_output = kzalloc(button_count * sizeof(int), GFP_KERNEL);
+ if (!g_abs_0d_open_data_output) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for g_abs_0d_open_data_output\n",
+ __func__);
+ return -ENOMEM;
+ }
+
+ g_flag_read_report_fail = 0;
+
+ /* allocate the buffer */
+ p_report_data_8 = kzalloc(tx_num * rx_num * 2, GFP_KERNEL);
+ if (!p_report_data_8) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_report_data_8\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_rt92_image_1 = kzalloc(tx_num * rx_num * sizeof(signed short), GFP_KERNEL);
+ if (!p_rt92_image_1) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_rt92_image_1\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ p_rt92_image_2 = kzalloc(tx_num * rx_num * sizeof(signed short), GFP_KERNEL);
+ if (!p_rt92_image_2) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for p_rt92_image_2\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ /* step 1 */
+ /* get first rt92 image */
+ retval = test_sysfs_read_report_td43xx(dev, attr, "92", count,
+ false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report 92 in step 1\n",
+ __func__);
+ g_flag_read_report_fail = 1; /* special code to indicate the failure of report reading */
+ retval = -EIO;
+ goto exit;
+ }
+
+ secure_memcpy(p_report_data_8, tx_num * rx_num * 2,
+ f54->report_data, f54->report_size, f54->report_size);
+
+ /* normalize the rt92 image with 16-bit */
+ k = 0;
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ p_rt92_image_1[i * rx_num + j] =
+ (signed short)(p_report_data_8[k] & 0xff) | (signed short)(p_report_data_8[k + 1] << 8);
+
+ k += 2;
+ }
+ }
+
+ memset(p_report_data_8, 0x00, tx_num * rx_num * 2);
+
+ /* step 2 */
+ /* read original 0d voltages */
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ control.reg_223->address,
+ &original_data_f54_ctr223,
+ sizeof(original_data_f54_ctr223));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read original 0d_voltaes in step 2\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ /* step 3 */
+ /* modify 0d voltages and force update */
+ data = original_data_f54_ctr223 - factory_param->abs_0d_open_factor;
+ if (data < 0)
+ data = 0;
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_223->address,
+ &data,
+ sizeof(data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to modify 0d voltages to f54_ctrl_223 in step 3\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update in step 3\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ msleep(100);
+
+ /* step 4 */
+ /* get second rt92 image */
+ retval = test_sysfs_read_report_td43xx(dev, attr, "92", count,
+ false, false);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report 92 in step 4\n",
+ __func__);
+ g_flag_read_report_fail = 1; /* special code to indicate the failure of report reading */
+ retval = -EIO;
+ goto exit;
+ }
+
+ secure_memcpy(p_report_data_8, tx_num * rx_num * 2,
+ f54->report_data, f54->report_size, f54->report_size);
+
+ /* normalize the rt92 image with 16-bit */
+ k = 0;
+ for (i = 0; i < tx_num; i++) {
+ for (j = 0; j < rx_num; j++) {
+ p_rt92_image_2[i * rx_num + j] =
+ (signed short)(p_report_data_8[k] & 0xff) | (signed short)(p_report_data_8[k + 1] << 8);
+
+ k += 2;
+ }
+ }
+
+ /* step 5 */
+ /* restore original 0d voltages and force update */
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ control.reg_223->address,
+ &original_data_f54_ctr223,
+ sizeof(original_data_f54_ctr223));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to restore 0d voltages to f54_ctrl_223 in step 5\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+ retval = test_do_command(COMMAND_FORCE_UPDATE);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to do force update in step 5\n",
+ __func__);
+ retval = -EIO;
+ goto exit;
+ }
+
+ /* step 6 */
+ /* calculation */
+ for (i = 0; i < button_count; i++) {
+ g_abs_0d_open_data_output[i] = abs(p_rt92_image_1[(tx_num-1)*rx_num + i] - p_rt92_image_2[(tx_num-1)*rx_num + i]);
+ g_abs_0d_open_data_output[i] = (g_abs_0d_open_data_output[i] * 100)/p_rt92_image_1[(tx_num-1)*rx_num + i];
+ printk(KERN_ERR "ref value is %d value1 is %d value2 is %d\n", g_abs_0d_open_data_output[i], p_rt92_image_1[(tx_num-1)*rx_num + i], p_rt92_image_2[(tx_num-1)*rx_num + i]);
+ if (g_abs_0d_open_data_output[i] < factory_param->abs_0d_open_test_limit)
+ g_abs_0d_open_data_output[i] = 1; /* fail */
+ else
+ g_abs_0d_open_data_output[i] = 0; /* pass */
+ }
+
+exit:
+ /* release resource */
+ kfree(p_rt92_image_1);
+ kfree(p_rt92_image_2);
+ kfree(p_report_data_8);
+
+ pr_err("%s: resetting device\n", __func__);
+ rmi4_data->reset_device(rmi4_data, false);
+ pr_err("%s: done resetting device\n", __func__);
+
+ return count;
+}
+
+
+static ssize_t test_sysfs_abs_0d_open_w_autoservo_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ bool result = 0;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+ unsigned char button_count = rmi4_data->valid_button_count;
+ int i;
+
+ if (!factory_param)
+ return -EINVAL;
+
+ if (!g_abs_0d_open_data_output)
+ return -EINVAL;
+
+ /* check the special code if the failure of report image reading */
+ if (1 == g_flag_read_report_fail) {
+ kfree(g_abs_0d_open_data_output);
+ g_abs_0d_open_data_output = NULL;
+ return snprintf(buf, PAGE_SIZE, "ERROR: Fail to read RT92 image\n");
+ }
+
+ button_count = factory_param->button_count;
+
+ for (i = 0; i < button_count; i++) {
+ if (g_abs_0d_open_data_output[i] != 0) {
+
+ result = 0; /* 0: fail */
+ break;
+ /*dev_err(f54->rmi4_data->pdev->dev.parent,
+ "%s: Failed at 0D_button_%d\n", __func__, i); */
+ }
+ }
+
+ if (i == button_count)
+ result = 1;
+
+ kfree(g_abs_0d_open_data_output);
+ g_abs_0d_open_data_output = NULL;
+ return snprintf(buf, PAGE_SIZE, "%s\n", (result == 1) ? "PASS" : "FAIL");
+}
+
+static void test_report_work(struct work_struct *work)
+{
+ int retval;
+ unsigned char report_index[2];
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ mutex_lock(&f54->status_mutex);
+
+ if (f54->status != STATUS_BUSY) {
+ retval = f54->status;
+ goto exit;
+ }
+
+ retval = test_wait_for_command_completion();
+ if (retval < 0) {
+ retval = STATUS_ERROR;
+ goto exit;
+ }
+
+ test_set_report_size();
+ if (f54->report_size == 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Report data size = 0\n",
+ __func__);
+ retval = STATUS_ERROR;
+ goto exit;
+ }
+
+ if (f54->data_buffer_size < f54->report_size) {
+ if (f54->data_buffer_size)
+ kfree(f54->report_data);
+ f54->report_data = kzalloc(f54->report_size, GFP_KERNEL);
+ if (!f54->report_data) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for data buffer\n",
+ __func__);
+ f54->data_buffer_size = 0;
+ retval = STATUS_ERROR;
+ goto exit;
+ }
+ f54->data_buffer_size = f54->report_size;
+ }
+
+ report_index[0] = 0;
+ report_index[1] = 0;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ f54->data_base_addr + REPORT_INDEX_OFFSET,
+ report_index,
+ sizeof(report_index));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to write report data index\n",
+ __func__);
+ retval = STATUS_ERROR;
+ goto exit;
+ }
+
+ msleep(2000);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->data_base_addr + REPORT_DATA_OFFSET,
+ f54->report_data,
+ f54->report_size);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read report data\n",
+ __func__);
+ retval = STATUS_ERROR;
+ goto exit;
+ }
+
+ pr_err("%s: f54->report_type = %d\n", __func__, f54->report_type);
+ pr_err("%s: f54->report_size = %d\n", __func__, f54->report_size);
+
+ retval = STATUS_IDLE;
+
+exit:
+ mutex_unlock(&f54->status_mutex);
+
+ if (retval == STATUS_ERROR)
+ f54->report_size = 0;
+
+ f54->status = retval;
+
+ return;
+}
+
+static void test_remove_sysfs(void)
+{
+ sysfs_remove_group(f54->sysfs_dir, &attr_group);
+ kobject_put(f54->sysfs_dir);
+
+ return;
+}
+
+static int test_set_sysfs(void)
+{
+ int retval;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ f54->sysfs_dir = kobject_create_and_add(SYSFS_FOLDER_NAME,
+ &rmi4_data->input_dev->dev.kobj);
+ if (!f54->sysfs_dir) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs directory\n",
+ __func__);
+ goto exit_directory;
+ }
+
+ retval = sysfs_create_group(f54->sysfs_dir, &attr_group);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ goto exit_attributes;
+ }
+
+ return 0;
+
+exit_attributes:
+ sysfs_remove_group(f54->sysfs_dir, &attr_group);
+ kobject_put(f54->sysfs_dir);
+exit_directory:
+ return -ENODEV;
+}
+
+static void test_free_control_mem(void)
+{
+ struct f54_control control = f54->control;
+
+ kfree(control.reg_7);
+ kfree(control.reg_41);
+ kfree(control.reg_57);
+ kfree(control.reg_86);
+ kfree(control.reg_88);
+ kfree(control.reg_91);
+ kfree(control.reg_96);
+ kfree(control.reg_99);
+ kfree(control.reg_110);
+ kfree(control.reg_149);
+ kfree(control.reg_182);
+ kfree(control.reg_188);
+ kfree(control.reg_223);
+ kfree(control.reg_225);
+
+ return;
+}
+
+static void test_set_data(void)
+{
+ unsigned short reg_addr;
+
+ reg_addr = f54->data_base_addr + REPORT_DATA_OFFSET + 1;
+
+ /* data 4 */
+ if (f54->query.has_sense_frequency_control)
+ reg_addr++;
+
+ /* data 5 reserved */
+
+ /* data 6 */
+ if (f54->query.has_interference_metric)
+ reg_addr += 2;
+
+ /* data 7 */
+ if (f54->query.has_one_byte_report_rate |
+ f54->query.has_two_byte_report_rate)
+ reg_addr++;
+ if (f54->query.has_two_byte_report_rate)
+ reg_addr++;
+
+ /* data 8 */
+ if (f54->query.has_variance_metric)
+ reg_addr += 2;
+
+ /* data 9 */
+ if (f54->query.has_multi_metric_state_machine)
+ reg_addr += 2;
+
+ /* data 10 */
+ if (f54->query.has_multi_metric_state_machine |
+ f54->query.has_noise_state)
+ reg_addr++;
+
+ /* data 11 */
+ if (f54->query.has_status)
+ reg_addr++;
+
+ /* data 12 */
+ if (f54->query.has_slew_metric)
+ reg_addr += 2;
+
+ /* data 13 */
+ if (f54->query.has_multi_metric_state_machine)
+ reg_addr += 2;
+
+ /* data 14 */
+ if (f54->query_13.has_cidim)
+ reg_addr++;
+
+ /* data 15 */
+ if (f54->query_13.has_rail_im)
+ reg_addr++;
+
+ /* data 16 */
+ if (f54->query_13.has_noise_mitigation_enhancement)
+ reg_addr++;
+
+ /* data 17 */
+ if (f54->query_16.has_data17)
+ reg_addr++;
+
+ /* data 18 */
+ if (f54->query_21.has_query24_data18)
+ reg_addr++;
+
+ /* data 19 */
+ if (f54->query_21.has_data19)
+ reg_addr++;
+
+ /* data_20 */
+ if (f54->query_25.has_ctrl109)
+ reg_addr++;
+
+ /* data 21 */
+ if (f54->query_27.has_data21)
+ reg_addr++;
+
+ /* data 22 */
+ if (f54->query_27.has_data22)
+ reg_addr++;
+
+ /* data 23 */
+ if (f54->query_29.has_data23)
+ reg_addr++;
+
+ /* data 24 */
+ if (f54->query_32.has_data24)
+ reg_addr++;
+
+ /* data 25 */
+ if (f54->query_35.has_data25)
+ reg_addr++;
+
+ /* data 26 */
+ if (f54->query_35.has_data26)
+ reg_addr++;
+
+ /* data 27 */
+ if (f54->query_46.has_data27)
+ reg_addr++;
+
+ /* data 28 */
+ if (f54->query_46.has_data28)
+ reg_addr++;
+
+ /* data 29 30 reserved */
+
+ /* data 31 */
+ if (f54->query_49.has_data31) {
+ f54->data_31.address = reg_addr;
+ reg_addr++;
+ }
+
+ return;
+}
+
+static int test_set_controls(void)
+{
+ int retval;
+ unsigned char length;
+ unsigned char num_of_sensing_freqs;
+ unsigned short reg_addr = f54->control_base_addr;
+ struct f54_control *control = &f54->control;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ num_of_sensing_freqs = f54->query.number_of_sensing_frequencies;
+
+ /* control 0 */
+ reg_addr += CONTROL_0_SIZE;
+
+ /* control 1 */
+ if ((f54->query.touch_controller_family == 0) ||
+ (f54->query.touch_controller_family == 1))
+ reg_addr += CONTROL_1_SIZE;
+
+ /* control 2 */
+ reg_addr += CONTROL_2_SIZE;
+
+ /* control 3 */
+ if (f54->query.has_pixel_touch_threshold_adjustment)
+ reg_addr += CONTROL_3_SIZE;
+
+ /* controls 4 5 6 */
+ if ((f54->query.touch_controller_family == 0) ||
+ (f54->query.touch_controller_family == 1))
+ reg_addr += CONTROL_4_6_SIZE;
+
+ /* control 7 */
+ if (f54->query.touch_controller_family == 1) {
+ control->reg_7 = kzalloc(sizeof(*(control->reg_7)),
+ GFP_KERNEL);
+ if (!control->reg_7)
+ goto exit_no_mem;
+ control->reg_7->address = reg_addr;
+ reg_addr += CONTROL_7_SIZE;
+ }
+
+ /* controls 8 9 */
+ if ((f54->query.touch_controller_family == 0) ||
+ (f54->query.touch_controller_family == 1))
+ reg_addr += CONTROL_8_9_SIZE;
+
+ /* control 10 */
+ if (f54->query.has_interference_metric)
+ reg_addr += CONTROL_10_SIZE;
+
+ /* control 11 */
+ if (f54->query.has_ctrl11)
+ reg_addr += CONTROL_11_SIZE;
+
+ /* controls 12 13 */
+ if (f54->query.has_relaxation_control)
+ reg_addr += CONTROL_12_13_SIZE;
+
+ /* controls 14 15 16 */
+ if (f54->query.has_sensor_assignment) {
+ reg_addr += CONTROL_14_SIZE;
+ reg_addr += CONTROL_15_SIZE * f54->query.num_of_rx_electrodes;
+ reg_addr += CONTROL_16_SIZE * f54->query.num_of_tx_electrodes;
+ }
+
+ /* controls 17 18 19 */
+ if (f54->query.has_sense_frequency_control) {
+ reg_addr += CONTROL_17_SIZE * num_of_sensing_freqs;
+ reg_addr += CONTROL_18_SIZE * num_of_sensing_freqs;
+ reg_addr += CONTROL_19_SIZE * num_of_sensing_freqs;
+ }
+
+ /* control 20 */
+ reg_addr += CONTROL_20_SIZE;
+
+ /* control 21 */
+ if (f54->query.has_sense_frequency_control)
+ reg_addr += CONTROL_21_SIZE;
+
+ /* controls 22 23 24 25 26 */
+ if (f54->query.has_firmware_noise_mitigation)
+ reg_addr += CONTROL_22_26_SIZE;
+
+ /* control 27 */
+ if (f54->query.has_iir_filter)
+ reg_addr += CONTROL_27_SIZE;
+
+ /* control 28 */
+ if (f54->query.has_firmware_noise_mitigation)
+ reg_addr += CONTROL_28_SIZE;
+
+ /* control 29 */
+ if (f54->query.has_cmn_removal)
+ reg_addr += CONTROL_29_SIZE;
+
+ /* control 30 */
+ if (f54->query.has_cmn_maximum)
+ reg_addr += CONTROL_30_SIZE;
+
+ /* control 31 */
+ if (f54->query.has_touch_hysteresis)
+ reg_addr += CONTROL_31_SIZE;
+
+ /* controls 32 33 34 35 */
+ if (f54->query.has_edge_compensation)
+ reg_addr += CONTROL_32_35_SIZE;
+
+ /* control 36 */
+ if ((f54->query.curve_compensation_mode == 1) ||
+ (f54->query.curve_compensation_mode == 2)) {
+ if (f54->query.curve_compensation_mode == 1) {
+ length = max(f54->query.num_of_rx_electrodes,
+ f54->query.num_of_tx_electrodes);
+ } else if (f54->query.curve_compensation_mode == 2) {
+ length = f54->query.num_of_rx_electrodes;
+ }
+ reg_addr += CONTROL_36_SIZE * length;
+ }
+
+ /* control 37 */
+ if (f54->query.curve_compensation_mode == 2)
+ reg_addr += CONTROL_37_SIZE * f54->query.num_of_tx_electrodes;
+
+ /* controls 38 39 40 */
+ if (f54->query.has_per_frequency_noise_control) {
+ reg_addr += CONTROL_38_SIZE * num_of_sensing_freqs;
+ reg_addr += CONTROL_39_SIZE * num_of_sensing_freqs;
+ reg_addr += CONTROL_40_SIZE * num_of_sensing_freqs;
+ }
+
+ /* control 41 */
+ if (f54->query.has_signal_clarity) {
+ control->reg_41 = kzalloc(sizeof(*(control->reg_41)),
+ GFP_KERNEL);
+ if (!control->reg_41)
+ goto exit_no_mem;
+ control->reg_41->address = reg_addr;
+ reg_addr += CONTROL_41_SIZE;
+ }
+
+ /* control 42 */
+ if (f54->query.has_variance_metric)
+ reg_addr += CONTROL_42_SIZE;
+
+ /* controls 43 44 45 46 47 48 49 50 51 52 53 54 */
+ if (f54->query.has_multi_metric_state_machine)
+ reg_addr += CONTROL_43_54_SIZE;
+
+ /* controls 55 56 */
+ if (f54->query.has_0d_relaxation_control)
+ reg_addr += CONTROL_55_56_SIZE;
+
+ /* control 57 */
+ if (f54->query.has_0d_acquisition_control) {
+ control->reg_57 = kzalloc(sizeof(*(control->reg_57)),
+ GFP_KERNEL);
+ if (!control->reg_57)
+ goto exit_no_mem;
+ control->reg_57->address = reg_addr;
+ reg_addr += CONTROL_57_SIZE;
+ }
+
+ /* control 58 */
+ if (f54->query.has_0d_acquisition_control)
+ reg_addr += CONTROL_58_SIZE;
+
+ /* control 59 */
+ if (f54->query.has_h_blank)
+ reg_addr += CONTROL_59_SIZE;
+
+ /* controls 60 61 62 */
+ if ((f54->query.has_h_blank) ||
+ (f54->query.has_v_blank) ||
+ (f54->query.has_long_h_blank))
+ reg_addr += CONTROL_60_62_SIZE;
+
+ /* control 63 */
+ if ((f54->query.has_h_blank) ||
+ (f54->query.has_v_blank) ||
+ (f54->query.has_long_h_blank) ||
+ (f54->query.has_slew_metric) ||
+ (f54->query.has_slew_option) ||
+ (f54->query.has_noise_mitigation2))
+ reg_addr += CONTROL_63_SIZE;
+
+ /* controls 64 65 66 67 */
+ if (f54->query.has_h_blank)
+ reg_addr += CONTROL_64_67_SIZE * 7;
+ else if ((f54->query.has_v_blank) ||
+ (f54->query.has_long_h_blank))
+ reg_addr += CONTROL_64_67_SIZE;
+
+ /* controls 68 69 70 71 72 73 */
+ if ((f54->query.has_h_blank) ||
+ (f54->query.has_v_blank) ||
+ (f54->query.has_long_h_blank))
+ reg_addr += CONTROL_68_73_SIZE;
+
+ /* control 74 */
+ if (f54->query.has_slew_metric)
+ reg_addr += CONTROL_74_SIZE;
+
+ /* control 75 */
+ if (f54->query.has_enhanced_stretch)
+ reg_addr += CONTROL_75_SIZE * num_of_sensing_freqs;
+
+ /* control 76 */
+ if (f54->query.has_startup_fast_relaxation)
+ reg_addr += CONTROL_76_SIZE;
+
+ /* controls 77 78 */
+ if (f54->query.has_esd_control)
+ reg_addr += CONTROL_77_78_SIZE;
+
+ /* controls 79 80 81 82 83 */
+ if (f54->query.has_noise_mitigation2)
+ reg_addr += CONTROL_79_83_SIZE;
+
+ /* controls 84 85 */
+ if (f54->query.has_energy_ratio_relaxation)
+ reg_addr += CONTROL_84_85_SIZE;
+
+ /* control 86 */
+ if (f54->query_13.has_ctrl86) {
+ control->reg_86 = kzalloc(sizeof(*(control->reg_86)),
+ GFP_KERNEL);
+ if (!control->reg_86)
+ goto exit_no_mem;
+ control->reg_86->address = reg_addr;
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->control.reg_86->address,
+ f54->control.reg_86->data,
+ sizeof(f54->control.reg_86->data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read sense display ratio\n",
+ __func__);
+ return retval;
+ }
+ reg_addr += CONTROL_86_SIZE;
+ }
+
+ /* control 87 */
+ if (f54->query_13.has_ctrl87)
+ reg_addr += CONTROL_87_SIZE;
+
+ /* control 88 */
+ if (f54->query.has_ctrl88) {
+ control->reg_88 = kzalloc(sizeof(*(control->reg_88)),
+ GFP_KERNEL);
+ if (!control->reg_88)
+ goto exit_no_mem;
+ control->reg_88->address = reg_addr;
+ reg_addr += CONTROL_88_SIZE;
+ }
+
+ /* control 89 */
+ if (f54->query_13.has_cidim ||
+ f54->query_13.has_noise_mitigation_enhancement ||
+ f54->query_13.has_rail_im)
+ reg_addr += CONTROL_89_SIZE;
+
+ /* control 90 */
+ if (f54->query_15.has_ctrl90)
+ reg_addr += CONTROL_90_SIZE;
+
+ /* control 91 */
+ if (f54->query_21.has_ctrl91) {
+ /* td43xx start */
+ control->reg_91 = kzalloc(sizeof(*(control->reg_91)),
+ GFP_KERNEL);
+ if (!control->reg_91)
+ goto exit_no_mem;
+ control->reg_91->address = reg_addr;
+ /* td43xx end */
+ reg_addr += CONTROL_91_SIZE;
+ }
+
+ /* control 92 */
+ if (f54->query_16.has_ctrl92)
+ reg_addr += CONTROL_92_SIZE;
+
+ /* control 93 */
+ if (f54->query_16.has_ctrl93)
+ reg_addr += CONTROL_93_SIZE;
+
+ /* control 94 */
+ if (f54->query_16.has_ctrl94_query18)
+ reg_addr += CONTROL_94_SIZE;
+
+ /* control 95 */
+ if (f54->query_16.has_ctrl95_query19)
+ reg_addr += CONTROL_95_SIZE;
+
+ /* control 96 */
+ if (f54->query_21.has_ctrl96) {
+ /* td43xx start */
+ control->reg_96 = kzalloc(sizeof(*(control->reg_96)),
+ GFP_KERNEL);
+ if (!control->reg_96)
+ goto exit_no_mem;
+ control->reg_96->address = reg_addr;
+ /* td43xx end */
+ reg_addr += CONTROL_96_SIZE;
+ }
+
+ /* control 97 */
+ if (f54->query_21.has_ctrl97)
+ reg_addr += CONTROL_97_SIZE;
+
+ /* control 98 */
+ if (f54->query_21.has_ctrl98)
+ reg_addr += CONTROL_98_SIZE;
+
+ /* control 99 */
+ if (f54->query.touch_controller_family == 2) {
+ /* td43xx start */
+ control->reg_99 = kzalloc(sizeof(*(control->reg_99)),
+ GFP_KERNEL);
+ if (!control->reg_99)
+ goto exit_no_mem;
+ control->reg_99->address = reg_addr;
+ /* td43xx end */
+ reg_addr += CONTROL_99_SIZE;
+ }
+
+ /* control 100 */
+ if (f54->query_16.has_ctrl100)
+ reg_addr += CONTROL_100_SIZE;
+
+ /* control 101 */
+ if (f54->query_22.has_ctrl101)
+ reg_addr += CONTROL_101_SIZE;
+
+
+ /* control 102 */
+ if (f54->query_23.has_ctrl102)
+ reg_addr += CONTROL_102_SIZE;
+
+ /* control 103 */
+ if (f54->query_22.has_ctrl103_query26) {
+ f54->skip_preparation = true;
+ reg_addr += CONTROL_103_SIZE;
+ }
+
+ /* control 104 */
+ if (f54->query_22.has_ctrl104)
+ reg_addr += CONTROL_104_SIZE;
+
+ /* control 105 */
+ if (f54->query_22.has_ctrl105)
+ reg_addr += CONTROL_105_SIZE;
+
+ /* control 106 */
+ if (f54->query_25.has_ctrl106)
+ reg_addr += CONTROL_106_SIZE;
+
+ /* control 107 */
+ if (f54->query_25.has_ctrl107)
+ reg_addr += CONTROL_107_SIZE;
+
+ /* control 108 */
+ if (f54->query_25.has_ctrl108)
+ reg_addr += CONTROL_108_SIZE;
+
+ /* control 109 */
+ if (f54->query_25.has_ctrl109)
+ reg_addr += CONTROL_109_SIZE;
+
+ /* control 110 */
+ if (f54->query_27.has_ctrl110) {
+ control->reg_110 = kzalloc(sizeof(*(control->reg_110)),
+ GFP_KERNEL);
+ if (!control->reg_110)
+ goto exit_no_mem;
+ control->reg_110->address = reg_addr;
+ reg_addr += CONTROL_110_SIZE;
+ }
+
+ /* control 111 */
+ if (f54->query_27.has_ctrl111)
+ reg_addr += CONTROL_111_SIZE;
+
+ /* control 112 */
+ if (f54->query_27.has_ctrl112)
+ reg_addr += CONTROL_112_SIZE;
+
+ /* control 113 */
+ if (f54->query_27.has_ctrl113)
+ reg_addr += CONTROL_113_SIZE;
+
+ /* control 114 */
+ if (f54->query_27.has_ctrl114)
+ reg_addr += CONTROL_114_SIZE;
+
+ /* control 115 */
+ if (f54->query_29.has_ctrl115)
+ reg_addr += CONTROL_115_SIZE;
+
+ /* control 116 */
+ if (f54->query_29.has_ctrl116)
+ reg_addr += CONTROL_116_SIZE;
+
+ /* control 117 */
+ if (f54->query_29.has_ctrl117)
+ reg_addr += CONTROL_117_SIZE;
+
+ /* control 118 */
+ if (f54->query_30.has_ctrl118)
+ reg_addr += CONTROL_118_SIZE;
+
+ /* control 119 */
+ if (f54->query_30.has_ctrl119)
+ reg_addr += CONTROL_119_SIZE;
+
+ /* control 120 */
+ if (f54->query_30.has_ctrl120)
+ reg_addr += CONTROL_120_SIZE;
+
+ /* control 121 */
+ if (f54->query_30.has_ctrl121)
+ reg_addr += CONTROL_121_SIZE;
+
+ /* control 122 */
+ if (f54->query_30.has_ctrl122_query31)
+ reg_addr += CONTROL_122_SIZE;
+
+ /* control 123 */
+ if (f54->query_30.has_ctrl123)
+ reg_addr += CONTROL_123_SIZE;
+
+ /* control 124 */
+ if (f54->query_30.has_ctrl124)
+ reg_addr += CONTROL_124_SIZE;
+
+ /* control 125 */
+ if (f54->query_32.has_ctrl125)
+ reg_addr += CONTROL_125_SIZE;
+
+ /* control 126 */
+ if (f54->query_32.has_ctrl126)
+ reg_addr += CONTROL_126_SIZE;
+
+ /* control 127 */
+ if (f54->query_32.has_ctrl127)
+ reg_addr += CONTROL_127_SIZE;
+
+ /* control 128 */
+ if (f54->query_33.has_ctrl128)
+ reg_addr += CONTROL_128_SIZE;
+
+ /* control 129 */
+ if (f54->query_33.has_ctrl129)
+ reg_addr += CONTROL_129_SIZE;
+
+ /* control 130 */
+ if (f54->query_33.has_ctrl130)
+ reg_addr += CONTROL_130_SIZE;
+
+ /* control 131 */
+ if (f54->query_33.has_ctrl131)
+ reg_addr += CONTROL_131_SIZE;
+
+ /* control 132 */
+ if (f54->query_33.has_ctrl132)
+ reg_addr += CONTROL_132_SIZE;
+
+ /* control 133 */
+ if (f54->query_33.has_ctrl133)
+ reg_addr += CONTROL_133_SIZE;
+
+ /* control 134 */
+ if (f54->query_33.has_ctrl134)
+ reg_addr += CONTROL_134_SIZE;
+
+ /* control 135 */
+ if (f54->query_35.has_ctrl135)
+ reg_addr += CONTROL_135_SIZE;
+
+ /* control 136 */
+ if (f54->query_35.has_ctrl136)
+ reg_addr += CONTROL_136_SIZE;
+
+ /* control 137 */
+ if (f54->query_35.has_ctrl137)
+ reg_addr += CONTROL_137_SIZE;
+
+ /* control 138 */
+ if (f54->query_35.has_ctrl138)
+ reg_addr += CONTROL_138_SIZE;
+
+ /* control 139 */
+ if (f54->query_35.has_ctrl139)
+ reg_addr += CONTROL_139_SIZE;
+
+ /* control 140 */
+ if (f54->query_35.has_ctrl140)
+ reg_addr += CONTROL_140_SIZE;
+
+ /* control 141 */
+ if (f54->query_36.has_ctrl141)
+ reg_addr += CONTROL_141_SIZE;
+
+ /* control 142 */
+ if (f54->query_36.has_ctrl142)
+ reg_addr += CONTROL_142_SIZE;
+
+ /* control 143 */
+ if (f54->query_36.has_ctrl143)
+ reg_addr += CONTROL_143_SIZE;
+
+ /* control 144 */
+ if (f54->query_36.has_ctrl144)
+ reg_addr += CONTROL_144_SIZE;
+
+ /* control 145 */
+ if (f54->query_36.has_ctrl145)
+ reg_addr += CONTROL_145_SIZE;
+
+ /* control 146 */
+ if (f54->query_36.has_ctrl146)
+ reg_addr += CONTROL_146_SIZE;
+
+ /* control 147 */
+ if (f54->query_38.has_ctrl147)
+ reg_addr += CONTROL_147_SIZE;
+
+ /* control 148 */
+ if (f54->query_38.has_ctrl148)
+ reg_addr += CONTROL_148_SIZE;
+
+ /* control 149 */
+ if (f54->query_38.has_ctrl149) {
+ control->reg_149 = kzalloc(sizeof(*(control->reg_149)),
+ GFP_KERNEL);
+ if (!control->reg_149)
+ goto exit_no_mem;
+ control->reg_149->address = reg_addr;
+ reg_addr += CONTROL_149_SIZE;
+ }
+
+ /* control 150 */
+ if (f54->query_38.has_ctrl150)
+ reg_addr += CONTROL_150_SIZE;
+
+ /* control 151 */
+ if (f54->query_38.has_ctrl151)
+ reg_addr += CONTROL_151_SIZE;
+
+ /* control 152 */
+ if (f54->query_38.has_ctrl152)
+ reg_addr += CONTROL_152_SIZE;
+
+ /* control 153 */
+ if (f54->query_38.has_ctrl153)
+ reg_addr += CONTROL_153_SIZE;
+
+ /* control 154 */
+ if (f54->query_39.has_ctrl154)
+ reg_addr += CONTROL_154_SIZE;
+
+ /* control 155 */
+ if (f54->query_39.has_ctrl155)
+ reg_addr += CONTROL_155_SIZE;
+
+ /* control 156 */
+ if (f54->query_39.has_ctrl156)
+ reg_addr += CONTROL_156_SIZE;
+
+ /* controls 157 158 */
+ if (f54->query_39.has_ctrl157_ctrl158)
+ reg_addr += CONTROL_157_158_SIZE;
+
+ /* controls 159 to 162 reserved */
+
+ /* control 163 */
+ if (f54->query_40.has_ctrl163_query41)
+ reg_addr += CONTROL_163_SIZE;
+
+ /* control 164 */
+ if (f54->query_40.has_ctrl164)
+ reg_addr += CONTROL_164_SIZE;
+
+ /* control 165 */
+ if (f54->query_40.has_ctrl165_query42)
+ reg_addr += CONTROL_165_SIZE;
+
+ /* control 166 */
+ if (f54->query_40.has_ctrl166)
+ reg_addr += CONTROL_166_SIZE;
+
+ /* control 167 */
+ if (f54->query_40.has_ctrl167)
+ reg_addr += CONTROL_167_SIZE;
+
+ /* control 168 */
+ if (f54->query_40.has_ctrl168)
+ reg_addr += CONTROL_168_SIZE;
+
+ /* control 169 */
+ if (f54->query_40.has_ctrl169)
+ reg_addr += CONTROL_169_SIZE;
+
+ /* control 170 reserved */
+
+ /* control 171 */
+ if (f54->query_43.has_ctrl171)
+ reg_addr += CONTROL_171_SIZE;
+
+ /* control 172 */
+ if (f54->query_43.has_ctrl172_query44_query45)
+ reg_addr += CONTROL_172_SIZE;
+
+ /* control 173 */
+ if (f54->query_43.has_ctrl173)
+ reg_addr += CONTROL_173_SIZE;
+
+ /* control 174 */
+ if (f54->query_43.has_ctrl174)
+ reg_addr += CONTROL_174_SIZE;
+
+ /* control 175 */
+ if (f54->query_43.has_ctrl175)
+ reg_addr += CONTROL_175_SIZE;
+
+ /* control 176 */
+ if (f54->query_46.has_ctrl176)
+ reg_addr += CONTROL_176_SIZE;
+
+ /* controls 177 178 */
+ if (f54->query_46.has_ctrl177_ctrl178)
+ reg_addr += CONTROL_177_178_SIZE;
+
+ /* control 179 */
+ if (f54->query_46.has_ctrl179)
+ reg_addr += CONTROL_179_SIZE;
+
+ /* controls 180 to 181 reserved */
+
+ /* control 182 */
+ if (f54->query_47.has_ctrl182){
+ control->reg_182 = kzalloc(sizeof(*(control->reg_182)),
+ GFP_KERNEL);
+ if (!control->reg_182)
+ goto exit_no_mem;
+ control->reg_182->address = reg_addr;
+ reg_addr += CONTROL_182_SIZE;
+ }
+
+ /* control 183 */
+ if (f54->query_47.has_ctrl183)
+ reg_addr += CONTROL_183_SIZE;
+
+ /* control 184 reserved */
+
+ /* control 185 */
+ if (f54->query_47.has_ctrl185)
+ reg_addr += CONTROL_185_SIZE;
+
+ /* control 186 */
+ if (f54->query_47.has_ctrl186)
+ reg_addr += CONTROL_186_SIZE;
+
+ /* control 187 */
+ if (f54->query_47.has_ctrl187)
+ reg_addr += CONTROL_187_SIZE;
+
+ /* control 188 */
+ if (f54->query_49.has_ctrl188) {
+ control->reg_188 = kzalloc(sizeof(*(control->reg_188)),
+ GFP_KERNEL);
+ if (!control->reg_188)
+ goto exit_no_mem;
+ control->reg_188->address = reg_addr;
+ reg_addr += CONTROL_188_SIZE;
+ }
+
+ /* control 189 */
+ if (f54->query_49.has_ctrl189)
+ reg_addr += CONTROL_189_SIZE;
+
+ /* control 190 */
+ if (f54->query_49.has_ctrl190)
+ reg_addr += CONTROL_190_SIZE;
+
+ /* control 191 */
+ if (f54->query_50.has_ctrl191)
+ reg_addr += CONTROL_191_SIZE;
+
+ /* control 192 */
+ if (f54->query_50.has_ctrl192)
+ reg_addr += CONTROL_192_SIZE;
+
+ /* control 193 reserved */
+
+ /* control 194 */
+ if (f54->query_50.has_ctrl194)
+ reg_addr += CONTROL_194_SIZE;
+
+ /* control 195 */
+ if (f54->query_50.has_ctrl195)
+ reg_addr += CONTROL_195_SIZE;
+
+ /* control 196 */
+ if (f54->query_51.has_ctrl196)
+ reg_addr += CONTROL_196_SIZE;
+
+ /* controls 197 to 205 reserved */
+
+ /* control 206 */
+ if (f54->query_57.has_ctrl206)
+ reg_addr += CONTROL_206_SIZE;
+
+ /* control 207 */
+ if (f54->query_57.has_ctrl207)
+ reg_addr += CONTROL_207_SIZE;
+
+ /* control 208 reserved */
+
+ /* control 209 */
+ if (f54->query_57.has_ctrl209)
+ reg_addr += CONTROL_209_SIZE;
+
+ /* control 210 */
+ if (f54->query_57.has_ctrl210)
+ reg_addr += CONTROL_210_SIZE;
+
+ /* controls 211 to 213 reserved */
+
+ /* control 214 */
+ if (f54->query_61.has_ctrl214)
+ reg_addr += CONTROL_214_SIZE;
+
+ /* control 215 */
+ if (f54->query_61.has_ctrl215_query62_query63)
+ reg_addr += CONTROL_215_SIZE;
+
+ /* control 217 reserved */
+
+ /* control 218 */
+ if (f54->query_61.has_ctrl218)
+ reg_addr += CONTROL_218_SIZE;
+
+ /* control 219 - 221 reserved */
+
+ /* control 222 */
+ if (f54->query_64.has_ctrl222)
+ reg_addr += CONTROL_222_SIZE;
+
+ /* control 223 */
+ if (f54->query_64.has_ctrl103_sub3) {
+ control->reg_223 = kzalloc(sizeof(*(control->reg_223)),
+ GFP_KERNEL);
+ if (!control->reg_223)
+ goto exit_no_mem;
+ control->reg_223->address = reg_addr;
+ reg_addr += CONTROL_223_SIZE;
+ }
+
+ /* control 224 reserved */
+
+ /* control 225 */
+ if (f54->query_65.has_ctrl225) {
+ control->reg_225 = kzalloc(sizeof(*(control->reg_225)),
+ GFP_KERNEL);
+ if (!control->reg_225)
+ goto exit_no_mem;
+ control->reg_225->address = reg_addr;
+ reg_addr += CONTROL_225_SIZE;
+ }
+
+ return 0;
+
+exit_no_mem:
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for control registers\n",
+ __func__);
+ return -ENOMEM;
+}
+
+static int test_set_queries(void)
+{
+ int retval;
+ unsigned char offset;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr,
+ f54->query.data,
+ sizeof(f54->query.data));
+ if (retval < 0)
+ return retval;
+
+ offset = sizeof(f54->query.data);
+
+ /* query 12 */
+ if (f54->query.has_sense_frequency_control == 0)
+ offset -= 1;
+
+ /* query 13 */
+ if (f54->query.has_query13) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_13.data,
+ sizeof(f54->query_13.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 14 */
+ if (f54->query_13.has_ctrl87)
+ offset += 1;
+
+ /* query 15 */
+ if (f54->query.has_query15) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_15.data,
+ sizeof(f54->query_15.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 16 */
+ if (f54->query_15.has_query16) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_16.data,
+ sizeof(f54->query_16.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 17 */
+ if (f54->query_16.has_query17)
+ offset += 1;
+
+ /* query 18 */
+ if (f54->query_16.has_ctrl94_query18)
+ offset += 1;
+
+ /* query 19 */
+ if (f54->query_16.has_ctrl95_query19)
+ offset += 1;
+
+ /* query 20 */
+ if (f54->query_15.has_query20)
+ offset += 1;
+
+ /* query 21 */
+ if (f54->query_15.has_query21) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_21.data,
+ sizeof(f54->query_21.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 22 */
+ if (f54->query_15.has_query22) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_22.data,
+ sizeof(f54->query_22.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 23 */
+ if (f54->query_22.has_query23) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_23.data,
+ sizeof(f54->query_23.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 24 */
+ if (f54->query_21.has_query24_data18)
+ offset += 1;
+
+ /* query 25 */
+ if (f54->query_15.has_query25) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_25.data,
+ sizeof(f54->query_25.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 26 */
+ if (f54->query_22.has_ctrl103_query26)
+ offset += 1;
+
+ /* query 27 */
+ if (f54->query_25.has_query27) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_27.data,
+ sizeof(f54->query_27.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 28 */
+ if (f54->query_22.has_query28)
+ offset += 1;
+
+ /* query 29 */
+ if (f54->query_27.has_query29) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_29.data,
+ sizeof(f54->query_29.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 30 */
+ if (f54->query_29.has_query30) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_30.data,
+ sizeof(f54->query_30.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 31 */
+ if (f54->query_30.has_ctrl122_query31)
+ offset += 1;
+
+ /* query 32 */
+ if (f54->query_30.has_query32) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_32.data,
+ sizeof(f54->query_32.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 33 */
+ if (f54->query_32.has_query33) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_33.data,
+ sizeof(f54->query_33.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 34 */
+ if (f54->query_32.has_query34)
+ offset += 1;
+
+ /* query 35 */
+ if (f54->query_32.has_query35) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_35.data,
+ sizeof(f54->query_35.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 36 */
+ if (f54->query_33.has_query36) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_36.data,
+ sizeof(f54->query_36.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 37 */
+ if (f54->query_36.has_query37)
+ offset += 1;
+
+ /* query 38 */
+ if (f54->query_36.has_query38) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_38.data,
+ sizeof(f54->query_38.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 39 */
+ if (f54->query_38.has_query39) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_39.data,
+ sizeof(f54->query_39.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 40 */
+ if (f54->query_39.has_query40) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_40.data,
+ sizeof(f54->query_40.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 41 */
+ if (f54->query_40.has_ctrl163_query41)
+ offset += 1;
+
+ /* query 42 */
+ if (f54->query_40.has_ctrl165_query42)
+ offset += 1;
+
+ /* query 43 */
+ if (f54->query_40.has_query43) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_43.data,
+ sizeof(f54->query_43.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* queries 44 45 */
+ if (f54->query_43.has_ctrl172_query44_query45)
+ offset += 2;
+
+ /* query 46 */
+ if (f54->query_43.has_query46) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_46.data,
+ sizeof(f54->query_46.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 47 */
+ if (f54->query_46.has_query47) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_47.data,
+ sizeof(f54->query_47.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 48 reserved */
+
+ /* query 49 */
+ if (f54->query_47.has_query49) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_49.data,
+ sizeof(f54->query_49.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 50 */
+ if (f54->query_49.has_query50) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_50.data,
+ sizeof(f54->query_50.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 51 */
+ if (f54->query_50.has_query51) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_51.data,
+ sizeof(f54->query_51.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 52 reserved */
+
+ /* queries 53 54 */
+ if (f54->query_51.has_query53_query54_ctrl198)
+ offset += 2;
+
+ /* query 55 */
+ if (f54->query_51.has_query55) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_55.data,
+ sizeof(f54->query_55.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* queries 56 */
+ if (f54->query_55.has_query56)
+ offset += 1;
+
+ /* query 57 */
+ if (f54->query_55.has_query57) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_57.data,
+ sizeof(f54->query_57.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 58 */
+ if (f54->query_57.has_query58) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_58.data,
+ sizeof(f54->query_58.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* queries 59 */
+ if (f54->query_58.has_query59)
+ offset += 1;
+
+ /* queries 60 */
+ if (f54->query_58.has_query60)
+ offset += 1;
+
+ /* queries 61 */
+ if (f54->query_58.has_query61) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_61.data,
+ sizeof(f54->query_61.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* queries 62 63 */
+ if (f54->query_61.has_ctrl215_query62_query63)
+ offset += 2;
+
+ /* queries 64 */
+ if (f54->query_61.has_query64) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_64.data,
+ sizeof(f54->query_64.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* queries 65 */
+ if (f54->query_64.has_query65) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_65.data,
+ sizeof(f54->query_65.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* queries 66 */
+ if (f54->query_65.has_query66_ctrl231)
+ offset += 1;
+
+ /* queries 67 */
+ if (f54->query_65.has_query67) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_67.data,
+ sizeof(f54->query_67.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* queries 68 */
+ if (f54->query_67.has_query68) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_68.data,
+ sizeof(f54->query_68.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* queries 69 */
+ if (f54->query_68.has_query69) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f54->query_base_addr + offset,
+ f54->query_69.data,
+ sizeof(f54->query_69.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ return 0;
+}
+
+static void test_f54_set_regs(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn_desc *fd,
+ unsigned int intr_count,
+ unsigned char page)
+{
+ unsigned char ii;
+ unsigned char intr_offset;
+
+ f54->query_base_addr = fd->query_base_addr | (page << 8);
+ f54->control_base_addr = fd->ctrl_base_addr | (page << 8);
+ f54->data_base_addr = fd->data_base_addr | (page << 8);
+ f54->command_base_addr = fd->cmd_base_addr | (page << 8);
+
+ f54->intr_reg_num = (intr_count + 7) / 8;
+ if (f54->intr_reg_num != 0)
+ f54->intr_reg_num -= 1;
+
+ f54->intr_mask = 0;
+ intr_offset = intr_count % 8;
+ for (ii = intr_offset;
+ ii < (fd->intr_src_count + intr_offset);
+ ii++) {
+ f54->intr_mask |= 1 << ii;
+ }
+
+ return;
+}
+
+static int test_f55_set_controls(void)
+{
+ unsigned char offset = 0;
+
+ /* controls 0 1 2 */
+ if (f55->query.has_sensor_assignment)
+ offset += 3;
+
+ /* control 3 */
+ if (f55->query.has_edge_compensation)
+ offset++;
+
+ /* control 4 */
+ if (f55->query.curve_compensation_mode == 0x1 ||
+ f55->query.curve_compensation_mode == 0x2)
+ offset++;
+
+ /* control 5 */
+ if (f55->query.curve_compensation_mode == 0x2)
+ offset++;
+
+ /* control 6 */
+ if (f55->query.has_ctrl6)
+ offset++;
+
+ /* control 7 */
+ if (f55->query.has_alternate_transmitter_assignment)
+ offset++;
+
+ /* control 8 */
+ if (f55->query_3.has_ctrl8)
+ offset++;
+
+ /* control 9 */
+ if (f55->query_3.has_ctrl9)
+ offset++;
+
+ /* control 10 */
+ if (f55->query_5.has_corner_compensation)
+ offset++;
+
+ /* control 11 */
+ if (f55->query.curve_compensation_mode == 0x3)
+ offset++;
+
+ /* control 12 */
+ if (f55->query_5.has_ctrl12)
+ offset++;
+
+ /* control 13 */
+ if (f55->query_5.has_ctrl13)
+ offset++;
+
+ /* control 14 */
+ if (f55->query_5.has_ctrl14)
+ offset++;
+
+ /* control 15 */
+ if (f55->query_5.has_basis_function)
+ offset++;
+
+ /* control 16 */
+ if (f55->query_17.has_ctrl16)
+ offset++;
+
+ /* control 17 */
+ if (f55->query_17.has_ctrl17)
+ offset++;
+
+ /* controls 18 19 */
+ if (f55->query_17.has_ctrl18_ctrl19)
+ offset += 2;
+
+ /* control 20 */
+ if (f55->query_17.has_ctrl20)
+ offset++;
+
+ /* control 21 */
+ if (f55->query_17.has_ctrl21)
+ offset++;
+
+ /* control 22 */
+ if (f55->query_17.has_ctrl22)
+ offset++;
+
+ /* control 23 */
+ if (f55->query_18.has_ctrl23)
+ offset++;
+
+ /* control 24 */
+ if (f55->query_18.has_ctrl24)
+ offset++;
+
+ /* control 25 */
+ if (f55->query_18.has_ctrl25)
+ offset++;
+
+ /* control 26 */
+ if (f55->query_18.has_ctrl26)
+ offset++;
+
+ /* control 27 */
+ if (f55->query_18.has_ctrl27_query20)
+ offset++;
+
+ /* control 28 */
+ if (f55->query_18.has_ctrl28_query21)
+ offset++;
+
+ /* control 29 */
+ if (f55->query_22.has_ctrl29)
+ offset++;
+
+ /* control 30 */
+ if (f55->query_22.has_ctrl30)
+ offset++;
+
+ /* control 31 */
+ if (f55->query_22.has_ctrl31)
+ offset++;
+
+ /* control 32 */
+ if (f55->query_22.has_ctrl32)
+ offset++;
+
+ /* controls 33 34 35 36 reserved */
+
+ /* control 37 */
+ if (f55->query_28.has_ctrl37)
+ offset++;
+
+ /* control 38 */
+ if (f55->query_30.has_ctrl38)
+ offset++;
+
+ /* control 39 */
+ if (f55->query_30.has_ctrl39)
+ offset++;
+
+ /* control 40 */
+ if (f55->query_30.has_ctrl40)
+ offset++;
+
+ /* control 41 */
+ if (f55->query_30.has_ctrl41)
+ offset++;
+
+ /* control 42 */
+ if (f55->query_30.has_ctrl42)
+ offset++;
+
+ /* controls 43 44 */
+ if (f55->query_30.has_ctrl43_ctrl44) {
+ f55->afe_mux_offset = offset;
+ offset += 2;
+ }
+
+ /* controls 45 46 */
+ if (f55->query_33.has_ctrl45_ctrl46) {
+ f55->has_force = true;
+ f55->force_tx_offset = offset;
+ f55->force_rx_offset = offset + 1;
+ offset += 2;
+ }
+
+ return 0;
+}
+
+static int test_f55_set_queries(void)
+{
+ int retval;
+ unsigned char offset;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->query_base_addr,
+ f55->query.data,
+ sizeof(f55->query.data));
+ if (retval < 0)
+ return retval;
+
+ offset = sizeof(f55->query.data);
+
+ /* query 3 */
+ if (f55->query.has_single_layer_multi_touch) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->query_base_addr + offset,
+ f55->query_3.data,
+ sizeof(f55->query_3.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 4 */
+ if (f55->query_3.has_ctrl9)
+ offset += 1;
+
+ /* query 5 */
+ if (f55->query.has_query5) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->query_base_addr + offset,
+ f55->query_5.data,
+ sizeof(f55->query_5.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* queries 6 7 */
+ if (f55->query.curve_compensation_mode == 0x3)
+ offset += 2;
+
+ /* query 8 */
+ if (f55->query_3.has_ctrl8)
+ offset += 1;
+
+ /* query 9 */
+ if (f55->query_3.has_query9)
+ offset += 1;
+
+ /* queries 10 11 12 13 14 15 16 */
+ if (f55->query_5.has_basis_function)
+ offset += 7;
+
+ /* query 17 */
+ if (f55->query_5.has_query17) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->query_base_addr + offset,
+ f55->query_17.data,
+ sizeof(f55->query_17.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 18 */
+ if (f55->query_17.has_query18) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->query_base_addr + offset,
+ f55->query_18.data,
+ sizeof(f55->query_18.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 19 */
+ if (f55->query_18.has_query19)
+ offset += 1;
+
+ /* query 20 */
+ if (f55->query_18.has_ctrl27_query20)
+ offset += 1;
+
+ /* query 21 */
+ if (f55->query_18.has_ctrl28_query21)
+ offset += 1;
+
+ /* query 22 */
+ if (f55->query_18.has_query22) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->query_base_addr + offset,
+ f55->query_22.data,
+ sizeof(f55->query_22.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 23 */
+ if (f55->query_22.has_query23) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->query_base_addr + offset,
+ f55->query_23.data,
+ sizeof(f55->query_23.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+
+ f55->amp_sensor = f55->query_23.amp_sensor_enabled;
+ f55->size_of_column2mux = f55->query_23.size_of_column2mux;
+ }
+
+ /* queries 24 25 26 27 reserved */
+
+ /* query 28 */
+ if (f55->query_22.has_query28) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->query_base_addr + offset,
+ f55->query_28.data,
+ sizeof(f55->query_28.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* query 29 */
+ if (f55->query_28.has_query29)
+ offset += 1;
+
+ /* query 30 */
+ if (f55->query_28.has_query30) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->query_base_addr + offset,
+ f55->query_30.data,
+ sizeof(f55->query_30.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+ }
+
+ /* queries 31 32 */
+ if (f55->query_30.has_query31_query32)
+ offset += 2;
+
+ /* query 33 */
+ if (f55->query_30.has_query33) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->query_base_addr + offset,
+ f55->query_33.data,
+ sizeof(f55->query_33.data));
+ if (retval < 0)
+ return retval;
+ offset += 1;
+
+ f55->extended_amp = f55->query_33.has_extended_amp_pad;
+ f55->extended_amp_btn = f55->query_33.has_extended_amp_btn;
+ }
+
+ return 0;
+}
+
+static void test_f55_init(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char rx_electrodes;
+ unsigned char tx_electrodes;
+ struct f55_control_43 ctrl_43;
+
+ retval = test_f55_set_queries();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read f55 query registers\n",
+ __func__);
+ return;
+ }
+
+ if (!f55->query.has_sensor_assignment)
+ return;
+
+ retval = test_f55_set_controls();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set up f55 control registers\n",
+ __func__);
+ return;
+ }
+
+ tx_electrodes = f55->query.num_of_tx_electrodes;
+ rx_electrodes = f55->query.num_of_rx_electrodes;
+
+ f55->tx_assignment = kzalloc(tx_electrodes, GFP_KERNEL);
+ f55->rx_assignment = kzalloc(rx_electrodes, GFP_KERNEL);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->control_base_addr + SENSOR_TX_MAPPING_OFFSET,
+ f55->tx_assignment,
+ tx_electrodes);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read f55 tx assignment\n",
+ __func__);
+ return;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->control_base_addr + SENSOR_RX_MAPPING_OFFSET,
+ f55->rx_assignment,
+ rx_electrodes);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read f55 rx assignment\n",
+ __func__);
+ return;
+ }
+
+ f54->tx_assigned = 0;
+ for (ii = 0; ii < tx_electrodes; ii++) {
+ if (f55->tx_assignment[ii] != 0xff)
+ f54->tx_assigned++;
+ }
+
+ f54->rx_assigned = 0;
+ for (ii = 0; ii < rx_electrodes; ii++) {
+ if (f55->rx_assignment[ii] != 0xff)
+ f54->rx_assigned++;
+ }
+
+ if (f55->amp_sensor) {
+ f54->tx_assigned = f55->size_of_column2mux;
+ f54->rx_assigned /= 2;
+ }
+
+ if (f55->extended_amp) {
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->control_base_addr + f55->afe_mux_offset,
+ ctrl_43.data,
+ sizeof(ctrl_43.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read f55 AFE mux sizes\n",
+ __func__);
+ return;
+ }
+
+ f54->tx_assigned = ctrl_43.afe_l_mux_size +
+ ctrl_43.afe_r_mux_size;
+
+ f54->swap_sensor_side = ctrl_43.swap_sensor_side;
+ f54->left_mux_size = ctrl_43.afe_l_mux_size;
+ f54->right_mux_size = ctrl_43.afe_r_mux_size;
+
+ if (f55->query_33.has_extended_amp_btn)
+ f54->tx_assigned++;
+ }
+
+ /* force mapping */
+ if (f55->has_force) {
+ f55->force_tx_assignment = kzalloc(tx_electrodes, GFP_KERNEL);
+ f55->force_rx_assignment = kzalloc(rx_electrodes, GFP_KERNEL);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->control_base_addr + f55->force_tx_offset,
+ f55->force_tx_assignment,
+ tx_electrodes);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read f55 force tx assignment\n",
+ __func__);
+ return;
+ }
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ f55->control_base_addr + f55->force_rx_offset,
+ f55->force_rx_assignment,
+ rx_electrodes);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read f55 force rx assignment\n",
+ __func__);
+ return;
+ }
+
+ for (ii = 0; ii < tx_electrodes; ii++) {
+ if (f55->force_tx_assignment[ii] != 0xff)
+ f54->tx_assigned++;
+ }
+
+ for (ii = 0; ii < rx_electrodes; ii++) {
+ if (f55->force_rx_assignment[ii] != 0xff)
+ f54->rx_assigned++;
+ }
+ }
+
+ return;
+}
+
+static void test_f55_set_regs(struct synaptics_rmi4_data *rmi4_data,
+ struct synaptics_rmi4_fn_desc *fd,
+ unsigned char page)
+{
+ f55 = kzalloc(sizeof(*f55), GFP_KERNEL);
+ if (!f55) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for f55\n",
+ __func__);
+ return;
+ }
+
+ f55->query_base_addr = fd->query_base_addr | (page << 8);
+ f55->control_base_addr = fd->ctrl_base_addr | (page << 8);
+ f55->data_base_addr = fd->data_base_addr | (page << 8);
+ f55->command_base_addr = fd->cmd_base_addr | (page << 8);
+
+ return;
+}
+
+static int test_scan_pdt(void)
+{
+ int retval;
+ unsigned char intr_count = 0;
+ unsigned char page;
+ unsigned short addr;
+ bool f54found = false;
+ bool f55found = false;
+ struct synaptics_rmi4_fn_desc rmi_fd;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+
+ for (page = 0; page < PAGES_TO_SERVICE; page++) {
+ for (addr = PDT_START; addr > PDT_END; addr -= PDT_ENTRY_SIZE) {
+ addr |= (page << 8);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ addr,
+ (unsigned char *)&rmi_fd,
+ sizeof(rmi_fd));
+ if (retval < 0)
+ return retval;
+
+ addr &= ~(MASK_8BIT << 8);
+
+ if (!rmi_fd.fn_number)
+ break;
+
+ switch (rmi_fd.fn_number) {
+ case SYNAPTICS_RMI4_F54:
+ test_f54_set_regs(rmi4_data,
+ &rmi_fd, intr_count, page);
+ f54found = true;
+ break;
+ case SYNAPTICS_RMI4_F55:
+ test_f55_set_regs(rmi4_data,
+ &rmi_fd, page);
+ f55found = true;
+ break;
+ default:
+ break;
+ }
+
+ if (f54found && f55found)
+ goto pdt_done;
+
+ intr_count += rmi_fd.intr_src_count;
+ }
+ }
+
+ if (!f54found) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to find F54\n",
+ __func__);
+ return -EINVAL;
+ }
+
+pdt_done:
+ return 0;
+}
+
+static void synaptics_rmi4_test_attn(struct synaptics_rmi4_data *rmi4_data,
+ unsigned char intr_mask)
+{
+ if (!f54)
+ return;
+
+ if (f54->intr_mask & intr_mask) {
+ pr_err("%s\n", __func__);
+ queue_work(f54->test_report_workqueue, &f54->test_report_work);
+ }
+
+ return;
+}
+
+static ssize_t short_test_333x(void)
+{
+ int retval;
+ const struct synaptics_dsx_board_data *bdata =
+ f54->rmi4_data->hw_if->board_data;
+
+ if (!bdata || !bdata->short_test25 || !bdata->short_test26) {
+ retval = -EINVAL;
+ goto out;
+ }
+
+ retval = test_sysfs_read_report_store(NULL, NULL, TEST_TYPE_25_333X, strlen(TEST_TYPE_25_333X));
+ if (retval < 0)
+ goto out;
+
+ retval = test_sysfs_read_report_show(NULL, NULL, f54->data);
+ if (retval < 0)
+ goto out;
+
+ if (strncmp(bdata->short_test25, f54->data, strlen(bdata->short_test25))) {
+ f54->result_type = TEST_FAILED;
+ goto out;
+ }
+
+ msleep(1000);
+
+ retval = test_sysfs_read_report_store(NULL, NULL, TEST_TYPE_26_333X, strlen(TEST_TYPE_26_333X));
+ if (retval < 0)
+ goto out;
+
+ retval = test_sysfs_read_report_show(NULL, NULL, f54->data);
+ if (retval < 0)
+ goto out;
+
+ if (strncmp(bdata->short_test26, f54->data, strlen(bdata->short_test26))) {
+ f54->result_type = TEST_FAILED;
+ goto out;
+ }
+
+ f54->result_type = TEST_OK;
+
+out:
+ if (retval < 0)
+ f54->result_type = TEST_INVALID;
+
+ return retval;
+}
+
+static ssize_t short_test_4x22(void)
+{
+ int retval;
+ char buf[4];
+
+ retval = test_sysfs_td43xx_ee_short_store(NULL, NULL, "1", 1);
+ if (retval < 0)
+ goto out;
+
+ msleep(100);
+
+ retval = test_sysfs_td43xx_ee_short_show(NULL, NULL, buf);
+ if (retval < 0)
+ goto out;
+
+ if (!strncmp(buf, "PASS", 4))
+ f54->result_type = TEST_OK;
+ else
+ f54->result_type = TEST_FAILED;
+
+out:
+ if (retval < 0)
+ f54->result_type = TEST_INVALID;
+
+ return retval;
+}
+
+static ssize_t short_test_tddi_extend(void)
+{
+ int retval;
+ char buf[4];
+
+ retval = test_sysfs_tddi_extend_ee_short_store(NULL, NULL, "1", 1);
+ if (retval < 0)
+ goto out;
+
+ msleep(100);
+
+ retval = test_sysfs_tddi_extend_ee_short_show(NULL, NULL, buf);
+ if (retval < 0)
+ goto out;
+
+ if (!strncmp(buf, "PASS", 4))
+ f54->result_type = TEST_OK;
+ else
+ f54->result_type = TEST_FAILED;
+
+out:
+ if (retval < 0)
+ f54->result_type = TEST_INVALID;
+
+ return retval;
+}
+
+
+static ssize_t open_test_333x(void)
+{
+ int retval;
+ int val, tx, rx, num = 0;
+ char *pos;
+
+ retval = test_sysfs_read_report_store(NULL, NULL, TEST_TYPE_03, strlen(TEST_TYPE_03));
+ if (retval < 0)
+ goto out;
+
+ retval = test_sysfs_read_report_show(NULL, NULL, f54->data);
+ if (retval < 0)
+ goto out;
+
+ pos = f54->data;
+ pos += 5;
+ tx = simple_strtoul(pos, NULL, 10);
+ pos = strnchr(pos, 16, '\n') + 1;
+ pos += 5;
+ rx = simple_strtoul(pos, NULL, 10);
+ pos = strnchr(pos, 16, '\n') + 1;
+
+ while (num < (tx * rx)) {
+ if ((*pos == ' ') || (*pos == '\n'))
+ pos++;
+ else {
+ val = simple_strtol(pos, NULL, 10);
+ if (((val > 0) && (val < 100)) || (val < 0)) {
+ f54->result_type = TEST_FAILED;
+ goto out;
+ }
+
+ while ((*pos != ' ') && (*pos != '\n'))
+ pos++;
+ num++;
+ }
+ }
+
+ f54->result_type = TEST_OK;
+
+out:
+ if (retval < 0)
+ f54->result_type = TEST_INVALID;
+
+ return retval;
+}
+
+static ssize_t open_test_4x22(void)
+{
+ int retval;
+ char buf[4];
+
+ retval = test_sysfs_td43xx_amp_open_store(NULL, NULL, "1", 1);
+ if (retval < 0)
+ goto out;
+
+ msleep(100);
+
+ retval = test_sysfs_td43xx_amp_open_show(NULL, NULL, buf);
+ if (retval < 0)
+ goto out;
+
+ if (!strncmp(buf, "PASS", 4))
+ f54->result_type = TEST_OK;
+ else
+ f54->result_type = TEST_FAILED;
+
+out:
+ if (retval < 0)
+ f54->result_type = TEST_INVALID;
+
+ return retval;
+}
+
+static ssize_t open_test_b7(void)
+{
+ int retval;
+ char buf[4];
+
+ retval = test_sysfs_td4722_b7_amp_open_store(NULL, NULL, "1", 1);
+ if (retval < 0)
+ goto out;
+
+ msleep(100);
+
+ retval = test_sysfs_td4722_b7_amp_open_show(NULL, NULL, buf);
+ if (retval < 0)
+ goto out;
+
+ if (!strncmp(buf, "PASS", 4))
+ f54->result_type = TEST_OK;
+ else
+ f54->result_type = TEST_FAILED;
+
+out:
+ if (retval < 0)
+ f54->result_type = TEST_INVALID;
+
+ return retval;
+}
+
+static ssize_t i2c_test(void)
+{
+ int retval;
+ unsigned short addr;
+ unsigned char query_data[8] = {0};
+
+ addr = f54->rmi4_data->f01_query_base_addr + CHIP_ID_OFFSET;
+
+ retval = synaptics_rmi4_reg_read(f54->rmi4_data,
+ addr,
+ query_data,
+ 8);
+ if (retval < 0) {
+ f54->result_type = TEST_FAILED;
+ retval = 0;
+ goto out;
+ }
+
+ f54->result_type = TEST_OK;
+
+out:
+ if (retval < 0)
+ f54->result_type = TEST_INVALID;
+
+ return retval;
+}
+
+static int syna_selftest_open(struct inode *inode, struct file *file)
+{
+ f54->data = vmalloc(PAGE_SIZE);
+
+ return 0;
+}
+
+static ssize_t syna_selftest_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+{
+ char tmp[5];
+
+ if (*pos != 0)
+ return 0;
+
+ snprintf(tmp, sizeof(f54->result_type), "%d\n", f54->result_type);
+ if (copy_to_user(buf, tmp, strlen(tmp))) {
+ return -EFAULT;
+ }
+
+ *pos += strlen(tmp);
+
+ return strlen(tmp);
+}
+
+static ssize_t syna_selftest_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
+{
+ int retval;
+ char tmp[6];
+
+ if (!f54->data || count > sizeof(tmp)) {
+ retval = -EINVAL;
+ f54->result_type = TEST_INVALID;
+ goto out;
+ }
+
+ if (copy_from_user(tmp, buf, count)) {
+ retval = -EFAULT;
+ goto out;
+ }
+
+ if (!strncmp(tmp, "short", 5)) {
+ if (!f54->rmi4_data->chip_is_tddi)
+ retval = short_test_333x();
+ else {
+ if (!f54->rmi4_data->short_test_extend)
+ retval = short_test_4x22();
+ else
+ retval = short_test_tddi_extend();
+ }
+ } else if (!strncmp(tmp, "open", 4)) {
+ if (!f54->rmi4_data->chip_is_tddi)
+ retval = open_test_333x();
+ else {
+ if (!f54->rmi4_data->open_test_b7)
+ retval = open_test_4x22();
+ else
+ retval = open_test_b7();
+ }
+ } else if (!strncmp(tmp, "i2c", 3))
+ retval = i2c_test();
+
+out:
+ if (retval >= 0)
+ retval = count;
+
+ return retval;
+}
+
+static int syna_selftest_release(struct inode *inode, struct file *file)
+{
+ vfree(f54->data);
+ f54->data = NULL;
+
+ return 0;
+}
+
+static const struct file_operations syna_selftest_ops = {
+ .open = syna_selftest_open,
+ .read = syna_selftest_read,
+ .write = syna_selftest_write,
+ .release = syna_selftest_release,
+};
+
+static ssize_t syna_factory_param_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+{
+ char *buffer = NULL, *pbuf;
+ char **p = NULL;
+ int i, cnt;
+ int buflen;
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+
+ if (*pos != 0 || !factory_param)
+ return 0;
+
+ buffer = vmalloc(PAGE_SIZE);
+ if (!buffer)
+ return -ENOMEM;
+
+ pbuf = buffer;
+ i = 0;
+ cnt = 0;
+ for (p = factory_string; *p != NULL; p++) {
+ cnt = sprintf(pbuf, "%s:%d\n", *p, factory_param->data[i++]);
+ pbuf += cnt;
+ }
+
+ pbuf[0] = '\0';
+ if (copy_to_user(buf, buffer, strlen(buffer) + 1)) {
+ return -EFAULT;
+ }
+
+ buflen = strlen(buffer);
+ *pos += buflen;
+
+ vfree(buffer);
+ return buflen;
+}
+
+static ssize_t syna_factory_param_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
+{
+ int retval = 0;
+ char **p = NULL;
+ char tmp[100];
+ char str[100];
+ int i, value = -1;
+
+ struct synaptics_rmi4_data *rmi4_data = f54->rmi4_data;
+ struct synaptics_dsx_factory_param *factory_param = rmi4_data->factory_param;
+
+ if (!factory_param)
+ return -EINVAL;
+
+ if (copy_from_user(tmp, buf, count)) {
+ retval = -EFAULT;
+ goto out;
+ }
+
+ sscanf(tmp, "%s %d", str, &value);
+
+ i = 0;
+ for (p = factory_string; *p != NULL; p++) {
+ if (!strncmp(str, *p, strlen(*p))) {
+ factory_param->data[i] = value;
+ break;
+ }
+ i++;
+ }
+
+out:
+ if (retval >= 0)
+ retval = count;
+
+ return count;
+}
+
+
+static const struct file_operations syna_factory_ops = {
+ .read = syna_factory_param_read,
+ .write = syna_factory_param_write,
+};
+
+
+static int syna_datadump_open(struct inode *inode, struct file *file)
+{
+ f54->rmi4_data->dump_flags = true;
+
+ return 0;
+}
+
+static ssize_t syna_datadump_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
+{
+ int retval;
+ int cnt = 0;
+ int buflen = 0;
+ u8 *buffer = NULL;
+
+ if (*pos != 0)
+ return 0;
+
+ if (f54->rmi4_data->disable_data_dump)
+ return -EINVAL;
+
+ buffer = vmalloc(PAGE_SIZE * 2);
+ if (!buffer)
+ return -ENOMEM;
+
+ retval = test_sysfs_read_report_store(NULL, NULL, TEST_TYPE_02, strlen(TEST_TYPE_02));
+ if (retval < 0) {
+ snprintf(buffer, PAGE_SIZE, "data test error: start\n");
+ goto out;
+ }
+
+ retval = test_sysfs_read_report_show(NULL, NULL, buffer);
+ if (retval < 0) {
+ snprintf(buffer, PAGE_SIZE, "data test error: read\n");
+ goto out;
+ }
+
+ cnt += retval;
+
+ retval = test_sysfs_read_report_store(NULL, NULL, TEST_TYPE_03, strlen(TEST_TYPE_03));
+ if (retval < 0) {
+ snprintf(buffer, PAGE_SIZE, "data test error: start\n");
+ goto out;
+ }
+
+ retval = test_sysfs_read_report_show(NULL, NULL, buffer + cnt);
+ if (retval < 0) {
+ snprintf(buffer, PAGE_SIZE, "data test error: read\n");
+ goto out;
+ }
+
+ if (copy_to_user(buf, buffer, strlen(buffer))) {
+ retval = -EFAULT;
+ goto out;
+ }
+
+out:
+
+ complete(&f54->rmi4_data->dump_completion);
+ buflen = strlen(buffer);
+ *pos += buflen;
+ vfree(buffer);
+
+ if (retval < 0)
+ return retval;
+
+ return buflen;
+}
+
+static int syna_datadump_release(struct inode *inode, struct file *file)
+{
+ f54->rmi4_data->dump_flags = false;
+
+ return 0;
+}
+
+static const struct file_operations syna_datadump_ops = {
+ .open = syna_datadump_open,
+ .read = syna_datadump_read,
+ .release = syna_datadump_release,
+};
+
+static int synaptics_rmi4_test_init(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ static bool proc_already;
+
+ if (f54) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Handle already exists\n",
+ __func__);
+ return 0;
+ }
+
+ f54 = kzalloc(sizeof(*f54), GFP_KERNEL);
+ if (!f54) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for f54\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ f54->result_type = TEST_INVALID;
+
+ f54->rmi4_data = rmi4_data;
+
+ f55 = NULL;
+
+ retval = test_scan_pdt();
+ if (retval < 0)
+ goto exit_free_mem;
+
+ retval = test_set_queries();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read f54 query registers\n",
+ __func__);
+ goto exit_free_mem;
+ }
+
+ f54->tx_assigned = f54->query.num_of_tx_electrodes;
+ f54->rx_assigned = f54->query.num_of_rx_electrodes;
+
+ retval = test_set_controls();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set up f54 control registers\n",
+ __func__);
+ goto exit_free_control;
+ }
+
+ test_set_data();
+
+ if (f55)
+ test_f55_init(rmi4_data);
+
+ if (rmi4_data->external_afe_buttons)
+ f54->tx_assigned++;
+
+ retval = test_set_sysfs();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs entries\n",
+ __func__);
+ goto exit_sysfs;
+ }
+
+ f54->test_report_workqueue =
+ create_singlethread_workqueue("test_report_workqueue");
+ INIT_WORK(&f54->test_report_work, test_report_work);
+
+ hrtimer_init(&f54->watchdog, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
+ f54->watchdog.function = test_get_report_timeout;
+ INIT_WORK(&f54->timeout_work, test_timeout_work);
+
+ INIT_WORK(&f54->resume_touch_work, test_resume_touch_work);
+
+ mutex_init(&f54->status_mutex);
+ f54->status = STATUS_IDLE;
+
+ if (!proc_already) {
+ proc_already = true;
+ proc_create("tp_selftest", 0644, NULL, &syna_selftest_ops);
+ proc_create("tp_data_dump", 0, NULL, &syna_datadump_ops);
+ proc_create("tp_factory_param", 0, NULL, &syna_factory_ops);
+ }
+
+ return 0;
+
+exit_sysfs:
+ if (f55) {
+ kfree(f55->tx_assignment);
+ kfree(f55->rx_assignment);
+ kfree(f55->force_tx_assignment);
+ kfree(f55->force_rx_assignment);
+ }
+
+exit_free_control:
+ test_free_control_mem();
+
+exit_free_mem:
+ kfree(f55);
+ f55 = NULL;
+ kfree(f54);
+ f54 = NULL;
+
+exit:
+ return retval;
+}
+
+static void synaptics_rmi4_test_remove(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!f54)
+ goto exit;
+
+ hrtimer_cancel(&f54->watchdog);
+
+ cancel_work_sync(&f54->test_report_work);
+ flush_workqueue(f54->test_report_workqueue);
+ destroy_workqueue(f54->test_report_workqueue);
+
+ cancel_work_sync(&f54->resume_touch_work);
+
+ test_remove_sysfs();
+
+ if (f55) {
+ kfree(f55->tx_assignment);
+ kfree(f55->rx_assignment);
+ kfree(f55->force_tx_assignment);
+ kfree(f55->force_rx_assignment);
+ }
+
+ test_free_control_mem();
+
+ if (f54->data_buffer_size)
+ kfree(f54->report_data);
+
+ kfree(f55);
+ f55 = NULL;
+
+ kfree(f54);
+ f54 = NULL;
+
+exit:
+ complete(&test_remove_complete_force);
+
+ return;
+}
+
+static void synaptics_rmi4_test_reset(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+
+ if (!f54) {
+ synaptics_rmi4_test_init(rmi4_data);
+ return;
+ }
+
+ if (f55) {
+ kfree(f55->tx_assignment);
+ kfree(f55->rx_assignment);
+ kfree(f55->force_tx_assignment);
+ kfree(f55->force_rx_assignment);
+ }
+
+ test_free_control_mem();
+
+ kfree(f55);
+ f55 = NULL;
+
+ retval = test_scan_pdt();
+ if (retval < 0)
+ goto exit_free_mem;
+
+ retval = test_set_queries();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to read f54 query registers\n",
+ __func__);
+ goto exit_free_mem;
+ }
+
+ f54->tx_assigned = f54->query.num_of_tx_electrodes;
+ f54->rx_assigned = f54->query.num_of_rx_electrodes;
+
+ retval = test_set_controls();
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to set up f54 control registers\n",
+ __func__);
+ goto exit_free_control;
+ }
+
+ test_set_data();
+
+ if (f55)
+ test_f55_init(rmi4_data);
+
+ if (rmi4_data->external_afe_buttons)
+ f54->tx_assigned++;
+
+ f54->status = STATUS_IDLE;
+
+ return;
+
+exit_free_control:
+ test_free_control_mem();
+
+exit_free_mem:
+ hrtimer_cancel(&f54->watchdog);
+
+ cancel_work_sync(&f54->test_report_work);
+ flush_workqueue(f54->test_report_workqueue);
+ destroy_workqueue(f54->test_report_workqueue);
+
+ test_remove_sysfs();
+
+ if (f54->data_buffer_size)
+ kfree(f54->report_data);
+
+ kfree(f55);
+ f55 = NULL;
+
+ kfree(f54);
+ f54 = NULL;
+
+ return;
+}
+
+static struct synaptics_rmi4_exp_fn test_module = {
+ .fn_type = RMI_TEST_REPORTING,
+ .init = synaptics_rmi4_test_init,
+ .remove = synaptics_rmi4_test_remove,
+ .reset = synaptics_rmi4_test_reset,
+ .reinit = NULL,
+ .early_suspend = NULL,
+ .suspend = NULL,
+ .resume = NULL,
+ .late_resume = NULL,
+ .attn = synaptics_rmi4_test_attn,
+};
+
+static int __init rmi4_test_module_init(void)
+{
+ synaptics_rmi4_new_function_force(&test_module, true);
+
+ return 0;
+}
+
+static void __exit rmi4_test_module_exit(void)
+{
+ synaptics_rmi4_new_function_force(&test_module, false);
+
+ wait_for_completion(&test_remove_complete_force);
+
+ return;
+}
+
+module_init(rmi4_test_module_init);
+module_exit(rmi4_test_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX Test Reporting Module");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_video.c b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_video.c
new file mode 100644
index 000000000000..d0762544ffb2
--- /dev/null
+++ b/drivers/input/touchscreen/synaptics_dsx_force/synaptics_dsx_video.c
@@ -0,0 +1,416 @@
+/*
+ * Synaptics DSX touchscreen driver
+ *
+ * Copyright (C) 2012-2015 Synaptics Incorporated. All rights reserved.
+ *
+ * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
+ * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
+ *
+ * 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.
+ *
+ * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND SYNAPTICS
+ * EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
+ * AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS.
+ * IN NO EVENT SHALL SYNAPTICS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED
+ * AND BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF COMPETENT JURISDICTION DOES
+ * NOT PERMIT THE DISCLAIMER OF DIRECT DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS'
+ * TOTAL CUMULATIVE LIABILITY TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S.
+ * DOLLARS.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/platform_device.h>
+#include <linux/input/synaptics_dsx.h>
+#include "synaptics_dsx_core.h"
+
+#define SYSFS_FOLDER_NAME "video"
+
+/*
+#define RMI_DCS_SUSPEND_RESUME
+*/
+
+static ssize_t video_sysfs_dcs_write_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static ssize_t video_sysfs_param_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count);
+
+static int video_send_dcs_command(unsigned char command_opcode);
+
+struct f38_command {
+ union {
+ struct {
+ unsigned char command_opcode;
+ unsigned char register_access:1;
+ unsigned char gamma_page:1;
+ unsigned char f38_control1_b2__7:6;
+ unsigned char parameter_field_1;
+ unsigned char parameter_field_2;
+ unsigned char parameter_field_3;
+ unsigned char parameter_field_4;
+ unsigned char send_to_dcs:1;
+ unsigned char f38_command6_b1__7:7;
+ } __packed;
+ unsigned char data[7];
+ };
+};
+
+struct synaptics_rmi4_video_handle {
+ unsigned char param;
+ unsigned short query_base_addr;
+ unsigned short control_base_addr;
+ unsigned short data_base_addr;
+ unsigned short command_base_addr;
+ struct synaptics_rmi4_data *rmi4_data;
+ struct kobject *sysfs_dir;
+};
+
+#ifdef RMI_DCS_SUSPEND_RESUME
+struct dcs_command {
+ unsigned char command;
+ unsigned int wait_time;
+};
+
+static struct dcs_command suspend_sequence[] = {
+ {
+ .command = 0x28,
+ .wait_time = 200,
+ },
+ {
+ .command = 0x10,
+ .wait_time = 200,
+ },
+};
+
+static struct dcs_command resume_sequence[] = {
+ {
+ .command = 0x11,
+ .wait_time = 200,
+ },
+ {
+ .command = 0x29,
+ .wait_time = 200,
+ },
+};
+#endif
+
+static struct device_attribute attrs[] = {
+ __ATTR(dcs_write, S_IWUGO,
+ synaptics_rmi4_show_error,
+ video_sysfs_dcs_write_store),
+ __ATTR(param, S_IWUGO,
+ synaptics_rmi4_show_error,
+ video_sysfs_param_store),
+};
+
+static struct synaptics_rmi4_video_handle *video;
+
+DECLARE_COMPLETION(video_remove_complete);
+
+static ssize_t video_sysfs_dcs_write_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int retval;
+ unsigned int input;
+
+ if (sscanf(buf, "%x", &input) != 1)
+ return -EINVAL;
+
+ retval = video_send_dcs_command((unsigned char)input);
+ if (retval < 0)
+ return retval;
+
+ return count;
+}
+
+static ssize_t video_sysfs_param_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ unsigned int input;
+
+ if (sscanf(buf, "%x", &input) != 1)
+ return -EINVAL;
+
+ video->param = (unsigned char)input;
+
+ return count;
+}
+
+static int video_send_dcs_command(unsigned char command_opcode)
+{
+ int retval;
+ struct f38_command command;
+ struct synaptics_rmi4_data *rmi4_data = video->rmi4_data;
+
+ memset(&command, 0x00, sizeof(command));
+
+ command.command_opcode = command_opcode;
+ command.parameter_field_1 = video->param;
+ command.send_to_dcs = 1;
+
+ video->param = 0;
+
+ retval = synaptics_rmi4_reg_write(rmi4_data,
+ video->command_base_addr,
+ command.data,
+ sizeof(command.data));
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to send DCS command\n",
+ __func__);
+ return retval;
+ }
+
+ return 0;
+}
+
+static int video_scan_pdt(void)
+{
+ int retval;
+ unsigned char page;
+ unsigned short addr;
+ bool f38_found = false;
+ struct synaptics_rmi4_fn_desc rmi_fd;
+ struct synaptics_rmi4_data *rmi4_data = video->rmi4_data;
+
+ for (page = 0; page < PAGES_TO_SERVICE; page++) {
+ for (addr = PDT_START; addr > PDT_END; addr -= PDT_ENTRY_SIZE) {
+ addr |= (page << 8);
+
+ retval = synaptics_rmi4_reg_read(rmi4_data,
+ addr,
+ (unsigned char *)&rmi_fd,
+ sizeof(rmi_fd));
+ if (retval < 0)
+ return retval;
+
+ addr &= ~(MASK_8BIT << 8);
+
+ if (!rmi_fd.fn_number)
+ break;
+
+ if (rmi_fd.fn_number == SYNAPTICS_RMI4_F38) {
+ f38_found = true;
+ goto f38_found;
+ }
+ }
+ }
+
+ if (!f38_found) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to find F38\n",
+ __func__);
+ return -EINVAL;
+ }
+
+f38_found:
+ video->query_base_addr = rmi_fd.query_base_addr | (page << 8);
+ video->control_base_addr = rmi_fd.ctrl_base_addr | (page << 8);
+ video->data_base_addr = rmi_fd.data_base_addr | (page << 8);
+ video->command_base_addr = rmi_fd.cmd_base_addr | (page << 8);
+
+ return 0;
+}
+
+static int synaptics_rmi4_video_init(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned char attr_count;
+
+ if (video) {
+ dev_dbg(rmi4_data->pdev->dev.parent,
+ "%s: Handle already exists\n",
+ __func__);
+ return 0;
+ }
+
+ video = kzalloc(sizeof(*video), GFP_KERNEL);
+ if (!video) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to alloc mem for video\n",
+ __func__);
+ retval = -ENOMEM;
+ goto exit;
+ }
+
+ video->rmi4_data = rmi4_data;
+
+ retval = video_scan_pdt();
+ if (retval < 0) {
+ retval = 0;
+ goto exit_scan_pdt;
+ }
+
+ video->sysfs_dir = kobject_create_and_add(SYSFS_FOLDER_NAME,
+ &rmi4_data->input_dev->dev.kobj);
+ if (!video->sysfs_dir) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs directory\n",
+ __func__);
+ retval = -ENODEV;
+ goto exit_sysfs_dir;
+ }
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) {
+ retval = sysfs_create_file(video->sysfs_dir,
+ &attrs[attr_count].attr);
+ if (retval < 0) {
+ dev_err(rmi4_data->pdev->dev.parent,
+ "%s: Failed to create sysfs attributes\n",
+ __func__);
+ retval = -ENODEV;
+ goto exit_sysfs_attrs;
+ }
+ }
+
+ return 0;
+
+exit_sysfs_attrs:
+ for (attr_count--; attr_count >= 0; attr_count--)
+ sysfs_remove_file(video->sysfs_dir, &attrs[attr_count].attr);
+
+ kobject_put(video->sysfs_dir);
+
+exit_sysfs_dir:
+exit_scan_pdt:
+ kfree(video);
+ video = NULL;
+
+exit:
+ return retval;
+}
+
+static void synaptics_rmi4_video_remove(struct synaptics_rmi4_data *rmi4_data)
+{
+ unsigned char attr_count;
+
+ if (!video)
+ goto exit;
+
+ for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++)
+ sysfs_remove_file(video->sysfs_dir, &attrs[attr_count].attr);
+
+ kobject_put(video->sysfs_dir);
+
+ kfree(video);
+ video = NULL;
+
+exit:
+ complete(&video_remove_complete);
+
+ return;
+}
+
+static void synaptics_rmi4_video_reset(struct synaptics_rmi4_data *rmi4_data)
+{
+ if (!video)
+ synaptics_rmi4_video_init(rmi4_data);
+
+ return;
+}
+
+#ifdef RMI_DCS_SUSPEND_RESUME
+static void synaptics_rmi4_video_suspend(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char command;
+ unsigned char num_of_cmds;
+
+ if (!video)
+ return;
+
+ num_of_cmds = ARRAY_SIZE(suspend_sequence);
+
+ for (ii = 0; ii < num_of_cmds; ii++) {
+ command = suspend_sequence[ii].command;
+ retval = video_send_dcs_command(command);
+ if (retval < 0)
+ return;
+ msleep(suspend_sequence[ii].wait_time);
+ }
+
+ return;
+}
+
+static void synaptics_rmi4_video_resume(struct synaptics_rmi4_data *rmi4_data)
+{
+ int retval;
+ unsigned char ii;
+ unsigned char command;
+ unsigned char num_of_cmds;
+
+ if (!video)
+ return;
+
+ num_of_cmds = ARRAY_SIZE(resume_sequence);
+
+ for (ii = 0; ii < num_of_cmds; ii++) {
+ command = resume_sequence[ii].command;
+ retval = video_send_dcs_command(command);
+ if (retval < 0)
+ return;
+ msleep(resume_sequence[ii].wait_time);
+ }
+
+ return;
+}
+#endif
+
+static struct synaptics_rmi4_exp_fn video_module = {
+ .fn_type = RMI_VIDEO,
+ .init = synaptics_rmi4_video_init,
+ .remove = synaptics_rmi4_video_remove,
+ .reset = synaptics_rmi4_video_reset,
+ .reinit = NULL,
+ .early_suspend = NULL,
+#ifdef RMI_DCS_SUSPEND_RESUME
+ .suspend = synaptics_rmi4_video_suspend,
+ .resume = synaptics_rmi4_video_resume,
+#else
+ .suspend = NULL,
+ .resume = NULL,
+#endif
+ .late_resume = NULL,
+ .attn = NULL,
+};
+
+static int __init rmi4_video_module_init(void)
+{
+ synaptics_rmi4_new_function_force(&video_module, true);
+
+ return 0;
+}
+
+static void __exit rmi4_video_module_exit(void)
+{
+ synaptics_rmi4_new_function_force(&video_module, false);
+
+ wait_for_completion(&video_remove_complete);
+
+ return;
+}
+
+module_init(rmi4_video_module_init);
+module_exit(rmi4_video_module_exit);
+
+MODULE_AUTHOR("Synaptics, Inc.");
+MODULE_DESCRIPTION("Synaptics DSX Video Module");
+MODULE_LICENSE("GPL v2");
diff --git a/firmware/Makefile b/firmware/Makefile
index 05ac8f0a9246..691852793e89 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -104,6 +104,8 @@ fw-shipped-$(CONFIG_USB_EMI62) += emi62/loader.fw emi62/bitstream.fw \
fw-shipped-$(CONFIG_USB_KAWETH) += kaweth/new_code.bin kaweth/trigger_code.bin \
kaweth/new_code_fix.bin \
kaweth/trigger_code_fix.bin
+fw-shipped-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FORCE) += synaptics_jdi_3331_c8.fw \
+ synaptics_jdi_3330_c8.fw synaptics_sharp_4322_c8.fw
ifdef CONFIG_FIRMWARE_IN_KERNEL
fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_MPR) += keyspan/mpr.fw
fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA18X) += keyspan/usa18x.fw
diff --git a/firmware/synaptics_jdi_3330_c8.fw.ihex b/firmware/synaptics_jdi_3330_c8.fw.ihex
new file mode 100644
index 000000000000..830c8710a234
--- /dev/null
+++ b/firmware/synaptics_jdi_3330_c8.fw.ihex
@@ -0,0 +1,8583 @@
+:1000000079C1997C00000010000000001000000081
+:100010003A3A53BA0000000000000000000000005F
+:10002000000000000000000024000000300000007C
+:1000300060000000B0000000D0080000F0100000D8
+:1000400090010200C0010200F00102002002020043
+:100050000018020000000000000000000000000086
+:100060002853AEE00D00000000000000000000007A
+:1000700000000000000000002200000080000000DE
+:10008000020D0100E9D829004453352052322E32A6
+:10009000302E3200000000005333333330000000B4
+:1000A0000000000000000000000000000000000050
+:1000B0006F83DF060F00000000000000000000005A
+:1000C000000000000000000000080000D000000058
+:1000D0000000010000020000240502000100FF01F1
+:1000E000070603008000000227020600800080024D
+:1000F0002F100700801C0003641B08008000801F75
+:10010000671A0500200000400F0004006000204036
+:1001100003000000000000000000000000000000DC
+:1001200000000000000000000000000000000000CF
+:1001300000000000000000000000000000000000BF
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000000000000000000000000000000000008F
+:10017000000000000000000000000000000000007F
+:10018000000000000000000000000000000000006F
+:10019000000000000000000000000000000000005F
+:1001A000000000000000000000000000000000004F
+:1001B000000000000000000000000000000000003F
+:1001C000000000000000000000000000000000002F
+:1001D000000000000000000000000000000000001F
+:1001E000000000000000000000000000000000000F
+:1001F00000000000000000000000000000000000FF
+:1002000000000000000000000000000000000000EE
+:1002100000000000000000000000000000000000DE
+:1002200000000000000000000000000000000000CE
+:1002300000000000000000000000000000000000BE
+:1002400000000000000000000000000000000000AE
+:10025000000000000000000000000000000000009E
+:10026000000000000000000000000000000000008E
+:10027000000000000000000000000000000000007E
+:10028000000000000000000000000000000000006E
+:10029000000000000000000000000000000000005E
+:1002A000000000000000000000000000000000004E
+:1002B000000000000000000000000000000000003E
+:1002C000000000000000000000000000000000002E
+:1002D000000000000000000000000000000000001E
+:1002E000000000000000000000000000000000000E
+:1002F00000000000000000000000000000000000FE
+:1003000000000000000000000000000000000000ED
+:1003100000000000000000000000000000000000DD
+:1003200000000000000000000000000000000000CD
+:1003300000000000000000000000000000000000BD
+:1003400000000000000000000000000000000000AD
+:10035000000000000000000000000000000000009D
+:10036000000000000000000000000000000000008D
+:10037000000000000000000000000000000000007D
+:10038000000000000000000000000000000000006D
+:10039000000000000000000000000000000000005D
+:1003A000000000000000000000000000000000004D
+:1003B000000000000000000000000000000000003D
+:1003C000000000000000000000000000000000002D
+:1003D000000000000000000000000000000000001D
+:1003E000000000000000000000000000000000000D
+:1003F00000000000000000000000000000000000FD
+:1004000000000000000000000000000000000000EC
+:1004100000000000000000000000000000000000DC
+:1004200000000000000000000000000000000000CC
+:1004300000000000000000000000000000000000BC
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000000000000000000008C
+:10047000000000000000000000000000000000007C
+:10048000000000000000000000000000000000006C
+:10049000000000000000000000000000000000005C
+:1004A000000000000000000000000000000000004C
+:1004B000000000000000000000000000000000003C
+:1004C000000000000000000000000000000000002C
+:1004D000000000000000000000000000000000001C
+:1004E000000000000000000000000000000000000C
+:1004F00000000000000000000000000000000000FC
+:1005000000000000000000000000000000000000EB
+:1005100000000000000000000000000000000000DB
+:1005200000000000000000000000000000000000CB
+:1005300000000000000000000000000000000000BB
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:10057000000000000000000000000000000000007B
+:10058000000000000000000000000000000000006B
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E000000000000000000000000000000000000B
+:1005F00000000000000000000000000000000000FB
+:1006000000000000000000000000000000000000EA
+:1006100000000000000000000000000000000000DA
+:1006200000000000000000000000000000000000CA
+:1006300000000000000000000000000000000000BA
+:1006400000000000000000000000000000000000AA
+:10065000000000000000000000000000000000009A
+:10066000000000000000000000000000000000008A
+:10067000000000000000000000000000000000007A
+:10068000000000000000000000000000000000006A
+:10069000000000000000000000000000000000005A
+:1006A000000000000000000000000000000000004A
+:1006B000000000000000000000000000000000003A
+:1006C000000000000000000000000000000000002A
+:1006D000000000000000000000000000000000001A
+:1006E000000000000000000000000000000000000A
+:1006F00000000000000000000000000000000000FA
+:1007000000000000000000000000000000000000E9
+:1007100000000000000000000000000000000000D9
+:1007200000000000000000000000000000000000C9
+:1007300000000000000000000000000000000000B9
+:1007400000000000000000000000000000000000A9
+:100750000000000000000000000000000000000099
+:100760000000000000000000000000000000000089
+:100770000000000000000000000000000000000079
+:100780000000000000000000000000000000000069
+:100790000000000000000000000000000000000059
+:1007A0000000000000000000000000000000000049
+:1007B0000000000000000000000000000000000039
+:1007C0000000000000000000000000000000000029
+:1007D0000000000000000000000000000000000019
+:1007E0000000000000000000000000000000000009
+:1007F00000000000000000000000000000000000F9
+:1008000000000000000000000000000000000000E8
+:1008100000000000000000000000000000000000D8
+:1008200000000000000000000000000000000000C8
+:1008300000000000000000000000000000000000B8
+:1008400000000000000000000000000000000000A8
+:100850000000000000000000000000000000000098
+:100860000000000000000000000000000000000088
+:100870000000000000000000000000000000000078
+:100880000000000000000000000000000000000068
+:100890000000000000000000000000000000000058
+:1008A0000000000000000000000000000000000048
+:1008B0000000000000000000000000000000000038
+:1008C000000000000000000000000000231D294976
+:1008D000A1AA435513000000000000000000000022
+:1008E000000000000000000000080000F008000008
+:1008F00000000000000000000000000000000000F8
+:100900000000000000000000000000000C7403075D
+:1009100000170107FA0E37047F078340FA410303EB
+:1009200021211E11011E0509FB2C091E3EFF33006B
+:1009300048E86AEB8950E6C405080A10570F0A40D8
+:1009400001010107010128C01E64262680800000E5
+:1009500045450140463CFF00C800C8006F03B7068C
+:10096000649600000000250A660046000000370477
+:1009700000007F072E00010A04580204081E02FF2F
+:1009800000C800FF000100003200140014006400E1
+:100990006400100010007D007D004066581BFFFFC2
+:1009A000FFFFFFFFFFFFFFFFFFFFFFFFFFFF010054
+:1009B0000000000000000000000000000000000D2A
+:1009C0000700180180031B0000FF2F01FFFFBF96E7
+:1009D000C0E80300FF8080800000000014000000D9
+:1009E0006401371F0C0C0C0C00310DFFFF0065017A
+:1009F0000100060601010065010101010303270052
+:100A00001400000002000128032600140000030265
+:100A100000012C822300140000040200012D022199
+:100A2000001400000805000228011D001400000D3C
+:100A300003000125801400140000000500032C862B
+:100A40005100140000010200012886490014000032
+:100A5000050200012B8540001400000B0500022850
+:100A600084360014000014030001278327001400BB
+:100A7000002C090002258221001400003A0B00021C
+:100A800023060505050505050505050505050505F7
+:100A9000050505050505050505050505050505000B
+:100AA0000000001C001C1C1C1C1C1C1C1C1C1C1CF6
+:100AB0001C1C1C1C1C1C1C1C1C1C1C1C1C1C1C1C76
+:100AC0001C090909000000000000000000000000EF
+:100AD0000000000000000000000000000000000016
+:100AE0000000000000191900000503030203071F9E
+:100AF0000003003C00146401013D3C3C3D01043A0C
+:100B000000010002000009060000000702000000CA
+:100B100000050500000303001B39060000373700FD
+:100B2000050201100C0A0003481E001E00403C8014
+:100B30000314640301FF020500070107100000070A
+:100B4000050007010F190000070101390006000028
+:100B500014140005040023010001033B01102020B0
+:100B60004000000000FF0100000001000002030D32
+:100B700033330009AAAAFF010A191560283C0906A7
+:100B80000000000020F977331010001E1818181804
+:100B900018171717171717171717171717171717E4
+:100BA0001717171717181817180E06171710001E03
+:100BB000191C1F1A181617130D12110E0F10090BFE
+:100BC000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF191B
+:100BD0000E0E0E0E0D0D0D0C0C0C0D0D0D0D0D0D44
+:100BE0000E0C0C0C0D0E0D0E0C0D0D0E0F0000005A
+:100BF00000170B0B0B0B0A0B0B0B0B0B0B0B0C0C43
+:100C00000C080000000000000000000000000000D0
+:100C1000000100060023000C3333000309FF80FFAE
+:100C200080FF80FF8001013A077D10010500070366
+:100C30001F1F000007050007031F1F000007010119
+:100C4000330006010016140005090000AA09FFFF81
+:100C5000FF1F1F1F1F1F1F1F1F1F1F1F1F1F1F1FC4
+:100C60001F1F1F1F1F1F1F1F1F1F1F1F1F1F1F00B3
+:100C70000000001C1C1C1C1C1C1C1C1C1C1C1C1C08
+:100C80001C1C1C1C000000000000000000000000F4
+:100C9000000000FF000403003E003F01FFFFFFFFD4
+:100CA00058585869990D04881010101000212022FE
+:100CB0002505032B2C2423263902062A2932342722
+:100CC000282F38353631302E2D33370001FFFF0005
+:100CD0000102030405060708090A0B0C0D0E0F108C
+:100CE0003E3FFFFFFFFFFFFFFFFFFFFFFFFFFF0094
+:100CF000100010CD14CD1480808080808080808092
+:100D000080808080808080808080808080808080E3
+:100D100080808080808080808080808080808080D3
+:100D200080808080808080808080808080808080C3
+:100D3000808080808080808080660E660E660E6671
+:100D40000E0E0E01000000820000010205050101E7
+:100D50000C0C0103000A1010030702020703010133
+:100D600000333300000002000037041910B264237E
+:100D7000000037040014B2642300007F071E10B285
+:100D8000642300007F071E10B264230608000F0AC8
+:100D90001E4B0000000000000000000000000000EA
+:100DA0000000000000000000000000000000000043
+:100DB0000000000000000000000000000000000033
+:100DC0000000000000000000000000000000000023
+:100DD0000000000000000000000000000000000013
+:100DE0000000000000000000000000000000000003
+:100DF00000000000000000000000000000000000F3
+:100E000000000000000000000000000000000000E2
+:100E100000000000000000000000000000000000D2
+:100E200000000000000000000000000000000000C2
+:100E300000000000000000000000000000000000B2
+:100E400000000000000000000000000000000000A2
+:100E50000000000000000000000000000000000092
+:100E60000000000000000000000000000000000082
+:100E70000000000000000000000000000000000072
+:100E80000000000000000000000000000000000062
+:100E90000000000000000000000000000000000052
+:100EA0000000000000000000000000000000000042
+:100EB0000000000000000000000000000000000032
+:100EC0000000000000000000000000000000000022
+:100ED0000000000000000000000000000000000012
+:100EE0000000000000000000000000000000000002
+:100EF00000000000000000000000000000000000F2
+:100F000000000000000000000000000000000000E1
+:100F100000000000000000000000000000000000D1
+:100F200000000000000000000000000000000000C1
+:100F300000000000000000000000000000000000B1
+:100F400000000000000000000000000000000000A1
+:100F50000000000000000000000000000000000091
+:100F60000000000000000000000000000000000081
+:100F70000000000000000000000000000000000071
+:100F80000000000000000000000000000000000061
+:100F90000000000000000000000000000000000051
+:100FA0000000000000000000000000000000000041
+:100FB0000000000000000000000000000000000031
+:100FC0000000000000000000000000000000000021
+:100FD0000000000000000000000000000000000011
+:100FE0000000000000000000000000000000000001
+:100FF00000000000000000000000000000000000F1
+:1010000000000000000000000000000000000000E0
+:1010100000000000000000000000000000000000D0
+:1010200000000000000000000000000000000000C0
+:1010300000000000000000000000000000000000B0
+:1010400000000000000000000000000000000000A0
+:101050000000000000000000000000000000000090
+:101060000000000000000000000000000000000080
+:101070000000000000000000000000000000000070
+:101080000000000000000000000000000000000060
+:101090000000000000000000000000000000000050
+:1010A0000000000000000000000000000000000040
+:1010B0000000000000000000000000000000000030
+:1010C0000000000000000000000000000000000020
+:1010D0000000000000000000000000000000000010
+:1010E000000000000000000000000000B48B3893F6
+:1010F0005A1F4CFB1200000000000000000000001E
+:10110000000000000000000000C8010010110000F5
+:101110008AED6A0672E110F3E6D13C02BA951EBA76
+:10112000503B411698EBB3B2C588E5F1EA6BAE1FB0
+:101130002251EB3918C16A5DF4F460516E14D698EF
+:101140009A194705ADD5E20B4ED607C44A480AE7BF
+:10115000F8D6B429DA2D173AF330CA74DAA1A71EEB
+:101160002B82C897A47C66B666CCF18C759214CBA2
+:101170009AF2A222540818CCBE34A379E2891169EC
+:10118000B086ECB60071A350DDB57D25859DC41AEF
+:1011900008642D1915ECD0DB2C7CE99948BCFB7454
+:1011A000F59BFA83CB1FC15FC84235627ECF4C48A6
+:1011B00099ECC4C1E24A7305B1B7F91CA46ABE74C4
+:1011C00097C55F163CAE7CB30DF158A349748D11E1
+:1011D000178E98EC4482BAE407AF593E1152F5F4E9
+:1011E000C397E5F4A0A7C37A036CCAE08BA3562982
+:1011F0008ACEE5ED6283A60E3CBDDE377BEAF6299A
+:10120000E1C5E1B4025553DEEE1801FA8463DD64F2
+:101210004F53A36AC61BFEFE024392B304463C280A
+:101220009E3C6375095F2C4F392E3A550D69BB3BC7
+:101230003DD5CC32A10729E695D235BAA047A444C2
+:10124000AC7DDF700CFC0D55FB60AD96B37F8CA0C0
+:101250004016AE3B0C372049243CB2844DB0BBCF86
+:10126000075B26F9365966E1991F9EEC8B6636308E
+:1012700006F755274768C1F0958DF7943DB8974F0D
+:101280006BAFE7DE7F28FDA76C5BB1613E062E4B9E
+:10129000F6B87DD97616707E85B618A9D4F2C1BC91
+:1012A00067C0D535763DD5DB6875C4D661E8E7D231
+:1012B000DCA35E492B49F1080FC9C5E5ECD5EE4327
+:1012C000236D5363ED8856852825B3E7ADC93B09E7
+:1012D000948C597C1A8D112CEB054F1550C1D111EE
+:1012E0003E7931F7117E2024C0FEC5FEFFAA41D011
+:1012F0009C5931C2324331B7C09D82C9A44B2C40A6
+:101300003A90A635184FB74E08B3970D495574F665
+:101310001DC1872494A816BE594C5923F6457584DF
+:101320004650FFA97CA21A23677C187BF3FDED08C9
+:1013300008B52791B166E5C88A78CFA4AE31D867E1
+:101340002FEE1A1A7B29E542F3BF92810EA0757920
+:10135000E79E9E514A26251B575A956ECDF0D0EA3E
+:10136000939A7856DF1001A645A646DE36FE2292F5
+:1013700026F04B3A3E863B223C6C9CBCE607B51FF0
+:10138000EFC5D9B234F2309C857B587C2971E5E8F1
+:1013900082D9987F71D0CA295D25BE7B775B2D7F6E
+:1013A0006EED4ADA57ACF3128A8B9DF78E20C69EFB
+:1013B0004A56CB7214D933B9EEA398532E237AAE82
+:1013C000EA1642E05CAFD91FF9816F31A775CA8573
+:1013D000EED589C28D2A736096E0588F573203F19B
+:1013E0008F8F58590A492E3C78A5A9E9138D7DCCD9
+:1013F0005EA3C536D22C141F98FDECA369DF0BFD4C
+:10140000CEBAC087DCDC158DF2C47F263D19E3DA45
+:10141000C2A928A3C60A3CC19B4E15B281BAF6F8F0
+:10142000AAA7CDC21FA59EC7760BA96053A45BBD1A
+:10143000C5F49D2FD1456476D2C9D99D95C206E3E6
+:101440008048BDD25EF8CD45C4D3B98352299838BF
+:101450007E2EE94CABF9CC91863105413E6FD459D3
+:101460000239544C7D3774965A3D531CA77055175A
+:101470001F32F02D185834F72C996179058DF8DF5B
+:10148000890402E12F828C2B91E16CD1C6E8E745FB
+:10149000F8B21BFA49A994AFAB8BF0381CA4C01565
+:1014A0002B5563A5E0DF62EE6AE7BC48A12E9CA144
+:1014B00029809599D7584598F22F6F215E17F862C9
+:1014C0003F978939613072F4E83C2A67AA94E9822F
+:1014D0000EF7165815FBB16DA95615B4262312B692
+:1014E0003784AD08641635CE40450007D14EBA6644
+:1014F00028CE99699F701F22F9EA61EB46DE1560DC
+:10150000870A0C01AC3FBB8D0E9277ACF32F2D08F0
+:101510000072B0DDA8FA6BB0F0635B5BEAD5C6FF82
+:1015200088E3D2CB212451CCB577EF3BA5B26F4CE9
+:10153000F002B810318B425E10C0BDA7C63E51F616
+:10154000777C50BAC910D0B59EBA1051671AC0AF97
+:10155000745B187687138AFC6AAB89642BB1DEEE64
+:101560006E1ED8FE7B44D97A203AEBABAD4CAEDF91
+:101570001DBADAE9BC57449B61455D5405D92EABD1
+:10158000D247B81809E52E9E3BCFB2E2B24220E026
+:101590004D43C17FF413F186992BB3D3CDD50A7E89
+:1015A000F0323D6D3FA43E604F4646F7F297307EE5
+:1015B00017715ED71D3FFABB983DF75293A9E3F22E
+:1015C000A3FC7F632BE1DA0B270893544DFE46B151
+:1015D000D83A9D8F224448DFF8614F959C87A3A598
+:1015E00064992DC71138AF2EBD597481FCFCA281BE
+:1015F000E22F11F526E3C0B9DEDA7D5979B5D73A85
+:10160000B3F12035A3D8DB267E6F1D154112CA67C2
+:10161000A5AE28D2C7D8DA21DA2537860405090C09
+:101620008E20E15EA5B139BC6F230D3CDEBFBD91BC
+:101630004E81485E1CE13D7282C70D2BE88E55C37A
+:10164000B1643CB864CBF4CDF50F9D60A412B23EFA
+:101650000D1085E7CDCC66AF7E9928A2B66B597781
+:10166000896EBD07D7659C698CEE03F6640F628FA7
+:101670009ED425918169B9F9FAD01AC1D905D5C28C
+:101680009CAFEECF65CC0306E3C875EFC57B6B0559
+:101690005950D4B379FA4F8040A8FF00CDFBA6196A
+:1016A0007B0C00697B274428E60616D15AA219BE96
+:1016B00028CAC77B192CBD4F13C81CC3D342D944B9
+:1016C000CD219A773A70D6E18503919BE69C609C88
+:1016D0006D6A55782B117853942A90C59C59738E56
+:1016E000DFBAEEC0237247C85A8E95FE1AC829B2D7
+:1016F0001B4DBD12A3237EC7C701F9F94231B92F93
+:1017000095FFA5886F126C901C9DC67E43791B4483
+:10171000ABD6226F206C36066C8C5B98EADD6C15BC
+:10172000C50AB6AF81ACE86E02D3C90636CF7CBC21
+:10173000CD31BAE26A181C5721AFCDA333CCC3ED2B
+:10174000ACF2FEAC97A2931316872928F4949A8FD3
+:101750006635BB061A2EDB7185CA256FE66293706B
+:1017600049038B8A0B041F13B8A63232A2A519B203
+:10177000A9310D8470CD546B70157D9958799948B5
+:101780009A4BD2D4532994333F6268D1AFDAAD4D2E
+:10179000101B18BCF9B05B44ED8C967DB15C2B310D
+:1017A000F1D7D0898CA4DF9ED1BB5A78E3624AF886
+:1017B000EAB8E565D606255B37C38F08F1EAD2653E
+:1017C000914D00D5FD6E52AA9595B73C749DF4D607
+:1017D000AEDF1FE826E847CECEF743034CE819F208
+:1017E000B17D4BF9B38E039ADC7E7DCB8E40A2F6A1
+:1017F000B2719D727B6B882C0A58BAA43D4DE77379
+:10180000FD3337F56534FF38209533E2D8B2095BF4
+:101810001C8FF075D025F7BDE0B1BB914FAA6826AB
+:1018200007FC9CF029C10675B5B7B72AF6F950B583
+:10183000DD09E426D7820740DFB19EB9668E8D7E32
+:10184000E2B2145B81A59A0DED65DAF16D5198064F
+:10185000484805BA6E0C77B514A07AC16D073BBF36
+:101860007930459759058DC17371413820D8B851E9
+:1018700048A86ABA90F8B04FF40C76E5739796745E
+:10188000E889B71CBE8F937C842AFC1F8D570A679A
+:10189000964E1ABDC943289B7F4CBDC4A14FFE4D37
+:1018A0003EFD07CBAB9FE2A78D7B4C7B95F2462C90
+:1018B000F711CA726FE8C905885E34DB13872CA85C
+:1018C000F19FA332FE2E8622242807515CA8CC0269
+:1018D00077E6674DC59BEB22B26CE0918BF3A7D105
+:1018E0005CC934969EDEE0D8C3EF16ED569E5B11C0
+:1018F000A38C129E9C6CFB6188C469A94F0C831059
+:10190000519D9E469FA524C3B04547A90F855E20E3
+:10191000348CBDEB96867E922892F09FCFBD2CB082
+:101920002C29BF4FC228E46C39E6373EE92A49A783
+:10193000512B1C09C0B857AF8C0E7FA86AB4371D55
+:10194000C18932ECEB8C84A1071DA78CCB850815CF
+:10195000B5A2E55F0E3D2BD7A53F65DDF797B11921
+:1019600077C52FA9AABA3714F9565EF0F7C94B5DAF
+:10197000819A6F24014990991F609CC59EC68D0075
+:101980006CD4CD29EA95AAB3346B807E5B91453047
+:10199000F4A4E00D2F2934C70467DCFB88C191C192
+:1019A000EF20D1D3A4CACCF3876C066F8042D2CB90
+:1019B000476DDCFEA0F7B311871F4634EC8AAB5DA0
+:1019C00031A5E48D7D9F2B23BDDA977C0DB4754541
+:1019D000F47B19E67C9D530427EA028894B9E85504
+:1019E00075AA42B14936E5E622125BE7619346D813
+:1019F00053183B00161BACDD266303167B54812471
+:101A0000A8A3F9339B116FC0CF6204AE398E755114
+:101A1000B3C827B4A20604C4F43251A000A24AC637
+:101A20006EE6E5700BE12131845242061A7DBCABB3
+:101A30003DCD3E0657A636F554DD8DD863FC36B74E
+:101A4000CC98DAD7F3BED53325F038867D1AAD1998
+:101A50009387E68129F9BD2439A04FF11ABFB7A8B1
+:101A6000874C94AA9F631C9F394229490348334AF3
+:101A7000B903AA9C1216DB0EC8E589FAD9C18B9569
+:101A8000B449C43CFD1C8D89992D7E4AC8E16D96F0
+:101A90005AA91E9501B9D638E7A52BBDE3EA7DE426
+:101AA0002070E46C8F41CC6A07645A332C4B0C24B1
+:101AB0009C90E70EB748978C7BE1EFCCC6E4BD273E
+:101AC000ABDD03C5B9876AD1576C45E9AD293964E7
+:101AD000071D8F3381214920C1295322CBCE25599F
+:101AE0007DEA98EF2C0B35AC4A9D709C8074CCA19C
+:101AF0005A91A2B18774B01963F8C1183DD91CDEA0
+:101B00005630CBE07D4CF285AA32B33D8230E504FD
+:101B1000666069DB5084F83ECAF953FBBEC8BF4A11
+:101B200052EBD2284DD2BE209972D8AB1A1EAA9180
+:101B30003BEBD1E326C368CE66E3A54246548D0154
+:101B4000BA1F5BE51E2B473A6632206F3D1955B030
+:101B5000F2EF6C25C32A8D92C61F434356F61E8CA6
+:101B60002CB42280287CE2D2A8513B979DBBCAD9D5
+:101B7000776991F83DDA5006F04BCC741C7D811AE0
+:101B8000CB4053A22B3505AB0843833A5235777EC1
+:101B9000DDFBF6666D79EE661EF62EBE48D38E1E10
+:101BA0007A50FF0115C1AFD6175079A665C641D846
+:101BB0001B25C931B35A6E08CAC636D22DD67293C8
+:101BC000E4DCABAEE9CF7E4E5C789C66BB90C9206E
+:101BD000FE0D449BD0ADDAB316216B6A5D48F890D8
+:101BE000D84C5D37D6392E8BB62E64827D5D83C589
+:101BF0000CAADECB2040FEBA745F9684D11C83D839
+:101C0000952E8BC4015F5B82C8D3995820EA53A3F9
+:101C1000318B41712676D1714FE0EE81F6764473B7
+:101C2000223CA90F555AB43B41EF77BBA69E30D258
+:101C30001B22DBDB847FBFB6D71FFA63E62F09CFF9
+:101C40006829D7961E64387785A923D6C7C8D724B4
+:101C5000773A2AE51B6AFD22CDE435A0E65E206CCA
+:101C6000641B6B147FAFACABA7DCE6A0B69CB46181
+:101C700066309CF4A861253102B02FE055FBA533F6
+:101C80000F2E6960275C3A2AA3099A325B214978B2
+:101C90000DFEA5A9F0C3294B582B47461AAD04C623
+:101CA000EB83720E6440AF0D09805672EDA5EEF025
+:101CB0000B41E9DAFDFD21F36C2693EC33F7E636B0
+:101CC0000CB4E5CDC11674BB667C0773912B557BB4
+:101CD0000879868422CA0E6BDEE0039B5A84A5A68F
+:101CE0001BF3C365D851DED5748B6BC4EBB7E7F932
+:101CF000E30345993B84328DA11426DF7F29993275
+:101D0000DFE9A03AF669B24A64629FC1293C7907CB
+:101D1000679C81C057FAC65A0F6E590599283A0A2E
+:101D2000D9A532E1E241E28957D93A0D2BB2B8E1A7
+:101D3000230FA01475A35B248133DCEC81601E7932
+:101D4000E298F983AB09F55658C59AF278FEBE5E63
+:101D500080602C789CCD65E1832D3F29CAA28C61DF
+:101D6000962564AFB501C1EB5B71E2B67124093E03
+:101D700054F922364DCCE8FD7F33BF7E5DD6D6BC0C
+:101D800012F1A93269799A94FB7CEA09F5197A5B18
+:101D9000F574654E58AE7AF7B9D458423AFE95DEDE
+:101DA000B8889FC7B3E4CC020749BB7579A18A24E0
+:101DB0003BA70AB20875DCFB4ABA5ACB6FE59572AD
+:101DC000BFE3DE69F1B5AA421D648FA2F0BEFC53E9
+:101DD0006018DB63A23DF1576355281CC0CBD01BB4
+:101DE000140DC0989144C8D8CDE78549887C7954B2
+:101DF00099F853618B889C034384476830052A0710
+:101E0000536AFA4DFE6A9E619639435403B8886955
+:101E100064565F488F3A5595653121DA745B3FDE31
+:101E20002A6ECCD48F787AF3A64D1D2C3617F20B80
+:101E300051D9F3E74F65AAC39E0813AB671252DA74
+:101E400078FC51EB10E675B851A6F66C8379A023A7
+:101E500019A440E5BB38626BE5C899A30EA6F0450E
+:101E6000BB6121E62621F75586571ACEE947F75F71
+:101E7000F1D86E79044F10A8B040417D24711DE166
+:101E80000AEC59D80B8E052C6C8EFDFB0C53B94413
+:101E90004533B68E4619E0A232C5F88B4E5CFAE99E
+:101EA0008C44F2512DEC164723C5BF871490C9010D
+:101EB0003B98B8CE9AFDD0DF9AC8A8E114DC21F592
+:101EC000B4BBC8E317C21A7CB95BD5548EBF651E7C
+:101ED0007DFD7B54DAD1B15FA99952484DB85FCCF2
+:101EE000BBF582221B1753C30EB1E2CD6850AF2F52
+:101EF0005F19A0545149F0AEA48D487C2CD51E2A00
+:101F000038A1E47503E3BD948C077421ABBE23A70D
+:101F100020D87ACBED08599BB6326268B6C637A98D
+:101F2000DF9A4AE4F28AACA288D91C615D54FA6D4A
+:101F30006CA9622F4518C9E50B8C78E12FBD2103F0
+:101F4000D2354391E535FCFB5967776274AC315962
+:101F50005AA6CE727A8E0725CD29DC163B526F0128
+:101F600031B13CF7E6F5E4BAFA285941465C0B1367
+:101F7000AB72741535138EB643F8DDAEBAB8BA68D5
+:101F80001A1040782CAC8972975AC03187AE390646
+:101F9000D87F50D5A96286CEED8F119EA0186CAE69
+:101FA0009501BA0A6B917019BF037BDB8FF25C9EBF
+:101FB000965F7BF20C2E55C8D6DA2FF8485BBC52E0
+:101FC000170968A3634CBBA70EC4CC5FF63EF6FAB4
+:101FD00067BF4042EBE9C7C04A1E16AED0F02B5196
+:101FE000CFBA31EF91F98093C42742A42C0AE3477A
+:101FF00084D5424DE347868BA29DC858046361B5E2
+:10200000CF64A83E33AD91119A355CB50B646BB5C6
+:10201000BFA51A60754741245A882BD53B52F6302C
+:10202000F4EBBC4BDDEC6C8EC2068DFB708F7075D3
+:10203000A9F0D9684711C9BB5635B6B15AA6FF48B1
+:102040000A750B15CC0D62A79C6DEE9F8079F3A0ED
+:102050004CF783842DCCC6AFFF6EE00BC476720DB7
+:10206000B581532A82DF6DC779C4E76BEB97BD9EBC
+:102070006F7CDE41BC336C4E9DECA477D33F9B9FBD
+:10208000AE4EFF7A630AA9308AC1666C649326C09B
+:102090004FAD2F2AF3F14589EDA9FB94888EFC0BF7
+:1020A0002520CE8C77EE436439C6921C78715D7A18
+:1020B000219FA6F138EB19DA0E2DBCE867E8E5A2FE
+:1020C0005A2B9F9FC40A0121303AB1178CDDECD006
+:1020D000736E48B3CB69A2ADA9CC21AEAD3033F954
+:1020E00078CDC69D54EB52BBB4E8A664438ACADFE0
+:1020F0008BB76AFD9ED1E74429EC487703B2DADB5F
+:10210000A7568A9CAEC94A58B2CABA9763F03757E5
+:10211000096AA2C8E4FE135606592E6C7AF1DBC197
+:10212000DEC99B470FBDBF26D7A9CDF61807C94109
+:102130006629CE60CB02AC8A797D4ACC9F7EDC9446
+:1021400019B82A67E90C25D51387D0A3071399631B
+:102150004B090873F8066375AA786C9F5F52852552
+:10216000D2C8CEB79F16B9C34A7AC14136632B4B4A
+:102170008B008B7FDE9D60B1DA4C6D7341CF7DDECD
+:102180005F71A13EDBF9CBAE8812FF0A15E68C9099
+:10219000E3C8FD31F84951D3BFDF65AAF1673BE5DC
+:1021A000D9ED7DA5058C8EB9275E23758F0D53EA79
+:1021B000259205F28EC503280F368DA1789E002545
+:1021C000EFD2C920F4EFEAD732E643234CDD8A236D
+:1021D000B625E177AAEFEF0D4A7DCC144FC998FCE4
+:1021E0004C5795D5D9D6C6FD41774060691207CCCA
+:1021F000779FCB4996ED2EA697CE7CF89F3FAE21D8
+:10220000EADFA51B192CA354B17B9248E2542DC2DE
+:1022100015DDF63B9A5CF817BEBF8C137DAA82DAF7
+:10222000A2E90C7776BF833AE716BF8566EDCC66E8
+:10223000D94E798E6E67C193403D5F98ED515C0732
+:10224000B17B4B0CAC04237DD940A751FADF51EA96
+:10225000157E36FAAA518BAAAA52C61D4778616B21
+:102260007259D777780496B24F48E787ADB7E367DE
+:1022700094F427FC74DD08A36E4A0835B6A96E8D68
+:102280007C0A2BF380F7E20115D21E8C1B2E847280
+:10229000B81AEF4D5AC090F2162341C5E4AE2D8E08
+:1022A00082A63DEE7C2014748ED84AA2F692B536F2
+:1022B00029A9D756D07AF1D7D4F08FC9102DB137CC
+:1022C00075D73D72D0A24082068164829DCE40B80F
+:1022D000C8ECA82C68F80E313383861E61F00AE83A
+:1022E000F48F3AAD87AAA661B80F52387A362BDD43
+:1022F000C78D7469842BF00E086696CE1ED1ED2D25
+:10230000489176025B30F606FEC6171AE487E3DED4
+:102310006B2CAA67A63AC25AA4563CD39FEE46310C
+:10232000B9DE775F7E222E091AB94406A8CC3C6E2E
+:102330006FE6C6F6C13FBB2F74BAB73870F7643A80
+:10234000A1C651504944215FC1D91462F207120D50
+:1023500061CEBB8CD140095512EF57D7CF016FE04A
+:10236000F539CFD8B1F7F7BE6806B2539D443A901D
+:10237000377DD4C1832E9C7440A350AE15DD0EBFB3
+:10238000C3CD3A4397EB22CCE072333DACDE575CD1
+:102390008E22E73A0390C2DCAADFC7174A483FE91A
+:1023A000675E65C2E895E974B7EA18886CC206F200
+:1023B0009CD27CF186B433DAB81270019940211FA7
+:1023C00035D1782049036AD62DBB824223C2640FDF
+:1023D0003C502D5FB845BF8534A15A83699DC346E3
+:1023E0009F34BBE556CF545C6019F5220E7CEE425B
+:1023F00052FBF88CC145A26CDAE03A78B30E015A70
+:10240000F55F88DEF2D1D1BBBBB9038D3896B60E2D
+:102410002946E7E049ADB88BA32E2E075DC9C37DE1
+:10242000D8718A2FC1AAB647A4939203124A70DFCB
+:102430001AABA148F83CEE1A475D285D9FBB7AAA0B
+:10244000C83C805A034AA54EA7481E95E82C111394
+:102450007ABDE05F443852217217C49EA74504AA92
+:10246000AAEC0214A8A04D9B65B82CE56CA4FF143F
+:102470004B3FFF3C5F4124098B2D965141C0DEA4A8
+:1024800049EFB53732DC06D443DA6FB17A1E6E05F8
+:10249000B976539E4E89A8EBE9EC8798AA3C8C1B31
+:1024A000AC0AE8B921E759F2BF1C2D422D567B70CA
+:1024B0007BD989B86E377D29A7FB89250CE5417149
+:1024C0002B795F4C867A397796C2440DBAE74783F9
+:1024D00066F15A6803B27A092F6AAD5B57E58F0738
+:1024E000D0F055076FE40A7853C2DC4F09E8221F89
+:1024F000EB29FF4C26F1B801F227CF5F820B521374
+:102500008710C95A54AA284A8EC32CE8E6CE6DE932
+:10251000D77A19D4498C849FE31725A2E1924848C1
+:1025200085AB62CD839AF66511AE67683B29FEA73D
+:10253000DD984DB67AAB40ACBBDA3748A35B400FB1
+:1025400099574B5618A8C533F81DC0830DBC6AD8DF
+:10255000C67943A9B1D2EE624CC1EAA92E742FDC30
+:10256000A38ADF9C578E4319D1D3A27E2FDA7EB97E
+:102570008A63E8E2477D79BFEBE8B75DA694BBA329
+:1025800042101A74B7954A503910F6DED49835D9EE
+:10259000E22BB8C7A481DB6EFD36E47E43CD53E366
+:1025A000137BFDD0B1157017F53CDD55A6EDD62691
+:1025B000B23B798FC3FE33ECD54124CB58D68A97F2
+:1025C000C728FD863B6037404D4365B998A46CC76A
+:1025D000AAF2B34A0EAC7B6502BC8562E9594CBBDA
+:1025E000EA6779938ECD040350D986BB89023EB148
+:1025F000E423914EB3EAF4CCCD81287BD7AC9AC0CA
+:1026000073B161F77F9C143B81598A8EE97FDED2DA
+:102610007378AF4D7E4EB087FABC24486EC0FFC9B8
+:102620001F6EE3E984F3E7BFFB54A2283BF50F5A82
+:10263000C51BE9576F32D73527A5D877B76D46E167
+:1026400018DEFDD3E02735820DED02E78A14274C12
+:10265000C1ED7D63E626EFFC3463634AE739BB25B1
+:10266000E4C82422058DD2407AC8E8B124DAB84EF5
+:10267000F0342C60F1DB3D9A0BC188E712CF205873
+:102680004690D462D688B1F5E8048820CA2E528DCF
+:102690008838641F2586C1C3BFC506BA584DE47685
+:1026A00015621CB78ECC5565CE951D945EAC172E69
+:1026B0004B9A2F52EDBB827D33F2D6C21536E749D5
+:1026C000B945158AD8DC860A1A82164E7B33FBC3BD
+:1026D0004EE93A04717B922C656E33B0B49DFA6E6C
+:1026E0009BB37B534B1C017FFFDBCD191037C377A6
+:1026F0003787A1A1B8F967E5383DF99A5E3DBBA1DE
+:1027000054CD6A4A25B99FF9A56B41E1B8AF7573FD
+:10271000AD67CEC6D9E1C772850D77F03142FE9B19
+:102720008B1C3C565F9F5142BC57CB4C624346804A
+:10273000C6631CA843C8984E8145490FBAF4673751
+:10274000595E8C90F53B571AEDE4B6A7B31EFD7C9D
+:1027500020FBD4D0D51FEFD98816BB38420B1350BD
+:102760004237B737BD89250A6E7E0652DDA681E75E
+:102770006D325143EB8D65114C6F8EFE67A844C9D5
+:10278000B061D8141EF92DEAEDB4C2AC3C481D93DB
+:10279000307056C07D926090162FA8BBF1AEAF92FC
+:1027A00086E7E94B2CD8D24DD0827A62C1421C76A2
+:1027B0009CBBE2A0A7303C83BA7D659FBF9F366279
+:1027C000787DA3926E5EF76CF91C96A422D59520B5
+:1027D000DF6D8F391E44EADD94BBF59519D5EA3DCE
+:1027E00081A97D4DD074555AA52E46B133970CF171
+:1027F000A167B7A8DB53EE57B55E89357C6EB72964
+:1028000090AE6F51E9F8616062E98642DC1B0940D5
+:1028100028A600969791B38643B696157FB8D193B4
+:10282000DAEFF16EDDA3067B19D354019B7D4CEAF0
+:102830001E0872304906C7488B606455F1A0423DBE
+:1028400063E3DA8375B3386BEC42567B4846827D8E
+:1028500057F1BC4CB7BE497F89E53BC9F84AAC98F3
+:10286000A0415120A64165FEC1A237999E24692648
+:1028700035B22E69CAE5AD530081E5EEFA77060B55
+:1028800091F93CC0202812012E59E62F4398AE4EF4
+:10289000F82672BE1530D2B41E1F6AEDCE9A1CFB0C
+:1028A000038D9CFCFFEE656ABD08C3AA0B7207B9D5
+:1028B000CA770641AD6D281668925E4FF4D40CD7E6
+:1028C0008220194442F6BE113A2BD0F3581531CD6F
+:1028D00006C00D28E8AD33EEDF8977B8522DE8CE7B
+:1028E00082182305C1EF97E66327671E3422824FC3
+:1028F000F41732E7E98ACEA7F5ABF4A59783231F37
+:10290000F2504CA1260FDCA3F6017D7D96170E9B9D
+:102910006DADB6EFF08B26AA34AD28996D0A0F6A1B
+:1029200018B3E7F26B5641E013D9485D53A6B47A69
+:102930003B4EBDBDEA79C86D8561CF030E110A8893
+:10294000D2A0A13ADF37602EEFBB4DE054DF3462F6
+:10295000BB3E5157CF91CF832FDBF8C9BCD3455A2B
+:10296000219FF8E1715DB350975FF3F5F117556062
+:10297000EEC86504CFBCD49F9E4070ECEDDD0DAE7B
+:102980007D5CF255DDDCD3BDCBD961873317957003
+:1029900044EDE792FDC8039218D9C28D201F899299
+:1029A00078E55F872B55F9654E665843590F69B82E
+:1029B000B85C2A1F27BEF8D869D01DBA02719D40A5
+:1029C000BE06942FD810831614F66596029E6F31BA
+:1029D000E4A4AB9D9721CBDF1F555687C9060B801A
+:1029E00055E0DD1DC6C665AB262546FC44E0677C88
+:1029F0005B443605072F191DB5100AA9F013F14ED7
+:102A0000CBF4D2C58E702682E7D421647A11FDAE54
+:102A1000DA624946FAFEF0F6EA611AB24B33250C47
+:102A2000DCC34879F156D5B8E70EBDE3475D1B0618
+:102A30002C4C005A9C5EB13296BB5FEA7869DF8607
+:102A400080E9C048A70A88802C31621BBAE3D89A73
+:102A5000E2A59AABCDD5B7F0CDBA9C549D4E41E0DE
+:102A6000FF7F23D890E02EDDA947ECD30A2C474BFB
+:102A70004F3A630BA9358C352C090B2BD00E2CC487
+:102A8000EF2DA2076D93C560A50FF79259461FCF92
+:102A9000970BD35811D560E5350CC79199C383982E
+:102AA0002F04DD305D491C5DC6ED7F1006AA72ACB7
+:102AB00017877C65129204BC00A0C9E5063DDCEDD9
+:102AC000D7AAA87E85F8EBD1E649C2DD3C5C1E564C
+:102AD0006ECFD2B8D5A576D5B047D011BA7C1794B1
+:102AE00068856D46CC6DFDAABC88072932EC658EE1
+:102AF0002551E0E17BED61A8C3E7AFF8A1A6B2C51F
+:102B0000D939D3A5DF92BE1EDA80D739DFFBEB6E51
+:102B100095E9EB6CE5CF8FA56CCB226F7E8EA42E52
+:102B2000923792AFD6B2F2BB3BE55FEDFC95CBFDA1
+:102B3000DF4F0EA3FF061BD8068DD4A96E1FCE242F
+:102B4000CA85D46A5D121E4CC13C13B153B0D0EE9D
+:102B5000C2A5C757F08A03456612B53C0C52F587EB
+:102B600069DBA2451421C77E9B7CE8306A329D4D0B
+:102B700077F9BB4F612643157D9E7C8314AFD5DC6E
+:102B800029255FEE82310CE62D090A7CE6BAF20BAC
+:102B9000A73CAE9261B3FFAE2A7607CD1000F7DCFA
+:102BA000F8C1833852A360C643EAEC2165A6D8B9C0
+:102BB0002087A7422C7D8AA5FF504D631D8DE07CA8
+:102BC000B5425EC3F4392B43F2C4ED349B9B5914D8
+:102BD000A33B0F42FC6B8E7AA35915C2004B7C4C71
+:102BE000EECDA181E8E3ACF47A81AC4134833509C0
+:102BF000A12E9AE06A476C047D823EAB35001653E5
+:102C0000656F25B37DD348066E19F0986D574ED485
+:102C10006D1E84C4B7FEAD4ECEEBBFA360D2E2ED15
+:102C2000AC868563AF4540784CC02494BB2E1A0E09
+:102C3000D0CE1C21736A8F858EEB1D0D6D56BEA8FC
+:102C4000B22D89F6E17377F45C6E77371743D9A319
+:102C50009C2A3EB5947EF952B43C09F6531E02CA32
+:102C6000B834BB30F868B20A1486508192FBA6894A
+:102C7000653B91D85AD815DE05A8C0C6B5059EA5F6
+:102C8000C2D2555829D3ADD6293C2192D4206118FF
+:102C9000748391DDC5C755441A7919E3FFEE67B116
+:102CA00069D1860E94DB54EDB8A652F7A212D2F485
+:102CB000C41A64766983B7AE387640420FAEF8A185
+:102CC00027D6548EA184BD66772D20D51F541318A6
+:102CD00072CE77FB60EE0E19B166BD8D07BF1F5F28
+:102CE00066EE919FC9143B5FB01A14906EAC579278
+:102CF000278626368DD74A4415B17AB7705B81692D
+:102D000052558E60496D87279899DC823DF0C3C883
+:102D1000041B38AD57447AB79C7E0BCA0B0EA00A31
+:102D2000DF6D7012F26D37F103FE448883DBF76FBD
+:102D3000FA2205CD64EF8482F059201D39E46C0439
+:102D40000A87CD8CFE44B1C05BA50470707F1D085E
+:102D50003F59B18ECFDFBCE1CC981EA0F66B2C1E84
+:102D6000B30C113EEA1002FAFBAC075697ED21EFC7
+:102D70008C5AA2FA11D65E59BD998EE8ED8B346C4F
+:102D8000C394B516ADFAE613A853716968F12846E5
+:102D900099D225A657C1012AEDB55C345F0B850495
+:102DA000F9E50D5AB2C76CFF6782737D24D54AEDF1
+:102DB000F987CFEDC137FB2DB497FD68CB9760FB4A
+:102DC0000BD157E22326E3D13A6B0EAB98A820BE75
+:102DD000764DB348232F2AF3E3CC303D1243CE2562
+:102DE0008C42CEB5B23BEC7E575F682B19F8DE39CA
+:102DF000DE2480EF36BA4D26CC3AB2947C767ED56E
+:102E0000CC44CBD0833FACEAAC3FC5C4020796A804
+:102E100015A9E373418002AE31C74880EDACCB48C1
+:102E2000498EF210214D7E7C19DCD8AC027AD8DDB7
+:102E3000C810D2DE21334ADC8CA7C72148483300B2
+:102E40007FA0B96B76EC1D47DA95E5AB630A95D0A8
+:102E50003D0A65C12BFCB4550864A3635E9B694CB5
+:102E6000CFE3E260FBBF769B282346BE1C7C7D023D
+:102E700090C892B3539BB808F56DDE7A9F8908BA63
+:102E8000427D57C30E6D068C5763070265A83EF856
+:102E900043EEB11D857A27387E7C044F90222015A1
+:102EA000487F884C189E3FC80C0A686FAC53ADEA47
+:102EB0001742434A228B934D1DC18B34F7BDE11D50
+:102EC0002706149AA4B48745CC62994AF0537CF142
+:102ED000DE8B98F89143F4C37AF4CA5FFD04C3957E
+:102EE000163FA88C40FB907232542576136A6EF917
+:102EF000A40582C5AF96AB3ADECD23F994A7192F6E
+:102F000074C4F90ED720FAFC1A66B39D476D47DEEC
+:102F1000EE519666BD7A6429609CFA2FD4666810DB
+:102F200014007C5389ED781DEE92322A6E9036EDB6
+:102F3000C3B9AECA681C2CD6440C9722FE3F2FF1B1
+:102F40001E6F8ABEC258C615688630E65EF5992B9C
+:102F5000370965B74AA8CF339730761B10F5BAD03A
+:102F600043157086ED94B22AECE97AD882530DD4D9
+:102F70000CC15CF8AE6C58CBFD935DC1C83BD5E08D
+:102F80006BFD7327ADDC160FAEFBE35A0ABCF001F4
+:102F90004E81F4F73B184BFE1E075B474A9ED45DFB
+:102FA0008AF75A29FE0AD0B6629D5E00FAFD7A457C
+:102FB0001A6FC749742FB7CDCF31C804023A48BF42
+:102FC0008FAC9753433DEFA5D2EDC6962F726B257C
+:102FD000D780DD11EF9163BE6E76C2DDD2B4D7C269
+:102FE0003875CC16D1BB6EB634C5BFBEFFD3111039
+:102FF0001210209CC591EFB112C9C8008BFC50E79C
+:10300000448BCD66342DC69F57087B9678F1209669
+:10301000C520187BD1245D8854AD6A71ABF8FBE6FE
+:103020002085626C1A10F4AF30CBCEE2B1426CB2A4
+:103030005F157B45F76BE0ECA61C552F87E8442D08
+:103040004DDD7C3A78A21D7AB18A8DEC50FFD08F8D
+:10305000534792048B4E99C9AC5A6E2FE8BA9E5BC7
+:103060009BF4AD98E8299F329AF98C0C06ACE37D6D
+:10307000F060F4C10550E3CB6CE660D76DC8E0CEDC
+:10308000A009025D8283B6F309EF8C66D6CAC61B1F
+:10309000FC3F236A9DBD4E495E4B92C6463E673F4C
+:1030A00034BEE0626731F48BF69A1E578B9846FD6A
+:1030B000A97AF1300821996A55155AFBA2279CCDAF
+:1030C0003CF9617CA5AE7DB20CC8A6E3EE673AF68A
+:1030D00034A9ED743ABB2BAA83A94D9B2FEF1D4A4F
+:1030E0004C330D9E970B0D7AB29D3C521520363015
+:1030F000F5702766F0F03F0687377AC34CBCCD9752
+:103100006755CE7C476CE22CAAF7E62964A4AE0191
+:10311000B0009D4184C69B999BB7349B55C45555BF
+:10312000A29FD215F99F134F3F20A002CCB224B723
+:10313000EF923BC5D462FFC91BD5C6AF34F27DC048
+:1031400091A75168BE71209AE17BFCA7F2E555ADCD
+:10315000ADEDEFFB878427CE8DE616FC4CA6DFEBAA
+:10316000844B1C11667FB4259035703FE0BD2FA9BC
+:103170002C224D420DF0B505F6341AD104211879F0
+:1031800047CA9C05FA6EF95445FEDD5231713BC7C2
+:10319000B3ADC7F627FC9C3CA3715C562C1A51AF0B
+:1031A000E927647EB9E1E552537DD76D16C1BE6152
+:1031B00088961BE041C2D4AB4734D1D20FE7AF4869
+:1031C00083314A86625A72D6A6937EE6C1468B82C6
+:1031D000EE38BC6C44FF0145BC30D87A75D00A6526
+:1031E00033B5FF0B9B7815B09C3239E1D582EAB438
+:1031F00007B26A5BC7482178C5B12ACF0E4A1F5A69
+:1032000096589C6A01F6324FFC353182315F6F422D
+:10321000C1C7ACCB725F9BE9F8D1EB3BED08D78C13
+:103220005E88D4D138AC7E0F238C746036FCB7C571
+:1032300025F21E50E83FE3618A4D6BFEA1D056AFE8
+:10324000D15B9D4E097941E0AAF6A4EB86805A092C
+:10325000A6A105E1CAEDE09C0C0D24867870CE3263
+:103260009B3D291912B593ED4E17B848FCBBE37D81
+:1032700040DE2E2925AF22C2F6127FAB20EFBAA97D
+:10328000D8D87A1323940EC475A10D2C00E07D7359
+:103290000DF9939274C0D4BD559B13C6E87A03ED23
+:1032A00077F757C7D9A329151ECBD0EF29E273E3CF
+:1032B00053D9584B32B5A18D636C5BAA3E83EE297E
+:1032C000EDEFDEFC0EA2BF1B92D721D2A0C29F92CF
+:1032D0004D3D4D64331C8225449EF431B477BF9438
+:1032E0002BC9F841F6A8B31C866AAC56E2AC266539
+:1032F0004B56CC3E5231EC6474D641CE05D9DA221D
+:10330000985859BD59D9D69E50702D1862766B2B9E
+:10331000637D67AECC75BB1C15CC1A141CD3B54DA0
+:10332000663713F66D9848CE58005882F1E8265C4F
+:10333000383E212FCC0F7A5192B9648F7396BB6FB0
+:103340004BF4680515F30C727746A5FAA89B845ACE
+:1033500031E99EC5510B048CEBD521294F9DFF62AD
+:103360001EA5A760570E7FD3F34F4E6EBC11B12040
+:10337000551F9AC553ABA384120DF72C41DB99510D
+:103380009D3F03B474D68B2CCD2627AC8CEA4041EC
+:10339000155EEDE0512B94E058EB1EFCFDD4D3B349
+:1033A0001576138E43A62ECEDC129D2E68F3BD0A31
+:1033B000272F5D69ADDD4320E9CF139DBEAA457976
+:1033C00018E75B532D6711D5ECE658DD5520F45B0B
+:1033D00011E329A5A46B39B51743CB2A0C52055F1D
+:1033E000331CC676529B0C7AC9CE16FFF11A5D4388
+:1033F0004480C59544B6AA54E305BDDBB9A7C7719F
+:103400004F6C52696625C5E920F150B3F83D51C6AD
+:10341000F712F1C8AF4C7392653C1D04D5C04DE561
+:10342000B40DDFD629D228491A74B6BF715F9384D0
+:10343000280B7571A0F06C15D0523FE68F63F5A193
+:10344000C16DE6A7206868E3626161C1FC0CBEDD66
+:103450008E524D13BD4D2E95BAB82D69A8CBF6B539
+:10346000FCAC6F55958191D8C03071D77CC9484C60
+:10347000D466173AC11B569E971D0D8B31B60AA311
+:103480004FBBD00AF3E84167D0FE1DCA283A9D9B86
+:103490007CA433FB97DB8C32995C5CBD67D7FE6103
+:1034A000200C8A746FC20A8F2AD94A7D5F6B153A45
+:1034B0000E7719F0329488E488E9CB283E225FF138
+:1034C00039A56DE5303D9D6119BB0B701AF8C2EB53
+:1034D000861494C84C8C0326853101E24F9A7FC62E
+:1034E0009471B7E9FF6D1BBF836820D1D039FD39D6
+:1034F000D7AC01F9A6D9108B25CA1E85401FC597E8
+:1035000048C5CAEA7F3FD5CCEB402597A6E5DA2D22
+:10351000331003616B115518A953D25FB36C064089
+:10352000676B79D80718025263E373A6ECB04A9D23
+:10353000408A279BCCDE4404B632571E879D432326
+:10354000418E806027C6BB1493E63AD1D311E14F78
+:10355000BA7F9FC84B2DB22C33D9D34E53147390DE
+:103560006E0A43A75EBB4907537CEDC22319F200E4
+:10357000D73FED1C2324661FBC4F782D476F98C2A0
+:10358000E2BDA51C5845E0264805A11F1BC409AF94
+:10359000279AD14DF9330E67E426111D9DF7AD4AE8
+:1035A0000C16DA39E0587A96B11A4F5554CE3D3898
+:1035B000F9FC67F5FA57DE8B41C2FB1FA39C4389D8
+:1035C00044D548BFDCE5E630ADFA140466E5C6C470
+:1035D00081DD2FF74B286137538C94AC3151AAE031
+:1035E00067B197666B969C282DDBC53FAEF940BE50
+:1035F0006C47807B19F87ABBB7A4DDE7E366078CDC
+:10360000B7A4A5C87872DF1C380E61C34D911F0E98
+:1036100029A55837D23DD7F7F9CC5334B28C465848
+:1036200026E7AB77C26F649D1434978EC25EBE4F9F
+:1036300033E23FC126B460797C21437CAC4D0E3629
+:10364000AF289435AF04E255B18522EB8DD47A06CC
+:10365000B74594523099778D43447E49BF4EFFF66B
+:10366000306BF95AA6F70C4C866F1928E9D7AF577B
+:10367000ACC501AD395402F602C76906DF43A09319
+:103680002C89E38334A7C523558EF21FD895FD41BD
+:10369000A88FDB8750D1D3EF0DF946D6770DCD81BA
+:1036A00066AC847696B3CA081F250980DB5ADD9282
+:1036B000CFC6A433CA9F539905CFDE621C749D30D8
+:1036C00006D2E0075528D0A7C05C123856E44CA6B5
+:1036D00041070C30B3F3D949C126C4B546B81D3DE6
+:1036E0002584B622AAE0F5E5FE6B56CA90CB2FE4FE
+:1036F00059BBA8D8372191B11C89E0639320583673
+:10370000C59E48B04467F6E68974A4B8553E703249
+:10371000E571C6EF9F253FBEE83F0163ECD1AE598E
+:10372000FB7B8D4713EB81E1289E4ABEB0A7AD819C
+:10373000C3E1A81E212533122224BFF248CFE8F2AC
+:10374000190296C491060D1FB7987D676EDA10C0F6
+:103750003139369394C88D1DE41695D2A50D5C754C
+:1037600084D3CC85D1A58BB8D1A45C97F994C02C17
+:10377000074B1E04438C0A6065822A4E250ACE261A
+:1037800079A8EC0D322A2ECE9FFF80916FDEA01714
+:10379000B47D8E33C8F4C06C71FEC7A132E89FFFC0
+:1037A00078231B413E803027C16749B31795150820
+:1037B000CB22DCB86520A463883DA6433C41083C8D
+:1037C000987049C4B0146B6FD4C1EAFD778D5B70FB
+:1037D0002E1E10431971BF05939DD082A2EFD444D1
+:1037E00032E3A388C2A79A7B3EF641181DDD0D1D6A
+:1037F00070E420453882EFEFAC5422DF047226E7F4
+:103800002808015971F618F56309DF2014CD8DEAF7
+:10381000DB1FCB14C9CF6257DD02C796DDD2FAA3F6
+:1038200096BE6F864E966A4061AD3639851E8D64B0
+:103830002278558A75A75846AAD2E57B25AE7745EA
+:10384000C25E91D589EC27CCD94B0B9513FA1008A1
+:10385000A5D7CB6D851480E79193B75C28E70BE77C
+:10386000D02D7CCDC9E26A36131FEDAABEA2AE06EA
+:103870006FDA8C42F3344489240A933AB181DF062B
+:1038800013DA702A94D19CD0DDC931EDC7BE661021
+:1038900087784DED0C1DBF5E61B84C8EAFD058815E
+:1038A00040BADC30D5B6F5B92EF14FB516B43CBCF4
+:1038B000253D92F52AAAF1345D61BFC9D5EBEDAE85
+:1038C000AF7C28571DC93082629BF4F3AA00BDF873
+:1038D00020139FC53497B05021838139CD246728A8
+:1038E00093CC25FE3A317D1F90CD27C1F39CCA5160
+:1038F000F5C3C0574859EB30B2FC0AEC3B45935432
+:10390000C088E6969C4766DAA921C23228BD912775
+:1039100013E3A87CC0AE933B029D592250459C1EE8
+:10392000B884C3596FF5FF602F13679F334FB2A759
+:10393000167AD1374EAD32A6B8CB044561FC377F3D
+:1039400018EC6738E802998E04A3F33ED88DAFFCDB
+:10395000E9342BEE760DA715006178D7D5AECA0BEA
+:1039600007E8A8EC95CDA54594A3A9DC48195841D2
+:10397000206501B5FF86BBFEA330DEC5E662F643D7
+:103980005EF00E874AD039C7F7784338D51BC64654
+:10399000CD38C2873E273A2A249B604A92C1D72B52
+:1039A0003333AB2C0F055114F156C7F58A47508FAE
+:1039B000BF9A0D7447E918F668BE6A9DD80F29971B
+:1039C000B50E6183E4797F879B8E40D35FD4752CDD
+:1039D00004D868CBA5484EE35914ADBD6676BE2F1A
+:1039E00089A23317BF5665A9276ACF3328C2327E12
+:1039F000D9830FD517B4711E5E2098B3364FFEC31E
+:103A000021B660E8ECE45189C3ABC1111CECFE5C4B
+:103A1000D1AA97EABEC13607B75A96FFBF02CEAC0D
+:103A20006EB727717EFF5284C483F5B3A504F348B3
+:103A30006EF08402DE5715BE125480900020F10F04
+:103A4000EC30FF41DC00E25F36277E634AC49E65AE
+:103A50008A621C16D156C5B953634DB0AEABF1079F
+:103A6000550660144EDE62E4F8A9933A126F318F66
+:103A70004000E2BC929A87EFC65DF58A82E3448AF1
+:103A800021B551799D487BC0BF4CEAA8DD09BE4FE6
+:103A9000F5EB994D4B31ACF1B0B75EA817E96A115F
+:103AA0004D801B2878024DB10E4700083A32F8FAD3
+:103AB00037CE2D74C50E56489620594C328AD4FC08
+:103AC00068103CF68F71028AB8A9781FD0EBBDDA76
+:103AD0003FD6D564532F2A7258057AA6A0BC8920F8
+:103AE0007DC019D7FD45B4B57F362BCADBB0820344
+:103AF00074F6DD54E26A985E95F7D6C819E72B5D37
+:103B000047CF9D96116CA78F3F6E9479F5AC380323
+:103B1000FC082EEC05D42D9888608C451959E09E40
+:103B200057BCFF22C25FD1EFFF953B0CE0BA45A323
+:103B3000DF7250141E0FA1A4FE3F113253B0165A6B
+:103B40005B24136E294E2FF976B3A3898909CE170A
+:103B50007ADBAF7E711FA027DA1DC3997EB224BD28
+:103B6000160000BF5B93C729A3C66B930D4755CFC3
+:103B7000964D2D200F72615DF763B3CE718A44EDCF
+:103B80005FA50BEA009867544BBDD58CC91CE8AE05
+:103B90001F6B7C0CC84AC3799E7791824EBAD8AE0F
+:103BA000A4B71EBFF6C45CC681A8659BAC9BE7D7D3
+:103BB00072B8FA60FF3A59E3C967E0A5C1E35ABC9D
+:103BC0001A8523A64C54A1014BBB7C46926FD7A308
+:103BD0006158A72C27F0349E2CE2819CDC3F157A9B
+:103BE0008CEFC6173304F38A47415D1C73A1DB7465
+:103BF000C16D9149E7FB4739E6284463DA67537999
+:103C0000F2043389E6DB109097ABB633F37E431CA6
+:103C1000A5C05C58BC471042F6D01BFEB6E9A40113
+:103C20005E3210331927A96B762D0614CAA58DBAFA
+:103C3000DB225F0967FF2A07300D74FD18D2B14AF5
+:103C4000E122BAC45A5348559928B1F1AB55FFA6A1
+:103C5000D4B94F6E223668CCC241AC8B36AD1187D9
+:103C6000E31637E13CFE2741B7903530457081B708
+:103C70001930ADEFDDCEBA34903FE1599E8F3C83D1
+:103C8000E3E0A577076AF820C0F4B961BAA08A30EA
+:103C90003B416E6D9DC68BF48D72146BE8E3990EFB
+:103CA000207F891CBE416BA682B6EF72C8D7659A89
+:103CB0007FF3EC694803E680E30FEE45D3C0563F3F
+:103CC0002160806F56AC54F9E237EF848C49369B03
+:103CD000FE80EE9549EB2133043DE86665A445B3CB
+:103CE0009F212CF8B25C53461458A1762AAF6AB3D0
+:103CF000E2D13ACF7D0BFBADDA6F983F3ADB9B798F
+:103D00001FCF8B78B052F7C821E6C53580711708F0
+:103D100004ADC37C76F0C3F86B7877EC4C93647E8B
+:103D20001FE46B9BBC29164D19A01F7202DF7B504C
+:103D30000593A412DE975A9665130A963896940650
+:103D4000AD674D277EFFBB48E489786AF763E5D904
+:103D5000676C10E700EF9EAC3026F469C3BC75BFFA
+:103D6000B042DD3BB92CF750486273D151D51ED813
+:103D7000B06CE8FA53339DF2A48D75A244302D0E39
+:103D800021B6798BC1663DAF264D09ECA5A4C6507E
+:103D900059655E24AEB5946E323EA30549ACB12D93
+:103DA0007447F6035D181C50138F7222ACAF187B5A
+:103DB0007C861E31F260FD8C95F9370E3831C25A7F
+:103DC000403830B40ACD9D8435A390D839AE326CDA
+:103DD000BB5D13F2F44A8C2F863FFB59360F8D7C66
+:103DE00030F0543670D74AB02FCD71B8ACCD8A7E42
+:103DF000555ABF3587EDC79B3C16DDA73BA91B4D28
+:103E0000464E250B5D5E6A77F7E99CBEF6AB1F7CDC
+:103E1000FB26725238A78CB28DFBA10EEA1C1A0148
+:103E2000248AB3A9A7FA50B064EDB75312BE0E8C22
+:103E3000FCB26E4275DCB260E01A1FB72FDB7BBAB2
+:103E4000CA16B827E3A50BAD88CC4B9162B6862184
+:103E5000BF274DCC95C6A76C27CFF2DB566367E32F
+:103E6000B7EC524DDFD2C20B509D042D62987546BF
+:103E700098ED7CBB89E05D086BDB449B8D3412A61A
+:103E80005E53494E0D4A2479A28AADD019B6B905C0
+:103E90001D33A2E555A4C1B8106B0D7E66A185E562
+:103EA0001934D060C602A1DAE2C1EF625B42FB5670
+:103EB00060D08E0D21CA444BF2DB5596298D6D776B
+:103EC0001E1F3384276D35E76EEB63262085391678
+:103ED000050DB7077748AA6D767BFBB6EBC59E3913
+:103EE000564E9DFAEC9E0FE476A30925C08F90BD37
+:103EF0003452B3F3CEA93F1DB74218A0729648F2D0
+:103F0000D7CB29C82F99AD0F177C051D8B72F330C5
+:103F100049D8CE72134780A22C3597B3BB60B1D677
+:103F2000E6206FE0EE14EDA86BA742C9DBEF2E3C54
+:103F30004769094F09972CE3E3A8902965530DD0F1
+:103F4000F1CDFA184C995BE9EC34F9E96B0EC149F3
+:103F5000E5D3C6FBB233ABF99CDB9D9D2DED1E6511
+:103F60008C3BE421993D1614970858FF9598CA1D7B
+:103F700018C01D3BD9074E91B5567FFD466EDDAA90
+:103F800019D0B07013E1F4DC79E0EC19C1787A1142
+:103F9000ED8F406452BAFADFAB224DAB5FDB27698D
+:103FA0003E5D2E74791A441AC835CA34197D697E6B
+:103FB00024C6461BE43D753B81BA94420596B9047C
+:103FC000F268718A85706C5F7337F79C9CDC59527C
+:103FD000E8A2F5E76BD4DEA8DFD7B424ACBB9F9191
+:103FE00030FB75A30721D5EE3B8363484BB8DE5FFA
+:103FF000466671BC69F26CA36A8425AD07165677D4
+:10400000A71A72342B200390FD8470C2D58E869837
+:1040100053FF7E5FD27B9934F85488660FDE09190E
+:10402000349586055F3D47BCE797D12A4CF9355555
+:10403000F7486353DDBDF3B34E30A5ABE8B79F57E8
+:10404000EC491CE52C8AE085026C7CF15B4F187C06
+:104050009E6F328526BD7F3F2E817BDC32955FC20D
+:10406000F1701C596D4715CB23423DFC2C1EE3FC1F
+:10407000823B6E52500F7EE8A10470F453E5057D3B
+:104080008F1E4EBB451A465D825632BDC8BB2258B4
+:10409000BDB398C277FB0F21AC9DD4077725B71726
+:1040A000DFA9895799954373B5B875545661F2F1F4
+:1040B000CE812FE8DF4F70A33DC1EEEF6A3B514B3D
+:1040C0002DF9B6B92C43E55D1E843BC342539FE2F4
+:1040D0008DD942B2B0140A8B6D76EC8765F378A364
+:1040E000650CE477DDBE8895287CEABFA69146750D
+:1040F0005E7EA8314F982AE035FFC3102C1DA3E542
+:10410000D2A75060C59249E2B1765C8BB316956E2A
+:10411000E6F81C382A97416F6926CAF74EF71C63E8
+:1041200064FF41F75563944B7869A579F80BDA463B
+:104130004A5F9252890C191F78BB3A0322121797D3
+:10414000AF1E489350AA55621D0A3D404BDB1D0D22
+:10415000D83A8F0DE155B93B1D458D5A3EFD596644
+:1041600019C5C7323EF803028EDF9AEF0D631A7845
+:1041700040684094B4083099602D58F75760054D59
+:10418000110B2A93ECE5E7701329CEF186F0076A4C
+:104190000241550D1B6038999A24868F8507621C51
+:1041A00053B3E522C9EE7C61DDB704E4C2E04B18ED
+:1041B0004FC4E05998FE71174815C2998A89FB448B
+:1041C00063D3846BF631718490F066BBF9A4E6F496
+:1041D000749DD074D86A21D05D0795F9221035D529
+:1041E00006EBB763D886201B42DC6AA10963E3E0D3
+:1041F000665A17C38AE4F19CF8413A0DF2B006A65C
+:10420000735FFDD2F51CEE8F15340E16B13C1EDB2C
+:1042100060727486F9C6E9456B23B3727E1C7B4BD2
+:104220009A7BAE692A7B68DF120B27BD36BF530C21
+:10423000591168701F0EFE0AD567DD50698196D846
+:104240004F1FBF3CE77B10C91D8DBB38166B824DDD
+:104250002C67F1529C752081A03298125F4FC28466
+:104260001FEFFF689997B35337C5CB74C908EC7833
+:10427000E8AE604ED9CC9AB0190C0460B2D6FD39C4
+:104280001EFC2A5B66B78AAD8B59DAEE068BF39B70
+:10429000A8A8CE13CF78911AE3D851111746B015BC
+:1042A0003748679A2D1DE742A3BD4B81034040ED7F
+:1042B0000575B9D2745626448209CF4219EE333CB3
+:1042C000217978035C59097C72443E23AFCA8D562C
+:1042D000551A5C552EDF0758189DE11BE41DFA0B9B
+:1042E000A68E83F5EE811C43D4A7D5ABF3A6DA0ADC
+:1042F0001329D34E0D001CF917CFCE6B8B601D78A0
+:10430000B079040BB5E0615D86758DB0412DA4C018
+:10431000752596F5E98396558653A36F47AB03D36E
+:1043200022C1F87DFB6C425FCFFE451E2D33155731
+:104330000817D0E83807486602E80A5E54823098C9
+:10434000EDA9F147850EC92C84A5209DF53AE143DE
+:10435000FB4FBF2BDA798D121C0E519691B4AD53E1
+:104360006676FA66B8EB88C06BB6338499D54EC4CE
+:10437000D46AF0544000F694B8575AA445BE852735
+:10438000F09376DB969160BD7FDACCD9B3B65F76D9
+:10439000EC32A2AD8D5EBB42035D0A1684C9D4DF48
+:1043A000EB2E79293F0E87AE35517D4F963FCDC319
+:1043B000B6366B30EA3C7539E27715AFA1D7967DFA
+:1043C0004EBDB9388E8F2393AE42BAC5A6CAA54852
+:1043D000163C271F7E8867430302AB659F47398CD5
+:1043E000FBBB1B6DF662B20C9FA8044FB7E8C999DE
+:1043F000BE1E97BB7749568A3C356038925DF7A25E
+:104400009E059865C4B31618841060CA95A0FF4332
+:1044100014490D59DEF40812F494CDCB7128B0354F
+:104420009742C44C48E1F85C13B7D52EDE1A1E3A09
+:1044300074F4C9A90B2D4181C82926B6829B179215
+:10444000FF9517302634BF729765EBD478A84DBB23
+:104450003A56D531350DBDA8B2B9E9FEB96B9749C9
+:1044600036FB90BCF452D95B7FD01BEFF90FB7E459
+:104470008E870DC18D051AE28CC12537200EFA26D4
+:10448000000F82E0C3A6EDF52A1336B64A6C661516
+:104490000A0D0EDCF9D4DFF2807D65FD929CBE8FA3
+:1044A0000E3E4354078A8D260153FBC4A9BB93C01B
+:1044B000BD7CBC3FBCC4242992438776D1ED633CCC
+:1044C000B26100136FD01D134D5A300A18B6360B67
+:1044D000F1D4E16B8CA05E95211C53676B3897E596
+:1044E00054D11B966553FF9FBA62238BDE24351689
+:1044F000C62A27E5C3B40BCAA8E04BA9CAA6570928
+:1045000069DEEBD348D22EBA61E3D0B19B5BFE5B90
+:104510000F65059B304AC84D3F04D13B7811AB4134
+:1045200025CEE4A518080EBD61006723EC43B9252C
+:10453000038AFC9CDFBC60999640D54B87DA87AC38
+:1045400085583882484BC77903D85DAE7EF468BB86
+:1045500035B3740B4B8CE4C2CA01E35846B054B96E
+:10456000A1E3BD11221E2694F966BF969FF1307714
+:10457000DA4192850EF4775A1BCDC0595F7665BC3F
+:104580007DD75A042617ED5E1D6576E1FE79E0F9C8
+:10459000AA192EDA10A82EB0DAC02F6F56A0EEDFBF
+:1045A000055F9AFA405F2A016F13BCAB98182F2B56
+:1045B00003F3D9BCCE664A61C30EC26D6F0195DBB1
+:1045C000581B9FB839B91E9FF6163B9819F7BD04C2
+:1045D00033BF911E350235BFE2694ABABAC3A76339
+:1045E00052B586EA0278D57BCE824D9F4EC889149B
+:1045F0006FF2B4340E1A212333848AC991C4954FC3
+:10460000DD34138AD9DE8F9BC6D89AA38001DEE4FD
+:1046100090CF3A4B871D6CED3981FBEE8ED3A5AC64
+:1046200024B065E8768BCF9DE3731B53AB08DEB4F3
+:104630003DFB27102DFEEC2C49AB0143AC59126811
+:104640008EC006A5B4827440F4EA3AC0AAE198C5C7
+:1046500040BCD49DCD77544AB77BAC2E6CE230DCA5
+:104660003542B03EC6E00B8D8D76ADEF5357057BDE
+:1046700049A5E98909ADACC304B3A9516A83BF2830
+:10468000B525361724AFFCD5205ACE216D01546ACA
+:10469000DDFB3D43C47D2E25E50BA23EC20CE9F5B2
+:1046A000F104731091D1AD8BE59C74A714F0F3B5B0
+:1046B000152F0A12A638C25C75C29636F09526C22E
+:1046C000C1C7F21137E8DBBA7576017269A3870DAD
+:1046D000D0CBDF09A05726BB78F7D11EB22B3DEE19
+:1046E00015DBE7A3CF381BF877CAA451EC922C3521
+:1046F000D2B3A21B98505AE5384ED480582C89DB8F
+:104700007CC8DE31B8E290F2B0B33AAB71B03AEFA8
+:10471000551F79D50B656770699D8C3EE8E782A2CD
+:10472000ABBCB150D1806C2A3DBCA26AFE7C0DA00E
+:104730006A67DF52E50385FB6D353A33DF817D190A
+:1047400076A77BFBD7F6A8AEACC4C061D8A7D79E2E
+:104750009B51B0725E9277BADAE6ABB3E5210F22D5
+:1047600035DCE3FCC7735753A5DB8EA717B0295D73
+:10477000C8AC32890DD2DC15CC57E3BED99489FA86
+:10478000CF08D20D243B95E88BB372CCB3DC06DEA8
+:10479000765BD003258C8F859417B2E490F578353D
+:1047A0000FBCBAEEC766408A4E23D0919AA3D2348A
+:1047B000FF55C86E0A7F48D52ED55E676AA1633C57
+:1047C0002E23DD6B190E97036B1640D55220E5762C
+:1047D0002FF0D4A8ECE7353F201A958A3C82F114DB
+:1047E000BFD766A8F9ECAF138D8497FAFDEDF19B66
+:1047F0005B88EF06626AC9A1CB3AFB19DAF5A739E3
+:1048000093129435B5A1776FAD691FC7B66970056E
+:10481000BF3563169547899B293501B80367D7676C
+:104820009C4EB6E69076BFD880C8F66529D302A024
+:1048300032747D97CAF5738421EC4C7B7B536D31C8
+:104840006C7D781CC38984D4A645F4C54247E73EF5
+:10485000E08A08CA61CE0331CB52B9DB8774950870
+:10486000EA6685BD00C14D30E4D321B06D830A18DE
+:10487000C50D15283EC91EC42B093CDD6B391F2808
+:1048800012E947FC6B802C7676A5C90F8EFB0C35A0
+:10489000CA7C366FD3547D41C503F79B614B6910C9
+:1048A000D8E18E94FD48CACCC8123F75D8C0299073
+:1048B000049F90DF670C737F797DC0C970E9497AE6
+:1048C0005F97F9DD9A8E9264521E06E1CE13273A65
+:1048D000AFD87574A0AA352E19DCD12537A7B852E8
+:1048E0006DB6C97887208BDF6626E076D5AD257456
+:1048F00001EBDA63372548DA4DF794AA9D97C06239
+:1049000029C9C691198C8083E1A07573F7F2B4644C
+:1049100008F3754601C1E83450DB38F2B597E585F8
+:10492000A7075FBEE64F77F530596EAA2B079C2E7E
+:104930004952CB40C46DCEDA048EA7FD474ECB69F9
+:10494000C3C2A4322E0127468AB72EFB82A4A0DF61
+:10495000C592351C4E7EA1B3EAD2350E460D75B90F
+:10496000881FCE58CA2B5C13A7C2C1768C3F427AEF
+:10497000BDFDD89EC601BBBA17C063E8AB40C108F5
+:1049800091F9B63685FA0852882167ECC502BD2533
+:1049900022C025D4CD69D0A116AE5D85A01A9D8117
+:1049A000EC7D2FD35C702A759B75A6672EDE37567B
+:1049B0005DFFCF9F173EDFEA63653383F93D3D60BE
+:1049C000957BB4E5B4805E508A3C2AEAD9116F9198
+:1049D000750984BCE0677A01C684404F727939EF6B
+:1049E000B2B55FCD654132850153EA21E8BD1E5263
+:1049F00052B68396C72AE594EE6053FD4E62D1DB32
+:104A0000720197C6A2D0F51621D4ADF0DE27E838A2
+:104A10000D4A0A9D157A013F8C691F810157ADCD62
+:104A20007A96892E42843027A1ABADF13D63D16FD8
+:104A3000399A93B6A7263A5FBC5C4158E39432CFCB
+:104A4000F7BE6D380E0715F9F7A4E344546F61F112
+:104A5000268B12732D9960678B40285A4393D1F9A6
+:104A60006FFC326C3249C6284C4BE14B2C368589A1
+:104A70003BDBDF8ECA68330F49066B3C20CDD67E08
+:104A8000C19733C8AAE8DB646F386730F1478945BE
+:104A9000C65B7FF6F28B7992BEEB2B23E9F55D18AE
+:104AA0005FE85EBA7F030595D7060BFDC5701ACA8D
+:104AB000CB87AD8C56473DCA9A488D5E7C8D2D21A3
+:104AC0008E55E5080A6FFDD9CE087063F589392344
+:104AD00042EE4E933BE99F382ADFDAE573B3DF3BC2
+:104AE000D9B806275D2D5FCBEACBC8912A42DDEA13
+:104AF000103F35DF0F3B9415BD380A61D4A5D78E22
+:104B0000F30DA76856D65E25785E4E50F6116D847B
+:104B100085366136A412B8DD6F98FF0E8BD64C41F6
+:104B2000DE3B5A89CD5C63D36511CEFD1A40927D80
+:104B3000C5B15194A2B437C3843B6F89C020BB5F19
+:104B4000540291FF3C8FCB6413C48D1317962DB381
+:104B5000D1B0CB5AAE25DE74DCD9558186EE7233E6
+:104B60003FB2E0109B929D6C3A38421B1983FCCFF8
+:104B700074907308633EDBE4144F159A9AF576CA75
+:104B8000CE21EE8595A3D24225BCD5A889EFAFEF03
+:104B90006B98A1F3C1FB11B434C6C5CF89D4F9D841
+:104BA000C899A3E1153833222AEE15014AEF9B6C10
+:104BB000C3C9B9D790F3C729BB5672CB3D50B7F9DB
+:104BC000F06A6263D289448EFE269072D8EF924AD0
+:104BD000CD78D81991F7EC62FC3AC5A2DFC82661FE
+:104BE000209A381E5AD16F315DC04C07067E08CC22
+:104BF000D88E639E1CD05B2934DF1BB001FE867902
+:104C0000D774B6FDCA51BE34E854AFEF55176ABC2D
+:104C10001884452F9EA46CDD0FD9D7BBA9FCF0905A
+:104C2000C64791BC888F9C72CE27CEB5FE6C07908C
+:104C3000A21AF41668EFA3F3135EB9E8C9B72C996A
+:104C40005EB3D4E1DDE5B091711BC35A3CEDA8BB66
+:104C5000CB518B18C6B18B5B9620FD93677FE86ABA
+:104C60002181A4B59F1DB4F0307F359B6B814BF043
+:104C7000B869989915C139ED96A04F5F24DD3C2E97
+:104C80005B372734CFA274B9E44225999A0487E6AA
+:104C9000AE293C1B56F629BE8C4DD17339E4F78DF5
+:104CA00067AED96E3741358D45888951E9A5C20572
+:104CB0000D98BB7ABEC0415B8DF3BF95ED838F5DD0
+:104CC000BE786467C714805C9ACF73696BBA74ED61
+:104CD000D723C93E7677FFE37D727E3CDDCBD5D00E
+:104CE00089C8AAC6E445A9677F6D3C3BB2F51FABF6
+:104CF000FBA3B6616BAAF9BBBE571109A0E75C9292
+:104D00002F2996FA28A9AF0B0D4E536046C4DBB18C
+:104D100059404B501E1326D49439EEE9736B576AF1
+:104D20006E5C7F66D33D22456404AE8F4D127F7A60
+:104D3000301B1C3987894CA53148E03082781AE055
+:104D40003897AE1329BA432DD5DDB5B3E276C61236
+:104D5000EFC80422D155453C2CFFE2145C40399148
+:104D6000F8AB3462078C8A7D4FE90E94CAFB062C9F
+:104D7000E80DF71FAE845B9A4510353192FF51BFA5
+:104D8000F020E27A8056464C7C34A6BA1DEC8F6344
+:104D9000FCF22CA64AF158FA5B1266304484E530E6
+:104DA000B63FF8218621F4E8D86183394B1DF42001
+:104DB0005B23313E7ECC9B73A512A079720E988442
+:104DC0001A937D5D6EE2FC23C817320F139E8EEDA1
+:104DD0009C7A8CC565B33E0D47C81C574FFF272EE4
+:104DE000AE4859A8547497F2AAC529AA84BA70810A
+:104DF000427D401511AD58593BFBA04638295E4312
+:104E000045574392E1FAB4107864CDC2944A3BC44A
+:104E100020684084C6AA9AC26651C0C570AD520EC1
+:104E20005143D6D015F91CF49032F06219FC043FBE
+:104E30009E23FB593BFFA3334405DFE0D8C65EF257
+:104E4000D86500447CF24D2658CDBF1850D2C73DDE
+:104E5000C2168FF6E1C29831AE121AF6D3ACBB126D
+:104E60009AEAD82D4C8328512E726A30E3997C53EC
+:104E7000827327A68A7C10B1D6F253E87E3D123D9C
+:104E8000AD200C8FDFB51A040EA761D27C96257574
+:104E9000332599BE9140654DE8DB86C0D3B0624EA4
+:104EA0007FC5123B06DBB9506A171947ED27BD2AAB
+:104EB000F65487715417EFC5C7FEAE591CCD378421
+:104EC00042B88BD72ED56CCAA20D2F2293EA251893
+:104ED0003872E924BD43E20DD7A1D3ABA176EAC570
+:104EE000EC6B852D432A975F0002D2B936431F0130
+:104EF000959FB9C5E3B90DF4437A1E3854D277189B
+:104F0000EE60963AB7064FB8951427D63256C91AAE
+:104F1000C231CE165D0E800D1CE9F699BED47F938A
+:104F2000E1BDF8BE5B303E55F9B0F0F0FBF75194AF
+:104F30000FBDF7E39E4B8148272FBC888E8FAC5066
+:104F400046E2D2B9FDDB05124F9E6A2FD1A320990C
+:104F500039E352A6281691045886362AB534A58519
+:104F6000D939209150BDD4CF1AF05AE25511383CAE
+:104F70006A9FBCCDEB5249437F3C15053F99F4A392
+:104F800034E30C21774AFED6CAF3B43002842A4AAD
+:104F9000C6BC8A5609AC93455E53E9154CDE946F46
+:104FA000322B17D5FA4822401F426AA656CE374BFD
+:104FB0006C53D2D90847F4D1310187C5C21D39F4E9
+:104FC00039DD331CF7081D89E9CAE88F4DDD8D01F5
+:104FD000535A3FC6FC88FC8E9FE4A6303C58F83BF1
+:104FE0009D5B6181A1DEFE5399C663DFCAF425771C
+:104FF000730D3CC92748DA8036F24499D8D75771E7
+:105000002914C688A60B22DA947B7806238E580EC4
+:105010000FE4C0DD54BE374E280C68BFB516270913
+:1050200035EAE61018AB5B194A7894D8802BF6F075
+:105030007AE1FB649949D2D4226D74A8DA42B1E8CE
+:10504000AFFFAB2EBC2BBD9347EF6DCE7C3B1C64FA
+:10505000D2F18C770AFE9C2852068E06E81B11D0EE
+:105060004614776B81866E95B2A830024FA4D5D2D4
+:105070004427C5A2DA5172059C80C08AD74BA45040
+:105080001BA40FDCBA8BC65A8C13C41C58C1C9743C
+:105090004CCCEE2A7C6087E9D19B1D5EC4BCE67DCA
+:1050A000E148A84F74F787A5C19BA30A0424980878
+:1050B0004822190C73CA496BBA11551515A6F30D80
+:1050C00013E1BCB0A1F6444B9D2127E57C7DF93B63
+:1050D000AF0E1779D7B93582B3B1B6DDCFA96D3927
+:1050E00055E6C3999CBB6A2E049E0AFAE5733627DF
+:1050F000399B9321EEFB895EB294C297039B23FBFD
+:1051000047155632E2365999FF3DF132E94F45498C
+:105110005EFB8FF0C91398A19B9E4BAE76DCC04717
+:10512000B1F8CAA2BC0063FCFDC089530B3C1F0E42
+:1051300098003052C369CECB56C4CEE6E61A40671B
+:105140000BFB0F7F6FB6B7035995F1F0749561FFB4
+:10515000DEEC88DFC680C8AD0C492E677B49710C38
+:1051600077744C6E83C4EC0F2AFEF54BB1E51B132C
+:10517000094D1E23BC152C0F3A35B2FB10926B6CF7
+:10518000DB3C6D59A45EDBFC2469A945AFA5E8CBE7
+:105190000E07B196F55EE7F11703F7545E55CF7B26
+:1051A0005CE68A336AF0AF0C2B67BBF049F633BE7E
+:1051B000776008E2815A56E38AF95B21A3F2035132
+:1051C000CF0B7A4C4616CDE8CFEC46EDC92B034DFC
+:1051D00013607E9DE1718DCC28DB36082FD6FCFA5A
+:1051E0000A14C078255C22BE420D71E95E20392F79
+:1051F000480FC303F5FF2D331B71EC2773CDED551D
+:10520000FF49D3DCE8F6E1679003E10672D13A8109
+:105210004625E13134A1FF170131AF558BD616F386
+:10522000D27CFA1E162E38CB2A1F99D1E0F2FE8AC4
+:10523000DFD2C5196556EC40AE49A50505600440AE
+:1052400084B7E67D0F1A3CA5976969C50586FFFC02
+:10525000BAA5324F99A3E3427005D545EF3DA96346
+:10526000C31C2926026A8B398F3486AAF6568F8F83
+:105270002BEC661EA07903D026A66FFAE8C78FEB49
+:10528000AC91DA44082BF8F6E58AFF14E379719DB6
+:10529000EFEF5BA1E9136D5609E1727146AEC4C52B
+:1052A0008AD499A75C1697F5D8AD7F29DDA15F2632
+:1052B0003AEF7722D79DFF4A43CEA61ECF0760B7AD
+:1052C000E10295A6C03D9102E7277EA3F668BBB830
+:1052D0005932B2EA0047289A3C2785C65CEE65241D
+:1052E000D28EB57CA53F2AECCA69B7336BFE13A2F8
+:1052F0008BF94A1D1EBE1644FD958B3DDC40754F53
+:1053000010862A4585073AAA4F8ED9F5077FCCC06B
+:10531000DE658CBA2F92BD469673442A8DD7AB6753
+:10532000284C3BFAFF25CE91B03478571FE3521D2D
+:105330006E9C8FE604265EB4667E93D24ED2D17BFD
+:105340001805488CD89FB345DD1BEBC6289434D58F
+:10535000DAA2FE33FE2826A82091027097802BCD7A
+:10536000569834EE5C43CC076B48BF11A4571C44DD
+:10537000693CB53847C4A573E33DCCBE8E4C5C6830
+:10538000DA624D8CA839B64E041C2726BA0C74C9B3
+:10539000D5E7A36A77741F35132F8719F6C9DC2B5D
+:1053A000F3C380946AE0A721F9413516F09C9192ED
+:1053B000316FB2AEA3B9E0A8545A86B16687C50B67
+:1053C000AEBFB6C2F3EA9685DE05A42A27C49410C0
+:1053D0009E1BCAAA59A9700D972499B211B34AE32A
+:1053E000DBB00D7145E30E48D4A1D7533A60D955CF
+:1053F000DB2496D1A679AA0524E0D67C81C6912D1E
+:105400008AB4C92A5F0086DC81571FEA24C38BC98E
+:1054100048A1AB05FA7C0BB3D8F719917620971603
+:10542000E59D93D94B78E1F0F8EDE92761638D7B39
+:10543000FA66A4EC9A714CD7C8E6394BE49215058C
+:105440007CBE6B896F7EBD6D52D781E7043D39DD2F
+:10545000148F518914C9BCCFDB2182BCDF8E86BD7D
+:105460008EFE46B929FBE69CC58560DEC37CFD1E29
+:1054700036BC19D1F4EB8AB32DBF2FF8EA65899DAC
+:105480008ECF935F4806EB635CDEC022CC149E1186
+:10549000A65C7097CF3DEE757374E34F7CE0A9B6C0
+:1054A0005863BD867A7F72994BF3C4A8D0BCD938B3
+:1054B000E1E8E5482EC8E8C7D2A2F6CDFA7DFF663E
+:1054C000214E6E2A517CB6D45F11FE8D7B1AB2AC90
+:1054D00072B50919019B560D5310B53E928B106B96
+:1054E000260FB3D9CE5DED3AD8B43DCA14E4226696
+:1054F0008DAF90F5790CF1133A7680F0767160619A
+:10550000DEC235B1541694B0EB84BA8F50EFA37E4F
+:10551000E9F8942300FEB8F1C518D8B0F2AA816268
+:105520008A6150E3AA0BA5273AF2396FC3211F3FC6
+:10553000B76D78DB8309B3704EDF5C3173D78C7D38
+:10554000F53ABFBAAB1D5B54CA1A61DBAC257618BD
+:10555000F06B418DFAB6608084E04FA96490563DAF
+:10556000C40124B67ED63599A5FBC94CD2367A3E05
+:1055700073767978F0BB44E83EA86413E1258C8FFC
+:10558000CD06792CFCBEFED6C6C166E39F3909C4A0
+:105590007517C3861CA045110C49B0DBF5CD9C22C4
+:1055A0006DB1E25F48596983D056933FFDCCF37AE1
+:1055B00052B2E3B6BDB29D06E699201EB91F257A08
+:1055C000B25FB828EE7F015DEE49443559BB046EE9
+:1055D000F9560B54578A433F45849ACB5A0DF6CD62
+:1055E000CD9CE3002A06FBE31AA746983290B8291F
+:1055F00056B6B95C7F714B1AEDBB9DA3552EC97D84
+:10560000F8F46A9EC1BB18F8A0404011496AC9F776
+:1056100048AB0BE61E87DF66D6E216E64A230F6626
+:1056200055A4F4D19153045D020624B457ED0279D8
+:105630008756ECBCB0C573A127BFAE6F47C27E6D65
+:105640005634AF15F569A770D5EA00E01A4F7A8C89
+:1056500026BD615767967A06239C0B78C19121C8B5
+:10566000E9C1E8FB62586F3ADDFB1E3643345A430A
+:10567000033A2CA048BF52BF14A725DA724918C4B8
+:105680003C096E75908648036701D954722B4FF21E
+:10569000BEF59AC1DF3158238B3B8F069DDBBAE004
+:1056A0003427F1DCB5A0112C66A8E675EA8A47F824
+:1056B00098C201CDF716D050552D43B00D8E18501D
+:1056C000AD2F97E32C30FC92918C7D8170DD580BCF
+:1056D000F197018B618DD8C4A0A23B6E2D4BD323D3
+:1056E000C94BCB402CB7D1E0A4A2DF297182AA918B
+:1056F000C7EE53A88DB955D5D5A5ACD639BA194939
+:1057000059543C58A6EA46E370B2C54EB69CF839E7
+:105710008F97CA76C6CDC32DA4F67934BD7AA46B13
+:105720007DCA674E067E1AD1E04F8F61CD4C5D5623
+:10573000C558A7E1B3E83D31E569BE7FCAFDCCC9D4
+:1057400076AC637CCF9C0AD62C05392EE0AAD373A5
+:10575000E1B3B4D1AF7223390D1E28532F08F92CB1
+:105760006DCB6CC0EF966F27E264659F82ED51A40C
+:10577000BD250D86BA1E72A11676BABB64F261070A
+:10578000D53DDF5E837EABD25D9D7A6BBD0E265B21
+:10579000A4688E1AD59C16D043F2B309F3DD666671
+:1057A00051E06A172ECB11433BBA5640BB7B9702A0
+:1057B0005728C8D77EE2E000EB4774848AADAD0D70
+:1057C000C57C866C5B9FD9A8C737EE36760921E089
+:1057D000E0F98F7D2A114ADDCE14525B194C75AF6A
+:1057E000EB010B77290251EFAF55064B74BBA004B8
+:1057F00006BA3B832DE4493D1ADD6F40B696F6B4F8
+:105800002F81A39907CD28897DDB8F448FA74988F5
+:10581000FFF84606EDC60A797136B2483C33C9A690
+:10582000E71E4CAF675EDCA2BE724B31FA6ED1C38D
+:1058300007F71672531A4739782205B5340BFDBCA9
+:10584000DEE2FB8DA804B15CE13790CD1C3C1C501E
+:10585000F6E2E0B816BC427A447C4998CD3F48E075
+:105860007C7AFB1361DF218A8C4C45BCB92CC9C101
+:105870007FAC6B5FA172130722309701EDB0AB8252
+:10588000206ECA1794544327FA6A9F2EABBE3BEC96
+:10589000037BE43E5E97080CCB62503B1DA4AE6FC9
+:1058A000465F708E121828BC8E0033E6DE86C8E58F
+:1058B000F5EEC996B74EE2843BC809B8092291DBE0
+:1058C0001A04522B81916C87E7CA22EFBA81E52D29
+:1058D00022F1463C9663D8E401F2D2EE3B19FA5924
+:1058E000ADD63D5A3935EE7741AAD4465565610E9D
+:1058F0003BADA695D9861DF041C6BCDD9A0EBEC053
+:10590000951328C26042EAAC45F9BD4B10137725C8
+:1059100034A61F5C94391E86603D8C6B408BE9F386
+:10592000A6555F475094555E682624B281ED83EFFB
+:105930002A868AA925E4D3D8B998BC42F2E322E7A3
+:10594000B21E292834FEBDB0C66A3C5641FCAD5B90
+:105950006CDE75C22F23B0B2CF7528228D33882F0D
+:1059600047302ED7A4C8464318E7A21148EE75FD6C
+:1059700092FE05B1407807C15379BDDE848EEF8673
+:105980003783DF2CFFBF4BAB6CD268DDC6C7C9A223
+:1059900094E131E16EDBD0FBD839857A4E2518FAD7
+:1059A000BF897E40245DDC04F2DE9062684B17AF55
+:1059B000DC7860D5C73E267265722DD264F4FEDBBA
+:1059C000BADD9576CAAA8FA3EFA7880B99E7DA46C6
+:1059D000CFF92C7D4422AD04726E7D0BCFF07E4555
+:1059E000282E668E42EEDCF1BF5310526334AA7843
+:1059F0004AFAA6BBF72634B940AEE2E0F575A0E45A
+:105A0000C748211A5705C440DAAB79845A532CC4CD
+:105A1000137AE47152615F1F7E687A7A70472A8A2E
+:105A2000114282E8A06EB80ABE2DDE1FD7621E3872
+:105A300033FC679B8439AF679D2D244813EE9C7718
+:105A4000754A000B0CB1F4C8E640F370E3CBFF7E5F
+:105A50008CB26133DCAC413124AEDF6768D71C4FB8
+:105A600005892EB1587C0AE3F162ACFEC8459F2936
+:105A700094AC458444B9C2EB5FCB74582E4FF28886
+:105A8000D2F70BB2D0DC942D182040CA84E937EA53
+:105A90009F2EF09AEB9EE131FCF94D915BCB5AECD5
+:105AA00062A9019CA2123AB20CA38ABABD261C5468
+:105AB000A2CAA254AED8E8A1C386FEF26F03F7B221
+:105AC0003C913694C2E9BABFACDABE2218B8E5867A
+:105AD000693FBD253DB3B38FCF614E3C5DDF43D001
+:105AE0000AB0951FE293667C8A2D0CF071AE5C02C1
+:105AF000B45BFBC274FD9AAB3AC2A8E2EF3D5728F3
+:105B0000C58E5BB9A9D241A1C0274D22F88FB9C07B
+:105B1000FC866D9E0E1B1D9B46AC85A04A0EABF607
+:105B2000ECD14BF2803A81E7C7B89D3E05E904A469
+:105B30008A4381A0FBC4CCC5780CBB0B0D0CCBB148
+:105B4000EAFEE49317F06FAA8FFF5A1F9410BD224C
+:105B500095CE91F45EEE221BF83771D14E5BC2DB1D
+:105B6000126020FB7FCD089C05798E032A78FE7D8C
+:105B7000B63B3D3A51F52283B7088D8A2EF8FA9E3E
+:105B80004C343CADE0B52C37F973C967CC6C0DA92A
+:105B900087A614F41BD2AB38CE204604A42C91DD8A
+:105BA0005C8EB36ECC85944B5AA98931429198B9D9
+:105BB000396E21A2E275FDA9420F22211602B7BA61
+:105BC0009103569843CF18E2D91BFA46C9AA4B5DF8
+:105BD000351DC1B4BF6FF84910A863ADEEBA4834A3
+:105BE0006EE1C39BC399E122B8F9004C494A4816BB
+:105BF000A30FCD5BB90DDB5F661F130AC8D5672FF6
+:105C00002D87772B9754389FCE8978D44AF0116727
+:105C1000B89A825895B06FFB0802E3E7D1AFDCBFBA
+:105C20001DD08CC753DDC1BE832C39BCE3E5384B96
+:105C300079DF74FA18923D437240DE98097C4CB1CA
+:105C4000D6BB7FD4400E6EF691C8CEB82E03320379
+:105C50008E5AFBF97AC6435D2137136A4382F0EC12
+:105C60004227076D7030C7A541BC1F034EF86DFC7D
+:105C700093CA912DF026FE26450EFC6A7F658D4263
+:105C80007C6162F92B0BE6B2CABBCA971E37C539D5
+:105C90006C08856F78D0938709A804361C966AE152
+:105CA000A577960BB45C38155B73BD00350489E7A6
+:105CB000621341FF4D627D44E3D502813FBE6B5DBF
+:105CC0003D1A78895F4640E66AAA08DD254C59935B
+:105CD000549FEB5F9AADD5C2E5E3C956A8895D58DC
+:105CE000A26736EC86C361E8FC906FC7D16DA97AD4
+:105CF000ABF222225BBA68FAFD65BD64F6E75C2769
+:105D000014F9CE290E30A224A32B82AA24D0B828BD
+:105D1000D539E058D99CBFB1F33DFB483BE3DAA04D
+:105D20003235C5D25BE017A19A595D826A40DB4BE0
+:105D3000D9CC67786A8D4C9A47A7E6FCBFDB707FA9
+:105D4000547953BF7481EB2C795DB8CBACD62FA6B8
+:105D500051736865C04D2D25CB3B3B6B5DB4CE7454
+:105D60007C9F725D2864838E3828F2E4E47048C911
+:105D70004077FC107E8F2DD5544C105C2B521CA408
+:105D8000072657A1A0BF8A142C0BC4570F72CE1D33
+:105D9000789BC6AA0429058350EF5E53CAD0142805
+:105DA000D0A2D82C8545782C00DB462FE689679A4F
+:105DB000C9319BAFF503BB16CFE31B6986936EA178
+:105DC000A8429C8A7830BED3E91146F64B456A1941
+:105DD000F3EB71DB03887561A057E3DA8C018FC1A7
+:105DE00091F282ACCD967A7A6B2CFEF480615B0DD9
+:105DF0005D85E3FDB446FD7E3797081E7D0854A0FF
+:105E000000CF9F17E7303A215D2A5B06A17876C95B
+:105E1000EB6A635781802B205271FA40C2A80DEBC8
+:105E2000381788CC9F431D328F878D0084AEBE56B5
+:105E300002CD633957855BAF02285BD1EE11F921A2
+:105E4000CF946C13EFBB7D59791D536BC820333849
+:105E5000788B12F55E7D8424C923B568FFBFCFC45B
+:105E6000C3FE721A763A6E068B66FF3E2C5554744A
+:105E7000B4C9E838B6466BC42043D60A4297547971
+:105E80007D62AF803C0FA2F2859D533492DACC7ACA
+:105E90007066B0DE305E9309F2A501D2CBC6D36F37
+:105EA000BF31D62164960D805B1230389D69A83EC3
+:105EB000F6C3F5B7DF3E07BEF5DB083362FF0856D1
+:105EC00070AD02F94D784175389A4566597A3D06AC
+:105ED000540EBDB303CD59DF04033FEB68AB3B2148
+:105EE000574402FD77F908CF6D33F7ADCF64E63A3A
+:105EF000DBB8FBE3579092EC4F58FF807CFB794C6A
+:105F00000A3A31DE638CB77C86F5822F3108ADDB2F
+:105F1000817C3FCA0680D7A40D20CFA1812E6F5966
+:105F20000AE38CBF692C7566041049A4D28ACF4F4E
+:105F30009925F5A433502F311791EE577E7FDE5E01
+:105F40001C6B4EF4954BB2831786D243A2F8517F57
+:105F5000A381F930F47C655F47C6D11656B594AD80
+:105F6000E29222CC6EE8934E87516CADE0741443FC
+:105F700071A463B73C7F37A13C1F42F46B00354BE3
+:105F80000387A6288D5DA02E7221E1E5196EF52FFD
+:105F90008F3EE06D0E587CA83C3892ADEDC2958FD7
+:105FA00004E926C6511EB72F954A6ABF982A61EEAA
+:105FB0003AFB3B6908031391EE8416950037AAE07B
+:105FC00094EC39C28435AB1E828E6FF2AE95B9AABD
+:105FD000303D60EC8900F381044EAAE97EA2B9FA53
+:105FE000CAFE0C84173590217FCBFAF373765814D0
+:105FF000F76D59C2273F35503C72F3FA48241A61B5
+:106000007218AD4D0FCF08979E41EA4C2614F72326
+:106010009AB38A79593B6EDC98A59E784ADE790C52
+:1060200018C128D33075B3AD6591CEAFF5DD2EB272
+:10603000F4E395CDFC8C59E77A4F4CBF70D81D0026
+:1060400016C04EF19CFEF31262918F1083CADC756C
+:10605000A9BF139020099742A7506335DA42BAE1ED
+:106060004DB0A6BF2C47F41D471B188B80EBB0F931
+:106070000FC63716DCF62D693B7C45A32F1B208607
+:1060800089FDCEBDEC62052FD1109B83F6E97AA77E
+:106090008D68DDE19AECBB3F998B5EACA4EED2FE3D
+:1060A00077EDD7F828528F8EA697E31BB70CF381B4
+:1060B000F592644FA352D52105859A035040BE96B0
+:1060C0005BFC2326F1C6CF59CA1154C6E7F03372E0
+:1060D000E5A68FCC2C538AA4095DF20F31F091FC18
+:1060E0008A573BDFEAA57CE66F0C8313023935BE85
+:1060F00092105819D1B5B330FBECFF6D03CD66B4E7
+:10610000D230BC32B15285FCCD627975AC464F3E7F
+:10611000B07709992FC89E1C6A34ADE9E051A843B5
+:10612000D23FA9D9C57AAD08F538942B88E7478DB9
+:10613000EBD35F74159800F4CDC8B882D2A4B253E3
+:1061400075C0241193FE8975451B45C4578D188B66
+:10615000F43BF1E0D27EDC1796AAE49FC3E54782C8
+:10616000D116EA389AA8A36BD5378ACE68B5FB3525
+:106170003BA0F902F8EBE0FF6BAF6E5734E0B57D62
+:10618000A1451850031578D4A1B7C7B522C69D9371
+:10619000F93818EF99F7A997E0E029A9654FBFB53D
+:1061A000EB0F310FCAB12651CDA8191DB5FB6C8478
+:1061B0009A18529DD2CF8CDD51670BD52C5C956A15
+:1061C000678CCAB085256A866802887462B077BA1F
+:1061D000786F8AA09DD2EF2DA4EFDBFCC62C9A57D6
+:1061E00078681F0F1D372B4E5E5351459867D75364
+:1061F0002FA4B15C21D8019028253D4595D98C99D3
+:106200005311DB8DF06CB39EBEB64AB37B234C8139
+:10621000FA6C7661DE40631C00CC883287EF6E4CEE
+:10622000C76674F283AD3CA7F6CD59A881A0B99E8C
+:106230009CDAE0471113C60C956285A0B887756794
+:10624000157FAD55C6A8C89F0B311D1DF58EE71FE4
+:10625000253F4A6659481CC543964595C6FAB6F38C
+:106260005C661C779DCE675CE2A350154685F0C244
+:10627000DA70053D5D49E9B169976F16E103EA35CA
+:1062800092768EF46B3B223CDE22B5021E0B188305
+:10629000F76AA98F98741C0A6EFB08271BD883978E
+:1062A0000C7B7CE0EB6C8A13539CB0C3BB9C219E9F
+:1062B00098B98F4C6365A4088BF31945D669A1BCC6
+:1062C00031FC5054CC5CEE46A93B4674625630F823
+:1062D000441C32BB1ADD73CCFDB8A275B99987197D
+:1062E00099F5F1100B829003130A5E3403332E5A92
+:1062F00028DD1E73A2EBE44EC72DDF0835AC23FD6D
+:10630000D9FA0FE39AC7BC512645F05D20CDD39151
+:10631000DFFC5D3E2E4C747181909EB8BFBB69D28C
+:10632000662826B79617A4CE85F20E5D56CF5B2E53
+:106330007C8026BD6C9C27C835FCEDAA3E2D4FFF06
+:10634000E8A407719160DC40344ED0BE6F5DD0BAD6
+:1063500077C94A20DF73F3BEA548011C941322407D
+:10636000D1D303DA8DCEBBE7AE3D1E1CB23EAC41AD
+:10637000C6C4F1B130DCE8A2C2A664B636A2BA76D1
+:10638000D961A794B44845E6F22AB568E23097404F
+:10639000BE2850FD67D2D3BE96CEAF2837D0048D2D
+:1063A0007544E90FCC5DE22669FFA00DE3B3B22F7F
+:1063B00098155C75524E2BE0C9D10E63F5129163AE
+:1063C000988947704AF5AA43819420F0DE582E9FA1
+:1063D0006138BBBEC0F10BB5ACBE29643B3EFC636B
+:1063E000D5709469EAE6F8078AD22D2FF65FD07C43
+:1063F0000AACF131B5BF239251A9EFF0CFD40A5FB7
+:1064000050DD0B622F88598EA5818C76550C70EE6D
+:1064100006AB7EB5DDEF2B89069E32A13447E9EE4F
+:10642000A958EFBAF286CAE69F695A6F3FB0CCDA34
+:10643000ED8F9FED4C16839D6A5F6FECB8C91DF51B
+:10644000C456D9DCDEDECF92726D3488738B8EF940
+:10645000BBE57BAE0A40C8411D712BD87055526612
+:106460007F64C30E97D8B42561B753BD7E7892463A
+:1064700083B9D7242D1272C4B4E3381FAB928F2591
+:106480002A18B375A80425999A317D80196B470F96
+:106490009C39475FA669E760D59EBC2C4D1A06C3A0
+:1064A00094E25CDCA06C08266C17B9BC02472E4C49
+:1064B000FFA3C77E145FCD4F5EFD253363CED41599
+:1064C00059201B72D0CACD31CD0504C106911CE400
+:1064D000B87D6BB1087CD4670131F7BF12DBCD41C9
+:1064E0009747ED47D821C47B1997B12FD2D9BAACC1
+:1064F0001F1D5035453CE53B08D41EFFB817746599
+:10650000C1AFB77BC3B646A9E56112BC5458D56D7F
+:10651000FFA3074E55C8699D81AFFB5009CE145BA0
+:106520004113C3D144F2021CAE5326E91A9FBD6A3F
+:1065300049B8DCA99E7E7DDE316C9A6C48C53989EC
+:1065400042ECE799C2C19E3293CA8AEC624321DFD2
+:10655000892342DCB2993E3C4B4F9530122BFD66AD
+:106560009288FAE23BABCD0F29D394A8B71F975E70
+:10657000F6375139FCCB879DBC3D1CDE976B8C1CDC
+:10658000F5CF4670D7DD9FE1AD3B048D3188B9F280
+:106590002EDB296534EF29B07CBDA054E97BA8BF70
+:1065A000CF549F65BE79D664A8AB22D9358FB9FA8E
+:1065B000E326EB2EE9176FDB937CC605745C339CF6
+:1065C000144B5C05F13887A1CC76B3191428C206A8
+:1065D000BCB29814F97EDF9FFB1A7533EC5F5D9EA9
+:1065E000A5A36556C80142CAF3771197D0AA53F301
+:1065F000BBD1067450E0BE716DA3534FC5D16EF58B
+:106600006037215905019EDE4BAD73D306302FD282
+:10661000D0C869204CE4E6846614BF204AB8EA7FFB
+:1066200033831A9B7E343D1C44EC33A441417E6489
+:10663000A88C36BBDD1BD07EC98981DC7EA15DF4D0
+:1066400034D71CAF234C06F73AE2E66E3CDA88BE3C
+:106650009F2790EE324571F546C2CC10B67051A519
+:10666000424CAF4C7EF0DE0D34A466119F7CE28874
+:10667000DA193ED3B14DF93CA79B780D014CC57C8E
+:10668000E9F0349EB1B95B48F7A74DB07CE5E3452E
+:106690007778BF280B421F5F1F2D9699241FBDE3FB
+:1066A000B2B7A51418214D6F4996F70F62DFAF2BD3
+:1066B000D9F2CC19BD1020BEFE4AAE8BB2CF531119
+:1066C000D99F86FB8E5ACBC45F4E750B336A5A65D1
+:1066D000D71B3DE21BA04052E561C950FBCD7C2891
+:1066E00011C0184CC6D4C57786BE3E79A66868C16D
+:1066F0007AF83DBE0E858F7C20C7B08F47AC9E8652
+:10670000366756211D8002A4E8175D5F1AA3F33592
+:106710005C065ACAA57FE07DD2377BB9A45956D909
+:10672000E3DFCB9C2F914878C25E2C298C7EA1AEF2
+:106730002232F37E3E39A51F0A427AE5172DC7DDC6
+:1067400046147ABB6429A5211FFEF06A7F059E8945
+:106750005ACD2E9861AEA85AA8C7D0CA0395A16495
+:1067600099222B5A6A1D4089C967213D72AC70433A
+:10677000F3BE12A9D2C5AF144E3F60715F3184D50C
+:1067800036A31EC1F3A2C44AC30399F4E8F19EAF35
+:10679000904A530D2D6AEAE3564EF5088827324A8F
+:1067A00084E6A481F9DFFF29DC6F201118FD105069
+:1067B0000F95C10FEBE25FC7E3A7A93F3B2D19E996
+:1067C0001782CB1A6F77270F490C42B4C7FEB14529
+:1067D000906CBEAD95F0832ABB3A83EFFE63E67BF7
+:1067E00064DC3930088DBE212B6741FEA248517C04
+:1067F000DEAF525EC83C6B5E34303A26703DCCA6AC
+:1068000060E0F26E6205A30014E557F93D96ACF125
+:1068100020BDFDBBF173515A9D982C60D0C2201A47
+:10682000D84F04E36A1BEE683E855B9202D367E3B0
+:106830009E2334DBE87E0401DBCB41CCFD84B046F3
+:10684000E7E91D4DBE2CEE7972CDF13193C057773B
+:106850005086BFF4D20A59D319151245B1A68951F1
+:10686000DFD7B4260C7907E2A4D889F29E97E447D3
+:10687000047796731FD959340BB01EAB9576A2EDF1
+:1068800065F90F9A2FBAF6961B4A5B9F572BE7D5EF
+:106890005A77856099DCA9AEFAFF85421040A78E31
+:1068A0007A0FBC5B601CB9A20A1CEF8C5B56BF81DF
+:1068B000A1774375EA317F177080991667DA16E67B
+:1068C000C84D45773160A506D83A688783C6C11997
+:1068D000192F52FC0FFCE6458B805350D9AC15E8BC
+:1068E0000AED8335544701DF5B8EECA31C65A9CE0E
+:1068F000D4E231C7AD568D2718F89653E71CDC0D4E
+:1069000081456BEA6A25D8F9C96750C17A88A71111
+:106910000E8E05768B5F889DE0F8D555155CC0BA64
+:1069200066565EF8ED8E6469348261F03036FC267E
+:106930002C74F1DF286721FA41F45E0CF73944FC2E
+:1069400088EC78A90CEC4368003C82C1BC78A4F2C6
+:10695000F76C04BF3BF2F2E93F092CE8CAE8F00FFC
+:10696000AD76C0B1F5E1B3B23E0C593D8828AB68B5
+:1069700063541383B38E1429D263BB5A7BB5970437
+:106980007DEB6DFB57A1E06AF430C9DB3AE3443E8E
+:10699000981D8931BDDA0CFF8DEDBF8833F3EC8C87
+:1069A0004E563352735C15CA179837657D8B147435
+:1069B000C280D4146CEA7008B1C614F02E6AE921C2
+:1069C00013C002888DFFF6FAB8B552890611E56B3F
+:1069D0000D376F68C5FC29787B2262370536A1D454
+:1069E000524D08EE73518CE04E344D98B60E322065
+:1069F000D898FBD55D91EDCA5B1740CE22016DB1F1
+:106A00000F221F37D2BC368161269A5575664946DA
+:106A10006A4BF2B22A7494204063ADD20C0A8023F0
+:106A2000FD97CD5C76FA45D97B7C01D984E9D521E7
+:106A300065980030E63D5DAD19451F950D99508A6A
+:106A400081D75750298426A1C927F0A1CA1CF897DD
+:106A5000F6591997F95BA75B6B387FC3DBEF33C936
+:106A60005E3B33A7BABADDA1165943FA338D6E5F88
+:106A7000E7DDA2A1A74B24ADA5E136A2F60018CA16
+:106A800072FE838066B3C4A04E51C0EE09707A7660
+:106A90004E2E79A1867FCC23F5E2D3425C707B7BBE
+:106AA000B5CD2D9516046AE1E6FCE8E56F44321B8E
+:106AB00050CD1CE51FE0D8024408E67A8D09E1C1FB
+:106AC000CED44AD76F1D12D1F40C89D55FC2D97FBD
+:106AD0000A474D0FB2C0E3E7C879661B631126244D
+:106AE0005B9F487DB00AF3F0767D1EE4B693FEC549
+:106AF0005EEBF01EFC58F9FD0427275EFF44ADE86D
+:106B00003E7725290595563CA72718FB6D733397CB
+:106B100099123C871F1680CBABAF2E88174EBEF361
+:106B20005853E9B002C7D26F196E7CD3E5B2890F12
+:106B3000877F0FD1581321B1E6E5D0470C5DF5747E
+:106B400030A6C1E26C5B8D4864662ACF8F70D87620
+:106B5000985C23703FC92D8A099B5F1E838047F78D
+:106B60008B7BA862EA6586BF51AF5CCC8F71495EB2
+:106B70003BF2757ED0F22C823DE076465F3D04F715
+:106B800010C0D20CE4AE2D87FA2E04E3D308F149ED
+:106B9000E180EC451D81D893B70A485E47684EDD19
+:106BA000BC6D6D6E60A57692308C44C28B255332DD
+:106BB0008F9E2CFDAEE64C9797AC4FB29374039B1F
+:106BC000D8571752D08A1685334EE65C9CA5E1BE95
+:106BD0000263FB68923D160E47A328ACC2CEBA51A1
+:106BE00034FF096B7253CAA14432C963D798AB2DE5
+:106BF0003CA74233882399A1601B9DCDE62AB4555A
+:106C000026D531421F79268CDB01A6561E75F682E9
+:106C1000A41907989DE2A9C2C3AA380A43858F3AEE
+:106C20000A5267A6D85345C89C9D28ED8B53EA03AA
+:106C3000A23B37DBEF99609B5A35B80A3BEFB0F1C6
+:106C4000C6D69D23A288A282F80136CA36BB49590E
+:106C5000F71D4CF0765F87859F9D5323135AF409E7
+:106C6000425ED1B15AC42ED5B13F527C034E592752
+:106C7000DC6FF848D77BA0BF9204B6A678B57A65DA
+:106C8000ABA358D4ECC0D367AE80E2648A8EBA4C12
+:106C9000C701C1922DBA26FECD4B6547A49534702D
+:106CA0001007A3C24FDDDA86DC4BCBF0CEC70A0A51
+:106CB0009EE143A4506B0C1843D9BE3A0ACA8DF624
+:106CC000526F6B87E343AF8F83AADA59C458B3D2AC
+:106CD00001D8509CD0F9E3F1D86C8280E36496C56A
+:106CE0002040762DF2084CD5035A40644D837462DF
+:106CF000C51C50405504ECE92DD1962ADD71A1FE4A
+:106D00001836F624F97E1AEC12ADCB6B1B91EF6BA3
+:106D1000DE9737A8AF45E2A8A657E6268CB62D85A4
+:106D200024F8322F58340A48B46C9FBBE4676E08CD
+:106D30009CA50620F40A4FD52D3E6872523AB30E38
+:106D4000F249F7FA9E48B67DFDF3E42F05B4D7B8B3
+:106D5000C8A2AAFD23974A3365EEA7E6A98EB8809C
+:106D60001294738D4BFF2165F371471CEB87C6327C
+:106D7000FF09D02DEE7A1AD406C92C1942EF8C2BBC
+:106D8000D561B19F36F508AEC1CB5A84B16C7DC8D0
+:106D90009AC728974A22547EE851F28E97C94BAD84
+:106DA0007D7456B0055AC621B3469B9DC14B73DD19
+:106DB000032F90341D486DB3A180C754970597AA3F
+:106DC000E697FF9003C75434155F108AB637EEFD7F
+:106DD0001BFED2C9F5C2DC7012B956108137AFFB69
+:106DE00094C0CFF95153FE80CC4B23D46AE4B65CF7
+:106DF000F73940797A201E1F6FFD5B87C64DC73C6F
+:106E0000BF51E90072EA61BA63FB90B24AB884C02C
+:106E10005725078C827C3EC1C6D45011BDAB33D3FD
+:106E20000961002A7A5E9093DC92EB8B984B5AC9E9
+:106E300082DD03BE83B7459C636E0DF4229D04E49E
+:106E400000273DCB4C487ACC8BBD788B83770F994C
+:106E50001E69DA297176B7AE06279E554ACA79C9E6
+:106E600083AEEBC9B7C5D11327E4C85395DEA65945
+:106E7000EC927FCAF717EE3D523124369785876E24
+:106E80008F8EB86052F5AA8088C548DF9ABC28F575
+:106E900090D42F9CD2CCFBE339F52B0A351012216C
+:106EA000511048BF53458786889E16CD605154388F
+:106EB000F52A40CB49E10A7B02105FFED70694F524
+:106EC000F613C46E6C4231D9C2C4F129BE6D19B03B
+:106ED000ADA0627BD25AA4953FB9E781BEA706BA9E
+:106EE000B0942AD3492843EC4422BCC3F7C8C695C2
+:106EF0007C48795F8FACED445D520B1C2BFEC9853D
+:106F0000F191696E247CF5F8774135E156B824316A
+:106F100002DE4A6342727B143E679080869CEA449C
+:106F2000ACE406175B2926AA475BCB51A6550BC0DC
+:106F30004B55613087819720D7E04D5866D6DC6A83
+:106F4000BF81EB8E8392CF5D2E27B2918E3F5A2662
+:106F50001B3004AFC601709955B2430EBD496C6F2A
+:106F600092F505ED9173D4D44EF66745CAA250212F
+:106F70006D99E1F1D347A5CE6B856BD7066E9B96D5
+:106F8000499BB2F24019CA70CE0E039D69DE84514E
+:106F9000B6BB032A8B8F534782C34F5A68198CDCC8
+:106FA000433F66A6466EF72C76BC74C95F05520E49
+:106FB0008842B881445DBCD4B197058BCF044A5A4E
+:106FC000BAB513BF22CED96F35C7D456EAFFF5063E
+:106FD000199A6BF06B8D7C9CD5FCECC773F2BA26CA
+:106FE000061D5D53EBC6384E7364F9EA9D25CEB09D
+:106FF0005BDF5BBD4E97B76F2112AFE89E5A0BCA9D
+:10700000AED44291F9C3AFF5696FC27F3218EFBFBA
+:1070100015D15DAA19DA5FA1B3A8BFD589679DE52F
+:10702000F5976E3E3D4049105DBED39623B9FEC133
+:10703000C5C29D0EE463A351F995FFD6922C61134E
+:10704000232B2C3E26FCE0AA71A1AEA645F766CF05
+:10705000ECD0951C0220FB92682328F42669DF758A
+:107060004705EED1E9D2854BB80D578218FB7E2A31
+:1070700092EA6A0E1772D49061F8F4424D9452C9A4
+:107080000441895E673FAFF15B291EC410412E0C9D
+:107090004811E89E774746CDCFF43F9D908FBE695B
+:1070A0002BA46E1BFC348C8D2AA4C0EC50298A487A
+:1070B000C3D1586CE56DBDB6B11BE50DA55F1CBC19
+:1070C000B29AE88ACE546CE3D3F70812FA0F02762C
+:1070D000AFC231BD809F63D90BE07ADC24B1662852
+:1070E00057A0F88ACE3C8683A00576C90CF1DB6FE9
+:1070F000CB8CEB875FED179C87A8C479792C86A78A
+:107100000EF66D5D6CD852B03F733BDCE1B68E88F5
+:10711000E7AB410F2F6A4B0636844EB6C73C5DA3E2
+:107120001F97E6EF0269CE2DF1FD270D4126E3689A
+:10713000C8CFBDD178DFDAB60A05301E2EDCB6FE28
+:10714000B92A4B42208E9918CE12F88245AE41DF03
+:10715000BD314E54485B392E8696852F3DFF9805EC
+:107160000D02DA90DF64DEF9C46A5C83C963EB0167
+:10717000795C06A5F6B799B9E9DBD04A620FBFBAC8
+:1071800092370ACD2DF373E968D405ADA7AF36A4C5
+:10719000B488D59223EFCEC67DAD0F372F56ED8143
+:1071A0000A449CE8A6E410BEB35F52A5F83D2DB694
+:1071B00064F0CACB819E4A08776EE5AF9156357D63
+:1071C000A8759EEA2167EC057C0403485C418FD4D6
+:1071D000F984C7A26A3EFCCC657D035125B1A18725
+:1071E0000011DBD65C372BA378AD851C6C036015D2
+:1071F0009F215FC5CB855D72DF1DE4E8CE92F5F27D
+:10720000D409D6BF29C172DAF80C6755D4D06325EA
+:10721000B6FDF5417121C793D4C777EBEF0239630F
+:107220006F386317B76FBF7F79594D0F3A022B0341
+:1072300064524C51706EBE84D0875163D18A46F936
+:10724000D36D1EAE51931A7EBC0587FE25D3D85B45
+:107250004BBA546B9C28DD3EB3F4E93D2CCED1F8FB
+:10726000BC08FD8112B98257BE3B5D422376921461
+:107270007C5F8479324BAB6C3B7D8ECE16EF748590
+:1072800041A95AD5737C148407500A5DE7AE6700A4
+:10729000579B625C930054BD6805A290AB812A0B9A
+:1072A0001EA7F88EDC75E4EDA2CE9A6A5CD89BDA54
+:1072B0008AE4AEE14BAE17717DD962271B5A78B4D0
+:1072C00029B774E28A9BBE70602E9F67435054EDCD
+:1072D000FF194162D5B38E175B38B87C37158634F9
+:1072E0004FFE2D0D7F407A792A14032CFBC1C97300
+:1072F000B15475315528E3F20269E0D127D6127EE8
+:10730000FFCE244708F72F96E7D4822693CC25CBCF
+:10731000E1F7A324B9618D65231B5C47F6CA0EF81B
+:10732000D43DED7AD898D6E328C4712F1D63C36786
+:107330006B40F0F616F15E38396D3D26C529BD214A
+:1073400087A2F8788064272C41E3CCE091F5EF9B8D
+:10735000802E370C930230358C004E2EE2D6CA2098
+:10736000731984D715015717FFC642E8257B3105ED
+:107370001B626AB154B1A855B49DE7F5E4B463A0AB
+:10738000171C6E0E94DE6057E569B07F4506B0E4C9
+:10739000420669A5FB0BC3A24C2976D2DBF7B234B7
+:1073A0005A5E710242865FA5451E800FC766078040
+:1073B000FFB80E0753480EDBC6D25FEDAAF4593270
+:1073C0007D1395EE0ABB4FEF24184701EB7CB6E81E
+:1073D0004E41F5C95690CC45781745D334213CDA57
+:1073E000DE844D9E25ACE3BD69520150190097081B
+:1073F000065F8E4B200931852759AB19AD2E188AAF
+:1074000059A0E9FB882D2683BCC13653981978848E
+:107410006AEBC8F8194795A8A6D36384FFD8C68F2E
+:107420002CAC2C3AEFA07DEA8539FEDE6FF4000328
+:1074300052E6742582F103A55A6672E86ABDB081EE
+:1074400072D8DC0C1D8CA74F4957333E44F22D6295
+:1074500086DD5A0AE1FE2EE58935610701BF8C7D84
+:1074600025AE28F0E4E11871F4356336F2806C49FA
+:1074700042F69AE387BA6E7D0CCDFBCF0CC97776C6
+:1074800087F7DC9F3441D1C9B49F0E6AE10A6C7D55
+:10749000229B6ACB1B7E598211695AF16EE3DE5D35
+:1074A00044712142269F1C17A36983C738BC5BBB6C
+:1074B000431D5561A706AC4A23D7AC195FED3506CD
+:1074C00039EE454F864AF5F7936E74B37FBE0C4193
+:1074D0000E07E9B9CC6FD4EFE0F08E239DA98EC4DE
+:1074E000B99BB87E67B7D100AC33AE49574540A9C8
+:1074F00002E8BC3400A5F9319D899DBA074C0CB84F
+:10750000329A3CA5D1CD3FA0AA863DE84BBE0822C9
+:107510004625A5C9E660795AA2068080980B2D1CE5
+:10752000629EC1A1434B8942F72E98A7CE89DA11FA
+:107530001A91873E119B27E5383AF542C90650DF7C
+:10754000C803889AD4644C24A3E54937B959F43464
+:107550003CD8E556046CC66012121A9EB48EAFC6B3
+:10756000A98D6144A9F36F5363FB51AFF82BB6C6E5
+:1075700029364652935B353D71DB208A422A79AB2E
+:10758000BF755F3AC1B0747C1FAC0C1DA383083774
+:10759000FEA41B602BEC68737C37F1BF1DE84E0125
+:1075A0003F462ACB57A48A0FD7F36777478E1CF242
+:1075B000587A64FBE8B16246E705898FE3EEF36D24
+:1075C0004A03AE50BAFF2D54651CFDD9CAE8108697
+:1075D000271C8C3686B60A5283A28AF02C8573E566
+:1075E000DF6FAEE866641A330AFF6750A0F2C9ADD8
+:1075F0007DE9D190E1BB8B15B20BB64E764265BBEF
+:10760000F97C255CDEBD5D420C85EB28D1920FF440
+:10761000966F8227034E04BCCC717578AC1E9C1704
+:107620005D5C0C17457D93777D3466ED6D32F6B267
+:107630006FB247921A77E2C6C6C3631166DB0D4785
+:10764000A8662CDBC648B27AAA34DD1CCA24F45BD7
+:107650004FF611C4B579221194CC90388E325CE289
+:107660000B903817DB8B3F5DE01A3A3A4F8DA1BF84
+:10767000BAE00B02737EDC1B5220C5850D0F8741DB
+:107680000943EE450B9E52DE042240405F90BBFA58
+:10769000DC9A56A0A095F7C11836B144555CF28625
+:1076A000E587B3597515E5DA262C47D4D415122E83
+:1076B0009E68858A7002091662E489446A53566896
+:1076C00061A24A9BF7688C96E77AC8E592F62CF39C
+:1076D00099FD4FBCBF04E01642A12431DC06D882DC
+:1076E0006A701CD7C730CD0BB49515825943340549
+:1076F0006C269E10FE5D55D605AF0644960974882B
+:1077000030E303EE3356FC92437FC7F48616219193
+:10771000364EDCAB6B1AB9980F3C2A1C57F23F145B
+:1077200064B050A2F7261CD568ACDC270D00992167
+:1077300050BAE2C38253D0172E95B2CB949C64E921
+:10774000E3CC4B3AB9B3944135827E04E077C83E2E
+:107750009B186579A17BD9A806ACD283167D1EB48F
+:10776000574CCAD7714A6A0754FDBD9127DC18E10E
+:10777000E4E89B6F2C1878267F27A5B85AC5ACD5AE
+:1077800086E066C2C7AF7443D985F7B2A65AAE9DEC
+:10779000EDFD80E72AA385578FD9FC726FFFF39325
+:1077A000C9AE00F178ADF0C2D201B41FDCD4507F75
+:1077B000D13D9835C22B2A2E5886D62F3717C7F1C0
+:1077C000F33579C4DDA3A11E8F63A48AB01AF4EB4C
+:1077D000E40DB6C9A98683BC92610FE103581CC2AF
+:1077E00027D3E870EA218520BAAB17A8DA268328C8
+:1077F0002AB0D395044716F9AE403B20ED8AF295A6
+:10780000A584D452412C367615567CC8E14AA2BDD7
+:107810005EDB1943E4A27539323F3C12FBFBD9E72A
+:1078200025B2D90F00C0AAF181BC508BB0ADF03C9D
+:107830000B3D70F184AAA21A5B4538B2F3561C2D99
+:10784000EBFD9B414C94CE9A56A6599FEF0542986A
+:10785000E06C83A46B8BBF4894AD91AC44390FB6F8
+:1078600030E54291EE13EE4B1A6EE07E62865107D0
+:1078700072E6631F1C9578412EAC8D20D20EEF630B
+:107880003BB95DFBA378518401D2B62CF22E9B3B11
+:10789000B6C8E0CC1E843841B7136234D29B1ED6E2
+:1078A000FB98DA013DD0B4EDCDB3C03ED9F7E6B0D8
+:1078B0008777FC59B5137D8F15D0938BF989967016
+:1078C000C67FE32C71EC0E2B374F418008F6D48D28
+:1078D0005B25399F60F7E041333A6E2F22539CEECF
+:1078E000B453D05CE4EFC6E49E65B7B88130DFC521
+:1078F000F8E42400798BA0C57FAC415AD7F9A5DB09
+:10790000343006C418D6D8224B68E5A44107CF68A6
+:1079100093F20C3FDAEBA99EDC0C09C1FD158849F6
+:10792000709811694F4C1F0D231C25B1B07801C907
+:10793000E5A4852F5AD21CC9AD4DA0AE0AC89A86BF
+:1079400010DF2416897D5200A1E74C188C3F4405B6
+:10795000F216AFEC41BBB1054A729F8BC41FEBFD21
+:10796000F6C09FFF7C660281608DE390C24A93DE81
+:107970000FED5AA3DC4E72DED817D4BED258219731
+:10798000AA6B723E02C622E8D7AC3BD10F5267EA1F
+:10799000FEDF4B7761B58C4000C7FC9BE8DA588D61
+:1079A000AD3BDACA92AB8DF78CACB44F8F4441DE5D
+:1079B000224BB1764077E92AB2B192688A14B3AC0F
+:1079C00000528D7F701BADA7153D5DE82D777E0BB6
+:1079D0003D0D01C9AE9867C524E5C92A1E07A3104D
+:1079E00001108241932EF8F566564F90B6082B9FF2
+:1079F00036AA5F3B175F049BE1F25C6F283D7D1B5D
+:107A0000FE3E940A18B3B3DF93626A8278E10748B6
+:107A10001FB89C743387EB998A7C6D4AEA9F916802
+:107A20007AB80383A19C38985FBBED3247027E632E
+:107A3000CE74393FFEF7AD4163F86C514684197836
+:107A400072A6EE3FB6583D98C5EDCB22EAB1B84ECE
+:107A50004077ECC5CBFEFD4213F47B0264309CB54D
+:107A6000A2A65C4BC362FA3B15AFCD825A7B1DF4D4
+:107A7000DFE19708EA08192485D57467291C70523C
+:107A8000A9507D741B2EDA9DBD268914DD66CF3783
+:107A900006D3130F8076066CAE79D218D6398703D9
+:107AA000AEAE2A54D82C7E587B858ADA7E5E41E3BE
+:107AB00012B5BD08D3736609914EEDF68C8EFD1B91
+:107AC000EEB0182B062FA8FDCA1963C026009C1023
+:107AD0006A09C3DA36A379FBE1B544FC9CAEC0CA9F
+:107AE0009D139F838594A3472A01B2D303C3DC5A15
+:107AF000F28B8BDB2ED95F4171B97949AF528C443F
+:107B0000B466319D8CB9B476DBD9CD268CCAF443EA
+:107B1000ED670EA0ECFBB94DC97BB747A681848EFB
+:107B20007080DBAA7E0DAB9AA4C086F6CDF8BB4769
+:107B3000AF1DFE7A89E58EBFA2E05BDAC35E1588D1
+:107B4000337FEC24A9B879608F3D5546760D2741E7
+:107B5000D03A62169BFED30203245A7987E8E87074
+:107B60007A37CD853B4DA24FEC9E2AF4E5D5330202
+:107B7000D0ACD6313321E2B98B575D6A1A9DE3460A
+:107B8000D2C926F785BA38CF48AE6F30163F0FD628
+:107B90005B715C087ECA29C9ADE531C6C87221AFE8
+:107BA0005106422D7F586CF149668F225DFFEBBB79
+:107BB000CD7D54E557DFF8C5B34A340DCFD5256FD9
+:107BC000C6FFB80D60B661D5D31759E6C0A5DCDA9B
+:107BD00072BFE0CA7FF774D17837F68799BD24FA6F
+:107BE0001A9C3FB0D9CEFF7B121563564DF59CBD54
+:107BF000127BE8F2F74943C2C96EFC1B385B6894FC
+:107C0000641343A57E0942907E23A6D141DB0BDE9F
+:107C1000255F64207F4192F0248CF644D0B182C766
+:107C20005206C8ACA38B968FD080F455CCF7F68B58
+:107C300031263144C92B1ABC164938535C1F8F9C1E
+:107C4000E792F7FC1B1C43E053249AF896413DB69B
+:107C5000E21EDCE58310E3294CBD1FE6C436647DDB
+:107C60009FB3C99FEA1DFDC106CB92381AB0E2D975
+:107C7000BC61F1DCFB2D417556261195718024BC49
+:107C80004C5960D1883192D4549E21207E2BBD90D6
+:107C9000DCCB4A9C4358B85FFD39459B0F2968D817
+:107CA000FB12C65CFE9830C1A4C69B2F5401E8D2DB
+:107CB000507C7FF8CE176DD9CC1FD80556CEF8D89A
+:107CC00094E30AFA86CE55885B0742AC1F9E705A31
+:107CD0004693202B91CE161AC733FC64B6E2C272CB
+:107CE000C35FC6FCD0864BBE9C00F29E2D19019846
+:107CF0007C921ACDF8BFB44F8BAAE34535ACFC8E0D
+:107D00000625F8AE488641E40BB11ABC5E916B7B48
+:107D1000F97C5604A4A8BE6B62890072389ADF7A97
+:107D2000AFC86E82A8B1755FDC70F07B8E1668B745
+:107D3000B42B462BBED003D192A64FFB5F9C3B8257
+:107D400041CEE2D18F237E9C52857B0893354BEF49
+:107D50005EAAB688E56228E79BF68FAFD979F8C3AB
+:107D6000EAB36153B0C8A672313D63EF0B6CE30A0E
+:107D700020508942C7AD53B88FE446CD6E75F8B335
+:107D8000D5917041262D929170A9AB3B260989951A
+:107D9000E1F3585646F80CDCAF526E02D8D14A8750
+:107DA000A3D2D45DD8C569AB1E9DE060C082D1C5A9
+:107DB000CEC861BC4129DF2561E9F39F5FACA6BB5A
+:107DC000345B118CB89B15C048B341FCE884555511
+:107DD0004F2F75008A9FD760EABA679B93C99B5261
+:107DE0002C76538F1C22DF021DDEAAFB2AB6DF2B66
+:107DF000659146C006E2489150D1AD348E7D7CC479
+:107E00008D69496E899469316A41928B1888085945
+:107E10009B1080023E1A6B46A1D468A028191CACA6
+:107E2000780DBF2CB4738CC6A4F4274DA83DB8CDF3
+:107E3000CDEAB33779ABA22B1A8FFE359046927EEE
+:107E4000CEA7D20FA857CC61808CA1E45E3F46D765
+:107E50003AAE1CBAD1A1FF2FCD51CBD59C1DA7C8DE
+:107E60006A5D05BE90B23D2F307BF46CCE867C9A65
+:107E70007D61703281B346684F363EEA8E34E370DE
+:107E80006525D25BDAA7AA7205E3AC56543D65C9F5
+:107E90000B4E3922AE4919492C7A8D2DA0182E4D42
+:107EA0009D5D419EA906495B3EC8F9DE145B759352
+:107EB000271C3AA4854311D6E6EBCFE4147C3F742B
+:107EC000B1DECA5DB8422F0444428A183933AAFD94
+:107ED000DF6FA943C8BAC2E91355FACDA8411C1DEA
+:107EE000F161D1A22455736B5924257A18E697F0D5
+:107EF000A2662C93683761003DB4F3A1EDD12A8CC2
+:107F00002FA26CB2960660345B84B51E185DCEE07D
+:107F1000FE72D01194BE6BDB856507C4C9ABD0D7A8
+:107F200036BB162EAF8C6B41A7B579A983694F7FFD
+:107F3000F9975180876D6FAA84595D1C35CA505CD2
+:107F40004B8D599AE7A88760832B7CD3A8446D6436
+:107F50007CFD4C5B424A1CD614F195A989DBEC44AC
+:107F6000A05E91043B0FABF968C902D833C2297AED
+:107F700087FA29608401FED0891E6330517B601B23
+:107F8000388AB91FD843ED776CB16657BB9547194E
+:107F9000AEAE4C6A0BB8A458BB1E010D025AF58850
+:107FA000AB03C29A1E183B88EC055D350418B4D0AB
+:107FB000EDF7A5210A98C08626529E4E4667D2A0AC
+:107FC000ED5E503A807BCD7EC7C982FC32717F2B3B
+:107FD0000EC21DC32CD889416EC4B92CB0A6CAF8F4
+:107FE000BF20C30B9CD53A26405F186B7A8AB30535
+:107FF0004FD4E973AC5A5DDF30DA75D852AFC8CED2
+:10800000B7251BF2A54FF90750B878566FD9033C36
+:10801000338383A4791F9020A7687D82204445A0E4
+:108020004D003CD85EFF5D64C578B1F7DC04D7CA6B
+:10803000AD5470C52E5F770B4A65A85F423B1C3B71
+:108040007BC2158E5624D5AB341ACC0B1C67364533
+:1080500069343D794FB18FB4863F76168898D68EB5
+:108060000036BC041828ED08404637B8533218B221
+:10807000366A9D547E9CA6CAA3E1D58CBB58AF95A9
+:108080007872D671D7DA619E71B16E914ADA0EF8C4
+:10809000F674133EF76C0146612D94134FA8647972
+:1080A00030E628FD3B4365B8966822C29B315508EF
+:1080B00009CF7ECD02F475ACFA37B2A362212DE070
+:1080C0007A5551E1E691067E2F988E6B507047628B
+:1080D00065BD95C925A78D72F271459038C164556B
+:1080E00012FB32BB1B8113037E13B93CE897E223DA
+:1080F000BF897D614F83EBA84784FB48CE7C3879EC
+:108100000B1CD0195A68A6107B5789C76DB13986E8
+:108110001C49E8EF0780D1C2AA22619491245FA68E
+:1081200028A0056659CB058C01F08F9959A64DB151
+:1081300018FF2F75E22532A5869C8F77BC530C263D
+:10814000DF6F5A1725DA3D0811A5318EE50539088C
+:10815000692374C88BCF7EA96D3A27BA404482B593
+:10816000DF8AFC1987716A6F4FD2EA9C601A443922
+:10817000054D98524CAD377133C061369472337DE2
+:108180001A351ABA34F099B5B308E0C642C5E76E9D
+:108190005622D6CE74DED43C12700A97E000243604
+:1081A0002A6E6ADE79929CC3A6BB367C8BC9FCD54D
+:1081B000E9DA584C6853D28A49E3619CE7EB401FE7
+:1081C000E67876F4F1DF4668343F0E7792914E916F
+:1081D000EB2D2932ED0B982287F7AB25B4B85372FB
+:1081E000E5C4DBED88391D03A97F4A631F3C5C05AC
+:1081F000628916F2602912FFA2C712DA655CDC867A
+:1082000042D0BADA5230B3A82919684E7D1A4E3CD2
+:1082100000D58AB5745E5CBA3AE4F69E6175379C07
+:1082200049C45D337BF1928289EC1B3651FABA4A1C
+:10823000E2032A51020148D918A74859349210B5CF
+:108240009611C6CA0B8487344AD3CB2F88C740E225
+:1082500087566FD131A621CFEA9E2DE7677C6AF25F
+:10826000C904A20B6B026327B080563818F86F78E8
+:1082700014E38C1C18B11517C89BE6BF8A171BDFC7
+:1082800042823421BD95F9CF01B64FF9A775A00BF5
+:108290002D8A5DFA59977828CB9D004E583C3D8C2D
+:1082A000D2B924ED1F6558918AB9BB156AC844E15B
+:1082B000D895B74BEA296E151D0E5EE622D8E1DD92
+:1082C00045E98658FF5A7D766478E5DAEE9F25FD0C
+:1082D00059B33C38F493C5E0B287211E9AC375B5F3
+:1082E000FBDB49E15ADAE94164900F414F9708FE00
+:1082F00087E725923D4E9CCE351BE11B9E40348581
+:10830000DA1496B23A4112E565D2CF53BB90BECE95
+:108310004D26538A14B5A765D94B0ABBEB3464C10B
+:108320003B36447F1AFF54450F5231B07F3DC3DFC7
+:1083300056D6E607E0624F98C5A525C10F8CE4F13B
+:108340005507E572927DDE720CFF88C42643FD89D5
+:1083500065F74EF7DB9CD2E179318CB12DDDE7FD7D
+:108360001203389DE6C64182233035D561E0DF48EF
+:10837000CD3786BF987B0BA8DBE176DB10A599CBC8
+:108380004EDDF282F46C3DD1C74C44AF4CEC9FDB28
+:10839000C968C589FA6B090B8D6A898ACA20883930
+:1083A000042346072908BFEA460EBA567F81477460
+:1083B00024E1947886AA8B954A1258E4B250D17B76
+:1083C000E89A9A023344E9D0966432603AB88E69EA
+:1083D0005A6F83AE0B278352AC23AB65E44246D879
+:1083E000A18E91235765B322179B840FB523D9FA29
+:1083F0000C5E629854ECDEB94FC7BEF49874175601
+:1084000002082F01C4275586CBCDC3842B64470EA9
+:108410000CE969E6A44B548DA427417BE14A74E939
+:108420009C33CACE8431D0B785D3B8E6CC3823C6C6
+:108430000A798BFCF563E77AAEBDF6B0D1132791CC
+:10844000939DD3263BA69AE0C819CCA8A2D4F0EFFE
+:10845000245FE8FDB44F249EE785ACE1AA376703AB
+:10846000541DB8A964CF19F41BF75BB5371F92E20E
+:10847000544F926B5A0301AB7417EB4C201AEE74F5
+:10848000EBAC2786181BF8D5106C10DCA388D7A29C
+:10849000F225AF3633C4FF025BC4312AFCBC6F4601
+:1084A000FFF8AA8B35184B852701083CD887CA5A94
+:1084B000F148849BB83FB6F73922B22123FAF16123
+:1084C000ED7B33E1C369D2C99398B46086225DF431
+:1084D000915D36526F1B2C677B87B14AC118BFE98B
+:1084E00082FCB01E5D7FAC43D57DB228DA2198BEF8
+:1084F000BF8995CD253133349B43F1FEE6E965BF55
+:108500004E63F678E6A1177D198BB2B88859868B31
+:108510001C10E1A59C2775112964CA116804E9C9DA
+:1085200054D48CAD136C2DDA0BE2ECE1B158C80BCE
+:108530005C95D78CA68C3287A80553C00AFA0679B9
+:10854000B27CA5AAE61EA7B101D12E9B7959C3B969
+:108550004D66EEC370D9A51DE1F3A528C4EAB63E69
+:10856000ED8102E4415282116FC145E9CE82519101
+:1085700064CD3AAD7B964279C943F20FEC0CDEDB59
+:10858000545C23EC89A85758E4C117425EDAA798D7
+:10859000A40A3D3F0022FF5DED74E1A712DF243203
+:1085A000402E5159B8C53F7DF2540842CD53111B9E
+:1085B0000E8585F2BE336456A31DEE45792950C45D
+:1085C00082AE690D619C57A3B842D1DD66356E3F1E
+:1085D0005BEEDE93DC3C4A8B7440E0D3FEDE9B9482
+:1085E000EFE72747380EED431E1F238A29495AE932
+:1085F000D36A37D67568C9A859702A659B59B7FCE4
+:1086000059606E0C86F1ADF226ED4EFDC3DF9D7C08
+:1086100018383FC3C4FF398562AD1D842ECF21FCBD
+:1086200092F709D56B36DC6404F1A51FEDF65EDE2A
+:10863000FFD9B26E732A5CCB56DDA74A793CAFF7FF
+:108640004E9D3F8D565198AD9E2397CD5284218EDD
+:10865000E63797D7D8D1780859511C8D38CB0819EF
+:10866000810EB3C9A610ABB9C4DF5658C5A7610BBC
+:108670008FA3FCFD6B6E0E34B9C94375B0871B78B0
+:108680004C981F7D6217DFDCB7CDC534F805333653
+:10869000C20A18E99964BDE4B47DA583A3707BE0A8
+:1086A000DC12F6729C708D1DECB78D5BD10234FF2D
+:1086B0008E0F0402985F336E71DB04DE3F65382451
+:1086C000CAE0DC16FF2A082C1AF5CD86A13861E92C
+:1086D000C3CCA362196379217FAAD39E511997E96C
+:1086E000884523FD455D0415E2CB53E3C2538A99C7
+:1086F00074BFD1D6A919DD3F946B2118D443750EF0
+:10870000AFCE6DDB4B1431B913F9D911310C39D817
+:108710005A19CD2DE34ECEBED5756B244FA6255AE2
+:108720001A381DE952298B841D0A777F6BC1E31724
+:1087300004F5C7C97B3D27982F81E502AE57BC736E
+:10874000BBABDF10E97BA05F24F0315886715C7809
+:10875000B0D720A0A043ECCB2C451BFD5B0034F22E
+:108760006C23504B29E20D97BE5E5B39BFE35ECEB2
+:1087700000B25AF99A8A46829F418B4F12DEA5C8F1
+:10878000342B85E06CF1AC98C2FD3B0FCF75B34E36
+:10879000AF8896EE1DF4E0A9620518E0D0B7473720
+:1087A0009176418906CD57AFBA982DA1A06178A2E4
+:1087B000A0840354CAD111213B9584AC80B406ED4A
+:1087C000A350AA0977DCBD578F5BD3F2CA6A73C482
+:1087D0006FF6C5105B6D4A3189F8D9D1E8D04BE806
+:1087E00010E1150D8A41C5545F7FBB3F386C043AD8
+:1087F000C125830849E6A82F5D3ECBB6FF36F8B405
+:108800002975D27B2DFBDCFFDA3B0E01A59F04EC22
+:108810005C086E4266F6DCD1C16114CB7504F46D60
+:10882000A7DA054E700AF7DA16F3F49F006716818F
+:10883000EABA20DD7E3163CB05571F8040AD1113AE
+:10884000E7936A8790037CFA6FD481FF332F4B083C
+:108850001E4817F60514FB86288A6552985CB83FB7
+:108860006DF25CC544DCD5E913F411569916E24F5C
+:10887000CBFC146D01FF51B058241E725EDEA8516E
+:10888000EC6E5B29A2A1627F042538CB135A420B00
+:108890004FC04A15CCEF4711DB6CE59984F84A1BB1
+:1088A0004FFF8B56A1544D6C94ABC424FF7F43A261
+:1088B0009C82F367294FF2596A5681DBE6F1AD11CC
+:1088C0006FE1B6D391C3DA0C0FE52038D7A7B50C0A
+:1088D000E58EAB32149F33E4693F8C1D6B3EECCECA
+:1088E00026C00DEBBC1BD7CD77B8B179D2E9662B8A
+:1088F000F90DCCF9288A37C44E49121774125A70F0
+:10890000374CBFB18314CFC7FF6A6CFCEA4310EC4D
+:108910003E6D10D28B29EAB31C62A044AFFA4384A7
+:10892000A52F319FACA872D263831A19C9ACB8A71E
+:1089300093E0838AF5936BA74D966A2A119E3D5F5B
+:10894000A0ED68D6F1E713A022B60460AAB66F8C3A
+:108950009C16D042077C2A347CCBB1E1345680553A
+:10896000EF66C54EDFEFE19BCD5B7C99E5588BEB65
+:108970005BD5BC2FD33CE7E4B55407E5EDE7816454
+:1089800028B4CEA2349D3898252EE370AA19481039
+:1089900054D4E1AC39C2E2DD0F65D55503D22B7A50
+:1089A000501EDAC179CEF6B2F06E9BD5743ABFB4E0
+:1089B000E7267B071C8322DD7CACF1433A7F4BBE6C
+:1089C000A13E96A1298C188DA83D4F8B75E0FD1F07
+:1089D00011E9CA15D8BCDD6C4B00FCB35F7991C9B5
+:1089E000D7FC7C82D2464A2253B5C65CFD94342320
+:1089F0008FB5F939EEEB27066F0BD9AA11F233B513
+:108A0000609968ABF12925E55D864E0C4A126AD261
+:108A10007551C5CAF9997EE75571EA0EBE01B65681
+:108A2000CEF3ED29B73FBDF74C546F43B4A60D0DFF
+:108A30001EE08C66DC185B016CF977CFAB43F60166
+:108A400046F87C80D697884F33D06F9B013BE10A74
+:108A500043B16A4E43719DDF8C7DBF0B4DCD2DA080
+:108A60006575EE0B3AB2E1D841506EEEF0B3712F5E
+:108A7000563BC9F30E5E7401878FAF1AA0DA2BDA6A
+:108A8000E0FB8C9FDFBB305077D36FFF0DF3BF4F00
+:108A9000427BE8ACCC4F52B403946ACE116391820E
+:108AA0007B7A98BD2BBDC31156EF32FC1F92CADCF6
+:108AB0008115486AB0C4912AB4B777EEE007788F81
+:108AC000902F19A54786E35FE4B8C07FD3BB28CBBE
+:108AD000D32AA70960D343AE7146CA181AED87E5B9
+:108AE00063D8CC5234791AAEC84464B2A619C154C2
+:108AF000F24EC0A349F87AFE12BE2A24F270DF02B9
+:108B0000CE7D764A5BB797A9634D8B772653588401
+:108B10000FCB66985604EC5F2748C68A14BAF186D4
+:108B20005B70749C6174293C69C84D0E529D8C3BEE
+:108B300011142A92AF0A66060C167CB621E651C5BE
+:108B400061DA96119D9EEBFFAB89BFA4075553C90F
+:108B5000F4C70C2385711257247344683D87DCBC2D
+:108B60003A9079D4C4720FDDCFF3F7677D593C3664
+:108B7000ED39749EE683B3E359727983EC25E9827B
+:108B8000A0E41B76DFB60AE347252B3A13EBE3FF9D
+:108B900010E3075EE1721456AB3FE9AD41C9400CEA
+:108BA000EE4DDB3C62899F24287E278A30EDAC5253
+:108BB0004432C850D18BBB39CFF0E59BC425715DE1
+:108BC00043694430E1279C9DD8E1CC37C33EDCE6C5
+:108BD0000650963E08118472C404B25D35D3D42C7D
+:108BE0005E510815F7AC2FA90D0726A4BFA6091AD8
+:108BF0002A213DFC8E32F5B66EA6E9198D9BA9831C
+:108C00007BC4697E929035303C093B18A73DFDD569
+:108C1000111B2ADD8B3C351E62DA7624442DA977A0
+:108C2000D4A8EC85CFFA23B8D1C1308297D3A4421F
+:108C3000A980A130F9F866EDAC83F5B4CCAC191578
+:108C4000C1211ACB759557353FE7348A388BDA91B5
+:108C5000C25B341656C44DC81165294DADB543DE0F
+:108C60000C42376A7B37BEFDD0F6B69578D7FA2628
+:108C70008B4F807A0C602A429910F84EDBF8206EF8
+:108C800044F47FDDAF5860A9925129E1963F3096B8
+:108C900067FEA40084B46C495B718C2CF1ADC8D61E
+:108CA000754CC6F68CD4CE1B9A2F2A36F4B30855D1
+:108CB000D63AE938AC4932F83921821C56A5A84A7F
+:108CC000507A9318EA6E834764AE8BC9139B7CB1CC
+:108CD000D87E2A0FA2D8642C656D21368667E3F60C
+:108CE00060B974E3EA0DE283001D62E5EA40D777DC
+:108CF00019A2A72641CBCE57693B219AE01686D40C
+:108D0000DC33613006E19F827A234DEBD0EF11E72F
+:108D10007E348F91957CE8DA57BB5F42B3EB449386
+:108D200092719A889D0B3F7DC8DA1A2D320C8AE326
+:108D3000FEB275B284112DE390C6B24F0457B8BA93
+:108D4000BBC4FDCAD8FC6F67A6B0C229CADAA39912
+:108D50000D4C2E53D82BA75953569A64E112C67D59
+:108D6000A8D39B323FCD81AA1094226DE4CF3AED77
+:108D7000D19BCFE8C227B4AA498F97A51F8A0BDEE3
+:108D8000770C360E696AA24B73AB8286B1234339E6
+:108D900051B021E64B92CC43CBCD376C2F9DDD15E6
+:108DA000DCD5A17FD4C13550F455C1EDEE78BB417F
+:108DB000DC7E2B09264285C294C892C2773DE972B7
+:108DC0005F0211DE6A61334280AF37AA7EB8FEB916
+:108DD0003529C764018A23FB6A18713E9B719C7B0D
+:108DE000344AB7AF56CC9A72C84A79CAF4DA7F7A55
+:108DF000A4D325C68C4062B2994BD0627EF7C7AF30
+:108E0000A63E14F7BF18E4A9BD13880116CED351AE
+:108E10002D4987BF2D2557862D25EF935BD43744E9
+:108E2000DF6199C1F37F1036C1D5D20C2D91A88F87
+:108E30001B7671F57EBB659F35F34800FE6AFA5BD1
+:108E4000CBB6582096A77041D53AEF82B8C3B60D7D
+:108E500068313E29BBC3057263443B890E501EEE48
+:108E6000B1FBD2C28797CF4A045531929A562B351F
+:108E7000513BF53283EFA4B5DEC76CD2ABE577ED9D
+:108E80008E985351219BB9E66C2FFE316E31E6F27C
+:108E90005A29052E5B8FF75615E5B10EBF08BBC8E2
+:108EA000E120B5959F738BA6E21D0DB22E76624E22
+:108EB000218761F8BB38B8B7F74E55D9F61026555B
+:108EC000CA58DA1A652B430B7F17FEB81400977542
+:108ED000CEA1E7E30FD159959C0F26A5382DA949BE
+:108EE0007723A036075A6437AD3DA06A2FC7491AC9
+:108EF000C1305E72684E52553675DD3991E4081105
+:108F00008B35B466CFE4446FB4B53A14713245E59D
+:108F1000BD15B329CDF5EC1E1AE1915E956162C5D0
+:108F200055AC97B626504A9CE1C8DCC4A3AAB7FD4D
+:108F3000D62D0B3F9DD00684CEE0CBE4A73228B4DB
+:108F4000DCF5B5F52D5FBAFA65846AA7BABFBF54E0
+:108F5000B5CF2600314EEAFC87715D948F926B2E5F
+:108F6000A87999213284EF24E426AA400C8B526818
+:108F700009C1BEB838FAD1608B90EEE5316232C5D6
+:108F80002BABADC2C7A61AEC46D74C24D279798751
+:108F9000BE5980D5214FB0CBEE35F9D2A2E2F8F31D
+:108FA000685468F39EE0DDF932C6A546F9D6F1E6CD
+:108FB0009BCC6A05460DC56CEFEB818AF8E695DA25
+:108FC000A2FB1101B539C3F521EBCE1EF2762AE0E2
+:108FD0003B86C87F6D73B029B1C61DA71B82B1C582
+:108FE0006C530718A344CFFC8C04E0739428F6E478
+:108FF00015A6A0D40E96E7D4110E1B234F3A1A7073
+:1090000001B3D4B9AB35442BDFDACFFF63BD1177A1
+:10901000BA6ED5F3B60444EC333451F09052556334
+:109020008B4C412126F6C615097BFEFBEB6552B63B
+:109030003A056C6BEE1CABEA278B8CBBA2873C4DD0
+:10904000BE855F1A396385F24D0E266909E4ABDDF2
+:10905000E4519E39F7B044FE6889CF234E5D81CB41
+:10906000FF65735274BF97C65EACFA084E4AEE3D78
+:10907000E0D53E8EF48590B4565AA62C29C50798A3
+:109080002B35510381FDB436C6888D0AB202AF6814
+:10909000D6D3435391E6756457B913CA385714A60B
+:1090A000DA26CF406AB481E9A6115A7D327762F59B
+:1090B00025BBB23AC47AAB573AC3295ECEFBB72D73
+:1090C0009C2BF8C5E4EE3E1A1FB544FDA918E7A78E
+:1090D000722458D5AFEECD0EB3B109A3775F0E5D04
+:1090E000AE983C0E6822E635CD069D24758A815DDA
+:1090F0009A42CFC524BA92C3FB9C59E20FBB0A8F98
+:10910000A86F1AA367816048889A326C648F488E72
+:109110009FED056E32C6BC5DE9A34EF477110AD609
+:10912000DF934B619EE73A734A38F6B71E4B76F5EC
+:1091300043EF2814A990068A2DB5E293770B1F24DC
+:109140009E89EDE32FDD11584F3FE5BB8DB1251012
+:109150005B25B1E6A6DA3EEBA31CFA026E1519FAFE
+:109160009FBE3D79886D9AB513B7B1D73DA76C8086
+:10917000230BCCCAC6C3C9C34D3CB2581A65C4F050
+:1091800048C080E57A1A53190DFE674F5112CF1E61
+:1091900093D2F7DB45E3407A323E21ABEC733049A2
+:1091A000747EFA5AD6C05673FC41F87ED806FBFD91
+:1091B000A4BCFC16076C213C8DF6E12A682CB32E6A
+:1091C0001AFE642D7810CA9135838EAD6C8FF939F3
+:1091D0009FE9F91B2D31C886317B2EFF36FCC4DF99
+:1091E00057D174796F798C5431A13D0C6DAA5F30E1
+:1091F00049EA6BE8BEE4F2A3675ECFE59133321D26
+:109200004A1C567450C95F5B2F036103ED7C46A076
+:10921000664EEB4F70279A07B0D579A7EC36B5E2CA
+:1092200081333B670B3142A029F81FD663EF5C25E1
+:10923000034293DD164543D5DD50E00B608DB56DDF
+:109240003238B2E7F0D070873CE394F81E921CBA33
+:109250000999237DD0A6777D944DBEBD6A670ED94E
+:109260009ADBA281D3A22DAF81ED3D01A2EC939AAE
+:10927000F19065ACDFAF77425D6EE3E57C185AE7AD
+:1092800032B13581E8EDCDD29DD020CCA03D3694D1
+:109290006E564CEAC2E6BB5DAA227D79F597F28F45
+:1092A000FDAD5183196AD3932D8EE7E55AA08EFB4D
+:1092B000619238E1811D4731505092E35ED2B92B63
+:1092C00052EE8A3BF17311A69B8FC3553C26352085
+:1092D00038A38B8ADDDD2A1C0004A7928C0AFB626E
+:1092E000A34E689FBE4E38676A8DAA0133166DC5BE
+:1092F0008C72BE66407EBF8F0AD701EE8F71BA4670
+:1093000013E92AE0D75290452353D991F6353C47CB
+:10931000D0A3D878F969A54CC3CC705902CCCEEF54
+:10932000969ACA5BDFECCD42727E11C7E5FC9D4F79
+:1093300073147A5D767CF5C2A7C34A2C7992645285
+:10934000306E4195C8A842C87453F454A750760AA9
+:10935000F11B4178DF357297566E35C5D18A12DD23
+:10936000FC2C45B350BD27D0C1328D4A2093CDBAD5
+:10937000122FFBC733627EBAE19892FEBDD5B77C4F
+:10938000C34322EB838CA6982620CC2D7ED8E3E81D
+:109390007937207325AA89D4D62A5DEBD644A1C497
+:1093A00021871B467DD0CA2247297DC2D9C0725E63
+:1093B0002F57ECE6BE21C1E3C0A0E6BE5717566C9E
+:1093C000F5273E6E2C8C12A5056F88D9C217204D4B
+:1093D000D7990BF4837AF178135DE02DDC990D4871
+:1093E0000B5888EA4DA9413069F46BCBDD3D6583AC
+:1093F00084DF45EA974A5E9AF8ED4C630113411306
+:1094000022B4B3A3C6378CAF59B5DDAEEEABF7755A
+:109410003AC6BA739E1BF2A3A67F5C23C2999357E8
+:10942000A32F5BC409F118BC5ADC4D8531C51BB4B0
+:1094300068F4AFCD88A1AC1EE9124E72790F7C7230
+:10944000C6C4D6E706D63927F08C26E051EDED7A72
+:10945000271061FB86D7164BD16263EFD637FE60CB
+:10946000730EDB9CF3467FE3273433FA9EE32250EE
+:10947000551C04140BAB25CF2824797772574997D4
+:109480008AA218F661B554BEABB6EE2DA34FCFB18C
+:10949000BAC94C7FFDE88C4B3C343312221A24109D
+:1094A000C6D85011B9E194B3A67E1E35A0C98D87E8
+:1094B000F28978C47B503FD87E7308B59AE5F2F004
+:1094C000ACE79BF1C5B7D6B56FE8766292DCE7965C
+:1094D000F8C88668961409CBE80639543575E3CD8B
+:1094E0000BC43B9C4284CA91A9D66DA41718B6BE82
+:1094F0009CD0DC5755EB9071596631D8BB3DF234A6
+:10950000B310CF7726CB23A94E1D2BADBACD771A3A
+:10951000533862963E809D57C7DE01595198D31C3F
+:10952000C2F3FBEFFEC9CEE6AEEEE2CEF00B1720A3
+:109530007637819413F0935F209BAAFB50E25A0A7E
+:109540001E218BB06B9DBE82FD131FF48649C47132
+:109550003BC430C97B26FADC004D2DB1D06E8DF6B0
+:10956000ECA9706A1365D3ECC8507C4C86783F94A4
+:109570005D0A0254225A003E568BDA0D1A8007B853
+:10958000E2F6C5D14685E80693AFC9A12FAEBDA7C7
+:109590003AB3CE4ECE8342D3943CAF179D9970B46C
+:1095A0005EE73A034FDE3CE24856B24B5A637163C2
+:1095B000454315D33C10EDC51A83C79A0A6BFABE12
+:1095C0004A63003DEA1E42B408D5135C2590A6DF2D
+:1095D000A1139F7679E75A4A3E085DB3DDA5036281
+:1095E000EAD499EF1AE092F5BD66979E5F1FC31308
+:1095F0004247233E75F001325B8DB1334BB14921B7
+:10960000AA50E4D9D42CB1AAFCDFC9CC7A840D8A43
+:10961000D1FC7231296644F6CF6E509BED6BE7ABFF
+:10962000326F80368A34F88C70E0A6BE47FBB4A750
+:10963000F8C9DFD7E1ADCEC23621C4FC4395E42999
+:109640007BC64E55E5198748DB7123E25A414EF936
+:1096500051C255554ADEFDB85D19D0E0C9E1FB267F
+:109660006E6D5CC5C52918E241780EB5753C9364F2
+:10967000AFFC8BA35EC0C9D18AE7C80D5A4E748770
+:109680007931706C747A24BC390E536896F38F9ECE
+:10969000CAE2195D7C3EA3554FE00A48FF3806E157
+:1096A00049663CB7303645E3733D9505F2EEA8D3E5
+:1096B0005B81A66DB0C06AC9A55427C05C64C8436D
+:1096C0000FE82FE9926B08361EEB501A199EFC1812
+:1096D000B4DC3B258548B178AD330EE528387847B2
+:1096E0002F1EE049733C9087E8D652173B688931BA
+:1096F00004B9F173B86B712144DCE07355348615FD
+:10970000137A12A82AF143F4941A9024C7414CDE2C
+:10971000DCE72F50A46352BE7A714727D754C8E9BB
+:10972000C5113E1A6F87CC5E6AFF92200B44E46538
+:109730001639E81C8DEE3612F7E6CF6FCC5B67C8A2
+:109740001B650CC54FDDDA1A68BF25906E383CFCEE
+:1097500097C46E337F73B54E266DF44E1D63010DB5
+:10976000799F5A7025F7CADDA1B253C9E59A528A8A
+:10977000D419077E0B9D71EF562C16E66E5D3E3BAD
+:1097800073CB2E4A92DD49E6F6B503F34036B03589
+:1097900074D0960D1E649B547C009D6CE3D9875653
+:1097A00042485D4D423513C75813497346C561C6DB
+:1097B0004A4CC65C52AE96C175A557538E1AD680D8
+:1097C000C2A58082F76843B1155CF31242B97FCD20
+:1097D000DAA93548E1C318F358D0064030C15B0818
+:1097E00016905F4CC83679085D35BB512A93983F77
+:1097F00087A78101F22630BD862DD94AAB3A8EF774
+:10980000A49313C318B047007740F58C16901AFD47
+:109810000F91A9C86315895A774CC5F556E0E7281A
+:1098200059DFAD0C7D8933B0A63A54C5D098E18B91
+:109830004D4D62D1A837F310745BC6A8640C4CDAA6
+:109840004FE8662327113C21906653F69AF24C7933
+:10985000B993C3BB918950877AB3FF31398F127A9C
+:109860005A0A3E790BC9BEA974C94A9B9A04561676
+:10987000EAC8BBBA28856DDD463885DF3E42A1A720
+:1098800049B638D6F741EF15075F92F63A5A064BBC
+:10989000548236F1064437A7FBA5AE8A9A45267A4C
+:1098A00057956F789305095385B25BE0C79320EB1A
+:1098B000283662CE2F32C8C01B77D403775D4F0A9B
+:1098C0001E5090F3BC3E10B973D07A6FCB273EDCAC
+:1098D000FC60F698762E5A27583459101AF5CB9B0F
+:1098E000F9E07EB99182527708EE0A69BF07C34D4D
+:1098F000EBC6C882A5A228DFA0CA7F3D4D7736E21D
+:10990000C5773DA59D4D309994AE6FF6F8946CF7F0
+:10991000291E1A0A945BCDCE8A82607C9D224671F4
+:1099200051315FA2890465B990DEAD66A9026F3D31
+:109930008AF01A240F8996F55904FB10D28725A6C0
+:1099400046345AFD44DBA7B8F8E8CD8A29DB667FA8
+:10995000BEADA16457CA918900FE947E13EE9F7A32
+:109960002F06B993B4B968C43E84B32BB71D24EA5B
+:109970008608A2DFDE9D775C6364D83E06457DBB2A
+:10998000DA923FA69A2B2F4CAA8551C878F0A8A648
+:10999000774960F7E7BC17832B821A7A70DAFD30BB
+:1099A000F7EF65E201E6E92638BD3BE6BCB1E93DEB
+:1099B0008A4E9A90F7580D864536AE117129319727
+:1099C000E8825CB94772FDCC31024C774BFC5A946B
+:1099D000B29ABDE351AC05BE0C78FB7F4B567E0EB0
+:1099E00043D3A135C1C1B784D9CFC49E4172EBB76F
+:1099F0003AB64427E16B11E4929A55CF96568E2ED3
+:109A0000E6E42DA8966F63FE67F862D3E610FA29A4
+:109A1000485DCB2BAF9FEF5C766457E157284BF541
+:109A2000BEC4A9F303CA4B99D0909BA7804A795131
+:109A3000A87FC57D495A10DCDC6C708B237DD81C57
+:109A40006536F0E9D218F61BF32B8B75CAE7F92BB4
+:109A5000AD8B19F08D2157E856AD41560263FEE7F4
+:109A6000C5138853A872C0CE17ABBA92F70F0E4732
+:109A70005E230C4644AFF66F37609633584601E4D8
+:109A80006A6743B06BBCFF1C26DDA7F4C65B7B2274
+:109A9000217B813C20077ACE3CFD004F162F8FB9E9
+:109AA000EA7C49E6378E5F1BBA11F0D66C7EA5BD05
+:109AB000B34CB1C205CBAE24E43745E7E40D88FBD7
+:109AC000FC85BC2E9CC5627409F79D914335594DA8
+:109AD0000438785B06F561D81C985302828C11EF2C
+:109AE000CF5A7759522C86EF71924D021278E16469
+:109AF00079FA1EDF0F92366337FD48A0B00ED13BD6
+:109B00006301C7D91C0AEA95EBC29BA79FE63DA259
+:109B10004CC9646C2F08C0D527F8E68775967A9BE8
+:109B200015E2A74C2D8D6F3EF60FE83E7FA60A8802
+:109B30007B0B660C99E468BA78878A5DE7860F65C7
+:109B4000F27AE1744333A214CF22639867E444F0BD
+:109B5000E5B53E530AB85921DF83157E90D32D0A0F
+:109B6000E307CB1748E5271A188CD4F44DC4ACF1A1
+:109B7000BD8B31836C4A432C959A6362B5F19BBED1
+:109B8000D6EB0B4EE0B74472E47AEC87854E58C9A9
+:109B900027937D8A7FCB6993DBB6D0E1CAF73C3A45
+:109BA000A007F99B2C08D4F6CC9614B174F828645D
+:109BB0007BCBFA080F0264A41601B54651C6CE6CE1
+:109BC00052784AB85CBE66C1975AFE1EEE91F80BF9
+:109BD0005E12D8BB6EE11FE588B5D542ED1E114C73
+:109BE0003E152C195CD429019B9ACE3591D39951FD
+:109BF00075CEFB6913E6E0271B86B5199D719C7A2B
+:109C0000884DD77EE6E32A70FF3FD15C14B5D4843B
+:109C10001532F4096726BFC6AB470D6F8A49D001DC
+:109C2000FEE5787777523BF23B00CCBAE14B24ADAE
+:109C300032502CD042B74FCC88DD29112230D64487
+:109C4000771F51919485D776A0EB339AD83DE46085
+:109C5000FBA00BF19F924F5B945AFA90F4A36C3BDC
+:109C600029ADC664271362AE105751CE170F2FA12E
+:109C700006D165C0C189948F1622AAB39FE3114B08
+:109C8000F89E250C8DE0CF710BDA358DF83F53B07F
+:109C9000097CC241B7781CE47C15DC553A569B1709
+:109CA000F183DD6B4D220533388E951E02A1C8C8A5
+:109CB00091665AD4E42A93E80711271C3966AFA1AC
+:109CC0003B2C66C757B4A4EACC2A14FD0B557DF78C
+:109CD0000E9E333A8C07E57E33F003494A8BB4730A
+:109CE00082EBA49A767DCBD7D9E3A8AC9BEA2F8BE5
+:109CF00098E2B885C1ED1805D3B0A25B8C854EFA09
+:109D0000BD151F729448A2DB648759A33322204AF1
+:109D1000FCAE9E3E09E454B217E873DB3DA99440C3
+:109D2000EA422BDF7FDD1B40E7FD7B3FFA5C9D8431
+:109D3000331ABF9ECCA5EE518A726EB36ACDD02B7A
+:109D40000B17EDD4E076442223A4C1B1F97F31C6CC
+:109D5000FEAE6850FA6C1230F6F524A204A35DC47E
+:109D6000A88588F2D4B92C11F89A4189D9DCBE3A79
+:109D7000603C786FE4641E85101696CF71B4C9C834
+:109D8000CFE49877ED7677EA1E5E69A8C7FBC488B2
+:109D90002C664D10DDEDB2082D05D77BE40AFEDA06
+:109DA000FBDB86975D522FBE0F11FF839CD49C1066
+:109DB000A9AA9A81F94DB700F925F01CED40EBC036
+:109DC0004512CCEC774C2EEB93DC24F3B982123C99
+:109DD000DF86CE38883934A97B97EE434FC40F55C0
+:109DE000E28BE7A685DFE5A7F07DC73164533E909F
+:109DF0002E94B9B64E7C81BE566EC445AF1473A482
+:109E0000404F8AE6BA2B277ED4187DE279C1889F1D
+:109E1000DC43E6CDE8A66D704324F8635D03038E52
+:109E200000286E05B24C4473852AA3EA457ED6E12C
+:109E3000B8CCFA5122B1C68AE5E7296BD0128DDA87
+:109E400072C12DE296285A84FD44340C36D14DAFB0
+:109E5000BCB90DDA93E5E2432F64E3C4B44DD4E218
+:109E6000EA3DAC504586FB1D4D258CC4F28D8FBE5E
+:109E700050AACA30E17908FBC2531CE1BBD20501EC
+:109E80007D3C62E145830F5448327517F0B32FFDD6
+:109E9000EBEF1A1934B86E0E5D171E86684C26C695
+:109EA000334BC2F9630B53B1C26FBBC72F11FF49CC
+:109EB00092F33F82DF2995F01713F417935151C4A1
+:109EC0003122C94602494B96F271BE83B89A656445
+:109ED000B6497DD9F5407BB1D1BE24CDF33B05E039
+:109EE0004BB0D94F90AF28A19984E39189F18ED9D5
+:109EF0007AF229D41C8F33E29530B815AAD042AB40
+:109F0000E999AD67B5D1CD778E4DBA7E5829B4A702
+:109F1000A37C4C7187A74C55F22FE6A8499B26706D
+:109F20007113DFC44396093F8A568383875FB50F59
+:109F30007E8F6B84FE766F5D260FF6D5073B540F40
+:109F400089998C4EAC78651668B02F54331737EC6E
+:109F5000784FC5FAD0942BCABCF538701B822EF00E
+:109F6000444D1F68EAF427DCA6F49C8C5418D7599A
+:109F7000B59E6F2EAAF5BCD722A9A27B9C034216E0
+:109F8000E5028385BB91DF71B364938650046B3B1C
+:109F9000A5A1F576441B9DF69271EF727AC7BA00BF
+:109FA000FED93BB467508A8133B74C7E047AA389CB
+:109FB0008AE51242114EA511142EE1FA4D41D264E8
+:109FC0005929F2923B81A86BE70CF0C9447CA8E3C5
+:109FD00097625508CE00E81549CAD23B6934D6B617
+:109FE00029E83B734322F6C7015625E049A56FF9DE
+:109FF0000EF5AA06F13EA5D421CF58E4A63F57DBC3
+:10A00000DC38EEF39A16E4BB1E66BFC9719B04F3FD
+:10A010008061DC490B7452BDFD35994EBD7918C184
+:10A02000C386221497D2E1828EF50EA7742A3E4C85
+:10A03000FBE7682935D5F64197669423A8EB4A4596
+:10A040002FC37A17F293BA51F88FEA77E47D715BE8
+:10A05000B5DDECC82B038993943CC4988975E82F2F
+:10A060001EE3D83BAA83F482A63426E29F682732F7
+:10A070005E655FA73A9BF6D1DC7AD61F4C703588B7
+:10A08000933464F9B3F34187125C94CC5978DFB010
+:10A09000912B0743A02E048E2557FEA4A14BECB4B0
+:10A0A00047C41BDF62C614C0878C17C5C924CD0BFB
+:10A0B0005ED4AC85356E9604EDD4625363AFB66C56
+:10A0C0005BD3F826A7D431291D8009BF1169F29E00
+:10A0D0004F6686622E9340D85AC8F555243852648C
+:10A0E00044A87BFB1D1C300A4664272D5F86B4D72D
+:10A0F000707C35FEADF29384261340A8F3C5D1BB26
+:10A100001B1EE794243B8A682A75CA89848706AE99
+:10A11000F395452D5DAEAD6A33FCB45D4A2EF6195C
+:10A120003B068CB8C314CB6388D3ED7FB91525C724
+:10A130004686BEEBC1478327CF1129BD5C576FF41C
+:10A14000279C93C9254EA3D29E27DD6F02AA53F602
+:10A150002BA7BCFA385D7743DFDD59FC9B7D8F3E32
+:10A160008741A7676CFAE21622CB6FB57A1677960D
+:10A17000CF0DA4FCEED0A6F19085B010FAD8C2F7AE
+:10A180008AF4003D03E3C11E54D29E03E9395EE721
+:10A190008FCE2E1EC4B2D94AE0DE8ECE67F0A8B0B4
+:10A1A000339442931AF6949C179595574C0530C1F9
+:10A1B000A41AB97BF163DA6AF1059DBBCED4CA5B00
+:10A1C0007D33DB51F713A77F4D9668DB5FF8766D23
+:10A1D0008D699E85AF0E6958AD8BDA0E2288075FB8
+:10A1E0008F81A701CF8BD73BB4006B681BE96C1A3A
+:10A1F000CD3307D6834C47473C29DF88383934F0C4
+:10A20000F42EB3D6BF10431BA9DD93AD999EF32A5C
+:10A2100073FE01598557B8B4AAC5FB54C1EFA6B95E
+:10A2200084287A85D9783166718064763DC706F4D2
+:10A23000DA10A1E43AF9E9104EDCA58AD353A14320
+:10A240007BE6992EE8C65EAEED00D91A78B3CB80D6
+:10A25000F3866D9422DFFFD40F4F120CDC29D73523
+:10A26000CF6E2AE3323C72D9AEFADF48F831703E45
+:10A2700023B87E9141FA6EDDC6414CBC47B9248DAE
+:10A2800006E94A680963254711EDA4B03A2889CC4C
+:10A290009125A2E63A25709F9CE2F4C539322B0144
+:10A2A0002166910E71A841F9C74052F92B3966FC1D
+:10A2B000BC0F77F3A37F067FD79BB72A2C67B85DC7
+:10A2C0000EC50B0C9CC8AD57CD2B8CFEB0F359B707
+:10A2D000C593D07115B596CAB8BDC94BEA3A47299E
+:10A2E00075B108416D669ADA875AD09BE575B4DE80
+:10A2F000F6B3C22B14000A9462A2A848D643E244E3
+:10A30000D6EE51D8D9D575754B366786FD81243B7D
+:10A3100079AF19AE165AA5AD38E3F55EF639FF0AE6
+:10A3200048FFA18C3D6BDDE88AC837723114D68CAA
+:10A33000EE4D4D891831CE8AC042D18FBA67D419FB
+:10A340000BBE033E324047124FFE7AC8BF4C8E38D8
+:10A35000BAD5FCEE818F5902639A437DCECF2DF1A1
+:10A3600048B2E26B9FD22A09DC62D632418996B9A3
+:10A370009B43324195C011EA98430E69D59C02185F
+:10A38000D679E941FED0DDE08AD4EB1357141821C9
+:10A39000EB3800CBA9186B44E1B67A7206ED954C08
+:10A3A000B7893EAFE2DBAE7B56900DC7E3566945F9
+:10A3B00046908B2E68B308C59617121A6150F14269
+:10A3C000223739E70FDF1205AA45E6303004708CDA
+:10A3D00061B342E5143F97F33010EB2DA140D184D7
+:10A3E00079ECEB24D433149B07FDF83C79DC07DAD5
+:10A3F000253A5573B9D7511570E18EAC00F9C56691
+:10A400004464A2D82D81552DC9D9D36D5F2CC8BC09
+:10A41000151EF8C2B56CF2602170FD9B4B0EB09119
+:10A420003A284394CB980B5D4130073D1A3DB51354
+:10A430006554D0D596251B94BFCDF76C116703BC2E
+:10A44000896F0340C961B27DE82B6FAF2D1901936D
+:10A450004B5F8FDA0B26E159647BDE90991B36390E
+:10A46000AB2B126B092C0FF2957A6FAF8223A6D615
+:10A470001E8C8BACDD55B7A190FADE49DF80F5A2CA
+:10A480002EB2EB831D4A83C82F9D6E99250C38454B
+:10A49000BF12D2C977DE779E45173198D14FAE07EC
+:10A4A000076850771D3BB230AB8DD3B5D4E55C1B4C
+:10A4B0002ADDA2A4064A4ACB0ED0FE4F1D850BE32F
+:10A4C000A94F7ED3AA43B5EF0D0278140DF70A6F9A
+:10A4D0008902C8AC5A0D979C3C3D0B08DEB2E09651
+:10A4E000D518FCE53BA28CF615351AF7DF68B601E6
+:10A4F000C1BDE3E4AC4C0C9BB5461272269334F913
+:10A5000026A435E5B7E1EB2F5C581B34028873C3F2
+:10A51000824198834C1021B74FF9AA68D81E6BDE90
+:10A52000BCA8947A5A725CB4CD2602C097EA82AF76
+:10A53000C83903973B52ADF7BD00D4D3CAE3EDBC95
+:10A540008E6BAF0D5A80AD558AF311652545E657E0
+:10A5500082156A1E282E1106D649F1A8C73484D266
+:10A560008C758D4DAAA48C42DB6B747F54377FC0F1
+:10A570008BC690F2170A9899C463A08FDED44D1E43
+:10A580003C11EBACD8836DB2A4B08C6FB7CD3DDB82
+:10A590002FB3FCB71C4D052CD2730BA51ADB98E426
+:10A5A000E2082663E9D8A31D6244891A296CD20205
+:10A5B0001C7C839D66BAE1A42CCBF2F0CF0DF09DFC
+:10A5C000F01420D3A2E15863BA8BC0770954E31E7C
+:10A5D0009A9D3CD4E7138D4B9BB8398C02D612DE82
+:10A5E000A4B467C6B22576B02CB645F288C96854C3
+:10A5F00047AD355AB3007A2D4CFDE153B88A7EC77A
+:10A6000075FC232C241B7DD6325EFD3E3B6F057A04
+:10A610000DB75EA69BC5AE2245A16FFA96175924C9
+:10A6200055A5501E8B485A6BD75E1C79C3D6124E67
+:10A630002377E678CBF21E670D7CA0F24842D11F4B
+:10A640009DD827B2F45F05BDECC4FD1030C7D7EE2E
+:10A6500028986F9A5BB033669A17CB2D5296AA2D25
+:10A66000F9B0202CD80C7EC5574CB75816E94AFBD8
+:10A67000729DDCA72353E854053F19B702A82E7D2D
+:10A68000A5CDDC7A1859CCF9104B4485367E08925A
+:10A690008AFCE110BB694CDD26E0ED3C37A17AE590
+:10A6A00064BE2BD2C90B316577E3586E114D2F680C
+:10A6B000C1F95B1E21D06CF21AA33EABED8553BCF1
+:10A6C0001396D56D2F6E519BCB931F1599C199F79A
+:10A6D000A20746E41EDFC89CA586B4F682751B0A55
+:10A6E00000B4F21FB87197957916F0F7C674D30BC2
+:10A6F000739D5AEE58F6A957C81055F502FC5055EF
+:10A70000D7D929405E2E7BB33F50B74463D1EFA425
+:10A7100061DC4A6203E3DBEBC090914EE3B95D0874
+:10A720008DDC98239BD7341F6D61942B89F01238F0
+:10A730008E74A256E5AAB139DF7EC2230F6420DFF2
+:10A74000D5325756517EC59E4A1ECB8154E2A696FD
+:10A750003822EB4454FF0CEFDE2B7B30A8EBA042F9
+:10A76000D32564AAAB8ABAB2C9FF38520BAD9E0A90
+:10A77000C4F3073E9AEA7632055B726E65A445BB68
+:10A78000792CE27E6AFD0426A9764E763352B50115
+:10A79000354B34C494A7219DEEABA438C4C6EC2E2F
+:10A7A000214A5EEB56B77A95D40115DBF28B65949E
+:10A7B00099CA8E20060FAD4C7910D4E00F3E5AD1C5
+:10A7C00028F0A54B1524C51AC3A120385B2C16A16F
+:10A7D000809D2E6EF52C924EC924F9B949165AFB6C
+:10A7E000F0CADB00806EF2B1A3BD3B19FBA8E3BC4D
+:10A7F00012C472DD979D34EEED79CD98C2AEB0A053
+:10A80000DBCFF40AE67A16937AC38C852163398507
+:10A81000DF5BAD21DB9A965B661831D08A6DA5AE01
+:10A820006E6F2C83DA600A5D46F3E04D2639A5F0A1
+:10A8300015D17BFEC69E4479465703DACC8B7ABA93
+:10A840001EF2BBD2FFD595225304E7C5A183980021
+:10A8500094E9F2381ABAF84A5CE25476412F2B1187
+:10A8600030B4432222E8C0C4E1AB8683311DE070DE
+:10A87000329910BAA0D35086DC4D9623FCC3897759
+:10A8800015577340F10E611BAC1BEBFCB193649345
+:10A890009DB82AA69DC05817DE80BBFC6B514A911B
+:10A8A00016804A26AC594F8175572BEEEA976AB845
+:10A8B0004E29CA8A556B6671C3D078DFC8E1ECE0D7
+:10A8C000869C7E5D05134EDB4738CACCEB94CFA443
+:10A8D000262972E5E850DFF750647467186A170993
+:10A8E00050A9FB1D7C811979E3C2513A19EB98AE4E
+:10A8F000A6545C843F25F06F0E80485D83F006050A
+:10A90000B693A3538812BA2E86764D08C96CA48DCF
+:10A91000A9075A0AA297856663508F2DF466B2FC88
+:10A92000718ACF8B88B3CB087C94CEA9E6948377C9
+:10A93000CD846651F025E9D7A43121F1BD2F4265C0
+:10A940004BF56BAA08E880CE4562DF23DED198BCC8
+:10A950001A98CB9B120EB404A8986F7A528625AF32
+:10A96000CABD39A8844CC894C187FD07AE7B23D3E8
+:10A97000279E1F8AC200966F016CEBAE71FB4D39AA
+:10A98000BA29A0DDA5AFE0FB15737251AB3A25F2F1
+:10A9900042F0DAC7C98E14BBF16D2E0E6464730ADF
+:10A9A000B7BC53498CBD5B8C112BF084094BEE7FF7
+:10A9B000DCB4940A6BD680B76478E443CC16E0C864
+:10A9C000267C6BF2C2B735D8DAB3EE8BEC5AE123B2
+:10A9D000E4E76A5A49D958E1A8DED23BA6FCE58AE9
+:10A9E0004F47F59B833C0EEE400744312B95B7064D
+:10A9F0000B004A038F3D9F22039AB5325A0A5851E1
+:10AA00008290CB9783EB35B293AA88786CEA14D204
+:10AA1000BDE51D1D4D11B44BDEA01DF0D7D210E5D4
+:10AA2000F839495464C714DE4F252C3C14CBFD057E
+:10AA300074E0BE33AFF49FDA7BA89BF6419225FF0A
+:10AA40001D4C6A15C3E852BA13099B926E492F47F1
+:10AA500054FD1AC3033E908CBA4C9103D2375BF17C
+:10AA6000E4D7BFE711147A604C266CD535AB1AE1F8
+:10AA7000CEFB834C50C87C0B5DEEB2C665C4AC9473
+:10AA8000B2E764A5CFCA54A8ADF865F06FBBB0E1DA
+:10AA9000D3C1D215B3D8228270E35C3C9A1DAB07B8
+:10AAA0005CC4E4E7A39ADEECAE9FDECE9EBA44BF60
+:10AAB000CD0477F007EA36CCDF556B15E69010042D
+:10AAC00008F5A1F4A06274872C9B10FFA9FD8E4CA1
+:10AAD000C145E9942C9D1870777E62BD40B84088CE
+:10AAE000747E2A4BE6551C8CBB7AAC04F66E24C8E7
+:10AAF000998957804BA7EE6DD869993052F70FF9B5
+:10AB000054F8922C5EC228AF707B23002DF165C0F3
+:10AB100007331A800D5C70AA90322EB7680AD7905E
+:10AB2000F0687136201DA77C0F77D908DBEE3E5EFA
+:10AB300032FC8A88ADE8E1E41F4935A9C0477CBFF3
+:10AB4000C94ABB7D18ED3515110C5749877167212E
+:10AB50004071079488F5A8DEDF4E9E21266476B00A
+:10AB6000DF334C543F7655087409D2C44505A14BD8
+:10AB70006CD37CE7ED02B1C94E58FEF59B91CD1028
+:10AB80001747DEF43362479A4F6282EE23AD758A2F
+:10AB900033C00AE8FC7064932D14091847547DD61D
+:10ABA000B444C633BA7E972ABF58C3081093DB015A
+:10ABB000084C82FF8C6F0D0A7E9C4CB8B5850275DF
+:10ABC000B9D08884DDAD3534EB00B8303E07FB6684
+:10ABD0004CB8976D500A40EB22B52D7D85D2DB3203
+:10ABE00049F8920B150824D2D53C2A6DDE50147E0C
+:10ABF000BC70B624396D6CE175CE44BFD266DD0DF4
+:10AC0000A4994680AD8AF2BBA93C7B2D6890A93EF1
+:10AC1000E0DE24CAE3EFDC254CB212A1CE6F821C29
+:10AC2000343EDAED16BA2AF5562A51CBF47B36ECCF
+:10AC3000A7F2A8BE52F4BC3535C792B01C68D38EBB
+:10AC40007BAC149D58447E96489FF9947BFE404906
+:10AC5000E111C7E1277B7A0B0B9555010B4F7ABDAC
+:10AC6000909A81DE8DDAA439D4813F460AAFE81488
+:10AC70000974753F1CCF2EDF007FE11C749EB6184F
+:10AC8000B64C8728FC218AB21184B6B78D59C94CBD
+:10AC90002BAB5DB339A1C91A8E74D06B7DDE9A716E
+:10ACA0008927E84CDC0D15CB9323DA950C82F2074B
+:10ACB0005A78639841140286A760BC1E55D45AEE98
+:10ACC00047D97DC3B67F84557B56004E0AC54CCD0F
+:10ACD0003CF329495F318A4571361F8368AB521CAA
+:10ACE00077D11DE01AD6EC69B0E7C66C94CD7EA38F
+:10ACF0002FF00F6145BC22423F9DD9CC679118C30C
+:10AD0000A7331FD118A96B023BFEEF8CC37115CE80
+:10AD10003CB2C50C00DD73A910B27089B8CAAFFD92
+:10AD2000FB9468C0D5D5D0FDD49ABD63D7FC0B2861
+:10AD300034FC169DB9E3E4E47743F319C9E8091C30
+:10AD40009EF6F021CF20F882BF8EF3DB58B99339FD
+:10AD5000E17CC23966CE96F13EC538ABA456B53813
+:10AD6000FB600ED1608B8B3C7CA2AD13A802CAC2E3
+:10AD7000287149B4AB025C2C21D68BE7441277B022
+:10AD8000EAD2524E3EB6D9BCAC6E8344C350F1A257
+:10AD900029DD8F9CDE6904074F3496736795DA0FBF
+:10ADA0009729CC33B353307BC29D69D87FC950708B
+:10ADB0004C52FBEB93D25F66F0CDF591C7678D21C6
+:10ADC000603656C0EAA5531EE0BFFD8B1153813497
+:10ADD000773D2D873AF326C84D63A11FB85655DE3F
+:10ADE00012B50A0122486B3C675940247E8D866764
+:10ADF000F824B9CB03F84A215EA8F0047F4B1B115D
+:10AE00007137D7752CB3CCEA2A098EDDF2A5758B84
+:10AE10001D309FF1D0A9B966F79895E6AE2C8BAF9F
+:10AE200088FCC2F33475A7D23424BF5183F72E3780
+:10AE30009C65D154465F559CEBD195E1B28936DDD6
+:10AE40005FAABAF58E55E2CDAD9882FA57855ED8E5
+:10AE50006CC565EC4C389E76F4B28DD1E94EE6AB0C
+:10AE60000FA218FA88CB119A1224DDBDBD0FD5DDD3
+:10AE7000AFEAD12F1C25CA8B3F473606554F9DC1DF
+:10AE8000E8150FE1D54865F01DF97A3A08E966B88A
+:10AE9000AC873F0DD33A9E0020C918F4B1A42ED838
+:10AEA000BF0CF3941BED2AD246B595D316070AD5ED
+:10AEB000D8D8D7C8FEED91E49C5046FB771EB187E9
+:10AEC000B5B927B7F50923EDF2ED044515F699EF6D
+:10AED00078FEEAC9D494D018A9189AA75AA5EC0903
+:10AEE00050E67CCD6730819646309D75AB3338FA9D
+:10AEF00068573D26CBADF191ED61F9D48A6CCDC494
+:10AF000081AF32941D4364948954039F5C57649FBE
+:10AF1000182022325C45DCE65D335F230639D89881
+:10AF20003FD72303C7B3C69C6CED49FE74CF1CBE4C
+:10AF300033B797DD519A1E07417B622C73871F3E02
+:10AF4000736F5EDAECB9EBCD7C9DE51A5AB1912BAB
+:10AF5000B0F25324DE1B3AF3D2FFD211D6363C5A5C
+:10AF60004AA126B8007A13AAD4D4726CC18876DCC0
+:10AF700034DBA6BDAE3E637A5CD10FFBF5739E5306
+:10AF800069ED1A413C3E1B50808A5CDE1CFE156850
+:10AF9000A0F883487C1C5DE6678DE0E7BA2856E799
+:10AFA00088951AFCA108316AB0E54A9505AF86BAC2
+:10AFB000445166E41DB85DB0637B767C6B58607C61
+:10AFC000E5E7037DF23558D7BA7BBDB8F5192FC830
+:10AFD000192B8C492027C3D1B1D26E999E1B97EBB8
+:10AFE000BD222664709B86088A648375AB96FCD06C
+:10AFF000F4D346282CD9B2C4AB1115FD29B2974918
+:10B000002DAA131D1D2D500953B7D6EE0472F4C599
+:10B010002D6C85BED7F428303814CC69D114AF71AB
+:10B020009FB69CB0486CF038AC19F81781E8130053
+:10B0300055D8702A15A33C56507826C221B54351E5
+:10B0400032B1133BC69CBDB17D533481C8C3DA1500
+:10B050000B50933446F3641C9A7164F123623F0CE5
+:10B0600026B647D9AFD38660618E96ECF2809BFE00
+:10B070005BD9BBE9E1D96BDF0CFC40F9F51BE6B706
+:10B080003565C9DE8B42CC07C4806DBB294BB10648
+:10B090000FF0412F469F5932B048C796904527027E
+:10B0A000145986725C52C780723F224923BAF993C1
+:10B0B000D9962B8ECE089356D4CAEBEA80D9F38E5C
+:10B0C000DECD8521AD980FDB175F9DB3315684A18E
+:10B0D000BBEAE6296A3319C8C1E3FE093E4E244A99
+:10B0E0007157BC6EC94C71D60D34F4819393A93B52
+:10B0F0002998825C257F10381928F8DA8704D0E572
+:10B1000018171EA535A5BF82D1A3FDC0E810B5ACA8
+:10B11000670FDE8A6D54EA706CAD722A9578F5730C
+:10B120001D733168C78D23E6251B75D657B3238A57
+:10B13000BEB1DC0A756BBF492A2B94C5B80147CE56
+:10B14000C8CB4B456264D64F0C7AAB4FC27170E1ED
+:10B1500049B5E0352A88FE41B678589743C98583BA
+:10B16000BBE6409EBD9BF4A7E402B02B7F5A8EF154
+:10B17000E16A45632F057B016DADF15BD3D9EEE943
+:10B180001EEC93F95D631199A363E18789E35399F9
+:10B1900010449B914CB55897459B20AE39EF16044F
+:10B1A00071493C72136C6E60D4D8FA1922B74B5CAB
+:10B1B000BCA1864AF7B3154A2769A014098F8FE905
+:10B1C0009CF8C36F5E68E8DE52098EAF7244E3AF4D
+:10B1D0007D6951A2BC7E7B30C63889053A3FAD6B94
+:10B1E000ADA6B9F665A873FA9A1E08C7D962020718
+:10B1F00037119112D097AF34EE22EEB58CED146E6C
+:10B20000B6BB003A09C7044C09905ADA639420BBD4
+:10B21000E917501714AC90430B1E3FD9B19868D270
+:10B22000A849FDF56B3FFE19B25A3D08CA2A0EDA4D
+:10B23000A1460835E99AEE9E4AFAD5DF46BA8097CC
+:10B240008CD579A0377BB729B2F15CC7F3E35857A7
+:10B25000C006D1AB72A3899E1BB81CCDDC8FB26D2A
+:10B26000055A13B68666102F2BE3E42AD9B08D3524
+:10B27000AF406D333247E73AC08FE44DDFF68EDEE4
+:10B280002C8FD4D5DF65C17CC421DAB47BAAFF182A
+:10B2900059DD469B9C03AF8312FF355F6640308AC1
+:10B2A000D3D9A2DEC22577AE44F0C485F46606F594
+:10B2B000D6F0057C2B935963B466D9D05B282A5FFE
+:10B2C000695FAEB76CE7DE4ADF9E0451D22A014DBA
+:10B2D0007F0CE99A526D96AD6A0F78B1E901EF1BC8
+:10B2E0008D556DA99C7D066DA63CB9BB662AE0F420
+:10B2F000077B1E22C693249ADBF104C5EA21CFED19
+:10B300002C75393019F756178D592C5202DB86E708
+:10B31000FB919D025B8434C4EA71728E5BD76E69C7
+:10B32000B1FADBD4088AE41A01A08BABFA56E5F037
+:10B330008A1310C9F4B7E4049D68821C0D8515BA00
+:10B3400034DE11F527E5FB25BA4573E453DB866748
+:10B35000DACA4E7908E501A16569A5EDE42AAC5782
+:10B3600054CCA8DB96890D5E8DEB202E9775FD4E93
+:10B37000FE61C21EF01C3D2CA689824C667345F905
+:10B380004467FEA84D120D4A6EB1BE5430363403E8
+:10B39000AB91E322647D261A5900DD2D5326E5BAD0
+:10B3A000F241FB0F55E18D5E6CE3AE849789939873
+:10B3B0008759FBC6F64D06F3ECF5D93E91FE8CDDC0
+:10B3C0007FCFB85E7276E7B1ADF1A3520B08A351FF
+:10B3D000D4A403F01E990A5C1150CB3350C09A8D4F
+:10B3E000ADD6C2AD253B8B9AFEBDC2DFDF6B0577C4
+:10B3F000654653B8C8B46B63A5826AEAF83194ED28
+:10B400003BD55804C41FFC413CEB04050F25ECAFB1
+:10B410003B26E0F8CC42A68EF088C49E81936B4216
+:10B42000E41C35A7B34BFD83A920E3C32F557F61EF
+:10B43000CA0D64170B43996EAF907C22C0BED33FF8
+:10B44000CF81E926D79C3D28084EF8136C5CF81C88
+:10B45000044D6351C32AE98F75FF2F280B9910B64D
+:10B460001441D79163848741CA1C8C2A8A07CAD2A7
+:10B4700029A608EE88D85D5E9BA7020CDFDDAB77BE
+:10B4800078AE6C9988E0CE84C42D2668B3B42AB314
+:10B49000F18F7EC99E63FF2C574F62EDBFE9A6185E
+:10B4A0006F64573F4BFEF8E3BA0CB50F69B6FD6702
+:10B4B00023BC113064C79087FF12AF50884553C535
+:10B4C00091327D68938E6ADBCE5BFA52789C507421
+:10B4D000473EB608FF6038E7BDD3A1343047657DED
+:10B4E0008ABD9802A6670455F007CEC56C86F07D2C
+:10B4F00023C071DB64A796BA16F2BD0863FA7949D6
+:10B50000810B3CF746F61708ADBFF0E019CFADEA66
+:10B51000F5277B208EF8AB64B8BC21D92296713F09
+:10B5200060EAB447F63E367AF971B7B48FEDB910D8
+:10B53000910314299A1722716D4C0F9E841E9D87CA
+:10B540004EBE75BE25D3F9B7338BC72C89E8FCF105
+:10B550000E03D500C106E5B3BADD223E4D2F475F8D
+:10B5600041A1BA15E1A1689AF7D07114A846AEC4FA
+:10B5700054CABF3B85E074536FF7EBF803198A7C1C
+:10B5800022A91D1C8B740B9FFAE3912A84ACC34241
+:10B59000BC0CC87A261CD690E64D098DE7143450B1
+:10B5A00053B2BE2FC3E7F93C90E103C9EE4D63DC13
+:10B5B00002BE80876B6B2C1A4023A0DBC241D94CA2
+:10B5C000BE20D23ED1E65B8667AC5BB1055F22D37D
+:10B5D0005177BA801D0AC6CC15F76622F288EE268E
+:10B5E000C1B7C7BA84B6FBBF3AF2FDB4427DA534F9
+:10B5F000B63F5A977B6DD5A53BF0D43B682CF2AC97
+:10B60000B0D5C5735639874657B3A860CC8CB3FB09
+:10B61000E26DD486A99392D6BD10E790C8B1385F89
+:10B62000FFA51BB92FB44E298C7249CBCC7853534C
+:10B630008C9F714CE16555A35A48A24802915090E5
+:10B6400027F31AE46EFE331F765ECA52BF773604C4
+:10B65000B15018EA98EDD70FEB487B912316AD1542
+:10B6600042E711AD56627DC4EDEEC4963125A4A12A
+:10B67000B4901C8A19794B544EB859784C53428D6A
+:10B68000226BCE297B9247B5ED710EE51EF273B9A0
+:10B69000C03BF84CFDD021AFD4E2679B8E20A37154
+:10B6A000A8C1D005CF66F59E48A123CFD5E23820AA
+:10B6B000584CA318CC4E1B4A2490D6321C10D3E908
+:10B6C000DC38CA1F0FCD61D57FBD60EDA0CA5C0E0E
+:10B6D0005CFDB7D5455E562EC9FC1875B542C1C292
+:10B6E000F9535A1B12C015789D4A2B91F52F8ACD1C
+:10B6F000B13AC27456D1D7B8CE7757EDD2225CE9B1
+:10B7000003538495162B89640043356E31D3DEA034
+:10B7100051030138BA9CE1C3EB59D444050765369F
+:10B72000DA5D35254439495AC9B3BBBD4A1B1D8B67
+:10B73000FCD0F171F5ABA3A3A4F387E0E22D90B4A4
+:10B74000D93D3D0724665C6B3D57F745D63D33E751
+:10B7500058E29BAB3E03C2624E2896DB9289DF9C87
+:10B760007A46983CAEE819D03FA15896E8FE2A9D4B
+:10B7700072E1BCB215C6241337FA58A1B2AF667095
+:10B78000610AB617D6F455B36A8B78ABA2B2589C4F
+:10B79000F0995823643D4E1B2B41B94BFB46A2DE6A
+:10B7A000BFC035BA5E919C1F89A966C24E97D4CAA4
+:10B7B0001ED5000A5CB25F0D212B6B5D134080EA41
+:10B7C00036B0EDF2E9211BE22AA7425C9F98E4A380
+:10B7D000181EA0254D2CC62E17F8D315BAABB59858
+:10B7E000340B967F529C0EBFA22BDA5D197F7E3EF2
+:10B7F000217CBA44B1A44F28BC97B1BEA5F09A8968
+:10B80000C1175352B249789FE6E85721783D8846E0
+:10B81000F6B1E2F28951852251886CB71EF87105A4
+:10B8200061275FE83286601AD260CCECE39D01C2EA
+:10B83000CC532DC3647C9D3860E32FC8F04484C38F
+:10B8400019072FE9633BAAFD8E8B8B3655C2B52BAA
+:10B850008DAC19064CDAC18DA6CF65116AA615AD5F
+:10B860007C5C95F8BF7F03E585949184837BADDE96
+:10B870000A692C7C8983B8F6D3A0C4B2A3DA9CD120
+:10B88000DF3E6BE4AF7F3788957CB5BA586E393DA3
+:10B89000A03FA5BA9A59E11E14A887665B82FE7B79
+:10B8A000CD3325D0C4BF58D6875BB6F92F3A7D4E2D
+:10B8B000AF935622636CB088A46BA02110674786B3
+:10B8C00026F6AD074AB64B6157CB42A857B3A94DF0
+:10B8D0008E13C3031B9A12579DD18A3AE5C5E3BE66
+:10B8E000E0E906C45DF55CC42EE38582FB62BCAA78
+:10B8F00097D270689033CAA7EC4010F33CAC078035
+:10B900009ABF96001528F89F654DEE8D2D4DD69364
+:10B91000ADC696328E570C815302E214CE7E960845
+:10B9200077DFE08C845BEED9CF6678AA7613DDBA38
+:10B930005FB618AADF475A3698B3F2530BA00BF341
+:10B94000DE2B7DB75341BB7C547D68F27D815B4E1D
+:10B95000D8C127DFA8F214B0F7C13FFA4380EC0446
+:10B96000A85ECCCC03C4BA3F03CB2C2C523AC0CB3C
+:10B97000E692B991D6103B78322AE4621C15E6C5EE
+:10B980003ECDAEFE2A89061A93F7992552E585CA5F
+:10B990008B2876CD1A50A9E927B85C0D931A7D76CD
+:10B9A000B49BFE351C131A36F3E1BD2E530E0B4A21
+:10B9B0005F1CF8B6309001D177578EF4A3BB1C21E1
+:10B9C000B0C07EFFED8849454829D40E7FF806A90E
+:10B9D000BE0C94BE2C5C0C55D020E235A7E57B480C
+:10B9E000AAC2BC5DFC225C42D645FC60CB9B8BE2CC
+:10B9F000993A43EEAFF7F7B60F02D86FF41063B47D
+:10BA0000B6908DAFBD4DD4FDE0A04683EC1D3CCF7C
+:10BA100023F254E09B0F0C4AFC9B0ED0A26ABE1589
+:10BA20000750A6621DF95E7D43FADECB08ECBEE34B
+:10BA30002DCC9A0BE6C9E98E4216F05BDE85B0ECA0
+:10BA40003D009564798C537175CA8F0687A67E3048
+:10BA5000EBBB968A41B8FE02BAACF44A59AADBAFF6
+:10BA6000ACB770FB13818BDD03D03E371ABF80F07B
+:10BA70002113783CA5519B2D50DA4A02A6C63D57AA
+:10BA8000D3F46B684BBBD5E3357EF60B7F3FF819DB
+:10BA9000F9AFBD65BF54E31FCA183D57C0FFA7DF0C
+:10BAA000C98BE9E18D99177DC735F23B4F180F1906
+:10BAB00017D6442B0C3D1647B0E68E4FC52FC9D87C
+:10BAC00085242A171DF617F840620CD938C8803330
+:10BAD0000E32F2E5E74D290C3871DD71418427788B
+:10BAE0004ECBBE5458C3DD140BA1D0EF6E06D6A8C2
+:10BAF0002B4DAC946B646504119C9F023B6778F1FD
+:10BB0000962D632D8FA8022D0D938950437777458D
+:10BB10003F18BABE96FAED8DC49908F3381C879188
+:10BB200024B2876CA0DA6CCEB3BD5671823815F2A0
+:10BB3000E73A89C7C46B18BD1880C14A8DF1B5407A
+:10BB4000EFC93EAD6141B113E66767809071C9E10D
+:10BB5000860047492ADF91CBC40015E3E5699AEFD7
+:10BB6000023860E4B86FA37CAFA436BF4CA632E0C5
+:10BB7000F23CE6CF7C05948510B18B8548C7203F09
+:10BB8000F22EA851BF2AEDF5725829CF253909FCAC
+:10BB9000405AB746FE1F0866EC4C8F5ABCC2C663BB
+:10BBA00065C5047856217080E74BB7612475F1A410
+:10BBB00091C9A55EAA64AA1B58B2B54190791C9997
+:10BBC0001B04E03754FD8A6A559AFD1658ED678AC2
+:10BBD0003F2E9C941DF3A6A682C9A61C3B8B5BBC82
+:10BBE000A99B4472C4F560C7B55BB3E4217FF7AD90
+:10BBF000DA41CE407DF11DEA7614E7B6451CF6BC6D
+:10BC000043320CBEA4D49A8FF2FDDE6BB38F1B08B7
+:10BC1000441B9D4DB61E9F3DFA1159FCCF14CF45D4
+:10BC20009F3FC351832AAD72C8B6D42D725AA33B2D
+:10BC3000256BBE5836FD557A828F40FC9527D0C3C0
+:10BC40002F51C9958FA2DE6AE887B60E581DEE08FF
+:10BC500045D3696566CB638A1CA5044A9D352A973E
+:10BC6000225ABD651631DCD4FC15D07E62D2C6895D
+:10BC70001029E140D32E34431809CAD38851FE1E3F
+:10BC800022D55F3F1C2F6AD79757E555707913402F
+:10BC9000EF8386FA73686D8DDDC24811D75BA8B655
+:10BCA000F8D6800D7B44111D3FD9646D15FCD04C36
+:10BCB00099D9D612156C92E27CF7F04D4913119E7A
+:10BCC000B745DD5361CB00A89428D3A8BBA08CD581
+:10BCD0004FAC70CCEE1C9B7B47BA4224E6265A6CD4
+:10BCE00083A8F1500B6D15F4EE7E2CBA26E5D338FF
+:10BCF0005E5E7B4E00C3E06E39592118015EF26131
+:10BD000033B7E22C64148834BBB41C88ECFD1A30C1
+:10BD1000601600912635628E1627C825959A080D63
+:10BD20003CEA5EA5CB01F7F2A55C6AB3B37BD51DF7
+:10BD300046E11496C31AE4BAA13790197B9ED6FE49
+:10BD400012E09633AD5BE05EEA209ABC165B0258C7
+:10BD500091CC1F57118F488BDEC933C38D90BAF930
+:10BD6000ACC11199DEBBA4C5AA3623016458678B08
+:10BD7000931B3CB0EBB0A8EB9677049B42308DEB65
+:10BD800015F727D3AFD7CFC8529F2ABF14E63F3D40
+:10BD9000E529A4AFC473BBD05EB400EFE195D75BD7
+:10BDA0000E52ECFF7DEE40D5D392668FE95A5B14BC
+:10BDB00058B207F363765DF6FF2454C1E75F975CE2
+:10BDC0005AF3671BE4BF4269385EA6E5E627DC4804
+:10BDD0007FEC6AE5A3668B0CFD973889F24197BD2D
+:10BDE000A477AE016D486D68FF1DC9EDBCAB2A5943
+:10BDF0000490728A6662B9E30DD70C455088D9EC7D
+:10BE000028170C407C60C3E3798558481ED7E33B74
+:10BE10007E36C1F8590225AE9CB6A2CFC3BEB3DDB3
+:10BE20004F4D3A56192AE02EBF788A7518C51A89DF
+:10BE3000D3C7EA3EEB74A442191212BB8657BEC7A1
+:10BE40000DB6EA3CD781F014760366FF86705ED2A9
+:10BE500005AAEB5C07E41D94DC8028B1443CE9E0D2
+:10BE600075ACB3EAFE22D30C3CBDBD56ED4F456325
+:10BE7000C0B40B908E304C965654169379914E5216
+:10BE8000847FEB09CE1B1451F9F422643BE0E11DE1
+:10BE9000934FE01D32DE4A95D8CC2D8F256B71EA89
+:10BEA000C1B2548B67D6B21D2DE32E3A5A0EEB6504
+:10BEB0001D3484F2283DD22D6117EEA1B09511708A
+:10BEC000399B72E5135E088F7712C97CBDC1C93AF0
+:10BED000DDACCD2CFB4AAF4F9CBA84B7EEABBDAA0C
+:10BEE000402926B328D1995F8E8ECFBDA4F67AC1A2
+:10BEF00013DC6274E3E82D800E3AE642E190970687
+:10BF0000156CB14AAF0E171B8D6371EA27ABCA5689
+:10BF10004F67F8603FEE05045A78C510B9540CDB42
+:10BF20005A363B714926901D5F0F94DB6AECBD7752
+:10BF30001E22D46385D09B2A4E61D5663A65EEEF0A
+:10BF40001ED7798AECBBB793E52FF600455ABF7F21
+:10BF500047DCE00D8B4C22CF838E5D5704929921F4
+:10BF6000EBBD49B013C7F61D0FFB48AD97816C0EB2
+:10BF70004D0E7CE5A62A1C7D85476E0C9D92262BD6
+:10BF8000D7D29F013EFD78AC0937E99A0664078352
+:10BF90000DF6585EE5E099AB503EB2F9EAEEA1A588
+:10BFA0009E1DF0C89D6657A9DDC902CD71B3CD268F
+:10BFB000ECEAB1B12D7D227566A3A7DF5B23AF3814
+:10BFC00038937064D9105F376823F4DA77291BF54A
+:10BFD000F000E5677F0B70B58C72D7097B3E129C31
+:10BFE0000526E2FC274AB8EEBC653CFD49B408B022
+:10BFF00036F6467D34FC74E7DBDCABB97574E2B829
+:10C00000394852FCFF35F0AFB4C6E88EE9DDF019CF
+:10C010009D63631173420A78F34A37E042C5AEF478
+:10C020002AFCBFD98AFF2D3F2E481DB8C887B5AB63
+:10C030002C8F998DFC731BADA8F49B95F9508E1D28
+:10C040000CFC6B9A042EDBB86B53587AFC368FBA13
+:10C05000D7B859BC1BED4D36C887C3B43111862201
+:10C0600080510C5654EB786DF99825E15CE7CEE3EE
+:10C070005098A2D32394E1F6DE26D63BC3371E8424
+:10C080008838B6C9AAF278DAD7B9EF98243E53E1D6
+:10C09000331BEE17747FC9A214C77D119FF643515D
+:10C0A000B06EF8EEABC354692E9ED2C4B115717D4B
+:10C0B0008CC5D9A08BD7199AAE9F46217B481CFF0F
+:10C0C00022B8908FF3A0E4BCB609734BE09742EF1F
+:10C0D0005DB0F9068275A246722816E86784F323DC
+:10C0E00010E8D84A0FE626C924909CAC0C60BA31FF
+:10C0F00029367E715FA3E9C0C83319469ABC336400
+:10C100000BF2F01BA24279F6CD4D0C8CFCE5CB6D09
+:10C110009861427D2E347947A81D9D978C8AF51E23
+:10C12000DD1A4E8359570E569CFCCEF5C68F2482DD
+:10C130002AC6AB26F2090ED07A70D8F1BBA97DA62B
+:10C14000FD2BFA74E17321684D10AE5244EEB12319
+:10C15000194B8ACA4B2CBD5FC4EE0BC3EC28C7E356
+:10C1600046ED2ED97FA2BF15BB430480BDC1627FBF
+:10C17000B72EBF2FB40B36C807F1B2A3AF4A1FF1D9
+:10C1800012BA459C177317B359C98B2B05888D0EAE
+:10C19000952B95E1911941018B42B34D97637984B9
+:10C1A0004A9131D5B88B1B9C790AA0CDD52ECFE909
+:10C1B000A8721004F00712744B958B1398B0967107
+:10C1C000BA5E707A301969F7A24DA4C167017E7416
+:10C1D00095FB751232B01CA9ED8ACDCAFAF7955FAE
+:10C1E0004486985325A32EB46A4ACF242D5200A426
+:10C1F000B967A59B58EB8EA2A7FD8EC397295A4914
+:10C20000FAE7603D9EBD02AB91188B9F8056E8FA1D
+:10C210003505EB37C96808CF9E5DB5541C1B5DF32F
+:10C220004B1375786F665C54A6E80A3A2D18458A58
+:10C230001A779669BF160CB3DD4F32DCAC702D8DCA
+:10C24000D5D8CE172CBD023C4085B04077D0702C9D
+:10C25000275BA60223E900969812D27D4B523BC57C
+:10C26000A6D59C99679B02390333DC6A8EABD9391A
+:10C27000A4EBDE140B2443D956241E752FAE7F8306
+:10C2800048666147C984CF558F83ECD5FB6EADF00E
+:10C2900090B88FBF98D31F5A5E7055520120D3A219
+:10C2A000B468D870B7C9F65AD2C3B46B543F4B06C2
+:10C2B000399DA7FD3B076624BA5FECD1B9C73AD7D1
+:10C2C0003CE7E4FEB91B06591CAC2185514DE40C3A
+:10C2D000015CF8758331039E8B2642EFDF0284F107
+:10C2E000B2FCE9981DA5AF4029C0FB45157F7844F5
+:10C2F000911264F58F1C145F6862D40811218B6D54
+:10C30000376DD46230AD834C86FA96005574813017
+:10C31000AE17F940B68C1EC6CBB5EF34EFEB58BC68
+:10C3200049A8B484023560A789656FE22448549215
+:10C330001216CD017F60BADE5E6CDD28D89C4DA060
+:10C3400019C077752222E5875EBC1AD32198680F41
+:10C35000E363D79CFE3F5258C5D740FA980DB7A06B
+:10C360009653021078EAA75972F7F3972B8C552A47
+:10C37000ED3639F999438E59C801277EA9152F2921
+:10C380003C8F17914CDA6D9695FF668CB700F49D43
+:10C39000C1DA0E9F490925CCF87FC782194F726414
+:10C3A000464D0F3664BF020C128D56B5602493D9EA
+:10C3B00034E62996C93AC09CBB24F36A8A81710984
+:10C3C00022EE7CEDE60334B0AA6295DA8E14723761
+:10C3D0003F2E2B9526D8B61F2656D95F991F5B880E
+:10C3E00087C2E03E90B9797A9E577589ED860A53E7
+:10C3F000FD000DCB7F85799BF745027F538D36502D
+:10C40000C324A498F78E5F86C2DBF0AFC3C3E67384
+:10C41000CE39CB29E8F5ECAB1CBA1258A937E3A604
+:10C42000F34ACF920C952C47A501DA6415C11AF98D
+:10C43000CB5AEBB00217ACD8C0EC8902EF254BF811
+:10C440001A004E284C8BC0E9BF6D99EBC0F121E07A
+:10C4500027B141AB6BD28BEDB57BA2E22E2C1F52E4
+:10C46000F3837F8D40C1F8125A0C11FE3064ABB4D7
+:10C4700029C85ECA116E46F20876FD3D7C702DD546
+:10C48000B391F8A66C3E1C21A55E7B91EF0397BA91
+:10C4900093EE5C618CF30F8D52A3CB3867710D76F0
+:10C4A00022A496A73F9FC430AC536286950BCE2F33
+:10C4B000DB246B743B0DE262398574D83280284EE0
+:10C4C000F6BF60688D1CD22F2088205E383388BD6F
+:10C4D0000F742A9214312F04B79F7B1F00F26CB7A0
+:10C4E000C1495C2E13FAC74D0BBBDE084DC710DFE8
+:10C4F00006F6627E9FFD573216BEC92ADF3A4FC04C
+:10C50000695215E4561AC79AC5FDFA694491E59B2C
+:10C510008E4847B58829506C69CB6FAC6DF7934056
+:10C5200053E61B0C3CD175FE828E5DBB9E5D3FF1D8
+:10C53000C2E86D10B4FF74DFEB410309B4C427C730
+:10C540006D4D817902DD2D60F99D9B14BEBF8B3747
+:10C5500064FE9147EF5B45F3F732A03057687819D6
+:10C56000C65C17E5E3B4D5275DAA7193DC0712E634
+:10C570001A0A8DCB9D5B00CA2DD9DE36EC66D577C5
+:10C58000B5A8D930698BC83638608CD7FAF7CEF2A7
+:10C590007B63B36411B62FA30DD78E651ED2D6DD93
+:10C5A000FC5BB78812DC21FA24BD317B34299C7DE9
+:10C5B000B5242D51F61021769C08E925A75BC92CDE
+:10C5C000363535257CA52962B43A9B0F12F17826C1
+:10C5D0000C81A92940B31BE7850F292CBEB26E55EB
+:10C5E00070DF23F850766537747B7CE1032DD8A289
+:10C5F000088E0E5C83AAF7DD25A3CDEC54A2D80EDD
+:10C600008BF3B57B90FC02EDE71F2E73B0313273D4
+:10C61000E3D2AD467664A1E9E7860EFD4F3D85A9DC
+:10C620006B1976B6127C6DB97F528F8EB551C443AB
+:10C63000E15A69DB688592E81BA4DB749060C21C38
+:10C64000AEB8B4B11FDB6EBC96AB7BEB8590E00758
+:10C65000A7075EBFCA1EC82546B30E7EC5DDED9D89
+:10C660000BBD9E760199BBFF228E74B95DB12B087C
+:10C670003F1157E31BDDD430AF31C2849D6267C5E3
+:10C68000F0B276B0A63148CD010716E162903F992D
+:10C690005B3DF86EB241B0798B429CC1E87BCE1213
+:10C6A0008C14E9F139DAACBA1278B9C107E59E0207
+:10C6B00034B5D5FDF5969CFD49265DCED1AF098EEA
+:10C6C0002E633B7D50A541CD942A0FE3E8FBE5DEC8
+:10C6D0009F653A1AB41DCD3FFA9A38B6D84444C281
+:10C6E0005EA2EB30C57518C59A340F41C760331789
+:10C6F000281041DC8CE9EC03EAF4E8206956A8B67E
+:10C7000055654FAF552DA023DD1622A715BA8C22F3
+:10C71000BF39B72D04AD86B14BCF2D5EDF06F8775C
+:10C72000975BE45FC51EC5929C850978D090A743AE
+:10C73000EECD13708CE1E7652E7DEDFC2056028175
+:10C740001F425D94C28FB53EC2C554D1D78F5AA146
+:10C75000A3EE636FCCD6CB0C1D0641F02F34B1A5F0
+:10C76000FB5E53EC9185DBE57BF70D5ADB534AF515
+:10C7700081DA67C0BFFEE7172BC4895643909FE557
+:10C78000471B7A2DD644EBD303EB7F0B0BB6533507
+:10C79000FD06EEE558170ACDBC41CC4E5D3A43F09C
+:10C7A000E21A9145532A6E43435AC48DC067CA9614
+:10C7B000998D68EC8381A2427DDD44A50EBB236385
+:10C7C0002B101AB10364E7FF1C4D924C6515151F21
+:10C7D00015DA025DB1FEECD8FB26EE25B6CDA3B886
+:10C7E00074EE5D5FE30718927D2F881127437F5E0B
+:10C7F00057F62B1EAFB77A33A74151BC9FDF29BE36
+:10C800007E174D7AA10FE7246B3DB26A5DB8901F89
+:10C810003C1C842174B1B4897ACD0C03570CE441DB
+:10C8200036D25B89829D66C0BD81F8C3937269254B
+:10C830009BFF6C7F9078421940742C278E6900B959
+:10C840004531F4012525F7B0E85D87E8703C5EF4DA
+:10C85000F087E9CB54CAC6361F647482DCE289ECE7
+:10C86000FFAA4AAC4E4E84C9022C4A65279DA8D324
+:10C870002DC4B2E74DB1D5FF3E8BE4B974678C4C43
+:10C8800087C534B9EB5E7758305288BC0A86C987B1
+:10C89000E843DBCD9BA538313EAD321E40E29946E0
+:10C8A0007E562E51E75E666F348FA2D4B0DF3BA573
+:10C8B000AAF942FAD2C79362A6481C1ABD1E40606C
+:10C8C000ABE625CE173DF1B7372B976D5F7C81B175
+:10C8D000149C5C90126D9424C7E46B619787415B54
+:10C8E000963ECCB81D3BCAF776B3D76D518ECA15AC
+:10C8F0003AC1B1AC1FF680EE6D3965E77AB2625786
+:10C90000870CB58DCA2243EF24D55E7EEBA23E5B39
+:10C9100031529C139F11FC9F2EEA7AD6EEE4C01888
+:10C920005099AC046EB0B8DF220C61C1FA9E460784
+:10C93000477139B4A3EF2057BB9C335ED0A4553761
+:10C940004C04DF54B035652A44A08434881F884ED7
+:10C95000AABA80A4A5EB1D79A794FE6CDA2B3FEE52
+:10C9600051DA70C2F2EC7AF9918B1EB5B59F0BF0DB
+:10C97000F3578653C09F07CAF59B659C021F0F9A09
+:10C98000417B896E0001F1133F212297A57C088924
+:10C990008197E96D9B2D7933853142FB1D67902985
+:10C9A0005E1494D61BF28E8D58F06128EC8D6FB812
+:10C9B0004DA2884537D337BF490E74CE5EDFF14CA8
+:10C9C000735C9E9683363C23FD6B891AEF08C10782
+:10C9D000ED021FB7C55630B682F47292D0DB7F6E7F
+:10C9E0008E8A11FA1CC71480E82D44CF16F0B4C605
+:10C9F000BCE6D675EC39F5D4F38CE9599CBC0BBE7A
+:10CA0000E7EAB200E238E0CDF86D78AE29DBFBC191
+:10CA10006BDA21F60F1F9A508564B372899EF13646
+:10CA2000D4252B1E29D4E0AAAA8A52A4B460A2BE9F
+:10CA3000CBF99F2679CE470EDA43E1903EB138E438
+:10CA40003563587B2F967E38F484B85B88674D3009
+:10CA50000FD230B98C51C940EDD9932BA841A647CC
+:10CA6000658019EF5520941017C761D387334D485F
+:10CA7000BEB417F608635E129032EB79B3C5E7BA1D
+:10CA80007DD8787F3D975A93C0984E319B3A26FCCB
+:10CA90005EA21FBE8E83A4FFA282CF811457590AC3
+:10CAA000D511B680BB93498FCD9FA3595EEC42143C
+:10CAB000CF853A92E4AE7A2309C4C3798D0EC7B10B
+:10CAC00042F93DF689C2D4DFCBAAA7B3227C7660B7
+:10CAD000549A172296819EC4D46D527D7D2F26C212
+:10CAE000800098A333C4CE40067D711F611114B835
+:10CAF0008A9BA246394B1382F1060A9D74D9636C56
+:10CB000075B0D05A8131591E471C8971FE1874279F
+:10CB1000094DA553C66D48802F1DA78CA734278FBC
+:10CB20007708BCBF411D6BE39FC20ABAF05BB1B18D
+:10CB3000B242DC9A8CE24128FD26CC99C5C662B887
+:10CB4000C97E7FB192CFC07254720EFDCEC92FAC98
+:10CB5000BE6E4B8DD4FD381156645BEFB5D83CCC1E
+:10CB600076E0462F87BA1D3B84A016042DB8084EE8
+:10CB70001CA8FF9B8B139D761E2CC8B9DD810C89E8
+:10CB80008F6888D8CAA517F5033B6A5280FB947258
+:10CB9000FADF9C5BDBA5D622D2E592E395C3CAA55A
+:10CBA0000E2C84773C3C1AEEE20924BE6C99A9F65F
+:10CBB000F7ACCA740F8630888162E89E9EE4C16734
+:10CBC000B9199F71CA9A4CAC903AA7FEEAB85B9B20
+:10CBD00041ED23E7856EBD1DA6D7ADA246F099B005
+:10CBE000DE2FDBC5B124802E763033331B233B1E72
+:10CBF0005B78B2E97F104FFBAA5C4B6B339B78A646
+:10CC000041ACA4BDC0DE5921127DA0D80F574A3EC9
+:10CC10004B7AA543A3002E69E616A7D527EF241467
+:10CC20003CCDA02D302392D0D376A1846534EE99EB
+:10CC30003480B26BF3E4C41497E0EC4AE77ED9A7E2
+:10CC40000AB91EAA7FE788A4FF5FD42831F0C1D3B8
+:10CC500074FFEAAAFA4BF6F8C497D79ED9ACB44150
+:10CC60002D15ABA4E969A474E50CFB7F22CFF0710C
+:10CC70003B489A283CD5FF4CAD7E28734DF0B597C4
+:10CC8000DF092453551BDB0A2918F6635F210F4384
+:10CC900014021EDE532366914E9872F2E335E8C00B
+:10CCA0006F65EA1FD6AFF1BA69A2831DA6F62B7F86
+:10CCB000B562F0306183F244535464AE6D06A3F75D
+:10CCC000B772307B7FB1DB884F86DC275B22ABE01D
+:10CCD000F15B2A52DD63695253A903C4E3080707D5
+:10CCE000BEB64FA7D4AA39EDE84AD3F597AD56C0E2
+:10CCF0002833070A024A367D41267F8E03F41F7FC0
+:10CD0000B304552A1ADA84C31EF15C813586417C4E
+:10CD1000514AD089B03237756DF7BCAC91A86BBC65
+:10CD20004B195048784E199E577AE48D80AD12FC0D
+:10CD300026B363FEC0C6F66320CD6967BE7E6B81F5
+:10CD4000B58D0C86B93A108ADA913C687DDB70DCCF
+:10CD50005C1B9483BF4B616C2BE1C555186944DDA6
+:10CD6000F67E3AF1CE80F0D3BF415411387DE529EB
+:10CD70009E5AC6274EED8CF2CC4BF5C56D1408A11A
+:10CD80002AAD3846D966CBFBD9FBC4D9539C268F34
+:10CD90009C9F4235629E6320F921205A9370D21ADB
+:10CDA0002200F96D6F8BCE7CF1851EBD48370F5B7D
+:10CDB00029E937AB500552E14773BD2EDF985698ED
+:10CDC000DA97ED57DC2758B50B899984A5ED276CC8
+:10CDD000666BC3E64B27D9735010F26C90D3027088
+:10CDE000F23FB87CE0E9F635D0D6D0B0189C37DCFD
+:10CDF000627417E01F7684CB3FC2421D49D412C132
+:10CE0000C54C2C9A65D1A6CD9E0883CF200B313E10
+:10CE100091EFA115B3969E37EDBC5841FF06779F61
+:10CE20006A23BB3A13722D4B127519E317D3987707
+:10CE3000EFA79789F86282E2302ABD908F7D721544
+:10CE4000698EECE40B741CEF0A5DCDAD66FC5225D7
+:10CE5000953D9ACDBB5F438933A46C99F5C4328369
+:10CE60003CDB2D90E87A01D5E1E043AE3FB92ED30B
+:10CE7000515989A0611E61AE26EDC1F3173B461DD5
+:10CE80007DD8AB55846F858E8073EA338ECCC465B4
+:10CE9000D6437C77A8DA4A1C5C955B06674A60E655
+:10CEA000FFD1092DDA3FF139F4304EAF7E6E81BAF1
+:10CEB0001AED6B74467CFE53E17F500671A6E18E3D
+:10CEC00015110A12C017E4C67D6616FB774D89BEA0
+:10CED000F1867EF4BA48C270234FEAA654840D63EB
+:10CEE0005A635C4F372E2F3411F85F9F5FB8525F43
+:10CEF000F0BD3BD9F38C39CD91C106A875B4856DD1
+:10CF0000E688C13EE4A81203F60B9824F30F0656F8
+:10CF1000797AC64257D2AD3A7D961442CB0588B194
+:10CF20004CBA382933FF35F5926D4D0EAAF20CB28A
+:10CF300002943265A3365C75F6AEEF611F773BC095
+:10CF40002ED2DDADB77A789CC7EB255267DEB13BB8
+:10CF5000D27A354ED640DDD75E59662F0DF69297C0
+:10CF60002204A5BD0E9EB6784E7CD08F3DB08AA31C
+:10CF70009B08BC075B7D5DF2BD71C00AD0E9B116AC
+:10CF800092B99F4CE767B01F194D40EBC16D421C31
+:10CF900073E522515D9C1F3C1465B341B05DA49BB9
+:10CFA00040DC1FC118142AE008C884CA308437DE68
+:10CFB00050A0F126BC51BF86E69DC555E31B6934E0
+:10CFC000B32EA941062390D1D827B2572843FB4757
+:10CFD00014E9A1022500371F7D51B4569A37F897FE
+:10CFE000463C2740FA4E8FE6C753B13474A0879170
+:10CFF0009BFD4C8F3B54D292E618F344DA067DD168
+:10D00000EE42C8784B96DC90A723019D41FC6ACF85
+:10D0100008855B2DFBE4D4ED89795C773D8A4B6311
+:10D02000D2BB22440884C0080DE078ACE4C94F4567
+:10D03000D240002F90E87D9EBAC3963433865A3191
+:10D040000B8FE5CD301C626CD19EA41C2A65035E5B
+:10D0500052607142C451321AA25FD085915793F049
+:10D0600032C596474215A56AB410B6A1A9597249AE
+:10D07000CDE27F156272644AD7E48C3A3F06B2D69D
+:10D08000E9E6FB8CF72507FA2CEC2DBAF98F1F0E79
+:10D090003BB0C411B38F37D99DC9014DEB182F5345
+:10D0A000C715E5C3083887FD7653E0D68D7100D2E9
+:10D0B00046FBC6B0F46962E1918D103F3C61D9A195
+:10D0C000F6810A15756FCF3CD047B82C81DBEAA1F9
+:10D0D0001968BC939DD0F17FA8CCF8B6100B04441E
+:10D0E0009645B924CE73CDB00E6ABCA51FBCEFFF28
+:10D0F0004C91D5E67078C3846C6E5D33E1B72A98A5
+:10D10000E27B2AD9D72CA208F4C16E2867E61870F2
+:10D1100033E71B8838B94AA9403F8E6EDAC2C07225
+:10D12000FB6FAFC02192C0975B44BF8C53103B088C
+:10D130002E26EE7F9E635246DED4F8A88B387C3ACA
+:10D140006992BC4477346310F8234AC44A5DFE45B3
+:10D15000BDCB800E8603E0A0A7C32CF26D6AAD5B49
+:10D1600019F44C30B70B08E72A8809141DC07EABB0
+:10D1700086D24EA3EEE9BF842A05D961F3C06B9B2A
+:10D18000D406CAF45C26C47C1687F0CCEAFA70BCDC
+:10D19000D21A8EDCFD3CA7DB56F405D1485A1C3B65
+:10D1A000B3746D52427702C2AD1EFAB5F997C4123C
+:10D1B000D99BDE09D746D0280A04563BEC14CBC4D1
+:10D1C000D1AEDBA471DEE322E9151A6088A4D73C56
+:10D1D000E281FE4F267DE60CA18E874BA40724EC4E
+:10D1E000AA9120F7CFB94AC1AE5A569EEA0FCEF3A4
+:10D1F0002EC005C5EA87025E2C32A21D9A93F8BAAA
+:10D200007B353129CA9958C6E2168E12901E12A893
+:10D21000332D61940130B5B75A07328957D89E1023
+:10D220007E068D93DF5B600718174702D06AE0CE59
+:10D2300002048BFDD95CAE15380EBD16B46764953B
+:10D24000ED87C9DC9D2E2DC2AB3AD3E7723BC348B4
+:10D25000D2DE3A2E2BE27A5EEFA4049E437A1BEBD9
+:10D26000D0A54418119E4B3C4E125E27A55EE4C229
+:10D27000267B34274BFFED70C9387EB40EC6DA73B7
+:10D2800098059BF2CEE69941AE8A525AA391027359
+:10D29000C33CB2B0EE8D943E51F7ECAAD99B79AA6B
+:10D2A00045FE6BC2952766838755A216B935B73DF3
+:10D2B000A9A47771B57C5BB274929B5ED091580F34
+:10D2C00027FB579983C21C5AB26E5F13CCF4F03916
+:10D2D000DA07D047CF7D645C07CCEA037B9D8F29BA
+:10D2E000C81F3557EF2A838ED3CEBD2D9EB2A749D6
+:10D2F0008DE15B8E173632E3BE6FF98A51A5BE49C8
+:10D300008762C18FCC8015096479BC1FEDB3234BB4
+:10D31000F17333445D8B84A89F29E0D6C00CC2789A
+:10D32000F76972C36D668139C478529AF499E80E30
+:10D33000D8F2B8B03E099B07242E97E66ECBB08397
+:10D34000054B7DFF0D10F38850A334E3A91DBC3DB0
+:10D35000E027BB10471FD14097DB0C359A4CF6A253
+:10D36000E9B780FF9DFF44DC250CD4A0612D6AB88D
+:10D3700075FC4E7012C5D5F1FD635F5B3B4A9E574D
+:10D38000D1A4C641EBE9520B0154E875BB43604F91
+:10D39000EA4734085906D14812D57E63066D241237
+:10D3A00006CFEA7570E14DC337AFE59EDCCBAE2109
+:10D3B000D9D630455525971BF4B4719CB4EA3DACE1
+:10D3C0008D25E7EB6610EC10E14CFF3A5607816AB9
+:10D3D000507D4DD5977C1A31E53EE2A2DADB301361
+:10D3E0005697A190170828F54CEB040AC2254F0464
+:10D3F0009EF7D09080A9287E9A9C35A5D3E2D63F8F
+:10D400001A07B2465E5D61B98C9E4386061480BAE7
+:10D410009EC34249299860A2F6154C93BEFEA5C64C
+:10D42000557A802265BC19D1F4D14ED8B8031CC4FA
+:10D430007EC39540AA1FE273D093CF1E96E006CE1E
+:10D440003CAD0DFC0CD99B5F51462F78DCD5F4E840
+:10D45000FF52902037889B1124295B07FBF590F73A
+:10D46000DF31A26D70662822CECE857549A6D5F52E
+:10D47000F5CA78DC22204B8C93A27B133ACC808AAD
+:10D480005BD5A2057718924240B6B9E2DC3707F1C6
+:10D4900066427669D27AD245879972C5304A96EB50
+:10D4A0003DDC80B3AE7C0137D399473DEAECF860B0
+:10D4B0003BA7AEEE13B780B73610C09E948F24B151
+:10D4C000048F256CBE3BC12917E69F71AB542756CC
+:10D4D0008CB7B273B2C1F797B50A776E227EE4902B
+:10D4E000127CD0109993CADC3FE86A42B1C4324C36
+:10D4F0005474182C47A3BD8379D136C58215493D94
+:10D50000D7625CC5B7DF5E3996E192324F2792A7AA
+:10D51000ADF960ABDDF88CEB8816DF3F027BD57B85
+:10D52000B893C81788D50D39590BA779A565880711
+:10D53000C5356AB9743116E7C15EBEEA5A621C9BF2
+:10D5400027513EA2430E7CB1E7E4B1742552B99253
+:10D55000B37ED737290F3470C7945DD0B022FD4E0B
+:10D56000156E38408A10BD02E1B91796CD9D96C858
+:10D57000C55DA2A4B54CE65BD3DB08E09F6A742CC2
+:10D58000D56DB67D9C9F94C433633C6F67B44005F2
+:10D59000C1DE38BA33928DC80FD161C23B424A72A4
+:10D5A00090760D743931D2A2A745DEB3EF8A493B9C
+:10D5B00000FD64F098E23C14AF69D25AA0C93490DF
+:10D5C000417FD360E700C9F52FDEA50AFC4FC2E911
+:10D5D000F2E96A9F33E0ACF103B733D95349F04124
+:10D5E000F62266050648B595F795AB18D2699C7486
+:10D5F000A441D631AF15ED9946848C0DDAF7D01DD4
+:10D60000441EF3BFDC943CFFE36C8FCE2B6BFC38E5
+:10D610001C66FEF79AB8B76879C0137B1AF35B34BF
+:10D620000F789BABE4186D4728739ACE01A4C3DC36
+:10D630008C1B2E7C1DC2CC2BAAAAF23DFC0E61369F
+:10D6400096E4AA0476E4DEE07580D6C320CA3EEEF6
+:10D6500078BC0C34A89080E384584B1342815A6202
+:10D66000429A213D005192A3515ACC09868EECCFAB
+:10D67000E5853AD6A037B5A2D52C9116FB114FDE21
+:10D680004169D8A09A2319B735F1767B795E3B03BF
+:10D69000FF3EBBF087C4D3FDDB15804DCAC7D74C16
+:10D6A00003F495B052C97385687EF38AB75EED6660
+:10D6B0009CC8A9D4E459A52316A3C970D024E73780
+:10D6C000C00D3C2DBD2BB79C879292B7E94246E234
+:10D6D000091E20CA579E95BEBA9C77F5D4D4F5EDA5
+:10D6E000AF4585E7B4A2D4C4F25FC8915A97241815
+:10D6F0002E782DAF049A93568A9871218E0E0FAF13
+:10D700002F1EE943B72450E7092566899E44F4BEDD
+:10D710006202D0DDF28D1B2B5E186954D054A0E458
+:10D720005D5A86DBC90C1397B57857EEB9BAA5DCFC
+:10D73000CE77B0D81914325D739A3565BA06827007
+:10D740005DAC7260755F6EC3F29B2251EDE45A01CD
+:10D75000257E00C6D7BFE73D1CF877931A3B87F7B5
+:10D760002455178A847082C53E1A66E0095DFB6CF9
+:10D770009B37442449FD9BC5259A4EE7C01BA5A4B1
+:10D78000E012B2BF9905C7952FB8B7DE89298BDFA4
+:10D79000A91E15D86895D89D913A71D6C1FFFEABE8
+:10D7A00055E6C1C111585E969DE6333A8C1629A7FD
+:10D7B000B2E58EA33128AA5A4118435CB2EDB328D2
+:10D7C00028C64D3ADCBD21E8EFFA1FFB2DCFF9E763
+:10D7D000E4D82DB6D33DBDF040C0AD5D42E54CDC94
+:10D7E00042E95BF08EA324E2BCDD378832041DB031
+:10D7F00026958AB127192A47B6B529F1FC354F1766
+:10D800000405F9BF07678EABF944986FB5414A61CB
+:10D810004F01F8D4ABAAFBC06858A4143EA28050B4
+:10D8200086AF42650FB15AF19614C9E998CE6D786A
+:10D83000D75C5D76D1BC85CD581E4FC2C9AD3E794F
+:10D84000997E4A4862AB4338F8B602EFC9BD2F0D46
+:10D8500055801F4F760817875D5FBF230EAA61545E
+:10D8600022B1754F39393A26C1E17A3752C1164F84
+:10D8700089300C254D7922872CBC1BA0303A471CDF
+:10D88000BA60ACDF0BDFC4C1B303544164205C5AFF
+:10D890007E011698EB499698CE16FBD7492CD5B049
+:10D8A000A9D39DBE62012D8AE54E65844D68C2DD17
+:10D8B000CA3C787180D2E1038D733157B3528336FD
+:10D8C00069D3EA283F39FD20C01D2596573E759C37
+:10D8D000910EF0D16ECF894AF1CCA976C2C7539987
+:10D8E00038589D3690A7C13C2D4CF642024EA81FD9
+:10D8F000F7010D31FD5EEDD6C4F8FB2A56EC263A51
+:10D90000FA1665BC67EE9FC5EC547F81D3AF343106
+:10D91000DA5E519CBF772A31C993888CFBCCD24206
+:10D920005654C9CB973B4E4CD912BE53F97F231A9C
+:10D93000BCA5E83C289D83A4EDA109A5D966118A60
+:10D94000A696418C24E98CC7597E5F5211F872FF6C
+:10D95000DBCFA537AF176B44046A2E3CFCED932355
+:10D960008D905BACF30BE5453634B6A58DA53FEF46
+:10D970000D1AB5A5C8075410405E1DADF060EB9FB1
+:10D9800033BD5D1827744E84EFB1B848E38071CC85
+:10D9900095956BD24CD159BC73472CF58076C39AC0
+:10D9A0009854E8797CF141B4C6E2F61F1FA3AA4A55
+:10D9B000C0C88949AE6EC835A3B4BBD2E013DC0140
+:10D9C000CCCEA7A763F639A3A0E1C765CEC8CAEB42
+:10D9D000011D165F4F071DD67EFA82B9F4F8FAFAD8
+:10D9E00051215AFD1431C0421635711DB9927AEF9A
+:10D9F0000D1AFBF5DC137B66B5B197C97063CF05D3
+:10DA00006E61364455AF08F49A3049BD791367C842
+:10DA1000FCAFA920A5781EF03A4C37ECC4EA995126
+:10DA2000ECBD9EE774ACEE0B6D97382C5134C6C23A
+:10DA300031EBB12BE9243C64E17C2E743473CAF5DC
+:10DA40001B9ECF33B5C2C60537A7DEC0B162FEDA72
+:10DA50002B0FCC1886F78CCFBB339947305C55051C
+:10DA6000C1152798C9CE7E51FF422EF0EF6BAAD781
+:10DA7000E1403BE2D8F95E016009523DA5AB90213F
+:10DA8000E6EBD1154C805FC52A9D57DEE5EEC0C69A
+:10DA90005A7498634D1B0EB6028115F0D25EE4A055
+:10DAA000BC1FD5EA43E7C64F55E11199081E10B5D2
+:10DAB000412EAA0CE52A21F5746955DDB133F84AE7
+:10DAC00059AFB45E060287BD8E73EE03EF72756DBB
+:10DAD000DDB1162836BC2B9F5E5B6050D8364360A4
+:10DAE00070CCD6AE335F3C24C5970417DB29901C5D
+:10DAF00081C50128CF6012A8F1C044E1496F62AC32
+:10DB0000DA91EDA35CF2639877CF4A5C3B8A136E9F
+:10DB10003EA907503630808C78476D669245445D4B
+:10DB2000262D283FE7F90B158327C7DB0CC09E2C59
+:10DB30002E25F6D12571896A42E1639FDC27100CFE
+:10DB4000994EA3B54D243FF8B4626CAED19130F23A
+:10DB5000288957E34E637B3C3F64589000E087BEC2
+:10DB60009F153B66D1BEDAD1E0E179872B65D6619E
+:10DB7000B65E061BA78710067F00BF6090358546FE
+:10DB8000F147B7CDF0C08DAA64E0861899702736AA
+:10DB9000668BE564A97FB729EB332C13791F538576
+:10DBA000E0543B0BFE7E66A52189EF3B4B4A7DE2AC
+:10DBB000BB01294C56B4ACD8984B49B372E209FA70
+:10DBC000FF73A49A2475D3669528F1948A38636EFE
+:10DBD0006F7EB5DB2C01A4BAB5D6B0D01D799318F1
+:10DBE000D1DA5C95D82BCB239AFC222282FBEA4027
+:10DBF0008D7CE3EFF9A1C7BF0BBAC6E0D4ECE627F2
+:10DC0000C5DD3ACE71686D38F7B63BA246C37737AB
+:10DC1000911A4BC0DCFD504275F1D402B7858224C5
+:10DC20001AC41E337B55F618978B82EAB621A5BE1F
+:10DC30002AB62C6EAC91783816280746BE96DB368D
+:10DC4000BBC9E2333AB60B6CF9DB173FCB0B4A701A
+:10DC500072602E097448072F405654A46618D73DA9
+:10DC60000ED9FC071012AB979CD4C5A02FA47EE957
+:10DC70006DDD875B042ECAD096D309668188F84C87
+:10DC8000EF5E99F7A90CE464BBC19B382AED21CD66
+:10DC90003F7CD81042EEF8E6BC0DAFE6365248AAFB
+:10DCA000969B5195292E001A5C09815C4CC19B15ED
+:10DCB000134C03226404223C90A8F886DD2C3273B6
+:10DCC000FE01FF20931889F28241F190A8F09BA4F5
+:10DCD000E896F77F138188405D14BF4511094D2CEC
+:10DCE0008D6F89E5A561D0FCE5A8CEEB9DEC0EE536
+:10DCF000C87EC45B9A8058FB1835E01368D3C5DA38
+:10DD00008027CA490E435E78605AF081496DF4C895
+:10DD1000E0333D7E6920721AF8D42E9B6AA1CEAA08
+:10DD2000707CBD5BE5C4EDBB641FF4CC752C2BB6D9
+:10DD3000E51B7F530FA5EDDCF2687E2A44302FA44B
+:10DD400057AB5086FDB7E5DD6040ABB6873BFB5275
+:10DD500036A2F1C063981C99BAD55C4165CA77FABE
+:10DD60009949E40D957EC81EF28FC4B63491ED93A7
+:10DD7000CD1D2169D722C56783BEF35A66A5219CB4
+:10DD800004D80A8572E0DFCB0D371705BFEC864952
+:10DD90009949E06FC6D91C80A94F41DA2732345F18
+:10DDA000C22AB0C7B872386566574D56001AE0EA05
+:10DDB000307CA29270FF06878BB086FD3671D8E565
+:10DDC000BDD3360D7D96F9D394F7FAEE2EEE1621DB
+:10DDD0004B3E868303138CF7BE51DE960775A5A5CF
+:10DDE000F629A7A07E3BF66D73A7CCF9EF425DC084
+:10DDF0006BED0E19E1B764E4045DE978158414ADA8
+:10DE0000B748B596A9CB957DAEFF5D053C2E3EBFCC
+:10DE1000566C64B94C38255C1F682A4E0BB1EE96DF
+:10DE2000B52805CD3054C58BBE31A6C1EB8656FB57
+:10DE300026006A906AD709FE9D3EE0C1B95F72D99B
+:10DE4000756747F01225D80D3F032B2045A51F44C9
+:10DE5000AEA6EBEF579EAEF80BEE3E855409B652D8
+:10DE6000E7F375E185BB4C001B6FC93D5D6DDEB20C
+:10DE7000DD04B81D342C23AE8D2FA88DF68E36B45C
+:10DE8000879CA23961B3A8912B23812E8FCC90CE91
+:10DE9000CF9513BC8D976964D6A14007CF528A995C
+:10DEA0009DEFC2678879D1F91DE39396D17B6E43CC
+:10DEB0006661978C7EFE4F83E4DE8736E0FBA8BF69
+:10DEC000C07BD2571D8827599A29C92C227B26FD51
+:10DED000B6DE1F11BA8F9B17F0323DF1CA985DEC88
+:10DEE0009C4CC177E6D6083A3D4FCAC6176127B0A9
+:10DEF0002139F78503DCE963BF7858D6925854235B
+:10DF00001C63B725F55BDE081ABFEF2EC3897EE7D9
+:10DF1000B7B16C67348049B022FD7CB1CC87F27B0D
+:10DF2000A020A7715508326B0DFBAF640712AB67D9
+:10DF3000FAFDD1B5A2D194F6B55FE090F0F0662578
+:10DF400049D3023E04315119CC5C5AFE1F35783C4E
+:10DF500011BA7D6FCF91D8C1E0AABC48AACD07EA1B
+:10DF60003D74D6EC00EE9D6D6342110CDE61F8A0AD
+:10DF700090315966158B866FAEE2B25E8DE8695FAF
+:10DF8000ACDD72E2446CCE2C144729D367E5AA2499
+:10DF9000644572A1B353E296130249D5F39D095427
+:10DFA0007546049885090C5CA4D8B7E3EA58ABBB66
+:10DFB0009C5D3B3D537C436FACB2B8D36DBBF975F0
+:10DFC000AE347AEC03C052AF80B72531ADF973049B
+:10DFD0005DC4F6046F493833F528CDCED22B17AE89
+:10DFE00041BC886E365F7A50E7428BB0B2C5BC4800
+:10DFF000A8D53B6C437D6CC3889461C643352C87A0
+:10E000002FC92E3461C582508752EA75FA0D5034FB
+:10E01000B7D74E29C863B6FD5CB64AF0A39CFF7B18
+:10E02000E6180FD03111E0CB470AFD740CDD84A651
+:10E0300004905C12D93DEB08127547296F40383DBA
+:10E040000E23C657897D993019FDAAACA5F9A77E84
+:10E05000BB79D1DC0D476D6318EC50835E989EA2AE
+:10E060004B1361150EA825A09D0B8D2F73705C7E40
+:10E070001DB9B6AAC71FC681B5C1EC1760B374BD80
+:10E0800016886D64CB7D0E101807BDAD997BC32536
+:10E09000D0B9966C95A4CAD898F72AFAA0F0FB4795
+:10E0A000DEDD0FBE343E40DD12686DF17B32B427F9
+:10E0B000B7366A1A39B06E2B732B9495D1BA1949B9
+:10E0C000CE2D975BC4F9188A054E0ACDE18CA001CC
+:10E0D000438618FFB0BD6EFAC5563CBDF508BC00BE
+:10E0E0002CF6330D95C15CC9E008298EFFCEE556AC
+:10E0F000BCAAAE5A62C6635DC943EEA13A0808DD08
+:10E10000F01AD74E3CB803E451911B2100F45BF3A5
+:10E11000ED08EA55AFE1CFDBD8004CCD73FAC6323B
+:10E120006E186299A3F2B639C3797BB1792B8570E9
+:10E13000E881FE5DD0EA8560D8B116C9DECA967A5C
+:10E1400086415BE8C994B2B36EBBF2758C7A7FB33B
+:10E150000AD6E3D250919540EFE773A59B998C1CAA
+:10E16000E74CD2DC0F9E6B418A4E873FBA5FDEE1FF
+:10E17000BC14072890FA289410459EA20A4671887C
+:10E18000F050285BCFE4C71F22039E7F90D6342433
+:10E19000F3CAC94F79825DD472D03E879898DB2C40
+:10E1A000ECD2E3A9990D51652DCD1F8248C8F19697
+:10E1B000A55F0352C91AB2E88A4E56649CB6244A37
+:10E1C000E0805722E14EE7729DED9B97731ADDFFC9
+:10E1D000DE92BF537712C9BDA72C449E186AFD2456
+:10E1E000667BB8D18EA283B6C874AD2E2EC078419E
+:10E1F000EC8398979B6B90ED319EFB8BF9D5A7B282
+:10E20000F31369033010B7FAA868C40248424E30CD
+:10E21000BC101EF2358A44AF27B28E656E3712BC31
+:10E22000B5F4AE6362E80A48AC3DCEBD60D66BA8DB
+:10E2300044900085F396A3B1805E6E966D64FEF205
+:10E24000E4C22A4548434EFC075A97C5141A323097
+:10E25000ED0538AECE1E9E06EADC7BD19193940587
+:10E260005469F474BD121ECE52409F046F7B7E6CC5
+:10E27000CA36A304F42AA1F53C4A329713020C28AB
+:10E280003480C53A6FFEFED676C5A9AA6C0B67F23C
+:10E290007CC2C2011009C73B4DB537BC73148F80D7
+:10E2A000BAAE54784CE42A317814562C68B44553ED
+:10E2B000707B12361FA247C07CAD7506CBBC39AD52
+:10E2C0006FCB37B2F5CB85A16C2479B206E5E47D3E
+:10E2D000F7F7CFF96FA439BDD5DB5FCDF09FE4DE52
+:10E2E00002CCA706CF7387F29653CC9CAE24DF7581
+:10E2F000F62C2A3A6E067CF252CC1DCCB566C00FC5
+:10E300006DFACCBF3EACAE446E8CEF780D9D2EAB5B
+:10E31000439D1BF9A5C7DBAE3978A2D6309864437C
+:10E32000F13A24D72C5D5385E664188B9E6C9120BE
+:10E330007F1BAC43EFC7D57F4CC9210DF1E6855B50
+:10E34000F4AB96045D2ADDD9F959906C1C4D7073BD
+:10E35000251C558AD65C6D9EA16697B5B5E43B3009
+:10E36000CAC7306A86C976E4D28F3A06FBFFDBEA79
+:10E37000B965AFDE149F76A22D7BA69D452244FC95
+:10E380001BA14BD803697B22934393950D8D0E1CE3
+:10E390009F1F1E3D1FDC0A870B5D00A6BD0BAF85CE
+:10E3A000AD217219EC72E4DAB95A4280CC3D8A325E
+:10E3B000DCB52357E70A9E04135FA6F2D557253B29
+:10E3C0008DDF68CF59260AF3647D8D1EA72D0A497B
+:10E3D000FC1F79995B627D3E328A1B81BE6B373AA6
+:10E3E000724DC21C5AA5001DD880EF66FC7E926C4F
+:10E3F0008132C5D0B99B53C5D24E217B99110F6B89
+:10E40000DEB54F89E1D9A9712653480086A64E6F23
+:10E41000BEF8B3EABEB5E8D83F03A43AAF5023AB89
+:10E420003E8151101A80585BB712EF710ADAE50D80
+:10E430004B394DCBA70F9D92BB195A652746F7065E
+:10E44000B4B997F12AAE30FB5DA3C5F7E05DA17DBD
+:10E450001270F5B5873A59BB36B32DBBC2B3C68E21
+:10E460001348C5D1CF9CC829438EB68AD7F82CC093
+:10E470008426156FF361CD2DF92BE573AAF681770C
+:10E48000DE1E5865637F4FA361CDDE3394E3FE4CFF
+:10E490007E61B4236294BB556D69F78C00CE4DA5A7
+:10E4A000E903443CEEA41F526A06A6516A1BDE979C
+:10E4B0008F433AF9612DC4F87881D51F38A89C8321
+:10E4C0007B7AC52D2131EB9906C73DA88ABDD4942E
+:10E4D00037EADE125BFD8807AFFB3F2DB6E8B93A9D
+:10E4E00052DFB2B4EE9BB4E7AC1D73485F57284CC3
+:10E4F0008F730A784394FB329532A6B3C40F5A9CAB
+:10E50000793606E856AEBB6A3D8DC1DB03A41DF625
+:10E5100097476030565CE4EA41AD2A21B0C540D14E
+:10E520008AB1E8C8F3C30E8387DB8C039EC4D8ECA2
+:10E5300048FBB96ECE22547E42D798031AFBB7FB34
+:10E54000253DE84F807BD0ED674519E603D79FA8AE
+:10E55000E774F2BCE4608943B1243E52E4F4951DB3
+:10E56000D97CBF954153C2BD9BD01867143244502B
+:10E570005820286D4E18F48A2240A380888918F408
+:10E58000FEE1BA5E51C6F6868E013FAE4A9BA6F703
+:10E59000CDD7F71CF031C80F05AF139DC34CD4067F
+:10E5A0002D7C3A4A98BF3A0889C4D90DA719D50BD2
+:10E5B0004D1582834EE4F592E13F4AB8400BC37596
+:10E5C0007588BED3BDF468D120F467AB942264C2D1
+:10E5D0008AADAF78ACA4F5BEBA4A875853281BFB66
+:10E5E000CD58A1DBB2D831029C766C81F30EF07A63
+:10E5F000E4373D9984B5D91D7F55821D20AAEBD300
+:10E6000019F205092C87B742FE7AAD3A8727FFEA4F
+:10E610005B77667AE6AC16F45A52FD35A20E03F12A
+:10E62000B381B85B32579E4FB712E976F013A2E878
+:10E63000531F0B9E2D53685BACEF640C8C5D35E66D
+:10E64000A5024EB8891A789B61F950219D669B24DA
+:10E65000644ADD10CB3EB84E471308DAD438900731
+:10E660006B3323A4D233A722FFFFDD76CCB630690B
+:10E67000969CB9656CB1580667972BA5347858D32A
+:10E68000E8CEDFC513696A909302925F218F0B8FEA
+:10E690009349B33E8D6A7F28C7657A8851179122C6
+:10E6A000C7E7719BC10CD7C4360AA776CE1F2CF9D9
+:10E6B0003D7E55EA62D79304029629C46D0D3E2F24
+:10E6C000E28F34D4E09BC88303E1665CBBDF50C1BA
+:10E6D000F3B6EB87F359B39F3AD22418E054D4151C
+:10E6E000D8A34095CB6E4CE1F454E04829FA288B2E
+:10E6F00034F9115E97845E3A30519A401CA9B5589E
+:10E70000A975F1A54DD3289315A5607B495880C9FB
+:10E710000DC1264932ADFAA0DD62679DFB98F9B0C4
+:10E7200052B439323387313707CA89B370773C42E4
+:10E73000BBCB1748E54C1A5D032903F5D0CE726AAE
+:10E7400079DF7B5DD210F5A30262D2B04B59F8EFAE
+:10E75000565D52827B499429A7B8B35B046EBBD93E
+:10E76000D57748C012BE9DFBFD4839A304AFC20057
+:10E770008D37E63B84359F6C76699C3F7998CDA8B0
+:10E7800049087D8AB8C4AE302644ED3800FEA8ADF5
+:10E790005057F94AE1F810003D3C9946B1994F991C
+:10E7A00035BA464F712A15C84AA2060E7463116223
+:10E7B000A1E17C83F7AFBBC4FFE8B7F5D745D788A5
+:10E7C0001BC77F804E03708B7ABB4CAB90E0ABFDD8
+:10E7D000F199503716F6E703283D3F6C31B8116BBD
+:10E7E000884915CF84FEEDF27980F42E533CD91F71
+:10E7F00096C64925030CABEC040CF0BF6293A0D87D
+:10E80000FFFEECA73A64FCDD2B3FAE02D6B1608878
+:10E8100030A2DCAAF2CA6BD3CDA250478F705453FA
+:10E8200092E43FC1E2181863120EEE46399D4FC0C4
+:10E830006723E1C7AC8C6D897E15BAD3CA1A06DE90
+:10E840000E65CD91165DB5AD18653584C2154A0DBE
+:10E8500008824E6A3BC3CA05FD2D759B7BEB94C6AF
+:10E860007A569342EC4D037D1780A763711E06878D
+:10E870009F105D3D34F5AE5A1C55C87BC6153FEF61
+:10E8800017232F9AAD32392D0CBF9488CA9593E582
+:10E89000FC2BAF396093DF6A9F0F753C88F1EFA9BD
+:10E8A000FFAD251DAE04D5556DC12A38DBB386DF1B
+:10E8B0006585B45D4D32A6A1852ACCEE2E8AE02670
+:10E8C000724C8F2702076C253B25A44C4CCE5A373F
+:10E8D000093B9CFC003B7277689A758C68ECDE57AC
+:10E8E000C72392A33B5EFA35B9AC2884774289FDF1
+:10E8F000C4D90359EA2313B878D24175A1907E5C3C
+:10E90000C7BAC1BF709009CF4A3E4189A6798FF737
+:10E91000559DDD1CA399A3E70B6D73229B11B823B2
+:10E920008F19BD24524295A90E66356E67530C624D
+:10E93000FE465BC644A7A26DC495F4E0E1FD268BBC
+:10E940002DAF4165CB58DAB5A93C5586CC0A4A3083
+:10E95000763789FDA557A860A7DB4A85BFF4FA3A48
+:10E960009F48F633F0A7D012EAFA44BED31DC1F98E
+:10E9700031ACF73DDD7A64757B27F4F1AF92650A1F
+:10E98000C0ECC1DF4A20EE121E10F0E0EE06C7E335
+:10E990000F891778100CB9FB45D3F6E693D3DD4405
+:10E9A000A5D8729C0D55D5F7F9701892DFB360BAEF
+:10E9B0003EFFAA22E15F1B1974A536DA7F6F899E9C
+:10E9C00076773E18E62E08BCD3BD3BE538E8EA076B
+:10E9D000654670D512245C5D3BBAF256779922B237
+:10E9E000EC5A5B89F9C53AA66353DC186ACC601609
+:10E9F000B2471293AC37A280D1B63A44325AC4120D
+:10EA0000F32AB9AB4FBC44BD058D327C2EB372F0F6
+:10EA10003E57EB306ACEB1FBE60E0889FA68CCF3BC
+:10EA20002E8895858AB6C8DA8F2F2BE1701DB7C660
+:10EA3000F73C539398EE46B668084778E7A5A534A7
+:10EA40000014E030300DCE36A9940DDA4B48023276
+:10EA50008A6A30F5AE17E6398F54825EC5C3F9A5D0
+:10EA600008CBC34DB48CC4CA448416C2EA27E45709
+:10EA70000F6FD461525432B0ECDD768EB6FB0139A3
+:10EA80000CF1907AE132A8257FDA7A15B5C502A794
+:10EA9000908C03BC5318D19C9599B2BB7DB87EF184
+:10EAA0002CE0C2C5F0AF261463FD9709CC6E72EC62
+:10EAB000C956B707C9793263D6469ED584A2B52E0A
+:10EAC0002339424DE6F575242E79EB114AA1550400
+:10EAD000EC0F5F107FAB856D606A7DC081394F247C
+:10EAE0008C28BE51062BC062EFEB2CFB1278A9A339
+:10EAF0000F0D47CA4D1CEFEA11996C1874BC34A372
+:10EB00003A104C4BF07EC0E6AFFE201379A695BFBD
+:10EB1000B05D09C2AE3FD6A76FC789B8A30FFFC2C9
+:10EB20007679CC3CECBD221936691821021B4D8642
+:10EB3000910EF147F684D1AE7FE7BD513D9AFB8D32
+:10EB400039C4DF388B6ACB28944F0A5844E4C9088B
+:10EB5000AF7D2C19D7DE50F4A0A4B82139706DD444
+:10EB6000B18EEE6E92F40048A470AA785B983DF0E6
+:10EB70009A3A0E578899F4846D58CFF4C0BFE11DBE
+:10EB800013691BBDAC34AC40EC2EA8D961939B85B6
+:10EB90003FDF82B81AB97969C8C86186DCAB6B946B
+:10EBA00062015D134EA1756CE925316708B2C8F0AA
+:10EBB0008854753BD85E78628CACAC10707D703731
+:10EBC0006A806D0E7E583035686E4FC735AA1FECCF
+:10EBD00052D022FBF4C7353B90B4C0B1A4CCD27F55
+:10EBE000B9ABAF96072BCFECD6D12278692119BCEF
+:10EBF0007412231382BC1945E892944C8FD701708C
+:10EC00004793B32CB825C380DDA7693C861B98E0E9
+:10EC1000E6BA6EBC52BD70917C49925A30FCABD0C2
+:10EC20000D91C60B87A1A1600B1A4B9D6D8BAF4C4C
+:10EC3000077FD69CEEC9406B992D5FA8CEE23AAB18
+:10EC40001B3A87B006019955E6B0DEADAB45E64C00
+:10EC50007CEE33FDE93291AA0E5B2D6D30CDB3CB46
+:10EC6000FF08298546849AB376478B42F47151BADE
+:10EC70002B863A48672F470C68ED48645C3B6F432E
+:10EC80009F3E87DC2B24C7B70E4CDFEBE7A346750E
+:10EC9000EB6F6D81217A0746806F4BD3DAFEDE2061
+:10ECA0000180DBB6535C4A4FC56DCBED8AA1017B79
+:10ECB000EAE72B9EF0086C7BBDE5AECD2B2D2B1C1F
+:10ECC0001CEE1EEE7A19087D94E291A8A4EA56354E
+:10ECD00023EA1DA643BD9C3C16A651FF5AA5789772
+:10ECE000EC0F56E4E2F5ED5298A32F6600A78F7C57
+:10ECF0005ED795F52D657CC62BAEF1EEBB5D3A7106
+:10ED0000663A9C3FC330DB0695A24CEB650519893A
+:10ED100026311BE890901FE1AF3E13E395492DFC8F
+:10ED2000CD839D45D88892F964B5608F4EFD3064DF
+:10ED300042EEB42416AE38F028C4E397B476D5B4C6
+:10ED4000676FB030F7A1D9106F5AF60C53C6BF45A4
+:10ED5000016165406549359506FB483ADCE4CF72B0
+:10ED6000BFF71F67EFA1C86FE640D59518ECC32A1F
+:10ED700002E665074D79B27596C51885A5187B32F0
+:10ED800010B590294AE0DAAE13DAF8A57F4E338C3D
+:10ED90001681664E7C982E9E492DAB73069A1AE614
+:10EDA0001BBE040FD325D7E98230D6862AD8D74C8C
+:10EDB0003A3B50B46EE19879A3087D160314854858
+:10EDC000A7A4469D6D2C5B0D4FC695F31DE58C5D8C
+:10EDD000D45DD13BF975A5837F7654E12D42E6BB26
+:10EDE000C92A9BA9647EAA54C7E99C9CF6D56926CA
+:10EDF000FA1DE43D321CD17733644A1FB26A0AE837
+:10EE0000D88091048EF55BE0979B10430AE4CFE530
+:10EE10005B035FC7E32192B69C597AD608C181355E
+:10EE2000562B48D9BA27E826A9C725CDF5AE818C3F
+:10EE30006BA1F0E4B399E03104F13FFB1F5673EE90
+:10EE4000C06866BFD56BDA6E08758783D806325501
+:10EE5000D3B7085C84E91C3C10E6D7CB89EA60098B
+:10EE6000A257529369EC3087E39F0123375F0F2D40
+:10EE7000CFA871023F4714B2CF0EF193BC80220A93
+:10EE80008B20C42203C10B33E0C2FF0087E3D616F8
+:10EE90006D86942890C7BF1CE29B512BA7770C87E7
+:10EEA0005E158DB2C015D4B352EFFD39288C8B6A34
+:10EEB0003D8BB7E7F8920E70557D4D3D5A24C40046
+:10EEC000B809ED3A6671C75EC8151A80C987E8FCB3
+:10EED000D7A51703EDD8144C27361E6541866B2A3B
+:10EEE0005251B02A2AFE326C896345DDA6DBBFC0D1
+:10EEF000716921BE0DFDCDDBB9DA90F8A3FEBA7FB2
+:10EF0000206A04F3207EAF4ED23BEA78C363E0D69A
+:10EF100058B20012299C4C06141D9A35BAD8C7E580
+:10EF2000B026ECA60E0A19F92818C2544916E42096
+:10EF3000F6E7445E1B62500FB682307E624E006080
+:10EF40001EBD673470EC7A045CD7678E8383217CA6
+:10EF50001B535F8B303DF9F26ACF5809B400D823B8
+:10EF6000EBEF62F8A92858ACFE3DA6B2E534DF31DC
+:10EF7000B1C35754D271879471082A8286F2EC711A
+:10EF800073636F15B796C6DCCEA9DA88EB37B8AED7
+:10EF90006240317E7F392E7349EEE8EF159947C6FE
+:10EFA000D835FF44CB4654C03F77104DAC720D09A5
+:10EFB000A941AC2A068747C843AA8BFAB2BDBEFD59
+:10EFC00090ED17A3BF7431DF71620A547D17F8E02A
+:10EFD0004F305150D9E552BCFC68528CD5CE91FCD3
+:10EFE000E85D8263C8D9F770BDFD995C5CEE5F2275
+:10EFF000361ABFB76098AFBF988A14ADDC6084D86A
+:10F00000E4B39C0F71E3A19709D4D0F80DCD8A9495
+:10F01000699CAD69195593B2F87A10C559D5F78333
+:10F02000D9425721240028089D28811E7B58766AE2
+:10F030003AC0977056770D2511F47D7631EC6BED63
+:10F0400067077C2C7E14E6904D65151CCC33BC08FC
+:10F050006DC111F89EA03ADC42234DF04493868D99
+:10F060002E4FF7476C826FA82A6767B6F1C9200454
+:10F07000123CD1FDE95F51AE8C83C61E588F7E9B3A
+:10F080008E88F0F18D9CAC73890B51903739AEC6E8
+:10F09000D4D9C46CAE49902F0D282C69D0B0273834
+:10F0A000737C3E83DC7BC28D748FF319F7BBE8025F
+:10F0B00066E38E59D1E76E2CC9D157616E3A5B2D4C
+:10F0C0000F15F8872563ECCDA3E00CD5C2EAF20852
+:10F0D00058FBF1A83067527B2449CD43C01CBCC00B
+:10F0E000E1C3EFF69F33556EB233D9D60888069048
+:10F0F0009D0C576D908A5E35053B7CF67A96700EB6
+:10F10000CE9C42C2B62965F85AC777A7645414AE9C
+:10F11000634E70B5AD1B3A6DD275CB291455275788
+:10F12000F34DEBC9FAF3002FCDC4D94DA4BE7F75C2
+:10F13000F2A34EE36BF1FDC7377BE580A78AD0379A
+:10F140000EE459D30F2104A8BB4E722380D126EBC5
+:10F15000A10CFC559AB6BEB85E16D3E9D44701B5EA
+:10F160008CC8D216CBBED8941C759023D915A56E29
+:10F1700051EB4B8561AE6D6F31F440B343D08A667D
+:10F180006EFEF0BC14EEFCCDF2712F1A8E7A114F88
+:10F1900045959AC97F1543BC5CF75AB9FE3259B4FC
+:10F1A0007CD919BAB23B79DA2711B02C25E86EE880
+:10F1B0000672806F5D59B142E08913EF079E5DF8DA
+:10F1C00000C6F7F192C53E58CF45E01A06F02F343D
+:10F1D0004B612A071B1F050FF6F5082414BA43528A
+:10F1E000FBAC14FE90EF89E5DF9B62AEE38D7AC342
+:10F1F0006658A75A4FEA6FAA1B514ADD7726851138
+:10F200005AED2BA34145F32E01A9897F7E8A2083E5
+:10F210005B15E0DF41BB4577F6C48039140F245BF2
+:10F220006E24EF128BACE15878A9EE741718D5064E
+:10F23000B1F9C309381B8B35FD9D4B888BE9B4436D
+:10F240003EE8754FE16B506056CC8810DCBF619989
+:10F25000BDD442792F38841AECDCD648AE4FC75F54
+:10F26000B634CC1D3A0E1F03541D2F8FB7F972AD63
+:10F27000C057A3A58085E8BA5EE43A7B7F3171DD93
+:10F28000781C626EB825AB1F245C9ABD5728885441
+:10F290003DB6281C6FCDAAFB240F5B572B837E62E3
+:10F2A000B01EA38490231EE9CD762F186F89590DC7
+:10F2B000F7187A5F0CE072D88342BDED43386A33A9
+:10F2C00019F8EFEAB4CAFDD107C78603F3440584F1
+:10F2D0007E5927CD56164730095A84AB6D2436C95E
+:10F2E000032A18F948EAA86394AC0907AB48CF7C15
+:10F2F00000BCABFEDDDB0AED4BC8BCB23071EEA248
+:10F3000074AEEB761665B15197001560B91B5A645F
+:10F31000F89478903873A2BB0A3BCFFBDFD8E71C88
+:10F32000DCD9A9518C7A1640CC1D8F39C78F47EE96
+:10F330004C49E6750E75C76B13756CDDB19D0D9765
+:10F34000AB3A960708643AB70C8906E70935FC849E
+:10F35000A68A6C73A85214F278B329E85B5064F95A
+:10F360005314A6D612DE692EDCAD11C636C6BE45D4
+:10F3700007FB5AF054D5F682058E8502CE0903C1EB
+:10F38000CF0421945AD39038744E0A887230545C5A
+:10F39000236D40DDB84F1AF5255C6C1AA1C5348782
+:10F3A000BDE7D2ACCBE8F2E3F1C220E268B5427926
+:10F3B0009B93FB8B001C461C8BDF7D82CB2A86DE59
+:10F3C0008CC2B9156118C71497548CCB0712710100
+:10F3D00099BDD5762F8B47865830140404CBAE19CF
+:10F3E00079B4A2BD5E1FC5F708E5ED6CAA4FDEB982
+:10F3F0005C300AF86D342380A464F871EFE55EB0E8
+:10F400008486A9C645C8E1771895C6215F4CE8589F
+:10F410009C0E016FDA6AAB94431D43B7C94C606719
+:10F42000B44C9A45002147D41AC5EF4CCD6E1CED63
+:10F430006DBB24565A724EFF3320C00BA969F521CB
+:10F44000F3645115FE8EE876839EEE98CA06C2D00C
+:10F45000D5C6A952592B4C8ACF86D4864EAC5C2295
+:10F460009B105F7C883CE7BADA81E9AC54A009B70D
+:10F470000182AD81DFF99BCF3E66BC8898A8CC2C79
+:10F4800022F4F41759E9948ABD2CC4C70031D46121
+:10F490003E0BFFBE2968A7AF2DDCEE2135640BAD16
+:10F4A000BFC8F009DDF5C6952481B874EA5DF8613E
+:10F4B000299272E42E2EB4BED5F84CF97D895308FA
+:10F4C000F892920B59D454DBD9ED1FBB7336CF128F
+:10F4D000CB1F61BBD56AEB32A7B85A4ED5D707E52B
+:10F4E000627B41A576227B2B308C77031B26734FE2
+:10F4F00085B0F61FDE53968B19684C5AA164FFF352
+:10F50000C21E1FA28F4A69EE2FEC51A83E8BE470F9
+:10F5100058FDC0E48C669FEEBCEAE22D62B0C12BC0
+:10F520007CB8D6E0966594A74E5241369015AC88CB
+:10F530009BBA7916E9C3C8FF67A247D9FB57DFE337
+:10F54000C5664FAD53CBACE0D23F88ED78EC5AECBA
+:10F550006EDF7849660D9F5F8224956B60609C59D1
+:10F560008DE3E5EC650EDB322123E20E5F734C2860
+:10F570008E820BB96CABF23EED11F024857A910DC1
+:10F58000B500C2E2B6C89FC8FD82B7D11E4063A0D5
+:10F59000C0509C20BBDA3C069817E7ACD2B9978BD9
+:10F5A000A7E6433293CB29AF39CBA6593A63A06182
+:10F5B000991350F020B888608145CEB06D17D38F75
+:10F5C0001A3CFDF46595178D02A418B16DD5C12ABA
+:10F5D0003BEEB93B43ED56D469089F3A471E1D5296
+:10F5E00046E2EC858A4550EC3027C6BA2C03347AC3
+:10F5F000B7E06ED0EDC2387D51B5F634EC7DEDF15B
+:10F600008E359A2609876F12D9A94F436637DE36A1
+:10F61000A3DBDA9AD0815AD32BA81CD63AB3A78B96
+:10F620004E0AC966FDABCBAE605F0DCDBBAD23B658
+:10F63000CC100C431BD3AD6FFFE35263B2E634D959
+:10F64000A17C16AB5A79053A5AB3C78743A2837E89
+:10F65000F32867B05CCB5F5E96AB998D9C80B90553
+:10F66000B2F338E3524708310B4BB3443DD49856BC
+:10F6700020B3A094DBED6E2272D14A4240CA03024D
+:10F680000781D98A58E463F39BC1F2DEB2FEFAB770
+:10F69000A660A37CD429A140D708EFA5695712C161
+:10F6A000E192C8FA1B108E32F890E5C1B034C1BDAA
+:10F6B000352E55D1A9408B50C23D284C74848CC244
+:10F6C0009142B52F42E03634F43FD46E74F6BF80D9
+:10F6D00028CE18135312CA318725AEEA9F1FD5AB27
+:10F6E000AA8431C9EC3753B52E51F6634ED2023499
+:10F6F00069BE692CCED710EA3F959DCF5A779C29D9
+:10F700005370F21DE726A9CCB6F7A0A67C4DCB54CA
+:10F71000CD098189365155F32E88617D92DA2B36D9
+:10F720009FDA535DB0CF9497B323827DEA39366672
+:10F730002DBD0978DBCA9FB8E9C10B1331BD35B9BE
+:10F740000C9F2C63AA92993477884AB9DD600F9C8C
+:10F75000493886B96ABC614FA2BEAD31D3A25B0203
+:10F76000925B5DFBA1F973BAD540E5BB999AC3984A
+:10F7700088057C439E65AABED45C8680ADFC3DA115
+:10F7800014CC00EC5710118BC03CBFD5ED1565D3E0
+:10F790001518F53747DF72E6A10113A68ED5D4AC54
+:10F7A0000C5180BE0091B3F14EEA93E9DEB8C2DCA1
+:10F7B0001536F059565B66B2740CE9185B20484F59
+:10F7C0005829F71166B9FF3466E8AF40234EFFCFE2
+:10F7D000AF59760AC2FC8F47377DE5CC1576283BBA
+:10F7E0005E3C51872A8004D0973DCCF9A16DB27957
+:10F7F000D6BA053F1529AC1A09013DF45930E0E1AC
+:10F800004E532238DA1F8EB549B4848FD1F9BB7BB1
+:10F810007F03398E8EBCFEC7B8ABAC60C52330B653
+:10F82000CEF3EC2FE41D77B079EF841F069EC6C19E
+:10F830009481D0350F76DEF1F68C66C6DED7784C33
+:10F84000978D10626CADB80DFF1CBF3F35EA59A40F
+:10F8500095A4FE1769B6C85AD494AC8D1E23218393
+:10F86000E6FA2776FA8654215A0C4B55E2A3A836BD
+:10F87000A64FCCA74CFC8255225EC5D7CC15487646
+:10F8800020352AEC17A161A4E639DD542EF39CFB48
+:10F89000FD84C62B2E3D30B1D74F26CDBB616163B1
+:10F8A0009EBF8BDDF38F94F655CADC817788052CDB
+:10F8B000ADD05E6B653AC4D7C78185A5CDC97B7BCA
+:10F8C000FD4B3D8BEF2BA335871631B8270C1E71EE
+:10F8D0004C74BE9BF95517B0EF6E9815E26BFA8029
+:10F8E0005AA7A8B579323C152FF9E7AA1A87056FF0
+:10F8F000090A5E51020AD57A3E226C418CAC177817
+:10F90000221DB283CD0AD0630B2B9BA9F67B622507
+:10F910002DFAE10A78F413BBD5BC998F0E1025D9C6
+:10F920004FF75C315D0B6C68E93DCCD4FFB0CAF891
+:10F930001B3D7C799B9763DE6E3D3EC9D380CF8BA8
+:10F9400020EFB108C873B4BE9BF1CD09DBC5B7B8D1
+:10F95000DCF3F6CD206EED87A9ADADA83F1DCC3B05
+:10F9600051DF75DF5F6418502DA8F3257B80508D23
+:10F97000D437B15E8F1FC50F851A03A2BEF8EF669C
+:10F9800067680F0807E2CC0BD81586DEC84EFFE289
+:10F99000C6C1255332C919BEE53CBB05F29084E8C7
+:10F9A0000C83EA2F657AD136C2F2408304F2D3B0D9
+:10F9B00081CE0E51660AE9E8EFD4EE49690F4A1785
+:10F9C000767DF2233EB679BBE18A084CD7CC14662B
+:10F9D000EE979471E43A56F653A5C0AF6573A878D4
+:10F9E000E31CAF1B7620F089740A8679D9D6E53BF3
+:10F9F00042128D6FD5EFB3F5087304ABDA4168D7C7
+:10FA0000CC215C097025CA8C30B080B80665E5BF92
+:10FA1000E80D75CDD838AFEDA5C91328EF57F44FD1
+:10FA2000C78DA822FD89A26B4FC3D960FEC8C4311F
+:10FA30004E9FE55DEAA528A0D0183562233147B571
+:10FA40002936D9BE2F2B0499B5E0AD6116277D105C
+:10FA5000065994C510792632797D0EA1B14A989144
+:10FA60005C6042FD1338805DA6BB221F4E9E5AEF9C
+:10FA7000D423BAB8B3E4439F9A81ABDD67BBCCCA49
+:10FA8000FC5C24FB09FFF18335CBDB14F74827F539
+:10FA900023C2B87CFCFB305F481359E2857A5B0FC8
+:10FAA0006539B3E9252561F1F51AAF867948331038
+:10FAB000210B2FA40C71A7990A5C49075A711EEDFE
+:10FAC000BC872E40D1CF80C9BD23A18465D572CB20
+:10FAD0004F38F2B5D64512F265475B1EE582E9B9AB
+:10FAE00066F18CB7E7613DE379E82676F8F80DD04A
+:10FAF00044BBADAC4D0E608B57A91FD1F089F40407
+:10FB0000A3A152E8345BD47FA1FA7DA0000F783B1B
+:10FB1000A99DD067347F0ABA7ABF0868CC954E1089
+:10FB2000E6A40D37A50A211A1093939125198D5C2F
+:10FB3000BBE70F81BBF83C88C4CF10F8AFBE8BACDD
+:10FB40004ACF737CB9E0E48E7D13143D145557E61B
+:10FB50002CC0743FC4065A6D8F3A1DC3A2BC2EAE92
+:10FB60004021C87AFDD73E16CEB5B37F61D1CFC64E
+:10FB7000FB67D38FC70C324E80D6C8330719CCE150
+:10FB800064AD98A3F7834E62385D73E6BCE8CB9A08
+:10FB900001FC2EB50550F3C803FA66F8089FD5F4AA
+:10FBA0002310CE9D7387EA864F2F5AA23ACE7E62EB
+:10FBB00007D63A0A715282AD57593454C6C4B9B9FE
+:10FBC0004244C5A1EFF75681B2C848A59243E8EC7C
+:10FBD000DCFA9F25DB290142BB7EB2C31F5B1AFE04
+:10FBE000EA969D6A37B9E9EB5171B3CB3EDEFD74FD
+:10FBF00007B5673A32034F596B63196E5CE8C4C5A9
+:10FC00005A9344EDC790E09E4BAC11583551EAD35E
+:10FC10005B4E8564F75FB9F9FACC7A5D672F18D728
+:10FC2000E594FC6E62D1E8E4C5B67093FACF0B465A
+:10FC3000B8EDC97663C10063B4A63193C2C0A34EC8
+:10FC4000DF63521F01084EFFC47A6C6EE43506EB89
+:10FC5000572CED223686BFBAED293439F584DBFD09
+:10FC60008BA38D1D83E64C900A3A562AEF483093B9
+:10FC7000F271E38AE6B15A9BE9257D6E585FBFAF0A
+:10FC80001647156D06BD5498475A051273DE285560
+:10FC90003ED8DBFBC3EAFFA29CEFAD16B0EDDA1550
+:10FCA00078665C61F515ADFC4951BE5D20FD90A301
+:10FCB0000D3AE3B9C4CAE007AB7A631ED2467B4A69
+:10FCC000EE3B903F72836C9B2E8DBA53879C40F025
+:10FCD0008D730EBD7381E8C911F8A0CD3C604D8BCA
+:10FCE00088587E0B7F18483AAAC5F9251C5AA89B4C
+:10FCF0007D70D8BDEBFF3F6402D1BBC7B7DC662384
+:10FD00006881C849EEBABF0ACE0C1AFFA27D3BDF5C
+:10FD1000B3838A799D5BFE266F51C83264F458AA7A
+:10FD2000E7BA01FD14F62127F45578467603C34B54
+:10FD3000147C390E997BC0D93CF4BE0AC4764CD2EF
+:10FD400023A8ACFB5D2D23A311790E324760D0961A
+:10FD5000EA1A873267A27FD87CCDAFFD934F94E833
+:10FD6000405D73C7877A124775EFA97BFAECA31D34
+:10FD700028CFE69CD2C5E14D74B5F2D73392D90DA8
+:10FD8000F68BA860E164FED6BD821F0827F4848D3F
+:10FD9000EAC691341296A8D51FFE1F0811ED7EA564
+:10FDA000CAADB24F59FDB157BACE572027CF3693BF
+:10FDB0009259AB3FF6E1738020D40EB5C9220AEF09
+:10FDC000F708A2BC36069CFE9DAC3877A155CD4CF9
+:10FDD00095908D1562129BD41DA83B8F61C86DCD87
+:10FDE000807BD4636A17F8B6BF40D3A117091A768F
+:10FDF00093E799201E8E1BED83FF95C7306EB5BE2D
+:10FE0000E3A0DD165235CAF3BC225B8CEE0222BCA5
+:10FE1000EFBB8671C79E3B0166147F6E2CE57310A5
+:10FE2000F4E9B86463B82B13FC9467BE75431EC134
+:10FE3000E3FB0E60D8E47C21869F8BDA5E26309F40
+:10FE4000CB9E4DF9F7A07D52BB89F820C72395F0D2
+:10FE5000C082B29BA7E0CB773F00468BCA304D549F
+:10FE6000D4D85EFDCF61365D196EA04E6139C8D120
+:10FE700011EE4BF7CB22F2293896332623EACA1E1D
+:10FE8000037F911DAE8E0C4D5FEFBD741965DC02D2
+:10FE9000323569F819C99538E655142B6967F93573
+:10FEA000D77216B6E0761BBF126345704B83F99F7D
+:10FEB0002E506C92C1ACACEAB1FCF1BB10DA2C0351
+:10FEC0008028B55D2ECD85FCD6E40975CE5EFAB4EA
+:10FED000BE7AAA0A71704EB6C9E3B0F8CF3DE2EA25
+:10FEE0003E42E3B816B05C187393E50031075DE15C
+:10FEF00009AAFA2CE3B89DA57B3F36A0EAA31B1CF8
+:10FF000065177B62FF93338A86BB7538867C1DAF8D
+:10FF1000F156D2B6C8B52F6746FBE606925265ED9C
+:10FF200098A0C0E4BD684BC059879FC6A284508783
+:10FF3000B89A5E85313DFA9B954EFDF7C9FD923B1F
+:10FF4000A5A9A72EEDE2CB002761A88C8BF3E8666C
+:10FF500064A573CB570352728CB8690021A530DFBA
+:10FF6000F6E6B9528044AEABDE8955F42765596395
+:10FF7000B4C84514BD5B54C8A53D3D7C42A0E9957D
+:10FF80008DA24A79C484FB892CB092AC51C706E299
+:10FF9000966F9471EE1FAA9B08B6FCDED15BDFEB77
+:10FFA0002F1EB71AF040ED59138FB88F45441AD55C
+:10FFB00083A724F9DB2D22F286BEADABF3E9BAFBB1
+:10FFC000F7646483B456EE589B7891B37BE28B89D7
+:10FFD00050EAD5CE33647BCA763070957E0E21B35D
+:10FFE000624FD8B7CA639C4AE4D4F96171391ACD1B
+:10FFF000D330EE94D498BF1B9B42CB51F70762F7E6
+:020000021000EC
+:1000000062C34FFA013EFE3FE2494B5E3403F5A264
+:10001000ED6507CFC027561556140E1DEC5A55F640
+:10002000E04DF0DFE7B1F2C48C71BC8D40C2F561E8
+:10003000A05A7471BF7BF01777087A9A1A077087F5
+:10004000C2480D337520C1B61ED6FD724E7E52C712
+:100050009E3E9BB3EB0518F14DB43432AC18FBA6B1
+:100060002BC7426B5DD5D490955203C44003DD0786
+:10007000576249DA0A8FFCA118375646533FF2BD42
+:10008000BAE4CBC955F4D430AD48D74D3C246AB45A
+:10009000CDB5B37664D5869BE213A57A911E68F33D
+:1000A0008E41806A27B32A8C4C035BCA4EAE33AABA
+:1000B0008C54F9E89986D6BB60B115BCA0AAF38B25
+:1000C000D1C4876CE41E887026308906E33DA039D0
+:1000D0002D7B1EFDE7E3BA8E1CD9EDC0F55D08F659
+:1000E00036354D8E93FD3BE6B87B7730A2ECC92EBA
+:1000F000FCDC22E7E10BCFD66561BD002C629C4F92
+:10010000885909AD337F85789F07F8CD037E094074
+:100110008E024688794E6BB4158349213F472B7177
+:10012000727666A034A0EC16666FF442F4C116BD78
+:100130008DD3B19681DA4E1B03EFD29B6F31D24340
+:10014000D1A09029C61DF290734F704C0961B7275A
+:10015000EACFCA7080D1AF66DC7A5E463F5B5AA7B1
+:100160004B500D55235828DEEF896A7FABB902A8A2
+:1001700024F78B34EF273EE8913D3121626E9C2CB1
+:10018000F4C8DBD0ADCBCACB421D43F52BAB5396A5
+:100190007762B92551790455C04DA0672F38CCCA74
+:1001A000670DD7216AFBFD231059D925DD80066A2A
+:1001B000DE11D65BBEE3B4A8CF67799BAACEEC85EF
+:1001C000E992DE5768D21F0D47515C41D1BE99902C
+:1001D0003F762F66DE3345F34E14663F87D281307B
+:1001E000D5829AA433F632E4D59FC0D213769EC24C
+:1001F00022FC17C59B6B11AC095AEE9CD9D575F43E
+:100200004F839F325A0A0278AC95434B19E400445D
+:1002100052C4D147298350D021DCA99C6D34A44617
+:100220008C012043006C407D0DC113DEDA0D81147A
+:10023000824C3618CB4891697B8B29435339F9821C
+:100240007A73BE146A1E467ED2B6710D311314C481
+:10025000AEB34C5117759EC87DC9218422412BE055
+:100260004BCD061FFC4A17FE0F06D5CA39888006FB
+:100270007408CC8AE540BF95BF2EE9F8FA141F79BF
+:1002800073825E145DFB6CAA7546BEC45C6F4E4201
+:100290003EC0C177A6B8DB480E14274A4C1DA0F714
+:1002A0003567C62E88A314D830D840C822C44E4D16
+:1002B0000F2D1EE19EEF957FDA8DA9AA12DECA5698
+:1002C000D29B699585D6F581C1B665E41E66DC26AC
+:1002D000A9C8C2F4176D40C8CF8D383B1757DF331C
+:1002E0005786421D69A5CC7711C1F6E6EFF6B24AF2
+:1002F0006DC3556C7DF856CD30046303B9F9C6283B
+:100300009E9416862F6155A88714508D2071573002
+:1003100042806FD6B35F7A61982D0CD10D3324C023
+:10032000A4F4C28EF47EB3DACD03E549DB41F33F9A
+:10033000CEC9504166C60554C90DE88EDF4C53E561
+:100340003BA36ADC0C94811770D67C9F9776777FED
+:10035000A13F0441BF76CA1523DD6F2D251B79C649
+:1003600012610539C60C33C93B47F6F1584638A728
+:10037000B2E81BEC2466FAB7D56EBE43E0A2EA0DE4
+:10038000CAE95DF83BF6BBC3944555467004E1AA43
+:100390007C0577E17A295A602362C2E859756DFAC3
+:1003A00084E0181C0337D6F60F9C55C3E76C59AE92
+:1003B000EA5273776F04A2E095ABC9FA73E46F70E9
+:1003C0002DF60E3948B0F52EDE8F4897FCBA1A4D3F
+:1003D0001429D8BEE22B7F58339E02AFFA2415624F
+:1003E0002378F3475CC11C99A368B16146EC1C2ECD
+:1003F00083EBF9BE438988FE8D5694AF4CF0646A56
+:1004000056D066EFD75D32DC3D22562C24047DF9B0
+:1004100078069FDCF3D0C73D584E0E2A5CB6E5CA7D
+:10042000C4340DD64B84DC0ADB4290679CC6280797
+:100430003405DCB004A92E70B621B80F65C924E5D7
+:10044000582D364E647D367B1176EDB2239CD88FC5
+:10045000B1F115EE888B8183793FF1864E85437724
+:100460001C3D1445AC0029720F97C952EEB33CD71E
+:100470005D545836CC355D4094C5F9F2DB472863AE
+:10048000690B1510C7F8AA5A444997A69FE413129E
+:10049000307F6DAF011E62B389F8B016DC816EE269
+:1004A0008E69CC476C06817ECD8E5BDBE59EDE5E81
+:1004B00024590D8F8536D6F96E9FE4DD2C17F23363
+:1004C000DB7CEFC5FFB20B94F2EE9AEEE07F7FCBC0
+:1004D00066B2F9D88107328FE92F1408C0BDBD017B
+:1004E0007ECFE45D7EBB88FBB0653C167FDCE5BC5F
+:1004F000A1FA78A68D35DDBE37E7FA08C9F56C5547
+:10050000B2D5615A33F69989233A8545045DF78E51
+:10051000972E93709DD5B01392CFD4CC3DDC55B9B6
+:1005200049B4A82544578F7FCEEA30643B89829F27
+:1005300043CBFB74E9B07CC5004B6486652166AA99
+:100540009341F9E1AA9776B9E1C538047B32CC57DB
+:1005500095537101E7D9F5FC6912DCA825704A7E34
+:10056000CCFF6500A73FCCE24C3D455A9CC502ED4F
+:100570001B4C7DBEC14C714EEC4492756C896C7CF9
+:10058000DA298CE3FC7A3D20B4096ED9CB0EB19701
+:100590000C7521390B76C3CAAF4CB4ED5DA7CB19EE
+:1005A000ECCE92E99C0FE8BFCD51883C7399E3A74C
+:1005B00069ED528EF9CE1493130AF3AC53CD43ABCD
+:1005C000FF3314A8EDE13197083C526C7440F9C335
+:1005D000830F1F54A553FF738CC6332547CC21319D
+:1005E0002AF673A91F0C7328AB3921AA6719F822C0
+:1005F000507EA8894960618EB609A30BC81F5CBDF7
+:1006000042D463657818C4791E9DB5A6D18A2A6341
+:1006100053A8F406788E804B93E29198C9E0A8988D
+:1006200003BD08543A9EC36DEAF532076E29EE33D6
+:1006300017F22EEA488C2F81B10E52BF0AAC7E4AC7
+:10064000E72A5C8B8F1644EB3A1C3EC3183F1CB95B
+:100650003FBAB0EDEB0ECD1229BA246D312C60F00B
+:100660008344C99A546D645726154826282D09DA03
+:10067000C55A89E715D75E1F13DFA3227840762A73
+:1006800074A9072DA2180995CDD394F459AB07D7B7
+:1006900097BAACFA052EC2B3AA884E5EA0F15DCF20
+:1006A000D5757B16E1C3DC30152016FDEDAAABF93C
+:1006B0004AE274B92857440695F6BD58D3CCC4967F
+:1006C000AC72A322B1147258B26B39DB6AE52245D1
+:1006D00075F929D8B59BF445CE6FC4D1DD50693387
+:1006E00014B01566ED50211D0D1C921BC7C47C195A
+:1006F00032F53E6C53F46C0A5760B3356368844E30
+:1007000065CC212C0D22563E2BA3006D1D946BBC95
+:100710009818EE0FB6A04C2A10138BFF94D47B6D63
+:100720000F852E7896DA97E42781BA6595A4158D02
+:100730006509EC51015FC9EB32DD5906931C7BEA78
+:100740005FA6B14E306B832FD2813F354B66B76BBE
+:10075000DD80F3598D062448F798E60F430DB62146
+:100760006EC873E093F11DB6B6C10AD26263035935
+:10077000DE1FAF511096CD2EC25FCA6079F412A56C
+:1007800036C486B2FA803EE6495B01B7D227F9C487
+:100790008ECB0A45D9407C385F836422B8715423DC
+:1007A0006CE9F99C737A8DC74A3ABF6935A7928381
+:1007B000B863B9A0198044235AED2538E94E2BD9E6
+:1007C000EAD0B6C621FCE8AC7812D44C43E0AFD1F5
+:1007D000941423D68D4C2C7C2CF9C68AEBC90C348E
+:1007E00089CCCF62DC597A760236686171313F0973
+:1007F000A6C1BC0FBF5763BD9695539CF216F380FC
+:10080000F8050C4A4264F6D9B71A7501B02E9DC19D
+:100810004A837D94750AE9961A9D20C49F5626E462
+:100820000398B28ECD15EA5C6C28E5DC61C8192608
+:10083000BC9C153F790BC0C964FEABD61F404F244A
+:10084000CEB79B1B4B266F88CB04BCBAFAE363E898
+:100850004C76141C1E602B88542A7E967C55FA28F0
+:1008600092EDF6DB407C05686507063D75FD742753
+:10087000FD9D2D280186450B04609E7BC4950D3C93
+:10088000023AB4C4E6FAD9045839168AA67B31690B
+:1008900087CA0DFCCA21E5C5CB1DA4CB812D73D21F
+:1008A000AEC8263BE15F43A56D31322B322A581486
+:1008B000E5041DBD284FC533ED5ADD565B4D93FA57
+:1008C0005748D75C790EC724E248130B433EB879EA
+:1008D00018C816191B3BEBB52999B873EAE44BDA33
+:1008E00033CB5504A6F87B67781606B1CE4A58A3D9
+:1008F0005A6E6C8CD7083FD154F078D8E6A06FDCE4
+:10090000C6EB735F205933FD72A5D4907B1FA5E41D
+:10091000AD6779A446F1F9D8F73FB168C71A4FAB74
+:10092000D055CBE4D041BAF5AA59EC6A7D13915960
+:10093000927DCC5EED56F8A6F50419D47790FE2C86
+:10094000E448712FE440253E85D0E42D9189A256DC
+:10095000CCB2DB89D44566119105CE405ECCAB5953
+:100960008643DA7AE5224A284D8DAAC40867406C8E
+:100970006AB3DEBE644096C9559365E9392FB90A5A
+:10098000D4C1D89266B114731602004D248CD5B12F
+:100990007C2ED57F06C67D7AF66E75BEC39CD5C209
+:1009A00055BA3446E92E53ECC5F88DC99CA7618928
+:1009B0006FF09985D41FE2FB61BFE6F361E393F426
+:1009C00005199DFEB23F599E28809C9BB826D36F87
+:1009D000ABCA506EDEAA8579A0225F22D8F23C56BF
+:1009E000D5EB923F395063A3DF1A8755330DC330DF
+:1009F000D7FA5ACA66AABFE844E9AADAAAF2CDA889
+:100A00004470E98BA36C532CD28B8F7081FE2EBF68
+:100A100063083F19FC9130FC9EAD9C17B30D590043
+:100A2000EDAA78E3811319D154EC77036E3F11E6F8
+:100A30004F4EE1B36DE2C5C9DD9ADED520C572C166
+:100A40008781D71C521EE4967467C744F12A3FFC85
+:100A5000CE42DC2040150E43A884F588E665363684
+:100A60003F96459650C2BBF33F47A427AF88D8AB0B
+:100A7000155FF8083196A71DA75B9C8DB049BB6038
+:100A800079E6576F0AF4FAA8F6789D068D24C7B761
+:100A90004124B4216A4C4D12CE9970C138CCB0CFEC
+:100AA0003AF4D7E36A04357BF3FC36290F28FB8739
+:100AB0003500BF390B02793439F9BC331EF8D24EF8
+:100AC00000EBC0AD77FBC3A7AD4D09DC22453B7001
+:100AD000E3F1CE5DD58A07190CC4A3BAD2791B2FD6
+:100AE00000079189A58AD459E100B31C2BF5111F89
+:100AF00008ACAEB7D4A1EF9442D50626FCFA824FDB
+:100B0000B3E65BD6C792996B3A30CEB022DD2AB3FA
+:100B10005046D2EE80F42B85383EA2FF7D852C54C2
+:100B2000FBDC71DA479AE45E39CD43BBF9C6163275
+:100B30006E0D436DD3BE0B14CCB85126759605913E
+:100B40006D59BCB275EE5D1FD37965E08E0B79A649
+:100B50002B2871C548B4D37D0279700D4A7669C0DF
+:100B60002B28E9F7887E32BEDC40E3F934A65C0727
+:100B70002244656C352C88F828B470243C48BBF9B5
+:100B8000E8D4C9BC70509FD52E881430B49A730233
+:100B90000DC196E142CA07A0649F4F976CE55BA91F
+:100BA0002DA91B5E4EC180DA9249C32A16376930DF
+:100BB000C3A8AE584A0545615957FC06BE10B9583E
+:100BC000338F3EB7CAA81BA91633A4FA982CCCC3FE
+:100BD0007DD649773745599E7CC47BCB3E699912B7
+:100BE000657400CC5EBC76978DCAD7673BD651063C
+:100BF000F798727194D7258D4E5A083B7982F695F5
+:100C0000E62E88E7FFBEEA971FDCA8454D08B4B67C
+:100C1000048CBD6664AC0BF47904D0DF0B5C091363
+:100C20000C7ADA7EC5962C3080C75F35C63BE2C8A9
+:100C30001775A129FEFB6CFB7FCFFF781787930107
+:100C4000FB33D86894FB4FDBEB00B0CEB64CDFA291
+:100C5000B223FAA15267F774A19E956EC2B2A4B4F2
+:100C6000A405E6962D0EBCFFD216F47212BB069CAC
+:100C70005D30758DBB86B6AA545D8F406D97333756
+:100C80004CE2963520DB9405A882426010ABD30677
+:100C90005F644056DFFBB38A3B4D3B0685F06F43F4
+:100CA00003C54969C02FDC4FDDD68F755F064F2B1A
+:100CB000AA0303C5B677A3AA834157CFBC6C6FE6DE
+:100CC0006BF9C964AEA72B8496740D0DBD476BCE2E
+:100CD000F5E92AFE6519F6A73861BC51A971E3B29E
+:100CE0005CF09C633E6C7BAF6FB8422E208CA64AB2
+:100CF000CB0A0CF7CCAC8B7A5C1F846F09B492EEF4
+:100D0000E696C07D61D1E957C83428973B151F018D
+:100D10001AC9A1E779A624FEEB1F9D6D66E478B59C
+:100D200077F39B50416DB2AB8244418C724D2B8660
+:100D30007613BCF254E7BCDDB8B6625F71B350BF46
+:100D4000AAE338CAABF8E3AF756707796E26A4C388
+:100D50007452607B292C7F4D3D01875F5B1D3C12E7
+:100D60006A403B58D790CAEAABE0B8B6C74F7BEAB7
+:100D7000B0112B870CF5C1580109B347DF15363781
+:100D8000D544F9228EA94FB7A76932ED098285C1F2
+:100D900093C17B991E18DF5742E6E983F53AF26367
+:100DA000C7C77BFE4BC80197043751BC4EE678E3BA
+:100DB00063D8B693B5D9029EFC7D93898CE55A29F8
+:100DC000F8DCC6A8905EAAC79D11BB7B958E0F9BD1
+:100DD000072ADBFE3E8CBA7F0D171E8BA0259FBE17
+:100DE0004E012DA61D043D1294280A1E17373D6A98
+:100DF000098346048908B2838418C4D8D0C7C7E7DA
+:100E0000BE81F53B3BA4167E66F0394AD678C96AA6
+:100E1000727DA73B34C3F75974DCFA9E43550073C7
+:100E20004D376A82BE45508775A616597140FB93AF
+:100E300058FD4516D6CCDD76F4687E2126E204D92D
+:100E400022AFE8EFD008DA2DD1FDC91899A2686D5C
+:100E5000E19E1853077454FDDC0C08C8EB9737DF8C
+:100E6000A7F68D1EC1210FE7B80BEDF0E5A83701FD
+:100E700023835556C7913B2C966444A110C7127228
+:100E80001C25C4C8ED88AFA7CCEE758BBD9866BE97
+:100E90005D8B61A9F484E60AB603A1A86B555401E1
+:100EA00060324E2C5EF4EBE4C224993F71DCF852C0
+:100EB000DD9E72602C555BC344B32787408BA7240B
+:100EC0004B27464CD0C25C14F946008B351F74BCCE
+:100ED00046648C3B6988FD7F33A915FC2D52F2E2F4
+:100EE00004B0E6382A470962934BD145272317C936
+:100EF000DD7CCFB79C50CBD9C8E9D9F5CA977A8A9F
+:100F000076DEE98C0A3ADE810960F57DB33B5F7ECF
+:100F1000E348257FB5CA6945090659323F293A9BFE
+:100F200041FFBB197EB1B4D7C0E2CD91E63192FC4E
+:100F3000A0ECE0A63B5A245077F399751046FA349A
+:100F4000AF55AD3BC2CA0401837B7449016F117375
+:100F5000B9B62E5071B511BD8D3A16EAD00F9F9BD0
+:100F6000169EE64FA931A79E0E2321758A313CD0EB
+:100F70000BD6A35B32A078219746809B5F6D533FD1
+:100F80001B8744AA308E3ABC6ADA4E99F7CFC04329
+:100F9000E7E30D99FD8A5BFF8C9109E567CE64520A
+:100FA0001A047AA47A4763F18FAA0989BC3D38C232
+:100FB000465C8CAFA901CED548E928AF6A590576C1
+:100FC000FCFFB25070C59EA71C018DE94CD31A439B
+:100FD000B14C76D49A8CC1F1C2853E38424FCFF3E2
+:100FE00098455402656DFD0F2769B6E3A74CD6F30B
+:100FF000E5AE8F46CF12A960AC158D4503903779C9
+:101000001FDACDF8A1E579F4426D337A2755DC89F2
+:101010001EBCE8C182C5D72609E0CDD7BC5FE66912
+:1010200083AACA94B224EE3C4B264958CC8CA0210A
+:101030007FC821CA3E9DAB578CF9AD7A48DF5B3043
+:101040001B1F471F57E7B6F4444A641021D0E41E23
+:101050005DAF1C50FE05C7C766CE3E50ED6DCBB3ED
+:1010600049039D64C160BDE9B0329C67CC36DF0D99
+:1010700008CAE74A357556DAD8AC555148F353F0EB
+:10108000E732404C7F8F6464B2FEA2DACAA5797F52
+:10109000DCE97726EBA3CEF7D02E12336FAD825B5F
+:1010A00096CB9F2167C3479BB21C6083057BB152DF
+:1010B000E5559F2B5C998E5524B666A285F6F90EF0
+:1010C000AF2F75494F08A6E3F3E8B46D587526FCB9
+:1010D000A3F9AA81640728F6F765BB18428D4CF680
+:1010E00000E8D993127FA860FD2AA4BE7CDB8C2483
+:1010F000B07F29AB8DED6B98AF8B08AD930B679FDD
+:10110000D2C0FC31B83A5CBCA5B6270DE187996224
+:10111000FC7CA976F90779AD153D50BCFAE60B6069
+:10112000159121B55FFFB9E9D1AE7BAF3907B9752C
+:1011300055FD29E1A86AE2062A7A0715C7892A25FA
+:101140005B5472A4E9447721734E1E1107328DFF60
+:1011500079598ABB0AF9DC76518EC56F27B6B2A8D9
+:1011600048FE2A653BE97A3ABD5B25513F29564640
+:10117000B4927B7EDB12B1F8F2C5F51383ED6110FA
+:101180005C29CB6A50F3CC2089A4ED0CDEDA3A91CD
+:1011900039C5F25D40CD4D0748F106EA7354A6C843
+:1011A000C09E57FCAC4DDF8142DEC97D8B7683AD9E
+:1011B000B10A98EA694D6D4F15EF1B3380870E3BDE
+:1011C0003C3C1F17C6E74499B398B0944FD73A0AEE
+:1011D000A07E7C6925D9E2807CB243BC99DCE253D5
+:1011E00051737DBD39E12BF9FB3EFC46B596BCE35E
+:1011F000D0DB7E896D13F3A0F286DE1815C772AEC0
+:101200000136F3D1695D69CD8C50E4A32CEF8432B3
+:10121000628A31997E408F6C44B9FBF51738A56F0F
+:10122000BF0B54B1A4450B9DDD3958A71374E44D91
+:101230004EC2F801EF513D915218FD0BEAB3D53182
+:10124000302A4C6B118655903D3BFE94CDDAC5EBB0
+:10125000F30CD30E0AC34C0E000CEA815856AE3B79
+:10126000A0F046115C681FDBBA33F1D4ED44225183
+:10127000338482CED26B07FDD57B68FC5A98405DE3
+:101280008166FD0E11EDE708D8586E28EFBA3328B5
+:10129000D7178AA28C1726A49AE4F0B1B6A634D444
+:1012A000EC7C89FE0AC161B877B323C12ACD88CD11
+:1012B0005E12CCA62E2FC0D86825419C3D84A78DF8
+:1012C000B2C1DA253DE4E5E75CAD90B7A2E5048E56
+:1012D0005230F701337EA5C19DC8ADC4FFFBEB6062
+:1012E00072274BB61B880BE6C74DCF2C157E9A672D
+:1012F0002BE4116D4D09B462897F189CC0104979A7
+:10130000D10610DB1DD3CD454E60010F2F79A30808
+:101310003364319FDFE8A82A47A89463A561A46FCE
+:10132000F6566F851C4FECA48D687EBE7248AB0CE0
+:10133000E7A19B66A4D613C5E2981F40B452317A48
+:10134000D560DF325DEBF8000EDACDEF5C7B8A4BC7
+:101350005A3A75FCB97F15B375CE9DFC5DB01E4C35
+:101360000D9DDA2F25C319C69A1FE38E857CEFB732
+:1013700000324C28ADA6C8051A8E18744112FB39EC
+:10138000B0EBE92116732C596C03588950EA6E832F
+:10139000DDE0CF688F729B30B90C3A054DCC05F972
+:1013A0003B5F39CD6A2F00FC24BAC66AEA191EC019
+:1013B0007C67CF1368BA41DA85E9576A2BA3D1B2AB
+:1013C00050CCAF4C57F1A9F6035609821B58E9AB34
+:1013D0005CAE84206E1C2861BD9ECA623D469CF2B4
+:1013E00070851D679ECF8F8687C4E5BF9DE970C855
+:1013F00032C50333A54D275D833F56D68A1CEAD6F6
+:101400000AB785DD7DAAFA0CBEA48D4C185909B423
+:101410003E2DC8EA028192C966E87ACEE86D0619C7
+:1014200014963C27A66EAEEB00B0F1FFB8757CA316
+:101430001BE54EF9DED4559E97742BCD530B290C2A
+:10144000DB81322FF015143BA1A743EE692A00C1BE
+:10145000F2EBCC264EFABACE4693166BDB22D5E1E0
+:101460009B39AC99CA73F1BB4AC95D062042ABAB4C
+:101470005C5420D168F6A19675A372E1A026D743EB
+:10148000F577762B5895AB1E7AB9CA5CE195471B68
+:101490004240CD82FFC38C0106612F8D623C3357E1
+:1014A00089CC065A09BA7A6D238A1B95F4FAC79833
+:1014B00003DCD4210C89D29987C2ADAEE2FEBD64B3
+:1014C000E4ADA7D73B6969F8FDEF9E5CDB144FE7FD
+:1014D000F556C0163E8CCD84A31878B691AAC006E6
+:1014E0006004E49EDB590D25E046BD053A71528C3F
+:1014F000F86EABFBFE3A51F3BD6852DD063388D07F
+:1015000086D1A143CDF3CF4F74EBE47F0F471A850B
+:1015100025DD0B61C073DB6EA9AC6FEB62388F7099
+:10152000B6812C9F68C1AC044C8840B7FD46E3DA15
+:10153000DF7AACC258D3910335DD60532D3662B0EB
+:1015400026AE00F21D617301870E9550B947D5DDB7
+:101550001B58AA9C8E2A6C7E987814B4F66057CAE1
+:1015600069167F6D19F74244F9C6B9D14737CA2DBC
+:10157000174C35DADFB107474D395C90BA1C970A32
+:101580004B64DAB4C2B6331D194F872E16F6E70C3A
+:1015900001F364D5DFE80E767DCB414A96AE623921
+:1015A000CF5A2E8A8F624E2D498E44652444894538
+:1015B00068C02618F7E61CECD4E1489AAF07F7F1AB
+:1015C000BDB0DF8B0EC340D58584306FB4CBEE8EBB
+:1015D0006D2A6375A51ABAD655F80C70749322DA81
+:1015E000A414B7FD16914AA6B0871F427687A2CAF7
+:1015F000987E5067757192C99E1A0D29E35DC5C624
+:1016000091E8C83DFAD0ED74CFB665BEEDE3FD902C
+:1016100078E7F49686F4C89BFE60B3EBAEA2AC23E9
+:101620002CA488B71C5130617B5BD6DBE71866AA17
+:10163000A0E03BA74799C9180E78214C94EFC98CBC
+:101640002891B4D888FBF57F1F1553E1C098046A30
+:10165000FB2BA797C7CA37C7A55015A6BA05138F86
+:1016600099C8C45143F978921F36DBA01C4FC2F4CD
+:101670008BD843985BB6E8C85AAF82260682DF0A49
+:1016800014518A24AE542E06D31720E1EF3E6A1E71
+:101690009D87F1EAB7710FF62884141C81A4680CA9
+:1016A000F53EF11AD5D91D2389EEB8992D6EF92B87
+:1016B0009E1C95E69B3CF60804A60525C921152627
+:1016C000CA3BD56C19C45AE4C0C716DCE419A5019D
+:1016D000E56C5FC5058AFBDB91667E3BEAACCF819A
+:1016E000CAC33E34C75245D6D892A865D385771170
+:1016F000D0CB62639B388CFFFE5F2EB180B62C7C12
+:101700003A37E22DA189B25DAFEBD670658135C461
+:101710008E8A6D27EE7AE01261BB68ABE215176B1B
+:10172000DEBDD300D9DB9F3B774D55BD848817BC08
+:10173000386D7D80B4A8789678B4B7CAA4E546928F
+:10174000AFBD0D949B1BF439B199EFB09D78468CD9
+:101750008A9496411364422D51E23E3BBFE5E0C9B5
+:10176000A443076FD0A1E3784A113DE48CB0F23D69
+:1017700026F9E83814852C8926F54425FC354DCE0C
+:101780005098B946FF9B0541B75D21F950E60355D6
+:10179000104085E4E986495ECDB3F9F455B03A725C
+:1017A00026F3D77B904AD9A3D49DC5EA75AD829E16
+:1017B0002A244234166E3C98F222A3222072E8BDFD
+:1017C000107998B302C8E366248F11274AF21E27C6
+:1017D00032F779C0BDC5DF5313B6797B92EC9DAC6F
+:1017E0001E381DBCE9BEF15754E5A96835745C305C
+:1017F00004ABA0052C5097885F71EF024ED6FD63B5
+:101800007FBB24D78A95D7D3D7FDBCF207E288F0F7
+:101810001ACA0A7D426F8F51BBB2EF764055CAEAB1
+:101820008A1AD6B4AD294229F6CBE1C7AFA3CF0AB5
+:1018300026102B39A69E3FCBA2A4EFEF4B6616A233
+:1018400000F5151AE597D98E59E2B37EF38B9CA467
+:10185000323B87C3C07C300575CBD872FEF4F636B8
+:1018600035ED0FDDB3ED0594B0D7D60A70AFE4B90E
+:1018700028E8CDAFFB67C4B6ED872C448A9D8F5B0B
+:101880004F9294079291EA43250B055C50E0A6C75E
+:1018900023DF09C69CE1F4CE26419FED554EE8A01A
+:1018A000011AA7B0E69CF20A768947403B2DCB246B
+:1018B000AE9E3F9E13D911246CB6DF6C0DDBFF5733
+:1018C000CBA45FE7F02F8BD643AC7DD7425E1CDE06
+:1018D00024A5A73E06CFECD8CEF73E648F3E9EDF10
+:1018E0004667526497F31F963D34B36AE33DBA7A74
+:1018F0006B749CCC5A1D3AAC8B299B943D095B02BE
+:10190000B8CB4AC4AC8D27AB80ABA0131BE9BC4B52
+:10191000F0D308805D50404F23C0C5290E70770B6F
+:1019200050378C48E86DCCD3A8CF1D81248E7E7FA4
+:1019300001B6390D5D54523606D9A39489AAD74A07
+:10194000CEA0F10CC65B0D59727F7F095A92061A20
+:101950007086AE208391EE62E2DE49AA69D1965983
+:101960003BD919F01FBFDF6663D17372B9C0776BC3
+:10197000FF2EF5DE61529337FCC5CBEDF2E9E8F6B8
+:101980000181A6968E0D086168B5AEB693F609C2C0
+:10199000857F3F250A35376B3E51F14686ED12D8DB
+:1019A0001B1F0C5AEED354D45497C172557D676DEA
+:1019B000F7420C09C7495C10FCCE0553DD23EEF459
+:1019C00077F548151D24A7CDDFDD13B94D6FF50858
+:1019D000BC7A7C2BABCD4BF8C0BB67DDA64263263F
+:1019E000D61817E59115CE666363AA9BA2DD0C7D20
+:1019F0009113453FC90ADDAF77CF3ABB8F699BEDA5
+:101A000071F59C6A646E35F0BBA0C79805C33F3B77
+:101A100010045480B9AFC5620F7C525E11B4A106A8
+:101A20006276C8DFF5CBA3CECB82CE935BD20DCC52
+:101A30001671047D1664412C7C95F33A8A6D6ADF39
+:101A40002567C0CE36526F524C00E7109BB2DE21A4
+:101A50009709483B1B5222C6171418CFB813A1E3AD
+:101A60000903AC7FFA83B8EB3B9650A5BD0E86C741
+:101A7000006406301E17816BFED039241FEDD000A4
+:101A80006450FC43E9004694C3BE09291AE930E5D5
+:101A900041F76139013E8715A9044A3A248CADA16A
+:101AA0003AA912CD0E828BDC6780230368D281268F
+:101AB000205E1D0F00F0196E7DDAF588CCDC1D6705
+:101AC000238D6206F14F94D690EBF3BD5F498BE016
+:101AD000E9C85283C840AFC505051F91126403D8F9
+:101AE0005883043D67D913AF035E046064CFB965C2
+:101AF000E064D80E3ECCF60F7BB6A3215A7CEEF8FC
+:101B00008E11626CAB5F86D8F94B262A5BD670AD1E
+:101B1000DBF005EF60CE936B0C46322DAFA62212A0
+:101B2000549CF1FC207522316E30A1BC8F17885473
+:101B30008529C043101DB407278DC93C1A84B15AAA
+:101B4000334ED58ACD783E2E9C0CA9313B01C83549
+:101B50007DF9D4A10DFFFA1217FBE78D422B40A7A8
+:101B6000C58D460D81B302CD3E4025EF94D11D8732
+:101B7000B15FC6E90841D68BCC300861289F2B7233
+:101B80008995E25086A8081459F2254193EB71FE1D
+:101B9000F334923B3B7237741B5B71DBCB9232C6E2
+:101BA00008B140151BE7001C8A2FDAE674DE0AAC88
+:101BB000CA43A8D0410D56110BCCBBE96F3F2C5F37
+:101BC000FF04D3D2EACC91C9DCF881BB727BC4C4D8
+:101BD000154CF0C02123E791AC20A7A39F1243F638
+:101BE0007D854AB12149A201818F0921D7EDBB84AE
+:101BF000C2F6517C489FBE9311AED134C31B3889C5
+:101C0000944E3D1D3F6EBCAADA9B0E0D23FDEF8462
+:101C100060FD92A5F6ADE9E46CC92F0D3EA7A19B2E
+:101C20002298FD955938757B55EAECA57917AA8E4F
+:101C30004539A1105149202A42CA75328C055BE111
+:101C4000F13C37BA30E73E9FFFD1C1BDDC556FEDA7
+:101C500005A9854BDDA88CC183897A3D0DFBC44461
+:101C60001534C1234D38712CF69AED41299900E1C4
+:101C700035F3CF2B9D428263422B2167C4DB3BF7B8
+:101C800078C74779BABEE4EF9CC8A1FF0A46421460
+:101C9000F1EF870157DF8CB8D43E9315E60A93899C
+:101CA000EB6658B6C8DCEE1BD91510FD45C6E384BB
+:101CB0002C6879E023A03646E1110204A9E8A8D5F2
+:101CC00009540FB35F7D7A8D9F788422248EA5F608
+:101CD00047E9990C09B2F20951B87BD621E212D238
+:101CE0000EC21D15DE237C887770A995DE7FBD2688
+:101CF00051EF4C006913AC8921F22E7B53D7E56973
+:101D0000D69CEF2261030D8B24FD9541B830234F03
+:101D1000C08A3AF3820976958A9BC0615FCD0CEB4D
+:101D2000CA9F9D0AE62E1B46CE31241DE4129C1448
+:101D3000DD873FB109B7452B5CC2780235B7FCFCA3
+:101D400032EF3F932DEFBFC72B2F3070084FF2BA01
+:101D50004B6EA3B87194074FB7C9C153A12CAFB153
+:101D6000E4BFF4D3B461284FDE233CE90B1849AE3D
+:101D7000BC47B032C07E4705B290C806DDF357407D
+:101D8000F46FB48DF1D012DB04B23F95C058ECA5CE
+:101D900062B566128619F9C5D43ACBAD6DE042A0A2
+:101DA000440DE133EFF154EF8509FF83F4B1CA5CD0
+:101DB00073C5846348A953D6C3FF3273716E34056B
+:101DC0001E746A9DBEBAD49FE850B59BD26476005B
+:101DD0002EB0328DE5CBE51130C01AE6BBEBA30582
+:101DE000AB8F8914A06F2B3FE55E24ED74A4C5155D
+:101DF000EE89CE1EFCFE8390F528ACDC4A5AC00565
+:101E0000BD778E8DB3BA47D75D9A824A9A0E1AE48F
+:101E1000837A3F7E979D8602142726FBE93349DEAD
+:101E20001045498075F34177795326411D72FD1E97
+:101E30004CA25070A76305698A5D852807887D34A8
+:101E4000B64BECFE11DCF1A1D13E23791084535244
+:101E500094A843221F9D0643F03FF268933271DE3F
+:101E6000F15703F22D7FB161EC9D59409218F204B5
+:101E7000403BFF70889006854D1402D2CF0554EE8A
+:101E8000799242CFE3C4379530A2DE893007E4E38C
+:101E90004C8EDA5D0C8AEE1908CCE200C428B196AB
+:101EA0006A862EEFC2F6B2D88A4B58BFF7FCFF7491
+:101EB000E30AD818D12EFB5A0CE41462A1FFF57086
+:101EC0007CF289A2457B38D01F0484075D7875F0C9
+:101ED00033F06D9639EAEFFED824B43BABB7441E1D
+:101EE000301FBFE3CD9DC46BC6740AF8241984402B
+:101EF000F389AE48BE81CF152DA41F0BEEBFBE7374
+:101F000098CE13AEAEC0BD01EF10DCE066629886DD
+:101F1000E577546080D245529755373C8665D79710
+:101F20001F886862A16ADB25BBC497165A631DFE31
+:101F3000A4EF6288866B5829022417AD5DF2EE8605
+:101F4000BADBA1D7C9D3A3617EFFAE6DA3217167B0
+:101F5000D1C46A920F8C7267F9E44E46248996695F
+:101F600074E91D56F0FBF7176C003D1FEC3473D37A
+:101F7000BB8A75F73B9CD6A571E20C74CB31BEFBD6
+:101F80000B600DAC9C13410C67BBD501537ECF6B2E
+:101F90000FCEC6BE7CED50D236F64DEC2753D1DFC6
+:101FA00058D5B14A57ACFEDD1132A9109DD6A49880
+:101FB000BAA78A5121EF96C52BE23D2B6E08870107
+:101FC00060A4DE08F4DC6996D5830651DE7B92447A
+:101FD000BE17B5F0FC797ECB09AE01DEDE21431CD5
+:101FE0001BF550ABE5AEC9042348D3EA60F6D4A391
+:101FF000A00E21E00563F98FCCD53E21FD61340EA2
+:102000008127F42050206DFD6FE33EFD63F683E8E9
+:10201000DD4D7F4C59219ABFBD4967CECD6641DE6B
+:10202000BDD71E63884681A2F552595B03D7AF8A9C
+:10203000280DA378F672CC25F5ED4030A8936418EE
+:10204000850CEAD1F3C54A7546F18F4D9B69FBA417
+:10205000A6CF5D7ACF66C8A3833BA9324487F0C080
+:102060003FEF9B798CE0B82BF3F317C1DC0FE174E1
+:102070004AB09550B5A9DDA4E272463D5130281210
+:10208000B980CE030715C7382E28A9A0621D625F4C
+:102090006FC657D2EC3E1718075278C2F12771115C
+:1020A0001F3B53F6CBA319C8D8D63441275C224135
+:1020B0000CC0552B2D6A6A3D8EFC6EA69B1F72E3E9
+:1020C000E90B62992D23270102CFC859107ED6163D
+:1020D0002A7D0A9C53301E506D9AC3DEA7018BEAFD
+:1020E000703A6925ED0C24A4120FCF866467CA18D4
+:1020F00067A6B5EDD8956C906A556353614598FC19
+:10210000FB08F05FCF97FA2A1C354E51540FF34469
+:1021100054558446FB60C3CE4C40B1F3146CB1D32C
+:10212000389ADAAD9F2411C3DF1BE44B5D7B7DEC55
+:102130004684864714A76A82B101F3FB2A43CAA7E3
+:1021400069CEB06BE40D4D8049BC7153D5CC569728
+:1021500081E05D331533AE23BE759548FB5FE6DD48
+:102160005DDD7179B1B1B8A474778E7C893FBF66AB
+:10217000D85C0FFDE62199475A12187D34012FFFD4
+:102180009973C876FB4F69890B4EC57A38328E43F6
+:10219000C87352661E49303148511CCF4CA50161AD
+:1021A000E8C0CA1AA249457FF5F11121448EA398CF
+:1021B00011DB4396EFEC6E6B53C80ABE6466F06E9B
+:1021C000935E75F6A56FC38DB74728F92DCCEAC18C
+:1021D00031E791A38FE8D2D6F7B5B47ADBC73D11CA
+:1021E00034BE007F3A7A5EAAA74ECC299082D0FBFB
+:1021F000BDCB6989CF4CD4452ADFB4AC22DF7561F1
+:10220000D8D69708B6417C2F62C252591984C7E2CA
+:102210004B9DCFF23A1FDC128BA84742391FFD7F3E
+:1022200092BF083F1FC718C9617DCE3144B1C44A6F
+:10223000D11B93B81C07BF6E058AD02626DDEAB5F0
+:102240004435A1D60DDF685FA30BDAEDD906A16B8B
+:10225000E231969552C0CAF1E27BC25B1DB515848E
+:10226000DE9106245C898042BD4613F587C65DB6C3
+:102270008C48E89204177BE14ADEE0EDAE83BC2C8B
+:10228000B060B055034FDF51C9E353E2F182E7FE7E
+:102290002C937DD330ACF8B4DF9F115582486D820A
+:1022A000D6E7D6A7115ED99C3E15E1AC6244141165
+:1022B0007D674BC6E7352D5572E75733C1CB6212A8
+:1022C000EC8CE5190E643B57D79CF55F44A2F815DA
+:1022D000171565DEC795A9388165F931B2FD20DF94
+:1022E0002FCE864959E3EEDDC1CEAADE4E38CB585B
+:1022F0006221FF6DEE4DE5401B61865967A53240B6
+:1023000000CDA238AE9CF4AD585491BA19E7AC2870
+:10231000971C5056628DD418BCABF995E6280D0F6A
+:1023200035DD625D873392A8E551D47CE744EE2524
+:102330009E231336087164E42E6E2804BF30989BE8
+:10234000270AA1407ECEFD87B8C2D54D78A2D81A03
+:10235000772145F3A98DE6F9AA8AE43EA9862E7174
+:102360002A54F1DB173E340A297F4DEA5DF65525E4
+:102370005C66B759D7983DBE80ED20736165CF4547
+:1023800076ECED784750F144BD7FF95D93122E5DF8
+:10239000477E4F2447EE8D3A44FFC4536C46BB55ED
+:1023A00021D084C2CB4F8FDCD445242A61660CC671
+:1023B0003F3C06354E0056B37C373F1F9DEF3F72C2
+:1023C000F0AF5125002A5687FEE060A1AEAE94D34F
+:1023D0009D19573519C049E87AB0CF6EE93F1FE023
+:1023E000D0CDC9AD4C6FCE2A941FCDB70CD9E4FA2D
+:1023F000CD3B3ABFD5D98B93B8C9111D216BAB40EA
+:10240000857EED041119386203071FE304C7FFB589
+:102410008AF7F86AB8C9302E4708679BEC9388742E
+:10242000866DAD32A0A64AF1705828A0F663D3336A
+:10243000126C0EF779FF216679EEA2514AE7DF2C84
+:10244000273CB39F2927DB41B20DB7122633D6D3E1
+:1024500069025365B9931F6F537BBFB8AC0B0CC1B6
+:102460005174CFB2BEF04B25D48CA0F24FF0BBCB51
+:10247000A3A33E6B0420AE5B0226823AB84E94447E
+:102480002EC0F7D99FD747648B703E9C207DE98F83
+:10249000EFFBA0E1DF7F859F5DDFC3376E9BE665C5
+:1024A000D7B33E2D53D7FE9F4B3700439FCFFA4EF5
+:1024B00084B5FF3A503C0B633F5929D1841BAD6969
+:1024C000033CC16EC13F8E5C25FAA43ACB8A2E9F95
+:1024D0006A4782EFFDF65E79250C49CC5BA88A6FCE
+:1024E000260CCFB9BC850EDDB8F6495A300CBA8639
+:1024F00030CA37DF6FE56F689F8F286E29DD626114
+:10250000DFAC667A6439731A34D7B66728EA0C7A76
+:10251000997924C6777C80A7F1016C7AAF7557ACA6
+:10252000F7C53BE8A2A5C77346244E6E2B1238842C
+:1025300029985C9107EFBF10E412E7DB750556AAF6
+:10254000824B34F62A6D66E092B129376A40D60D87
+:102550007C2AD5D0E1A684F1EEF5C77AC07EB80B0F
+:10256000760C7DDF1789430175D87175164F0AF611
+:10257000F9D775EC59B6D6F1A10DAA753A73613742
+:102580002920BAFCF7544656B09EF062B418E39E78
+:1025900024F77331DC2C086A63BB83B8CAE705E310
+:1025A000D24B05A6163B1DDC5C6CB588ECE58F4371
+:1025B0008CF38EDBFCACE531C2EC5CFEFF1750FE09
+:1025C000AF6119DF7860390AC382C65EA3DB80245D
+:1025D000CF1C1B5E4CA5EDE4BA6E680F45605D81B3
+:1025E00065AEF734F5F6B6251BF3E99FF451B777DE
+:1025F0002AF98CFF2D637B9BBFC46C711A3AE608E5
+:10260000776D8E17F870628E9FD3523F4AEE0E1C84
+:102610000CE47DCC976F757428792ECC4EB09EA1BA
+:102620000745FAD4912AB789A437AB2F0ACD0D0DEF
+:10263000CA2CA4216E5613AF81694C3BC55D11C1F4
+:102640003BE67EF893BC8D2DD23438879BD127DCB6
+:10265000BDFB450D076C62AB7F2990F80D3A08B6BB
+:1026600070A82CB51D193D04B2AD25717D3FF48EC7
+:1026700084171BED32EE8DAD4D0F180BB2C4290936
+:1026800015E10E1664A95EA231F1BC8438D5BCFBFD
+:1026900024E6CE8D66081230BAA6BBA84936F2C62B
+:1026A000C419C7F50936DA1FC85E605206A209FDD3
+:1026B000FE92593D6CAC3E9C5AD7443997FE625607
+:1026C000EF87E6E479C3AAAC484EEF7D1818B89FAF
+:1026D0000F9B765E34E004E10DB13497A5EBECB8C6
+:1026E00049BDCF7AFB32A0A4B67875C03463294EB9
+:1026F000FAE16F6F1D4E89A0F1600DC4A3C810B13F
+:1027000054252705CD0DFB704097561349E92367E3
+:10271000E092BFC87258D67E46973030D8F96035FF
+:102720002B4FC9F6D64A11F95446517D6529612CC3
+:10273000818C4367056E0E647C5BDEABB86C659A7A
+:102740007E0446CEC62BF3F99AE318CE8C2DEE52BA
+:102750009BFFA67427AA3BC48B3F578A70281EBED6
+:10276000EF81E1CF746FC0ADE987144AD222D06304
+:102770000A009B733A9C4747FD9F4F62F784CCBD8C
+:102780006DC2C41664D37E1311E4A3608FCAC56AF8
+:1027900049EB427ADA0FDA6E4516030017A5EBE92A
+:1027A000145ABE77624623E9400A1F6287F2157207
+:1027B000D972D24D985BE572C6BB706F53CF5ABFCA
+:1027C0004C5D4D69B4E96E6BAB8A2FEC9C8EE44195
+:1027D000ABC4EAE7BAC1B439352827D8E8636A3E02
+:1027E0007DF3B1B3D43799377717498002F7C6F232
+:1027F0008236994C8E8DB43DC50BD55BC3E08049C4
+:10280000136EB4353DE145A053B140AF6AC7E71A36
+:1028100021320C4CB2BE307C503B2D12126AB134C6
+:10282000AF0DE87E65724E1E4BB407EEA9A5FB57AF
+:10283000FDAB30FB67F7DF9670408B6D91F748C3B7
+:10284000957966293358E73B0E4FA809224F50056A
+:102850007B604E6615FFCE0359E70978BECAF96A58
+:10286000E71D06A8C179DF7C009B58B377336278F7
+:10287000CEC1976FBC9215A0314599032EDCB6915D
+:10288000E09AAF6BBC053257D243F528768035C944
+:10289000844A1D09894E7374ED5DDA0A799F585F89
+:1028A00016C18C6DC7BA40E0B3722F3026A23245F4
+:1028B000BE65F82647EE2C80DE7A3BA38D9828ACC7
+:1028C000D8DE6775098A98A371D84C9D7848444E24
+:1028D000B3C0F36C9DFE4DA452372B56AAF50544A8
+:1028E000E0E669B5E098F5CA7426AFE0A1C4F179D5
+:1028F000A1C3AABA1EB18F741F5F8B029808907192
+:10290000A95AFA3ED2D89143A751FB461D7DDA88D9
+:10291000C76F7925596DFDC19F7612F40085B6C544
+:10292000EBE4142237AB1272E6BE0F7B03B0430F09
+:102930000958E77157884BC9747142038C85538DD0
+:10294000748DB580DEE9E56E5EFEE39FB86800D366
+:10295000A471FC76F83804E39380180B9D70015C39
+:10296000B5329C802B4E6C0925D64CF3AF4550CB2D
+:10297000DCBC73F88D7873F609E7C7859C95A3973F
+:10298000C7CE27BE0A816F632CCF621DDAF91F0004
+:10299000E37FA0823B38CFA76214509DECC479D46A
+:1029A000924A53592C1EC8446429650EE538268581
+:1029B00094C94777359DCFD63D863572FED11D55DA
+:1029C000305D5178F8CFB31545965A5A205B75554E
+:1029D0009FA635AE693850F0F5E59064E97974D476
+:1029E000993C56F55E627C1A4663ACFDCCEBFEED7D
+:1029F00049A15666D0612EF51DD7B8A0CCAA9391F7
+:102A00005ED30E51992EB9743F73C5B4BE2F0AA47C
+:102A100072406F216DC87628874C0E25CC0C951C12
+:102A2000DA503D75C3F35685CC47BE99E0A1558574
+:102A300026FCCB10E1ECC07BA053FDDE7A4CA56DEB
+:102A40006699AD41BE8CE30594C4313E90BFDE5A19
+:102A5000BCB3631744F55123B0C1B98408FDF9C86C
+:102A6000370E963DF8AA870F192CBCC9229BE3EEBE
+:102A700024EBA0845D13C966086927B50D2A2E10C2
+:102A8000CEDEB79FEB7B5D63E4461D9D0F30E6080D
+:102A900027ED3DE3A09B782F383A3B9447D2E75B84
+:102AA00007E7DEB7FCE5CFFBF87D246C7A3BA33863
+:102AB00001FC877C9EE6D06D490E510D09D62C7124
+:102AC000A39551AD53E1EE21FF87AA2D845D3C0D06
+:102AD000F8FE012DCCB6ED6924BF5941B4E11F5D6C
+:102AE000D16579DC9D8D4D1813D7369FBA83DB13E2
+:102AF000A3C1B7414DB672226D7E8BD732F703FC6E
+:102B0000F92B1B93F237D74B6FC5A011021CE02E97
+:102B1000619FD1804638D91AB3B50A720AE66000BF
+:102B20000AEA4E797985B5AF403CFDE19D2EA94476
+:102B3000B5054A9E3B8278030C5120C543BA59F82B
+:102B4000C774371CCEBAAFA8158C413BE93787282C
+:102B50006D0977F76A79F6428FA3847162E098E095
+:102B6000B0DBF8BEE4BFBC86689BBB92CC85FCCFD3
+:102B70007F4C8B62C63FDC13AD67AB4E7C2EDD8590
+:102B800068F1E44B533A4633FC5CF57CB946A3B894
+:102B90004A7E3920BA70FAFABA3EE55F0B5E037BD3
+:102BA000549392918FBA8C44921E2943ABA17329FE
+:102BB0007A1E47498265EDAC212C6696AE392864B1
+:102BC00011324D0D14A36E77B878A7EBC37CE5C91D
+:102BD0003703265CC524FB21E34C42A4EB3026D806
+:102BE000B9E62C7DA96E7A748998DC052024297DAC
+:102BF000F979853D5E55927C49AE434A7260837A8D
+:102C00005B00F651E2A2B79A535FA4163D2DF8225D
+:102C1000FD500AFD9334E6C5445CC5DFA0C62623FB
+:102C20008F664605E2B32C4D7F133A964A1482997B
+:102C300056C22CA8D5925A1C301584FB53656843A4
+:102C40007DA4037AD0549D1243B960CFD5C4726E6F
+:102C5000394FDB5A504212C17AC501715F8D0C4168
+:102C6000051F1094B901F299511F0BF3B0CE0AEF72
+:102C7000ECF79EDBA377E9B0E3FA853316466D4C9B
+:102C80005D4B8D469C286B07D87BEA385850C2981C
+:102C900062B7BF1DF03E4CB1D37A0BFE9847123D90
+:102CA000090989060F76B773AE7CCE1F92E10C8EB0
+:102CB000259AD7C950776E13AA6D4CAE7658D24379
+:102CC000DB223BAD46D98D99D8C01C961A286A5391
+:102CD000CF50E5CAD1760DCE961EAB19BAF2055289
+:102CE000AF2F4B248FDCBD27B4898705A2ED1C2CA8
+:102CF000321D95DAE5B959658CBA7B4984FC9F4051
+:102D0000D4927049BD518EB480BE1CB055A69EAC05
+:102D10002C65788899DCDFA18B04683B6D2DFED88B
+:102D20009C0C4FF589AA04E47F5F3CF053DF2F270A
+:102D3000E55CBC990A66A18605C17E5A15FA952BF9
+:102D4000E74940299887682AE355C4C9874AC47C63
+:102D5000D239DF0478F688DC4BDEA58C5ECC9C8F04
+:102D60007D8E76E94C25C348058A79DB968BB01CAD
+:102D7000E82CC6D5228590649C9B62F125821C05B7
+:102D80001A95D548F7746B8D592107C9A766A7A076
+:102D90008BEF6CFF1A675EC0248EB875C71ED3E137
+:102DA000942EF5030F7BC12DBD75350AAFC4CEA798
+:102DB00079D1B0006DF4C267D23DE624D66B4D00E8
+:102DC0006660746EB3B689C496A2EF527ABE8B6702
+:102DD000250FB149677A106280F322E66632897A5C
+:102DE00084617D3A20313D558D84E409486598C160
+:102DF0009683142B1292917D6B8D18D3E732CBFC06
+:102E00004DE9C45A8A6F214C9E74D128A0540DA953
+:102E100097579D0552DE0FCC22B9AE4306FA00FC4F
+:102E2000AB3C864D6DE273EC3C013E4E32FCCA1465
+:102E3000D65A987E59DFE7626B0790FED4469558C4
+:102E4000A126B21D141DFC9FA4C649A81A8536B63A
+:102E5000D1DF295D4995CDE8CF45DC132343977435
+:102E6000A58DFAE7676C5D1330FAEB03CB4737F9B2
+:102E70008F2566CAFF834ECF8BB6769EDB044782D2
+:102E8000A184F20D09696AB49A1E0F550367B867E9
+:102E9000326195AEE0668AA873C61A2DB097031703
+:102EA0002F761A2384645157B6330EB552E4076760
+:102EB000E68171C1685A9C6196E466BEBFD347EB58
+:102EC000BD5E2979E5DBEA5AE574910E10092EB34F
+:102ED000D102DD5D68C5F181A07A91C70DADD85DE5
+:102EE000C973AF66D37B79CA7178E49047A8B438C8
+:102EF00076364D1569FC3CA71621B41EB4EF358417
+:102F00007470F5F1E7CA371E6D09190EC4D9282B64
+:102F1000D5D087573F42B5892F417D87D158A08CA6
+:102F2000DD6F8DC7B071DE9621997AAC947DC22396
+:102F3000482066EB8B39728A6D7DCB7828761B50E2
+:102F40004620A31A33E0FD1E7A4A073614D793971A
+:102F5000BDE74AEE8638602C759E9847B376B10679
+:102F60008DC2810606C6825DF7F97353CDDAFAF594
+:102F700010703F88857C366B988A9ADEB2B7FD0F59
+:102F80004FA42B31D57B0DDB0EAE0063239B2909AB
+:102F90002F022F40F589827AF135C5F441B2DD0F59
+:102FA000A02275B34DB5FEAAFC9CF84159223A7D8A
+:102FB0003DFB25ACF07514201EEE2FC7FE40501FC0
+:102FC000524C5E6CB1E0306433DCCA7A8A402456DD
+:102FD000A3BD85ACDD47A67A2DEBF09F9F127BBD8C
+:102FE000ADF2409D932DD72716C4E1BA579AA0831E
+:102FF00062656AE5DA8EC09A932394803A21D221E1
+:10300000E476370D137D887E67FA72C96847656A72
+:103010008A4272D0F952C9790F8F74B9B4B36D8DE9
+:10302000C632DF478BF72A7437FEB1C9591025C95C
+:103030008572217AE563EBA720E2072907E473E1B3
+:10304000B7C7D548897160CF88FE680FF0644178B2
+:1030500043006150156A4CB801B413B9759F56E727
+:10306000FCF86A58B6853D5750ED162148D66EA03B
+:1030700062C424C771756AD2111A980102C655003C
+:10308000BECCE994FB345A3A171FCB3300531811C6
+:10309000B5071B669FC16D3AF7A0016BAB6E60660A
+:1030A0008AD2FE8BE324BB1D28865B37F6A08C8773
+:1030B000F23A95C74FCC3F47BBB51389DD1743257F
+:1030C00003A9EE132D7E2F7C98E398D204ED98840B
+:1030D000F5686E6FC99D4E3CA1BA409BD26FD38EEE
+:1030E0002A63786445A5E36E8C7A5DF5F6B9922F74
+:1030F000DD22ED0E64EA4754F3364761640E0BD2CD
+:103100003F6D0625224DA271543789E4E211031365
+:10311000E8ABDF812F4F4661520E28867627638108
+:1031200029E386F64E239A2E6C1568829E53D87A30
+:10313000E1B9FA902796C3FCB79AEF0B8659D201F2
+:103140000ADBB2D65C22066447729EC75EE4523147
+:1031500068C5BACC91F58A0D8A185A7365B08A741D
+:10316000E2092F83455F2252620C8242A732AB30C4
+:1031700084FDFCC26ED8F89F6A5D5B3E3761DC7BE4
+:103180008703AEFBA93762491C3F960EEEE215702D
+:10319000C52F16EF6B5C461B5FF02F772E82AA358A
+:1031A000CEA150426179E98C895E6BB56E7346663B
+:1031B000C2459F05BEAD5B590916861999BF4FC11F
+:1031C0003E6D5182E7E2CD8F340069E57AFEACB9FD
+:1031D00042BF5BCC3E2F11776F1587B3AB8D032CAD
+:1031E000B4EBD271D6B883C2AD540B3D69BE555C09
+:1031F00006854E3D221A0A67F00C5DEEB6DDD861F9
+:10320000BC445E9B8F97BBC5B061718E13144A9E00
+:10321000B34FFACD3CBF24FFE688575923BBACF32C
+:1032200085D3BD44CC75F1A402ADA2767CEC7009C7
+:103230006CF6497088C043EA0EA4320AA5475BBE0B
+:10324000AF44B1EFFC5CD6174F57446D6055CB9A35
+:103250002B07D64C1BBD4C8ABED11879F7FE2A2409
+:10326000832CEDB6EE5AA2998D14CF322CE7238928
+:103270008A771A94036496EF92A55F5EB088D5D1E1
+:103280007D96CD40EEFEE34ED2A0B664C97389A40C
+:10329000441D4FA6A5D0348AD1027AB02EFF7DDD21
+:1032A000562B265A77BEF944F755E8DA78C9FA1052
+:1032B00045964E76C4673634AA89355EC09FC3668C
+:1032C0005FE306E6B5DDB3156411BFAA92C97D625E
+:1032D0004CDDF80063296694B22D7A0F2F350A274A
+:1032E00055009EB001FEB18AD650FF4EC0D1DA4DD6
+:1032F000D74EDE10B81B88A462BA8C195BDECEDA1A
+:10330000EA5B1CEB48F565CCCA82F985A91270CC42
+:10331000203B5C894EE0F8CA5F92DFBBDA208C6B01
+:10332000B9DAFF7CAD4D7BC546DA82088CFC1BDB2D
+:103330003C602EB27B84B4433F32B0550222D2CDE2
+:103340001C3FFA4021AA9FB09C1E43161B31EDAAD8
+:10335000CFA95301E90BCFAE6A14A83BE8F40B6187
+:10336000DBF95300360B483022B9ECCEE9272C4963
+:1033700009B2EABEBC921FA9B669A5E86550E8FC8F
+:10338000749406985165D6B86525494F60B1BB4124
+:10339000A171B940B35ED76E85F70D8F7E27BCCB88
+:1033A000D7A52C8B0D9DCFCE8E8549317CE7510062
+:1033B000698BFABBEA4189A0E53B91451AF1A2B3BA
+:1033C00090C0E0A2C360DDB190FDE08AFD293434F5
+:1033D000F9412A7823AE8E5BE45C6D9A75856E7137
+:1033E000469D4C7A5071F4372D2DA059DDF96DA012
+:1033F0006FA6D0164A61F3FC451192A0EA883938CD
+:10340000405BB442FCFB45FE2CDDFC1868107F4697
+:10341000F2371E433542618CEB04C24ACE72F2A9E8
+:10342000377ECFE787093EAE17D347AF3002099703
+:10343000E5B2A214243D5A168EB4E2EF08EE33250D
+:10344000098BCA41DBA13F7EA27D920E720CBD7634
+:10345000F181EFAE9D60805446DAFD6F7DCAE4B81D
+:1034600077064A9C3D8A87D17B3E368F6D8F8A676F
+:10347000542AF88B9EFC0F63E6978AE3BFD20CB404
+:1034800064F1E2F8F777D6DEEB03FF70B19F1CF62C
+:10349000266C01BED62AC871F47F999B1F75F2A3D2
+:1034A0002783F957E24E2ECC4A2FE3AFC73028EDE1
+:1034B000BABF3485D139DB7AD050AA52AA00504124
+:1034C000EA68BA29402BED4D1894C3ACADADFD5A56
+:1034D00036A6240A596AA45A7701DF4B79C98C6F42
+:1034E000F9035211F620D88FEB0A68FFDC94B26121
+:1034F0004C0112DB26E2E5A24AB240716CE520598C
+:10350000DF5EC61934C41C352A6F63A977E5F71B43
+:10351000EEB520D6C12DA52ED70C27F041D5ECDA7B
+:10352000F590C860259F1120A6109E1CCEEF3A0B87
+:103530002AD1F1DDE1117F7DCF70EA9B613477D430
+:10354000031DB404790B2F8A07C087F91DEE9B5623
+:10355000F24914642C946EB0BDB29578A3F8E6E8F5
+:10356000FBFBBE5E33B1C995503FE9A59337791A8D
+:103570008B004692619B0BB4A4C9DBB3CCCCB7459E
+:10358000FDD7AA55C22F0A4242C32842C00A37D2E9
+:10359000BCB801A8F448CDB6B767315F9D610E8411
+:1035A0008F76E25F004BC1892BAA929089AB602A8B
+:1035B00074C3CBA066F49AB180F9F6F2ED7342932E
+:1035C00087B5D628FF47DFEC113A1C49EFDEFA0138
+:1035D000745695E0690F280F02AA0A1ACD0446C452
+:1035E000735BCA36889A6D507026D265BD3847EE37
+:1035F0005AA1313BBDC693D6DBABD7A9C2AE90BDB5
+:10360000C7808AD80C560354FC07C29413BA53A837
+:1036100034FB498198C5609CB56C00BBE4793309E3
+:10362000699E69B07F154DC48F5E46F963C4F9A0E9
+:10363000908D7502A3B5BE6FD65FB9B754E0039005
+:1036400072F59DEE9091EEFEBAB6B7245AB41014FE
+:1036500024C5EB81D871B6596E1803A56787F31C92
+:10366000B3EA1034B74EC51B8F706A2FE120A659FC
+:103670004DF86B9E29587DE4BC8D2C8D8D16948061
+:10368000CA5D4C8AB95C708F4FC0E113FDB8CBECBA
+:10369000007EF7B6B368459C109BF7F6DBCD32ECA5
+:1036A00009F9EA8C9AC668002D3863CF4AC1A66C26
+:1036B000E0699BFB07F58CA3B315173B0F6C203912
+:1036C0002B3FD56C1618AA037AB67A2C4488A67DAF
+:1036D0005B156EF9B642C80CC2AE26B7FD50C7A541
+:1036E00016D6541CC481C6BB93EEB6A8F53DF4E9CA
+:1036F0005D78F16B39B18E669AF9F6150B1164FBA2
+:103700003D790D3B751F2108FC991F9E4FE71A0458
+:10371000E21CDF23C3C53DCA04C052DAE0E878E208
+:10372000182A9315E2A6CE1F9E9DB6DA8B0B2F8921
+:10373000A31FD9A1204969B0E8C7AB00AFC9977CE6
+:1037400032A9A15ADBD917260A6449439196FBE3B3
+:103750001918FC1DC481C9E1F6FD1C7BDB548BE507
+:1037600089CCF8D9468272C29DC7429B0D16A32B05
+:1037700012E403DDEFE13A9BE15A1FE217AA6DB3B1
+:10378000CE37F0F230C5BAD38ACD300A747877D309
+:1037900013DCFA0C779E850B18F47185772F2D1F9B
+:1037A000EF32E4DA1084D12376CF2B81D35DF74A50
+:1037B00069ECB17863D6D9AE1F928852EDD88CDD12
+:1037C000EF95A81434C93E77FC0682AD75445C774A
+:1037D000D6E94B444398FF14FDB377D219B29B1D31
+:1037E00021C1C692CDA1401AADDF6C12BF131733B1
+:1037F0005193C228915C14615D1196EB6A76D6896B
+:1038000042BF80AFC511579AED19C657D6B830CC14
+:103810006E6FCC5B70C210AFB9908ED6727B1327DF
+:1038200055A9DB22F5E524636E326C45D2B60ADC7D
+:103830002E5F59F8C6737DC253C26E70858BAA592C
+:103840006B4EE9FD6B59676CD77AE0D0B246954272
+:1038500066E5455606D32C5C4451E9FF5834C0DA7E
+:1038600070721F63B1201D056ED4511F836D34E942
+:103870003163A3AB3CA8245619E95BFF20F3DE2F8C
+:10388000DC87F5A4E8CDEB81872E73CAD81E148699
+:1038900026E43F5B843AFE398E35C31DE82BC26DAA
+:1038A000BE4EC2AE1B9489331E52FBC3B913F4063D
+:1038B00002179F36B7A0745D9A4BC8B8D104023D79
+:1038C0008892ED037ABCDC00EBFAF7DC8132D7C7D3
+:1038D00097A20EE26E6BDC442631D5F25DA313F79E
+:1038E00094D3C8FD4788FDD1BA217711BFDACC91B6
+:1038F000D7DE1C64F11C1D970044DDC271934BFCA4
+:103900002364070E2B3C0430AB82B18F1716159D34
+:10391000D821454BFB8CA2B8D7C728DCA06254DA6B
+:10392000A32BA764BFF0F1F288FB4A11486CF8752D
+:10393000B43B74A2C7D16F3D4732037F6D515B8D9D
+:1039400096B0C5D31608FBC070578C1A777ABA4D5B
+:10395000D81DE96CA7DDD5D8229744E77D5D60D9F5
+:1039600010305D619F5679E7893F2D80C32F2E5619
+:103970009C5FCAFEF0F89311CD775F120647581787
+:10398000FD19433EE6B5759ED3096529A6681995CC
+:103990006E8C3DEE89B0E223503D53E8957A4E5946
+:1039A000244C95F50F54209596F5819AEB068E9D43
+:1039B000C80B6001E5ED79FCA934ABF0D7181826E7
+:1039C000297708073022CC00C8B95281BB157E7315
+:1039D000EEAC9CB4504FFE27683108E900335B6AB7
+:1039E00027F1A63D299FA30E40EAC8A708973CFDF2
+:1039F0004D857655600CCF2FA16355C872377CB3C7
+:103A00002350A1022067EDE177C6DE1B34C935875C
+:103A100024E8A2232D7E724FAC0DF7F36A17D2363D
+:103A2000089A320EAB15254EDF571FE1A3F0500E5A
+:103A30001348B7BE4D6FE49660DE3A042AC6FBF128
+:103A40007713D86BBD2740D1C056254EC2C6C8A932
+:103A5000C3FAEF637F3E707AC98AB7F485AF6D030E
+:103A6000605A7BC3EA5EC0797CA32C1DEC1BB6F4C4
+:103A7000136A619C5F36D80D1A2A75FCE42E69D250
+:103A80008A29D104A9BC1758AEB6445EF1ABF29AAC
+:103A900082E0719EA1E7924BDCCDAA3E47244D52B5
+:103AA00042F20C98BCA4327A806A6C2F9886018905
+:103AB000495A66B22585C1899E3E48D3605650B6A4
+:103AC000F320B56E4CF4F027146E228F61A9434D9C
+:103AD0004B0C09544FC8CD742D3A9B66BA4FB2288F
+:103AE0007E3B408811CC45139626C2F4B162A8F7FC
+:103AF000A2747E5C1A13EB0EC1ACB159E01B8FBBF4
+:103B0000E86B113D2C991265F85714911EA1BFFE68
+:103B100036BEB87576F742CCF55CC729F47A95685D
+:103B2000C73A8A346725A82639979D09F41774DDAA
+:103B3000646511743F7DB210AB99EE4675E0B3F742
+:103B40008FB381557DA3CBCB0B059955CD9F5307E3
+:103B5000A8069AF86DDCFAA8AC9E10EF0721AEA972
+:103B6000BC7410CB9999DB6A537200D227594BB8B9
+:103B70009EB311AA1230705329C30B043022174090
+:103B80003F69692872AA8BFA250AE2E2B4DC7C78E4
+:103B9000765AF0D881A0D0B94FF454F0887A904288
+:103BA000FCBC1698DE668E54DC2B25F519FBEBCD9C
+:103BB000BC3B4495296BC551C3FF1D88F3940B464C
+:103BC0000CC89C14252D36217454A1F552C430F034
+:103BD000955B5E0FC3D14DC31124D47A14800C665B
+:103BE000A895DCF4A813E89B5AA77A266545D92B3B
+:103BF00092D9AAD03E5B26ABB36753979395F784CF
+:103C0000676739588CDB59E33A46BF1252D8BA007D
+:103C1000B36D24684C503547C3EF3AB2CB4D6B6956
+:103C2000B2EDF9D1EC31943BBC3BA0B8C8A483F50C
+:103C3000BC76113ED32AA419BE53943801F25963BD
+:103C400057ABD93A8296DEABF2CC1EC5E328907C06
+:103C50009F03FE7F4B243125C5F8F2B513F00522F2
+:103C600067D6F17A65636610A9F7E7FFF22FBD1AF0
+:103C700061BC5DEB12B7CB14DF71B6DC24BAE9147A
+:103C800071685BF01EFAFBF1724CFD239CD98B40EE
+:103C900088E95D6E9A91DB0930FF8DC2B9CAC9030C
+:103CA0000ACB254A7702D003A78D56D896C2F1C316
+:103CB000184C804140FA2C7C9054F80005FE6DD0E1
+:103CC0005CC1E873053677FC0886E19283B11FC5B5
+:103CD0009D733D51B34C51610326EBF8D3B323FCE4
+:103CE0003AC2AF0BF74381246AEC11BBF0DBDC0E68
+:103CF000F125570AAD51AF327BC7B3E25C90ACBB44
+:103D0000D07771711EA08805D774518C381F2ACDC9
+:103D1000647B239E08AB6FBD21CEE0BB59FADC6308
+:103D2000E9306DDE0531CC3B769FD09F63C27B547A
+:103D3000548DDDA13F7033DCB58461E1DC5F6C291B
+:103D400003D9551F9F1BDE12B33F6E86CB4425D58A
+:103D5000C5EC50BE0A9D99B7615629A4A4430C2F07
+:103D6000D0EF2B8B404DBD6CA235E2B27884D4B13C
+:103D7000AE1571BDB0A620A366549D1DFFD7F1E915
+:103D800099918B970175DF3AC932FCD1E956DFDD95
+:103D9000B14C84A6D4497DC2C52D2785707FFE71A4
+:103DA000E6D1D1AFF9B52B0994BD0233F6AE67ADBC
+:103DB000A35A4AB89873CEFEBF1C345A546D6B0494
+:103DC000483CB14B6E7158E50FFF1438FDDB828C17
+:103DD00030E6BE6DD5AA64FB0ECBEC36B4FECCB497
+:103DE000EB48C4A482151134C94A06DD214D6BE3AA
+:103DF000AC41649A5523C572AE0FD93BFF6464BCD5
+:103E0000876602D779B9A6E796F0EB3B05F4E0AAFE
+:103E1000D2DF488DC749A445BFB644E04187E11EC3
+:103E2000E33C560410210A8B5FBEEA7E6ABAEB2A95
+:103E3000DE4201EF66AFCC1CEDDF726E53C43A1860
+:103E4000A2851417218A542A2FC02A622A32B192DD
+:103E5000944E9171195BB8618EAA2169D12AF87CC0
+:103E6000017447AF0EABE79D3FEA2915DFD98CF906
+:103E7000339BC5D94084330B18C02485101F415390
+:103E8000B2D2EF024A7337F2E833216087488EE4FA
+:103E9000D56D809552F9901415733968025FFE5EF6
+:103EA00055FF0FFFC3B816AD86DE8D538708DC477C
+:103EB0003DCC9FE2AB9922BC4E02354E9437A50211
+:103EC000A5AFDD64F5335E40727D6379144132B392
+:103ED000C87300D79EF34C4B1C60230C5BA6FCEB15
+:103EE0003E27380CFF5F0FC3FC46429CD6D3E081CF
+:103EF0006CBD13CC995CFA815D519F3613751C6FB4
+:103F00005AF7F4B4DBB510023197A3F14F4801E042
+:103F1000E174D5AA26DA58F8595DD3ABCC412D9679
+:103F2000A3F3D4A84C26044E446F0791C1236929FA
+:103F300049B34E28A23BBAF6DA08099DD809CA1738
+:103F40001313063192E1506681C214EC4660139659
+:103F50001D1CE6EA5C1C9FE3B252D69C79D0782403
+:103F600057A13C4D65003CE6A80764E64848589BCD
+:103F7000985C8AE500123FD887CBEDDC01E10E8A20
+:103F8000AE5E9026FFC14146A00FD991ADE6A4B91F
+:103F9000DBFBB41FEDBF84D07BC5C6DBE1DA730960
+:103FA000BB0C488169EC4906EE43DCECE51E1DE9DB
+:103FB000CC008C5AEDC8D6491E61D1586120917D44
+:103FC00049BA5CDB7C44FDA219C99DC3AD82033EA6
+:103FD000582270010559C563C3B1C69518C1A4E341
+:103FE000E02F9A4DA1F9A045C4F28EEB494B36FB68
+:103FF000B529D570EAFAF96B4F6347E45B12D934FF
+:104000001EECD717A0C82CF4612D0B8D65B710B628
+:10401000859DB9FA45E2C112F0209951060C311084
+:104020005A196151B344248434508546D51C97BC39
+:10403000E0BB6D0B33A195A7B46CC03B5A0B42514A
+:1040400032C6860E7EAD2618901F36DFF0650C7BDB
+:10405000C0E3F052C71E87A66FAE5D81DA047D63B0
+:10406000C10CD222E4FFA067786C60561497F9D493
+:1040700024CCA83EF4EE95308849D32B8F47CA6CE8
+:104080009A59399B5D0755F71A09A5E8C3BBE94F53
+:10409000DBEA1D6D8E0B3FF2674152DA9136895C87
+:1040A000ED4765CE9C55377172AE1A19C556B5B637
+:1040B0005C5FA61EE06E95E842EA93C963945B9646
+:1040C0003101C3164CC26F6722A37F6AED73FF07ED
+:1040D00034A91D9573BC08B468757F1319EDCE140F
+:1040E000E23A0D0A833E55C7206B271D89866D5520
+:1040F00081B213975B2F09B2430C5D625E7D30364F
+:104100001CE35817CB9E297005DAC74BBB6F745759
+:104110008C75BC1974B83B5560A55FEA3454488F60
+:10412000E5B77B03416092D46FF908EA20CEE2F054
+:10413000FCE17A4FCEE61292B4F1A24863BD4A7315
+:1041400035FAA66106F0F73403634BE6EE39D84A38
+:10415000DAEAFA26B642D0D1903D52E4E601A61C36
+:1041600058A341BA05380C360B9419E1AD6795098F
+:104170001759A7AD08ABA2F1AB1CD6B185783E6F3D
+:1041800021E587C80E58996230A98061E1C92DF4F4
+:104190009D5E428A34E289889E98B86C026B13BC9B
+:1041A000D23975DA15342DEE93D86DBA58BFCD9546
+:1041B00064AD8B501F9330DDFC0017C5F0514EFCF1
+:1041C00029F0456B10F84AEBF619AF63A98AF7DEC0
+:1041D000BE099437B98D210B31FA9193AA0EAFE83D
+:1041E0003ED90604AA8B5524477B468BD5E1682926
+:1041F0009FFCDFD6E3C35579790897655B6E9DCD4B
+:10420000C9068B47B39C36D64F81F5357B4D84E488
+:10421000F5CFDE664ADE2615B0B7AD4563F15AA488
+:1042200068E72BD875E676E608D1F0DBC5A7F7017D
+:10423000319F58D2043BDB32DE145CE45522899571
+:10424000F267502961CCCA20BA9B3903D3ABC2D7DD
+:10425000AB47AF3E1CA80A2ACB898DACCA2F2C9144
+:104260006C77A34211AC1D42DDBC68AA6F698399CB
+:10427000E5858AD1ADD16CE09FCB2FD6B0A8790F60
+:10428000BD58A4CD3AD2DCC0EC4FCDA65A0760850C
+:10429000C6B9CA85819BFAE3D2C9658D2DA10745B0
+:1042A00043C3962C6975AD051D5B9E57EC220561D5
+:1042B000C4004F96977DB572434ED67E66469AB53A
+:1042C000D8CFCCE97D3C16915179EF2D04EF95685C
+:1042D000911E87825D85B8211ABBA416A7E1646F81
+:1042E0002E6BC3FB067C6E3DC474F027E1B2DD0C7F
+:1042F000F57A5C5CB781BFB25183403798CED290DB
+:10430000864873C1BBE48BCAB4536F6DFC0CB29A80
+:104310000C1C4BF506846CBBDEDBB7E3318B1FAAAC
+:10432000A3618394BC5A0F353675EB205030272F8C
+:10433000E2D416B3C9BFD45B2C890134AABC6FB2D6
+:10434000A9AAE4682F14C826C1C8D0AEB3CC2023D4
+:104350003A15B903DC72000DD7B550579122C256F9
+:1043600001E77C6FBDA033244C6E5EC835B6A398C0
+:10437000A29121BBE3385DC9B93D77CB9DDECDBCB1
+:104380006AB5FFEE493A52BAF777B1E6ED9BCD2B0D
+:1043900024CE49D182D9E3B5630877008347D5A8F5
+:1043A0001CE86E7E257F3F4D980E2090F1CDFBECF2
+:1043B000A227FF8EA4CB921C639CF9E5126ABBA7CF
+:1043C0000D639845227CED0CB74D7ED769DAEA95EE
+:1043D000F7AD967B65DC4F5E1192F4DACC9F655D9C
+:1043E000C4C054FD11392DF9BB1B71FCFECC09B0C2
+:1043F000F0A100A6D0A1961C942BED5A0F322607EF
+:10440000AD6B5892ACE2D8F90E4BEE9E779FFA7ADC
+:1044100041271BC839EB587A22EDD2C33C588EECA9
+:10442000642F6F37C78AA83546146FEA0CE66B56BF
+:10443000EA1C3234DC8120FE0EC66CEA936A9F3897
+:1044400065119DFCA940A7EE5780771CA732DCF2CE
+:10445000C3E99A4316B6520435A242D8D1A7F5E271
+:1044600093EEF3077B490850AC42D887BE7FA72361
+:10447000FADB698095B0882AEE9B112A701A527275
+:10448000053D10FD6DA0062E5167CA11525B351116
+:10449000C581097032562869F43490D3559EA68898
+:1044A00020340D876772067DF724EBCFC8631D515A
+:1044B0006B3CD621F086E0673E5A399BEC68FA5295
+:1044C000E742987E5F0D9BC7BE412B5AF8AB76370B
+:1044D000686083501CD4F5A7D2D17036CD6A09C963
+:1044E0008B01A47417FE2E62518BF1CB6E3794684A
+:1044F0007F29EE9620A97DDED99AA09AA68C37DC7A
+:10450000DF9E864574382EC323019C272CBED374AE
+:10451000C28F0716655337EF10880798C9C5D6CEE6
+:1045200019BB52006E72C775A6FE45D9846359FE49
+:10453000189165ACCC5175371B1713EF7891257125
+:10454000D2A903A06D98577A9E7BF16EFD9DEEACCB
+:10455000FACD73B893FCBBF91046939AEA6DDF6FFE
+:10456000840DAC88A7B03DCCE315E801729F9D8D0A
+:10457000934FD3D09E6AAA0350949A44DAA128415B
+:10458000B139CA6EC7187B08F664F82183A498A9CC
+:1045900009077C6268D6A7E1DDD836494A2E52AABF
+:1045A0007D40ED315D6747E0593892C6C3907A4F40
+:1045B0008EA988C9BE263E8404D3AC8C3E4CF41B25
+:1045C0009FD5B75FF74BF50AE87A6C89B00F158174
+:1045D000EEACD03C515AA08390F6AAF9EA56F3A06B
+:1045E0003F645DEB87117A8CD904CDABCD351B3A96
+:1045F000F6469E1A0E4AFA40E0AED1E67A1390EEE5
+:104600008120D0D4DC30FE2D49FE7DE2177E82026F
+:10461000FB81C183627586AD0F9D8B758448F8E57B
+:10462000F0A9AF97A83107644E98F78D60C8E0E80D
+:104630000A22E3ADADD6BA6ABCCEED45ED76A962ED
+:1046400068128A080DD4E3FDE5B929D2618BEB43EA
+:1046500072A0C9ECFAA4AB9FC70CEFF586711B1FC3
+:10466000648C245A8B6E7591172B4A7731704847AA
+:10467000F6CDFF69F1C6644E24C9AC509871F39031
+:10468000C4F6AB0D1408CF767047B7A94C9E0257FD
+:10469000A9BE5716D7119B79C15AADA4CF31544F3B
+:1046A0006B85E688515DE76597F83A59B6FF395E44
+:1046B000BF6D8DD92EEC299CAD0CA3E2BF8B36CFFC
+:1046C0005805C242012F00FBA430B5A012FB6B2C91
+:1046D0007095D9A9F138D05F903F304A22E78A23FC
+:1046E000AD841312BCB6D030B1E6D7DBFBCB43A709
+:1046F000AF8216CCFD25D62448B0C5BCE093E67643
+:104700000C90CCD6CDA6B2327F2466ED10D1E0B8A5
+:1047100033EFFD571B1B7E8C3634F3207A261310A3
+:10472000CB8F71B8D2A341F70DD4C25C565748FD68
+:10473000545DDDF41B4142B38BE8DC8AFA2A83D84E
+:104740000668E0A134E7ABAC0F686B0A14458EA095
+:10475000514BFCE3566C5CC89430D0B0786D547605
+:10476000D45A7BFC37BB478873B14FC1956FD5597D
+:104770001B5519D317E0AD317899AD2580C248C6D5
+:10478000282A988F2B708644CEFBD50B3D1D2E9F7B
+:104790001E7CF3307CE37A66A0E109C4FE5DF7017C
+:1047A000228E5D4FE1530617471461288204B83FFB
+:1047B000085B0D450CB51BBD62BF624BEE29E0776F
+:1047C0005FB64C66E2669BCA187E4BABA46B015E7B
+:1047D000360E8AE119166A379B9200843CBA8752DA
+:1047E000BB78BDF83312562DC4CEE2F9C3D2F4A380
+:1047F000AF91C4E2F5DC3EF30B2971E5F8F05A669F
+:104800009F184FB4B0F0FBCAB0765CBAA96442FD01
+:10481000E2274814576E7C3AD15C2FC444E59B04D0
+:104820008FAA630B3ACF1D47B8816E4E37D8917A65
+:104830007CECB7AC57F8F1AC801DDBC9E185FA2000
+:10484000D46C8FE60F4613C907C443D725F5C87F3C
+:104850002D2F6F2B518A6FB851BB326F0F01476AF2
+:104860000DC37A98D0A9F9D041F227739C71D681F3
+:10487000170DA3E5BF23448EFC6949F0B634A1AA05
+:10488000737DEDB07F279B82B69A65ADB9CB1501DC
+:10489000639AE738773DE9E65655C60B2C34712EFE
+:1048A0007D2ABF671AE50715763242FFA06FC5D98A
+:1048B000FD5742CF022C03958B6BD463F99466A409
+:1048C00046239794F1B32AA9623640ABA26AD6F385
+:1048D00085414215B1CB06F8A81D9205008A503DCE
+:1048E0007002D3AAB0E05EDD93245FCB0F4E316A35
+:1048F000601F5540EF2B15DEAA4AA718DE4F5D9AC0
+:10490000678AE7FD5064E86DEF0E51E9E1F6DD4995
+:10491000A92A570165702167E1D45E1E126588EDF2
+:1049200033D087F968518A676C600E89CA5B185961
+:10493000746BB1331DDFEC61254106FF5012312D40
+:104940004CB0C1880A689FC67214746FEF7EDFD8BE
+:1049500050EAB6DFB969F56F801D2CD707A8518DD5
+:104960004F044064C0812D4C3390D6586FC48733B8
+:104970008142B456E86F897497A5A8F355369E37DF
+:104980002C1000A7776BEEF924A1E17D397DD0577B
+:10499000FB1661BA3DF29965EC273A84944A7C4F44
+:1049A00003CDCAF512CECE42BD0BB467E963E3591D
+:1049B00033A8AB6DDB95D29541C649438177998D7C
+:1049C000B1A5A75F2067E2A69EA888FFCB9419BD7A
+:1049D0004F14DD21D4283A7DDA5442DEA933A058A1
+:1049E0004A58B6A121D747729E05DA55ADAF587B1C
+:1049F000A01C8AEA72BC3F4D4F4501AC127BC67DBC
+:104A0000B15A6ADF7EBFB8CC4B6E0A969484A1D7A8
+:104A1000A0C68832B9CFBEDDE8288BBA3457FDDB9B
+:104A20008789746858A50C84D0246A341BEC7C8B6D
+:104A3000BB4ECF38BB10AFFDA243085F167780C8CE
+:104A40007F8FC612EA92B16ED80DF8A78725C8F8F5
+:104A500074A2A7BE9721C13F659DBE54E2BA37E557
+:104A6000D6287C829DFF81AEA04702E54837C62547
+:104A7000A5D50FCD0EE6C966E1D358E976C8FD4F3E
+:104A80009C6BF87A4500ABADF687FD489FB28BDF93
+:104A9000CE52EBC648D90659A6486EBD9E437EBA93
+:104AA00061E271159AADCD18AE1B1EC1EB1A42A47E
+:104AB000964E5DC05A9BD71D0AF16E40569B069BD1
+:104AC00067C56BA02BC539122096AC2395FE78499B
+:104AD0003CAF5BCC0F9C8900978E79829E744962B3
+:104AE00089A5197F24D7561A68EBB89EA035CD400A
+:104AF0003495866F19C8E1D2BF7E5F45BA797EA032
+:104B0000D1A3BE0760FAED2FB6C64939A238898510
+:104B10002965C96FDF17BC995252F8FD2BDE4F4251
+:104B200075050D67CA9E7E2E6CE58086B40B768176
+:104B3000EF8DBA0BBAD33CCC7CFA7DBFD7095B387A
+:104B4000BA18FD89C125139171C69BAE1075DB4360
+:104B5000445AE9DDD65DBBC4F9931C7AB4C37BE348
+:104B60000FB79A14D6EF8CF25EA3186EF5AB38E04F
+:104B7000411FE4FA9F1FD5764E01F1BE6F2AC0DBBC
+:104B80004E2B3008D50B55938C2C37DFC52279EE90
+:104B9000B2B4E914D874C438934C3D1818C70B212B
+:104BA0003215B642F0FADF9FC9904C54B2DE7F68EE
+:104BB000C4A341DA9BD8D0628FB2F6A3938FEA16D2
+:104BC000667CFF0A67975B724BAED21AA9BE5A8009
+:104BD000AFA9E738A500ADC69628BFD619ACE298B4
+:104BE0004F1B6930BD8DA6F8CEEFE5BDDB33E45D2C
+:104BF0006526938B5C4BA233A3A43FF2DCBF3CA79A
+:104C000085BDF106E73148FF19EF23C4BB20368F7D
+:104C100085F6910C077BE31F21BB8C14C48E8D732A
+:104C2000367A9AA2116E5B2CB5672DCC07C112673C
+:104C3000EF4616FCB96C67D92606D006446427AF48
+:104C4000945AEA813786FEB9954428F94EE906FD63
+:104C500054135F3A7D4C87617E96096A739B773661
+:104C60005885CA84D226FDA1D140887CE66DDA0041
+:104C70002770DD2A978EB3EC1425571E29BF83B702
+:104C8000AFA7227CF925A85A7548DD44881C5F9996
+:104C9000E9F8854F59421EDEC6715783BADD98BCCC
+:104CA00068B33D0DB05D6F30F91E47F09E95EE88FC
+:104CB000FC7EB243BEC6D63B3CB79C44C340DADC64
+:104CC000C173726656B84A26A76E067AEE8E44D530
+:104CD00084DE2B6C57774CCA97E0FB8DAA8826A1FF
+:104CE0008389AACD4FDEC20C9F2AD7FB2A5CDEAB9C
+:104CF000EF0ED496932328814A132A820C24261C73
+:104D0000B2E638DAE2DBC5854D12321AA97A6BEECB
+:104D1000952CE7F395BFE406AA711325E3016452CD
+:104D20008CD80AC92260C6E799370D0B33765B8DA4
+:104D3000CBB1B8B8B7BA8C7040BC27BE7860E997E1
+:104D40008B5DF6F9AF98B694ACB7AAC540E8E0C160
+:104D5000F7689A90E4EE65D5F20058330EC62F2717
+:104D6000D06DD77A9C6F47A71C07F997E9BCF4B7B9
+:104D70008ABBA1B72592DD1712CC12DAB6DC9F4FA1
+:104D800027EA3D030A0093337BD2814F94D649151D
+:104D9000BCA58E4D11DBAB1EC1F5137A4C291D82CB
+:104DA0009F2C9B744C683262826FE192EF6E5601C9
+:104DB0002A65EAA928A3EE03B94B47B9505FAD02B3
+:104DC000671C3628F17D9845B1998EA3A32A986275
+:104DD000A6351AF54A910B702AF982E6709190BEB9
+:104DE000377DC17C834558446138E960A7BB6A2C94
+:104DF000713F24D2E52612EFE4AABACE7E2D22B965
+:104E0000A7BF4FBF9E5296EBB5C32E1CA5EA3A072B
+:104E1000A120144EF4CEDA8EAC9E966BC5D87D18C8
+:104E2000646C5D2E70E73F4515D1BFB001207C0258
+:104E3000DBCF2DC625D965D05F88C91A89CC01037F
+:104E40000C0D68A5186405593BCE2B238205AEEBEB
+:104E500043382BDAA423D9B847886C1239A1EB1256
+:104E600070EDD5C3FDB822AE8FCCF9A6F709360E8A
+:104E70003983B70A1FFFBD9B86E6B59B1047AE334B
+:104E8000F18ED846A9A6DCE6E4D5E9314CF98218C2
+:104E90006BF13E6FD14C1410906E6C064230CE4ACE
+:104EA000E0BC6C48D92ED5CBD8A5C194A1FB9056B7
+:104EB000CFE0803A640093C38257563F9C278178A5
+:104EC000B8FD84E44F6460A066D38645D14F91EB72
+:104ED000FDA01B3529DBFC4FEA656B26C1B11AF832
+:104EE0006980F8514D634D7731C38BEBB471FAABE8
+:104EF00089950D7F0092D4E40D13AA0C874F2DDF06
+:104F0000D57FD982C0781DF91B3DF1EA581BB17DD0
+:104F100076F56F83F3CC72A80A989295B142A5E911
+:104F20001A2707E28B8B6B506735F3DD2556F1EBC3
+:104F3000DC4AC803341247189058D61DF2A5DA424D
+:104F40001CF2E609E55CDB2988437108DE06BC69D2
+:104F5000EEEB8A9C5340E7E6DA7638AA95B73F60D5
+:104F60005395E3DD198FAE2CBC6EABA3D7A085F4AF
+:104F70000F24C71CD3A098C45AF1FBD3E6EC150349
+:104F8000C23CF9DC7E21908109D2DFA1DF49C41344
+:104F900012A8080B39E159206BC53BC27522D96CA8
+:104FA0000302667EFCFBD5284207DB516A2E4FB90F
+:104FB000AB2132B72889F80922E032EADC3EF48AD4
+:104FC000F43FFE670C31F337FD780BFAD7F2A8FDFA
+:104FD0006E7836AF51925B3542592208BFED720CA4
+:104FE000602DA3E96F5D2C8422189070755BFDA67F
+:104FF00026E0FC6B1FE953A7C9354A416063762A56
+:1050000021F9EB009DDBCEB7EEDF2B61A812AB24BC
+:105010001C1D77B87F1C8AA75A5F8A132446020793
+:1050200008F589137535B069113633E2A9B8A07A4D
+:10503000953BD01357FBF3F97A61BB5FEC645436B0
+:105040009BEF18A6997CE3E9683FA4FBED7751BB81
+:10505000596C3978929E9EB8E5A5E30FB856B8D43E
+:105060006004FB29D03A478ACA49417ADE52EB7D77
+:10507000D60FC91B8CE05269FE6B1AB46C3138CF65
+:10508000326A67B5F6D8B9136A92C2B700A9FEE0D2
+:10509000B82FE87348E3A5CC3022B88023F47C7A9B
+:1050A00050B4982057FF04AAF050824B94C6A61D16
+:1050B0008427834EE54979FA83F5F7446E63FCD281
+:1050C000221906BA58F4F9DD34F0A244D94E7C9B7B
+:1050D00078F3FDC7C30A03815B43B4D9D9FCD1453A
+:1050E000A554BBF843263B0C98FB698B59E256B29A
+:1050F00063E6787C805C7DC141EABA18AEB5B2D96E
+:1051000027340F9F659D6876D6F141C0BB1935E104
+:10511000D0784ACEDE6DEC6718C08544990338C854
+:1051200010DCE97E497C61DD71005C81370217F497
+:10513000A8E6A0537A5A261DEFBD45A6E5255AB824
+:10514000F844A59344DCFB7283299D836E095F8735
+:10515000A68958479B9EB6FFB63231B1B431629CE6
+:10516000A4B4D9092EF60BF024FFCE58A6E7109B65
+:10517000AF13296E2D9AB661DE67AF7084F66A5A56
+:1051800076A08DAEC71D4925644CCB451A1D5AD457
+:10519000D0464D12D86025E9BFB082C9AE4F3DFA66
+:1051A000E10655996F064BD3D286261113A72BF231
+:1051B000A5E6DCEB0891134FBF59CB3F88767A11F7
+:1051C000596B404EF2BFE14DCA2A4252ADF9473702
+:1051D0001A221BAD576F1472B965EF3E0B28CAA295
+:1051E0005ABB804946D4031AB660F25CEFFAFAD78C
+:1051F000B1DB58E2F0FA4638BE1623A3F3352E375A
+:105200003B4AB642078BA5ED1B4590A90EA0BA3CC0
+:10521000F55380C56C6D6F738948EC7901EAC4FE63
+:1052200090690B361C4201B0FD11B2C16B3A822568
+:105230001AD4AFA2FDE0ED40E0596B5362D8F4936D
+:10524000E1DEBCC5E246DC33BDE5AB3BCAC71F4A65
+:105250009FD5E87BE94E6A8B571C3CC4AFAC1FE777
+:10526000734009526B7AE1F8B5E081722D47F0FF87
+:1052700006523424691EB0656BA55FC9E8D6FE8569
+:10528000A394ABBB3DB28BA53858C53EE68DD82C58
+:10529000662E78688BD7636EE022E3104178023D7A
+:1052A0005E8ECF1B18A4188786422953510EF99A97
+:1052B000FFF81D3755D0FF4C7457AD0AA6BDCD6E13
+:1052C00098FB0F6F0F3AEF4B74ED1F85177BBF16DE
+:1052D000A17F10B511724AB0394CC121A255937902
+:1052E000C2BD17B15B889453F8D3313A9B4DD06659
+:1052F0001BBE9830B1D1D3643E02D5E604E585C12A
+:10530000AF79FE3B1C2AC6458AEB41F6A519A836A3
+:1053100051CBF48F53FDEDBEEC9B2623271E175E69
+:10532000A137EB6995B68A1D251629A5ABB3AB6DE0
+:105330008BC401E055ADB0ACCBB3B2289A52204D2E
+:105340002B7451232EE00ACCB7F2371BCCF5C58D58
+:1053500006B5C4A94781F26250673002F7B08E17D4
+:10536000C9FE0B0FFB7ED6883811710F3141457293
+:1053700012668F6165EBE65DABE190F2F2F2E173EC
+:10538000EEF0D725BAFC50E3D9A9458916B1F15EF4
+:10539000D339EBDD7FD013212274A2AE2E24712EDF
+:1053A00087B704B4FD46F6059BB37A3EE5EDFACF28
+:1053B00005E7490E988BD05AB3FF0DFFBCCC5AFBC2
+:1053C00098113E34F8D956EB2DD4A13B5A4DE21535
+:1053D000E9943C202A9F146013B61698790D112881
+:1053E000DE2582A75DB79E0E6A594930DBB91F0FD3
+:1053F00085A29976B787BB853DECE063A897D67BFD
+:105400008C0234B3A7D50141B76235EA6CF8D1DC20
+:10541000D90AB371EA602F34A136782F06A1460C61
+:10542000465137D432BFAE0A3FCA66CD5C52181F10
+:105430000F2041EA8973587C00DD4A4FC43D4F1F5D
+:1054400014D06C27377D283E1921997CABB67EAFEE
+:105450002CB036E173A667CB15D61DB8481E227D49
+:1054600099DD695D93EA00009507F03E9F0B21A04E
+:105470000E1079E301C75FD600FF444E8C668300AF
+:10548000BA2D0E90BD0ED921EA3AEB622C5350464C
+:105490001D2DC64D9CD6437DA100EA8974FCE3CC4A
+:1054A000C8948F45573B8888E2074B132766A1E4D1
+:1054B000DC8928E147EB60B1D3C91EA48FC2EA287A
+:1054C00027C2726CD4E26B4B232D9607A4C5B70E8E
+:1054D000184A143BBDE5EE40FC2D8405D6198386A1
+:1054E00098C3FE35ED10E0C3437DF34C00D750FB6D
+:1054F00050423DC9E8B6FF921533BE24C12CAA2004
+:10550000FCDC48456B73C74B226935B9F7851F5ED4
+:10551000C982C36890973E42410E0A37DFC9A53C55
+:10552000ACB69CB5AD2CC41F9A794BCE8796879CA0
+:10553000A63A58609C0C6CB115D6C6412CDCA54F20
+:10554000CE75C0F7E2911BB1E3A6E361D01127301D
+:105550005B222A3A869C86745803C7D7D81EE7C0B8
+:10556000F09F22FCEEBE46EC41D4145A86935ADAE0
+:105570002B0684D2279D05E793079D08849AE15660
+:105580001DA2EF7A8B0800F8BD3801FC975AD4F9B8
+:10559000A780D4FD8CC4AE3D6B3D0BC7D8A79C271C
+:1055A000F25B56DC1DBFE4DF7D97D6C24F2E387804
+:1055B000F87B294AE8620DF97C900D27FC0A185403
+:1055C000A947EB3D252F264F9177CBC41560AA63E1
+:1055D00038C686870337E81B32AD6D90A02832B3FA
+:1055E0009CB483554E6A84871795CE4A172294AF90
+:1055F000B710F2646B49589C0372D650D4DBAC8E62
+:105600009B82A0C96ED8C66F36665A6324360228BC
+:105610005205BD6CE5776A795E6FCFB7711DE1FE0B
+:105620005BC7461FB892A215EC0A79E372C355E135
+:10563000B9F711B7A4A08642D930A30B3FCB938B07
+:105640006877260D96CA531A077CDC83C26A548693
+:10565000F0EDA9D09E52958E31B8EC035C962A9459
+:10566000B51AF1EF95774919AEC939DD64A7DCE7C2
+:1056700006369C0D37138730ACBA77E1898E3B48EC
+:10568000FD9BB5180FB48130C41C8E45179ADA33D0
+:1056900051417277A68948F2155B96E8134324A11D
+:1056A00025807B62BEB940DDAF60AC1CE6E725E833
+:1056B000C762E3BB241AD81322451C0442FBDA0755
+:1056C0004C3423F46EEAD02799D8603E767D4EBAEA
+:1056D0001FD60F0AE5B665E58CBC346AD67BB4AC40
+:1056E00020C187188D7B1E2BF9F0FF0B8940D9BA9A
+:1056F000E769DE279537D0A69FDC229957B9857ACE
+:1057000047102472CA98E8B9F83F4F16C583A4F928
+:10571000541FF875D0178C89DFADD8E569904F110B
+:10572000431ADA9E27E2DC15250A5402D6B5C5F3E2
+:10573000FB1E37A85A6F33DBFB3FF2C9EA99CA2731
+:10574000B3F91295D388E911A403E947F4380DC7DA
+:10575000249113CC78F3654BC5912327B7314614B8
+:10576000F5FD522FEFFC6FD3F2012300A01F75CD82
+:1057700020BCDFD37425C33EF884EBE65C4F38E3EE
+:105780000FD0590B03F395B668BA182C9EEDEC6553
+:105790009504DC11C19BC4A526A51CF86C12CE850E
+:1057A0007FC7EE9245089F69B61BEEB33CB0AF0BC6
+:1057B000195C08A4ACE0C1EED471C5725E6C73D004
+:1057C0005205586099049AB4BF4F7D524BF3387319
+:1057D00058FA45FBC855EEE3C0A0381372C8F0155F
+:1057E00011059514B5DDF37E5FD1948C5F749496AA
+:1057F0000D54144469B45E9A57D59B933FF2EFACB5
+:1058000039189EE331E614E4D11FA7994983BB4EB2
+:10581000F41ED408EE20A3D33AA8D6E8B2C85DF3AC
+:10582000D4602006987E35D35B668A24AB1EB2E72F
+:10583000A91BFD18F40D5AA1A033E18A65D6010C0D
+:10584000CE0AC82155EBA47F93DA1FDCBCCE0F78BB
+:10585000405A5BCC4AF8B4FCD6F642F79E1603D801
+:10586000E225620AF90C7F12DB35FED7868BA3593D
+:105870007ACC8860D18B17EDB11A03BE6CF932B2C5
+:1058800065BC9CD6393D43A74EF0293EDA6A974C59
+:10589000C607A8EF4EA38A5B3F6220B6157208D0F8
+:1058A000644B8DB654BA54737FCE224C1B95175956
+:1058B0009DB95014BEB46CAC236F8C9BD88C847B88
+:1058C000A8C0885F1A3F4D301825FBD938C420E2A4
+:1058D0007C8A673906B7F2C0CB95307CC145B03FB2
+:1058E000F2EBD25B819576CB398234443785CE4951
+:1058F00087084BC6750BE2D33C20780060664B16D8
+:10590000409251B58080F5879C9FD8B6F2084181BE
+:10591000424FFFC4A341DC81ABE16128C02F1B2CA7
+:10592000324ECC63748150F6C6860FF1D0096432D2
+:10593000556B8A709D9F5D26B04672693D9762B92E
+:105940008EA41787341FC00A6C930A234752FBA208
+:105950008CF2433CDCEE58F68F2AD785FC30414A66
+:105960005D22ABB92FA26E8459E14745695F65B4EA
+:1059700049E6BCC8111DDFDCAF20EDEB141A7D44F5
+:10598000557C0F60C7B687E94EE398191DFBCC67BD
+:105990001F19BA43769DD9A8FAC41E1A96C40B786B
+:1059A00064682626E9987DBA402DD7B88F808AD1C1
+:1059B00056C0312F9E9C4FDF80104FA6AB255A9BBF
+:1059C0002DAB499CE4EEAA0B510C95A55D78CC5FFC
+:1059D000CEACD5EDF2D985F64F21CBDDBB0612DC7E
+:1059E0009F286FB50D4EF646E48BE882B3B5B16AD9
+:1059F000D806CC91B6E6D0CE0D1A61E98F756076E7
+:105A0000D69C71E63F35DDC750C206D40D8E608E40
+:105A1000C034D4396872B76D2765E89D3575480480
+:105A2000ECF080AA000B6AEA80C2D8BA4BA122F639
+:105A3000F76423A40C36F656F621A54EA872FB0493
+:105A40006F30FB4EF54115E336E2724C58E6BAE290
+:105A50001ECD011CDACF45F830E2D12689B9BDD080
+:105A60004893A39A08F384384B50495FDE13971389
+:105A700004505D890BFB86279B9E6D42EAE77E1FE3
+:105A800036EA64690373B4952AFFAE2BE9BCE1AD35
+:105A90005B8F9D9BC3A8A96142D19F080F8656C00A
+:105AA00085D66048370A207EE3C779C76A42EB444F
+:105AB000747F23222E6AA8B091E779951E60E112C7
+:105AC00074D9AAF496431526321596FF435A3C6FB3
+:105AD000646CFDFFBB2E4773EE286FF6D715DAF026
+:105AE0001FFC01FF529A19AE2C8ED2680D221C7336
+:105AF00071E5331847BAB8FDC6DA2D1C778F3D52D1
+:105B0000087B493C056C81C5E79E368DCDF17981D6
+:105B10008E4545FA334287DDDEF7E85BD6B831576C
+:105B2000C0C371D74C384F858DB01C957F1230465D
+:105B300073CC1EDE45AC8D84518198844CA84A5F9D
+:105B40000374B9BEE71A3E84A3C9378A4FBFF5BFB5
+:105B50004600AA9B4E77325388FB6FC94DDD65F72F
+:105B6000D56DE12649E3034E174C276E3C5074CDAA
+:105B7000F298D4B5B8ECE6DB362B0DF57037B4CD22
+:105B8000C3FC6DA2D9E8100F3F27E2C5B52BC93A77
+:105B900069237EC6C6186ABADB200C923CFB1C81C6
+:105BA000442790D9B3B1C0C453B97495F1543ECDD4
+:105BB000B988FBE7ED2DE1DF5FCD8E49AD4F6D84F8
+:105BC000757FD8B99B4E079D8E0BF66111B8C647FD
+:105BD00058480B36E75BFE1F337C117EF25465DFBD
+:105BE00077AB4A1BEACB5934558300924F5BB9E738
+:105BF000DAD390AA8B18D0CE55AD13E38DCEE4BC8A
+:105C0000A43E4BC04B582E921E155B894BA55AC71C
+:105C1000836DE831CF9D8E55AF3A67E02C23DEB51A
+:105C2000113B9F8CF3879B45C8AEC07FC8CC70A04A
+:105C3000D5FE4B7B7F85959AA9D993D3AC75BA5A7B
+:105C4000BCB47E86DD3FC8B0320AD7EEF5D2F2DCB6
+:105C5000E806A277CC1ABFA5BD7BFDC2D6206E5F39
+:105C6000887A05204F2DFD8C9427FC9CC741B826CF
+:105C70009CB6498CB0F04FA3B5A4DE55057B0B0450
+:105C80001CBBC8774265231E3FDA013AE17A91BF17
+:105C900025F5567BDCEBD70EC6AEE0DA62966B07D5
+:105CA000A77DD4382D83871C7E3925177B354AB1D3
+:105CB00088AC1A37DED39A9DE34D5B17070D07605A
+:105CC000187BD6ED268B30384FC7292BCBB827FE53
+:105CD000707C7BB62177B2C93AFBEED7ABC104E842
+:105CE00027F5A0BFAA7A0A0D101E4A06D146282A17
+:105CF0003BDC5ECD1A1E2510445502FA75D969B8F1
+:105D0000684D33F740E3095485931CB27AF2A99E9B
+:105D10002A004E81106DB9D025338FE79103DBD96E
+:105D20006E01B4B44A4590F10E190D987445AADD80
+:105D300072E9DF23354F34F8BEDCD13E1B6909DA46
+:105D4000F0A75303B2F6796D7DB28CA5EC3808C18B
+:105D5000A53A7353CD73BD719C3F821F9873666AD9
+:105D6000C3D326BE07AAEE9AC7AF17BA41BAFFB58A
+:105D700027333F30A408F48F6B46FB8360E744175A
+:105D8000DB09EA034A663C89668CC246D9314ACBB4
+:105D900098E4233F8A04B3D6B7E113FF065C6F7D16
+:105DA000363815B92922FF8BF6B72F82AC3541ACB6
+:105DB0001AE71285B5C648D151EB6ADB921A40FC4E
+:105DC000CC7670AC01DC6F25A04AF7957D6EF5CFDF
+:105DD000B6670B35A26DF19610844F85B13C6C69A6
+:105DE000526E305A5EA0B36F85CF232BB530AE60B4
+:105DF0001A829BFE3FF92468BE1C2E9DC11F692F8D
+:105E0000FFA32F54891472D500C7DC71B25F03A4BD
+:105E10008BA3B8A81583A0989A9FEA599F663DB0B6
+:105E200084DA1C0B1F661BBA6A423FF7306A0323F1
+:105E300027047AC76C5974E95F667F9C6566060E15
+:105E400056DA844F203813BF99093CB4D5ACF5B667
+:105E50005DB3ADA4E8CE3E5A95026BDE9AD3C9ACD1
+:105E600051936573AB5E888E3CCE4BFA3FA552BC16
+:105E700049F43D2C7B7B259DAFFB0559982BB3B294
+:105E800038F5A68C8E319AF3039804BF208013FE58
+:105E9000667691FE22541A731A073F87354F84B4F1
+:105EA000B69C774BDC863B2B29ED3A0ECCF66CC1C9
+:105EB000BD83460288F7DBF8B16022B890A76FCFA8
+:105EC000EE4F6C0D893F3A4DA2E0C6E3861FECF51C
+:105ED000933D95297738EA6B19997A57DFDAE90308
+:105EE000690D9BD85384CDB78E9C23F5869E1E7F6B
+:105EF0004B8EB8113EAF150F024525C1CC4F28BDC2
+:105F0000A5BB99482D7CF8EADF8339A49910A23DFE
+:105F100020D55359F3ED636340E3BF7BF2B3140222
+:105F2000D065B961C6F74724538670846BADB9DE7E
+:105F30004DC596FB63C93E3C244465285E49B9FCC7
+:105F4000E780F84AD3A697494CE5196F0CA44B8A11
+:105F5000EAB40E76EA3BC2D38028DC9399C24D574F
+:105F60001B3C437C92AE00013C1CE0143A86BEC44C
+:105F7000A74881A997D6BB55AB4CFA21C1FB306B22
+:105F8000D6F3D097D30FAA7099053F7EB870B02B87
+:105F900009022502DFA48A80EADC4412C519BCE2AA
+:105FA0009BAAD4690934CA9A1454D89272751E8374
+:105FB000E964E980A92B54E099FA236935A95FE9DE
+:105FC00055429932FAD3FA1379DB1B8DC87ECAF594
+:105FD00055DD1DF2BE7C880280BC0A7FEC2B4E672B
+:105FE000B9C1B058D79F8CA7EBCDE8D62F21882D0B
+:105FF0004AEBC4B784F85B96BB1848933C00B6E8FC
+:1060000045118BE5A9611212499AB1C0D765CA94AE
+:106010009278A1CA9078052FE4071A12AE132E3594
+:106020009F9C71095C9D060FAAE2F3B74FBEC25553
+:10603000D592BA2B9362AC8683CB745E736A015E91
+:10604000BEDE3C4A0B2BBA442728F9F7B12E8F1A33
+:10605000C8EDDB43E0B6767FF2A4C8F77A9D53B073
+:10606000652FAD87DDF4EB8C32316C82C5F1DB2717
+:106070001A447C4AA2E5C4A50F00FFDC150EFD857D
+:106080000B54EFB88B0015F00B74000766354864AD
+:10609000150B036E90EF789A214EDB7D11B0203AFC
+:1060A00092B05BB2BE028F530231C8C0434076E467
+:1060B000F72568D346632ACEFC4276E848E0FB8B9E
+:1060C000F293A49B2863659B32CF1246F192FECADD
+:1060D000666E1A0E0DEF510D66F073AFD2F24BEFF4
+:1060E000A5CA6608D96BA3E6F1A03E65770547D837
+:1060F00021D128B90194C19CC8914D4FCF3B634237
+:106100005E5A396BBA4DB77395B9A02EB74DC8FF1B
+:10611000DADEEB6FEB7A9E9B9A2FC32CB7ADA1D83A
+:1061200094EC5B05BA6BA6433CB86E0A270FEEB839
+:106130000C83B143FD0945E4DCBDDCEEBD4CEE55FE
+:106140007E39B9BDF6A2CC7C801AFC5A81A8EF0238
+:10615000E814DDB0C4FA12506789A6ACD813EC3449
+:10616000FA0086B090D7A562B5E5927A0FADF8D760
+:10617000CE1A65996FEEA06F75AB27B73800C2F5E0
+:106180007109F7EB5724CBC3EFB9FD7F2BAF21EF9C
+:106190002EC4FD9F438138F5F660AA6D0BD6AD7E07
+:1061A0006C687C70E3C73752BF03015ED396673BD0
+:1061B000A53D6D3CF3E5EF57C3967B1A05869B8C96
+:1061C000BC7E43F0B17CC38AF183F44997DA07CFF0
+:1061D00001FDE8DFF568A0874E5CE03618D3FAF5DC
+:1061E000C2EEEEF7BEDD01FA93F24D68B441F988D4
+:1061F00054E8A3C80F6A8EE0A163D98DA25FBE2BBD
+:10620000D67F7123676727A649C8EB7D419B1EADEA
+:106210008646B86B7FCCF8F3DAA6D1A894432A401F
+:10622000352C37A3845793D96405D63BC679D9D684
+:1062300072B0907D0625EAAD644DF2A7D0DD29C588
+:1062400035051793B0066C1BFBE3CD24A2D3F94EA2
+:10625000F4798DB0D7C8B8B9E459976BA2D8AD4ED0
+:1062600079558DA42555B7E1FDE3F47EF77145B26C
+:10627000C23C536F36935245BDBCCE2D76236DC4C0
+:106280008C33E9D51CD40AAF4BA22E307E0261E6D6
+:1062900011EB2ECF38B503A9EDE19EBC7BE9C922F5
+:1062A00062B62B87236E1785901328B30006C1B4FE
+:1062B000703107FFB152672B6C5C76D5DF4B5C6F9A
+:1062C000BB2758F513FD5CCFC05AB772315E7820FA
+:1062D000AE4142877D66006D33585D5EBE83F50238
+:1062E000FB42DDA80E58A5A2089C49BB5022D378DA
+:1062F0001888ACC475E5899D9DC6498DBFCDC73949
+:106300007EB15FD268B316E3C35E71BDCF9527D26D
+:1063100057B59179A05240DD22E89C1B470256AE4A
+:106320000FD75EA13E9030A78165E5A8269BC4E506
+:10633000DF9DE485427AF3933222372F36B22992D9
+:106340009189C7F388F1AC0FF9D000403875A1A945
+:10635000BB8E47E63EAE79E171A546DC47E222936B
+:106360004E78C6746380650D9E848F8F86D05AFBED
+:10637000D1AB3256C2537C2A363F4156536F103749
+:1063800089997B14628B087A23625690FC845DA9FC
+:10639000F1402EE2D31EB5B3B315DC12FDE1217D31
+:1063A00094FABB4B548D2CCDA6114D88D264F12CA0
+:1063B0003D7859FEDB7703CF46F48654CDE4D746CB
+:1063C000DAF4DDE3929DB2BDDED9FFEFC46A27A8FF
+:1063D000498743A9F965A5BDEBD8E16810EA6E537A
+:1063E00057E91C1287AF9FB794AC09DA86C263974E
+:1063F0008757D61EC51548EC9EA5F11639D2231C29
+:1064000038968A1126A9F35C6D24B09AA6A761611B
+:106410002D33FF9E32AF5BB4A377805A7EA8F82954
+:1064200024B930842F4982576C3B7F93A3536A165B
+:106430009ADAEB95250C56D5587E33BD4233323A65
+:10644000258C33D13E55D8BA1D259B2EE7D12DF191
+:10645000813AD7246377BF690B5C69D8C9D5FC56EC
+:10646000CEEBE9EF1BB74A0FD5042257D468CDCB4A
+:1064700042F74A90E84E7877B61074A18046A1F3AF
+:10648000BD2532AF9BEAEABFE3C2C952F3B0BCB943
+:10649000350928C10868D00987AAAD058653A60D1D
+:1064A000E417F1F31299C0A7C28E6CE59920B1628E
+:1064B0009C644AAF54B00A02B3598388CDBF4E7E64
+:1064C0009C5FC462E70207808C40366A505A986528
+:1064D00098DCA6E484A9FC3F01C2EA87831560A189
+:1064E000EAF9C560BD6A94AD6AF52CA34850124E16
+:1064F00016C88B863B1BF080CDC085AA033F0BA539
+:10650000D4F03CE59D12C81333642FF9316DAD8290
+:106510000F9AD1CAF61D7EEEE921A5DE28B53565B4
+:10652000A988A60097BCC2B80DA755CA1173E2CDC1
+:106530004A2125F028F699E764F1BE80FAE5BEAE5F
+:10654000C42E92938DB5FBAE433A4A60263DC57E7C
+:10655000DA298D53928CBBE4097372D809C30BEA14
+:10656000EB174CDC673D582C6E60095EC1FF49ECAF
+:1065700032A67025ACD6A4D23F2C809112CFD14840
+:10658000F0177B8BE374151B02A471B38F5AB4838D
+:106590006D11F851A23F10A21877413F578555DE83
+:1065A000A6041A7FF8962750E7FD117CA85D69C5FF
+:1065B000344DA17E520939E121DF7644805DDE6CE5
+:1065C000F968CC64FC168B2E1379F6CA4EEB13CC0B
+:1065D0007AAFB873074B33AA5847D1A1B123110A38
+:1065E00017312BEBA638D71E45C5ED9341B9A08BCB
+:1065F00047D756D98D05BE610756AECAF2A8EAA2A2
+:106600007E857A7241B5154FF5EFCD0CE6E6E14691
+:10661000637DEDA8BF7348353246FCB072541BE36E
+:10662000E921A13C9264D8F4E86DCF46AD55704B9A
+:1066300034203E22EF9239C04AA9BBAA0276B6D0D6
+:106640000569630BADD32F93C0E7A169E959BEA9D2
+:10665000F3B8C5FC5A94E53426E17767F441AEA45B
+:10666000AD43615989ED4B1D8972EB71E2B23E3D3C
+:1066700011998C9796DB4D42AEC15A1F6E9F43C550
+:1066800092D44507D2719492EB21AD44F33E47E496
+:10669000BF9182AB2B70783FDD44447B612B9562C8
+:1066A0005521AED4E26A1AB3B881AB3119A7706133
+:1066B00037C3F14FAA6226AB4CECF1ACB7CC5A1AF7
+:1066C000C80770FC3982FBE33AD619EA85CAE66D41
+:1066D000F07B25A4C7A23C774515EA1FC4B51E3838
+:1066E0004F561498DA289EF1992881F474808ADA3A
+:1066F0005F212EBABAC8C39BF4F24AF396095864D4
+:1067000065D0AD96880DC0DB548656EE2E7BF2D751
+:1067100041D758F5AC8D4B15230EE3011C268DAFE8
+:10672000256149B31675EBB2789D514F1454FD2A7B
+:10673000A046B8BFD7E6B7464176E094BC02B6F8AB
+:106740009F8700A12991B3DD01891C9B113DEC724B
+:1067500064445412A145A9C479EAD9BE3AA25E376D
+:106760000FE0310802C7D2BE03EF3677E89229273F
+:10677000C6EE2AC66572F32D81666C09C3D272D249
+:106780005DBF226E02696BF59A3B8BD415AE452333
+:10679000EA6CF15376A104AC131A927FAE9FE8F72E
+:1067A000590D45D64C831855A861630F8BB34DC75F
+:1067B0005739FDF8C1BF9A1ABF56F8DF778E5D06CC
+:1067C00013D25FF95689FD7809992CC0DB9F97D8C1
+:1067D000C9B168CBF756C16F36427CACE17DA4C825
+:1067E000742D4121300D00410C04A34FBF60EC78A3
+:1067F000E748E4540CC458E3C25686F27DD63D5FA8
+:1068000010F6FF14C23AB314DC83F1AB1596DC101A
+:106810004EE25421970A53691071FD55899768C358
+:106820009E1F6CA4EA4C7CC1A2D5A6DFA42DBC6F30
+:106830002DD3929222F947B9432ACB7B262A5AA418
+:10684000A63225E4CB110A2E96EFCED7C9A77DC478
+:10685000F3A0B2F52F7B9446F1F82EB01CBECFD634
+:106860006C7C8E339CC2B7D97D216B9567ED69FF37
+:10687000A1A1A500F160CF13B835169B22E4B7C0E3
+:10688000BE0EC1FE86A4BEC8B2062D11E6E416F601
+:106890002D4D35428C5F9C00B0D40AB05E7A395DD4
+:1068A00047A0765CEC63F27B811FFDC2FEA2F8BFBD
+:1068B000B7F0D852750399D85B38940FFF12358F13
+:1068C000E560600F10B437EF0674682DA05DB73F28
+:1068D000BBA72F66163500A555564DF1F8E5EE0E0F
+:1068E000D5FAA29EF4D8EB0EFC33340E5DBD8316B0
+:1068F0004943AB7FFE64DAE63A32F29DE24BA97877
+:106900000850BDEB01CB41079F631E70AEA8E8B1F4
+:1069100096A2A9A7334F54A574AC7867D645FB0956
+:106920005950D8644BDFECE0F0699A59307A380F4F
+:106930005B145BA9B82F6BBAC88409707953A1495D
+:10694000828FFD580775B6241C2FC3AA22F8744FF6
+:10695000C9BECF4E33A87CE3B2A3CD32E2971FDE8F
+:10696000255D380E69B36FCB44C28001F3E58C8599
+:106970002326F09BA8A517E570DEBEEBADC686EC1E
+:106980007CC66902B5709544DE3910C60FD18859AE
+:106990004E55A9C25F10D97B230AA092C2FD93561F
+:1069A00020AEDB9E371201695AB4D4ACB9229119DA
+:1069B000F105D77F4557D4CB17D7CD57B5582DBF45
+:1069C0006A2A36A711FD970B59D2F4E83562A8FF61
+:1069D00021AE022C50F29A99423EA74C7B182A8590
+:1069E000B45E7DE9C12C1C6433CA3710005050A539
+:1069F0009C2811DAF220D5FC05AF8B002A660EFF29
+:106A00008168071207E05EA2453F89C45444CB3237
+:106A1000618FEBFE96F8A98DCC58909E6E0F84384E
+:106A200071A760CCB2AD19377CF2CD87EC8828C74E
+:106A300079ACBEA3651C96ED8FD3D353EE1CEDA6A7
+:106A4000543F2CECB3D43A5264383165DBB9B233DD
+:106A500080BE04D3B10117B0C85C0A98F0AD60B233
+:106A600010241CA9D8375CE5EF29894518FC7B2246
+:106A70001386AD9CAF3E9235B32EE021775BE623C3
+:106A8000147B56B124F751D3B6F4B4BA96351B70C3
+:106A90003971B077BDA0B6D7CE24595A7ECBBC5A37
+:106AA0005E3AC4D32D4DE2B683324EEB54A88E032A
+:106AB000F8850F17948D6DE3CAF081604BD7A067FE
+:106AC0008D7839FE9ADE39BBDF9AAF6AA859454402
+:106AD000AF49307BDDDB87DB0DA321446E1963C337
+:106AE0004C2F28AE18928C435F134385166130B843
+:106AF0002F86F501751C01B62E5BEDAB9952D5586A
+:106B00006FEFB86B0E0BBBE8067A70FB81E4190BD4
+:106B10006D8797D19FE71571002731CEFDF934E4D9
+:106B20004ACDA45CDFED3EA582C9711C1B55930FB5
+:106B3000B7A3162512AACD74CF1B5AA1E5F4A3CB97
+:106B4000E7DFD2EC6DE785B7F97934EA4B72430E93
+:106B50001FEF66E5B0DCD22E1F8FA1E217C3D42051
+:106B600095A004924B8C8EF651F7A1912198C70401
+:106B7000AE32FA7F38D4D8EBB214080FA3E6044C37
+:106B8000708EBE664E85DF13389F7B8BE695744F03
+:106B90000162BE9FC73E524BB201AD532287B29AEB
+:106BA0006D169D963BFADD3324D007574994CAB041
+:106BB000D3072F84F3C473378EBE3F340F773E95CF
+:106BC00077FB29CE9B334AF94EB4045FD635DE9A63
+:106BD000200DEF6B5E535288D96D66C16E0326019E
+:106BE000B1E5CC9592DF70EDAE900F0ABE49788C7E
+:106BF0008545A880BEDFFC641A76BD655281D3C886
+:106C000029279A142F97A86BEB47E935CE75AE2D3F
+:106C1000853B3803583C5A5422BA3C277AD2FDEFC0
+:106C2000EB85692CCA07C846633C08DB2DA55CCD03
+:106C30009DA0309A780B0937CB8EEF129D07493F04
+:106C40006B6E72C5FBD8C8713984A874F29A6E9FB6
+:106C500067BF32458C4E291575112E8ED014D3EF97
+:106C60005F10F2AE3FDF2AFDC3FD486FE0E26EF930
+:106C7000F4495EE86226A6ECC0B5E61C926C626D33
+:106C8000F5414652CC7BEC3A328C787D331E38A5E8
+:106C9000ADB6C38E6A021A6358D972B56728F2CAB4
+:106CA000984FFADE32672FE5E524C2525098D13F63
+:106CB000892E5832CA27C9FE5FCC4130C9DBD99230
+:106CC000F01BD23AC618AEDD8387E4F08B31F58A2B
+:106CD0000704F546ACCDACA26C0BADEF63CC9CDBEE
+:106CE0002A4D7AE5D87746A8B99B58161BE9E432B5
+:106CF0006C5425EF8311EB47B56351392EFAC4DB91
+:106D0000F4C0C3A8BD2D7573B5E7848B9EE3EAD1AB
+:106D100011EDCF40D61D5226D351E05EBEF8A76ECE
+:106D2000BF48ADE099B0E0EDB0C5E0871A29E9E2CF
+:106D300054606CB24B23ECA6E54C8D56D30DC3B416
+:106D400028F361F9ECC7F8635B4773BC0364E04563
+:106D5000F6D525BE01F3E71220B5F6BEF4A99D35A0
+:106D6000519B6A5858F1E3F36FFD54E7B8D36F2194
+:106D7000C045C631BC234805C9632A72800452004D
+:106D8000BAC2CDC1E81D6B3B9BD4576C9100573400
+:106D9000F59629AAEF533EDE28468D585DFB7861B3
+:106DA000043A24BFE5E62D5F4FC8D185981312063B
+:106DB000646F066209BFA4E10DC8DA598BFB49B4C0
+:106DC00084F9DBEABA195D05BB1146AC5E5F60165B
+:106DD000994938409C9A7F420AC618086A31B88B94
+:106DE000AFB11A28DDFA8447703127835D574F1AF7
+:106DF000C29A357F8B98AB0366A5F8CC4F1A5531F4
+:106E0000C817B1916B5726E489D900330AF39A5C0D
+:106E100031762000C5178708A6586331B0E8315D88
+:106E2000FC1864364F148E9D0722D8ECB18D3D7A44
+:106E300079D15BC542B9B1FBAAC6C79E4E409F44FB
+:106E4000D65F9531801AA8F53E73B9BD91D02D4D0E
+:106E5000DF8099EFB30EEFA185ADAF75ABF5A82E2E
+:106E6000397EDDB408977EDB64E629D1DA145AF363
+:106E70003B368C73ECD77D3C4976D63FFF24F44CEF
+:106E8000F76B103FBE625B1A4AF26D61017ABCC2B9
+:106E9000B67B06D5FE3445912B0FACBCA66DA989F7
+:106EA000E7919A588C9B3AA09228918EFA47B8BDE8
+:106EB000534ADA81AFF58B091EA7B42363CF596813
+:106EC000B543A8340FDD5ED6FFCB3BA0038D5F6AD0
+:106ED0001A09099A3FC4F0B43D9FFDD9AE0180EC78
+:106EE000D1054D3FD68F48D583B5D501F3A00DBE52
+:106EF0002A72E7601E719C3DF562E6A7C06D9FE7B0
+:106F0000D6051DE89DA2B199C7B0FC82BA1B6B5F84
+:106F100079F8D431B6772298E501FDE2C05DB9D9A0
+:106F20002A71430CAFBBE882E54E9084B01E1BCCA7
+:106F3000C9E24B2C3A204F4657AC5BC1857537E10F
+:106F40007A52B1D4403E762EDAA858603CC96F8799
+:106F50003C04957E5AD5433DC53007C06809258954
+:106F60007A6838B8A8F2C05102EC1EC6FF3C4FD573
+:106F700002A91460CBA7603B3B733583A8E33EBEF8
+:106F800012E340245328AA253E0D8B00B3BAA599DD
+:106F9000B33B44F7714540D927488376C1D3FFD32B
+:106FA00000D523A43F546026A38887021A3CE44BF3
+:106FB000DE854DAD6332225B4C18099459720C4C3E
+:106FC0001F6700F3A4D2481DD4753E3DABD3405299
+:106FD000C0BB55240A2ECE7DAFA8E771956E73B95C
+:106FE000240EED88D7BDB7847782033A1DE36DADDB
+:106FF000149676197AA36BA8B7E72710DB85E6B855
+:107000005746602FAF37D8CE8DCA03A14087B84608
+:10701000B65DC9F21C79B45A48A38BA001DCEB76AB
+:10702000B486014347E174C5622D0ACA51D970A0E4
+:10703000B9C8795873305F4D7D286829CEA63F8B3B
+:10704000E29CA9D3B43FEBF41A0D4A10E8D0E63025
+:10705000B881590125E1D10B067DAFE04BE7F8126D
+:10706000EC443C09E072CE6FA9B388C0B16FAE6347
+:107070006481AD93D88661C5EE779311CDA2C244E9
+:107080004D2D49DED3283180249EB89A78F2D1B6AE
+:107090007BCC6F0E979E3E12A831DF03CF25DBF924
+:1070A00053B3315AE26A517177AC285DFE26A77C52
+:1070B00052E5A8E800C5788E5334A83B302661A07D
+:1070C000175CAA56FA7CC6E69473B0A9393A2A60CE
+:1070D00065488BB8EF745D245A2A9491A51E648686
+:1070E00006A5D3686441144BBFD08CDE3C4F197F9A
+:1070F00074C725B281737D69E44F4FBA2EB6C97645
+:107100008D2780AF777733A5A00F2063ADE5FA1107
+:1071100033775CB55930E230ECAA23505CDE0FB80F
+:10712000798AD704481DAF0BE7B10FD8338ACFD681
+:10713000F0FF8CC4BF8361364B8C282D8AE29CD72C
+:10714000D88743C8F038BFCD6B5FFC0BEF110E241E
+:107150004ABD1B070FCFE1201F6C822A07E2639311
+:107160000A1E584E38215E1500D96A0148FFBFC576
+:10717000C189C0746D5DCB4F437360280E5A911E58
+:10718000167E85B112999701019FD46A4D1CB5DF17
+:10719000B6D2F8CB9FACFA83DC73D37399343B2E11
+:1071A0000D6ED78D9AE56BC4BD1DF143A9AA80D59C
+:1071B0003990B4E1AE07411106B603F5BE9A54D535
+:1071C0005CF639C44E701AF9415EF6DD391690DC72
+:1071D000EAEE9385B4B98D7A7A69C0AAD34744C3DD
+:1071E0005FE3161F2646091116678E8FA208545EAC
+:1071F0002D634E302D2A4B7FAFDBB5A0071DF3ED7D
+:107200001B715AD402055CE6D528C251D338A504B7
+:10721000B3127CA1EB0D0494F4D549076D39E9282C
+:1072200076CE7D0B8A51777F215FA49060265B9399
+:1072300005DEDC74B05F2E712B60661EBBFE961BF4
+:107240006CB87138B72E781EFB26314FEA3DECBA88
+:10725000CEC0317E3504A0EB95888D965C022085EA
+:10726000412A265B32D4941C9D6B67B4A04A55C357
+:107270003ED892F9110964F83161DBFCAD4C3C61F8
+:1072800086B46B56B3C2AE691E4118803C9DF5B002
+:10729000623A04FE2B62CEC671F98F335563D584F2
+:1072A000659DBD483FD01504252B3C87438BF622B6
+:1072B00058BE52910875C9103D2758A8047E6888A9
+:1072C0008F76AF387E4009242CC029239BBE8C6F5B
+:1072D0007CFDED938F0C7CE4A29DB1B17646ED0070
+:1072E00070CD1BB473743E6032F2CA32EE8E42B679
+:1072F0001B09F1152E683C68AAE89258002F20C897
+:1073000028026F2B1034E6568731DB593C8926DA88
+:1073100088961A7A39F7E7A9E80895321B852492EE
+:10732000EDEE916F10A06123AA98FE39669352CEBC
+:10733000177449E87B6339CBD99F5CC970755B369C
+:107340001DB058CEC33C692E826FE0B8878E415382
+:107350001E2495CE77A31A0E251FCFDB905C0AD68C
+:10736000BC31074A212A657A6408713DFFDBCD0BE9
+:10737000CA6E2A067F06F4BFA1A933F834278BAE64
+:10738000F7DBC074FAA86554B588426C584ED463D4
+:1073900073DAA36EA4FAF6C84441AD2CE9976C01E8
+:1073A0005BA8F8EC552760E0BEE61BC4DD019682C1
+:1073B000D07A4C18C7E5D67EE50F14EA2C8B43E44F
+:1073C000CA5C7947C41F51EA0B1E3D2E52354EA7A9
+:1073D0007D10C53DE5DD6CADCFF46A71F2C038BEFD
+:1073E00002523E3E8ED5758686EFDCB77DD2E4E351
+:1073F000FADB86B0C4A773E5F82D6569E129642638
+:10740000A3BA444495FC5910212F11D18EE1A8E76D
+:107410003092CB8AB0F2AEDBB766CCF7E57614AF2C
+:107420007C7DAD746E74EFE8656255540215B34D02
+:10743000640D3D80D78FCFCB622C83029AE21A7BFA
+:1074400031C6F086AC6B1CDD07C0157AB5DAEC24CA
+:10745000F09AA1E1099C939EC6E4EB983D69804CAB
+:1074600073A659511BB54A0308C6F40363BB459C78
+:1074700074F095C0310F17CDE88FED48F3B529387A
+:10748000533D54BB6221581BF013C19A76AF096279
+:1074900018F59F17CA9E58711F8A1DB7C57F2427EC
+:1074A0005A3BF0BF7FF02CEA1952FAFBAD6B3F4D0F
+:1074B000A72EEBF111B33B1213283B4DD7C75458FD
+:1074C00092C4E6E57E8D474980F7BF103E8F45BAEE
+:1074D000EC7B0230A30519802B06AA43164657FB06
+:1074E000FF4C945A1AF99D35F8E77E6ECCB53C15E1
+:1074F000B1BD3AD831ACC06E07D91A490184FC0E2F
+:10750000B96C5D5FD90F322721782D759EAC8CD276
+:10751000D62CA2FF36A7C6B1403D3A40AB34406EF0
+:10752000407744607FCF191974E221C04B25C2A473
+:10753000FCB8EE8AF38CFE5F5326AD868ED6E7BA92
+:107540003A148B1C78A1FBDF407ECFCA200AEDBF26
+:107550006B42D0E9D63BE61D9C21503BB1837E8136
+:10756000897B0FD68EA69BDD869A581AE5E758AF21
+:107570006104AC901F95858E434C4522986169E665
+:10758000326B5CDD0FE18E61D597A311493477CC66
+:107590008EB9A071951275B7CBBBC90FD27F86CEBD
+:1075A0004B923EB5C9CDD53ED2D8D91D9CD282884A
+:1075B000A92CC8818B844ACC059C3306AAE906B263
+:1075C000D99619339C9BAD96DA6B46852E38B665F5
+:1075D000E584FA3199C55CEE845D79DED06B4AE5CD
+:1075E00051EB6F34A8582F3CB9A7B2A66A679488AC
+:1075F000B7026893019DA1ACA5DC3B6F7956FBA156
+:1076000037D1E06703A094CC7E6075E7DE3B44335E
+:1076100050038FEEC8A4023E1479E508DE7AD3CE7B
+:10762000024357BBEBD8AF799A1679BCEBFB87C8FE
+:107630000EC59B7B5AED65348AE7314E70EFB6A8D4
+:107640004DDC3F07227F34C721D23426109047E516
+:1076500059CF7DDB2513FBD88D50734F3A1CCBBF20
+:10766000226FC80AC1681F768B9C98B20013391923
+:107670001FA3C8D41FEA525D4019F4BB169ED4174D
+:10768000C47738B33F58B28CFB5B5FE5451355F3C5
+:10769000804AE53C3597A28E91E9D99E79F3629CA8
+:1076A0007AB55A383BA2A454129B18C9C3712A1741
+:1076B000507CF450FDA6941845345312A8137BED6A
+:1076C000A3489D59FCFF3B17803633FC3284268645
+:1076D000876102542E87098E49F616BD6682848919
+:1076E000B81ECDC12464F0EFCF8E2D1F542DE36161
+:1076F00027E525ACA53526F9B2645BD3393BE1AF6C
+:107700000519ED346C0EE6C9E16802EE0BB0DCA59C
+:10771000F463DE2F7042C9069966597EE63C09641F
+:107720003FA65A39EB306394BF0B86981DA3B8A0CF
+:10773000CE0E7EB42633880E9420BFD75B76308081
+:10774000159B968DEFA4ECDF0730E6EDCE0DF950DA
+:1077500034BCD9EDB96A06F778100DCC890D03E574
+:10776000008DEF7AEEE28F90D5914C90AFAF4082D2
+:107770007764434415DF87E11276BE129A1EF8AF94
+:10778000F8A716CDB73E6EF29932CEA63276D24425
+:107790008B1EF67104A94E41F65148D705EC3C7496
+:1077A0004E36CD8107E589072153ECC696B2B6EA7D
+:1077B000F009CAA7C1A98FD308B304A862AB584384
+:1077C00008B90F8B0215C2F858E60D513B6D6E4E8D
+:1077D0009D9FAF7F5D8D138CB0C025F3C2252DFE1C
+:1077E0001F66B09C15121516BA1352EA5589A9FEE8
+:1077F000BB62CDED4FE8117E9BB7D2D249E605EDD5
+:107800009D9D57D301C82A7ED9037586AD7B3490E0
+:1078100064F5E1AF894ADA274876AA983ED864131E
+:10782000CCDB7FCDAE650D72F9666DCEA42A4628FD
+:10783000685A002CEC13F60003E2A2288D38E25FB0
+:10784000FE4180185025583FC10BEF9547BBAB2632
+:10785000B8A0E11A8F7A39A3F2FF2439A6D61F7394
+:10786000C96C63E7BDD3061DD6C46F50C931241758
+:1078700051EE0280E2CDA24E227A7F2ED0E2237218
+:10788000C7DB50156FD95AECFA0D765A91382E672E
+:107890007F3187C8D3393E47092D20CEB731092A19
+:1078A00025B2FDDE78F719932991E72CFAD966E421
+:1078B000AB41F82832A878D8A6992837DBCC719B41
+:1078C000CD2A93E1611E0837EA7680B690B8ADCD37
+:1078D000C5EF2B78D173FE839FB9E38FB23CF4A13F
+:1078E000A4561157FAE9632CB5E0F762520FB9E1DB
+:1078F000014005CD279B1E3A6D9F53B5829EDFB395
+:10790000843798086722A93E2B845199EE384F504E
+:10791000FC0957D71EAF9C6DAF89248B2AB45175D3
+:1079200094D6972C63862886433CB6AB986D217914
+:10793000263DC51CD0232C38CF375A57E88E98FDEA
+:10794000A6FD6A36F26BF09B794F12F8FDE50A54FA
+:10795000AB4929A0AB4C099A1D8C41A45320F2F3EA
+:107960008DB751F6A74E89B0CC9080F3999B4256C3
+:107970008448A31F395E01379823E4482A1C4A3300
+:10798000EAF090E70B417FD22E1483CAC21A245327
+:10799000C19B6172BEC8250AFC5E85FEBA97E0AF46
+:1079A00083B5FE5279ABB6DD423772EE9361E2A346
+:1079B000D1D55BC6437C1E58396393F756675B7A13
+:1079C00049F2052BD9E4DFBC3CB437A52B376AF567
+:1079D0003ACA04DD22D2A75C09EECDAF2CC3DFD4B6
+:1079E00095212B1F1E8BECB6B81A4B982A95186B55
+:1079F000FC5333AFE05BC3AF31229CE142C97E3917
+:107A00009B1A8D7E540FCECE9553C697EE5CC54023
+:107A1000B5BB94EFA5DD47C47EB80D394B35AFFE3D
+:107A2000CB1B4A597426476058DD0D0CF47C767ADE
+:107A3000FA140C3E89D6E04507384ACE038AE0CFD7
+:107A40009FE0D9C389E16D0CAE7088CA2F2D48F92B
+:107A50007CC81A7C5B7E4655D3813D224A805DCF2F
+:107A60006F3E350DE20EF98C46E09F553D73EC7E7E
+:107A700084C6AB203EE146359EF7CC24F026712328
+:107A8000E2449F9F7D19F8910117413CE297174B03
+:107A9000C9489FD430EE1E97B8343F72A22C8CF4A4
+:107AA000F075B1B7A4660001DC51ADC1B9B6792853
+:107AB000B4A817FFEA44DE3108B7507E7BD1B6CCBC
+:107AC000D0598CF269BE5FAB88892DE650508CA8E6
+:107AD0000E9EFC85FE6C04B65CA3730D53A59593B6
+:107AE0005C6E816B18FAC100A6BEE8E281FD6145BB
+:107AF000D495919BBE9D35339450E2787526CAF893
+:107B0000810F27EAD29DD56A3AC3583547E2F96515
+:107B1000F13DDBA51C28778F761DA2CB346E0BDEE2
+:107B2000B4F231CA924A4AF5CC41131C663D7D5CE1
+:107B3000627BBDCCF77117CA0FB6883D40DB618D03
+:107B4000F010652A7212AA2ADBE4EE1422162EA285
+:107B50009E5B0DEF161C3DD460A3F588A0340D5C30
+:107B6000F32DFE79E8343E5A781F3DBD749AA5ABDB
+:107B7000BBE52AD310C403C839588766AEABEED92B
+:107B80009FD44EA306058CDF55037EB9B9DC7C96E5
+:107B90001540F906CFA2434298EB48567C2202F5E5
+:107BA0002A59CC7706CB40C6E3618943312E1E7833
+:107BB000B1068E4BC2748F432E3E524DB8E5A0974E
+:107BC000DB0D4FDE6E660D278AF648122C1A35CF74
+:107BD000B8C1641B2A9EB0FE61214E2D8F838CFD9F
+:107BE0002281A0C7BBACCE90C96F79BF76CDFB7E9A
+:107BF00020216CF4C8993DEBF337431D58EF3A8BC5
+:107C00009141AAAE3BB9A663BFEDE7CC5F047FEF1D
+:107C1000A39AC41B799714D594E7DE33089C2E737E
+:107C2000EC17013BEF6A1AC89EF34E1291929E6DBB
+:107C3000698BE8E6F4356712B1D095D4359640BC2F
+:107C4000C362CAD624BB8065060EC3DE65C42E8718
+:107C5000BDD3517824404B92929BA98C2A66799887
+:107C6000C40E0332965BAACD450610B9F05F0E55DF
+:107C7000E8463214889D54C848756C0F84A77880F4
+:107C80006CC2D220C19B0694C52FC44839CEC417FC
+:107C9000B391ECAF72C0DA43026961C69261AAA9DE
+:107CA000A00AF64A8AB71953512B73C5DCCFB8F531
+:107CB0007100848BF3A63914C1B4064265183A6E7C
+:107CC0009C0D7E88C80EE263BD48F39111C6B19D3C
+:107CD0008BA70D1FB02E9C57BCABB8910F080E9A06
+:107CE0004FB82C48E35EA28746E0D7249A4A778FA4
+:107CF0006E592C5734494DEFF5900D49BDF28E5217
+:107D00001A10C3F14ADF7C76809B4868697CDA02EE
+:107D1000DCCDDB497127E4FB2DAED5AA5C20CE2B50
+:107D200064110C0F7FE31FEB3CCF609A8BFD363361
+:107D30006A05266955030CCB3842EB728AE68AA0A5
+:107D4000A94905CE509D3DBC3EF326460E5AA001E2
+:107D5000EC242EB461559305687D04A1708551D53E
+:107D60001398142C2E81F13980EA2F460E59314D8B
+:107D7000C1D52DB5670A336A36271C6CE416EAC1F3
+:107D800066FB63B7C779DC8631F5BA7178366CA4C7
+:107D90007EA8761E5C4E0BF6A580EF9947FBDC13A0
+:107DA0004126FF96C17F805CEDB534D51977306AE6
+:107DB0003F64137F5BD60C035AF9C984B06E40D57B
+:107DC000093D436A3232FFFED9903B5BD8F86C3EE6
+:107DD0004E3EF1C13D122A4AAA83EAA577AB821131
+:107DE00046950BB94C34CC0022A2E8E8C190135060
+:107DF0005939309F61BD3E4273703EDF4613CCDD82
+:107E0000AA9082FCC3BFBAD46D85B977BA760A73DB
+:107E100055C6AB3394CD3858CD2B84297E84ED28BC
+:107E20008F9C212B2D0D553CB31C1DFB4F3F21CBAF
+:107E30004F0445A369B4D17F9B22B55882B1148009
+:107E4000FCCDEA94C5AAB5A04CA81760FB14B715E1
+:107E5000083BC1A4488174F78448016E8C3F181810
+:107E6000ADBB253C874C68865F5AFC672E062F58B1
+:107E700036A17814A1625350B89583B0784FFFF6BD
+:107E8000059F73E35C96D5FAB50372A5E84B7EE9CE
+:107E900002D3DD2D1A1335F8C9ECCE32797526657B
+:107EA000636EBB6AC861DF3C49C2BA574E3A97B9A4
+:107EB0006EE4BCD7FBA2B0940BC9B9CC72A5100577
+:107EC000A9079EFB697BD3CEFAC4DBDC5F7CFF9AFB
+:107ED0005C75C5FE3AFB4BC9D46501A242B30DFDEA
+:107EE000320AF3DB8349B112A278344B1B41AA0555
+:107EF0002B8995CC2968834484BE87EC8214E37572
+:107F0000FA9F1A96AB9D662A5346F0BAC277346F31
+:107F1000B9AEACDF7CEDEC27D720C3A3E4D04B3265
+:107F200086C998CE25B346D29C4A29D323FBECB907
+:107F3000556854CB03FF910E6E4131449D70F06A39
+:107F4000CFA2F5A71C9F1485ACF591DEB54957CE9D
+:107F5000A22DCD6E36892B3E7C728709188B3E167A
+:107F60001F2638AFD77BC18C18D2ABC7EF7A16B0BB
+:107F700056477AFBB6CB6991FE48A0C46B5328C51F
+:107F8000F7259E8A854592C8E9D58CA4819178E130
+:107F90003150C6FD9839ACA5C74809B4996AD75F76
+:107FA0004CC3C35857F53CD4E7E6EE681263C74AA2
+:107FB000D3DF6A2E93851A32CC230022490BA5F217
+:107FC000ED07B9221D2051CE00EB0D6B09CF0C5EE1
+:107FD00014ABF133B9BF4085461792EB51F3248FB0
+:107FE00041570454B8DC60EB6C98B6EFC449BD74DB
+:107FF000F605AA7305A789C1FE711D063EDFD7CA23
+:10800000D166F2A123C8AB5FB0B706CB85826847C3
+:108010004D8BA73A9672A7303550DAAFE8F07D0362
+:108020000ACDD2B1BF2EA270A26CB7CF6B93B8D4D9
+:108030009B22865017C09BD09CECE2F1FE8FB58E40
+:10804000F6464AB3E5A50132ECD86F286058427F66
+:10805000611CFEF596791A7E9D663572BBE6106747
+:1080600034D416273176C83FAD96A54943F2B20CF9
+:10807000A40C4FCEE9BF47841DACFCA45C52736FC7
+:10808000F1DBEEDBA0C15AE52EFA0112C726D2348D
+:10809000B1277FFC513C6BBF9D5D474BF45332C908
+:1080A00094CFD192BA80D5BD25FC5F2E8FC5D3F574
+:1080B0000117463517C1015A8EBD9CB518EC4BB857
+:1080C0006993922A840A742C476E9058880FE7D8D7
+:1080D0005DE2F8EF33B9A6C8F5DE414E709FBEEF02
+:1080E00013296DC62004CA0FB025294EC3441A7344
+:1080F0001BCE88ED2D80F689ACD66B023E9E874B59
+:10810000FB9CE345F91EACE9F2E1AF57F3925F0D3A
+:10811000CE989D870D479B2A2A66E3249564AB3B46
+:108120008F51F504BEE65FA0AD642325DCE1F80FB6
+:108130006DE537F76DF6D7690B4C5502A09A7C5E5A
+:108140004137013B8CF26C9E06C2113FDB136890F5
+:10815000B65C72671027D99FFAE4D4BDA25F9B2E4C
+:10816000D0491DDF44C88CD7EB2A3A0CE2151B9E80
+:1081700097E2B87D48BFACB7F4B370BF4CEB63D6A1
+:108180008F6CAF058CBC4F4C65B8C0D97988B9AA43
+:10819000513C344D1E5C66EBEA75F307CE5318A8CC
+:1081A0006BED6EE4471B0C0FE47F77941023240FD4
+:1081B0004D87FDC2EBC9A7FB750B311903F8558B31
+:1081C000DD6D68BBFE63874A47C79BE52155CCE15F
+:1081D000FD4B01E00B5C45B23924020C8B00A52F4E
+:1081E00017929FEEDBDE0A639319DD5597ADEAB077
+:1081F00051EF88AA0920BCBF4F170C2E0745E2BFDC
+:10820000F9994947E965377A247D3120C3A8B652E8
+:108210008A378023B1F39C1D7689667976E98F20B1
+:108220000FABE6F1F1F069F277E575475ECB86E2D8
+:10823000EDF38DE18FB1047F4851F8D56DB3314D29
+:10824000E0EC937E0207F18BE0BE1F2189AD28D8B8
+:10825000796B7C1F7AE278B1D1E1F95CCA3FB75201
+:108260002983E555F57D89F105A52C3D5FC4723064
+:108270007DCF9F50EAC91F42CA758CA9AC5282714A
+:10828000707FCE100919982472232CD76DE5454CC8
+:108290003F931429EFDA26F1B0DAFEC99F804A1C19
+:1082A0008DE3A08663EC3E80ECDFC8C113823E0AFA
+:1082B0000140CBD542E1B6F94B4CC9B7AAEFF697CE
+:1082C000C930C4FCAB4D5D201DBE95530BB0BEA79D
+:1082D000C71024FF8DA8CC1A6DDD673849E3ED5E29
+:1082E000CE1B8E4F6D7F1BE13BF3C5D28673885C3E
+:1082F000ECE76A30BBD9BBF7CEBAAAF2406CC3D068
+:1083000070252A515CB6969E9654129D76E344F1F0
+:10831000BD0236EFC3D2425F1A7970B1B250D812A3
+:10832000ACFE00D88A33AF65493A65CC73394FF457
+:10833000937BB3643F629C53D38DD2626F6D46983A
+:108340000C8E94BFC2D6A90C04AD26E1A40D35ADA8
+:1083500005B994ADFCE2CEED766E9F543A25328598
+:108360003591BC84C6F399DF9599C13BAD715CAB87
+:10837000A771105A2FC376A92215056E6872E48181
+:10838000E7E3ADFD02E1007AC4ACA219790C3AB67C
+:10839000385CC2845B560E735D7B697C5C20CFC900
+:1083A000DAEC90473F73C5298651C5583E5F9894D3
+:1083B000DA0DA8579218DAD00FC361440A0C379D22
+:1083C000BDA190EBEC1BE6551D31E029C54FCF97C1
+:1083D00005F92E2DE8A0F7A8F484BA4469B3433513
+:1083E0000DD11CA08DFBBA4F37D39A89A4646DE2DE
+:1083F000160E4D87ABC2F6BBFB96E010085DBE8E35
+:108400003C4605E76CFE7C8BEFEE48919A7C4A6413
+:10841000D9712AE990AD16426CC4792E0D4740FD02
+:108420007823FC49416A875DECDECB5176050EC9A5
+:108430005B2726031E616E8C36611E09986761B545
+:108440006B4F66E2DF7E95C9B46A60B1AD4F0249F9
+:10845000CBAC25D8D22EC0396A9EAC73836B064450
+:108460005782958C0B164FD6E69D025B6EB4307A20
+:10847000F2195A4A299B12292FACA6429501F1F70D
+:10848000DDCA873E9D46887A33F1D31713FEDAE4BE
+:1084900068B3A1D59DF66B23EB112417B6778585BC
+:1084A0005082FBED0B4EBB2166C0222BDFCC752525
+:1084B00010D96DBBF779432E669F948F40156F34AA
+:1084C000FCB14E05F55535296EF9B556597816B7F4
+:1084D00042B532AF9827273241AF869364EB234FE2
+:1084E000501E7861E2117582BE819EA21F07385529
+:1084F000DB8464D34329F5A1D85B06058CF218C848
+:10850000FA97E29B9D8AB94DE38439CB5B042F0532
+:1085100086CAC13008B23A2B2F0B26E2E5B144FAE5
+:10852000679C3DEE99AB25A11B641AFFD3E6CD3CB9
+:108530000C9B366F56837C8A2E6BEB7B2429C7F805
+:108540000D9E92F667FE8600A3BE632ABEFF31062B
+:108550008CA30064DDFB538A127AEA24485E5964D6
+:10856000DF5EDC5DEAF42E077DA0317A46606F3E67
+:10857000C0D9EE8F493422B6DBEA0749E447F492CA
+:10858000C030AA1B58AE84005C1F1F4EBB11B3AB9A
+:108590002BD0BD095969A8FF982ADB1B723F84DDE7
+:1085A0004EA49DE66DD014CF9069CB2C8AC3C8161B
+:1085B0008FB2A0184407B93786514BAD12C4A995A4
+:1085C00098C8300A844E3B107BA00227E541D7654E
+:1085D000D093BC2841F112A2E1105032FBF7BABB94
+:1085E00037948FD7BFE1E3ED36AA25A6D400D66F26
+:1085F00070749A88152FBCC55F9B4A4B48DBFAB153
+:108600005046113CB7B4E8BE85AF65BA7B8D2926CC
+:10861000181907A4F0961D5EB0371B2D97B4D3042C
+:1086200016019FEF8B023BC26E66AC009CA3B04963
+:10863000B1E82A17D3ABD455C9FC727343873CC346
+:108640001B7A4D16CAF2EEE4AEAC6D1D1A2E90BA2E
+:10865000DFD46BAB226CC0124B97A367E62F7C7BF9
+:10866000127EF6E6D8CFD1DDA8C8FA2943D1C9E3F6
+:1086700060A543ECB297CF0DA370FC1650656EDF7A
+:10868000D13F83D26D53330839B085870AD3BEC535
+:108690001794F36102D88928436005FC7127E149EA
+:1086A00075231CC0CA4BCB45B764D91AE1033053BC
+:1086B000BEC18DC181EC926E7E2484DE62A9F499E4
+:1086C000E64E2F4DB2859C0893E82494166BB25465
+:1086D0001FE17C5E5C11A09CDCDFDAE471C6FFBFA9
+:1086E000EF3C0204DA021DB9DAC9C57702032F890B
+:1086F000E6EB55B1BBEFE01C6C395B7927D78430D2
+:108700000B281D654B82DF428977F4C962E6EA0BCC
+:10871000571D26A8A97AE6A17518D04DCE8FCA702C
+:10872000380658126C7161D7F821120DD972EECE4D
+:10873000BBF5D95FBF4518F416808DD4C4E654ABA1
+:10874000C7142BE6E6C06C60AE8AD0AA543AF5F4A2
+:108750006FAE2CCF3204F81896D6BC331987CB27CE
+:108760004727AF15BD0C2B445B64C638073A1F255D
+:1087700048115945991500BBB6815502ED0EF73ADF
+:10878000AFF37721D548B68680071057AA37AD8357
+:1087900093583B507A043BFB4F403B2DB9189C2328
+:1087A000F41BBE66083F912BF2B3A1DE186207F3FB
+:1087B0001B6D5C64613921AFECF6E881941B13FEFC
+:1087C0003A38DF02102F24D1E3172FA6E62BDDCA9B
+:1087D000DF4273A37C0AFF572FC0497CB9E4F9C973
+:1087E000FD10298C14C4D31CCB3E0B2FFE999C8CFE
+:1087F000F8B4EA0D0A6A13A2F15626BC83A2D97A0C
+:10880000DB1E59477086C7F187ECF921ECCBBE7DA2
+:108810002CDD094536A0478F6BC0CCDE861D30E5C8
+:1088200077F6F4960FA7F1A799137AD7033B09546B
+:1088300048694311809D42E53D069A4D674324698E
+:108840007D8E8FA1F789E67ADDCA07FE4D34326549
+:10885000D4B932076A834861D8CF1E7969E89A2C67
+:10886000CB98D64128B925DAADB77868988E26B569
+:108870001362AA8DB0FDD2B328AB38409D80B16998
+:108880003E33D1C831109710112D72C83FAF7F61B0
+:108890002832F50565C553D917F841F23A9A4926A9
+:1088A0008C11B9111CA4314592C88C56024FEEC6EA
+:1088B000223DDB2E6D929BED752F174AC9782383DD
+:1088C00023D69465BB7034BE2EEA9EBF59899D574E
+:1088D0005740FD6BF01584A9F25F1AEA7247DD90EC
+:1088E00000F0D834CBE98E517E735089241DF31EDD
+:1088F0001554EB53D490209A67AD9384A132674FFF
+:108900000ADFAA37B445E5A45D571A7F208AD5ADA2
+:1089100029ED0436599AD029020420B78AB46F0988
+:10892000580FF42EEA6F45706D2A745E218155E16F
+:10893000FA6978F4A7894D4333ED7ACBA6058B4CC1
+:1089400031C04AE47CF43341825D878836C14F25CB
+:1089500019CD337D9FA7BF0CEFA66003F00DC12B8F
+:1089600066A4F7ABEB33AE010B656CE8D79C4049CE
+:108970009ADE08FD9EC217116001836DB109088D52
+:1089800083C2FD32E6A43E5812B2DD05B511BF2BFD
+:108990002D6B12C53C37152A5AC57ACE8488B1BBD7
+:1089A0004B3621160E2F294D8C335A20446F530419
+:1089B000329258AF0C7D2794DBAD9DB4B77EF5B3F2
+:1089C000101121B69FAD6935DFCDE45CF59ADD1C51
+:1089D000EF010068582C1E1DAE71464F1C1CD3A31E
+:1089E0008D2044A3F9B3099A294DA89247ACC157E9
+:1089F000D7A5F1697558273DC24F596DDCAD3D23B0
+:108A0000AD4395D12AD2E847ED9A805C558FBE2FB1
+:108A1000E1EDB73EC41EA1295DA4EB17342F9CCF16
+:108A200012CC52E7AE97E44E4CB7B0127103365BEE
+:108A3000EBF61F6FEDD96A381E77A4D30B11A0A7F0
+:108A4000D37E17290A9F9BBA85B41045370CCD47B2
+:108A50002EF7D5E1C56F48A0DEBF45DDEA1FCE8405
+:108A6000165FE5C8D986DB713F1F859DF7645A37CD
+:108A7000FC3DF89B886AFB319BFDD84742BBB12F78
+:108A80005B63C6E1FD7444E08D72E62D603ADBC5A0
+:108A9000EAEDA462044E28DDAAE02E35D0AD574D94
+:108AA000B26AEEF436CB4DF181AB50ED089820EB75
+:108AB0007668A3B2CD443019A5FAC1E987BFB48660
+:108AC00020D39B35F713E21CF9CC30FE050B14BC08
+:108AD000D41006E79FD84FB40AEB738F9A4842B47C
+:108AE000AF1A61B3F3E91D1ECE145BC635C7AAD217
+:108AF000F317608EEA78D4DBCF850B3D5F815A8215
+:108B0000C1B7CF1E8D60C495B44E070E2A6B67FCAB
+:108B10003B4B60E9537D28FE931B83218A63637E70
+:108B200026848E09A9D6ED1A067DED88A82BB321DF
+:108B300063D3981DF2948C477FCB9DB809C32CD882
+:108B4000275CC0C0986D2A585803D64A8637D6CFBE
+:108B5000EA9CA1198253ED30EA3856A392D8EEC4AC
+:108B6000C03012F8E4F11BF2920EF70E371FC8392D
+:108B7000DB5C85E4D7226FAC177009FCD00E56255C
+:108B8000946EE1BF27F514265C0766968D604B70E6
+:108B90005759B6F2D0145F9226162B904A85C88C8E
+:108BA000C803124876055CBC08E020971AB3431B43
+:108BB000A8C633CA955DBC7583D970322523484356
+:108BC000A57B64BEAAEAC40BCBB324CD5950D90609
+:108BD0004DEA298E56538620DE83824F3F7A027DEE
+:108BE000AFA5E82DF2180BC590849EA658D016D2DA
+:108BF00071761B38A19A9E60EBE463BE50D9BCE845
+:108C0000D5F3E0302C16BF87BA60DD22EDFB703162
+:108C100070A5B0A9ADA83F040D402342BA57CB1DA3
+:108C2000C84741118711C555135A24C4E74995FE19
+:108C3000D55B143753B867B13808BE008330383578
+:108C4000F022467442457F0F8ACCC9D81BC67F7973
+:108C5000682659052F56F8492C12C7C9B1F57787F0
+:108C6000E749A0714F23DAE928E9F3056C1B64F3A7
+:108C7000A7C3C378D0D842CE6D1DA5EE66F47C8024
+:108C8000F6D750B5594C9C144176FD4649396F735F
+:108C9000AD0D5016293E477B85209FF4CB0E8AA64A
+:108CA0004A53640EF595DF227E6CCE5FBE6ABB53DD
+:108CB000F4592CED907DB1D8DB3ACE6AFDE3A61BCA
+:108CC000CD88AB8B39F7B11FAAEC3633C51E1660C1
+:108CD000EF23E624F0E7F8FC46A06001477E006938
+:108CE000BC4BE15623119B51B92B9702EB39729B78
+:108CF000144A6649FB07D43E26AEBB22138576088C
+:108D000012EE1E54571945EC0003BC60EE31A0A4CE
+:108D1000D80ADD03C4CC9EB18DB08A719AAB5AD803
+:108D20007D841F5A8815B8FD0A1D597FF29D93F264
+:108D30000D4C7DB85142CF9F755035128AEA0129FA
+:108D400019847CFADD17E2D85E359A95B9D5E8E248
+:108D5000EBD2F8C6C4B5529FF614F2D886F5E8A651
+:108D60008435A72B83DC0BA057304D84AA03C9613F
+:108D7000F57AD2887F9800B98C54891711C9714748
+:108D80001AE040044899FC853C11DECA6EAFE82920
+:108D90009731D61529E7C59B5BF18322E5508B41BE
+:108DA0004C2FDEA6B95DB02E046069C359E73223AB
+:108DB0009BD556F07CEDE5935F1C82186A2D35A398
+:108DC000826052E21FF04C3180E75475974D8E5708
+:108DD0000EF0709015991F1E9EC1F38B2344FFEC7B
+:108DE0007330559609151ABA843A2C8D4304A7920C
+:108DF00086BD3FC0E80003BE8C8AEE58309F80AB32
+:108E0000042FF6FEE97F9CD56570F22A556FBABB38
+:108E1000E6FAB8D65556542E6BC249C294F3A7F65B
+:108E20001E63FB5C06DB548FD3236C158F4931DB4B
+:108E3000208E60F277061FA037973D6FF0FA54BB83
+:108E400025E6F79F479F8D9C2D697ECE18E022C6B0
+:108E50000A5BF1A119538B0948D9D94D647BDBE03A
+:108E600023126ECDDB388905D471441742BBFEC492
+:108E7000D894629CE693916C01ADDD3253874C73BC
+:108E80002B7499875446B799CF6138045628A57337
+:108E9000EAF1E3E80409C318173260FF1439B9E4B2
+:108EA000C3F628773359E2C6B66659A0B2ECF20190
+:108EB000772A20C5E40CD952BAE11D95722970EDCC
+:108EC000EC9F2D9E2691B63EBEC0486D411A34BE21
+:108ED000906C494BE58519DEC02C7CDA3503D57FD3
+:108EE0002967369182D22F7C831764F3D7F803A4C5
+:108EF0003CE17E679115E9BEC205A686635CA1715F
+:108F0000A0CBAD58CAC3ACE47C89761B6A1EFCDBDF
+:108F1000F827C56CB69D210E40B1622A8287217C5C
+:108F20002E039A67B94278292E5A6F5E6591FF6BBE
+:108F3000C57451A65CA657FECD11DF96B7DBD44BA6
+:108F400003BE9D527538110F9D4EB7482B2497B61E
+:108F5000E036F4BC8BB34B09222B4047222822A7D2
+:108F6000C9C439022DF833CA7E663F052D06407EFE
+:108F7000ADCD227142BB9D923471AC0799982B3DC7
+:108F8000F08A65A4F44F450BC7ABD8DD2C3FDB73EB
+:108F9000D5FF891D25B468FF19276EE86D27ACA899
+:108FA000BFF302A81585D9B64A6C15BF55CC078406
+:108FB00021371673E24903421E49B46339305DC359
+:108FC000A48549B70D132F51FB0FE76D0DA7C411F1
+:108FD000E3A96E7C6BC16F99282DB7C821BD42E90A
+:108FE0006674C99935DF051F4B3D8DB2DD59AA76F0
+:108FF000517A941C7580328FE9F737A360F44C7274
+:109000006CA8D1F519F964BE2DABC12D0E16ACC9F3
+:10901000DE896A76139CE4AABACB57CB629DB5A9C8
+:10902000DC4D2862DE543FEC2D7E0948F3810A3A7C
+:109030008D6F4EF0E134048AA107CF3DE7795D04DE
+:10904000A55A3DD6AF5BC1D3BB58E48F3D12DB4E72
+:10905000A897335D0FAFE0B05480282455442D33DA
+:1090600087DBF40AAF6A1F7EC0AFF565CE73A73AFF
+:10907000569BA94666DADC68CC3B6A419C3FD22706
+:109080006B1206831F60ECE5931B3EFE1F83E7A077
+:109090001E359D1F5F31590D0B331ECE4BEFCE4C4D
+:1090A0000BAA6E5C9378BBCBD3E6A3173F4B3F3440
+:1090B0009E350D0D724B925156A1185F8C182629C2
+:1090C00019E2ECA1C89A39A14DA6818FD1C5D2ACC5
+:1090D0006D43BBDFEB7154DB8C7E027A123E810A5A
+:1090E00023BE89B68ED728DA9B04E4E02DDEB5F9DD
+:1090F0006EFB4F5C1CA364BA4F007C42673126664E
+:10910000EAC6E396A1F387154681CEE9D64E369B93
+:10911000507AB224C34E3071CAF9A4E468367D9502
+:10912000402EF2D3466FAAC45D7D2CEF0B1F143482
+:109130008FC0DE6B63BAB531FB1CC6229F1079CAA3
+:1091400031E6D1EAEE8DB8A00BAF5875BB25E49897
+:10915000A06787F42A3292999DE30D71579FCFAC97
+:109160006A237877416460ACC5FF442CF792A5F080
+:1091700037914566853B01E813CDEDA95C219AE264
+:109180003C0AED25B81F4BFA3284B81C7B69F2C942
+:109190002FA75AF4FE790446CEC18949460E4FAE38
+:1091A000F8B4B75B431981FE2E330DCCAB7E304B48
+:1091B000D5FC53146F0F97B97C259C7A71FDD3B4FD
+:1091C00069738296C08EA863EA20B4282C03A0326B
+:1091D0009275EC97263AF99A7D9DF1D49012332A34
+:1091E000FEA118F0430B853BE39C2FE944F551DECB
+:1091F00009BEC515335DC436EABDA26D9ED143CC10
+:109200009DF72AEDE9F4436B1C7DE3DE5438A200A0
+:10921000BB8E69684DF5E3F20C404BFA300A3D2AEB
+:109220005F84BC05C58F8A2408E3441EB661CC2D3B
+:109230004CB058DB1B1A895C88C33B63AA0148A663
+:1092400010C7E0EC57405CB9FC35BE41B992085CF0
+:109250007BEA2502DAEA155170E6F157BF175EFE88
+:10926000B2FB81B83C82D443CE9792473FCB2A864B
+:1092700040172676F803895B464653EE02AB8DCE47
+:10928000D070B0069A35C51DE0297544A49AC7D19F
+:10929000F5845F36A588B9A8704814269B5D93961F
+:1092A00054BA62ABDE15EF1B5CE14CF26718B353A6
+:1092B000D944C3919764C478C36319509C3FA4CA2E
+:1092C000A61D2C3559CADF88C86D0B8E1F4E91C460
+:1092D000FA8D125CF9CC6C4A1F22DC81A8C7395385
+:1092E000FAB43E221F9EF049BEEC91DC14BA0CACDD
+:1092F0004BCCED31D45FF2173156C878D996923FF6
+:109300005D7109F1DA5403067CBBB9616DE7396E12
+:10931000DBAFE89E13B71BA1D6CB364D87936871A0
+:1093200083877FA07C2E9D27172229417AE08B30EE
+:109330003B2B46A3E87B676B2DC9050964019A287E
+:10934000CC94FA8E33377177F2A697F4BE6CC88945
+:10935000DA85FC540A5FB873B7316C93A6538DD885
+:109360007497D3A8B788BE1A4667CACEFBD3B6F5A2
+:10937000283D220A108603C427C4752E6D67634AF0
+:10938000CE7D641C9B9492C38ECA9D21661F7F2D47
+:10939000BCA04578603345441EF52579DE2E09D200
+:1093A00008B6440DB021A1DA4B4CDC73119A5B1066
+:1093B000F6048C6E6C10E901DEC2AD33AE4087E975
+:1093C000EA752DEF72CF1E93BCE98295A92067A3A1
+:1093D000222F85FFBEF61E17C671B873F7E76F9F81
+:1093E0000416DC550355D1009E49C09F8B1CBEEB73
+:1093F0001C58B8A1EDF4639A6A41E2E81BE62E1905
+:109400002CFD51898EE54B5041A475DF2E675763C3
+:10941000CD9C8B3AA3F76115A2480087DCA166B802
+:10942000C557D18C3FA35B52FDB3F2A4E278F67B23
+:10943000E428FE43BE22F84F6CDC907C1B42996B03
+:109440003D384B56515D5414285C19A8EBD66E1765
+:1094500066AD768F9FB7B02A5A5F5308420C87D803
+:10946000A977C9A91929ED1760E18488E7932584B4
+:1094700045F0820A68D9337C67F6FA6635E5DBEF9A
+:10948000B72A32396CB66DE80FFA458D5F039C46FA
+:10949000F8D70CB5FAA8A0C608BE6F5826BFC20BF5
+:1094A000901F82D97001BFEB835F569CCA02AF3A0E
+:1094B000C311FBED7E80A0E491FAA45D26FC51115E
+:1094C000F92D5CB4052EFDA6EC8663FABBA4D86B1F
+:1094D0007347C845FC9889B657960886998EB28915
+:1094E00071AC77484E891CFF80B583CE946A844462
+:1094F00096D159D61CE74915449B020E0438D26315
+:10950000E2C477C2FE192CA5128F4B5A0F84EAAC25
+:10951000234594D708B07CF77659813CFC80A14C58
+:10952000B364C3086B4D8E6920073972059892D3D6
+:1095300047EFC975B1B7446459D9B020B720B9EE27
+:10954000D3F4C2888320FECBF2D4452857A11CF265
+:109550005ADF2AC57B8550135825FCFFD39DCD814A
+:1095600098695F39017EFFFAEB1844A63EF3DF5499
+:109570001D059D0893FD085C9B40C6988C0B1EBA88
+:10958000BF72461E900AC09F66CA2F73B12983CF4F
+:1095900090788E1D72F9A3BFC3CFF2D80442C444A1
+:1095A00054B995CF69DD509D496E9411FAB4638723
+:1095B00038D893CF9A4BD202D01ABBC4A50F7610DD
+:1095C0003ACEBC72DBA66E3D3C04B5D8AEF0E09E50
+:1095D000853620E4C4C75598A167086C430F5C43E7
+:1095E000C4535F69D311A1949AB3D554894EE24014
+:1095F000E1DAD91D947281F450F601BDF2779DDF56
+:109600000E6335021FE8C6F9BE5C0FFCEFCA5300BB
+:1096100059466F051C9F5BBE66C18E90E1D70B302B
+:109620009C2E5F45A6EFFB94298309CCBC341E8396
+:109630000BA0F656CE6B3C27CA2ECCED65E488E233
+:10964000E4323F52FBCE14D1828F14FB01502F38ED
+:109650009BED76D1D1390B8053A6984BFD2CE4EECF
+:10966000442E5BF6A1AAE22ED56E4BD8E3319BA91E
+:109670008378F69551B64BB2228774EA78D6118A70
+:10968000B9D36EA2583D660F8C6B509E09B022E68E
+:10969000BC6962D8C35E9EF589846FEF6A41E9E1D7
+:1096A0000BFC0BB7BE4E35963105CA77C0E3EE4BC7
+:1096B0008EEC50781C27ADAC074E9F21AA06C39FA5
+:1096C000F314226407C66951585D50016C4DA9A17D
+:1096D000CAD1719BD9E185FEFEBDE46BE9C4CEB56C
+:1096E000C2D92DCCD602F8E959682B440C6081D739
+:1096F000C682AFC8399AFB13733E6AC56DCF1CDFB3
+:10970000260ABBBDAFBB1351515AA4A1D4D896F6BB
+:1097100080A408D8BC3C56A19B82C3594798DAC0A4
+:1097200014E00EACC35B03B19061848FA08E87E917
+:1097300056303D9A9E666ED7783A7FCACD5F0082DA
+:10974000C7B7E3BDCD597F3C362C9ECB078E78330F
+:10975000FFA5B4AA2F66094BC017179E8D4BF4B610
+:1097600050148FC6002BE7DDBE860220101B8C0F25
+:109770002DB885CFF1C4526C63BB85E60BDEA63BEA
+:10978000F5E3AFD2A2645F82FB185E2717D304A271
+:10979000B38DCA3DBA6E1BED96753A780E694C2EA4
+:1097A000BA7CEF0024267BB4F1F9A751C41442BE61
+:1097B0002084EE59153599C85B1B44E05DD32A8A95
+:1097C00099831BADEE9E34D7C4AF47ED0E6A9BB7AD
+:1097D000CF0B8EA2D90DFA6EF59B7E04B370D8968E
+:1097E000994F7CD2E4A369408E8F4723FAD6C021DB
+:1097F00071EC60D91FF7594E387B352270304C2BF5
+:109800003F9216A75AA7555F4A1F068EC2479C2E45
+:1098100021C7DB55DAC8DC5BCA719A2A83EF4B7C1F
+:109820006A5B5648C5A5E1DD11C98D5875F1010780
+:109830005C2AE1C57A08030FA96D4662F72C35CE84
+:109840008BEE8ED2C41BE47BC3715530C800AA03D3
+:10985000A8E09825E097C2931CAE3794EE53173ECC
+:109860002540F9CA06463C527F3872B6D79E0F098A
+:10987000020248F9E6FE04C9F123745D63EA32BFCF
+:1098800095B06CA3534655DE46979DB904B4AD1E02
+:10989000794A3AAE3F4B2097BD6AA9FDB4A508525C
+:1098A000D3D7CE1C3C3F9405C8FD03B2F8CA1DF7C0
+:1098B000E689AFAA53194012B324F4EC3F825E4903
+:1098C000E631415F84B97C467E414610EFAFECC87B
+:1098D000D21835043A91C61C15C8B79065589D89B1
+:1098E000627E4C914533771BD25834E38552FBB0EE
+:1098F000CE40B6133B8ACBB2A6763241206FE7A2A8
+:10990000413F6D869FE936C91BC2E6E5D6936DE6F9
+:10991000E0F34F9B2516E7CD894E5DF309E8A0449F
+:10992000D8F8A0DA17ECB475DD493B057AFE3D2680
+:109930009065A9E8F0F2789BF3B26FC7E1538669AE
+:10994000AE72A88891FFA4D2A59F53DEB44C583FB5
+:10995000F7D408BAC6C354912465E5AC3D8E33FEF6
+:109960003F694B9600C9E50682FBADBAE671D1FAB4
+:10997000A400C8B206433C8ECF770A1D1EF2B4C2C3
+:1099800006F160C70C12F03D42DFECD0277186CEA5
+:109990000905AA0805B6933718E7D036B1F266CEA6
+:1099A000F67D334B2B49E6B247870EFD378EEC85AB
+:1099B00087E0D43521E6C21148F0A9A6312FDA514B
+:1099C000DAC55B72831542B66307A72784F286A2C5
+:1099D000A252A05EA9075949F2C56AD1F646A12F45
+:1099E000C1E7D8993417F45EFF4B657A73BB1B0946
+:1099F000A78CD1C2D3755411425BBEAE52BFD9F809
+:109A0000CAEA1358B93E5707A642B894E6881C8C98
+:109A100051C171C73EE4EB3FBE1E42E2999AFA6B18
+:109A2000C1D3D7BD92CAD77F3F90B301539866C3C5
+:109A3000365D02DC8AB25567F75FEF1C7E462C0666
+:109A40006EBA6644C033ECC31AFCAB97456499E820
+:109A5000B579AF797BD2B2DB1E56D4FBCC5CFC9BD4
+:109A6000F57FD785BC69EC9C8619FA564D4073B2D8
+:109A7000663C03EED6714F0DF466A10C5A9B13623F
+:109A8000E1FCC16C6C68C54E2678C16994E5EF3F76
+:109A90000165870ECA5936B5F9DCA2AA88B2CBA1F6
+:109AA0006660D6A99DD367E4D211E78FF91B62D413
+:109AB0006020FD4D2AF0DAE473212DC109251B2C0D
+:109AC00039932116DA12762C52891BF53E8BCA2760
+:109AD000FA067BD248F1EA16763663E6A98F0020B3
+:109AE000D6B7A905C2A66EEC5572010E638C0DBBEC
+:109AF000F0DE57C992EA5C7A25380C6022C382EF07
+:109B0000DDA4A20CF42EF25513DEC96269955C8FB8
+:109B1000FC16DAB0DC43A6729A914B47C8BF48C521
+:109B2000CAF0445953F3004D81A0863501EFCBBDF7
+:109B3000E643BE87E142E3867F645FBA6A3F84FA08
+:109B4000712148B02D1B97EAAA37957AE96E445CDB
+:109B500028BA3614D6A5A5D168835E4333A95DD44F
+:109B600043386A435A63FAF6B6073944A2FF3A66A5
+:109B70002F62BE761E576110AB515C557155623134
+:109B800027E59FD0661E206F0FF55ACFF7CFC5008F
+:109B9000F85427F6187D10A8164B80C37650425310
+:109BA000DB2163F525EE70B5B71F1573ED50DCCBE7
+:109BB000A00E6F0503B95D8E62FBC783BF9EE918D7
+:109BC000BAE34E4FB4AB9897B35ACCB6D43389832B
+:109BD0002FA3CE9D77AF56B4AC2B9F01372F41B644
+:109BE000C77DC5602FA7D62B8E428FB8519D509E42
+:109BF0008B46DE0C2857AD64F439F72DE07963818C
+:109C0000E8CCBB161EA5B9D6CAF533ECDDCAADDC6F
+:109C1000EE587088F6667370CF7B5CAF4671AFB359
+:109C20009F6C0A3F20396B266C5A9D02483D64A602
+:109C3000E44AA3E1F560CD910F02887D0C13B52EA7
+:109C4000FFB87A9208D34DF09645464C963087F887
+:109C5000272A07ADE43ABA7C937439415966050D59
+:109C60002BD9664F2ADC7A6A5F917180ED23636C91
+:109C700088C925A308F2E714F9617F79E540A3E0DC
+:109C8000C9C9B69FF63A6BCC4CDCA9DB2285CC5A0D
+:109C900005FFEEC29AE4602C76D2730B340C0C6D87
+:109CA00057F7DF8D2489767AA30DF1019574CE954F
+:109CB000FD13D4122D9B9A4F4FDBC1B4ACFD9239EA
+:109CC000B7A3945A9CFDF9F3CE72AFAD3C620D7709
+:109CD000EBDC61A887AD3E84AF1ECE1B9410DE1670
+:109CE0004878C9BEABF9FB7B68D545D7808CE8DBEB
+:109CF00070D259C1641EF74C5CBD950EE45B2C7AA2
+:109D00009C9B2FFD45FBD2E463A4CA84E03D9B19D4
+:109D1000641140A1D3080A0DBD58A9A043657C3445
+:109D2000C49F7CE3F530117DB8EC66AF4885B898E8
+:109D30000B35D134C050F0B865C2865E38A0F177DB
+:109D4000D835341F3061081A40C1DF96EDC9A3072A
+:109D500018354882F6CE7913BBF4347B79446754C6
+:109D6000C087FADF1C274905E86F56AC262AEC6449
+:109D70007A8EBC98FB8FC56B3EBEF5C589256C52AB
+:109D8000462DFACC9BCBF6FC8370F1745B482DB268
+:109D9000728FCE97B5F3FA74C119E8651C35A033FC
+:109DA0004DBED679A05465FC25521E69675998733B
+:109DB0004B068D4C3A6208C9AC5E8E63863AAAB9EE
+:109DC000CD6A87026E45000763B65FC153F9231E53
+:109DD000CBE78F458AFDD89F01F40E477F4A89A0C3
+:109DE00029E4ED61006F62D009BB8860993BFD01F9
+:109DF000C929945A8D8EBB710E62F662E1F02DA9CD
+:109E0000A7979284B4F366132A69C65C8E9FD60224
+:109E100040D1C3A5B0883967EC6468797D58B147F3
+:109E2000D6ACAD9DB3D0C8662E17E1CD8DC166808E
+:109E3000ED99E6A12474F51E504684CA907F636CA8
+:109E40000C818446BD63026D3432148B16A4BC00B1
+:109E5000CE85251460403F1B5EC0CE15F852C45419
+:109E60002620B3CFF1355AC0E45F60D71E759DA49C
+:109E70009977113639127B3D527B93FAA8B52C6243
+:109E8000F3A0E402B31EBEF1B1F44DC5288A5EA36F
+:109E90009AA62CE448BB3DDA5FB1BAE959A68B6AB1
+:109EA00055FB9A0384EFE09D9884D60C2D2231FD5A
+:109EB00051F241251B51A95A967B65F51DC37E7A47
+:109EC000DEC45D29D498007E2D9672D024896387E4
+:109ED000D42A4998BF3E6E85AE0AE42011D84EEBD5
+:109EE0000099ACCEE9781A8AD2848E4A8DBC96ADA0
+:109EF0002B539A9620448C5A9F7E4D45AA2EAFDF55
+:109F0000A865A0B7B0DCC86A3E564786207BDE084D
+:109F100016B4CF854CB9CBE3C5D80FFA9C4C887DDD
+:109F20002F07722277CEC6873AC723F96D17D9ADAE
+:109F300077B5A5CA9E2CBFD0A299693BCEC01A188E
+:109F4000AAC7B0DB49FE8E082DEFF30AE4694F8BF8
+:109F5000D00DBF4F03903952D5635403E0C598AE7E
+:109F600008E9C977B9A7B71E972D007E4B720393F6
+:109F7000BC29C64B1226CE6C9AA0CEE943961D573B
+:109F8000B8F2562C3316A13DBB73CBDC973ACE47C3
+:109F9000B81A5CAEB34C70C0BFCDA89641558902CB
+:109FA0000C34024E5554AECC7C42688722E368D50F
+:109FB000C3BB91F51E92E9A2A5B72BCD9DB8C28A6D
+:109FC00007D1E7F18E5CCBC7C884F2F900A8FC7119
+:109FD000E1DED2E29B94E7650B0485D4A69148822A
+:109FE0000EB56E4194C1818764C966118A49BF0E5E
+:109FF000478781C6B39C372F3E4A0850ADDAD681D9
+:10A000004B738E11A7CA1CD09758BC8CB6209F8268
+:10A01000D497F0F1FCB443905D1CE13AC04F22EFBD
+:10A0200027CB694B96C495B093F3B1622C7B948790
+:10A03000BBD73C99BB605DC7FB76B701125809E7F7
+:10A040009B85AB516C9DDFCED1E5FDD7CF960D47FB
+:10A050008B1B382032E23010F443F06091B7253C7E
+:10A06000E1C074C1C7D61EA706F104CED7D7873783
+:10A0700001608CB63F99D3121BB44B3327A9888457
+:10A080005FAADAC72054243A4E00A7A496C4B61497
+:10A09000D2FBAF0B3DE2F75C9BCAA5F5037C0B6CD2
+:10A0A00089DF5C50D4EA9CC06758A71AD58E826DB0
+:10A0B000F20B99916C655567CC55291B028BB88DB5
+:10A0C000F425593B1C5E101540BD0FB2366448554F
+:10A0D0009F7D75977F8142409B57C1DFCA431F8D8B
+:10A0E000A4C304C0BBD179D189B2223E01BF4C8345
+:10A0F00027784FF4BD3875DCA89781822A444A5EE0
+:10A100006F979F1BC1024A7F11F038EEEEEB4F2B89
+:10A110004552890DB3801EF70E6E178A6B6EDDA255
+:10A12000BCFDD4AB70A6B0AE6CDFB6C89D8501BCDB
+:10A13000C14AAA2394F9BB4CE923A05C1E2427C47E
+:10A14000C8E285A34FD97D91822AAD47B6340A650E
+:10A15000FCC82E2EC8A2A3030CB462D0720257848E
+:10A16000483FC4B0C167EB46A32962099C1F30DE9B
+:10A170004D69D9BBD929C1BA01E65D9963F5DF9B69
+:10A180009714762E13C6DFB51B317D433B123BEF90
+:10A190003B9608F864CC55090417541058511B36E7
+:10A1A0007F8F7A27C577BF1E48FDE2513F113024CB
+:10A1B000C2BF81AA0C9EC40D76F7E105D813D57EE7
+:10A1C000AA70E9981B79CB78F62ED46B7F1A31A54B
+:10A1D000BEB01B30C69DA3B5F7A89523783D87B6C2
+:10A1E000425CFBD7A8FA66310447B0B06416BE5B88
+:10A1F000B230873350705F4B7FDB7DBA038A675D77
+:10A2000075A52D1F4C1EB090153FE45D53B74C1043
+:10A21000DB35183AEAF9CDD3956D3811B74B47467F
+:10A22000B84DAF849A5A715EE6974023A6F8D138AC
+:10A230009B6155D046FFE71E5DBD46F3512D6D472E
+:10A24000507CF29C8EE8FD6BE9C00F2B479BFDE331
+:10A25000A707BF321F5E677AC77D64E0BBDC3D782D
+:10A260002D5B1E8D810A4629359F6F520F6679B985
+:10A27000A1B2589969FDC69C530443DD239F6B1816
+:10A280006B144F67CC86E3B20DECD4644197C76A78
+:10A29000B4FC09F63D378C04C43E3143E321A38D61
+:10A2A000C7EF9EBD52FF8CC7BAB5D20CD98437C751
+:10A2B000F6681B5DEEE3A20F4E574E763746052A31
+:10A2C0000C7973CDB7D88F6FF8D4164165F26C74E2
+:10A2D000DAC2A70D31BF0E84B16C86C51089751E18
+:10A2E000B4390598CFF6D3902AB49F1ABDF67C4FA7
+:10A2F0000C34C3847B9428A9E3CDE236A6A4266659
+:10A30000D04413944D47DD15BB0779BBEA72B7946F
+:10A310002A33089E03B3F8340EB44348D9E2F02838
+:10A32000B76E7962713F2AA84D692AB5A426A38722
+:10A33000D7D40D3874FA6BF93EF5E8CF796438C498
+:10A3400001897A26194CBBDCBE1112E089163C57F4
+:10A350001BBB5D696636184683DFD3B3B8FAC6ED1A
+:10A36000553C770DEE1C15513CCA1CAE9E5FCAE2EF
+:10A3700007585BD974081D8FBC48C19C15DF3CC9C8
+:10A380005242FD2FDDAB8C972D0C69E968271C2B01
+:10A390005DD9AAFB1B59622B44F7451D8F7B36B252
+:10A3A0008499DA9724AC91B91BE3F2A5F09C583656
+:10A3B00091E6EB97236C5C0DEB5ED52D40ADFFAEC7
+:10A3C000CC265B21DCCE4A6EEC3BA0AFBD9F1AFFD2
+:10A3D000B13CBBA5C8E07C1DA014737EE8E894A83E
+:10A3E000CF3E908F8D56C45E0DF13981B1AF5DC007
+:10A3F0000364680CD92C8072E83651F329BBDA91DA
+:10A40000ABDA6F87AF364FBCFD9FF64287C5A22DF2
+:10A41000700BA95B504FDE75145A4389034FEFFE52
+:10A42000C55FCA3FF0FBECABF91A234E8144777F3E
+:10A430007A2DEE6AB2398017C98D61C5B0AE41344C
+:10A44000751D67602C0F9746DE165542D3FDFE98AA
+:10A45000AB361E097178E23CD8D597A78B3FAC0884
+:10A460004D0BC6E2B1FAE1D85CEA07B7E7528510B6
+:10A47000EAA19D5E846E2A07C34D9BC053BF5079ED
+:10A480009763565865C28509A7ADEEB2C4F70DB7FC
+:10A49000878C275994C6F6107BB9AF72B4F51F6D3F
+:10A4A000BE99E00B76937E5E558B1EDDB65D9E57A2
+:10A4B0004B51AC43F5B61E7D101270AF8D1BBFDA49
+:10A4C000829D939901A24B5150E7599F14E027793F
+:10A4D00095C0C093C279F0EDDF30132D8B68F4A6E0
+:10A4E00092429220EE1258E72CA928D41DD42705B9
+:10A4F00042BCEC004BE20A733CA28AD9EE4B6E756B
+:10A500006563A98153EAA4F0859845A98AEA202EBB
+:10A51000B9EA1C1ECE485E4FBBCF93001C9B4CB2C9
+:10A5200012412BFE3265E5B297ED85E055630721B8
+:10A53000B1216D03DF94EC9AD236FF3B7F3614577E
+:10A54000209E1F28FD372C482B19D539206B1889E0
+:10A550002EF8DEA4680A65029A824AF9072B71690F
+:10A560009894D7DB2D84057A6CA8BF94A55BAE7E4A
+:10A57000E9E6B2F962C71B70B6AD251A352760014E
+:10A580000250A64140A044CBD63A9F035CC55E2D45
+:10A5900054339027C8E9528539E4A87A6B2E8C236E
+:10A5A0008F4F9D37CB1C2ADB1F3DF5D178114D090C
+:10A5B00033DBF66DA47275DA4129F13D74C252ACF9
+:10A5C000B5F18F20A6664AF976F149AEFB0AC87E3E
+:10A5D000B25EF586F6AA628145C5E1946C1964B352
+:10A5E000A2B80B8D91FD05FC898AF786013973DFCE
+:10A5F000203EE3458867218134804E625BFFFEFF89
+:10A600007AE0360CBD9F22E04A9778F0A6F500006C
+:10A610009241FC7154F7C820BA676640BC29AEE489
+:10A62000536635AC1AF06C35B96E389E765DF546DA
+:10A6300040B4660E3A10BDC4BF1B51CD22D3F3DD2A
+:10A64000871D8E282A8902DE9B96A5167F80A1236E
+:10A650000A4B07F8525E3811BBFE35AE7A25D1336E
+:10A66000B515AD51167A9F3F971E6DCB2BA37E0378
+:10A67000D3D70CF4A617A23468C9AB314C8870A6A6
+:10A68000A05D70FA74554944735650A707E5884792
+:10A690005FE57DA2A0D920259CD48CC3197136A07A
+:10A6A000387FAFC2E94470819141329FB33D6BB4B2
+:10A6B0009D644BE12E5F07A66A7732BE8AC595D2AC
+:10A6C0004A58C33BEB21B8A38108F22D6D4E0C8D87
+:10A6D000D35C3ECECC1DE45F0E4838C70BF0B5739B
+:10A6E00065F1C13A83E5B1A05A15EEA3D4B03F5F3E
+:10A6F000844F418E6A1962DB6BD44AD8A7FEE316F9
+:10A700007A5B3EE7BC22340B39007FF7A6EB481397
+:10A710001612C19D583F7BC5D07FBACFE4B13E50E1
+:10A72000C066DE1B6AA01DA993D0252C325FE69778
+:10A7300078700066C7FD6D5330FDD8EDB01BD503B2
+:10A740001829155929AEB1F59F164D02C68B0DB8C3
+:10A750004CFBDEC97D8A5C630EBD60256A26C3DDC5
+:10A76000FD508452827FB1BF3619BE9ADD5FEE6C18
+:10A77000F9DD9F4FA78591EED8E2FA228AB2A66151
+:10A780001E47628ED97BF36C72416504BB60E3ACFB
+:10A7900050A27A8197514B1DEE9B69D4B38B088BE5
+:10A7A0005245E6D2E1EF30E4D7508F24FAC3B747E1
+:10A7B000422A717DB09D85E9963322B30CBCC03628
+:10A7C000371FC342ECC80F2F048EEE2743EF5F0103
+:10A7D000441CFE839E61D466B89E52958CC5E739B1
+:10A7E000B184F59AAC7239D3D4EE16E3D35681C551
+:10A7F0006DFE0547EBE6BE63D8C3B6057657959662
+:10A8000078A8A4FC558BC424B70A0787C3950CE02D
+:10A8100012F7450897233EC61C233B2E656222EEA5
+:10A820008A6C5C6D278FF5AFEA387D8150C27EA3BC
+:10A8300016D7523CDF3F87C8345ECDF9A8837B8CA6
+:10A8400096C9E5BDB44EF0D6FFF522066BA2C7CB84
+:10A8500094030EEC95FBD5C6C66132B50E6409EFC4
+:10A8600066931DE1A98A42CCDF8D1031AB1E6A636D
+:10A87000188D37723230C240C2A0244544956F5BB8
+:10A8800094CE3898221F9CD99CA25DB826BDADF607
+:10A89000C05F67D4B7A15059BF07421579095EE37D
+:10A8A000228B7BAA9A08F43BCFB10398E92F846DE1
+:10A8B000FAF1459CF6F054DA7D741C6EB4DE9DA06E
+:10A8C000E537334D04D11209519A2CC217250537AB
+:10A8D00016CB31FB8BA6992488AB97767885EF86CB
+:10A8E0008739F9F5765010F2EB6E4CE66FDCB24C1E
+:10A8F000B1BE7F1DB56067DF235BBDC147905307C5
+:10A90000D7005EFF61DD6A3ED05E979AB27A512D24
+:10A91000243B5C827905796FE3618C3B0D22A5C7EE
+:10A920009508F183F66A3F8CD7D171A8392AE7D010
+:10A9300089CE0F73112F098DB230751B998E692244
+:10A940007228C5DE4BBDCA76987B16FF6DDD7AD3C3
+:10A95000CAF1AE0AB73729FC353868E5600CEA025F
+:10A9600020EE354BD8659A81F67CAD4110C47096C7
+:10A97000ACA26331D2F404DA9357972A92E922A762
+:10A98000868D6A01B8051D563E5ABB66D1DAD84994
+:10A990008E9C59506D47295D99CB9BCFF99A979E14
+:10A9A0008C95A3F3756E9427E5DA2DA0EEB9A70E6A
+:10A9B00066843127AF4FDBAE43DEB431751D0261D3
+:10A9C000F514000F35501F5D3C6816B753AEFE33CB
+:10A9D00032C0026C87DB4B8C91046DC231EE685D36
+:10A9E00072CCB05041FDE1E0AC93ED969DDB21AE21
+:10A9F0004BD978315D8E0BDE868C164A3F79C43D8B
+:10AA00004FF5C9E1556CF66E2202A39F8F5EFFD110
+:10AA100085F890AB19778200A3A96F2BD8A868DFBF
+:10AA2000B46210ED02390802A24D0EB4EBA5402E1F
+:10AA3000A5E455D67CA9D978D055A201F10EB04035
+:10AA400046374AEE92C2794062AF6B2F65B75E76A9
+:10AA50002FBD7B8FCEF4D928D242C346EBD26303FD
+:10AA6000A0B2971946FD9A3CD1C777C92101511967
+:10AA7000D9C8518941BB2B81C16830F3F01A24FD3C
+:10AA8000D96AC7B42C3EF5C3DB57A61A9C1A792F96
+:10AA90003629AAAE2E54D41C0DB09577EDC42647A6
+:10AAA0006C21AFB83FE1551C81966CDFFE603F29F9
+:10AAB000A3437A4314DC0A2EBAD75DDFED76F7C3E1
+:10AAC00002EF8B79FCF502C7290114C534F69838DA
+:10AAD0007B672B8DC00CA611A8FDA6C3709E8B7D35
+:10AAE00003CE7404A7AEEE8D384AAF3B1DAC82D5C1
+:10AAF000451F219F957B8B12F624657C6D3D44F9A3
+:10AB0000ADA584D50CB7411D89D1CA627743782B96
+:10AB1000BB0425C8F4D0ECE8ED39280EFDFB68F441
+:10AB2000AF007C50965F0F0B79DA88C1F6BDDD105F
+:10AB3000DDB0BCFC80A508DAA0648A55F9EE8A6114
+:10AB4000E0822DF04EF426437CAC28A46F6D04D136
+:10AB5000F867D8DBC30FF2ED3440087658D992A9D4
+:10AB6000C8B96610ACD893A021C1B75B6942131174
+:10AB7000EB8126790799EAADE51D3EB5E51DE9E1D2
+:10AB80003ACE56414AC25775ED54F88A86D8D4BC9D
+:10AB900092EBBE17945C97099F14F1274A9EE096AA
+:10ABA00016655CD509FB2EDBF655659365A23CDE88
+:10ABB0003B3810DA89C0C90ADD89BFE27531CEF3AE
+:10ABC000AA2092CABBE52125DEEAED5323B6D99728
+:10ABD000FFD02C1C35AD014B96F98903B9D1117109
+:10ABE0003CAC67E4A1BB1B98D889D08A4388A2B04B
+:10ABF000099566365DAF7ECA01EE674A67039955CF
+:10AC000047F1C9AD7E83636AFAF5C0A30B0BBE356D
+:10AC1000B5CC885F1C85C875D30ACB31C1AFD718B6
+:10AC2000E0B846A31D7F8C973959FBE5673261F187
+:10AC30005C94FFD98402A848259716139FA19EBD56
+:10AC4000C1BDDD46D2479EBBDB35099996BCAF8EB0
+:10AC5000A165361189019408B81ABFDA4A841EC763
+:10AC6000E970362AAEE986781F66BBC2DE9EA2175F
+:10AC70003E79090B3B75122A5DF211ADDF43D91DF8
+:10AC8000FA01749DA5A527330A11C85C40D0ABED2D
+:10AC9000584EE9D8C25A653B4190837D1128A54A98
+:10ACA00092120F836C80658C4A9BC75BB017FC5C6B
+:10ACB00011FA2EF72C23E0C400FC16885495AFBD82
+:10ACC00050719E0A00CFF0ACB766D6FFD0072B8E2E
+:10ACD000AC140AECB0E77DF88CF4A18AA8259DCFCE
+:10ACE00054A74214462976CC963B869BEB83278952
+:10ACF000DE0CDA58885E8A535A5D4532353DFEC710
+:10AD00007E6188ADBD71CB67F865EC26572CAA91A2
+:10AD10009AB45065A2969E659DB84436A81D81F6EA
+:10AD2000DC51BE1923DB59A63E62E06D8C44D7DAB4
+:10AD300026549075AF83F90C95132759205C86FA39
+:10AD40003BF30173130D6885373A177B9D547A0CDA
+:10AD500050C1D267FF236E1D2EFB2E631A50569DE5
+:10AD6000A18DE53CF45CC3F70C2CA9207FAB5728E0
+:10AD70008EEA8483A1DFF1FE4A229DA3ED0B334CC2
+:10AD8000DEB9FE33304F18AE1650BD2DB3A19A88F0
+:10AD9000B5C848E6FFFB6A77F46B38A879604A2E9D
+:10ADA000D40E26EA2D672B780D378C987944C09203
+:10ADB000DC0ADF548B2AD916AAF63E34508BD533E1
+:10ADC00047350C116B919DA85473F14099D273D4FF
+:10ADD000E1C6CF62367F9A72CC7D01D179F7183AFD
+:10ADE00011864BA13A025A43AAB1F663C5D3DACC15
+:10ADF00009089EFA0B1B52D9EA136AFE6C495D12D0
+:10AE0000D53DC05178E6ECCD6E25B2531C800B27A2
+:10AE100073EA1B077D47305CCA70CBE2C63EC8149C
+:10AE200090D08FE93B57C9191101A519AF5D682B67
+:10AE3000E9F39CCEE0B3A40A7BC21986E2825E08E5
+:10AE4000959CB740016EFEC5D6D2D1FB503CB8757B
+:10AE5000E7B3C072BB8F12438FF8198835CEB4D0D8
+:10AE60006AA39B2E3B4648F60BBDB1E570F77C6D9F
+:10AE700000A70AA0B5EC572A6281DA863177B5A817
+:10AE800031462E4F43EC015E7661BFC269599BC1CA
+:10AE9000E9AF33F937A06DB8DE5F6D73E8A63952BC
+:10AEA000D69A0C35A289120FF706C206CE539052DD
+:10AEB00080A76E9C718FFC27D908CE3F5BB430AC65
+:10AEC0003C3530EB54D102E95242B9F98F6EC0657E
+:10AED000709B27CE56A6C0203704CCF09A2BAD8AA3
+:10AEE00021A59C2DBF674EEC70D47ADC273312E687
+:10AEF000EC93F5F313F58E6EDB13D85AA608ED85A7
+:10AF00006EADCA2BB6D500B95E0ED402E595E355F9
+:10AF1000BE0BE4E603D2D131495A193394E09DA522
+:10AF2000F299EAA0912CA50E665DC724FF9C93BF01
+:10AF30003377816B21F78B1E94C0E2BAF277066BF0
+:10AF400085E737FAAF200CCD16C4DF001EAA159492
+:10AF500043DF540CFAF3E499B4AC531976B7A36702
+:10AF6000F9D1C30DABC3B30DCD118C8FEB70143180
+:10AF700007FAD0F0009905648D7FC68271F67CE5F2
+:10AF80005B0C8CDEFECDE8DAD045B491F2C4C06132
+:10AF9000EA61260A340C28685E9BD362A7D74C145A
+:10AFA000EEDD9B95ADA1F16F0AA29BAD1741E2F1D9
+:10AFB00043C4C247A1388B94AACC5158EB9DFC40A6
+:10AFC0001F8884B29CD620DFEA2301EEA81F8F8D54
+:10AFD0007EADD3D7BED7E82B862415284D2C6F6ABB
+:10AFE000225D0145D075DAA54DE070139DA2971C36
+:10AFF0009CF38BBF82A3030DB890ECA1A6C96C9FF4
+:10B00000B8C196E64209D6AED0A601C0F58F5EC1A2
+:10B01000268D9226FE948FF69067A5EB832E2C7DCD
+:10B02000820DC5B845F7E6B9D069744F93D39981BD
+:10B030002D822D02A18262CC4642C018FFA1A77DBD
+:10B040006045954ACEE1653AB72183E4284EE26037
+:10B05000494170BDBEDA80B4EFE14CB454D3ADF5D4
+:10B06000179F3145EECE061B44D5AD8F8404C988A9
+:10B070004F5AD41F1DD9CB01306E14DC58DFA9A95B
+:10B08000A25EB9067A1A37959525905935D8836806
+:10B09000A375EC8B79C497FFEE84F571487EF9BBFC
+:10B0A000CA4606E7916CD3881D6A4080E5A524282E
+:10B0B000422A28CA9A4651B7BB9A69EEE9BFB4C979
+:10B0C00013A9BAFA376FCB688DF02CB3331B2A71F2
+:10B0D00093BB2E1439FA67130AFF4C9BD0F043F64A
+:10B0E000DE4DB36E6A6A4C88CC03415815825ED53A
+:10B0F000D3E564429F62B43318AFC39617D2FC9372
+:10B10000C5F67C5D83ABB0627C92D864E0E068BE3B
+:10B1100049163CC7059F195C2CFC061AC04F28999C
+:10B120007C39269563404D01AAE6BE031AC98DCD30
+:10B1300028A726D743AB66E73BE1A1DF7ABD1B9F7B
+:10B14000F76043F19D12E4FE6198829108C29F1A54
+:10B150009F82D02F63242177B6A7956399A50EFB14
+:10B1600097958DE73E7C66138F23BB2DEF6F861C72
+:10B17000899A5820BDA1FB76EA44A31E98DBA3AAB6
+:10B18000AB74E54DD60A09444F5799CD1B3E248533
+:10B19000958A046A7DBE839BD776081D3C96274B13
+:10B1A000057887447F4E5DC8473E022D4CA79EB46C
+:10B1B0009907583DCF2EF0B498E0639944E94725AC
+:10B1C0006CCDEC728406FCD3E30568E20E0594FFB7
+:10B1D0007F71B7ECD611705587355982950B8E6407
+:10B1E0009D1F194CE02F1B1AD74BE63AC71F1301BE
+:10B1F000A34EAD4FF189D8E451AF7103C0287663F7
+:10B200001A3910B89CF9A87A5A372784DA0385517D
+:10B210003043010325C664685D3564A0B4C02F4483
+:10B22000006BC689C0040EDC82A662EB83C564B2E3
+:10B23000914168548E87F3F918FAC301ECA66F9612
+:10B2400087D6D25759AEF4BBF0ED5F469A8D9395F1
+:10B2500064ECCC7D6574B419F42EE1690C645688F5
+:10B26000FE21953B00E675A6F73961CEFD9DCBE545
+:10B270002FD4AA5A46A0229D81ECE157976D203425
+:10B280006C7851F7075E5D9292939F10CE0E009FEF
+:10B29000DE4BB19F05CFB9675BBF6B63E4D67346E6
+:10B2A0008E154A71C2C905814E0266169C76D21F60
+:10B2B000B6D25EB605933735A77183B3487A94F05A
+:10B2C000C06DE9442F407828187EDDF49AB572CB22
+:10B2D00034A47C763F6BC5C8277E56CF9DA180DB0A
+:10B2E000702A53891ABA7823CAF44D7EDF790D7714
+:10B2F000A6AAA768BFC1BD2512EE9DD8F2EF0DAB7F
+:10B30000F294276310627F50E802FFAF04FD3E3ADB
+:10B31000AB8BAFF10B4CDFCF32CCBEFBC23E8AF31E
+:10B32000E19AE2CED56A61CD029B265DBA0FBD459A
+:10B33000790DAEAE7F41525AB1BAEB806AC52E7C10
+:10B34000C7564657850961873F79956E9AFACD4B66
+:10B35000CD305B74112008F0486D91A8AF8E9C240D
+:10B3600021ED63091B227F0B8B09DD207BC3CD35CB
+:10B370008C6F49E5B516AC9D29E050BC2200DAA9D6
+:10B38000DA7D931FFD92D57DF902C0485D70DCCA5D
+:10B390006B80410307DF592BA220D3918939B04C30
+:10B3A0007597DD3609942E7CBD495E74A848552AF0
+:10B3B000882D80848564C478491E7F69682A3D3958
+:10B3C000575ABCA92614A2CFF6CA747153DF7C1752
+:10B3D000A822FC5758450BD8954C5D12969D375FB7
+:10B3E000DE825D60C64E40A3AFB2DCC1D68F0408DA
+:10B3F00058F86E2DB09E7123FBB1779E66E109F27D
+:10B40000943D7CF763344691D3A6CBB2875FCE9749
+:10B410002861A4596EE777512B6927A92DE44F467F
+:10B420002320B155CC74A22F0113A47C00DB062C81
+:10B430004A458DAB2778DE97E3AA0E299680CAFB92
+:10B4400004BA1E3C9E937DBADAE1213520CBA031AF
+:10B45000FBD216546F683497FA76B732CF3B689DAB
+:10B460009969A2DFE309F9AD4D3DB15D3888EB6222
+:10B470006B93B40931336414E8DC5A193CA32CE70C
+:10B48000AF3E42C0C7C21C81ACAD1FA644CD8BA24B
+:10B49000036A2CD1BE79FEE8E99BF6343993821B0E
+:10B4A000233556A1931CF12157FB67EAAC9766D56B
+:10B4B000D4C17F69EE3869993248EDDA0203AFED05
+:10B4C000DAA4C139C09A0520E4ED2545FAB1FE2E73
+:10B4D000A8DE7346530B1C6128DD3E396E43D03322
+:10B4E000B5511F2E2BF4373BFFF2EA74C00FC15841
+:10B4F00030B88650BB670119116D20332F6381BCB2
+:10B5000013B37F4FAB364FA11181F8F98F425B49DE
+:10B51000F3F186C60B3062129336ED79FE2E8E4122
+:10B52000CE5EF751C729FA38038B9A6D50166A30F0
+:10B530002BA286B5A250DF9C3690DAA247DEA51C6E
+:10B54000D43237A9DBDEF2FAA578E1AD1311441C41
+:10B550006DE1BED297E720685735B05B9FA89696FD
+:10B560003BD269D7BD4699ADE6140CD6443A1A6170
+:10B57000511F5D4067E68F55394363313DA83C203C
+:10B5800005665B850DE5892F30303F073A3573142A
+:10B59000C9961427B493B8E93323565977591A8CAE
+:10B5A000DA17010F1795C67EDA3B5BE3DC9BBF5BC6
+:10B5B000B8064E5A5C4CF13ED2A22AC08EDB4365DF
+:10B5C0001CE6CAE4DCA14A77E394DA855A2494891C
+:10B5D000CF2AA8ECD82B230E014E97BD5A82198B87
+:10B5E0007AFA639334E520E3CAEACC48237B988B4C
+:10B5F000B04BBD4868914308EAA5179096FB49DE19
+:10B600006C93722AFA2FDC2F1485BA44E135BD976A
+:10B61000CC4F6EE3E501CC6A0FCDFE75D62BE66FFD
+:10B62000C12386BF266FD96AB72DC082CC934D4EF9
+:10B63000A8471D877C96B340040C227F3123EF2C52
+:10B640007EF976D5E9F9D574FB08D4258B344FF80B
+:10B650002AC7673963E914F774E13F9FD47FF94E35
+:10B66000FE6A91A8EED40127C07F582BD5EB78FC59
+:10B6700099DB3D524371FDB1D5A949213401EE203A
+:10B680000CFC2EAC96E3A25A5A5A624D62FA14830D
+:10B6900014CDE0633AF74A6A69E874A9E3205F13BE
+:10B6A0005B0913EE5997F5932A41EA2DEBFCB2EDB5
+:10B6B0001C66BA9D88938F012CC447AFAEF19FF0F2
+:10B6C000040506E988A3B47299E12C454A6821E98A
+:10B6D000E29BDF21DECE3C20FB838FD1F7606E251D
+:10B6E00075CBE271B314CBC8DF5581844C2A4E7FF1
+:10B6F00052A42365FCF9F4554E3DB0E1B03C28431B
+:10B70000DA1C0716D30A226341AABAB325857ECB79
+:10B71000E61B359F5A03C66FB485A5AA27B871DE0C
+:10B720004E3D9AD15AF5D4DD4E33B4C32D11920853
+:10B73000768C6C92566760D9834F5276144228B04B
+:10B74000C83775D0AB5822F7FB860F9A0699DA28CE
+:10B7500090B907138900A82A849F52FA0EED54E489
+:10B760008D2DAC0DD0F28BE4E787ECC45FAC713863
+:10B770001215122270E690C0E6CF6F654DBC178699
+:10B78000F87042D88EAA414CDC262357DBEE24A465
+:10B79000591FA88DE0CEDAB2C98405F0FE20090257
+:10B7A0009174E9D1058251BCB5F62E0436149AE3A2
+:10B7B0004EF2966CCAD49458ECD325C1DF109C3855
+:10B7C00031DDBE452B1FB799BD47CBB766B3FF5DD3
+:10B7D000576B66AEE03195A5CAE09CB685E9613944
+:10B7E0006F31B83EF3B8DD660478CC441BE1CE0D72
+:10B7F00047C7BA8145312960EA82AB01856CCCA884
+:10B8000064C96AC40A06EC79FD5B66A1B27C2FC7E5
+:10B81000A5E4F529C76C06716909270709D104E178
+:10B820000077ED01D030069B3F520290095FA18660
+:10B83000EFC349CC37B525B9F22BCC94257443D945
+:10B84000750A1343BDFC7F5C9E3497EC5F4A4EEB58
+:10B85000A78C83A41D29AE58BC7456948A36DBEF9E
+:10B86000F39BA30E56A0561A6F7CA143B2FEF52798
+:10B870008CF340FF4863D16FA283C4673CA70942A1
+:10B88000CAAB8800F9080D15328A7D89A00C2C37C7
+:10B89000735C555EC19BAA595BF8ECAB26917DD9D0
+:10B8A0006946D54F9A779B2181F215B19D18766D27
+:10B8B0004EAB2DEDCA0DFEE47F99A546B7949A8D47
+:10B8C000C203F619F06960AE01A881F08749390E0C
+:10B8D000A72F4D9A8BE0235ABBD2B1628C9FA2D086
+:10B8E000A8FD37268962DDB4F8233959F7FFF90836
+:10B8F000725E4DB85481FAB302E43DD322A783C3EC
+:10B9000043DA15D752B31D3A28B560588B7DD86BF2
+:10B910003AFBF3660E2E95423845483BF3F12D76FF
+:10B920005E9426485CD0360F27354C79360B0E8452
+:10B930006CD84192D5CDF9C74D53EA1750AFAFAC93
+:10B94000E15E6F7594414AF96D944C2F3BA70F2D22
+:10B9500096F698EFE298A71D71CFF4CE9D0FFEDF0B
+:10B96000912DB85A247950C9DF350DAE02E3158701
+:10B970004374778BDD250B1FD3E54B7CEDCE5DFD4E
+:10B980005875679804C444B5F299D0B5059F63070C
+:10B990008B01ED9AB87D546FB1C404681269B65D2D
+:10B9A000223E0B25BA4754B8C47400ABF451A5F736
+:10B9B000D7DDDC587D101162CC5637CA867117FF6F
+:10B9C000AFC2355905D1D930B3407E306995F28C7C
+:10B9D0008A9860DC0ADBCB1A3078BF327F72B2EB18
+:10B9E00094FF3F34E61B4E0BBB3D9FEDBB34F98803
+:10B9F000A9C1211B265F10BEEAC6B2BEB55D12D139
+:10BA0000FF40C06BA7CE2F723842A63C955958E430
+:10BA1000A328921748D3DB45D4336BFF1A3AC542AB
+:10BA20007E832C9BBBE8A953D305E3B922F73FD013
+:10BA300052EA176E80F3258D32B318BD78846CAC52
+:10BA40005A8B1881648119E0369A7F4DC434B58DC4
+:10BA5000654C136F41F5ED98B007012F3CDBB49BAB
+:10BA600073688E952E9A229B98B16439A4FD6AF072
+:10BA70003E56775B51D638310D3CAF00A930D147E7
+:10BA8000286542F7BF39005E7F57E7D19F48AB2654
+:10BA900087A1ECF9991C608EFD8794F2292232650A
+:10BAA000EFB602953AF5AF6AE394B493519EE4E79A
+:10BAB000EAEECE2D50D6FD49DB5CF2101A4399E92F
+:10BAC000B23CB4D2488B0A4025EAA03987B34D5521
+:10BAD00088885CD01030A1CEED8345FA223DC10CA0
+:10BAE00023DF597E00B98FE1C174AB35C42C0C390A
+:10BAF000AEDB2BAC8B6512DA0A71A49F91008DE04E
+:10BB00006E049E970DF3C9372CA0277001D0DED0AC
+:10BB10001438F9EB6F62F4C156FE1F9B63C8DE3B1D
+:10BB2000169F2F46E35716F996A587D55E2C4B46F0
+:10BB300077F975D6D58C962B8B5C54CCBA365F9A38
+:10BB4000DEFC817FBC21384FF0B90E725F5075EF7B
+:10BB500006DF931C90B91196C1634B6059614E2565
+:10BB6000EA1952893D5390323B7A55AC81D8A17C79
+:10BB7000B50B4C0D475C4F8B4CCF4C8D8B8AAB6615
+:10BB8000760FD86F33A4A7C29D518E0917446B3628
+:10BB9000B3D2018C5AEC81AB14E53649B59C5FE712
+:10BBA0009CC4D67259B83EF30619F87DD8E8C00790
+:10BBB0004129420FD21AB879C8F09F1BF9199E97F4
+:10BBC000A5E2F37EB4259B5FC678A0546AB04E8888
+:10BBD00037F7AABCF3DA60121A5E90CF5ECECC8C37
+:10BBE000FEE4A44EDB5A1BE77461D780C591E05593
+:10BBF000402710B6FF43CD810938795B41E58A249F
+:10BC00003F7A16FD62B8B9E061B3C6D56F48C9C8BE
+:10BC10001EE771749B265D4C53B07B474F68F63826
+:10BC200005797B54F169938D87082F8DE9077F365D
+:10BC3000F340D999A3D2C1CEDBAE0901773B5E6058
+:10BC4000B6376B9FDEEF5DE5959EA7F03C665E5DC7
+:10BC5000BAEBC9BC7A7FB0C8F16087958C87672141
+:10BC600014C9B8E5504F3F9A43C6F4DD0BDCC65308
+:10BC7000AF7DB3CDA86052D67B2F9B2C0F0BAB08AA
+:10BC8000067E4A02022B1AE820172B9F64555DB1ED
+:10BC900025DAF3A3E26144A723DE5929B4441685CB
+:10BCA000605225BAA568560900D19418C4918277CC
+:10BCB00084B977E3C8A0E18FA16EB483FD3D827B98
+:10BCC000D3334EC525B9721C4EB2349FE3963099DA
+:10BCD00037F9530D2D3946DCB712D758B324211448
+:10BCE000CA6E2C10F425C9B26BB6A0EB0D9E7F78FE
+:10BCF0008B0FB20C8E1DC7248CB32B1C07FF37147F
+:10BD0000235C04EFDB5AD33B31E7AD3B45F6780EBD
+:10BD10004C7500A381D39FC98B27914596E15B4C5D
+:10BD2000B00B8DB30E6CEEB98F571C7AAEF9B8D349
+:10BD3000C8EA91CF2255A278E99EB479EB2FDE7341
+:10BD4000BA41317138488A1E92B20F3BCCC0FDC94E
+:10BD5000E59DC24A76417CC2F3861DC7DCC30493CD
+:10BD6000DADAAB1F3C3E0A1AD76291D49030A5A014
+:10BD700094FF018A88EE92BB8A4266760F02C2B3B4
+:10BD8000824ABB4F94626191ACFE1632F6EF5A388C
+:10BD90008E9BDCCA89172BF56CEC0DF4D8ADF551F0
+:10BDA000691DEF6EA2F5D70184439579F777D4E743
+:10BDB000854890C38D06555F005779029EC2AD4FEE
+:10BDC000F24A74112139505430434829E9066C5B1A
+:10BDD0000BBB14B0A35D798F6494A25B4C6CAE0274
+:10BDE000FF89D2020F97283D995D7C250B3DBE1C33
+:10BDF000CB1E1C31C6FDFFAD296A4A631C685F3348
+:10BE0000993601F5A7894C7039450258996F97C743
+:10BE100048EC6D59B30DEC0C6E09C94FF8F9DB8E87
+:10BE2000D452B83224B74B04925534F159B10014AE
+:10BE3000BAD6DD3DA7F98177044D41BF60EC4604D9
+:10BE40001B629F3667229D9DED8F071E93B9D8A96F
+:10BE5000528D9E1FB384A98B1CEEEAAC1F3F282293
+:10BE600049FD83388AFE152D9D5887A6AF83EE4E77
+:10BE7000B10064A17FF22B5E8F4EFC6DB040ECC22E
+:10BE800082D414361CF0D64C150CFD80E10F12390B
+:10BE9000C43C75D54756EBECEBE9C0D6B2AC682193
+:10BEA0004F98734B4612C4AD1F81722E808320833E
+:10BEB0001DD568985328D19C938B0A05D96BAE0089
+:10BEC000652E1A7EFD449BDD435072824EBBEC4BC7
+:10BED0002F4A34D6599B5E03171D29446C8BD1F52C
+:10BEE000D1FF9DC4F3789187E91F4BEE2CEBFBE467
+:10BEF000AA528D529DCC19B06383DF0942D3F14F12
+:10BF0000CABB2352889AD597C29BDDB9B9C8CCF277
+:10BF10009FC76AAABA1AA136EE1FF1149D9BC1846D
+:10BF20009F233B91FB4586801E95263A4EA17720A4
+:10BF300096E01F7BFB536D37EFEAB29B710F0275E2
+:10BF4000A12CF675581F29DB76835345C613506420
+:10BF5000B557C0E86C9552722BDBA3172B18E8126B
+:10BF60009467F5EF50F653E5D6AF8738A9424AF10A
+:10BF700076A9BC9BCFF02A51E22FBA37AC3363AA23
+:10BF800082CEE0A90CFE347C9C15C36E42FF822F4A
+:10BF90001891BF822A9F653AACA6C9E5F3A4D602E0
+:10BFA00021A7BC3389E6C2C9E41C7DB7BFAC9CC8DD
+:10BFB0007C541C853AD2B68AC1D888E85D8021B508
+:10BFC000D7979A4A7B20298A32F718DDFEB4AE97BC
+:10BFD000199837B91383F28621BDEE00CC5E5D7BE4
+:10BFE000CE1E6594EF0A7D86CDA25BA645BDEF3FD0
+:10BFF0003F6D03893893A34D3614F3B2E3F375F420
+:10C0000046DD2C0025FC7691C5FA5FFBF10E1CD2B3
+:10C010009A345A12DFA78257ADF41E76B6CD1FD8D8
+:10C02000A8ED8B9C7616BB3A6B05951EE8D1BE0E2B
+:10C030009D5EE4704A379290D2B672146262DB3130
+:10C04000229D645041D1A068CFE21E5AC35FE8C36D
+:10C0500082D1DCC8FD69B62A8A08BDB401E82692FF
+:10C060001D765434431C5EC472473480C72569A5CD
+:10C07000CDA0208E799699370B85BCD7D9D6661678
+:10C080009186302EAB955D8870F57890C8845EF906
+:10C09000BCB85498B86EB307D3BA58A6E3998C5E6F
+:10C0A000E9F371F922A8AB70323C95F724298C7F13
+:10C0B000B9BD70314F8B20069ADDE8B4F805ED77F5
+:10C0C0009CB9A204F383ECE9A146A7815FD755B7D9
+:10C0D000E1C5942F703B186234069D2B37FDB8964E
+:10C0E000F8728DD6079A4DABCC8757BABD46E8B4E7
+:10C0F000E0FC5004618D5312E1F9C53FA19EE4328A
+:10C100006BD0EA37CC549C5D1E6BE35E7F12F93E28
+:10C1100025DB08D1DC4DDF06532C4882473C38A98B
+:10C120005CF6E4CF5A9CD80A0ED879222440A5AEFA
+:10C13000183746BF221AAD69D69114A3487BF0ABDD
+:10C1400081644865C83E25BCD49559DE7711736873
+:10C150001C78B5E785B7B9D3FBC8644E06CEA62DCB
+:10C160007BE86D368DC182862A69BB50509C70E198
+:10C170005171E51707CF99A17319774191A61F66F1
+:10C18000D4F8C31BC84EAAE44AB7E951083A8763FA
+:10C19000B7B39E0791C0DF0A2AA2908AB90BB6DE18
+:10C1A000FAF752D07B9932FE9A1EA4B65CE956EBA0
+:10C1B000CAE3266BDDFA8B69DC0B017BD467A2E452
+:10C1C000E76090C3A31A4D53FBBEB15745ABCB6993
+:10C1D00040C5600C06D82CD224DF9273783AF5DF84
+:10C1E000EBB75CAB658DEFD56C469CDA97E261C826
+:10C1F0007EC4673B55535DEB2258A8BC896207E0BB
+:10C20000AF0456F5E3368E4E3B9E9965AFAF3AB913
+:10C210008E741070464433152377AC1626A305CBD5
+:10C220004438355FD174CC8C63D080E287EFF1461F
+:10C2300030E5858CDAA492FE92A624D8467C44A8E8
+:10C24000887533EE94BC7917A3C50F696B3538A98F
+:10C25000C9DE6CF952A22ADE6B239A47340CF03007
+:10C26000B2A7936FE295B7067477DC6C0CEBC5C68A
+:10C270000C2304B6834B29BBF906CC1205D74859C9
+:10C28000568C555E78935762CC158CD4C90F5DC21D
+:10C2900009639A91533FF483EECB4D6A631B20ED03
+:10C2A000D893A64099320EF4177E24D199B253E167
+:10C2B000B9B6C8147D2C2343DE599C29071E6AD5C4
+:10C2C0003F6AFCA2D5092EAD506D495E7863B75226
+:10C2D0004902EEEBED95F2B0B0F4B9F2C38D6BC349
+:10C2E000C34710D9ABF30E9D847DC60476FA9070D7
+:10C2F00083CE2B7BC54DA91A2DC1780CACD093D819
+:10C30000E7D6821942A254CA892D51034E3587427D
+:10C310005C86B7371FF49F9701C839E6BE23CE630A
+:10C320008712CBF53877706636FE2FD5FB56FFD7D0
+:10C3300055A4A5D8947EDB7FAEE25541606628A166
+:10C340003493D72DEAEC2F8D4E7DED92E00931B676
+:10C3500084CB202322A5620CF58C2CF0AA528851A4
+:10C360001059AF7363C0DA1B9C3FC387903026E738
+:10C37000813C91C9D5CA94A2E0E8F0DBD007B22A8B
+:10C3800041CEFD0E26113E2DA4F1316020A85A4168
+:10C39000865ACA723524860BC7905743E0DD711D5B
+:10C3A0004D043235F0A71D86188090E3430D65AD2E
+:10C3B000894BAAE4F3963B9AFC9545FC2C2AC905C7
+:10C3C000FADBF7B1636D31F0B2B6D704424E4F637A
+:10C3D0005C94D43664D299EEB9621A24527D84EE0C
+:10C3E00034294D009BD51F856AD6E459068B16105B
+:10C3F0002F93F973B9D352F85AEB6068ADD0C7BD2B
+:10C40000A3EE937B640006CAC1CEF114305752DF0D
+:10C410008C1DA4361ACB0B0B762376CF4EE1C3E4EA
+:10C42000EC2AD353C028FB7971333E7D5DE4B5FD22
+:10C43000148B617CB436409045A429F0000F9F61B5
+:10C44000E5739C3FD95A793722CAF4B55E4C71D551
+:10C450003E2C20ACA5DBA156D9701A30B26FC04A71
+:10C46000731E26BDEBDD8AF2FE0122519FD073EFD1
+:10C4700072EFA43CB36CB657F6AC8BDBCF6515B549
+:10C48000E36F7A7CA8F9657F78A59612617D0DB877
+:10C490006BAD0C8FF54DDC79B97E15FBFEE961F8CB
+:10C4A000951E639FEBCCE58C2266BAAF333BACB1F3
+:10C4B000EFE300CD951E92631B1CDCBA05E0FA8801
+:10C4C00059AC38FF21014850BAC80E0E676081EDA3
+:10C4D0006C8DB061220EE7FACE9A9D7995F0D1521B
+:10C4E000A92FEB421A5ACB6CDD7052CFBE033ABC77
+:10C4F0009AB7390B4DD9BF2D9AF635DA98BDDB3F87
+:10C500000A78CCEF21D82FE71CA77652C2C77FA3A9
+:10C51000A700FFC86675C4A9420AD5359D0F1D5AEC
+:10C520009B81E1EFD0C61342EC5EE63193D8775E93
+:10C53000AE7CACD242AC40856D498B93EEF0CC9A88
+:10C54000F1F2930E43641F97C2E68E521794EF09DF
+:10C550000520CBA704F29D1D5BA769E6681900576B
+:10C56000AA112D8A7853FF4386B541D8449653913A
+:10C57000E79573D5C305EFF8E68217471D40E1D272
+:10C58000E2B277F951803B30F194FA86E5195D48C3
+:10C59000E2ED4A7C214FA88CB41E10C7EE3C16CEAB
+:10C5A00055A64930C47B9D0C4B810C3E2D67AB6278
+:10C5B000EE77467F27890E9321EE8ED9965F808B8A
+:10C5C0003A42C5D4BB2228705CE331E719BC23860C
+:10C5D000D105CFD777DB7D6808B8AB5B675C627548
+:10C5E000DDBE7A42687CCB52E87C07E49D058C8FE7
+:10C5F0007A35B70AEA6608C75E5AD820AF8543C4C1
+:10C6000003D708ED0C8337BED6EA48BBC921D64B09
+:10C6100008FB687EAF699D9884483E699EAAFD30FC
+:10C620009A82311AD5EE17DBD2981416E926642ABD
+:10C630004CBE54F6987E2E4387CE27BF7BC4ED6850
+:10C64000827FBDA873B72E205B039093F03E31BB71
+:10C65000EF0E97F79782139D8D9740B9B639C7D0E3
+:10C66000C946D4B8808CB6A4F9A2B0E1FE1D1AF276
+:10C6700013B41CD257042618AF932D9B2A8D82C762
+:10C68000A595541D7C89196DBF7B2888A5FC5F1278
+:10C69000C1B8CB492EA3BDB695ECF256794E468F64
+:10C6A000ACBCE2C615E614D539BEA759EBF1CA6B8E
+:10C6B000C48F72357678E8F9C96919DD38651921B2
+:10C6C000283063C8B3B35D5AA05529D7073BEAD4D5
+:10C6D000E6C4BF5591E07FB59C58B71E2919A869DB
+:10C6E000D461038C663C498E9D5274D470FC0896CC
+:10C6F000C48C5724C4C4226AAEFB356DA04DE799A3
+:10C700002E3E2A882C3338DC8830745370418F26B3
+:10C71000F582917AE8FBC6D550C44D8C4977E7374E
+:10C72000CE094D4559022B62D36AD400612C696A47
+:10C730006C0B55BE044AFB989ECD8C6A22F58B4843
+:10C7400079A6F9F29E52C7267A9180A0C3F5298C6A
+:10C75000E3D1044AF9C782A14D4F0DCA6107906524
+:10C760000DF972226A0A4891E9222A7981A68C3F42
+:10C770008E6B1D069CE0CBDE605F82F96FD061A1FD
+:10C7800040B7C4A88C7D805F7B827E8669A9ECDF80
+:10C790002ED969D3C7040B4F729652A683B284D8A0
+:10C7A000A12F0456D56F0E7A2E1D3E1DE8C9C42454
+:10C7B000DA30B0E5F63B21D4D343BB3EB88113DD7C
+:10C7C0006A2638C872ADB5BF68CD60F117DAFEA928
+:10C7D0000AF91AC99729D411516BEC9EA233375527
+:10C7E000118E8AC7315EED6433DF186C2AD9390A9D
+:10C7F000C998A948459A9A392B93E0E65B34994346
+:10C80000FB8FB266FB234CDDD1690A22DC3F31FB92
+:10C810005DF7691423BDD60985BE643A0399F523F3
+:10C82000FACE16E4CF0462687A37FA66C7FEDCA156
+:10C8300018EBC5675649713DDA6D7AC24EB52B4586
+:10C84000BF320D00869253EC4302FBD060586D4717
+:10C85000BF7D495D1A48A4661D178C53B2362276F7
+:10C8600009A37A324B411DC1A45585DCEDC8E9FA14
+:10C87000EF09FFAAD7EE26F6D4BE13525894D4621D
+:10C8800082D777E6C0C53195910F615501AF0F1979
+:10C890001C454BF3F24C768995E36740120FCA288A
+:10C8A00041DF659F2A01DF427AEC91865D042FB259
+:10C8B000030FBD904D0C08989860A30408D50F167F
+:10C8C0003351A24F1BB8454C5D86137CB63B07D253
+:10C8D000BE3C3EAF05405F8CFDF9FCA61C31745C8C
+:10C8E000A21EA6033886D0C9BD345CE9D96B5502B7
+:10C8F0009F8B96F7BDECE692360D73F3077E7413AB
+:10C90000023244BA5CF128C8E51314E813543B75AD
+:10C91000019984B1A230DB68E77B90E49B71C6404B
+:10C9200054B4DE456DFB5EE10E5FBE3D68A558C0A8
+:10C93000CF05BCF0B92E7FA4C86231477691E66E70
+:10C9400087CDDC9BA6C381F0C45A050E5938DC3C68
+:10C95000A8C6A87FAFCF570BCFF15C99F8B42B0CCA
+:10C96000778EFB0535D644A36F42E142200746157A
+:10C97000418DAD05E0A47579834518406CE7C26D23
+:10C98000CDAD2D6FE477194DD4D8304F5C04AB6337
+:10C99000AA3CF2F5B3197CDDDF2098CB473076F066
+:10C9A0002A24FECB84BEC9C8BB7AF9622C8A492AE4
+:10C9B000A1101340F94CB20394DC44E14C773D9252
+:10C9C0009E07BEA644B70EEFA4A0090E2F8704F55C
+:10C9D0004A05609A506461A94FEDB09D358BC37DC7
+:10C9E000044D05F87B92B76F752C4B7C4CDB607C5B
+:10C9F000D87A3C376525F390DD31172CD3240EDC33
+:10CA00008A1FBB1F5F8252018FECC4AEF2B04D0E85
+:10CA10009802611FA9D5BC4B1675F02D4A67763A6E
+:10CA20000A1C039ED22C97B44648A468CFB9834110
+:10CA300099A2735AB9B6E77CD95ACCC1F459058B7F
+:10CA4000573C467C5E01B952B49AED496EEE0CDA61
+:10CA500040A37821596DFA72FF63A5F9FD1CCED76A
+:10CA6000ECAD97C7517C2C2C9B3E570F4D94AA4997
+:10CA7000F3BE2EC757B677E934204732DDEAA74127
+:10CA80002E289982D54789DEBC088B0E4B7A2A6FF7
+:10CA90008A4316FA62203CE0A25BBD8DD5EF317768
+:10CAA0001A0985B990B3E42F8E7C0AD9B55507FAD7
+:10CAB000AD5BD145F948D4BB3FEE770A43287EC32E
+:10CAC00070F67DF2AED114D45C591E8A78928DE94D
+:10CAD0005B5E9121F875A1FF241D4F50050C71A4D8
+:10CAE000DCD5B5709F67F725C7F01FD2E81EB119D6
+:10CAF0008C6320B803807902089DF834D3E5AB98A5
+:10CB00004CB287CBE20521884F5E248B49F3E005C8
+:10CB100092CAB47110AC69776E23C5B4537E128487
+:10CB200000E29A3B2D3FAC5E19D0A17F89E0C46939
+:10CB3000C129F7A21054A4EAB8DF661D3E2E3D15A8
+:10CB40007457CC8FD081C851AB0E046FBEF3760200
+:10CB5000DD728DD37107B522ECF3055B5943224694
+:10CB6000407B7F35AD3DFA4E06E08B9BC1DC603BE0
+:10CB7000CDB669634B5D62714A258763203BB9AED0
+:10CB80009E856E01AD513261F9A09B7D63D45EB884
+:10CB900088EDE033CC0122D99AF2DA88A4CE8CF663
+:10CBA0002047522CA1B44CAD1CDE88EEDFC350648C
+:10CBB000EF7306AB2293FF78730980D9B792F36EB7
+:10CBC0009715D8B3DDBE22C32C13AC61DDA1337140
+:10CBD000A1A3839937BB8BA2C2EF32E8EAD0CC7E07
+:10CBE00024FAEFD6DC7A2463760BE76AB664134A3C
+:10CBF00085F1CC3DB6AE5BA3294EFD9C1D5B0EA41A
+:10CC000043BD95D1E05E072EFD7CBD9F779B8813C9
+:10CC1000DA06B605623FBCC3D4706BEB7D56935009
+:10CC200093779C08AC8A2B7DDBBD6FC34F32DAA6AD
+:10CC3000702577C060552624B10A07EAFE343C9976
+:10CC40002854613EE93E8D31D808754E683B52C18B
+:10CC50000B9AC014CFBD3FC466612319398D680B90
+:10CC6000A2788B8F528DE51FB3E1FE0C4EBA6E5643
+:10CC700016838FA17DD64092D2446FF0AF3F8E3C99
+:10CC80003D625A3C1E589A2A2C9A022D54DCC4A9A3
+:10CC9000976B941591C462EE1ED16F81234532F0DB
+:10CCA000271E590E133BFE2C8A937B2428C68D35F4
+:10CCB000504143FB758C467135818572A8DBCDA947
+:10CCC000E4F95E530F39A2D8D181A48E1FD869A090
+:10CCD00088B2EE4760B3188BB2E0BC9A5B51D2D1F8
+:10CCE00010A58F91672F0D3EB883BEF8A76DF82071
+:10CCF0005C7AA5ABEE4F003B4E90817E7A35F271A7
+:10CD00008BDD28465329790D7EF930696E2B2F80F3
+:10CD1000278B3088F453AFE1AC83E5364FE005A6AE
+:10CD20009C98E7CAEA71BEC7C4263400C99B296231
+:10CD30002BD17516CB33EF0C5210B224C203DE4B4D
+:10CD4000ECF4CD585A6AD5A598FA3059AC7869CF29
+:10CD5000C2ECAA155B72223143CE954EE45115C345
+:10CD6000DC9387E879004D413A89B5B66463D3B264
+:10CD7000559D918BFD6C68ECEDD9838A776E74A517
+:10CD8000F8DBF93CBBC782F25F4C94B0FF6540CB47
+:10CD9000004E4CD78DC7194CD6BAD62756EB528ABF
+:10CDA0000CE89D47A2A174D22FE48A50C5495A438A
+:10CDB00040F3E38A04D4972325AFA655671FF6985E
+:10CDC000713313C227EE199FB304136A02CA2FAB43
+:10CDD0001DB83C28DAD7D698698F3C1D41BBE59D2C
+:10CDE0007242F2E616C24F0A7610577E26DE381CD3
+:10CDF00019BB7353A7D33A7178ADF0BD3EB1C65F8E
+:10CE0000FACC219A850D03DF0EF77D05730BA26E18
+:10CE1000D3CFBCFA0CC4D516358D622D2795C91B0E
+:10CE20003A3A587B64C9D2C8AEF11EF36D10FB6D5F
+:10CE3000E6E4936C63DE604F69BD896AEC752A781D
+:10CE40007BC8CD7E9E760618A3F335F48C19FD655C
+:10CE5000BE999828BEE3AA9277379797EEB400C59B
+:10CE6000A9AFCB91DA61A4D89CAFECB28CE6FE718D
+:10CE7000F7CB6C79B96C3C05402CCDBDD7EE1705CE
+:10CE8000759F6F3C6EEC27CE9A4BAEBDAD4997A215
+:10CE90007A844E397A6D1D89577157FAA83E044B32
+:10CEA0005AE919719B8E0F7198C28101BDA67967ED
+:10CEB0006EB10C6645A27C726A6978A98A4108261F
+:10CEC0008457BD0C703A67653CB3D9C88FB8B13789
+:10CED0009B8ACAD2D17A2D32A7C693942D8A17BDC8
+:10CEE00015277531649BE4443FBDACD31B8CB0F572
+:10CEF000ECA08112EEFCCD8981F5E8029867A73895
+:10CF0000F251383ABD71B7C0DA845BA1C58AEF8CA3
+:10CF10009604E032E352587C00C86BD25A457B7AC3
+:10CF2000A95DEB5E6685423B62F7189C64CD34A830
+:10CF30000421EBCEE8CBD683781B939A1926D3290C
+:10CF400029139412B7B1C38E97BBCF995E53BD1608
+:10CF5000A7D7E50E88F5D5DA5AD79375AFE36CDE1F
+:10CF60000A196748D3831768135078FCEE230FE043
+:10CF7000F33FD907C8F7F216FBF3762C4243952905
+:10CF8000AB5E8CF9D219223313E210E03B8A965340
+:10CF900079D9C980470A8491032443F90F5F851E1C
+:10CFA000D998D10F4C7E6A9585E450F57221A6EB95
+:10CFB0008A5CC038D90602F6870FADC0F91F480C4D
+:10CFC00099AB971382A8DDD982C980F2A48B356F03
+:10CFD000AA7E2386AE4D9D029C271D421119E55461
+:10CFE0009AC320EDFDD6A95B9D1BAEC01E0678FB43
+:10CFF000CA410765654039D75FE571F535232436A9
+:10D000000D98833258A2824103A97ADA2A3821F78F
+:10D010004AF61EB0C5271DD4B6DA93A2830779B1AC
+:10D0200088980820E7C4F8E5B5C1F9FC6DDEFBA2DD
+:10D0300028640396BDEC95B339D52040B420DF8435
+:10D04000E2590CE93C6987E4EA56AC3EF4E54DEE62
+:10D050004801961E140BE96E72E8427D03036E1DB3
+:10D06000FF5FD1B37734ACF2EF7BEBCA8432D04BA5
+:10D070001C87ADC18F6E3694889902F6F0684F2FE9
+:10D08000649A46B8F428D9BD0261DF113D44296D88
+:10D09000997BACCE951E95C5D630CBE9876ED63937
+:10D0A000E2C644F2EAAF7F1789E7A390104F42E04F
+:10D0B000FD5494132600EB848C95E02019BB9D8AC7
+:10D0C000C24FBAE8E5C792D2494FCFAD557B27B1E1
+:10D0D000DF15EBBDEA8090313CD3F331193CF961A7
+:10D0E000B981044AA47627E3018BE13BD140536325
+:10D0F0003FEA991EC1D56EBCE594A55033663F301A
+:10D100004C622DD603F7F76C2913F6DA119AE8EA88
+:10D11000008E9C6B8C0D42EDBA7A035AD7EEF15714
+:10D12000B8B08DF4FD1044049081245BAEA9D1DB2E
+:10D13000CD88AF3E710DDAD2FCEF253E94E7C5B83D
+:10D140003C11F7E1DA8BC522FBAE324C5BA2A47630
+:10D150005723F638857ADBFE0F3E1D52BDB7FB50D4
+:10D16000AD33F41959447A009F83F48323C13A44C0
+:10D170006A741234379A696F63EA06CBE04A22D6A2
+:10D1800095230C94E47EF41882CD0556071A821676
+:10D190005F094FD6A5B0537A8918BF420B9586B95F
+:10D1A000B8E3BE6B403929E92CE208B9116A92292B
+:10D1B00062574AE1935959B3868581058D61D3073A
+:10D1C000F697939E7127E9DADBC34DD9AD85627A74
+:10D1D000D31DD555A7CEF650B493D058988B03EFF6
+:10D1E0003F53476C6D54507F207791F9A886043FD8
+:10D1F0004A7D30F8FBF5C1D43DC2071D0466555C7D
+:10D200008CCD35EA941D4EA7984D29115098A481D4
+:10D2100014AB54EF0F1B33D82D5C6CEC9FD8DF544C
+:10D22000E2B29FAB425115BD07DCB5E4D2527B9010
+:10D230009C0905D0E8BF6C0B9DDF8EEE9C6E96FDC1
+:10D240001889AA123863670B4AE5861A711B1C45B8
+:10D25000AA77340CAFAD82D24041E875FF4AA628C8
+:10D260005DB9B476A6926EB5098B04BB19041FB4E0
+:10D2700089A8F90C4E1615A0DAE5F7CC83B3947D96
+:10D28000AB5AC48B5AD0873A297BD9D3AFBFE80FAA
+:10D29000FBF56387EEAB0499A52F6FD424B20D8103
+:10D2A000C8D9B7BC45FB883BAC7433CF4502DFA679
+:10D2B000E4CCBDDCB1A231B9E4FD13CF66AFB5CD8E
+:10D2C0009D819A236493085DE2F1AFE55A062D052E
+:10D2D00031B5D99C1FF456C1F6C9D0148B74ABAAD2
+:10D2E000DC2CE381FA89CED78F65E0A12728584F3F
+:10D2F0007E13AA74D8BB665F44050586E5F43859E9
+:10D30000659D0E0F9C030CF57E37467DBD15B93F1C
+:10D31000EB21FCE279B85DAC0D271CB96EBBDFA038
+:10D32000725096730D22CEA116A5B641D155D7A144
+:10D3300024ADBFD2007CD0C7645D3EED0EA00F834C
+:10D340007A77AB09A18D46A65E068A8E86388A2436
+:10D35000BB819B70E0DE86D39F22FA7091D5BFFE21
+:10D3600070705ABF5443C7D77C0FA7056ADEAEFB67
+:10D370008F2DAA6210D44A607938328D11BAF373B6
+:10D38000A0639D547A18BD0A5DA14A3E27A7F9CE35
+:10D39000B20EB12C4A1DE8CF07DCDACF3687FA523D
+:10D3A000B2BE15081ABC87E2E972298FE696964844
+:10D3B000CB74D96BCC81AE079E6AF8E9D900985F2F
+:10D3C000CB2D6BA8E63A3AE34FC3F0E9ADA3CDAE5F
+:10D3D000EE6EA8B7D6C52F0F1943372C3AC12AF9DC
+:10D3E000D52A015D1F49CCD2A9D79D8D669F1854BF
+:10D3F000DF9A919B15F9C0E61CDC1DA097EC9D9966
+:10D4000054F205BCA2B19A21E4E15F7616AE7170C8
+:10D41000AD22D39FCD74005DA5BADEE9EB761BFC8F
+:10D42000DC625C7A1B1649955A0CE441274B0E408E
+:10D430002EAF9FA8915324B944ECC5CE7436E36F48
+:10D44000BEAC9735148E3148E7185A79E260BEC6F3
+:10D4500092D6DA4ED388BF61BFEC5C0994F7FDD752
+:10D46000D838BC17F4D4A415950CC2D48BD42D0D88
+:10D47000D39ABA9BA91043B1E3C7761E029E83D903
+:10D48000BD94452C6BB7D5C5EB423CB55C812F6A8A
+:10D490004E0BC1F1976474E1F76B7381175E213411
+:10D4A000A789FF505A0F42657B74E0C2326D168324
+:10D4B00018A3B4850BCABC7F5288E68AAFCF505EF2
+:10D4C0008B180099AFD7B024C8D124321AA49C0B72
+:10D4D00078138321E246B249BBD3FA67AE455D05B6
+:10D4E00076341E966064052FC427E6279C9E323A48
+:10D4F0008A669561EDDDBB86429B92910A0105D655
+:10D5000075999BCE3E9DA0313683FA0960EFEED629
+:10D510001E3C76486D06802EF67B9827CFF8922C1D
+:10D52000D3D710D367EAD859430CFDA352259241B3
+:10D530000E419793918589879A123E079FC208B63C
+:10D54000583BEEA9CBA8187AC8213C4B7086F15500
+:10D55000CD7848922C8CE59599DDA1558AEEC221B3
+:10D560009EB0C50112E3492973351F31A4B469DCAB
+:10D5700022D6A24CF74D23EF50D77F246CD053EB2B
+:10D58000CEE00614479D154F27716A8316C3D3C595
+:10D5900017EB120411EE2811C17B57F4FA8819AE6B
+:10D5A0001B99D4A8D928661000D0D3DE8FC0BC73D5
+:10D5B0009E81166FB06E7372C4BACCC0C57062879C
+:10D5C000F7AFBF2C96A5C2B49D2D543FF178DF3D37
+:10D5D000766169DF56CB19FD085D8B068E62DBC074
+:10D5E000FFE5781F64C27EF8FE2E6B58B4CD1F8C09
+:10D5F000FF0A50DE4BF3C5402C780B740BE5FE425E
+:10D600005B08FF11C34BE34D32E830E00B399B233D
+:10D61000A91ED03AA933FA5A7646492CED53B7CA17
+:10D6200010BF129115FA44CAFB54486D90D383D6AB
+:10D6300056110C96512C5A247B9F49385DDFAAC99C
+:10D64000597EF488A50BEB5D02F36E39AACDAD725D
+:10D650008DF98583D3C130E83B3141C150D69876EE
+:10D660006FDFFA73F0023C9E9BBF739A378493116D
+:10D67000A42B1F10553EBD1C5B0E671942FEB2CE97
+:10D680006C0F9FCE98C0CC17ED65D91EA16876C9E6
+:10D69000992DFE750FF0540323115ED6EC3D8C01DD
+:10D6A0003489493663F48BD86C8120D3DF8CBF6614
+:10D6B000BA350B8103BDB840FB060C95D6E25B1969
+:10D6C0006BCC863CF72AE4E53B76403938875BAE85
+:10D6D000978E0D4BA41C213B8A90EE7F71498ABE28
+:10D6E000741FCD6FE257E0EB6CCD714CD5CBB870A9
+:10D6F0009599EBA7504235DE8E0A4024E1FABD2809
+:10D70000C15D3CAB609D9722EA241DC36D6F79E536
+:10D710009C13FDDF2FD53DB36AE7A2088F011049A6
+:10D7200081BC42CB6CFF1D3225B891D0AD075BDECA
+:10D73000EE8401F07F8E8621ACD14493D91EAD4199
+:10D7400063D9C3A4A86E20C5C74A2CEF53380D7205
+:10D750004332D68619BA80CAA5F166687B6B0395F9
+:10D76000A0ACD1EB73A503B1F0565597E8804C21DE
+:10D770003AF36D363756CBED1470D5DA1106A78221
+:10D78000CB11D692390436BEACF150F790BE22BD13
+:10D79000A88A5FCFF0152EF8E8F9B63E5B334C1936
+:10D7A000CBC3CDCC2F9B79D1AD423324E65DC47D74
+:10D7B000E216A5F84F787F3D76004DB5AF6288E759
+:10D7C000881AC40C462F711E502457694D079325A3
+:10D7D000B55D67910020584B83A917C32F9DF1E1D8
+:10D7E0007544359F456154C6A633795163D1F2AA79
+:10D7F00007E151B418A258616163BD61516285B5FA
+:10D80000F88786C50055685B3DA78976C051960F9D
+:10D81000B1FB68DBF36C6866F893B0F86AFBF165FE
+:10D82000B73E35FD3D314A3E0F3C1F0A702B1E3F6F
+:10D83000FB9FBEF11B6E9A7EE2050EB8E7C78D30E6
+:10D84000751DB8C602EFB425B09D7D428DE8FCED94
+:10D850009D7A2B9DB38BA99C71CDD1F18823B7C53F
+:10D86000C3593E5360FDA489B69D3CCC7F8C46AE27
+:10D870003E35DF33C5E002E3CEEEEF2C4873966809
+:10D88000B9B088F00B7C8F11B6B4D9576A00275114
+:10D89000A494ECC3AD7DE89882DDBD06F7F3345067
+:10D8A00000F91CE68217B335FD26345DEA277AECD1
+:10D8B000E473184629DF6586417D282235E6661720
+:10D8C000ED38E59D2018D933BAE2C4CDA5FFCAD9F9
+:10D8D0008464DFBFAD67BEC0E7415AAECC976BB181
+:10D8E000035A58E7BEE51FF229201817D1B15B573C
+:10D8F000D45269D3C24250DAB84672EEF5B2039000
+:10D9000067D1C7ACBA85F417EFF93986B5CA986301
+:10D91000069AD92604000100000000000000000063
+:10D9200000000000000000001020000030D90100BD
+:10D930004A24615FC3B4AD7D0E438BDBD97917BD3B
+:10D940001600006341EB312FDD064509E91B7E51CE
+:10D95000BE539C6E893BE68B09864F7F8C62A9285B
+:10D96000A3DC2A9C3868DC68F8C26094D5B662D91A
+:10D9700007786208CF66644096085FB56678791FBD
+:10D98000F4D1A44E3699E903D64C503CE4F65360EA
+:10D990004F283845D0ACC587E4E9D6C8A258288DB1
+:10D9A000814D75034F99D6966F38B017E324B4FDB7
+:10D9B000D2170434D121C4179F4E3E45AA0A61FBF9
+:10D9C000A0279AB6F8089EE517243E70721BAAB7E6
+:10D9D000145CB8A4E7DAA496FB937440638C4639D0
+:10D9E0009AC243146CE111153125B1F4A4AD332D65
+:10D9F00022F735EF9438E717E5C2F5ACB1B4DEA5F0
+:10DA0000D120C0B33FD8A403CEA74A238592177173
+:10DA1000E693DED5A2A6B802CFD7CED281E46D3F81
+:10DA2000E02FE203FE15645F41678AE494B76BDE82
+:10DA3000C60F6A5FC3CC0F7987AD41B2D8F394C9E2
+:10DA40001FFDFEA95006E8A19005444F599469AF07
+:10DA50002B7AD1A67AE60B44FACB087CB78EF4BBBE
+:10DA600040850E1799D99782A597E5527F0AC51F61
+:10DA700030111608AA6041C596BD574EC8CACF9945
+:10DA8000E0413D967A5D4F32EE6869ED97E94726B1
+:10DA90003D3DF2637F9EB44BBF55080C5AC609EF5B
+:10DAA00060890A83C4F75FE0AD64929774BFB8FEE3
+:10DAB000FB0B90CF38614680F615F90E1758B81950
+:10DAC000D8111ABEDC0A75CDB10DFA85DDB89C0BF4
+:10DAD000E5C5E83183DF6B8518727A90703070DAB3
+:10DAE0003A41BD550A314F2CE249739C1FF4483727
+:10DAF000185D479DEE080DF5068652868F5392BB42
+:10DB000025EEDF5DE00DA41E3AF18882A44ED5AE6D
+:10DB100000EAF72A43E3790015F955DD89D1093088
+:10DB2000F3DFCBE71DAF5C37DC96A1E97D0B49DB6A
+:10DB3000BA79550376A43BD7AF95A700274DC9AB5B
+:10DB4000D3AE09EC7A2674AC0C7B66C5EC3781F059
+:10DB5000FCDCC5420F7AC14FAF292D204DC7F5FA25
+:10DB6000C373B93F08C73EF560572D1540C1119DDD
+:10DB7000C54186612E3AF644B338FEA9581CD938FF
+:10DB800009659A6F200DDAD8755E26712DA5D9DA50
+:10DB900071BFE2BE1415D70677EF957E1E899224D9
+:10DBA000841AC1022F818290917EC3C6DDB6BAE786
+:10DBB000ADBF9F6A08FD760489D7C226ACB15CEF81
+:10DBC0007943C93B60F77777C11D3ECB0599086D56
+:10DBD0009768F4450CBED180C88091C7C32D5447C7
+:10DBE000905154C05F88B17B858F7463A99DC0A696
+:10DBF000AC1F9AB3A354A315BF4441A64DBA1163F9
+:10DC00004B1D3CE5D4C2F7365AF88BB3EF7743D7B8
+:10DC1000FA97787E65E42D8F05D1144ADC9DD4A651
+:10DC20008CACBE92A0DC3C66B9ECA02CABC5AA6F54
+:10DC30003B68C75043DCE7067DCDF01D1BD9403360
+:10DC4000463732FAFB9243653A192C08560BD291AB
+:10DC5000EFD26AC8CE7C944918D1C288A8ECD3B45C
+:10DC600073B34300BEF288A34FA983DF7DB66C5A1D
+:10DC7000ADE6291FAD983A9652A18CCCAAFF8EAE84
+:10DC8000BAF90F7F61CDE71234D3D474DD07858FE5
+:10DC9000D5C64D38501D2E0F7B1FDD9F5158517337
+:10DCA000C1789156531CD79ECC879E82A1613A9829
+:10DCB0007A2E42AE8501C0796ABEC926779D58C5C5
+:10DCC000E54A3E056F540C7476FE5CD2E05DC08C74
+:10DCD000DEB2DED773F92535F4EF9122ED7161578D
+:10DCE000125FC3D50D3729A98A76B60F6E4F989863
+:10DCF00014A83290A26F9B494056ABF769A4736A8F
+:10DD00004ADD6A7E39064CAAE94A7AEE8DFC02BBEE
+:10DD1000A42E2E5A760592454684C92EC7259523F2
+:10DD20005F7344AE68FF3DF9468B7269295885DA06
+:10DD3000A7080CDCDB86881D7BFA914DAFD6EC3F43
+:10DD4000E1EB34624F97D4F3659B2EB92EB13A9A2A
+:10DD50001A6E80DDBC06FA58E9C5BBA1FA8C47F7FC
+:10DD6000920604A8E50C63121CD7D642AF85B4C551
+:10DD700093E868C185194289E44ECF56564125AED5
+:10DD8000FB72FA79F11365E19A961AAE479DE0E0CD
+:10DD9000F7D5867641C66EBB5B5AEA1B12C58E72FA
+:10DDA0000EF6E806C4F99B8CB12110760ED7E489F3
+:10DDB00027845FCEDBAB2BF05B4D1E7559272DC43E
+:10DDC00021904034277E707A7D3B87D55C73B97D86
+:10DDD000D1E8ACC51EC038FDD550444B0D125ACE0B
+:10DDE00050A9983179FF2CA46318DD5FF5F6F4672C
+:10DDF000F41B4BD04A209D45AE5022E4CD5AF46826
+:10DE00002958A23C1EB264B329B4E107DF083711D8
+:10DE1000438011683E69686C1E077D03A126952426
+:10DE2000BA5DD8B3AAC0AD5451F517E359C6BEB810
+:10DE3000074EF7E3426DB2F4F9AB954428490DFF64
+:10DE4000375DEF8E4ED518B7E442D40E5476DF9886
+:10DE5000DE4CB150C0F21E71D5F4EB1360768B1717
+:10DE60007F0E619DB584931B962090DA9E5A69B30C
+:10DE7000F58F044952B64FD8C656D40F45BFEC674C
+:10DE8000B1BFD2A36DC4C2A1FFF77A9AAD97EC419E
+:10DE90004854EC4F129A231A7FCEDFC113717D0BC9
+:10DEA0000B4C6B75EB26FEC5CD0447D9140B24F83B
+:10DEB000685DF43C1AE529565FD0881E07C2A27E31
+:10DEC000D9A8A06819F8DE99BDFE0D3AB2E5D76C65
+:10DED000CDA757C51856C1985ED62FB782D71267FF
+:10DEE000F3896D47BE2714BD88F2857EF157BFA226
+:10DEF000FCA4B6A9234985C73F8694A077FB753754
+:10DF00004C9A11BE05A65094269C178CD9FD7C19FD
+:10DF100013495DE390E6FC5DAD8D55A1E9043757EB
+:10DF200061B18516B2C786A7DD31E6AD7D8951495D
+:10DF30001C701F02C594D0655F8B8E4AB2C4EE82FE
+:10DF400004483713DD8FE0C3FF142E4810B1904B07
+:10DF5000991BEC67F180FFC38A181453D3808B0898
+:10DF6000B2D8CF57B95087BAEA80D8396224BFC82F
+:10DF7000C7405DD08B561E92EBCF30060DEF3B1B9A
+:10DF8000B65DD59063D4832C8D62CE7F554F0AE762
+:10DF9000EA863784919AD2D1F7D9404808B3D70797
+:10DFA00014B14E5CBFC997B1958D6F96F4B1F77AF5
+:10DFB000BDBE977B41D5703C84AF2162C6FA101E6E
+:10DFC000C4E40F444F6F1B8BB53F520CD4449FAA3F
+:10DFD0002FE61843B2C0329042261A343ABD39C5F2
+:10DFE000ECAAB89F7885D8D778BC3200374D092E77
+:10DFF000F77B13ADB6DB6CB69C8722C8BD8F372B81
+:10E00000C35BB95ED721B27B70519300DA921A39A3
+:10E010005CD41937717F4D7BF3C5DD8511E9B941BA
+:10E0200001E11D80B18B569AB5E46BE972C11544CC
+:10E030005762B73574C021DA8B39A34EDB26B4762C
+:10E0400014A5672393F978AE26ED1BD82F7D2B35C9
+:10E05000177E8041D316F1A29F96E8F3EBDC1622DF
+:10E060001F3BF2FBBFDED1E5D324F518D7FC27A078
+:10E0700085FC3E7B30C6E548602C57B3B65B5051FB
+:10E08000D3F5219D5ABA2BF50F8C4EA3D94EC3F868
+:10E090005BFF17DF99538758A26EA048615E310F6E
+:10E0A000FC4CC8B11C63CDB6CBE76522B0C7EACF44
+:10E0B0002DEDEBAA324C3300DD83DC3B5014A85924
+:10E0C000F8785200FB1C97F20CD054ABC2E1AB06BF
+:10E0D000A811938DFCCCEDC9365AA7714B64273536
+:10E0E000A48D1296D3EDA6E2531D368BF8BAE2B397
+:10E0F000ADC8D59CBB526944C87CD7AC6AA6B82FC2
+:10E10000565EBBE118629BA4650EFD3EB059513AC4
+:10E110009F152D22D7791F443612BBAE067B2A8964
+:10E1200023B5AFD8530B960C9395DA114CCC3644EB
+:10E13000B15B44BE39BF135A530CC865AAF0010045
+:10E14000A3E9ACC852FBA8393530F494F626820A0C
+:10E1500086D63F53645A19D871E7E6DF509FD8330B
+:10E16000CA4EEAB1AACF8358AB2B61CD0EB250C0D4
+:10E1700099E37E37F87C959AE525D7E89E841D378C
+:10E18000B858E14E8B61A2C3322DFA5FDBEDA38F4D
+:10E1900054D48DEC3652013674F6EF007742E771B5
+:10E1A000353AE113BD68B11E8E23ED47145176A3B5
+:10E1B0006FE78024ABF6A9F01F1F33576C9E36BD66
+:10E1C000A6BE233F79718F3AFF169BBD2886654F07
+:10E1D000072F9F7887022F64024C4A7EAE819F52A0
+:10E1E0006D79475FE21C8CF72A2B0F3CF9BD5D1857
+:10E1F000224D6A766246694700F8358A955DEB6B79
+:10E20000267E106F09896D520C77C874666B0140C9
+:10E21000C6A3688CCFCFA82AE1AB0F9140B4669219
+:10E220003D45AB55EC25D77365DCC0906F83D4F3C7
+:10E23000983460980DCC15F469C5F6E57CD33C4E56
+:10E2400043686312A46F3C3FAF78DDFC1DDCE6C77A
+:10E2500047D3A586322CD57DAD44B3DD4D228ABA95
+:10E26000C748D6127AB90C18B165CEAE9FACB56965
+:10E2700012EF4AE7B0C705A0D6EBED48202B425974
+:10E28000FDB453575851968FD0DEF0D508C88E781C
+:10E29000C5B6051BCDB30FCA070565E7E4AE62B28C
+:10E2A000DB47558C51D274F4DC6B31871EBB81F394
+:10E2B0003D2BB373AB95AAEAB44E9B5790AA962C0C
+:10E2C00077B1668D5E203CC87AB768F9FCD22737F3
+:10E2D0006763BC6364D2FF88B18777A07F5F968055
+:10E2E0007E512837C062E3ECE44A8962C00E79A20D
+:10E2F00073D268A102EA08CE604035C62AEFCCBED0
+:10E30000AB0FBD3CA581090B63703EDCEDFFCC3C3F
+:10E31000F49156B57731E72DF8E9380BE1D0A72E07
+:10E32000128D754ACCE51E3C3545EBF19DA4C485A4
+:10E330008FA8337213DEAFC5C24A77F5EDE0758B57
+:10E34000B321EB926AC4BB879A8B392AB84F3383C7
+:10E350005B8B0EA734AB5923DE2B093E193E208E72
+:10E360002454D50A6C0F1B2540A1FD2CEEA5B5A9A0
+:10E370004D6FD95E9FFFDC2F1465D6DFE1F389BBBB
+:10E3800048029D150BBB28EE89E7963E6C84D76941
+:10E39000283FDC1F09747D92414AD6D00FC0E0842B
+:10E3A00031D1EAC96244C272C29A04A4DFD54A5686
+:10E3B000B37E6BACC8FAC32684697C10B372FC1AB6
+:10E3C00087350EF28EF7BDA74D4244DE6E237F45A2
+:10E3D000A6D08540CF7837C4F651C284C93D40E409
+:10E3E0005DB4656777872E59AC8825AA8D65BD8990
+:10E3F0009879520E1618017D78A1140217BDDBD74B
+:10E4000049BF3B51D3F1C4A416D7F13063DFC3D267
+:10E41000F793AFC1F2550581E0BA9F38212BF8BCC4
+:10E420002D0826FB65EB34285D37FF8D40AAC1E23D
+:10E430005567287E32BDC3C9BD8A26AE3885104ACD
+:10E440002618716AF66058EEB45C5E14B7DAF69975
+:10E4500081443BA5E7CE712B9E5B64DCA11AA74AE1
+:10E460002FD8C2E83277405FC7B647F4FB9B6BFA00
+:10E470001D3B139F495411943286992623CC93DB7C
+:10E48000D30045F203F7787459E6505D982CC7AD78
+:10E49000B46E21F945F5D4901F65B5B4F15B7EA942
+:10E4A000D096215D2BE4E6C460670B1B8ED35C67BE
+:10E4B00028443010783E5653638EC28C5B53EDBDBA
+:10E4C00003EC6D1A0378B010BA0F810B4E03692864
+:10E4D000F9C2AF5899173265E208DFB52D9EAEBA82
+:10E4E000B7829989E05EBC95DD8FBE30C85F6AC394
+:10E4F0007DFE0F906481D16CBBA37C17C5B47AFEFE
+:10E500007AD415F461D2A3DCE01E712025DB97CA12
+:10E5100000211971D15DB61121CA911311FBE57764
+:10E5200034100CB706CA516C09F73CD65DC293DAB9
+:10E5300050235DE688E570FFA4695259A682FF9AD0
+:10E54000DB8BBAB0C1C9805FC653D42D751EED0DEB
+:10E5500010A865F032F56060C9FB1B2FFB47B18343
+:10E56000D2713849166CBE6482B7CA518ACB2E2E3E
+:10E57000BF5BA71DCC96CA179A1175852F72F01133
+:10E58000E31660183C918B04655B485E328A958483
+:10E5900077AE4498E782679DB7C8CD2C9F501B0A81
+:10E5A0006969E10E69944F7FEE61D1C64C5CECA1C4
+:10E5B000F6508A49BD68EF1E2F25463DAC47B73758
+:10E5C000348C903569431F6DD1EC4A4C9BDD7463EC
+:10E5D000BC0719F2C61F403023592B51375E04B9CE
+:10E5E000504D4D0CDC59AB026EBF8C42D3EE2F0F59
+:10E5F000229A81DF95120DC87E6D2C6534B22A48AF
+:10E60000E2D1DC750699B1C94A3941E74E6B83EE18
+:10E61000E742A18764675CCBF27A48B029664AABCF
+:10E62000DFD618420D564CE3573E25F5AA118F61EF
+:10E63000F56B7ECA31FE3021D2E3C70FD113E5C49A
+:10E6400059069EB5B3877A3118220951CF1A5D2A2F
+:10E650005346A741E0AA8BA546BE279FE37543C159
+:10E6600035B1A72B482DE250C19CA56CA4002BFC12
+:10E6700061648D16FBE736054044F87893869AD797
+:10E6800071A462AA643A0DD2CCA7DDC6CAEFF96BB9
+:10E69000501EE90748A0AA135659EBB0E66FA13106
+:10E6A000A44A312E8EC3E6147A52AD30F2163B06E0
+:10E6B00037B21FE10FE2F610A99963F64C342CB182
+:10E6C000442F3A20E3A8548E937591F1531AC51341
+:10E6D0003BBA67B2C7161BF4E008865FF868884B40
+:10E6E00059768C144168A61230E8483DFD20C16A75
+:10E6F0001E2FE8B0F1A7063E2701779C46A7E0A2AF
+:10E70000E9D914011CAC278BF757121430F5260DEC
+:10E7100012336A0012CCAAAF12D13E7EAD7FA5D6CD
+:10E720009E8690615C9BDD70DF40E9800D5BBFA938
+:10E73000A646F34399F4F9C3EA6A4C5BE09350D8D8
+:10E74000A8723720048D600E022E6359451DA73E26
+:10E75000B3F85EF60D063854075BB4D8715E22C478
+:10E760008733AC76E60987C49590F38E06C6F1DB55
+:10E77000A51A90ACCC29ABD6EE622071C5B2BAE531
+:10E7800088948C28FF11D65AFE845E39F1F207F87E
+:10E79000DC92F3F7CF65C7B7A559C8752605AAF46B
+:10E7A000D9EA5D5C0F43677BF7D577BF3A1E48D344
+:10E7B0007B4F2F2C1AECE0DA67677A6B46BBF58546
+:10E7C000BD519F44925814E85B9ABD0580039F5A3F
+:10E7D00076164565478666444DEB4C9A03C052C396
+:10E7E00039D319170485F5E69F2BBF967F15582658
+:10E7F00008D3B8F98E20635F7B3D3C29E1235D158A
+:10E800007A900865B5C57F634A24281C84C0924D60
+:10E810003501FCB888203222F88719D642A07155FC
+:10E820009CF199A67881DA0DF79DBF61FCECF43E6E
+:10E830009540A09792A3D2CCBE16F7C4B23EDDECB1
+:10E84000EDEF1EF3FF35639C003D5A265D37E3BDB7
+:10E85000C6CB8140B7DB0D89952B08887D924BDFB5
+:10E8600011E53EED637AEC8DC4AB848D6B0F67CF01
+:10E87000B6D2204682E971EBE903D628C16E7B024D
+:10E880003C4F8824438ACDDD044BD9BA1CFD8BE371
+:10E89000AFC2E8913C4300A531B2EFBF8FDB5E8091
+:10E8A0009D2651796BD451BC1D4B78D5B8D48412B8
+:10E8B000400C4671B283993D2DBD14CBF386FAD43A
+:10E8C000146832C185ABAA9C7E509612C80D706C3C
+:10E8D00013668589F666FA25F18B17F8B3A63362BD
+:10E8E000EEC5EF110BB98ECE9777394FEBBAC979D8
+:10E8F00080C4E7E847D43222CA2D12003FB7AE7E6B
+:10E90000588F4F80299FB00E08922ED615E590792A
+:10E91000AF0FC8C23B7A3EE7A36F28EDDC5114BAB3
+:10E92000CBA7B7996F1756739A52E8C5AC5AFBA597
+:10E930007284ECFCB6D82E8470A7FA2331D34F6DC5
+:10E9400082A3C3094740D3C85D04F4529970039E63
+:10E95000DBCBC972C01ACD437B406038055AD26602
+:10E96000C09232714F8643A3A60C7474752C7B370A
+:10E9700010D653815E94AE8A3426F55F04B3015AF3
+:10E9800094503905148CBA1EEB1E28A498ACF23DA5
+:10E99000854F8F33193FF39F707FDDB9F60AD05052
+:10E9A000035BDE83C6953B6DA80009B1DDD34960EA
+:10E9B000C78F4B2F3345FC0FB82A13BD4389B95B72
+:10E9C0000AD0857662218760F0A8653860D6B609DE
+:10E9D0002E8F827A8DDF5224F87169DA50C8CE36D4
+:10E9E000E99D90BC2B846C5CE5EA0960E300A5D549
+:10E9F000A1F57CBF05827A133A6D59237FEAC17273
+:10EA0000E0F1C45CB5EBC55EC2403754D64DC9BC1D
+:10EA1000B065C47C9B8E565FFE901D7D42E292E203
+:10EA200054C0A4E0AF23CC8F1D451BDFDB0C86C296
+:10EA300007CDB17C2F674A4FD8CBBCC01374DAE046
+:10EA400004C8E43E48673133464CB903B400323958
+:10EA500015082E4ED95E36E087012930C5BF99D8FA
+:10EA60003733EE9AB34CFC244F0D65E1F6E05605C2
+:10EA7000ECFA71AC07F63266053D73681238DD3882
+:10EA80007021CBCFA1B931A170F43B4483284A2F28
+:10EA9000192EFCBFD2449708A1BE9D7A675262AD81
+:10EAA000CB8B1DF5E051B83DD1F7453AC977BEC3D0
+:10EAB0005B3BEC3A2E6CD3F2AAB239F1EFAB2D27C7
+:10EAC00026B38312A74136A2D2962C34012C7BE1C7
+:10EAD0004352F2A47DB6E255B19A6574EE15E1DEBB
+:10EAE000C661CADD9F9FEA78380109F07F960F9DC5
+:10EAF00043A42EB13A87612512656231762D617F7C
+:10EB0000ECCC2DC5100EFFFA4AD004AD8BB7E37FD5
+:10EB100069C2F7AF3D6625BD54622B11DD645C8B85
+:10EB2000586EB919B2EAD5782D76712F28FA8F016F
+:10EB3000D6083ACF5F9B3A5A2B174888F98403C509
+:10EB40006239B41AC24822F67B7AECA67DCE0779E8
+:10EB50004B479C2CB1AC3C553ACC6ED81333FAFEE3
+:10EB6000CB676FBAECC710ED9E9D7672151117CC6E
+:10EB700024E5864223C23C65236C9EC7D17E457F37
+:10EB800068F2D13B1116E12740A40BA8D52DCC2F5C
+:10EB9000A37E9C1B7A8CA49CC7BC474F55080630AB
+:10EBA00009ACCA3EA579F61FFE011C0B08446ACACF
+:10EBB000A99E85B752571671EA36E7BE04F843DAC4
+:10EBC000BBE69455467CD70EBDDBB7CA8147DCDD7A
+:10EBD00043F7AD41DDF072716B2AC258108AF19291
+:10EBE000D17EBB7DCA27F62F106E3F3712E4A942B3
+:10EBF0004B2A452A4039967BBBFFF2EB8BB15DED8A
+:10EC0000310B196202A75EA40EB74DF361BE9E3DA3
+:10EC100064E4A77A095EC88097995B619A4350685B
+:10EC200031B0DD7FB2967F4FA56A166D5E33F74136
+:10EC30000B8CEE4341BD50F8EA4F8936B508612987
+:10EC4000CDE698CAAD876951FB75746A907B45170C
+:10EC50004DC12DA78D6023691215D1A55A1155FEFE
+:10EC6000284D5F9E14859661D601BF408ABEE17231
+:10EC7000E43BFFFF20978FF89CECF5B92AAFB31F58
+:10EC8000DB3B3A5AE1ECBD98141035156DB9D49BB5
+:10EC9000407475D2A28F73499ACF17180B1830FCA5
+:10ECA0003B8BC470F6B20EF116323FD826F0EC98CA
+:10ECB0006EEEFB1F4D7FF322A96265B40B495AE744
+:10ECC000BB753997F853A093E5868846110C746696
+:10ECD00005689EC4E4DC37D6F038218CA2D1C4E1AB
+:10ECE00075397B6C97DAA1A5070C6312ED7FA4AA96
+:10ECF000C6990284E1846D6CC84D273E4BEFB73C4A
+:10ED00000C2216CA83CC38AC2A6148E498D3A55F9C
+:10ED100006B58A4863FF599BD4BF27A53D1354B756
+:10ED20000539EFE244869AE106AC3D110CE48A4FC6
+:10ED3000046FDE33336FC2D27E326658FBA4F947CC
+:10ED4000BFA7229133C4FC138EB4CBD9E33215F79D
+:10ED50009B42EF50F291307C9E1694A349ED1D60CA
+:10ED6000659EC56F2A6FCBAF90BB5EB079C183370C
+:10ED70009702E35743C069061E1BDA3A8B441C6DA9
+:10ED8000B0A7A2EFD55396B94EE5F824CAF61ABD3E
+:10ED90009D06A9D1DAF7D3B4931E0A8E90C3FCC89E
+:10EDA000BA826B89C61440E3A0BB817AD12428DCE7
+:10EDB00028CA294C9FF141A05D422CFCF6F2D0CF2D
+:10EDC0002D97A4759551ACF487FBE461EEFBEA78CE
+:10EDD000B5FA8555C9D6708BE062544A27C1CD0D6E
+:10EDE000DD25ACC6A803F01CB20B658436E31DBD5F
+:10EDF000285297E7C3077A52038844B89A22ED4A0B
+:10EE000030E96E032955CDE0020C80D5800FAF2488
+:10EE100072205001F3425714405BA6DBE63C95A0FC
+:10EE2000701573F82B10C603C19064CDD5342CFA3D
+:10EE30009C90D3C7C504998F389B30CE970B572D24
+:10EE40000C128404DC31146D7084D76FD1399F5853
+:10EE5000FAA1345E6E1201FDA16075904BF0FF8542
+:10EE6000CADE0A4B2286505EED0A9B2C16F625FF61
+:10EE7000905CD8296F7BFAEEF71419C5DB5D486307
+:10EE8000F441630F8E39C3AF5139C6E8831DDA5F91
+:10EE90008847FD4D756815401FE205A892B31B9584
+:10EEA00046D63B5FE5E063ED793EDC267C019C12B3
+:10EEB000D23D73B3E86DE4955BC99B9051E9207234
+:10EEC000521F097CB15A81E5AD08568846651A760D
+:10EED00020196A9D038B87CDFE4BA11808DCA9720F
+:10EEE0008CC89A57A5662C312BD812F3E710699776
+:10EEF0004911FA7E805ADFC5307D31D1CD01180D20
+:10EF000067413BC0247156FAFE038E825BD8362CD3
+:10EF10002C50CF16E95C43E233D785EEC7A231957A
+:10EF20000F802337E0DF13D5A1FE96C464470A782B
+:10EF300053B61EC653EACEB7E681128A7D85C398C2
+:10EF4000EEA09E7A183E517F527DFDD9CF8CF21CE7
+:10EF500079E834A0B89C7A3796A378E29F61988EBE
+:10EF600039FA6AE90F3F19EDCF80176FDC3110F0E5
+:10EF7000776E1D05F73AAAE390205D5BAC8F4D7D5F
+:10EF800015F0174C5ACE691D2E6A2BD84EB5FE547B
+:10EF900042C08C7A4FF30B45EF5888DC1950060CB1
+:10EFA000F25D816CA22E9942C4A3B68D2B9D467F43
+:10EFB0007BC37E3A02468DD33C64691969AF8917D9
+:10EFC0002C473AAE6E9F24144612175F2D7CC03436
+:10EFD000935FB0D85FDB85146EDB588EB71DD9AE5A
+:10EFE000A700868231559A30AD2BD1B3A8D50066E3
+:10EFF0008305F23B2C5947D7EC85587FE33B9B4078
+:10F00000ED847E961FCDE2CEBF2E909F3176110704
+:10F01000E0ECA7B33DF55FE81509521B1B518C22AC
+:10F0200051176A148AC393FC9B2F1DBAD23AF75525
+:10F0300050BDFA712D0F644A9EB600C5E929BC1473
+:10F04000AAC778225AEF7FE411C6342FDD658853B2
+:10F05000FD352E698282DF42319BDAC25B86172E34
+:10F06000DC36E75EB6AF90B70167040FCCC3DDCCEA
+:10F0700039774E120D438466C152DC59E3689C37E0
+:10F0800068D66B2A8CB7786829321C30EAE1E7CD64
+:10F09000CD05D9C3062B1FC54ED9C1D771E06A2350
+:10F0A00021A486C913BAC7EDE2340BDA05F3953D06
+:10F0B00041D3A592576B603C33A7990A78DBCAC14C
+:10F0C000F198B92B9E752C472650B9D251DCE28CB1
+:10F0D000BEE51C517B65FBEA354FEE20A255CD19EC
+:10F0E000C67766EBB87F4A4A4C31476D8A07BA6AE1
+:10F0F00034503623FCD747B99E307D9BA019AAF324
+:10F100004BBA23E64841432C0E5AB4EBE1217B9FD6
+:10F11000983E23E6ED90EF2939E972167156836C1B
+:10F1200050BD5A60FC570B89692FD97EB4B18292C9
+:10F13000A04F29365FF068A6B488A592535CC0B78B
+:10F14000106453982819A4D3005D3D785792C99A4A
+:10F15000646D638F4AF36B8DA4898C794D95321958
+:10F160000E13F03DD66513C44AE3BE156A67DBAAE9
+:10F17000AB6B4A70769B45640D083CF7A094DF7D2D
+:10F1800093629DA77D120BEBE263404D3C4AA8229F
+:10F19000DC9E8B11B6CF64A609866CFC48BBAC1212
+:10F1A0007D90AFD5E5D8E2DF47AC03E4E21F3F4FE7
+:10F1B00088CA8845795D03076E88D7244D757571B7
+:10F1C00037BD82F79ECD30BFD3DF153189E2415381
+:10F1D000A78A63820688770F1716F13E06F1EB7552
+:10F1E0003B5CBBE07686C93CF643C7C14A8C938F33
+:10F1F00086643CF7A99117677495A789064EDCF6DB
+:10F20000F505696EB0AF72981F6EA64150266D99D4
+:10F21000B62BB653AA4210094E393D8737D600DEC9
+:10F220007079FAC7633D0013BD43372760A5EBF63D
+:10F23000EC2CA94FAB1B6C67CC1563DA4BE02E8B23
+:10F240002182D3C256E880651BBCD5A886378ECBF9
+:10F25000162470CEDF7E27D30B9ED94456FDCD4AAF
+:10F26000A1379A17228FE9DA7A7C851D6F26B8A319
+:10F27000BD3A89ABB0CE80E3532612EF2E55E1E3C1
+:10F28000D02F23802DF663DD12F787E22312A8E842
+:10F290004071AAEB5D004BAC0755057D26124E5917
+:10F2A000125676CE9947CBC04FBF810E7389059E0B
+:10F2B0001327DAB63B248490FD1F544DC8DFAB5DA5
+:10F2C0009E3FF14C3482F08258B3D85819BC10AD2F
+:10F2D000A7A583C2A0441B944ED09FA29C12D0A588
+:10F2E000B9F3DFA51AA2FD32DE16504A90D60A6A9B
+:10F2F000BAC492E7D8A94B22318354252314B37E94
+:10F30000058148BE8CE3B8B36ADDDBB7257722F808
+:10F3100080A109CAF71FC787055F8278385E9822E7
+:10F3200076EB5D1C33B6F996E0B38F7C04EF6CF797
+:10F33000AE842555CBE2D2502C334D4B9FE164393E
+:10F3400099934CEF3129079A68FAACA113B29261F4
+:10F35000DFDEC00B760FF64D77A395A6866C8B5F2C
+:10F36000AB10352A0F1797D769EC3A90D873C42A97
+:10F37000C4C1E708F37D5ECFDC31605C46073D2801
+:10F38000EFA54B40CE202088C9FC625620B24FD456
+:10F3900041CD6C9958B4AF369510B5E7107BE2D3E8
+:10F3A000574210F5825AA953ECAE6568400D22927F
+:10F3B000654C9A0DEE7BE6CF3226F9204C30D1C851
+:10F3C000BB07C7DDAC2038BC883045EC338AE6018A
+:10F3D0006365A6DD2643EECF06E785FFFCF64C26E7
+:10F3E000D15C938FDB694C2012E3B659B84F81C2D0
+:10F3F000B9BD3FB7C84583A3D33A2C9363262321D5
+:10F40000ED7D442266B7732E4E0C26AFE6808F6BDF
+:10F41000C0DB337F2F480CE924D06C096E7D29FCBA
+:10F4200008B8F3417B2518DB19C63C632E6ED04625
+:10F4300069646DDCCA5665951ABA6A7DE75ED6B70F
+:10F440000F0BB19A5DC650D40885A5E52BBF42A12C
+:10F45000C929B7035D96D6A7944DE1B51391EBA6E4
+:10F460009A04F1DCC63E97D4C560C8EB1F4A728788
+:10F47000847EBB4AE75B3BC6B29D3C15EFC163FE91
+:10F4800089C430D02872EFBFCBA7A86A6E38422358
+:10F49000D9410B27A6A232784C7504B2A8579DF823
+:10F4A0005A9FA534486654966AF7B41D278454E1E0
+:10F4B000F05C01C0A728C3D143319006F5414C56FA
+:10F4C000FBDC065EF7D565BD6ABEA8DCAEBAE79E7A
+:10F4D0008E8D01CA2FBFE46C07DA1B5D4C04FD8BD7
+:10F4E000221087E5D198B91180044985B38DD633B0
+:10F4F000F9665EAB7A24F7874BF2C00355DC842DA6
+:10F5000030404AD72E1A65BCC1D9A1E887971B2D78
+:10F510003F0A21875AC2641F8A668CF0B3ADE68821
+:10F52000865FBF4AFF0E7A6FCE58895C7AA7F49443
+:10F5300005FACDB9F861BFF24EAE2FC9E9A2EB8151
+:10F540000F4E050062B083769A1D8DADB326DE1B8B
+:10F5500053B21ED00D675A4E798C9D28C5AB530D02
+:10F560009148D6180A5C873C40A7C9EEAB547CE7AB
+:10F57000118DA7CF5083BBC4958D1A0C898FB7808E
+:10F58000EE398A9F45ABC09C074BA46EC55143F62C
+:10F59000CF24990B741B82EFCE8ED42945C550AD74
+:10F5A000D73830E154AB69011498BB6DFB475A6AF8
+:10F5B00057C423A11551E8EAEFDCF5A297DF14DB6D
+:10F5C0008BF270A75105789CD31D303FD369B75A91
+:10F5D0007A1BBDA3871B38F65AE76AA0AC81F57584
+:10F5E000E373E8F5DFE77F5FF9B9C404F765A88C3A
+:10F5F000970257F00CF47155A5E080612C0B9EA882
+:10F60000DB7254CA4F60B6657A1D1DB59EF0DD648D
+:10F610005AE88B217A0DC13ABD084CBA633FA33139
+:10F62000A376072636C91A974F486F8E666AE2C6D8
+:10F630001419E8B8C0256DD3A3258F874AA2F032EC
+:10F640004CF1080785355D3CA2FA8F4241F8E66B24
+:10F6500015E2CE22CE540EAB129C568636DF922493
+:10F660009FAFCC496E02B913F7893FC58CE845813D
+:10F67000291AAD8F67BC41B72A25E19CA4520C170B
+:10F68000A52B53F638A02E11AFD50574F6358AC0D8
+:10F69000E0212C2B8D3C107E71F291DEF6DA9D1468
+:10F6A00085CAA1DA1C6476937AA9352A9950313536
+:10F6B00028FCD7ADBF1792AE075CDE1C8B00581E2E
+:10F6C000D1EAB1E10084FF99F7C529A22F0215F80C
+:10F6D0008C4DB8EB60F8DF1C8AC1C55C33E9175A62
+:10F6E0004BB5DA418D2172EF790F939B97205A50D9
+:10F6F000EE3CBC7DF9AAA6F5AC4E277F8144EE9383
+:10F70000FB5EBF3EC68E1F07E30E2B60DC6B70CD29
+:10F7100065F429ED6DDF058666CB64265FCE8D8CA2
+:10F720007DE6C2CCC76E42A9EE1C7A59429DCC52EE
+:10F730002A77C906E56A987CD31B88246C608A65A1
+:10F74000400EBF17AC447A45EE9F85FDAB24EF1504
+:10F75000C4DF4F123CB2BCD58B89498E427FAE6D5F
+:10F76000034818F51C96D2949EA11B6C15F6B7970A
+:10F77000B860E893EF9A69C39D2D3A81BEB64508FB
+:10F78000C90DF8C88775C2239D570776CEA1607052
+:10F790001775002584514075A4CEDC998A498BAE3B
+:10F7A000F8B10110B80777203C9DB2DAF7A3A82082
+:10F7B000824DCA25B60A9C7E7E11F02384BE298E16
+:10F7C000E4846D6E44EDF11451C672ED38DEB09CE8
+:10F7D000075B789C74FA06DECF287B3FECD1CB9D8B
+:10F7E0005887AFF0E0C0289D8C48235C7BEAAF4A85
+:10F7F0007A200DA842DD0CD466C6CA59A9962D2BD5
+:10F800009BE4D32ED1DEBE8D5B31DAD24DC7DCEB6B
+:10F8100074DCB52BCE8640B136155EEDF983989D2C
+:10F82000749D700D0C84F032E6DA33EE2D79DBAF87
+:10F83000A9A599B38CED7209CFF68A54D8C6C3CB6B
+:10F8400015012DCC85FB08781B819611EA81235B7D
+:10F850009545D72AFDB1584EC43D492656B382B8C6
+:10F86000EDE0D380228362E2C923DF43BB02674C11
+:10F87000F6024462E425613931D6C1B85362203FB3
+:10F88000F68CB1C6AF61191500B1D3CA54D811F5C1
+:10F89000635991508107C33A5CC20BA2A292595C92
+:10F8A000E1D70C8ED505B4DCB0A30358C7436ED79F
+:10F8B0009E9AA8E35E3B392B3DC0AC1E81E986329F
+:10F8C0000FA3EC801AE0E8A5B65BC08A9FC885A3A9
+:10F8D000BCBD612F78D408019BF49CAB28675D2ADE
+:10F8E00077B4E8EDAEA5B920235E35BC8BDA2202F1
+:10F8F000580745EF1AAF2086E10F35B394635EA138
+:10F900005494D92C82B02BDEF0417DD220FB5241A1
+:10F91000B2FB0439856B4FACC4B46B0AB42FC35926
+:10F9200000BCAEF574A7CBE880B9073ABA8D630185
+:10F93000376C7E01336157A25674702CA756C4EC05
+:10F94000FFFFFFFF110000000000000000000000AA
+:10F9500000000000000000000008000060F9010045
+:10F960000000000000000000000000000000000097
+:10F970000000000000000000000000000000000087
+:10F980000000000000000000000000000000000077
+:10F990000000000000000000000000000000000067
+:10F9A0000000000000000000000000000000000057
+:10F9B0000000000000000000000000000000000047
+:10F9C0000000000000000000000000000000000037
+:10F9D0000000000000000000000000000000000027
+:10F9E0000000000000000000000000000000000017
+:10F9F0000000000000000000000000000000000007
+:10FA000000000000000000000000000000000000F6
+:10FA100000000000000000000000000000000000E6
+:10FA200000000000000000000000000000000000D6
+:10FA300000000000000000000000000000000000C6
+:10FA400000000000000000000000000000000000B6
+:10FA500000000000000000000000000000000000A6
+:10FA60000000000000000000000000000000000096
+:10FA70000000000000000000000000000000000086
+:10FA80000000000000000000000000000000000076
+:10FA90000000000000000000000000000000000066
+:10FAA0000000000000000000000000000000000056
+:10FAB0000000000000000000000000000000000046
+:10FAC0000000000000000000000000000000000036
+:10FAD0000000000000000000000000000000000026
+:10FAE0000000000000000000000000000000000016
+:10FAF0000000000000000000000000000000000006
+:10FB000000000000000000000000000000000000F5
+:10FB100000000000000000000000000000000000E5
+:10FB200000000000000000000000000000000000D5
+:10FB300000000000000000000000000000000000C5
+:10FB400000000000000000000000000000000000B5
+:10FB500000000000000000000000000000000000A5
+:10FB60000000000000000000000000000000000095
+:10FB70000000000000000000000000000000000085
+:10FB80000000000000000000000000000000000075
+:10FB90000000000000000000000000000000000065
+:10FBA0000000000000000000000000000000000055
+:10FBB0000000000000000000000000000000000045
+:10FBC0000000000000000000000000000000000035
+:10FBD0000000000000000000000000000000000025
+:10FBE0000000000000000000000000000000000015
+:10FBF0000000000000000000000000000000000005
+:10FC000000000000000000000000000000000000F4
+:10FC100000000000000000000000000000000000E4
+:10FC200000000000000000000000000000000000D4
+:10FC300000000000000000000000000000000000C4
+:10FC400000000000000000000000000000000000B4
+:10FC500000000000000000000000000000000000A4
+:10FC60000000000000000000000000000000000094
+:10FC70000000000000000000000000000000000084
+:10FC80000000000000000000000000000000000074
+:10FC90000000000000000000000000000000000064
+:10FCA0000000000000000000000000000000000054
+:10FCB0000000000000000000000000000000000044
+:10FCC0000000000000000000000000000000000034
+:10FCD0000000000000000000000000000000000024
+:10FCE0000000000000000000000000000000000014
+:10FCF0000000000000000000000000000000000004
+:10FD000000000000000000000000000000000000F3
+:10FD100000000000000000000000000000000000E3
+:10FD200000000000000000000000000000000000D3
+:10FD300000000000000000000000000000000000C3
+:10FD400000000000000000000000000000000000B3
+:10FD500000000000000000000000000000000000A3
+:10FD60000000000000000000000000000000000093
+:10FD70000000000000000000000000000000000083
+:10FD80000000000000000000000000000000000073
+:10FD90000000000000000000000000000000000063
+:10FDA0000000000000000000000000000000000053
+:10FDB0000000000000000000000000000000000043
+:10FDC0000000000000000000000000000000000033
+:10FDD0000000000000000000000000000000000023
+:10FDE0000000000000000000000000000000000013
+:10FDF0000000000000000000000000000000000003
+:10FE000000000000000000000000000000000000F2
+:10FE100000000000000000000000000000000000E2
+:10FE200000000000000000000000000000000000D2
+:10FE300000000000000000000000000000000000C2
+:10FE400000000000000000000000000000000000B2
+:10FE500000000000000000000000000000000000A2
+:10FE60000000000000000000000000000000000092
+:10FE70000000000000000000000000000000000082
+:10FE80000000000000000000000000000000000072
+:10FE90000000000000000000000000000000000062
+:10FEA0000000000000000000000000000000000052
+:10FEB0000000000000000000000000000000000042
+:10FEC0000000000000000000000000000000000032
+:10FED0000000000000000000000000000000000022
+:10FEE0000000000000000000000000000000000012
+:10FEF0000000000000000000000000000000000002
+:10FF000000000000000000000000000000000000F1
+:10FF100000000000000000000000000000000000E1
+:10FF200000000000000000000000000000000000D1
+:10FF300000000000000000000000000000000000C1
+:10FF400000000000000000000000000000000000B1
+:10FF500000000000000000000000000000000000A1
+:10FF60000000000000000000000000000000000091
+:10FF70000000000000000000000000000000000081
+:10FF80000000000000000000000000000000000071
+:10FF90000000000000000000000000000000000061
+:10FFA0000000000000000000000000000000000051
+:10FFB0000000000000000000000000000000000041
+:10FFC0000000000000000000000000000000000031
+:10FFD0000000000000000000000000000000000021
+:10FFE0000000000000000000000000000000000011
+:10FFF0000000000000000000000000000000000001
+:020000022000DC
+:1000000000000000000000000000000000000000F0
+:1000100000000000000000000000000000000000E0
+:1000200000000000000000000000000000000000D0
+:1000300000000000000000000000000000000000C0
+:1000400000000000000000000000000000000000B0
+:1000500000000000000000000000000000000000A0
+:100060000000000000000000000000000000000090
+:100070000000000000000000000000000000000080
+:100080000000000000000000000000000000000070
+:100090000000000000000000000000000000000060
+:1000A0000000000000000000000000000000000050
+:1000B0000000000000000000000000000000000040
+:1000C0000000000000000000000000000000000030
+:1000D0000000000000000000000000000000000020
+:1000E0000000000000000000000000000000000010
+:1000F0000000000000000000000000000000000000
+:1001000000000000000000000000000000000000EF
+:1001100000000000000000000000000000000000DF
+:1001200000000000000000000000000000000000CF
+:1001300000000000000000000000000000000000BF
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000FFFFFFFF0E000000000000000000000085
+:1001700000000000000000001000000080010200EC
+:10018000000000000000000000000000FFFFFFFF73
+:10019000BCD66B1603000000000000000000000049
+:1001A000000000000000000010000000B00102008C
+:1001B0000703000010D9010040F9010060010200AE
+:1001C000B641A3D3090000000000000000000000B9
+:1001D000000000000000000010000000E00102002C
+:1001E00049324300FF00FF000C0D2000000000001A
+:1001F000B641A3D30A000000000000000000000088
+:1002000000000000000000001000000010020200CA
+:1002100049324300FF00FF000C0D200000000000E9
+:10022000FFFFFFFF100000000000000000000000C2
+:100230000000000000000000000200004002020078
+:1002400000000000000000000000000000000000AE
+:10025000000000000000000000000000000000009E
+:10026000000000000000000000000000000000008E
+:10027000000000000000000000000000000000007E
+:10028000000000000000000000000000000000006E
+:10029000000000000000000000000000000000005E
+:1002A000000000000000000000000000000000004E
+:1002B000000000000000000000000000000000003E
+:1002C000000000000000000000000000000000002E
+:1002D000000000000000000000000000000000001E
+:1002E000000000000000000000000000000000000E
+:1002F00000000000000000000000000000000000FE
+:1003000000000000000000000000000000000000ED
+:1003100000000000000000000000000000000000DD
+:1003200000000000000000000000000000000000CD
+:1003300000000000000000000000000000000000BD
+:1003400000000000000000000000000000000000AD
+:10035000000000000000000000000000000000009D
+:10036000000000000000000000000000000000008D
+:10037000000000000000000000000000000000007D
+:10038000000000000000000000000000000000006D
+:10039000000000000000000000000000000000005D
+:1003A000000000000000000000000000000000004D
+:1003B000000000000000000000000000000000003D
+:1003C000000000000000000000000000000000002D
+:1003D000000000000000000000000000000000001D
+:1003E000000000000000000000000000000000000D
+:1003F00000000000000000000000000000000000FD
+:1004000000000000000000000000000000000000EC
+:1004100000000000000000000000000000000000DC
+:1004200000000000000000000000000000000000CC
+:1004300000000000000000000000000000000000BC
+:100440008A5DE7AB0C000000000000000000000027
+:100450000000000000000000A5030000600402008E
+:100460000001000100020002000100010001000182
+:100470000050000500020020000100010001000101
+:1004800000010001000F00150007000F0008000A1E
+:10049000000300010002000400090001000D00013A
+:1004A000001A001000130001000100020004000502
+:1004B000000200020002000400010001000100012E
+:1004C0000001000100010001000100010001000124
+:1004D0000001000100010001000100010001000114
+:1004E00000010001000100010001000100010010F5
+:1004F00000100001000100010001000100010001E5
+:1005000000010001000100010001000000000000E6
+:1005100000000000000000000000000000000000DB
+:1005200000000000000000000000000000000000CB
+:1005300000000000000000000000000000000000BB
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:10057000000000000000000000000000000000007B
+:10058000000000000000000000000000000000006B
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E000000000000000000000000000000000000B
+:1005F00000000000000000000000000000000000FB
+:1006000000000000000000000000000000000000EA
+:1006100000000000000000000000000100010001D7
+:1006200000010001000100010001000100010001C2
+:1006300000010001000100010001000100010001B2
+:1006400000000000000000000000000000000000AA
+:100650000000000000000000000000000000000199
+:10066000000000000000000000000000000000008A
+:10067000000000000000000000000000000000007A
+:10068000000000000000000000000000000000006A
+:10069000000000000000000000000000000000005A
+:1006A000000000000000000000000000000000004A
+:1006B000000000000000000000000000000000003A
+:1006C000000000000000000000000000000000002A
+:1006D000000000000000000000000000000000001A
+:1006E0000000047F030E050E9F05FF090040004037
+:1006F000000000001E1E011E05E4159E052D37FE9C
+:100700003AFEF0D2F0D28280C4C405030532800FD5
+:100710000A200001010704040AC01964262680800B
+:100720000000801901404032FF00000000004C042E
+:100730006C073C3200000000050A2C012C0100006F
+:100740000000000000001300000C195802190C1ED4
+:1007500000050A2C01FF0001000032001400140003
+:1007600064006400100010007D007D004066581B8E
+:10077000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF89
+:100780000100000000000000000000000000000068
+:1007900000000000080307E9D829000410008000C9
+:1007A000801D80000004FE01000001E00000FFFF4A
+:1007B000FFFFFFFFFF533333333000000000002101
+:1007C000030F000B0100000000000000000000000B
+:1007D0000000000000000000000000000000000019
+:1007E00000000000002300000000000000000020C6
+:1007F000144900120801122C230C06010124000BDD
+:100800000041340000000000000000000000000073
+:10081000D5B47FFD0C0000000000000000000000C7
+:100820000000000000000000740500003008020015
+:1008300001010001000100010001000100010001AF
+:100840000001000100020002000100040006004C4B
+:100850000001000100010001000100010001000190
+:100860000001000100010001000100010001000180
+:100870000001000100010001000100010001000170
+:100880000001000100010001000100010001000160
+:100890000001000100010001000100010001000150
+:1008A000000100080005000200040084002200424C
+:1008B000000A000300010005001700080001000104
+:1008C000000A0002000A00040004000900090002F6
+:1008D000000D00010003000A0001000800040004EC
+:1008E0000003000B00060022002200420006000464
+:1008F0000001000100080001006D0001000100017D
+:1009000000010001000100010001000100010001DF
+:1009100000010001000100010001000100010001CF
+:1009200000010001000100010001000100010001BF
+:1009300000010001000100010001000100010001AF
+:10094000000100010001000100010001000100019F
+:10095000000100010001000100010001000100018F
+:100960000001000000000000000000000000000086
+:100970000000000000000000000000000000000077
+:100980000000000000000000000000000000000067
+:100990000000000000000000000000000000000057
+:1009A0000000000000000000000000000000000047
+:1009B0000000000000000000000000000000000037
+:1009C0000000000000000000000000000000000027
+:1009D0000000000000000000000000000000000017
+:1009E0000000000000000000000000000000000007
+:1009F00000000000000000000000000000000000F7
+:100A000000000001000100010001000100010001DF
+:100A100000000000000000000000000000000000D6
+:100A200000000000000000000000000000000001C5
+:100A300000000000000000000000000000000000B6
+:100A400000000000000000000000000000000000A6
+:100A50000000000000000000000000000000000096
+:100A60000000000000000000000000000000000086
+:100A70000000000000000000000000000000000076
+:100A80000000000000000000000000000000000066
+:100A900000000000000000F40180031B0000FFFFC5
+:100AA000FFFFFFFFFF00FFFF00C080100A000000F3
+:100AB0000014000000200132210C0C3030003905F8
+:100AC000FFFF01FFFFFFFF0606070700FFFF010111
+:100AD00001030014001400000002000128001400AB
+:100AE0001400000202000128001400140000050296
+:100AF000000128001400140000080200012800145E
+:100B0000001400000A020001280014001400000A6A
+:100B10000200012800140014000000020001280057
+:100B20001400140000020200012800140014000048
+:100B3000050200012800140014000008020001282A
+:100B40000014001400000A02000128001400140020
+:100B5000000A020001280808080808080808080810
+:100B60000808080808080808080808080808080805
+:100B70000808080808080808000000000000000035
+:100B80000000000000000000000000000000000065
+:100B90000000000000000000000000000000000055
+:100BA0000000000000000000000000000000000045
+:100BB000000000000000000000000F0F0701070305
+:100BC000030203071E000300A600146405013D3C58
+:100BD0003C3D01043A00010002000009060804023D
+:100BE000070200000000070700000303001B2805A0
+:100BF00001002220000502201C0C00000808A000B3
+:100C0000A00050508003144B00019B02010006021B
+:100C10000F0F000006070303020303000003010196
+:100C20001900050100141400050000000000010374
+:100C30003B011020204000000000FF0000000001E8
+:100C4000000002030D998F590D998F59010A19005F
+:100C500020283C030100000010289077000F1400AA
+:100C60001C1C1819181818181718171817181718FF
+:100C700017181718181818181818181817171717FA
+:100C800017181000302E2D332F282734292A2C2B0B
+:100C90002625232224242424242424242424242414
+:100CA0002424FFFF000000000000000000000000FE
+:100CB0000000000000000000000000000000000034
+:100CC0000000000000000000000000000000000024
+:100CD0000000000000000000000000000000000014
+:100CE0000000000000000100000000000C33330091
+:100CF0000306FF80FF80FF80FF8001000EFF7D1054
+:100D000000050005031F1F000005050007001F1F49
+:100D10000000060101330006010016140005090059
+:100D200000AA09E00EBE0000000000000000000064
+:100D300000000000000000000000000000000000B3
+:100D400000000000000000000000000000000000A3
+:100D50000000000000000000000000000000000093
+:100D60000000000000000000FF0000222044A05A04
+:100D700002013A001E5044C861F8FB0C0F84057F45
+:100D80006EAD8F909C803090F88180B4D808038538
+:100D9000B0F1818080EAB08322208801686710006A
+:100DA00001540000000000000000000000000000EE
+:100DB0006F58BA650C000000000000000000000041
+:100DC000000000000000000024020000D00D02001E
+:100DD0000201000100010001000100010001000109
+:100DE00000010001000100010001000100010001FB
+:100DF00000010001000100010001000100010001EB
+:100E000000010001000100000000000000000000DF
+:100E100000000000000000000000000000000000D2
+:100E200000000000000000000000000000000000C2
+:100E300000000000000000000000000000000000B2
+:100E400000000000000000000000000000000000A2
+:100E50000000000000000000000000000000000092
+:100E60000000000000000000000000000000000082
+:100E70000000000000000000000000000000000072
+:100E80000000000000000000000000000000000062
+:100E90000000000000000000000000000000000052
+:100EA0000000000000000000000000000000000042
+:100EB0000000000000000000000000000000000032
+:100EC0000000000000000000000000000000000022
+:100ED0000000000000000000000000000000000012
+:100EE0000000000000000000000000000000000002
+:100EF00000000000000000000000000000000000F2
+:100F000000000000000000000000000000000000E1
+:100F100000000000000000000000000000000000D1
+:100F200000000000000000000000000000000000C1
+:100F300000000000000000000000000000000000B1
+:100F400000000000000000000000000000000000A1
+:100F50000000000000000000000000000000000091
+:100F60000000000000000000000000000000000081
+:100F70000000000000000000000000000000000071
+:100F80000000000000000000000000000000000061
+:100F90000000000000000000000000000000000051
+:100FA000000000010001000100010001000100013A
+:100FB0000000000000000000000000000000000031
+:100FC0000000000000000000000000000000000120
+:100FD0000000000000FFFFFFFFFFFFFFFF51515126
+:100FE00051CD0D04831010101083FF031800010071
+:100FF000011A0000000000000000000000000000D6
+:10100000E87ED93F0C000000000000000000000056
+:101010000000000000000000A902000020100200F3
+:101020000301002200200008002200200008000325
+:1010300000010001000100010001000100010001A8
+:1010400000000000000000000000000000000000A0
+:101050000000000000000000000000000000000090
+:101060000000000000000000000000000000000080
+:101070000000000000000000000000000000000070
+:101080000000000000000000000000000000000060
+:101090000000000000000000000000000000000050
+:1010A0000000000000000000000000000000000040
+:1010B0000000000000000000000000000000000030
+:1010C0000000000000000000000000000000000020
+:1010D0000000000000000000000000000000000010
+:1010E0000000000000000000000000000000000000
+:1010F00000000000000000000000000000000000F0
+:1011000000000000000000000000000000000000DF
+:1011100000000000000000000000000000000000CF
+:1011200000000000000000000000000000000000BF
+:1011300000000000000000000000000000000000AF
+:10114000000000000000000000000000000000009F
+:10115000000000000000000000000000000000008F
+:10116000000000000000000000000000000000007F
+:10117000000000000000000000000000000000006F
+:10118000000000000000000000000000000000005F
+:10119000000000000000000000000000000000004F
+:1011A000000000000000000000000000000000003F
+:1011B000000000000000000000000000000000002F
+:1011C000000000000000000000000000000000001F
+:1011D000000000000000000000000000000000000F
+:1011E00000000000000000000000000000000000FF
+:1011F00000000001000100010001000100010001E8
+:1012000000000000000000000000000000000000DE
+:1012100000000000000000000000000000000001CD
+:1012200000012101200219061C031F051E041D07D1
+:1012300016081709180B1A0A150E110F12100D13A4
+:101240001E1F2021000102030405060708090A0BDE
+:101250000C0D0E0F101112131415161718191A1B56
+:101260001C1D3133001000100010001080808080A1
+:10127000808080808080808080808080808080806E
+:10128000808080808080808080808080808080805E
+:10129000808080808080808080808080808080804E
+:1012A000808080808080808080808080808000102E
+:1012B00000100010001000000F0022208B818040E1
+:1012C00003090800000155000000000000000000B4
+:1012D000DD9ECD630C000000000000000000000057
+:1012E00000000000000000005E020000F01202009A
+:1012F00006010001000100010001000100010001E0
+:1013000000010001000100010001000100010001D5
+:1013100000010001000100010001000100010001C5
+:1013200000010001000100010001000100010001B5
+:1013300000010001000100010001000100010001A5
+:101340000001000100010001000100010001000195
+:101350000001000100010001000100010001000185
+:101360000001000100010001000100010001000175
+:101370000001000100010001000100010001000165
+:101380000001000100010001000100010001000155
+:101390000001000100010001000100000000000048
+:1013A000000000000000000000000000000000003D
+:1013B000000000000000000000000000000000002D
+:1013C000000000000000000000000000000000001D
+:1013D000000000000000000000000000000000000D
+:1013E00000000000000000000000000000000000FD
+:1013F00000000000000000000000000000000000ED
+:1014000000000000000000000000000000000000DC
+:1014100000000000000000000000000000000000CC
+:1014200000000000000000000000000000000000BC
+:1014300000000000000000000000000000000000AC
+:10144000000000000000000000000000000000009C
+:10145000000000000000000000000000000000008C
+:10146000000000000000000000000000000000007C
+:10147000000000000000000000000000000000006C
+:10148000000000000000000000000000000000005C
+:10149000000000000000000000000000000000004C
+:1014A000000000000000000000000000000000003C
+:1014B000000000000000000000000000000000002C
+:1014C0000000000100010001000100010001000115
+:1014D000000000000000000000000000000000000C
+:1014E00000000000000000000000000000000001FB
+:1014F0000000003C960A00000000000000000C0CF8
+:101500000100001410100307020207030101003359
+:10151000330000000200003C046414B2640F0000B9
+:101520003C046414B2640F000077086414B2640FC2
+:10153000000077086414B2640F0B0B010F0A252515
+:1015400006014E0000004F000100015100000000A4
+:1015500014E9C3C10C0000000000000000000000FE
+:1015600000000000000000008E0200007015020064
+:1015700080010001000100010001000100010001E3
+:101580000001000100010001000100010001000153
+:101590000001000100010001000100010001000143
+:1015A0000001000100010001000100010001000133
+:1015B0000001000100010001000100010001000123
+:1015C0000001000100010001000100010001000113
+:1015D0000001000100010001000100010001000103
+:1015E00000010001000100010001000100010001F3
+:1015F00000010001000100010001000100010001E3
+:1016000000010001000100010001000100010001D2
+:1016100000010001000100010001000100010001C2
+:1016200000010001000100010001000100010001B2
+:1016300000010001000100010001000100010001A2
+:101640000001000100010001000100010001000192
+:101650000001000100010001000100010001000182
+:101660000001000100010001000100010001000172
+:101670000001000100010001000100010000000064
+:10168000000000000000000000000000000000005A
+:10169000000000000000000000000000000000004A
+:1016A000000000000000000000000000000000003A
+:1016B000000000000000000000000000000000002A
+:1016C000000000000000000000000000000000001A
+:1016D000000000000000000000000000000000000A
+:1016E00000000000000000000000000000000000FA
+:1016F00000000000000000000000000000000000EA
+:1017000000000000000000000000000000000000D9
+:1017100000000000000000000000000000000000C9
+:1017200000000000000000000000000000000000B9
+:1017300000000000000000000000000000000000A9
+:101740000000000100010001000100010001000192
+:101750000000000000000000000000000000000089
+:101760000000000000000000000000000000000079
+:101770000000000000000000000000000000000069
+:101780000000000000000000000000000000000059
+:101790000000000000000000000000000000000049
+:1017A0000000000000000000000000000000000039
+:1017B0000000000000000000000000000000000029
+:1017C0000000000000000000000000000000000019
+:1017D0000000000000000000000000000000000009
+:1017E00000000000000000000000000000000000F9
+:1017F00000000000E9D829820000000081000000FC
+:101800002C5249C70B00000000000000000000003F
+:101810000000000000000000180000002018020076
+:101820004004020010080200B00D02000010020087
+:10183000D01202005015020000000000000000005D
+:00000001FF
diff --git a/firmware/synaptics_jdi_3331_c8.fw.ihex b/firmware/synaptics_jdi_3331_c8.fw.ihex
new file mode 100644
index 000000000000..66640f751ed8
--- /dev/null
+++ b/firmware/synaptics_jdi_3331_c8.fw.ihex
@@ -0,0 +1,8624 @@
+:100000008F47E1A400000010000000001000000075
+:100010002C016BD500000000000000000000000073
+:100020000000000000000000280000003000000078
+:1000300060000000B0000000D0080000F0100000D8
+:1000400090F10100C0F10100F0F1010020F2010087
+:1000500060040200901A020000000000000000008E
+:10006000246F52700D00000000000000000000002E
+:1000700000000000000000002200000080000000DE
+:10008000030D0100E2F025004453352052322E3694
+:10009000372E3000000000005333333331000000AE
+:1000A0000000000000000000000000000000000050
+:1000B00077BAEF740F00000000000000000000009D
+:1000C000000000000000000000080000D000000058
+:1000D0000000010000020000240502000100FF01F1
+:1000E00007060C0000010002270203008000000345
+:1000F00027020600800080032F100700801B0004E9
+:10010000641B08008000801F671A05002000004063
+:100110000F00040060002040030000000000000009
+:1001200000000000000000000000000000000000CF
+:1001300000000000000000000000000000000000BF
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000000000000000000000000000000000008F
+:10017000000000000000000000000000000000007F
+:10018000000000000000000000000000000000006F
+:10019000000000000000000000000000000000005F
+:1001A000000000000000000000000000000000004F
+:1001B000000000000000000000000000000000003F
+:1001C000000000000000000000000000000000002F
+:1001D000000000000000000000000000000000001F
+:1001E000000000000000000000000000000000000F
+:1001F00000000000000000000000000000000000FF
+:1002000000000000000000000000000000000000EE
+:1002100000000000000000000000000000000000DE
+:1002200000000000000000000000000000000000CE
+:1002300000000000000000000000000000000000BE
+:1002400000000000000000000000000000000000AE
+:10025000000000000000000000000000000000009E
+:10026000000000000000000000000000000000008E
+:10027000000000000000000000000000000000007E
+:10028000000000000000000000000000000000006E
+:10029000000000000000000000000000000000005E
+:1002A000000000000000000000000000000000004E
+:1002B000000000000000000000000000000000003E
+:1002C000000000000000000000000000000000002E
+:1002D000000000000000000000000000000000001E
+:1002E000000000000000000000000000000000000E
+:1002F00000000000000000000000000000000000FE
+:1003000000000000000000000000000000000000ED
+:1003100000000000000000000000000000000000DD
+:1003200000000000000000000000000000000000CD
+:1003300000000000000000000000000000000000BD
+:1003400000000000000000000000000000000000AD
+:10035000000000000000000000000000000000009D
+:10036000000000000000000000000000000000008D
+:10037000000000000000000000000000000000007D
+:10038000000000000000000000000000000000006D
+:10039000000000000000000000000000000000005D
+:1003A000000000000000000000000000000000004D
+:1003B000000000000000000000000000000000003D
+:1003C000000000000000000000000000000000002D
+:1003D000000000000000000000000000000000001D
+:1003E000000000000000000000000000000000000D
+:1003F00000000000000000000000000000000000FD
+:1004000000000000000000000000000000000000EC
+:1004100000000000000000000000000000000000DC
+:1004200000000000000000000000000000000000CC
+:1004300000000000000000000000000000000000BC
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:10046000000000000000000000000000000000008C
+:10047000000000000000000000000000000000007C
+:10048000000000000000000000000000000000006C
+:10049000000000000000000000000000000000005C
+:1004A000000000000000000000000000000000004C
+:1004B000000000000000000000000000000000003C
+:1004C000000000000000000000000000000000002C
+:1004D000000000000000000000000000000000001C
+:1004E000000000000000000000000000000000000C
+:1004F00000000000000000000000000000000000FC
+:1005000000000000000000000000000000000000EB
+:1005100000000000000000000000000000000000DB
+:1005200000000000000000000000000000000000CB
+:1005300000000000000000000000000000000000BB
+:1005400000000000000000000000000000000000AB
+:10055000000000000000000000000000000000009B
+:10056000000000000000000000000000000000008B
+:10057000000000000000000000000000000000007B
+:10058000000000000000000000000000000000006B
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E000000000000000000000000000000000000B
+:1005F00000000000000000000000000000000000FB
+:1006000000000000000000000000000000000000EA
+:1006100000000000000000000000000000000000DA
+:1006200000000000000000000000000000000000CA
+:1006300000000000000000000000000000000000BA
+:1006400000000000000000000000000000000000AA
+:10065000000000000000000000000000000000009A
+:10066000000000000000000000000000000000008A
+:10067000000000000000000000000000000000007A
+:10068000000000000000000000000000000000006A
+:10069000000000000000000000000000000000005A
+:1006A000000000000000000000000000000000004A
+:1006B000000000000000000000000000000000003A
+:1006C000000000000000000000000000000000002A
+:1006D000000000000000000000000000000000001A
+:1006E000000000000000000000000000000000000A
+:1006F00000000000000000000000000000000000FA
+:1007000000000000000000000000000000000000E9
+:1007100000000000000000000000000000000000D9
+:1007200000000000000000000000000000000000C9
+:1007300000000000000000000000000000000000B9
+:1007400000000000000000000000000000000000A9
+:100750000000000000000000000000000000000099
+:100760000000000000000000000000000000000089
+:100770000000000000000000000000000000000079
+:100780000000000000000000000000000000000069
+:100790000000000000000000000000000000000059
+:1007A0000000000000000000000000000000000049
+:1007B0000000000000000000000000000000000039
+:1007C0000000000000000000000000000000000029
+:1007D0000000000000000000000000000000000019
+:1007E0000000000000000000000000000000000009
+:1007F00000000000000000000000000000000000F9
+:1008000000000000000000000000000000000000E8
+:1008100000000000000000000000000000000000D8
+:1008200000000000000000000000000000000000C8
+:1008300000000000000000000000000000000000B8
+:1008400000000000000000000000000000000000A8
+:100850000000000000000000000000000000000098
+:100860000000000000000000000000000000000088
+:100870000000000000000000000000000000000078
+:100880000000000000000000000000000000000068
+:100890000000000000000000000000000000000058
+:1008A0000000000000000000000000000000000048
+:1008B0000000000000000000000000000000000038
+:1008C0000000000000000000000000005624CB7172
+:1008D000C0BD817B1300000000000000000000008C
+:1008E000000000000000000000080000F008000008
+:1008F00000000000000000000000000000000000F8
+:10090000000000000000000000000000017410184A
+:1009100000170107323137047F072B4139420303A7
+:1009200020201C10011E0509FB2C091E3EFF35006E
+:1009300084E6FAE98950E6C405080A10570F0A4010
+:1009400001010107040428C01E64262680800000DF
+:10095000C0535B804D4D0140463CFF00C800C800BD
+:100960006F03B706649600000000250AFA00C8006D
+:100970000000370400007F072E00FF1B045802040C
+:100980000A1E00FF00C800FFFFFFFFFFFFFFFFFF81
+:10099000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF67
+:1009A000FFFFFFFFFFFFFFFF013C00FB031E006195
+:1009B000070000370400007F07120701006400E809
+:1009C0000332000A0096000A00002C0180031B007D
+:1009D00000FF2F01FFFFBF96C0E80300FF8080806B
+:1009E0000000000014000000640132210C0C0C0C0B
+:1009F00000310DFFFF0065010100060601010065E1
+:100A0000010101010302210014000000020001297C
+:100A1000022100140000020200012B011C0014003E
+:100A2000000505000227811C0014000009050002D2
+:100A30002980140014000000020001298014001411
+:100A40000000000500032C0649001400000102000C
+:100A5000012B053F001400000705000228053500A2
+:100A60001400000C030001250535001400001003DC
+:100A7000000127843500140000000200012984359C
+:100A8000001400000002000129040404040404040A
+:100A90000404040404040404040404040404040416
+:100AA00004040404040000000000001C00181818CE
+:100AB000170F0F17170F0F0F0F0E0F0F170E0F0F28
+:100AC0000F0E0F0F171718000000000000000000A5
+:100AD0000000000000000000000000000000000016
+:100AE00000000000000000000000000000071002ED
+:100AF000000503030203071F000400A6001464019D
+:100B0000013D3C3C3D01043A0001000200000906A1
+:100B100000000007020000000002020000030300C2
+:100B20001B39060000232300050201100C00110AE6
+:100B3000320A321420460A000A480A000A00401409
+:100B4000800314640101FF02050205031919000066
+:100B50000705050501191900000701012B00060012
+:100B60000014140005040023010001033B011020C0
+:100B7000204000000000FF0100000001000002030F
+:100B80000D33330009A11ABE010A191560283C096A
+:100B9000060000008A20F977221010001F1F181885
+:100BA00018181717171717171717171717171717D3
+:100BB00017171717171718181F18181817170000E6
+:100BC000313837302E2D332F282734292A322C2B39
+:100BD000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF25
+:100BE0000E0E0606060504040505040404040304A9
+:100BF00004050304040504040405050700170000A8
+:100C000000000A0B0B0A0A090A090A0A0A0A0A0A58
+:100C10000A170000000000000000000000000000B3
+:100C200000000100060023000C0C3333000309FF11
+:100C300080FF80FF80FF8001011C077D10010500FF
+:100C400005031F1F000005050007001F1F00000609
+:100C50000101330006010016140005090000AA096D
+:100C6000E00EBE0E0D060607050504060605050581
+:100C70000504050505040505050405050606080027
+:100C800000000000000B0C0B080706060406060512
+:100C9000050505050D000000000000000000000033
+:100CA00000000000000004030023012400FFFFFFF8
+:100CB000FF8C8C5151CD0D048810101010001B03B7
+:100CC0001D061404190515091F081C0A160B1E0E13
+:100CD00018071710110F1A0D12130100FFFFFFFF65
+:100CE000000102030405060708090A0B0C0D0E0F8C
+:100CF0002324FFFFFFFFFFFFFFFFFFFFFFFFFFFFBB
+:100D000000100010CD14CD14808080808080808001
+:100D100080808080808080808080808080808080D3
+:100D200080808080808080808080808080808080C3
+:100D300080808080808080808080808080808080B3
+:100D400080808080808080808080660E660E660E47
+:100D5000660E00000F00000000000A0101FFFF0105
+:100D60000102020201017F000200274F42610019C7
+:100D700001200300000300274F426100010102002F
+:100D8000263200610001460C0C010000000000004A
+:100D90000000000000000000000000000000000053
+:100DA0000000000000000000000000000000000043
+:100DB0000000000000000000000000000000000033
+:100DC0000000000000000000000000000000000023
+:100DD0000000000000000000000000000000000013
+:100DE0000000000000000000000000000000000003
+:100DF00000000000000000000000000000000000F3
+:100E000000000000000000000000000000000000E2
+:100E100000000000000000000000000000000000D2
+:100E200000000000000000000000000000000000C2
+:100E300000000000000000000000000000000000B2
+:100E400000000000000000000000000000000000A2
+:100E50000000000000000000000000000000000092
+:100E60000000000000000000000000000000000082
+:100E70000000000000000000000000000000000072
+:100E80000000000000000000000000000000000062
+:100E90000000000000000000000000000000000052
+:100EA0000000000000000000000000000000000042
+:100EB0000000000000000000000000000000000032
+:100EC0000000000000000000000000000000000022
+:100ED0000000000000000000000000000000000012
+:100EE0000000000000000000000000000000000002
+:100EF00000000000000000000000000000000000F2
+:100F000000000000000000000000000000000000E1
+:100F100000000000000000000000000000000000D1
+:100F200000000000000000000000000000000000C1
+:100F300000000000000000000000000000000000B1
+:100F400000000000000000000000000000000000A1
+:100F50000000000000000000000000000000000091
+:100F60000000000000000000000000000000000081
+:100F70000000000000000000000000000000000071
+:100F80000000000000000000000000000000000061
+:100F90000000000000000000000000000000000051
+:100FA0000000000000000000000000000000000041
+:100FB0000000000000000000000000000000000031
+:100FC0000000000000000000000000000000000021
+:100FD0000000000000000000000000000000000011
+:100FE0000000000000000000000000000000000001
+:100FF00000000000000000000000000000000000F1
+:1010000000000000000000000000000000000000E0
+:1010100000000000000000000000000000000000D0
+:1010200000000000000000000000000000000000C0
+:1010300000000000000000000000000000000000B0
+:1010400000000000000000000000000000000000A0
+:101050000000000000000000000000000000000090
+:101060000000000000000000000000000000000080
+:101070000000000000000000000000000000000070
+:101080000000000000000000000000000000000060
+:101090000000000000000000000000000000000050
+:1010A0000000000000000000000000000000000040
+:1010B0000000000000000000000000000000000030
+:1010C0000000000000000000000000000000000020
+:1010D0000000000000000000000000000000000010
+:1010E000000000000000000000000000B9894DAAC7
+:1010F0006D7EBA57120000000000000000000000E2
+:10110000000000000000000000B801001011000005
+:1011100051E595CF7043CDF186EAE60603CF8A5AB2
+:101120002E0EEE992641150834CD2335EBCA46FB29
+:1011300068A02A6AA6C8D4B9D4E219919D14165998
+:10114000AA531B6C44766BE963FFC0ADE096D314E1
+:10115000EA0B816D6E5460B510B3DB8916B7D3D23C
+:10116000D9349562135782AA3A41F6B8060FA6758C
+:101170007A0BB84660EE16D30FD59DF3AFCE8569D6
+:1011800090BC3E07B274DF4A54F92FFC0C26F12DB7
+:101190003FDE5858C6443F05D9050316B4941FE6F0
+:1011A0008C6A162DE59DB29CFA02D48CC06F25295D
+:1011B00073B72CBB9A36BBE51A5B4DC94925D97D5F
+:1011C000A8728747D7B61220BD59338444B28D80A8
+:1011D000736D58BE134A385AE5A24BDC3B2EB46BF4
+:1011E0000916BE035D94A868228CE7E3EED8533C51
+:1011F000F3AFAFA43D495F35E5EEFBD144850190E7
+:101200009072026E46E1644B4F7C1DBDFA3AE208D3
+:10121000DD867800111E5EC47906164EA35C70BF91
+:1012200049D32DD272E5CEE929AE24355057CEF000
+:10123000AA653441E17C54CA3C07D55336DF9FD7B9
+:10124000C812CE0893B76C54AD50E4555A8F44037E
+:10125000B32317721A059AD6FC420854E24BF4974E
+:10126000E89E19AF1AEAA577B66ED08AD4E040CDD1
+:101270004DCC888FE77CE9AE959A5CC002958CAE28
+:10128000B0708B4A408F4DF5517AC7FD198AA61E62
+:10129000B70858D0403B7D446408065688E3E4E232
+:1012A00061264C8BB8C409640E3F8F45E293A49F1E
+:1012B000AEACFB93CB4CA95AAD3A5CC4EEB330FB59
+:1012C0002027F14FF7EDD13BB253731172221B0867
+:1012D000D4B99F1B0C51EE43AD215931314659A968
+:1012E000ABF513EADF76CD0B7D1FE030EFD90E3280
+:1012F000E19F7D103A4121B1F9363ED30AB3997688
+:101300008DDAF64ADD47563CB2023ACA8DCDF86F07
+:101310002C4FE4B1B97D792B9F52F336D397A4318A
+:101320000248A22440304DFF1F0C802958DEB1EC4A
+:10133000610402D5DF5E55832AD2530659A588463B
+:10134000A70AB663EDD925DE021DE7BD8551A901C7
+:10135000A670714F495C3D57810A32B37B43CAAED8
+:10136000C29D4497BEE5DB78801E913043E432791C
+:10137000BCD826BAB70716F4FE05A257742CE8FAB3
+:101380004265B3B43A0EC601C3E4DD61C1DC376B1C
+:101390000D668BAC5AFA05C4ED73A644A19DFA0DF7
+:1013A00017A05259424D12FE6A42F0486B396095BF
+:1013B000011734B826C7A30050E121071CFEECFE3C
+:1013C0008DA632691094D5A3B0892BA0C36E5DEBB6
+:1013D0004F880AC2B8EB0F5D380F166677E4CC77FA
+:1013E0002E7026AA785D9E922D4458639727B133BC
+:1013F00025FE23C53DD45D741508A2D291DE4C3B79
+:1014000028797579630590A812BA7D786D020C94DD
+:1014100055CA48794C8771A0C8EC44578C0809D646
+:101420009FD1FFC76B6F54F16066DAE2D3FB62C5F0
+:101430008F11831007962500EE926C61ADF541ABDC
+:10144000C79D798356074471CDF4DA740A0BC254F0
+:101450005203A9EC403F1EC8E40C3C620E8C5CAF0A
+:10146000766019A62AAF51D9ACD48B440E7F83DDA8
+:1014700022ED45C17A9481FAF86EAD269BA597D6E8
+:10148000654AFA0D1A6F28B1BDFF65F46812514222
+:101490005996A1670A8B52F83C34F35731A8C0C65D
+:1014A000D5BB46804FD06C208A00BCFA684ACF5624
+:1014B000EC9DA71DE5669F77461662E7DFE9676347
+:1014C000A9FF3C2C08F05A035347B9BF29520F1DFE
+:1014D00083A1492164057E74CD2BB173335762EC2F
+:1014E000FDDAC7FFFABB287B23E566CCAA85076B2C
+:1014F00017618EA76F6CBDDEB1802B9F0498ACFC8A
+:10150000A38FE1278F47A78CB898ED666FD072380C
+:10151000391E3C1BEA29F3A6C696356BC7F03D5B26
+:1015200008E594F695D54B86CEDC7DE5D7077BAEF6
+:101530006879D55C2AF738626CEB34DD2417D33B2D
+:1015400007009D3DF05465787429D3346C32FBF06C
+:10155000425CF50D730150726B56321428F7BECB06
+:1015600093AFC256F489A474CA509C3AB0AE77685F
+:101570000C2625B9F6F52A6370632EF4A22DCB1242
+:101580009B100FBF99C011D42FBE5C59920AB4C4EE
+:10159000551C4AAE0964B1DECD4FC87DD4F6115951
+:1015A00005033EED916AC6DC62F955ACDD1E4C01C7
+:1015B000441E9B8D68F80CA47A975D79150E23491B
+:1015C000F9BCED80941B25ADCEFBC4B2FB0A92A002
+:1015D0003C10B05A8E5917924E234A437442CD0C98
+:1015E000D9FCEADE9E5EB9C84110F76EF25538208C
+:1015F000985FE59564C0EB22038E9C79478BD2E718
+:10160000E99D1D696D0166AAF808538A5E5034256C
+:10161000D8D967A055C01F839347FBA866C145145E
+:10162000A602A0E1B3595D82FE499C77579E1F2E0A
+:10163000AC3E0AB23E6031386B70AEBF408C87253D
+:1016400049B046E87CF0B6ED2C50B5B669816A0B1E
+:10165000FC38DD19E4D6FBB27D87A39FABCC97861F
+:101660003BA54F7FC77842F8F6DCF3E063C0BA3A97
+:101670008305EC815FF7D7466106521C896DB4AAD9
+:10168000026780B868523CE8DF9A238C489BF2C01E
+:101690002EB88D33200EFBA30A65A58B91DBDFA846
+:1016A0006993DE02E76A28C5FD89D2AF9BC8581F3F
+:1016B000DF7310D72B450669F5FE518914695D5318
+:1016C00047942568BFBC418930C91D3DA23D7101C9
+:1016D000534BC9684C00394AE1FF1AAB12470F78E7
+:1016E0002AAC4AAECE62544E2634E4C4708BE7F680
+:1016F000FD841B2074549218661F1FC77FEF96BA93
+:10170000A6CAB0E4D398F67DB642F8C7D1574D4A81
+:10171000EC12A3B6FDBF1725100AD50791DCA8DD92
+:1017200064BC2587DC74F8BE4E20B7A15AB780028E
+:10173000995EED341BB386D9382E284FD5A78DE599
+:10174000543FAE6A934EB5BF019E73F441D52CC988
+:1017500080A3AE8D7E1E95EAA632773BC1E843D3C7
+:1017600069C8DC3B152D1C09166185A0CE7D3B1D8B
+:101770009C456181C44A934EE21EA9D87ACF2E308F
+:10178000E2B1019CC99F5680F590753802CF5C9EEE
+:101790003F4FAA3E67549CD681A84B7F3BD20E5345
+:1017A00042E1B8D5FAAA3C5716C006E2905B160C87
+:1017B000C3CEB672BD8487114746191E60D3FFC0E1
+:1017C00039AA2FDF638170F60686FCD35A103725BD
+:1017D00042FE1A7B1FF657242F655C02C56D60C65A
+:1017E000F11425B4656605CE5A9E6CA80459881874
+:1017F0004D3FC7E6646F2F955342ED0D60363EA90D
+:101800007FFBEFF4E48383D19DB3299C63DFB905AB
+:10181000409FF7BEC505AC332979E974F6E7B16797
+:101820005F01991B67B9051D5DE19725E35EDC5BF0
+:10183000C91D632E8B567642CA9B0BAD484CC1C264
+:10184000BBD853E5B69C7E4F9F13806B0C3752A2DA
+:10185000B601C4492879780B0B2B0C047D0652F78E
+:10186000A47ED142400BA90F5634C4463735FB85C0
+:10187000A11425AEF84B4BEF2F6F5C6685F8A0FAEC
+:10188000AC2087CE1BD2D5CDB22DA2B0AB65A68F32
+:10189000BF801FCF1E3D06A43B903CF90FF46C4E59
+:1018A000CABF765E564787F1F8AD260F062EBF2FCA
+:1018B000372044D5E960D7C2AF0FAFD4122B4ACF3F
+:1018C000501EC3C5A0B82B20AE1547B163C4BEEDF2
+:1018D000288F685CC41537C147AA27D18B8E8EFC30
+:1018E000F6F320AD610DFC13E37E4DD801788C68D2
+:1018F0002FFD8E309F2C4A7AB71E0DAEBCB513302B
+:101900009C8219258BB89056EB56BDF625E9311906
+:10191000477F7250A1AC13A8EF3CDB6BDB8CB28E1F
+:101920001685371CB1D28160A2D85A876714EB3470
+:10193000E9BBD4C4213FB7FEC7FAD00DC7BD2DCF38
+:10194000DE69DE8E3110BAD1DB7B02A7841243D967
+:10195000847454825DEEB133924273DED8DE2C4C37
+:101960004F0D45589577C93F49B0D0E62B77AF5E0C
+:1019700097BA745CFAE64AB787A70BE6039A09F4AC
+:1019800080FA9B5581559DE0DB9560CE22D3E8AA75
+:101990000F4EFB03220E8D899D5C46B956BA72210B
+:1019A00090449365ED1ED5BBB531B6C96FEB658D1F
+:1019B0004A253657E5030DB4FE4D7420EC884C05DE
+:1019C000D3116937E4BF1FB2394434220E9E45005B
+:1019D0003EC3A72A0D6FA1913ED82E9AD1AF2D2FCD
+:1019E000B16C5FB6855E230FDF6B7A5639853CD2CA
+:1019F000A81FC6918408A1B2AC598AE114BFD17363
+:101A0000166E4F4F27F579D8766BFB7C9A9AF4C700
+:101A100087162A6D69E308D2521B32D9C2B4367ECA
+:101A20005616C414AB35A3DE8DDEC99279009D69CC
+:101A30005916BA4A8BF8EB4D20840CDA961AB4E4A6
+:101A4000295E74548720DD5543123289FD3CFA2407
+:101A50004B4D489F4D2C3670FC4CBAB6A0507D7251
+:101A60007A4699751E345C103D525FAFB28384573D
+:101A7000A4A525163FBD3A805418DE8B8B3CB0D60A
+:101A8000B6B179F5D5E32C6D2CE51459EC30F89806
+:101A9000DFD6AAF99DF3BAB4F10EB8A43883299E13
+:101AA0009F0B6D7E9DF7BBD478E4038291A3D4BCD9
+:101AB00072881337E2A5127B2EE777273C84D61C69
+:101AC0009FDD793C500748EEE821C8E22B94460C94
+:101AD0004AB84D572F9D3337AF0F094BC179EA16DE
+:101AE00095946FEEC023585295D6D77BE3A0D9C307
+:101AF00021D009C66DCB2A4F4B9DF796AC5A8B98D7
+:101B0000D1FCE3DFAE8308FEAB198BE2DCDFA99AE0
+:101B1000E5C29A7F48A8240FBDEC8F74AC462F9F76
+:101B2000F4F3E541434518AF3D60A7A649D574F2EB
+:101B300049B8C0BBD8547BBADDC511E9D401F45D06
+:101B4000B954F6F43B25EBFD9C3F6D4958BF451C4D
+:101B5000918AD7C2D1CCB1BEACF0663388D62C38CE
+:101B60000424729B0BCD070CB2F155DAD642EFA6D6
+:101B7000341B0F6AAB9B7D2369EB24A2953086EB67
+:101B80002CA189CCC8E62CD44548CE54425A5316D1
+:101B90005DB4AAA2DC6D3CE026FD5872DB64A2E0D5
+:101BA0001E386357252B56DF09B1BDE6007AF17761
+:101BB000436AA613B09D8B5D953DE18C2394EBABFE
+:101BC000768D60B3DE3CA1260C6DDD11A409806F1B
+:101BD0003908E77FDF8F38F6E51289CA7D0F207755
+:101BE00060053FA3A193038B0E11720AB437E56918
+:101BF00013A492910D1F6162874ED645BC20DC5420
+:101C00004F3FE2DFB8EBCC5F43397A846A59D92B76
+:101C100030FF53021C4A4F3F43E425EAA88282BEAC
+:101C2000FF48E7F11C9F7D0F927FC46A6A83EC68CE
+:101C3000D8E78249C9AE2B119C1C891016CAF7A897
+:101C40000096ABC29F4CD386D05B0D36A5E6B64856
+:101C500002A6DE30152F8DCBFBD6096C79070B4C15
+:101C6000660AFB841B101EC222C5C62145A4CFDC18
+:101C7000619C7D735A7D959ADD03A81FCB2A74273A
+:101C80005B4FDB507A4383E1F65B05060E0194B4AB
+:101C900098A00CBC47C139D575D58C548020815B88
+:101CA0001AD45D0D57B5BFA772E7DFE202D605571C
+:101CB0002EAF749964ED701AD6C598ED10F0426C91
+:101CC00033E031D981B8F165B7CEB873D8F0A59EAD
+:101CD0005B5B933B04F6B0D35ADB9351AA8F3283FC
+:101CE000C9E03E2B5C76D70C62EEF5A5477072A278
+:101CF0007A92D681119DF38029386E81A3B0052098
+:101D00005C73DF0056F22F92417034082575135032
+:101D100030CF4C10E4F786962E077AC9122545BEBF
+:101D2000BFFB1A24C3BA69F36B1C9BE60306CF0101
+:101D3000ABF65553C5016F430958567AFC13EB6552
+:101D4000CAEC138D9D0545A96D2F4B49EB6C8006A0
+:101D5000A395DDA49D0C7E7E312DA05779A9328EEE
+:101D6000234B14EAA3F78ECFFCAE6A14FFB73C20D6
+:101D7000C279E1DCE57F93F940BBB4A221B8A3FEB0
+:101D80003CA92C3A0E3711138A871E349D0B7EC74F
+:101D9000154F99D4EF721F52F2C5B122B00DBB7529
+:101DA0006EFBDEA274C2FE03221B348D1B39C86594
+:101DB000D67A3AE6DE7B946EC6715648A9AC3AE014
+:101DC000B84071FDC1A911EE9D50B494C4AF4B87CA
+:101DD00005712C542AA89D9AF1D878A67933BA4572
+:101DE000A48EFE1634F69EECAAB1D7A7B9CCC6DDF8
+:101DF000BA8C8F506E88F64CA9599A3A4B7699371F
+:101E000004D3A997426645B542B42F59190B5236EF
+:101E1000B1F53EF2C13504EA895CCE17A23FA4F9C0
+:101E2000A93A98AB0BF81A1E3E9E4AD21AB634A7AE
+:101E30005BAA56B8A03F6A0D043BB4E545F1C91250
+:101E4000C67B714439F55D2BDDA56A83DDB8D031E1
+:101E5000CCB2C25371411B8FDF8C3DA9B57770CED8
+:101E6000821CD9CFC1B807B37EC6B2A40BCCB5AD26
+:101E7000A5A70AE5439B0858DB0831B701DCF477D6
+:101E8000F7DD19F4EC2E3314E8DAE3FCD0B4A54402
+:101E90009D458F9599DBAD57BC7646369C052BA2A8
+:101EA0004D2AD8BA615CEB334BB6DB2E2A9417E887
+:101EB0007514DB6F963074D5F7E125098111B4F6FE
+:101EC0009470987F09F64323874E0D81D41B081721
+:101ED0004D31A9B696D678D25A47452412BEA52DC3
+:101EE0006D4798571D9406B47CD6962549C159D0A4
+:101EF0005965D41789306B5043A9CC2F8C64109C42
+:101F0000560C28F97710089C9C29E46F602703067B
+:101F10004226C3F26D27338C44FFA6059FA20A62B6
+:101F2000830FBCE5C44BE5005BBB9F97D6B9E93E88
+:101F30005F0DFD14DA1DE40F61D3F3AAE046A06A39
+:101F400045833D49453042F0070E283DAD51ECB088
+:101F500069B8FD9B1D0E6BFE6E1F48B8D5845AEC08
+:101F60004354FDAF95DF573E29CDD4D4CC99EFDC57
+:101F70005E310383C2E134DA91A26B4B38E5408FC6
+:101F800089B2A2866B05AB29A67D57F4BD73FC67A9
+:101F9000886E74B4E85A689562F56264F0EB0937AC
+:101FA0005BDB37973FBE0958EFA4CCC455FD307DAD
+:101FB00021FDB1B90E9389D0DE107E36E34F6D2539
+:101FC000F7CCBE2A0906B0CDF183173BDD35D847E3
+:101FD0001713A5EE13F699C96A8A7EBB245ECD97C6
+:101FE000C6838730EE60AC50B5D7FB057C227763A3
+:101FF0005068C8A5F03DFB8F9D1BCD72F7C6A5F7B5
+:102000000C8D38D089EAA661025719E124C64BE944
+:102010009AB86D7666546DAC711E63CC25427AE138
+:102020004AA2751C1587B58F8EDC2E729E0287AA78
+:10203000814FB65F7AB86EEC377D1582980383E5E1
+:10204000DF371DD1EC89DE06AE8599F2DFF8B4F1F9
+:102050009F5976F06C04929936319B8F2166BC5B58
+:102060007D82C1E75185AEDBDF234C2A1771AAA020
+:10207000B6BDE701A1DA5FDE5CDAAAFEF48C94CC8F
+:10208000D4D3BE9849EDD6F3EF756CF2824101BF0F
+:10209000C0094596425EB82C821FCB70D7FFBD7A2F
+:1020A000280CA4ADAF99A45361AEFB52EDDB1AF638
+:1020B0004AE8D9CB58502E8A300D9F78628BADBD3F
+:1020C000F8400BC18E8A9AE2BC7264484B447D3B57
+:1020D000BD9E08208E3A38E1193E0031519AD15206
+:1020E000A86DDAEA930426D2A72B08D5862E98FE8F
+:1020F0005E67F1F12C1C1786F12D546AE9EDFA5850
+:1021000023CE1009723A2D529DB273A00D64A7C55B
+:1021100052FFC2DF9DB3080F6914FB56AC4F62E952
+:10212000AD70251DF2CFA9A537C85167B304ACB572
+:10213000E64A8ABFD6463B415C82493A6AEEDBEF0B
+:102140005F3639476F0C747371A2EDFCCCEB10F461
+:102150001E7AD12BEBE5CBA31BB287E17EF6AC5BFD
+:10216000F4DAF14081C313EA36C156AFE9EFE14733
+:102170004DA3D65C18AA502BFEB813B65BE56F9B37
+:10218000D5EA8007628467891F1BA872358F0E2FDE
+:10219000246F834A4E66F7A128790A61D44CB63978
+:1021A000BB310D65A8EE6D1CC261EC61B1C37DF65B
+:1021B000B59EBF9B1B016EFCF73070301CFDC9D172
+:1021C0004368264845D809ACE1AAEA15C9470B324D
+:1021D000DE9E28FD2214C4596CC8849D6A2924B54A
+:1021E000D28932BC683C8862C1EAD40433C82B600F
+:1021F00002E34E63DCF9988748050A23D05DAEE818
+:10220000D97AF65FB2407B6EB73C7BF691C57F43CF
+:10221000A27919D20CFF2CD10930185EED367F342B
+:10222000963D31D05C96F72072BAD75DF2D724FA8A
+:102230007D28B1ED4C9798B107EBF44BEB60E2D2FF
+:10224000EE95EAD7447C3B66DAA2F3041D86002BA8
+:10225000ADDD9E329260F3721F4256E673798804B8
+:10226000224EEC71D4E3D110F7C46FE392FAF53C3F
+:10227000D2C99A8AAF14763DCAB94DE02EC8CC981F
+:1022800045C8226D5D9C32102D5537E7DD4EFBA20F
+:102290006529F69B73FAD7118827D1A2CAF87EBAAE
+:1022A00028A05281A8D7B0D559FFE82C2E2178F26A
+:1022B000C5668227555B48D59C4B79D776B516996C
+:1022C000F2244CD8DB2E8808B89DB0C3D455B9424F
+:1022D000BF2C112520AFB8E931E8D1985C85CD132A
+:1022E00026AE36D33954BC8A4AF7F5B137DF4F579B
+:1022F000DEAE13B3B5E2E695BA765C8F953481A075
+:10230000475616B0AAC8F9479A7750478B28F8174E
+:10231000F3C2AC458D136B9C3A5F490882D75C7B56
+:10232000D081E9D6DD0A20964E249B2CDE58B73AA0
+:10233000BC1960C4C6ECB98F1C52538E6D5EE3C5E8
+:102340000E0A5692D7AA8C80A33AECA66EDF7CCDFB
+:10235000165E04329353A2091A2703FDAFBC6B1E0D
+:10236000E34B4FBA9C1ADBC186983B52DB88B2051F
+:10237000525CE684C4229912E4A1D005AFBE2C8B36
+:1023800033E5BF5ECCDF13D6C8910A08E5909F788D
+:10239000A758BFCB19877CC7C100F6AAE167926F27
+:1023A00057B0EAB75BFA117358E0F4F03E1C51687D
+:1023B000500D082578F05ACB02B34CF275BC25A11C
+:1023C00000F7280145A610150FD2D19E1A26EC4819
+:1023D0000D788CE8A8677078958ADA1C458C6C9328
+:1023E0003F70361FED655795412C9948AC1E6A62C7
+:1023F00041A9A04BE11CC19060F22154EEB8862B9C
+:10240000E59854EEF2D87165F7CCE6A0A3D0BE1AD9
+:10241000CE15073AE22CFDBE08282792672EAA4265
+:1024200061F94A6AEB70A4593C1A936A562F54EB2F
+:10243000A00F10BA848062E84805A8EDD14FDE9065
+:1024400005BE825F1B33512837233E349512E3F0DB
+:102450002DF09AD90714E1F044FD349BD900D1E264
+:10246000749C46B02D9F350A6367CEAB1BF97C592F
+:10247000575010966A7800477CE2CF214A52389430
+:1024800015FA026ED0D5F5E5E152AFC2895354B0CA
+:10249000BD16F0D27234A8B403D9F476B3FD51AFAF
+:1024A000012A3C381B11E93BD05BBBC38FF93DBF10
+:1024B000271707864E4609894DCB7318B1612195C0
+:1024C000A2233FC78EAB692EC198553CE5C058CBBF
+:1024D000D32D4940F1B59843D197555E8A6A4BBBDD
+:1024E00083C804559D56F13546F2BD9FD480C5CCB6
+:1024F0001DE0A14F6C034F45188596E7AD18821F6C
+:102500000E4B0100DC60D5CFA3882840420327F39F
+:10251000517A0BC95D8017BC2F240A68F60363A0AB
+:10252000339E4D007C8A8BBDABBAAFE9F204E289E1
+:102530006AA3132974AED77081D343A5E861671FDE
+:10254000EAA2A7E11FEC1683D66E14468310183951
+:10255000A28ABBA1545F250A17A808942CAA7092DE
+:1025600058F547B52E1258F755CC19587C23BBA9FE
+:102570001BE283053FA5C55B9193AD4E9D4738A0F7
+:10258000EF90529FF4BAA8D0D53D2877E569654F02
+:10259000CE4EF50C783CC2575B8FD60D8F7214D996
+:1025A000738B5F15C2C477EC33113424935A2263C2
+:1025B000635532FBBBF60F9535E5A033AF291855AF
+:1025C0000F54735433C18F34D220330C659E7E6C0C
+:1025D0003A7749D5F33796D7069A915AB9D9882FC1
+:1025E000ED916E3E89A5A73A0C0F751D53CD5E4344
+:1025F000FBFF6B135926087DE3F502723B0CBD47C8
+:10260000934B63A761BBBAC469680EEA85D936B932
+:102610001887F0B2075EA96D08742BD16EBDFC7CE3
+:1026200049888476A44DCF35847B5E6A6FE27271EF
+:10263000489990561D17CFE36C40CD5BA4EF27C59A
+:10264000C16685F8B5A56131555B2130409A4B3C98
+:102650004DFD06E5739C99E1356290FEE662541FDC
+:10266000506FA26DC7DFE12B0C978D9723AB2542EE
+:102670003BEF630F09D6D3A7BFFD912B160D5EED7F
+:10268000B5C21475B7F3CD9D8D222E98A35E9177B8
+:102690002D371FE5A26D9D364B868BC9CA792F7FDA
+:1026A00030AE5E8C0724F4E6F75899B96034FE79B1
+:1026B000ADA4101D5C23BD7C80F505B78F3CF702EF
+:1026C000C5C11590E9D97AA6E171073A0BDE4E89AA
+:1026D000E618F30CE2002AD88BAF3EB64DA5C5AB89
+:1026E0007DA95C136BFE9435D11F655553D68EDEE4
+:1026F000215C5F9DBFAFA3188942C24A24339F2A41
+:102700004256865952B22BE77E1C10A66D20F3A8C4
+:10271000FA1F6C35DF1316987F19CC19DB226D0F69
+:102720004C7A2442410BE12350335165A666C73AE7
+:1027300004478AF3B14228D1812276A23DE34F1E9D
+:10274000140064872AD008D7BE863E3480EEAC40A1
+:102750003F3452D1C468C26A13F9211FAD05D6F9BE
+:102760007A7F0E30EE8D52BC5A407BC0D43F7B390D
+:1027700098BA1CA21D417C079DED5785C962A9D757
+:10278000ECB17E5FA9974F29E37CBA95CA55A5F3B2
+:10279000440DED85102CDA009280225AAF41E944B5
+:1027A000398D23619F1D65C80E8EB8E72E78782C71
+:1027B00022B07C96B64546E117C8ADFA4D87BC9C61
+:1027C0009DA40130CBA4E38398C31F825521E62644
+:1027D000D84422D7932F0B5D114D01B25A90A4A279
+:1027E00046A617EA0ACE460754081B1FE102CF3A55
+:1027F0003880BB8B58E294A7B2EC13C8009256DB2A
+:102800009519AA735E05F008F405782B5C4BAD7A38
+:102810002B4C7670678C67773539420FB839278132
+:10282000E4ABD4E6E04C5DFC69C90804B15305E1B2
+:10283000A61D0DF7026EA0B37555B2DC708DCAE609
+:1028400080310EE5068CB1DB57395D1BC04C2D4144
+:102850008CE7ED29AA0DA707874A6A8C2D8E936C09
+:102860009160F47C1864465CCD81364F0564932BEF
+:10287000D214C0754EB03819B05C4EED9DCFD0501B
+:1028800062231C24340299ECFF42D42233BD14C2CB
+:10289000EA2EB7EDD9A6DB1306D7016D4295DC54BD
+:1028A000B6304B31AC94057EDF0A20F1AF94E7ECF3
+:1028B0002D18B97B3C4C7659BCAF19649CA5EE8BA6
+:1028C0005AF3A551E9A9CBEFD43887BD8CC0DAE71C
+:1028D000C10FACAE204C3297DB94942DB58F2ADF1C
+:1028E0009172A3700A216583121E2DE46039B1EB49
+:1028F0009FAF600356BDC4F53BCCFE92FD6AC9464E
+:10290000637A52CF86796A5D242E17F79E90ED6424
+:10291000FCB237383A6F624E31B95ABB36797A79A0
+:1029200041698F0919E7A894F767F101D407037289
+:102930008AEAB71F1C5488F9E85D73A2ECDCCAC0B0
+:10294000ABE46230FBC99EC1A0963C4EC1A7BDBCA2
+:10295000AD82D573537E87409D699D5510C9F41F84
+:1029600007715809BEBAAB25207834D9EC547D469E
+:102970006323A3E5E9345A2E590BF9C4DB0BEDAD03
+:10298000D50AC20D06E43CFB67AACD5A0583424E28
+:10299000AE6486CB9AA2B0A8A894DEC9DCAA27BDF3
+:1029A00020852B33A6A936A79F03D5E03E23B6A3E7
+:1029B000F7850D42A0DFA64F781789C2BA92297D0C
+:1029C0004BDF531C6A900BE911C57CBFC80F865BB7
+:1029D0009F35DEC739CA0A99BECBFD1C570355A3E4
+:1029E000608D9C895C9ADE122B44E6FC44CCA3CF1C
+:1029F0003D514465F1AD34CAED790E65C8D3D20CB2
+:102A0000CD1072421AA1D19953CE4D9B935B6E4269
+:102A1000ED354EFE1E2F4BD75E252D6C56AD5B87D8
+:102A200090A49D6D40B44D8BBFD8356358357D3C27
+:102A30005954F7C4109EECAEEFABEB18FED5C9723B
+:102A4000A0B572D03774F99E7DBEC264F7F5982D9B
+:102A5000337F4E50221DBDE8E4E79AA5816DE7570C
+:102A60008CF192334F69FF1EA9EE367CC394DD01D1
+:102A700093409FB19822A12535DCA314BB283D1EAD
+:102A8000C0429323D7AF329D694FD6A20DB6F8FA54
+:102A900070B63C924F78247B699274FBB6D080EE7E
+:102AA0001BDA45BC1C29EA6033922F59EAF46435DD
+:102AB000A6077F8CFF9042FA9355BA57E54C568C87
+:102AC0008C99321E4EA8F4D60825EEB57BEA5C58E8
+:102AD000046C83FF90B6A60E58FD3379602307CFB0
+:102AE000C11786AC140EA72CCAB6E8BA75B89217EF
+:102AF000B843981264D82A81280B91215C32D8AC53
+:102B00006535CCCABBE61E0F171209E5FE80CA0761
+:102B10002E1EA29CBE011AF109D6D49CF700732C7C
+:102B2000C69059DB1457C25121236636CDAF30E829
+:102B30005B855353FCD41C001AE73470963DC61FC6
+:102B400064000766260EEA44311186CA5FC58C5CB4
+:102B5000A066857F646CFDFF8C3773BB85AE9342A6
+:102B60007BDBD67F6C387B14F960F6BC71C4123EF7
+:102B70003DD87D814FF26D4C57C6E7D67F4508584A
+:102B8000A6A89489D5A208806E69F857F3F996F53E
+:102B9000582515C28F7331D8BEA15C90751BDDAD71
+:102BA0006C3A36C5C03D7CD29B58A74BC733B07436
+:102BB000D69545CF77E204DA0459CD0E42C7EEE947
+:102BC000785A093AFA4A23BBFE7BC01AA7097955FD
+:102BD000A926F740C9503ABA518EE74B4D8448BAFE
+:102BE0004E3BEB919CBE4754AD551BC624247D3E05
+:102BF0003327CBFA76B92D901E23C2FB5E2006DF69
+:102C00008C9FD6282CD3A7D58DB5DA7D78F2837A20
+:102C100058A0407DF9917C77FBC6517B7B185367A8
+:102C2000E1E036468B820F86BDE9C843A6FA8915D6
+:102C3000DECF6BE804A78DF648A34FE1C3A45F93F2
+:102C4000D03C885162351BFAD25B45987D9A33FEA1
+:102C5000016DC12FE8171C637E4F9A26ECD9395CB1
+:102C600065DB243EC073AC5FDFA44748BC85DB0452
+:102C700010080EC688310AE82EBE75B1CC7935CA67
+:102C8000AEE7CCEA6C4AC45C7433A14E8EF255BBFD
+:102C9000E5A7932BAD3D18C2C63D84E5F99B67744B
+:102CA000111313154B55672ADE744A5B8A905599A8
+:102CB000E95E63C837FF7B8179112CA5C3ACA261A3
+:102CC000E8FBCBB20BB9E97A22F192FB397D3B41AB
+:102CD0001467932631032345A6A6799671D0B45084
+:102CE000F4EEC262052C6ABD242B39A0A4B355169C
+:102CF000D2947D80934F98C07526B38C7F5A7165AE
+:102D000077BFB5AF55D798FB0F0B1324CF2D1CC839
+:102D100023760EB35BFEA24EF893378DEC170A258F
+:102D2000D2AF5B12B68326C9893926E6D39F2DED33
+:102D3000868AD5ABDA16C7DDE8177BDD78A1ABB2A2
+:102D400031A564EAF30B0AFA1CE3FBACC78CD3B4DD
+:102D5000062495749BB302EBCD8E46158BB5237874
+:102D6000E64634C61B3B6867C506D279953F4919CC
+:102D7000BA9D5535813BDDFB6FAB32E469E24A2AEF
+:102D8000A825F77AC35B347AEE03724FCE01B5966D
+:102D90005E394EAB1018E6C17337F267757504BA29
+:102DA0008D290AF4464C942DF0CD62082E941DD73F
+:102DB0007CF3A48690E84903F91BA500C5E2F487DB
+:102DC000383D41C2107346CF7E398A0152B36C033D
+:102DD0003680091415B9A16A011D9577A2AC4BA7DD
+:102DE0003C36D31F64845890505C0F9D7D7413262D
+:102DF00030E441DCF724CC58E10C978E275A4B4F36
+:102E00008C4EFDF4841C117641CBB39FF356C864FD
+:102E10009858A5C083B400ADA97B1FACBE334A1738
+:102E20003BEB9DF5420770DBDA44589FE73750DFF4
+:102E30004790B473145E15F32E6A42FEC7FC3672D7
+:102E4000E1921F6CE02DA3004254BF7EEBF7C6E277
+:102E50006FCAA807D3D6B12535CA7ABA06AF21C43E
+:102E6000A86C5A3DEC1FF85F934F148AB6E3B01478
+:102E7000F8126B714BBA58E1D9C5E0AB785B36DA22
+:102E8000E2249156FC0C511BB381212EC84CE34225
+:102E9000D9A8119B7FAC7A6D245B5F66F4071EC6D0
+:102EA000C8E848B956B6D47243B05AF92D51783CA7
+:102EB000408543F1F9BEC37D4BB3DD80001FE3C302
+:102EC000F9FEBCD306461A0BB9E009E694734FD855
+:102ED0007BE1F2891ABE035108AA3E597B68D95D8D
+:102EE0007BFACB91F5069940940D984D1EFF2A1D53
+:102EF000566DAC194EE515F5143C3E01ED76AB541C
+:102F0000C101609F25C5A45FFB5465051F17C962F9
+:102F100091159200F2547062F28E06DCD78C819586
+:102F20005DD357DA2B19A1127E8CCD8EBCCDE9561C
+:102F3000E09BFD5D3A3BEA995B8606D8D4C1585FB9
+:102F4000F3A877222457E7CC38EC2B3CAD48939775
+:102F5000207DB679EAD144ED04D2BF3AD1A51893C9
+:102F60006F068F6742A8A35D31043FE8DA07C66C9D
+:102F7000942289B87CA920344B10FEBEE1751CBC9C
+:102F8000A8AB033DA257C98EA2F36810200C05B26E
+:102F900077E90C3CFB9C7818319BB512E6F305FDF4
+:102FA00041724F8CA96042B5E0C48A7161E5FF2887
+:102FB000763CD939F58F254BF13C5F52C0AB08F315
+:102FC0001EB742E8211DACF055CF2B10358B1911DF
+:102FD000692AF4C3A13ED49119D148A691DEEFD15C
+:102FE00074AEB316CC0C6C0B03DC6847E0B4367ED1
+:102FF000E0046C6E0D510768236E1FAA289EC41B47
+:103000009C014F92ADAACD2AA130172DE4191EE5DF
+:10301000A5DC59FF1A63FD5E673C2EF1B7E7F3B8F4
+:1030200057CDCA07F93CC5F68C21C403424379A1A8
+:103030004727B5F8F4035D0EF34E4DA967DF4B3813
+:1030400015F8B3A8E91180A6B32D9F49B4C54F93D5
+:1030500039D94411FF881F0819D59846E48D3C23BF
+:10306000843ED626F07F4996ADBD6CA1A5E182DEF7
+:103070002F6823D7C978DBD9B35D8AE1120952DB07
+:10308000022CC1909E8CD4EBE32490C811FBE5EC9C
+:10309000B0B981775078547D86B01261F522CC5456
+:1030A000DF81F1E606C47B486848787C37977BA7C8
+:1030B00008EB17AC46D5821931F7112AA987DA280F
+:1030C000153C248B305C665A8C7BBE2B4A209A5A66
+:1030D000E98D68AA44070303AB25E1C33403EBF78A
+:1030E00028A0CC5FCF64D7765B353648D5CAE33F9E
+:1030F0003191CBD639D1A5C39EA6E88E29A35533ED
+:10310000FEF20478792F9F51E97016E3A016B627D6
+:10311000A2427558B91179AD888F3D03F477BF1E6F
+:1031200089D35EDCAC9E2A51CA02C20A2D4036BA4F
+:1031300051439EE8012B6D4995F6C1E4E55BC9C298
+:1031400028E7C253ED6DEA39BEA12D22E2A2BBCA27
+:10315000463515FCF8E5438939F61653E888DA0D4B
+:10316000B0F026C25155341CC15B8EBA1DBBE0BD08
+:1031700044DB69EA68CBE2BC1EDFD5AD5DD5A34E6A
+:10318000F3A167EE2DFB0547B858DC9955C68DBAFB
+:10319000526F1D2CD01D0E98D2F29D07CFB1648ABC
+:1031A0001F78AA92AF43366AC4D7AFBF9AA74A180E
+:1031B000AB36F1A4B82609FC39D59B854998D122B4
+:1031C0001DB597BED80816725D21A3D8A70C4DEE89
+:1031D000E149B978B69D499A7A03649869F9B8F1DA
+:1031E000C2F1382F93A96C9909F878DDA7B6B268B7
+:1031F0006DBF92A1593B461B6A83879C43C1AD3189
+:10320000139DA2C2DDD4EE46CBAC0B261049C033D1
+:103210004A6886056295A25FC4CA0CCC46FB8B0245
+:10322000D9A4D719BE59646D953E11E6733BEEC41F
+:103230004472EE8BEB54F8C797E7E47132DBF6A3E8
+:103240005ABD8FB5F2B71B784D3111C7EEF61B7E14
+:10325000E012FD9135C30A0CE3407368CF12794F39
+:103260004B9ABEDA878BD78EEFB5607F7B5C3C765E
+:10327000F5117ADCAC7D90CE421C2177D1B04CA206
+:1032800047655D07BFCFB8A718C770BB3160F3A90A
+:1032900023A98CEC7FF17E99D270EC935671076D67
+:1032A0003D0121E7C8BF16F243045773CD7CBD35FD
+:1032B000A83BF719C44A5D01B3F5207D728B3750E6
+:1032C000C70FFE40FCF991BB179BE21EEDBA1299A5
+:1032D000FEAB8AB776983F3BB48C40314FA23D9C01
+:1032E0004CD251CF9CA0BF3BAB070698E36193A0A3
+:1032F0006A12A80495EB63068DCFB5F0254579C910
+:10330000278A0829E80783E27BBC37F3ADF079AD63
+:103310002CA3154C46F1B5707E8FE180B5F366693C
+:10332000B70D85227DFD7B59F5D02075948FAD8733
+:10333000988A9A4389F04DBF4FF23A1E1D6E1D26A2
+:103340006275C4259E56794FDA7C582E2EA6339787
+:10335000774A8D729A60CBB9554E014930AB490618
+:10336000F02043CE849BB023AB8EC64A1AB3C05E16
+:10337000C1C66FA602152F8211A93DB63F9952FC16
+:103380007E7F9A058EC80F2F0390E086C9E2E8A2DF
+:103390007392437FDD7C73A5929E346CFEA358002C
+:1033A0009183FFA783AF3968E8BB9DCA037CAD4A10
+:1033B0006A0FEF7A7E5DE156A6ADA521A343A7363D
+:1033C000C8202013D999C1D7672F82F5088A6EB01B
+:1033D000A21A9F35A21722D9C4E60CF2BAC41FCA9A
+:1033E000500B2F29D8397F876CEAC8CD6E3038440E
+:1033F000E0FEC1C4D0440988E35058C25A06C265F1
+:103400009DBAF2E063F0D751CBF32F0ABAC7D4E2EA
+:103410008F9E0680C65F81F57A211C3C50474FEE97
+:1034200017A438EDFD0CF19E83809A0FE323994C8D
+:1034300001428BF475CCB0FFA65D6ED2A500661379
+:10344000697D284612E0AD3F639F423E39EC61CD75
+:10345000034FCA3A822108F2BE244E71CDD6C575FB
+:103460007A9A0F954595498E0CD8BDCA1ECA0D157E
+:10347000A6989C2EFBACD6B96BD13644979562DBEF
+:10348000A1BBC2B59502B4E8A8C2C1CA4A3A33D0BA
+:10349000BB41F39D91CBC3063F9D8223AE6D51EEA0
+:1034A00016AA02271B96AC7ACBC12637AACCB54503
+:1034B00078880372C21C85A40604FE4039EC47FDDF
+:1034C000AF963C283FA24FF779AF93350D6AC436CB
+:1034D0004365F1E451EEF134259A291F214295D537
+:1034E000AAB9D9D5E2AE2144D7D7FF2319A5EAA9B5
+:1034F000C04BAB9767FE66EFADB353D65A9F04F847
+:1035000046CC172CBA49A584A8C8FB1472774F6D16
+:1035100064901872EE2FC1907BA36C464D88B8550D
+:1035200043362402957B57FE0C2EE96E7EA8786CFC
+:103530006C3D5D67F601FD1AF736DD9849D68118B6
+:103540009C7D178B29F3B8C32833DF32312DDB1173
+:1035500028FA44D4E1AACD19D8C887E0D1FC1E2DA1
+:1035600099B09C27FD8E4A411BEE3FC5C3AC891123
+:10357000648DC1882F881C1ADCD38A118DD2390E34
+:103580004AED7C5AE0710C4378488F0615D2CBA0E7
+:10359000CBD30D868DFE6E88ED28AF69F9A1937DA2
+:1035A0001667B475550504F883862CA1A89C778B03
+:1035B00031B76522275B1CD35AE5857B78E56DB270
+:1035C000343F418965BDC2465D606A7FDBFD3EB622
+:1035D000B1E14FD30C18F40D131CDB7B90531A0E82
+:1035E000F63076722FA591C0CEB9D223B99719DAE9
+:1035F00021913EC42F0F52037A14C96782114D13D3
+:103600005CE187DB221E99180E5486EBF3C5D2EBE2
+:10361000C1A62CC1F70470D5087C37E5134F6AD4D6
+:10362000BCB926BFC160D6F5B107CA2C0A07116E16
+:103630001D8C9E6220FE1B04FBB2BAACA23A66D976
+:10364000FE51F98319F4AE44C1636F1942970CBB64
+:103650003248F4892C36CD0FE52262BE0FB8C8DCA3
+:103660002455FEFD228F48B85F5E5A41D57D11A2D8
+:103670009F9BD9EE1889D97F91B55A5D5BDA6F347B
+:103680004CD7409842AA842BE2DA1FD297A2EA8450
+:10369000540B6186FBE2575F5EC1E6DC86EDDC4BD6
+:1036A000126E97F6B593CF6303B4E6A44B9B2A7EC4
+:1036B00059142071059912C4ABF2797FA20A1C44F7
+:1036C0007A05170B6CB512B19A1BDC1ECCF6FFD92C
+:1036D000BDE77DE48987B7BF15E32DC19D0BC48D80
+:1036E000B0DF15AE825419AA011904E0D81A266673
+:1036F00055201A75789A9DC2F2C823AA7DACBF45A1
+:103700007339FAC942E567A158998BBC80A6C5AE4A
+:10371000B1BDE00198417E056B0487FF8F3DCF610D
+:10372000D18A8A89D3DCCF16F0EBE17F852C590151
+:10373000295739EF6A5BC6FB40A91A291387E03F76
+:103740005724B7D71CEFC5C6CBED938F194A4061FC
+:10375000BE2BCD14511D65DAB43D0B328904A40D86
+:1037600020D5A4BA10A08FEA5D7A488B67911CBA65
+:1037700034FF33A020E3CF1C3D65D3EC99D18416F0
+:10378000C351893525AE76255E95E2DFB9072783DB
+:103790009482B398F1D24EDA51FC41948C91F67F29
+:1037A0000487F5107D7A976EB4AFB72F04CC15D58A
+:1037B000A793EBF35CF5C9D39763F318D3A974A867
+:1037C00052297776995F2D2371283F80E9308E1931
+:1037D0004C72B42E431F0C662DD4DFDD135CB01E7B
+:1037E0009E1CCA2A176EACC8DB91C9273B0473051F
+:1037F000E7F28DF2CF3238F8C7E5C15A0C9B22BCF4
+:103800009EA0F7A0C88AC43624C17518A29983ABBC
+:1038100097934982F01555308E400B4D1E8B6455A1
+:103820008950C4AA34D87C3A9FB6831A80D6AAF1AC
+:103830005C6E4A41D36E9A59DF1CA362B4437A0A84
+:10384000EBF575752A21177EC6E4913E71292BD2BE
+:1038500071271C40F736249E136D7F55E65367642D
+:10386000EF5573529FBEBCD28368FEE2417354553C
+:103870008DD15B8E6440A5D8DA60F3681DE86C39A1
+:10388000D4E755F3D1998229E62CEE260B0289C99B
+:10389000030858292FC7A152911A4C7F516C6CED27
+:1038A0008832859F9A6B98FA3A4FCFD91D3152D6FC
+:1038B0006F1C094146ED265987B496B97B31AF811B
+:1038C000EED8E7DBF312E8E0EA49E17DFA344A7426
+:1038D0002778AB70E355446E328FCFA570DAB452BF
+:1038E000F2A6A07BBE66ADA12159424C4C181E59D0
+:1038F0004B3A22F676B2E0CA3C0AF073264E842890
+:103900003E336AEA681AC8AD27E8AC1872B99773F3
+:103910004E606FCC824276B2F8530A05E62811B5A4
+:10392000D5DE36A1B52DDC8D72AF44496237DF227A
+:10393000AB07F16EF2FD6A8A72853965F84D500762
+:1039400090433ABFC778666E0E08FED2BD9C410414
+:103950006EC99D63FFBF9B5AC984C293BCF38C5050
+:10396000EBB1736A7EBEA521655EAF6D18B50C77AD
+:10397000302AD96FEA613B15FB1F3B58DD9EC01E04
+:1039800099765AD264A8A1A3AB72E60DC624D36E71
+:10399000EE68A2949D56F3EE7FA4B8B08137A3E8F9
+:1039A00091E1DF0941640EED3EA86064FA6925C427
+:1039B000F70B162B802C6F1F70661B46F338599E31
+:1039C00043D030E655B203AF755301293151375F0B
+:1039D000C72C9F5F7E448D3467E7C10BA084D7E678
+:1039E0000590BF903EAAB16A32F6F9C5BCF2F1B0BB
+:1039F00061BB59BD671DC145DA086AB144ADA56B0D
+:103A0000E8E4663299A3A8BA9FA8C025A409A09D9E
+:103A10008DF601DE5AA3EE6B7C2277AB174BF38B4E
+:103A2000D4CB19026576DA101E801E39BBEEE39006
+:103A3000D0200FB1D171C3637EF30C6F0DD5A915E2
+:103A40001D1C7D5F9D3C0E945DA40728474D1DC243
+:103A5000E2C36C1872005AD40AF9A1ADED3A996E1E
+:103A6000A074C6E5B8008231270DE079B29E2BC163
+:103A7000E17A2B67185F7BB5AD6FF919B48F1B889E
+:103A8000371DA575E5E8BB63ECAFBF334BAE03F65E
+:103A90009D96E2ED5AF5003D4A20A981760BB67954
+:103AA000E0734D47837C6B60B3611252D7985B160D
+:103AB000B58941F45A342C6CEC9D6E04F30F797186
+:103AC00072E0EED0DCCD8A34FFD7C8763724821A74
+:103AD000309CCA33EA262DB7DDADE0F9AD0E5B941C
+:103AE000F99A445E970BD5459CC130A49E8FA443A0
+:103AF000318EBE5C9C1CB72AE3B540E1F5E9BD18E8
+:103B0000CA8BA4795486F393B75F90DB969E61DAF3
+:103B10009EF4DAC71A685D3233D9C619BE323681CF
+:103B2000ECDA6603DB8657C6639FCADC1C0B4CE2EB
+:103B300099A1B5B22C826B12D51BCAC12C9719BBA7
+:103B4000EFC30F70A2D96502955FFEA6BC0F69C4D2
+:103B50003575EA24FF8660F8296571962D4D175654
+:103B6000B6E0A44D5E2626B4E142D1A793DBA6269B
+:103B70002FB24CED8D21A233E863A3E835752A8975
+:103B80009F574CCDF7EF014C38036770C2BD61D22F
+:103B90009902FA9F29281F9E45F486C0FF267D774B
+:103BA00060EF8707C7004AC0996BCA9CD4946D50D8
+:103BB000AEEE40887E93583F24E4CCD0C22D0D94C5
+:103BC0006598BF4D635399037651B076D5A14DD812
+:103BD0006183B400E72E9EE6DF91D46139DB38D9EA
+:103BE0003FF629645F37B7C90E2DB11BA3C48C46BD
+:103BF000FE9D9550DC14ED3D3AB36F088EBB2399C2
+:103C00006AC8A6570B4EA54F4CAD03C5DE97966606
+:103C1000F08CBD786CB5BE6FB1829006692FAA9DFD
+:103C20006E90BD365D8F2BC97792C0DC2B22ADC361
+:103C3000B9A30D5EE638EF688E752EA4591592E58E
+:103C400056BB39282A9CCF04681356570FCC8D9B3E
+:103C5000135A07509E71906C3ABD7F540B658CD1FE
+:103C600041D9908FE212743FDACBC0C76FBFEC30FE
+:103C70003A36F9451635B849B13B937CB20122E595
+:103C800031EFC3B28D9D14A9EBC067DCC333CE20E6
+:103C9000C852227DE51C2FF716478341159C7DC530
+:103CA000765C9A79D51CF59BE3CE9664142921CBDA
+:103CB0005E03D1742F5B6B33BAC653CD183C93F0BF
+:103CC000986EC21F7DE296C0BFF577DA658C7B9B4C
+:103CD000756CE3D65B2165D0D473FA83FD6746A883
+:103CE000BA855B75046EA96F0C675DE0C9643E4FD1
+:103CF000EB1C2C4171A4AD870E4D6A5AAFC933B18C
+:103D0000DFEA45E36B0584D62A1253D259FC73636C
+:103D1000E364547991CB406E34837B4F8F32BE562F
+:103D2000243D7432DAFA3D1255D838FF744397783F
+:103D3000924406EC0EB328FCE8A5888FBC0B8FA339
+:103D40009457E794F91E19262FFA434BC3FA21CE54
+:103D5000B445CFDD7A25F8EE759672EBBABF2F72B7
+:103D6000C2C4D85D63761400FDC34E79EF2E85562C
+:103D700079204B1342A1782018C3BC5434FC4AC9A3
+:103D800085FC24FBCC330BFD9D56782EC3BC446DC3
+:103D900030595226E76878B34AB735D76F89B2826F
+:103DA000BD2870E1CDE312056A0CF84EB116D67F3E
+:103DB000B420A523232762C5A4AF81B59A47A96F74
+:103DC000D4E6F339B159617AA5EF80F26F1B503513
+:103DD000DB6650B9DCD5E2918F98C0B5DCAFD13746
+:103DE000696B3980ACC20B04AAE389A66102763400
+:103DF0007604C8D132B81775CA83B445D230EB8186
+:103E00004F88724691BCC9CA288D1DF73DFADC9FC8
+:103E100096EF6A2FDD536EA6EF7E379F256292F7ED
+:103E2000D84202CCD89DDE85E182453239F68958E8
+:103E3000C584AB21D324C2EB7F459BAEDC6A9AC319
+:103E40007F88DDE9E73E582BF085583C5BB25FA4E4
+:103E50009AE205F6359238C449E635C7D74A5A0A78
+:103E600040BA236D79798C7CC3CC64C9B515EB7FDE
+:103E70004F961865DBC2583ED7DF6FA9BCD05120E2
+:103E8000BC563DFF904E1AA31B605EB35BCFBC8453
+:103E9000EFBC171099D681682DA06A9A6D5CAA872D
+:103EA0002432FDF61AA9FE9739DC56138F9D1A1796
+:103EB00055539C38B7A7286C66826470D825F07C6F
+:103EC000D432F7525BDC39EC0FFE28418EE3078ACF
+:103ED000E454CE4C3724415C4AF02301A0ECD14598
+:103EE000AF1C2EFDA01390C84D058EBF6E55A6AE1B
+:103EF00090DE1F443E6874AFC9BFE0C5F64642F786
+:103F000067A10C4EB26709DF4AAA7F84024DBBAAA3
+:103F1000390050807226679129943298952F05E3D5
+:103F2000AE757492FCE14EF24F0D6FF674F2A6C9B5
+:103F3000E5AA76B0E31044A8378DB2A10720774AEE
+:103F4000C0DB8529AF1828430BBDFB829BB4FBF770
+:103F50006089F101805FCEB3C709EF812A5B48BB5E
+:103F6000AB5671C4D191494D90CD2AB9868A6C4720
+:103F700017BD9113D8B43CF14768646E012E579C6D
+:103F8000230123F8ED8AFDF2A74071FC90EA50C3AB
+:103F900059198996B93B9FFE5E5528BE8C246D71D8
+:103FA000403D338AF7A91DC25B635CA083EE17EF27
+:103FB000579D1124406D4B52C76750E92A66D66F52
+:103FC0003DBA8EAE214CBB1D75891E9CCEFB1F4297
+:103FD0008991AC918E0D71FF60AA292F170106BC43
+:103FE0001D250F52F558581CE190822C95F9693D1A
+:103FF0006EA2B1A4EF55A316A2A1B8BF2F4671C9F6
+:1040000077449FB124C20D7DE2F340C01CE53084AB
+:10401000956C6A02CCD6322A0960A07536B99BB776
+:10402000DBCE99BF11D3D517A172A5761C460671B8
+:1040300086B5AABECE373FB3DE76A3D64B751F88B2
+:104040009BFE5D0940F8F0C5EA99B41A7DC319B228
+:104050007B7DD8FB273BA769C6C1EBF439009B1CCD
+:104060005330F01204B809761ECD04E157FEB6FABB
+:10407000FD87DA3FAED97E06BEDD4B7C8BA573870C
+:104080000CC1E92836298350BB21B77FAF379DD1BA
+:104090003FF514A36EDDEF0483D99FBD10BD82E60A
+:1040A0005B76633DC6B1AC5B17E82CAD4EB11E0725
+:1040B0006C5C2C1F417D7C4F70DD07599E45FE3C9A
+:1040C00093D5AD5C22EAC9EF35A80E05DF46FA9A12
+:1040D0006C5EF7F720564033921CBD2820072F2432
+:1040E000A9AD96F1D7CE14ECEAAF40FF4700E996B0
+:1040F000ED1602A41ADC8D84474070788AD455EFFF
+:10410000089B089649A4E636E3F8F7EF4A0CFD87CA
+:1041100016A58AEFFB3540ECA1FFDA092E6149FEB6
+:1041200061C76D853052350404486C3918C8F6AC47
+:104130003FBEE7C6E5B531EA3A7F16057B35CDBD12
+:10414000C712B76D8C8DD0872A1045EBFE4BC14945
+:104150001047CAD1B2888F333EB05A90B2DDC3BA8D
+:10416000DF18399D6F292D9D23618A27D481E17540
+:104170002FA7E827BF6F9AC48D709C9894706644EF
+:104180004FCC1500C977A5FF88FCDFA02D71EE5438
+:1041900063B61DBCA499939FBAC2E77503294A4D23
+:1041A00065B258D63DA54A1FBDCDB876E3DBBB6FDF
+:1041B00051037742449DCD7C4DD7D0FD316A3AAF53
+:1041C00073E1DA497D91CA155E14E94E833BDAD773
+:1041D000A2336D08F0515010E33D003B8DA29F4982
+:1041E0008C034855CB629A7DFEBA67B39BCA083FE1
+:1041F000356455F2C801A774AA6C2C9BBD25BB4F32
+:104200000C701F4A9349256C44BDA800EB4BF55C2C
+:104210000D1969E6E8633C17A4E112B02CE909CE58
+:104220008A7287D5FB37101A80D97E146A8AB6FF46
+:10423000EFD623FFEA34230FBE97283A38170CF83D
+:10424000F0196A17DFA9EBCACF292FF3566CECB629
+:10425000BD45B8127FC2D4A0142D2746DAE0BD8830
+:1042600093BBAF47980BF6DA585E10B601A15FEF2B
+:10427000240072C1FB90F6A95586C9D4D7E959CA62
+:10428000F9AA03DBAF3BFA69CC04A184B52FAE30A9
+:104290008DFB5392F2CA32B0F25A1D4F9B8F90E4BD
+:1042A000065B5B5C99F149F30D2103892692C6D721
+:1042B000E6B4BA4514E29693B7337F077660A1EE71
+:1042C000CF5C4ECA3508A353D081D3A33DB57B0A3A
+:1042D000A3F753A30DBB6824F2931F2FC28A49C9C9
+:1042E0009476A258F8DE682FA3BB010653EBAB57B8
+:1042F000DB0D359B32A0B525CDF3B82FC2CD36FFEF
+:10430000D5F61792D8F670564F493E56C183D72539
+:1043100005DF7EBD68D70BD5F76348B4C98B5270F3
+:104320000A7E4DFF3532E9B566BF1C9308AE1F25E6
+:1043300018BAF7B9025B7F924439E92F55B0006093
+:10434000E91A18AF78E409432A41485AF03998C16C
+:10435000A70AAD063F5DA2EA8072FC1DA7B7A73988
+:104360001C292E3868C44AABB0A0BF8BD1D3C4552A
+:104370008573D63860636B1251B9E3DC61908DB3FD
+:1043800094D1EF80553C17D2EDD147724458576015
+:1043900084C57A74661A91FFF5E8C8ED115D09AD20
+:1043A000C76FCC670859D57A874C55475B727D0734
+:1043B000F13CA4B4048FBD57093B1D08A73DA96E6D
+:1043C0006E35F4129AA6C78666CA34DF9FCEF05DBA
+:1043D0008A0606429D68F0A52B63BCB37950AF9C5A
+:1043E000B66CF398D3F0F826ABB3832A825F669657
+:1043F0009A8B1A2A92FD7C4C986D9CE4D8EF141F7E
+:104400009DC6866EEC9C877B55CE1304E7113BAFAF
+:10441000A49B8C9DEBBF72790EE01E6F80145BBB7A
+:1044200038B117C266F378671233101BDB44FBF414
+:1044300081BBDA24FA10B88A98869BC0C1B6BCC684
+:10444000D3FCB6A990431A624ED4CC4647DB037521
+:10445000DE80B4644F88691F5D63866283759B1C30
+:10446000DFDBEEFB1033C118E4BB220BD59A6521CC
+:10447000AE7CAFBC502BF621AA68FE4B7D52CEEC31
+:1044800055331EC810E1FA181D4F5B4C00F4DEC70F
+:104490002DED7D7756E2B1B33ABF628C29E0E1E6BB
+:1044A000C1D63BD15A7CD84EBAF6260C553B66276E
+:1044B00079E2D1E8CE5760B6CF998E8968737314CC
+:1044C000D5A48659136DC83342581C34A0C4D1AD4D
+:1044D0004CB3CDCEAD0FF59C4EF40A97C607036AD8
+:1044E0009FEF1FB2F9E18EB046E655EA81F928B890
+:1044F000BCD78A66C47D5924FFD696DA6EE62FD9DA
+:104500001207364EB790AB83AE8F8E6AF08CD6D63C
+:10451000AC1C598ECACD23DFE34E0BC96144A31CEA
+:10452000AC94E0032566347B84DF91FDAAC11DC6EF
+:10453000A825C3A744DE9A6B1E7A6C7C63F6CCCEAA
+:1045400081AB14E72FB40C098055D2286AB742BE5C
+:104550007367731BC79958DB7FAE19B7A0B9531E99
+:1045600084690568BBBA694B9A16FC349A8B93D65A
+:10457000557FB6B132CED1AB21ED4ED9F653F98687
+:1045800057CA3C86CDAF0E8861C1CABA2A2FE54D05
+:104590006D8646ED2DE8BC789F8D45724B35AA554A
+:1045A0008E91B2FA69264448001FEF60B7AB73A141
+:1045B000F0D608C340425557D13487B5C6C67A20D5
+:1045C000084595A0E7574D5A38F705380AC19B5B57
+:1045D00038851B18DA4DBED94F0B0610DD9E817849
+:1045E00033480C1AB25AC13B873FF4287F9B0A47D5
+:1045F0009C6F05D0B3DD2BAB39BE2E1E69EDBF22FB
+:10460000ED80F902A068C247FCCA60F0CCAD93818E
+:10461000471AC63711F9D5BC4C682F302FC434AFB8
+:1046200094129C6D961C4B3BBDC24C3455B950A5A1
+:10463000C19655D010A708F4F20EDA0B1D4AB5DC6E
+:10464000397ADE70D0A5CAC57C909E6192D0A81E32
+:104650001D29749BB13329C1C314D610ACBFD0231C
+:10466000660ADABB47615900F854BBD6FC1266668D
+:104670008A88CB7E591ACC9A7EBDBC28CBAB64BC51
+:104680008D03DA64ACC5501F51C50BA08D6CE0B032
+:10469000179DCCB766E134DE5E9C6F209B3A95385F
+:1046A000B4C0084F473CEE9FF3CFAC3BA2C4778425
+:1046B000533D4A5ABEA43AB4413B137269E25DBC11
+:1046C0006479563201A3E94BBC627ACEC4FF2E9ABC
+:1046D0002F5E0C2A0B70AF8EEA0368E51D1B5DC8C8
+:1046E0001E07E2420AADB459909F766178B057B484
+:1046F000284B9EBB8E50328125849B542BC0FE9C40
+:1047000025160E60E64FD4C6CC76C2C4BBBC131BC4
+:1047100067C071CC12D079C4DC61CDC35E0307DE03
+:1047200002A67FD63C8245546F3EA903D38EB8B013
+:104730007782AAB9D5B71B47E6F77257A65A5D5AD2
+:1047400066EF0CE9F881404E7F36382D82732EC417
+:10475000BF5B396F8D31F6408DF22142D2E73C4884
+:10476000AD8AA9F9C0E15668A09C22DACB38B1091C
+:10477000CC01BAD03AA6FADF1D48360A16642304E3
+:104780007876E4B2FD93E8EDFCDA1C5560F80DA6EE
+:104790009BF19CE8A4249835EB24A28672D55EE7B1
+:1047A000345A2D6047558F4100167FCB0A31F57181
+:1047B000A50E0F65A7F4AB63A1530E6BD4404289DD
+:1047C00058F15A832E62AF182A427B911B50388DC4
+:1047D00065CE05B5F00E40951661318F7C4E86781A
+:1047E000E1EA5856E3CA0AFE2A578DCB7050C89AA0
+:1047F0003AB946C0B8C3ECE83B941447390D29696F
+:104800002D080EFC3F4337B429FF02C4839E3A6B48
+:104810005A8D1A22B73199BE6BCA9C066A90F9A4C8
+:10482000B912D0FDF45E4319C6724CAEAD6A0A49A6
+:10483000286781D0623AB7D4CF211F7BF1BFE2F065
+:104840009FE8D03557AC23A3C9663DB3F41A1032A4
+:10485000A6262DB35107D0920BE303D0874E37A67F
+:1048600084D5A2B33E9FFF8036141B3021E73B4A1C
+:104870006269976E75F8B956D2FD094910982E44B1
+:10488000E2B43748B92E13F1C13200AF74AB9CC00B
+:104890001308641177FFA5DD0C5BA3DAF1899B5641
+:1048A0002CA91B9C16FB914FE1662AA01AE3507AB3
+:1048B000A973770F497C4CBCAE2A2C76D3426DA7E6
+:1048C0008FBEF6F4F2373E0C9FB559830E5BC1B82C
+:1048D0008DE9B83F81EF7145DB9FAC99F891B65CEB
+:1048E000F7447B68C181E817EFECBF928067B5ACF5
+:1048F000A037E254EA940D789B56836BA59A6EB567
+:104900009052875B6D17C494F749F50BFA6648D24D
+:10491000027D0CE415780A049E1381ACB7346D0C4B
+:1049200069DB0E8F6BE41B6919CFE62C9EE179F2EF
+:10493000640F80C78953EEA383E9118639E537C137
+:10494000E310279277D29BABCF333B1D04838F3785
+:10495000D0AF0F8062CA2E864B1C31C66672C9CB9F
+:10496000F4EE6436487D155D815BA327555D003606
+:104970000BD0284B7FEAB4FD306B345A9418BF94A7
+:104980001FBF69137ACFFD246B883CF20E3AB6E361
+:10499000E086BAEAEF4F83EBC68532F414C1B29FCA
+:1049A00013365032CD2783DA40FBF366E789816AFC
+:1049B0002B992EA900CDF0517D78C9CAB0658B0E18
+:1049C000F5DD658FA3D76AF97A508C98722F733012
+:1049D00085B2B8BDBC8E9BE7E270DE61E88C505DAD
+:1049E00085B9666D20C9B9E11D5FDB24FD9C4AC411
+:1049F0005C31C72752B02951CAD33C01CFEBC1D893
+:104A000036D339DCD8E1AA560C2738008E5610CBA5
+:104A1000C8D121882DA5FF44383BD0FE3D3F87FCFF
+:104A2000FD273020784EB1D5CCC7C12AB4216154BE
+:104A3000AB488ED2EB000556CB8B08C20F1A30CA9A
+:104A4000DD109DFE3F461676F6D820DA01DA977221
+:104A5000B890E65B64788BE4BC3DA77AEB3BD786E5
+:104A6000E05DF4B4E0692384225CD9195CC752216B
+:104A700083FC448D7DCF486469DAD36560F9F54ED7
+:104A8000A9D08D766F2C03E7A180DCA872819E9B54
+:104A9000824E5DA80693A1C0BB7A937F7482579023
+:104AA000DF30CECE85A4D30A22940E033F2D5CFACC
+:104AB000F9398225157A66C6F050646941291CDEF1
+:104AC000B3753EDBBE00FB82BADC5466AF4EB0F37A
+:104AD0007E9227F9BEAEDB9837341669B16AB0A56D
+:104AE00025F6FED67B253B6C4E867CC744B18F7085
+:104AF00012FE56B7C35FC92E915B59C1A6FAD8C141
+:104B0000B4A882F7C2F3B86DEFA90A89F63534AFBD
+:104B10007DEE0B9C47F5C49305FC3C3FB087153BED
+:104B2000913F52FBBF7E2C02F36977A0D04A9BB322
+:104B3000F9D81549954A4820A8FC915E1C5658F4AE
+:104B4000B6D7B0EE4CA7878FD27D08DEEA4DCAB942
+:104B5000D71DAF705DD1BB02EDA6E83F6244DE0B0E
+:104B60008DB9B1730D3AF812AC855072DCA5556F52
+:104B70006A129349BA5C83445069A7B53C3E3AEC4B
+:104B8000624A55F97AE4B7EB910B15C89E6123721E
+:104B900061EEE5D3A876D0C589ECAB0594B9CE4BD0
+:104BA000127320AE8467B17DC7800904EDEECCEEB0
+:104BB00039730FA2F61F92C3674FE9C991258F037E
+:104BC0008909DF5C6706912787C617C0FC153A6F15
+:104BD000E4F97BFB405D6939913D8189C3284FBE73
+:104BE000F78446A54AE581FB875C9A2D1A5D49CE7C
+:104BF000C8E96DC050B6EDE6104AFB46D3933E14AB
+:104C0000EEE85981D23C24BD155420673D208CD953
+:104C10007EB8803037649329EB1A5D782EB25EB887
+:104C2000F0F2F0F7F6C683F7C2AD86D2A55CB97391
+:104C30005EE2862E8E7019778E3ADE00DF224ADD24
+:104C40009AEABCFDC2B0E6E30CBE83257AF9C58FB3
+:104C5000A34915C5A166320405A42D55E852F149B2
+:104C60008E6172B328765BA0973C3B3FB69654C7E3
+:104C700031B95864C9FE99559ADFFB6501A90C86C4
+:104C8000294147C98A87E9DC2DEDDB1EC235F16178
+:104C900015CCFC5E40D5B380766499455C1EC1C8D6
+:104CA000982A3E72D8604346E95CA94C99CD4A6384
+:104CB00067E95B71F5E10337059F544DFA46983477
+:104CC00095187952824B5BA8360417A53C9B355446
+:104CD000B7EDB5C612442C8160704804356D327052
+:104CE000D0F187D5AA7917DD70595374422E43FB52
+:104CF000E3ADA1FB0AAA7D0284E06E7322DD5F8F23
+:104D00004BE1A54910E14099F19278350FEC5C92A6
+:104D1000E9E90189F1ADD920CA891563F6B1CE4E12
+:104D2000138308BFBDE4312B440D8548C9590805DC
+:104D30009C55C83FB67330DB9009EBDFEF11059946
+:104D400070226FE52B224E3AFF8702C30A4CBF4008
+:104D500069C355279C3E49BE7EF7C068146AA61FEA
+:104D6000C7396C34EC5BD1C9365BBBF7A285C82E62
+:104D7000E0145DA2B23F159C83170CC6C933C3AEC5
+:104D8000B99A36E36BE9F4958554B744EF63FCCAEE
+:104D9000D4CFE339E1C87E60DA034E13C871780ED0
+:104DA00004D239D84FA3549DB595F8D9B92DBA4B33
+:104DB000C01DCFFBB53ED30D94B00DAFD58A1151B8
+:104DC000A204EC3C61FAA95EF098FCAAE9657C605B
+:104DD0002ABE2C34EC23F006F92AF67CC9F32948C4
+:104DE00058831361EE6D9688B5DCE7B16C1B7C606F
+:104DF0002BE8EF4008906A06DDC0ED57C8CC7C1464
+:104E0000B121178ABA23E5EB11D916E0B8846014F2
+:104E1000A7085696F0FA6A38A342C3F0FFE7D657C0
+:104E200099488794DC2015A67BE33C32D97D0B089A
+:104E30003E0707DFA7DD01B29EA60F524512ACF96F
+:104E40008CD2F6874ED1E5BB7ACC390C6169F0DBA8
+:104E50008E8775B46BB15439D30A27BC04C1D076A0
+:104E60003C47A40DAA900B4E3E3BF4E2AC0688E210
+:104E7000EAD3B0DECD6D61181F7A5BA66C4A3E9115
+:104E80006EB54550E7DD12E86E809E15B533EB2612
+:104E90005C4B28D3C649F785F49E311DD965B38094
+:104EA000E68C6E24E006C2B67453059A1556F4AC2F
+:104EB000FBCE9EB6E9EB85D6DD7FF6BC1689BB1529
+:104EC000E9A40F2788CF6C8A43728375B9B59B6BB1
+:104ED0006B3F6993C7877D62562637AB01637A942F
+:104EE000AF3B581D3BAF5CF0D94A4F8C81AFF93CCA
+:104EF000CD49831ABBDB8FA15735136EEF608561F7
+:104F0000CC9AB325629A46BE26247FF6CCE0C98DA2
+:104F1000B346A450C41F87C0F573E7BA1A3EF847DA
+:104F200036D01AAB8D83FAEC70E0EBA4EBC7F46CCF
+:104F30003C1C3A427EDA66AD8362D222E901D9D3C3
+:104F4000C5B4C1D5B4058F299D91EA6719F54C8286
+:104F5000D54CCFB0DA983A117F4EE484A06E981801
+:104F6000E9E3F41F540860D9A00D376154E322EB44
+:104F7000D974F6C47430BDE6F1FB916E65B18EB3A1
+:104F80006C4FD2A1896C73CF74D44DAC0F9557423E
+:104F90000A96370E5DA56E7CEFCC5CC2FB99A2E44D
+:104FA000E35496DAD269A8CCA8C5B0129257E78B21
+:104FB00003134AAD79EEDF1F602EACD42AAC6E9B92
+:104FC000BD1FDC4E9DD6C3EF1832C40DCFB5923550
+:104FD0004D41EA29DDE9AD9E8ECA9606CA3A266E93
+:104FE000386BFB64DDFC1029651F1012BE2C605C61
+:104FF0001CB712349F7464C983CB443490D5A66324
+:10500000620346E4916D61D2238B02D64EEEE8AD89
+:105010002D94FF13617A67B8679746F07F268D8DD0
+:105020008A481586DF507300EE38191B0813E8AD67
+:105030007686EBC80C8B12C618269CA1E23AC531C5
+:1050400047E70B79107D3D1ACF19FFE407CD0859CA
+:105050005B5D18BB33BFB964FDB6C05F62183ACF61
+:1050600034B829901DD0D8F049D3E37B6159DB4790
+:1050700021CF396471F2C1239CB3966E4A67E91B54
+:105080003656EE336FD27C7DBE7233E6453CEB7A0A
+:105090005C7DD4F2417B02AF24A2B85B041D40C901
+:1050A0000F1AD5D832C65FBCF10331E65F3D9FB61B
+:1050B00009459ED3D783C1B51D92D0D50E1820F0D7
+:1050C00069BB55B5E9D74089AD87F2868BD792C8C1
+:1050D000F928F022347FD8EDCD11895DCECD0EA216
+:1050E000C1A48300CE8F10D2010DA42AABAF4D48CE
+:1050F000B5C6B208880A7FF7E64B01BB0448A81280
+:105100001829876EF284F5BA1725AF484412EAD2FF
+:10511000200B587D02C75CED3D2239EE20C9766E2A
+:1051200073A29212C8CD6DF03210ADA7355DF65A5C
+:1051300097BD639E0D44EC12478A3949E12337033A
+:10514000467461D555043D9E72250CC45DC6D7AB2F
+:105150003C2A33B7F64594A978156F7B7B35E7B4C5
+:1051600083E8F293D38D4983607ACB868CC400F7B1
+:1051700065EAF49B3E2205463B76D6A57C2D9F44EE
+:10518000554281EF739804CC47452DF28358E4FFD4
+:10519000DB8447FC571E3F1B222A5DA0E15CD91728
+:1051A000C66F81941665DCC3028DF74C0BE1DDAB55
+:1051B000D66915D7CCA2A2E033C7DAFB0809DBF524
+:1051C0007CCC49C0C6C9903BCFF3F1DB4FA30E1E88
+:1051D000BB4182CE280D566E0C052B795E662EC41F
+:1051E0009D6D47535DA60D72F8DB8FD2766EB3F9D5
+:1051F000689C6588110E844504FEF0072B98DC122C
+:10520000E8969F10911C5D57F022038893E6DB7DA2
+:1052100052549DB2DAAA9B4E7A3E5C35614523A971
+:105220000AC9D503B7DFC79A7E048028683135BD27
+:10523000E668B9B7E2EAE4F03D17131DFA49281F02
+:105240005D17B9F2C676BEF03067CF1EDA8AE62C5B
+:10525000E67D3EC7CC999242C50FE439C83E23B7DC
+:105260002064D7017874064FDB4032221AA5C43778
+:10527000881558DFE9DE76117F9A28B6C37FF1B131
+:105280002520F6BC5D5EE6D8206F11CA2D7C2F0C60
+:105290004912E9884AAABFC188419EA5BFBC6DFAE0
+:1052A0008953BAF4F109A8EA69D3F1C210ADDD6AF5
+:1052B0001B0E6D5D165EE3864D7EDCC067840DB609
+:1052C0002C7073504E155B29A96B94750364C950FB
+:1052D0000FDCF51825DB808734310DDA8A9E55C244
+:1052E00030D869FD6E064E71911E20B7315238E4F8
+:1052F0009D932189AE1711CD6B86FB490469C7DBED
+:10530000F739D160C43F4761BCEE010F323D723ABC
+:105310007546ED30A6BE35800A82B7710821BA6C99
+:10532000D268A0E331C9953B9442CB8B7EE8BB5653
+:10533000AF0082678B0313B983C04BB7E882E17477
+:105340004999DD50ABF6F45421144C86446BB56892
+:105350004688F3942158E6CF7DDE2027920A88C83C
+:105360007AB879CB9EE658E216E9743182F0EFD034
+:10537000C530C4E77EEF67B5965EDCFCAA47AAFF9E
+:10538000FD4F5847D10891ED216251E720D9A3FF85
+:1053900002782491BFA7507B76FDD86B626230D231
+:1053A000C42557285BA3DFE6947B26E20B62C1711C
+:1053B000047486FCA5AD6EB9810092EF154274A10C
+:1053C0005B388D450DAF3B9E51AF795C573E86B43F
+:1053D0004057D2DB610BC8BF25F115D050B2F702A0
+:1053E000AE64087CB692C695518EF8DF2D932742A5
+:1053F000BFE35A36DFA4ACEAE467F221826C87D8B7
+:10540000208C284FF1266631C7E59717E376A1FD7A
+:105410000460040BB83F6AF8D5E504777EEAA3AAD6
+:10542000FCAA1417C634A8FF933271181BE4E85E77
+:105430004ED23188FC8293973BA29D9091132E1FF0
+:1054400067BEA48F564AB7599413DF5EE52E18E164
+:10545000310F046ED51F2C4BDE761B58BC72A9127F
+:10546000AD36EEDB462B6915C1AEE53317BA4A19E6
+:10547000101163606EA1E02E3122C7CEABF5754AE4
+:105480002EA3F31B173114E92C0D954E421CA2A537
+:105490008972540CFD134EE34476FBED04AC8CE1B1
+:1054A0008FC267F01E9DF7A9D80DA5BE1E10699783
+:1054B000822E9300904E6833CE736C551035594848
+:1054C00092C64BA34E5ADDDC85A4AFEA29FF905269
+:1054D000A888558A36BD6EB3A8DE9E0DF04E2F48C3
+:1054E0007DA89F7D5CCA6B3A953243D6877FC8857D
+:1054F000C98B29BEEB85144FCE72DC9A2431691416
+:105500004F2E8EC9012E8ACC880EFFA96821DD5A44
+:105510001B579ED369611A8A5C668C80F16ED785B1
+:105520003C50DE12155597AF8AD97758E2A2A4A84D
+:1055300063F3E5F255B1868D18287DB9DF2F395513
+:10554000BEEBB80374182FA60BDA6C3478A4FF678F
+:105550004F9FCF7333E41FCC8E3439C4732DBA8C74
+:1055600083C9ABF41DC7BF8433C0E7221424AB7AD0
+:1055700077A384CD629F849A387D6194B6F2687671
+:10558000A0C33990A86E369619F9911938EF9DB1DC
+:10559000408C6241FB353FA76C313AA7B63B888906
+:1055A000B678E61137C6DA4D5F331C731B8C89B6AB
+:1055B0008FB1497348410ED50E134BE1E3B6EF4569
+:1055C000AAB53C8A0BA046F61F9B3733379BCABE51
+:1055D0004BEE8E23F8D60443E893AB110D60A8057B
+:1055E000CFA740BD5AD26311C4AC550275BEC518D1
+:1055F00052E3DA9429B7EDDF0D7603D7A5AACB499C
+:105600001B1F2EB6AED25C528A79978E23134C772D
+:105610000AA9BC44DAD955E0AFAF9CA9AEADB6DC5F
+:10562000448AE9957C964BF7FCA6031D70228137CE
+:10563000BD31C71C36E88D4EFD88F72A1BEBCB9D8C
+:105640009B5AEE5CD5BC4B973F238C86202C3FFBAE
+:105650008BD28991786742DA85F23CA9B479C70C7C
+:1056600059BAB81022851CFEB32C6DE485E790A2D0
+:10567000F23A9A85C9627844C8A6712B3001D5B92F
+:105680004486B49F9C13FBFDC6672F5A1A65BA5B0C
+:105690001793C6BA476D4F882CCBAD047A5DD67C84
+:1056A0007CDEED1FB4E6FDF2E702B9BD1316841DE2
+:1056B000F44D7D0F2816BB30514D0546953A228298
+:1056C0001A76337598F08570A0AF3DCF6904627982
+:1056D000A9D613178B3DDFBE0417FAD03C1C7834D3
+:1056E00028C8712A868CE4B4485F397529CBCB90E1
+:1056F000EC53351298498B04F73A3A142D1DD50F07
+:10570000ACD12610644C4222483041BA429DFD7D06
+:10571000F6E2D90786AEFF246C212CE7C3BEF34026
+:105720000D0989674E36689BDD05735CC870F6DD30
+:10573000A96DD175AED9E1BA95036BFD8D1526FD26
+:105740004822A114F4A35A61C53FBFDFB6F09B08FD
+:10575000291825AF3C20C1CFE370BEDB7BFA1D3E8C
+:10576000840CD83583919A3D83B3BA6979DA0FBA3C
+:10577000A71CFA4277D287607EACDCC75BBAB5FE65
+:10578000335780623275386DA2951A8F7CAD20C276
+:10579000A63CFA83669248529D5DECF02650B31CFD
+:1057A0002B859F16B914E7FFDA6A442FD3AD43085F
+:1057B000ACA36801B85086AE06F1AA68E2EC32F2FA
+:1057C000D3B6B37820E7C4F29D0807F4BC651E8BFE
+:1057D00093023CF6F3DAA1A20FF5B65C5CC3F0C904
+:1057E000B5D041315610757AE359DA0EE5BD384B24
+:1057F000EB268C2EB36BD676C7B28DD34F144202F4
+:10580000DBD3EA0399E224B626E24B1F22341E8B37
+:10581000293BC463DB45A5F8DD016D3A8509EF8BB3
+:10582000DC2BFC35E64BB54D4BDE7A55CE1E0B6BB3
+:10583000F686094A285FC9EEADB78015DAF3310E56
+:10584000474695BE7A8F0B03F1FC8C9434A562DB3E
+:105850003DB48004BBA42A6AB2E439A45D2C2F6E47
+:105860008846A722F5D9E289AE3337D3FEA5C0BD5D
+:10587000E23879E6A07C2B7D52BBFACF31BA26887C
+:105880004F83C4F269239598301C2959299D118BA7
+:10589000492509EFBD688F74D63FF91B15EEE42446
+:1058A000BEE3295FA870DF213E7EA28A54E4ADA248
+:1058B000F9071696821804C92C8B41D9FC90D6E1C1
+:1058C000031FB7520B7C1F961830729A6EE7F69F33
+:1058D000CCFCA09C060C1028AF1401D28F671C07CB
+:1058E0007D28EC9D40D17A8A5C8B070E12026AFFFC
+:1058F000B6F01FB0B2E1AE1FCED4B5E2BF05658DE4
+:10590000A76251C1FB0FA06DE6E890FA282D4B2D40
+:10591000D851C530EC274A4742E9C9F4F6C951E2EB
+:105920004C3780FBEEEB93B9D8DB1896C9DA7FB31E
+:105930005076702E55B1AC5B1C4554B5F361F17EC9
+:1059400076C584CFA136623C33F85C9C479045F81D
+:10595000CEAC1A571E712CF8F4E7DA4D937002178B
+:105960006C1929821AA5FED24147E828A8249E4036
+:10597000087445A20C398795545D7A0ECEA69A7CA0
+:105980003F3ADBCB85EB71A4B543B22B659A43302C
+:10599000D467798A7EBC9EEBF70A3E54FD1C254AEB
+:1059A00004FD7FCB9696AC782C96410A25B1F7D0B2
+:1059B000C1C6092639AA32A39557617FFD177361C5
+:1059C000E2E5E0CAA49AAE454FC0AAE2A2AFB3B8DE
+:1059D0008B0134213234F0555DE7102ACD225681F7
+:1059E000DD79B78568BE186B80ED7D3C667B66F21D
+:1059F000DE6A39CE4F7B28113687AB663AEF20310D
+:105A0000DAD33A257BCA1C48B0EB961F5D5189D08A
+:105A10005A163BE7FF02CF3B005960A64B84465025
+:105A20009A3596D1BAB1C2BE5644F143710941BB11
+:105A3000C5298248492EAA710E52A76599E237EF0F
+:105A40002AB267BCE9EF921648E9E1C4AE99056D48
+:105A500026077F42A7DC4C9B8DE07B7087C53DCF3E
+:105A6000DA4B30E0177DE4D22833AB49404ED03FCB
+:105A7000FEFCC16A88212AD1DFE6EED1B964A71005
+:105A80002EE61F7A826A76F2A95FE87BC1B151A146
+:105A9000784BB7ECA631357E59C101D8BC4920C03E
+:105AA00016CD3E921676DF630ED51FA953E67A1403
+:105AB000FB8CE719E976A6E7B1ED273F16E1F72A57
+:105AC000302366869790B70BE6743F1EC6B489F7FD
+:105AD00065BA9918A5F71FEAEB4EAA9D0FF1ABA581
+:105AE000F3C1EA31EC103725F4E9CDC6275B5ED16E
+:105AF00010C44AABAC32A9983CA209D1CD3B3F2798
+:105B0000818407125927675FCA70EC3D0FD73D6942
+:105B100055BC2EE922CC094506CAEC8089C69E7880
+:105B200087A7E3A323D8EE65F1F506B0591201A0CB
+:105B3000CC21D0D419D91714FEEF103C906E3FD071
+:105B4000CE6FF8F2953FD2B4997D2FFCED7C32ED0B
+:105B50006E482275D5312ABF44A63014029301AE97
+:105B6000BE44D41E3E5CA914C77823ADC534AA2711
+:105B7000B2DD938848B4164F5C0505DC397CB7B5B7
+:105B80006954590227534ED58CD69C00FE4CCFC881
+:105B9000A115FF73535D822F9DDD6FA1C95C7F6BE3
+:105BA000A689B7AF0AC2ABF342B5A33C5D1D8F9F78
+:105BB00008E1E0D72434C6D301867982FDD77CE1A1
+:105BC000389D65C10F3B64D81EABDDD2F18E0180DC
+:105BD000A36B014547E72D0AEF3B738D9BAC31F773
+:105BE0000D50CE4991C55B6C96FF2078E2418864E8
+:105BF000A1EAD34E31388A10F1B28050A1351E91FE
+:105C0000C63845E786D4BCA267C3FDD332D6AEB949
+:105C1000581A25C17550D259C5B89AC3BF506BAB3D
+:105C20002F2FA0143B43E8144708BEB2E36C4D94F9
+:105C30000605A92D9D869B8E82C9491CAFE67E2351
+:105C4000122E5401B30DA7FE14EBEEB3E5945F944E
+:105C50004B013CB314CCFF784A22518B7824BC56BC
+:105C6000E191D0D1B6606BA686788FFFD5F267AD93
+:105C7000824948D3D3E3887C7C443F790D11A2410B
+:105C8000526EE3686077F776751C63544F5F0A9E27
+:105C900066C1D3E39748767652B8F8126D505185B5
+:105CA00017CA6BB57C1D61CCCB43B7D7D1E261532A
+:105CB000215020FD2C6F892AFF1C1FC8693E28BD7A
+:105CC0007AB9685DFBC91096069868EF4D76E3C611
+:105CD0000FA5F38857B41E1A962E0944562EF5D3F5
+:105CE000081FF248FB45DF2DA119267A531025F82D
+:105CF0002396EBDD5D9FB57EF44A5408239CAB50A0
+:105D00006C8D64F259F6BBCEFF6D71D6482355EB0E
+:105D100050A96DB7FD10C14C02C65618EB6A8F0929
+:105D2000CC9FC68B847F3B252C9EDE5680AE5CAA22
+:105D30004A2CE60E885F119D9006932DD1BDDEEFB3
+:105D40004EC05A990F5CB8F00DF56210AE1062DECD
+:105D50000C6A92DA4C02D5175EAD11481849887D5D
+:105D6000375C398DA70BDB2DCF43F1630F1B146C10
+:105D7000E4F9836C5A979766043464BAC3D77CF20B
+:105D80006C95CFC3EFBFAC7E5DE1DFF314EC4AD17D
+:105D9000213534F32787BC304951152F199913C980
+:105DA000F8F095949325CBC55DED262EC003466F84
+:105DB0007172BF1926FB13F2E2FBB92DBEDC6AC477
+:105DC000E12E3260EE22DF8A6E4C1185A6EC81EC6A
+:105DD0007DC53D2679987C437A06F6EE9751A4DD81
+:105DE000E95769B5E3ECF5955E5FD03DF8310FA555
+:105DF00001CE4DA9713016BA3398AF9E58E6119A6C
+:105E0000F4A54A2578DF193633F5A5A4F00EA06A6B
+:105E1000D111DEDBC59C7B8B2A08939C5DBB27419F
+:105E200071F5B600E2D4F96FCE1E7C17A795589392
+:105E30008DD6DFFF0576A2E9B0E2EBEFC4DB1D8073
+:105E40003F8AAE2B3F60C80A86F450999D117C268C
+:105E50004FCC59205058B0B67E739D27B61BA588ED
+:105E6000398E121E22B216CF059C4757AC646108CA
+:105E7000AACCDE3A2A8650B8B7A88FF4066B0596EE
+:105E80003D2BED807750C76D176E5E6C1F19DFD10B
+:105E90007E5041E06039E10C57A030FA341F53F4D2
+:105EA000A34F6B6F777BB754E29E609F771622718A
+:105EB000AD9ADC04BBD6C4C6C4DA77D64D5D810A80
+:105EC0002B18ABDF6DC0A3454AE4707726059BB164
+:105ED0003CC1080A6F698393702F6C53E45F4D7D5A
+:105EE00083DBBC8431269B46C45E8D9E42DE0D75ED
+:105EF0001132511914BA7D1B88D8C1D6BD11F51EB7
+:105F000047D5F9104F79CA2595CD92EA7A888C54F5
+:105F10004B05CB6A37FB27BE68BFB8BA91239D32C9
+:105F20000095109C62FD6C2BE08F74A83AEE51CC6A
+:105F3000E4E9DCCB49BAE4617174306EE831C9FA46
+:105F400062D2E8D986E7016A608B54EE1319E0B695
+:105F5000D442AC28A0C6C0711830CA49A0D0F5916F
+:105F6000ACE9971348E7713FE1BA10F4598D717DA0
+:105F7000D55EE4359F7E8B65C8DAA040B5A159D2C5
+:105F80009EDADB1286C5BDA38DB3BD634FC3191660
+:105F9000CCB9396F0AD89CA5870DA04148AAD5FD78
+:105FA000C6CD6FC645267DB6539162523D1D7473B2
+:105FB000F62FF852EA1BE1201CEAD8CCC33026FEAB
+:105FC0004D15AF31E7656DC7D4797CF01835537C3A
+:105FD0009B0A98A89F65DE55088D4FB8FAC496C2F3
+:105FE0008F696A6E090742F61B81149AA2DD073C8D
+:105FF00026A6B9E3DBE92C570DF66C5849CC0F58AF
+:106000008AF0246CB7DED4422B57B8ADE7DBF2E55B
+:1060100097591108C19FB755A3AF4F860A41EFDAD0
+:106020007D4586D5A5C4B6E60E377FD5D13B7490A5
+:106030005CB8EFBA1F241BEC757F43AF46165BA01C
+:10604000A661F4F49DACEA43372383FBB392CBB350
+:10605000A4F045C541A9F60F2D87A6D5095BB1E48B
+:106060001CA596156C790E2542DCB46EE9D9DEBC10
+:106070003E51FB20C1029D35C788FCA167C49EDB51
+:10608000D1BCF10FA3CD0203B44241F683A96C4009
+:106090007B4A7D1C2E0CFA4D3AA3B1904ABDC60A2C
+:1060A0008DA43F77575B90665F977CBD59C2082EE1
+:1060B0007AE525C52CF0A899907CF8B68214A1F554
+:1060C0003A59A727B0EB2F22E144D5A038B085AECE
+:1060D000F88CBE61E9E99597995BE51E0D028C4845
+:1060E000F97CFC705DC1709B90B06D3EC2407B52EC
+:1060F000497F00128B8B307257232F66AB60038B66
+:1061000016227E30121E63FDFDB5C58C1A86EAC0CC
+:10611000A0F6A5BF344DFFE58F82CB4C6FFFA0E00A
+:106120005D1EC0EAEEE45EB6328F400594C05D8F1E
+:10613000AE7D1A776233B5C50AEE5A8AB570FEEAAB
+:1061400033AC9E4EEC7DF039F432E0F4552BF789F8
+:10615000426D716BACB90378188D9B0D280CA7D3D9
+:1061600064B0E61DDABFA41D7F824D40358F667096
+:106170008EC3BD95406F50524B9426E7755466917F
+:10618000559BD221FECB082370D5C8992334071222
+:1061900057A105B247916A0972961141AFF8B992B9
+:1061A000CE013C728E058EF55ADA070A7AF8EB3783
+:1061B000DCC38E0ABF2E69F47583AF8C1342F3D40F
+:1061C00027F20CCAE50280AE0F25D400B08AFE6E1D
+:1061D0009E98C8BB5FDE7AC1D31611BE00439AE019
+:1061E000F9B7ABD01C032AC6DBFF765F740EC2B2D0
+:1061F000B601DD0C86D78B283E25E2B8DEA8AFE0DD
+:10620000A40483C69C523EA6ECB4170B3D324EBA92
+:10621000339705B0F361F65922789AC66AF3E075B0
+:106220004831480F380178B8866F0FEBBB00C9B012
+:10623000FEB90F40B5D5D0E9C4A1F4AFD13CFCDC28
+:10624000A08E23124E36CA58E5AE9B3637D4D3679C
+:10625000753E660C82AE01AA6901CF4EEA9CE31935
+:1062600050FABFD75085A12761D300F485C448599F
+:10627000921B45E2325223E13213D2D22A27C10EB9
+:1062800094B1DDD221AC1CB1CC95A35318E0D50A52
+:10629000F674EBC4E553B2DA572FC4EAFCE9814740
+:1062A0005F3CCC28E093226D82BE525B7C29459FE7
+:1062B000570190195B115AB7198990B30431765977
+:1062C000880850E4D64B4B572A67CB159CEDF76AEC
+:1062D000A9FE92EFA96550C272A4B70E2C67F4858F
+:1062E000B9FD7173270FA5462158C9B631958ED9CE
+:1062F00042756298E8497FE4495C2FD8B570397AD5
+:106300008BE0E7DA4ABF74CD10703FCDB97F3AD643
+:10631000DFB21A83E2A5EFCFC3624AF736D6BCB02C
+:106320004CB7E58C59174C8F13EE2E3891B6D9EF38
+:10633000894FB69307A4BE3BDCA478A891732F20A5
+:106340006A728C64006AABC165B797FE51C03C01AC
+:106350008F1252C9B66824200513BDEE49B7796B78
+:106360008E0E38C830344C7ADF50E03B9B4D46E20D
+:10637000AA9933C04DB942648E46A7AC2FDB5A7838
+:10638000ED3537EF3FA0965477D88C534C61CAF364
+:10639000B47DF388E4202EE4E24A0F4BF4C6A0FD5E
+:1063A000D48D93E3A3ADECE98E8B03F9DAF72B07D9
+:1063B000C01ABBA9CFB19DF4CC33AC3BE4E33C2E77
+:1063C0009DEC3A4EBBB1C3AA92258C66782037C3A8
+:1063D0006A3764D54B196BE25C0009B7379D0F969D
+:1063E0007CD105C4ACE645BECC2B1149C2E4C8FB48
+:1063F000DD074AA73B365F45D782728C48CD13EF45
+:106400008A316552E549F331F1689A15125FFFDC74
+:106410001CA3304F67FCCB3D095BFFA241A542693D
+:1064200067BA6154554EC373AFEC9812FD41FEE359
+:10643000C3592DCA295F6F75A0436E54921623B6B7
+:106440006D3A416BEABD4CAD35CE03459FEE91F2FE
+:10645000BF8C736BB5E7ED741CA7E1A8D8A09017AB
+:10646000A17FA7BC6B496F2B1538C43064728D5F58
+:1064700021BB224D1EB7297C6D67E19730E017CE16
+:1064800058D15BCAA01385ED896B01E54F05886F74
+:10649000443B3EA8E5B509B104C0FD572FF3AFEB6F
+:1064A000E6ABFC23052822CED8F61555ECC06F6864
+:1064B000CC5D75B345C24D39D5A3492D89A02CB902
+:1064C0004CE5CB29FE29DC39B00B75FBA6CDC5E523
+:1064D00094CF8F52C3A2B6C99A53EB0A2E51662F9E
+:1064E000817108EBEB0B8E873890C26BD5F36CBFD4
+:1064F00049633401E6770997B6CDD07918C791D7AB
+:10650000E5DB6F53A38ECC6DDDA8AD994A25D0EEA7
+:106510006A1B7FF493736587E5F9D2D951946E4F66
+:10652000048992D460B8DD019C9B4BA27C5DAA3BA0
+:10653000B9CBBA3B0308EAB91FC80AB538F3707380
+:10654000655715F40E71542ABC275D3B8EAF9D9A9A
+:10655000B27D9F2D13D511A27CE25FB25C97AE662F
+:10656000BF1F52D5F9CAEBCF9206F0DD0E17BA580D
+:10657000C4052A70A94F31D8FFAF116B47BF067908
+:10658000858D426CE18B89140D1C6AEE0FD74DD2BC
+:10659000C679070E387B84F53C058A1C169C57B0DB
+:1065A000C9A7B93CF8494F90004048D2DE485D5F2A
+:1065B00075D763CEBB8A807D79661F9574752CAFC5
+:1065C000D4C08D79BB9703CDD568389E58FA26E99B
+:1065D000AC0024055561D9D728A0514C204B8E0E14
+:1065E0002DB897F8876B7E48CA22F6AACCDBE6D591
+:1065F00003AF23B915D453A7D7978E34B4029CDFC9
+:10660000CAFA748F65F4147ABFF71D8A457374F65D
+:10661000F9D1F3E3C2554983A8350F81E562F50945
+:10662000AE8DF5C6371CB6FC33899B383337D64C54
+:1066300099E771066C0E261AFF10E379A17B2DCD28
+:10664000A4ED9840BAEAE9480D76C7BF43255169E1
+:106650004125CE0103A93BD8EB2E1F6859B5BFE9F0
+:1066600074AD339F9716695B6584B419800F969853
+:106670004F686E49BDD308C3100053C77DAB93D19B
+:106680002B73D94C1218B7BFF1EED047E27A00B2A3
+:1066900069110D6B647ED4ABDF6AB7F11B48CE3451
+:1066A0003A0731089CA25657EFAFC0D9F5D84BC86E
+:1066B000AFF8C17EEF2AE44EDC1BD94AEA23A511CC
+:1066C000F16D795BC810F3232F70662B603C962A1E
+:1066D0004A21E11E34D1187056AC63C0EF207A6EA7
+:1066E00020B803F5BFBCE87545A754CD9ECCC35B6D
+:1066F00050DD2C19E0D53790615C13F76F47C190DE
+:106700008D5743DBD731D9F175EC39E918CD2E26F9
+:106710008227D4ACA6633A674BF83D6925AFE03ACF
+:1067200012EF052A8FBA46688050715BACBA48896F
+:10673000CD9EDF91EF1E1104DFCE078741CB26806F
+:1067400018C74E3284354467BB493AD8380EB11168
+:10675000E582ABD33EF8C2F49A0EA3722BB57163F7
+:10676000C21A58D6E98D8FB6E457B2DC6678632238
+:10677000D388668436897B29BCC79B1ED72482BAFE
+:1067800025A54317D8300B0105723F35AB8FC2C921
+:1067900038237D99684000305ADCCF0368CA14D58D
+:1067A000C68DCCDE52306FE0724EB80C8BD4DE0D4D
+:1067B00005A000660E6B02C8E7B84EDF73E56211F4
+:1067C000DF68966EACBE84B6B5C608B3666818F5C9
+:1067D000430BDF0280D4FD277681B48F484C897B40
+:1067E000F80C02C404DE6F8E5A6BD9232830C1978F
+:1067F000168CC2DDD1C67BF62E9DA47474815F1CFD
+:106800000BDC17FE0FA65ADA0C4B1FED03A0CB06CC
+:10681000FC5A67E2813C10C87BB33FDC4F4EE2F785
+:10682000FCCA820BC358B57436B77175BEF2ABCCD7
+:106830009FD4715613961EEC50A0742BB3ECB798EE
+:106840006D0335B9F7C264095F95499F18C3E7E244
+:106850003EDEF00F916E08A4BD8B1A7A2C774D8F17
+:10686000D030F85C0D4312C937CB19F42309613DD0
+:1068700023711EE937D7595AC720D6BB32B7932A9E
+:10688000F91B3D21F807FA6D51FB3FE2568FCBFB18
+:10689000AB6125287FA2ADCC678D63826E44AC9F2F
+:1068A00015EA1D5B9B4CA90AC19F8C933D40E96C86
+:1068B000DAE0344CDC074384E9B816F67E8E26779E
+:1068C000A31513DBAAF666DE4C2EF290D840B54530
+:1068D0000AEBA57B2C893083F80333471D8E676252
+:1068E000EDA0C6E54AAD40080C6FF513A82C7CE27C
+:1068F00044EF3BC062F5B6BC94B64146FD285186D4
+:10690000BF60F73E35AB48D1BF8E44FA3A89884C18
+:10691000775C3F6B8E028A7B06335593125C1CB802
+:10692000D85313CC6AE18B4B3E7FB09CB1DFB2CA27
+:10693000343C91DA06085E5EC5B494D9C91ADF51B9
+:106940006B3A8D7542A97022E9E6FC6173CEA01AFC
+:106950002D4EF46EC9C79178A234E401D35DE06294
+:10696000B80A7A2863C462DF1B2A4E71DF764D9223
+:106970005E5A29AA958664902D0022A82D0CE0DB92
+:10698000B45D6EF2E3EA9ECCD0277C93F415E82147
+:106990009ACC355279EF8B0843FB5E0125DFF53B3E
+:1069A000E6AABE05866DD65532A193E7D599664213
+:1069B000EA24EFFCBE1D4A4AEE5B2B64455FEBBA4E
+:1069C00052E8802642857EBB56B58CAD2C18939339
+:1069D000751908310C5513F6CA2570ACC6A093334F
+:1069E000B89E0D405306398F0DD717D55E4594EEEE
+:1069F000B118ED8421FB3DC89C5EB377D6895097D2
+:106A000046F0445ABB027C018B80E4AA6FDA4D0445
+:106A1000797EC359077BE9123372659BDC3E6C4A71
+:106A200027E15351D96B315C8238F862C0987A7D86
+:106A300080915FE5B27217C91EECBB12159A067100
+:106A4000DA6804F69E359276C8EC6FB1790C5D2950
+:106A50002C52A7118549E09F2F6D50CDC28EF2EFC9
+:106A60004E5F11EF9B62B18999447B37E119C228CF
+:106A7000D9105E18D255115EEB158EB5C3864B51F9
+:106A8000189499D539F9A5119FE662E221D7743699
+:106A9000B5A2B2834C59644F03A86CA356C0830BB4
+:106AA000012FCE56066E4A122C2168FEC603E00660
+:106AB000C67B5003E770A914A0105AF617E7E7CF7A
+:106AC000D268D6DDAE797C39C0736FDCBA1F5EA0A8
+:106AD0007E13BEC3C9840C153A286C38B04811A87F
+:106AE0007C10512E3E2627D310B4E24C3188B4D10D
+:106AF00045F1BF8AB5AF62A228832D5139B5419BBC
+:106B0000B434B0D7B3F9B6A3F6E9160F3CAB867729
+:106B1000B9E346C082002D92C6753CD5D68292005C
+:106B200048B8229A7E8710FD2A4F06EEA7A84AF0A1
+:106B30002B9BB202EBB87F136B9A5034513CA448A4
+:106B4000670327332F8FB3A0BA70FA4E1CD36E564B
+:106B5000597F15AED2A16DA972BB32590E7789F15A
+:106B600099DA6A0BB80C52608C38C0984075561B85
+:106B700049E76CBC180188B28C09EF86F3781738A6
+:106B8000EECB8B3A4B14E483B3FD3377650749E5CD
+:106B900080D65DFA95AE3ED0FBE57380E939585951
+:106BA00096B896B37A1A2496873A3AC755B043B93D
+:106BB000BAB30B3229E7BC494881ACA4EF0EC251ED
+:106BC000F77C35BE25FB5E36D5AED40A749FB30F75
+:106BD0006054D89B4B88516068DBC5EE4C70EF5B0E
+:106BE0008A31F95A9336822E1161FC55488ED2F2C1
+:106BF0006BAB7E5C2D73CDB279C92B81FBB484BBAA
+:106C0000A1DEDBFA014039F50C7A90360DBFB738BA
+:106C100029922AC4B7ED871D37F47EC804889A7A72
+:106C2000EF5168E6555A065DEE9A209D9A3E0E8118
+:106C30000020DF6BC6D5FEE102073E00B85B2C0AE0
+:106C4000296B5D773AFC468E944BB06FB98B13C9B4
+:106C5000DF99CADBB609BD2AF8565644E19A38D7FF
+:106C60007F5CDC06A7A0218712259F3D47A91D6DEB
+:106C70007EAD54D282A12C135AD1E846C930DFB37D
+:106C8000166BCEA6A7B10A784204549EB31F56C411
+:106C900057B78105E555B3AE614AF918584105CD9E
+:106CA000E193BB8CAFC1E3E578B8930FE4518284E4
+:106CB000B6F0095534F148FFA03932E8714F91B36D
+:106CC000D3BBCF6536BE808CC44BA2965540A1265F
+:106CD00095E8667D9846D384B974E47B40DFAD07C0
+:106CE0003D6323495B9D82EA8869BC100A126C9B54
+:106CF0006B25A0EBE1B00F09F7B12570B463F67610
+:106D0000F9E4E7C0C723250DB588EF0D2A33EB5012
+:106D10000E39DCA4B000DC16FFFC7F5819876E56D4
+:106D2000BE7E5B624E490EE0ED72C67FDAA2934CE6
+:106D3000331BD18048DE3160AF6A7E4AFA8FDDF4C2
+:106D40002C0CA60772DB383A0D63D317457BBE20A7
+:106D500068C5851552845DA96399CCCDC33651AC05
+:106D60007241F42F198D47D43C740A69389F1B3C3B
+:106D700061511AED0729EDBD334ED3C51716B590F5
+:106D8000F1F1BF48DAE04BE61EB5BA2C1055692F79
+:106D9000009909D6B885F99196E3289967D14C6393
+:106DA00064185C0FA22F57EFC00B32ADA4A0DBC953
+:106DB000484170249CF0EC179A594556760D0F39CE
+:106DC000D2677921483B61E02DA57027821574E7D1
+:106DD000D454B232E2DD9CC073C83AD07B008DE35C
+:106DE000B944FAFC53C2EDDD90C260D04831019144
+:106DF000B2381ADF8EFC3274CC5CD29EEAA2C25446
+:106E0000CB830002CC741F354473921A240BC1CB80
+:106E1000C446944CB20EFBF2466AF4A81A5A917D0D
+:106E200080D48D9BDA1F51A661C5AFF143F4ECC647
+:106E3000AC079010AD6FF8FD6E60E8A9424A2823B8
+:106E40002DBB94CEC9F694F4D5964B043E8363EDE6
+:106E5000F0DBB2EA7C14CFCD4B2C8DEDBB475CB69A
+:106E6000319CE9DAAA35B780E6DB327C33409342C5
+:106E7000B7B6F92FB939E581BFC67ABA048AE854A2
+:106E8000003B0803640F414F2F060B9B86CED4F7BF
+:106E90000381670194697AC9B4F37439822D7C0740
+:106EA000007990A4BD1F2DFA0347194E52E4B5CACC
+:106EB000A932F3FF31C17091EDC848DA3DB1CAC2C1
+:106EC000A14E6466E7D0A99B010633AC5FC1A3F76E
+:106ED000B1E9A6446550A8741BACF93012B7E9A11A
+:106EE000F792602146162FA81A15A8589AAACDD352
+:106EF000120125F051345D634C4A427343159D32B3
+:106F00005B440B70D493DDE08EA2AEAEC5E931C810
+:106F1000E22E53D9572C3BA966D53878DBDA4E7D63
+:106F20005AF05B4F3DE9AC3BED3E6AEC5A91F83FBD
+:106F30008F83A45C59E7BE8EFEAC4CABDD553605A5
+:106F40009554C0F6893D1DB621841CC28A9D74C427
+:106F50001725A8305182A665A96AFA12A733CEA9CF
+:106F6000D31A03144767849B27B9853B62F9C0A4F1
+:106F700064ACFEC2E45BE666DCF48ECBE295B42C36
+:106F80000FC2353FBE78817CB925DEDB7DBDC70CE5
+:106F9000CB0583B6B7352E7DDD82A5019E0EAA4FA7
+:106FA0000A42763687C7649A64FF65E3D732875C06
+:106FB0003B5304C9712E372DE3BE1B3A566F32097D
+:106FC00036B7DCF4903FA24CC0102B7E860966C613
+:106FD000E0C3348A21B75DE9C8662051D162314CE3
+:106FE000907F6AD8C53C9E2B68D8DE78374438F04D
+:106FF00071B4248827B27FC4111E6DC3CF94E68D6F
+:1070000043C3B632DE285B24722F7ACA566E57A766
+:10701000E195EC7CE7938EC846E3D9A0C1AF382652
+:10702000B2A6760368A00DA8BBDFED6E4EFBDBFCBD
+:10703000B8880B51511C084D3AAB9F1C4D27358E1B
+:10704000244BA90EF07AB1BBDC3E416E24828E0047
+:1070500018B6A5C3474DB3235020CCFD48C58FD6E5
+:10706000D1DCBAB33F3E8D7652EECE12415FA265BF
+:107070004D829BA66D8B59D27CF6585C72622F0AAA
+:107080001191E8602BDE1F62D720B8F9921C76CDF3
+:10709000151DD1B4D4C191FA8588846D58B8F7D341
+:1070A00068CDD40C118819FDD3394941467B595913
+:1070B0003A196BF49F9FB9A80239F58A74207E05AE
+:1070C0006455192F8A3CED51C799DD1B3934A998B5
+:1070D000AB07FCAF156C3B7236C9932EC4D31F6847
+:1070E000E390CC953A573262BC42878F56A82D69FF
+:1070F000779FF073250886F8591F311981DC7C2AA7
+:107100003FF223D6BD5026D589373F88ABF119EC25
+:10711000EF194588905E616F4D6F107B7789DE9D1A
+:10712000932090AC2174D40C94A0977E9B4025A111
+:10713000455D8E11827C827641FE3A77C02E2E8587
+:1071400019E7B83A59FFE5C80B26E3AF439171E957
+:1071500088A611F87F29975D32BC80DDC7DCA86462
+:107160007BE0900E9746F7913D933E3886091BBD14
+:10717000D270AC159697CD5BD0940E726EC97DDA45
+:107180007189F042BB50F0AC11FEBFBC21DCD6D7F8
+:1071900062AD7AB9E432D096A5520B88C4252C8909
+:1071A000F7A14BD944778526814DD29828CBE97B2E
+:1071B00076FAE5D4EA187292F2EFDC0A781B83F0D3
+:1071C000F440DB93EFC89199A0FE36672DB9453A9C
+:1071D0003289447854A9B35E7F54AD4CCE8F44CFEE
+:1071E000159515EADB9C3873231FC0F8880B3043D4
+:1071F0000E54FC78FD149C426C764E15F459001424
+:1072000054E9EB01ACBACFC8546E172FC17C07CB41
+:10721000DF99722CAD525E3D627D05BD5726828E90
+:107220004780817FCAFF8BCFFFFD10474CE262E6AB
+:107230000ECAD7F16DBC2322DAC0F425DDAF4D5D57
+:10724000D717038F39771896D74DD59EF5B98B5838
+:10725000836B6F1107A99C169C066F4BF09CDA9EFE
+:1072600097E29F8976D9F7EFB030A5A2730B0BC4D4
+:1072700034EEE359E2D246A9D8B9EDDFC84BE57246
+:1072800031152F3A0B35F137B3B24672F85C292B22
+:1072900062CE0DA62082A0F0F2D848D0EC68501142
+:1072A0004296F4B78029405C16AEE2AA01A2167796
+:1072B000D78978C1CF64F59E6D969896A983952459
+:1072C0007816921A64FA31D35F63405AB83B044887
+:1072D000FA0C4A257DE290680FBE504EAA6ABABFEA
+:1072E000CA327A363860D577F1FB4750BB6C1B2227
+:1072F000C57DCA62D632A42D26B3A5AA00B713C68F
+:10730000BEB351CEB03F48D1AFD65BFDDB552A703E
+:10731000D33BB4315A632FCA57067E361EC4B1A67A
+:1073200030ADD193888DA15F6569973DAACFA0AF9D
+:1073300040A3E55EDEA79B44AAC9535658763C5746
+:107340007E599789359BACB120497387F383A31489
+:10735000372CB4D21BE0D0734F22B6A2E22558538B
+:1073600005916EA5E6B18344AB4457E4CE69FD2D8B
+:10737000B428AA70583821408AB419FB806824D9EF
+:107380001198276465637BFB997E17E4EEA0B66FC6
+:107390008E4F76EA8F355506DD073C3D91B818854E
+:1073A000A56A3A5D479368C5658AA060ADCAF53A9B
+:1073B0008BABB84B7DDEE1E42CF22908B7CD3483EA
+:1073C0004624086C2F7EDD397EAA36F80D34A3E6FC
+:1073D0002F0A8A7CF687BC93A710B4490D06527A0F
+:1073E00039AC24845C90CB04D174119DED029B7365
+:1073F000E33DAD126131694EBCA360BAD0273F9125
+:10740000E706D2E610675B8248844B5A3DBB62D1E7
+:107410001BE5DCA5B40CDEBACE25723327AAD83B17
+:10742000859C714304DD19E269A022A02AC925E0E8
+:10743000F4070DC25116ABD49747CF0845E8CBE40B
+:107440008A033C03E651AC721DC27787FBB8E0BDEE
+:1074500042E87797F2E9D208003ECFFC6211550767
+:107460003DBB35287FB1C450504D997954CB7796A8
+:10747000BEBF7FEBD77744F65863519C666C623C85
+:10748000215E5D5C51D3F64036DFB90E6121B5DE79
+:107490007C1A9499DF39072266E91EB943AD8EDC68
+:1074A000FC85071155442A05A5119FBDE4415B5891
+:1074B0007C9102EDC4AE4AB5378ED10B356E34AB3C
+:1074C000AE37D78E137290F74285E83A5EB8DA94F9
+:1074D000D1B6468BC523FC31B15DC4082A7CC7BE3A
+:1074E000D0F63751B3E8B6B3981FB15895EF4EC1F7
+:1074F000DAF384A59E72D7B4D18E3558FBD1D64627
+:107500005A81A46D5CD15A59C5B8D2375BA91226ED
+:10751000194B9D1113187B2660D1AD8BCFCF12E98B
+:10752000E67E58AF08F7372F8205F45CE095885D5A
+:107530006129EB96D7E4A3EC02507C5D5C17BB9706
+:107540006BD8440675472B6453AA524F616BC1D167
+:10755000FAB3D168873CAF831D1957DD27AB675E4F
+:10756000B2B6C7B61EDFFB7AA03966C63C965A385B
+:10757000F9CE8B80B5C46A0CDAC7C809B066AF64AF
+:10758000077AB4F1479F275C74E13EC576B9DF1CEA
+:107590004A7D41F0FE2658332ECB9DC7ABF87BDDEC
+:1075A0003834F9E375480262E9DE38356B706AC534
+:1075B000DD4C2D4B158005DFE10C27817250E64232
+:1075C000167A043BAE7F47F97D09B831329C8F9221
+:1075D00043EC2AB7E19ADED6ACB028EA421A4D71E4
+:1075E000BE4D7F81705A7682A3C399CABC35AB4722
+:1075F000AFDDEA5F41DA034093ABC031985CDF183E
+:107600001CDD63DB7937C5F598A32CA4CA16FB9D56
+:10761000517478C681C192159758876DC69D620DC9
+:10762000FD82EAF9720FCC3363305EE213C80CAD11
+:10763000CBB3D957FA9BB202FB6195C6DAD6B6AD89
+:1076400014F4C56BB46B46533D895B5771DAD91995
+:107650001ADD641181651E7E735BA5E00765E1CECE
+:10766000FF2E78B3123C6501BB9DCE3B1738A1902D
+:107670007977D5789DDACE6A3D05829644F527F86C
+:107680003CCADEDD0D0344B767691C04B7D6F50BB1
+:107690004FC1E6BB353EED8C76A576FADAEE4D624B
+:1076A000F20240027E98B52648E1A951D091D36BF1
+:1076B0001B302E9CBC3BEAE3E8B0EBDCFF2BBB0BA2
+:1076C0004DB15964BEBD50D9DACDA3F942921AA08A
+:1076D00031087CE984A9E8C2883AD8DBDBD689AADC
+:1076E0004726BBC8866680FAE1371A25BAF21C9491
+:1076F000F476FFB5C6316773EAABCFD5FA65B21F32
+:10770000906AB349469C359ECBEA861C20697B0E65
+:1077100041107A8413B5AA14A7E80C3C4A58EB6AC6
+:1077200014EC0472ADE80797C2E9F3A05EF09DCEB9
+:10773000E818639ED5BF24CF3BED384BD20C5D2AB1
+:10774000109E15C25F9CD842B6E34BA1128A3E7CC4
+:10775000DBCD5F5284532927B519057F1DE0DEAECE
+:107760002DD0A1865DD04E192836BD6F792A2A1BEF
+:1077700047BEF912403E26CF709C3A71C456FCC1F8
+:1077800024B7A0244E753EE8FB8B9B0ED3BC8DB76F
+:107790003394A9394CFC1D9459D9C0B3B0B7FD88B6
+:1077A000575B6502B9EA94BFCF2C74749A03A47A2C
+:1077B0004E391F461B969B0216BF7A8BFB359A8F5C
+:1077C000980D3E1237C60B3ED2B9C7F8B93970E0F2
+:1077D000FE1A920DD820D78E7CEF702304D1CF7D76
+:1077E000EFADA5AFE07240108BB1B65CB3D053A83B
+:1077F0006B32EF267D5D0D185A1681D2D51DD94703
+:10780000A1979E56B497F8E8FAD601D3E3FE9A7B87
+:10781000DA23632739B2F4A4B8C96ACFF32BAFF1E6
+:10782000418D911D4EEFEB38D840D3E3A18F4BDC57
+:10783000F57DA2510ED22E06B62F4CD1471D54D83D
+:1078400093A503794C38F73B81063935A3929665A9
+:10785000F497BEFEFD04327EB0496AD67DEE4E86B8
+:107860003A7D6DD7C57B82AF50D59410B9016F9129
+:107870005BE3617D27BC84A06721FD42EDBA2AFD50
+:1078800035EC04398B70F0021D983F9E067583A875
+:10789000E42E5F2AAF82A24EEEE44BB5CB033F1934
+:1078A0000F2AA78FA4451AD4EC379C4446C8B5EAE2
+:1078B00098347DF226C6BCDAF624358DA4498EDDD7
+:1078C0001489E03B6B5AC7AEE872615CFD0C24ED95
+:1078D0000E6B315DC7643E93C4CE6F00133B667779
+:1078E00059BD01CE8D3628DDD001ACE5B33B09B7DB
+:1078F000F450C2722C61F0270C084817399EF735F6
+:1079000080C066180F0C49E89049E65191F1C4C651
+:107910001903E9612F166767A64C42555A7715037C
+:10792000CC9442E52CCF64B0613A9F0AF47043EFE7
+:10793000912D09F3A7F4F8403693F641B0259FE561
+:10794000F9F1679D14E04287E75A046615EBDCF80D
+:107950008ED41A8C2E0E37EB821C54C8FC6637DA94
+:10796000DBCFA9AA94BC1FAC792F11CB5A1EAA4910
+:10797000AE275E6215ECBD87EB481427C7AD9DD0DE
+:107980006C8D93D2B65297EB96CD9782935918ECA3
+:10799000BFC3C8F4C5AA6072375559732D7AD83160
+:1079A00032F8011DE155191C64CAA60E00757FA6A8
+:1079B0009AC4594A0A3FDC53C3D5DB1DD3B7960C92
+:1079C000BE7C2A1063A8423BABD93EC6CE63A49CC2
+:1079D0000D6A66896587FCA4DAEE0784A2D359088C
+:1079E000FE30CF918F5ED356591ACCD34FE3D5F7E3
+:1079F000D31BB960A87CA5E1C1ABAA1E034EFF361C
+:107A00001DA3FFB9F1BC422D4FA617D3721C541011
+:107A100075743CE69C59F9B4D4CB8F237F64BDEADE
+:107A20002F6C37AF7E5BE0A2D1F5DEDC0352FF5E48
+:107A30004EB6A9C953B16F8465C3D49D46C7F7F448
+:107A4000143B42D381D9C85782862A18C630687B36
+:107A5000A877048C032C005DC42126C11E37C1EF1A
+:107A6000E0275858CA51D6610E59B44A23A658BBCC
+:107A7000A88E18D115DE4F62688687B87F286D46BC
+:107A80007603C265D8E3FED5698BC2849AB3442FCE
+:107A9000FE6E9E9644C8ED325EC79B5F9D33048E9A
+:107AA0009D1ACCAA2FD09BC4510DF5B494B2C243F9
+:107AB000B77CF2EFD224073AB16A26F20D615692F2
+:107AC0009050E451526390CF86ED88E7A15C316C11
+:107AD000179B7772CE945D35762617DC2398ADDD43
+:107AE000A0317DCB45D59FBAC1C84AB31869C20D34
+:107AF00012865863538581CE907B9B4502D71AD45A
+:107B00004150A3BB6C87A792316248BAADE5DF4C08
+:107B100064B8FBF15C75A463D3E0AFDFE7E586EE04
+:107B20009F890EFD1867BB51FAC4941BF7FD4ACE1E
+:107B30005F9688A37697C14A9CA6CA4AD0C7AFBAB7
+:107B4000CBF86C8899597F5FCCD23B319B222DD6E4
+:107B50007A2689C726A428A0F11CF2B2CC69FB9929
+:107B60006AF4E50475911C5002339C2DDE1D8C5087
+:107B7000A80FE88600F648FCF40DF72775CE647A66
+:107B8000103135931FAA2FC88322E7345599BD12AF
+:107B90007D5FCEBF1D43F3119B7278A804247B66E2
+:107BA000FF933E321C826742B7E648CB04AB408667
+:107BB0002F7AB156D80862CF12C4E177B793055B2C
+:107BC000716D4E064869514E6F44675AC07953BC77
+:107BD0000DBB72961C0348F44FE356665D77E07662
+:107BE000FA058052D17C1D6BA9EFCDC7C1DD0E9582
+:107BF0009277D85CD5BA37D567DF749DAE522B1912
+:107C00000F58043B421E2034D1FCE5E01C725203A5
+:107C100075243967CBFAE1B7619DA3D21349692B6B
+:107C200044FE3E760C86BB1332545DD74F58A5AE4A
+:107C3000F42432B7A4AA59BED8AC4D701AB35EA2D0
+:107C4000882719A8AAEE0EC953E7DA6AA632FD41C1
+:107C50002F100779B0A9D8F6E4EFF3188ACAB493C5
+:107C60008D4F9C1F24FD3798AB323CFC39E44DBB53
+:107C7000B09E1AAE4FDE681E1A8BD4E61409800738
+:107C8000B992D161DEC48983F248E2FE0D540F71CE
+:107C9000A8EE87C94ED39EE02BC12E957DD3365FCB
+:107CA000C1B9549E54D829951ABFA5CC164F5EAAC7
+:107CB000BCAE15C989A97020FD35B79A24714D0A4B
+:107CC000C2AB58A00E9CB23683B75114C734D6C489
+:107CD0002C40BA278C2A07328228C5995F546179D3
+:107CE0004FAE045A4C7F8AE8B7A6A088245A693858
+:107CF000BD6C2831A038B86BFFF24A4387D52EEF10
+:107D000056AA434A88D0FD7B583EE11B43B9D5ECC7
+:107D1000DD823FAC77E83A73DB08189501E213B0D7
+:107D20001CD0417D56008A7231F1A21E3A88310A78
+:107D30007ABE78A334A70AF73FA63AC4DFC0BD973E
+:107D4000E7ACBD5C68DDE74EB985F66279BD28E534
+:107D5000769165FBBF229BF7AE71033DFAB8B92758
+:107D60002CD1DCD78030239AB4C248D67124222E7D
+:107D7000FFB22A52500064591028D706E1F4825607
+:107D800003FCFDC7B9354D51F253501D0C819EB314
+:107D9000E85C0FAD35A9DB9601D61CE10BBDC440F4
+:107DA0002AFE6C549A0D7D18B8861258D0A8620726
+:107DB000C2129BF46DCDD784BB4CE2265C012966D0
+:107DC000281D84E63DB11E6F9C684EED373FF220C2
+:107DD000B203A3903CC507998B4C7230E832B6537E
+:107DE0008E769DDF3ADC336199BD0DB8483F5EEB7E
+:107DF0008693E9D1D71CEF579FA73ADDADC465E75D
+:107E000020713AFD061E55B17EFE69C5309B7E236A
+:107E10003AE3E0DB01BF772B2C9EBEA0D32EB0A6A9
+:107E2000CB8F1725B64D1081B8532E2EFA73E44828
+:107E300010DD3616D7A36B12C4E5C09260935DF3D4
+:107E4000AD3A04AFA5207FABBC09871FA5BF8A123E
+:107E5000507112E6BBDC89855E6D0996F565C1ED52
+:107E6000B6764C1E6669ED9DA9A20FFB58AFED6575
+:107E700079A94E917730F8A54556E91FAEE11F5715
+:107E80008E407AA5A09BECC8843B5B18D279E98030
+:107E90003521D37E0B8620AB9CF22B27F822A6003F
+:107EA0000D1C5E5C63D2BB4F1AF8864B3C166C0906
+:107EB0006455B78356DC90022068D05AAE1CDF9E12
+:107EC0005401891825CDED47427BD1B63F9DB2C202
+:107ED00050748035E2773070AD0A96C19E472C57BA
+:107EE0006F1EBDED56F07AAC9B4BDE92CE1086BF76
+:107EF0001BFC5E1546AA0549DB43DFAD78AFFBE20C
+:107F000097210B9E9B2D320D6F29A0F6D65BA37A8D
+:107F1000A05797AB0712BFB829AF65FBEB72E90614
+:107F20006FC4C0251E4073194A824163BE9AFB1874
+:107F3000C3530A54D7DFC66A90292B028AE1E57938
+:107F400092D265C554DFE04473BB3FAC2FB64C2BD7
+:107F5000CF9C7AB06DCC92D0CFD500ECCF6A19CC43
+:107F60007728316ECA1D103BF351C5E54776277D52
+:107F7000F29A58EC43A80B47CE9F2E90E1774B7FA7
+:107F8000CDABCBE5F3BC145163AB8D93CFD256F0A0
+:107F90007E52B2FE423D2B3EEB392E18D8ECEF1646
+:107FA0005D6441DC9D69CD7BF208ECD7B8CEC0138F
+:107FB000E0490578109B269794A53164A994BF1DCC
+:107FC000007B8A45CD1D3AB779BC5FDD0241FF9B3E
+:107FD0006A9EFEA21A3456300ED0BB5881BCB69FA2
+:107FE0007CF33F5385498A5FDB47CC825958ED8843
+:107FF0004BD895716B463F9EF78D5C71ADC2CE72CA
+:108000004F14ED2CB22C66DA93DB9F3B39A918A6EE
+:10801000C7AABF23A53D79DF65C2D7EB15141C5A4B
+:10802000B3852517E28FAE5AF53108DC5026CEB560
+:10803000BFF33C837F5C144279136A88AC9906696C
+:10804000BFA89FE268DDFEE4D8538C8D36C40CDEF9
+:108050009CABC56C1B692CA0F6676BD62697A5B6A2
+:108060003CB5C6127B720BCC55859C782CABD86185
+:108070002A56620FB780DF9EAA40A187EB81FE3BA4
+:108080007F4D90EAE08CE31B9D68738ABE84546741
+:10809000D8087A9FBF37A133C1F7148B8355B73EF9
+:1080A0001FD241F7510C6877E94A2568B0883FA68E
+:1080B0008A67D8C23D43F982147AF7F88FD63351D4
+:1080C000305002F7D3AFFBE79660AC9A0AB4352480
+:1080D0002FC22F62264C94BB29907DCC4B4B457B05
+:1080E000BDF5F80147AB303B0F9576A6A1ED030136
+:1080F000770D5949EA59304990108022AAF5A0809D
+:10810000EB7E8D63DBA665AB984E23989E392AA83B
+:1081100030CA9B1C90FC3DE33B888383B086DC49DE
+:108120006DC0CFF94E52E775793831D0408CC149D6
+:10813000B541C94E2F645AD5D9BDF81ABA42208E1E
+:10814000032338DD9A220DB218ACD95D99CF4FD4F4
+:10815000C4F8F40AC20C6DF2D5E4616C1D418B09C0
+:10816000BCD1784CF39EB00B3709B9F1B1D421B82A
+:108170001AEAE39574FE587CD4C0316B15B0D1EE89
+:1081800064A1B55F759C22BC02C262EAA9D5579D65
+:108190004EB2250EB519B20B381E1FF444E9584EE5
+:1081A0006CD957131F431048C563F9C352D8DA5B23
+:1081B000BDE17F95516F5176A6E82F566E00B2A9AA
+:1081C00042D48132F651406BE12FEF7162490A9738
+:1081D0005B44B57D56B811B7D02E0634650FB95043
+:1081E00049D00A6B26F20E3EF8131B266F4422A4D8
+:1081F000D49EDC9BB5EF451B52B1C5B83E8670607E
+:1082000051449A9708FA740322459C15DD5460D0B6
+:108210003ABBEDB926F806D8E4D8071EE557CEBE1E
+:108220009B305B8A0490940596D87CED2F47950E81
+:1082300025BE8EADB357C2A70BDFE3FF60A18BA3B2
+:10824000E256794199A9009B29FA25A724CCCE9A18
+:108250002A6F84D65E7CE9B5FB8C49FB9417FF1D21
+:10826000C774C33B67A382C51447CA992D2580D81C
+:108270005034227CD16C871DA6A2CA6BD0DC02527E
+:10828000AAEACC17EFE7B1427C9B2432438D0CABBA
+:10829000240CB40A7FA475C60FF01F8D94F7EC0F61
+:1082A000FB4F4A7E8BC7DCAAB6439FF970D0240AE5
+:1082B000121FD1A40BA4D86677198A9EFEACF85879
+:1082C0003134B063D916542E5A54853A6F08947FCE
+:1082D0008C566ADB20141A6BE73F4A5CA1D10B1E57
+:1082E000B5F601931F54F6DD4031220834BFD97B27
+:1082F00006716192C4AB12E38A6D724052E81414A5
+:10830000DD5D525C8394240A27E5394C1D990B0BE3
+:10831000FB8CF1B911F4A4C6F31B2FC57DA1E77343
+:108320009627E034686C72913AB05BFB38F8E7311D
+:10833000E9FE5E7F12DE437392F4ACAEBCA1C06D69
+:10834000FD99BAF61C6EF17229ADC9D64002F92822
+:10835000817CEA71A7A586602C31EC60D683884DBC
+:10836000287C7471D4AF9FA582A021BF5C0B4D996E
+:10837000EE1CFC05495E9A6CE9083F8A5933614658
+:10838000305A3217AAFB4905F7C8D1E4F1865C7B65
+:10839000265C0630985CB5D3D025BCAAFFF9B0B4F2
+:1083A0008771154E194F1675860B36464F910A1672
+:1083B000B1EAD3A18F32C69229BCDC5F57658E6FBC
+:1083C000FDAF78E9182A2B1FAF67F3CB61DC6C9601
+:1083D000ECEEEE83840D1FA5837D71CABDDCA8BFC2
+:1083E000FA7E3F5BEF39624A60735585A98DBF7590
+:1083F000FD61500E7BB1E8FFB0819CA64B6FB79634
+:10840000D80F66888BB884F2BB1B4E5E8B5E9EB223
+:108410009ADE2529930733FBAEA71748023E51A6E3
+:10842000DDED7533A00BFE71E9D19708BA5D16AB8F
+:10843000467C57A27F8718A17DD16D076A08FC444E
+:10844000874E252A0041E5AD0E9C0C4B1E071D19D9
+:1084500022B7A41C1CEA6DC07A021EEEF6A8030D1A
+:108460005AC5D957F0F942BB7A7EB61DC36BAEB67A
+:10847000C88E2713442D495B9ABB08DA21D92DC633
+:108480004271A99BCBD93D495A9023B1F6D3F8BF8D
+:108490009F01D508D5FC83D3DDA1C04D73F77F5D67
+:1084A000BEA7079D531B4BCE825E4EAAE751D2E476
+:1084B000D34D2D340D80FB0DCDC40E74069FC1E14C
+:1084C000A5453D257CF32DA553E0E645F8190D089B
+:1084D000524FFA0BC9C725C736602C95D55F00BB34
+:1084E000E36DDF4EB4A8FBD471F7579826C6109001
+:1084F000497C11DA19FAEDB2A3DBA5B88612C99B43
+:10850000E3AF6C633D53F550E887F20C9BB4BA9D22
+:108510009E8414535E62F64EFAE878E30FA2B66DBD
+:1085200046C77204FEFDB692D110AADDC42635E41A
+:10853000DCB85B65ED9C7DC976CFC6783637EB51EC
+:108540003801BAC90C394D7963A42F507A586E8816
+:1085500006CED9C5CE63441876107B40E7BEEF3116
+:10856000C16793B39CCFC72485D7460F2B46F0A78E
+:1085700002BFAD727AF198ECD4452550E223ED7A32
+:108580009BF2D8B144D72055034D59172B30824365
+:10859000BDF818B7AF9A1F60628C47C56198A630C6
+:1085A0007020B5CC2E6FEA9A28BF7E21F3F22929DC
+:1085B000C06E8AC997A23FC70A792DCF3CA6C30EC9
+:1085C0005CA836CE9BF9BA3F000CE2BA3380974BD9
+:1085D00057CAF3C5D5BA396D92332CC7DBC6616C67
+:1085E000A410CB60ADE9C0270254347BE37380381C
+:1085F0003069C53D48B053269603D541E0E7DA8A95
+:10860000266010118CB1EC7E3FD2EECDF13CDCDF68
+:10861000E95482E6EA07AA5381B51E369BD0FE5282
+:10862000D3FA3BC2C448D97042884AAEDD7920B043
+:10863000F4B86CBBA3577D16782BA1725C681ED66C
+:10864000FBF55EA9050801784D36D884B0D53AEF20
+:1086500046D3F0815AA07CE63C15604B4FF53A4B6F
+:10866000C20A7728A68AE58DA8EC7A1A3CD0CBF10D
+:108670009D6D473519809A45E790768127D4D0CAF9
+:10868000DCF8EBFBD4E573A722FBA2DC0738DC9A0D
+:10869000C7B8A80C09B873509FA6B2E0A4DC941127
+:1086A0009D701F09EF1774CEAB5B15D2872A3CDD96
+:1086B0007435267916908AFA25CB576F09B6743E21
+:1086C0006E07DA1BDC8F5102CE320E3E65537F1FE0
+:1086D0002D46B23208B02B807825B3CF0CA265B0FE
+:1086E0001F0B81561D495C387BA7EC1A676A5561E0
+:1086F000FC7179E1F1B573A000517E1397018DFBF8
+:10870000EDCC6A92CCD9BFE09F5BA65BB886CAFB72
+:10871000DB03BBA613BFE758BF01D5791B73A7CFF7
+:1087200034FAD42709A6212ED11BEE7E2F95B24E06
+:10873000742E51214EB1494705292FD7A4AB2F6084
+:10874000289489BA80AA169CE03CA86D043E9D57E7
+:10875000352FDB37447F5BB17679668D9D6EA01037
+:108760009BDED5E8524AC3FB052CF2E5A7CF853B3B
+:108770002B1AFE16F3DC015D008DEE67488F44383E
+:1087800041BFCE1755D397A7A357C6A7A55A0042F6
+:1087900052B254DC2ED307FC29A00F188B30608115
+:1087A000E383496EF0BAA3994D4B6B02B1FBB587D9
+:1087B0006CEC2E72C9A8456DCA48CD36F7478DB20C
+:1087C000EE43CF38DA121EEF89B623CFC99E7EDF83
+:1087D0009A1222B0E51653469240A88C0E392AF719
+:1087E000C4CA3A7B555AA4BDCE58FE5E7BAF8912EF
+:1087F0009D194DB578AAB8A5B48689700B96A1AF1E
+:10880000AF8DDACBB3F801FE102F856F9188EE2C77
+:10881000416F313B8EA280A685450A78A5C6A8BFC8
+:108820000C9C020B408F12707FD545D41661B6DBCD
+:10883000D13BD10FFD0277C2678E2A3A8AFB62F3E1
+:108840001DAD5605DA62054DCD6464533408DC5A1B
+:108850005ADFEADAE3417B9CB65D9EC3FE8B91DF73
+:10886000AB16EDA479FAFD3DBC378A5927F94D2F97
+:1088700091EE090CB820BE0CBA223040869E8FF8CB
+:108880007877E6664C7882F462F9E0D9FEA1FD05BE
+:10889000EE4DF44AC1C98E08E5E9159CDFF0BDF341
+:1088A000B3781A5FD52F3F2CEF700CF07B931AB57D
+:1088B000A33311F934AB389863D53260EFE8CE7F3B
+:1088C000DCC88BBE0EEB65150DED22C795BDFA8198
+:1088D000A0F54608656163F67BB1E0185018FD9974
+:1088E000AF100394A627D3224EB201A234FA0A7A1B
+:1088F0000B27078AB938401F0B53473612E470B56F
+:10890000D03AA42B04719B2974600BC3510F151B23
+:1089100049EB344E629D39D7E0B8B79C8D028D6C1F
+:10892000A3D4898A25509AC5B92A7CCDE5764572AB
+:1089300048D34109F0849AB24DC1F7899AF4B1BC89
+:108940000924A5B20EB67E9EBBB172AA28E1A6C7C5
+:108950006F5E861837CAE45ECCC4036BAC78B5444E
+:10896000522EDD671C8E55F05B8EE5444CE7EDB969
+:10897000BDC5DF7D3ED33ACC48B735B3EC738843F1
+:108980009A6D84AB3428A34E6AB207485A03702705
+:108990005EEB05A261CD6056A8BD9A290279ABEEC7
+:1089A000F183374F2DC8FA53101012931DDD752334
+:1089B000A7AA1559DEA635E36ED29F023C65D3AC5B
+:1089C000A959C8B8D5E17FC49EEA33EB7313FE49B9
+:1089D00096F34D2E1050BC870B3EA37B92D3A72954
+:1089E000A92493B296E0053951D9426058F3645FE7
+:1089F000D69B5EE783884301882EB94B3D0ED9BDD7
+:108A00004DADC50BC169CEC314B194EACC942E4DC3
+:108A1000468EF33B98991437183FE0A2C61AA3E498
+:108A2000E8D86C8CB155F0C260BECE12B039238844
+:108A300053DA1B41CAB5FCE55F7AD9168354D6CF09
+:108A40002B2FABEC39C9A8F3DB7110BCDB90D5231D
+:108A5000BC0C6897574373A039150EBBD16C70716D
+:108A60004549BE6E8808EB453990CED592D81A6537
+:108A7000036CE44150E51B71D13651C510740F07EA
+:108A8000A582FE5CB46B4A2DD620738E24F57776D2
+:108A9000108FA88A5673EFB231A5377802E87B169B
+:108AA000D948467B767687108600EF2A3BDDDAE9E7
+:108AB0009FA741719F2FB026A988DDD23DE0D2A7A4
+:108AC0000EEB88B51EC87C41F523EE414ABA08ADCD
+:108AD00002E1839FA29F2541F53939C727C3CEBD47
+:108AE0009D438FD70CBE9864CC52DFD4B6285B8FE1
+:108AF000BA3EDEB03C339F45058FF3A2F51072B647
+:108B0000B4234AF2D016FFFE49E28A3BADF6E019E3
+:108B1000ABD725954EEC5D2C0CD3DCD4AF23085F8E
+:108B20003278B66F8F221274E23FD5185730210881
+:108B3000C7DCED1A09F12ACC9DECAEBB55AD37E68A
+:108B40002369B9D35FD96A1480D8AC65CBF6F759DD
+:108B50009285E4875AEB270855CDCC10AC019EB026
+:108B600063159D0AD21A2F511A79D52FC6502DD1CF
+:108B70005B9DE1471C69EBCCE90EDD49E339BA6442
+:108B80008E90E4C4BECB2BE19F825B4F30C39B7BB6
+:108B9000E054A67A274886628B4BA0B1AA86D28C75
+:108BA000A4FF45E52D3568CA7B7ADAE95B997B85B8
+:108BB00080548938DCC9FB4D08280CA659E67C7224
+:108BC000E955BD4FBEAA7E9F26549078111EB5D19F
+:108BD00076350A43F8A15F83C3CC48B576FDEDB87E
+:108BE000EA93FC412EAAA716A32DF56446345B4CEC
+:108BF000E91DAD0AD73D47A4D4812DF99CEADEEEEC
+:108C0000EDCEE4C184C3F9E610E12D49737D8123E3
+:108C10003ED6576BFDE2450D9E26C71F765A6B6BFD
+:108C2000C62647030A28DBFEDA0360E5BFAD7618E7
+:108C300058F9E352B679867B476323EAA75FF10EC2
+:108C400023FFAFFF5D41ED33FB80FCC8505DE810B2
+:108C5000721131CCB8B6B77E05D03B366AE50F3419
+:108C6000F3CD709C90289D771F10FFA107315161B3
+:108C7000FDA7B80D90A442F710B920C7C626C58F2E
+:108C80006409FD9BB1E8A6798E328FEA3D378FA14A
+:108C900052DAE31F9EB0EF4B39F0402E44DD1F380F
+:108CA00054EB6EF97C90F5885EDB0841E49245ACAC
+:108CB0004477A76C4C2CAD5186A0A1F91082663B7D
+:108CC0008FA75FD75FE5F53981B50CD33376C7D36E
+:108CD000F21D9BDB350B66ED8CE3D195B32B470D75
+:108CE00093662043C73300EAB8536BB9682C91BC34
+:108CF000F257F92842245E98E7F01B59F85A289653
+:108D0000FA2635B69ED5CB0E4DEA5B84284F7EAE53
+:108D10000BA0CE560F39FFB6F3E5050B2A149815B4
+:108D2000EB030EEA0E90A66747F0B391F2B8EBDDC5
+:108D3000D8D5019D4CE387E9797BBA9703335694E4
+:108D400096938F512A325EB0D130024F4082927E8C
+:108D5000B3AEBC3A8E41573DDDD781F80F0CB988D0
+:108D6000CB9CB5941C12476866604616C4D4BBAB56
+:108D7000D7641FCB0DFF96EC897BDF2EA950BE1B5D
+:108D8000C0A0AF94DFCD4D32076A863CC71484B6CD
+:108D900028308570BFF2D988189E56AF48C1AF61A0
+:108DA000D7D02514C26973EA72A9A04BC7470A1B22
+:108DB000CA07C2C455DDAEFFD0E7E35BFA5BC24829
+:108DC000693CBBE448C7ECE6CB4E2F6CF26FA3DAEC
+:108DD000C466D6B6BC905B3F117BCF85D2AB5375D2
+:108DE000BDA70678080E55F82C5F8DC7968B3EEB15
+:108DF00062FE0B04C57226AB455A838BE6BD28AFD5
+:108E0000AB9A2C2F577FB404AAB37618DEC155D97C
+:108E1000C9EA4B83525321F2991153381BD4916BF9
+:108E200018A609AA1B1C758A8FC6EE4364926CEBC8
+:108E300021A95C015CAA90DEAB597E431A179425E8
+:108E4000C8FD66355345408EF28EF52CACD0D50F5B
+:108E50006B855F97185CE29D2892832695B0C1D5FB
+:108E60003AE0E57E85FE566526431A111B3111A2B4
+:108E7000F57B2FFD03E1FCD35A0E96B60B6C1CFC60
+:108E8000A37A1AF431FD389AC9C36A56F94791AFEB
+:108E9000F5CDC034398E9579B71A6DAB9056453003
+:108EA000631DEE637DEB9201CEE5CA44658E65FFDE
+:108EB000B7243BDD638F43E47C02F6B4B80A73EC5D
+:108EC000BABCD4021FE9BF01A3D554C98ECE566ED9
+:108ED000CF4B8F8062AF324E81BC7DB33587446DFE
+:108EE000C6FCD1BD0B13C146A37C15CB97EA2082EB
+:108EF000EEB77FE3747EA99E7F55BE9F33A15127B5
+:108F0000B9A0F6EBC06CA0AC2C9688DB65727778C4
+:108F1000516D0ED791795E9CE8339B385BAECC6681
+:108F200096317CEFF165205C205136A727618BE8F4
+:108F3000881A29DD55589DE2DFCFC272BE756F8950
+:108F4000C51E21995AE799592FC5EA12C7B5CDCD4B
+:108F5000319CC2F73538345AB2DBB4A58F0A01BD53
+:108F6000831B89972444B85CF3536B42CDE87CB3F0
+:108F70009FEF4B8070ED5A158972437673D6009E31
+:108F80005CCFDD4494D2348A1A42ADBDA7ACBBC3DA
+:108F900013B41E20494DC917948CDFD70195731760
+:108FA00007BF2D0A2DA55EF97AC1ED984BBACADE2E
+:108FB00068F62E922C70E8AD44D315AE6A422D1C93
+:108FC000C8553685C3B9A30A7DECF84F46626830B0
+:108FD000C4DF43969B307D519D88A005856273C890
+:108FE0002F55EBDF2646F1C8707F1B2A87BBCD03C8
+:108FF0006A9D29EE4573EF46F14A6FEBC3FA84D8B8
+:10900000C627762CC273B1D9BE10EA48FFFEAD9ACE
+:10901000A1664BCAF42E9607B141863E74336F4861
+:10902000E48F0224537BCC9438CC4F0099C47C52FB
+:10903000C23FAE9B2DF3ACE5AA7BF64F5A1429A68E
+:109040009041499A3E754BE71DF0D185481EAD977A
+:109050000A7C881EB1D7FFD02657807B61E3081EAB
+:109060004E9904D355181EB65FB8D4FA914BCDEC87
+:10907000B311C38F73A8C62FB9C5F948AFF4254300
+:10908000529CB5D5E55CBAEC521C2061F4BD13B816
+:10909000B7076C4903970E384723B26CED5DEFF6C6
+:1090A000B670124680DC6AC4DE3BBA0B3645765E8B
+:1090B000B473B500CB12E75D46F8E86C29F0D90F20
+:1090C000E43EEE9C8544E202B7FCA319C49F6B0307
+:1090D000031AA279599ED2F27D1A738539A6B29AE3
+:1090E000319B7B4E96F8E06F35D4DEAE4325278C5E
+:1090F000C2662B899F26DA65F91E61641B1DBA5072
+:109100005762CEC3482C6129A17130C8AE723BA909
+:10911000B8E63FB5C5E9CF5AA894F5D6D6D9571DBC
+:109120005BABD957F656A8A99B39287064C29E94A8
+:109130004C7334AC3D138671F0158C1A720C24EB11
+:109140000357F04B82BBBFB193BC4D43D748992521
+:109150001487C8DDE274EC42EA94C1EAC1C929125D
+:10916000C74B3C04BE39ABEAC5B37AED93418FA43B
+:1091700003C09B65787790529F7F71C98B2B23AE7C
+:10918000CFB00B18F2C1641BAECD92512D295B5E9E
+:1091900066B76830FA6D37F87DC700A4F82B4B5AD4
+:1091A000C5E2156E9C0240B6FC89E1EF8251F3E600
+:1091B000CFE0A6FA6D97872018D4FC8B413F69EF6A
+:1091C0008863B47802D85BD29ADFE6A46061D1C824
+:1091D0006686EC984C62ED4262A00BAC8EDB9C3252
+:1091E000B3FA852F5459C4F2AA79359001CD8D4D2B
+:1091F0006C91F7997473C57FA0AB6831B6477F0057
+:10920000F2E13328242597F3B6867B2C883DC25D96
+:10921000C427BA9A3B56EAE2B970FB53D6D2B1B72B
+:109220001F8412C26F1D513B87DB2674A97FAA657C
+:10923000470A5375E6F599896157D961CC295C4293
+:1092400082EAC7C8A10710280CF6D544A28777D9AF
+:1092500008FF6208D9ACE7888F5AB21D5508C0D004
+:109260003330EBEDF72606CAEF311494B272211FAA
+:1092700012EC0AF3CE13F37D2543E958FADB5C19AF
+:10928000532469326D505DE16E3097F50DD78D57DF
+:10929000D6BBD6C4657C7B4647CEC8663E2C0DDC6B
+:1092A000F82BD819A539CE37A3C6B13C7579140D62
+:1092B000510BA4CFD18C7C03D7960DDF9C814F2F0F
+:1092C0009812D26FDDED286C2E12B9DD3006165DD6
+:1092D000E8CC5215E09E71F1EFEBCCA53761B09D63
+:1092E00097B23FAA251E9B1CBB0E4DE63A76E27450
+:1092F0004D38D3F6015EE9904D9292348C619129FC
+:10930000074B80E4CE7B5053909ECA4B2BE0C1F1BB
+:1093100010E8FB54BB7ACCDE91CEA3BF840810B812
+:109320008F72252319169A0C1342B4187F012460FA
+:10933000B6DC0CF0623FBB9D6A2A494F8BF0D432F9
+:10934000FE7D3607F74C69C24831AEC3940B75A950
+:1093500025E0A3D7583197BBC1B9C2E1E6CEAA49EF
+:10936000DBC49918180572A6A01056998B0DD2402F
+:10937000EE5A0664162CDD4EC76CEA8B09A6213B1B
+:10938000C04DDC4F77AF6643ED6527B8D5947327A2
+:10939000A21DFE2202A29D439CD8607AF5832496EA
+:1093A000F8AF910950F3BEF1543E7B0A1F89358610
+:1093B000C7CC52BA286B72050A02D73DF6DA4521AE
+:1093C0001E34A8CE340CA4ED230004A1221B5FF1AF
+:1093D000441A52FA96FD26F6672B179FC9819652BA
+:1093E000F8B1666C480EF14A65271E47D09E21FAF7
+:1093F000480BACC58305072141ECB2DDD03C62AC23
+:1094000043CBD60FDAAD386EA8B1FFEE3D77689B3F
+:10941000EF51708B7FAF92F3AFBCC013BEDF16C7A6
+:10942000086059F03DEC472D874E8CF9CEEBBA40E1
+:10943000F59EAC5782B92BB4C33606DE5DC3B923A3
+:1094400058804BEE6390DF57C14A751A3716FA679A
+:10945000DD5F7CFA297827D865FA0067915814896E
+:10946000BADA72ABF3C67870A8E06CE30383280E17
+:10947000C12437BF213C82202F15BCE77C75DA94CC
+:109480005EB89DBFCD3D166E9F0144F623E0669CFD
+:10949000B30E7048B81A0F6F2F7C625E5AC4F51A6B
+:1094A000B1F924671B4E3542E6BA8BC39138BDA58E
+:1094B000DA98536A26B020F6A23A389235F0A12104
+:1094C0000EB4A39125968939D4CE7C686336600C9E
+:1094D0002352B80FEE61E24199E975E77558DD2B2B
+:1094E000097D86DB01433CEFECEBF5E2337436B4E7
+:1094F0002AB1D85D2FD102550B6E3849876E2E48A0
+:109500005A8074AEB3F76D17673EBF0AF431BBC023
+:10951000D89914F22169E2F37B63E2F17A50B95CE5
+:10952000ACB505D571865BAE7A7D3BD28CC475C770
+:10953000333E3F029E4EFC13ED9E3B320018708E70
+:109540005FD0BAB5E77E089FA24A76CD9B06BF7A68
+:10955000103080F253EEAA5BF711F4FC9269064BCF
+:10956000C3CCB8DF780463FE91DFD75399F4C39A74
+:109570007BE321B463566288682983D3C527386AA0
+:1095800023CC63BFBDE083F43BFA4D66665D98BBB8
+:10959000E2D814838E0A5F6A4BD6471E8023DB9184
+:1095A0002A1AA9CB66948E603D02DC78D3A6748615
+:1095B000BBD5CD9E90148347C06F2DF87BCA51F95F
+:1095C000E42B5A18C23E5C48C888F88B91C7807F4C
+:1095D000E6405F1AE2A940EBF31922175D76EEEE42
+:1095E0005FA8A90A9B694159FCA56C7E59A5A34EA9
+:1095F0005EAAD1792E86D15F2A1BD5AE51E1DF1D3F
+:109600003D4DE16F780BCC8702819D0F772B788FD2
+:10961000FC2A964EE360A18B53BA120A728BFCAE01
+:10962000A4CD68B2C8A2289FF9506C03944921992F
+:10963000FE2D9EBE1F20E72A915241B28D93218FAD
+:1096400042E5467D72B339FAF103719E9C1F259461
+:10965000CAAD349F7554AC54C1C80242531A5A71F2
+:1096600012F37F077D7997B46E0774D05A671C4553
+:109670005A9717AEC1E47D7E63583319080DA4478D
+:10968000DBB2C6462F547EF15CA66450419A1E861A
+:10969000E88366478C47368A5871666CD83197EBF9
+:1096A000F55A1C7EC8C2011E5D1B141526C8B86180
+:1096B000148257188848E6165588ECF2070951FEBF
+:1096C00012FAA4E12E25092F139554C3D6D1439540
+:1096D0008FDCB37DE9B24BC77B8BC00F46D1E2DB99
+:1096E000DBC4236FD0BF5EBC0F8BC600C12A3B8D8D
+:1096F000D15AB076302544AF6C6B31D64578ACB4D6
+:10970000B2C25EFC083BDFE45A27C42CFF9460958C
+:10971000B4E18AB337641787426404AD7B0F6FA549
+:10972000517941CF5010F767923136F355C05EE161
+:10973000F315F84DB574610A5D0A705F4DD7F456A4
+:1097400036F50CC722D79342D159374265E55E867C
+:10975000CE930952BC13546221B5162B33262F33F6
+:1097600001569E0123673551247A801DD9B0481ACD
+:109770007F0FCB1E2C8D639351043FE65CE8FE8D7A
+:10978000D644DBE34450EFEE1B383122BF9BFD2E65
+:10979000246344C96DF9B1433D83D8CECF71FE1A1D
+:1097A00080C32B252E0AAD01B363C2F183862385C6
+:1097B000CC4C16DD39956A0B49033C7A95C2BC0541
+:1097C0005A5FA6AAF2FEA631D8FEA34DD0C1248EC0
+:1097D000445C6D58C21480E8A6CBA2DA96F1C7515A
+:1097E000FE530A5FAD78B19660A4B523F26F106A9C
+:1097F000EE2759D8621DA93AD45FB6E2A3DDF1E3A2
+:109800007D74AE8D114B97A79941E4185F679CC199
+:109810009D076D0FFA686997C5F9A2EDD7906C5452
+:1098200044AE39AA582DE07975D5C0FE8FBF347C7F
+:10983000C403B9905CB2760BCC3EF4D287923F86DB
+:10984000FFFA2F9BA6DFD4C16AEFFAED82D325275A
+:109850007D16323F11472B3494B7DD6B6E027F28A3
+:109860000A16470BB174F4F254D8A4A867216168B2
+:109870007056442719676B8918B1CA4A5C5676CF6F
+:1098800003A608977D8615820224F0E80B9FF56EEB
+:1098900020CA2AE057479701366E273FF516443114
+:1098A000582BB8B2B3C886275B0A8A2F44CF443EF0
+:1098B00007DA96B91E8ADFE919C524F0E812E044F8
+:1098C0006E708A308A4E615A4FBBE431B244A02A8E
+:1098D000DDA5AEA3782A8A2B2DFDAF7F21DB52D9DF
+:1098E00078A45FFB0BBA066D8365674957308AB869
+:1098F000048C01BDC873DB3B0787CE65383782B562
+:109900002DD1F58A0F4E6BB83305E817FC61F4A131
+:10991000E91302661E84646D15366F31828BBE6258
+:109920005D2DDC95BEC8CFF252C1619031C4B7C97C
+:10993000F3E45BB8B711E538482F6F84E8E55E5A69
+:10994000969622EA807E4043159900F20252C04565
+:10995000FD3C61C6C165BCF125366C9BE0362FC667
+:10996000F9920A03DE99BC42BE85E29CF29598D238
+:1099700039CF07A783A6D83F7FB491F83880CD614F
+:10998000883E2F86AACD5BA6DADCBAE723EA76EC1E
+:10999000438B1262B497D2581628D1DB59304878DD
+:1099A000EF91A21A6DFFC71E2691CFB7D706D24AF4
+:1099B0004C7C1095C407A20D94496334BFAD0AF2E4
+:1099C00067EC6C94EBF8199BD945C8F08C33B4C79D
+:1099D0007CF4B9F8B32CB5CC2F778E01B612A64320
+:1099E0005A91C5F5D53AF3BADD3159A07ED1AD1DF6
+:1099F00013A57EBA15B5F81D4AE3716DA47E5128F2
+:109A0000CC8E6862D7F8A217B59B13B1D1050000C0
+:109A10005EA26B90C9C6B1E47FC892310FB674E004
+:109A200044ED2981C921ECBE2E8B9AE9F528035417
+:109A30003E8896A71F861F3B62BCCAA5D905DAD00F
+:109A4000BC797277BA9996B70828444B0B20C09F0F
+:109A5000A209CF46D76B31B3D309D9164214451F9B
+:109A6000A40AAEB093F45F4C744B7D469198267176
+:109A70009480165AE4086DD12726B72921179A3603
+:109A8000E41CB6077E7BC89D3DA15CCD28D6335033
+:109A900023F7AEDE342FD8C7B42501DB2BE05F33CC
+:109AA000E1306C1DB399314CC04F49AE7C9419A87C
+:109AB000C7B2638850AA694AB82E1D3764A41DD165
+:109AC00027BB4156DF270848F07357A2E717FEE986
+:109AD00051F71DA35D9153CA5AEE5BF4BA1B799DF1
+:109AE000E8C244E51316AB539EE6209056D263FBC2
+:109AF0001C1EAEF9F63722FE14E702A079AAB03E8A
+:109B0000131CBAD4D30415442D451352B15CF7028B
+:109B1000EECE24F85215C8D032DA962BCB2F8664BD
+:109B20001B1D3F926599D34D22E71A83319A89799B
+:109B30003359360CCD96F774CDF46470653E284FDA
+:109B40004653352A1E78B4DA52BE67067FE2C275E4
+:109B5000F71CF06B71AC3328018C54BD4BC90569FF
+:109B6000CA0692769F86A156AFE27647BAB76627B5
+:109B700073FB17490C2E2137D05DD076A58C40B5EC
+:109B80004501106B1B7EB1C27B54A5AB8DBAF9CADF
+:109B90002E8E97A2138CD273F0A21A7B3D68E80137
+:109BA00091EA0BDF13C1F95E8DCBB089966E139CE1
+:109BB000A8950A7FD2BF3BE26EE6670613FE7ED30E
+:109BC000B228A2A106FFFFA844736F83A31889AD32
+:109BD000FD90F35EF7AFF22F70260521D5E3F63D39
+:109BE0007CBE89F460FCDBFE350895091B8118DE1C
+:109BF000FCBDC2A9AF3A19F55DB616A46264CF499F
+:109C00009A615A3446A0D709EAB39A1DDACFC882BE
+:109C10008EA494473F87ED82893D1F375CACB81214
+:109C200037014F0781AF63DCDAE54CB04EE2E391D8
+:109C30004F2090B104D461AA574B9F39E444C8BD6A
+:109C4000611A994CCC07AE85121FCBB4F0D482B800
+:109C500035B129106EB0040513967EBE331A8810F4
+:109C6000686FDD781BFDFA764DED5C68AD461D8CA6
+:109C70003495F8CCB131F4B42CCAE90BD195ABF9D9
+:109C8000BA130115EAFEF77AAC61AFC88E9BC41A0D
+:109C900053A4A3203C4816583663B213EC365C1A22
+:109CA000C9F5F2739468337A5F23DEC9BC739751A8
+:109CB0003D0616D2DF88F06D2095B645E451706BF5
+:109CC000570F70858D1C06AEB044A50A833180A560
+:109CD000F3AB2A4B204D00DCBC076FF280030A92E5
+:109CE0004D5D4E6EE224DA5CD4CF807714F40E28FA
+:109CF000D1D432982500C2D38547A471AD8EB24E1F
+:109D0000EE0F0630AEE6BF1DC6A9BC678D9DE96F9C
+:109D100011E57A242DE3CD872CFE2FE1EB02627D45
+:109D20008651B375077DBA23649FD2C69E420FAC9D
+:109D3000284114AC3B649A41AAB5355CFEB11B7650
+:109D40008A051FCE2CCE43C4EF31191F590871E28A
+:109D5000C39A2C70F23BD6BC7C0FCB83508EA8C725
+:109D6000ABD160B9482AE5422A6BE7A69A0AC961D5
+:109D70003F6D942282127FFC2EE479E3A72983575A
+:109D80002A75AAD134646A65A3B587A9EC5FA528B2
+:109D9000B74172ADA209B8835A473A298CCE78DC14
+:109DA0002835ABBD47703C1AD379D1956A1F2E6C0C
+:109DB000909F489A77888AC2305601457EE34AEFE1
+:109DC000061609045174F9C38329507C79E0603781
+:109DD000AA7624E545AE73650C919A92564551B129
+:109DE00051C1E9EF7CF4B755C44680CE314DB16A1C
+:109DF0001ED84FB9DADF5EA3F9115B35C468B28AA9
+:109E0000E954D0334E2B94EEE0604F32D619D71878
+:109E10001D87870580D9A5663C9C98A8C9C2E60D18
+:109E200099A0314E5B1890ECE666827B0F58F3CB1D
+:109E3000BC557359437BE16E31927D0A5C7824F8FE
+:109E4000B96C6912D358A32F9A8C7D8132FEE23C03
+:109E50008E5275CF28C999CCC8FE2D9098B620F7A0
+:109E6000E3AFBC2C6499E3A643F62A0465D6E1B6B9
+:109E7000AE9987977708C50FE656C12E33C0BE55F9
+:109E80001C1DF42EAC1F523044F6FEAB60F0CF83A5
+:109E9000E1E8DE1014C35B08E7F1567449A41F82A1
+:109EA00013B2FC96C2127DBC598B4146E0A822EA4F
+:109EB0002F8A70DD1676452FA562C35ACEA400B650
+:109EC0004A2A120087D67F937629DBFB7D7DA9F590
+:109ED000DC67CBCF45C0CD4D58C66E74381FA4DEAD
+:109EE000E1060421A9B7AD15BD7C8FB5F0C0320CD9
+:109EF000801315E4140E6E70825E43F69BC4409D81
+:109F0000524670B652D014DA48B1DA1047F58D21B6
+:109F10005B34D3919180B64FA92A22F5846ADA0680
+:109F20004B02A19C9D5EAB49986D2E14C0E45C2B46
+:109F30009CA20ECBB9BA5AD20D087F7FE90A3082B3
+:109F4000C6DF3C9EA65F5870653E46D066A12D6771
+:109F500033957D0E683425AD6B366F93FE3579B73A
+:109F6000FD58C306759782DF55CD0FB545243B3F9D
+:109F7000AF42341438FA304EFA8785BA9BAEAB80C4
+:109F800020238CB3CF15DAA47355AA77E2B9B0F6C3
+:109F9000B458DA587FC720B3B7B390E72464F549C3
+:109FA000C8FEE87392CC5D42E9EEE255A79D8CA70E
+:109FB000463F38857508E1600CDCD78C5074420749
+:109FC0004E76D24AA080F87E044A6289AC4A481292
+:109FD00084821CEA78939E78170AE344EC985E1D0D
+:109FE000A25594387E19CD90CBED35658F2956AAB0
+:109FF000E754A60D127902B2057F4E5EBF0BDE2834
+:10A00000543A3873D1A46EE0D937445C6F83935FC0
+:10A01000F33CAA9FC671620BE9532C7005BCEA4F52
+:10A02000E92B3417BFB95C1BBE87839DEC7EEAEE3B
+:10A030005ED853E02E66F08DE772CFF7342C1B0606
+:10A040001C05423E4AE21E91A0359C328BCCC9DAF7
+:10A050005B15A18C41D6D72D1C056606C96FC3536D
+:10A06000CB93D6EA73033B97A7A0E1C7F1FF64C384
+:10A070008103BDF1A042600938BCC531E75BB41073
+:10A08000B59851DAA1B9224694F919FC5B62E4FF54
+:10A09000FAF5F3D49F62F8B5485CB56DA75ACAF3D8
+:10A0A00055B40B38555C9218F8C892F30A2FA84C97
+:10A0B000FDC019E76BED403D7AB82337FB014AFE3E
+:10A0C00071431B232F4D5691D86EFFBCF05B98084F
+:10A0D000872A538A03BFEE27BD63D1D49FE3F8F5E7
+:10A0E0003C31F39F19FBAF5C92F239CD2C8AD5A499
+:10A0F0005E879B80E16336F5C895AA6432B0792DFE
+:10A100000264CF81D4C8B2B4D26896F1BBE1FBCE71
+:10A11000D2830AEEF0A68AABD982E80987FC7630B2
+:10A12000E2BAD6ABBA43DA2D08E57E646C461A185B
+:10A130009A737A1C09E940698372B64BA1FFBA7B16
+:10A140007532FE07BDE883AB823087C7075F143BDB
+:10A1500094B62CCC96E98F6BDA0701AF3144298B8A
+:10A16000D5C8646160F5A86AF3B61B75BDFAB1176E
+:10A17000DF2D8B5946DF66566976D6C5A089869D48
+:10A180001449509465ACDE73D429C13453D0E975B9
+:10A1900064A0669E2E18ED10C18CDB6658BCD9A356
+:10A1A000E5250B9ED4A2EAD0F1F1983275E9249806
+:10A1B00020D7E5FBD5B42F5CA37935810357DF2089
+:10A1C000630C2910AFFA5F37BFBD93B98267830470
+:10A1D0004ABFB9AB8E7AE2F84E5579EEDC78144B73
+:10A1E0007C8C13BA4A05AA4C0C1540FBEB527ED767
+:10A1F000ED2909A95B6D24E7696F318C57D231E7EE
+:10A200004BD8D764A9B536DD4AC1546226978EE093
+:10A21000DF2C0D7D255FDEF667063B1C39656F641C
+:10A22000EED8FC5A7C0F8C278E0C36AA349320B0C3
+:10A23000C2E8048A2EFAB5B51DF6F7880EC0D3DE43
+:10A24000D7512402F1237814F6A6723B62FA4AF63B
+:10A25000F810704C6D6E5F906427570CA2FCB252E0
+:10A2600025E0237003CD86882220CE1DAE38EC4C2D
+:10A270009235DD8C97C95C8C780C219CD0BAF0A308
+:10A28000C424D3F15AC3AE4E653E205A86625AC8E2
+:10A29000AAADBB44EDC4D12613A792A053C6B6D530
+:10A2A00008D3A9F4C4A6E4E7FD4260051FCF999046
+:10A2B00086D2CD0BA86D1868343F43077F781F9C6A
+:10A2C0005355ABFD25CEDA37B9E53FC5A23D1D5A42
+:10A2D000671E8AAD13354ABB9DF484213857942BF1
+:10A2E00040FEABAFEAAB189CEC09191DFAE31FC2A4
+:10A2F000C09AD8B2DE0C6F029803FEAAE95B6535FE
+:10A30000B7082F82769E5295C4B12F02F76DCC9478
+:10A31000E14ACE4F2B00F5C497200567742E06EB5B
+:10A3200080E96098C8596DE8497F48A296E6F5C76C
+:10A33000B494B086D885B5F4D3E7503FFE4FA6FC61
+:10A34000BA67E7ECBDCFFADDE41F405548191D3B65
+:10A35000E92AEB4251DA42BBB698700805AC72C5E7
+:10A36000A88E68EF67566EA53E6B022531CC909A99
+:10A370005B49E5FADF7D63F853122DC6FE2F6B8033
+:10A38000A7B7A421D69B87548CA37CBF9AFA0C5EF6
+:10A390001FC208F046DF5882EBBBDCCC9803E98F84
+:10A3A0007DC8B9906CB52E69C8DCBD5833160F4511
+:10A3B00053ED98B86D4249D9C8B9BA4BDA135083F6
+:10A3C0001C99382F89FD21D707237A3D009BD4148F
+:10A3D0003597F8C5E166666ECA5D9F7B0DD7F85567
+:10A3E00020002D63024F95A1F9FB3F38DC5C962FCE
+:10A3F000A02E95C425DE88ACC973D3D2ADCD8361C0
+:10A4000025624F219A1F3EDDA5154B2CB4902CDF01
+:10A410007D596D7A693C41D976B06C2EEA4144DAB7
+:10A42000659B748DAE07D0082D860053188C9C3E1A
+:10A43000B9AFA1EFD97602925ECE2648F968AC4159
+:10A44000B1BD94FB19F3DCE2A6CB8F97D96D4F24F5
+:10A450008C40581295D5FD729D1D38E2767E81F2B2
+:10A46000932FECAEE1FD35651FD235AA3C05E00E19
+:10A4700065605AA261E9197EFB7F28039603689FF5
+:10A4800098ED3F143A83F6B62E49BFC07F0EB1ABAC
+:10A490003C36B545E707EE456A14740DCBD1572914
+:10A4A000C3364848F9C6E376D25C0E7534EEF8D16F
+:10A4B000126E3E7A3E740A14F1EB4D0BC043109CB1
+:10A4C0007201068ADD7755593B057A3145E80D8DD5
+:10A4D000EEAD94DDD31561695BA1FB426A83DD2D8E
+:10A4E000A090A33437C1C5332738B2B0BBA2A2585D
+:10A4F00046E141A99FFA0B4B2503243FF80323793A
+:10A5000068762FB39F2DCD29C5B3142FCE24C193C8
+:10A51000ADA1485F29E27AC6C34422C4CE0CF4221E
+:10A52000C1E7C9CA8F5BAE7B49850DC7DF01DC5D22
+:10A530009134E384E06C7A669AE5F54E6230DA8015
+:10A54000365D871BAD808A9F32CD699E02A5E1A84A
+:10A5500034B1E0D44A853E048BA1A07F7A01E5D1D5
+:10A56000C33049EBA07606F2D7A9F06DAA368CFE6F
+:10A57000C97A3A21FF9BAA702BC0EEAE3C8347916B
+:10A58000C6232802991CD015930A7D896A636BC77C
+:10A590004FF91D1FD1B4360588592940BE4F48E0F8
+:10A5A000B1C296CC2973B9D95BC65AA7FE68E15EE1
+:10A5B000C98F1C783C3121FFB979F2832315AC98FF
+:10A5C00055F7C041C887C43D674356EF5FA1B81037
+:10A5D0004CD8FB97E5DCDA1E6F51D683E2158D1F50
+:10A5E00025496253DBF823F21A395BDA8153B0480C
+:10A5F0004512453AC1E2A794F1DB06C6033E2D5F42
+:10A60000141569F521EC0E8E2F51BB4E208A09AF2F
+:10A610002A0B5C411B9FC036DAEA291BF33798A945
+:10A620009987FB6A6906D898E573A51C8A1D22D90B
+:10A63000FC99B79C83A3764DD85A2FABC9B102A51C
+:10A640004AFCDB807E06A105D4C29FC3D9D0D46862
+:10A650008ECF6AE9666F9ED0B3BAF5B7DD55EF0EBF
+:10A660001B64D77FC4688B7F813EB2775DEE3CAEC2
+:10A67000A22731D55730FE6A54DEDCF3FD677CBC7F
+:10A68000997D3015255E2A021983A1B3D7BB853881
+:10A690002586FF66F631AD007800668F10F04060C9
+:10A6A0008540EEC4D3EF21952494CF877E8393F227
+:10A6B0001E5AC7948441C50F4F80EA549DB631415C
+:10A6C000F5C2FDD7FAD9745844FE04B7EE2C98B3FE
+:10A6D0000D288380A89439BD4ECC56D9BC6FFCC1DF
+:10A6E0005062A42A8AA52622B06B85889ED57571F2
+:10A6F0007459B93106115ACC37D22C44ECCFB84436
+:10A70000435F70E2DD07B9283CB3BE773373B5A968
+:10A71000E58DBAE963AB2366A5656E32A6BE166603
+:10A72000C2BA7D25ECBC9F5DBAB47E815E333FE149
+:10A73000A1D7DE87FACCBC583CD3D15CC602937655
+:10A74000D5326256BAC3125A2174D765D0481BC598
+:10A7500058C9BB1094EEC9A861F02358D776B9F058
+:10A7600043DDF56BC10CF47F4FD97C2609A33A0277
+:10A77000430F35040BFBA98EF185E9CD260154E08A
+:10A78000DBFEDDA9605150FBB87AB0AAAE520CDEF8
+:10A7900023D9A50830BD8F475C16ADE3BA4D04112F
+:10A7A0008991E3C4A02475AEF05D2953C3144CDE37
+:10A7B00041E2A9C1589FE3324A7A573E749BEDF1BA
+:10A7C000E4CCB8DB7FFC0CA1DE8A3D0E17CEE8029C
+:10A7D000DCE8A2B0FE0A886E69555F043BC8CADF98
+:10A7E000BB8B7C4B9DCA28CB1A51DED79C99A61EE9
+:10A7F0003AFA405AEFFD8A88F9C00EFD3A6EDCF550
+:10A800008A8A1F9086A634E133425A9F6420A98326
+:10A81000B43B4DFFC4D206E34100E959DC1FBE142E
+:10A820000F70B62D6F03F7FC9DC2304E1FB5F79821
+:10A830000436DDB3A0BD966CDF5176033DA49BD7F3
+:10A840000A4E46E0CCC4EC971454AB8443689E4453
+:10A8500002A0466159F44EBFD89D0CBE5AA4D576CD
+:10A8600005121917772AAAE425DEFF638C0302B6C6
+:10A87000B5D47FCF52252A82D203A7372B22537714
+:10A8800083DCAA0E6F8561A791544F0CB6FF904DE3
+:10A89000754071BBDF635C45AABB7539D65EADBA46
+:10A8A00088302076DA4A94A81E96464104F6AB1CFE
+:10A8B0002D8EC1183A6BFF58E3A2318D0992CBD08F
+:10A8C0001E98729E129A398E48D6C8990A031A1792
+:10A8D0000AEEB3338414694456D0CFFCDB1B5C6FA3
+:10A8E0008D4251A5C1E1155A638E28984808D29629
+:10A8F000DB9F3618A2082637048346CDFA5E211E58
+:10A90000441F18823123A4B4EA269E78A2486B61C2
+:10A91000654D7C3D17BB9E2B2F335AE7686A790E35
+:10A9200063C735FACABA82638CBA2587ABFE670360
+:10A93000C0299ADC2EDD0325934378FE67EF5E1F66
+:10A94000A23B3201BE79196A0697651455EE3ED3D3
+:10A9500050D40875505190DB7A981C45F7C59BE69A
+:10A96000008AE6F31A12E67FBA90762AE7AD8C1CCD
+:10A97000E023179994C6CB2D2DE34F041D7C917ACB
+:10A980009379AB703EFBE85239107C6D62DB3BD9AA
+:10A99000E19BE53F755C4614C8E03942751653B833
+:10A9A0005519BFAC4771F77C57A441F4FBFAB94184
+:10A9B000081ED9F2CC282E58627A8B9AF33A2F824D
+:10A9C0008D8AFED2513DBC33489C84E388427F1B74
+:10A9D0004C6472EAA1AB7625540CEADEE33BB0CEC0
+:10A9E000B08A3EFD581B71780747C5B4F392A16247
+:10A9F0009F5FFDCDE80C373579D326124A95E55F88
+:10AA0000E6985671742E5E4C25388740420919F23B
+:10AA100055C9CD224686EFC498301942BFFB3A474C
+:10AA20000B9A4DE88686DDA5801A5C2C9286F57B14
+:10AA3000C2EAF0E01E09FE80B9DF30A0B7229243DF
+:10AA4000FD6EE0D39A8185D5D335D54174C2DD360C
+:10AA500022B92B10EFEBA56520A9BFD267BD33004B
+:10AA6000C43D63982DF7540DF646DB916D6FA9A692
+:10AA7000C9660AAA555015E6C2C75485FEF5405C62
+:10AA800006A43E99CD0A7739BDDED963DB0392ABCC
+:10AA90001564DE907F52D7B3AB7A107E65FADB295E
+:10AAA000B15644D9CDD00EDE3C6E2421F5B329E356
+:10AAB000655654D425E6D806FB99DF7A7F634CD3DC
+:10AAC000C9B95E10E884F0216C888FC0C657548ED7
+:10AAD0002A22483DC8E2F6BA08B57235B931522D7E
+:10AAE00069959CF3463306A4902A3286210CCE6CDD
+:10AAF0008A59D3A0CB64816A48E3C45D37F3F7D1A8
+:10AB0000F9B7DE4AE2BB337CFC8760E369C956E1F2
+:10AB100095629142600C2E9CAEEC34BAD442CD7F4B
+:10AB2000FDAA0E2601B2657E450F3E36EFEA3BFEDA
+:10AB3000D0BBFD52C98F4C2EC5CB7599C792C1A70A
+:10AB4000C75605E7D3EA246154AAFB5D233DE23BE7
+:10AB50002C3A17C3E76807D8C7D21D5FBD93B54A23
+:10AB6000AAADCFEE65F956942C6C3EF2D183736991
+:10AB70008243BC39539376DA0AA209F73CDF3212DA
+:10AB80008EE5AE6411DE7ED516A5E06F000BD9D53B
+:10AB9000DD3FF55B481FC685455867552C7EC218BA
+:10ABA000C7D8C72B8D75A3282C57CBE55E24345FFF
+:10ABB0007D6E951AD76E7FAAE517E7BE54B4ECE90F
+:10ABC000114DB2E26ECBB46CCC6E4661F3D98FB44A
+:10ABD000ACB0339A8F4820D528F3C38DD4A69465A2
+:10ABE000BBA4AD06B01F51E3106270AAA6B4F13A3F
+:10ABF000E0D69C5AC01D0326A858B7C09AFF5E65D0
+:10AC0000BEA66A82FF8F276760601A398CB8AD13C1
+:10AC100031472BF47B76452663AA49A2D9549591F6
+:10AC20001554789736A67BAD012DF7BD61C2F3D1DF
+:10AC300037B99C10E5F70038B259D3CC070198C05A
+:10AC40008BDA4CBA095B1FFEE3716C5D012C0E645C
+:10AC5000210B4FDD1F5D3C61BAA2F7D08B1C8F1515
+:10AC6000F00CD0E17781393DBC6DD6F78B1D316C8E
+:10AC7000DA28E0AA6A08BE048A186C479EEFEB4601
+:10AC8000096D3AC8473691D962E50D6C44FA42D154
+:10AC9000931BB0B3E01767F0C3E634EAC0059E8D9E
+:10ACA0005D6C2A6B5AF17C1ED8F8B8380079762D85
+:10ACB000019A21F59F91CD53F7BD4C22258D782522
+:10ACC000CDC4E193B6B1C6BE431BECF36AAFBDA8D9
+:10ACD000F5FAFB68B37E34D60176F3EBBBF0A6FA47
+:10ACE000D063EF5A0804649309B4EF600C44CE7249
+:10ACF0003BE6DC4EA99A4D15E843BCF9A2F1FFBF33
+:10AD000057D7FC10A2483BC4FFA80C706536E4611D
+:10AD1000283CF218D10CE268B083AA1BD88FFFC27E
+:10AD200078203319B19590077B2B1C5D1F2E7C0179
+:10AD30004D6AF0B6D46C82870EE3B1243C57514A79
+:10AD4000B216A5CE61021383EA7FAB7EEC9EA6BD50
+:10AD5000818FB1864FD92B4D1DCB0AC9E541CA1948
+:10AD600026E65E17F22987C6FA1E504652E1637E38
+:10AD70007B7104F52E604AE4EFC0428FEAFB91E656
+:10AD8000DB819C7AFC921EE5238A1B8CDB5B69BB12
+:10AD9000655F2976253EF3424F831204EE170AD7EA
+:10ADA0004279D2ECA05FD92BBE7FB7206CCB2203B7
+:10ADB00000EAD17E7AC4C2C8542FE5032605DE829C
+:10ADC000C728BE4D2B4158799196BB291EE18E1B99
+:10ADD0006662D08A05C9F08B6C7842610519DF770D
+:10ADE000CDE7FB228563AE3095E20907B19024558B
+:10ADF00017DA008DC0E32367B931DCEF4AE3DA9359
+:10AE0000417533110EE574378DADD38DABBA9F5EAE
+:10AE100000A5F113B1AC96B5D8E874C1CF18CBD466
+:10AE20000D8607DC890AE1AC140DC56424D47CAE20
+:10AE3000CAF447D063A058069561122BD6E0A6E667
+:10AE40008C8BADAEF13CDC014C6E96298522A9EDD0
+:10AE500000326F769B13A1DFB2CBAE2A436DD7468B
+:10AE60006A146045A5E49140A30414DCFB9A6622B1
+:10AE70004EA4CB8D5D80E133C9B64D334231BE3433
+:10AE8000A14EF537EE3435030922445FF06619A56B
+:10AE9000D7E702C837E0C37CD1E9D0EDD4CDD4D612
+:10AEA00050CFE144B3452DCC4E1F443A8BC45B10C8
+:10AEB0000BEA0701E6C7D16901B133ED5065C4590A
+:10AEC000DF3D62089C9FCD7DB242409B09EA407401
+:10AED000FE784670DFA2B13D891EAD1BEBE1374D18
+:10AEE000E6D9E7C9B6DDE3FC428A747FCC45B9BB3D
+:10AEF000433782AF3C028EF8F31D83A71A1B282428
+:10AF00002358702ACE181B78F3FD1BF7F500F60BBB
+:10AF10000E25A100CA52ABF94CAC5B7F50F7E58F10
+:10AF20007D4C39C612F68E60968F4DE60199AC4B7A
+:10AF30009FC6D6484AE2C746DE1C330A2A6E61E243
+:10AF4000BE31DADCEC899F3211ECFA55BC10B80343
+:10AF500019716A045EFEA0D3476789C0D9DE2BA1B0
+:10AF6000688DBFBD4EE34AA2AB1C96FE9ECC3063FB
+:10AF7000A8B6A8F41DA3BDDC8E98241AC25F0D519B
+:10AF80002B276BCE14CE8AC72C78B3C23B1A0A2E5D
+:10AF90009790B3DC78ADB58C7CC740C195226A7BB5
+:10AFA0008BF0C1182F961507B4047080B592A3E1F9
+:10AFB0003400545E054DD853F1FE54FB68194389A3
+:10AFC000BE4AE353627A22A7E2781346493336C970
+:10AFD0000473D298E85220DD674D10693C569E55A7
+:10AFE00044BE460531EC48D7E0B388A21EC84CB336
+:10AFF000CEA95A5FE066924BB99224247FA33815FC
+:10B0000071A1AD4E813AD2BC6E316711A868FB16B2
+:10B01000A151E22605AB47C42A5BB5BA800EBD6FCD
+:10B02000EC215E682E7C30F930323CD55271CA9FDB
+:10B030007451862D9F9938D0F7B7FCE7B1D4A85941
+:10B0400048D77FBBDA9E4519987A8447B62A1C7088
+:10B05000D3D3EB4D5F32B3DEFD55557F50CF1DBCD2
+:10B0600056246659A500704BE9095508D806015BBE
+:10B070002615D3538C0FD8618529FAC041D7E84AE9
+:10B080007A2203C2ED2058F4BB3B4815D1742491B9
+:10B090009495F48E7CBE76E1333B389FFC054BD80B
+:10B0A0007AD52A2AF93776196570C786E30C58E4F1
+:10B0B000BA461F024D51A2EC7E296F359B62329732
+:10B0C000A91D0EA690FFE48124A5290240A10E38F7
+:10B0D000A6723E9FC3A940FF5AD10B98707B72267F
+:10B0E000C8F3ACA052ADC2777E14E01002CF3B761D
+:10B0F0006ABA1A2089152D0FC03AB6DE3B75634532
+:10B1000013CA51A2BCF28C279369CD9E16001BABCB
+:10B1100011278D0318D1D0421FF2285F2A58E2AEC2
+:10B120003E3792A79819558167D28F278C19480D01
+:10B1300001C8916C430EA0EC0A48DB3E2BCD2E5883
+:10B14000709FF757353D4057CF0A15FCF35B2647F4
+:10B150008A135C54FAE4180B8C0F87983E375664B8
+:10B160006A6387582CD305875BC4A98AE144090B1D
+:10B17000771898366E2DD59DAD9BF9142A6E2C0646
+:10B18000683FCA0306AE0A796EA5DD33A4F3BB5C43
+:10B19000048031F439EC66BF865EC35E57BCA48878
+:10B1A000CAE91B51CE1E398F515246BC475983F113
+:10B1B00086606BF5C005D0B0FF65A33342504412E2
+:10B1C0002F92B42C8C1A494E9D3C9D45F5FB476847
+:10B1D000864FCA2B85F95687F578BB7E0296959BDC
+:10B1E000EB877B6C006F1C5F967A876794E53A8CDF
+:10B1F000C207CE5D2A6E19B8F5D25236616F81FD55
+:10B200007A30D48136808245E34F0678A17D695E2D
+:10B21000BC619FBF91BC78E94E1D485D208BA22C7C
+:10B22000D0F71057DC0BFC4D0B94B1E3636F335335
+:10B23000FD8482C7EAC4DCA17976757820B5C38C19
+:10B24000FD1CED7B982868757EDC3864795E00A370
+:10B2500011049D45F57D4DC32B5B9DF4626D17EE8A
+:10B2600071900A2A986F856CFA4D1CD21C2D1641DC
+:10B270003441E2F09AD4DB5EF06C8FC35F2183F639
+:10B28000B9F88ED3236F1437D2036DE0F749B1714B
+:10B290005FD8D5983EF870E885488BD61EE8B6385A
+:10B2A000354D288B32AD933D861898BE986B8A2F0A
+:10B2B000915B30CBCC61B45D421B25E0105EF56F35
+:10B2C000B46E6C3A9E46F83A069A921869E18DE699
+:10B2D00014FE1352B1378F830C38810D3864D86156
+:10B2E00084BBABD29F4A9C3A13EC5762BBFA23F75C
+:10B2F000DCC39176DAA6C75E0EA788E5B73EBB7EB3
+:10B3000081A76CEC1BA28E08DC66155A11CF8978D8
+:10B31000E0C7FBB72E7E9079FD4583E452BCD1DEB9
+:10B32000BCF5277AD2776BD78A5F500E376B065BF6
+:10B330002DDCACC813D0CEB64227F1EF8D98DC12CD
+:10B34000E90FD97C3D47E7F09F78BC8F84F6E5B8DC
+:10B35000089139515B2FBB738D3F22AEFCD046253F
+:10B36000B3479E11E5DA98C6ECEF911A227EF2E718
+:10B3700079FBA72A28D9F3C28714BDF69FC06F8234
+:10B380007715A14F9256D6B57BF95F92AE199450BE
+:10B39000846B4390D63351F925291E8D588E09C0F0
+:10B3A0006DB474450ED23CB84035B5BA431C652720
+:10B3B000C2EB91747C31FA206A86EC883DEA1C2746
+:10B3C000EF5E3A21CBD45B532173867EF2BB4B7484
+:10B3D000308EEC5591A60E936419D84D54B399371D
+:10B3E000FFA4594459D90C85A077C1E35D448BA7CC
+:10B3F000731BC16DA7CF93DBD01611FE5557309A42
+:10B400003817EC2D9F322B3465BD0A9CD31FF721D2
+:10B41000D468F46B0C963654432920377AB9D17B23
+:10B420009745F2C11D60E98D3855DED3BADFFD3E88
+:10B4300029C8293915FABD4E4EE9D951E1AD77C574
+:10B44000BD33924160E8003B07B5643937CD074909
+:10B4500050AE4CCEC87CD8B97755E326E255827100
+:10B460004C626F5B7C50553CCBEFFBF657C72629EF
+:10B47000C2A39F88CDFB094EBF04F0A6FFCAB6DE6B
+:10B48000E9490EAC83FFC568C29F9393586013A12E
+:10B490000EA49936C3160F6C39E1F45A7D1D8B6CDE
+:10B4A0008A14DD92E3341DA899A4B839C6A140A539
+:10B4B000DFEC14FF7EB5118DB0787CE37EC526B538
+:10B4C000612703BC1A35DD6064D98BF57132FB3F0F
+:10B4D000F25777E01A01DD0998F56B6097202CEBA5
+:10B4E00028AE56809AF7FE1C47DC1E137BF4E47AE4
+:10B4F00047E545D1E9243BDA6FB5571EB63C500409
+:10B5000053250027238C15F2B105FD7BB9BD916150
+:10B5100033E9763BB30CF315743DCA8B2E2DDC89D1
+:10B520006C99D98682A5AFA621801B2CFA692D348F
+:10B530003E50BC6A9BCC3EB7B5B6B7DDA257D09C97
+:10B54000CD9704139051976FACE3399E87028FF12A
+:10B55000DB4A9951CCBBFAD6C4445FAD82B2ACD3BE
+:10B56000E1F2A7BF495CD39BDDCD6E455F25F8F2C4
+:10B57000795017DD8656292A076879A3787D502DE2
+:10B58000A834C08D95C5F3D74A60BA5D3518919C33
+:10B5900085FFB6F44A82115E84135A9AC203DB60B7
+:10B5A000D6A949DFE45ACC301F9E65BA2C962E20CE
+:10B5B0000AD84787FD8352387C347F07DF777A6C5F
+:10B5C000E7AF26E5EE7D562D07DDF59A60EAD4D487
+:10B5D000C45FD4714B674F59DF6F07FE6CEA0A13E3
+:10B5E000AD7CEDBBF1E597CEE1FF83625EB9598B8F
+:10B5F00060983EA62ACA89760BE101E61D721C9F5F
+:10B6000061AA6D895D8A2895AF0DF20DFF09CC31D5
+:10B61000B1FF0BC27BA1AAC1CBFD561979A1165966
+:10B62000FAD5FC1F7B1F68EAFB987A6063C2F1C8F9
+:10B63000551D545B7C38D7D206D2A39EDC87686543
+:10B640004FB2237047517D7FE898A35A8CD4AC0445
+:10B650000F43592FF23F2874C721CA05158DC42600
+:10B66000C547A8FF8424C628B174B77BF21D95DABC
+:10B670008053E0980B614679013D5D1E3567183BAC
+:10B680005770F55C613726D721D170EA8AEC45AE58
+:10B690002DE065316C337291B7B53C779312166922
+:10B6A000A3EB699AEC48C62136EB8599A4D0AE2964
+:10B6B000140A49AC1B6C1516DF53FF693A51324628
+:10B6C00090E93A2397AC54C37ECAA521AA627005BB
+:10B6D000F59F71B861EBBBA630BC18936ECA679C2E
+:10B6E000D527618E31B99E8383A147922F81ADDE2C
+:10B6F0009B5ED2C46CF29331E708D84CE52F741EE0
+:10B70000AB847AEDC89DECD82CE1240404B592C535
+:10B71000B1BF96B6D7921B72175AD515F4D42BF633
+:10B72000B0B6872054DA79657A6842E435C6126487
+:10B7300017CFADC47EF41CD13685A6E5EAF3AACEB8
+:10B740005F24DB908EAB7FC8B6514FC8EAEB1A1B63
+:10B7500080164FEB6660FC3E0DA580FC38DD193D80
+:10B7600034F99628BA9CD59DDEC444B32E444FD7F5
+:10B770002CF51D0213E40A63E25128946529022383
+:10B78000EA1F6842E3243F98D3EE919B6C87A5376C
+:10B79000D4E9B3FC11C8F1E18101782430659882C5
+:10B7A0009D680AF2CF4632217F1940A458D9BC7453
+:10B7B000986A818188AB46D6B43AFCEEB2AA5B4463
+:10B7C0004E1EEDB09E9619FB8D260BD54228CEACB1
+:10B7D000386B4CEC6F72CE40D2F5A05EF6181E5A54
+:10B7E000F2E83868CD43F342F2D24623EDB1A60128
+:10B7F000682BF5960B330BACCF6D040D6781A60457
+:10B8000064A051E15EA989CA4570179DDCE47A54B1
+:10B81000B07F15457D9C6A53140249A764D015EB8F
+:10B820001E22CC1FA893ED0830EE1F47B9FDC6F3CA
+:10B830007B68EF9EBC695D88790902751C85E6C846
+:10B84000A8794357A0202C6DF255461B920C6FB877
+:10B85000BDC3BC5EDC905E995E963568E8C9D012C7
+:10B860007A2C6C5155B34404E6BD5EC0DE891B964C
+:10B8700094C4FD9DBF547754566DE457BD608E7BD4
+:10B88000E4CC5F869C6F35704FCD306CDD35841E07
+:10B89000498B48273680188BE8E0A2E6D2113D009C
+:10B8A000E5B49E08B7C28818D0E76E615578461790
+:10B8B000999EE2DB25EA2A323B0AA251C3715370FA
+:10B8C000ECDBA0435EB15BEF586BBF2AC566CAB81C
+:10B8D0000ACD3ACEC94DA9B399EACFAC09F115C347
+:10B8E000D72CC30469AF43683E05701305E3ACA1D0
+:10B8F0005B7D29BE9E71507153004B27B19C8E46D3
+:10B90000ACE45BD1AA78D2A176F5D2A71F7C8FEAEE
+:10B91000933B803B2997A722E6F312089AF6814AC7
+:10B9200097B0C21DE0989C05CFD44EA51F243620A9
+:10B93000F306C72AF43562E068CCF6E22FF35534FB
+:10B940003B7FE3320A739C454431B736C844555FA8
+:10B950003AFF253DFA99E2B507E38EB4E5553B8001
+:10B96000064866E9C163206C745E1BCA70F57B648F
+:10B97000F1BE652CD237E75F27C7A32C3669FBE3FE
+:10B98000F6BC6499193A9AF9656FACCF192D58FA3B
+:10B9900006E890FA2B05A2F5AC37FFA15E2B3BED34
+:10B9A000F163D7EF53A85D70603C2AF7FC34338D08
+:10B9B0007E230ED8CC80E5FCBA7250756D29B25C3E
+:10B9C000AD971AC93BE966D664028729147387F8D4
+:10B9D000A1EE743F9C7FF75EA45EC36F65B1402A01
+:10B9E000077782615206DDFD6CDA92D87D97B78FBA
+:10B9F00092758DC5D36D9F092418B0134D1A2280FE
+:10BA0000C01B86770D76A217CF266D21BB30CE885E
+:10BA100022FF73A49F1B4408E6D17EC08EADE507CC
+:10BA2000845C1420F33F2C61E9B4E9286534B30E3B
+:10BA3000B43215A75010E5DF4AF325BAAAD0CD4598
+:10BA40007F96868AD6BC8A7CFF27C9A2BBBE442BC0
+:10BA5000A8DC831D872F31CAF30908266604E55048
+:10BA6000A30D4DD64D0BB5AA3C6465FEFB57C06BCC
+:10BA7000BCF391DA2BF74FCB9317F24AA6A898752F
+:10BA800085ED0442C78916D1C0E1EAB0E75D0C2A12
+:10BA90003C60786DB0293DE5E9D4E3D011538A527A
+:10BAA0003BC7EA23F3E8A5077741D8AEDE84E04C34
+:10BAB0006F01C2A5A80037F888D8E8D0BEEA7300A5
+:10BAC0004DF67A5D8DFAFA037A6680DE17FDC6E2DE
+:10BAD0002C6941A9AB19033D6E4A3DC38545A24877
+:10BAE0001913C610589EEBE22B6B2CAC48B9920A86
+:10BAF0004462966E02B56D130A4F4C20A09E498C8D
+:10BB0000BCA9D6FE3C2311FCB3F0514A3DDABDABD3
+:10BB1000B5BC383B4651F74D1942C6AF7D54AF0115
+:10BB20004CADC1146AA5319C8B41CC7A226511C8F9
+:10BB300091AFD2C949E8C08315EA7EA7285E05F017
+:10BB40004F5F0CE2FBA07FB066CF57622A785FD9C7
+:10BB50005A9596CE060B09E8346EFDC932D341E7FB
+:10BB60002E24A000CC37F0098CF033077D41B2EAD7
+:10BB700091D9A560BCE510FE31383FE06F1E058409
+:10BB8000221C41CB3814F6339829D0318A9F9E610C
+:10BB9000743B31D53352256DEE99A600F8D53605A4
+:10BBA00060F247E74326FAD77F70CBDE96D45B1668
+:10BBB00000406AAD98F2ADD5E5AE85474664669221
+:10BBC0006D0DA07CEF6BD259C7DBA6A8C275932C74
+:10BBD000336D4ACAEA3A692888F78BCDC83B595178
+:10BBE000C5DF0376012A8FC59AB5DD968921BBA5ED
+:10BBF0009CB4B3925251CAD4A6978334B4A8A59BDF
+:10BC0000F10410BEB582FE528C44AFA06D7D92301F
+:10BC1000961C3E4A7A3F54CD746F06FCCEE0D55C4C
+:10BC20002A386CBABE0A43E9F909703C32D93B683C
+:10BC30006FCDB49B75A88AD600CA90A06B28C9E2C4
+:10BC400020649E9EC23476512A6DA56D9EC9331E16
+:10BC5000758C67A8D41D5108CA98C02339ABA3B509
+:10BC60004D45ABCE50AD260CF619ADFBC5C8120440
+:10BC7000D6816FC3349CA8A8D67480E2ECDC8ED940
+:10BC8000CF95DB400D08D5429E0B972344ED3DDF59
+:10BC9000C27477C3456CA924551D492E3832613CC6
+:10BCA000D953A1DA24D305E1254CB8A5C73A19D058
+:10BCB000CD3EB842135F1BF7E5839981DD2F55B563
+:10BCC000786A58C685553424EE122752AB82478ACB
+:10BCD0007991BE747AFB0DCB43C1B449B192312D39
+:10BCE0001B34E9B80FFCD69E738A0AD08BF44DAC96
+:10BCF000F513A41139FEC3C8C4E2AC377899340FE8
+:10BD00009114181C48E7B450D1F20F013D5AAD25EB
+:10BD10004688876627B86558707572C4F29AC1D58F
+:10BD200046FD62162F94D5C4324DC34019CB8935D8
+:10BD3000E9E3EC3F9BA69D68D5EA4B7F46543E1154
+:10BD400031E0C91FC31CC31FE98649019511C49284
+:10BD50002B9BCDBDA3255B9F1B5967AB756BFE1E4F
+:10BD6000162E12EAED69D81FD8E86921C815F244E9
+:10BD7000069E339121EE4B33EFC998B3486FC1B69D
+:10BD800014AA7A66F6C8C28EEFCE1F5994D98113D1
+:10BD900088C174D64C9AF1943E452AF6F7700C91FE
+:10BDA0007EB381AB7E367A0161ECB0113E843735CB
+:10BDB0001BEF37F90BA187B7F852DBD142BEC5455F
+:10BDC000EFBD0A7A89A4F52684EB99459006D18EB9
+:10BDD0004C2896C490C8CFB27D69197FCD3EDB4513
+:10BDE00083F5B06B26702AE1AE16A29EDE30BFC08E
+:10BDF0003CBC01871BF94B30382045B66A1F6FF6F3
+:10BE0000165471A83FFB701BD55EB19F59FD4F734F
+:10BE1000ECD7CE77BFD51590E401E562066B4A6397
+:10BE200041C5A67E9416B01E9AF616F5514899277C
+:10BE3000F7EB556A08BC716FBC7AB69DCEB731E698
+:10BE40006970B869E341CC6E2AF2E502C4082602A3
+:10BE5000D46101F70B031FEE9B9AD923D1BFD5C044
+:10BE60005D6C605216F638575EC50244D106FD1A65
+:10BE7000FB4788E1BE254F0867D668105764396FC5
+:10BE8000B221B2DEBD1944009F6B204F741091C4E3
+:10BE9000015BFA44F12EECCD316A1270B6342E21DA
+:10BEA000FF6ACFB166268AABC5AD3058C1C3322315
+:10BEB000FE55C76CD26372A0CFCEDD3F7D9D8C4E08
+:10BEC000120DB172BB3AB2ED5DC063F2965A95B7EE
+:10BED000A47AAEE5F3272FCC6EE4B1EDDEB0F5A782
+:10BEE000AB655DB38F75639455C91D459AEAB4126D
+:10BEF000C2730086B3C4B8F7BBEB6B333458D7B802
+:10BF000085AABED6C49DE33E02705D1A8BDE411247
+:10BF1000106883707137B3DDF635CCD7D0F36C1170
+:10BF2000D0A85E344AC9D0FD9753464DE45A2A97AB
+:10BF3000866DF32F2F149BFA97ACF1F0238C38E425
+:10BF40002D5367183624D36E3415F98705C4A76DB1
+:10BF50008699178EBBDBD68475475D6FC5B13C0CE7
+:10BF6000D7E37FC5A388E6DC922736C2600DDB49A4
+:10BF70007ED178B35B96E029F4AD3DF2E6F5F21F91
+:10BF80009C77D55884BB02087F181B3D0ADB94ECD4
+:10BF9000AFB42B846568CBE1465B5B6ADF092C1884
+:10BFA0006163E0C5C5B54C09F2CA73B0E1B55C2E5A
+:10BFB0004A6F1FC5FE863A9E7CAA30421C5054042C
+:10BFC000B4502825B2E0DC06899948137094000B20
+:10BFD0006317F3DCE8F9D2AD25EFCB33B6B34139C3
+:10BFE00093AB9F0117553198E50CA33F9ECA0BB147
+:10BFF000AB58C475EDEF99351F0CDEA60723F4830B
+:10C0000062A8EFB5D1F9D25036A8B8DF2FB0CEFE76
+:10C01000E2670A684CB969EB04C3300D6A5F4C9C57
+:10C0200042BCF6156A3B309832DDE95F2321881B5C
+:10C03000F5C8643522382D53A9B6D2E80EDD1BC8E9
+:10C04000B25F5DFF8186317BE8691451C3A68477B6
+:10C050000777D097881F683C7DB3AFDFA115EF3D10
+:10C0600010CCCC478C40C988F41DF04427DDE8D5BE
+:10C07000E98522CE9299356975551653E3D7DC2AA6
+:10C08000477A3F6AD8C9D44AEEFF08A25A10A88C52
+:10C09000190F2C9F53652EE5925C8A75024725C0C7
+:10C0A00060CB51640044CEBC840B63DF087CDF545A
+:10C0B000BD75BC3560E5145195DC4101B0BCA18E65
+:10C0C0004463B05401576F95877C4C7565689F1C1D
+:10C0D000AE56DBC7ECB881A6D62FA10FDC9EC48A72
+:10C0E0001DAAE4AA7D70ED2FC3B6B01E79E5F05EFF
+:10C0F0003A022B2BCD35605DC902148109863F8D34
+:10C100002E24D546F871145AC664615E2772FE4C1F
+:10C110002646E766B7A26F81B1CE1A2D463D2E9F07
+:10C1200093E3CEA18734DDEC9279885DC891379E88
+:10C130004C22427AAAAC74023DBE3818FB8180D7EB
+:10C14000D6EF2752869447DA340AEC5C697474504F
+:10C150004806F5832D8E37B999AADBD4AF22A38B7D
+:10C1600007139950A9246493BD152924DAF60B947A
+:10C1700001116739FB72A837AD4F1422C86A250632
+:10C18000CB983D4856A3D2DCA8D3F7E81C0202E0C6
+:10C19000225190F1B5CF2C8387ABD23A323642CCC4
+:10C1A0003F5B08D5C1520BA94AC1B0990327F6E6F7
+:10C1B000F9372EAD9C5A0F06C16A8EFB32B1E53CB1
+:10C1C00054CA337890F5A1D0EBAAFCFED850EED437
+:10C1D0005149F389129111FC5409D3BC7B0ABB3A33
+:10C1E000A6A3A686E96B07FD180AE6E50D6C858512
+:10C1F0009733C66F34D99A1B30314CD67851B37708
+:10C2000030A5F835747B132AE0EF8325CE52AEAC0F
+:10C21000402925926A43F5A6DDCF4074B674ECC27E
+:10C22000E7F8F0F001566DF7BDCD55D431E7DE6586
+:10C23000D3F1EE592E813B7B48D20BE4D504C25397
+:10C240009AEFDC022593045AFD8960BA740CF94B0D
+:10C25000B54C9274EC9BDBC405D9FEE191CD8EE325
+:10C26000CC0E7B37C62C3AFF334E81B1F36BD288AC
+:10C27000013E93ACE2B646C7DE8FD209BBE6AC29DD
+:10C280004FA115E851C74EA752A5C04DE82D3AC49D
+:10C2900031D3CB19BA60C4D4C416A6D4C93FDCD6F6
+:10C2A000008168EAC560AAA0B580A3B62E732BEB07
+:10C2B000F80BE630784E82E00E8104D5020112A719
+:10C2C000E7C0CF6272D3476D47ADA1980F98F905CB
+:10C2D000FE442619A35B89B720A53789BE6BC19C94
+:10C2E000DC94D2F041A909C74B2DFBF6D4B6A420AB
+:10C2F000F3653383FCC3CE76AA02F2D859F556090A
+:10C30000EEBDF9E76491D1C0AFA51BFB11DD96FC32
+:10C3100027BCDDCCDABF2D47C667B4FC782C577A32
+:10C320005172615C8CA7192B5C945EC0F6CB68C21D
+:10C330002AA42C8E02DF6A38D51EA69869870A6F58
+:10C340008CF05580507FA281B01361E239A9FB4B7C
+:10C350004AC2545D9D42B1020FF2FB5FDF5A534D5A
+:10C36000813E7CAF17C32653A99F53B644DCCB65EF
+:10C3700007881D71BE4804D0CF1ECE30760495F9D3
+:10C38000F96AC5B107DCF7714F61D48BC40897E136
+:10C39000A94DEFECE0C47FB45D3908E43EE5D3027B
+:10C3A00068EDE49C3B88EC61917E6E55D859D3EDE5
+:10C3B00027451E48D4BDB86B6609E8A0F5DACC4C19
+:10C3C0001575F3649F2CF7C2D17972CA1C2AE7A9AC
+:10C3D000C7D4F772D05898FA1136855B1144B9FD6D
+:10C3E000AD1530870967E09BD182B5AD7C7FADC6C6
+:10C3F000A52872B9016E38A7E7DF7B27232B1FF52D
+:10C40000A99C010D9DFF9D5AA729EFC70FC942D5D1
+:10C41000230CBEB88AD1D8173EF1E6BD0777F46188
+:10C42000FCF7C55AA517D81FD9D113C53EEB93C247
+:10C43000724708EC4ADA91A013E63F685953372156
+:10C44000F2CD6B5B0166CB622980930ACF70381AFC
+:10C450009312DB633DEE64BCD9A0E39ADD3F1AC7BB
+:10C4600029A9F847B1D2714ED3AC1DBC274B32631A
+:10C470009B42289AF13A6514FD601F6FE51763C966
+:10C480003BD5AF87FBD5856AD79CD4A61B77D2D086
+:10C49000B24B42761BFA3A9D5EC878782A20FE9D00
+:10C4A00002DFCDB35A4C03F9A39E806C46E854D802
+:10C4B00059277B28981E8DEA43D4F4987B0C1BAA3D
+:10C4C000CBDDC95201C76A8A1A44C82DBD22C940B2
+:10C4D0007D09A91C9BBD48A5F4DADF0EBAA6BB8274
+:10C4E00000A578F54E1769D5ECC440CE2FDD3DE2AE
+:10C4F000579E6D27B497E2754FF32A9B00C319FE30
+:10C500006B7E9A9E23463190DCCABB6D8822212324
+:10C51000CE6F04E1376BD8FCBDA3428B6D36613F13
+:10C52000B897E3044E93C9C8224B34813EC2BDDEA6
+:10C53000EBC41F8F41FACA80BCB390A7585D005E60
+:10C54000E4947B40422152D8BE171A69DED8288E67
+:10C550003D76AA0F0989FFB59C718D25B17473F7DB
+:10C560002A4E36E4F2DEC9988BF252E1D05FD8EF62
+:10C57000C860CB4898D28E067B8F76C069E7CDB570
+:10C580007A074184DFAA4094666E87A5D4B29F9152
+:10C5900038277BD3BBB1FA47DC9B23EC559F3E4A3F
+:10C5A00087ECE11E2B47165F4304BD75F206D97C6C
+:10C5B00036190B5C612F17C12D986F994D1B849C08
+:10C5C000BC90DEE45F85993D71FBF82A9D98696B0C
+:10C5D00058A502AC0C4E719F96C3F056B82FD8A543
+:10C5E000163F47A1B422D70606C0CF6BE316444ED0
+:10C5F000CEEE97A89C70C4209967B4E73B7291294E
+:10C60000358F76C82FF22386FA5AD9708155E69E67
+:10C61000B1C0705247EA64E4D0E2FA7A8060818166
+:10C620000E04B75CFE448FA9DB7BF7C8F60A0DE366
+:10C63000F5ED2360711395FC123DEBAA19E9209BDF
+:10C6400018E680F61944077A4FFAC7D1F952321327
+:10C650002DD79DEC4D891EEDC01263BAD6044AA6B3
+:10C660008D64AD6B6E5426745792080DA34D7FE018
+:10C67000B0967A5228B98ADB1E97A56B39D73E0C43
+:10C680007BD1CFE2BADFFE0E06844E932FC97D1A0E
+:10C69000B213019EC0BEDC938F0A30B6C3494C91E1
+:10C6A000BA8B840929D6B71F86B7536A9DB3F38125
+:10C6B0002B78BAD51CADE6AE4A4EC41F26B3C3E4F0
+:10C6C0007B9862D4DA5F28AF5E2C755501E0676B0A
+:10C6D000D6A49EEBA1D79C34BD50CCE2156235B9EF
+:10C6E0005FA32765CA2A2D0DEC0346CD17CC378FE3
+:10C6F000E25B7E8F899BC30A1237510C6360E0D8DE
+:10C700004C303CFCD50D531AC13FCBA38BF9D2E57D
+:10C71000D4969E30AB71520A16E4410A4E7C65E114
+:10C720000F6D850EA3915B7712F085B70A53CF6F1B
+:10C7300057F04321A54313AA606DE6C43D5976F432
+:10C74000F4F53912B3376C9637A4F5BAB1BD5A3245
+:10C75000E96CF3FA182037EE0C75CF0DE2B8FA57F2
+:10C760000A257BE71A907EE5DD8F0AD3CCDD4C30BD
+:10C7700053EE3E1B313250DC2AD2E07103AFD89524
+:10C78000A09C28CB9F8FD07D691D9733DEA620C447
+:10C790004AEF83B484B993343EEEB377D65207B5EB
+:10C7A000EE52DFF5D34807B6E411BC3B0F8DCDE464
+:10C7B0009317120BF48082B63C2F3F6460921841AD
+:10C7C00094D890FF6C7EB49458DA08472EAC3D3D67
+:10C7D0009A394442282005674DA03A69ED5908DF8F
+:10C7E000D1315C834F8141EE50430E808E533D2406
+:10C7F0008DBFDAC9F57B6DF35F59004E07A12A1B87
+:10C80000F85CF5D376E7B69C4CC6F4029625C1E1F8
+:10C81000E21D3001853190F0939727D18DD188F0BA
+:10C8200050B41CFA28A1A3D6BEC42FFACCDD570100
+:10C830002C6C7C405CEF76A8C52FB23D9C7096DED8
+:10C84000859D105B405B76BEC10C36F1ECD69B5DDE
+:10C850007949E1D086521FF68214117D232AAD4119
+:10C86000E1476ADF3A609B0D4524FDED9732EFB456
+:10C870006997346FA3911D4E0A161F61F09A5431C7
+:10C88000D09FDBDDC7392979EEACE703C6AD2103C4
+:10C89000AAEDDCE97193FB4A580075559EF1381EEC
+:10C8A00007D3E22E254156C7CECAEEAB7673388940
+:10C8B000833123F0437C456C0B35BE0E1CE3B97409
+:10C8C0006C1F94FAC40454374BA6C1D4D5F50ADEC4
+:10C8D0004D881000B320524183279ABB869C2E427C
+:10C8E0006BF35E772CCE400C8F2EE85C93D48FAF29
+:10C8F000B5722C74048B6C98AD0B5A883812D8C959
+:10C90000A3F7A1219FA764E62FE95178F73DF96DC0
+:10C91000837427564310E08B86F6020CC6D0DE8760
+:10C9200048BD077B5389ABB5F19BE77CF7669382E3
+:10C93000847970334D267E9F1FE5DD99094978760D
+:10C9400032E2AB568B2CD50A6F649FE6838B741D45
+:10C95000DAEC06BA57B7002539AF17C63A8B6BD851
+:10C96000D3609D50FB83A64E425FAD99EB21C21E62
+:10C97000802C21271F534DCB725951A86ED64BBA2C
+:10C980009C9F7D217C34449AFD854D0B3196D89730
+:10C99000EF41B1782044446EBAE679A83CB8B6D3EA
+:10C9A000138FCF24070AD8F65539E6946E6BD5F06D
+:10C9B0005FC5D6160AF8F0DB41FAC98D0AB26322C8
+:10C9C0008B0E77781D7E24B666F9A679C0D6E30271
+:10C9D000FFECFBA09133791AF1DEEA2973EC11E840
+:10C9E000AE33CD8D878B6F913730128E1BE3640190
+:10C9F000368F88CE056EB6721CFC26BD36BAE6DED2
+:10CA000021F95E261C3884E59568A374D2CD29D11E
+:10CA10006FE085DD52CA8F2BB7F389067BFFFD607F
+:10CA2000C77B5895A9ADFFF7D632173AF10F6DB411
+:10CA300055FACE8888D9E12F39E4FAFB89CBE7791A
+:10CA400020E303AE1C3452BCBBB72EAF6174FF1A97
+:10CA5000A0163EADFF0AC336CA23FFF4E1819A2136
+:10CA6000E98C10D46959C5369D13A7F5444BE515DB
+:10CA7000BA0BA1027774796D3894C094BE8B4422AE
+:10CA8000E23F702365F6D3152ED29EBB9185836E4F
+:10CA9000D2B9922DD81D837C678A5005A3DDBD8055
+:10CAA000303EFEE6DC92394111D51ED0F0A3F99A52
+:10CAB00034C1A3C1B955BDA30468967F21FDA5FD6E
+:10CAC0006EF82E6E48E31EF0F2F5BB18D4B74A613B
+:10CAD000BD94604693BF7F8EB914A3E95198C4E713
+:10CAE000D59ADF2EA5B5C88C2AC65C6F291D2C10DF
+:10CAF000CFB9969E7602498EF4A50F551F0C9CD295
+:10CB0000F2DE5808ED1CD38BF1A764D20DBF6F1D68
+:10CB10005FBF627597387C79FB42881CC3539CB910
+:10CB20005B31A2A1CB1398A2BA905DF826BC91D438
+:10CB3000FA63B31164552FEEE65EE2FA650A6426E5
+:10CB40008DA4215F1E85CC76F645842D3CC26B37C3
+:10CB5000FC59028B15284BD360335806710D65F9CB
+:10CB60006745719ED4D8A9A0236E78AEC133E01575
+:10CB70000ADC379E41273011679D32644A6BAE1044
+:10CB800009933EE4C9FBD51AE6337EA80D577CEA2B
+:10CB9000227A2B3C9B06993B699580CC18DD6CE58D
+:10CBA000E1D45CEAC2D373B41159386109A27E6C36
+:10CBB000110BFF8C8C2A5BF53EBB06299EF081BFD2
+:10CBC000B18FBCE2AA260C80B3416BC1C43AD51523
+:10CBD000BB9C1D74FDEDA39BE665781D93EEA8C775
+:10CBE000CD895277CD01BE8C43E802D62ADD2A23B7
+:10CBF0008BCD2C3B14F1441CD71A81B27CD7E32295
+:10CC00000E6941881D85412722EE452E7DCCA61157
+:10CC1000FE4C06A4B145C7088102F4DDA9AA6E53F3
+:10CC2000C56A1AE493FECDE09969AE939BD238C2EF
+:10CC300032824E824BE01A8304E1BCC8039CB322CB
+:10CC4000E8E3D5ED7FF2DB2B2436F20A1A035B8D85
+:10CC50007B1E9FEF2F9980B6D8D3FB21F8BC06C36B
+:10CC6000729AC5F0309C678870CE5D735193DB3843
+:10CC7000BC7AD5E248722E8CEB06133A75D5FDF5D9
+:10CC8000103EE0DCF6D14FD64E7B533018224C2FAD
+:10CC900034DB6893DFF27F49B4CEF4CB75D9CEC7CD
+:10CCA00036A7965A64726B8B9FB9A8A1D9EECDA80E
+:10CCB000F93380AFD2503BF8C7BD07CC2C1E23DC24
+:10CCC000B1517D51D0D6F175ACAB2D3680E043AA81
+:10CCD00000E2DC93F561F8C2331BBBB6734039EF59
+:10CCE000336BBDE644E0BA3107894AFA835729CF4E
+:10CCF00097C2E427E6E7421EAC32FC45BC83459C64
+:10CD0000780E7843ABAA96A4702001F6F1EB650D7E
+:10CD1000DFA4F0DA611D4CC724F4105D5C9C7873CD
+:10CD2000A9E5988CA94E89F174F0F4BF3CF7A418DA
+:10CD3000F245EC39B07850C9658F2D71556EEFEF23
+:10CD4000278DF169CAC7360ADF3F1D362C496C8A28
+:10CD5000B194B692E0851EBB19916774040CB25B66
+:10CD6000A716D787EB8ADE48DEDDEFAB5F8037168C
+:10CD7000F82A3397F8565687B1DF403AFBE6F68239
+:10CD800019A6480DCC47848B7E80756F612789F08A
+:10CD9000255478DF3E88CFC218DEF793804EB64622
+:10CDA00066E0B4767A12131AFCB351C934C010D3BA
+:10CDB000242FB9D27325EBE05663B7648E15F85B68
+:10CDC00001A87A932F6A7446ED3E7FC9143FE4C3ED
+:10CDD00032C14454485BAC8047629E08A8517489B4
+:10CDE0002A5C1D949DD813D372EA41A593543C1C30
+:10CDF000D277331AE3E8EEF4BEC6C62C38A0E45F5F
+:10CE00001C7CFEA2BAACB33C95D032A6B68EA9EC7F
+:10CE100062AD1142D483BF8D0803093F5174A1F55F
+:10CE2000F03F461DD4D8AD2A35C7596ED8EF8D36A0
+:10CE3000372956AE720AD7505E00A54C96AF0C1833
+:10CE4000882FFB7A7D504018906178B10A89A83606
+:10CE500001E970C75220131F09133E0887D6F58ACF
+:10CE6000B024B21332823FC07DDA77793DCDCECE89
+:10CE70007D50AD4DF810805586537049E68749AC1A
+:10CE800019C4A3C39887C2CE9D26CA96EB587BF0DF
+:10CE90008FC2023D7041DE2B44E7A9AD7E3E6C8718
+:10CEA0007B9B7750C6C9D8973AF456EDC5B1FF9130
+:10CEB00036C75F024DD0467E0DE7A62537D068E91C
+:10CEC00003D845003EB7B78B2184BD2E59DC97139C
+:10CED0009C849D00EC10EC55AB0B15BEBCA49B11C3
+:10CEE000A1BED3E2BDDB1C177552D1CB0ABB3B2BD5
+:10CEF000DC30E5D4FB6C71E169B603F983D37BD7F1
+:10CF0000013F9494A96025E6AF9418A67103E52922
+:10CF1000A1D40B649A8E6C20CA14834B373ADF6716
+:10CF2000E48E26196D51A144EA5A0AD0C6A94F0FC2
+:10CF3000CC2309D3F16ADACF2FDCC8BBF6DBD92CBE
+:10CF40004CBB3C00E50DFAC01A719F3B9544149D03
+:10CF5000D3CB66C207BBB3ADA828F062B4AF5F7B8A
+:10CF60008A059C0A6E1485E49B50CE98D5EA4ED86B
+:10CF7000C76C7482A0F0071694181B539C65C743B6
+:10CF800007904C7750663323279199B88932F86D12
+:10CF9000081BEDF082558BE3866875210D5355BE55
+:10CFA000344DE9188A4D85FD57D5824EE3FC0008C3
+:10CFB000195F0F087D3E73865370E7A59CA97659CB
+:10CFC00027E400E0242110915B0170537AF1FC7D8D
+:10CFD000152DA5784E3868D74999E2E59BA22778A8
+:10CFE000DC132F163FDE0EDB57C3CEE15091E5BABE
+:10CFF000DA1B0D16A93BDA176167A4364BF84CC44F
+:10D0000059CC199224D6A7BBF38D550DA6CE4A5FF5
+:10D0100050D34956AD28214658550EFC4774142B61
+:10D02000375A725C960A3A9EC133D96B14C06D347C
+:10D030009CFF5731D84E3C9C2CA4D7D9AFB53BE4CC
+:10D0400050FCA9226A29E232D56D68E3F1EB89DA56
+:10D0500029F5891C52453BBB22EECDAB6639CC9EEF
+:10D060002B85445409E10343CD9DA2FD37BAD8AEC8
+:10D07000E0DC30A5906F8355BE8DDC254380DBD688
+:10D08000D862E0D60D12E2FCBF344229D95AFCF72F
+:10D090005DDC53616B3A40825EFBEA10A0BC48370E
+:10D0A0000E156898A3FBA2E8622EFB35FB04E14A4B
+:10D0B00052CAB6564BBF57837FA0F822DE0E53C626
+:10D0C000B15BA0278B8A051C8BD3709611D869653C
+:10D0D000CBAA931BF822A6D19391758977B65B28CA
+:10D0E000EF043DAD7C21095D9929274A91F437C1B0
+:10D0F000F0CB7E618F540C96E6AD4D7105A6BDADAB
+:10D100006B33EE6ED6344E15FB8615A75B2DBEF045
+:10D110001A7D41AB62275722F9B99C0E83007559DD
+:10D12000022B1B65A7A1D4B6E592E23CC692F5BBE3
+:10D13000F50DC34EBEEC62BBF82F05A36E04B963B8
+:10D140004A9EA7CB498F4F61D4E8D436B8F5E406A0
+:10D15000C6F24A89643B67FA56A457348CACDFB9EF
+:10D160006123ED59F5C0EF5CD674000EC864F72555
+:10D1700026B9BFFABC4939BD95DC9EFC73008C33DF
+:10D180006506459C53EA2060A5C675608B728FB119
+:10D19000808F8669AE14E198BCA0CE1B013491BF8C
+:10D1A000195019EBC091310A6AFB2E375C346F7746
+:10D1B0002AD523354D175A94E5D043B22748BB0FE3
+:10D1C0006090FBB6BCD43AA213E5246EE4F3CF9191
+:10D1D000262529D84C71A461F6E4A0BFD961F41AC0
+:10D1E0004725BEEDEEC0DFBCB6CC2F29CB9C492D28
+:10D1F000C298F7FB19C3A1FE8959A1BAA9395A935C
+:10D200006C6B5298F7687209558AA26AD9D5604347
+:10D21000D42177E46C7C0B39853F5E299AE612F7BE
+:10D22000D46C365D75186BC09A9424657C2A0F54B3
+:10D230005D61ADA557E8D757C57137C80D894EC494
+:10D240004FB5BD07F8BBABAD904C9813D5F06A3520
+:10D2500083A7F13D356863ED654E9747C203AF1470
+:10D26000D20D93594C64537498896AEC797FA3CC9E
+:10D270000EC2F9DE349D855B27309795EA292B3560
+:10D2800038B9B5A9F50BD1A9208603DC879776D8E4
+:10D29000C6EA0C3E1688150E2AC0C6EC272A5CFA90
+:10D2A00050115F6AC8AD9BEDEDD1E80892290DB928
+:10D2B00051456161733CACE186B35FAD4D1601969B
+:10D2C0005258976F4BC0EC8589BFFC1E7CA4F3C5F8
+:10D2D000BC98E3509E80D97AF752A65D884553D812
+:10D2E000614F032FDC07A7BE11B948AEAA1B1D284A
+:10D2F000C224A199DDF4D7EFECD1618A87E0D97916
+:10D300001E5F633B88814C233CEC7C4D882ACD56C4
+:10D31000B8B07B9DF33ECF42B8683C2BAD58290294
+:10D320004BF4C1FE7E2549E70C1DBA6C4060ED0B45
+:10D33000C091BC4A816BCE886C8FED8CDD79C3DEE9
+:10D3400092019FF43FF11E6AF65396C84F563E4332
+:10D350001DE7CEFBF80A678E290FE509794B2F0DE3
+:10D360008FDBFCA637FEB7CEE1F574F340D0AC4EB0
+:10D3700029E33D8B9ED2DCEE0E6025BB11E5BE009D
+:10D38000EA3F5B81AF8641ED268EC3F7A35FBBD238
+:10D39000059BA27FE99327CA6290C12D80F59D511C
+:10D3A000F9FA0AFD3A022BA6525821206A1491EE8E
+:10D3B0005BD809CF102B7D3564D3C2CDF5F97A0047
+:10D3C000D8CEB5DF55383BDD335C1B8C5D52513315
+:10D3D000311A88B5DD04D9C95A1B0155ACA512F321
+:10D3E00038B7C6CB27E8527A7AC830DE8236BE1705
+:10D3F000BCDE91B7FC14BCE30E548071A7CEAB70B9
+:10D40000C60C94C96E3737FAC6A466201E9F64B155
+:10D41000D1957B5EC50F02F391646ED5EA7F6D8A6C
+:10D42000468E7FE7E20F883F62B2E3A41360080EE6
+:10D4300004275E0CED907334BB5078662A54E9A53E
+:10D4400022FECA6D79473AF3C18FACE4659BB3867F
+:10D4500030D2ED77EEAE1671FF3DD36B76A40F2E72
+:10D460002BC73D44934E194E67D1154884F6F64BB1
+:10D4700056DA59043CC8CDD67485E6E941826BA7DB
+:10D48000BBAC8260CCCFC38F3DABB4BEB519481FD7
+:10D49000F81F692EE667D42BC76B384EF72A9A5AC5
+:10D4A00057E20FD95A44E73A61CA0CB4EDFCA358CD
+:10D4B000414A9FCEACFB1F48F34F7DECF9126EA0A2
+:10D4C00028F154BB431DB38FF518662B4F213DBF88
+:10D4D00098CA50A9DC512E4EB625106BB22FF9C850
+:10D4E0004292E1912E274A73F6C5410A042ED69E38
+:10D4F00080FFD0E59D85ACBB300CE65C9DA6DAD6FE
+:10D50000D01754B1EC8814BC57DCFBA0CB3CECC268
+:10D510006B93176E23B68FE651A0E373B97F5A92CF
+:10D52000D308375AE8FE750B28CC093CD5F3868D15
+:10D5300005148D700855D722317362268EAF1DDD1C
+:10D54000C0304DDAE6F8789F554A6F23714E477523
+:10D550009756E71A30253184F905CECFD6B61AAFE3
+:10D560000CB7BCB6FE79C3D00867C748E0B53C0D20
+:10D570008A5D5F4AC0A618219CB54544B2D58A256C
+:10D5800049E39BB1DCD36F3B991782B5A58561CD8B
+:10D590008BB57B333D6574687C068E7D9D286C431E
+:10D5A0002B0A0FC40B10553FE1B8E7F5E9FB5AAB66
+:10D5B0000A4E1F6DFD323A5AB5D8A33A1128A9D99F
+:10D5C0007D17338A44261140E9BFAB2125CB9DAEA0
+:10D5D000E4AF7C23C968284E8ADE1D32DCD42DF9E5
+:10D5E0008947B7FE02184029E9CD6DB97D63A2F4E1
+:10D5F000E0F4B2F0F5BA0D93E1A18DCEEE5CA1FDA1
+:10D60000EF05519462D31E62538E4135C5AF45D7A5
+:10D61000222F23AE9D1630D001328B2A6417C1B958
+:10D620004BD6CBD2BA2495AE46F0DC10E568317803
+:10D63000ABC5234C3489C60E85B2A532E42CA616A0
+:10D64000436610ED5E86FF23EAF13774D861BD1999
+:10D650000DB8139BDC756A0B96D1B1627BF17657DE
+:10D66000EF8735F69C1C59994F74640AD67C6D98E7
+:10D67000663F61EA23A4E8E5168C98788048F4C1F7
+:10D6800090E5B855B0A05C96678F7E87E87F47D558
+:10D69000C21BB53A8658961092B114F694546C0D8C
+:10D6A000F5EDB99D6BD92D8C44FB04F67E7BB0EA79
+:10D6B0009E88D0F505BD40F3AD3C489D5327FFAC97
+:10D6C000AD11841ACFF0A81A1BFD854544076837B1
+:10D6D000DD2BDE36C239DDBC47A81204F10180F82B
+:10D6E0009944F8B866CCCF8BB27D6E86B614A2CFC3
+:10D6F00093DAEB7C5C79D2FC2415D94A6112E1C043
+:10D70000CCCBA55D35AD4AE282E9B8D601C86660EA
+:10D71000E115A130E4D0B02044F1DFDE28EF8C89A0
+:10D720005E86C5A5F4CC497F1B054080B96400FA2C
+:10D73000AAF4CBAF6906EF81DF197E4BC7797AF780
+:10D740003DF1773C05C52515F1B5FC70365830E242
+:10D7500083217AD84532531D4AD743DF3BE0CD08B9
+:10D760004475266023BBDBD39A578D9DF17E0C61F7
+:10D77000DD32498552CB2A69A1A2B2F89F033F88C6
+:10D7800013EFE1140FCA1BD36CD1454BB7F512014F
+:10D79000791E00B57CEEFB9ABFA06154A2A68CD482
+:10D7A0001045ED5638E0904FD40DD64706CD0E0803
+:10D7B00008758F59E94ECA2190DA9A941913A32E4D
+:10D7C00064F78A586171850996B04949E24261A2BD
+:10D7D000B94F97CD7B0BE463912CE9088CB130F005
+:10D7E0001899586389A3815BA0D97A227FB5780FF5
+:10D7F00048699443A646317A5824FD875832162E3C
+:10D800006B922492DA306049E094B6862AEFFB5995
+:10D8100017DB652F173166233F53FD2A4ADF602C43
+:10D82000AA3962F19C72BD61153E0286411BC6C4D5
+:10D83000521EAC507E4AA2E4164CA458C26D449AC3
+:10D840008BE2442046FCDF72F89C99F9F81A811C9F
+:10D85000D8D2D35AAD4045A88FA1C1108562675A6E
+:10D86000067C1D4F37D54962207608C23582F1FF0C
+:10D870001DDEFB257200002C91BAFF916D206CE536
+:10D88000B2C211FDB962A6BB90DC9DE2CF399B0B01
+:10D89000F2D644973317ECAE9100545422A5245D80
+:10D8A0006B8512C490D57AB2383B7BD960314FD3A7
+:10D8B00026A95DE507EBF4B502923311C5B3204408
+:10D8C00022E8F91BA204F0710F1A31F520981662B4
+:10D8D0005DD9152ECF684BFDA29AA9C543E9BB05BA
+:10D8E0007F819EFD9716CBF25805DF0425FA52DBA7
+:10D8F00008D75F06AAC46FB2201881F30D4A6D1FC6
+:10D9000062BF7E30309DB951482EDC7D96DF61ECE0
+:10D91000D7C8C072CDC29FA6F235BA3979D27CCFB2
+:10D920003971BD02919113314F14A20BCD47C4053B
+:10D93000F5F624D09FAD3395CC19CADF0DCAA92DB9
+:10D940001EAC4AA7E00CDD00D817E566B25B677035
+:10D95000C9DE1EBA0CC32E6D5B308BDFFAB0EA9FB6
+:10D9600084FD164A9B96A301C3DDD95CCD8D005280
+:10D9700040C63153F0DC7DE2F5349EB4E1231AEE6B
+:10D98000C87C55B8D22C58803B32748C73A29B59FA
+:10D99000E23E211663925ACC82FE245C0122323D83
+:10D9A00009AFD7791B2B76E6703523C192D72B2C84
+:10D9B000FB41B4CA223337659590E8D9203420EC76
+:10D9C00017E134CAFB23C4213C127C3423EFDD7FF2
+:10D9D00094AF6CC88B06D12178E83B9120D34E0DD3
+:10D9E00045D0EDD1BB0897EBC205F4DC6B544F96E4
+:10D9F0007135C95B543D28DA97B74E3DA7D270897F
+:10DA00005B1BFD7F7CFB185019B959407628F2FC4E
+:10DA10005B9488800B6BB8713D1C4B732470FC6663
+:10DA2000FEDEE90CF07586026BC4C9ED1788CCBA2E
+:10DA3000567BF2B164765DC5C7D07DD0A453DBD5EB
+:10DA400098B4D86B453849B366919E83F8A48AB1DF
+:10DA500072D320E1F13E61A7858DDB2CE77239207E
+:10DA600017BF7DE9BE1CF863DAECB6725ADC04A875
+:10DA7000AB07AD7CC646B29CDB820F720C777DC6CD
+:10DA800027160AE1F58896FE12530D54241AAC3A73
+:10DA90005F42E4576D9A96B40A57D82B6F22B3C7EA
+:10DAA000E2B8582D931D468F5CA59BD542F0635B71
+:10DAB000CBDECC955566253B87E2C9297036D5B1BA
+:10DAC00088F922D7C04C25CE5C02326BB21B378A54
+:10DAD0006D98685EEFAC9035520867EE72F393294B
+:10DAE000506B7E0B67A310C41FEDAD131BD947B657
+:10DAF00073E53EB11522C9A7A1B7E79BABD83B6C34
+:10DB00001C9D63F64C62EB92CCA7065F3FF42C534E
+:10DB1000433A6143D44568FAA2D5A197E15FCE812B
+:10DB2000E00100D51A7FBC12B8BCF8532B17B566BC
+:10DB300017DB8FA57236773A737DDA90F7EA7B9C14
+:10DB4000705867A6E92E4C02415722B51ECBFC281F
+:10DB5000284D87DB0FCBB0DE1B5072F00F5FEA441D
+:10DB6000823E68E7259499BBD4594F131D7DDF850C
+:10DB70002CFEB4BFDD0F8BB13A4BE62BF612318889
+:10DB8000C87B10A545B7AB97357360DAC01114098F
+:10DB90006FF7D1959E47B876A1F8ABCDF8CD0D497A
+:10DBA000CE5CF4CCC5182880E473BFA4F73543F2EB
+:10DBB000D4ED4BFEDDEFAE05920A5878D8BC8A2032
+:10DBC000F66563A408948C0D3B215454AD6318A5ED
+:10DBD0003D0875BC7BC36CA5E57011A81746D2B98A
+:10DBE0001D1CBF27A4F041B62B0EAE6371FB32475C
+:10DBF00096E52A51D52419A8751AA35C6E558F3F56
+:10DC00003EF6A0A8E4118C23AC6B0A71146DD39C72
+:10DC10008CE98073652FC78287DA9DEF8E3AE453D3
+:10DC2000556BCC99946BE0A959D5AB643EA53446AD
+:10DC3000940126DDE5C020C050E5505EC7455BA9D4
+:10DC4000643C7C740C2E74B20A592E84C3232CEFCE
+:10DC5000FDC4F36864EF6590841ABA649308BA67E8
+:10DC6000003AC5034FDE8B4F86F87F54BCEFD48F4C
+:10DC7000FA3D947C346295492C03016031E7E1CD93
+:10DC8000AE6D3EF4A200822B1DC15E42B66A835087
+:10DC90007F24C97C965B74FB0AE4C9533981BE2E8C
+:10DCA0008A4508A071BCB715391E6ABD9304C657D2
+:10DCB000F832816631C9DB117E547BA5E3E97894A3
+:10DCC0006E4ABCDA1C7FD2BC7A5E0D8483F63D447A
+:10DCD00019EC2E9F53DF44799AFE60F9E022F1D1CE
+:10DCE00007B212E1795D8048C2568C98281D230C3A
+:10DCF000CCCF91257B9A002FF80234D84B350ACE31
+:10DD0000D9C92DDE44F76B848F8893BF6CFE475CC6
+:10DD100009F9D9E3A87E25E01A79CFF7EB2377C07C
+:10DD200045F4413E0A64C142AFA5FBCC5833FF081D
+:10DD3000E820608225C552764C220048FF198CC726
+:10DD4000C0392900AE3206ABA1C7BB5FB486447BA5
+:10DD500087ADCD42CA4192AB153F031BD1A69DDDD5
+:10DD600091D08180C860CA4265C0CFF8D932AE90E8
+:10DD700076D476D0E85AFF414B8BB00FC725C54407
+:10DD8000998A9BAE736D976AC66EE24565CE8576BD
+:10DD9000F67CCF09DC17CDED19A13C8B143556D795
+:10DDA00073406F14C7A86396DED52127709540F5A0
+:10DDB000CF639573DC78DC8A69D2BE37517F1D470B
+:10DDC000F915C8EB2434F1BAD39A8A98888126FFD2
+:10DDD000CA92514DEDD27F9325F6548AC8F444E699
+:10DDE000D1FB18B6D26DF6CE21AD72DAADF10A3B99
+:10DDF00009A47087BB551CE107130F7CF162DBF3AC
+:10DE0000C7E6DE62DD2305D250B025F1315E9CB15C
+:10DE1000D4EAA9AB9840DD3E8C9322C8E64484B88E
+:10DE20004CAB30CC327D985FF5BDEB4270F271CCDB
+:10DE300059491A8BE634FC5E6B74A026EAA9D3E13B
+:10DE4000A7153E3BA403610710A6A4DB5181BB10BC
+:10DE5000D4802503B7BE5BBDE0B5AD5F05C95DB13C
+:10DE6000016BABB396A5A908B6A70B198F9C43F815
+:10DE7000DA5BDAA21810774E5341E64F49A2C5C1CA
+:10DE8000571F7AC5FDABC12075847FC177FD1E9BEE
+:10DE9000D13E561B9617F8B2E2AD0D5BE353AE4789
+:10DEA0009D24C722B412E021AE90D7C969D6E4E917
+:10DEB000C8F40D9CB00DB7BE4DCBFE0D55F60AD281
+:10DEC00066D4C9CEF54EF200BC94A3ABBA7BB16F59
+:10DED00049B42A7A2173FCE959538607BDD27C5391
+:10DEE000D58CDC5A4282280E75AD15D7CBE9FD6280
+:10DEF000F60A78FCDBDC4801FB3966EA1A7A221D57
+:10DF0000507561748BB382C99EB5952E864FDF2004
+:10DF100008372A1EC0A471DEEC845F0382F666CA4D
+:10DF2000B70B452FEE57305ADC7DE471E6A793B26C
+:10DF30002C89AF3AC74AD2D2CC2FEE2C2F88982CFE
+:10DF40006D7DEA0DB880366BC44B96D38A635566F7
+:10DF5000DF185DC67CCCD3985D0DD59287136632F1
+:10DF600006493BD92EDD1B341B2DEBFBA64390C28B
+:10DF70008427F59C8E0D7323FD42288AEE73D015FD
+:10DF8000F8D312CD2762D3B762EDFAD0E0F7D3AF62
+:10DF9000D7EA9C2809B6B6DFAB69B5256A8BA41C05
+:10DFA000F9F7136D9C65FA5F47144406CB9FF4267E
+:10DFB000A4A48EEFFF36A6234B3177C3114E5D55D7
+:10DFC00054C6E7F7F4A79FF0A5C9B808BA4ADDA57B
+:10DFD000D244EC9536DE014D04363A3B468EE49E43
+:10DFE0005B0FEED2B8A30B8DCE9A4808E09AA68EAE
+:10DFF00061338A734C9E0E53D40FF6B36B7D1E961D
+:10E000001DD1C796196499D4AC19F1935895180489
+:10E01000405C17C2D7B2646AA04D479570FAB7B298
+:10E02000FF0E51C00420E54EE1EDE7773AD9406993
+:10E03000537D6CF86BD521BEDA1A2E71DA20473683
+:10E04000839BAE6A45F8A549FA19BF9577049CC928
+:10E05000F8DE598B74E47D04F28BF5D51E18D76D6C
+:10E06000E94E2ECD36A22D0E602DF5B4BEF976F513
+:10E07000398AC05E50799B74EC2117E612C4643B68
+:10E080003CFFEDCD203986F6CFC0AE841F25917CB4
+:10E0900015025CD938995F413B2B35A4F095C570CA
+:10E0A00061F36938CDAAA801FFD6107A06F1E4B46D
+:10E0B00067DE81EE258491683560EFBD82A14E92C6
+:10E0C00055ABD328942EC8193E8D896E27A398C8C6
+:10E0D0005296A08E8D88DDF373FDF659F88036B820
+:10E0E0009F3BB4B2523B87E72DDFDEF1E019158F7D
+:10E0F0000B1E58407919056750937A96834497B759
+:10E10000446BF3C96DC13807D1D13EC3DD9BBB79E8
+:10E110008AED6AF6C93B1B722B799EF4670068ACE6
+:10E12000E7A2685721FB5AE3CAEF827CAEC8F59498
+:10E130005173577020AD93F66F0197F8EA9223BBA5
+:10E14000144E49FAFB76411B14939EAB614ED6A246
+:10E15000B18047244DE2C2229D774505BDC8EAEE55
+:10E16000325CBBD35BAA7B09D3AA19E966D9839435
+:10E17000260B596D1D47E2E4FC9728285BB627DD86
+:10E180008789F0EC2A8BFB024E6260AEDD87FE537E
+:10E19000C11FF8F4178DD01BE2A7E904D8B7FDD949
+:10E1A0002E1DD84AFA3ABEEC19A40547FD1A99FD6E
+:10E1B0000217FD86E79C6C8E27606D9DC37579659F
+:10E1C000A614A44E4A58B1B4D0BC006E73E7BBBDD0
+:10E1D000281613C9148A4A2338A0199EBA235992C3
+:10E1E000B80B37E2C7042865B44495B5D3E6A19BC4
+:10E1F0009237B6BA9AC5F3AE5BE97EB82F981A6A21
+:10E20000603B651604F8F785D046E73716AEDE5E4C
+:10E21000B002269FC9857FB03397AB9B789A3D9714
+:10E22000115A0D3038C7E8EEA42239CD8096F24C51
+:10E23000470298D4EF10E11FCD3681F0D8B33BEF01
+:10E24000842B5540F1FA8145358B198A6EBB56E90E
+:10E2500000B540DE273BFB2961ADABE1B57A06B6E0
+:10E260000257319369DBA51DBEF6ECAD0C56E76491
+:10E27000CDA7A10DDC5AC4940B48B2AB682E6568DB
+:10E28000B0514F9F5A77F720F4AD89715D18B1C630
+:10E290003FA7784EE88405DF8CFC02F78093C9D84D
+:10E2A00073DCFD2A1BCE60D9193B5F901A2AAE9908
+:10E2B0005777173670BBF8C762FA8D8E89C0DCEDD0
+:10E2C000F66791F575001C57FCACFC7C9B367A63B5
+:10E2D00099B9695B22B5551E05F1D37EB01AED617F
+:10E2E000E447A37A02CC792F300C68A88A5BE86EE9
+:10E2F000F361DE3FE0C00398CD69A4E76C52B35CE4
+:10E300004C342CEC91ADD3E89F370CD358C170E25C
+:10E31000AC9853DC96BC51E21D02E05BD1FA993E09
+:10E320003F7485B902819BFB7B78415FC388118371
+:10E3300094666735FD08A1698EE88A2FB63C00E82F
+:10E34000B14A9A8FF0EFD1F0124610C8CE9C671FE9
+:10E3500072C822EF47E4353F1F466FFCF9151F06D0
+:10E36000D70F7EACCDA9C200B181A8823999607166
+:10E37000946C3E0D8255F4C65F3E6C60BA3BF4244B
+:10E3800095BF3DCCB83FCE4A959E1F9E6B1C74A492
+:10E390009B597DFD75C830B3CF5F27BD3A5C3C000B
+:10E3A000133751EE19F3352D60E904AF278C8A5DE0
+:10E3B0007B99A31A55C8CBD628327CC5498A1B8CB9
+:10E3C000631B4FF4C98816B2D401FC788CB8D30310
+:10E3D000ED5C2B74CB22EE9391181DE2793CAC5787
+:10E3E0004DD8139D4D973C52A0F0575974196E703B
+:10E3F0000AA30CA8FA86EBB839639C85A489E10BC3
+:10E4000099F51603BFC4E2666387F4B66A347350A5
+:10E410002F10FDA0D90CD431AA349271D3C1101A97
+:10E420008C54BDEEF73BBBDB9642674674800A9284
+:10E43000A7F4FD2D407DA579EFB25091B71526F6D2
+:10E4400093639F4D28D85B5D6A7E3596761722D2FE
+:10E450000AF0E3D7FBBEE0140FA73B98C1EF89EFAA
+:10E4600021AEA5359BF674DE0F52AB26547A1EE41E
+:10E470000AA158AC126D111C98DB4B66A338D0DE94
+:10E480004E803AD3D3CA7CD3DDFE41A076485E6D80
+:10E49000EBA04C986B594ABE87B57FF1FA279DB225
+:10E4A00095148EADE5F441D399518D3DD9EA171AF3
+:10E4B00079ACB30C4C7056A940D4677B91B716C6A3
+:10E4C0002BE61B3CD128F8800196E21DAC4E1DF6D0
+:10E4D000D4B9F519627B061F7637DF3E30B1972F2E
+:10E4E000AEADA53371855189E002A4ECBDFA885325
+:10E4F00089FCC10E20A749C946FA28C0D6D50E808E
+:10E5000045C6374952E9B76A1FD9CC6E1958DCF7AE
+:10E5100074D014309EA0B5033A39778D8B95D40210
+:10E52000EBDF39885BA58B59C4FC25207D9E4BCA47
+:10E530003BC944838D1D18C2ED9E94942DBECAD94B
+:10E54000DF8D9CDAB83DC652F56AA6CD35119DA087
+:10E55000BA8807BF4AEB543D3DCFC443FC73955086
+:10E56000F793518CA9B0510934F3177736F93E1C53
+:10E570001E54BAE13EA822BEF9C0E88C0A7A29FBF3
+:10E58000D1D9FE4F3E813AA77B8F10C4AC251E34F3
+:10E59000BF25947B687E3ADBC5FCFCCB6108852FE8
+:10E5A000A240FA45639E229B9636A2D1162733FEDF
+:10E5B000D54A9E551BF3480594BCFC46F142FED853
+:10E5C000BD849A210435AED9AEC68F4D7141936793
+:10E5D000F86B2E9A046A1B752B74428271C2EB1F72
+:10E5E0003B02F0D6914972CF3418C958CE125A73F3
+:10E5F000BD185A28332525CD6979F2C8D0317E2F30
+:10E60000FDA977338E1F7791BDB03782FC07DF29D4
+:10E610005FB385432ABD45979F99762CA85B4543F8
+:10E620002FC4A64DC582D0D24D9613CC48CAC3651F
+:10E63000CD7891CA3F7986F8E0F5D721A6F72E5517
+:10E640009B409626321DB29F1DD1C95973FC8E483E
+:10E650008E2E76B3B7A9064341CE22CBDF076C4599
+:10E660009AED95251330AF3035B541033F41112E5A
+:10E67000E4F6E439658827C59F46181BBDCA2522E4
+:10E68000744BFC1A6F22C02C321B50598256BD8B22
+:10E690008F48023A7C05370DFB63D2056AB1ECF373
+:10E6A000FFE347687DF80C5E00F45CF913300A1153
+:10E6B0001365DA84DF93F9BFE8368C17BE1BED557E
+:10E6C0001E67BE6F17F1BD81D99250E4D38FCC7411
+:10E6D000CBDF61219CB87B3CD53A171CF140F98710
+:10E6E0000AAE232A8466611240678A9FCA1DE833F6
+:10E6F000082574E837D748329A50B6D49ED129837A
+:10E700009ED9F6B3DBD70A60D9FCFAF483AB41B5E6
+:10E710000E1A92C1FE2F8E635FD1C8223DD6A68409
+:10E7200000E336752EF474850197D8E8071BC47D85
+:10E73000B090967604F295EDC8C78BA3B5FF11C9CA
+:10E74000138C2D68ADA22469657B8CCCA2B6A3691D
+:10E75000B7418A2434B31906FBA1F0E9BAE4B8E260
+:10E7600091B9A25D0F484119C7CD971C6B8268A172
+:10E770002FBE1CFCC8125CCEB6571E8F823B804059
+:10E78000827202242FFEB5F8CCC252ECAE0A794553
+:10E79000797C6569E90655FB579D576986A5478CC5
+:10E7A000ACBE8DD412BDA5C33858584F0D23C758E1
+:10E7B000EA4A94E984DA9F89DE9D6CD6F0B87CA79A
+:10E7C00067E56CF7642031C96EA5A0AB43A0063F96
+:10E7D000FF76AC9CEFE906E2DB7F99F930990434CF
+:10E7E000832D2670AE90EC2F3A7E8FF5788E6421C3
+:10E7F000953B27F2C1283225CB52E389638D7A1EDF
+:10E8000053C1E8BB8A92B3998EE9D39D81BCD80FDE
+:10E8100075DFFA18AD777C4B9C9DA9FAB435E2B24E
+:10E820005057E683042B001DB1176EB56B3850EDC1
+:10E83000FB72E92863F9C2BFD69DA9C71068F880AA
+:10E84000AB88089C73736B74C6BE89348B2171DFEF
+:10E850000D478195341E12FB20BC10E6F48889FE1A
+:10E8600095B7644D9794BA1FD5E714BA447C37C95D
+:10E870005A3C11D94A0AEC112F7FA90ED9068B1ADE
+:10E88000B0BDEE490CBBBAE89B1941431EFF7EC0E8
+:10E89000CFDB60BC2A8934C948F07D1D9492F13ADF
+:10E8A000C59A7F0E9A68D9E5C7FC096C5561447D0D
+:10E8B000FD8195F60F0560BA698E19971172D03FE8
+:10E8C00005993EEC76A87DDABD09008C9E220FE703
+:10E8D000CFEF169CF959531C43D03A03D1C8870592
+:10E8E000EB38502B0291964629A8748198A4F56DB7
+:10E8F000F79B9CC3FC0962AD8F1444AA16DE854DBC
+:10E90000780138EFCFD7FDA9777780CCB07CA9B854
+:10E91000DF3A2436009115D00BAB0C7FDAB9D60460
+:10E920006F9FC86558484AFA73002A71CC9752D134
+:10E93000E093684DDF513389E8CEE5582711ACE10B
+:10E9400077EE30D9817B787A8E344FDEB2C953B2FC
+:10E950009584BD6518A11378DD044980A638670148
+:10E9600055E105E164418BDD49C17900FE0E433C70
+:10E97000EB1A37DDD3195F200281E86AC984870763
+:10E98000D2B33B827857CB8EA15D0EADADD67E91D2
+:10E9900037373258A376479B14ACDB58D2FC41F989
+:10E9A000C6552E11E557D09F6AC025268C8A5A0677
+:10E9B00094F35698AB2D6E23B16DF381CE38D516F6
+:10E9C000C271C51E677089FCBF76B49654AB7B5884
+:10E9D000E84BDAA768074A50452B00965360608DD4
+:10E9E000A54BFE612E8089C6516E5163AE34155C15
+:10E9F00013C9F3096F733CB557CBC9EF3AC6B438A6
+:10EA0000EF63D16F26AB99D59EC9E028DA660B0477
+:10EA1000C1397DD6E940350A4B8ADE086FB0EBB0CC
+:10EA2000299682E583DC744BA2C066ED051F9542F2
+:10EA300078142F8E4F10EC4040005A75821A3164C2
+:10EA400095802E93657A655DDD1D84F30A69959640
+:10EA5000050BC5D6267E491EB1E4552139C0076F86
+:10EA60005DC818990588E49724692B7ADA1A19A0E9
+:10EA7000B1C029BFE2505242CB7EB8510A7D398BDA
+:10EA8000CF495EC06CAA38657323FE350114B462A9
+:10EA9000F354CD70A5A7045A693156E5644CE4DB04
+:10EAA000BEA68FCBCCAC6361DF2D4E73B72EC3EE09
+:10EAB00049626E0FBEFC3AF81FF96FCBA2F98F06C0
+:10EAC00074EEF98391548AF0EE10C2DB776BAE944A
+:10EAD000C77E94980475CA7CB888F68A601735F4A6
+:10EAE0004974627A6480D6FBA0235044EBF8A2B349
+:10EAF000037380C72C5143132DB9704E034A37B6A8
+:10EB0000AEE918C5A0726838A173E2F238AD188A70
+:10EB1000BCF53621EE3472ADC79EBC68BCAC20EBB0
+:10EB200092EE2873DE79FFB6BD850044B125330E21
+:10EB30007835FFB95FC09828455D5EA00EBE783578
+:10EB4000091D9D70A492A7D367076A981A7A443F5B
+:10EB50007F2EED5A18998CD41A6AF11974034A81E0
+:10EB600039E5815135777120A81ADE10E5CC3E8A4F
+:10EB7000619EA0F54B80051F95F4E178D6DB00F48B
+:10EB80005F6539CB010E160E1EDA69A3B50A3A711C
+:10EB9000851D02E88DD2151D4CB239A78378B8A81F
+:10EBA0001A3FC6787B3AD465B1D419ACDAE30526AE
+:10EBB0001EFB5864CF5F205DD04B0606A94BEAAF21
+:10EBC000B9C69D41D6E2686B21FE2AFD3A40C2BF1C
+:10EBD0007B2036348DC71DD94ADD775DF48CFE5914
+:10EBE000787CE15153E1C621D7D999E7233F80C909
+:10EBF0000BE8886DF5DE41BDE8A73D7B46033E127C
+:10EC0000C8208C8C29BBC116FAA6123ED8D01B4155
+:10EC1000A12B06553DF6836AAC60ABFEF8BC3E50B6
+:10EC2000B742F8181FCDA6FC6E5EC9260D3481943C
+:10EC30009503A713FC8CDA7C46C4B2528DF8D72416
+:10EC4000BB2EAC7C3A42825A17DC35E896E51D456E
+:10EC500089AB4D5AD6423E64116E965DAC133FBAF5
+:10EC60009BD537C97B6EC5C4FEB427A53054A5E239
+:10EC70006A2BAAE3DB175F868F332BC9979B95BA64
+:10EC80004EB417F6D6A43A386369B1E3B4C42D8AFA
+:10EC90000C421EE798A1072A3A72424C900063F199
+:10ECA000714AB69FA0589648611256689A2938D87A
+:10ECB000E58F32472BAAFC1B3D7AA91488A7647301
+:10ECC0004D13262FEAD21FDAD3BCAFF65A15B3D9AB
+:10ECD000251DD8EC0F993CD8B5D8F489D25006B38D
+:10ECE00085E098EAFA68A76E345C39910873825718
+:10ECF00099B129A482045E106F6A104E963100E427
+:10ED00005AEEE058783F43F50282AF8F5173FEDB35
+:10ED100014CBBDD69647C79F4CC2E3672B94A40182
+:10ED200070C06DAAABB1D825ABDC161AFFF181E239
+:10ED30009ED5E327B7D11A6A4D6805A285092DC56E
+:10ED40006F22D5D508122BFCB0C55D65B2FA7EA541
+:10ED5000180E42ABA67ED7EB996AE8C361B29A72ED
+:10ED600004963B7B0A5A8BA88742C253A6AF5BFF2F
+:10ED7000A9F5127D775B8B7F8705D6B700C8F5C0F4
+:10ED800069E387570439BDD615105F179BEB9011C7
+:10ED9000FCA320697B88445F85F43E6A960CADFB3A
+:10EDA000EA6A3C301DE5AA7A2CB8DC5F4D6645C99D
+:10EDB000677AEEE96431B46A022E732E186D43450A
+:10EDC0005CE0DD5C663B36ADED9A1E01162F7FA53B
+:10EDD000022D06A0DD567AD391DF3950F450679D9D
+:10EDE000090E468D18F1F85701F33F84CC8A8E8BBB
+:10EDF00011A27C5DD782270AB1562BD0B7D94B31EF
+:10EE000060B182D8F471924E4F6FCCB520DBC50E45
+:10EE10009937FB7FB8E54E645F8C61C44EB2AC6934
+:10EE2000AEEB8BCBA124C80E17C84F5552CA803702
+:10EE300080CECED0AA5E42722F6997C3E5B7AEDC12
+:10EE400060B3D1FDB9EC6C7EED57E599A0D685F3A2
+:10EE50005C787B9AD4CA7C2C912B82E25841A69193
+:10EE600032025187BDE92F14CDDE3F0A5CED7C0CE8
+:10EE700014EBC0804E2F88CAD6DED5F19A0BBAC5E6
+:10EE80002531E3C207480B2449564F6902407EAE44
+:10EE9000930F813B7414983325A4C24BF7F82F4984
+:10EEA000E8C5ED5315E49DC1D1E1DCCBBD8D4936FC
+:10EEB000E042CFA8D696A3A584AF41E63BF9C5A210
+:10EEC00085659E10786D259E24DB7186EB401B01C5
+:10EED000A7390AEF6AAD280A947E53600975779EB8
+:10EEE000479341E575A8A55F888ACA46E639BD6D96
+:10EEF0006B9D82706D9E12C699A9223BC00173352D
+:10EF0000B4459E66803A4290A402D2418CB88E1CD1
+:10EF1000395553BFEAE765810006FE87552316572A
+:10EF2000A8A17E6B32407B1914BE851FD9A9CA41A6
+:10EF30005DC0BCF1E4973C5AE703F7AD8F673C2A0C
+:10EF40002548BE710893959818F07FF21D2DC8C60C
+:10EF50000BE8D4782A19CA9EBFA0EDEAECAFA7B798
+:10EF600001011B9291297EABA6850C29A117DC20FB
+:10EF7000C210F220AC048899711783D6A0FCB8CBDC
+:10EF8000E2C2419582A4ED71A6F4AA5815FF2F772D
+:10EF9000BF650287CC38D26084B5AB99FEBDE2D99B
+:10EFA000389A02994B895DE394DCD30FF0F18357D3
+:10EFB0000EA6DE40627D0EA31E5C44C3993A56FF46
+:10EFC0000540BFCBCEC76CB2B589DBF949823CB9ED
+:10EFD00033EEAF9682C86BBB12EE3268747D54621A
+:10EFE000235977DE2A95F37E9D91CC2AA030B7B9BC
+:10EFF000AEE7EA539B1D5AD69347110DA08588882A
+:10F000002BC986D73E9BC7F2E3BC830CF791707483
+:10F0100016AA26889D4CAFB72F9BCCFB5291C1BB43
+:10F02000D75ABDE5F158DBAB3AB1E60FA4FE57560F
+:10F030008C6181A54B1F648139A022868DAB358FF1
+:10F040007D93CC25980D57D9406462EEA86C40653D
+:10F05000488D7FA0ECE3FF1DC9267BABA867BFE40A
+:10F060001E6BE434529E220EDC525BCE855C7945E9
+:10F0700027C1909E9D50149DCBC70300548CF26411
+:10F08000F09C2E82B8B0DE85AAB4035BA549325D40
+:10F0900012FA7B2E92FE4E64B3744758340D827977
+:10F0A000E178F2172C2B5F6070F884A8F6ABB037CC
+:10F0B000FB2F4B7DFB909844B7C653AA92A881EFD3
+:10F0C0005FE4B61DE007A02354566FE93558D3C856
+:10F0D0006012A7243D7DA57CC1653AE72221F50495
+:10F0E0002C61ACB1539CABFC9B0214FCFB21947EC5
+:10F0F0002D8B3ADF388BFC0D6BCE2B7B04077DD03C
+:10F10000D4E429545EDE5C634527E8330D0991F0B1
+:10F11000D6DC281E107F35FE1C1094CA49BFF5CFDF
+:10F12000003FC83335EB07F5B44EDA109E5B02485A
+:10F1300084B40834EF98784730425795ADE602041E
+:10F140002486A558CBBD0C2828B5D1539D9F08FB1C
+:10F1500072C487B35010BC6FBEEE9F9A8277F723BC
+:10F16000348320ACAA42C0D21934148CA9E5F5032B
+:10F17000FCA15DB07A5552D965F5538E665B854D1D
+:10F18000C4379067A4218C67565087C3CA9F44C177
+:10F190006466F3AA2A2746BA6A2804CC023AAD0B61
+:10F1A0000295C6D10DC57E1B9F350BD182A908944F
+:10F1B000F0A381CCD711023D316F0F8928E55F1094
+:10F1C0002D921BFFDBC95EE0131CC3B082190E3801
+:10F1D000B8506956277CF2D537A1A739BAACE02BD5
+:10F1E0002992C9510E00BE5CB6415EEE16E5B72FFE
+:10F1F000CCFF418B908A4AFF977E849D2423A43FB5
+:10F2000027DFDE3FE99C3DB0CAE281DEA1EC75CA92
+:10F210003E87A0694222589D864EE86DB5E4368A45
+:10F2200062062481D722AC5531E0917740810DBE32
+:10F23000A07AFEDA02BB6CD5D2D497B7F64EE912AB
+:10F24000738D1A4813AD9D63BD00E83CC77A0AD799
+:10F250003281400343D238335B492C81CDB0890BD6
+:10F260005E27C0CE28F03CACB41F1B454B424C4837
+:10F27000C4F70F6A7716B9037441A5A46204B39862
+:10F28000887E231E245A43E2622AA086BDAC60A277
+:10F290006EE43DC3546C47D5E1B7EC21745FE5B62D
+:10F2A000E8E8CC0BFD2252FA6B7446985B0CC989D6
+:10F2B000F17CADE495C3D14F99207E7356C2D45CE6
+:10F2C0001B3E0A5AC5210D53E1CA5EBE8386A012B9
+:10F2D000022F0CF5000955D87074D30A386625350D
+:10F2E00032BDFFD4BE0868FAE4C6339795EC22CD50
+:10F2F0002A935672002E61480CB39B6361081FC6A7
+:10F3000020909FBA211565E437200B058009F90686
+:10F3100025E1A01F55A3AB99675F4358C199579B3F
+:10F320007B94E88D18A68CFD76413562E754D3A70F
+:10F33000DE78BC389DB849F91B5E7C9783DA71A7EB
+:10F34000E5325452E22061E31F0F2B6952F26C89BF
+:10F35000C20A071CEBBFA5D8BBD206B0E967A6DA84
+:10F36000DCC2581CC2507293D4F455B552E3DA365D
+:10F37000B2BB9BC16CFB015A613C684C57FF5D24DA
+:10F38000F67E20E929BC60E6D7F35463D09D75284A
+:10F39000DBDB4B21BB82587FE903843B27A28848F3
+:10F3A0000E76AEC3C0686406D53E66FF2F1D6BB1F6
+:10F3B0000E03D1BA678F87E792FFBF1D3320F6CFC8
+:10F3C000817A36B6C5F4B6476B28B1D14AAF490643
+:10F3D00042B0E0FE6E5CF8D8A9984AE82273B0F11A
+:10F3E000874CDD7EDABB8E8F133E1CE32D19113363
+:10F3F000503AF6FB428425E6DDA7D354097D726EB0
+:10F4000099303125433B9E15402EBAE6153CFE0748
+:10F410007EA7D6B49BA7E0FE6590F2E6B86E2638CC
+:10F4200048D4CB36AFB7ED981840B91F59E1CAE9B7
+:10F43000470C1C700DA19626C6F2289FB1EE162E21
+:10F440005102D046F71DE0D44F9E4003ADEC2A8117
+:10F450001FC2BDAA11A235B167321B6445492FAD49
+:10F460003B9DC5D973688A751ED2F943C99D7EBC80
+:10F4700086F0D8CFDEABD941D61D46065B40E79E6D
+:10F480009C7FF1A4C6FC3A5BC7F504582AD811E466
+:10F490004CA411B50CEA3EE610855425C88F7AC9F4
+:10F4A000CEE66BD0A529CB086D60BF31881066F61B
+:10F4B0006AE63BCFB4DC6EC8919EEB26682C1076D2
+:10F4C000B800479723F07FF170BB711A3AB4E4514A
+:10F4D0000B5D3C0FBEA01D15FBA13A5673925D3E1D
+:10F4E00030E8F7D6F5A4B6386DD21DCE03999CF955
+:10F4F000467E0B08B641C6DFB36C6B1A95CEB4429C
+:10F500003F3CC7E5628DC5887740BA29A9B568E157
+:10F510000943BB2C37DE58E632439925FC997F7CA2
+:10F52000E4EC022C4D83C668B772E1F6DB829BCF18
+:10F53000E1A4083C8F9BE98B17BA999B7725F9AE1C
+:10F5400052DFD97A6D83D47049E23ED3C9C6879A17
+:10F550007489948C951B08A21DA1ADC6BB8352482B
+:10F560001D9528CDC83C4BD4F213459A139D6BB31F
+:10F5700001FA9753D4863BEC1F69C689EC6BA80E41
+:10F580001C14B7DC56C2D01C2AFCD576C5F0CE4878
+:10F590008CF3741395A6537244F696F9B9FE055789
+:10F5A0007A4DFADAF76E546B09A85D4C82C0F420EC
+:10F5B000FED80C2A815FD1BFACC1D3C71052D4672B
+:10F5C000F20A0EFC10EFF3103A01780C25A64ACC93
+:10F5D000E8EE4959FCADB00B52C7769CAD6DA5D095
+:10F5E0008769CBE31496919D50477732AAD71119BA
+:10F5F0003748C89C67FCC4016AA2338088DD91FF4C
+:10F6000034E43AB174954AD5E35A74EC432608338E
+:10F61000F98A85C684ADF3BF0095214F89C15E2963
+:10F62000184E508127D131CBFB51DCF9B085FF1149
+:10F63000E7FBF93D020EA2531BEEECB65DB8E5CF39
+:10F64000E2AEC2D3039F7F7C2ABFB7115AC410BE5B
+:10F65000B4D1DC7033735BF46931519D02941FFAAD
+:10F66000998CF290E7B3BE3B29D2D612FE2DB54E4F
+:10F67000F76FE9E4CFA3BF06CDDE1462CACD0CD488
+:10F680000E0DB2E696AC612B945F2D32BD0620FACA
+:10F6900007AA7A09AB3DA86CCAC80394CFAB814DC9
+:10F6A00072AF2247D2A3337DB3EF9D82F98222DF6E
+:10F6B0000EDB88405F8F68A2D05BA9BE570787BC6E
+:10F6C000155AE3221453F8C00DACFFD6AF00C4ACFA
+:10F6D000429123632C3BB85E7D38EEC7A39C9B4FC1
+:10F6E000AFE319915D29C5DFE67467E95623671515
+:10F6F0004B81AF7A75EFC1822AFC5533E12C529EC3
+:10F7000027105A37C78E22086BC8076DCFD8D7FB92
+:10F71000291BDE4FC9E2EE654DA2A440291D8DE7ED
+:10F72000CA012EA49C96DC7F1A00732EB4D709B4AC
+:10F7300097F55D6F58E22D4231E2C9B24C509732D5
+:10F74000FCC9964CFB0FFA0D74B7BDED8F43E12752
+:10F75000CDC97B4659205E9BCDA4856A8B7346C775
+:10F76000372D65D21C544801D5BFF90F2EDC77F236
+:10F77000666D6D87E48FFF74B5D264ADE0476FD4DA
+:10F780006EE7F6A24F4D5357A142DB003505A0DAD4
+:10F790003D60B28F4924BA627E7D326429D17B7884
+:10F7A000EBDD76D9F1426CDF4AD82E7D21BDCA0649
+:10F7B000F198D65103BFA8C4F9EA6515C0ECB5C2EB
+:10F7C000C704B932E0595FF064021CEFC0249DE524
+:10F7D00086DC5F980085196278616D7C11F781EF96
+:10F7E000481A22623A0E0A97A05E6242D36AEE116C
+:10F7F00052D59683C5412AD37DD972C2CE1C3779A2
+:10F800003B8A0156F43EB0947123F436A0BE92E5D3
+:10F81000BE1532BB9A2FC261D0FA75C806F8D42A39
+:10F82000603B5043675D5D3A067592D4D5DFEEA923
+:10F830009A1F1E653310584126DA59DD37429D3B29
+:10F84000CA2D088DB09B6319BDBEE651A552CD06E9
+:10F85000832F77E118D666F1DB7A464F18C9967286
+:10F86000F875810882A2DBC9652593911062844FE7
+:10F87000C88572F3A61D1730769321ABA4C33D262D
+:10F88000A31DC0F193D54D9426B8F9938B648CC118
+:10F890001CBA2671768756F6697B13CACFC8B41A8C
+:10F8A000CB236F2439F34AD1E9AA0A6B50FB337E8C
+:10F8B000C01E0D904C6ACFE4D02CA6EB096132AF8C
+:10F8C0000F0BA113DFD504AAD272AE957FA7F9570B
+:10F8D000EF7DA919E00E92FAEA884C4F2FB033431E
+:10F8E000B52C7602A3459AF8D37EBE9215FBA5A946
+:10F8F000B2C27BF0D23250B41B5282305DA0CAD467
+:10F900006678CC3A0294E5D37D457039C4F267CD70
+:10F91000E7068556C3890B0997C6A211EEE44BBDD5
+:10F9200080EAEC608B9E9005749D9E800CD9C72E5A
+:10F930004BE414F1F85E17A230CC8432F66602ACC8
+:10F9400041F1C8EA6D7FBC91ADBC91D266646D3562
+:10F950003A7A27D7954680B36128CB17CF698C9622
+:10F96000F0E94957B6C93E0FD96968B8C0C111BCA2
+:10F97000E993AD72885ED546F3AEFC0358CF5715B8
+:10F980007CC86DFC80DF383659975A5790CD983532
+:10F99000575C26E88F48EABA1380C10E9910061DFD
+:10F9A0004BAB99610024777B2825B9D57A9E5DD031
+:10F9B00009565A3D4E3651A00A55BE7C14D7B4762E
+:10F9C0001AF01F93E9F4F89835F6F4711A9CA1AA7D
+:10F9D00073900A9CB2BD6B9B3FBD9DC5B0E3DCE359
+:10F9E00055BFB8DE87FEAFDD535288C7FD5230AD3C
+:10F9F0000653DE2196F233D6791043957A6442E4B9
+:10FA00000967B91A719D9401818E69339E764D0DF7
+:10FA1000D335B4927EF60B89F722F198CE954E40FD
+:10FA2000671E23E26A4D904F92E908C7AC89C385EF
+:10FA3000A2BDA97FAB8CB1F5740BC43B832B0EAC7C
+:10FA40006B62BCFF546BD88AF93932B27495C8FC2A
+:10FA5000FDCF10F1E0637D596F87C9166AE6C34296
+:10FA6000A717369E9CC5B1EB3DDC1702230719E3AF
+:10FA70002CA743E8EB8C6ED371CB62EE4A647F22F5
+:10FA800090B746E1C07F3E5FC45101E0DB52993E32
+:10FA90000F5BBC060F691322165D02FE2C79EDB0D8
+:10FAA00055979D855100101C9DA42C871D5C0FC38C
+:10FAB0008898C6022D1C18A7B37B873124169C0D8D
+:10FAC000C9FABE2457E7E5296D6F8046F5C8C6D14F
+:10FAD000AEBCE8BF324ED5F13193A9EED07E9A97F5
+:10FAE0006643D835F7179A89A702695FBEC8E1C097
+:10FAF000A89B585C272787D9C812B0832908D066ED
+:10FB0000091BBBD5925BFCA7536F6879226BE3DCC2
+:10FB1000128EF82D80CD20C4DE6E1999D55E9DEB36
+:10FB2000D6A994CCCE992F80D05D67BAFC36C2514D
+:10FB300050CA33448249A39CE83460AFC8D3D498F8
+:10FB4000233723C785E5CDF58654E2C7FC6BF2F970
+:10FB5000D891A6F25EC20CDFF4877E741A1D7ACCAF
+:10FB600055F454C0ED7D7D088D5B131AB7BE21F0AE
+:10FB70003BD63E96653CC70A630FEE3C757BC3EDF2
+:10FB8000C74F484836D91E8968749928D80283B06F
+:10FB9000C7E62A9FF32836330B2D1F46ACCB0FBB8D
+:10FBA000D4E05C2F3CDD84C57DE4813E45B08A4DC8
+:10FBB00074AB13E61AD57A99586A7EBE3A10F7E00C
+:10FBC000D71986983A2DDE60BAE84AEEB90BB08DA7
+:10FBD000E7EE03081CD3AD72BC3B82B00395403CFA
+:10FBE000B7709F3056D1084566955889F9D2149E52
+:10FBF0008107A9348643AFA08729262482B8386FAD
+:10FC00008E915EF0DFFC45D927DA5ED5E48BA81E25
+:10FC1000D93DFF375E5AE3B69C7AA0C2491A99E4EF
+:10FC2000015518546D38785F5241A22AD07D7F3F2C
+:10FC3000CC0E5BF60A4605AF503F702AA45F78737E
+:10FC4000F22DF9484EAD5D6F7C8157D3D8A47FD398
+:10FC5000A9DDC8D60BF64C45082608FF1E98145B94
+:10FC600097043BC0AF3D146AF94CFFBBFBD265A3C0
+:10FC7000541A0B38F37926447ECCEA04466BA196DD
+:10FC800023A7D245509F5D34AC286CB1B1CA8578AA
+:10FC900023BBBDC0DD7DF299A150E4AF66DF2688AD
+:10FCA000C948D8B8668DA84E08C3A0D5C540407BCA
+:10FCB000ED42036903FACAC8C0FCE38A3CF40FCEE4
+:10FCC000DDF4E41C458A6CC66C10CB2DD431558E06
+:10FCD00062900604DB9CC26862C777112692F167C6
+:10FCE000AABC26AC4753DDDA6CEC19A11075A09CB8
+:10FCF000E319D48F2D97CB922E12DC31A0A9FFE50A
+:10FD0000415E05EA9C807DC7E771D216E19CC485FF
+:10FD100093696D48739806D0374F6D1B6876634CB6
+:10FD2000551EC32335808330E1313B665D71C028A9
+:10FD3000315109D05462B1FB651AEBC0560E4E51D9
+:10FD4000B5147EFE7BE98EE544E7ABA764CEAD9C9F
+:10FD5000F10E71AEFB885DC3F1B37023596EFA10DA
+:10FD60000B3E46B2980217310C2DA320369980869F
+:10FD7000E0F7B23FE4F22BBA3310D62F98A45945DE
+:10FD8000D7BE6B1B2FCADC6433448512D729BA480F
+:10FD9000BE2339642C8BC2D5246A9B6B84C4C09269
+:10FDA000868F32EBB9C7BB9B71A181A28BA7B3D958
+:10FDB000D5736ADFC12CA7A6E5CD3F57C5BFC68264
+:10FDC00044EF551456BF9B8B7B121CBF0DE8156882
+:10FDD00096CA00A92B840ECCBFCD2C0D2D71933665
+:10FDE00045F64F583B4473A9FE32EA71BFBF1780F6
+:10FDF00018B9249AA0D5457CE7B42858EC3D6DEE9F
+:10FE00003ECD9216F2343519155C89406BAF737B89
+:10FE1000173FEE7BEA243E233F450E3FEF84FB3A3B
+:10FE20009CEB8CE910F253E47C44BB07DA332A12D2
+:10FE3000ED23CFA8D41D9BD881F3DE33DC3DD48ED7
+:10FE4000736D63E77A55237889ED33880FDD212FB1
+:10FE50003E0CDA1FC9D9961DB52FC9902E6DD8FD5D
+:10FE600009C653632313F5674681699DE04B65BC62
+:10FE7000592831D0F9838D0A04D11E45CB3F9940D2
+:10FE800022564D5821A11B155A4CC909B03133EAED
+:10FE9000C571B72632BD6688879271B4C770422299
+:10FEA00000C300C911DF054A7D0DE3D0A3424BC555
+:10FEB000DF6FFAFB9AC4CFD277201CD92871607308
+:10FEC000B2AD8B7B3F8B951F3E475914676522046B
+:10FED000DB344E88A2FECF1502004AC4005F3A5CB4
+:10FEE000BE4BABAF864ADD9C12E8D0A8CD8687A971
+:10FEF000007BD44417DCA100B17302E823C301D90D
+:10FF000031AE8531CF8A0AFAD94A5B91F6CCC7CD9A
+:10FF10002FA90A8904BE930671F71C63BD04DAA0F9
+:10FF2000A8F69538D5BDCF1E774E89C05CB1CFAD50
+:10FF30007F5E080D2094C9FF6F33FABABDF8632FB6
+:10FF4000C2A1F3DD92F35F497ABAB7FC554E87231D
+:10FF500006BEF77510802649FBE933A41E1891F3FD
+:10FF6000678DB5673E407E6B577A12CABAC5FF8768
+:10FF7000C39707D6CBECA116A66CEB543578870E49
+:10FF8000079637E188580124EE37F9C4E85DA6806A
+:10FF90001EC9FA1F19CDC98B04BD19FA3DE7A9F096
+:10FFA000B59947BE73DDD4E485FAF539C7E9D4D2F3
+:10FFB00015B7BCD20D1652826C517FC60315567709
+:10FFC0002E7CD99B109AC2584FAF0A1609B45DD641
+:10FFD0007D51F68ECDFF5A39D9C1C655C035514C29
+:10FFE0001761C0E7214A37263CDBC5314EA06E8F32
+:10FFF000CD9AA5F681A68BB0868BB5C75F256FD845
+:020000021000EC
+:100000000CC48451A553787279F1D3B634728D60E3
+:10001000B8017D4D25D41FFF3E1AB45F0AB982AFE7
+:10002000756D642C484F2D2DA662EE86888250B5E2
+:10003000E0D1651DC83F5756BFE24F3EF5ABFF808C
+:1000400094EC3B1A94DA6BD904F1E29510F970C97B
+:10005000C0F6B78DC31A3F21CA4743FCD746BED866
+:100060008E1C312EB1DAB057761BFEA38AE25D8A70
+:10007000A38DDEC4FF5582151620C2A89732724D9B
+:100080001C172281174EB01FACADB469ABF9090A39
+:10009000D416E2B83CC9DBF212826691CA8021ED27
+:1000A0008CA293F878D987B22F732CECDB0D140453
+:1000B0004BBAD29FF4118B94D8AAA1ACE9C80B5AC1
+:1000C00002CDF8BEFC0078EAF3DAB451C36558F308
+:1000D000F8AB7384A0AA161EE43CD917B194146B34
+:1000E000B7CB548C0629903B42DF34CA405D2E3D8D
+:1000F0006FD4AA16786AC84E65029183720D0EFFFE
+:100100006BEBF3CD588E5D079C52714DA97E1005A7
+:10011000FA4D0F41A98BA3600F0E785B222E0E6162
+:10012000C9C8AA02B732BF839276D66C4919D728BC
+:100130004358BD757EAD91BE6CBE97F5783DA2D893
+:10014000C7F4E673CF6236FDB7FEBE04BB662A5C19
+:100150003C0BB1CAF57578B772F6DD4D9E1A75E4A1
+:10016000618F271AA0C88BA18E7B8EB7793E837FC3
+:100170002FCA5E8D8A62D83410DF5B84CFD9DDD37D
+:1001800096B421383FD88101F0D31B41A400B76653
+:100190009DFDD263376AC4713D0C83D5288D9D7B4C
+:1001A000B400651FBF065210202D23C75007E895E5
+:1001B000EF56B479FDF430D3F61765FDF54247AD3F
+:1001C000927A4243239EA8C3891D8F93C867231345
+:1001D000AF286D1B342EA81F3BA5337193595A616C
+:1001E000FB5D5843115090DDB67B8AD0038002C37B
+:1001F000B724662824CB2DA613BBBE2AC40DB38911
+:10020000507B6FD2DB069E3A72FBB0A6FC7A5A3F57
+:10021000C206FADC19335A4C8739DC90CCFF4CBD4E
+:100220002A5BDC2D777EB79A6EC433407E263D175D
+:10023000BA7030C5BCA49C9CCA31A773C11D346B75
+:100240005D175A28571D2ED98533A5011C86D20962
+:1002500066D258D2AB3CF93232B464E64D2B6E9381
+:100260003B64865B7A2D8533CF7DBFE38B3991B2BA
+:100270003BDA6E9046ABEA68D8D7049E379F907EF3
+:100280005D6033907A147BEF7BB75B5CFED00FFF31
+:10029000BEBC6345F4F944AF9DD82E6E191E8CB3D5
+:1002A000024E50E6880F58A4BE0EE6F1B4E773DEA6
+:1002B000B6B1E831EFDE562A5E924424337B86A540
+:1002C0001B26D57B2F0711183654C4D86D1370DF49
+:1002D000873BC1A1C6468898ECC7F0EA13DBC49BF4
+:1002E000ACBAB00608F80EBC0E43BB7E76222A07D5
+:1002F000F71326517DCC44A2EF769A7A54BFABB661
+:100300001BC1556A0D9D21732454F41F9AB0846E4D
+:10031000D245D2892F1317E8B1D05B47D42EC48AB7
+:100320008C31EA12E1BA0A9F67E5D54F5DAEB47C25
+:10033000B565744FC917703AAFCBA5A893E2EFFD2E
+:1003400053F7E1F02EAC056AA8C485A20E34FF7CF9
+:10035000630F639AC68FD7C289918F70C21237D24A
+:10036000474F06D18615211741550C5A64880BD981
+:100370005D3407FD11BA49DEF6F7C7630230ABA45E
+:10038000EEC79BD621A00B14A6F0362514315FD200
+:1003900056C026FEB10B94F31BC306526B69CDBD4C
+:1003A0006B52DC9A02C3BB8659A37280836BD4FE66
+:1003B00003CA13DBA593B3F30C2F37982D3AF22A17
+:1003C000C3A030258F9542DD7FDE26F3F02A2D0075
+:1003D0003288C714353082B53D7BDA45A72D47BC3E
+:1003E0007F38B86A65707C4BCFACDE06E3BD5B1529
+:1003F000FEF879783F228E26964BF6192FCA63496C
+:10040000172B081991EBDCFD382FBABD6191BDD0D7
+:10041000B4C44CE96C579C9D33CF17AF59F270F6BA
+:100420009869282142477B19BE5C13A38C3746503C
+:100430002946A4BCD64006567C786D6784B6E9A4EC
+:10044000B935D46A4FBB218472A5D6DB35F2B3AD82
+:100450002CE5AFCEB286E01CD64F633B11943762D9
+:10046000CF476FC2FF2B485B6FDAD2B7805AE61EC8
+:10047000C6A2685257154460055B44B87DD2548EBD
+:1004800057BC93E6B0A8C1E4A1DB64BD6035DA2BAC
+:1004900024D9301FC1C504342517312FB94D9F8C85
+:1004A0003B8D93674B32DFE5EC97002D08DFAE0004
+:1004B0005454498543A9C83EB43F45380231C17000
+:1004C000F992721344EE5CC09D2DD31D83031E3040
+:1004D000ECB1545A6179E1EA6E735BA3E2819BBF90
+:1004E00018813903CED9E8C25A530E5D0A99925346
+:1004F000832CD9C4ACB58D900113AC383FAAAF9C06
+:10050000BB3891BB98B7E75BB73D38A7FF1384A012
+:10051000AE49BD95C8EDC514B6402E7DD2BBCD8782
+:10052000D211D7D9336BFD3F6DB785EFEE32078D12
+:10053000AAF4BC718DE367E3C483A23CF4B079CC28
+:10054000ADDEEB3DDBDF8DC3E3D21ECE639313281C
+:100550007ED6C32E4CACD827A9FA64FC09BA25373D
+:10056000410520C5A096E28F70AC623F10F893D78A
+:100570000CCAD7877C62DBCED4FDA395584CDEB382
+:10058000616A9C5C0274DC26067AB16E44DF959742
+:10059000D5037E4C8067AFF9941905674502755005
+:1005A00064CC9210257A8D229C5DB8827BE75698A8
+:1005B000CE1A6F9360A28BEE81D3B5A1EF25F49E86
+:1005C00039B833AA33F2D5F3E3CECF5491B25D8379
+:1005D0000E66FE874C92E4F59DE6C6C17134403745
+:1005E000BE4D19949FF7ACF0054195D44EDEE6144C
+:1005F000EFDB5A31279970B70028946730A2286D35
+:1006000045CD4D88B30999AA60436D187A651227C4
+:1006100061523A8C1B511137C620B1352CCADC11FE
+:1006200079C871C8C5C5EB7B530744678596337796
+:100630000245DFDB83309A3389ED4D941E54B3B00D
+:10064000767AF2D4185343E66B47CE319BBC8C7656
+:100650004023F9C857EBA9F35F7230E505FD806CC4
+:10066000C3297C533BF4C984BC527356666A76B77F
+:1006700059FC49CA52E921E9CBA6193DBAE836A08E
+:10068000DF3DCBF76D2DC2E419FCE3A8608F1D821E
+:1006900066999EDE540962BE460210FFA5A60F00B1
+:1006A00077E4717F9E3304FF52CC0B910A1B493CC7
+:1006B000D02275947387173C06DD5DA46E3A7C0FDB
+:1006C0000F4CAE021544A4300FD2948F8C486A357B
+:1006D0003B770014470EF1816927645EA3F6E65C60
+:1006E0009159198D6AA58731C12872D46A1069841D
+:1006F000E84AA6B6F5E6D9F99D63ACE33FF659F6AC
+:100700003BAE3E2EB004C5A52F852B9AD90CDD1724
+:100710003639757F9EA7825E119ABDA330FC66AE06
+:10072000E609C6A4CAE42A4666E4F830052789A784
+:100730001381B1A328B4EEC50AEFED45D0CB92F6F4
+:1007400012212F7361EBC9E060E55085D1AADB056A
+:100750009B67754EF6578F7E529CD96E916A1ED854
+:100760005BC27CEFFE6CB867BDBE658B35663EFA3A
+:1007700012BC5BC836B034A3D34C5ED64B3F384076
+:10078000D606EE0AF3F7BCA7E29B9CA4E55F268E93
+:10079000BA46C1749EA2AD73DE09EB2E0C2072BE68
+:1007A0006A39EC181EB9DCE2B1EA3E2FF510030FEE
+:1007B0003FB57CB0CC84FEAB53382AFF39EBD9244B
+:1007C0003468001110E6F3624359B1015FC7862D0A
+:1007D000D5D6187878EF8CB5BDF2329F96FD74FAB5
+:1007E000DFBFDEDC161923D1411F66B7A91B72B724
+:1007F0008DC2513D1B22FD7222F36C0E5B4B81AA10
+:100800008F2ED310DD202812A6FC3A403AD363EC99
+:100810001EF0D089405C90E7B092B47B8D17F0FA5F
+:100820001DBCB6341560D168D637C37AE7FFBE70F9
+:1008300008B3488A23581A9CAD8F88FE5357D8F4C2
+:100840007BA8C7B6DB21CA30459D4E7B029B6CE777
+:100850002687065121A2AD710484733A84D6CF8DC8
+:10086000A86CC0722224B8EABEC553C6A333D92FE0
+:1008700097F31CFD195953BBD7061E5BA51E10BF6D
+:100880009DB679C24BAB14F474D3F8998D2B2A42E0
+:10089000508675E2C97470D1C60EC73F47FE39381D
+:1008A000AF2E30FED0B743BE06D4ED55F9A67CCCB2
+:1008B000ECE03F826398A9AA86A2D9C7E415F91C87
+:1008C000106846A0FC1DD48D3E376DE0B1589FD016
+:1008D000211C470FF455AD98FE74DFCB8BC6FF8506
+:1008E0004371432854E65F9F698CF62F9572C2626C
+:1008F000186E36DB1D03A7D43BCAA845055908531B
+:10090000304ED69239A8489CE0D1279E527E5DEAAF
+:1009100026DA4D24CBE7919A3AA7EDABD284C945AC
+:10092000E64A4821B372FD5B4D41F9810B7A33EE03
+:100930007BB8FB294A3153B24ED4574358643FD752
+:10094000F0011A62CFEF005D04D49162EAAC56E583
+:100950006022BC86833F5B1045398BC0E9FB0BCD21
+:100960000AE232884ABFAC912FD74B2BBEE7BA5E62
+:100970002C17EAC3D8BF22F8C822DA2C4A77C2DA89
+:100980002E6B8996485A22AC50C0E76214E8444E58
+:10099000FF829F652843CC7257A439402EF7A99D4A
+:1009A0001E776D77D1EDF7404317BBEDF97671CB2C
+:1009B0005ABD018DCC5902E6054D4AB6064B918FC2
+:1009C000F28EB01B94014B46A1D699A7FFAD142A15
+:1009D000B196048C3831D31A3ECDCF84CDBB72AFE3
+:1009E000B408CEC381266D964540C4272FEFD08929
+:1009F00036EF53C9E201CA11D80431FD4D0924274D
+:100A00001E2FE9B32C4A6E40520BA61EC5E8610C9E
+:100A10003C6BE815EF4F5DD9AE4D1DE95DC6CE4E7E
+:100A2000E5E36589B968EF31DF752E8BCFE1808D05
+:100A30002E5F617BB5FF14C58FAC9EEE25C1A50668
+:100A40002BCD36F18A40A42520F2F08C11486E009F
+:100A50009DD695149C2B435C3A77D1074317356A92
+:100A60009F3CFB7262C5EDED95D197EE1D198F95F8
+:100A700003C3F97BD83CB870A5389B08C9FEC4BE37
+:100A80001B7FCC7F0F484A68C3F84BCB44D1B56875
+:100A90001C3D129303ED2951B648152829109BE0FF
+:100AA000423B3E50745305AAF0F4BC8F4413EA4510
+:100AB000D8943901E4F2D0E6B9989DADE2289E7948
+:100AC0006EE7409B73B0AED14E7CB43725B794C26D
+:100AD000400C628D8B966493E949FFC20F1E008C17
+:100AE00002219BE914FEAEA0CC9D75B939166FB8F2
+:100AF00094D4B4F77FCC8C90E11752B88A0B451C84
+:100B00000926DEB670D49B79DB5BB608CF1E2D4775
+:100B1000C2E723607C66561E2BFE9C92266142F73C
+:100B20000540B9C0C628A9C3F0ED62BB53DE98DE0C
+:100B3000DED9CFC531F3085AACC859835E71298517
+:100B4000C9652538DB799D05FF92F658CFA47188D9
+:100B5000832E1EBC055C56287B7AE60D81EDDA45B6
+:100B6000E9134C6D9F32640F9531C5539579EA674F
+:100B7000A24795D730DF3F545F5E56007FA91B7BAD
+:100B8000020717524BC03C6BF0123DBD4E37C0A25E
+:100B90008F85EA4BC5A01C861BF5CDF2E9CDD2723C
+:100BA000043D7BBD6362845C0981003FD8434FB341
+:100BB000601C13127DF43887F8146AA73B337A86D9
+:100BC000DA0A88FE821ED26F2083CF8B9BAAB5D112
+:100BD00079F701DDA2FC542DC043926E5F434CF8BF
+:100BE000E5528C4EE1A07332A35EC81A849F54274D
+:100BF0007F6B613BB6B3B136DADE46D7BF5DDCFA58
+:100C0000EB16CB6F2C289448A05A5D8FB247C325B2
+:100C100074CE407DC3D064460655ABD0A5ACA36668
+:100C2000DDD739CD1175B4A143E2974FCF236D7451
+:100C30001CF1EB741563F7BB2E44927393CC2FA574
+:100C400005DBDD4A2C4217949B2D25350BD5C2A917
+:100C50004030813BE440ABB8BE5322BCD6BD0A4F06
+:100C60001AE9CD177DF7CB3080682BC793176FDE5D
+:100C700049AB2C2C76847F2C5BB432E4B0423E2707
+:100C8000275A2302A5E33BB370FFA1826B809E3DF0
+:100C900097A2C40975029403283EEAB746E4315D81
+:100CA0009EB8BE4D659CBD93C182886CB8D4BFFE12
+:100CB000506B84427C25166807FF7CE7ECF42576B0
+:100CC000222A0FBD76FBC472279DC173E41BDB4053
+:100CD0002E119E1855E60C92408823C94CFA2F4DD0
+:100CE000CE13726B4F792E7547B0EAB706E2E5AACC
+:100CF000C52A759C8066AAD4470DA8D91582A0A8DC
+:100D000088AAF38E0B400E4121231742370100922F
+:100D1000EA60B319A1BBE5EFEBA91A727BD1A2ACD3
+:100D200024963CB0AE1256975013D599A9E2E5DC53
+:100D3000D68BD39B568AC8F0EFA27057AC13228093
+:100D40007834D41745BC1B208A3BB3A9AEA23644E5
+:100D50001222AFA0863384587ACA359D68A13EE23C
+:100D60007CF394C0330149EB27390543C96A22C695
+:100D7000ECD16A8A0BAC6F476C3CA57FE4CC65CDA7
+:100D8000445AE1D3560135E8D0F5432BD64BCDCEAE
+:100D900085CBBA949D7D64BDDE688EC788E91B0152
+:100DA000E0325A3DAD6FFF0988B072A28B6E7606B5
+:100DB000630F83FB5AADD48A7C89B6489B6B97C07E
+:100DC00023C000A55C8CEFF61995AA8B95ABFFF8B4
+:100DD00000D4C16F3104F3C78EA708AE964DB0B1F1
+:100DE0007A1BC8CD4C753BD30C5B907F66313ACDF6
+:100DF000CFDCC2448B6B59E8E5D45576A357217BF1
+:100E00006954DD236B2F07DBFC9C7ED5CB9307B2A7
+:100E100088B0D45F0872F6667D4C69BF549ACBDB0C
+:100E20006A79894A2CA11EE0812FF44E6EBB24C43E
+:100E30003A36F40C1DAC4BE4A7D19A7B4B54701B93
+:100E40006801A2B5A6D5E5C201A7BBE5244C632D78
+:100E500084AD822E13B4762DFF74738392C46B110C
+:100E600064B39CA58A7C52598BCB564D1F137B498A
+:100E7000015E4C96B1684C9A0BEE642A0552ACF9AF
+:100E800025ED790F441E489AF3207CE06A1274C461
+:100E90003007E4FD5585DB0CBD8A9285855C93693E
+:100EA0009CA5476A47189832E3AB340C3795E9C0E4
+:100EB000F5776C869AA4265E48C6862A97F74CB9C1
+:100EC00013E7D7C54289097B371D9C02CB2E2671BB
+:100ED000EF7C029CB400BFE108D197644B59967E29
+:100EE000E3B2CD90D4B239B3D18214CEE1E5D7814B
+:100EF000459640BF3FF8EF7122E7C79212AAD0C7CC
+:100F00008B72892AD9BA1D34628322F2C107BE349A
+:100F1000CD49E3C3CDCC4E673A5892756672082A24
+:100F2000AC81BCEBC41E9886708A481DB3D5167E72
+:100F3000BE24584406487E8555AC362250F23E3ACF
+:100F4000E930C33C468C788319FCE5293E57D7B37A
+:100F500026539A6AF53B95C6C1DBBF2AC9E28E12B9
+:100F60000F21B3EEED6B148F8C905B5459B20CE2F1
+:100F7000753594B2253B4D7BC0D0124FBEF9345F1E
+:100F800047B43B5D63321B18BDE2831AAC4C550E6F
+:100F9000B0CCBD01A45D1ACD44F0A53DC742F67F9B
+:100FA00093F6814C59272BE3C23FF6DE30C0E1D7E0
+:100FB000E273A76974CEDBB269E214AE950066DE17
+:100FC0009E9DA7273786C79D8C965F22198BFA6F47
+:100FD000518D073CD1E789D349ADBE09E29FE2C2FA
+:100FE000AF24C4902C2C8ED0495D7DB25EAFF9C584
+:100FF000326E9E15C6924BA9E3332DD4A8D92E3953
+:10100000B93057CB3EC0C337EF38E566A3B37B6139
+:10101000A4849C083770DECFE17CAEE435227F7774
+:1010200022431C59F2A40E471DA537B0D494D4070F
+:10103000C516BF26B1257117DF0C215F669BB1B3C2
+:1010400043DF595C97FBD37B0E8F9C49F342C0046E
+:1010500069BE11A397C2679785EE2F49DDEAD7FCD9
+:10106000DDB732E4F2A1D7D2535986B63EAA43A7E0
+:10107000955A3FD2EE597D910208403F451FE33615
+:1010800045BE56668D26B5D98C8D85993C9A2ED253
+:101090009C258222BC1EF1D55F2A9D3A98F2E45B22
+:1010A00047161AD3811E829A0B909CB3316499B96A
+:1010B00019785CEDE3084887DA1EB89858A087DBFA
+:1010C0005BCAF69645A4AAB942FB80B678A578B269
+:1010D000966465BB7B1F9E1826F441D19941D74C7D
+:1010E00029B0299764445A5DA7C8215DE5EF38BE51
+:1010F00032C19DE08B1376129F8FB3B833A71FCCFC
+:10110000670963B1F37FA388BE7E0FA171B65697BE
+:10111000C7D0D31E5C1403648B6C631D89E42EFB63
+:10112000BCD35B477DCF77BA8586FE702D6181B5D4
+:10113000899D40B7C6C88036CCA71D22F711C2488A
+:10114000A3B5238667707AFB86CC109965E70D9965
+:101150005B30A609E5A001476E58142AE23B65D230
+:1011600047325D2B219D649987651D0AB394D6B4DF
+:101170004B8C8747D4E1922587D506DBDF7D06EFD0
+:1011800026935D15F3D17827BA3DB0F420363A7630
+:101190009D3EDF3E8F06AAB85027C2B60AF611312F
+:1011A00052CD668D00C7FA0C404FE0939E9A8DBEDB
+:1011B000142ED1FD7199B2F75FE420839245694204
+:1011C00007D81B25CBB777B865FA00E432A9701EA3
+:1011D0001FDBD4DE51EB30CC61FB5E3000399B3439
+:1011E0004E68BF18D04DF1147305534944F1D81718
+:1011F0006EB3E5838E549A7FC2C6ADC8E51F9D27A6
+:101200003C5B98E48A52782637388BE1F46CBBDD7E
+:101210007A4F728885D9F24E3F2820985EAD8C199E
+:1012200039409EC104B4B2FA5E18F6858F5296E337
+:10123000E5B7E9D4C083F9168630DE2F028DD3F4EA
+:101240008FE1364A591EEAD22423CA40CE69994515
+:101250008635F998CC60CFEF5F95F38B7957144CB6
+:10126000B6F3D0EEA65B66A26BEC619B0D1B2F74F0
+:101270004D658624FA4B1004FAFC91E831651CE1B7
+:10128000321BC891F4CF3829174DF8DCE906CD1789
+:10129000A65A0160DD981E33DB64623E0A4AA7C984
+:1012A0008C48A768E804A7F8B461297206A1A90FC1
+:1012B00010E860FD7338E2FF7429658A7C831AAEFA
+:1012C0006A7253C03A5C2BDDDC37A237430B532CD8
+:1012D0002EEC7F44DF48509952656E7B64B178EE06
+:1012E0005F7339F7A4C443A0D26D2D5AE9F89DCBA2
+:1012F000656BEEBF86F8ABDCDF698288C1C1D8A11F
+:10130000594559FD03C262B0AAAC88BD92211CB7F1
+:1013100004E827CAA161745348079D18D8810E9527
+:10132000F7609B5908C6551F494111A179A6D11BE9
+:101330003D21183768C3295C9203AB39C17E66E64C
+:10134000D15C2A135C5C0C658A347D135FCDE47B31
+:10135000437EBCD8AD4EDFBDD875E640B3400D2905
+:10136000787CCD51F50E048A3CFA39E00AE174C26A
+:1013700003891DBDE0458442888C33B303708A38ED
+:1013800057854C6D22A2C1B1D2827EDA872A24EC25
+:10139000EC3EAF1B48FE25D0118B926601A52217AB
+:1013A0005F0CFDAE300AD40A5138C3157F8BCA8753
+:1013B00045D5E15EC30AFDB08E2C0B2CDF0CD8C1E5
+:1013C000C269EEA3C0917E00528705BE49723852B1
+:1013D00039FACF0BDE3AEBFAEB836B6FE2709118C0
+:1013E00093018DD496E29F67D2AF3C985B66F9DD9E
+:1013F0009D183A706C983AD64218429E824D406FC2
+:1014000077066DB58C6D23EB26C9B243B989EC51D3
+:10141000F002BF3EAD6B53CE0BC71F43AAF0603D39
+:1014200078990C1273034E26CA22D66F810938F7B9
+:1014300051D5A1CECC1BA1F792138946F05608DDF9
+:1014400005DF422E5ABB87004F652F7FA4CF18437C
+:10145000B857F6377889F7DF5080F0F0047D3A9B73
+:10146000F10AA3CE616B29FEDC80CBF760B59FBC8F
+:101470005E369E0A22E6696B1DA70B3E14656491D9
+:1014800042AA96908E3F32018B51EB2559AC5B9965
+:101490007E5D7A35D076F56D547A6525E25398ED08
+:1014A000766D874D5A79E2622B5757028BCE9E3864
+:1014B00097AFF93C9DA799E22CD6F8E1FB21B52521
+:1014C00068B7999285BD23E3FC2C09EFF3E859DB5B
+:1014D000D27C82AEFCC86A4BF5359FDD95AE1D21EE
+:1014E000ED01853AD062F100DD92DF6ACEEFB0AF58
+:1014F000CFF503118C07EF3904D7D12157B23DB294
+:101500004AF64C93D9231C9D640246C699BDC8F186
+:10151000ACF770069E8315E4A086C441014D6FFCB4
+:10152000D5BCEAEEE432A78EA4DB2C4DFAAC1F3D0D
+:10153000A03E8405A4E0F7AB63EDB4C7DB319DE8C2
+:1015400006919C4D31FA632A74E843F2BD78512923
+:10155000B076EC789B36D983377F49729551B5A820
+:10156000A4D8691B1E241EC0A341CAFE40A459E290
+:10157000DA8D367DB66A8C5A0AD57F67D6B58EDC91
+:1015800057FFF178DDD41F4205A8FD7004C0C4F8F0
+:10159000462065A464245144256169E2B42E3F4B82
+:1015A000AE66D89FC00AD590546E249CFF1EB0DC56
+:1015B000FB70610D90B2813A6CD56128B6C29A5029
+:1015C00084B05DDF7CC92A25A911151603B03871D6
+:1015D000D1B94FCF81601C82FD4EFE150553EFD06F
+:1015E00047E24BAE8B14334171122462FFB4CA8AB6
+:1015F000EDF0EDBFFE5F108F95313B9905576C6A9A
+:101600006823BD3CA1A08DE27724834D6AF4E925CF
+:10161000CDDC202344D911B5FC9F2B9BB1989E3281
+:10162000085782B4F6CAB2713718DF56E59912949A
+:1016300011A5DE467A86D7EC2FA1C10D4E5F616001
+:10164000482FF4B228386B384C3961F748B2050896
+:10165000846541331EBE2EE30F71AAEB3F02B3CD6A
+:1016600025C87DD583AEF0B3BEC9B37CC4D2FE1508
+:10167000F15B690A72535E1A9600832F365FF2742B
+:10168000ABAF11E4AE9B1048605DA4E76E2FACF7E2
+:101690008AB1D15CE3281B24570EFC58875B6C4E43
+:1016A0001C23859D6BB883EEFA46CDA80E76731B7E
+:1016B00096142A6C080278620CCF272608AC155DB8
+:1016C000BAE4D365C60501D9207E554AB83599D903
+:1016D0004290AEFC33BEFCFC025A024218751A65F9
+:1016E00015545C10C68662CB02818F73BDE85271BF
+:1016F0007270837E2DA47A3A38DF80A6F2F3FA372F
+:10170000839CB8859933B0D8152072063BF0FE5102
+:1017100022D7F69209225D49CA1110D736E21A354E
+:101720008C236EE86D165525C2381A800D94DB1394
+:101730005BF72C07E877F1B03B7F6B927F9594269F
+:101740000CDEA3EE656C920CC1A25E257EF6B3366C
+:10175000C441D6E7223992AA1BCBB87BD6CCE51F71
+:10176000E9C574F5B78404A1A3C5AC66D0917C2803
+:1017700002C3BA8C92F9A97DAFFCA4D1D5AB5FB5F9
+:10178000AA7DE0CA74DC05330B7F9C38AD8A33F444
+:10179000F1FFD1401C44098C496810D240D37D58D8
+:1017A000FD14EBBEAEDE9741A28BFA7E668B556CC4
+:1017B00006A0DF45D97331B3DA1BA518FCF5F8593B
+:1017C000B14A4E010F292CFFFED9DDF6D4EA3C3A8E
+:1017D000D962DA4F7688449E45FE418E1CADD9F51C
+:1017E000C9F06F776E993B145BC80C4D561AF1D255
+:1017F0001FE7FAFC9D31FF4CBF1FA010325B5C86D7
+:10180000BC1E51642C78B513715A8C21095C152DBE
+:10181000ED470A10E6F1A79BD612D24BBC6963E1F3
+:10182000470E41093F2DF25B90592AB2BE5EE1F5A9
+:1018300090799F67731270D96910E8E9A2314EFB65
+:101840008A90F2D051ECC5F1FE8A914F8FE793FF59
+:1018500022A87DDDF3EE876ADC5D94AFB53C5900CC
+:1018600073C53F9F0EF69387EA45DD00DA744FD9C2
+:1018700061A49C49E82259ADAFE0A3F163AD87E8CC
+:10188000B1A29258C4061DE39DEB1B27886F1D1162
+:10189000A0E172030632ACA972466833147A5DAADD
+:1018A00051F3C76E4E1D9B7D3AF401942DE6C8BFDF
+:1018B0005E38890F0D1220A47421FD0DA292C67509
+:1018C000C8CB0465874AC3E118F1060425B4A33FD9
+:1018D00049241016427E4BE646643C6D777C43F605
+:1018E000DC6D79D24106CE71996886730949BE973D
+:1018F000F45E8579CF0201917D9A41A5F4EFE05124
+:10190000AAE01E943F7A56EDF7BB7CF0285FD7C360
+:101910002CD441B068FAEE042DCFAC8DD2CE240683
+:10192000AD462EC186CDBC811B5FD3CEBF3BB3BCC1
+:10193000EBEDA06379F160A2E7BF413DC7B639F294
+:1019400007CBCE6505C2BB775A7FEC604BFB73E4D7
+:10195000B9142A038B8984904722BF413819B27584
+:1019600063E4F418AC89751F341D977835EB0CAF20
+:101970001A0FA716060DA44834D243EB4EB998317E
+:10198000B24785DF85105D117561C33C2BBA0C45EC
+:101990001FCAF493CFB49608C92F3BE72CD1624DF0
+:1019A0009BA562DCE6C569D654DD8C5DD44CC223B0
+:1019B000E42401676BB928B95DEAD12A5D8CE8643B
+:1019C00060789ABD84B8E0D8810C27C20E7AB4F44E
+:1019D000780B94F87A42AA336701E6125C3E72F7FC
+:1019E0002BE636A70D54542D566D6B4C06AFB35FE6
+:1019F00057C3B70BC45EDF91130DF0CF09C3B47F9B
+:101A0000AA24CB665897A2A50AB5B826CD30E974AA
+:101A10005BB262BF3960BD432A06637438439BB52D
+:101A2000F77F4FDBDD9E36A7069116648ADCB6B8D9
+:101A3000D6E43D6D4788F2CF6FFEA492AB14624BA3
+:101A4000C791C3E08B0162D4D560C8483FB532B0BE
+:101A50007230408548116750270616F73585F552D4
+:101A6000AF1FF7DFC341C83F9EFEB7F64A884572F5
+:101A70002D2D3A1706F8355F3205102228F2F6347C
+:101A8000FED26270CC0143767B66EBCAEBAFBDE45D
+:101A90007B95C819454E3AB7EE5DD9CE3B884FA12C
+:101AA00007BEAB1E5911FF1FC62D1B78F1E973D27B
+:101AB000A604910A57A9D68B305A571EE1A9BBBD7F
+:101AC00052AD62DC5DACE00003CAAEA653833FF8C2
+:101AD000AB322B90A5CAD6F5B67DE8B578BA8A2880
+:101AE00042D5D2C4163A01C6F739E7E2371ABBFB32
+:101AF00016A7A579430AA68FA473822A25919EFE74
+:101B0000D3C4938319F0B27380A9E89BBCA8246B5B
+:101B100020487B52B947D9D1C8E7F1721738845EA3
+:101B2000478461063EECBF0ABF58FDBEE922E1FCD6
+:101B3000CB7DCDBDCE62F3DAACB2823F7F1D3D29B5
+:101B400009F37AE32298453E39BE3ED86081424887
+:101B500036A18BB1394FEBD8047AD54C9DC555D6FB
+:101B600033F6A77C72BD084DCF9D518EE9C47B47EB
+:101B700029ECD23FA944522BB21AD5A7DF6A80AA1A
+:101B8000DE6D9EDD3AEF2E0425AE8B345BA1C7954A
+:101B9000516954676A614CC5CDBC4F0B84B701C015
+:101BA000753F354B1C2FC7D6214C6FA70F65AADA9E
+:101BB000282D85802824A343F6642AA9A5AB7B366B
+:101BC000EFB6F31052F178AA6CE2E7A47602E20EC7
+:101BD000F6E239BFAC233EEA987E18C766A0FF093B
+:101BE0004EDC0ADAA048E965C8820F4AE245D59181
+:101BF000790577B03DC51DA4D4ACD9FD194B41285A
+:101C00003C8063BB5F0DC01036BB660FE2B9CB7082
+:101C1000FE6EE7599636F26CBD7A90114226D39744
+:101C2000F4F9D1366E93EE790D34C73D18CF5CCF01
+:101C3000F88FE8DC587620D5F398ED3F8A0F142F03
+:101C40001C473C433D90C45C51DF3B5884EE2EA3BF
+:101C5000CBFDC1D4391074CAA419BA8F9CE443DFF8
+:101C60002D1C184998CF937AEA2A40E3364641E979
+:101C7000044D63F80340EF2E7FEA2B110830D35B4D
+:101C80005EA561893F26096A241436576485D610FB
+:101C9000A1A801AB1628E603FF7512D807FB6996C9
+:101CA0003B13F35DABAD2AA7AF9D81C62EE85ED78F
+:101CB00090E64518CB88C8E0944DEB507ABD4B5266
+:101CC000F2C61B4A84736C0CD08C0A24E06032800C
+:101CD00083021701A211C3CE3E10D2B9188F47BBA1
+:101CE000D242E021ED1BB6F54D73458C8A155301A8
+:101CF000123F5EBA22E0AB0FC800B67A2BA6BF290E
+:101D00007BBED643DC4F256D9BD33F04E1B59E617E
+:101D1000C7989347A5F2D87138DF526E871D764376
+:101D20009A0CD780C8DBA8945709F39405D1E0C872
+:101D30008DE269DD1502944B5953B21D17BB8274B5
+:101D400028816FB04EC9202F56B943A4E84E4A658A
+:101D50008DE3FA87E70637A33B89E298F9B059FD8E
+:101D6000A88FC6B71BE2383074B4AFD2C570C9684B
+:101D70003DB20A9F01E28CF084EEFE051AA0032218
+:101D80000480DF95CF6E8336FAD4326644D5E47A88
+:101D900079B91D249CFFE35B6AA2B436591787A862
+:101DA000471C303780E2701A0C147EF0B81247835B
+:101DB0008FAB346ED5CE66D2F9AC0061407F951BF7
+:101DC000DD24C8E8BFBB86D3FAD54D119DDC89D18F
+:101DD00067EE90028A0AB1FB3F1187EC27E7616743
+:101DE000D82D0794F1389860DA11ED637E71891B64
+:101DF00080CD15F4BC14A6E2B4CCA02A91931E0C9D
+:101E0000E614D8C587879237D41010C1A8DBFA3FF3
+:101E1000627F132D0F5B2FAA30938CC4C221FC2943
+:101E200033CDFE1EA2FA63CE0F10E692709C5F21A6
+:101E30009C0BADC454A41F40597934447F8C752247
+:101E4000EC1162BA5C626619C8BA465F682B6C26F0
+:101E5000C8C23CD2A2D1DD1E58BF47780DC2F9B02E
+:101E6000442C5B35A37A7ED1F18C7B77987DC9E8D1
+:101E70005D140045A89A8E58AD10B1742EB672F15B
+:101E8000926D745482D01D01248BEC08322EE88FA1
+:101E9000B77FD1F3ECFBAC9EF520E284686D42B6CF
+:101EA000B1D948C1B52B99F7E02D155565257A2094
+:101EB00070B6A03646943715B4028B20CBAFB2FA79
+:101EC000BD3273B1A376523427AB8C37B52FAE3405
+:101ED000CC156E5C0FBF6B254E006CB8F2D8CCDF12
+:101EE000CF7BF28DF348FE5772166EAE72163FFC32
+:101EF000C487E04F22BC224A0C37C93EDC0273D4AF
+:101F0000DEE2E145CC243B539902D356C38461FB06
+:101F1000744D51855726717A39866B655BBF935D29
+:101F2000E6001781050B0001699B90FC3B5F1A1AC4
+:101F3000880B449D04BCCC31AC04DEC9E5D9834296
+:101F4000137F12C4C7D9F8ECA00413030CDDDB0027
+:101F500019F43D6730A266354232E317FFA9DAC9AA
+:101F6000630960AF15FB433469071844453AB21F53
+:101F700078A6CAC2E323CD2F4F08EF96CC77057120
+:101F8000DA1B51439E6DE10C0562F3B9C277F4345C
+:101F90004929659A017F9599951395C9146A6E8BA5
+:101FA000FC0717911293CEA75ADDAA2D6A7D0F392F
+:101FB0008737BF91EB6B80E8D0F21690DD8B595DCF
+:101FC000407653B5C1000E534421E477877390D116
+:101FD000332063779AF1C0BDEBBDE59999DF4C6A78
+:101FE0005CED89C41D5472C75AD585408CD231EB43
+:101FF000242767AD3A85D8090036A3EDCB454ED2EC
+:10200000463BFF4BA5FC58AD449BD2019F482F7D1A
+:102010002DC64FDAC93C5FEF6E207E8D54DC596CC3
+:10202000DF1A74DE96A7058120FC10E71E54ADDF91
+:1020300047C963680937C05FA00B690B5DCC4C765C
+:10204000388C85FE153445C41E7A6009C7215110AD
+:10205000D23E59009155933880254172C45C9986CF
+:10206000B07E8A762F2C1D9A4EC63498088B908E9F
+:1020700043D6F10820A4648A56BDAB5B2E6E60A4E3
+:1020800005A00FDB393E5AF1ED418B70308196D9B6
+:10209000ED629564589F63102F8E50DAB637F17C4D
+:1020A00009FFDBDC26664FFD6882B4FB1A661CBDA7
+:1020B0004B155B47FF71D8A1335A87273DF6114B6B
+:1020C00017F581B2457DF7DF5CFC2172EBB213F0AE
+:1020D000A6BD58707E889FB497D3460C38414659A8
+:1020E00090D54ABDF0A0BE737B5F7B2C363D015D71
+:1020F0005915DC4CDE8ABACA342B8C2992033F4B2B
+:102100009F25339F4357CDBDE720C61647EECF45E9
+:10211000F78132CC3BD1D0ABFEFBF6099859D17098
+:102120000A8DB885A1D96D7BA3D80E2B030B525510
+:102130007D5A0D6389E9CE899F2D520F34678E72C7
+:102140006CC81DF2C783E5D24E3E96DD41CCB42A61
+:10215000E2F3DA5DE2CED81C17E3F958C8090A9514
+:10216000B6064C8D6B99EDFF7674B68FBD3CFFF6CD
+:102170006D06EA853FA94F6273E4AF685CCF49E121
+:102180004E3855DC3954BC7DCD6433A6B45A7577CE
+:1021900090C8A8271AAE6F99FBFF25476540F8A3A2
+:1021A0006CEBD55CC62ADD672F2D8E152CA8E905B2
+:1021B000BD4F34302FCC66EB9D845D69795A90EA2F
+:1021C000C735A647601D3F03417BDC95A098438D32
+:1021D000D19A138BC4A6C34F2F9DCFE1E071563C1B
+:1021E000B685B5A16D3DAE8AD9623098436F555F13
+:1021F000C85B096E883F7399A05627ED1BD490BE2B
+:10220000B3126BD6D999E8714F19B697CB46FCBB80
+:10221000480008C506F8DDEBC39CD0CEA8B0D55960
+:102220007556E5393F93C1E277A042B9BF29D584FD
+:10223000F1ED319BDB34B3B3B17D4354D2D4A04E26
+:102240002B07FB1BA3D1981A74B0A5F16B5B252952
+:10225000561F7F914D9B049E9C30E4AEEE33CF9B86
+:1022600015CA1C0334CD681ACCE439EFB88528812F
+:102270000F607371140BDC001E8AE4E1DD145D5DF8
+:1022800006FA0BABCCB285167BBBCB54AE461648D8
+:10229000515872FC45E497127907C983A9278F3BEF
+:1022A000EC7330256387D1B88B540FC3A112C5AF2F
+:1022B0003B4E74BAEDB841F7BC4C44DF47434690FF
+:1022C0002CF865795F5FD50CA144ED158C2FA4DA4D
+:1022D000F96CBADAF21F9C0B73AB79CE2F74587578
+:1022E00002F1334D55269417E1C893839C8605412E
+:1022F0009A03328BEF4B10670C7E9A072F2BA4C7E3
+:10230000E01049046C20F9BE02A529550238A5F059
+:102310002652F6C1FD11E669697198014BD15FD56E
+:10232000EC9B2EA806E8D34C33379932B8F7DDB5CD
+:10233000858599DAC937DEE7B8D5E09E5EC83F7378
+:102340005C9AC5F2D9284F387B451C7BE183B636B1
+:10235000E9313C14978177CBD3F0CAD20909262200
+:102360003E06852D9A8EB156458889E8C67C3C6A22
+:10237000F7D34D07D6A921A6BFC811A3BB29E4589E
+:10238000906A3C374C2609FF6E4B452EEFF69A3685
+:1023900038865A960936DE5FE48328B20B5B982CA8
+:1023A000FBAA5F891DACB605E7C4A040A9C675A607
+:1023B000A974D19321A34156D0C8A64204B47D4E3E
+:1023C000C499F28C2E2D7F74A2015618CDCC69A32E
+:1023D000A2B22F29DE3F2D57767DBD55767421ACF4
+:1023E00088BE1B5F740893CB213643B8393014C1C3
+:1023F000CA423842C495CE7B8F515B60A47864FF9B
+:102400006D08A4CE738F369F57E5BB995E308F3928
+:102410005C96E4B6BCB8B615DB5002DAD533D029E9
+:102420003B19BA6F64038247B0F3625FA429A15FCE
+:102430003D64A0F3FBF1622BC59735B991902970EB
+:10244000E5C5A92F529DFD837E0FA1792CC3ADDF79
+:1024500069F58B91D39533B35327EAC37073C321C6
+:10246000014A1125B8E843C3B96A22FE0DEAAFABB1
+:102470004D0CF0F7F63C44EB0FD495BEBCA162CEF8
+:10248000D72C22E805E35D53CA780CB0BAA2F196C6
+:10249000D918188B6304C9BA5717D3F6BEC9573D6C
+:1024A0005E1A75A614FE12667FC08C0D00F3F3C38E
+:1024B000EBB44A9BD0DC1E46783F5B5B4EB7099677
+:1024C00043C8FBF530C7923077F66C03CBE2C8ED1A
+:1024D00057EA2F8C1EB8EC42C33CB75019A8100520
+:1024E000A2CF118F9C1A6B1924C6FFFA1280D6C195
+:1024F0003D3E2A0A5232B9790910E1201B5F26C4F9
+:102500006CC9916288D300FF75B35EE9A1C403CDA5
+:10251000D65D86204B56103C4987C5DC1364140DEC
+:10252000226B270A03DEA8441DD3AB2C31B7836A84
+:10253000BE05C78F4CE78E6018AEC0AC5194E6570D
+:102540000F0BE9A426D15A582B2E1AC7F2C9B0ECAA
+:10255000711E8CA7A0E96512FF8734ED9899DF2DD5
+:10256000BAC56463549151B401875B14FA99C68C5F
+:10257000809E7C003B4B3F05A157EC74EC670D73CC
+:102580002ED95BE0804494AE6A1E3681283C09D186
+:10259000482F61F193B4051132A36611F691AC2175
+:1025A0009E9EC36DB85C07DD44813CFFF0612C1B2F
+:1025B00025F9554C34D9990540FC1D95995D1EF5BA
+:1025C0008643859A09F9D58A54706E3A437A3D6BF1
+:1025D00013353E4A4D667046C8D6261088DFD07A3D
+:1025E00083A7F54C2694DE075B2A7BCEBA9AAC848F
+:1025F0003F228FB3BF71DCE48B8B904A5D297168F9
+:102600008F15CF5083C4E48047161876CC6B5AD907
+:1026100085C1C05265E70F88D69FB277F1A959C727
+:10262000EEC1C2EAE53408AB8B35DDDD7C3A13A29E
+:1026300056376601A5334A49E4F0199169CE8B33C8
+:1026400018BE508602621481B16BB0F56D1D001783
+:10265000C3836E867F3D9559FDD6A0F6EC78EE0BD0
+:10266000353D280A02633031E585EFEE2AD4051E98
+:10267000952B72A6BBCD30F8090F1CC3E943775ADE
+:10268000224E7C3792BAADA588647DB3D2E87E2A0B
+:10269000BC8837C54FD140482F356CFBF6012CE77D
+:1026A0008E9945451472DA749869156FD3C25DEB43
+:1026B0002A8497730646FFA46A421579C321D984F8
+:1026C000F81B284DAA5441B2E797D67DC715451689
+:1026D000A6A7E7D7A88F53E9D193DC5122956FB510
+:1026E0004B44490BF77BEEEC7B43DFB26137D5659A
+:1026F00021966088F5FBB57AB2973C027682E1A616
+:102700009DF51F9DC0C50558807836DAD64C794EA8
+:1027100005D1453A1C8E23D824806421A2D690BAD4
+:10272000AEAAD35E910735A04F9DF63FA4DF006DA2
+:1027300091EF5518E583A51A2414239537888561F0
+:10274000D3FDBD12014240D70661F836AD5C6DADD8
+:102750005F7C5A43E15DB2DB32F0762E9B9AB63253
+:10276000C1F66E0A7C320C00773EDD0509DF45526A
+:10277000CEEE01044442601C9FCE79434919DFAB81
+:10278000E8E9ABD459FE41A14B76BFDDE2B0A70921
+:102790006241E1050B508D49E2AC9805C9422676AD
+:1027A00002A8B5F229F76BB118881E7ADEB469BAAF
+:1027B000416181BE6E1F212D7467B1F211546DA568
+:1027C000AC0F1A69FA7CA41770ADB7A4A9DB695ADB
+:1027D000BE1F486BE6D18602E335093482AEF3268C
+:1027E000DBFDC1B157F92A08255565D9A630FAECA9
+:1027F00059A4AD988B1DA53DDB27C2891A91585C61
+:102800002D4FAD49BD450F2A79634EACAF51014AFA
+:10281000E959B43085A15080F323A10519555BEC2B
+:10282000C8105D948C5E2F898EC424A8E845F34DB2
+:1028300074F848F11431BE9CA441BEFDAD1D922C2C
+:10284000B2522665AB6426224DE21BB59AA0333600
+:102850008555C1AF3287C90EB35374E2D557EB61CA
+:10286000DD59E4B82A68A6544BFDE52E45BF621732
+:10287000744981FE9F8F5868D2CD6527B01E19809C
+:102880004B0A53BA65F80D1DF32FB7565CE1B763D9
+:102890003A75FE27A3DFE17A6E48B737B8768EF433
+:1028A000503F14695819D483CA5F18265006B2E302
+:1028B000B2C9B3435362A017E381CF31599A2FF4C1
+:1028C000003A83C3417A8C2A43F593AC23A731DDC8
+:1028D000B869686E7F78D576AD1BF345C810161BB6
+:1028E0006DDCE61AF9ABD281685CCA609334356C52
+:1028F0004764EBD423AA61B857816AB9FFA7286758
+:10290000A418A264BCEFD715D00B69CF8B51720C01
+:1029100006182F1483933A4D1651B77C1DB28E477B
+:10292000ACEBCD1E95E192CCC43A0ED95F58193864
+:102930007B1CBDBFAC1A2A17D77FC874080B56D4AE
+:1029400069B34C4D5FEF4FB86949598BA5CC19BCA1
+:10295000B493C8F9AA235FF3AEFE7FD71D5DF1C51E
+:102960001A5AB3DE86192668DC8B67FD5E8DF5B4D6
+:1029700042187B50B4CE9231EE43DA11AA339C1147
+:1029800031363938572825244B676E1D5E0E08F7FF
+:10299000D761C5D7B589E272D116C9429E8C57E47A
+:1029A00028309BBC0F3DD3AD57E21A90EA607B1CE8
+:1029B000FCAF8D9899BE3C2FC35C6E4BBFA9AF0492
+:1029C000805D0F2353B04E6D9173652414DCD8E302
+:1029D000D1FFF5D239BFC02943880813F8D4203479
+:1029E00077BD320555CFC933A080349BAB5E4AA575
+:1029F000744BCC7D40989B868D9903B6D827DEBC5E
+:102A00000DFF2C49EABC4A17E229B8DB94E4CFB4A5
+:102A1000DFD9964982A63DC7F61F1E3F3FD675B146
+:102A2000B73835DBD2455FD47B54604FEA01791269
+:102A300092BEE812DC2F1D55AC4AC1B1CB8731C024
+:102A40008E096D22ABDFE5D9358F0C8C7D9BEF9520
+:102A5000FAA445B2D1660F723F2B31BC1E1D669E93
+:102A60005A7393443BAC5D99F5AA8473F871BD5BCE
+:102A7000B2A779EA60B8641D4A1FA256BF0E971923
+:102A8000C62F79A132D8D69DEDDA755155A4C5C6A9
+:102A9000444A8D322FDC1DBFC9FB10A80D1064A164
+:102AA000945A31FC723C3B34A8D30502C900F4139C
+:102AB000C9548C8E6175011E336C98F0FAC0328057
+:102AC0005AD578388A3C16FE162870585B1F2C0998
+:102AD0002577E069B358E94F7AF72F303B7D22051F
+:102AE000FBD2A7FF757EBA218DBDA92CB041E2456E
+:102AF000BE5699445DAFECEDA12B079A60BC2FAD9B
+:102B0000BA340A421925566568A7ADF2F01D795E00
+:102B1000CD46564221FA05B8BD89C3140A1CBDD85A
+:102B2000E03EF397A04F68BC23B8C96AE98B432DF8
+:102B3000AAB091872EA634FEDFAD5A1F38AB655C74
+:102B4000674F694F9A40671E7CE7704A94A9DC9DE5
+:102B500050D7C343B3654D961212EEC743E419062E
+:102B6000B70C4DC8FFDFAC1036144E05632894F83F
+:102B700083C7E6D324523D25C8C04EFF5651CF75BA
+:102B8000FA77CD3D8B45BEEA6BBDAED26390C811DE
+:102B90007BA7174CAD5841C0C18FA3F4AD0412916F
+:102BA0006C07474EF704DDE74BF13F8C39825EC975
+:102BB000F07FF09AE8FB636CD28F5D9A35EBCA75B3
+:102BC000455D0ECA194FEB10CC69698F3EB50128DF
+:102BD000C88CFE8C12551D458739C9CBA07A9E63DF
+:102BE000BCB54CD7C1459BF92702AFDF5D73B81A5E
+:102BF000538943DA43B77DC08C64A149DE84E06B1E
+:102C000097D9C1C6E8053339CF5BD704A1B467B7FC
+:102C100020C15874850FB6DA5F1BB62BF7994AC9E5
+:102C200009C3DAAE2BF23783FB8C53ADBDA93DED62
+:102C3000E1FD2899F7C80787E01CD41B2012F3C2D6
+:102C400079501D3E5C0FD39E3D79AB52ADBE880FCF
+:102C5000CF567D64722DBD956CFB3C7A9CFC50AFC9
+:102C6000830F292DF4542B002AF69CD09C5CD71C92
+:102C7000A8BD5118F9E0E2101AED799A2C36C8284F
+:102C8000810D26027D7F17BA6F6CF9530280E0290F
+:102C9000E0C012D5DDC53CA0927880E417D0CCC04E
+:102CA0007696DC07D53EA41EC3CA6D7BD150674320
+:102CB0003DC034145CCB00019F7C3FDACBD2E30FE4
+:102CC00077CE2521EB027504B37293FC3E146EC3DC
+:102CD000829BAB0520FB833374271EEFA94AD7B232
+:102CE0006615489AEE3D71786C9C1FCC5A8FBF6276
+:102CF0007A0164C3E7874E9E5EE2860D0F09CDBB65
+:102D000063357D4695FF320D38E05E1C88D7C523BC
+:102D10004DBF481436AFC9337F11CB38638FCDBA5E
+:102D200006CFBB6CBF12B8D33DE675D53C5F623CA5
+:102D30006CC061A79E78C76F2EE46A4824438D1A41
+:102D4000B6541897A976A1EC8F9FF731E691595E9A
+:102D5000665D7F356ED415F753665059E3683B7D49
+:102D6000B1B3FF9A6A41AE67DE92D795F8DF244D82
+:102D7000EBCA3DB35478867901A8A6CF8EB73154FB
+:102D8000613B303C9C778AF1E52A43E6DDBA0FFED1
+:102D9000ACA9E06C11477E0613974999864E3BEB30
+:102DA000073EEE4782319E621BB85F0B91920A8606
+:102DB0007E4501666B8BBBFDE58E01678F4128ABBD
+:102DC000C6BCA0DA9C0E53E16D61EDC825DD6E2313
+:102DD0003B2413D82DEE67EEBAF7632B1626831922
+:102DE000F244D1EA79A942EF763ECBECF39C5C9CAD
+:102DF000F003852E81A76504D29D45E1A17D1E3893
+:102E0000C1D80775795FB5C5CFDC1FA4BC54F7AB3B
+:102E1000907E302D4A2CA5A3A5DFC7D539EEBD5431
+:102E20001E3E4A1C4D7BB001D18A0F959ABCA50F5E
+:102E3000BE7B320A178C0505C3AA541F7627A30749
+:102E4000B4D9D573362175E8CF1212138EC6A206F7
+:102E50001003374CAA50122340B9C978A814BA817C
+:102E6000A9C48C9AE662F82E9D8ED3D0711FD6F23B
+:102E7000F1D7B6C8D47B7906906D28EC5BC4B7AEA9
+:102E8000264A723CA1492A0A749E2D8A8F8BC5B5A9
+:102E9000EA47CE2DD88041BD82203E624A933881D8
+:102EA0006F7A375A3920F1C6E4963647448B731A45
+:102EB000FA685E55F312E3436F9E3AFD56C5962EAF
+:102EC000510F704D5F76BB646BF3B226C97D12FA69
+:102ED000EC103D581A1ED14483123C16123E9E53EC
+:102EE000B84554E1E4323498BB0EA6C9DEA9B50555
+:102EF000CBBDBBB52AC3AB6C5272BCB2B6F5940D58
+:102F000000D917A62BEC9B48A1BE4E4BC967BDD973
+:102F100033E16EAC245F8BC592669571123FE5502C
+:102F20004E421523B47E0D3F8E02C24BBB08546C3B
+:102F30002611A7668E132CB3222AE2C70B8FDB97CC
+:102F400082A3D851793809DA03F655773E0852AA98
+:102F50003E6996716B9E1F98B4753C946A2F3F86AC
+:102F600063A651EDB0813C49961ACE1954BA82AF8E
+:102F700044EEAD85F44D0684FA95215F4B9AC9A2C3
+:102F80001DC2941A8945E13BCD6EBDD9A036C3E27E
+:102F900036791B5DE870E5CC871FC973B3A23FAAE1
+:102FA000E5DFED52E13FFFB193D838CEB55B4A691A
+:102FB0009F4CB7EEB1D09AC73EF7D663DB9EA0B167
+:102FC0001C1E2C19BDB38A7016EDF2B42F07B5483C
+:102FD000E639D63CCA3AC38654CA284C3322A9B62D
+:102FE00050857A82573BA6B6946ED4A243C3DA6664
+:102FF00001E28EF886060D4A90FBFD44FBF7288E11
+:10300000D6538497E0F8C3C750A1226C9D39BB60AA
+:103010001832AA9C61621FAADF4278287DFDDB4836
+:10302000A6E1FC249309999822D396218BDBFC948A
+:10303000A3895DE61FB04BAC122D62080423153541
+:10304000E615EF6987148CDB8C21001614F4063F1B
+:10305000DEC4B9EEF0BFD0D682EB8C52072B5DEE0A
+:10306000DB270EDF93196D9B46B429C2A81DC71537
+:1030700084B4DCCA73CB664659F278AFFC0D5C2A87
+:103080002D11D6389CBC47726389E5BAAD3EA8F8CD
+:10309000786525CC548A6CC5266A025919F7A42094
+:1030A00024256A333F27A25E0A08DCE9584EFE5603
+:1030B000F2E2FD330C954EA670B14549496BE587A8
+:1030C00009CC700938A0FFF0165A3589885ADBC040
+:1030D0004428BE09F81036D9D2BCB32017DB5D32C4
+:1030E00042BD128A7EC45FF706B030EF7777AB57E8
+:1030F00089A05C4455E0875968C3245550DA774865
+:103100006F9F28A4D998CBA59FF545CC3C98D9F7BB
+:10311000A2D1BEBFC593D4795A8E1F0802C70AA296
+:1031200067B9B950A1498E7D373DBAC7A1CE65A90F
+:103130004195EB79294EFC2003BBA34534EA7BCDB6
+:10314000CB7F1D825266E38892D7E69E4DFB8BE4CF
+:10315000690869FAB5618FA59A7863EF9A113FF40F
+:1031600020FFD25274227EC24E11D45B9AFFAC88EB
+:1031700065C9E4D92A120D6A906B0B1558E4B6D5CF
+:103180006F4276220A7423875C2AA840495C6CC18E
+:1031900031D450DAB0EDE291581092111645991BD6
+:1031A0008DDEC5E4E9FBE6795A230D98F3749FEFB1
+:1031B000C2BC555A58D479859EF121BC5FA3632FB8
+:1031C00008DECB41A013E77792E0EA39EB581469A7
+:1031D0000C7C177089D4A486D55A8954CD4C0645E9
+:1031E0005C13DC33A27192587DAB5648F40C1FC6B9
+:1031F00043A15EF54B30672B7BDD1AC761064FF7A5
+:103200006C797A1147AF43FA0784E80809BDF3A344
+:10321000CCDAF94D76BC120693BDF10AC19CEB8D58
+:10322000C626259C2839379C3F10B9DC2B9A6704A9
+:103230007C82ADF425B54FD709E76F33B5EAA7FF18
+:103240007C22BE2DC0657CE35063DC6CD6B58BAFB1
+:10325000FC53F5F608614B7EE2D577F441F3E31AAF
+:10326000C190FB5C2E4C6E2BD44768B8C18A46BE19
+:103270007E9B014E57FFDAAC6A470BD63F2E064ABB
+:103280001AD55A718238A490F837416CA78C6B45D7
+:10329000A422A262D4AA3D376B438933ABBEA58773
+:1032A000EB73A94C35B33E8D72D89042282CE4794B
+:1032B000603E40B48DE9454314E893D40DB4BF9DFE
+:1032C0009C78E5B9350ADED5FD7F304E3C769226F6
+:1032D000938034118C3547860FB2796C560DCB969E
+:1032E0004666F17052E4B9487DB6C2ECCE1A456428
+:1032F000647BC756EB6F26385EE01159906B1B0359
+:10330000983B06E05437E0A9F6C86F2516A374521F
+:103310000C974EE116A4F404D2BC76D10CC7BCAA1B
+:10332000B4F8C2E6A243F523F2D42E7EEF32EE0EBD
+:1033300040062869F28754484489D10FBD5E8F1B2F
+:10334000FDF6159EF5B2AFCC30223462E4785944D4
+:103350006597435393843E3C8DC917CF9746D1BBA5
+:10336000EF9161D0954478E327F35535C8E10B011F
+:10337000519EFD943E8B374EFBD36C620FFAFC8A54
+:103380007B66C73AB9DA521F482008949E7B4BA44B
+:10339000B21D3FE118BF604FEABF401778B3855DAB
+:1033A0001A21DD9CBA7244A50313C9B1A513E7EA3B
+:1033B0004D7ACF68757D4D2912F9DFB5488216E741
+:1033C00058F030D79E59511DA1AA3AE46B36FB5CE8
+:1033D00049DACCD8E58DE97FFCEDBD481DFF18F535
+:1033E00096AFF72D95B0F8B6E8B661BCB77081908E
+:1033F000D8F0D7B797C0641AAE5F3D98B9E25CAC1D
+:10340000C8949DAA1121A4E8BE2954ED5B8ECE304C
+:103410003BA875D65F47D170F0249C8F11550BFFE8
+:10342000BECCA99EA62E2DF633C4D0840AD8A3C044
+:10343000CF459224EFC566C90F7F53F3BEB7CD9831
+:1034400019BA07BE1A1520947C28DFD1075B2C3CE3
+:1034500060464DBB506C6CE515098CB3151CE5C777
+:10346000D13F3F90C6078DE2AAE08FDC200B90E7AA
+:103470001D034EEEEBE45EB3231667D13FD0E3B1FC
+:10348000F22E01E5D81CD4580C6E8F8A5CF9BB185B
+:10349000F91EF04BAFB8D925D20D6217F366A4A47C
+:1034A0005416BD1DCDBB876745E6A56D40891B350C
+:1034B0004A2330999ABC29EBDC640A25ACD8CB6C42
+:1034C00057D6F8670318AEFEB9470C53DE6571A7EF
+:1034D0006BFAE6FC6F765A51B61EA203B450EB4469
+:1034E000330CC4B82C1BF3CC898783E9D40945720B
+:1034F00023065FA2F669033ED6DFAFB2E7B1D2E89A
+:10350000843CDEA6407FC2FFCE6C71ADB3C604C161
+:10351000D385269018063DAA59A365F1C1A67A0A5B
+:10352000346D0890489CD9DED745AA0C56D7E90BD4
+:103530000040C7A93061038B8F40F491A1D7E98483
+:103540009EC51E07BA6FD9C7D2EEA1E9F8C8DCA59F
+:10355000F88A5B9D04D37734DCE5612CCF0E7E3591
+:103560008635A98130F730330654B1AD4E66BA6C5A
+:103570000FCF5C81257826FF3379939786E0918978
+:103580000B269932F079BCA23C89DBC0D9997B1615
+:10359000B6A622D9EE68F61E2328B25C3F8124EC41
+:1035A000C476750C6468798DC3881C245D17E0812E
+:1035B0000798E1C6601001CD6DCB8E811E7D24EC95
+:1035C0008F4907E16CC226AC5CF973D2489816E3C8
+:1035D0000C2D1BACBF2A7D9A3E762FEFAC0911C68D
+:1035E000244F811B5F26CB22E4D265B33E67A1CB7B
+:1035F00074D9A82D0D5909D4C1D407F376CF0DB5D0
+:103600006A13000D0E122CBD49D80234E2853D3BF1
+:1036100064FDAE878C4A470B6F0ECECC8B53E07F98
+:10362000C1318D8A3736D9795BC36D225314D0608E
+:10363000FDB727A4C1F63CA03E88765BDE11A2B19F
+:103640004B4A9D6BE36E4813579B765FFF8C2D3E74
+:10365000BBB73813F6082F3EE8DE4CF359906BAA3F
+:1036600036302E9B149FA754CBB82A1A432E7A8546
+:1036700097782ACF1B4555EE0A83A78968FBF4DCAF
+:103680006B42682893179A3FFE824E4D194817AA3D
+:103690003116690020F79D8FF6FF554234C8662920
+:1036A00018DE5C61BF390C552E3F0F72C4C71BED8D
+:1036B000AF51497819BDFD978AEF961DE7D12819BA
+:1036C000FA7FE5D87C9250931BE39CBD4A46A660E6
+:1036D000491159B0F23612350388E05D6FE2392D99
+:1036E000282943ED012D82903593B01F8ADDF31C0C
+:1036F000821DC2C64113F60485B251BA12F5F56BAC
+:10370000EB946BAB618C5417114648F1E760F4D928
+:1037100083897323B91E759149E7EE62C9739E8D43
+:103720008D702A8DB9D296F68A01888A3987D77921
+:10373000009CD67C70A85241CFFB99BFDB7E2961EB
+:10374000CC2BB07F46B088FD870179563ED1EDC5C0
+:10375000C7874F234D277F0DFF870A81DCDFCF55B9
+:103760007C37DC2192B2DDC9561A5D5F096C796045
+:103770000B94D1B742F76891B780FB7B66C9852669
+:103780000A26A8103BE042A2DC3BCC1EF06E8FA1C3
+:103790001342C333D8977299CD761E0EE112E059C9
+:1037A00025B94CE2948244FB905DD81D856B74CCA6
+:1037B0007B8D34B5271D2CDBA300CE6F2C6F8C8145
+:1037C0008FC914DC40DC2B76E1CF9B1E2055EF1B0C
+:1037D000BE4F04924AACC26988D2A116844003EB62
+:1037E0007FE8D33DCD583DB3340D3D7CBF039F4FA3
+:1037F0009FB6336EA2566F9028D6426EC12E251BFF
+:10380000E045B4E73408A5124E5DE1EA74E689F4B8
+:103810008E74867D46B640DE9BDA1EB8A3A7486D3F
+:10382000EE837435FE790A6F6F9A17FEDE2351B569
+:10383000A007F29F9DC83C00247AAE4C81890020ED
+:10384000B96359369BD116D5ED9B51B9B1F7D775F0
+:10385000035DBF9DF3BFD844DC0A83976417A20AB7
+:103860000917FC21F870A41FB8656C20876B817262
+:10387000CF992551D280B9802011ADA284FFB2FC2E
+:103880007C1CB979D93FAEC228597375ACF641C6D4
+:1038900067827D234B17899B33166099653D8C6742
+:1038A0000251D4E2A5714A45F84B093E1488CFAEC7
+:1038B000D3EE9EA2034923454604D0B0F6CE606005
+:1038C00027A620D9998621FD66B245ED19C9FB8846
+:1038D000B2E2A9AA9A033258288464B34A6B9F8F34
+:1038E00014042A63B9E5134DE6A9D06E18F87CEAF2
+:1038F000E17BB3B21068417DE7C6036203F968401B
+:10390000744E7D41F7D58DA3CD1ABD86CD4DAED673
+:103910005857C31E61CD4B5F31E18D905FAB1C47A3
+:10392000323F08A5C219099733BA5B528E196CEB66
+:10393000A898657E4F15F2A6AD4B46A421B87BE052
+:1039400085EC21530E7B96CF1D206EF2673455B265
+:10395000AE8F0BD9FC2358F904E9970AC96745785B
+:103960009DA4DFE6CB0E73C454BC78BBE992BF4480
+:103970003E03ABCDB0E0105EDF65E0A6E13F9DB554
+:103980009548D07458950069DDD8BC82980ACB95CB
+:10399000E142C3498B0D0FC079EB0F5CDE2DA240D5
+:1039A000F7BE9E53DA3717720B796A6D13561909F1
+:1039B0009B71B274C511D41D86599617169905F3DB
+:1039C000B091FCBE5E4175587B367EDC2634498B57
+:1039D000E3118CE16CFEDEC09D09929150638D1E57
+:1039E000E96CD464DD040AFF3F4A82DE28E7DB8904
+:1039F000C74648D090CD27E43F39C71CD2DC3D34C0
+:103A00008D2067751A1C2808B66AB790431D2DD8FB
+:103A100069F4384F6B513789A65E0D936559C88696
+:103A2000312729AC9E3CCB6C4DA5E6C5549EB8A56C
+:103A30006A845E7858A5A45F734EA4E414ACF8843D
+:103A4000AA146CA2363BC4FE3FC51CE99345C66868
+:103A5000314E5547CC728CBA2FBA55A85FDD6BFA40
+:103A600083759D7CBFDC96CFEA684546348A4F3724
+:103A700021FEAD16ADF936D0BCD85C83A8C386C391
+:103A800051C74FEAF272FD6C6210DEFFFFEA27A910
+:103A9000D150EE602E4689A7DD3EE3189EE8DF2375
+:103AA000B00AA92D8F5A85180DD480EBDAF0167A5A
+:103AB00065A189A4365F3F6C2F863BEC774B84F081
+:103AC00069F592E497F15B1886D82B8E835F0EB868
+:103AD0004250B094A23FD2E6C2D168C1F0E7ECFBFD
+:103AE0002A8A5708B368C98C5A5F9CBA2AC3DC80FB
+:103AF0006183CA7670D6AE17E443238F444F35995D
+:103B0000ECA0FAC56727E30935B67AB4A1E9B8266F
+:103B10005BBCA8637E75DDBA8EFBC231B9280BB7DA
+:103B200086247CE3371F0E83CB86B3E2EF3B7A4FCC
+:103B30000C8F5D5D51DE9C276D170B50B866648954
+:103B4000B93792E63CBE244D30EA0E85E78DCEFFB4
+:103B5000FB39B3BFA724A8D810A50C46256E6C4826
+:103B6000F2C41DB35403F16B0F3E5EFF7369514DF8
+:103B70000FA4A7973AE1671480002E64F931E66D2F
+:103B8000BB9A68F76887473C902AB7EE5C8D01F0D6
+:103B9000C25FB3495A205E040D0B8690F75BD3F6E3
+:103BA000830252005B0D02AE0B91FC027E6DBC3BAA
+:103BB00085B38DEB32C32B170CF50A8B0D92793F31
+:103BC0005B02A23CFF0A45451FE2D0DA61CC398492
+:103BD000B2914378C6A2CB7871BA53135ACAD2AB0A
+:103BE0008D5F428B63D4595927EABA4ABCFD2A8BB0
+:103BF000176A54E0B661B1136FCBB6E7A1D9130EC3
+:103C00006F648E84F28F5EC959C2DAD1729B92EAD8
+:103C1000EB53A60C14552A2099A9327C94DA39ABBF
+:103C2000FCF56746ADA0996379D047D479B6935631
+:103C30007C9013C96BAE0E7B2B2A6441814805EA48
+:103C40003ACEB6C656562875ACA61B0F519146DA29
+:103C50005782ABF8560678025C594A69D1684C9F86
+:103C6000CEB02C5584C6CD0E5D7523D604A94B2D40
+:103C7000D6663652CCF06CB98E7FA2058C70AE152C
+:103C80002426349E9F307376BAB9C3C311C9B1904C
+:103C90004989A740C3D6C21B6ECB7E3527640D3140
+:103CA0005D5CB56335CC687C49197FD2D5757A9B4C
+:103CB000D3C58FB3585DAC71009E940A824E28FE26
+:103CC00025F722F8DC4C5D712E1620D1504E6C1970
+:103CD000AF8014903582284E95C17203C77B9A6CD1
+:103CE000D33DD32086838C5CC81CEBEDCA1D5402E7
+:103CF000A327A92F7A6F9193F17ACC54C4EBD8DD26
+:103D000024C96143BCA8AE5C68DF7766626DCE569D
+:103D10005043C364A9B89DEBF08D4D3100638BC255
+:103D2000282DD3277867C4468B3C851662EB6565E2
+:103D3000CB3584DCD1DB80C214B932EAF920785467
+:103D4000777A342C2D1E162747D86EC2A89048A823
+:103D50003677E2BC2CA0816BFDE13070AD0DC772EF
+:103D60004AAA0B0321854606815D3FA34A69FF707D
+:103D7000085C66043684F85C669560D8F1C68143B9
+:103D80007B226E32993A029B676AB633A994B132AC
+:103D90005CAE5886D7F96CE2E64F597159C4E13EE2
+:103DA000B5BFF247DAA8D014C257AAC614CFC41EB2
+:103DB0003638266CA8710FA949FD4879A22F543ACC
+:103DC000F59451633E1E83BC43CF7A81922F5C38B9
+:103DD000DECEA566C3466ECD1D91732E742C84BABB
+:103DE0008FDAE2D3719DB7D9259855EA0A7719730E
+:103DF0007A290E773EE2B079128F534510D3885955
+:103E0000D61DB9AD258982A0D630460645DF8FB4D0
+:103E10006609EAD1BB3EC1C8C7E4DED6F3677423A6
+:103E20003A9E2EC9A50E5044F5C2511073E1EE2101
+:103E3000FB213EB1A3B3AA23A696092DD08047BE8D
+:103E40005DA20E45109529D8DD48384D48CFC9EC04
+:103E500035B78C1FEF2BB518ECA223560DB4625D5D
+:103E6000ED1A260947557AFEC90707B691C183CBDB
+:103E7000B78A911F3FF8F935D4578C5DDBB3BEC3C9
+:103E80000D430E5F092D0CE65244095FD8E678D445
+:103E9000F102A0028F4255D6F32D8F4A348F0B6B5F
+:103EA000CDCCB8473B462910843B1CA494162E0E5B
+:103EB0000A209F2A894D72285E24BA4B00116F5C3C
+:103EC0000BFF2C998CAAC8954BC41C5012DA68D8E9
+:103ED00007D5D58EE7DCDA27858FC1A6DA4933C945
+:103EE0001D0918F094C72537725FC68B0F06B2D430
+:103EF0003524A922E70D1797D29B7BC410E2DEF888
+:103F0000DED25D271CB3306128EDE880AC857955A1
+:103F10000C77158B3F922BAB6F0A526C67B136DE74
+:103F200019A4D944ECBE7BCBEDE1A5581C2AF4A71B
+:103F3000B6BB7774D6C8F303576A2211B99F9D4D5B
+:103F4000D0DF27C04D0D38488A31F910A3451E0F28
+:103F5000A42BE53D9A6A96A01E36095FF6D6A033DB
+:103F600007E5065025504EA403A26658FE42A9D28A
+:103F7000931D1BE0A24715DEA7B0B93C0090EB18DB
+:103F80006F24DA92AFB93FCC200CE4FE0742DF5336
+:103F900076C48EBECF7EDC79C37EC9B6DBBC330966
+:103FA000470B2037BE664EF1FFBC7713D7BF4439AD
+:103FB0002B73FA27CD87B11A425F156B4D98D52127
+:103FC000670EABDA430CDEFC510708E5B338CA785C
+:103FD000356324B1763FF7BD0BC371DCBF6BA2879D
+:103FE000702C405BF18F0E759802C0F781C958059F
+:103FF0004745FB84573A308F478C39F40B3A187297
+:104000003A43BB591B88E3B9F851E0643C7A8F739B
+:10401000614850FF58067400C0261A1A02486312FD
+:10402000FC8ED2F21FF94F78A5CDAA92909C6F8991
+:10403000AF6020ED321DC593F0F0F369CBD78A1441
+:10404000987837335B58B53D717A4786319A374C4B
+:10405000860462508ABDCC7B334781BF87805FF87E
+:10406000679F9F57C86BF30D7F913A5187CC9A3E5B
+:104070003CFF620100B275807229AA7AE12599CFCE
+:104080000BC4165E09A6CD4C0B062ACD44BE6E5459
+:10409000C3F9B4550A98505EE53BA372827E3BD7C4
+:1040A0001745225532B7CBCA7EB856DFC73204BD9A
+:1040B000F3FA5EB46F1790686E393ED0083CD52B8A
+:1040C000DF15F179D4503CB85A4AFB9C96A80D9F55
+:1040D000361A80A0770EA05E08FD217A69F407FCED
+:1040E0002F28DB37814098F82B6C24C311712540B1
+:1040F000E80CE0E10BC80022689CF6998A10347441
+:10410000C150A6EFD7A15A8C0584303FED7E4D8E6D
+:10411000AA6CEA8ECD4AF36368C76AD4E7BE905CA6
+:10412000A8C0D228733241C550FFB7E68EBCA4594F
+:10413000D307296D50AB2E43AA18B866E7C9C8C586
+:10414000E6DB967A048BF3CB5B49E37E9F145478CD
+:10415000675AD8C02C90682CBC11F6CAA225015809
+:1041600087E0D49FBF5750AD1D0A5C22385F7A228A
+:104170007844FE15E477CC4F0E423F63620B25E78F
+:10418000D205AA07934F572C6842D8181CB30AAE21
+:10419000963EE099B00235EE2B8B74762BF631B655
+:1041A000191CF53C719065D81005D9175B0AFD1EE6
+:1041B00082FDC249371BF7423E1E40376A506AB241
+:1041C00035CDCA43DB52793C72B5F6D2AD0DE95418
+:1041D00097C596AD56A7C5BACBF6092EBCF1674672
+:1041E0000019821BF277966F6E46F1CC0E9CDD971C
+:1041F000C5E62DFA516C527D32C823A01D18D0C9D6
+:104200004A91F11A18DBE3C84B8BD1959A92671C3F
+:1042100041B933ED176A692238AD4665982ADF1D2A
+:104220005B207D4071F369F905C72FCF995FCDCD34
+:10423000B05F7E06C0D7C700512B0F922C09B25A2F
+:104240006FCBE77109A2076E778AEDA3320F981D35
+:10425000CF1D8C579C47CE2136024A376676D97DD2
+:10426000DD18C1F0513CB567F4164584177430DA97
+:10427000657843170E9A7F2DF9B356BE84322B41D1
+:104280006B2491AC8FABE09ABC0AAFB3F8C46DFF5E
+:1042900068974914E201798156BB06249DA6B19C1A
+:1042A000040E169C24ADA8EE44A82B9A42F936B908
+:1042B000163B7994EEC9552F27231816DA84E08926
+:1042C00043F6C1721361DC8B6E6BB52291C2AC51A7
+:1042D0007317F8ABB11BDC9AA24701875657B7A4F6
+:1042E0001443386AC458A52A498CB5A1E50A61CAA5
+:1042F000CFA9D54BC69FB64E24026297FD67AFE3A8
+:10430000DE058EE6BB89DFF244A2AA944281F087E3
+:10431000F8286984B1B6263460A1739A1D8AB6C2A2
+:10432000A86AC73B4755624A1E9517A4B4FDC083CF
+:1043300047879B88AC5542A10187548CC42586FCD5
+:10434000DB54C578E452445FFB7CE10A5ECD5981C1
+:10435000F633EA4ED67CB0F00E474D7A914971485B
+:104360000FB5D2FABE50EE028037E3D8C709B116B6
+:10437000DED16F2028A39652444CB5D77F927A8124
+:104380007AFD3C6145EE3DE3732BB6AE62B63BE28F
+:10439000664AF36320406D3EEA57719ABC640E672B
+:1043A000DDFB436B3C528A6E294658DE29C0B53688
+:1043B00099DC78B8C5A2BFD780568D63DBF746D8A5
+:1043C0003DE3F52FBA8EAA3F33C305EEE60A6D3DF5
+:1043D000F70B7B115A7FC8EDE942CA4256E89F5756
+:1043E00077028D93B1F019B4554411F469C96ABCD0
+:1043F000B8051997CFE4A45D677012C87C23944078
+:104400000C29FD6B8D7F1F308DEB2688162EBB5A35
+:104410005F323E084286A835F2F625AA99EEDBAA5D
+:104420009892FC254D3682B4C275D78B92069F4F69
+:1044300001BC872231FA3305C72D70452C34D0A139
+:10444000152D9DFF325ADDBB56D20ADD765EBC8A41
+:104450006F92D671B2902DFCB6714184F1A360C702
+:10446000416397F85E4E3F2CDC21FE74FBFA9333D8
+:10447000A8CE4EBC89F363BAF42A178E49FB3BEAF7
+:1044800030A73B79A7B7AD877D14905A22E43DE071
+:10449000D5AA1B0ED3A7ADD0841F05081B84A4BECC
+:1044A0005C7D118DA4CC7E02388450EFE0F3D26E97
+:1044B000E934787A5D679594B439A72DD784D00A0A
+:1044C00073171B7404C4B27265960A4EE679544998
+:1044D000847DCEE98A7B214ADE9A1232A6AC817BAA
+:1044E00096B55E5AB5AAE7282CFFAF5FC901AD8D1E
+:1044F00032308B437C2391409E78FBC06F76CAE9B3
+:10450000DB05FA057947D01EE9018D67B7960E1BCA
+:10451000693B82C634AD08B9C9C387C37247376CDB
+:104520005B5CDEC269CD88F1DD6FCA891746774BC7
+:10453000D59F963D313A3FE48436F1A6ACD511447F
+:104540008BAC84369A88C3732F335599199C17E323
+:10455000A0BA1C92B8D39B3C7F8F219BC2D193A859
+:10456000D40BE5313C865D6D5E14A3DD4A98B9300D
+:10457000ECF7B1EE993C01A4E786918DDC5721253B
+:1045800056B96721B0662D2399645F9CC05163635F
+:10459000D70C47BF4C1B8C5BB93B02E8D7F792089E
+:1045A00090E3EA7D42283107D3F1A3BF571B098E60
+:1045B00045F44318F470DA1378E6CB37E8A8ECAD8D
+:1045C00054B8AE135B9DA1190DEF671D97C6B49B40
+:1045D00075BE3DF37ED9F4DABB0276AE0A18461DED
+:1045E000A4DE25BF33163FDEDDE46618D97FB16A4D
+:1045F00095C66E5F4AEB0DF756E84A99ED3F8A8201
+:10460000719B7E3B2DE8B71770516B8FAB02BBB02F
+:10461000B5AB4BA93500EAC90D1EB1A785C3780318
+:10462000039ADE6628F4B8A4CFCE43D8BB99F0F63F
+:1046300077982864E1F1EBE8EB84B26ED002924007
+:104640001F9C459822635F0B224F4CF62968760623
+:104650009D2F5E38CD47C352538542664DA7E5B0C6
+:10466000771D8706849A177BF05E01E86082969436
+:10467000CDF923A15379EC4A42F74A797151C1ED42
+:10468000FEEF9DDEDCE64D1782692D2CF5F23F8DA5
+:1046900082692AD53ABBCD9B9C5311AAACC0E57D5B
+:1046A00001BC644C62E56726D74670694AE586D44A
+:1046B000A3AC1BA6A0415230E74A307BE2F67EABAA
+:1046C00081FE6AABF208D97FB4B92DBAE06AE9E499
+:1046D000A326F8978CF612833FEC2C0A72D1F207CE
+:1046E000EB8A7741AA3466147642B6D93F0353C4A5
+:1046F00024BD080C3F8346B5EB9E3A0D69CAE149DB
+:1047000058CB4DC420FB1566D9F79760D4F76F09D5
+:104710009C68B23FFCF79CB4FFC11D6BEC1771960F
+:1047200038FACB483FE40380FFA98D1A6F3B910410
+:1047300090E146172EA3A3605C9E16F207C68BA7D6
+:104740005EEC41099C618E66B196EC6ABC08E98713
+:10475000DAED4A1BB2FE20B6B99236846A0C52B426
+:104760000A90CF4CDD25E8376C123E679EE90FE7D3
+:104770005DBB1F4EA670DF807CEAC33AA21B4CA330
+:104780002DE0AC54059F0B8AFF9984B36CA9DD61C1
+:10479000904297D327EB58064C8CF22954AB1985DD
+:1047A000C9EAE67EA36A9499BCE1324F776866C68F
+:1047B00025B89B35F34D00D14B159AD861DAFC5CD6
+:1047C000452AC3EDD778F7EE4E06737E4E277A82E0
+:1047D000AAC1823CD2734180EEE90292AFE3CB984A
+:1047E000D2D0AF7CD3EA4CB4767D2B607DF061D91A
+:1047F000B3F8731BB0421D903A9C46EAC49D07F87B
+:1048000061389C986E969648682B03F05EB2C3019F
+:104810005C4218ACE8AD0E09712B12F722038FE54C
+:10482000DEB41EAE61C51AF46A9B7B937B5D37E5EF
+:104830005ACF197B85D733ABC138B09A239D2B7CD7
+:104840004E47251706322FB7F0E87EC06747CC9950
+:104850000DE251E9C153ED5073A63B21E41A541EF9
+:104860004885E05A553A6C70CA26FB615A42AABC88
+:10487000A56F466636C9FB0BFCCFE98AA4B4457B1D
+:10488000ED4AEC357331CDB889F2AAA3301C2B4820
+:10489000401C3AF18C04E7F98E02CF3DE0428E686D
+:1048A00064A27932516DDFFECB486C771F454A7B9D
+:1048B00099B80F42BE996FCE85FB7959ED6CF70F11
+:1048C000BE63D3411AF089B3D4584DFEF2EACAAFA1
+:1048D000441223F6FF7FED2549B3385E74102C7C1B
+:1048E00001595F53877ECDA16EC0AF4773E557FF77
+:1048F0007E2F63F42C8F49E2147BE13A35AF7D378C
+:1049000088F03A708EA26C87B992729D08129E7FD1
+:10491000C86A778DAEABC33A9178B21B0730488432
+:10492000DAAD9F7DD50E5DF16438F4FF2E5F070D83
+:10493000599F6201A4E36D8471ABAC6D23773D7A1E
+:104940007A0EF26AE7339E1B5EE833FD20E351A343
+:10495000382181870A5A7BC0A37D8E6F23B0509E79
+:1049600067E9129AAFEC4CBD8F67A1119957DC6AC9
+:10497000C3374E8D0935EF89244CD2E9493A6F5D32
+:1049800002D1F27D80EE1A5CDFB649A7C2D9C30A14
+:104990003BC037F9E57FDAE66A3F63A079530186C9
+:1049A000E277EC9B0AC1557AB66670A11B5BF836BC
+:1049B0001893680C1C1D62760C72AA1373F5160905
+:1049C0009ECB94983E0D637C06A4E1F19793684ECC
+:1049D0008565C962D8B26366F69725F7D883013A30
+:1049E000CE13EDF730F42BA1463EE336AF0400635F
+:1049F00076DDF125535A918F95779D52396ACDFD19
+:104A0000B47FC7E8727F966E51D8DC1180465DFB9B
+:104A1000C34C70211C3B9B684D2A7CF9CA2A4CB7B9
+:104A20004EDF037E61D9F47C795A0EE5D3934D6B4A
+:104A3000C6C39E302A163C5EBF6B872DEBC546640D
+:104A4000F8A33C757A3C417B61A78C2B08E193E28B
+:104A500014EB97E6F59828FDE1A6B6F215F9BD0529
+:104A6000AEFA04C52F428DBA2EAF61BCB042AAA8DF
+:104A70008DD8C675503FDA232B5A9931A50EB5D182
+:104A8000CE3C14DDD5EF998042FC80B25464BCF872
+:104A90002DD6B77A49454ECF577906EB5ABD8FF5DB
+:104AA000D894976FF70AD9A4FEA4557ED51A947DA1
+:104AB000FB8A5256CE98EF97C024F64007A86E8C1A
+:104AC00071736992542F8A6D59812870BBBD708CA7
+:104AD000491ECE1BF26EFF981EAC857AC020363B75
+:104AE00079099F2CAE805CB64AAE3DA36A9870D01F
+:104AF0008C5B5A784659E67A5C907D87297E67B54B
+:104B00005BBF88279DC54B692EFAE1E0BDE8724482
+:104B1000503E83BB2B6707D25C17F2DC5A642356E6
+:104B2000FB732AE2F35DE7DA0BF74717A4734292AF
+:104B3000C1F6AF0FB8B7FE5D2A4268382678C9873C
+:104B40003F8085057B58F0814743C556761AE710AC
+:104B5000E0280927EE18DFB80226777F8B3D37E87B
+:104B6000C3951D24AAC2EDE8D1DD8EEAA2A1656E2F
+:104B7000EB9C34BCE1C0F5F8AF1D80A572B157E7DE
+:104B8000D527A58610864DA61A3E81228CAEA5405B
+:104B9000257FCFDAF98D2AB7703962EDABCDD2928D
+:104BA00087B0487F4663DFA8BFF0289B6BA024B482
+:104BB000DEAE1374758A75380D0B6179645F3BC482
+:104BC0002ABA80109842732B7C91CD02053DAEDA53
+:104BD00073D090D7DB7CD3C7CDE0F12A0DDEB35084
+:104BE000C234C6B0F86DF6A7C63510A65569B3171E
+:104BF000C53C91E771BC1FB5B3DD2863FBDF6E7D5B
+:104C000060A09E05CB0F78CC12EF23C4352DB55094
+:104C10003ECA60556E2B9A0BA546C55FB497CA5025
+:104C20002424615B59919D6FE02D17BB5A688C1746
+:104C30009666C5E39E3455D3998A380EE42D7FAC31
+:104C400002505F9AB24B8F8636C7C17A1D826EDAE8
+:104C5000A5B3ECE1E02CF6575D48C587ED4D944CCB
+:104C60007BB6217C1D43E8E5F600824EA0D4DA3005
+:104C700083435777DCCC65263C9BDA5C07463BCC0C
+:104C8000F85D6E3FD78B3E0136C2626EB4A3B87832
+:104C90009411CDCF50ABAC5CA41F92A6D823C264B4
+:104CA0007AB8C44C056185E210A98D32B7454CB382
+:104CB000D4C43E2A7A731F5EEFF9F8BC4807F41497
+:104CC000EFE914A0899A3FD02300CD991445BE4145
+:104CD000329D163969AE9003C7850AC74BCEDC609A
+:104CE000449E468258D1B90247D1CEEEF546C8C29D
+:104CF0006C190C6757C7F33000054BDAC842868C35
+:104D0000BB646DDCA8E50CECE64154875B7E7C0857
+:104D1000500EC12CA06DCB999CB9CE73EF719DE95B
+:104D20007D3CEC7B85C08D9F86BDDCBFA78A44039C
+:104D3000AECDBD201056299B9CC55E88D3C7009C74
+:104D4000FF7594585BA8742FE53C026794DDF1BAB7
+:104D500005C52D09F4726F2522B6501FBF602E3E87
+:104D600096A0D43A78C04E436E67945E4CADCA7F2D
+:104D70004818D634B3FAFC70E0E39B449876661C7E
+:104D80009F5F2E67490F75A467D81F6385775722E9
+:104D9000FEE3218BE1D520CE095EDDFD41BE8DCF46
+:104DA00099501F628F764183BC134F8E6F686C548D
+:104DB0008B6C67DCCF19E107847E0B8F956332C85B
+:104DC000A89278D147538697491D151F29EE57267B
+:104DD000D67152FF2316EAFE121D30A8A9A577B698
+:104DE000A15BC2E3BEFBAB873A921716736A1688C3
+:104DF000EA8B8BB20D0B5EE2D846B30AE134DDB527
+:104E00008DABE87B132FA4E870680FD60862BFADA6
+:104E10000F4061B256C622098301F758C520407B76
+:104E20004C8A7D2C7A737B9751E14AA93005DC4F7F
+:104E3000A26BAFF887E9A3A4AD5222F59BED917365
+:104E4000CB87A151AE4D6051AB25385E1591806F77
+:104E50002EEBC4AB278211170E2FCC9D53E2D3A0AB
+:104E60009CF1B2666A40A15038B698F0F560785966
+:104E7000DDD5C804CD126792F64FE198A4CC0A6B39
+:104E8000A7995C625C74AB80A469016E052F237DD9
+:104E90001588EE7A3773AAA7BC6AEB133652C9F9A4
+:104EA000FAFB5824353B54A71E656A7ED5582DFE63
+:104EB0007A9F5612AD00D03AECAC24C4C69D5E4D2C
+:104EC000F0975A713B2C6B08E08ED4509FD5B06C94
+:104ED000A5850C99D65E97AA63EFF55D73751A5098
+:104EE000F3B435F836FF0C05B91450442B690C1E89
+:104EF0000535BD316FAA5047814772A03F987BE8C6
+:104F0000DBD0918BB3B62AB2B5D147CE2F2E2A90E3
+:104F1000941EC3976E12378B91D9450061D16A8078
+:104F20008C97B12A2EB58FC09B974536A8F554B201
+:104F3000DA00F7FDD910787BC60F7A4886ED94E742
+:104F40003B4171DCF41211D01CE70C8D24EA19B638
+:104F5000FF91C0A7F993C1F604D0DAC6136643489F
+:104F6000CF11CEB6652530CF374ACC1509389A40D7
+:104F700016F4E3B3B7AA118588DF552CB225D5C83E
+:104F8000C55D9E3A9B83464B2D7797ABC7B1F0A288
+:104F90001CEA9B155305073A3C5FF0979DCD1DFB1E
+:104FA000768896D51A20A3E0593A6DA42736776201
+:104FB000FB6B857DAB627C0C931733A05651842E1E
+:104FC000346FE69DAE9A0468D41E00A819E2B0CDF5
+:104FD00097DC22D4C0A2618E8D051E889A78E58266
+:104FE00078345402BE02FFB05E53D988E9A459F662
+:104FF000D60F742579E6495FA6F3D48F6BFA498EF4
+:1050000080F80EE597F0530B414AEB35DF2491D041
+:105010004C4DFCFD30EF3BE25E76FF91DF688E8207
+:10502000AF6B670FBEBABB5061E16B43C3F1B5B95B
+:105030007C03B75A7B056FBBF788B4FAE712FE1101
+:1050400019B47FC38FF86EE8B2AF8A5791567E5D70
+:1050500035D81A8DA73C805ECDC569AAAFE26166DE
+:10506000011231919499E42047ADCC20165DB39C98
+:1050700087986D15548D906580AEF0FAE08A55885A
+:10508000BEDC916157F790B87E3714E0B5E920DBBC
+:1050900060F17432566028530B1597052B6818C6BB
+:1050A00039C54FA8995DF987463BC77A0209547DF7
+:1050B00025F5D793A7B762CD0D91AABA76B5DCB620
+:1050C000B6036D639537949D5200EB076794252BCB
+:1050D0002987E15D0ED7A69A8BA9487C89C02D3A15
+:1050E0007D369387BA02FC54B61D4C1E5D70B39892
+:1050F000A5ECBC7B1C4CCE25939A9426B930792B19
+:10510000B36EEBE277F7A1D79DEC05AE286697F07A
+:10511000271C1E53A90DB9AE5B151A07B38A2816B2
+:10512000C7603BC3C712691E87F5EB88F8FB14BB49
+:1051300075CD894276E20F73058B6F24B8F73097EF
+:10514000DDE8458476623E6C7DDF1A2C0BA479780D
+:10515000A62C3F3F29F5E6A28A66468940CDAAFAE9
+:1051600034358D559E30BCB5CC1C3B331DFB8BB20A
+:105170004B7862551903695BA3A0AEAB6A237878BC
+:105180006BF5AD1E61963B68FAA8C833759CA055B7
+:105190001FEB05C99382A5E664CECBCA9E52691166
+:1051A000A6EA392A9522D35E7A1C8F465624CADA9B
+:1051B0003F52D0543896EC1537BE57114B43E3D8C5
+:1051C00043EB23EF9132BCC867E6AD4AB3E8C1EBCD
+:1051D000CFFD089177FC723BB7121BA44B92E718E6
+:1051E000D02CE479886B6CBE46C408ECEC2F0F58C9
+:1051F00036D46F6705CA81BA77104CB559DB2B8C52
+:1052000081BEEC953993A3C3E287D5D8403B04987F
+:10521000467106FC30E38833FD526EC93E013BCE39
+:10522000A228719748FF96288F15D60F0BA91BDB74
+:105230002CBF24DD0E2D301A4BEFC28E3267EF33B8
+:10524000D027033C336E5A4AA3323B6D3F929DEF09
+:105250001F31621E51B52668F269FBE2C06D3155FF
+:105260009899DEA62B3644B5CAB13C35852D22D39C
+:10527000519524A6482F55A6DC9D58A1EA424CF131
+:1052800000259DB441CD7CDEC17B782674A82F40DB
+:1052900072EC09F6339C8F19C1F8362937AE3FFC02
+:1052A0001EB7AE44AA7177523C947FB126FA1AD742
+:1052B0003C54E066ED2734B0BF9A8BDC2A3363E8B8
+:1052C00057C3E6A14C3E5F9AB969A44B97209E76DE
+:1052D0004145328194FF7B01B4727DD24657C205AD
+:1052E0004B1FD70081C40C261D5A1B5A3FB481F9AD
+:1052F000830B1442E92E0D84326922BC2C74A4EB7A
+:1053000093DC07EA7D13266D606FD01669F3C6E162
+:105310004F7B02C8817D428E3DE4FDC1AEE8D6736D
+:10532000D19B4B52E028D5C050F76C2A3151BCBC00
+:10533000600CBAA87F4C4037143D1153679FBFB72C
+:105340000B6B7FD23DBBA7E0535D754B170EB63795
+:105350007C963C64385C8DD211379B08AA97BD6956
+:10536000DCD08812E7D83E5F8CD501AB8D558B1A07
+:10537000B698A35746549A6CC2873FEAC12DFFECFA
+:1053800007221F06121BF9571C688436EFEDE092C6
+:105390005F487B402C03E7ACAE7C6187DE48E6A02B
+:1053A0004F7DFD7538D63DACD48C77A89ABDC9AC7D
+:1053B000B876AACD1A594395F0BF7359EE8A9F4229
+:1053C00043F77A4D9275AAC3EB706A3CCDFF131C6C
+:1053D0001F06EA4F79A6AEB4F4D5EC35C6D4262123
+:1053E00094007E6C227A178A0294AEC20B1CE10EE6
+:1053F000416125AE9657A4B8F3B74E4DCB871D84B7
+:10540000B7E8830470B311CABFB7049D12E559AE63
+:105410009D4F0E36FE1FC2A0276336CCEDACD8815F
+:10542000F0257003E605B617F7F07FFDB6011B3FC8
+:10543000D9C3240C9FB4E57EBE12DED83C75182576
+:10544000F69BD0E0E15F85EDD804C13AF5D0330397
+:105450003EC99D6F72B4705AE62CC9CCA1953BEB46
+:1054600001A8149DF5E2D9AE8851F48F685402A1C9
+:105470002F98BF385992CD47757C9FEB9972A5C480
+:105480009465A3E61B895E07BF410B3326F5F14403
+:10549000FADDA436332A6D02BA0A8AA9E49B9F6D0D
+:1054A000AAB4CE23436500D8986A857BDE4E0E9E53
+:1054B0008FF44A7B6F51B36FCCAD830244F21ACBA9
+:1054C000A5DB221EFA5ED23ED57756071E6AAD4B8B
+:1054D0003C745DD1D0B8F745B3E8AD0A2993E6E452
+:1054E0002FF51750A4B520381663B5235625EF12B3
+:1054F000E5D4160541ED0A4A704053A34C09C82271
+:10550000565856EBA7DB4F8A7FE82D7350A94EBC47
+:105510009BE0A77AF9B98C979F51BEB04701DA2C6E
+:10552000C619199D0F3C34180E944777969CB1C24A
+:10553000A224CC3A253B5F93325F9A602129492F00
+:10554000866B04E22921F8C5FD7906FB4F43DE3A5C
+:105550005925DE5C33BC234415B310F2C134FF641B
+:10556000A5A9C9B63677EBEA989A053CB399F32317
+:105570008D8B45E3235D306E4DC4FA911C64E7F0DA
+:10558000550DFDE6344625246F90F4771CE2192270
+:10559000F9356F7B94127FD2C886D7994FDCDEA98C
+:1055A00012259FB4C7F0AC5B4D6296FB958618E65A
+:1055B000BB57C786CED61E6764926644685C84A7D4
+:1055C000064E31F6E584A88639D6CA5F5F23A41F4C
+:1055D0004A22858447D277524556D68B5D92FB8A04
+:1055E00072869451C6B817EEBC3C93043B97B161E8
+:1055F000FB77CF0DB95CAB2C71B329BECC7F386083
+:10560000652291CB2FAA9114699F59DD1988236FC8
+:1056100090FA277BA226A03CAE3BC8174D4F2237FD
+:1056200036256E251AB3AC39BEC236FCF65E2210A2
+:1056300019D5E4F51DFB556C7598DF478BD79F8A0C
+:10564000C991D36827FD3D4FD56D79C45A4B9981D7
+:10565000CF9328B5F3CE80CA8948C5C1BA42F21F9C
+:1056600022CAAC0B3DD39E6A2A3BCC7D579C302985
+:10567000D1EB2B431D01624C9D00DDADDA3A2034A5
+:1056800015D69F30EF429B81A766C0FA38043AD402
+:1056900045B758F3507C8A9F39D4DEDA94FD8847A9
+:1056A0002C52FF5C1593CEFCCE173BF71BABF8AC2E
+:1056B000B1D0042B11E135C48CFE39583000577B32
+:1056C0004970CF1E53A522DF893E9F63BE2D9F3BAD
+:1056D00033E8A4E46695AD6D7BA90B0CA3E64158B5
+:1056E000CB92EB3668F85BC48768803480698E6B38
+:1056F000F17BFA7CE198D4A2C7A2FFB6C0923454E1
+:10570000382145000F8441CB6DE17DFE2242B17A04
+:105710004344C07ECFDBD75A4E62511D60227D5973
+:10572000E51262529F0DC75321EE351CC1B9AFAFD0
+:10573000DCB09906E1AD51372B5404206894CF7B3F
+:105740008D909010E26DA3A1B2AFAADA9FC6257A20
+:1057500019B1CF844D710388A2E0439B1F03193612
+:1057600043E967EC228BB5F00CCD6DEF75929B0190
+:10577000CC9F01DBBBC15C0C482623A94B9A48D3C4
+:105780001C7C71EE2E8B4552EC31FA57499CF62762
+:10579000F6255E963F6A8E02C18D81DFF82F2D12AD
+:1057A00016747CAF902EACB898F1C2B5B591600A72
+:1057B000C2A15682C1C095B7B9329F2DC2823F2B7C
+:1057C0004CFC5FAEDFD0237AF08C86D8B72866F128
+:1057D000592D4C822E58063100AEC4D8A3812D35E8
+:1057E000CF4FF70DA8514CF6E54DCA946FB69AD33A
+:1057F00075BE22C0848AC61F2133E10AB226F8A8EA
+:1058000049F59F11A0E20B5A6AB83E60394892FEF2
+:10581000C89C608B752B4E30D0E42A5C4F0A47CF72
+:10582000EFC0605D22472DEA734EC2D7384EAA649E
+:105830006556E42DE94E15B130EB4ABA9434E55F74
+:105840008730292684F56D035BCFD19609FE0B6363
+:10585000295AB58F49DEAFEA94E5098D598AC60603
+:10586000B843ABFC65C64FECE5D09DE927DF10914E
+:10587000CB8FCD0CE1839F89EB3ABA5559B14E8954
+:105880007BCE8C7865ACD0D575ECED4D76B2AE059F
+:105890009C6102678D23BD213A83C695DB1532D505
+:1058A0002CC6BA933F9C965D27ACA7924B24EDD9AA
+:1058B000950D57B5ADA710DC76EA139AE5732E4621
+:1058C00002C37A3E5E0B157FE0C36A75BDBA7F42A4
+:1058D000E08CF1062FCB2CF782A0F70B06BF024F0E
+:1058E000E90783C4E1F6A891BED2832636C2CD9ED5
+:1058F000693F3046298EA07498DE46F0FFEBD7A5AD
+:10590000C7DAAF1D79CDF2ABDE6B3488D8AE072491
+:105910005AD9F82E61D2CB85F0AE0E8E267FD251A9
+:10592000D72D0ABFEDBD261278E85E740EAAE0C13D
+:10593000CAF30B41880275F1061F3E69F8E12F900A
+:10594000F05572BCCCC56F0B92C6AD9D48343DEA94
+:10595000B476B7F7DC5F475994BB73490D2E3530E9
+:10596000FBDAFAD60C64086C0BC8DEA572A4C0D9A9
+:10597000718874ACE10419D5EABA9250FB89743588
+:10598000A67E858583E857BDCC51F44F8342D892DB
+:1059900078129BD587A8BCD29A465487489C9769B1
+:1059A0004AAE24475B9F5D4C8A3A9F33A4589D13AF
+:1059B000D68E2DAA897A0EF4CF3C33025818E2E035
+:1059C0002A1730971EA4B5D19CE53DF0C299E8E9AD
+:1059D000D4229BED650BFDC0997A39A53BF8AABC92
+:1059E00075B3EA467A724B971B7F2091279866BD64
+:1059F000B584AC297B3910431B0C970A56945ED6AC
+:105A0000858E3FDDB45DEE7298DA925BE60F13ECA3
+:105A1000DB61D2D3DDD4FB92F8016D91783BFF8D31
+:105A2000C1F764DAE4FDFF6120AF560C0CF206A862
+:105A3000163944E297FBF1297B1BED623C010325FB
+:105A4000424456E49D647CF552F73ECD7EB38BA173
+:105A50001A5035FBFFB8179A3F3D6A4118C9023901
+:105A6000146E198AAF83E286D0C139B56B5ADB2434
+:105A7000558576D58D82C4F73807163DF8ED4D81F2
+:105A8000CB452FE5510083D4798FC67A589C5F1798
+:105A90004ABFC2C07968223737526C4A328F216FB1
+:105AA0007402ABEE7C184A582C4D5C23C7AB3744CC
+:105AB000E74558231568C2719F54C492BC4244E222
+:105AC0007C469A1404A8F0551A07B3FC8D1DB8281B
+:105AD00098F5E45276138D0BF70062F20D0758BC6F
+:105AE0008B0D00D59E82C6CD519002373D814AD99B
+:105AF000A211F045795F05E1EDFDFE65CFDBC02326
+:105B00001057DC7E04BB723A34F38ACC7E538B820E
+:105B10008F624AD34DFB97848C76E88876BA6FDD26
+:105B20000F4F75F862840F6ACA41F568E7EAD8C773
+:105B3000453E3EC139845C1C90E6AE405D05DB65A8
+:105B4000EC233FF7BCAA61AE5ED91E58368E04B670
+:105B50004799C5CE761D84C6D7429F6A377DDEC081
+:105B60003528750B35225007C493548904326F7160
+:105B7000D343DD22F1437AD14BD9E23AD0642844B1
+:105B8000A8A67CE5FB4FD4B9EBF0D05C103B42F803
+:105B90000BD73EB4EB447E6C75CDA3A51316F49CD5
+:105BA0001E1C98672AD99E209317760A33DEE9FFD8
+:105BB0002BDCC8D36B62B0B56D4548CDDC9D2B594D
+:105BC00033149AB70CD4092AE880148D86177EB650
+:105BD00024373F5B8AB7CDBBE34052F3E43E23F268
+:105BE000E87FF5166D7848B84F1DFF3C903CE037D4
+:105BF0001684D2C19E34D1F40F25918EF80F1898D7
+:105C000016117A345D97643DA564742BD7219428CE
+:105C10009308A74BB6B5837AE09068FDFBCCBBCE6A
+:105C20008A805DD0A3C5B751505505C37CADB77D03
+:105C300016EAC17253988B4A4978B41E7F60912E40
+:105C4000968D9A849A36DAB3F90D882ECC680FFBBC
+:105C5000B3909A0A0678E785784F1580955C02C85C
+:105C6000167A838841E26776F3D088C006731307FB
+:105C70002C18C63634AC0BF8C57DA8E32C87AF6171
+:105C80004DF0540282F43C1A0FB9BE05BBB03BBEC6
+:105C90002590C7098488EF04CBCC28257EEEE2BD91
+:105CA0007254448A04D52E597799A3AC7DC101A7BB
+:105CB00053DC07EF406FB3DC3AC9E3C6AE922176FE
+:105CC0002A791600DC9C75468F8E73978372A5F82F
+:105CD0007449C5D718F5D537E9E18180ACC30E10FA
+:105CE000CE4128DE09A7D05568D1107EBEAD8E25E5
+:105CF0001DD280F0D06D0D73C571025A5183961C70
+:105D000093450F45CC58A5866BBC02F093B3B27394
+:105D10008C506CCD55609840F3D8E379077C41CF27
+:105D20002CB6A9179B847A2C0B55A75E66F0230B23
+:105D30002F8B46553DA6B4D80CD2C58D1F3A92EC98
+:105D400082F1684C67B26B03682D711AEE7D9FEE8D
+:105D50006B4F2A9E5999215101ACC594BBD856B8B6
+:105D6000CD5D31D8A993F9F3CF41F86B3835735D28
+:105D7000092A9A45C95FBCA2CEC79B57EB528FF147
+:105D8000025C66E66CA243D6A37E3F3D616281A0C1
+:105D900087E986E862FB9A2B23655C5A475C977417
+:105DA000B2F6E69F8A7BBC69967A747E89F6FA4AD7
+:105DB00048F641131090BD6B2FB703259F82B6FAAA
+:105DC00022ECFA69DC4A95D17CE7C016A643443838
+:105DD000E2F71E1E815F78D87F2012C8CEF865F6E4
+:105DE000DCB3377B18056E76166EA965875F5D108C
+:105DF000528EC8EF904CD019BC85088958D95E5F87
+:105E0000996B727F4C7D65CA80535CABB8B9ECE589
+:105E100029E4345A8C2F37633B339DB2000CEB5C82
+:105E2000850648A8246CDB7A03DB76B3768E82A7DE
+:105E3000B73951CF2C5933B10C613335D5147AB8F9
+:105E40008F956800B777312C3EA999A8C648317262
+:105E50001DB99C980588423137C18EC4F013DE8C81
+:105E600095D66B17B040EE11DC99892E4923039328
+:105E70004F84A7B67178C7AE46826F891550EA6223
+:105E80006659E1051F092A6DDB02E8E07B2159FE16
+:105E900070EBA5ACF318334CF1A474304944829CE8
+:105EA000AF5D35F357AB9B2BE7830DC066A4BFD323
+:105EB000FC4BE2890B88570DD7DE1827465DAC0EE8
+:105EC000212838424DE5F347A7ADE94AA133196DC2
+:105ED000E62A1459E49B684496357A60BFF83A1B69
+:105EE00024AE4678F75ED3ED868E4BA9B2899640F4
+:105EF0000F1BD8F25232809F4510A591EFC2EDD30F
+:105F00001DFFBE7EB8D23B676B932F1E5CC9F7188E
+:105F10007133BB24AC0AAB28F30C598215977FACC4
+:105F200044C927C6DDA22F36DDE37027639CAEEBA4
+:105F3000E070F381471A3D5F56C92E27C5A8238C10
+:105F4000E574F76A53D67E1521F7F0455EEFD91A4E
+:105F500091B986BA33C514F6A575574E4C3B577F99
+:105F600046FAD571AC4952EC834F522D6C4DC87F27
+:105F70002F0C3F5E7691D32BA9A8D6A331F4B68A15
+:105F8000D99868CE6ED090CFC6F753D42CC9C6A38B
+:105F9000CA11A734F2332DF73299BB53AB01260B4C
+:105FA00047294FF8BA7C87C4D47B512B8DAF48BCAE
+:105FB0007CDAE16F60695038A769D39EB3A885EB9E
+:105FC0009502D3E58B5774C3C22B01EF65DA90E5D8
+:105FD000E50B75543346E0674350986E8C34422A83
+:105FE000DCEF89C32A041B263F32512F2623DF888A
+:105FF0007285C0CD4DB89938578AE80E53A44C62CB
+:106000002A50C73271D764402C1A9951360F18F9AB
+:10601000D4D1E1F04C795E367B585D3AAFEB9478A1
+:1060200072A32FD25F810C59D528832C96F0EF4DA7
+:10603000579F279631AB11583E1C4E25737CC7568F
+:10604000CCACCBFB6E27E00064B3344A4295C775F5
+:106050007A29C7C9C4A9546A00E3DEB134F75E30B7
+:1060600004D76F8BE41FD4EF57CC308E7D2EC787BB
+:10607000D8868CF418B405A815A721EF9C6BCF988F
+:10608000ABEACA185F71937F4962B4FAB626399DAC
+:10609000DB0F888BA205090003FF44B838A4E5C9CB
+:1060A00068E406D292FDEF0BB95CCFB2C9311EF1A4
+:1060B000734B2147B180BA4D1A582A3F3F13A203B0
+:1060C0006812374D64581C49613210CD819E4ACC0C
+:1060D000F9341A3DCAC80F1D52545A99F68DF15819
+:1060E0007DA2A838A92117BA1E52673EDD2BDA1E01
+:1060F00032AEA4654A42199A47447E58C9845C6B03
+:10610000FE81EB25A9443E38BB69CC3057BB59E131
+:106110001CB98DB77B476DC04E179FBEA65062E677
+:10612000EA6D16FBD7E7C362DB1F775078F9D63AE2
+:1061300064A505A2457A265532FE8FAD93867B393C
+:106140007C2C3CFF5CBBE15566F8D38281BED97DD7
+:10615000E6B2D657DF0A53507F376E41BC8360CD1D
+:106160003D637DCAE4CA272C785D4456A31E2A18D5
+:106170003DA9800F2FFF34A1700A32729086AC3A8D
+:10618000255545EAF79683D1FBC417283624C3C8A2
+:10619000F414B159FC476A3FC999AD77B21B87FC2B
+:1061A000BF1F803460E8400A522F799B38F06C5052
+:1061B000B4BB9AB6F213EDB57388856C0EA847F69A
+:1061C000C102C1E9933BEBB91BE92B8C63C0DB2017
+:1061D000257BE72BE815FC3AB88379D9EBA593EF3B
+:1061E000845C8BE88E45295512B531541DEE4E8BDB
+:1061F000FA990ADBA0A088E92CB777804EF305D482
+:106200002299050996296C21FE33B4CF70B29A9C6D
+:10621000ED4605A58972AB5BF17EBB94E2D357D402
+:106220000C65FB7B3BB4F56AB7A3D945F74F9AE100
+:1062300007550014C13E86F760E38156B6F239D2A5
+:10624000ACDDD937F98488FEAE8E170430F4257999
+:10625000D6D2261E49A4536F812F213C128FA1EB69
+:10626000539993B9CC16A72851799A7D2662E8886C
+:10627000079D3FF554EBC6E6A0AC57B77BC9502C41
+:10628000CF692D164365CE33396CE77EEE458D8D93
+:106290008485B8AF49293703B672B52D82D8DD6D34
+:1062A000B1FEF3F0CDB6A4EEC44163C73E53DD4565
+:1062B000A6B59B58F8C62C7B1BFB9AF9E2EFC04AA7
+:1062C0003A57D9FA5D8EF5AC7CE1E95FACBD1C6054
+:1062D000CCAC38ED08022287CA964E4862AC3B0F20
+:1062E00024DC3739A36C4A979A3DBC52052B9CA4F9
+:1062F000D3AAB1D3BA350EA5397D475FA31B23823C
+:10630000B07166637AB24E553488FDF67A55D97FFE
+:1063100080CE5E681B948BEC72F32A524119F0E830
+:106320001B7447BEA52127BC6F826AFAD9CE48C725
+:10633000EF860D2E975261FD1E3678D68B309C1459
+:10634000782AC971D84C394B75F3CFBBF6C8A29BDC
+:1063500000D3DACA30B614B8C477C4E194952133B7
+:106360006E5E924308D20BBCDB94411E71A995E589
+:1063700054DF89E51B4275B91A148DE4CE0C2571E2
+:10638000F9A1E292C5B88F4D1C792938B431800C3F
+:10639000D9C3835579F3B09F52520C64367BBFDB6F
+:1063A000803709D87B299E34AF977AD7E1217708C7
+:1063B000A4E18E6C2897905F408786B9BF1BE4DC10
+:1063C000B6B4953D33D6B0D02119FBB1A31D5B5AAD
+:1063D0009B9E4FFDF584FF81FBB1F8B4AD02033500
+:1063E00032EE258C9AC7E1D6CC776A37D45037E4A1
+:1063F00033EEA54701DA5B0DE6E37DF66E88BF9FBD
+:10640000F6D75FEAE09CED895AC864E73A03C845CD
+:1064100028FA1C640B0F6AC9111600116B782CEC5A
+:106420009968D107267B0FE07D98346A42F341C812
+:10643000F67C77318DA6AFB342571D4D982B0C7467
+:106440007242694615A91FDB995E9257635D78B564
+:1064500088F7182C5319351738FCEC5B3F9AC62C7B
+:106460002CD7D1E2C6577D1C5C91169926C57E0CAF
+:10647000461AAB159DBC78A0611A07C7B0FDCC29A0
+:1064800031E6C8D85DC8DF9F32979535DBC05383AE
+:10649000C295827D84B98F57B2E7A0A95C35F554C7
+:1064A000F11F5ACAD9D59BF80D90E04F0E46D4B6CD
+:1064B0008259F2178F7833E472D429C567362527BD
+:1064C0003451935B9CC9E7DC7E21FE51494DF200BB
+:1064D000EB4B2197CC8925A0A7E1F5CAE975F86AAD
+:1064E000E9AB973F4CA1D596C0B10E237D964054A1
+:1064F00058EF44BB5269136766B8DA576BE0FB127A
+:10650000C7923AD7700E5A4787094796217DA73D13
+:10651000DB09524D8EC1E019C2A084D271F01A86F7
+:106520007295D3C1B749A66F0F3423D591F3AC63ED
+:1065300017FC9EE9AE884FD11795A32E2174B07C2D
+:10654000C547C914916509D316E9F627FE137B4E9A
+:10655000CD3E7B03A06B0C66C03A1D4655A088B7A4
+:10656000C77E14768C147ED0687FD999CFE4CD7B1A
+:106570006C3047E53B8C20DD4D4E903AC7CA30F079
+:1065800079BDFBCBF06044B5EE1321ED2A395D44B3
+:1065900010FE588DDE608FF5D59C495927172D6761
+:1065A000DE03A83A49A19C83820F22102403246BA6
+:1065B00006449273306D0248656FA0D34256D1797C
+:1065C000DB221785FA0C71D938235BFDFF4BDEE81F
+:1065D000693DC335E491BB71DDE29C6D445CA773FA
+:1065E000D4CB51C5F7A44BF238FA4D124323CC9CBF
+:1065F000AC00F38DBDC27655626DB5FB23014E40F4
+:10660000422BC64CEC277BE67B6B35F99D154FA6DC
+:106610002FFE1D4E06BA158E32A48A8749BA249ED3
+:10662000B148CEAAFAF3A0B033F65D29EF2ED04AD6
+:10663000D756C939BF5C0EE124E07DD9EE12BAEB22
+:10664000FDA79C83F8C61D138C4C67BADE7795E4D2
+:1066500019D7F73635BAD544BDD1549C9AEB428A46
+:106660004846947605D61F8DA1CB17BE931AD194B8
+:106670008711D8CD64BDD6275E98EDE3D14337AA04
+:106680008A1429E2BF91DE2E5D22247EC5A5FE0973
+:1066900062AD82F0157CB5575E45F81F3BD904F119
+:1066A0001E2B117A1CF0816F3D92FE4A9C37538A53
+:1066B000BE34DA85033F4797C7CF635B95F214DE9C
+:1066C0007D04A358CD5BE5903724D77A61947D5142
+:1066D0006E8BD9921BE533A817F90A2F4CE58BF581
+:1066E00017675058A6DF59A1CA3C3B76744AA239B5
+:1066F00040199F04E35A8CE688449124D1C8AC7EAB
+:10670000378B9564E25F258A7F0A556597CB1953CD
+:106710005378E7CB5A675CC449108AE8B4F2BC2CC2
+:106720004FDCEA2273184F052F2AA4BC026DD41245
+:106730007BAF3345377113D1CD8480D1E45B77775C
+:106740003878F7DACB288AD313F8DCAC3A5558609E
+:10675000222C10C340DAACF5D34FDA1CF754FCA559
+:106760003B8CDD8A7F4D5C1BEB8138B578FF33981D
+:10677000F8AA34EAA9E485EA88BD5A7C0DD32D3203
+:10678000DE8F074E6DB421D79C324C8AE8B949F3AD
+:10679000B1FF08C0188CBBA19FAD941BB34497BB3D
+:1067A00017C9DF47F85D0465D7D083BD62D4CA93AB
+:1067B0004F0234F85B00B2378EBC479750F0A3B954
+:1067C000ABC96015D1E92E3CF0D4B66EE7B1C62155
+:1067D00063A80EC0CB22CBDBB697842BD261D7A99E
+:1067E00022D193E9C2853E4131E7C780A14529C93D
+:1067F000B27A4A3582D8E0AE0EDF0F5DE7F9818FBD
+:1068000023CE4E3A1AD48561DF2603C3AD4C4848E7
+:10681000FDEA1FFE4424F865871C8479F5CC9D842D
+:10682000CD39E5789B7496C11B4DA89C0A87789E4C
+:10683000A36C57D702435C4768B823F5B1F7A0B9FA
+:10684000F3A336D1D1D2DCD64924E2D667BDF5B365
+:10685000098CAB78C865162CA146CF28B68CC81613
+:10686000D6785F5829E74557C21E134B242AF0B348
+:10687000362A1784D244323CD24065DD3432815A04
+:1068800026BB4BD38600A214FB965993FB7E815402
+:1068900036CA798696471EFDB411F7DE6F2CE50ADD
+:1068A0002600873F908D576A922EFE1135FBEDDB57
+:1068B000FA5F46BBA6A49698E9E49A597EEF2BC5E9
+:1068C000833D526D753740F484AEDACF26442BF405
+:1068D00013E864680C74EC484A8C07A5A402F656C9
+:1068E000564D0CC5CC2DCA1D87949308BEF0639BF2
+:1068F00027EE81B55896306F2FA754FB7EF44DFCE0
+:106900008D05077229F1E7F0DA5E750191E95750BC
+:10691000D69F49D956BC6D3954294C8D52125E1AF6
+:10692000A209664F6B215891DD05007CFDDCD3C1C7
+:10693000FC0EE0F267DEB57F29C712A8F63A045EC6
+:10694000E979865A5AB42EDF49E7059B04506593CE
+:106950006FFC0D4C524867C861A5B69E555804237C
+:10696000BD08ACA978DD27F3FF7A9D56464BC412CB
+:10697000AAE5B8A43EDACF3FC057C90DABAC189614
+:1069800021A6870120FEF292A9FCADFF8D02EC3911
+:10699000F68A82492A25CCB126507E65A590B8ECAE
+:1069A000695E257F2CDB0BBB7E286C0F2FE75DDA41
+:1069B0007AACD63F98E103719BD5F428E6F8BA8CFF
+:1069C00036AE5B5164DCB87DC050A5F3B72AE565EF
+:1069D00008E7FF902BBDACBFD2C21ADC6810BB2BFE
+:1069E00081B283D5B68B7F273AFF47D10213BF19F7
+:1069F00047A0077DC8E9511198736CECFC1BFF326E
+:106A0000B5C110646A1A3D6ACA592F7148D98FAD51
+:106A100016DAE90CAE7205CDC1FEAB844D782907BC
+:106A2000B8A99D44BC779AF194140DFAA91E3A01B5
+:106A3000C6C7F92F2BCE46A9B1D7B7F98C8572C935
+:106A4000855CAEC413479644F7C529E6309C099A85
+:106A5000336576E5345006E9945B4E64F3BA6267B9
+:106A60007ACFE071584998080E4D065F9ACDE78DB0
+:106A70000923D2C117249770F9F3A411B340284316
+:106A800045E3D8D75D11FF2638B2683CA92111A88B
+:106A90009DCA3ECAA2FB259C3AC87D0E0A4B72CD08
+:106AA000A5E14E042E60B3454C2F4BFFA73C7C372D
+:106AB000F16F0A6C061F7433A5D1B3A0E6C2D4E30C
+:106AC000B01F14A711CC527FE60FEE1B27BEB35F99
+:106AD000A5A8D636298BA1EF9CBA515494C0325147
+:106AE000C8ED4240A9FE44303F3215FC8DCCF4E1A4
+:106AF0001AB988B5AD0254D66254D2C314B7E2CFE6
+:106B000050C0E1A01A3EF3A58AC22C5AE20B394EBE
+:106B1000B8CC9B563B05A6FF81CDE576C6CFB2D457
+:106B2000CD71C36FAC4D3F4545FBA4F81395BA87B3
+:106B300009733BD317462198A8C919A2E9D5C442C5
+:106B4000EC0130982DBDF77761D8DF0FF78B4D053D
+:106B5000C4E33CDADF58D0649898398682B01038A4
+:106B60001B8D59283A2206CD7955C874BE06490CAA
+:106B7000DD9A48E9DE59967F61256D7B5432A87E07
+:106B8000A34A500AD46806066DB9099B295A7FFFAB
+:106B90000487920B0C0C4B04CEC4CAE142C08A029B
+:106BA000E353144613399D1BAE3BD25BF71115F32B
+:106BB00089103F2C2908E983783ACCB550A2FAA86D
+:106BC000D3E36A292F0ADEA1C3D1DF95CBCE611AA8
+:106BD0004F12169E89CFE25A56C2E998C1EBD7E010
+:106BE00028798B46616FC308FF469758C553C8F78D
+:106BF0003F42A70598BC7279F54A8A738B10D4116D
+:106C000021A1928E23B20C797AAB3C541D34552DC0
+:106C1000F9533D5DB55AEDD9BAA28C9C1B661C6434
+:106C2000E3B342A0E1F4E89B89AB5140A658861E2D
+:106C30007D19DC585EAEAB24AA10FF61DDB1BF2B1D
+:106C4000C619B8B467EFADB9056FBAF84A89DFE382
+:106C500069E5A6F47CAB88873D75D154D2008024C9
+:106C6000BF5E01A348639F03DD2CA9C57F310419D2
+:106C700028A86F7F499B0DFBBF167080EF1EA8C828
+:106C800057D47D8EE7C9B3FE374F5B600D7BE9FBC0
+:106C90007EB4F481B46077E7EE6D18203199477DBA
+:106CA000C671CED6761E67D6BD74B961683393B10E
+:106CB000328AE6783AF324530B800EBBB7ECA25726
+:106CC000CC88420240E0E8BA481C029CBD6266CF14
+:106CD0003FC4091924D1913EB9E73CC498F2052A72
+:106CE00063B59B3B554B2BBFC9BC715B54144AF831
+:106CF000A89D94B38B0A4C67EB4A419FB1E718E615
+:106D000061BC8B8A12CCC96D484517114631414F81
+:106D10009E8641E3AD62B586DC7098F75A3F77A056
+:106D200067DE3DF30FE0990222D97A62F14DD5CFAB
+:106D300004B1BD4376009B90983D457D6D89A74683
+:106D4000C6066DD422BC37C02442BBD85E04A6C0A0
+:106D5000BE759B66FE8C6FCA83A3B1B13EF486C537
+:106D6000656E9C074802A7495BB13121648293722A
+:106D70009C6E2D94A63CD12F7F7F3CCBD5A493193C
+:106D8000CB6609C5F48B7853621F71C8F981C56A57
+:106D9000B31CA0CEC444D51E766D702606CB74A855
+:106DA000DF48CFA8B19C66BB45B063D0EBF8E1D318
+:106DB0008CC88B2436C7E5A4E8151078021D72CC68
+:106DC000F8AD2A5E8E35673EE738C2C8A640B8C91E
+:106DD0009DE216C0E70119DFF60684AEF634DAE567
+:106DE0006916D39F4EDC8F5FC085ADF84D89B9021F
+:106DF000A794D9700D1E6B7F6A149F3B79BDF75D18
+:106E0000E15009D47344658A817CEE4CFF7433AF42
+:106E1000D4DFF7B1A6783CC9B90BD4767C870BAC2C
+:106E20007764D43D3AB0D8F647E0BDD724B74F11C8
+:106E30000EBA6719D00383181B9BDC112A5BBDB9FE
+:106E40001D6FE81B049B94205A3ECDD4B4EBA32FB6
+:106E50009BF6B8FD03AB75712D33F217FEA1BEE6AC
+:106E600041CBB0E41E6BFE015B9F7B23244BC9A585
+:106E700099ABA1E287CB0833E598E650C960D4808E
+:106E8000BD0DC05AC5BCFD0FEB2DAEE6A5E24C0210
+:106E900083E26A7FC56513DB5044C1B91B4FDC7CBC
+:106EA000D2772F896D6FC76413EDDC3B51888ADF81
+:106EB000929D989877A7B761F1482ADE894CA8E699
+:106EC0008BF76B89E8594C0DD4B4891598651F0769
+:106ED0005AD4EA17201F8D85D05EF4265AA7ECE21B
+:106EE000575ED0BBA957B68FA1416ED20354919380
+:106EF000A67A82E3B0150ED1764FC970358ABD747B
+:106F00004A192AB4E6259C98633897A00E6E3B8BED
+:106F100085E9337832ABB637A7C9EF4B9B1146668C
+:106F200033BE013077A57CD790E83E1CF360109DFE
+:106F3000E8E431CDFEAB80E851CE82226F2F5E7146
+:106F4000587041ABC21C15B523FB76D5B3015F5217
+:106F5000A790C7CCA4BC60E0016F4BE7BA89B5022B
+:106F600084BEF7E1CCD48A4397B78EF8185ACBEE9B
+:106F7000DD1F9060944C1997CC29163F581C90E760
+:106F80003B07B41AE6BE9044BB73318CC9C0DF62C4
+:106F90003AF442365F805B294E92033460FFA520AD
+:106FA000322A5608CF5A6FAF94CAA737B32DD624CA
+:106FB000D75F27B9D3B6867AC6144555A6B7953399
+:106FC0006CCC1D4B6CCCA3EC36847EC635CF2AD35B
+:106FD0000A6D378DA782ECEBA230543F18A1075FF2
+:106FE000719868F19B7BEF2D8402056414EAFD0C17
+:106FF0003ACC9B2228A998170519C97C0617953FFA
+:10700000CB32997D26AE08104D4D3E60E4D7A1D21B
+:10701000AA47FAE8C6934039E42EC9D3B7C76E8DA4
+:10702000FD828B3DEBCF44C29BA6E59FADE5911958
+:107030008D97E41F3228DF555F8B6B6FE21A276A4A
+:10704000800BC06068ED6AD4471C77545B05C6BFEF
+:10705000CF155FCB3320313983727C005225304FFE
+:10706000470DD28D9541E2C5CAD8848AAE49B18E0A
+:10707000001A7652883B188E393D5DC4CC7EA12A19
+:107080003D4CC2BA9633781812ECBE4C657D8BFF2E
+:10709000D59A42BDC59F29F909926497C3482EB37A
+:1070A0004718313331496D8A98093FC6834CE02730
+:1070B000A84397EAD4F09EF92C22BEBB0AD3CD0494
+:1070C0005108A5BD0F9ACBB24C6A47BCE7AC7134EE
+:1070D000E8EBB6CFCCB58ECD25EE2F6980A00D8024
+:1070E000CA8E42F7EA0789A35D00BF1F59B79631E0
+:1070F000038451204E1A765B3A80817015F2BE826D
+:10710000A01C088F4FEB4552BA89EA59E993D56420
+:1071100024250A3C25BFE1E7E34C1FB1CA1F78359F
+:1071200023AC41531717970F2BE821725C4D578CF6
+:107130005BB17919FF01545CC26D60FC9FE2F354AE
+:10714000FC346B80B88E1D54025AA1803E55BA1291
+:10715000E36A86A440D5444B4F774E3C0D851D34E1
+:10716000073331C11A3DBA9C50E136260212C79C42
+:107170004347B1660AE23B20CD08EF463ADCDA2805
+:10718000D84553A3642B95597CA134B5744E6E2910
+:107190005538FD40014A722FC4C4F86C37823FCA8B
+:1071A000931DC355491DA2B3CF589C5F8BB687383A
+:1071B00082F6F29930476B9B0B884C95F8D14C6D59
+:1071C00066C26DFAA2AA5F649E767D91FCB5FAB69E
+:1071D00097015DE854E947927C955977D2A70A94C4
+:1071E0009FE66C83F16911AD6CF573441C566DB864
+:1071F0005F9E01BF5408ABD855248A42FC9936786B
+:107200007D5948A1BA6AD5BEEAAC624BBD0CF84EB6
+:10721000095848EB439165D7A88ACCC7C6ECC08112
+:107220008B6B34794A215A9B7B57CD34A6A3063900
+:10723000F4A6487762B7CDE84E927BB86104DFB41C
+:10724000B80CD6C7C4E7A8400FB945CAD31C2597C8
+:10725000A425E0F57AC55CE40F0D6290EF75840C0F
+:10726000F054010F6A6AC902881E628C6105B5502C
+:107270003DE51672B3A43B1C41CED9E9C236372195
+:10728000BF201C20AE49F4378FB616F68DB71B0D04
+:107290000E910888941EE4AEDCDDF5CADD0AA13447
+:1072A000585144FE721680CB0B1AE92DE9193B2E7A
+:1072B000BECC04683B2C38AAEB98E884BB933FDD36
+:1072C000E4E3A3B9542CA2089BF84646052568DEE2
+:1072D00014DAC9FDC7AFEFF45FDA23D08BE692630F
+:1072E0007F7F977E874770C38F42D68281D5DD2A04
+:1072F0002FCD67035CDDEB308F968391CD462BA3BA
+:1073000005E48E91BCEE89B3A2CEA528BCF3ABE711
+:107310006CC738B6F0337AF65FB7AB5B5C4EE341CF
+:10732000E8FFFE8815B1EFAC2A2744ADC174BDB3A8
+:10733000078BCA0C7044C0604945B0A6E135E4CE65
+:1073400057EEB74E4BF6BA71385CCEA07EB00C400B
+:1073500041F1548503D505AFA5B976F71E855D2AA1
+:10736000D0F518445DF593402F431752422B2F2B35
+:10737000B79DCDDD055FCF368B623CD4E3F0FF0FC8
+:1073800042FCBDA1F9DF5E50CAAB0D28580DF79540
+:107390006AA8255146F6274D944124E94D3A0258F2
+:1073A000A6C9B62B6FE476791236E9EC4A06074790
+:1073B000EBB443BF52373AAD7323C23D84C8F55492
+:1073C000B11F1F033E49568BE495556425DE832289
+:1073D0002D5E9FD9F3FD988CDF6A397E8671919C72
+:1073E0006134C5B72EE076FEEBF47242CC984D21A5
+:1073F0001A39BC10C1EB343034D4425C2A108E1ED2
+:10740000C1CC4C5D3659AB34BF88FF6C9A780B68A1
+:107410009E0A2E1A60CAA5116D7EC81036886DEDC1
+:10742000B9BFD1E3D6BA9247BB4624BAFD565E38FF
+:10743000F21BA2BB3691E554CC6F4F6BAF8879C479
+:107440004B84BCDAF5468F888C6E9801F7EA5FC2F0
+:1074500016D76C68C67ED0B81D7907626FCE70559E
+:10746000FCC2D344E4634AE33B60AF1F8141E98B34
+:1074700056F8E33E29EA007D8B323B216B00354014
+:107480009CC2BF7636EF1B7D39FDF5356B348B2BF7
+:10749000BB4601DB92AF333909CBD9F6AFE37F4965
+:1074A000E62578DB866C70DB08BA7490473FA9113B
+:1074B000E36EF47F04434741F019C4B6B8B3825475
+:1074C0004CEA88FE20A7DE9302A74BC1FB4763ED81
+:1074D00089F4C16754F9B37567F39A1FC006684011
+:1074E000F84626F7B19DFC026425F491AB40454B6C
+:1074F000B670EBD5CFAAE1DE396971D3C7FDF6D1FD
+:10750000DC7B0905102DC5A33CC846B9BCB283B3CA
+:10751000FFC4C8BDFE7EE389C6BF17C898F9585599
+:107520006A02AF25D9D74463FD8E267971ADF56027
+:10753000BB5067230B5D150EEA685EFCFDE30B7C18
+:107540008E059BCD25968E5BCD43A3464D779EDB66
+:107550003BA601BC22ED9C466985EA918291FE52D0
+:10756000731D93AC1DBBF0AC9E5CA64A5F10638D8F
+:107570002964B56F7DAD7DC47B637C886902799495
+:107580003F62BCAD9404D05CF866EE01C884DBFEBB
+:10759000FF9C150ADCA8811C067508C159E9052A5B
+:1075A000B71BDA461AC69BD2061E4790EF0B549DB6
+:1075B000FF902D0FB749B1BF2E58A6626A9EDD29F4
+:1075C0005EA1F4A9F1154280233C55D9A1EA7A6560
+:1075D000EE6280184011E7C68B125E70E46C0357B0
+:1075E000C59DB816C6823F3D041562D85B8AD8484F
+:1075F000CB02DFA2F7E51761BDF9C9D5D1071F4856
+:10760000D7F48DD64EA3CD7F2DC03F5CA8A44E10DD
+:10761000E0A04D10CFC59430513A0CF874501D4184
+:10762000F49E7A082B035359B7C8EEDC91B196ED5E
+:10763000007C37A745A3A7DA526168B9E175A52B8D
+:1076400084CEDDD94EEA04F0A5BACADB249D61469A
+:1076500062FFC107FA3538BCCCB55CB3EF635ECCD2
+:10766000BD7057018776CD658562652877DC428CD1
+:10767000C9CD1C644AB507FCBB2B452A14F3EDAEFB
+:10768000AC5C2079286C3437BCE250A347612BE115
+:107690001E23435F7BC5914FB2815B69F034FA6270
+:1076A0001DE96704C2440064FDC9E77BFC1CD55991
+:1076B00016A4EC9CCB64E55CF717E1A953BD1DF360
+:1076C000DB87AAF8B3E8B65841A0F600A3C459DD99
+:1076D000DCDF1E64FEE7899481B87D16044F489B69
+:1076E000B8B2040E8150919BF9A42FBD42AA1ADBB7
+:1076F000FC413F7B0532C85878A3CFA0151CBF883A
+:107700005B4CD60ED308591ECE409544D553FB6B27
+:107710004C9ED8A2965AD0B7B07475E1AD9CA7E53F
+:10772000F5A1C821FB628FCF11747D7F82070F2CDA
+:10773000DD5400027F319180A4A5C10766F76980FE
+:10774000644D80AFBB5A98D916D37ABCFCD557BFCD
+:107750004EE929556B6869ED3CD0CE2AB6A230209F
+:10776000A40378A5EB11E689366C8FB0F837C8D53D
+:10777000CC5B7E1E3E97E4C7309B5ADEDFBFB9D498
+:1077800027576107DB60D2DEC00E4016400ADE3E9E
+:10779000C8FFB108B3D730F1FBA791623642D609D2
+:1077A0007F357031E6FB008368DF96F4701F63500D
+:1077B0009F7E24DF455593670D5B632F4A12A21EFF
+:1077C000EB3EBD39D0470C40EBAC51469548D2BE9C
+:1077D0009B1D11AEE0527864545A83EBE9FF199671
+:1077E00076A9A301C55512CAED07F00E5B1FDF9EF7
+:1077F000D65860AAE19F0A3DB15176BCD05DD33224
+:107800008087A5DFF8461AE855AE62614B20C22B8F
+:10781000D533DC68C8FDB30FF5C4A8FD283C5A96E3
+:10782000F814FC2AADF64CB03B7165F3BDE00237AD
+:10783000AB7529460438312B8A03536012A3866A3C
+:107840003389A979CFCDC2C2340EF9A5944D602EEB
+:1078500002B600B2B7C6E173A7CDB5EA20DF48672C
+:107860009F4698F59901E61D1FBA0BF5568771E002
+:1078700028CFEC5318DB184CB68F50654AC22E81C6
+:107880002CF07D13751428C7304582EE60211A7CD8
+:107890002C878EB86DA38A5F1D0CFE87C9B261F874
+:1078A000A1A981F6AA521902C387843E0DB3851699
+:1078B000FC1355F2F2F47737E9E19907D37D625D65
+:1078C000A8015FE326F5500282EFEAFFF8A61AA0AE
+:1078D0002CC7EA7C93F235504F474BE5EA1D1F4B0E
+:1078E000838DA923F34911995A02E05C3BE97C4658
+:1078F000E41312E44B7F963D5CB33F1FF3B50DCA12
+:10790000A23DD8E93245639490CA6814308CE4A251
+:10791000BE82F44641358D4880C1611FD84352B2C2
+:10792000AC234C88B73466356F1A9416C8B31C5311
+:10793000E6068C4BBBAB8B5503E0D2743CAD91E6B5
+:10794000A24F75B26203642E0EEEE9F3E88387E777
+:107950003986A78344C28B8176343D1065897CA02B
+:107960009D26BC08426252A54D5CE36A4CE37B82D3
+:107970008EF54BA982294790980B43F279EC75322A
+:107980000B2DF05234E92293C31C158E70A9473D8C
+:10799000CCB0FFC48D3FB96308C6BEF6CD903CACF9
+:1079A00029A40E36CAEA9345B7C99156741FEDC192
+:1079B0002475A6F7C1C5A6C88AFA1BDA2275CC635E
+:1079C00013A5658C6088B02D3B84DE07B5E5DD34FA
+:1079D000718568D8A59E5C78B685DD1B0D4C911E1F
+:1079E000D6ED2FBF1C0F69A3B633E9C0CE2A1811FC
+:1079F000AA550A09446A24AAFEBC579BFA419C3244
+:107A0000FB1EDDC99864677927FA439EC9A66E40BC
+:107A1000998DC10CF2D33B6795F62ADB11F9DDE9AC
+:107A200038C65A473AC4E250CC3A95002AA5FE63BC
+:107A300031021CE470839586AEF356DAD0BB7EB279
+:107A4000294D7629CAB415204F6BE70A26B4DAA966
+:107A5000259C54616FC51A448902F2E877979432E5
+:107A6000C0C33083BA9FE404FFE4C50C75AC5F8AE1
+:107A70008EEA2C09FCE26E801181B21EDD58E75FB0
+:107A8000C346CB76A740844C43DDFA84F9CAD2388A
+:107A90002EC44B974572C7B600C2363B782CA8FC63
+:107AA000588B9B9C0C59EDACA21D3D2516AA7D3828
+:107AB0006F10734AB748D45ABD15C380E55D7A7A12
+:107AC00038D40FC45AC64086B6E5038B8092630251
+:107AD000C536BB1BDB4B8B2AF8083DE09C9D491942
+:107AE00074A43C36668C87F86AD007B6F940A8BE05
+:107AF0006D05CF9EDA8F49C91980E53E573A840C4F
+:107B00002076DB2F71A0BAAFDEF051B7A8605EA47B
+:107B1000E3DDAF8B04EC5E22E3FE7056FB1176EEE4
+:107B20003894980D0FECB2ED9469196F9384ACCD35
+:107B3000E56DF2333340C130B4DABC087478C192D9
+:107B4000A551B3DB7693CA769BE3D070AC554E3229
+:107B50007EAD330D1D78D543A1B4532C8F20ACBA24
+:107B60005FD8B1318CF35CA89760CE084652F4021E
+:107B700057339919DB359F613EFE98746B78F91B7A
+:107B8000553A39D4E1E83ECD895830432D24D0A769
+:107B90003F442112A328F23BC63DE60F4D5F7359C7
+:107BA0004F79B588D6FECFFF4FDFBEB2BA5EB0B513
+:107BB0007F0C8EDC820CF2840F0C3528D2133CFB38
+:107BC00042EA9DC676002EE2D24C7F2AC612173EAC
+:107BD0000C32D5D48770018A69D9AD7B1F3DACFDCD
+:107BE00091E424C04BB708757CB29EE950320E5622
+:107BF000A1D00A309D17B933F92195275E3D6B69F5
+:107C0000B9EC244DEAA268BCE0AE0657BAC905E655
+:107C100032654A46C9A2CA30353BB9B379A545A4F5
+:107C200017BFC911CF44325EF1A8C9E1B5CF0DDC51
+:107C300089FEB451B7E1BB7AD335C8DC6130081C8A
+:107C400079BA4CB2A861D41D6DA247CABFC49D5178
+:107C500001C7FB1389C377DB97558DEB66980EA29E
+:107C60003DAD2C7DEA6A47C1DA21BB4DC7DD1C9EC4
+:107C700075DCC13399F8DBF4881C5B28C45342EEF1
+:107C8000D66A9E681FC24618EE33C13DDB4039A359
+:107C90009DF5DF2BCFEF76AE66C26AE0853D90DAC8
+:107CA000FD971F5936CA613CD2AFFFD53E89811A74
+:107CB000372B43388C1CE10D7ACA00C0EB7F8EE273
+:107CC000624B0E73735F6BD94A2DD91F301BCE7F69
+:107CD0004A1F1204FB497CC3C6B4F41BABDFC7A424
+:107CE0006A3F7241469D411D616ED5EA5E733368FD
+:107CF00060C241E7F753037A69A674173D68AF5B2A
+:107D0000C5C2642AFE23021914A6498AC8620A451C
+:107D1000238352E66D9D51D2037DCEF2D3015010E4
+:107D200049A4CB2E8F957A7608914BDF014475815B
+:107D300019B78FCE1AE02907B51D81CA9A69A873B1
+:107D4000168101D2466CE44A7AD9BE420E24FB1E4B
+:107D5000911208A762C2ED2C17029E5069BD06DB86
+:107D6000332864F67385AE0AD483D3112ADDBFB5F8
+:107D70005F8219D98447510C51D679AAD91DFBB31A
+:107D8000AD1B6E5DF22064035AB2A7CF67A87DA336
+:107D9000349F595DC762A670B05B790E32A750134D
+:107DA000401FF1564D70BDCF33B168A34477248591
+:107DB0007EF1B3B89EFE08BB4EBEA3A73AAB14AA91
+:107DC000C1D609BE48E54685BD3A3CBDC5CD3B257B
+:107DD000110AD1B84653FB8ABAD6297E75F1495BA0
+:107DE000F7D1DF7CA8487EB8D67843266934483579
+:107DF0004F3E796A4583103DD4EAB385E335E635D5
+:107E0000AD37C9851AF19DEA0D299C74AA32E1EDBE
+:107E1000D0E042FDA1F488010ADF2E3F9EBF1F1C67
+:107E2000AA0EEE83DF6111DBF3A962A8881088280F
+:107E3000AD20220F591172FD6485BBC3AE66AA5FE7
+:107E4000A03EC640B830D571BC06AE34BFAC0F9E64
+:107E5000EDD4E8C327225120662F5D2DFFB8819510
+:107E6000D25A38AAB7C78EBEDAD1DC95A807BEBBF6
+:107E700048D90C4F7DE2A9D72556EFFC07E85848B2
+:107E800098EC113C26F673A6C51A4505A6E17BA021
+:107E900016D1D6414A94000B511FEF1FB2B423BB39
+:107EA0000924024FAEE13AC37CA40B16B45F771DE0
+:107EB000AB8AE2F6B91B97347FD68F99D71E4AA6B4
+:107EC000F61E5D41416E48A292BE51FC894006DA21
+:107ED000632335562AB637171719D5B6008C910883
+:107EE00014B08534A11DEF0F7DE80F7F48DC7C16B0
+:107EF00002120B9CF060A6F0C0D0D183C281DCEFEF
+:107F0000EA6538F4CDB13CB52F71573BA15A6C4AA4
+:107F10008AF255D30450FC550CFC923956334D74FB
+:107F200089C57C87C0E308B595E1A7ED9C4A262A60
+:107F3000337EA75D4AA6329E30D177F3EEF47BCE36
+:107F4000BC64371082A3A72180F7404C6718AE1F8E
+:107F5000AEDB70AF0B63F246C0C2AE21B108F78C46
+:107F60009BCD368E8D4F6205404DA0960F4E6A6DAB
+:107F700061FC5A54B81AAF018A61AC25ADBA08C089
+:107F8000515222181EC6C62F5154721638D52FC50D
+:107F9000096E039F56429B05749FB84D107B0AEDF6
+:107FA000B15F71136615EC2E0EAFF9D583A4ADD970
+:107FB000CE64B6838E024B3FD4E2AAAC0DEF92E5BD
+:107FC0005F3D6BDF6A4A1CAAA4E7A6EA9956D31F55
+:107FD0009EFED858860B7888AA21F6F96651C9BF4B
+:107FE0003175CE2D911EA4BB5867907EDB171D9076
+:107FF0006D1EC5FE9C0121FBF31785727C40EA448F
+:108000006BB25094C09F744978B1145C3D4AA6C9C4
+:10801000A6508A24F1DF6D253A732FAF6FBB7279BA
+:10802000ABDF3FF2664F64F4BA369D02444A8E26B7
+:108030003FCF757B206B23C655ACFAB32C8B4A4ED1
+:1080400011C657C8A8B016CFDCC517875EA04F2849
+:1080500037CCD9EB7BFB76366D97587FFF20A56038
+:10806000011D7A56399D323EE03AC428CE677B8D99
+:10807000F97FA15D13889FC2D913DD0141C225F8A4
+:10808000E60AD91AB7BF5A93A9434F2B571B542D51
+:10809000D1488E956DB622459AFFDBC4275D9711B6
+:1080A000AEA945E4A2C2205C6A8D90837DC7B289E7
+:1080B000B951C63111971DF7E23311CF976CFF7795
+:1080C000130C0E1C467BD5AE75F6CE5B98C1DD0A4F
+:1080D0003D50523468CB76D570E60A10939FDFC7C7
+:1080E000C0DCD4B288A98A27DBD4383199177DB493
+:1080F0006355867F36945A930FEE3613D183BBE7D0
+:108100000D131312C3CE14691BE9B1AEDAB211C15B
+:10811000446E5257D7CB066CD1DD9370659D7E9D22
+:10812000FE56A601574863B7F0A9D0661828E97D26
+:10813000C72B2B493D8BCFC51C8884C3A45CF0DCC6
+:10814000A297ECE4774CF08C25FD63D26F97802FDB
+:10815000A452C3E600ADE908917851905617FFF894
+:10816000B9AFD1EC59142AB5DAC63EE1292A7EC846
+:10817000AACF886F96569153652C207575C38124BC
+:10818000F4508F62421F8B56DFA1882D68CA7AD3C4
+:10819000D8826185C3477132D1CCCEB4AAAEBCD6E9
+:1081A0002BF6981380288922FBE19334F821287656
+:1081B000148EB5B4448DA2A86C09832258CAF48CDD
+:1081C000091638C83ADBD7FEEA625613B4FA01EC56
+:1081D00069BEC025F140247CB8F45C25847C05325E
+:1081E000560DCC024A638F2FA05FE9150625028A3F
+:1081F00010AF902EB2E5F63B2ADAD1DFB4B7AF115B
+:1082000052F7C0D66F1E7D19F6EC300958ED73FF9A
+:10821000F6E58AC215B57F6739E8B74BD4DCA7D33A
+:1082200074FFA82B80B17288C554088660ECE8867C
+:108230000E9AA2B90D3349FBD3730ECF4A580ED410
+:1082400066A29989B5AFC7DE7200EC72D6D98BA948
+:10825000FB859C517413C02AAC5223CFBAB10A8259
+:10826000AD17EC439A3A2898AF3B3AAB2E3C8AF7CD
+:108270004D5CAA6E6FDA445CE9D6225836E9E14ECD
+:1082800076DE8A652E44842EB6E27B344E187E79E3
+:108290007443C162ED4E9F48395AB1D9EA22BD8C70
+:1082A000B890047B5C8ABD753F89A49903BCBC0E61
+:1082B000D2DCB1509760521F484E395284DFDD2521
+:1082C000855774F84DBA75BD0D1C4D422E6834C0EB
+:1082D000CA0FECDF72EBA20E4FE571FE4BC1EA5004
+:1082E000CBF2D64D01E6D20AE2FC95BBA5D1635C88
+:1082F0001ABADDE47741426AEF71C67D2CA2444A86
+:10830000DC12ECB72F8BA8652B9EA47D5A3123FC81
+:10831000DEF37BB54C337A39D5AA02B15F40AABAF5
+:1083200082CAE7A6130BA48ACB680889C54BD6621C
+:108330004722B4F0B9D1BC050C2721E44B14B81C7A
+:10834000D01F3740B3FC9CB00F85554401B9188B42
+:10835000805EE6EC23DA505279B369A1DCEDDB1CD8
+:108360001F73D394B94342ECF29D6EE54BA085C9CF
+:10837000E32B7A12AEB86C6E921F5B1B719CDED041
+:10838000C82270246C97446F0A1B96543C5A45616E
+:1083900023EFF8021F55756E158363271ADB3748E4
+:1083A000A6FADFBDEB734FF86A480FC495B38CD6BD
+:1083B00000FE93E8753AE20B9923D2BC9A77E55B0D
+:1083C000AC3EAD8D01139D536363C5E133A7FF4DF3
+:1083D0006A12FF338656434BBA81E75B26AF8DFEA8
+:1083E00038F8BFB5036CEF74105967E5625B27BAC4
+:1083F0009BBFDFDB89B10C42148304A4CF6D37D758
+:10840000B4C4A69F998AE7766E1D727C537305CD1E
+:10841000AE4914BC88F5D59AB41AE39C4FA716ED63
+:10842000C93571B9223807E913481CE4724D5077F9
+:1084300099B857727F387C28F358730E502B7FEF12
+:10844000B294818B5B150DFE67D9FB2B60A295D68C
+:10845000F3661195CEB0B04A1CE60E9019AC567377
+:10846000AFFB673A559662711A90E189EFB3906954
+:10847000BA2FE9AE063B336A521C5E9BF8DCBC0D9A
+:10848000B7E8EF419F76648C8D36A45777BCEFDE5A
+:10849000DA29C989A170A6B98C61A7C23B74961B61
+:1084A000C6376769B3EB99CEDC844DC2938E0CD18D
+:1084B0000A5377B7658E54A8637A03B15FEB14A5AE
+:1084C0001B0842B7B9EE2059E034A7A06D0C23FD7C
+:1084D000508839582B704E77AB5518480908E8E496
+:1084E000EC20DC4DB77C3F752C4B23FF4127A07B54
+:1084F000FF67959AC0C2E62ED838569A4B1810A33B
+:10850000B4F9CF09BD96F642DAFB3DB1288A014F96
+:108510005D38362B0EC2C0A5BE2FEDE357657BEA52
+:10852000ED48B7AAA579B09AE9A463B95A267B8821
+:108530001A335CD7F5482CFF73ECC1BBCF31601107
+:108540009C11DB3F02486C8ECD5D527A7345D54558
+:1085500048B4448395426B36A05F60EF25A7A41C06
+:10856000F8F2A23BA50DAAF63EB320E14E02BF41B0
+:10857000725665877A1A37071C8D91BE169A6EBAA5
+:10858000A1D60D79B1A99DE1B3C11036E917BC9907
+:1085900005A7A8B51AA3B7BF1762E6A9DB38533001
+:1085A000DE03AB432472DE1B188365F6350F22A66B
+:1085B000A478E0E22895049DCB65E77F228803BD7F
+:1085C00023D7D60D5D2AAD7D5812AFA22382E08558
+:1085D000DB5B1169D87402E31DA02024478E0E19BD
+:1085E000EA4DAC137FF360269FE37FC6A5E9C45430
+:1085F0005CD9E1DE9C74762C9E4EA3A727D095878C
+:108600008025ABDD4260E8DDE8CC885A46AB539666
+:1086100036B6B9FD36D89532F154AF753E1EC40A50
+:10862000F855AC2248F3B1CDEC93CF95901BA0C088
+:108630008A50E459DF4B4B6D268DA63D94CAAED3CC
+:10864000F9133B1615C0E87733054AF08542B1AC03
+:1086500008ED8CB9786697CA584F53DE3C504028D5
+:1086600048354907A9659A3067BCE28562C03DCDAF
+:10867000355696E41955B3031D5E85AFA43BF0B99A
+:108680001C1D3AB61D6350D4C67364D273A75C54E4
+:10869000A2AE5C0FB02D2119EE470C5B835D132059
+:1086A000D1DFF4FD9E503B09420BEED1BFFCE8A4A4
+:1086B000223EEF53D3BFFBAF0533BA78B8D832A40C
+:1086C000E5D3321D035C10E66744B1A5B4014077E1
+:1086D00066AFFD72D46A2CD36079A7A428EC4C61F4
+:1086E000FB6B5D6C860BDF6E34183473436A73A7C3
+:1086F00000A68C0F55341A871D9CFFA5DBA759A730
+:108700009923CD754DCDFC8EE107F7EFB59C769A98
+:1087100079DC163020543450966CB18D207A9874E0
+:108720004D0C56904779FF55C3F2D69F01EF9F4BF2
+:1087300069EDF811232148D940C29381DC196230D8
+:10874000CC4A3A138CE43CFF578BCEE46CDEEBFC56
+:108750005EB136D96A9E8BB696B4206440CA3F0A91
+:108760003AEA976CF41EF431C37E787F9951C53292
+:10877000C140DFEA623880DE8B7E5EBF8CBA770450
+:10878000BBF6E5E5E89CB6F620D7748B714864F13A
+:10879000A4F269CBB901F7AE70CC08DBB09893D6E0
+:1087A0005D795CC56BBB23ABF29F346C26F5E48E20
+:1087B00066929F9B4BC92B9E7631E66FF1C3DB49D6
+:1087C000F818F41198A80C309A63F18EB6FE9BB994
+:1087D000DEEEEEA59BEC2D1AAF0C9A88DB355CBA69
+:1087E000E0659775F6770EBFCCBA24D9E3F2232A59
+:1087F000DBB428E2E8DAF8B0D9DCA906B3195EA93F
+:108800006C6D04E419584E2892BAD80B6D42B98D9C
+:10881000AD5916761EAEB39C7EBB5593152A020A3F
+:10882000709A10F3708163ECB59BE49C2BAB1E43F4
+:10883000DBDFF0A2375118AA7AAE44C3E438473AD6
+:10884000FF791F4C952495D43FAF904ACEA8DFB155
+:1088500029E8A0D6AED9F5ACB8854170AF36EBB9F2
+:10886000A1A82C7301817D2D73A26F7DA06D48A3FB
+:1088700055801E659355A192C8283F605667A3880E
+:108880007CEB9DCB01F3AE1104808624FC8918FE9D
+:1088900036414EA980D98335E65CEE82E2307B28F2
+:1088A000864899C49D694C0DA5FBF31CA0DE84F697
+:1088B0005AB52F828D2B1E50B6311FE79FB1F3BDE5
+:1088C00077B62B83924923E537ABC6F5DD0F677189
+:1088D0004EC9CA662A5514429100073E12E8613516
+:1088E0002AA78A7A847E684AB0E7BFFFFA2F4D50E4
+:1088F00042C240381E5259ED3E9BB3AB023019C103
+:108900002C5D1C3FE808839614E2C298E5D8C9E5BF
+:108910005B3FAC110262E234BD2903081E049C9047
+:108920007270960071637EEC1FFDDEB2B5369576EF
+:108930007C8172EF7358CEC45A90688FA97EE5C3CC
+:108940009F2C5C4296B01A38A948202EA9D29EA826
+:10895000CEFE1656747859EF2C7D154E5544B4EC66
+:108960002C268CCA3835E79E53C2E699DE07680F7D
+:108970004779369ABDD16340EDAEDDB763EA0E8C20
+:10898000EB0885C1B4891D9C2EB18D5AD5C1BF7429
+:108990003DE99B91CC3CA97218FBE1048E376EFA3D
+:1089A000F27442D712708C0F998E75311DFD3B8E7B
+:1089B0002B95A8E4D439B102FA2726490F1882D59D
+:1089C0006DBFBA9FF70CB41F0481AC7E8AF3CBEB6A
+:1089D000A053B38EE171BFBE6BA50C383F7C37E26C
+:1089E00021480E5DF499B62C234A9D9137CA238AFB
+:1089F00067613E69CE350CDD6F04E634A0F5D10227
+:108A00005B6880EE071BCB234476E79BD860B616E5
+:108A100002D1CA6011EDB87ECBADD39F77BC32E0F6
+:108A2000CDDF5220FCE64C82F444AC95B253BAB38D
+:108A300071D222F9CEE3AD604EBE524A02EF8027DA
+:108A4000D9BE1F38DE6030F4484EB7F337D3412D1E
+:108A500095D5D2CA129305A6B196471FA843915740
+:108A6000B07FA5471A99CFDCB617E06EC4CF4CB2E1
+:108A700012918EE0A011D1A3B434B7627473025C7A
+:108A800049A73F71523E4BDB597BFF18C7D77B7E0E
+:108A9000595A49B1BD27000E1C6ACF880DB404C7CE
+:108AA000B2F46E83CFE1201FFA4C43903B67D12094
+:108AB000A1F588D9FA6981E98309A546FCF73A3A14
+:108AC0001709A0E772DC94DDC999EBE022F815E400
+:108AD000F9E924D6EDF72127C77B21EED17B70146D
+:108AE000E956112F61B44514F7F9015E52F3A23033
+:108AF0001C2690FA27742DF39C20995EBAC07773D8
+:108B00003D8906C8DA3D28246DB64EDF3DD5377560
+:108B1000BCC0FFAE20395A46D026339997F356CDC4
+:108B2000797F0DE197AF1937FE05BE3272A39D3BE9
+:108B3000EC80BFE960CDCF89DD537D3443E1FF3662
+:108B4000E99A000B3241DB6921F19C6B93FD132004
+:108B5000A717D71CACCFF4D614EF5CA0EA70FECEFA
+:108B6000A80DAD47BB9772A303F8923AFA71E03DA6
+:108B7000B5BF49440F5DE395344307D2A7A854AB72
+:108B8000A2FFB4EAFEBAACA506259CEB8045C8F866
+:108B900050A63DB23588CA7E921B1C6DFBD725D0EE
+:108BA000D0AB2CB63F3688BD27F2A402D5D44F9463
+:108BB00022B4335CC20C6CB630FC48061066CC693B
+:108BC000D4D314DB0F32E8722F25A16290A72A9725
+:108BD000CE3DE3843A06274ECA314AC9F53390B1F7
+:108BE00058BB773E7F56D9F60EE5AEB0612B2E5FAF
+:108BF0000ABE0D8BB17136DA5BDD74DB42A550F233
+:108C0000DF755342BA8A1043517035C63542E3C509
+:108C1000517F7A09FC46DC21D855315F783083AE2C
+:108C2000D6453EB19930EB4F223C09C7D1FBE8074E
+:108C30003C6F850567AEA14398D0764CE397D1B2DF
+:108C4000351E86BF7F375A8288FDCB396DE08C9503
+:108C5000A054932975C50668AF8DFD281A79E5E003
+:108C6000DE1EEE4C57C0264794A4DA55E8BE8306B4
+:108C7000F909027FD4EA9502AC2B021B0D10ADDF7F
+:108C800063ADA70E4BAAC0032B15FA0DE9452C2E98
+:108C90002BE1438BF4E0464891ADCE22B28351EBF9
+:108CA000368F268EA1DACD39BE08BB71BB29F89C60
+:108CB0002D6BC395DF0487DE3D0D814AB86C6B5880
+:108CC0002E65D4BD89A8E152D7D91E4A50B4E866B2
+:108CD0003B1F82F9CF6D3416CF8BAE5E78E12E3D0F
+:108CE000FB39F71C5173CFA7846F0E683EE4C2CAEC
+:108CF0001CF745CEEC3405A75B6BE8B70F9F2DA999
+:108D0000A36A9265FC67AA5D905A33A933FF98BBAA
+:108D100035F68A5085D67DD30CB62A3FAC832A809F
+:108D20008154F845490625018D9CE96FB7300D3D0A
+:108D300009D529B62470091FEDFE4E5259708E5C7C
+:108D40007DC4177163BBF1EC3384794AB2AF6AE535
+:108D5000997246D3D97A2CDCFB61CFBAB2FDDC3CE8
+:108D600006AB9441AC710B34A61ECE7FCD3DEFB562
+:108D7000EA58AF1F5DCE72A94A633DFB07DE8597B7
+:108D8000ED14637CE973848AD37D4620C74C6BC89D
+:108D900021E7E9E715B978182CD177D2196E295F48
+:108DA00021F2358A362CDD786CB04670AC64B2B8EE
+:108DB000CFAD13D240B059CF4EE15E5666BD1A35E5
+:108DC0007DDC71413BEA42A651BD00818897DDD32D
+:108DD00046464124FA4CB25BFF6E2DC1117AC9F2AE
+:108DE000AE0310AC02622FE272D614F96DFB789ECE
+:108DF00076ED4FE2627A90C677373985925AFF4412
+:108E000018161C9D6E42C7B6A73D1FA0E729012E6C
+:108E1000B35C716D086643F1594333F504B09F8428
+:108E200023AEF0EBDA84A0F898789A0C5D5EEA2421
+:108E30000720C22802894B3A3C3D4BC73BD269D739
+:108E40007469FD203600D81EFF8C22441569F1D6C6
+:108E5000EBB8B434F85DCC291953BFAAF48F349C15
+:108E600032EB8C8C42130EF51BB169DF0E0C808B3C
+:108E7000A144CF1B2E8843C5A8FBF57961D2FA34F3
+:108E8000D34E1339EC679A1C5CC597851DEC1F3FC8
+:108E9000FA0B24C8754F9059456FEDDDA36481B579
+:108EA0009CE922AD8108E9736ED09BEDF571CD8808
+:108EB000E6B9F8E76E67BE7F223D292BF03AEE4314
+:108EC000507A74E7CF20D77676B317968DE1BBC67C
+:108ED000595484B90C703DCE6E7590FE78D15540D2
+:108EE0007702DD3509D04EA6D285870F63BFB1EA80
+:108EF0009584109A9FBFCF61D124A9C1D36B6B48D1
+:108F0000360E14B7261212C414705D281FF09DE0AF
+:108F100099549AD31FB02B082973E2488C6CD4B9AA
+:108F20003991AEFEC309ABC504EEF0FDD99D8DD0DD
+:108F3000A4CE87440189081F4539A9BFED2CF5AFA0
+:108F4000B611DA99D2BA8E299C8BA4B8033A9698B6
+:108F5000E20D70AD476478B8C1E68F2B5D44817532
+:108F6000B0068832425E4F712B19D61ADA6824A6F1
+:108F700044D4E15CF07437EAD6FE6F58BBADDB5ADF
+:108F800003E5389BC31C029D66F21B486EA591DF6A
+:108F900067753A6B3CCC778E1E3D62A3DDAE254AE9
+:108FA0005D3A557820AA65BCAA73782A6B7C4BEC95
+:108FB000B9B143DB84423B898A7CBCE7F63277EE69
+:108FC0004BC69308107D5A760F624430EA6B342FFB
+:108FD000626A3234721363DDA3CE539DB5AC46A6EC
+:108FE0000C45C25424FCAA882B430591D254D36E5D
+:108FF00077619C88B60B9D906ADA380E771E4A3FDF
+:1090000005E4E6E48ED3BE2DE3C8C9359833770571
+:1090100037429A662B270AE61C3E14F963FBB9FF18
+:1090200090DF4672C00701833BE0D9AF48D3758D0E
+:10903000B92CA634BE05504D47425AB5E24C9B129E
+:10904000F16F4D165708C3FB88871442F835A3A467
+:1090500095BA36970ED0EBA106A048720DE675932F
+:109060009D93D1B7F3C7EB8D94FD18A540278ECE05
+:109070001358216DFE081953F6295C8432B6F00BA3
+:1090800043504318DA627EC7B361AB2784D5C2C1AF
+:10909000B69210EC795DF148FF5ED492A360A23ADB
+:1090A0007B7B3A368F802B5D31FA81022154E08F31
+:1090B000C2BC79463B2B959B290C5777487A1F52A7
+:1090C000832B1A76B52180E46FAB646D0B8C782509
+:1090D000AD226144FEC85ED5C91D1EC5911B7A35FF
+:1090E0009E86AC73A6E004FD3A9E3507635622C601
+:1090F000F43483EBECCC02A51F416D19168E2AD0F7
+:1091000059CAC9F39C26F0831EED6A98EAB1823DE4
+:1091100054815246D21C22A139A0EF3D22FEFA9280
+:10912000D71572520E2A478A4CFCABB358E950ABA4
+:10913000B149ED5BBCDC57C96CA0FE3C1AB0664D72
+:109140000A2495286A642A5F2AD7A26391D3BAC2F7
+:1091500085B5CD7F0C2674D4E16A4CFFDF24A8BD11
+:109160006522748C15EDA9E38F431C938AF67E8EDD
+:10917000A584A9BB75D523B8FE9510C0E9B5BA93EF
+:1091800099F75FC4F1EA886F1568CE0DA4F64D9784
+:10919000731456BA9A72FA3917DE9F423CB9397580
+:1091A00068204D2C20F0C9E18F2DBABA2C244EFD39
+:1091B0005FE299F8FB098F01B218DCBA5896C71B19
+:1091C00049C398DCA301AF323F006F812167FCE304
+:1091D0009190895911D528D95631FBEB0021CF80C8
+:1091E000DCFC007FDBFC29594259830ED4A3D6F264
+:1091F0002B5987ADF3229D7F90621767C1806D1D4B
+:10920000FFCC608482F5B33F98087CDFEECA7D8591
+:10921000C3F2B96FE98ED1584A51E78943A87A8BD6
+:109220000230F1920F78406CF964E3E45317D42FC5
+:1092300087C1CF811F280FD1C9CD056F39CE0CDA78
+:10924000F134386E9D5DACFB4F58F8B0DBA3D43BD6
+:10925000B5C9771530F0BC5A41A157238D60E2A9FA
+:10926000838CC4F2716ABE72E29F59089D4B2D38FF
+:1092700048623E567B3951F4F12F4F7EC38ADAECB7
+:10928000B9A268CD0793ECE5D1C3FEAA4498EBF3ED
+:109290003D8D78234446F48E3EF821EF3DE7451995
+:1092A000B2CA837A913893E6487120EC62E7F9B943
+:1092B00057D7D298EDA1966B30546CDF85CFD7CDC0
+:1092C00015BE0DFFB86CB2B647FB6305F00F49330E
+:1092D0002BA1A2AE108CF89C71B59EC81872F9989B
+:1092E000BF364F01CFBA55FE243ABF1FF01AF29095
+:1092F000BCBEB569C30B56C926B76EDEA663DA8D50
+:10930000D29C0F37544464DBE70D55988B4C3FC813
+:10931000D565B6C189ABE509A0FF7DC39180132F48
+:1093200048F327510EE9D06FFE04ED52FA78C7E0FA
+:10933000E60FC9FB6D7FAA76276B7CB2991F71BBC4
+:1093400001ECBDB6B4CD0BED62395BB1FCB920992F
+:109350007A57A6031A007E01752875607B047C9DF0
+:109360005418F095692E4B31E8B5FA69D68E52C57E
+:1093700040349A400754DEB019DC68E301567B752F
+:10938000375B97888EE81E47603A3940E3A57171D4
+:1093900043FC5B468350296A26E12449F35332CAD1
+:1093A000AF9EFB5F34AA14191A4CFA8B591C07277D
+:1093B0004D89B038797D5544DFFF4FE58534CF05C1
+:1093C0002691F8B01E4834D8D5F44B92CF46C472DB
+:1093D000E7177D8725E781E5659A1CACC7658AC8D4
+:1093E000A03C75E3F6E4324341D8153EC8E5EF16DC
+:1093F000FA51794B16A2642016476E33F09D0FF395
+:10940000B6738791AAF9704F2072C535797E9F9601
+:1094100050F93AB450B48E6F4BD40BE90AF1437E45
+:1094200061ED18C38EDDFC8624F1EC806826E8DA55
+:1094300093EADE0F18C4875CBF9C2CDC7FD32ABD67
+:10944000CEDB5D569A9ECDB11CC68083097F8D3ED2
+:109450001B6C8990818049C6CD3D69EEF55BC1A149
+:10946000BAB02C4727834684B475F801AE48464904
+:10947000DB6709910FD814CA076398B1CC8D6AA62F
+:1094800040D1EF009E09EDD28B593E49536C795380
+:1094900048C3CF17E60D7DB6691BF67560412C46B3
+:1094A000DE5C0DD046ADE07F8F0C1A389A08BD47C0
+:1094B000A37258E5A36DB7A110D5A065B0FBF3D09A
+:1094C000DEBC7D059FDF27EA4AF6C92622020FEDA2
+:1094D0003CF5525A1EFD257FA36822C0FE42FFAD17
+:1094E0005A22F945AAAD8A6399B7A1BD8770312385
+:1094F0000DA998696B2B063E606DC00A22CC283AF4
+:10950000C64EAE0FFB3050269A9497B2F36DD1F051
+:109510007E20A93A692FF820401131C2FEBE914841
+:1095200071DA23245487A5C5C4BE4AD4929905E0B4
+:10953000E20D0F5874E11B690291232E2C94FEEB6F
+:10954000375C32A2510CB89EC06E4B7A5CEFA70418
+:10955000300D6EB7C74D3B5BA1E768082B88B86A32
+:1095600055FF01EFE513E23905D982D858D91AFD24
+:1095700057419EEFB5550B200F44C283DA27D8CB55
+:1095800079031E469A787FEF8A55A06BBBBDDF5CDE
+:109590008DFAE36CD614F4F57409750D4B53928F64
+:1095A000F0D2E7A2BF101D93708186022F53C636FA
+:1095B0006765B71100792652FBBC25A5650F0C3FE6
+:1095C000192DB770EB8B58C903AAA2E3476A9F19FC
+:1095D00022A134D69F5512C0A7795652A3F5A6E70B
+:1095E000B3A733C9CDF617DCC8D5C07AE7F9151C87
+:1095F0009EB0A1A957128FAE50424BF4668CF34F28
+:109600004F502B9223A25CDA435691768F00C70D00
+:109610009A00E999820EB1679238973698D2229BC8
+:10962000DE0A1DC734FC80E97599B2D42132E4C248
+:10963000F94BE3E49D9D8A959E8A4D07E089E517E5
+:10964000FB3176E23027BE65AEA9419D0751EF8917
+:109650006EA939684559CC6620A3F791D2A6A00C13
+:109660002C0F1ECE7D82AE3B9BFBEAAF3FDC942EDF
+:1096700015EE16C5DAEA8FB97FE98CD14393C77925
+:1096800086304810DA7959AD6FF4F34DF0F5B21128
+:10969000B9850B1257F91A6BEB6520B7C017C06775
+:1096A000A0EE00981D6ED78B84D5E5125ACC970991
+:1096B000ABEFCF50895CF992D5B8251F45F75274AE
+:1096C00091302AA96AA8992385752BEBCBDC8FC42E
+:1096D000E448974D88BEDDFC55F0F7B2191BA7B2E0
+:1096E000D86AE09A504D8195266E8DAF8E9515956E
+:1096F0002C77AFFAE3C41EE254ABED1F6600EA8795
+:10970000A33891499E9823A442A81655EAF24356DD
+:10971000962C0B969A26146E08A94823D95C6BE206
+:109720000C726F05E129D8CACFF562C857DF2491C2
+:1097300022B53ED05B5488E0370AF791F6F53E62D9
+:109740006C237084513FBEB8DEE3DFE03EB93CD607
+:109750005E03BF8D55998EE58F1C0FFEB9E7BAA247
+:10976000B26CB151DBEA98DAE7BBB572A84769AAD7
+:10977000D172900E10242B3C585EC7BB62028AC97E
+:1097800027BB4D206A06B71ED33B6D31FD26FC6C0E
+:10979000E22F032B2D22DAF64E95FF1FBD4D236FCE
+:1097A00025DA7D57A63612D045EF17235F06E84528
+:1097B00019403B02A5C3A9536CAD49FCA2FFC4A04C
+:1097C0009315443530511F78AD8096409B9BBD1456
+:1097D000FA297C1520B98F419AAAD827FE22921D1A
+:1097E0007F4FCC9FF9118ED58BDA340F470E444949
+:1097F000FB076B011F39D56A44610F274BC53E0E2D
+:109800006C6E7CF86FE60267303EBB8F3CB31FB2D4
+:109810003DC4111D84EA452CB557519F24E4DFB4A3
+:10982000F6DA06FDE945EAAF809FB9C916646C0A0D
+:10983000C5A13FF40D431D623BFCF55B97AE62C1D1
+:10984000CA4C9EE8E4F270ED174A8285239C1B2CDB
+:109850006DA411B7FDAB9C14CD09328D45920B015F
+:109860005EE185CD07CC2D8EBDEB4B2E1E8490691D
+:10987000735D9B4AA00629EFEB81D90CA168B493D4
+:109880004C4F2972CE1E21D6CF472F4A1B3558CFB9
+:1098900010FB42FD17E7BCE46DE0DCAF8A032E3A13
+:1098A000190E80E8CCC4FF311C6F7B20322E72A4CD
+:1098B0007C3D5019FBAB9337507777B04F1A5FFA66
+:1098C000306F578295824AA68733896705FEA9B80B
+:1098D000EF30FBEFBC3D131EEC887869F4A6C88816
+:1098E000D581ECE236E88A4F8508B78E5CF8078EA2
+:1098F000C301880C130435CC3AD304008111DDE395
+:109900007303C26AC8D8251BD10359AD581353B786
+:10991000322607B86103ADA6F137C8A4454B05AFA1
+:109920003C3DC7AF8AA573423EEB6E14FA227F9B83
+:109930002A14B375668B4D8D3D929357D787E1CF2F
+:109940003270B5EF72A7AE078F9EE149AFBA054AF4
+:10995000BCE20018BA58ABEAE1F09215AB7E6EFF9C
+:1099600038E033544C4D48DFD628CFA51495215A02
+:10997000F0155CA795271FE36009775EE2C7BDE895
+:109980008DF0079CEDC2B59621AF21BF6D4E535BA4
+:10999000AA0F1D844FC360624259AC4042E9F26F86
+:1099A00052A7108BF2ED011C28AA4AAF4A25527E1D
+:1099B000584CF7D9C477E95CB02B6FF9A62270B583
+:1099C000911A3B173CDB77DBD04BADB473A8B0D317
+:1099D000933A987D841CEA32FB87F2D444040488CD
+:1099E00063B912BC794093AA27FC8DE25E2CD8693A
+:1099F000DE660DFFC3830C8CA1CE4933E2DCAA598D
+:109A00009C0BC2299C0E367E2F59F3C474AEFDC741
+:109A1000A1836413C81DF89590081B54C12B592FBE
+:109A2000F1C3AB3B09C6715E111828DC4DA3AA50E7
+:109A3000503879A42516BF4565C910B1071F472EB8
+:109A400062A63603BE39A74C10F70CFF32FF164F43
+:109A500036F016AD8F6B46C947B36A624B502D394D
+:109A60009C6412140F9980FA2177AB90F7D29F96DD
+:109A7000903EFD8F89E86BF0F5AFF655F671B8E0D2
+:109A80001E918C504C79E17D5EE8FB6AAFEFCBAD67
+:109A90002CD584F2289D86E294DB395D2535F019BA
+:109AA00040D0B317A2915E7226D655BC349E2F7754
+:109AB0003C988746A7FC6A3767DFA96CFED46D65C2
+:109AC0001B0D7B6DEDF1AFF6D5EC5B3C6089A01B07
+:109AD000F16EF45DED1F7C7D294309C4B63F90B95A
+:109AE000AA720AC8425F971469883C00A7EF01B0C8
+:109AF00020565482EB41F96A8ACF7BDF52093ABB88
+:109B00005E42889C05779BD7088DDCA44D0077C307
+:109B1000A1B3C929D899A8E3AA4559507B9786A132
+:109B2000DD6E3E595FCE9B92AC21DF41CE7482093F
+:109B300005A7F365D1F2DF7C324675BEDF3AFA6CD9
+:109B400035B7FE8612208722280589B05EA7D18B03
+:109B5000F295B3A1AC69D456AA17287EAA170D882E
+:109B6000133F73B870DE63A8E4A293BD01CA0187F6
+:109B70000E8D91599D987C5A0E9612F6A8ADFC63F5
+:109B8000A404037AB378B80E4AD63FD3E53EA89D25
+:109B9000BF48911CF9D3457BC08B5F757EC50373AD
+:109BA0004D11A771D6B52CBA211DE78A347605066A
+:109BB00090A5672C8F09533C438131500C3E2432D1
+:109BC000A8143E42F39102DD8C7870185BAF218AB5
+:109BD00060CB5F31F31E2F76218FA17EE45CF70E00
+:109BE0002EF7603AB8A1EC92B9D3B182152183B3B4
+:109BF000E25F6E26C05A31A04329D3AB9A716AB393
+:109C00000206A7D824BB541289DF415ABD5440E153
+:109C100019828BCACAAC444DCF5DA4248E0AC18878
+:109C2000F40EC5BC9B31BD9EC5112F99FB091B0FBE
+:109C30008996878AC7EE8ECCED43A820AF3D7298F7
+:109C400014824A8A7BF3AC635543ABA9B713AAD5F8
+:109C5000E7E47C5A4F7B30DC8917979C5846A7DA9B
+:109C6000B463ED577E0BA48789D2FB7DED7DADAF4C
+:109C7000290C9F2E852D359E5DF9830AAC2AA6906E
+:109C80003595939D0DA40D6F4161E1BA0FE986C929
+:109C90008ECBB377100387ECE3733D5257BBD3B839
+:109CA000C773447451BB10C4333495BB34F3F3050C
+:109CB000193A7085F418926CDD9738C7EC3FB09D67
+:109CC0009FE2E10588721F9214341F074E8A7F714C
+:109CD000DFC880B51129D8BEB55B376747C297BDCD
+:109CE00095CA7EEF78921A827141793C554367524A
+:109CF000D0D61284C2327A4DE7035F9424B29480A6
+:109D00008A05589565E357976DA5A8FEFD8245C85D
+:109D1000DAE5FDCB6DD2F116DBF8EC4EE01198C818
+:109D200084428A041606B1568832D316F5327C1561
+:109D3000011B2C25DBB3006BA54AA11AA4B626C4CF
+:109D40007AE3E63F36CBAFB0C94BB32F621128653B
+:109D500024DB61B590084C52EEF6441F56B0D8A5EE
+:109D60006C8516C35B4903B7E81E035C816F5C47D3
+:109D700014CE03D28EE8739F2DF5286B97A13ED7A2
+:109D8000F3E7B93F3D3F8721003132C2B161305C1A
+:109D90008CF2E6491E42ED3EE9AC218B70ED555444
+:109DA000B286B10D8AC9EA97721B54B15CEFAD9EC1
+:109DB000B2202EF33EA8ADB6782A659CF32E384526
+:109DC0006FC76C18ABB238C594AB98AA2ABC4C9636
+:109DD000C3DCA1DF0617DFCF0AF1E685DF7AAF7FAC
+:109DE000998CE378B2B48D4D95FED74462D33A1F77
+:109DF00012794BE830DBB8079A12E64FB04925D804
+:109E0000F310B0D50FB91F865E9DABC084876D0F70
+:109E1000F5301C516A558DF84B51F46F1D2EB30A65
+:109E2000AB7048139B56C1D623DFED7D52AC6D3924
+:109E300089B2B4D8CEDE1510A9F44958EC081CB686
+:109E40003915287B5AB8BBDBAA620F1FACAADBF41A
+:109E50007EEB4CEC2537E1105D9D174D8160241B96
+:109E6000B87905D66F13066F0731FD52A54BEF6227
+:109E70003A70D94CBB84DF08E1B43066BBD7C85018
+:109E80002BA7FCFC945907943127C95CC6CECA4B5A
+:109E900042988FDC46F788850DAFABE2DFC2E0CF9A
+:109EA0007C552C0E067AF50EA9FEFBE9BFA14BC727
+:109EB000C8B1F2096B6CEE3537100AAA1E08EE3FE6
+:109EC000D9056A4B21EDBD0170E2EC879007211C9A
+:109ED00008224EBADE8CE331A8CE70D131E8DCC75F
+:109EE000A3BB7C0CCEA1F735489E2CB23016EC04F7
+:109EF0001D5FED4EA6926CA25026983D1D5BD55875
+:109F0000E731745993927972A99E8357D6C7D23A92
+:109F1000C2B0B83E9F1F2E6E5E27DA0814F7E7C561
+:109F2000531B9B282411763AC327D5FFE4540933E9
+:109F3000BD95819EADED0E28460F820CDD57326037
+:109F40008AFFA47F83744035B90098E1A1E6680ACE
+:109F5000284FF7765A538DDFFCABB9CDC86E90A46D
+:109F600007F12422A594E0C5720901D04FF98D9E16
+:109F70003F6B4F7A29463940EB12462B9D14C44360
+:109F8000ECF05076AE44C4D3A0602BA4F043516CE7
+:109F90004F0A506A11B673404871494EA653E3AC5C
+:109FA00046707F276C89122FFDDFF2B1EE61DD6014
+:109FB000AC1A70FB0657C34A3D2FD220C6E1A43E1F
+:109FC000E8762E8B4ABF696DCF3FAC24ACC5FC7DD3
+:109FD000B31CF74D6E7408F0EA40BAE81ADF721746
+:109FE00002719B2B646A2961592CB8A7B3EA94CCFF
+:109FF000B565A1A5945A4EDFA5C86328D402F31114
+:10A000008D019B40DC0CB94B60AE5423C7B357FAAB
+:10A01000B29CF002FA9D9FF260744F49AAAF5EECC9
+:10A0200089E9867CD4BDBB485F647EFCCD946C78A6
+:10A0300054DC954D97D22ABD0AE504AC623DA8BA1E
+:10A040007CCCF51D846B5A18394621DF05E20BE301
+:10A05000ADD19E0E13A8C671C550C8C19DFD328EEC
+:10A060000AE77949000524A9A5A3669DD1734A2A68
+:10A07000FD104A0DD68A468A0D3FAB6FABFBBC0480
+:10A0800081B633337679514E65FF91F84CAE7FDD62
+:10A090000ADE94C7C78875E4BE24E5438E014608EE
+:10A0A000A497782AA60D9798806745CE3A82E9242E
+:10A0B0002C8943DE9D9F5C927A9CEBD6479DD564AC
+:10A0C000D24DCBFF0089E007FCD247BC38ACFA1771
+:10A0D0008A4BA3BF1CE1AC8ED9ED4EB72F1E1E9349
+:10A0E000EA0E1345560C623E49DEB7745F170AC884
+:10A0F000D9DCFF204A50651EF63D642747E17318FE
+:10A100000DD5229A8AD1D93DF09645B76503CD3158
+:10A110002E86459D4743ED082891B232467136D9C7
+:10A12000AD6170B6D18210593466D7DBE1F01213FD
+:10A1300068E039BBEA35CD39917D6288703FF39F85
+:10A14000EF5EE54A9570275BCF143C00BCB3E3C0DB
+:10A1500067B552E778FD9F0B2D3C633780EB805F3E
+:10A160008480164E8DA4DAB191B4BDB4C57075D19A
+:10A17000A16D03ADF5A27EB6CAA48E741DBF682D75
+:10A1800083529144A0BF437A33B71CEAADA566144D
+:10A190005C8D23F05DB865B3CD3BBA8A0B697E0256
+:10A1A0007F37791287BDBE0E14F4737E20908A0427
+:10A1B000F20BF90EEA62821CB2DB39F7B6E15B7989
+:10A1C000FC0BB668CF26BD042811358CBB72AF1AC4
+:10A1D00018C457736FFDD9C98A5A13D2CA7C403448
+:10A1E000BF4C486EE323E7B18AA77E419411D16E3C
+:10A1F000FA132F379EB8AD23E9CF291907744550BC
+:10A2000088F511819348292CBBCFDEB5B95A0A4A8B
+:10A210001766D0A87CF03D0653A15CCA606453E386
+:10A22000984202F1FF6E3576E2D5EE6A4E1667F07F
+:10A2300004CD79417F04DDDC9FA3DA16F57BC77D71
+:10A24000D0B2D96015D06814F8ACD05E5E374D1529
+:10A250001A71AF6F7A2A4321F242588164AFD21249
+:10A26000EBC39B6EEAE23D4E7B7D4E18A8E217726F
+:10A270006044DD0CF1F5F04C8AFEDE5932A0A98E67
+:10A280002CE5E8E6F7C9E218F4C2112806C70D8BE1
+:10A2900023499DF5551B2D4C3AC171678334D9EE86
+:10A2A000002D33758B69A115A9F0D1DB0185D7B6D7
+:10A2B0004629C959832FD3B155A3DD188580590389
+:10A2C000307340F849F47A3362B0EF2CB9786C2ED1
+:10A2D0000BE3FA635CB0320A2AB16B1B8652E2F5DB
+:10A2E000F82747DCC0B9C698FD3C61DC177BF4C198
+:10A2F000CB1E46BBA8599EAC4421ADFA27A9DE8CE3
+:10A300009ACB07162B68787ADE112902F25B4F7020
+:10A31000CB6AA4B010306B4336152C936DF34EE02E
+:10A3200016C99768403C763441445C75FE62CB8424
+:10A33000BFF4B26AF4ADF1012C4CDBA12E3B24FD3D
+:10A34000D0C691916D4BD6C779D0AED6F226CD4608
+:10A35000EF3253BB6205289201D1055A17B44489E4
+:10A3600070F469A96F759B36F38346077ADA786BC8
+:10A37000C8BCECE5F87A23F31D40E3EA4175D39EAF
+:10A38000EF5EFD7A6D9AF894B6E500E52386B9A7ED
+:10A390003EFE087AC9E7BC3F2D218547553322F0A0
+:10A3A00083204BB60DD51DBA0CED847FCED8A73BCC
+:10A3B0009E7A625EF2FA8060152F9E4C3C2E59B355
+:10A3C0000BB85D8ECF9EB934821451ADFC6D542410
+:10A3D0005AE5D6B484787148AC32DEF40D04705975
+:10A3E00018A571BAA9BBB636A060CFC5161897706C
+:10A3F0004EA231FFFCA22FBF37E2DD1B3186B27BBC
+:10A40000F9C92D1769D120173DC721F4125DDE0966
+:10A410003737E39FAA1FD1AFBBED9DD2C1FB9E8210
+:10A42000CA6F41EE6AE9962295558242FE04C31531
+:10A43000F0F1CC4ADA2D613C3AE7A76D5B45A59A6D
+:10A440008E7047E9B62B27F8B31F3FB5847DF4D74C
+:10A4500010BA06E8F020258789233CE20451A604BF
+:10A46000DDBA1805F517B2221C757C8E9035DE9981
+:10A4700036D55B22FE074AFAF6C75F0AE5FCA4C39D
+:10A48000298C2ECEAD04C3F75E4B2EFC607120D21A
+:10A490002D690FE3C3B7ED28DC9C6C652C249DEC83
+:10A4A000E7F2D2AA1F0D7697EE8AD4F9FA2664E66F
+:10A4B000AD263AF4C7E65C0702F963DDF761BE92A8
+:10A4C000DF94A6707359B4531C19E891E28BEFE93D
+:10A4D000E6449D0CB2453D9E28CDF4E4EFDA6D676D
+:10A4E000F33786EFEB496A307D7628EECFD1E9501D
+:10A4F000AB8FF0BD927904B885044187D0DD1B2174
+:10A500002B432464080157FFC4823B9DAC8F9708FE
+:10A51000496BFE7E758BDCD34D476607DF00A6B125
+:10A520008605B2A5F3337DC7985357B615CD53B6FC
+:10A5300066AC220DB4714CD198CFFABC64EA3117E5
+:10A5400039E01BA93CD7981D94956AD7A66B013FAB
+:10A550002DBCE65199EFC511E46B40417A898B51CE
+:10A56000543532455D405F97CBB1A30BF87D3BE09E
+:10A57000CE9362B9E07863E8D2BC66E7D8378E7ACA
+:10A580009ECD9EA6CB683BE15D4DE8D59BD1A7F261
+:10A59000A6D0172CD0E27CBC6628B3DD8C02413DEE
+:10A5A0006EC65EDAD885B4C933EF24C9461EB12B16
+:10A5B00010165E8FDA4B74A84ECA48DBD3FAE9BE98
+:10A5C0001B015A15A42AF1273D73AA13E6B0420BCA
+:10A5D000943E87460E0B66282D790F56969DB60D34
+:10A5E000BAF456CA6960255F1A877E5649DDFB9723
+:10A5F00022F90C79EABEE86461BEFCC58B16E6342C
+:10A60000C872B631C4AE900F402BFBDE3CA741B4FC
+:10A61000F61AF14C1439821D7B0255BBF6E6042470
+:10A62000FFCCCCBBA9595CB1016443B70C7BBBE543
+:10A63000D38D8D0DD518A04EDB3BB9C90BEF432947
+:10A64000D4031138FFC1C51DE65D39008FA83EC394
+:10A65000FC3604F5EE33600BCCF1BE7EDBF85F31E7
+:10A66000D1737BC48F343AED74F5A11AE95E483694
+:10A670007868312CF2E4A8830378CF037FD6CA60D0
+:10A68000E79C15556A451B1EA9DCF6B65660EB8C97
+:10A69000142BE339BE3A44A54C84FB2A37B453C982
+:10A6A000DE388D8834F8E37AFAEBBFAA3F3DE888BC
+:10A6B000512859235210473CB8F7653201C3FE199F
+:10A6C000D76A2A9DCCC550D51A4651DEB8AF7A114B
+:10A6D00068E295727C8227C4C4537212F4FAA90FFF
+:10A6E00070927CD789791B43A4E4CA6A94702B22A8
+:10A6F0007426721F59F87AD987F6CD9655D005CAB7
+:10A70000811C1EBD3BD7B0A86F236608137DDED326
+:10A7100062C4FB61971F51933BC21DE46D2D91678D
+:10A72000691A120B61EDEB60341A28060628F08EC8
+:10A730009D84BC4A88517634F069677598823FBE23
+:10A740008C721C5400905CE3A0923B47A88FA686B5
+:10A7500050BD61436B4C153EFBCE2F9C2E064D5ECB
+:10A76000A8945786414BABA06CB2F28635339AF66B
+:10A77000D037491B688ADD90322C0A1A3BB51A384B
+:10A7800069002B72F33A2C6E65A44E3A4DC8370817
+:10A790004BF81AFB01624C0E4F1F84C5F3A0C96B26
+:10A7A000E677B745D139292893FA2417D53773812D
+:10A7B000B26EB3303A27B104BFAC344306C075E083
+:10A7C00015C6F2C03189AC7781C8912C536080E006
+:10A7D000EEF530344F983209E081334B6AEFE552A1
+:10A7E00096B79D1285C1060051F1ABEDEC900F2B91
+:10A7F000C9AB8D8E0B4FC8D6E13D6C937B33532C88
+:10A800002EA8BB69F170D91685AE6CD838BF3C99BB
+:10A810007A6197B655AEA500AE91361A70917DEC6F
+:10A8200039D24C73FFE055B4391E1E1C02D72D855A
+:10A830002E17A5578B0B89493C8C450D2C05F1AD86
+:10A84000C1919C79C85D31B63EB5296571650F002F
+:10A850004F26460F60F7677C45F96A5D83E394EA0B
+:10A860000A7C5B05996FD4A20E91F80D831CA01190
+:10A8700081314B0D151F29F259E01C59EDBBD7D280
+:10A88000C66CF5B7A6DE20094CF0E5375D5BFF75B9
+:10A890006F370764A7FE9A6F0893C062768088C2FC
+:10A8A000C789114BAC9B77BA5ECDF84FF6F3C65211
+:10A8B000FC3F5B5FDBB345290EABCA19DFFEF51A1F
+:10A8C000B888C969370C615CE669CDE039F4F42ECB
+:10A8D0002D0314A198F6E7F3EB17FDD4F9BE554309
+:10A8E000E9BD0ED4BFE78AFE87695751CCB2EE06A8
+:10A8F000B91A76685442694ACCB72830C7D410BF19
+:10A9000029F0EEEA3DB7BDCE64DBCE671290471961
+:10A910003582AC4922660E8BB5652A64EC4A18BABA
+:10A92000D6A06A724980E43264333209F0AB460043
+:10A93000958F16199153BBE04CE78F5CDE2C6FE6C8
+:10A94000919F2DBEB80C5F7C69E778D53BE3E44569
+:10A95000E9BE2D6C6FF32DE95334F4ED9626AA9BD6
+:10A96000F7A27A3FAC910602871BDDAC9EE0B501F1
+:10A9700023DE9C2235C6C84FEEAA0123743FAB41AB
+:10A98000FAF87A5048E842E583192620D34173FD4E
+:10A990006AB99395207C6723240AC0CF916AF45E3C
+:10A9A000890B0A5EE057F09764CB3D1081CF8A2E69
+:10A9B000DE8F853591E81ACDE8E50B53C4064F18B4
+:10A9C000F20F825E717E8032422D09069016BE7AA9
+:10A9D000D4601CEDF7DD5B78901F4592ED5190C679
+:10A9E0004F313621FCCEABC2FF9F2B29A904DC6777
+:10A9F0001E7D78F5371D615BC31BB906AE80DA603A
+:10AA00001A59D826E67D53017F48F654C62F7C5F3D
+:10AA1000112F596010CE159DB292FA1A037CACB07A
+:10AA2000F681A1E78EFBBB06D6F4047E30229E435E
+:10AA3000E05D5C5653AE45866B7B9A5D9A40120092
+:10AA4000523D6CD91AA4C8217B0B3E76216696F242
+:10AA5000422D47338B3BD630A9A6F7EB045F0A0A99
+:10AA6000DB09D10229D47E729AAED5B808AE544E15
+:10AA7000A588E6C22B7FFC3981E3FA07CF85962BA8
+:10AA80003BA0738F45B1CB19C5A9787853BC4B4D0A
+:10AA9000CD64967B7531EF791F5A0EC3AF33EC4A04
+:10AAA00004060BE2C8960A8850367CF3A0ED7CC2FF
+:10AAB000E143641F61A364E3F51827381088BCAE36
+:10AAC000F2C70D31F22FE806DD24414AAC7D8572D4
+:10AAD0007FD65A8B2AA89C8E6ED28AE59070D8E4D5
+:10AAE00069B39DB01126BC5C0BE50B026D87EBA72B
+:10AAF00012CD972D2C10F186CB7FC443F3B27C543A
+:10AB0000654911F55DE2A3546725921EDB6B66ACC7
+:10AB1000DE9B8CF62D6A3114D32B3B9E33DAAF3C8F
+:10AB2000D435BB9F52E1B423439063DA334BA6ABD9
+:10AB3000284BB5C48B043A35782B4EB65D0337638A
+:10AB40009E6B9DC3491902C546599EBBBB07306623
+:10AB5000C4914D8B5235F6EB8D4CB63D171260709B
+:10AB6000CF64F1A141BAF249601CD560148E94A55E
+:10AB7000A668A1A267D5F1AF38ED54A054A7E9BBF0
+:10AB8000FDD7C32DF28099F419AC67B66D382672E3
+:10AB90002CA5DC8173FF6F61DC58B7346AF78199AB
+:10ABA0005B94D11423BB040F11D3B6A219076EA472
+:10ABB0000099022DC05599647064E0E5B37AABFA50
+:10ABC0002F53BF62362E49BAD72E60CD286EF62A93
+:10ABD000BD073FD201D2FFE82EFF35C78945299D29
+:10ABE000B74B0F6334D63048CC95AD567374F2240E
+:10ABF000ABC14C5AD20F870739444016493DA12EAC
+:10AC00002AD12884107D4C00234E75203A16E7EE99
+:10AC1000C08F315EDFBCC66A108655FBFD4E4D0C01
+:10AC20005D312BCEBD914599C16D1C75D16458B372
+:10AC3000DA9745596B7D879C5395F382FD1FD16749
+:10AC40007E99234585EAD761798F6939752D3EDB79
+:10AC50008CF3EBC7151CB775210021D90FF96F7B59
+:10AC6000FF3718ECCE17D6595CC773CCD36DD88597
+:10AC7000685E647571C0F860C5B0BFD069A308A1F3
+:10AC8000B6862555B1651085AAE510DC1488982E86
+:10AC90002CC2AD2F243A3346A5A03AB21049A9D808
+:10ACA000BD94DDDB427427F43E0EED7B6B552E43E5
+:10ACB000F0969D120C9F7DE68E10B1B31A0588C4E4
+:10ACC000A5075C264601782E79CDEC7C4B8D53424E
+:10ACD000F005CDA7BC23E39D53E0E37E583CA65E80
+:10ACE000576C2185EE066843E47130243253916E2F
+:10ACF000EFEE455AB21F7B7124B895ECEDA7D10E4B
+:10AD0000BB2C0D0802E1D0BFEC1424F6E159D4B1FC
+:10AD10004A874ACF8CCE9B69EA6551DA2A07B0A6EA
+:10AD2000DCF5BAE6C9DF2638F38F74FFA72C0B4C8D
+:10AD30006ADCE367155ACC288CDC837A11FBCE7170
+:10AD40000C9251D70C0037990D94E8539CB9CEF969
+:10AD5000A5D238093789B0D574914F9CDC9EBCA32D
+:10AD60001D9012F3BEC561AE81D3AC8DFDD3E9B9A0
+:10AD7000F1D712CD7AD241DBF9E76B7BDB575FB9B4
+:10AD80008F7518B042C6FFA9BC9E48498B4E2BB3A5
+:10AD9000433D45DD5326D0CEACFDAC2DCCE6461868
+:10ADA000CA058F6D76FDA9DE2197314198026F08A3
+:10ADB0000013CAC399205023A44DD1A6F91F202601
+:10ADC000AB2635C2CA43D2A43F0AEE8933CA33CF79
+:10ADD00091DA9AA533E6BFB7275EEEA7B5ED8025D9
+:10ADE000E14D84D299835BF7721C7B65A8825CD5A8
+:10ADF000F53FDAE99E92EDD209C707C54D65405788
+:10AE0000AAA346CDC69CFBBF4B385C521C51A42361
+:10AE10009CFE770C5159892E828143562943E2A129
+:10AE200062FE98319BAE1A04500DC9595E110FB9DC
+:10AE30009BCF94A72999B074BB77097BF4DF63E0BB
+:10AE4000FC5745F08F73BAA5E816104BE9D67D8EF6
+:10AE5000EBF18235DBCC5294A9BD00EDC463677180
+:10AE60007D92B871931DD2296DE131D571394CF4C1
+:10AE700041B5C33A2A280C67231B214B66B4D0770F
+:10AE80002F19A1293A113F177B5F80D0CF8E035A2B
+:10AE9000FF2DFB36ACAE75F6019DD9C32698798D92
+:10AEA000F563A96727F32FB99B54CD13C89A541D96
+:10AEB0008691B9C63C452A95F5EF6C6B8BDE99DC23
+:10AEC00036C9ACE695B5731DF6FA796BAA92825F26
+:10AED0004FF22C6E5298AFE3449454E05959FE213E
+:10AEE0007D0C96528571E902C94A19DA3A1A78C876
+:10AEF000FF4F2F2580B0FC148E7FF010C64B377AA1
+:10AF0000CA75C81E60B68A95C6912DC3384CD64402
+:10AF10004C64099B0B6359A9AC24E477E6DE3AFB49
+:10AF200023DDD3359FD5C48941255728B43AE1FEA6
+:10AF30008CFC61CCA4A7D12D2D3FA19FC988F29193
+:10AF4000BCC8F4D4A815586D8D4BB3502886300F6B
+:10AF50002D2F4CC8143DE76A874B88D41ACA3F0589
+:10AF6000DDB7B5DB71374BB5693E298EE491120828
+:10AF700005F8A8F983943B4AB1DECEAF53F602221E
+:10AF8000B0517657835F6A383A46F01FAE9DE3C3EF
+:10AF900032FB9AC32CB1D84A43F4557557E31EBB14
+:10AFA0007F03842AF1BBEE8D8FFA788A2D3DE96C00
+:10AFB000F995E934BFADE36E35983797C01E48DC8C
+:10AFC000ECD9619969D144F48EA388062DFD5DA268
+:10AFD00094FF26F292C0BE8CDDCD1A56859D4C7929
+:10AFE000D2E5767559518DE858C853BA15C9AF3AAC
+:10AFF00014B430FB5562843038C017363A1036E24C
+:10B00000446613218BD484CAE4410975B35FA71346
+:10B0100072D28EEF332D9057B41B4D415933E3401C
+:10B020007428FC455DE44405ED6AE91B27E1021B39
+:10B030007F126324CC8B30D12C736A07BE20FB5D5A
+:10B040008EBFDAA46ED4FAE198D5501EB97F7C9CED
+:10B05000F914C76D34BA9D07BC1307751A73B53B55
+:10B06000CE91222C3B7D30ECCA5312B1DBFCE14F78
+:10B070001BBB110E3C77C5BA30339D53A38DC33132
+:10B080000354901AF2C3C93238E3B5B47FFD1F1FD1
+:10B09000894DC4749358D5B8393D781EB5CB348CDE
+:10B0A0004E605DC909ED593FB2B5C3E07E5F4247CE
+:10B0B0008CE915B30456AB436342A2473F32DA0E24
+:10B0C000A4118EE7D41411EC4AEA6EEB5E6DA60370
+:10B0D0006BD2F5EE1D0FD1E334D7D8D3A261E76E62
+:10B0E000B464F711CA8AB9C11123BCCDD99EE3EC6F
+:10B0F000EE2588E5468E5BF9E2543234D1CA356CD0
+:10B10000707D9E625423597264DF6C865583A89AC1
+:10B11000EA547B36A17590ADA9670F1C74743EC3C9
+:10B12000D3CC5051B33BDE8B27E0E3A59631FE1B19
+:10B13000576B885147D189D60C485989A234EBD234
+:10B14000568524CDC95FBEE64F0C502AE29A856829
+:10B15000241F779570C1303D4F3DD1865F41E82473
+:10B16000067CCEC6E4E714C4DC3619F5CF95B26888
+:10B170006388AE5D2F3D11AAD2CD71375292EBBEDE
+:10B180004EB76DE4FEAC473D58FC0C77DFBFA12203
+:10B1900073DCB7F681DF5B17FC935FC1B89AD9C146
+:10B1A0004C5D6CC7D89E4EC9A7DFA15BE5A509B76A
+:10B1B0008F6ACDFA58F471A812EA2D36E14F5CB6C9
+:10B1C000379630D60B55261322778A7814C84EA9A5
+:10B1D000B00A82FAFB09185E0E2E8982237DADFE2D
+:10B1E0009D5E6D4BC2464EA35975620EFBEEA4FDEB
+:10B1F000F9CF33F9C01DDD816EE0FBCD89D681C06A
+:10B20000A24B5561A1A50D9A049C8A168034AF51BA
+:10B2100084A8217DA6EBC9B0F21C6923659840E2A1
+:10B22000490FCCC3C912E5EE3ECD31D6E75EFEE054
+:10B230001549635E53FB00AE6DE813AC92AC8AEE29
+:10B2400019F1E8C17C3C255E2004035769095C784C
+:10B25000E1460695BBF09BBE73F3401AFB18FB104A
+:10B26000A2979DD9EFC02BDB4B2C597A8EA92133A5
+:10B27000ACD11C98484ECC705C4DDC113B37FF269E
+:10B28000D0204CC8125FC48A4951E7254928432180
+:10B290009E7CF56C9ABBD58E111A662BB0170D8F5C
+:10B2A000E77927BBAA4C55CB280ADFB9D619552414
+:10B2B0008B5FC33622C7CC40F2068313C6FDD8E9A4
+:10B2C000B568C91A7A26E6615DE1AABB3527C8A52B
+:10B2D000D35452ADC3EB3272BE3F0BF7E8D47FC4F8
+:10B2E000B38878747EA69668052EAF2C513096B838
+:10B2F000F436AFEE45C0B52FEF3AD851F9812C1195
+:10B30000202EF5EFB5CE4D2E7DB49C0FC712739154
+:10B310001427158695249811D67ACCEC7E88A2BF86
+:10B320001C497505882F0692333EEFDA5E71495F3E
+:10B3300013CBD2B6232D5A8884BDC57547FA23474F
+:10B340000F73CE2202638797B177078065CBF86EC3
+:10B350002F78E01D2BAF6F10796356518661FB3D4E
+:10B36000078DF78922E6B63BAFD39AA7FB80349CC2
+:10B370004BB3CBCE648C0373F3AA6940F97A9D4B2F
+:10B380009457B08CC9FCFDB34F261269A682BCC687
+:10B390009DE8412337584D97113AD165EE0C58FD81
+:10B3A0000835F11DAC78199F7A5E19D16EDABBD4DD
+:10B3B0002451E61D738D7350DA0B3BF12220269D3C
+:10B3C0001E648A35F0E0E721489BC48A9A78646459
+:10B3D000C94981A455101AB31D353DA4892B2EE10E
+:10B3E00015F5B8E17E0756E653D1C485D37F2542D3
+:10B3F0004A6208FED4683279E3847278F88C591C6A
+:10B4000013E25261EAC42F61153A0A66EF69C3C1BB
+:10B41000F150F93367F01721F561937E5199585235
+:10B420000CF1BE24937FD84C5EA0415E576F1C2F59
+:10B43000DF2194FE865DE2B1D666EF9F79E71C5767
+:10B44000E6EE4BF7A76A1589935024C9FBBFD335A5
+:10B45000CA07411A4F0B03B4B7D536947285EDABCA
+:10B4600032B2F665833DF1662D1188DE0BFD45EEA7
+:10B470000852148630A57A10C6DF1F034B44966C21
+:10B4800030117FD991A846CB0F708E2CB89370984D
+:10B4900084818D827EB003C68AAB2250896C1E8166
+:10B4A000A45B20BA03C88FB633E6751F0799BF891E
+:10B4B000000FAEB03981CCAF96ADBD2F8413FD4ADD
+:10B4C000E5C50FB37B3C113505615086C398DC445C
+:10B4D0002E6743991597869D0D76DC30A29A2F1E14
+:10B4E000D47A0B6CB0A7A3AE6055F2886E32F245E9
+:10B4F000E40F204893F43B5240C51AA5D4FF891CA1
+:10B500009EDF551CA91D45CFB3F6CBBF6B4B899170
+:10B51000DEFC7189CD7CCB45407D228D8F0F0CD513
+:10B52000ECDCF60706425217A03032F5D4EDF633C4
+:10B53000D7598850A8046EC57BE42726B32444BF9E
+:10B54000330F419B5FB4F2CC7A1B3C774970F89B78
+:10B550008C115C549E91E808D4220B07F124AE9B19
+:10B5600051CB89C71E15A7580D0CF6A0D4FDE8884D
+:10B57000757040401CBB144409D6663731F416730D
+:10B5800047D7A7701A2B3251EA1AF7C0199CCF255A
+:10B590008E7C354719BDD52F971D8480F55960DF06
+:10B5A000A4CE90510747402303A1EFEDEB71213466
+:10B5B0009F4B38D98C1EEDC973B12E6087C8D997BF
+:10B5C000B707ECDC4A268DBBC9743185439E8F26B4
+:10B5D0006FF764D2C07BCA9B7042064E504582F61C
+:10B5E000AF2DA03A60492800023306AB42D049CDC6
+:10B5F000E7FB65C48D6D642D8D83A75BA7F01D47A8
+:10B60000C0D7D510CAA7405D31516AE2077A879545
+:10B61000A58A916FEB6906F0507FEB3EF78C6BEAE1
+:10B620005C52F013FF883012E75F99EFB416533283
+:10B6300084AF5478EE3E8A242B38B62513C11B45BF
+:10B64000B76BC53362037FF94C801042EAD5904C4A
+:10B65000E65AF018B93244FC35F2FF358AD1D27F70
+:10B6600060A0E3EBEB2974B6968F5FA20964417F7B
+:10B6700045E22AC102E4672D91AFA4B61A4790D3E0
+:10B68000940B75CDB4BFDEBFDD369BEB8C6E05A28F
+:10B690009CA998D4D8AE46D2DA88ABE42521BECA9C
+:10B6A0009E9B2605DAA85108AACF8D8D418E54287D
+:10B6B000432E4623C7E9FB9DCCE4F338A89065767A
+:10B6C00071FE604B336C95FC6704C49EDBD4857DB2
+:10B6D000187DCC9E391D825B25C8AF4D0EC7FBB1CE
+:10B6E000D894920BDC784C94D38A3E77F874E08639
+:10B6F0009D1AC1E27665E7B5E10F437A71C296C340
+:10B700001A3F057CEE2B200DC78D1267EDD8B611C0
+:10B71000CB6047BD66AFCCFBBFD8424316236F81D9
+:10B72000AB1C7D9673A89F3AC2C9B8A63E3039B605
+:10B730003B08113182444AA26AB6227C4622971AFB
+:10B74000F60C4B44E0112BF00D7AFC19D60A894116
+:10B75000C9BBCEB7A307CF26DF2D4F1EDC68DBF8B1
+:10B760006F82E2EF74BBF03019C7C26E090ED5BF0D
+:10B77000EE78D5520EAD25B7B8E6D1B9D7D9A7E73F
+:10B78000806ADEA165BDB66544ADE51E5FDBD18E86
+:10B790008FD10AADFB3ED7F8760922C920EF810F81
+:10B7A0007EDED36D728027CF7BDAD136A3B84B50C3
+:10B7B00087933AEF20D9EF26B45054D6133C427801
+:10B7C0005EAD164B7066B5F82306C7366914BAE746
+:10B7D000BD9BE9E33BB9CFC3C4780A7CC74557D2C8
+:10B7E0008E67E2F0BAC941DC6419A56C7536236630
+:10B7F0002031473A247E1973496B3B8D5770BD1237
+:10B8000002C6576E43D2E15BDBBA9ED1E3FF2D8CBB
+:10B8100063F0B5D3EF170AB02F910A1BEE3EAE8D41
+:10B820005EA24EED80BC070CD59E67BF987C16E6E5
+:10B830006835A9C438B7AA67D4952161B100C9E1B8
+:10B84000065ECC9CEC6DE087EA4F440586C0B2E909
+:10B850001D85FC3EA7C570CABF323BADCAF729C5DE
+:10B86000886F1740B4C7721DCE0184C680277BC382
+:10B87000BD7F064E04F5D127C9697DD1A22111D320
+:10B880004D74696CB40F601B0E9B7D6355767A72A4
+:10B890000CC3FCE79A716A96BEB40179140C61ACD2
+:10B8A0009330D5602071DCF48AA870D2A4AF3A8AB4
+:10B8B0004016513B8BF774EB0ECF1A7D8B10F43F83
+:10B8C000031234686737A554610EAF16946A18A145
+:10B8D00052DF496C0A96ABF94B4D3B70A8D546FF39
+:10B8E0004A051E1326E318191A0CB83BA5E6BE0E2E
+:10B8F00022037B27881F45E7A289FF0A4923CD0D34
+:10B90000D851C4397C347811DCA82D37D27633A8CD
+:10B91000D84E97AD1B278D989245A92B83C465BC43
+:10B92000DA4187FFC4DED6E82C990204D92623F039
+:10B930004F48C565E36AF7BA0AC4FD064561AD4CD8
+:10B940006ACE72F21D9273F9EAEE185340F89EBF68
+:10B95000585619E90DE99F06A97B6649845429AC1C
+:10B96000C10F152B20CFBD76B4E0C35705750C97DA
+:10B9700061D0C7B1E53223B6929911CE591A654B01
+:10B980000EE8A32E61AA5EC14F9E2C62CB2473C821
+:10B990000A0988F711A1C430B1E28D111551511671
+:10B9A000475FC54B19D0CF9F7AD789B2C0633C623D
+:10B9B000116F21A120D8AEAF45E82886853CFB61F8
+:10B9C00027B79C48EC7A96F936BE4849675032ABA7
+:10B9D00014D435588E89F3675BBECE7692E11EE7AC
+:10B9E0004BC5BCF03E5FF473CFFB17AC0714D672A7
+:10B9F0003DEF674FBEB6A09E47F53BEFE4A7BE6F95
+:10BA00007D74AC222F23CA8E55D1CAC34DCCAB183E
+:10BA100049A23FD1A812E905637257A15A6DA56FDB
+:10BA2000F046FC8793261704E3D895DA2F7C0F396C
+:10BA3000E87A9566A5C258858FD53A365293A1FE0D
+:10BA400089D6BE2F6838B4AA9E217E25269A5B86A9
+:10BA50001BFFF79DC56BE7827F3D32C0ABAF260B66
+:10BA60008209EF16FBB5D73BFA6A02F8F3725B194D
+:10BA7000C0EE6995FA015A75103FD8219088BF84AD
+:10BA8000D3DC94B1C0D773109418AB7C5FFDCBD0DE
+:10BA9000BD0CB3C95BF684EC3FB26A479A256EC110
+:10BAA0004AB693B895786D224E54A94651EA5EDDA8
+:10BAB0002D724FD3DFCCBEF78088EB863158A6813C
+:10BAC000DE57C6551F1004775D01E94D0400B98F9C
+:10BAD0009B2A888115328D7115EA4814C4D9FF4616
+:10BAE0007FC1AB21CB3380E18EEE78AE6BB5DF3614
+:10BAF000A15FEA1F182E465B01F467AE8CCC2F5471
+:10BB0000EEF637695A13D1DE319212F481681727A5
+:10BB10005A78815EB1F5D4BB2AEB61ED3712C62CA1
+:10BB2000A48C20EC63685ADA08B3EE92F563A2F2B3
+:10BB3000A61FD61935310A3A0F50599EFBA7F32795
+:10BB400005E766BDB76733EE4112256E5F20BACCBC
+:10BB5000BE551AEF2B5A500D56C3CD821C2BF0E761
+:10BB60002DD9C30E84386947B08A39CE08D4BAD1EA
+:10BB7000CF94F80464DF68FC3125920E6D29052B03
+:10BB8000F485BAA3BB4D385A2E7FD983D8CE93748F
+:10BB900019E42CAB51C4E1B52FC1F27B2C10C5D4F4
+:10BBA0001C58F74611649629C6C5589AFB07496F79
+:10BBB000C9B925183CD119532C565203FC1E2B49E8
+:10BBC0000394A865CB2141A0AAB00C96B4B9EC436C
+:10BBD000A0CB1ABF930133097A9F4E6417E4B1EEEC
+:10BBE000FEACBB921BBE60AA6FD098E48D46BD44EC
+:10BBF000526144744D5DAE436946A0630AF6905BA2
+:10BC00001BD2AF3285F011A4AF0FD29AD787F4B10F
+:10BC1000C18251C24056C8ADFBC9A80CB70A98D022
+:10BC200090F84E067C1E04E049B2D9DAC67D0CC4F9
+:10BC3000A2E03F4AD8EF239B6F5BA4EB56A5469248
+:10BC4000CFB21E5114757E81DB1C165D32CA99AECF
+:10BC5000BAC3061A906877374906A356152825CF28
+:10BC60001B3BD29CE9574A5C9A272CA9AF86AF10A0
+:10BC7000FD30EA9E17B23972A218168847A4132520
+:10BC800096FB1D06DC722C3AE33CB59306FD057667
+:10BC90003163BCBDC10FB17532FA41F4ECAFEFD9DD
+:10BCA00042E372935205C65EF7661F1D3658433A4B
+:10BCB0000CC4E7F0C0B069A2C11C815ABF7CB68E2B
+:10BCC000C554DC256519C0BBACA7EDB508852E4071
+:10BCD000E8BE9722EA63F81CA90D4D6F9CD60AB600
+:10BCE0003DEDD9970EA46B5F67FD6951E09A2C4634
+:10BCF0002BDDEBE107935656F3D16E1AB5C7A86357
+:10BD00007479780C42C2ECFEE294A3B401237C4D1A
+:10BD1000646583152353B7303E979D5CA75F64C36A
+:10BD2000971A4D7A399651F67575594BE2F6268178
+:10BD3000534AC9961657D402361A3AC66F69D01CB0
+:10BD4000641BB293EE13D1B82EFED0E2823552DCE2
+:10BD5000BAF2E82321268867907773A98BF64B54B3
+:10BD6000316752435030FC28D3CE61308BA49E45BE
+:10BD7000BB3A0E500ABBD38099A730CEE79C6966C8
+:10BD800017DB3086DD461307B7E07E25B9671E272F
+:10BD9000CA113191E7BC1C9277DF997485D34B1D92
+:10BDA000CDECECE645FCE7F404D5B36FA423C83E24
+:10BDB000E38BA120FA1C35C007F228E16FB20AD547
+:10BDC00005C986BA463EF38AF1A0617B188BE31C55
+:10BDD0003DA089A67D47C55CC8487A5EC589B7EB9A
+:10BDE000CB2A41BFA9145C5F62DBBB8C2D1D8F2A5F
+:10BDF000E088D74B788DCBE83E187252F56ED93A71
+:10BE0000E065C618B0F0A8437F1659231E03CFDEA5
+:10BE10007871DA8B60131F993B1B609B6E73918462
+:10BE200098D1A064FA09EACBC4B4B4DA0EA8A63A51
+:10BE300073158D2D15AC0361755F16F33998D767AF
+:10BE4000505B95A046F199985094569A54B8BE0705
+:10BE50004FB3EA6C643403262F3466324F95D21305
+:10BE60001C46601285A3EE67101534E0A1E31A8822
+:10BE70004BC253AA0F19052847C81EBF622942ABFF
+:10BE80008DBDE2CA34E1782A1E964CAB86A2E865E5
+:10BE90003605B96E9433F4978F758654ED387FB3B9
+:10BEA0003101D0D933687C80DB05B7C2BDA651B360
+:10BEB000B61E83C558BD7D36A8BC8C32C6428A8268
+:10BEC0003BF4C34FCEF0AC2F5E1AD42271E507438A
+:10BED0004F3D41D1460852442FA591E4EDB2F450B4
+:10BEE000F1ECA5674328694607A215DF8D30EC1EEB
+:10BEF000F1E168B71F907CEFEA6E0E8DBE07A412C9
+:10BF0000E1028FF2487735AB9D6D75801C1D6B9CEF
+:10BF10002A91397CADC7578344AFA879A5BD44CCDD
+:10BF2000C3A15DF1D6AA856D386A2C121D37D8ECF5
+:10BF3000B3687A52F94DDA52F8C4E13E8A7B8B1A23
+:10BF4000A06DCD7E861C6D0B7928131FAD00D7AA7E
+:10BF5000CCE4FDFD1D6BF3432835E4850F691979A9
+:10BF60006C19F00DD62345C3854845C2185D1A29C2
+:10BF70007D736AED6DC0E62B2F7A11672281D503A0
+:10BF800076E86A4341BD7FBC975B42D15ACF8D238F
+:10BF900053885F3A90DA032CC510858B7C53953E0D
+:10BFA000F4A2AB476025FEBEC29395F76FED424CFD
+:10BFB0000594FA8B94318CE2AEF434166E8B85CEF8
+:10BFC000144B5E1ECD581D8CE169DCD226CA86AAB0
+:10BFD00028C96A8FB32356FCEAA89178CA192A198E
+:10BFE000E5FCF189D5588858D474911A1A9F39857F
+:10BFF000BF1E8A0EE69B2574528B9BF0864C215007
+:10C000003D414377A6544F9CDB1639E60EFA578E16
+:10C01000824B6D3A8D0D7608DD97B1502643E3E8EB
+:10C02000F7B83EA8F6AED9C0CD2CA6568D7B723B94
+:10C030005BEC1FF8AB570D7629C8CD98BD71E0CDEC
+:10C04000CACE026A6DC7D23AFAF3BAEFDE5A9ED16F
+:10C0500025BC5720F3FE99ADF91872A9919FABD773
+:10C06000254D08B0606FF92F8C7C99D5BB3B9C3E69
+:10C0700001E0C0E6E4FCFEA46812633BCC2877D85C
+:10C080005FA91C6CD54C1DEF04FCAA8D87A05C6FCA
+:10C09000A3F74B704840FA14FCF560A837224853C8
+:10C0A0001C16686750C4616511967AFD9626EE19D4
+:10C0B000369498AF4FC72C4DA40FFF8A95C125B673
+:10C0C00035B57123402FB7F0431725F750A93D7AB6
+:10C0D000EC4234F6BD90303F243E9532222AAC8AA1
+:10C0E0006B5AEC53FA37B5407328CA83C87172098A
+:10C0F000874FC6571DA442267143D3A3CAF4B5BEC9
+:10C10000D9E6202D468EEA4161F1161BA240D7DB0D
+:10C1100014C6656CB61547A2550A363F88591520D6
+:10C1200004F0D7408911CD41938EAEBDD194411713
+:10C13000AA62F87EC1F465B30136B7A3DC0E89C7E5
+:10C14000E8F73016DEB09AAD0505ABFE72F2FF29B6
+:10C1500092F1876DCCA9144BEE222D92EB6C04EA80
+:10C16000E73D590922DD1B13B448933E99943CD80E
+:10C17000B79003DA39C83A8B87DAA03A38783EA309
+:10C18000932972EC1CBB139FBDBCE94AA316A5F012
+:10C190003B6B1FADF553E08ACFD0C8AE15707483EA
+:10C1A000A53926F4B12DAAC06309709684B0FBDFCF
+:10C1B000CE719C45C2C04D8FF9F097324AB664A14A
+:10C1C000A0C1B212F479634D13DCC7C8F7F691220F
+:10C1D000D3229F496F83DF5DABBA813C2B71048E04
+:10C1E0007FD78356C99AF8127FF320063764F75A2F
+:10C1F000BD958AAF4D744EF6D4F00BBB5051A98457
+:10C20000E92C41158DED63C990981280ADF52C8B0A
+:10C210004414EE701466AB0B4D1858EB1A411045E0
+:10C22000413519415AD806E9F9A7A5C76EBC04F9EA
+:10C23000319F9DADE270A941240F863FEE3459BA7B
+:10C2400063076A1E100F1DE114BD86859BFC593FD4
+:10C25000755FC8BE2A56391A40F6861F0A6E2FA788
+:10C26000BF081367E93177BD5B6A41D94AF2A00480
+:10C2700016DE8D26DE62977CD21EAD461D359C8B68
+:10C28000E988BDF03510B6197898171CCB9C533B44
+:10C2900093F93EF714CC9BE7457917E9F5BB6A3073
+:10C2A000BBCE39D300C615DF7B864A0B87D105E3A9
+:10C2B000DE8994DB4EB642F67260853CE25B2C2D43
+:10C2C00091929013CE42FEE5D3563999A8570C2A85
+:10C2D00017BA25EB36DE7263076DDFBF0E18BC7F21
+:10C2E00001AD5CABA80EE34909A616B5F638FAB560
+:10C2F000895A1BAB15290CBDA56C5D2D04BA815361
+:10C30000DFB6B035F650E60D0720E8CF301DC9780E
+:10C3100074DE24F688CC68718DD33D2CBD06392C93
+:10C32000CB46B295BA1C593BB21A440D967224976B
+:10C330003B1AC0B12BE7DF7CACDF9D9C4306AE38D7
+:10C34000280FB919E145730AE33F79246DE92EB24C
+:10C35000697A3C0A234C24086C9641DF5EADBDFB34
+:10C36000F491BA33E12930A552651010B012431B85
+:10C370000749776E577D0BB62C65D403F43219A5A7
+:10C3800001F933FFB02666E3E48325E03999D27AD8
+:10C39000B32886F56A70163EE6B2527165AD388FE5
+:10C3A0005FFCD4BC92DF56E11C7B8CB1CAEB5A76A1
+:10C3B000802DABA01F75482AD438D16E500747D9BD
+:10C3C000E468980C5B1B449E29A02646EFC128FE1A
+:10C3D000D72FED6A930A76C54A176FB0D16A569F78
+:10C3E000199B0F03C164ED492CDF936E28E423638E
+:10C3F00001B3E1D11C8D1196EC89CBB70B02F26C25
+:10C400002F7563C632A4B21B517E976F6524BDABF6
+:10C41000C08F1EE89F3E3DD3EA6411D3E695608449
+:10C42000F5DF6F5B7AF557B96A53CE94265A1A8AAC
+:10C430008333041F8AB5B3796DB4195F2D09C441E4
+:10C4400068215F80F3153557C2038FB04D60C2F786
+:10C45000D0D91597A6E06930DBFCB6AEABFF71A36F
+:10C460000E4B428BE63ADBCDE359DFF2C176C16376
+:10C47000E764B0925798933A2F5771359ED601C50D
+:10C48000763659039CFFA652E5691E170B132168E7
+:10C49000FD943A3A7734E685B2AA40F700C857EBE4
+:10C4A0005250CC1998F427A9269685C47A3D1E9E31
+:10C4B0004C42F36D3284DA948B96B951351629AA21
+:10C4C000419999E26DB9D13CD0D3CC170ADFA99E2E
+:10C4D000D793E7CB5BD58ADF3887DC132E10522247
+:10C4E0005B3C65A6E1B38C209025FBBFD65EA078AF
+:10C4F0008873D713D660BC0A2D7AC3F0618B3D1CBC
+:10C5000020E26D9B44E44484E9594DD3B60FF663B1
+:10C510003D1C36E1C0999020AF6BE92ACB5084D8FE
+:10C52000E44D2BA359A3D804CEECFC7299D55D0839
+:10C53000E0C81BD132C2A3CD862F094483E741A8AE
+:10C5400038226886099FFC404AFA525E79FFCD5234
+:10C55000A888D69A981BED72E7F20508061BB175FC
+:10C5600080AC18783942B54922BEA3A1E4220C520E
+:10C57000FC30BBC9978CCE12850186CACCBE5364F1
+:10C580008422AF5AE34EA6A16803E68A7919D387BD
+:10C59000042A03852067B8ADE5CB79C0D38EDE428F
+:10C5A0004CDB3B9EACC72DDAA06B20A13794E64054
+:10C5B0002BBD77BA0C0A37006D8FEE75A0BC2CD15D
+:10C5C0003DCA7B3FCB564C0517AAFECBE34003E99F
+:10C5D0000FF6BC33BBDFA7BFB26B209A6DD586398F
+:10C5E000BBF5DF4FBA0C213329FB5EBE79BD188243
+:10C5F00012E6BA95155F551824F09F4C1AB85B20C7
+:10C6000013B6E3B23D9D98E336055CD96FFF818197
+:10C61000B4168659298CD64E6C2EE57E4B7F03725C
+:10C62000474D731E8958F9983D7CEAC938DEE158B8
+:10C630008DBEBB76B3E2425D86185CE0290D2A7799
+:10C64000C6BD7251511C95D0A78619FD3B85AD051D
+:10C650002073F8D363FA0BA4FB72A7CA1C908CD585
+:10C660008D83C20ECC6B5EF5E007597EA217931B3B
+:10C670008D961D88392949612A09D6FA40F91FEBA0
+:10C68000972D9A2120F914FD2BF09E574420AD6D73
+:10C690009081BD5C1D106031AD14077CB0CF6CD3B0
+:10C6A0000355EC9EA86273627670967A2437F35E27
+:10C6B000C48591C34EEBB363760C42E3079EA2356B
+:10C6C00049D8281796599BC86A4628489ACF678840
+:10C6D0001029B079A4DE6F34D761EBE4B1EFC66DF9
+:10C6E000F2EDB04105AF00CC5D1646D9429AC7E6DF
+:10C6F0008C1A1623AD59DDCA3DA0505E31B66FC607
+:10C7000000BA8A734E3CC249EB35B0BA3D4C3B840B
+:10C710004A386C3CB96D9AE76DE61F80F0C94E024D
+:10C72000437F7AAC387322188BBA86EB300DE44322
+:10C730002204F283641CAFCB833B9868723B2CEBE2
+:10C74000075EBABA9EC2E9A29EF4B14FEC339310D1
+:10C75000B38B49AE5DB978A102802AFBACCC42F123
+:10C7600011D77CBC7E85E024CEF751886AA9C879B0
+:10C77000527FD06E83ED47D8C4E71FD08389F00283
+:10C78000E542B08C3E41D82860CD88F6DB99687CC4
+:10C79000C011833BF4EFCDACDEED2CE9917CBFFF03
+:10C7A0006C6BC2B0BAC0DB081AA9EAC93EA31FB5B8
+:10C7B00083F5705CA251624C5734ED3C5863FED453
+:10C7C0001CF411E7DC8DAF5FEFF202B61F70BBD037
+:10C7D0001652DB2EEFC402D780E5278E45320D7C42
+:10C7E00055F3661D15C7F5A866A5E89A6270BC48A2
+:10C7F0008EED13E2CB21168CB0E432556E3564CE4B
+:10C80000D743A15340134DDA9248171B1514C29514
+:10C8100051C1D3C704125CFAF649843C862E649554
+:10C8200086C6F930074746687E6CDFA70E073DCA0B
+:10C830005E517E9BB7D1AD370832A07CE84C8E8E1E
+:10C84000B52B4BD22C6D1E0C8CCD2CE0F3D1423885
+:10C85000D34252558499C81745D2A94FD9B067948D
+:10C86000F7000DF5D9BC9D236B9B66CE9EB3258545
+:10C870006B4088341615A75B07ECCA381FCC666D71
+:10C880007717E5C897212F4CA748189505987396F8
+:10C89000B35ACE118B9577AB27216FA9E55C8958E8
+:10C8A0003EC1DB25DB9486295755C5DD4D2CBDFAED
+:10C8B00091E1DEB6347C231A98D981B80FA3876D35
+:10C8C0008B343B0238580B69234D5930EE552E7C82
+:10C8D00020AC91DBD627D79EC18B3049C56E8F30F7
+:10C8E00036C4E6A0A1E66D7C6527362C76C5568158
+:10C8F000FB3DD2B8219813D5202157F68C9EC13C20
+:10C90000E7880A7599CDF3F295994634A79BE0AF75
+:10C91000501A7F0D0400010000000000000000001C
+:10C9200000000000000000001020000030C90100DD
+:10C930005914F60DDD9B9FBDCC9829F8F8C361BE54
+:10C940008E02348C5564AF38A42282B9BA7C294057
+:10C95000635F529020ACF50F9FEE88598C1195B90A
+:10C96000E9C303DF5742DD94B16F4AA98B25DC8010
+:10C97000FD8DBBCFA0DED6D04F538364EE2963C9B3
+:10C98000DB20C24B90916A4407572148437690BD03
+:10C99000D72297EA2B8C713B22B3517F23A70787BD
+:10C9A0001F678F814323A7FD3EB864530639536543
+:10C9B000480B08477269389F567CD61C27CA99C60F
+:10C9C0003EB81FD2C140E636DB277B7C78E13BC214
+:10C9D000C6F803C047E4018F53C10F96DD1F7F40A7
+:10C9E000BFCAA1620DBFE88719D46608CE9F566FF3
+:10C9F000B1B54C94203738D4E320FE2BBEE3EF25AD
+:10CA00002BAC244CC5EF9DEB6F0C0C99EEA00C7277
+:10CA1000225E42DFA3455AC986FB62D05E9AB38686
+:10CA200079C523BE29E3AE1CDA3E19C296C56CDD7A
+:10CA3000E6D644920E760E9E3E2A080D76D151B26D
+:10CA400009A3A93368379065F097EDF4DA7CAB98C9
+:10CA5000DEC42F507F7DBEEC2BD815B0B3F2B801E9
+:10CA60007593B8C4F585254F38784CB347E3462312
+:10CA700029ED66905AAC4C1DAB3B2A4422C4395F69
+:10CA8000402AAD867BA0C176EFCD45FE203E601BDF
+:10CA900019F371E65FA077FCFA5B7A151C26309DCE
+:10CAA00086CC4DDA80EBF8F37D54370405FFEEDADF
+:10CAB000CF9CABF983FEA5FF52E9005F931D6D2566
+:10CAC00035FAF3784CFD0263B064BD310BE7465B89
+:10CAD0002E5478B50C89349CA5264C33B301134CE5
+:10CAE000950A4E043F5136C3422E4B9F878B4A29ED
+:10CAF0006B7828502B0D03BB48367BDD84EB9D3CC7
+:10CB00007E3B0D523DD310BA4BA9A8AE490C13F58C
+:10CB10006DB220345E02FA10B1AD00D9331F33621A
+:10CB2000E1D7859E7D96D5125A902718A9D7B24392
+:10CB3000D6C47BA6E568BB29858E4679F11D1CDB32
+:10CB4000E9243907CD9E6ACE1F5255A73B425AEEC3
+:10CB5000214EF9FEB276B24B9946CCDEF8C24E2C8D
+:10CB600081FAF0BC54DF62DA8AD92DCF034263DA4E
+:10CB7000B4FC815A0A56B29C52906261398119D52F
+:10CB80008E4A74CF8028697440768F4EFC844204AC
+:10CB90007BA503A984A054C5E36957CB04AE6427E1
+:10CBA000B76FEF50C9CFC7CBCDC42284BE9573FEFB
+:10CBB00037082ABE915441F75A4C740019C03EBB45
+:10CBC000679B96641C6B897AB10603C2BED39D2312
+:10CBD000ADE2C2F35911A4512FFE7D0F88AE71242E
+:10CBE000EFA55B01218A3F7A1F541E2E401D686C01
+:10CBF0001C1385A95206DFAF5BD5080678FAEF90C3
+:10CC00007764859F166298CC7A3F6DB8644939E89D
+:10CC100079FEC6499A3BCF98579240A5A4661A9FC1
+:10CC2000C380069524E2A1CF580784C5509F737F27
+:10CC3000A048FE9542E34500C57CC77381F3268E6C
+:10CC4000AE1C7B037C54D3E1ACA8F0658B40F1BCF7
+:10CC50006E35D4B8BDB8616F81718A804BF7782684
+:10CC60002D3F45FBDB86A2F9F43E056B9EE7EE5AAD
+:10CC70007D3EA804C03CD59805659DBF81D5E31DC8
+:10CC800095A985CDD869129F16B6863292AB8B15C1
+:10CC9000921F7BF785A8C7268AC01A0274AD1DD9DA
+:10CCA00073BE47AA94E9D8DD0BB3D06CFFD9D9DBAA
+:10CCB00038DDA0E765A74805503822854DCC382ED1
+:10CCC00019899FBE22932946E6065412FCE0EA0F1A
+:10CCD000D00AE6EF9B289A4D74961F3AB4251304A8
+:10CCE00065795DC16F66CB1CE836F38BE61C11E3FA
+:10CCF0002D846B53306F036721BB6B868EFF075EFD
+:10CD0000B7C7AF15FF077D43ECD6B8BA6D5FD32028
+:10CD1000250816565609F04C94A81D12C1D35A7C0A
+:10CD20002D929E2254F77F91FAE644D0911E23C1A2
+:10CD3000B563E659551D5C856C7E1C05DC694A05AA
+:10CD40007A1AC08E7259506ED1CBD77D24BAB9CF22
+:10CD500040B9F21503C51C2F70AB4E9A01DB7B3036
+:10CD6000A4824085F5D38BC8C79378468C79B1E20D
+:10CD7000FC28FB65401158DCB062DBD353DD110F9A
+:10CD80001CD5A96035A0407C484D92FCFBC27E1F9B
+:10CD9000B0D1327A32A84BA7B0471188989F1C2493
+:10CDA000A270EFD27D1941768D2BA674406D2D01B6
+:10CDB000CE24F19817C9170B8CED6EC4C52A490C07
+:10CDC000E178B650E429212D98553AB7F4D4A7A3B9
+:10CDD0008E894D1233F3311619866E9F4855305A9D
+:10CDE0007730CF9EECDD3397E217F4118EF14D2CA6
+:10CDF0007F36FE6BADF6CFA664844778C05A5B528F
+:10CE00002F838BD8F652CF069C34036D2DABC8CC44
+:10CE1000044021BE861FDD4FE294332DBB308D646C
+:10CE20009BAF920DD9E65A507A290630BED2A3CED6
+:10CE300085037525D5EC46DDF6BA7D3E4127DB0D31
+:10CE4000500B6799599E07CDC98A835E18B7ADC24A
+:10CE5000654933F1F8BD7EA8CF935F783650667C84
+:10CE60006371CFF87E3892202E30A495C10C7ECD10
+:10CE7000D608B95DF191086A94A3E79928C44E0FCA
+:10CE8000FBEEB84B6CB31544B39B6B07E97CCE0843
+:10CE9000C1D6E2D069963494C036C32EA9085EA3E9
+:10CEA000F4ACCE3237D10A62B8069F2485415DD9F1
+:10CEB000203B1C1AB0DAF6E277D34565ECA249EEC6
+:10CEC000247E9C220A2286192C6BABAF827BDBBDB1
+:10CED000DA3A96B0AD8E399481F5202EF4E8DD90E3
+:10CEE0000C94A604F7434D551DC87DD520217085AF
+:10CEF000E005887FFA8D6B59EA2C051F647BE49B63
+:10CF00005ABB951085AA6B281ADCC0119A7EC650B0
+:10CF1000370C6F49D8BA4BEED6AD8C35EF61CC15D6
+:10CF2000C455587C367FB18C1DF4EDC2084072A305
+:10CF300073C8B1F94E0AE1DFF8BC1045733C51D318
+:10CF4000509E99B281DB227FE76052F0D4F20D0D42
+:10CF5000C9EA7938A1892BCB2691ECD0C79B65779C
+:10CF6000A418CECADBAF8F092AC073EF69DC9D68B5
+:10CF700033F0173019554C480007402C9DE61F4EE2
+:10CF800062FF134AF5BAF920B5504B9FDCD4C23C7E
+:10CF90000B6C4557E4CD18DB47C442E0E7A35713B9
+:10CFA000FA2CDC8E4C32AFC871115AC6FBC1E4BEFC
+:10CFB000C8F8C4F53C7828A1C8EFF1A00C8FDC7646
+:10CFC00070CC56924943CCB626F712CA51859CE5DF
+:10CFD0008A667722A28E739BF2A46F93D96C35096F
+:10CFE0008EC842AE5C2973958077EBB76E1A4C33CE
+:10CFF00043CE27D95676E1ECF17F8BEDBB47A637C0
+:10D0000035A0AF5BC3FACD5B7B38E640A219B79B76
+:10D01000649C49D7241D27D3CFB08938822F276637
+:10D02000ABA7FBD9CF4A8E2D175658D27C03E7CC3D
+:10D03000B118C831101A042A525D5937FBFDDEC7FA
+:10D04000ACD4BFAE27BC1BDFB4D8ACF13CE49091AC
+:10D050005E1C08F5B1E0250481DB6F3CAB80838C5E
+:10D06000A5794D37B7A2B7324E6C72D2928A23356A
+:10D07000A26D14755882759B7E692B47F616F2686F
+:10D08000928925F1423B8FB2975E0C4F2F0E020B17
+:10D090003B817DAF127D195B40DE9376C3F711199A
+:10D0A000B42DD218C090E6901CBD76EDADABDF1A62
+:10D0B000868C5E15763CE94C0473251F5AA3EB4E13
+:10D0C0006FD5CD87545ED160C90881D57D8C5DF761
+:10D0D000545C219C5F37C71AE58E2244F6443272B5
+:10D0E000E55D98BFDDCCF0D3476EAEC9BCF4A1BFFF
+:10D0F000823DC3E5B9D3C57FE2C106942AB8E513E2
+:10D100007273DF71F39E6C3B4B3F696E626392D921
+:10D110001369951D38CCE844AC706439425B816476
+:10D120002700D26D6F308FEACF96D80B2E19515A47
+:10D130004D3FFFFF2EE1F90419BD7B72C7BA752779
+:10D14000BAFC6F1A32C1EEDF5FA4B413B2D78959AB
+:10D1500050A4CF28EAC6BF220C816BEDDA7FFB68B2
+:10D16000902EE5CCBA16803A06DD7129352EDFB453
+:10D17000EE11506FE12C59B7643432C1D4C96F3C01
+:10D18000BE57B8EB640BD9138F00CCC3B5EB1C3F73
+:10D1900072FF9D781DC1A7281E4BC3F1676C8FF2EB
+:10D1A000D96064BFDF41D9B6F7EE6F2F9BC0519BAA
+:10D1B000958485A2B88A6BBD37BE1DC3534C53E11D
+:10D1C000BEAB77871B12E761501E83CEB33E2E3B6A
+:10D1D000D151B2C237AF0DB203D04E4BBA3CB7E714
+:10D1E000FCE4454406617A88C074938910465D1555
+:10D1F000085A16BF6BB3D70CF59544BC0DD3529E9D
+:10D20000E8B0523B3299ED16CA8C7DD78168BEBD1D
+:10D21000EEAFD272CB85A9BA176F15B6AC91436643
+:10D220008CED1FA8F7D50AD3476505E98ADC86414E
+:10D23000E4F40290B4B8CC332E41CBCD2AD6E7EE3D
+:10D240009579BCDDA51A8EE81B64B6EBF4C03654A4
+:10D25000B84C6D6E99981A5D04F55CAB45F0489238
+:10D260006B702DE1D8E68A61FD7EB94BFE9C0A9E6B
+:10D2700064B168199B6F06EB4A9F55B4079410B8C8
+:10D28000C6A5A5A6B85F8FDAEEA079BC99C2609753
+:10D290000704D605E2DF796F894AA946B1C414E6CE
+:10D2A000DEDED0D486AD066E2754E8663FBACFB432
+:10D2B000A3167CA45218ACA9F0A50B23E7FAB9CCAD
+:10D2C000982125C1A78B3E8870F6B447CBF779E348
+:10D2D00034541CFD56678225ECAF3692C861B57E8A
+:10D2E000C06B13EE18E1C76F1DCB3898B3C135DCA6
+:10D2F000CBE9F4C1936204CFABB2AAD0832A2E64E7
+:10D300003A13E17E83CAAB7311667DC78BF1C9F80E
+:10D31000BF34D3EAEDBFBC62817621A583766CD0A1
+:10D32000FDD179F00A6104306BA2FF0CF26A7C092E
+:10D33000021E5A2DD635BFE09348C4E1AD4748D60A
+:10D34000905F9441E97BD1FFBC68D33914DEDD4E98
+:10D35000BBFE79409A0483339CCA74873FEAF96A1A
+:10D3600069F46EFCCBD888AA1D7B1D09F785145380
+:10D37000C3EE6A53A691A9D819C6DE6F742547E695
+:10D380008E416466FFDE5EF580DEAC63A0738E9036
+:10D390000E7494BFED8C5B88266B562E2D7127186A
+:10D3A00046CC02F6715F19F6057392DB3449DEC58F
+:10D3B0000ED92ED03F1DCF30A54E027DDB24707BD1
+:10D3C000ABDBBEBCC243EA7D406B469F729BDADB9F
+:10D3D000EA38CA246CF8894D685BE588605E8A9CEF
+:10D3E000CA6511E58C29095CADF1B527BC633E4ED9
+:10D3F000E93B3A9831E8A45DB55AA4630D5CDE6C54
+:10D40000BD221397D76805FC192946E782C915057F
+:10D41000365110A39293652F10921079BECA5EFF09
+:10D42000625EAE035BA02187D7FCAB43DD2B99E79F
+:10D4300000CCEA399B468E2AAF268726A8F6F4D080
+:10D4400081A246DED27BB6C9E09679E172213544ED
+:10D45000B3EDCB2FC2B48A9BD9480E2D986D4F7572
+:10D46000DECCE37712362756D822C9FD1BF5C1A0C2
+:10D47000DCF2B015DD216C36B72B0AF18B8D2E094D
+:10D480001B9479192316C6F564334D919DC51C185C
+:10D490001E45CF28AFB43D6AA97B2A4C43EA71DA16
+:10D4A000E2AF4E6DDBFD79CCA71A354F9C232B9E46
+:10D4B00041200CCD6069B4646B9B2AA5095558BB0B
+:10D4C000BD84443BE75E0ECE73E2C5426CC035F5C9
+:10D4D000B67150E9085EABCDEA36539868E30E1496
+:10D4E000D754B6D70BFDC5955D8FB4FC9BD9E7BD6E
+:10D4F0002329ECD33EEA40C9884F25367F195DBB0E
+:10D500002A4AF71B43AA79D0B8736A0962E0D2D5D8
+:10D510006697756D45EEFEAAE0823726C7D13EE2DA
+:10D52000D736AAE11712363671EBB6BA7D8402E916
+:10D53000C249398D4052CA4385B3991C611C862764
+:10D54000E27B7DFD02AFD3FD5BFE1F208C5662CBDC
+:10D55000459BC57833DC07C90661DD082699672439
+:10D56000EC3E49C5BC7179E8088C3F53E02337573E
+:10D570008B6CE8F4A3A30A57AD91EF631346815176
+:10D580005ED36B1BC934EEEC3E276CBC717AA77975
+:10D590003CC2F122413BE341DEFC5EA3A629239578
+:10D5A0000D627961C8CCDF448D60613859B2AAEF51
+:10D5B0000A376B9193D4A5C34630ECF6C4DFF43A36
+:10D5C000DF2E32F973373C833307E651A50E1ADF9D
+:10D5D0003C9CEAB3BF858CD30914D32D841A4057E1
+:10D5E00008E625C464F41D3286AC450B5DEEBFB67B
+:10D5F0005A239A3FBEE8E327B38640974EB80D42C0
+:10D6000058546A1A90F2DBA95DBABF2DB12EDBB572
+:10D610004B25A4307E45987B79465E3EEFA4873B40
+:10D62000B67958B6DEE1D976D99DE48F25223D1131
+:10D63000250CC2A9C3C2B3766BE50B19D2E2FE0B6F
+:10D64000A4E0DC8F5D42BDE9DC92D139A1306EB03F
+:10D650003E9D12D34AABD3AB46894D4CD6F6D5CEC0
+:10D660008EA581B2748682567CE5577D4DE8532F96
+:10D670007DC1C2FCC90F40B6549EDB141DFD86530C
+:10D6800070D51F37275A048AFBC4B2434C087FB1B8
+:10D690009A10EBDCEFA654574FCB244479698B5F8B
+:10D6A000015E157EC9B5F1EBCE178927421A7E5B64
+:10D6B0004C173160CF20089F47A6C46D1DEAC441B6
+:10D6C000D266184A961621C8CC06702086D60C4819
+:10D6D000CC50A26196CE8096127CAA25900062F56D
+:10D6E000BD6C9CE57BC895E91B70EA9E29030E9DE5
+:10D6F000AE937BBB280F565DEC6168332124A320D9
+:10D70000509AAE2381C41EAE66BA830205026662D9
+:10D71000FBF612FCAC7570F7060DE58FA17A24CDEF
+:10D72000EE6CB78F0D739398D7DBFC7EEFCA841A2B
+:10D73000C42D4B910B46EA8B535B3EDCFEC02A1A8C
+:10D7400049B3729C21649D91D26E97B8698F662D02
+:10D7500065F26A3F99A32216342D5050639AA6F6BB
+:10D76000905956DB9601A6B14AD55DC7CB313249F7
+:10D77000ED36718B44938C9A04EA6E0E5B901ADF3F
+:10D780003113C4C0E2D6679DF65D696598750B4498
+:10D790003E359C2E9F892AA4A14EEBE8E52F69D047
+:10D7A0007ED31A5647410A52B6AA286411930C3305
+:10D7B0005CD740AE96D8B23183D64B9D8C4BC71BFD
+:10D7C00047A59D7BB97EA020844C75BC67609515EC
+:10D7D000D8E11D6696C8BBF31530D16A6270E1F1DD
+:10D7E00088808C6B7617C89C4B6AF89A0B8D4938E9
+:10D7F00071FC8557F8134C0FF327BC3286B41A60BE
+:10D800001E6B9DBA2650CE3E9C78396153455721F8
+:10D81000F1ABFFE8C2D3EE8EB710E6A9FC6B6B2428
+:10D82000819F738BF6599CB2CED6095FF1BC9C41A7
+:10D83000145F9DFE178C6485A18BB6739B3F529538
+:10D84000D6C71B9EA626AD981EBD612DB78BE1D411
+:10D85000C2D01FD8550833883FF6330B38FD070A6E
+:10D860006D664CB02AC6B5F35EC117A7DB7A78E9BE
+:10D87000862FD7659EF80475B2F6DB2EE0954BD661
+:10D88000808FFDFBE0B7261961D9960ED6F4CE3015
+:10D89000A038DF1B75AECA9EF97FD55F5A24115D93
+:10D8A000FACF701B22E70D2681C344E37E75FC444A
+:10D8B0002590B18862210CD4B393B188AE1330D0D7
+:10D8C0005086482671518557B822CACEDA3619E8F3
+:10D8D0009E2F26681A997283A937D4C89739E6D043
+:10D8E000FC880B8B14F4C3BBAD49C20244EB31DAA4
+:10D8F000B2E8E3CBDEC9116AB758B4C1EB79E8C529
+:10D900008B8E9E23BBD17BD32FC8052F47B74D0BE2
+:10D9100054518A85A265EE739144CCCF8D4BBB1FC9
+:10D92000B4BA9F03A4B2A13A378ACDFEBB3F331BE2
+:10D93000B53BF4A764D844F73ACB21C5E1DA0B7ABA
+:10D94000B3A79197EF26C376147745F3CBAA39177F
+:10D950006244FA65CA2BE84CECD62820F5A727BA12
+:10D9600016E885D1583EA6376DE00CB232BF4C7A2E
+:10D97000C010770CD3D05D553F5FA5644F52869E93
+:10D980002CC6BF3DF69504C6D6CD34E186BD46868D
+:10D9900085DBD76CBA562332A70904650C4F00AB60
+:10D9A00035A7FC5632443830CC3B231A4651C48349
+:10D9B000B8AD9CC9C54B2AC028D67A8B1DC625CFC9
+:10D9C000010FEB8E5D570776B1B51609101D0B419F
+:10D9D000A916496123B18949AE0C928EEB54011E00
+:10D9E000B029F80C88F8251E9329F66832A7104C48
+:10D9F000C0E0C9E6F579DDD001EB409D78B49FAE7B
+:10DA00004FEDA289CFC74003E8C914641A5C700BBC
+:10DA100087B2BBE4ADB905FF2882EA4F66155B3DCE
+:10DA20007AF607B19415A8DA7BF9020612A9A47157
+:10DA300027074F2984C4E026B00FFDE9DC11F288E6
+:10DA40006028FEF7841F379B824F58EDB56CE66D5A
+:10DA50008B65F38F2C7FCC83E253EE76D4073C6248
+:10DA60005B1CA0E8EBCE70FCFF009C3B42FA06EA90
+:10DA700025A75300C6DD0E5068E7CD7568FE45C783
+:10DA8000829C1463A51AEA2C1D9B6BED62D27EE882
+:10DA900040C29B0F8DF8BBF4A17A2E709AF8020851
+:10DAA0003C730EEB688407BFCCAE03EB6F18D170EC
+:10DAB0006D7C044B372BEE30E34B73CD08CB6F53AB
+:10DAC000328F572C8972A6A434989972B904135EC8
+:10DAD000289244102DA517EE2D9C1D0AC7709DC0DD
+:10DAE000E10CD559F6B86A0D3F9FF775E2B31B9765
+:10DAF00087BB987FA4483CB76FD55997F0577B7682
+:10DB0000A672019985ACB3A348E77359F11DBA4CCD
+:10DB100044A7621906C325129BB4E3A7A7DC58E407
+:10DB2000FC0CCC766E1E8EE53AB482DB967C05B595
+:10DB3000EE7793B0E6DD8666A0D4F522C3937B71C1
+:10DB40009EACDA5A5A35A257F2C7808D2E759E5B6D
+:10DB50008D6BD5B91F8109D2CB790B4F2D94135101
+:10DB6000416684AF9007D9D35BD37513C475FBAA04
+:10DB700081D03059B35F93E67602A0EFF4FD7BC409
+:10DB8000AAC2BDBB110F5811354CC6DD9D475BCAFB
+:10DB90006F093C666BE822455FACD900F995820DB0
+:10DBA000DABE12C67129301EC5F5138B1B9B274B9D
+:10DBB000FD65BFDAD63CB029E2D03D8AE04BEAF4FD
+:10DBC0009A852890EAF8CF91AA93B14C4E44D1F0AF
+:10DBD000AE6F39ABB63EBC217CF62C592A08634C9B
+:10DBE00076217D3AD7DE653B4CD39BCBE9F50260CD
+:10DBF000C1C815ADCDEA804011A6956415B5348431
+:10DC0000F5C4BF9A506D829FAB41695461E6955F40
+:10DC1000967F2F39D25B14E7B8A203892613E9E077
+:10DC200065E57E2A5AE04508975F447DFB89549359
+:10DC3000C3B50111260F2E89E95FB7C73993089143
+:10DC4000B2F290133F474F492F1A985F67C39ED88F
+:10DC50005288570F5C4006984D6FF7C97959419F1C
+:10DC6000A46BB9719CC68B01D64E93DF4350FF7AEB
+:10DC700053853BDB2D041FFDE2F9365B3E814D19D8
+:10DC8000E435B54CBF9C4614F48D5E82794411D7BF
+:10DC9000467B0EB2B488FC93C3F75BE29099B4D391
+:10DCA00081F7042FCA3162AFDCA124FE168C2DE56A
+:10DCB0001227F18DC4B61F83C673949437C0396C94
+:10DCC000D06AB48E9205B8CD90B1F6E106AF84C5A6
+:10DCD0002AF818283967258FCDBA47C3E78C5EDA52
+:10DCE000104E0B23184D053F25280AAA58E0902F07
+:10DCF000B3D8F598596BE2D69AA2AAD59B7ADD14CF
+:10DD0000EB0583C25F8714B9DF6F4A4EF1CE866F91
+:10DD10001D02FE073BB902C1FD3912D8C3400D53A5
+:10DD200052CD2CDCB46B7B90C6A438C53E9604194A
+:10DD3000A66BD9E3AF90BCBCCE784786E6F6AEC8FA
+:10DD4000AE2BDC72A105E6F122CD61C18D9BF528D9
+:10DD500036B5FCC75327FAE5FB8E2650A17D32EA83
+:10DD60001E165C6EA89F9EDDD320BCB4A75B519E9F
+:10DD70001FD588328BDCF15348C057A9272DD848CE
+:10DD80008DD7C3D13E4C5F2485F00A899B544CD774
+:10DD900007FC6F105DD8EA945893648ADCA5B6AD91
+:10DDA00036FF41197622267130C352B1EF936A10C3
+:10DDB0005F81D86B932A201F139506855B126171D2
+:10DDC000ABBD3839EE7542646AB316439F35C5D989
+:10DDD000411BE1389D693B2B732E351F8246D916B6
+:10DDE0005A7180C1D74BB1235ABF689A8E29C68712
+:10DDF000009E0AE63F37091C39F6E89CB43C894B83
+:10DE000009A5B0C86D779FD017689A777A47BFF396
+:10DE100059637FF65911AE528A9B0DEF7ED87395E8
+:10DE2000379E4D36E608657F27D2E13E5A75BB66C0
+:10DE30002722FEB440B8962F5AF679B8010E84BC5A
+:10DE40009599CF9546D52FA38D876DAE684BBFB4FE
+:10DE500082916686889FA15895506853DB261FCE15
+:10DE60008C05F209CDE71376B477EE33ADDB81484C
+:10DE700042D353742CB75F83F7C1AD4C0719C33637
+:10DE8000F027C33FED13E5B522C178F4668DCDB818
+:10DE9000CB021567740D3D71804408AC272ED04F1E
+:10DEA0009F7AB7C458F3F586671921AF7B657DF279
+:10DEB000F91C70AF89596F473B29A0F7AF58BBD900
+:10DEC000F25363F2B9ECBA33516DE828A2E38FC87C
+:10DED00005F7CCD453D9D5E4A0992CCD1C189F13A9
+:10DEE000C0FCDCB7A109B23B61DFA9B55A99E9E1F1
+:10DEF000D0DADF38176FA696C530E82836DFC41EA3
+:10DF00002D49C80D70E883EEBC4D6DA2E7EB812072
+:10DF1000E4CDDD1E5A0D0E2AEF523A629A60D0DF30
+:10DF2000A1750D3C20550FA821F558C109C708025D
+:10DF3000CDA61F0042724EAB2F84A4B3ECF685E150
+:10DF4000000606BEE99E3AE0167D0D9B6ADA2BA616
+:10DF500058EDD18D120C7B47281567395288EF3D5B
+:10DF6000CD99BD95D8884A21B3E8169BBCF9BBC1B1
+:10DF7000F45EF737177602859FED888F783434F298
+:10DF80003F6A9186AB877E3500F8739877DB61DF57
+:10DF9000688CA3563A44FA9F5ECAE46AF8550FF2B9
+:10DFA000F9F71C09B6A0C16D8EF7A115029E05A256
+:10DFB00043418CF6BB313C4C1183197FDB73E199F3
+:10DFC0003122785333586C0791788B242B7979243C
+:10DFD000A129F9D3B81AB6C77E7F44898B34746EF1
+:10DFE000381D5CBC13B9891F93D0E20BCEA39E4BA6
+:10DFF000D07E4B48AEF8ED056C9EEE15C263C5EDC4
+:10E000007DCBAA90C021D981AB600E74CC345080F6
+:10E01000C405ED2A1D114176E0C308E93469417950
+:10E0200026BBDCEFF6634FB71C12862CCE7630FC95
+:10E030000E5CBF50F78EBF2CB50A269E706D4C3813
+:10E04000FEF33BFDF2DFE8C3AEBCC00A841CFCFD5E
+:10E05000C5E206B91056D6E5F2F5BD43E5E5FB7914
+:10E06000672B4122E418A4F0289D6819687BC0A2A0
+:10E0700066500303FF90839FD078B3B302E42D2250
+:10E08000EAEFB1D257C33DF27C07D3AFB561E06D83
+:10E09000A2F47109DE4A131B8F715CCB345ACD1187
+:10E0A000A1FA1F4F31BA60EA4E449FAFA4177525FD
+:10E0B000DEAFC9A043F8F8A87B85AEA05646C6B32C
+:10E0C000DA0F76530689B5DA7E490162073BC95FEC
+:10E0D000AD59C0105AE3806C3D79B4A14DE70A8D6B
+:10E0E00002C9F3EBA8D481BF4E6995CD638BD6DB13
+:10E0F00071055599FF99DB04C6B51E3FCDCCB5021D
+:10E100008CB478813F3F202739689D0AEF738D23B7
+:10E1100090FDAEBF2F11D02130A81F778DAE2E7E7F
+:10E12000D58A710355E36A013BD86A82B10104DAEA
+:10E13000F298A6CB24A5CA20B093E80945C5502380
+:10E14000AF1E349361234B9D8CDC02058BE0507E27
+:10E1500003C17A5CB223E7D0E60B78406DE4A1DE20
+:10E1600030B4C85C6684096ABFE8D75F512E17DFF8
+:10E170002E36ADE8619DA6AB8B034161DAB9DA2793
+:10E18000629BE0518894AF1F04317104790A1F7AB1
+:10E190007162526D9730A9532FB1AF26A93444F95B
+:10E1A000A03B4E6D3066D2E3CE9DD7A59632E6B544
+:10E1B0003D4EA12483CFBA6F810DCA73E517A7C660
+:10E1C000EB35D602C70FD4E7A68572F63DC7804867
+:10E1D00052B983822EA95AAA65A81BBF7048BF3ABC
+:10E1E000C736886151A4541EB20D9C33D62AE5135C
+:10E1F000A17179DADEBF38D3C72EFE7AE8710E8EB0
+:10E2000048306276F943F63F573D4B61F56CC5FEE9
+:10E210001CEB4ADF1C3316328CC07AEC9761340455
+:10E22000E8C8EA2BF72AF4D83284110581E5A26800
+:10E230009605260B81BE88B84E29C648C83C87C6BD
+:10E240001EEB8BACF4CB79F39F4B347488EC8F448A
+:10E250000099B1E9B245FBBBDC3660B6DD7F0C0648
+:10E26000E87CD80123E76B08A1448A2CC2EEE4C302
+:10E27000CD7C1A2C93F7DE8E0E055614E815AB6094
+:10E28000C25F5E39460E9E449AF754CF845E45C005
+:10E29000CF638F8140F55FDEDBDC1D523382726518
+:10E2A00028186FCAEEE1B46E13953995F6E655DF7E
+:10E2B000F867F861A3FEE504B0B16EB47091DBB00D
+:10E2C00078F4B1EFB81BC42C0604F491C3BC44B974
+:10E2D0009F800D167F379B5A810BD3CE8ADCA1C657
+:10E2E0002BEE483D3B665281FF6B1843DC4F109F7D
+:10E2F0009F6F037FD58F36B7B1B075ED55F65F21AF
+:10E300003615F5461B5AD511B866ACC6D1DC2EBF02
+:10E310002618A9193D8566CD000702513C1654F90F
+:10E320009A315B4A895A17751DE2887E43064F9CD5
+:10E33000662AAF8BE06EBBD69D11831CA310233ED3
+:10E3400092C4D7C90A08C88C7A180E0F07B17BD1BE
+:10E350007B0DF98AB3E1F6071254779812D5A5E53B
+:10E36000D57B77B15457D4DB4DDAE722042B01ACCF
+:10E370003F213E44B6C837C73E4D9D98ED77711793
+:10E38000AC77028C1EC6DD3EC1C79C0EA6DC933F57
+:10E3900051E2BF510AE2CE1CD1DCF29B4C4CF2E1BF
+:10E3A000F58C8541399655E8EE696599F83FC80CBA
+:10E3B0003672D854E82D23330C224952AEFCA68481
+:10E3C000737EE3F12C2464425BD522077F85BF85F1
+:10E3D000003ED4E4637EC07E8C50B2A6C51CFC8790
+:10E3E00062FBFA3D8293337002EB6F2BFB7794490B
+:10E3F0001317C78203B79734C10D0D18F0DCB35063
+:10E400009103412DFDB6313E1F8B1A3114FB1A24A6
+:10E41000A508C2A986EE12F09FB78107C145FB3A55
+:10E42000CCFEBCEECDAAA36C42B47D4F4CF54EC1E0
+:10E430002FB30D1BB0A189CFEE9720F922A54C5721
+:10E4400054FFB27C89E95A242AD06D2B02C5AD3520
+:10E45000021F2227FA628F20E8AA4438630631851A
+:10E4600073D78DDDE9CBDE90C9CE0A2563B94E8422
+:10E470001A5717BD219111CE5E607DD9D903255B56
+:10E48000DACB6310D076E3CD4CB2A6633C9FF4FBAD
+:10E49000ECE1A3D2F7FBA37312D474D478C350B6C3
+:10E4A0001653F31967FDA3C52FEBA329F08D222086
+:10E4B000ECFAD56581CF8A0D816F861ABAB156AE56
+:10E4C000F527EA9CF07B594246E06020C210A7BFC6
+:10E4D000F627AB22D00A1DA4AB52FDCFCFBB9FD5F0
+:10E4E00074858A8655BF9F09436212668823C25786
+:10E4F0000A9CC4A43FEB10DBCD6FBC5D124E31B55E
+:10E5000072E3B6C1252392E49D645E0BD0CF34E460
+:10E510003C100FBB9AB1AA2A4371B17A804DDA241C
+:10E52000E0142EBFEB3A4AFC4068935A1E48838D94
+:10E530006D043F58FB0C5972747FEB4D29CB345559
+:10E54000192A772146DED53E00215BC8A236780421
+:10E55000B009B2501FEEC482AA73A39A73E81707DA
+:10E560000B4C11047F12B6E804E173B2805444A549
+:10E57000E4DFD282B8A9B3207778CF1EFDBD49BEB3
+:10E5800019F5BCF4D542CF327A27A46DC1D9B66C47
+:10E59000E7E6DC2ED278369FE2EA722A01616C83CC
+:10E5A000980908B402D05A42B3E0A788CBB6827F5C
+:10E5B000376D11A08277387516223D24EFCB2FA43A
+:10E5C000A13B24C8A2EC2B2781E7B4E3AA16C042E2
+:10E5D000398C0ABBE0DE2EF0CFD29F92F0DCD06502
+:10E5E000A326DD45FD0479989AF712DBF64827D576
+:10E5F00085B0E2A38F1D3AEF06DD7B7D28CD534D1C
+:10E600009EA2EB6C24A4C507854FF0214250CC4458
+:10E61000B391CF048450A23FE48CA1C2779B5835BC
+:10E62000FD526E4AE3CF9D084BF34FECFFCDDEF673
+:10E630009BAE45F0CC6A1DBE13E9C228DE60D10E48
+:10E64000014280F86490581273C9A64678F2BED78A
+:10E65000E8E2CD8FB8CF07CD7305F6F05E2E0C6AD9
+:10E6600008039297AC35B141C95917D245D7432C0D
+:10E6700000346B93A1041C5A1232B1EB02C512A3F1
+:10E68000B44314A27C8C189D2108F93B3DC767C296
+:10E6900033B8EC0A8404919C19D67FCE77637387D4
+:10E6A000BCA0762530E99AF91BD0D6EF9F2C5E7E70
+:10E6B000899BC7F5FC9B951FFFEA471C634FB392EC
+:10E6C0003CD1FFA76DF409BE34229C31B66B4D508E
+:10E6D000FFAEBA7D2D9C1E040191B1576CBA8355D3
+:10E6E0003113192D293FA160325A348DA289386C1B
+:10E6F000C42ADBC76ED6CFBD1EB108B060AA69B40C
+:10E700004EF096350EDA8F08A69BC220A7CE289F22
+:10E7100014005AA9F0DFA0572C7A115F74F461C776
+:10E72000BED6C9B0A0E43BA3BD9FD7D5D800B46185
+:10E730006C11F0AFEBDE0B90EAD72AC535A6503D41
+:10E740004E490F7B6455E7C5582DBBB6A1E5D1A84E
+:10E75000727EAF904EF1A090D3FA21AC92A0B9EEA8
+:10E760001C26DF559BC3FA5568DEAC1DC36DCFB1C7
+:10E7700014AD1A57D8CEDDAFE2D470E4AD6C27D417
+:10E78000A7459886E186D2C843E84E8AED018F3FBF
+:10E79000E0F8FF057D8D10DC5D00F598C8949E2D96
+:10E7A0008B41AD8EA6FFDE7F44F9B78D05BA00BF61
+:10E7B00009D09C881BF7504B48709BCBD6E5B2A87C
+:10E7C000D0D2CC38A54FE416B76CC0835B4AB39463
+:10E7D0001ED052BF03F34A21A514DA0E14BA34B581
+:10E7E000E58B578FD18460B0443AD17DFA9E7EC9C3
+:10E7F000F419B693E690E783C4ED5C2968FB3D53BA
+:10E80000207C1FB16ECD21470A754343D2B51FE767
+:10E81000152C658F512915F9C8F63C9794F89A8202
+:10E8200088683EB2C895E63FDAEBEC5B338417F3B9
+:10E8300048D3CED64745B919C67B4CD159540E8B17
+:10E840007073552E24B1D9B9CE6816DD4D7247E5E7
+:10E85000E0C25AF5AC0BB8E6274BD3F9F1E9282C06
+:10E86000291AA53382C86019A30B169D6F49208809
+:10E870004730265EB4538535F39DB6BE08FDA4939C
+:10E88000CC7662C7DA3FAD907FDD06382CA44B9C76
+:10E8900030E9695BC18098EDC0D01849FFB779B500
+:10E8A000A1CFBB2A5FF0502BE13506B4AB552CD07D
+:10E8B0004C1CEFFA563E9DD24243FA9539BF27973A
+:10E8C0005F2B32D32003BC4BF3B0BDA4989F1764D9
+:10E8D000373828F25B0D3627E22248545AA60E9F9D
+:10E8E00023CF0B4028CF452A7F222E4B65D925D92F
+:10E8F0001FD742BC5A5F317130EA2E5A2D99B8FBAE
+:10E90000348E0622940EFBF2AB43C2CB0D2E14FCC8
+:10E910007500576B569A8BF1F5209CC2067F9C962A
+:10E920007BA7AE795FB660BEAB82743D52B545152C
+:10E93000BC2DC30F0D26FA6837141C0C0920BD1A14
+:10E94000FFFFFFFF110000000000000000000000BA
+:10E9500000000000000000000008000060E9010065
+:10E9600000000000000000000000000000000000A7
+:10E970000000000000000000000000000000000097
+:10E980000000000000000000000000000000000087
+:10E990000000000000000000000000000000000077
+:10E9A0000000000000000000000000000000000067
+:10E9B0000000000000000000000000000000000057
+:10E9C0000000000000000000000000000000000047
+:10E9D0000000000000000000000000000000000037
+:10E9E0000000000000000000000000000000000027
+:10E9F0000000000000000000000000000000000017
+:10EA00000000000000000000000000000000000006
+:10EA100000000000000000000000000000000000F6
+:10EA200000000000000000000000000000000000E6
+:10EA300000000000000000000000000000000000D6
+:10EA400000000000000000000000000000000000C6
+:10EA500000000000000000000000000000000000B6
+:10EA600000000000000000000000000000000000A6
+:10EA70000000000000000000000000000000000096
+:10EA80000000000000000000000000000000000086
+:10EA90000000000000000000000000000000000076
+:10EAA0000000000000000000000000000000000066
+:10EAB0000000000000000000000000000000000056
+:10EAC0000000000000000000000000000000000046
+:10EAD0000000000000000000000000000000000036
+:10EAE0000000000000000000000000000000000026
+:10EAF0000000000000000000000000000000000016
+:10EB00000000000000000000000000000000000005
+:10EB100000000000000000000000000000000000F5
+:10EB200000000000000000000000000000000000E5
+:10EB300000000000000000000000000000000000D5
+:10EB400000000000000000000000000000000000C5
+:10EB500000000000000000000000000000000000B5
+:10EB600000000000000000000000000000000000A5
+:10EB70000000000000000000000000000000000095
+:10EB80000000000000000000000000000000000085
+:10EB90000000000000000000000000000000000075
+:10EBA0000000000000000000000000000000000065
+:10EBB0000000000000000000000000000000000055
+:10EBC0000000000000000000000000000000000045
+:10EBD0000000000000000000000000000000000035
+:10EBE0000000000000000000000000000000000025
+:10EBF0000000000000000000000000000000000015
+:10EC00000000000000000000000000000000000004
+:10EC100000000000000000000000000000000000F4
+:10EC200000000000000000000000000000000000E4
+:10EC300000000000000000000000000000000000D4
+:10EC400000000000000000000000000000000000C4
+:10EC500000000000000000000000000000000000B4
+:10EC600000000000000000000000000000000000A4
+:10EC70000000000000000000000000000000000094
+:10EC80000000000000000000000000000000000084
+:10EC90000000000000000000000000000000000074
+:10ECA0000000000000000000000000000000000064
+:10ECB0000000000000000000000000000000000054
+:10ECC0000000000000000000000000000000000044
+:10ECD0000000000000000000000000000000000034
+:10ECE0000000000000000000000000000000000024
+:10ECF0000000000000000000000000000000000014
+:10ED00000000000000000000000000000000000003
+:10ED100000000000000000000000000000000000F3
+:10ED200000000000000000000000000000000000E3
+:10ED300000000000000000000000000000000000D3
+:10ED400000000000000000000000000000000000C3
+:10ED500000000000000000000000000000000000B3
+:10ED600000000000000000000000000000000000A3
+:10ED70000000000000000000000000000000000093
+:10ED80000000000000000000000000000000000083
+:10ED90000000000000000000000000000000000073
+:10EDA0000000000000000000000000000000000063
+:10EDB0000000000000000000000000000000000053
+:10EDC0000000000000000000000000000000000043
+:10EDD0000000000000000000000000000000000033
+:10EDE0000000000000000000000000000000000023
+:10EDF0000000000000000000000000000000000013
+:10EE00000000000000000000000000000000000002
+:10EE100000000000000000000000000000000000F2
+:10EE200000000000000000000000000000000000E2
+:10EE300000000000000000000000000000000000D2
+:10EE400000000000000000000000000000000000C2
+:10EE500000000000000000000000000000000000B2
+:10EE600000000000000000000000000000000000A2
+:10EE70000000000000000000000000000000000092
+:10EE80000000000000000000000000000000000082
+:10EE90000000000000000000000000000000000072
+:10EEA0000000000000000000000000000000000062
+:10EEB0000000000000000000000000000000000052
+:10EEC0000000000000000000000000000000000042
+:10EED0000000000000000000000000000000000032
+:10EEE0000000000000000000000000000000000022
+:10EEF0000000000000000000000000000000000012
+:10EF00000000000000000000000000000000000001
+:10EF100000000000000000000000000000000000F1
+:10EF200000000000000000000000000000000000E1
+:10EF300000000000000000000000000000000000D1
+:10EF400000000000000000000000000000000000C1
+:10EF500000000000000000000000000000000000B1
+:10EF600000000000000000000000000000000000A1
+:10EF70000000000000000000000000000000000091
+:10EF80000000000000000000000000000000000081
+:10EF90000000000000000000000000000000000071
+:10EFA0000000000000000000000000000000000061
+:10EFB0000000000000000000000000000000000051
+:10EFC0000000000000000000000000000000000041
+:10EFD0000000000000000000000000000000000031
+:10EFE0000000000000000000000000000000000021
+:10EFF0000000000000000000000000000000000011
+:10F000000000000000000000000000000000000000
+:10F0100000000000000000000000000000000000F0
+:10F0200000000000000000000000000000000000E0
+:10F0300000000000000000000000000000000000D0
+:10F0400000000000000000000000000000000000C0
+:10F0500000000000000000000000000000000000B0
+:10F0600000000000000000000000000000000000A0
+:10F070000000000000000000000000000000000090
+:10F080000000000000000000000000000000000080
+:10F090000000000000000000000000000000000070
+:10F0A0000000000000000000000000000000000060
+:10F0B0000000000000000000000000000000000050
+:10F0C0000000000000000000000000000000000040
+:10F0D0000000000000000000000000000000000030
+:10F0E0000000000000000000000000000000000020
+:10F0F0000000000000000000000000000000000010
+:10F1000000000000000000000000000000000000FF
+:10F1100000000000000000000000000000000000EF
+:10F1200000000000000000000000000000000000DF
+:10F1300000000000000000000000000000000000CF
+:10F1400000000000000000000000000000000000BF
+:10F1500000000000000000000000000000000000AF
+:10F16000FFFFFFFF0E000000000000000000000095
+:10F1700000000000000000001000000080F101000D
+:10F18000000000000000000000000000FFFFFFFF83
+:10F19000BCAA6B7603000000000000000000000025
+:10F1A000000000000000000010000000B0F10100AD
+:10F1B0000707000010C9010040E9010060F10100EB
+:10F1C000B641A3D3090000000000000000000000C9
+:10F1D000000000000000000010000000E0F101004D
+:10F1E00049324300FF00FF000C0D2000000000002A
+:10F1F000B641A3D30A000000000000000000000098
+:10F2000000000000000000001000000010F20100EB
+:10F2100049324300FF00FF000C0D200000000000F9
+:10F22000FFFFFFFF100000000000000000000000D2
+:10F2300000000000000000000002000040F2010099
+:10F2400000000000000000000000000000000000BE
+:10F2500000000000000000000000000000000000AE
+:10F26000000000000000000000000000000000009E
+:10F27000000000000000000000000000000000008E
+:10F28000000000000000000000000000000000007E
+:10F29000000000000000000000000000000000006E
+:10F2A000000000000000000000000000000000005E
+:10F2B000000000000000000000000000000000004E
+:10F2C000000000000000000000000000000000003E
+:10F2D000000000000000000000000000000000002E
+:10F2E000000000000000000000000000000000001E
+:10F2F000000000000000000000000000000000000E
+:10F3000000000000000000000000000000000000FD
+:10F3100000000000000000000000000000000000ED
+:10F3200000000000000000000000000000000000DD
+:10F3300000000000000000000000000000000000CD
+:10F3400000000000000000000000000000000000BD
+:10F3500000000000000000000000000000000000AD
+:10F36000000000000000000000000000000000009D
+:10F37000000000000000000000000000000000008D
+:10F38000000000000000000000000000000000007D
+:10F39000000000000000000000000000000000006D
+:10F3A000000000000000000000000000000000005D
+:10F3B000000000000000000000000000000000004D
+:10F3C000000000000000000000000000000000003D
+:10F3D000000000000000000000000000000000002D
+:10F3E000000000000000000000000000000000001D
+:10F3F000000000000000000000000000000000000D
+:10F4000000000000000000000000000000000000FC
+:10F4100000000000000000000000000000000000EC
+:10F4200000000000000000000000000000000000DC
+:10F4300000000000000000000000000000000000CC
+:10F44000841C5DD4170000000000000000000000D4
+:10F450000000000000000000FC0F000060F401004C
+:10F460000610FE07000280020000000000000000FD
+:10F47000000000000000000000000000000000008C
+:10F48000000000000000000000000000000000007C
+:10F49000000000000000000000000000000000006C
+:10F4A000000000000000000000000000000000005C
+:10F4B000000000000000000000000000000000004C
+:10F4C000000000000000000000000000000000003C
+:10F4D000000000000000000000000000000000002C
+:10F4E000000000000000000000000000000000001C
+:10F4F000000000000000000000000000000000000C
+:10F5000000000000000000000000000000000000FB
+:10F5100000000000000000000000000000000000EB
+:10F5200000000000000000000000000000000000DB
+:10F5300000000000000000000000000000000000CB
+:10F5400000000000000000000000000000000000BB
+:10F5500000000000000000000000000000000000AB
+:10F56000000000000000000000000000000000009B
+:10F57000000000000000000000000000000000008B
+:10F58000000000000000000000000000000000007B
+:10F59000000000000000000000000000000000006B
+:10F5A000000000000000000000000000000000005B
+:10F5B000000000000000000000000000000000004B
+:10F5C000000000000000000000000000000000003B
+:10F5D000000000000000000000000000000000002B
+:10F5E000000000000000000000000000000000001B
+:10F5F000000000000000000000000000000000000B
+:10F6000000000000000000000000000000000000FA
+:10F6100000000000000000000000000000000000EA
+:10F6200000000000000000000000000000000000DA
+:10F6300000000000000000000000000000000000CA
+:10F6400000000000000000000000000000000000BA
+:10F6500000000000000000000000000000000000AA
+:10F66000000000000000000000000000000000009A
+:10F67000000000000000000000000000000000008A
+:10F68000000000000000000000000000000000007A
+:10F69000000000000000000000000000000000006A
+:10F6A000000000000000000000000000000000005A
+:10F6B000000000000000000000000000000000004A
+:10F6C000000000000000000000000000000000003A
+:10F6D000000000000000000000000000000000002A
+:10F6E000000000000000000000000000000000001A
+:10F6F000000000000000000000000000000000000A
+:10F7000000000000000000000000000000000000F9
+:10F7100000000000000000000000000000000000E9
+:10F7200000000000000000000000000000000000D9
+:10F7300000000000000000000000000000000000C9
+:10F7400000000000000000000000000000000000B9
+:10F7500000000000000000000000000000000000A9
+:10F760000000000000000000000000000000000099
+:10F770000000000000000000000000000000000089
+:10F780000000000000000000000000000000000079
+:10F790000000000000000000000000000000000069
+:10F7A0000000000000000000000000000000000059
+:10F7B0000000000000000000000000000000000049
+:10F7C0000000000000000000000000000000000039
+:10F7D0000000000000000000000000000000000029
+:10F7E0000000000000000000000000000000000019
+:10F7F0000000000000000000000000000000000009
+:10F8000000000000000000000000000000000000F8
+:10F8100000000000000000000000000000000000E8
+:10F8200000000000000000000000000000000000D8
+:10F8300000000000000000000000000000000000C8
+:10F8400000000000000000000000000000000000B8
+:10F8500000000000000000000000000000000000A8
+:10F860000000000000000000000000000000000098
+:10F870000000000000000000000000000000000088
+:10F880000000000000000000000000000000000078
+:10F890000000000000000000000000000000000068
+:10F8A0000000000000000000000000000000000058
+:10F8B0000000000000000000000000000000000048
+:10F8C0000000000000000000000000000000000038
+:10F8D0000000000000000000000000000000000028
+:10F8E0000000000000000000000000000000000018
+:10F8F0000000000000000000000000000000000008
+:10F9000000000000000000000000000000000000F7
+:10F9100000000000000000000000000000000000E7
+:10F9200000000000000000000000000000000000D7
+:10F9300000000000000000000000000000000000C7
+:10F9400000000000000000000000000000000000B7
+:10F9500000000000000000000000000000000000A7
+:10F960000000000000000000000000000000000097
+:10F970000000000000000000000000000000000087
+:10F980000000000000000000000000000000000077
+:10F990000000000000000000000000000000000067
+:10F9A0000000000000000000000000000000000057
+:10F9B0000000000000000000000000000000000047
+:10F9C0000000000000000000000000000000000037
+:10F9D0000000000000000000000000000000000027
+:10F9E0000000000000000000000000000000000017
+:10F9F0000000000000000000000000000000000007
+:10FA000000000000000000000000000000000000F6
+:10FA100000000000000000000000000000000000E6
+:10FA200000000000000000000000000000000000D6
+:10FA300000000000000000000000000000000000C6
+:10FA400000000000000000000000000000000000B6
+:10FA500000000000000000000000000000000000A6
+:10FA60000000000000000000000000000000000096
+:10FA70000000000000000000000000000000000086
+:10FA80000000000000000000000000000000000076
+:10FA90000000000000000000000000000000000066
+:10FAA0000000000000000000000000000000000056
+:10FAB0000000000000000000000000000000000046
+:10FAC0000000000000000000000000000000000036
+:10FAD0000000000000000000000000000000000026
+:10FAE0000000000000000000000000000000000016
+:10FAF0000000000000000000000000000000000006
+:10FB000000000000000000000000000000000000F5
+:10FB100000000000000000000000000000000000E5
+:10FB200000000000000000000000000000000000D5
+:10FB300000000000000000000000000000000000C5
+:10FB400000000000000000000000000000000000B5
+:10FB500000000000000000000000000000000000A5
+:10FB60000000000000000000000000000000000095
+:10FB70000000000000000000000000000000000085
+:10FB80000000000000000000000000000000000075
+:10FB90000000000000000000000000000000000065
+:10FBA0000000000000000000000000000000000055
+:10FBB0000000000000000000000000000000000045
+:10FBC0000000000000000000000000000000000035
+:10FBD0000000000000000000000000000000000025
+:10FBE0000000000000000000000000000000000015
+:10FBF0000000000000000000000000000000000005
+:10FC000000000000000000000000000000000000F4
+:10FC100000000000000000000000000000000000E4
+:10FC200000000000000000000000000000000000D4
+:10FC300000000000000000000000000000000000C4
+:10FC400000000000000000000000000000000000B4
+:10FC500000000000000000000000000000000000A4
+:10FC60000000000000000000000000000000000094
+:10FC70000000000000000000000000000000000084
+:10FC80000000000000000000000000000000000074
+:10FC90000000000000000000000000000000000064
+:10FCA0000000000000000000000000000000000054
+:10FCB0000000000000000000000000000000000044
+:10FCC0000000000000000000000000000000000034
+:10FCD0000000000000000000000000000000000024
+:10FCE0000000000000000000000000000000000014
+:10FCF0000000000000000000000000000000000004
+:10FD000000000000000000000000000000000000F3
+:10FD100000000000000000000000000000000000E3
+:10FD200000000000000000000000000000000000D3
+:10FD300000000000000000000000000000000000C3
+:10FD400000000000000000000000000000000000B3
+:10FD500000000000000000000000000000000000A3
+:10FD60000000000000000000000000000000000093
+:10FD70000000000000000000000000000000000083
+:10FD80000000000000000000000000000000000073
+:10FD90000000000000000000000000000000000063
+:10FDA0000000000000000000000000000000000053
+:10FDB0000000000000000000000000000000000043
+:10FDC0000000000000000000000000000000000033
+:10FDD0000000000000000000000000000000000023
+:10FDE0000000000000000000000000000000000013
+:10FDF0000000000000000000000000000000000003
+:10FE000000000000000000000000000000000000F2
+:10FE100000000000000000000000000000000000E2
+:10FE200000000000000000000000000000000000D2
+:10FE300000000000000000000000000000000000C2
+:10FE400000000000000000000000000000000000B2
+:10FE500000000000000000000000000000000000A2
+:10FE60000000000000000000000000000000000092
+:10FE70000000000000000000000000000000000082
+:10FE80000000000000000000000000000000000072
+:10FE90000000000000000000000000000000000062
+:10FEA0000000000000000000000000000000000052
+:10FEB0000000000000000000000000000000000042
+:10FEC0000000000000000000000000000000000032
+:10FED0000000000000000000000000000000000022
+:10FEE0000000000000000000000000000000000012
+:10FEF0000000000000000000000000000000000002
+:10FF000000000000000000000000000000000000F1
+:10FF100000000000000000000000000000000000E1
+:10FF200000000000000000000000000000000000D1
+:10FF300000000000000000000000000000000000C1
+:10FF400000000000000000000000000000000000B1
+:10FF500000000000000000000000000000000000A1
+:10FF60000000000000000000000000000000000091
+:10FF70000000000000000000000000000000000081
+:10FF80000000000000000000000000000000000071
+:10FF90000000000000000000000000000000000061
+:10FFA0000000000000000000000000000000000051
+:10FFB0000000000000000000000000000000000041
+:10FFC0000000000000000000000000000000000031
+:10FFD0000000000000000000000000000000000021
+:10FFE0000000000000000000000000000000000011
+:10FFF0000000000000000000000000000000000001
+:020000022000DC
+:1000000000000000000000000000000000000000F0
+:1000100000000000000000000000000000000000E0
+:1000200000000000000000000000000000000000D0
+:1000300000000000000000000000000000000000C0
+:1000400000000000000000000000000000000000B0
+:1000500000000000000000000000000000000000A0
+:100060000000000000000000000000000000000090
+:100070000000000000000000000000000000000080
+:100080000000000000000000000000000000000070
+:100090000000000000000000000000000000000060
+:1000A0000000000000000000000000000000000050
+:1000B0000000000000000000000000000000000040
+:1000C0000000000000000000000000000000000030
+:1000D0000000000000000000000000000000000020
+:1000E0000000000000000000000000000000000010
+:1000F0000000000000000000000000000000000000
+:1001000000000000000000000000000000000000EF
+:1001100000000000000000000000000000000000DF
+:1001200000000000000000000000000000000000CF
+:1001300000000000000000000000000000000000BF
+:1001400000000000000000000000000000000000AF
+:10015000000000000000000000000000000000009F
+:10016000000000000000000000000000000000008F
+:10017000000000000000000000000000000000007F
+:10018000000000000000000000000000000000006F
+:10019000000000000000000000000000000000005F
+:1001A000000000000000000000000000000000004F
+:1001B000000000000000000000000000000000003F
+:1001C000000000000000000000000000000000002F
+:1001D000000000000000000000000000000000001F
+:1001E000000000000000000000000000000000000F
+:1001F00000000000000000000000000000000000FF
+:1002000000000000000000000000000000000000EE
+:1002100000000000000000000000000000000000DE
+:1002200000000000000000000000000000000000CE
+:1002300000000000000000000000000000000000BE
+:1002400000000000000000000000000000000000AE
+:10025000000000000000000000000000000000009E
+:10026000000000000000000000000000000000008E
+:10027000000000000000000000000000000000007E
+:10028000000000000000000000000000000000006E
+:10029000000000000000000000000000000000005E
+:1002A000000000000000000000000000000000004E
+:1002B000000000000000000000000000000000003E
+:1002C000000000000000000000000000000000002E
+:1002D000000000000000000000000000000000001E
+:1002E000000000000000000000000000000000000E
+:1002F00000000000000000000000000000000000FE
+:1003000000000000000000000000000000000000ED
+:1003100000000000000000000000000000000000DD
+:1003200000000000000000000000000000000000CD
+:1003300000000000000000000000000000000000BD
+:1003400000000000000000000000000000000000AD
+:10035000000000000000000000000000000000009D
+:10036000000000000000000000000000000000008D
+:10037000000000000000000000000000000000007D
+:10038000000000000000000000000000000000006D
+:10039000000000000000000000000000000000005D
+:1003A000000000000000000000000000000000004D
+:1003B000000000000000000000000000000000003D
+:1003C000000000000000000000000000000000002D
+:1003D000000000000000000000000000000000001D
+:1003E000000000000000000000000000000000000D
+:1003F00000000000000000000000000000000000FD
+:1004000000000000000000000000000000000000EC
+:1004100000000000000000000000000000000000DC
+:1004200000000000000000000000000000000000CC
+:1004300000000000000000000000000000000000BC
+:1004400000000000000000000000000000000000AC
+:10045000000000000000000000000000000000009C
+:1004600041F482E8160000000000000000000000D7
+:1004700000000000000000000400000080040200F2
+:1004800040F4010000000000000000000000000037
+:10049000F1BD398E0C0000000000000000000000DB
+:1004A0000000000000000000B1030000B0040200E2
+:1004B0000001000100020002000100010001000132
+:1004C00000500005000200020020000100010001B0
+:1004D000000100010001000F00150007000F0004DB
+:1004E0000008000A000300010002000400090001E6
+:1004F000000D0001001000100013000E00010001AB
+:1005000000020004000500020002000200040001D5
+:1005100000010001000100010001000100010001D3
+:1005200000010001000100010001000100010001C3
+:1005300000010001000100010001000100010001B3
+:100540000001000100100010000100010001000185
+:100550000001000100010001000100010001000193
+:100560000002000000000000000000000000000089
+:10057000000000000000000000000000000000007B
+:10058000000000000000000000000000000000006B
+:10059000000000000000000000000000000000005B
+:1005A000000000000000000000000000000000004B
+:1005B000000000000000000000000000000000003B
+:1005C000000000000000000000000000000000002B
+:1005D000000000000000000000000000000000001B
+:1005E000000000000000000000000000000000000B
+:1005F00000000000000000000000000000000000FB
+:1006000000000000000000000000000000000000EA
+:1006100000000000000000000000000000000000DA
+:1006200000000000000000000000000000000000CA
+:1006300000000000000000000000000000000000BA
+:1006400000000000000000000000000000000000AA
+:10065000000000000000000000000000000000009A
+:100660000000000000000000000000010001000187
+:100670000001000100010001000100010001000172
+:100680000001000100010001000100010001000162
+:10069000000000000000000000000000000000005A
+:1006A0000000000000000000000000000000000149
+:1006B000000000000000000000000000000000003A
+:1006C000000000000000000000000000000000002A
+:1006D000000000000000000000000000000000001A
+:1006E000000000000000000000000000000000000A
+:1006F00000000000000000000000000000000000FA
+:1007000000000000000000000000000000000000E9
+:1007100000000000000000000000000000000000D9
+:1007200000000000000000000000000000000000C9
+:100730000000000004FF030E050E9F05FF090040A6
+:100740000040000000001E1E011E05E4159E052D40
+:1007500037FE3AFEF0D2F0D28280C4C405030532DF
+:10076000800F0A200001010704040AC0196426262C
+:1007700080800000C0535B80801901404032FF0040
+:10078000000000004C046C073C3200000000050A29
+:100790002C012C0100000000000000001300000CE0
+:1007A000195802190C1E00050A2C01FFFFFFFFFF5C
+:1007B000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF49
+:1007C000FFFFFFFFFFFFFFFFFFFFFFFF0100000034
+:1007D0000000000000000000000000000000000118
+:1007E000006400200332000A0096000A0000080797
+:1007F00007E2F025000410008000801C8000000447
+:10080000FE11000001E00000FFFFFFFFFFFFFF53AC
+:1008100033333331000000000021030F000B0100CF
+:1008200000000000000000000000000000000000C8
+:100830000000000000000000000000000000002395
+:1008400000000000000000000020140F004C001306
+:100850000801122F260D06010127000C004134006B
+:100860000000000000000000000000000000000088
+:10087000A0657C940C000000000000000000000057
+:1008800000000000000000008D050000900802003C
+:10089000010100010001000100010001000100014F
+:1008A000000100010002000200010004000C00042D
+:1008B0000006004C000100010001000100010001E0
+:1008C0000001000100010001000100010001000120
+:1008D0000001000100010001000100010001000110
+:1008E0000001000100010001000100010001000100
+:1008F00000010001000100010001000100010001F0
+:10090000000100010001000800050002000400844D
+:1009100000220042000A0003000100050017000841
+:1009200000010001000A00020009000A000400049E
+:10093000000900090002000D00010003000A000187
+:100940000008000400040003000B0006002200223F
+:10095000004200060001000400010001000800013F
+:10096000006D000100010001000100010001000113
+:10097000000100010001000100010001000100016F
+:10098000000100010001000100010001000100015F
+:10099000000100010001000100010001000100014F
+:1009A000000100010001000100010001000100013F
+:1009B000000100010001000100010001000100012F
+:1009C0000001000100010001000000000000000023
+:1009D0000000000000000000000000000000000017
+:1009E0000000000000000000000000000000000007
+:1009F00000000000000000000000000000000000F7
+:100A000000000000000000000000000000000000E6
+:100A100000000000000000000000000000000000D6
+:100A200000000000000000000000000000000000C6
+:100A300000000000000000000000000000000000B6
+:100A400000000000000000000000000000000000A6
+:100A50000000000000000000000000000000000096
+:100A6000000000010001000100010001000100017F
+:100A70000000000000000000000000000000000076
+:100A80000000000000000000000000000000000165
+:100A90000000000000000000000000000000000056
+:100AA0000000000000000000000000000000000046
+:100AB0000000000000000000000000000000000036
+:100AC0000000000000000000000000000000000026
+:100AD0000000000000000000000000000000000016
+:100AE0000000000000000000000000000000000006
+:100AF00000000000000000000000000000000000F6
+:100B000000000000000000F40180031B0000FFFF54
+:100B1000FFFFFFFFFF00FFFF00C080100A00000082
+:100B20000014000000200132210C0C303000390587
+:100B3000FFFF01FFFFFFFF0606070700FFFF0101A0
+:100B4000010300140014000000020001280014003A
+:100B50001400000202000128001400140000050225
+:100B600000012800140014000008020001280014ED
+:100B7000001400000A020001280014001400000AFA
+:100B800002000128001400140000000200012800E7
+:100B900014001400000202000128001400140000D8
+:100BA00005020001280014001400000802000128BA
+:100BB0000014001400000A020001280014001400B0
+:100BC000000A0200012808080808080808080808A0
+:100BD0000808080808080808080808080808080895
+:100BE00008080808080808080000000000000000C5
+:100BF00000000000000000000000000000000000F5
+:100C000000000000000000000000000000000000E4
+:100C100000000000000000000000000000000000D4
+:100C2000000000000000000000000F0F0701070394
+:100C3000030203071E000300A600146405013D3CE7
+:100C40003C3D01043A0001000200000906080402CC
+:100C5000070200000000070700000303001B28052F
+:100C600001002220000502201C0C00110A320A3269
+:100C700014204600000808A000A000505080031473
+:100C80004B00019B02010006020F0F000006070344
+:100C900003020303000003010119000501001414FD
+:100CA0000005000000000001033B0110202040006F
+:100CB000000000FF0000000001000002030D998FFA
+:100CC000590D998F59010A190020283C0301000091
+:100CD0000010289077000F14001C1C181918181801
+:100CE000181718171817181718171817181818188A
+:100CF00018181818181717171717181000302E2D56
+:100D0000332F282734292A2C2B2625232224242458
+:100D10002424242424242424242424FFFF00000049
+:100D200000000000000000000000000000000000C3
+:100D300000000000000000000000000000000000B3
+:100D400000000000000000000000000000000000A3
+:100D50000000000000000000000000000000000192
+:100D600000000000000C0C3333000306FF80FF80FE
+:100D7000FF80FF8001000EFF7D1000050005031FAE
+:100D80001F000005050007001F1F000006010133BA
+:100D90000006010016140005090000AA09E00EBEB5
+:100DA0000000000000000000000000000000000043
+:100DB0000000000000000000000000000000000033
+:100DC0000000000000000000000000000000000023
+:100DD0000000000000000000000000000000000013
+:100DE00000000000222044A05A02013A001E504494
+:100DF000C861F8FB0C0F84057F6EADBF90BC8030DE
+:100E000090F88180B4D8080385B0F1838080EAB07F
+:100E100083222080016B6A12000154000000000050
+:100E20006F58BA650C0000000000000000000000D0
+:100E3000000000000000000024020000400E02003C
+:100E40000201000100010001000100010001000198
+:100E5000000100010001000100010001000100018A
+:100E6000000100010001000100010001000100017A
+:100E7000000100010001000000000000000000006F
+:100E80000000000000000000000000000000000062
+:100E90000000000000000000000000000000000052
+:100EA0000000000000000000000000000000000042
+:100EB0000000000000000000000000000000000032
+:100EC0000000000000000000000000000000000022
+:100ED0000000000000000000000000000000000012
+:100EE0000000000000000000000000000000000002
+:100EF00000000000000000000000000000000000F2
+:100F000000000000000000000000000000000000E1
+:100F100000000000000000000000000000000000D1
+:100F200000000000000000000000000000000000C1
+:100F300000000000000000000000000000000000B1
+:100F400000000000000000000000000000000000A1
+:100F50000000000000000000000000000000000091
+:100F60000000000000000000000000000000000081
+:100F70000000000000000000000000000000000071
+:100F80000000000000000000000000000000000061
+:100F90000000000000000000000000000000000051
+:100FA0000000000000000000000000000000000041
+:100FB0000000000000000000000000000000000031
+:100FC0000000000000000000000000000000000021
+:100FD0000000000000000000000000000000000011
+:100FE0000000000000000000000000000000000001
+:100FF00000000000000000000000000000000000F1
+:1010000000000000000000000000000000000000E0
+:1010100000000001000100010001000100010001C9
+:1010200000000000000000000000000000000000C0
+:1010300000000000000000000000000000000001AF
+:101040000000000000FFFFFFFFFFFFFFFF515151B5
+:1010500051CD0D04831010101083FF031800010000
+:10106000011A000000000000000000000000000065
+:10107000C8C7F9470C000000000000000000000095
+:101080000000000000000000AE020000901002000E
+:1010900003010022002000080022002000080003B5
+:1010A0000001000100010001000100010001000138
+:1010B000000100010001000100010000000000002B
+:1010C0000000000000000000000000000000000020
+:1010D0000000000000000000000000000000000010
+:1010E0000000000000000000000000000000000000
+:1010F00000000000000000000000000000000000F0
+:1011000000000000000000000000000000000000DF
+:1011100000000000000000000000000000000000CF
+:1011200000000000000000000000000000000000BF
+:1011300000000000000000000000000000000000AF
+:10114000000000000000000000000000000000009F
+:10115000000000000000000000000000000000008F
+:10116000000000000000000000000000000000007F
+:10117000000000000000000000000000000000006F
+:10118000000000000000000000000000000000005F
+:10119000000000000000000000000000000000004F
+:1011A000000000000000000000000000000000003F
+:1011B000000000000000000000000000000000002F
+:1011C000000000000000000000000000000000001F
+:1011D000000000000000000000000000000000000F
+:1011E00000000000000000000000000000000000FF
+:1011F00000000000000000000000000000000000EF
+:1012000000000000000000000000000000000000DE
+:1012100000000000000000000000000000000000CE
+:1012200000000000000000000000000000000000BE
+:1012300000000000000000000000000000000000AE
+:10124000000000000000000000000000000000009E
+:10125000000000000000000000000000000000008E
+:101260000000000100010001000100010001000177
+:10127000000000000000000000000000000000006E
+:10128000000000000000000000000000000000015D
+:1012900000012101200219061C031F051E041D0761
+:1012A00016081709180B1A0A150E110F12100D1334
+:1012B0001E1F2021000102030405060708090A0B6E
+:1012C0000C0D0E0F101112131415161718191A1BE6
+:1012D0001C1D313300100010001000108080808031
+:1012E00080808080808080808080808080808080FE
+:1012F00080808080808080808080808080808080EE
+:1013000080808080808080808080808080808080DD
+:1013100080808080808080808080808080800010BD
+:1013200000100010001000000F000022208B8180B0
+:10133000C003808080200A090000015500000000E1
+:101340000DF045BE0C000000000000000000000091
+:1013500000000000000000000E0200006013020008
+:101360000501000100010001000100000000000073
+:10137000000000000000000000000000000000006D
+:10138000000000000000000000000000000000005D
+:10139000000000000000000000000000000000004D
+:1013A000000000000000000000000000000000003D
+:1013B000000000000000000000000000000000002D
+:1013C000000000000000000000000000000000001D
+:1013D000000000000000000000000000000000000D
+:1013E00000000000000000000000000000000000FD
+:1013F00000000000000000000000000000000000ED
+:1014000000000000000000000000000000000000DC
+:1014100000000000000000000000000000000000CC
+:1014200000000000000000000000000000000000BC
+:1014300000000000000000000000000000000000AC
+:10144000000000000000000000000000000000009C
+:10145000000000000000000000000000000000008C
+:10146000000000000000000000000000000000007C
+:10147000000000000000000000000000000000006C
+:10148000000000000000000000000000000000005C
+:10149000000000000000000000000000000000004C
+:1014A000000000000000000000000000000000003C
+:1014B000000000000000000000000000000000002C
+:1014C000000000000000000000000000000000001C
+:1014D000000000000000000000000000000000000C
+:1014E00000000000000000000000000000000000FC
+:1014F00000000000000000000000000000000000EC
+:1015000000000000000000000000000000000000DB
+:1015100000000000000000000000000000000000CB
+:1015200000000000000000000000000000000000BB
+:1015300000000001000100010001000100010001A4
+:10154000000000000000000000000000000000009B
+:10155000000000000000000000000000000000018A
+:101560000000000000070400030001DC0000000090
+:10157000016189A40C0000000000000000000000D0
+:10158000000000000000000047020000901502006B
+:10159000060100010001000100010001000100013D
+:1015A0000001000100010001000100010001000133
+:1015B0000001000100010001000100010001000123
+:1015C0000001000100010001000100010001000113
+:1015D0000001000100010001000100010001000103
+:1015E00000010001000100010001000100010001F3
+:1015F00000010001000100010001000100010001E3
+:1016000000010001000100010001000100000000D4
+:1016100000000000000000000000000000000000CA
+:1016200000000000000000000000000000000000BA
+:1016300000000000000000000000000000000000AA
+:10164000000000000000000000000000000000009A
+:10165000000000000000000000000000000000008A
+:10166000000000000000000000000000000000007A
+:10167000000000000000000000000000000000006A
+:10168000000000000000000000000000000000005A
+:10169000000000000000000000000000000000004A
+:1016A000000000000000000000000000000000003A
+:1016B000000000000000000000000000000000002A
+:1016C000000000000000000000000000000000001A
+:1016D000000000000000000000000000000000000A
+:1016E00000000000000000000000000000000000FA
+:1016F00000000000000000000000000000000000EA
+:1017000000000000000000000000000000000000D9
+:1017100000000000000000000000000000000000C9
+:1017200000000000000000000000000000000000B9
+:1017300000000000000000000000000000000000A9
+:101740000000000000000000000000000000000099
+:101750000000000000000000000000000000000089
+:101760000000000100010001000100010001000172
+:101770000000000000000000000000000000000069
+:101780000000000000000000000000000000000158
+:1017900000000000000000003C960A000003030067
+:1017A0000000000000007F00020022432A670019A9
+:1017B00000E8030000030022432A67000000020043
+:1017C000263200000000780C0C01050633000039B9
+:1017D00000060001510000000000000000000000B1
+:1017E0000A0191390C000000000000000000000018
+:1017F00000000000000000008E020000001802003F
+:101800008001000100010001000100010001000150
+:1018100000010001000100010001000100010001C0
+:1018200000010001000100010001000100010001B0
+:1018300000010001000100010001000100010001A0
+:101840000001000100010001000100010001000190
+:101850000001000100010001000100010001000180
+:101860000001000100010001000100010001000170
+:101870000001000100010001000100010001000160
+:101880000001000100010001000100010001000150
+:101890000001000100010001000100010001000140
+:1018A0000001000100010001000100010001000130
+:1018B0000001000100010001000100010001000120
+:1018C0000001000100010001000100010001000110
+:1018D0000001000100010001000100010001000100
+:1018E00000010001000100010001000100010001F0
+:1018F00000010001000100010001000100010001E0
+:1019000000010001000100010001000100000000D1
+:1019100000000000000000000000000000000000C7
+:1019200000000000000000000000000000000000B7
+:1019300000000000000000000000000000000000A7
+:101940000000000000000000000000000000000097
+:101950000000000000000000000000000000000087
+:101960000000000000000000000000000000000077
+:101970000000000000000000000000000000000067
+:101980000000000000000000000000000000000057
+:101990000000000000000000000000000000000047
+:1019A0000000000000000000000000000000000037
+:1019B0000000000000000000000000000000000027
+:1019C0000000000000000000000000000000000017
+:1019D0000000000100010001000100010001000100
+:1019E00000000000000000000000000000000000F7
+:1019F00000000000000000000000000000000000E7
+:101A000000000000000000000000000000000000D6
+:101A100000000000000000000000000000000000C6
+:101A200000000000000000000000000000000000B6
+:101A300000000000000000000000000000000000A6
+:101A40000000000000000000000000000000000096
+:101A50000000000000000000000000000000000086
+:101A60000000000000000000000000000000000076
+:101A70000000000000000000000000000000000066
+:101A800000000000E2F0258200000000810000005C
+:101A90002E6C44AF0B0000000000000000000000AE
+:101AA00000000000000000001C000000B01A02004E
+:101AB0009004020070080200200E02007010020064
+:101AC0004013020070150200E01702000000000041
+:00000001FF
diff --git a/firmware/synaptics_sharp_4322_c8.fw.ihex b/firmware/synaptics_sharp_4322_c8.fw.ihex
new file mode 100644
index 000000000000..9c6e875daa69
--- /dev/null
+++ b/firmware/synaptics_sharp_4322_c8.fw.ihex
@@ -0,0 +1,8034 @@
+:10000000894E8B2A0000030600B00100001000009A
+:100010005444343332325F433800E21001000000B0
+:1000200000010000002000000021000000B00100DD
+:10003000445335205231322E342E3000000000005F
+:1000400000E6010000100000B00000000000000009
+:10005000F451280000000000000000000000000033
+:100060000000000000000000000000000000000090
+:100070000000000000000000000000000000000080
+:100080000000000000000000000000000000000070
+:10009000493243001D01FF000C0D2000000000004C
+:1000A000493243001D01FF000C0D2000000000003C
+:1000B0000000000000000000000000000000000040
+:1000C0000000000000000000000000000000000030
+:1000D0000000000000000000000000000000000020
+:1000E0000000000000000000000000000000000010
+:1000F0000000000000000000000000000000000000
+:10010000B3FC53D60B3EF4134EB04ABF949DAFD20E
+:10011000BCC24D9FAF90A54E5466BA46D01124285C
+:100120004F80F10147D72BD6F68D6517120E5AEA8C
+:10013000345B6819316F4E64CA939F5824A079BB11
+:10014000657125956236D5EE3DCE0BB20F1B1DE9CC
+:1001500087476C9113F2C9CDE0B0D76087EB65306B
+:10016000293078B854CA0132C47E78EAA2D1CD7958
+:10017000C6D3294FA7F45F7E47B71185581DBD37F9
+:10018000F40C425E90C446BC199FB567C4B019A771
+:100190008BF55E742BF1EBB6B2B3F8D40E75CC7A56
+:1001A00092EB038E35700DA7755AB34BF72736B116
+:1001B00019DD7181D2196AC385A4ED2856A1CE70CC
+:1001C000342A148392FD13E826F4433060AE25668A
+:1001D000BDCBC731207027D542B03E4F635897AB97
+:1001E000BC2F1EFFEE77D32ABD27326D3B502BC0AC
+:1001F0004A654FFB3443092C750E6DC9BBAC9F6833
+:10020000DB2BDD33BA506F26D81B5F18C97170DD48
+:1002100033C9BC4B890190467F409A0DD781A1C557
+:1002200020F4241AA0A2C130A731DAE05AB91E3353
+:10023000F2DD51F839DD15BE7836328F6EE5D4DD4A
+:100240007552ED3B54C598A2002B4CE759B17A0387
+:10025000321237FC8DA4D193B5C90F610C91D0A493
+:10026000D8ED054F5522CA763F54E6602E35454AF3
+:100270009A2454D898CE658A019FAF7D1FD3661407
+:10028000AFBEDD0E43F33C3F4CC04B3D404111F14E
+:10029000E503D50BE2970F36DEB10A6EA8587393CB
+:1002A000D7FE3321AA335020F642E52629D01A285A
+:1002B000BE34D5DDEEB676CD62C9B95CDD814AF9D2
+:1002C000E867C95018DE5DA4ADF71ACDBCF07D4FCC
+:1002D000773BB8D2A0C30B45DCDC90A56FBA7E9605
+:1002E00018D89160AD6986E420175F30AF7E63CA8D
+:1002F0009ABCB552285115269D619636EA70FE3596
+:100300008B20AD56858FFA500AD2F204DE90AC17DE
+:10031000DDD4EAEB8FA3FE98740549912A52BF1EE3
+:10032000D7EFF039CB91C95CFE8992F5C01CFFE78D
+:100330009B6E8D7D10699CCB52BC5B62D107814660
+:100340003E174AE06C2412C06E2B624418DDF35154
+:1003500017C234B3C0B7235FCECE05AE2E1CC0B0DB
+:10036000CEB538880688A919A042552730009E438B
+:10037000383AD035A0DDA0BBF917EA9D0AB8E641AE
+:1003800094A1F37DD1CF54A22D64519508798E7B31
+:1003900037F92A13C965FB1074F20A1776327ED634
+:1003A00062F30818653AF8B02CAE1C500BC0883EBA
+:1003B0003A0B234AA9B0BF9BF1AE703AA7E9593571
+:1003C000227F15EB5FB551162EC4D8566D6F829EF5
+:1003D0004408865D79EFB45469EBEFA01507660B0E
+:1003E00086B95E9AB7DF7947F4D7E75180EB65E4C9
+:1003F0006A3A44C990192FD93A5CA1A4E32D4FF56C
+:10040000C3BEBAE6B22C2A91CA4D2F97DE170ACC8A
+:100410009582F0B4EE2F6E0A70A4CC1521E5C4616C
+:10042000E73A6B29E3A642D676E53FF703141E8F21
+:100430007DFFE00D453A69A3E377BA8330432E4F41
+:1004400081F05DD5844452B247063243B8790A251B
+:10045000E214C7E3AD6EEB2933AFB6C42A964A88DF
+:100460003A162D2296B5701C83D36A3F506B4054C8
+:10047000F1C3E11F5EC5F9AC3DEECDE2410E71F373
+:10048000AF076D14AA572922CC58C7006FACF3FEF2
+:100490007B03F723E30CAD9D9CED6EE00BDCAA44DF
+:1004A0008C68E48385A33E37374D5821089C53A2BE
+:1004B000A9C58ED295277401C434A5D4D0AF452FD9
+:1004C000A6EC907CC5A5C1BD77E45B9D5BF80D777C
+:1004D000FDF9CBB0400D9F264AB51528603A0D01B5
+:1004E000AA215C600ACBDFB7D7BFFD5EAD3D170A1E
+:1004F0009C87C2AE87D4160C8ED9176C69CD8464E4
+:10050000AE3F2EF35D75CE362DD0E1B0D27D76BEF6
+:10051000AB29B43CF071A827DD31B47828D00C00A9
+:1005200089A948C1531F71AEECF3ECF8FA4A2B9D30
+:100530002798D715ABD53AE3A85DB2B513B32CBD58
+:10054000D033B796DB511FD1308A50373E4909B5B9
+:100550000A6E135C695B8C902DD32AE6CB10C2AD7A
+:10056000F59B4EEA2FC8DE13970ECBC4C198BFA1EE
+:10057000B6D185B9F7335C6A5CCA49674B47CE1779
+:1005800009D0956B1B971A4B4DBD21DA2EFBF0035A
+:1005900086C454CA09973395B9E6FA294FFA36DF6B
+:1005A0000D420E4FD38220E5539618ED6236448BF0
+:1005B000F937538BFCA7C3458DB8E6C4B01524B7F3
+:1005C00014F25411F002E17C280E7474DEF562E43A
+:1005D000CAAC385A6FC434CB2188EB5E8BF91A1F32
+:1005E0002B61450E0E712A8121A3E7D3BF8E798F2F
+:1005F000F9B7200882519D6E016962AD5A9CDAB547
+:10060000ABDD52DEE5DB55E6AF897CD4B687DA2870
+:1006100000B7FC3F3568BBBEFF241B08F65C3FC932
+:1006200009089265A4CA29DDE286FA30C75BC1B227
+:100630001A02199E4035FC4449F78CF11C22ACE9A2
+:100640003EF270F7ACFBAA49FF5182903094D74D2F
+:100650002EB8B3AF85E4A28085599FAEA0CD9FD7B9
+:10066000875A06B3C0EE6E09B12E193F80939012DF
+:1006700065FDB94C07E7FB14EAD918479A1687EECF
+:100680008F09E220060427B303A2042D041AF0F414
+:10069000464DD9856FC4EE756EA6B1E893A9EDCD30
+:1006A00030AC912EFE9C37860A2D6DA75A41245BF3
+:1006B000062F5E7B216C8B66999242092CAAF0C6AC
+:1006C00078AC80FEB2B5C71B534897B1B3BC9CA0B1
+:1006D0006686E00D572B5BFBA57071663FC8E9ECA1
+:1006E00035C5E5FED76611190C3251D6D3F7A948A6
+:1006F0000DA9BAEC4B000A76B1D2F597AF3265FC82
+:10070000B8BB8442129BC139D5359A3EAA3B179398
+:100710008E27DEC446BF926FC7CB554EC1A63A1B8B
+:100720003CD66380EBB8695D884B3F150BED3730E5
+:10073000215585E6D7E37C2960BEA42DA655EB9014
+:100740009938D432CD7F7E3D44B6D594F81580E8F3
+:100750003C949CCAEC60F80F366FF8120EBD7435ED
+:1007600096F3AE30A82E42A38DA819FEE169E1A64A
+:1007700074D840F22B87C6A3C91882D2E8EDF2A63E
+:1007800069349803944E6852CD54B17023936690A7
+:10079000A1C30B6964DE5963CDEA36A8C0B645EB48
+:1007A000A8644788BE076971C4F4DA3A7D22B37041
+:1007B00092FB2DDDA9023088A2F0F998B2FAC62981
+:1007C0000FE1EBCECB5DE71631880A1721CE4EAE96
+:1007D000949910AC2EB2F610D0D7835E0FA1884941
+:1007E000BA57C7D20B85AF827B62AD5349B76AB0A7
+:1007F000BE15AC6D28447C5262F2D814F63F3C5AC8
+:10080000CD29586961BBE8AB6DCA564C1EADCBAB68
+:10081000EE2025F7D614EAA9E9F160DE55E0794E1D
+:1008200040D1F98858219AD16779E6988E8333812F
+:10083000DB053B88E0BAE8B8CCFEE4AA1A7ED274A5
+:1008400017E802FCCF0874DA6A6C736A1B5C6BB041
+:10085000F4C78E7BB3E40DDBE513C6FB9493BC4574
+:100860008F7C7C3195AF0055CAD03C628C653B359E
+:10087000AA8A118100C0B46C49D2F2A48EF58A3ADA
+:10088000B7AE0C79B0F1F40178CC4CA0DEBCEDC869
+:1008900056D1E60A85C9CE8B404D55160B191B6201
+:1008A000CC867CBEF653B48B1C811515F55CB53235
+:1008B000B33CD1CCEFAF9BB55565CB975AB8C84B7D
+:1008C000798B1A925BC397C1ADD074C87D537D817B
+:1008D000331F1AF655864123A009602AFCEF67549E
+:1008E000359F1441E89983EFC995FD1B2A57A89DB0
+:1008F000D58C1FD2A5F8B5DA02D3FC3529EB9DD1F2
+:100900001DB7C69CF2D953EBC6739AEB5269DF9DB3
+:10091000DE64EE5D8C6122B60E3D74E1E6D16F0FB0
+:10092000DBBC81356E1B5A95C59A609A06500AB693
+:10093000D8139221D7F3BF8318F2F8F66DBE115584
+:100940002D6368B4BA84C4E5B188AC99A4238D94AE
+:10095000AB37992EBE4EA61EE7CE3EA6F22DBDD0D9
+:10096000100B95CB6B3E8A18227E18532E941E33A3
+:10097000EE5E450C55E809A2A48EEF9C52D75BC4ED
+:1009800080B417F6F2F1692C385EEF506660EC32F5
+:1009900067C9E22C513F930B108322098D9E56208C
+:1009A000CEE19CD1B46D636EB6E902FFB541ED1E98
+:1009B00070720930220833F70E54B6384D394CFEA8
+:1009C0006B43A8BE932D5078A7C10BDE46CDDF85C3
+:1009D000583B093CA09EB675F2AEE910A55C1A42E0
+:1009E000537ABE863DAB1242E3CABB71893B7D445C
+:1009F000D34F8F9F4250A057AB280A0FE85D25AA1E
+:100A00009CB8C0F3406AD12B784228EFA7BEEF25EF
+:100A10000DB381D974294719F270167322028AE343
+:100A20002CFBDCDCA14F955F9B7169A8860CD9E893
+:100A3000118D1D2CEB77014AF69F51251725803B20
+:100A4000B4DF49AB6865EDD6A9416540C242A269F1
+:100A50001CE8C9E79E72E00A05BB704C23A06F0139
+:100A600035CC09E17E8E37D1FE2DCE6E025913C4EE
+:100A70006DB0CA2E648B65EF67A4D0545A6E36B43D
+:100A8000DF4CA2662F96BFB1315F605193D1AC634A
+:100A90002B15995721546C88C43ADA591552C4F56C
+:100AA0005B9E986D42507CA7911B7160B14037FEF0
+:100AB00066927127DE3CF0C988D979D96B5FECEB7F
+:100AC0006D092CF0EB8A987655159969E699338D66
+:100AD0004B7AF0F653880BCF50E63DF79D0FA146B9
+:100AE000DB094549BA9C2E5CB64E41FA401BB0F575
+:100AF00099CE15BBDCBC58E0121635E031A70E3597
+:100B00005D737EE64D9DB1A199A32A44583683AB0F
+:100B1000A5DA4DE0F76FE0B50251ACADF45E4C8163
+:100B200058C475D7A335EF106245D9372022967E79
+:100B3000441DB2A76F4C96B397122BA880CD9A0A8A
+:100B400070D988252339BF492B4DBE61E9EE238337
+:100B5000B5E841F249C1AC2854A3C65AE54D9341CA
+:100B600073B6A90F4304F4137250D4769148708E73
+:100B70005FDCCF943E6EB960F1282BCE7933A6BEF0
+:100B8000BD2211F8EC3761A4B5E350F38EA97DB412
+:100B9000639110E0FB8F6BB41D848348AC00DD14BF
+:100BA000A1105BEA2FAC4C90080E27C33CED870EDA
+:100BB000C05F18812A852AA42D9AECE3A2C26B0497
+:100BC00070C32D7BB7E2E3FB8EB7559C4932A2D0B0
+:100BD00044207D6DA5FD611A8A76BC83F3191B4BF9
+:100BE000A96796FE482E31204537BC62C7429B4715
+:100BF000D70E59DD7FBCF8D498176F2BDB2B5A9C8E
+:100C0000E309D2FC30DD162110EF043669C56DC44E
+:100C10006B2C0DC75A5CDC48C0F8C3DFBCD6D2953C
+:100C2000F47987DD33086896DA591AA052F7121161
+:100C30002CC21A81939ABBDC8AECF4F775F5623A00
+:100C40004FDEE04A9FE7C0B08E208ABC5D2CB1DF4A
+:100C50008655FD436CB697CB567BABE7ACAC296DA4
+:100C6000D4419318E63B2F9FF3F47E2050126E562A
+:100C7000744D92208BDC2AC5FBB00F9460E7F9D04D
+:100C80003074048A76B8741D1ED1A9B0D6099109B2
+:100C900017E88807AB99E598F3018A16397DB3A662
+:100CA000DFF681548E3EB38421A8DDDC527C4FE117
+:100CB0003B29CCF6D16A72635FC687E2EC3D2CF922
+:100CC000CE14AF9FAB959AFA2B166C9C97592B8933
+:100CD000212FE18C6160CE0AAFBA1980941D2713D1
+:100CE000157882D3D7F4ED1C7CC0883DD1B9B16BA7
+:100CF000B1C2B318A8FDBADDE64DD0633531C8AA3C
+:100D00007353F1F1797C857353CB65EF52752135BF
+:100D10006B71925DCDC633B712641F247317963082
+:100D200003BD5D7E7C68E6BC2B2460905F82E6EFAD
+:100D3000235E013C35BE1856496B5B7D7E0A90E010
+:100D400088BA364DE033D0B6FB35F4FDDF83A66EAE
+:100D50001F198CA0A1E86D918CADD0587E8A45DF1B
+:100D6000A66ADE7BDD9D8A681A2F535AA9E926D828
+:100D70001655DEBEC661BAAB59414DCF3104408530
+:100D80001EF7BBB6628069E66E5FCE329B3B7F8BFF
+:100D9000E334AB39B0FF6917701A43BD9423E03ACE
+:100DA0005FD703FBAECE4B8A3AFBB46B41711E0F8B
+:100DB000252E382F9FC75A784137CD7F478373211F
+:100DC000E5B7345FA35F945509BAB0894519ED883A
+:100DD0004D099078A2EF9EFA4A56C464636C069956
+:100DE000D3FFF39C701E7F52E93537CD847749BB22
+:100DF00087C6F993D878B90A7EA061347B57B7408B
+:100E0000583E5DCBDF5CE0F4E8E1E6C4234967C00F
+:100E1000DB669EF3252B0A3AF98FB3D45655F4318D
+:100E200014B0FE88A044DCB772ABA5660C3DBDAC27
+:100E3000551E1B2738176CB8FDFF15DD981990C19A
+:100E400052018914D612BAC836979DE5F9AE8304CB
+:100E50003A4B53D01C8D45ED777603E79666826654
+:100E60001353F465E150EC287B71C5F28C6FDF9170
+:100E7000A757650B3F927EE87326D9B5FADE00CC02
+:100E800070CA30CF3B96975210A674746DE6588C9A
+:100E9000D560CA96446C9DBB53C9178ACFCA93F1DB
+:100EA00020BA64F8DB29922EFF31A79D4CF35B82B8
+:100EB0005FCC27290AF70149C759986E3C86A95A81
+:100EC0005A6B0B12401A222763CD1B77ED3CF89723
+:100ED0007B05E4F2AADF6D8AED43D9759D15823654
+:100EE000A394DBC4807628A3F84F5EB185D59BC45C
+:100EF000221CABA33BAC16429F4CA467B5B370C792
+:100F0000984361447B1952991923AA850B8F56FC8B
+:100F100027BB1CD0869715ED409B40C4541003E9B5
+:100F2000961136780070860DBCEE96332AA255DBFA
+:100F30000BB93335374B569EDB615ED8F6278A51A5
+:100F400077016646DE031B15116885E53D7D7BAFA5
+:100F50008A044AC30E03F4A8540A862AD6B417E9B1
+:100F6000C59047AE65E9658D2968E140EAF2BA4669
+:100F70006B82BDD421DBF1B76B87B61C1D6BEDD442
+:100F8000ABCDFFFF76C1B9EC0E234708DC66B8296C
+:100F90007849E9E057D450760F31A2E722A34922DD
+:100FA000B8A42A9673ED527D16E1E5606F5CA75AEE
+:100FB00095CAEBA8A4AECE407CE9FFB454D84AFC55
+:100FC000937F27AE0FD33605DAE3B26901338B0383
+:100FD000D35A07AE374608B101F833FCF46A1C381F
+:100FE00086833B72FF9E3D43C4D1DE9771219B27D0
+:100FF0003D9565C75783E08960A6ABAB9BAF60307A
+:10100000A5D3F6AE620A7949384ECCBF8BFD796024
+:10101000F45F66FF6A038DD0B2B8CF014789CC5C1C
+:101020005D82BB975889260DC8B2A890F6117B87C0
+:101030005C3F4985BBF62C26978B3A2014326871A9
+:101040008DB9BAFFE9F8B45C0C2066A383E11F8672
+:1010500085D867EEC941C07375A09833EA2A95FE1A
+:101060001999A276C7CC193D0710EB06DD161E456F
+:10107000A079324497BC5296B069DA82A3709E7B05
+:10108000557297B51FF18111565D9BB271122AE11D
+:101090000A8943A1732B3AA6B34C3692EE930B8286
+:1010A000A94D9247DB32ECAA6DA9D6421EF6E12B80
+:1010B00036FD6DA63EF9B3BA1F53E336FE4127DE77
+:1010C0002F04238619297A946E777C8CAC13956D46
+:1010D000BA255E8C63F954557F44D2519D57D4DFB5
+:1010E0003C6AB36891A4AD8644DEC880ABC8C12811
+:1010F0003F211A6E364D6F7B22A6EA019309529268
+:10110000C69DA3014D8B959FA034539C0753CCC023
+:10111000EFEA9B0D90D3EFAFFA16DE089A49C6F6B8
+:10112000A247EB56056BB890BA6F644FE567056050
+:101130001EA540EDBAA5EA73BEDCB679DF8DA467C3
+:10114000982657FA21F216C9D8668A71E00A2DCB83
+:1011500088F89CE14E47B8AEE97765B95E8B5D4A89
+:10116000AEFDA82B5BEEFA1A229473096E28C31306
+:10117000E17C5A00E3EAF1B8FB59DA1E18BEC88FC9
+:10118000565A592E19319A5EFEAD015FE178C68E2E
+:1011900047124BC91DFA7A276BB0EFC0BA05BB21C5
+:1011A000E9AB43813F435265A98D77045D4C4E0FF7
+:1011B000D52814A131856CA42345DDD2369A52C5B9
+:1011C000386C1A762E6AFD846294EEE87B8C797214
+:1011D0004A87FD21DC593BE76DA647226DC63B429D
+:1011E00060068828957DB224436BF97C0AF54BA3F1
+:1011F00063DFA1C96FC57CA482021F16121FBE0245
+:1012000036CB7D0010AF27597096EC8319A15C682E
+:101210000F080D8993381511D0B2318D4E29330D39
+:10122000D08A2AD671E0AA26E1BB35DA3F0A5A15E0
+:10123000B0D3D75C580EDB23CCE55F19589874D235
+:1012400056EEBD0ED98ACA57FAA59CE54DCE53D3AA
+:10125000226616F353675DFAB112F5F5205912F3C1
+:101260007B4A66F7CF0F172BE0D740070230436C5D
+:10127000DCAFF471881F5A80139ABF272109240C10
+:101280007774E62A2487DD8BB1D4F4F324287264C2
+:10129000C1BF1277DE7228F247DF09F6BCF9C07FC2
+:1012A000D0E33D4CB1E4ED0AF1B418A80707FD8C7A
+:1012B000A38A7557D9ED65FDA0B027B68B7E5CFB80
+:1012C00056F99380F0DEFB13CF246FAE09CF97E978
+:1012D0003D085FC4638A0D1376EB566E63CF5B8760
+:1012E0002B3A737B3145EC32226F4ECC2DCD94FFDF
+:1012F000E07FE951D83D4B46472238E9C213698265
+:101300004E735BA7A045190544AE46BBB0073470C9
+:10131000248791628A63D64B31B939F3587826E233
+:1013200097DC504E75DA2D3A03130113F6DB0E6885
+:10133000C8E6653C1527F9A56C3361FF2AE13575D0
+:101340004E3C5302E05AFB7077939E5892FFC2E3E3
+:10135000B2B80D0E735D8D45E449FB3969FFE5DBDD
+:101360007F25032F348140D0BFE5FCFB20DBB8A9EB
+:10137000D58FE652292B10D3470C9387160862DBD2
+:101380006B9EEFC74A5A0055C126959EE3C81B1FA6
+:1013900010CCA1AA04F9A3E27351FEC5CFAAFD9017
+:1013A000AA2990B3EDD2F6C83ECDEC1D1FACAEE736
+:1013B000E96591E3843D082A58377AF0CA0823B6D4
+:1013C00071B8B9434A39CE40A2EB96942A03D2C4ED
+:1013D000D68FBF662469A53B3AC5DC5FDBB6AE326B
+:1013E000097092238BA38587DF00502A1BF8CD6DEF
+:1013F000DB0566D0C53AD8BD9A58F4540B328A7AC8
+:10140000DCF8DD3EB618AFCACA3051D89EDC36696A
+:10141000CB1549D34CFE980B48A50C1F15BEB43113
+:101420005BA219E7283A3423922E54E21EC1FE90A3
+:101430007971CCA99E35803A49A89A63B4BEB29618
+:10144000ED7583EE20B43CB7ED3E061954DD70DA3D
+:101450009E142C69AE49E566DB8D4681562A2D899E
+:101460009DFB9C736BCE26564088090A13BA6124F3
+:10147000F966E2FA663BE200634B465C0913588E5C
+:1014800091462D4258284798F9BCD64A1203EB25BD
+:10149000E196D2571AFCF55F156C2C874120431456
+:1014A0008D43F4ED8C08EC31FA7A9F1887F9C893D4
+:1014B0009CB81B205926C53CB0B5E81A5149AF7CF1
+:1014C000CAED6A2AED91FDEC70D183F5F02DCA0BBF
+:1014D000F326D7DDE71B3FDC114B8334C0B39148C3
+:1014E000A5A18B1C17C70BED06D4438F49A803F9A0
+:1014F0001C68D8EFDF24A8E42F9E74E6A11FAEB6C7
+:10150000B09A7DFB86C940FDAE8242D3B4164C2909
+:101510000861BBEFDEAE34AA246A5AB86555BAC476
+:10152000C23109AB1A00196D1E4F948BD412453D80
+:10153000ABB28868457D98C0C3829C3F7E253B66E0
+:10154000D55E988DD4298434405E1458B4EE8D3322
+:101550004D5656870BB96ADD29C69B63455AA07A5A
+:1015600066760E5FB9CF8EDB39226AF3D6A90160A9
+:101570005B9594AAA7800C52A4EFCAE31E6CC75ACD
+:10158000140FCEF88FBE337AE2AF91A1E1696E09F4
+:10159000CF7036F1C5B32FF205EA741217A4D7370E
+:1015A0008E1E2C7FD9ED3D90DED56882F8A65A17A5
+:1015B000FB9C677F99FFC2393582C99C3D9B7E6247
+:1015C000691036AE1B35991DA0699393F5276036D7
+:1015D00011A2C9D48FA036C42C9D88453096E385CE
+:1015E000C181F69A81897B204B0C5AA4E3E6002046
+:1015F00084464D14E2C92F3ECA32A72BBA25B56CDA
+:10160000D95ADCC3A45D6626DF88DDB892BBB28000
+:10161000E6F04A416B33DB19786EFEBFD05862FFAB
+:10162000DEF69E0A7D240613F67CD7D112BF76FD26
+:10163000D0EA1BFE9A9C05428DA7DC95CF16C28886
+:1016400084465039B397D0B1B0D96EA3576933EF00
+:10165000F68CBEA868ED00AC6C87ECBA9691652458
+:10166000E222B64A4BF2395375429D69F2B577FFD3
+:10167000692D0D6F8EB5A452473362FFF8CD372A1E
+:10168000AF29C8201C45F02B0DAF57552F116765AA
+:101690002A7211AE24BC120045A45F735C53E1B7FB
+:1016A0000F7CC45B1EEF5CB572597A7365D25156DC
+:1016B00091CFAF6E36FEB47E090729A981E6BB86BD
+:1016C000151D8F4FA5B1992EA2910F75BA3226190B
+:1016D000244A17A68D99DE0EC627946D623E2236E7
+:1016E000766CFCFD808886DC941507D3BF835E345E
+:1016F000CE0E7B0E877A9C332EE0023FDB70709417
+:101700006727F32685C9652BBE20BDEAE95825EF7A
+:10171000FAAC7CEC74F54DA6B4617F2A69338F7501
+:10172000EC1B00AD141E9758128594C7DFC8C68302
+:101730000738444EB340465217C28ABFE074258F23
+:10174000A69D9CE16D1139676FA4D06625B064DD5C
+:10175000D9EB355235B9B95336F5EDFF79D576E782
+:1017600031E86DFA254EA8A48019C74E72A41992CB
+:1017700006A24D957E569AB2D1B8FD04D844F750D2
+:101780006ACBBB27BCBD32974717483CE072AB9E83
+:10179000DBE61725F84CA1EB31A2C9C5C5B74BD381
+:1017A000CF585E22D9313D1C1B4EBEC25C67017E04
+:1017B0006996E8BA2AD9D3261C6EB3DD22F6ABB2FD
+:1017C000CAE93E1332F144A5B12AE06BBC832B1267
+:1017D000D60D7C3BFA10D212985069F3285DAD28E3
+:1017E000B4CCF71C28FFC5134637206FF0A3397D12
+:1017F0005D101F8FC2A5AE570251A18DF64D3669FF
+:101800005B862008FA15D7D18384C7CF13EBF43554
+:1018100010474FAC1FC9AD170D1D28E3751D812959
+:10182000A59A59BCEFEFCB97D49043CEEA559DBA19
+:10183000C47F8AD372D00A220AD358DF4B5B0C379D
+:10184000ED02D72734EE264633251ACED1B8BA8713
+:101850003DC846F5840AC8D2DE11BF004CA092FEF6
+:101860005E284088DD30243E22565363BA01214071
+:101870005B8173E958B7C4E79CB8A7E8C58CA1CBD6
+:101880005DEE6BC122688D61616AA85934E3002A5C
+:101890005087343813D0880D8CC97E7EBD954F7A21
+:1018A000B6D59B45DCFA8C4A301C68DCE3B0036596
+:1018B0005DFEB53766FB6CF7DA085B9C2533C4E048
+:1018C000E8BDBEBE97DE33ACCCD53F2F065BD1EF73
+:1018D000960ADDE3610CD536E9D61345C5D23D61E4
+:1018E0001CBEE7DDE8A8EE6898B18608BC9880B019
+:1018F0009A4DA3B84F25B27E5FFA66C0229B51A3D2
+:1019000056B6F533B8F277CD86C543AAFCA9F5A241
+:1019100075A1585B144A5DE15D86836148C01689F4
+:101920008FFF83E0AB9ED366A463B5C359D9345A05
+:1019300065EC3AACB0D9C2B12D5481E72B64C9D45F
+:10194000893C3060865DC916636C34C62064CEE283
+:101950002B7A238E7C2F629E6D51BC89497444C0C2
+:1019600017C0EA0945E3407340B99472862DB22A44
+:10197000D23BFB5071FE4332242DB74BB8D4F174E7
+:10198000EAEA7758C3A0FCB4075EB4EB17FB3D7AD4
+:10199000F9838BAC76C5ADCBFDAB1F1D6D4068A741
+:1019A0001EFD2D6E5F7BD9359C27184D3059527422
+:1019B000C68A51182C52001D9A6F7C5D2C788DF1CF
+:1019C000B7084C4562C59A7316FEA8185BA1694F0B
+:1019D000A46E362A9690240DC96865049B3A8BEC58
+:1019E000174C9E0E5E198803CA8BDB4EBEFDE2EEDD
+:1019F000959ECCDE3B17CEC1BFD05BF07B97ABBCD6
+:101A00003786DDD7A875033100793D72C1CC21EB53
+:101A10006BBFFF6776AB826E06EB4294690BBED557
+:101A20007DEF2F9E6A2C9A3568818DF00A0305514F
+:101A3000DC031AA39656BB75AFA1E132F94578874E
+:101A40006750465A0650C0CE86345B047778F93426
+:101A500066104C463776BA926484F8BD70948295CD
+:101A60009AF989A08809C7FC0BF9CDA3C0635BF57F
+:101A7000F2B0B44E33143865C5CA83619DE44A5D43
+:101A8000FC9F072EFB28F33D130B2A510EE82F9BDA
+:101A9000637AC37C492709DDE5AD06AE6EBD62D829
+:101AA0005CC21EE05A74990C861381486C1F7FBB80
+:101AB00018B5DDB1AE5FF8F6678511B754C56CE6B1
+:101AC0005CCEECAB9BB70AAE1FE43FCEA473E83EFE
+:101AD000BFD6A1934EDBCF342E2DD7452B538AACE6
+:101AE0007094A3B0CDA02D4A7182472C8D0433CEC3
+:101AF0008F0CB631D65B430F590320F0F20517184F
+:101B0000A339B6F7CC9481DAC8EB7C81BB5F5D3139
+:101B10002BF91C24B8EE0E56DD6426154B31E90571
+:101B2000A9D5CCBAB539785E6D7A7D3B38F4197990
+:101B300010AC60684BAA4064D2A39C243C97261545
+:101B4000A2D4451078AFE38E38271520CE022E1987
+:101B5000DB41D4016B63387B2DE4CB36779EF213E7
+:101B6000A458DE39A4736661A6CDB9935624EAF56C
+:101B70009DB349F5440CF04191211BBBD89FACF1BA
+:101B800006FF803FE370AD74990A5CF81BCC8B783C
+:101B9000113D409EF9994F7521AA1E35733DBEBA7D
+:101BA0002E1F8A3F0881016AF2211D7D603AB687A7
+:101BB00011B86EA32BA267621391C31DA8D92391FC
+:101BC000A26D27FF0258B0E50CBB59B1C91EA2F5A2
+:101BD0008011706739B588D8170BBAD6539B02139A
+:101BE000202C15F065368EC07D3611328FCFC83F60
+:101BF000A23759E1F286499AC202C6A501EA93E1E9
+:101C00004F216AC9E9086AFBEB08AD648711258D8D
+:101C1000784D4F0B8813C1A671AB5E329B57D33AF8
+:101C2000623294142293032B5227B6A279342DCF1B
+:101C300061DE9B6550E645834BE753C9146A471D37
+:101C40001ED16943A2346BFAEC25DBA63AA17B8155
+:101C50007992A17D2D43CF2DB0BA55AD5F274B3082
+:101C60002324CDEBE3D4B21C7A9053D6D5549B7089
+:101C7000AB11D2667B901D4C58A2EB190CC712B366
+:101C80006694930653DF253AE838DFE50081FD3C92
+:101C90000770282603DE257020FBA6BA8F8CBB5E5A
+:101CA000F918D4397A94730A6F6FBE95EA18C81878
+:101CB0002E745CB1F1368EBD14E87D69E2A5CF12B9
+:101CC0001B6CEC7189511AC325D2E87B34A8D7D498
+:101CD000D1F8C82F852F00BE796E706086BDF4AB39
+:101CE0000E59078399CD01AF950E412D2349CDB3F0
+:101CF000579F788234224A22569EFCE9BEEF24B4D4
+:101D0000EE76F0DC3C52457CC85280FD8672888EAF
+:101D100013CFEC9F81C14BA55DB461A002896657CA
+:101D20004159DB519C12B554B3D43D98A3C3DF692C
+:101D3000A2EB7F07F35C1AFA8CD75BC2A7E73C449F
+:101D40005C13D6A46DB292F4E880174C37D4B57CFE
+:101D50000755C050D864062B9640715683F6A341B0
+:101D6000427A51E16400531EC82E2764AF973C525B
+:101D70008BA350EA049583E8386E0FDD4EC0E6ADC4
+:101D80005CC99AED0E0B321AA1489B84717CDA96DD
+:101D9000C01ED1E7536CD9F9895A5B05A14F80A1C8
+:101DA0009EE05050E300A500AD590EA98DB2992ACE
+:101DB000A3E2C46056F4680EC1321E6DD6193452C7
+:101DC000AC2B3B3E0E60015EDA65E82FF9172CE77D
+:101DD000DE35C5C9FE0C61B3E7F4A837DCF505C1F3
+:101DE000CEF44E0CDC9668A3BC1EEACB09D80F4E8D
+:101DF000D785CF8D91E0B2B97EC8723342F2E8C880
+:101E0000B2C4BA8C50EFE498A18D1BF8943D29DC44
+:101E10004CEDCFD2265A83B4427B67A895A72D49B3
+:101E2000935E608B6E2B9407892382181E97B39F55
+:101E3000FFCAA091FFF455A6A1206F87E868E713B9
+:101E4000A0343F08E269B40DC31056039DE1AACA4D
+:101E5000E31B299732D8978377119A41365CD16179
+:101E600086ECA8008B5AC393592EA39198A3E00E39
+:101E70009385438C4A8AEA42406BE2AC8477F7153B
+:101E8000FC5FBB3C0EDD09D7FB167E237529692359
+:101E9000C8D6BFDC5654877C31C4E9BB99F3DBA0BC
+:101EA000143AA3F0B566D92E69C810A09A2326B5B6
+:101EB000C5F6EB7D4C8335856312925D32829CE7DB
+:101EC0000A595BED2F7D5B4514D98F58482BE4D51B
+:101ED00015A0102B6030F78A55CB84D9F5E5867DA7
+:101EE0000F0163CA9F8599883840C6660CF084DA72
+:101EF0001929C28EFEF48BFBDB13FE28D44AF5D7DA
+:101F000079DC935C89D805A7040438295399DD7BD3
+:101F100042FED182C51C92F88653F207D8CDCDBFC0
+:101F200079CFB6A984150B5AA4AC1E254702A76F1A
+:101F30009C67B0CBCEDB143FD77E0032BAB24A7377
+:101F4000882F57248AC930C65643C9F61B8DC75EF1
+:101F500087D2CB82B451125C4A256D6E4C62FDDD96
+:101F600093A76E80DC5400FA0D14BA8ECB603C311E
+:101F7000664B365E3BB5FA52F0A54861D8DA9980D7
+:101F80002139C073C314FB389542189738BE7C0FB3
+:101F90008CE4FCFBD7C0E3FCCCA9FAD8C991751F2F
+:101FA000F0030462998580A7F72BE638B36C3BE415
+:101FB000A6DDF4D960278E57144A65C9794655CCF9
+:101FC0004530A5732C0814A6E5EBDDA7312CB8FA33
+:101FD000FBEACAC4E6B8F5D16F5F807B3737A554FA
+:101FE000DE329A2723A156CFBF4850C8AC2B66F9E2
+:101FF000DFFBD0749A0BE586CA6C9EFFB547BCD850
+:1020000085E674FADEBE5299C48A6C2505BC32A9F5
+:10201000A2299D157F459B3F862253694ACF38C62A
+:10202000E3ED69B0F7060AD9F1C0C331AAA404628E
+:102030004E817CF4B4AC3B61518CA64B1440383AD1
+:102040000A181B446B6DC5A23498CE85538A92B989
+:1020500018A48A4C16FB82FA3AB0BAE0AC6905C102
+:10206000E3BE4924916680B2CC794C9DE6AAD09912
+:10207000B55A3D2F4432DA453545E3FE3FB8518726
+:10208000C63D62FC58C7CBAAE921D2F38F1C2311AD
+:10209000702DEEA6B9FD80EDFE89267C85B117D5A1
+:1020A0004C3A1E7721C0EA09EE736E571C08E69E73
+:1020B0004098DA92D64610EF89DED5C570769AB789
+:1020C00030DCE7B057062798314E20E90FA7C990BA
+:1020D0006AF95783E80557752B68DFAE99F2FA80E5
+:1020E00065C1E0B27E9A2E214531588C2E1906A981
+:1020F00067341584A4B1F648869454AD2609D01EE1
+:102100003641FB90497D1B513EDE0EFC1151C74B01
+:10211000A4BDF626473B8B9AD7BB6B117928667214
+:10212000CD57750F56E1926C84583609C1B4977F2C
+:1021300007EE466D9FC4EED3A3D1CCE2D858291B3D
+:102140009041BBD7E0AFEAB65A2923109EEA5B6DF7
+:10215000B2CD63A0F8FE183BB7B1DB5061B55A3E73
+:1021600020EFB552A5AAA9217C8C494C9AB73F6AA9
+:1021700065D2CF74F7FF074126C8A5E01DFE473E94
+:10218000C786B44E9BC554184C0D5F8C3C8342B13E
+:10219000801206516A3E600ADCE6E01190F6286D76
+:1021A00055826CEDEF41253A3E786E0D43D6F181B4
+:1021B0003191A4B46685F88087447FAFECD217FFD5
+:1021C000DEDAF2CCD04852B97DCAFC744923734799
+:1021D0009A1E48D46924309E326981BAB9DC0EC394
+:1021E0007C2A42B6DE9155052B85BA020821D823F8
+:1021F00023D94C3A3C03898E6FB00765DD22FCFB86
+:10220000133BBD7B04796F90BC918C759F697BAE4D
+:10221000A9C96F595CFB426C86439FCB4FED62DCD2
+:102220004698CA33753E7DDB388E1F99840B51E189
+:102230006CAC85E53D531B99B946D273A07C2799B8
+:10224000E3F72B9267492F1F2978773D4148F2FE2B
+:1022500074E8C01E29B4DDC66386B85BBA2C2BAE09
+:10226000E399B5ED4198C6A7F99A8F9EA417B120BE
+:10227000C6C7BCC78478090D63D5B8B62EC384A37E
+:10228000506BDB734EAEB6FB75CD326461BECB2FA7
+:10229000B9B93C4C370AE8FA4D2204281649D853FC
+:1022A00088F903E0A96DC4B15E0E96C11FD4DC0BA2
+:1022B0008E44B9547E4CB7D869832F5528290178AC
+:1022C0004D5A519D18C996AAC7523BB39ADE18EAD7
+:1022D0008A005C15DEA38C590B1BA0841CAFB5F9DA
+:1022E000914C9DFD76E723AE910513AEBE286A2181
+:1022F00006A9EEB1D2ECD77F4065DA2000652C4C00
+:1023000013CFB1EE9E468271B1E17E9DA6465A374B
+:1023100084AE628EFD34C71F42CB5A9BE033AFE7D9
+:102320007E94BFB2B5038EA8CA7DCCDEE7A5C07B84
+:102330005BB8273BAD0D862A4EEAFBA9176274EC09
+:10234000F86F41056B8387BC0780B6E8083510EA53
+:10235000916F37E32E30559B9FBA60744D9865D1CD
+:102360007055A8F06D0FA4B946FA76D70850CD5134
+:102370009DE653102867E22357BD9725D998C9F7E2
+:10238000BE74F8925AAD80E0F98C725D16F6BFB457
+:102390009389308A44CD5339D971CE629A5C71C920
+:1023A00068F0B5A75F64ED3B8B132B7814AFD0E8D2
+:1023B00079897CFC19141C8E6CD394C0034BE49572
+:1023C00061CEF709BD3477DC058CC6D7CE3427A79C
+:1023D0009FD921753FE68CF954DA9BB045287BA341
+:1023E000F0A10C3EF27D6C925670CDDB29CFCB1B59
+:1023F000D32A30AD8EF0B93EBD8E4FC8FDD9A52E83
+:10240000E7B247332C2E55CC9E243ABED8863D34B5
+:102410003B06683D608AB74754BBFDB9C44C5D9428
+:102420007078CBC977D02602F806137A59293FD1A4
+:1024300072416D3B6055C08CBE241E1B6A760D47F1
+:1024400012952BBD426577F4227FEA4B3FFC4F8803
+:10245000FF9BCEE5860AA8E0E8984A361BBFA87C19
+:10246000C6D301D10C06EE6538D18C9C16D3FD5A2B
+:10247000AD63F78B02DAC76CEFADC18B1C2339B4A7
+:10248000339E8CFE1AABB4C22A28F4874482CA60F9
+:10249000CD65CDF809D436ADCC5D5C80D9C10ABE1E
+:1024A00086D0FE7BEE34707DD934793B4C492B3C91
+:1024B0009299242042DC2513FB009372B25FC15332
+:1024C00011F5987496515C358193980AC4B196E5DC
+:1024D000DF53FE12DF8144BB0A04598C27C483C733
+:1024E0000205BBA928244F3B7909525DFFED15EA8F
+:1024F0003E5A735FDC792FF09F00AD7E9208CF9536
+:10250000A429F4E8E5609A5BED13B477DA2F0F267F
+:102510006BBDE9180C9B47A22E5D9A69470AFDDC4A
+:1025200081FD44755B9FA9534BFCB56B46D2720489
+:1025300041844EAA7739350BDBE5609BB0D307EABF
+:10254000890F714ADA6B3B7860EE0AE2A49632801A
+:10255000172D9882C4BBE05DCEC78A7CA5D1078FBA
+:10256000986A56455699B4CA856BE8B95FC86EB685
+:102570003489A561966CEF0965EDD41F4281677AB5
+:1025800099E251B9D2369C6B5D63DBF47367220428
+:102590003F6A90E1562A5B981FFFB1F1396CA0E2C7
+:1025A000B5EEDEEDEA2ABEB4749EC58B153B384706
+:1025B000511E26350343645F1FC8657E500C06C458
+:1025C000E27948B71543B1C2EB6686A35C371C6756
+:1025D000C0E14C677DC396487066C292186D8F0348
+:1025E000CF6E12214C084C0397C90F966A2CAAB1E2
+:1025F000E07F98ADFBF0210E8470275773E9EA89DC
+:102600000F0BB88240AA1D4A75FE261148F5562EBA
+:102610003105F6046A05FC44D59D4F77E5A97C3663
+:1026200086E3BD6C4549EC6E0C5B6CDC33945570F5
+:1026300029AC605A4DF9FBBAC987A1E5B5D681D757
+:10264000459C68B1D6A41674B426F37B9788F91E0E
+:102650005ED08ECB9987C37ADBF65B4DD3E23FDE4B
+:10266000C4DE519E42B6AA74BF70883112A4EF2B0B
+:102670009071F326271363C3C33EFF7523012CD744
+:10268000AFC42CCC80CDF3C5F02555EAC63619C5AC
+:10269000E90B69FE6CF576735A9BB860A8BAA79BE4
+:1026A00005325F61305E2AB2C87C9623AADFFDC086
+:1026B00028E2EC0119DD237AFDB3261575C0D61684
+:1026C000D7B1EAE5CF631F289FC73AD2C55E96907F
+:1026D0009EA391D154FFD7B2A3E9C56AC514254F73
+:1026E0008B5DEEB6E76888C84902AF860A56316F3F
+:1026F0005336DE47454FBA24FCAFC05F550327ADC4
+:10270000AAEEDE0C37D025C0404015AA112335C4EF
+:1027100041467631DEA864651223AD2724CC7824A7
+:102720007435C6CB0DA703EA7485D387ECE897DD33
+:10273000DA66C2268C735729924821CEF4FC0AFA35
+:10274000401095335F07DC005E7F2B8B01144692AF
+:10275000ECE78A34A35A0CA717A3C16363925E15F2
+:10276000B3C79C33BFDE9DEA97BA10F18CA29C845C
+:10277000F9DC91C4388FE44AEDEDB76B64667D04F3
+:10278000FBF123BAA58A4E8571B9F12ECF51B4E879
+:102790006E968013C7D8627EA6427F0B9A8C036C1C
+:1027A000E69EF17C649BA76CC6D3AD1400F8F006DE
+:1027B00001691062DC575E2E4C2567308A397253EE
+:1027C0009256884503C50E81BC721E348C21215857
+:1027D000D5BB68BF558BC2359B07E727ADCEDC9BC9
+:1027E000ABF4FA59F07B5A732F6E09C4A4780DF735
+:1027F0008005259040E89C470816DA684EA2793299
+:10280000CB9C76B21BDEB3A3193D34829B8D98819D
+:1028100039B95372465F9371473354A8E332A5CB5D
+:102820006218CD6CB76BC760D9204709813171E45C
+:102830007DFF0C61A41B88EA79DD70F70E524C0D08
+:102840001F91CADCB7CA687AA162726E59E3970118
+:102850003920DDE93C02964F1E24D3C3A1F4CDB646
+:10286000DC1C0F5FFF967EA1C0F1EA9F0FB88AB211
+:1028700008A52C0D3195284CE2F88C79DEA6AC8C9D
+:102880006D4421DE2CBEEFEFDA60938185EC9386F8
+:102890005FD1AA658667003074495076C843DE7AF6
+:1028A0009F97B89990E1F05351327093245FF734B9
+:1028B000C430245CEF52CA5323CC94A07426ED5943
+:1028C0004C56315AC03B3076180F086A07AF24E4E3
+:1028D0004944DB576FF321619946F292F3EAEE5EC9
+:1028E000BBC6A8EF644078A3CFFA59575F5717D0FB
+:1028F000D0BCC70A88BFF462A3CF80E25A9F808C05
+:102900004A49815CDAC5693697657B19311C942682
+:102910007E83C8DD146CDD0857304654352BB95C16
+:10292000439FF74537FF060E7A722EAF476B1B3772
+:102930004185E328388A47DC6B6C3D0DC445F80DB2
+:10294000CB24C67B5DF14A71BB2BAC4BF2AF671F4A
+:10295000DF761866EED1DD44929C15F3ECF5E9764E
+:10296000FA5CD00CA63A75B00D12FB85E3ED0510AC
+:102970009838BFE124FABD9CDEB38EF1DEDF9D16F0
+:10298000FCEBF3B2A880BD9F38FBE22BF288EA484B
+:10299000A5B3FB321150C6D229AED6B5E0A1C0BC5A
+:1029A000F1393BC0F5919C9DBDA119E708567AFC11
+:1029B000B6ABB18752CB1C54E95A473CDD67DAEE1F
+:1029C00075FA2701D4297E870E45196AD19BE2CD7D
+:1029D0000EE6638C069C62BE0731A4989D4E216C66
+:1029E00049FE24B1EC45DAD5707175D9431849C256
+:1029F000447DC5D9BA41539163720DEE7D3B9F9AD8
+:102A000018E537C8207B333458C499D39D09E8A50D
+:102A1000E03DD57508E30BEE60994FDE058551204A
+:102A2000BEEE1BBC7F9AA3FF29CD670FB6F9D80570
+:102A3000AE45FC79F5592DE718E38EA86814FF0C14
+:102A4000B29328A7BE2F1864FB954F7199B363FF0B
+:102A50001C4B4535FB79F69C9156B042122CC5D3E0
+:102A6000273A411DE3214A5E571B07D4CA169F70BF
+:102A7000E1F9E8CDAD756419A33427EAEA65BC79BC
+:102A8000D3B67C20229F004653511CAD4B18B2F99F
+:102A9000E77C51FEB44C2616AB4A60D98A8B1AECFF
+:102AA000281CEB81EA7DBA0EA713D0ADEFED262CE2
+:102AB00026E62FDC2B7D81748ADBC9311B1E148432
+:102AC000FB702A909C0D16714BCEE4978C60B66516
+:102AD0006EF3E85CF42F7609E6FDCB8B4FDC4DFA04
+:102AE000EA2F85F6AEC4DCF7E10F57DB90E74855D7
+:102AF000C9A9E11C791CBBF61725E33C039E1226ED
+:102B0000FBFB362B5130CB28B6BF12BAFAB26A2D76
+:102B100022D06CA9D5895E99B9E75828746AB01D8E
+:102B20009567AE5303922C690B61F70E80691BC841
+:102B3000AEBD111CC6C22437D8B4192AE67FBF8E99
+:102B40006DEB0DF8468D22B96EBE9B87A5CCB6E124
+:102B5000A026FEED5F8B33914ADBE967F437CDB4F5
+:102B60008960C02E1B016D2954D4E97477AD8B3672
+:102B7000186FF8E3EA5E34F603DBC8BBDA96F6A416
+:102B8000051A17CEE784B76907ACE545BCFE11B15D
+:102B90007B9966BFC6FB372FBF7964D16C02417940
+:102BA000B7492CC1B365FA81B05341BF66982C6216
+:102BB0002B4963702F4507C8A58D0F872D260D6DF6
+:102BC000C145E5FA297121ED5D836C79245E033AF4
+:102BD0003B718BA1A8209F72023747D7CFE3684F84
+:102BE0003DF8ABC0599A1092F3E80352647E9E6D93
+:102BF00023C75F5CF349FE76980495C2D7565EC33F
+:102C00005A5714BDE0B7BFB1BDC8026F4B3EDC4F91
+:102C100087172F4D409799FB343A343AAFF7E6DEE9
+:102C2000DD4DC0073E3065E207C27F3099BCA4810C
+:102C3000C0E511DE077853ECA060734B186C8DED86
+:102C40001FF3FEBFF5FB5F3C72C22D6973BC83149A
+:102C5000CABC4DFBECCCE7FFA59E1E76BAFBCED9D5
+:102C6000442DD42CCDAEC47D16AB8A14E4F83EC9F5
+:102C70006D37597942D6D155FB725DEDBEE4AC9803
+:102C8000C1C35C4546A1BEB98692D08571448EC948
+:102C90004D264BF7E23BE546BCD64BC38CE37FF9B0
+:102CA00041871C6C3B5E5F4615951B64A62E9DD428
+:102CB000E5E6D3D70305C67E4A9E8C448A96148BDC
+:102CC000AF9D56525612F07568681B55674F0A073C
+:102CD000D7623918E09615AFF9D09F3A1964A6D299
+:102CE000634F2DC2B4D66A020CEA138D991601DB2C
+:102CF000181F6097ED7476DF130C266C7EAEBC81D6
+:102D00003A236073C19C4E9DCECDB31CABD994BF0A
+:102D10005F28FC30E547C2C1F1F707831EC70FAE3D
+:102D2000A46B8C29FB670AABD1B646276FEB2567EE
+:102D30003D1773CF43F704C0B1327610E3C1C846E4
+:102D400062671AAFE13825E59CBDFAA87CDE4D6DBF
+:102D5000161A7B519A15BA43EB250279FD5437892F
+:102D6000E3EAB2E86F948B55152D040D7129A17D0E
+:102D700040F8417667B39F6029B641947F765AD672
+:102D800007E259FD3B1F27076395FE2F79FC3BBFE8
+:102D900070A0C3F995A8727FD9F28B721B174EAB46
+:102DA000DBC7CFE51DB1E4DA40E749835C87CF2C70
+:102DB000A80BFBA662C6C41ABDC0B156427DD04462
+:102DC000ABD0B0E914148366B534A6F2E4FF2994BD
+:102DD0008197C95449607E02FD3F912DF09033DF09
+:102DE000A2796D192D6721621BA9EB005D5ED4A746
+:102DF000A0C98EA748D05948997967F09904213A1B
+:102E000001DDDD2D36297D21E6D6880E56C810A4B9
+:102E1000A0F80915F4BE6A5114C68399E92483EF1A
+:102E20000AE86149FA3E592374D7DA27EF26831F4F
+:102E3000CB2EC6A79E518D932A953E6036CC9E65BB
+:102E4000DF1972BF54A95AC39358E374F37F63A088
+:102E5000A7B3C32110D482F0342FE88BBFE8A400BD
+:102E6000569CE00C6A5B737E0B0369F3BF74357389
+:102E700016B5DAFC8846F0485E71AD3152EF4E4827
+:102E80002658197CA05A0BF3C29067455415B6FE1C
+:102E90009FBB27484AAC976C2F4E4601540E206EBC
+:102EA000A6CB9DB35ED11B06816A3E02AF8C7145F5
+:102EB000483D8188A26DD5516298579DCB133C6FD8
+:102EC00059337B4D6D95F62E03F47F9FDE73898910
+:102ED00080F01A405458E146B21CF73DF8A50FB9EE
+:102EE000CA1E1C77B0CE6C9B7B4361D5B76A301588
+:102EF0002D7371FA0349A5A130887AC4FF51E4FA11
+:102F0000FCF20380FA3D3EBB0043CDB563E4F7BD60
+:102F1000502FA4336266FB1B0864B0A9DD743CC16A
+:102F20000A656E06F13FC9ADE536B2AF13927C90EB
+:102F30003A7CB6F71F12960C8E22F44C9872902FA2
+:102F40001BA278C0F3CFA53B6F927E2FA5AD27F4CF
+:102F500028F98867ADF6867892845EBC636CBD9E66
+:102F6000FF1C934B84E3019C6942A8664BD7954FA5
+:102F7000A39D6312EAF7EA83D28944DFB57898917A
+:102F80009941476466F115EFB494F3CEBB25E4CBC9
+:102F90003470D8E80B0E6CD8B6D602F1B17EA0EC36
+:102FA00069820DCC0356C8C3E2B5F8FF0933D06778
+:102FB000B7A366B1C21514A1951662A2AE2254A1A0
+:102FC00027000CB28ACB240ECC60DEE1CE6CBF6150
+:102FD000E33AD20F7FC542F6C039D8ED5A181F5BCD
+:102FE000C661DF4BE6B0EDDEE2F522A95279FAEBDD
+:102FF000AC60E84F1A34E94FD1851D6B2D7E57190F
+:1030000038FC2967E04E8CE2D7752C6FB2B89DF37F
+:10301000496BD52638576DF125943C81F267538B67
+:103020002A5BC3E24947D1A97D8DBA6B644D0E5D21
+:10303000F320BFBC7C1AC54A17C6FACFB1CD66FDD6
+:103040002E953BBA12A0486CE5DD1A5B1246F1885A
+:10305000208B8F5467ABE009BCAF9E2550DEFC7C13
+:103060008A7C4C361B8EEAF82E6276572665CBD1C9
+:1030700010276E651F9B10F454086212307F786829
+:10308000B79588632734799338053D9E9FA0BACEC3
+:10309000EA67375470028B339B7A656654C309DE46
+:1030A0006D92B7756452B62B47A8169FF0A100C762
+:1030B00074B3801BC8FE68CB5E71C452137E77EA7E
+:1030C000F71F54904F5C82DE776407E4E4DEE70983
+:1030D000EC5538EA5032316EFD9DEB880B5AB0AD9D
+:1030E0006A4970353D3C205614607A85141ED04DD7
+:1030F00052B5F289141013B61364943CD6C34251EE
+:10310000A898335040EBC2FE9D14DB8CB636823F4C
+:103110003818CD64BA726F5FDE4FB86230076EFC4C
+:10312000653AA611A0ECFC17DD5AAB4C4F5003CC0E
+:10313000C59E239D6B712E281E92D6BDB56848AEE4
+:10314000CC67064CC5538BFC98EA062947C7161F67
+:1031500015DE5E1524274C2B7771B75D49CC61A72E
+:1031600068D9E84888B2516A3D45D59B98344726CE
+:1031700095830172B92C7D4550D6BB5915E52F9525
+:103180009B3C97D655ACFECBD9C4D9B3268D6A08E3
+:10319000C7FED1A79A5E852BA285CB574A59454ECB
+:1031A0006F88046D301C0ABAA0328EEC825E264C09
+:1031B000F15CAA1027165C838A174D6EA9C66CC6EF
+:1031C0000EDBC71A75DA28F8353177AED42D85AD08
+:1031D0001B03B0FF8B170F3C83D6FEF49F11F977CA
+:1031E000AF596A2CB77986E8FFFB71136BCCA0044A
+:1031F0003EC8F79CC72629F1D6B9778F125A1C957D
+:10320000B4FF0BD14260FB861017C3A6FB2372FDEF
+:103210004EC20F13F905D1C28C709D888721668C30
+:10322000128E4CF3ABFDD48ED6F76E26ED93014291
+:10323000A83BB135BF4AC9150CEE94BA20645D268F
+:10324000B5921BDC3CF44F3C1E2D3D12B1C99026BB
+:10325000521E96A580A001775B73374A4AC5C49079
+:10326000209C3A53A34DAFC17D273F257D07EBA19D
+:10327000B518FFE865B38081C2F3711A3698FB4B2D
+:1032800097D49BD38C1B8C6124D15BA9FEBB3C32B1
+:10329000D17626CAFB33AC20329D4A298037CEAF87
+:1032A000893271F6694B262931BD3F0932C7CCFA04
+:1032B0006E4A5B7777FFF3FCD3878FC73C189F007C
+:1032C0001AF6123252A3986E902F4131B359A8507A
+:1032D000D2B78A9654E4F533922F78F44262101DE7
+:1032E00056DE1FFC5E4BCC8DDDCE6A176D04E5F219
+:1032F000C16F9B1B28DBCA735A087228EF196AC476
+:10330000A08C24A58573C6FFF9EDC22881A3987609
+:10331000DA9F022E8E01602D6B626F1AF67FEE002F
+:10332000A089D71243B1FBE99449B92DE0A8510D0A
+:10333000959F754C632A8566664B1E77F348D68940
+:10334000F58AFF63B7915F07ABC28C5CB5601C1A4E
+:10335000515DF4E909D39CE5AC320F3A7A8B538B7B
+:103360007064852E51952C74B03F2C76038D1A7E97
+:103370008CAE95392D79F6B3A4835DCBF6CE453569
+:10338000B43A6F5ADF409032F5A0647B4003A4C08A
+:10339000A9392418CE027E02B00399B3EF2258E572
+:1033A0004385B54F5F5ECAA423CF154F01193299EB
+:1033B000D177C2085FD3A83767881864BE279BDB24
+:1033C000152370F42ADF5FC007187FD95C7275F28D
+:1033D0002451DE63CFF4A4E47B6F9131E08CF32BB6
+:1033E000AE2D51D56D455983E2311C6998196FE1B5
+:1033F0009A4A76B83DCC7CDB5C325C8B312E782AE5
+:10340000338B6B5D4F2E272925F55E6C7BC2F998B7
+:103410005917BF9DE73D4DC978DDF36AB686A38F86
+:10342000450BBB06E950264CF5C187DEF18E47E916
+:103430004C9D47ABD9AF82D49846974494FC59E24F
+:10344000BA53A3C33B34FD522101E5C50513DB6A22
+:10345000589AA57AB9EEB865A769FBF47091354A18
+:103460003640A344324AB2C8405C86B76DBCAC1348
+:10347000744D8332548C42B6B35327ED967B3C7C1B
+:10348000862F8424D07C76BE2B7913EF9C30E7F412
+:103490000413E871CE25C331CDE8BCD6497E5FF276
+:1034A0000EC2202894724478115324332CD84BF444
+:1034B000F0F48B67547E9AFDB56E6B7604F300349E
+:1034C00037546660768C7BA4132E668BF2F1B3BB07
+:1034D000D89932748DB710958061B74561D0DB7D86
+:1034E000654ECF79CEC9D2CBA54A4DAD90F919839F
+:1034F000B15DAFC9A4DFC5B17A96E318C130F0352C
+:10350000CE36DE7A1EDC4C1CC31BB01A6743FA446D
+:1035100046037F94D113FBD8C745F16D32BEB3BAD1
+:103520002CAD192CB9857EB6EFCB894B3808C26615
+:103530008C05D714B28E7C02627CF6E7C04DCF407A
+:1035400038861C9D2CDDF7145B479019AEAF9DB0FB
+:1035500049AB4150CC02C6CD13030D8121566419ED
+:103560001CFA1200CC56C4F980D17CAB8B5DBB4AEF
+:10357000783A606DFECAB1D3FE6A8AD26DBF8CD430
+:103580003A9E274D5A999B7C6713C7853ED03400DD
+:103590007777E00BF763C341799D218813EE4DCE19
+:1035A00094F9FD48E636AE375A622FF5D243F9ABAF
+:1035B00053D0B4C82FD42479B17DDC882BD127E532
+:1035C0007D59CCD613543FAE8D31AF94CBE0D3228E
+:1035D000E14D05DB170048FEF2E694CB6D351A107D
+:1035E0006B7B0910E2DE96076A0183169231BD8378
+:1035F00013DF8662FAC083AAE6BF43EFCE8F7C6FEB
+:10360000133CEB1090FCEC22247005DF17AA6740F6
+:103610009F52517B58A3BF87BFBD5E2501DB6F68FA
+:103620007AB2A9134EF9AEBA4D5BF9A3F7937B3387
+:10363000193B4AC6C0F821571845FD16FCFA53DE5F
+:10364000FB43E143BFB5A16EEA86E685D02F2CB7D8
+:10365000F48BD24D01E80325ABFC89D3D38E9D5664
+:10366000C9BBACED481118FCEA8B3A77AC4371AAA0
+:103670001BD3410FE29B17F4289BBCA6F8DA4F5EE0
+:103680009DD560C424BDAD56083802613BB0A92267
+:103690009DC843EA219CB6743C85B2E6B4DA9177C2
+:1036A00007168D6BF481B6396624F77E45D436E46F
+:1036B000D01F993A7DECB120ABC57861E3934E8D74
+:1036C00022023B00BF9ADE42F8B37E612FF7AE3E86
+:1036D0008577ABA5F3C8084572377A4EC2F10BD097
+:1036E00041838F603A1E7E4DA0BECC35D7812A7DA6
+:1036F0004154914B715B4B37454860F04343DE3694
+:10370000EA122C46019D6E7E407780E848C495A061
+:10371000443B60C70C27866B0DE6884E496F9EAD13
+:1037200071997A6B1A7C2E0E948B022078EF7BAA0B
+:10373000D98E3713D0E99E9213BE816808BBB3F1CE
+:1037400048D5E5B5998DF46160EC688A04E050C312
+:103750003BCAA58C4A9999D2CF5E4C233CCE3827E0
+:10376000855315284C6149534A5EB6E1A7CCE65013
+:103770008681CF88B1FE44110E5604A2F5BBC5D197
+:1037800053991BD43F979ADEC40E864277D6C5C3A1
+:10379000966E32CCEE95FECD0D715181F7240EAAB6
+:1037A00032A8261FFECD081908CA5FDB9AEE2D7DD0
+:1037B000C742FD67AB9D35D6AFFEC02A457ED3F725
+:1037C00063E64F8A62CF51A4F3D6E591280CCC4D25
+:1037D000C44496A55F13394D343E2F8C09C27969D4
+:1037E00020DE75E8517291654F7F7CBAF68420B473
+:1037F000C02E7EC0C02DD1BFBA85AE26538E88DDC7
+:103800008A37F96FA496F8A74F1986D8CDF2C4B9B4
+:1038100018C41065001EFE7B9127383383C54661AE
+:103820002D7DF1CEAB38F88ADF5B2288FE2F759BA9
+:10383000F2E53FC368064BD908BF24D695E1809EC8
+:1038400083A4F2E30048ACA7C94DF27E38F135CA33
+:103850009165169A2FCE3FDCA87FB91F12BC86E473
+:10386000A006A2D6763B50E83A6F5D7561A09A78C3
+:1038700058D6DD09D9AE7274CC8B516FE4617D0EE0
+:103880008E019207DD6F87266ECBEA11A04F9AFC5E
+:10389000924655239AA32B7A0E444E2BF8C21B1541
+:1038A0008CE3DFC0815DCF5B479987EC36CF333641
+:1038B000FD3096DF64B1BA853B6FF9C85BD138E85B
+:1038C000954E20FCC8D38DD9EBAAF15404F07F7F2C
+:1038D00064725227BA865A20817878514A63688088
+:1038E000F50C5EF3B6A059A015B701ABF57823949B
+:1038F0004FDB6A3BD4736C5F07055BB5FD62367FB7
+:10390000B9FC1ACD4BC7E2AAA0757E7122FC1574D2
+:103910003E12F027ECF891DD7F615A262DA9F3F0D5
+:10392000F50A64B5DD99E72FCCB4561A8BB435CAC5
+:10393000C5424815595B53189DF60D1D3A97776897
+:10394000DF36102D924B883AC222CA855CF7E6EA30
+:1039500063879708A0906B4700A87A1A929D520639
+:103960007A7B1274576C830FD34263C14EC43D32CD
+:10397000680D2B6F6028C9CAB8916E1B9C933733B2
+:10398000DAC53B8CA2F592CE0ADCA582B2B2620205
+:10399000576EB53F88BE0EAAF2C0E8878F490EE881
+:1039A0004AD461AE9B85B8965EC0C356031185E0CC
+:1039B000D257AE7ED8C85744D1748C035E137B7542
+:1039C000E7559E519301747448D1F2B1C336756DB9
+:1039D00030BA01D2C5D336D23D6E77FECCF141B9B3
+:1039E0009E038C5BD2AC6F63B74B301B89F8A67516
+:1039F000EBBFD51CEE21BA0FD64C2373C27698913B
+:103A0000D1C757C1B854105B17D4E4449E3EE17C43
+:103A1000439581ACC6295B0C644C4F32951D76F4FE
+:103A20009B21FB991B5D9EB15AD563166DA85481ED
+:103A30002F25C31FF314B7F65ED38D739058279EBE
+:103A4000D1F0C596C888026AF27C26D23DDE89AFE5
+:103A5000112A1853E35B2CE0B7B68789191FCF7B77
+:103A60002F136B4026F0A4A0645C82D0BBB6B005D7
+:103A7000FC1FE1F12DF3CFB5C5C3CD452C02D7A175
+:103A80004BCF97D4B31AB9F6BEAB017B14D21B153A
+:103A90001D27261DBEB104B484136FAA19B69977E9
+:103AA000456CC2319CA6ED85AE2EBD7B9BA8E3EA9A
+:103AB0005EB37D684E35AE8DD2436203C3321F8044
+:103AC000AF6434D3B15D71ED3CE6A6F08AD2AE129C
+:103AD000B81230B1F18757453926CCF2B9561FDEFE
+:103AE0003D21CC51C4B5F80A7A2B51E901696963CB
+:103AF00082F120522DA1DEA1A0A2F52FE3706AA1D0
+:103B0000080F6A68ED7EAE5ADE63A10DDF079327CA
+:103B10006A4059925242038A96077D3C4B6B0EFFD6
+:103B2000AA43FE0C0FA8DEA8D874453FCB3F33A1B3
+:103B30001764D9D564803477B52386AA0DA55B3880
+:103B4000196EB956092579F6AEEB5E32A26E6CFF9E
+:103B5000203CF7D7783352C742FC2E7C4BBA69C35E
+:103B600025A9212772C0B812BDF547AAA016BC49E5
+:103B70005A6C80FB44AAEB55FCE42ADC158D989422
+:103B800046DA0E75AB03231582D2920342A6E6E312
+:103B9000D2D2104D26F5FF50E3F1F96BBEC3C4C07D
+:103BA0001E23A5585D027654078ABA3198095267D8
+:103BB000CF795AA4541D7E9CCC76D3AA1F151BE640
+:103BC000C210EB59988724C3FC7C082864FC67BDAD
+:103BD000394C4337C8C3CB01CB000843D50F51EE56
+:103BE000CFC0036EFC1370EA26D35490A613A1CD68
+:103BF0004202FC44C6E6F0A72A33B8D3A74DF17AB7
+:103C0000C3F36EC87BF71B21D4EC5E6103910BE913
+:103C10006E0A4C74DF6F363F4D43DF7993CA864A94
+:103C2000EEF89B9EB6566D43AF8DB4B42D3615F3AA
+:103C3000781F2E895213225C189B387843F3067044
+:103C400076030639CB96A19D6212B4E137E7A9C786
+:103C5000324CC54D850290BF89FED737A81F6AB088
+:103C6000BA8DEDEFA5B7DD4ADD39EAF5A639E39760
+:103C7000DF58663CA853B2B736DEABFFE73141B33D
+:103C800053EA9CB39E97AD08BFA034CDBFAA12875C
+:103C900018E6E2C6AD3D436041C17621BC85632D87
+:103CA0004201AB9D586B63106AFE885D8FA03D9CFE
+:103CB00021C239992DFC661FB0AB4F3AB1A615252C
+:103CC0001E88329F360849AD3B9D2E356903AD50A5
+:103CD000EDA78E86B61C64332A07E2B1885AA6384F
+:103CE0000C9C46FDCF6834DD9A5156AD9429D6958B
+:103CF000DD3B0E13FE4528E9A28D478C15A61B4916
+:103D0000D95AACBEE491D02D68EC0F02BAB5803A16
+:103D1000D1D8D0C3621B7DA4C3B5E41C6AC94CD6FC
+:103D200061553337B524597525DC8EC1D9CE572757
+:103D30006F71BCAE1468DD59C2A6FA0CC746226981
+:103D4000D5B3A7EC3B96C340C9391C9C0EBA4F5162
+:103D5000846FA1A6958C4C1820BEC01360CDC318EB
+:103D6000FACD37814298448260B9B7DD7406478640
+:103D7000894F3CE63A1506CA7CD2E27479FF8DC7BA
+:103D800065CA4A91F3C4CFCE4222FCB7683FCE81C8
+:103D9000BFF25089B7D7AD552917BABD89F62D01A5
+:103DA0003B2619A32CAB8AA53CB340369205A0AEA6
+:103DB000935452FE5F61673705B37B97125F6C6067
+:103DC000FDFF90205DBA093756E47B652AA194C5B2
+:103DD000FA71421F8CF720D27E061E84906FAB8B47
+:103DE000A4285591C900731DDBD54788E53DC475EE
+:103DF0008651B3795AFF706A5B51E35913D9D16A7E
+:103E0000F2E0473DF5D3018F3981764970F471BFF7
+:103E10002BCE5EA2792DD90391A5D420B57CF2A337
+:103E2000C06291ABC1D9E4E6114948EFA35A048AB4
+:103E30008EF24360103F53C5E0CDD1C60415390959
+:103E400006A3019CE21A5C1E4A950C2811114794A6
+:103E500071A58C78277B7B5AE2AF2E9E4F9AEC306F
+:103E6000594730AE7C1F4146DB4C09A39000D58DED
+:103E7000040339D1F60624743BEC0FDD5407CFF56B
+:103E8000E0215755A400B137D08FB1BFBAEB3171E3
+:103E9000C32125251C6E143C4EE569688DA3FA9F4D
+:103EA000364CB2C9D834CCF899BE89C6AEB2C2DF9E
+:103EB0003036D06788A6AA57EE28D04D44AC3819C2
+:103EC000AAA24E1633C698872DC93CACEA7847FFA4
+:103ED00033FC61E2D81167B62A5E2D71F33FC1E66B
+:103EE000A558A7AB51AA908D38D792746135386E1A
+:103EF00022EB1632BC53DAADEF8DCDC315AC08C53D
+:103F00004DFD3D93C8D7C16FB923C3C25E19149D3F
+:103F10009B1684EFEEC73B1A90BFB4D9F37A231FE8
+:103F20007A33D3BE68B1EF71E5C680B09F6B89F17B
+:103F3000A0AA681EEDA153BF92E89DCCFEBB6D10F8
+:103F40007F81979207F8AC3F92C6FA60EE6B9C783F
+:103F5000BD605DFFD294C2E1A26EB6BF520FF703FF
+:103F60007FB949FA87B69805F4306E33D1D0CFF8CF
+:103F7000E8D474F104E6095EEDF5B9BA89583BF767
+:103F8000800FA8957642E51D7FCD226DAFD85454A1
+:103F9000CEF37D305C6CB6B25D5C13822920AA82C0
+:103FA000A31EEC9D7D44B5FDE460DAC4FDEB21ADBC
+:103FB000D44BC09C7DF322A961F31A8B4097AB5977
+:103FC0001B06AF91B4C10FA2FAB2E3B6C0A084AF92
+:103FD000309F1F670F47B053A3E297DBD3B541A2D1
+:103FE000B41EF456ABE9DC41F200716B5FF0248D36
+:103FF00003AC96B1F1A5C6D76C2749FE0ADE4F0582
+:1040000037FB61CC683005F4B7A75DB623C92098AB
+:104010006A1A9E0B5E1132A99F9D23DB7D99C6CE45
+:10402000AF45F167CB38118B03F9178D1903C22601
+:1040300023FADF81046F30958141F36EAE949F1DAA
+:10404000015BE57766229F85E215BCA8B6CFD198C3
+:1040500020B0D02723D2BF081F8A9BB90C336ECD66
+:104060008608FE94AD408BDA3D4A1C39295CC3B802
+:10407000C629A6A36394B40B5E3C4928CF0F6E5E9D
+:104080009C6E3576209C34851A638AB46B5978FB14
+:10409000FD9E2DB8B9D05FB0DF53A32A81D3C28271
+:1040A0002AFE415C00356A69AEE8CEA135338E4FF9
+:1040B000A68DB626E255B8D304EC114394BD4077E3
+:1040C0001EA3F7F65365027001ADB750FD0BE298E1
+:1040D000948584E89EB5F8BCC7D434EBE9CE926EE3
+:1040E00006A2A0BC0913E4A1E568888437589ED7CE
+:1040F00085A1AE876748429F9E799B4A2520A2955D
+:1041000034FAA927171F9541E98926D46C60EEA2DD
+:104110004D74A8382B1878A213C3C66D1C88FFE510
+:104120002AC3D68B92F9A72C9BC2B064593A416638
+:1041300059DB187BD493B9B66260EA1A2D61A76A7D
+:104140000CB48E899037EA9343A8EDE6B52FBA2ACE
+:10415000E9CB8261F39B72857669E7698ADE154F48
+:104160005EDACB1BF36AB905AC3FB83395FDF4C3F7
+:1041700039C240DA4FE3754B34F086CD1FC3B870B7
+:1041800086C3D404E9A160AD23E17602DEDA0188BA
+:10419000B2A775E53020110DD1859F08B7FC551FDA
+:1041A000B8E5DACED4AD2D8C9095FD156433590A5F
+:1041B00064B3EBA78235129A6D7F3B1B16F0131D7B
+:1041C000EBE42E2DA16281E5A8B90FE7A03012BD66
+:1041D0006DF5FDB3D34C641B1053AFF25D4293E415
+:1041E000EFAAECBF229569DB0521CDA98B3AFF141C
+:1041F0003FF714CC62DB691F12E46E3EF81526C14E
+:104200005C13D136471E5644C45DC17D1FC95E078D
+:104210005DBC116F0C01A8418C0D7C7AD54AA6516A
+:10422000479945CA5C80142F25EC0437702291050C
+:10423000F10AD2912DB4F5666F8F1DF774E5620116
+:10424000B29B06819FF51F62843F1C4E4A60C9D80D
+:10425000B077382878D6BA13BC53937FF5260A94E2
+:10426000032F94E04C7B8009746B0890D34691EC4B
+:10427000FEC2D6918628DB26A1B38008B6E4339728
+:104280000B0C412E80B3725175A6DD2C880D9D203C
+:104290003722CFE976DDA0FD6B017F9928924B4252
+:1042A000D7CD2D0B9D0A50458F230993378766E0A4
+:1042B0003E0A32733B1F3F38F77A0DBB157BF53052
+:1042C00000232BC37F62CAB7941C32E8E3E81A6369
+:1042D000D94952899127228B6558C66D4696D85682
+:1042E000BDBC7BF6F15BE6BD3C0FB3D99E21F97DE9
+:1042F000BF9C8ADE3B79DA50BB52EC26A6B7C5B824
+:10430000E00B5CF6346E51F56986CCB918071E993E
+:1043100051E9115647071FD2B1980DBC1484B1F66C
+:1043200086CBFCBCC48C87F91A43EFD2E769566888
+:10433000C62875CA835BB2113FED7CAAFCB80AE7B8
+:1043400048AA6FF57AE8237C34A76D3CBDE2450CA2
+:10435000306EEFFAAA1AE58FECB1830F28ACA6CD28
+:10436000AE243E071F00DC5241241897CB5FF2B900
+:104370001F5F2C5328B36356201CE7FFAD6221FB5F
+:10438000FDF0DEE761AD5C1B2B242CA35342AC1780
+:104390000F98A0905873076C19D5BE7F2EDB62145E
+:1043A000272EE8DD9F70D323F7B5CF419B32A214AF
+:1043B0007F1E55E767AD41F68E5CE22527E0F9D414
+:1043C000827164D0FD2DC1211E6137FE7EABD0A568
+:1043D000501C8B339F267325AF9E2844E88B7A03AD
+:1043E0009E6918D309B87E9753A81582E6AD987ECA
+:1043F00023A3ACAF54789840A30362144D3FB48814
+:104400006184E4459BE7AE337B9E7A30C63995CA1A
+:104410005D7C5B148AFADA2866C25AB59FF70955A3
+:104420009301F73F636BEB441DEFF294457BF2631E
+:10443000696CA9845ADFED5A24D336EFDE3FFA7F48
+:10444000E83DE4EACF3024F7503BBE0168DF2E2D73
+:104450000E2B08602DE71B6D153DC7FC35B4FD2FF5
+:104460003434523B56A489A8C69124E661101EE953
+:10447000563B0CA10A058A4DA0C86FE22B7D0BFDAF
+:10448000847ADAB5D73A59F372A5CA75BB97564EF6
+:104490005D80AF429ABB0DBEEC030CF4D555D90438
+:1044A0005623EEF069C4B64D1B1094C49C89FBD40E
+:1044B0000F07F5E472F1A2D07117CE8FC7F800CEC6
+:1044C000DDB779727DD6D1F388202300C15AD08818
+:1044D000CE82228F4CD388F102B2CD06381E98EFDF
+:1044E000CEB62F0F1FB513BF5C13B2D712CA27CA9F
+:1044F0006454C430668162134CFFB30A00453E71B8
+:10450000BF27BB1C94E3C161E6E6DC81279ABF4567
+:1045100071C7F3F2E33BA4E63DDCA36B506D1DF2E3
+:10452000393979A3B2F2509369A50CF60A7FCBEF23
+:10453000A34CE8E0EF43D8D3A8BDF5779438FC3618
+:10454000801025838097E523B76EFB6DC0DD8C045A
+:10455000208F9C8266500A1261E0832E7631CD292D
+:104560002318636EFE0E62F6778EA5F7E368D7F622
+:10457000DA37AA77A6BA2FA49F63B1E6E162E48294
+:10458000C56EA0BB3BADB7CDAA55482D59E3A94197
+:1045900075B2CFFDB4EDE983BED211BA2DFE24D69B
+:1045A000E6A1DAAD07A71306D1EFA7F6D55B8BAB73
+:1045B0005A1E4E7A8C1E945994616D47D95CED2E2B
+:1045C00039553966134C315038013F75996CBC2B05
+:1045D0007AA92D84B397E55D3057AEF544511C1C84
+:1045E0009B16786A3A12512BB99F1EDAAE933E564B
+:1045F0000F4A998705AC410F7A9A740BABAB08D37D
+:10460000E7FFBA36ABDC98896509F482E059A27CF1
+:10461000FC3F34219AB99B6A2C4187DDEAEFB3ED68
+:10462000CEFAC8EECE1E162D2126F0B6967144079E
+:1046300050E1930BD2D2E51B2AB1C39E644C7CA1FE
+:1046400060AEC545E92C6C277C0B95123B6121A916
+:10465000B59B2B5E3C6C22B59169A73DB64F3834B3
+:10466000B46B59FE7AB005EAF932DA6EEC92A4899D
+:10467000A4A2E137A6F2392DE60C2861AE7272646D
+:10468000A180B50341D6E12AFD7F618C5DD9FD8E05
+:10469000944A4F3952CE7726B82EB007D952F776C2
+:1046A00093010335110AC4143FD93B36B2B983468E
+:1046B00039D2FFCA7B911DABAC124E90B02D336145
+:1046C0000F5AEE2593BA942F6E42BD56CAA08FFFA3
+:1046D0006C612A6306E63B17859F337168D2E6DC7E
+:1046E0003F563D5A6945ED2D24E79EEF5655919F63
+:1046F00058182732F414B20C878DA409066FA2D87B
+:1047000052FD0969EA2A708D64098EBC90B40A10C2
+:104710004B331C5C3F5124E5A8EF62DDDDEE156CE8
+:104720000967D4D63212027EAC12F1CED7896CE082
+:104730009F953F4C218B742DE8349486E590F4DFEF
+:10474000BE387666C80E4059C360C6E60A7C8CEB5C
+:104750007AF4920C1D1A15B6340875DB79CADBA6FB
+:1047600034FCCF98AD415C936D2478B622B07A5D6D
+:10477000646B130CB272D5D6428588E9A497AD2438
+:10478000091E6FADDCDC1E0C86273D7185B50E63FE
+:10479000F01BF88D42719F82582C2F7F1174AED57B
+:1047A0005D5F2A93E1E2E6D57D7392EFE8E8B41B02
+:1047B00081361BE92CB2812C623D69D481F9EF7FEF
+:1047C000E133BA1498AEC554D53065C700745C06A1
+:1047D000989328831E823153F603D784FB105B53D2
+:1047E000E7B4BBB1182FF52A1F3AD4C6C7BD53038F
+:1047F000B6ED27CD1F4ED4C43FCEC60D684A292C36
+:10480000F2DA22FCE7E37755A0641112DD80B2A34F
+:104810009CC81B7C5DA1B69E546806829BFFC46C3D
+:10482000930433807D13E6BF98923363C19D54A1F6
+:104830000BAB043A0291818845420CCF07D6D326B0
+:10484000C86E54F7D5B3F3673C2AB22F032F666DB9
+:1048500058E44B80BEE4C58A47A0FDCA36A8AE7EA8
+:1048600065E0DB54B3B6E9E86E295E14FFD84FE289
+:1048700081052ACDBBCFB2818E4474799A79793380
+:10488000EF6FDF4F70B451BEA71BC498F0714BB2ED
+:10489000D33715DC2B92ED12D24DB160559CFD81C2
+:1048A0006DE5F4B42B9BE7C1EF0E3720C87F478E30
+:1048B000CD2CB2ECBD3309563D7A89328F7E920FF2
+:1048C000021E8E925AEBB9D2827622D8BB3D25FFCA
+:1048D000206B89B7CC251DBE511C081A32D318C6CF
+:1048E0001EADA6C8267D16502E231B807D06A47AF9
+:1048F00030B6E5868E97FA39272073A6333A199099
+:10490000F85773B71A0EEE49C69F18882D229BC719
+:10491000B00E51A297425078C20132F415AB418BD0
+:10492000EA91FEA70B8C4516139928AB713EA1B6F0
+:104930000B66B03488BFDF56AB4FC9ABEF73FCDA00
+:1049400055B136BBD69996ADE4DD369701856DC677
+:10495000401BC53490358199AB5F46DC1403D734D6
+:104960003980C5EBCE07B46C221045F7A43F5C77C5
+:104970001F7324DC4CE6B158A7C2C47B878B69A2A5
+:10498000F1F3C678A6E8FC30C7BED40D1C16B84AB1
+:104990001BE2A204E8962A41EEA3CDA668434F7D10
+:1049A0007D83F2EFE30414B9725CF99149AD788329
+:1049B000F61F87150310465F98F023E083A346C8CF
+:1049C0009EAB79D47E0689470EB9321E4B854CB119
+:1049D0004BCE4EF7C0207E8A4ED0CF2906729AE485
+:1049E000648EF5AB5AE72A62E865A8F2F9CB0CBEF3
+:1049F000D433D7ADB2DFBB7791E4C93CB3FB03330B
+:104A0000CCF6B13344F4DE06418C2798FAA9040EA3
+:104A100065053EF2FE52A6E819E76B0D7AFBFB57DF
+:104A20009461A98B0737F561265737069093F68F67
+:104A3000CE4EE14430E5D2EF60D242A6DE6846AB0E
+:104A4000B552D09E35E4E1D7F1E286392114284AE7
+:104A5000397F9C746EEDED17DC0D249A283199BCDA
+:104A6000BEB06BDA40F607A0631BBB5E16B0E9C2AE
+:104A7000F09E2955206ADD01DF80EF384B27AA4ED2
+:104A80007C77E173C1416C1CE8D1C436F663D04039
+:104A9000276E5DA2AB77E6B33C6FA8246D42F99513
+:104AA000102425FA1924EC60C6A37E00311B66246D
+:104AB000F4E1F5FEE62531DC301A95B7517671B197
+:104AC00060009AC9616B1D9DD07E0CD4F84333C63B
+:104AD000FC1940DC5AF8D43975B2718E12C2DD4D22
+:104AE000CC68DF00C9242A491CCA1829C15D9D2150
+:104AF000236F5FFD987805A139E074AD17D8DA7699
+:104B0000AD2AD015A0D62EBEE4909CBF90BCFEE48A
+:104B10009B4EEDAA915EA9FDD7E2EE8E745DA39641
+:104B2000B25B244542C2350B31908CB9CAD265A321
+:104B30009DE7A153F1C6B75D782A1959577B97C2F3
+:104B4000B66BAE05F9FB72E9D4A21AC075BFA6FC1C
+:104B5000DFC9A6FAAD53F5E3C282A54F6149847A55
+:104B60001CD41081A9CCBBA4F2AC3DB67F7318C590
+:104B70009E92B219C2FA2C332AA85E0F622D6E9053
+:104B80001C24F2C0BA951C38E5C3640832850C3881
+:104B9000DDEF6E1791B1538A8D9AB6F2351F1B5017
+:104BA000F1D91FB6AB3453C0DE52D5F432F0547D88
+:104BB000FAB87CE170943F8EDF6E904C912AD10D53
+:104BC000CC3113364AFAE6B1E7D9D823428599E7C2
+:104BD000B323070879A52AD57E93D0192138610A15
+:104BE0003D96E7F4178F3A99A72407D4925C18BE34
+:104BF00061BE3650AC41E30FCBB8A729F9992646E0
+:104C00006EA771B92E5065FEE381A09AD8F14518C0
+:104C1000785762B7624BDE71C82FD4A05B311E9209
+:104C20002ABD8D3CE1382EABBFD0A1028A682EC4CC
+:104C3000374979ECF4740BCDD34D5C181B69AAA6E7
+:104C4000A1A04981768483701403CAFE91BB9307A7
+:104C50002A2F6122AB5A869A6396FC747ACEE700BB
+:104C6000A5842881834C5792E064C32F534B58632B
+:104C7000D738E2110411FD0427186BF6E0FD4C2B28
+:104C80002C974A5825B036B45FF4ED153576155C8F
+:104C9000A3E875C8B2E223296DDF42F9DE44D83DAE
+:104CA0003E676898F53F0EAC21EE9E050CE527594E
+:104CB000E12FD27FE5B2141E818B4729BC4F46EC11
+:104CC000F3AB07821824FE5557CAFB7E1570B481DA
+:104CD000C4F66F29BD74ECAAFF7A298156B6A40BDD
+:104CE00063BE7CBA6FFB4BD952FF6E5D784C326469
+:104CF000330E718531D7F5673C93E42E5D21FBB906
+:104D000091E4E4E0AC9E135FD08E30B47A6C5444EE
+:104D1000527F4D61AA073ABDB99C5C029CC61649F8
+:104D2000EAF86B21280BA3FAA12E96BFBFC1955CB0
+:104D30004BE08414DC62FF3397186863AF63A8DD2F
+:104D40007F396C33DF34EB7D43350F52CB55BE5D7D
+:104D5000C969D85972512CA9BDA3F761246DB0A5BA
+:104D6000D1923A58BC87C25463741007647E285E9F
+:104D7000CC5551C9D13EE1339C09311E2095E73015
+:104D80007E4853791430E2104EC15D49EB26300362
+:104D9000DA6E04B57A4B320C28BFD94E187972A658
+:104DA0003450728AAF2700497808AEB6D95624CB62
+:104DB000CC3CB574A91B0F7E488A1251E2D91284EB
+:104DC000E9E6103483522C3EEA7E61A3638B675878
+:104DD00005C2D41982CB3B1EDA4D72715548B41FFF
+:104DE0002C5BEE82EC389BDBC04103A19D6312D3A8
+:104DF00027AA274EAA233B98F943C67D2328591D8D
+:104E0000918A36398B0237AF431A08C5E70FEEC5D2
+:104E1000944DFC9F2B3783ED720443A79B3CD8E451
+:104E200000E8C1C96BF6B2DAAA01615237F3ABF3FD
+:104E3000F75B2CD61FBC1526FEE78E0809446E4191
+:104E400054B1F28F952390E98B5F911C02C5FA70E3
+:104E50003EAA51195BB76C50DE319F7C04AAD10386
+:104E60001EB5AD36965A4C13BAAD5615CDFE0CAFE5
+:104E7000277C70CF0834DA6D2A08C5423E573F3888
+:104E8000243FD34644D50C74A0AC01AA866482E1C9
+:104E900074757E622D86D845BC68A99AC1C8B7ECE6
+:104EA00016B7D23CDB2FE68B37ED02B7397FE1B185
+:104EB000AB835EE22854AEA7DAE6CC5372644C6C46
+:104EC00030A325CB1D120C6D0D4B70AC94893AD3D9
+:104ED000E4649332F88DDC01032DD1D49E1A401185
+:104EE000D7C2A6C693752651CABF8B94000DF87021
+:104EF000E99EA291806C231786E1EAED4C5459801B
+:104F00006CD4882A18031931C01C985C6C3F0F2C94
+:104F1000916CB37B13023CC76E612430D5708682DE
+:104F2000D67D3E183EBF3BB9B17F8749F81180CA94
+:104F300031596C96E3826270A3B3267899CBB2CED6
+:104F4000A4968F52ABA48A6B3BB50B12DCA0F05F2A
+:104F50009DAAD2556A8088649B6F67E94A6090A9D0
+:104F600084389BBFADBC5B5E9C0735184C2E8EC54C
+:104F700079DC080CCF8A3EC7E38804F366B5EEE51A
+:104F80002BFA337186AD41E1AEE50FE8B3F99596A2
+:104F900071BB1C50A6C19B5FFCBF892CBD8F144503
+:104FA0003DD665B5EF27E6880D0991640D5BFEF2ED
+:104FB000D7452F11E20684BDCABD0F91BB5C7BF5BE
+:104FC0002C58E62814D2EC9B43D154DAC4A861F8DB
+:104FD000628DC12394593B7F4F66C50E78270DA083
+:104FE000FF71BDEDCC6F6373EB8FCCABC5259779AB
+:104FF000C5F08C8C92EE7ED62ED5BFFAAE50B2B9EB
+:105000008D22687E7340C31AE53268498C73C86C80
+:1050100029769DCB05B2E92A32779C7CB44570D8BD
+:10502000D61C5253D8D5810EC70D8FCF4E02FCAE81
+:10503000C188D5678395B782FCF79683EA08F8267E
+:10504000846298C6069D2EBB83445281F1603F1650
+:105050006075512D62E9115793101C57926D612AAA
+:1050600090CF2745B99123318017B35D92771748C8
+:10507000875E66DF89FA89E7F5EDC32237AC784FA2
+:10508000118E770FC55F3502A5146FDEAC4630A9CF
+:105090007CE91ECF18D3E62BC761B2B92D42504828
+:1050A000242C405E1504BEB16C96E9BFFFB836658E
+:1050B0002EA347A3FC7B16817C556C821CABE78238
+:1050C00081F4099108530B5408888EF72FB4EDC270
+:1050D000A3165F6E94175DC244F64CCB6E1E7EAE77
+:1050E0003CE647B369695646B405DC762D455675EE
+:1050F000FA9F23318A95A364B1CAD5A7F50DC6E1FD
+:1051000060D5E282C0785F54711BA902134F98C02A
+:105110001A5CC918433DAE8B375FA9FA5D8756E527
+:10512000D4F3FB0C4154BB9F3FDD765D13AECB4BFC
+:1051300099B297B7249B076AEFEC26954EB0C09BB7
+:105140004A73E4A54FA020D403718562466671CDF1
+:105150003FB1AE2918B3B6F758B51D14129247BE29
+:1051600026361DE591244F43FA0B1929C05F1E0F07
+:105170008837FF4574AA2AF6C61188F0870D568431
+:10518000CB0B2B597F35C2DC36BFBFD1A8D13E82B5
+:10519000AF369BED270A5244234B7FDD30073BCFD0
+:1051A000D5C127308E855FEE7CF32FAD52E1DF8EC7
+:1051B000F7B11A03ACEB37C479B45B5AE84B228AD7
+:1051C000A76B15ACC6D1CA1B5E9865EB04367F078A
+:1051D00079D51AFFAF9BBC136875C919BDCBE50221
+:1051E000D5DEBA45D5C3E52DE5062CD1CBCCB65CD2
+:1051F000E9A65FADAA748891ED8A4A41B1F3B17016
+:10520000E1A6045DA983D02D04604FE15BB0929AC2
+:10521000FB2AC479A7A75B895539EE9139EE695EFF
+:10522000EB92FDA8079D4B1975C9AEE863B9894E8D
+:10523000ECADDC09644B778F1DBC90E4B63E0B638C
+:10524000BD6D5C816C1A295DDD047B647EBCA5802C
+:10525000AF860679C8DB4C486EE44B79CE4231C14B
+:1052600099ACFDF47DF0A67EF695AEC719489D3148
+:10527000A71E3090EF4A00C3DDB6552AD8F70C1EA2
+:105280000905452B28CEEBF3D68B838E23088AD0D5
+:10529000B06C38154B766435C21697C7806DCFA2B7
+:1052A000043EAE377A14C7381228D4AC1261D0D875
+:1052B000A20610D4AF6D80A8DAFEE2D5144A9B2E68
+:1052C000216CC79FF1D98214465D97B59A8087619A
+:1052D0008B2D8857B7526B707BF643E44FBC4B97CE
+:1052E0008156256E88C70E119CF14396E8003FC396
+:1052F000FF2548DCF3DB9B4F0FE4DD998758547999
+:10530000E6BB1B67471E381AE81199435AECFDAFFC
+:105310007C4DAB03A5FD10747155FB01D3C108BCD6
+:10532000604334FDDB756A3D081C868C3E54EA8E72
+:105330003400AF229CF803D031E6B448DCBE90DDE7
+:105340005B4696F747DE7F9BF011DB3F2EDA66B3B4
+:10535000E148C1AAF435DB67BF69D3F1BBD544DCB2
+:1053600018CB966BC87004F8F6A66C0D1BFB64E0B6
+:1053700022EEC49E6AEE583E659D3AC35030CCF78B
+:105380007C5529643301F0E7455B3838285B7D772D
+:10539000885DCCF4AB595ECAF3E130D935AF66F124
+:1053A000AEFC476088ED09B0F1B171105A04FB7F83
+:1053B00056E4679733812C284C11490647DD789CC9
+:1053C000BA7FE0F41E3EA42313B6B836E92AC12002
+:1053D0003D0DA6C969135A63313641D8B2CD338227
+:1053E000E5A78DB1DEDA68CEC69FC0E4ECF5F05BD0
+:1053F00093EA6DE50A2943CE0F405CAA940527EF96
+:10540000CEE4F3E9C2830802F8E87DDDE4C374ED7D
+:1054100013C112FE1FDA5BF11FA5A02CD8B3F5480B
+:10542000F270E6D78D2CC2C375DC7A0B68CA7B9EFE
+:10543000910629931EE9146895AC2D8EA56C656FB5
+:105440004F1565856C8AF148F5FB7C210EF3111030
+:10545000F8E53574A9EE94DFCC626AB3E876C10F43
+:10546000B244DD80FBA4D637C4C5D2234EDA85A66C
+:10547000AAD90EEB2663C1A8693CEFE50836512294
+:10548000065A14940F6FC7112D148E756F32FD7C60
+:105490002B0548749C3C3F3B01D1EBF4074FDD8664
+:1054A0002448C61CCDBCA2B62D100AA1D6022AB82B
+:1054B000BF0C514EDC9C02F8910055D5EF9C0D6B52
+:1054C000A6AD1B5547B0CC76AE0C937E9A4A7F585A
+:1054D000B8C737CE10953E536228C9214F69F9F4F9
+:1054E0000DF102CDC091443C2574AA25E5110B8A2B
+:1054F000367FEB89E9F420357836E49F18C68E2094
+:105500005F8F17D1031A57A2451B1C6B7C86F64E82
+:1055100018267406DB90B7376F2A4051FBE3C0E8CA
+:10552000746377EAC7EF0765DF32CD679B794EE694
+:10553000DB2DFB27CA92C82BD9FF086DC0DAEF3FDD
+:10554000FD97A44B1925C356F02A736B2B0AB61688
+:105550005452ED7D739A97B938569C48681D4AE9B4
+:10556000989E577B15FD74D9231A3C4785514E757B
+:10557000805D20F6753F605BDA9DF724A63BBE0E8A
+:10558000BA347FD5A9F27E0AD2AB7AD7E4C353F7F7
+:105590002399DC9DAA885D77B454DBC8FCA9A7AD2C
+:1055A00092E7E5EFDCDA97186B3F7F1FD3C352C950
+:1055B0009CAD2026F693989E6C61721BB45C1F9183
+:1055C000A67062BF3218A80E7B37BC9CE6D29169E8
+:1055D000ACB5FEAD2DEBD0EC4C4C5D1D3DBE1E4F71
+:1055E0003C71BA4B6772E2DF2F7E6CF1845C00B9CC
+:1055F0005659A56B5FB14BCED9E6EC11155E7E41D5
+:105600007A72CE8BE90C28E2688F376453EA57EE42
+:10561000AF8713725E66B509C6296B803C2C1C935C
+:10562000DCA074E11D0EFC44AFB61DB0D98DA96F8E
+:1056300052C4DA863071D06CAB3B0AFA46D33D5483
+:1056400043EA39301C81D8B436256CF51C5E490E0E
+:105650000C183D9AD7E3422B8B26269A8F9C32FF5B
+:105660009CF12BC55EEEAC02E222BC2E3BA2582E72
+:10567000F9B2DD513BD866702A05BD9C4C00FBAFEA
+:10568000C53DF1E31DA86582E2ABE77C7A3A44812F
+:10569000574ACE3052E0EE429ABB74BD9FA23CEE18
+:1056A00097AE3A0A888BFD9A4F8372731807283297
+:1056B0007A66B54164FE4EA0D62576E3F9C1D222C2
+:1056C0003E71669FBC32D809B5964A4DCDFE2C6C12
+:1056D0006BAD023C949F08663EFA11233805EA88B8
+:1056E000DE1F4A2493511FF422C5B44708D888D13D
+:1056F000ED957BEAFB3AC73C5B50E5621F215A42BD
+:105700001A07B17DEF5ECA95B17869AAE477F35DB7
+:1057100075549049C4FBB85E0FD94E1E169DDDF539
+:1057200001FB7E60A3ACE483458E191E4FAB893E1E
+:10573000336559DBFE497CFC5C0B4AD1F8B1A80DFE
+:10574000A1ECADB52C14B32A4339FC9EADD4A7B956
+:10575000FD2C45781D4DED56E4A8DBE83FAADC2C76
+:10576000C3E30BC20BD8552116A892A3FDDA260F6E
+:10577000F9F2AD2E0F10A8A5A3E5BD04D0DDC276C9
+:10578000E95E91285333E5F0312081E91BD1FBC359
+:105790001079D28ED4C464A7BBEF3E6EF1DA6050AC
+:1057A0008B982CAA04B16EE25F6E015FDE754099A2
+:1057B000B4992B6F313C1A4BEE658C94B409BAC482
+:1057C00097798D2DA2C4F0458BBBBC6A67B4632A60
+:1057D000C947908B27AD18ECC6B2D0AC1D343FC979
+:1057E000E04724BE03C5BF382DC1F447AB13E42FF7
+:1057F000FC5786FD1AE3CD63A0FA03696422C784CF
+:1058000073B1DA506D56C86F05E1CC4F2D7D45362A
+:10581000F9B03AE3ED50CDDDF234C126EDFCD366AC
+:10582000D8D801EEC903CC6BAA161F6A2E70398333
+:10583000196A9C7E76D17E05ED4AC1000EB824140B
+:1058400013D429D4FA7637EBC3D7680A8669EF8771
+:105850005047A5D88598E9E5AD992F3089FEDF84BA
+:10586000762783B52A272060A7278F0B11D05A3EB1
+:10587000207B80A2EAF394BBA7571290B35BD0E2DF
+:105880006842431E58D7E5130FA3258172BE2779BE
+:105890000E7234941341BE2BDF51859BECE08C25B6
+:1058A0002E7058A24D70844E9C0EBCAF93BEADF6C8
+:1058B0003AFA4B27E26BBB46031EE051A5A3126FD9
+:1058C0004445A6D844337D9B9CF6C27AA4175E2932
+:1058D00004EECDB06897C372E23174CD033D9BF006
+:1058E000981772FD6C40AF4B31273CDC69ECDB96BE
+:1058F000AFB615811472361D8FE238CB2B9CEE2388
+:10590000EF4F970D29C117EBE4A61EE3AB600580AE
+:105910006C20B0471C79BDB8354FFF3EEC858A3B03
+:1059200076C882647333FDD01B2CF50544DC3B4103
+:1059300039FA0C32D20680D1EFC9E10D12A36316F9
+:10594000F1F776AF97B07B540B7A45D84100794296
+:10595000385DC67231EA47C3EF7CA566C69FD3B9EE
+:10596000BD489BDDA76C83171227FEA6B7C004585D
+:10597000DEFD56D46DD67E738151B7B3316181356A
+:10598000DAB80AB135016898E90FADDD1C430CDACD
+:1059900061E830AA4B8568D7193BA3D7B58D09EBD1
+:1059A000436C93D90A7B9F7E07E391469D3A12C3CD
+:1059B000DA78BDD1AC1BF71142F161179526ED8560
+:1059C0009C79D21FAA9C6664C5E300470F8C6EAF1A
+:1059D00024FDFD945CE177DADA1A985BF68D0F10FE
+:1059E0001078071513AB77F391A1CA5B2C4CC0ED6F
+:1059F000317A731E1CB7F4552A9707474F3970F850
+:105A0000BDE36C042C0A18CC07E031FF2418658B29
+:105A1000866698BE41B80A9FC4789EF710780DE25A
+:105A20007BC8E3E742A8D07341BDD92890A684D3B0
+:105A3000486E65480226F68564E3C68D6E0FC8F68B
+:105A40003E431354917EA3A55F0A70B9E392F768B1
+:105A5000F305145B8C79356DDD294A7DE2CBB13ECF
+:105A6000A77ABF88F3A66734EB7F806F0656FD6B7D
+:105A7000EE22B73F0DF9AE5B3136811AD358285864
+:105A800036741A471DADA3AF5B00163E089B500D40
+:105A90003A16197012A3CD99F35A99296433B3D2E7
+:105AA00074CF84D03544FB1394DA5B9A0CE5A4FEE2
+:105AB0004CDF09EE51F9194E21D783D6182E7BEC15
+:105AC000D6110D93F9C9C40E09EF882491E9ABB042
+:105AD000D5C2B6CEF67B7702783CDFF4CB476F3089
+:105AE0006C796941DDDCD041D32ED88D24B46318A4
+:105AF000F432B1B5C0A059B08746E4378EE2CC2B62
+:105B000080F628BF0F4D194517086ECA69DCD29E72
+:105B1000FE1666F0186CC25C2FDAC66B6411F68153
+:105B200066AE4B6F7EBE9F2A8722E041BEAC0891D5
+:105B3000264B63B008E52DD349048CF92D8E5DC446
+:105B40007470EADF46C81C35FD3DA4D1096E7BD6D2
+:105B50005FA18677021A5254477C93F3FFBC2F440F
+:105B6000B0E8D6ED8E7A431C0DA48C9021B957BBBA
+:105B7000B6A8F10A69910C24881FB7B34CD2B3A719
+:105B8000063A0343CC7CCFDB457D78F53DAC04552C
+:105B9000AA2205AAA9ACAC4EF25CDA4F81575C2070
+:105BA0009F9D38BE93D90D96DED64F8C54A54542A5
+:105BB000905B2F54D1203D7DA349BDDCF9C1D4CFEA
+:105BC000894B6EF4B41E28CAE03AB661AFFEA14814
+:105BD000D772227B016AE413CCA765D0EE18CF2ED2
+:105BE000F96C04310AA84BB9CF83B4EED90C779382
+:105BF0006AC827D6F8A9D4148B852E43CAE0D818D2
+:105C00007BCC1365CCF3513EC919C45CED777DD7CD
+:105C10001DDD45E55360E2AD110D631EAEFDC59778
+:105C200068BBB40E5AAF49119C84AF8A4CE9A5B247
+:105C300071D4803A9804A76190DF9E348814A92417
+:105C40009EE55435321BB2A5B51E3D11250D1D4DE7
+:105C5000F8EF137245BFADE9F301B08C34E9DC68AD
+:105C6000217E1EC3B90EAF9AC6650A58BF8151B2D4
+:105C70003EB8C6EB16C2D0EB70AAC0CFB7AB558FFB
+:105C8000667B94160EEDF51504935B985DC36EB3B9
+:105C9000326020416A7341F369F0E5D783A9596CFA
+:105CA0001A080F6D2E3D867E8306EE9EB4BE1E62E0
+:105CB00018A6F2C9F6A7C15231B287EDF0D73DA5BB
+:105CC000C5669249361DB06BA1C83AD5D1E3F5DF60
+:105CD00047DFE953D91BC74566847797B8FFF27051
+:105CE000EF7468B1593ECCF2E9951D053E723B2F29
+:105CF000D553EEFF847F954F98E6713A1FD50FCFAD
+:105D0000A6BF30F020E1A26DEC679E0976249B339C
+:105D1000C078AB61230461843357A7FF874B683594
+:105D2000280915F6AFC3B0DD584F0DE3655302A740
+:105D30001888F22A1550CA8EA59B56ADE4F69AAF84
+:105D40000D380898D507273BD27A97A378ABCB1BA1
+:105D5000C20D5982389EADFC695DB7E688D12BDB58
+:105D600072642BFCB805E2EB336AF8B3C6F3962AEB
+:105D70008DD7D67A2C5A98C22C4515AC37094DAF21
+:105D800084B55ACF1032E996C7A5C6EDAF87AE26C7
+:105D9000731DD28B68A27488541B7B8E0AFD6E1013
+:105DA0000D71D9E4E42DFAECAC9C73F2BE4D3DD2FA
+:105DB000879BFA901EA7AB227D48C8071069BD7368
+:105DC000535717430FF989F8674D56024BC647F3EF
+:105DD000753760405307805A74F5B74AD292E1850F
+:105DE00042033665F64EA0E23C8934928C7078BF4F
+:105DF000185B625B24BEE431AB2901BA567AD7E066
+:105E0000BBE2B1A33D51F789DE8744A6B2BD25D7D9
+:105E1000699B3ED26AC2B215AE0628C3497684CACF
+:105E2000A0CBCD50D35C7F09DAF175B75DDAA19DC7
+:105E3000C8BC2350DD9E108DBEFDFB7B10A7DA4D44
+:105E4000122434AE60D757F9AF1E51ECD416D27974
+:105E5000BDD287643BC544528EF85E18D3162D63BD
+:105E6000E3671FA827967627014E0EDC380EB3C6CF
+:105E7000DF2B6DEC811C3EEB6FB1A1895610347A9B
+:105E8000DFF72FCFAD7FEB9111252577A9494D5F26
+:105E9000F5A5501D9E1F94BB4C69BD07800970EA93
+:105EA0003935DBEDA9F1636A39161C6807B485D76B
+:105EB000F22F421C6E92DB5ECF3CD5F6C63ADAAFCB
+:105EC00055D127E8B31DA82C7FD001BD0373ABCCFF
+:105ED000F61846B9A0A7E86EA4E9F1F9748A4EE76E
+:105EE000F740DD7D3B4D53D86ED9076400AC0AB650
+:105EF000B4AA05E5C3DA31805CE0D37A0B20AD03A8
+:105F0000E7193B894DDDCDA9ED08F8B784ED43389D
+:105F1000006ECBAB7FD7E909EDE01A7FF228728AD9
+:105F2000E7B81F5B32B8C5D5E9D86274D85EC880BF
+:105F30002591E6D7F6C2D71853D22DBB2AC385E2E6
+:105F4000825BCF643CB1122E512F63A873AAFF96D7
+:105F500014456CD4E31A77FA12E61C03CD726E2452
+:105F600046DF7C812016A64F059481457F1B026485
+:105F7000517CA0733E9EEA292F321E07213A38F049
+:105F8000761E9F879871AE4FB4C447BF023F5F2D06
+:105F900065B74A66149A1782FA55EC2DFA81858CFA
+:105FA000AE7F18107944C83AD44E7AB928E33498B1
+:105FB000B4973C5E23C7447A64B4D806C640C68E04
+:105FC000CBA9AE7D5544B40AF269489182842FFA78
+:105FD000607205B343085488CAE6DBBDFBF0D98C78
+:105FE000874536F1BF8BA16BB71C311D97FCE40FC1
+:105FF000628B5DFB7259DDFFF72B82FF04E2E7B491
+:106000005467AB0E02CC196AA721A570D772BF7076
+:1060100063C0254133C4CE2767821B458F8D493C21
+:10602000BE8B53BA99A17F56672D810AD953BB867F
+:10603000EFBEDBE661D667987E52A2222E011BA33B
+:10604000E1001771E4F76EA678A452C5B460979B7F
+:106050009330FCC211F91D8E4CDBA6A71F7E11FAEE
+:10606000F0594D3069A8972BC0AAF755AB34E7D249
+:1060700054EA454B48A62D387C014E4ECF0C0FF20A
+:106080005CF7E2B3053E53C2F370B658CC092CDD81
+:10609000E0C2B42AF9221D2DCAB89C5E5DDEB4D2DE
+:1060A00006DE608F63C2552004F40D75E014B2D98A
+:1060B0008CFF177AB583D918DC1B3471A7F410E470
+:1060C000A1E80772B64B194584A89F2586753F0D38
+:1060D000BCF7B3D828BF120E6C09EF16C583E4DFF6
+:1060E000CD8D3DBBB3E5B3B90AB43E935881D52BF2
+:1060F0004AC1C2984C6B56D66A3AE645E428413408
+:106100004AC4319F479520F6203A2C7190B2F1D0C5
+:10611000421A935A5C544DE9141893AECFC3DCB4C1
+:10612000F7E524C42D6B1319683ABAB7099AA11D73
+:1061300035E7B991569E117FFEE302C8A7776C0F31
+:10614000F49A567C08E29E8198D3FB52EC9061A9A8
+:106150008E293688EE5344F137483B3AB4560E3315
+:10616000FC622EF6618A68BB7378C19E1C43BC6ECC
+:10617000A9DDC60C3EE8F8AF542D3330A9400B1B07
+:10618000D74EB395AECCB6EE0B8EF37C1336AA2960
+:10619000A563A053ABBD26D4797B4B7EF7A7DE3435
+:1061A0009BB7323DC9681E2FA0BF7A21D36B1F6AEF
+:1061B000A2B42CE33BF022D0623DF857B0EA790F4D
+:1061C000E5E3FDD077686EA0C604AE0B74380D060B
+:1061D000F825A463199401169B0A1ECF4DE531E6FC
+:1061E000B3AB913028FFE8ECEF27BB87A4B638EBC0
+:1061F0005377B4FA0D3643679D4753AB5C1D2C2A89
+:10620000C5B0BA2719FE290391E5D9347CE8D6AA8E
+:1062100064760B8FCCDC234C64146E1F17580B86EE
+:106220008E0EB28F24168A46A40B02E8804156A82F
+:106230005B30A4CE472C92B9AAE19B903E254551F4
+:1062400066C2B93BA76F6D667A01F44A0D19848660
+:10625000BB24099F46A07A5F7BC9CEBD5E7B2FCE53
+:10626000E138B4BCDE19249D9BC00F156A0A82DC9C
+:106270009D6FB60DCE94DFCD0747BE4C13D6A061FF
+:10628000B48F1572D3E30F5074369157C27FEBB5BC
+:10629000FEE2529B10AADD70FBD0F5134094CD3A7C
+:1062A0006A09E5D1871369923C73E0327B878BE8FA
+:1062B000C376A524C24A213F32739A6DFFAD835E37
+:1062C00014109F57DC158D092A9276BAA32A02185A
+:1062D000C8A0ACB5DF5C03D27D960E3BA9F7A33313
+:1062E0007CA03D1DD33AEC0862BE7B6C3B9BCCC6C8
+:1062F00058E5682FD5A4403208D74B6591F104B812
+:10630000EBF52B7D4B882862C92DAF9436677CE670
+:106310000B7FE3B8296329A86947BC5EB9A102F8DD
+:1063200069D3AF30C545103B243E35C8E384137AAA
+:1063300003AF308C60B22AF5771A7BB71AC4CB351D
+:106340004355D7F588611F760C27DB29251DABE364
+:10635000EE3EE420D543FCFDB999853A923DAF3E2F
+:10636000462C72E003A711F0F53007D82A42B7A7F0
+:10637000ED2D7D8CD534999821327E4CA0A2EB5E18
+:106380000A938DBD1AE14189BF770A09D23658CCEC
+:10639000D5B39AF725C13AE1684BEBAA591DD586CA
+:1063A000C3A665FF77B943C5B054AF881000CE21AE
+:1063B0009E824A1031F9890F0E550D540D665AAA66
+:1063C00020A76D5EA69BE1A63B6C808B5C51356F70
+:1063D0001F9E1B49C3DD2D5CF1A00071B0910FE938
+:1063E00052C78F672F77A36AFE8F042FD85AC4A095
+:1063F000699FB34782E155F1EC623B6F2628D400D8
+:106400009CA40A0914FA2AA57DFA429FC017DC8BC6
+:10641000BBFFDE7C89D154BA625721675E760BBC24
+:10642000DFB8A0D9D90054D2B389134780DC906B70
+:1064300057FA811B1EE4D3ECDB7C7AFD257B8E4A68
+:10644000A0ED1FF31021EECEEEDA2D3865A894E50D
+:10645000F36C263E4C80162E92EF26AC248E96BD11
+:10646000E42F32EF224D508A28BE0FE48F5940347A
+:10647000B3DC7C059B6792F07605C2BD3729EB053E
+:106480000F30DE8A55F88C8794743A5BA84439B093
+:106490006DF20E2852698747F4F5A4A430770B23D8
+:1064A000901A09AADF9DE112AE211F58163215A0DD
+:1064B000570BCB3D69BF6A52063BDF994ED305C2ED
+:1064C000516712723B3A42037A49EDD9975FBF2078
+:1064D0000E34120EC363D9D889E09FA3F4B121CD45
+:1064E000F4792F9263B2E29806CD08E2A003D25667
+:1064F0009B33D93CE62658AA08B1F6F81933F5E5DE
+:10650000079FDC2343DA8E88FBEF6E905BAD41354D
+:106510009E800CF1705AA6AAB462B8515009D39D5E
+:106520002B04D4974DA5B9BAEE2A96525B2D0809D3
+:10653000152C503431BFC9657E663A7B47B03C4963
+:106540006A77CDA3430AE88E9A6F3AC8DF6E5A2F56
+:10655000D84614F46294F67655D2B8F67A966B6DF6
+:10656000CEBFF6AC4D53A363A544CE5954A557B640
+:1065700088A3D5EB6ABD8F98E077172D1E444C3861
+:106580007FAC008584D023D7D05F4A438C4F34B989
+:10659000DF2539EB1F514A03B6B39105E7CA2FFB3C
+:1065A00053BAE761623E0BCF4013BD5D216522D82F
+:1065B000BFE0C1E7DEA9E8C6414CC8892436B978F6
+:1065C00006EB7DADBB0E13629772FDF62BB1F7E3C0
+:1065D000BCB0359723CE02708F5BF7263B758C7865
+:1065E00048D7C22371791642708CC6ED676A6D8CEC
+:1065F0004EEAE347F7AB77DF6757B8A6C16B2DBD0F
+:106600003AA0D27676D0F1156BF2949D375A42ECCF
+:10661000032AAB3BD0FACA33E2680795FF6CF3E379
+:10662000D63AE604DDB9E0578DB7151061F49BDE6C
+:1066300076F30825446BF16768FD2FF6501691E557
+:10664000E88B565B7D1C1ECC98D8D5F7CBAA1B3D9A
+:10665000F867DE1DEBD20C71478B2369D658191FE2
+:10666000342055F841D5D562B3995E2BCDEC898D98
+:10667000925813FF90E93DE98E09FF64B2505AFD2C
+:106680009C79CE19137E67E2332F853D832D6E47AB
+:10669000F2F762A382CE1262F2591650FA49FF0B4A
+:1066A000FC5AD1AE16956A977FE1498047B9966E3C
+:1066B000C8952E8D24C1625359F540A48BF831CB77
+:1066C000021112AF8C35362C75D7D50FCBC3D0CB7A
+:1066D00036AF1310CDD1B57430D1015C076B55972F
+:1066E000EBDD1C6E9173E9D5E8822BDBFFF1A51C75
+:1066F00009A1E0463F0F3B1989454EB25A6B26AAC5
+:106700004E77BC9895AF9F0F472E112EA641E32AD6
+:106710006659E1446D82DAAD875E63F11834B45591
+:10672000261A919C4812D0D66F546F8D2ECDA24E52
+:1067300060D5C194DE5B9032899ED94318941B5F6B
+:106740002E68811F2CA4634EC9DF71B653B1FBAA1A
+:10675000A642DC034A6DBC8DD2273AE0E56CCBA49F
+:1067600033F96674F8D45D4BDC854CC64021D69471
+:10677000947672B128F383DC35601E603724644E52
+:10678000A41F98F862651C54C757477A2030ABD2D3
+:106790004AF5B4426BC5E137D7C5C35E0ADF71BFA6
+:1067A00060D702E59F1A7635F04DC2A621C96F74F5
+:1067B0004C49D122FCA4A3068E17A35E5521CCDA46
+:1067C000A46D2CBEFC449F7F1D07D4994F5260AA34
+:1067D0006BCC79CE10C5FA97FCBC887456A1CAD789
+:1067E000E86ADD483624E8BBF47DBF250D53E7B1E8
+:1067F00089E9D127668A3644BB4A38D4BE0547109A
+:106800002CF0EBB18EDEB207AD5F487CAD37EA19F4
+:10681000DCF9F4EB430138CA10C02565D66AAFB481
+:106820009BFE562011D0D3AB906C2C26B1B13A3CD4
+:10683000772E1F7DBD6230FEFB60BC48B27F1B928D
+:1068400047CCEDBA1215BD3D5195BF890C311FBF24
+:10685000FB6541BB04ABB1FA9F63A1E079259D03C1
+:10686000E74C44BE03B935D859DCC31D8AACB79B8D
+:10687000C6C288C64B6674F8FC57B5E25D3ECD9C37
+:10688000C7EB1DF469A353988BD02C0EE1B4D14F04
+:106890000093F1A46742E0A04B17C2B36260D3C279
+:1068A000058039EB6AEF988A20A2CB606199EC4FA2
+:1068B000BD861186A4022CD570BF8D1F69C33D19FA
+:1068C000CD16B088C41C136101E0FF0AE0D64A2946
+:1068D0006E8623D620B5FA6AE59FE85953FC41D06D
+:1068E000F011EC01CA7939AF8345D61DB9095FB5FE
+:1068F000F4E3157C7B14BBC6AB01ED8845AC71B8E5
+:1069000006AAB95474C94519DFE3617139C9AD529A
+:106910001A2C8983B25B8A4612AB4EA48330C3988B
+:106920004511265E9CB8862DCE0014EDC15485C35A
+:1069300079D1454B076F1E2A595C57CA5E76C91636
+:1069400024FB9DA7A196E8123D1F0A74F7C6B45018
+:10695000930564CB914D1712E52BDBFF2E7248BADD
+:1069600080D025FC78C98DF4C0CB0420C999B90327
+:1069700078E8D2A599B9361FD0615656C1A4B5930F
+:1069800044931BEF3DFF622205ADC2FACDE96B25B2
+:10699000D70C1A8ED23C998D7EFC0567FC882E4957
+:1069A000B72C5F87CFF5784BE004433F512CD07C68
+:1069B000C47BD21235C1719CC26EFDBD8B4A088466
+:1069C0004F099390E74A60F989C86F43B20629C717
+:1069D0008DB290FA39771CFCA49E2CCCE0CBF756F4
+:1069E00092BCA3686DDCADAE1AE583189F57C04812
+:1069F0009ACE5564AABAB0701D0E9869039E33DC16
+:106A0000E1EC23689F74673A85A98E8889E12A9F03
+:106A10002D8010119C1520B0601A045B63B5375EA1
+:106A20005E9D4653A098EDAE5CA9F6150DD4FAA96B
+:106A300097608DBBAAB72E0CFCA046A1BC18FD0226
+:106A400050906A45E2BF4BDB88C35CEF8193236EB5
+:106A50003ECB871AF68B537C14788078DEC509E824
+:106A600083A7744F44FE4E57D19A7219BC1D67E735
+:106A7000551777D65FBA1056569C23A9C9EC23A7A1
+:106A8000B7DF802019B19077C921E87838B28494B3
+:106A9000B108BF67C84FFEC990C7E921E5556142FB
+:106AA0006FFEFA4607E4B4CCB63462C8FE598205DC
+:106AB0000CC2E1A96D4674364827809820D0755ED7
+:106AC000CEE2DD4C6736DE468D37807651A670A06B
+:106AD000BB664D383E12B7D620FD2A3F084A23B781
+:106AE000263B37E64CE35B174D231F791A8AE38E6A
+:106AF0004B7928A065F91F8EA2A16B3003E6D5E182
+:106B0000768238C50EFC70AE2C266975C5B45E99C8
+:106B1000B9A5D2C63E41F0B958184E684842CB1EBE
+:106B2000B9B12EBCEDFEEAD7BA3C770610571787ED
+:106B30007777FC8E8E892FB71D0900EC67393F1FD0
+:106B400043E0B67FF80E0A074381FAEE4F1C03B408
+:106B5000776027AA1ED666F9F6595508C52F79AF72
+:106B6000D4B1BE708D87AB270DACF2F5EE32516912
+:106B7000513611F797BA4D8BA3EC4D5FA8DE80110B
+:106B8000FC70DAE68FF4739295A0940497B62FD632
+:106B900067E1DE7A60DAADA5190749CA21180F0C42
+:106BA00026B4E3D7343B4A15D5134D15696118C691
+:106BB00080443297D6818AC0D9D4CA9AC2F02403BD
+:106BC000CB4E802F28F875FF04FFFD7245F141E19F
+:106BD00083C13C70011E7FEEDF3121B68AE7DE18EB
+:106BE0003ACCEF476263234CC80D50DFB16FED74B0
+:106BF00041EF691EA0AB606214A3572418C01F3573
+:106C0000D19128C8184DA6C3D3CF6F2E309AA1C7F3
+:106C1000FAF906CF1F43DEA8F0969344C47A0EBC5F
+:106C200035622C8889EE5955C90CCB416E0781C459
+:106C300044F3F5630A8CADB818CF584002E916A9A1
+:106C40006E52A12CEE5FF009A36E7E51D81E379EC6
+:106C5000454B5F1F0793E7468242217BF2DC2BE026
+:106C6000D00DC80B6F6104F2106D1160909D7BF028
+:106C700014AA253CC4204A19AD654D9ED0E434D4F5
+:106C80004C98F8E087C7BCA6CB0CB3C4CE6A02E729
+:106C9000EBF486B4D15B844BBE0FE6ED34817766AE
+:106CA0004C5506248C4AC70D12B863EFC68CA4D18C
+:106CB000262DD19131ED10DB702BF4B80C351CFB77
+:106CC00068B7912480DABF6C95EBFDE9579BA1EF83
+:106CD0001AB0F490EB945BE1FF75AD429D75FFFA3D
+:106CE000DE66A185869697F1A387C908572A53FCCB
+:106CF000C84CEAC1624975E12406F9600A4EFD7488
+:106D000071AF69A828EA15D424B5A67E9F3B4C6ACA
+:106D100018D740D580703DC7F00F6AD12412021AEF
+:106D200063A8BB01B0E6F3B1E191891AA80E4AB499
+:106D30004A114C53247C8E674681F0C27D2E4A59FD
+:106D4000C52908DB122EE7F0203D0F4268DC176DE5
+:106D5000AC2DDDE2A745FA1E48AD6718EC15AC8EE8
+:106D600009AD0FE9F0BA8AF679B70053852F677F2E
+:106D7000DD8B901F84DC923B5C289C2A11F3675EBC
+:106D8000802613FD52DBA058DDBD4D22AB7D0729C7
+:106D900043570D0EDF9EE5F99AEBA41B296D8B6C12
+:106DA000BA7B156B65E4B4E95983FE39210483FA93
+:106DB0006077DBE143E32F843EEE7C37E18ACABE95
+:106DC0002D348E56B5A2C6C169027AFAD886F090E3
+:106DD000CDDA2D838B5FC1E86C4FCD0CE033866E2E
+:106DE0007ED0AB91A84AD73B53550B2A5FE06CABE2
+:106DF0002CBC2B5DB72ED865DAD93B1968B8D7D62D
+:106E0000920AB978638893E0E8DBCFAA57331D6C08
+:106E100041D0871EF782FF7E0BDF179A55EACB3AE7
+:106E2000583805D14B51949C24CF7B86A42ED8ABE7
+:106E30006A2F14AB952EB12835A70C3A7B9B6BE6D5
+:106E4000E3F650A59EC32E79CFC2C65AA69859AB79
+:106E50007790E17BE8E8230F236E7207BD662FA3CE
+:106E6000A2F015BE5A128F5CA79459DA3BF751AACB
+:106E7000765ECE99D6E5D2959F96068E869548FD8C
+:106E8000922355AC4210F1C77BE4D75F8968FA5A68
+:106E90009A3849BB652C48FA340CDD7118E186112B
+:106EA00022074EBDE96A74A940F4E8E58488CB99CD
+:106EB0002814EDA3933955BE7B6BFB57B871CEDD1B
+:106EC000712AA9F643837C0BA3831E32F045FD167D
+:106ED0008A0C5AEB97849CE924B1750CF6CC5423A8
+:106EE00087F2366A9A5F011C5208AD40818615E729
+:106EF00039E5B58FC364ED58291070B8218373DD6F
+:106F000000B8EADF755E9F6BF460BA67A2FB8E2E55
+:106F1000A4BE30203E689EDC94BFD51BCFD9A136DD
+:106F20006432550297AA343EA55878FF476B502427
+:106F3000899FEB0590565AAA389C70EA62E7B80719
+:106F40000764098B49EB7E0CF22A5572DA05F3458A
+:106F50008F573D8AB305480C4B512AC516C6CD1B29
+:106F60007DC49E2E437D948ABC94386116249A6712
+:106F7000AAF26396D39076C5BDA273E962B3575E59
+:106F800035EC126E036963670D7066A52A3CD996CD
+:106F90002EC61148600E53363A11DBBBB8C3C3B0DE
+:106FA0005D9169AAA8E8B5A0D27443A1705E51A80A
+:106FB000163427F71278364483ACE3D773D89C6B2A
+:106FC000433462F611F54B0EAA79D883FDE30DBF69
+:106FD000F697F264531D0F2B25EAD254E7B5487794
+:106FE0004CFFC002413ABC5A2AC1B4C5F9F370EF54
+:106FF0003F74AB1A92F7763A3B68D8C412F508464C
+:10700000E996F833D32D1D11AD728E2552C90B9020
+:10701000B4C59D925DAB950A5D8FD321AC008C0FFA
+:10702000126FBA4489AA26057604B522AA066976A3
+:1070300022D7375F90B162D5D09613196FF6D48DF1
+:107040004ED51F833653FC13464196F6AA65A5C854
+:107050005A783CFD0215209378F62D23B636A20C03
+:107060001462E610FD3F029204B0359500A1378C02
+:1070700054BB49ACD3F5C682A09784D76686BD734E
+:10708000009C0AEA815AD3F0FCFA3361EA9914377A
+:1070900029F7E91305EB68BE2B883308E4DD9D4032
+:1070A00046393095C4E65FE84E2366DFD618AAD687
+:1070B000DEF95D3C9C651C03FBC099345A4D9A3B3C
+:1070C000B8A129E7564CF9C56CE9180A1FE35637F1
+:1070D00055448BBD6EA02CED19BF537225AC041F17
+:1070E0003E1DD970D68C8D233317348A0CEEE2B94D
+:1070F000DFA647E4D6E2C857199035FA9F1161C45C
+:10710000549B6E11E424BD8096898B73D963650C02
+:107110003CBC9014237593FD2E32C6ACC1A4619281
+:10712000606FEF5AD7352493EEEA60C38333CDE81E
+:107130004FB04B8C48A4F42C7B616CF720455BB8B6
+:107140001F47E6956A98BA181897ADB9E1FD76EB36
+:1071500095CE815533D70DDEB3FA948CC465464A7B
+:107160006FDE1CEE8872C420F545F5B8D299A245B1
+:10717000443B5646A359C8CE7B2291209DB3624F13
+:107180003E5354C7BA67458C2357B93727B0A9195E
+:10719000192B326F8F8E041AAD44F26509173EF435
+:1071A0007C5C34661DE7C4EC390074DE47665672B9
+:1071B00084C6520DCB70AC80F3E6C31F15250B14AB
+:1071C000086D1628A5F58734DE4C85F8C938F71AFE
+:1071D000E2D0E776C5EC0BB95231A0E03BD0E6E552
+:1071E0002697CB0F61D8CB1B587FD514C0068FD5FF
+:1071F000C4880799BB5CB5698257ABEC42DC08ECEC
+:10720000ACB641C1042043343BB65C22B94C52A316
+:10721000E16E8BC7A53DA6E261452FCFD081590D08
+:10722000E4CA6EB0491D705615B69F7873B409A7AD
+:10723000BD8FDF4A6B1587164AB08C6F126D4BEE0F
+:107240003EB85EDA74FCC2503F9806CCC0F22F16EE
+:10725000DD3805C4D6940DB2462E512E89BD7F6E01
+:107260005C906002274B69B2BE63155AAB41DE3FAA
+:10727000F6B703A76188135F0A020A36814874656E
+:1072800053713073A73DF7B5A1121DDFCF1DBF7C31
+:1072900054CA55518BB9DA8E2274657A833BED5D01
+:1072A000C32DD8DE5F8EAFF4A8D25F4C153FFD85AD
+:1072B0005D468169A72F88DCAD9B7655239882F1C6
+:1072C000705D3FD279F2B14EBB96536B4B3F1ABD06
+:1072D0007962C570238906FA70B754145715AF1C2C
+:1072E000EF62406638E8384322E867D7D5ADCBAACD
+:1072F000A30A069579ECC006C87AF7A77708CA29C9
+:10730000AD7C7AFBDB37CB97A52FA700B3896E0442
+:10731000A980F1FB19C5EAB7FA3C102D1E86B6808C
+:107320006C2091ECFD85F4F81903A2D801B934174B
+:1073300041113693DB595C4ED5BCE2BDE8CB153329
+:107340005E1608302174E43288656C4BBFAEAC54D5
+:107350003D3FB3DB1FB4D502C44B884CA41D1BDAE0
+:10736000694A631D1A2D43EC83538693EB309206D2
+:10737000A47D94753F65634F5088216EBF35D3FE61
+:10738000A308AC46982905C27B6D3ED63388D3D579
+:107390007BBB5B842B99444C1637CB52FDB6C62F72
+:1073A000674AF4DB582A3BB0AB14462440E4D46966
+:1073B000B666D6FFD0E0E566363847F0065795EC5E
+:1073C000C1D0ACC797ED4F57AFD7E05DE846143B4F
+:1073D000B430434D15DEC5E16D5BB3873F0A480607
+:1073E000F76A554747EA5FAB4F42912CA3933E9D06
+:1073F0005319E992E023BA20490DB145BA8C949E05
+:107400008105CFB0D0D390F30C73B01BBB50E61501
+:10741000C1C47880CBD295212C12E2BCFFE691E565
+:1074200004E98683C8514266771D7D0680EC72B5FB
+:1074300024A5BF51B99F7AB16BC52FF6D3CD94A8BF
+:1074400079FFE90F12B7AE36DA578E225C7CC9306D
+:1074500018472227E99888E003A340A353BF62742A
+:1074600060A1667769C33AF93E55ABFFCDBF9691EF
+:10747000A227068B85901F9E31191FB31FAAF220E9
+:1074800063B8B2232B71614F0B2AA6337D6EDFF3F5
+:10749000C05C83B8DCED7D159E6096716744CEFFBD
+:1074A000BF8F1154A35386C473501CE7E0333F5B76
+:1074B000B2569CB1CC772A7DF509F60258F2C78DF9
+:1074C000707453674C4235D4E8AE96A8CC4B034A4F
+:1074D000F43C626F06DDE83D1C9A7D4BAB09785C9D
+:1074E0006AF12DC0F39EDA4ADD6DAD1CE7EB521355
+:1074F00088D99EB2703D078A299C4C656B12AE8676
+:107500000D5A0FE38B15FED0DC54C33498CFDFD572
+:10751000D0C4770F13326205FAABC21CA5377DB910
+:10752000BCD57D4779E8CC090086EB4FB14530B535
+:10753000D3BD037D953A04D54F26C91BC18FA8C47E
+:10754000761612D03303F4E6ED6DF3BEECA38DD3C3
+:10755000CA76EA7438ADB62844D6F9AA766A8B356D
+:1075600084C8129BC3F21B3AB2B02CD804DE165F5B
+:10757000D6C2D5EC4DB652A63A55FBA83A38B578E6
+:107580009B60A7103999D7FB794D0425FDC69FE173
+:10759000CD20FF95D90CDB729DE35873BAF7DFFA63
+:1075A000133831E658303D7298AE3F3F400BCEDE87
+:1075B000C97CE297F6BF5F04DE4E2BC445FFF0B0F6
+:1075C00089F929F49B672B715B60631CB2B0266656
+:1075D000F13C0D89BCBCA5686E4F4DA34CC01F1675
+:1075E00060E7CDA926069514553098ECCAF18901BB
+:1075F000C842AF48EFC18FFDF82B1AF14B23C1F001
+:1076000093CC73ABAD8303831FB13E89F318E805B8
+:10761000DC4C34D769F96EFF1941D84E88474033A6
+:107620009B4F5D52C0758871B51A995F49BA6DC795
+:1076300096DF680A9B2481948037269D253AA0B95D
+:10764000AE02500B4C4B9644A1AA4BE9514F6EF23F
+:107650009E25A5842B789146471A18ED4A33D62FDC
+:10766000FD0C797D3957F152B2C5D08F3E53FC03E2
+:10767000A6323218EDB924DC9A170B99F917FB9F43
+:10768000CE0AD428333DE8D91239EF1FB53FC533B0
+:107690006345EF38BD3E1F59316A906C856DF6AD7C
+:1076A00087F2E41C0E03B91208DF5447A826AECEB9
+:1076B000356C8886AEC322FCC6269F34AF3EAC3EF6
+:1076C000CAFE1125184BF217F7F737FA2B0570D5BC
+:1076D000278623016C3FB1CAEA901550A4BD62848D
+:1076E000D8623FB3D1A5A549E737F8D887BEACB972
+:1076F0006EA09833CEDA2D69A65F44F0D03169CD03
+:1077000042DFB18334C8008D729848431649C132B4
+:10771000D38548FC396AEAEC1561B65C58DA7B37E8
+:107720006CFDA675A3B9FC7D75B044B05389E374B4
+:10773000273C0FAA810CE4A90516EE5AA62E82C09A
+:107740001351CF2ADB0A1527E98B02440206E1EE2A
+:107750003BF09C33AEF4C77E4B4738F307287E22BC
+:1077600089D83AF3E42E7E6E92680A53B11D2B9AA3
+:10777000B96D7D1178F8EC760901AF86921EA0FBF9
+:10778000109C723D8D559F0EEFCEA3BD206F709B58
+:10779000D2ED722F13FF0D0FC70FD0D708B56F2A88
+:1077A000380CABED8403A080368A994D36B390E354
+:1077B00047FFC73E57D348DB3B36A9A46D5F05148E
+:1077C00012CEE5806FCC2492728B3ECA9042EC239D
+:1077D000FC4537572D00C874626C9C1809299D4ED2
+:1077E000435B5AFD56A433ED3AC99ACD1B0FA4EC66
+:1077F0005314A34AF7B73045316082C48E82FADA57
+:107800009348EBDAADA73F89B846D739E767B4AEFE
+:10781000D8B80BF98E9F1523962412ACB651EE19E9
+:107820001580DC9D1FA4BAC935C52AF0ACF0E2145E
+:107830002155FB8F53932FE1474A34E80EA897CF89
+:107840005860DE50DAC7FC530BA8DA8E7F4DE66E27
+:107850005D09A7274762FCD26B71DE2FBBC1B8B6AA
+:10786000EB19DE18948136CCD3F7FA2F8AE7351856
+:1078700025525E3BBD4D7CC8EE441CAE2BE16D191C
+:10788000CE90C59140CA1B5613313E41259157DB1E
+:10789000F9737F2F9876E39E13330708757AAF301C
+:1078A000E3465D95A817EB66171942D6662CD845B6
+:1078B0008AEF4D21461C1F0C509A74A1665660B386
+:1078C0002A561935524FAE2E12197D5EE60B7A5F9D
+:1078D000E9C616FE2B60C9ED560C34490D57E0CDB4
+:1078E000102991962582723EEA9BE3615E282499D5
+:1078F000F36D09EAD56A5A79F1B297C24B9678A529
+:107900007712B7B30A276FF80215188B73DC325B56
+:10791000BF7E02469A171B9F2C51C5A1180F4445E4
+:1079200057FE667A7954C710F7693A4A7C75C1EFF9
+:10793000A53EB7E5B03324F174C727C0EA1E5173E2
+:1079400061CFFFC0D2328607572C5767763DA12002
+:10795000266E49203CD1C99955D914F9553FDDE12E
+:10796000A6588D12FF65514636F21A711CF45CDC84
+:10797000184C450AD1325F23BBC4485E3F3C408669
+:10798000E656B6E1F61C231CA21EBD98160354A9A8
+:10799000BAB199354E32B4E3042E9F8E50A48AA812
+:1079A00015DA5A5AC26517496DCAE946626ABC10AF
+:1079B0004CBCAAF86E5E2E3F1CAF655B0DE0C27832
+:1079C000AB6AEF0E56E6174E16A201B6570F0BD450
+:1079D0008BD4E364C5B0A98060448865C3BE9E6F44
+:1079E00081646362ECD85B2918A2478D43DFD129FB
+:1079F000B44C08B0CB8D02251E1004447E5262CDDB
+:107A0000D440DDC17E5B5E1744E22DC2B2B4487B38
+:107A1000436E12344DD542D4088C6A2A929ED8F710
+:107A200019EFA204AEB41B87B58122545EE6EFA520
+:107A3000F8AF91E8C4BDAE10FDF34DBBD7884A75D1
+:107A4000D0ABFA1B5260C3539CD37C69E192CD68E2
+:107A5000A2AAF6D7E50539142D6C2D6D1F3EC4344E
+:107A6000FA21AFA438791C3CA72CA2FD680DCF41A8
+:107A7000642B15564F0D4B8F9513C19CBCDBC92E43
+:107A8000611AD5667903AD1DB760BB7C823EDF8489
+:107A900066489ABCDFE015239DC948E1BDE16F420D
+:107AA000FB34DDF98154A522A36740109F859FE533
+:107AB00001F873471890DB5A7EACB10F0D3F41417E
+:107AC00040C7CBC3ADECED1F447A641998E3F2CF05
+:107AD0005BED4940B193C2904C3A11AD85EB65F432
+:107AE0008AD3E6BD217332D9C5DFE351F552DFC336
+:107AF000228E7D2E4E2C26BF6879F90559C9CD41BD
+:107B0000C57F60CEE8C191998293DBA0D266FD4922
+:107B10008865E40A3D8C1DA37E29A4C60D69EF0685
+:107B200054D77C1AE71511EE55AA44DE360185DBE1
+:107B300030EC48545F330D18606ADB786D31A2DB9E
+:107B40005B9BA56CC905C0DA473018897DCAD9840A
+:107B50001881ACE939CC35FCD8C7A9DE64DCECC0AF
+:107B600002EAA7272A751216827457580D429EB34F
+:107B7000AE962C0B7CF7000A04CB76EBF227D4AE42
+:107B8000E88E5C0264D51DB46203965D2C9E4A9A11
+:107B900095063A602759EFB178BA0AC15FED47956B
+:107BA000C8A26BC2C8CE8DC9892E894FDE9C410008
+:107BB000873DC578AEE66269146884F9E6E2FDEDBA
+:107BC000023CD98801F70C3E3F2D26D5D751CE7205
+:107BD000FDE0923D1275550046F8A020D8F9CEA9D7
+:107BE0002FF27A6FB20821ECF6C255A5D8FFB93D45
+:107BF000CB053E5B6AE61762D1F3BEB7D185E86478
+:107C000043A81B7C3DB44EDBFAC8BCCEB8D9CE51DC
+:107C10005486D4D1DE270473591FF5B9951F6949DD
+:107C2000D403D6AA84C4984C681A5DBE0A44C95BC2
+:107C30004581BD123BADA4740E1E6E20D659D3A152
+:107C400060C50071E9B70A7D0CF985A8D3CF987893
+:107C50004C70D6238D5E01003C2A0369332E042B21
+:107C6000B97FEE006363D6873B2EE29ACD8F0FD3A8
+:107C700064FB4F6C7ABC2FB68B79693F3556B69052
+:107C800079A9D2FA7E8AF32DE5BB52758AF687D59B
+:107C90009EC01AC2D3E63F5DB0C564F58AB1718952
+:107CA0000988D2219CD27F790E411F984F7852E1EA
+:107CB000ED770210CB45E18F87D47575981190D977
+:107CC0006B560D36D4F1E0F9A82887F645E8B5BF24
+:107CD000BC9CE6BCD7C4D10E4A99A8791D5627BED4
+:107CE000E466E5C8BBE1EB8EF2934ABA5A8A2CF6F9
+:107CF000F7ACD9129992D601FFFD2E55056107DD2B
+:107D0000D830FFBB8E61729C1816067AE5E34607F1
+:107D1000F104B7CBD5E5BB3A097E527772E576011F
+:107D2000BADCB1E3B33E7284C4F564D124696676EB
+:107D3000BEC49A624708B32535E8D2481C774B7514
+:107D400058EE177C244733926F513EC2AEDA193693
+:107D50005928A20B5F84E712879221233D15A6C004
+:107D6000CF72A6598DDFD2D489A304DE4B090EBF92
+:107D700073FCB20B57FBCACAB7297B5B7516FFB7FA
+:107D80006941E31BBC7DAF7EE8873ADE3FFE30C42D
+:107D90006A87D230449C407E7DEC0665A04C5872C8
+:107DA000F972FB4D58A1FB294EEDC63D7D4AE642D6
+:107DB0001AB2D3A9C4B574A8D41A5714864184F250
+:107DC0009EE565132DD9AAED998547E9C3B105D97B
+:107DD000549A41060153810333725FD6B4DBDD5AF6
+:107DE00013FABABE92EB9C458BA40969CC02DF97CB
+:107DF00009744849CBD793E943538A81E482845478
+:107E0000E1E61711799304E86D9E9127A20A457661
+:107E1000F0726832A1B61568DEBC93DFDA8F5A368D
+:107E2000CFA9CEE28BDF1DB7106CFFA3800C96A20A
+:107E30001A1DE8B3F1F2490A0157B37B639E4C3B2C
+:107E4000260F4AA4567BDA643B0C4A300CB6C8496C
+:107E500019679D82660C340C8B9722E831B18888B3
+:107E60007FCBB094F3745A2952670B3FF598B7C48F
+:107E70008780F0CD28A852759E5002B2561BC06B69
+:107E80005E88C2208FE3BCB95F7B67AF720117E7E2
+:107E9000DA985C949B42F801C1BCCF1EE3C8DBB505
+:107EA000C08F60C13685DF9DF84F9120B0C2C327D7
+:107EB0008D16B9A292A20F5FF8813C75C7CA4DE03A
+:107EC0004ACF1D0540887B38FB9C4D4E97D1F489E5
+:107ED00024463495591159040EFACD7767C696F2A7
+:107EE0006DCD8B7E2650C8BE1C0FA01D3624593B7D
+:107EF00080A93F4A0B0A1B45118864CF1C564A666D
+:107F00000AF852648C094F03A58E3F062825AD67F9
+:107F10005FFC98E693472DA45F532F4035569B1581
+:107F2000CBE62CEB15CC69129631ED9FA67EC5B53C
+:107F3000819C31165FE76D42A0FCCE3EFD627272FD
+:107F40006113529FA9E86C9D81B7F8D2A3209823B2
+:107F5000A9FAE061701768793C60C7B8AB8531C198
+:107F60007D1823FF5CCE08D573DCA0F47839926BC2
+:107F70006A7D5C7E9CFBA4E9567F4AC9CA8606647A
+:107F8000842AB72A54671C796E98F107E09D383C23
+:107F900091111ADB96646E40261D086D5AC783B096
+:107FA0003C295092E8E181AC0B404CF971F3CA6571
+:107FB00047AAE45B2AA50D839FFE252853FD49EDC2
+:107FC000675F1817D529BB62939C71C3561F068C37
+:107FD000E05C5894BF475CC1E542533FA57B3EFF40
+:107FE0005178B32B9AEFE00C6824F6E3469103CB6B
+:107FF000DBB7554E7BBC1970FC44402D60271F1920
+:10800000EB694EAB6B39B6EBD398B9606AED47A418
+:10801000D6195E93C8E3FA7BA1523EBE41A21FC2AD
+:10802000845C7F46B4D7146886E3717EFEEFCE850C
+:108030005F353673199763F9242AE7989E4FBEEA95
+:10804000489EAB069ECB11EC889BFE1B25284A411F
+:108050009FFB35DB1EF8BC75076A66ADBF4CE92F88
+:108060001F677C67384A15EC71CE0F0261EC2B1E3E
+:108070003A30A54D35CBB4D36DC99016516E13C4AB
+:1080800001CD06B975FA2DAA2FABE9989FDFC8C1BB
+:108090001467BD7D109102D379B3E6428882342BF8
+:1080A000C3FD0038FEAC878A22A1E6EA9F4562FC48
+:1080B0005018634956D4D0D413EE6C98B2FCEC69D6
+:1080C000861F29B7D9F2C4F50F48CE6F5693F00F2B
+:1080D000C258D5CF2AA8272EF537B7E7DB18F5ED1C
+:1080E000ABECC75847D971578C8F1EDC1D5DE10E74
+:1080F00012610943172070CC7BF38CF5A99F2421D2
+:10810000F2618436CCFC5FF5AA4A80FBA211A085FF
+:108110006219E213E214BE7384F4F2B62558F759DB
+:10812000CC002A014CC2D914CDCBEF8FDD00ED6D10
+:108130005AAD888895D793C0C00ADD30AFC24E13C0
+:108140003F3ECE15A48D68908EC78128CD93E66AF8
+:108150005B906D9B690CAA52F0DA935912C16E596B
+:10816000F1ED542669F44D75A9DD344E58477BBDB9
+:10817000D7E48739C5F0ABE5C66464EAB47EF65C43
+:10818000493DBCBFB963F135EEC45159DF74BAAF94
+:10819000A243C829E6363CD0D418FD010D03C35EC6
+:1081A0007AE6C65EE1B8104CF7CA1C8AB370EBC61B
+:1081B000E0508851E62A9B868694B53A7960B1A250
+:1081C000174C7402030C9FCEBAFC6D877029F3FA2A
+:1081D000DBAB552F7CB8F2C2412C82F96403C90194
+:1081E00035DF14AD9A0B61D62BDE1F3523C0D3804B
+:1081F0004C991454846C9FBAEF1B58C86B45078484
+:10820000D4E2BE5AD84B2EC9E35C200DBF1B839B22
+:108210009AFFA012371B73AFD94E549835F91D6AD7
+:10822000A93DBD0884DAB722635DDB2D5B9F529FB9
+:1082300099C981ABBD5B064E1C5DD0B7A8B2F7589B
+:1082400004FD717F0E5FA117E461F289085AA2F75D
+:1082500079C2C36C8E497828E4EF4826CB03278681
+:108260005480AEEE6F83C95AF8008B19ABFA358A89
+:10827000F58A2E0B3E9E2E3C4EEC9A104C09D56A88
+:10828000C0443B1B9569E4193D569BE5B1D8AFBE90
+:10829000E2C29E5E180EFF243BAE9FA0783AEE72BB
+:1082A000622708FC33CA58E66987387FCBD7047E3B
+:1082B000B89B6D15F9C3767C4F470B6789AD548821
+:1082C00099166D1A8EF7E77608095346C69668F236
+:1082D00092771878F88F9267BA95A57C3F56E1217E
+:1082E000631C2D43280C780549290145CF82631171
+:1082F00018421B384C7D5CF21F8A1F9A709EC01377
+:10830000E0B2459B85578D9EB8A504D7F90208EFCA
+:1083100038FDA0877E3F181C39371BDF221F86528D
+:10832000FB68467B0EAFF31D8F30921E02CAF068C9
+:10833000B79654D4BF3CD03E22FC5B83CF1135545A
+:108340005FDCBFF0A5BE2939285D7A9D5789C7B982
+:1083500040A2579B7FB1D43441002EBEDB1A15A436
+:108360003CD08650A89E9E1B67B143589AD9A386DD
+:1083700084159BB7BB461AAC609CE60D90DB274288
+:108380000251C73E68529C2B2A80BC8BAB886F6F12
+:10839000D165D831FCF7029492652803F82786D17D
+:1083A0006192381EFF1A18672F667714034732B997
+:1083B0009D5A7A77E6D5FE834B5FA521561890CB60
+:1083C00069AE44AD33E77909A9E8FCF69E3905E9C1
+:1083D000923F6A8511C45209F6A5A8CD148E39E3DF
+:1083E000E8F892207A91BF4816065B80E65E6FBF80
+:1083F00066F424ED22B759D06D5117842FF6DDE8CD
+:108400000E251D15853420981A971490A9139A30BB
+:10841000F6714CEA150915347E823D42BBEB41F6FC
+:10842000F8C733C057CDEE628C830983C71CF34B6A
+:10843000F919B6D0AAC175CAF3015250E7FD475FDA
+:10844000D5F3A16C10AA542D31E2DA156C6D876753
+:108450007855A49BB8C94694A585F20D83E5BE9CCA
+:1084600066DFCFE2790ACC47458BC1D4E97C45A8C9
+:10847000433D5F56154D4DB434720D4D0ECF3FF751
+:1084800041C6B5D44BDF744266374F846BF7CC20BE
+:10849000712CAF13D342E86A9FA11905DBE74AA10B
+:1084A000AD37B9D2C02A914EA716499D25DD90C39C
+:1084B00035EE287FD87E20F02C5D8A88043AFCD3E4
+:1084C00038C36403A4A648047CAF2C0A0C2143D211
+:1084D000E2F84CDB6AAB7BD2FC95B1A449B2B34164
+:1084E00012A354FEFF56D77C17928B4F78D5C6EF58
+:1084F000D781D805534756B884213BAC96781533BD
+:108500003FA63FEDAEC42F2549786D2B67C9128871
+:10851000A254C0AAA80DC7BA0E3783F9B13598C1C5
+:108520004AA85F4E805A1A073A930A1FC460B3E8FC
+:10853000CD0D2BC4A7DFFE946C43F93807BD9A41DB
+:1085400008B764D1F228BA15007F6508C12EEDF492
+:1085500054C43A6ED270F40016F7257B1BCD7A68AE
+:108560009AC9E4681212CF5C42FD9398B441EC0DB5
+:10857000B1E235768492E3C2419E842CF71855D33C
+:10858000187C84EF2A090109A463C614EA943A5CB2
+:10859000BCF38166F97A9BF5F55255F481DB70D610
+:1085A0005F5605DB37A189909F4488D0AE9B64FF5E
+:1085B000D2E486563E44180DC86EBAA286F79922B8
+:1085C000A11E7573A1B36D16B8907A9EF2008D66E8
+:1085D00018252A0EB678C8CAA17CDF402C2A383369
+:1085E000B16D5EE5E6AFF8D8D049783B9EC218176A
+:1085F000D795AD4E0624B0D92AD530A8C90E6E66DF
+:1086000039BA4B1BAC34521DA98D3DF65CC6BDE199
+:10861000E14E474F50DAF919C458E3CFF26710CF53
+:1086200064A24B4E946C0B92CF192565F68D8ED6B5
+:1086300096EEED534E5B852B2616FFA9E158601888
+:10864000BF92348A0435EC0765094976A5A9078AE3
+:108650009709149BE42245DE7A7B531BDECBA67878
+:108660000E91B59B96AFF90A8995122CD14172A94A
+:1086700020C86F2467B7F9D8775D162F0A2818F934
+:1086800009C8F13C0ABC1F85CDB7086023FC0E3F2A
+:108690000E6BF6E1780C3194B701C572AAE726D5C6
+:1086A000EBCBEE63FCAB5FFF10C9F810E03C774208
+:1086B0002E266C0D60F605AA829618B2392C58AB9E
+:1086C00038AC17E5516667CADAB142D49E0421641A
+:1086D0004318DBF350FAA69F585E260523C3837A1E
+:1086E00026954304CCA3DAE45B52BD4193BB94B11D
+:1086F0005F71C8813966670242CD800463F7EE83FB
+:10870000E8ABFB1093E3264D8B87A397574170C3CB
+:1087100059BD47EA8674ECBB250395D28BD8886B8C
+:108720008461993166BDDA5C3C8C8518008D94912A
+:10873000287AD407199C94C994A62944BBAA69A392
+:10874000C91B36FC5801E1B6C5C0E2EAC485E76B37
+:108750003CB50579A5CDEA50526716E4E3900D9734
+:1087600067763002D248CAFDBA5B38457D424BF885
+:10877000523E8DB5F74683879B7E246705708054F3
+:10878000701A8CD0E0B3C003B75814E3E4CD2D10B9
+:108790006441F03C84184316CB7685BCA8A765CF0E
+:1087A000A771162488A2C3CC27A8FF8AC512D5C2F8
+:1087B0007EDB5CF35F216B7C16E56E6CC57A79B06D
+:1087C000C7F2E4D76FA8E440171CE3E4F8AEEA0769
+:1087D000F1DBB360C34A2D57618C51BA1362EE7856
+:1087E000161DC7C51DD62A892456DF7B1EA7DFFFAD
+:1087F00081D2A51DECCFCE7AFA87057F0E9846BEB2
+:1088000051DC1B32F2246D71B807328C9C4688AF64
+:10881000D5106412A570B2370F1ADDD8B2A56E73E9
+:10882000DE16508890BD414E7066AEBF352753F8B6
+:108830002EA3AD042A95ED94C441C046802FABBE53
+:10884000163F5C58B98ABCEAE8D6F9E62150E55DE6
+:108850003C39A830219CF196A581C9E1480D0C6DE9
+:1088600013472B729FD9FB97F2B8FDCA5CEEE9A6BD
+:10887000FC71687ED9F6B7CBC74E78F4A7A885708F
+:1088800084CE7760196AE13F3D71BCE9AC1ADE899C
+:10889000726BFE6A513AA4EFA3FC684BF6C278F300
+:1088A000BF98C1B81DCE939764B0B5D1AD437932AE
+:1088B000A15D5014BD4ACE34D153F5697639F278B2
+:1088C000B07793753A8B62D23B56C9CAA1464CAD7C
+:1088D0006AFAA1B69566D01180723E71E752F8C46B
+:1088E000B34316FBA22BE98145D003CA6FD2698E30
+:1088F0007C3DA66B7ECF23D8178DE139EAB749DDE1
+:10890000FCA816EFCBCDCBAA250F256DEC2BE65E90
+:1089100070679C40A70446399FFB394FB4981D2EC1
+:10892000627B3B7C6C0BE20E3524AF5DFF976512DA
+:10893000B1C9BB7D218D5C5596CCBBC1E46FC64FE0
+:10894000ED516F2686442976BD4F3C1D3ABF1CE38E
+:10895000125F5C2716B93FE2E3575EE252716ACBC1
+:10896000690750B4FDE12BC9F3E93250F299D1BD4A
+:108970009563C0CEA862DFD4AA75E7B3A8DEB67649
+:108980004600CB7B821859E66B37F5D7F345101BB1
+:1089900004C5C6DB813A4E22C7581A01872135DC4F
+:1089A00028DB55275D30EC06303E996ACF9BC582A7
+:1089B0009760A02FEB1D339685A7A7BB3C6A152BAC
+:1089C000C96AD8857483D35BB93DD4214A21A2AC4E
+:1089D0001799F1C45758ACBE35F5041ACAA8568C7D
+:1089E000BB2411243F5DA8C97A1E414DF57BD36E8F
+:1089F0000AD857C69D4AD7C3C28948E6ED1BB52D94
+:108A00009B673E20991E3A255FDEC548BADBC151FF
+:108A10009695803361D5D44B781D4A94D042038318
+:108A2000343D4253650008CFAFAB7FBF75B2BDE99F
+:108A30005A5D1B169556005C7DC6AB51CA72344018
+:108A4000C006DDC922B42304AC13E73412D148AE0A
+:108A5000DA0627C60117023BA0C07B3D2EC10AA043
+:108A6000CEEBB59F1081A9F77679A515834B2FE43E
+:108A7000D445E8F3DCA236243716AA2B0EEF7B642C
+:108A8000079C0DF8B5F153FDC7B6CE943D48B08EA6
+:108A9000E917ED2B406A8C9E31317D6A67CFB72292
+:108AA00071B3FA186C0B494F93C0977DF942502E61
+:108AB000C6BCC3CFFB10B6E9BFF25206EBA5CC3063
+:108AC0008780150FF1011E0ACC3A13E2F3E6D6C3F4
+:108AD000BFAAFF9E4AF2BDAA1F2AC6D0452CBA6380
+:108AE000229A4A58A40F234E5646EB4A10F398E3B5
+:108AF000E862A4DF1E1AF7C79CCDD5FA2B9B61D57F
+:108B0000DABA492CC8945AEE9B4CC03A7888025085
+:108B100041E4C0E152C8602FA370E451CAC39FD0A2
+:108B200067D0EBD5A1F98DA733FB1F867BB3DD9111
+:108B30008550AB547B4D688FBC3172D25AC5825A76
+:108B4000F80F16F18A754008C28B242A2956396518
+:108B5000D019EF00D08FB027F09DF1EC31BE6CDF63
+:108B60005CE2E385FA310CD8D716FB9ED559DC912F
+:108B70008481C624E6BDB3F4874F98937DB204592F
+:108B8000B03EAE9EBCBD77DBF531CAFE9D38BB4B17
+:108B9000BE6D87F560CC3457813A8ACE3204047BAF
+:108BA0006A888D9095A07109DBC4870C7AF8FA92D7
+:108BB000DE216A1BEF118DFC68A39B58C01CBA61B3
+:108BC00076155937D850B7FABEABA4FC3B1897D1ED
+:108BD000BF9A64F8B7DD9C4E82D481F22222D89FDE
+:108BE00096D6B1655967131F96DB971D307754C22F
+:108BF0008C23D9236DB2C16732A30233BEB3F15FB8
+:108C0000B59743507EAFF0A21385AD3B87EEEEC51E
+:108C10004416E52106CA281F36E40FED812DEEDF4C
+:108C2000510B1994C1D6363579F85EA275675D3C53
+:108C30005C4474A9B7DAAD9E8024B082929B9DBC3F
+:108C4000FC1DF175C1811DB09D641EA3DEF2C7132A
+:108C50006F41C2490DCB1A41E84C05BFA934751DBF
+:108C600081321666303A5C46B8DBFA12812ED75B49
+:108C700067F97B78A1B175CE84D2CF21F01C5C87D7
+:108C8000E31953FAFFE87BFE631CFACFD64FD100FD
+:108C9000358488AF23FEA5F27B77E3240540A08EC0
+:108CA000AA6262C0AC0ABF66EF3D989B53AE14CF78
+:108CB00012B6C2AD82BFE33B2EB376366A6788DC5C
+:108CC00019D2D703DBAEE553CBAF7F1F4C939E8BFE
+:108CD000A97D7EDCA9CDA0F3AC90A494D302F75B70
+:108CE0003133D208B5460B217D8C2E7E0495F88950
+:108CF0005C5039DE681AF0D3E645397EDCEA1FEEB7
+:108D0000ED141480AF58D8474F4D1F7A6DAC913E8B
+:108D1000579624136B971A23DF6F4BA6C36C33F45B
+:108D2000B03ECF0823A88E64A2A921016A95D4126F
+:108D3000AF7BD7A008293B5F9E77689FE8B4950179
+:108D400038F2EF6AAFC3E465C794FD85DD38A0CE85
+:108D500053978E78F839016AA80921AAA65F5F1B8C
+:108D60003775DF5CB588BA810EABAD25137E2F0B4E
+:108D70003CB3041458F810FF73EC0CBAB65A118DBA
+:108D8000EE757D1B457220E5EE3E5A2EC3561B192B
+:108D9000B600762098F512524860834B0F521F9D03
+:108DA000CA9E2B506A6B9DBAE465BAC8E11C3B5A57
+:108DB000087455AD3C8280A9BDD0000EE0443062FD
+:108DC000E4B45F5C05F674343C7E229889AEF1769B
+:108DD0002CE0176B52C1DC001B47C535B409357E4A
+:108DE000CDE5C5FD5E0075CCDFFE4E37F6D3CF0B6B
+:108DF0008976B506A8A8AA3FCD01F1A43DC51849BA
+:108E0000CF691F54A019C2D4A7B89638DD7C498811
+:108E1000DB1B368CF0BA474762DE6BEF9DFE27CF37
+:108E2000897A7852B84B528DA051536D43D2890E36
+:108E30008D7155C75CB834E0FDA238F667F72FABEB
+:108E400062310C7F6EB31E01BB58337C7261F1E05E
+:108E50006FE3A424330AD27774D26247540033D923
+:108E60004CFB419EF7FDA390B06343D8B4474A0B37
+:108E7000618B7651D6C5AFE425FF81745E9DC283B8
+:108E80004BE5ADA2F6FB0836AC2655BB64C7B91757
+:108E90005BBD040A8CAA2F602EADAA4FB87F6D006F
+:108EA00032099006E97C1D075273F8BDB815E68CAF
+:108EB000D1FBA212419E4EA0C002FA1DE906772006
+:108EC0003355AB093BC3332F5C1ABE3CF5F4E39C2E
+:108ED00027ED3A6D63A46F57B840706B1BD175D105
+:108EE000B15035D6A471A10F2CC83FD50BBDD5CE3E
+:108EF000017EF4FF8E5DD16E79B9E0EB978B13554F
+:108F0000DF4AB07C0E8354FE41B8C3CF5403A8752A
+:108F100078F94CEEADEE4F5EDF7FECCD5412970F3B
+:108F20002171BE87C51E5C56C42EF3C9C10260CE36
+:108F3000674505A0867A6303CD94835DB1BEA79E85
+:108F400057926DA359401616CB5D72C1A407314BE1
+:108F5000F3ECE42D28373F518C9BDD859F26BF061F
+:108F60006A6170D512AE07C5A924365B58D193BA91
+:108F7000985F1367DF9C1168DB480EFD2A523B881F
+:108F8000A8DEDAB3952AAC223442BC17BD9E8B68AA
+:108F9000973FEC64C701C89495F7A4364CCF101DD9
+:108FA0008E0E29B13CD690EAF7B683835606A29876
+:108FB000C96EB1C8F4FC87A0C8958A8953FBF542F5
+:108FC0007DAB43416414BA7289846BD748509F319A
+:108FD000E26A0E12078FBB38B5B240D28C71405096
+:108FE000A0C83AB9D7B617D6521B501D424DA44D52
+:108FF0008AB58215C9603CE359DE09B30CEA62FD0B
+:109000001A1A2409695FC7D24166D6A56A5C75BC85
+:1090100037DE57267390ABC1453648C8D18B03A0C5
+:10902000A9FA56D524EAA8E65C7AD8F56C86B60289
+:109030009612E99D718CCDED024E4D87E88E7A2017
+:10904000F1936D9DA7BD41EC4A5E58014B76204DD2
+:10905000AD424A1F2BD654D7D46B8BCF3460523AD3
+:10906000E1325EFB922D0EC53B95AF5DB08F30A413
+:109070008C7F364E4A03E3530D7C3744ADCF5DEF12
+:10908000AC5C7C0539094F791D1B0CE0E7B72C9CC3
+:10909000EE8153BE0AFBDEDCDE8F309742E45DCF0B
+:1090A0009F4CF4DF4746DE4B70703ACC1C06D0DD97
+:1090B00045106AE9BF46859BA9645EBEC4E5D899A0
+:1090C0007C5D43774E3E7FFB65D97F41BECE4DED43
+:1090D00083FA9DF6FE831B7F85DC2D64B8B94F446F
+:1090E00094D1B72B37F54C1D77905D364580BCE4A5
+:1090F000B23E972E4953AF45A1F01076A07F925211
+:10910000C7F4DD23AB913DFEBCBE6882C5883C122E
+:1091100042A90719FFC33590E87563F0E68C680A29
+:1091200073D9F9F74F435D6F679B08DA050058AABA
+:10913000EF251D57641678E04060B55A3D6DD67A2C
+:109140003BE60EB2D86A3C62FB0E0D2F956A766143
+:1091500013A2CF7867A3B069189DDAD9D04DC17634
+:10916000849C6B6DCA298D518D3DDCA208B9D10656
+:10917000F2F24285F5C254C1409D3A1F2F2878E390
+:10918000D43A94BFCACEA5C8C7B7DF746D50FE00ED
+:10919000E365232028ACED7F3E545C038E4EAC6526
+:1091A000578823E8516D2F078B56A4E8EDFCC80AB9
+:1091B0007BF63739C8DF9F971D073663DE31234CB6
+:1091C000498703FC0F60B5EB4E369DBCB9988728E4
+:1091D000D67875C8ABCFF7DD2FF49093ABF2FA7168
+:1091E000B18CB4EF9E8F7FE56C3F1F84BF835AE242
+:1091F000ABC7D4A5D3CB4C8EB2F95B935273FEC8E8
+:109200009211468E6FC804C5B73A52CDA108A95233
+:10921000E0AD7C65FCEFAD876C5B0FCDBB13AD990A
+:1092200021A48D1CB31C08D2485840497CADE8AB42
+:1092300023C1B49B0E25B5118D6D42385F61544436
+:1092400064184F4F54DA3C2432F2EC1569B98C6E35
+:10925000C3832D14C9C8007FF490ED071F58907583
+:109260006061E878EF59CD176FE57DC5D62AE50234
+:109270001F244927015211C57BECFBC145AC117776
+:109280005B9AD2897A37039324DAAA55D77BE8B45C
+:109290006BDBE318DA569D6B7262997A98371FFC84
+:1092A0003A3641E611A160D3EA7D367D32B7AE5140
+:1092B00019C71C44C6DE05F3C0EC7D2826999169C8
+:1092C00086950088CE30DC5614AC5964080D674E84
+:1092D00041E07E98EACBF78E97583796E864383CA1
+:1092E000ABCAB674462A0E2E7268F88F5055CD8AD6
+:1092F000C6C6259F4322CC8A6E51CF9BFF5246D2D1
+:10930000FE220E024A3BD76E209E46BF0E8CE572AF
+:10931000D443ECA01DFD03D703284FF4E14D81D7C2
+:10932000FC4D257A15E23999214BCB892C317B11E3
+:109330001B3122305BD875BDFDC127E887635D3BDB
+:109340000F55F89B8E1A001250C2035E5A6E6B5F67
+:10935000AEFC386AD719A1AE172ED6A575BA7622FB
+:10936000ADF24E15C97067FF9E93D594DF2591909D
+:1093700056BAF97DDD99C2F55FA24A6F044C941E7E
+:10938000CA247997CAE1C243CBF11019941059C38A
+:10939000E0C4E59554E9A440AF281E0B8DD4B5BCBC
+:1093A000A631C0CB9610B32518C6EA3A97B4360F4B
+:1093B000F331B703881F172E2ECC9AA26F8FE6B910
+:1093C000B89944EABC80ED58CB46C12F11A971274A
+:1093D0003640997D615B5ACFD808A5F849D968E62F
+:1093E00056D0C7BB664B733CF4ADD7716915D15FDE
+:1093F000FAE39E082CE77C47655611F38F48ABAE25
+:109400009D63F4D56D860808626300691856F7A558
+:109410002F95A41D9F53DC3109C8DFA70770EC27E7
+:10942000707C17992A7B5F82F84D4AD2BF173D594D
+:1094300023FD7F80A829746506F0154FC50790EAC3
+:10944000899BE0EE2C61F73612CAB30AF3019765E7
+:10945000E71CDA12363D5AB2553CB20E597D4461D2
+:10946000542486B36D32E99E09437228221C076E8C
+:10947000B28A0423A6DEE4CC4F26819977B006D0C9
+:1094800002D553B4D52036232C2443EA7B073C1F56
+:10949000C352F74B5E7FDC7616A5035D81E93B186E
+:1094A000E06D4177034126C2258533B52F9E84ADFB
+:1094B000DCE634CE8BCA8311E299E493343F331B4C
+:1094C00097B2977C5F976787C93F632DEF97320408
+:1094D000E52671A370950445EE19036836043EEA4B
+:1094E00028F77C6B3EA2312B56FFD4AC0C50B2BA9D
+:1094F000C38FF79FDF20AD162EED03F808E5257822
+:109500007D0CFAC438CF8795BB8760CB2A9AE19E41
+:10951000412EAAEAEFE3BF82B3B2C2F5AC523332B6
+:109520001E000F1547F30BDD897172B0D297D5512C
+:109530002557AA780B325F4FDB542E30048F3195BC
+:10954000F7BC129429C82AA2326596EB4F7F7F6E32
+:109550005116F0922A05B7DB6CADDA97A85588A7AB
+:109560001C0F8FC689157471E91E448DF4D67CECEE
+:10957000254D7206E36BAC531F6C7D0891B59C932F
+:10958000EE2715414271B4660F6F2F3CFEC1517436
+:109590002A8736308683EF5A2CFF8E0980BB4C8594
+:1095A000676FFCB8B3C02468B5DFBA522760477153
+:1095B0008C7147C0A0D9104D55B230415848E4D005
+:1095C000DF15D73D26B4ACB4978473EF2F594A2EDC
+:1095D000B06E866FB575F8E893D406663B23929C0F
+:1095E0007E032B59424398BBABD8B9094DB40CBB91
+:1095F00075CAC1A388F211ADE39EB9A31CC974F565
+:109600002DA4517F68A7944B84CE73C9EC251AC151
+:109610009615E90F9AF75C94B13F286CC6FD465C3D
+:109620002D42765D22C6D2E5DCE09E2C17806E9539
+:109630000AEF1A55504EC9C2098178917126A122AC
+:10964000CF0EA4C2C56C3C184BD139B4FF47D9F931
+:10965000F388804ACEC233BE603EE93FB735BA9D3B
+:1096600057F1A6176234BA254B729AF4F744FADB25
+:10967000D0EC369DBC4A1C88B08CDBA87BC43DC0B6
+:10968000833D9DC4D79087477142D98374754AF052
+:10969000CE67BA31DC1487E076ECC7F1614261999C
+:1096A0007693CAC69D83AD190AC2135A7762467E65
+:1096B000AF13A37B655D75E13FFD7C5D230D8E954A
+:1096C000E7893F2AB39AC255A09BD114CF6425B92C
+:1096D0005DA4DBAD96D0ACC7E4543CAD1749407BEC
+:1096E00099B2418F2001E66D65E072C9C4B3D51906
+:1096F0005EB895213B194BAFD1741438754C3700C7
+:10970000A587B7EE9CE2F9AA1A9AF8A69517AE2893
+:1097100047147A9861DBBB1CBD1EDC73548C8193AB
+:10972000327EEE979A4AED40BA51E39A4A19209652
+:10973000DAEB94F02523F7AD1BD597BF0D80841687
+:10974000EF17FD0D539CCC0BAB187701AA553A3996
+:10975000F02090CC74435DC945440042A7F0D43159
+:10976000B2022CB4F664CBE8FA29DF70CD3BA2FF3D
+:109770005698E3FE952E892F924A00B17A1785BE3E
+:109780005A7DFC2BE652A8A3AADE7AF373580D6E1D
+:1097900060B20E40B70C35CC0BAE47B3FF2012576A
+:1097A00006129A76F82D0632EE3B2E7D0CC164111E
+:1097B000571BC854434EC6999B795D6A07D97138C7
+:1097C000C4A9B1F12E58DE3395247538D2667F478F
+:1097D00097FAF831A1FF694452997A193D9B682F95
+:1097E0007D626454C5E47D7117933F96A4E9F857F0
+:1097F00002B3B57CB9BE8DA4C09571D60F94F25357
+:1098000017555EDF4DA1D5D9BBB769819AB505D390
+:10981000D92F19A0726A66B05E587BBF3AF85E0B0A
+:109820002242BA8A8DE2EFD810F81617045A9B0A22
+:1098300018591FBADD61B4F517A4D5D60C731DD025
+:1098400047A8E46F9900CCA3B88FF615E0BEE54BAE
+:10985000857A441B1838E2709B1CA0DBD80145B305
+:10986000576CA07120606058FA84C0BD71A0B9081F
+:10987000C146246255783E83E9341BC1FF2F9F67A0
+:109880000C37F233EFC483BABE73579660460E4965
+:1098900013E039BAA95345D9923B119BFAB98474A4
+:1098A000C47D68349EEA74E19223058008A3506069
+:1098B0009415DA23A38D0BDBBAAC0896899CB0C74C
+:1098C000869CAA9337788E995CB09CB1FEE0F587B0
+:1098D00044F298294D08DF773D32532239B46AAEFD
+:1098E0000DA248569D00A96709115D31B36039B5D5
+:1098F00046E6609FE0138F0A1D3D2FCF908D4036C6
+:10990000A8B5B1B498625A7C44C0E18EA7656716C9
+:109910001F451FC26FFED2A49A446EDF518F90077D
+:10992000F9358562AADA484ADE07F1E88333338DD8
+:10993000D4AF7897B6ADEFD58F3B7E835C0AD1610B
+:109940006D1D904B10D6B58DC7C4954E18A0F86DFF
+:109950000B717C6F0B3467467010B3B10B7AB82D66
+:1099600047EDE2F041540FB65DDE30121F13700276
+:109970009F44CFDD37CEF39A569E26E3F666CE6D32
+:109980006AF9EC3322176B154024183A8000B1FEB7
+:10999000263962FBF0FAFDBD9E7B35061C84FE3045
+:1099A000F2770E455AB842D24AECCB5BFD3192F9C0
+:1099B000EBCAB3CDF4A98E5D7676114EC62FEE1BA1
+:1099C0005FBB31D2760A6DC876EF7BCF66477840B1
+:1099D000A10F120A2B302D449932A4820067119EE8
+:1099E0007E5AED1F4E69A246364E84F2270DFAFBD1
+:1099F000B6F422E4C32027B1EBE373E5D93C70FA57
+:109A00000FED8EA7429B79E27E43AAB4DD88F33C3A
+:109A100087DB84A56E7EF611387B6943719A333BF0
+:109A2000F88015D7BF0CD5798BF778FEA163D0D815
+:109A3000742725D96ABE4066909D19985B5B714278
+:109A4000039D5AED800164A37FDF88611694507CEA
+:109A5000099C80C54B40A5683A63EF9ABD7E778B21
+:109A6000E3E4C263AB64CA1E8C589A33430E4907C1
+:109A700064CB05D739F65988AD7899718C8B8912EA
+:109A800014FA24B751F140A1C31CD85B86BB2DE565
+:109A90009AD1E314644943A28E205BFE8AEA9AD6E7
+:109AA0002F323C260B8E54F1893F379FF8A10F9C33
+:109AB0005E52F617727EC78352D3A89FEE19BEFE80
+:109AC000BC1ECF3B4A4D90523EB5A01C57076C7D43
+:109AD00037D103EC931DF0A5BC59117FE5DB9F1135
+:109AE00016128070A39B3B30D8A2114639082DDD99
+:109AF000E367D0A9B8DB8464F3E998E44F5961CEF9
+:109B00004789ECEE0307E6FEDB02D1F03D0B20FDBA
+:109B1000260CD6E8CE7FC2B143C8C7024564116B9C
+:109B2000B7EA8668E8E170CD7E0F64AA7F76B0FB65
+:109B3000F483675CE0D099F59F43BD5E225283BDFC
+:109B40002DE3EC678C227E9B6E4AA1EA70BB0FBFAF
+:109B500020323258E692A38458A51048FDA367A886
+:109B6000F48A7327121718C599AE8AC039444E7704
+:109B7000E047FA81570BFF634EB9D4D39A54EE17DE
+:109B8000AB1D17FA9C1250256C85EAA0878FAA910D
+:109B90004091C28DE64F9C8878B19AC5D2A0796673
+:109BA000FAA2CAB055A956A78C29DAEC6208F5F7D3
+:109BB000845520C40C9363A26EEA6BC46B77556C1A
+:109BC000BE7360EBF0B1CDA969D50766DEE94BC67F
+:109BD000242C1B6D64EE75D05F098F9C71559A35EE
+:109BE000100DE23512BB1A46F1CBED88FD6260C55F
+:109BF00088C7995D69780A139DAFBC6C68FD5A8A65
+:109C00003D6F546AB9B6B0AF2BE057BCA9B618CCBB
+:109C1000711D84691887D130C0A6B129AF7E39A6DD
+:109C20005266F8E950C5243F3AFE49BA4A631FD646
+:109C3000AD1C1C9BD8B02EE53F2B9D3F3FB042C7CB
+:109C4000183D10DDE7958BBEC67618B06FFE23F287
+:109C50002435F26E9F3F73F68870475E3A998A907A
+:109C60004C1E35F1AE64EDD3E458844C546E3DB2D5
+:109C7000E1F191116E76D23D480F1413033F501F4E
+:109C8000D2A4F5B603F8178D26B3D14C78E1CF33C3
+:109C9000C85F8949EF229092925F9DD0AFB0436C2C
+:109CA000DF55CBA802CB44511D8EFAD43F789C548B
+:109CB0002B05D2B68B1E0E59924EE6F94CEB23A122
+:109CC0003DFC4B5A45E7BC64E4F6D0B2668DC78EC6
+:109CD00080EFF8DC6ADFC4D77BCC8BB57121387F8D
+:109CE0002611285093E972939E0D01A754E2367312
+:109CF00026BD59AC955097384AA0E0FBB7D28610E4
+:109D00008CB5A5569AA277085779B1670DFD4A57C9
+:109D100056010A19A2042E228662ED2A8DDDF0B0CA
+:109D200002F1D128B397A9120154C85E44324F30D2
+:109D3000625D1BB08AC91AD3A2F0181E1412F61164
+:109D4000368F4370D71EBA35A48DB76AA61CED7442
+:109D5000E13022586775CA513B8F196AB5414D1BD6
+:109D60006B32E1221342D2DB5589B39C82AC38D9E5
+:109D70002BE3512318869C47996C06B62BA4BA9204
+:109D800036FBDDF8D171BA820A9BF28FA7AC89B19C
+:109D90008BC8622D6B8C8D46B64268C979343FD42E
+:109DA000213F04723EBCB7372ED349BDDC0EA4B5AB
+:109DB000863F296E9E38C43A45640C6B715391F608
+:109DC000949B374CAD7CDC24A204C1D358C24DD146
+:109DD000AD8050AEAA62A4759A17F211E3732546BE
+:109DE0002BE1717A8184598E0A821C76DD75345498
+:109DF000C2306FD642192F1B12559E300B2629F9FF
+:109E0000F68AB4C9FEDA11348EDE1D3C9C7D7C37A7
+:109E1000998598F0844C1CFA343C86008530449235
+:109E200020B969D26D3D58DC6E18AF2BDD358181CC
+:109E3000AFBC9389FBFB2D4B5152C6D810D8B70B42
+:109E40005C0A4EAC6A282911A83EDC38F45EAC20CE
+:109E5000959D7F8C6D051EB76770CA65E82DDCEC9B
+:109E600086411365FA180D850BF276C5450A98618F
+:109E70006665F7F40612BF472C96A532A1F615BD0C
+:109E800080904A11EE1CAB8D5A48B451529517FF81
+:109E900008FAD113B203C90BC70F2B263752B2D21F
+:109EA00098007AD9D42E319FE756D15C757C394120
+:109EB00056E0089D2FE8D2FCFF9AB9BE7981114D7A
+:109EC000B27D7B28059222E08C59AE378D608DA93A
+:109ED000636BCB449055916A258E765C85C49B124A
+:109EE000C8BA4BB021A8192CE1B9C1C0E8B4AA0482
+:109EF000A0D2033178412ABBE27F0A3F058744475D
+:109F00000831A792ECC1CF06BA4BA68642CB0875A2
+:109F1000A26F2828E4CB16563677BA7224C6C47FBF
+:109F200069994C44F274071EC6A4E76168D449C617
+:109F3000BB06E6CB1BA38B5309CA66CCC9A1A9B249
+:109F400084E7FCACF1D614678BE0BA787374827145
+:109F5000296CCCD3A308CB0582777CEB8F8A5A532C
+:109F60009A8B7F2471C70F00A2F36B06BCBFFC3134
+:109F7000AE75FA668A20AC18CBDDC69B38C6ED5D9F
+:109F8000F78AAD30920BE3CA88619BFC933C069A3A
+:109F9000763DF404A77C443170F6C6965494B12CF7
+:109FA000C733D0FB81B3DFC8042F9A497DB5768CC7
+:109FB0002B5D1ECEBA3D8BD19FDF36785921565688
+:109FC0007089291B6148967459225C30DF5D16B494
+:109FD00000D6ECF9E76A881244A3001DE552A37A83
+:109FE000FFC61E7B21ECC778A3C4B16F65604C76B9
+:109FF000C599DCDA21BE5ABA9B07BAC9755FFF065C
+:10A00000AF4710BCA44672C460346B8B147D47AA62
+:10A01000D3401D77AE139D984235B378A55329EAF6
+:10A02000908FB58337F5E6794D1AFA632DB3392E43
+:10A03000DDC0F913681F584EF9C0AB8D9961B4A407
+:10A0400049AAE7B0E5B3181F668658A04FCAA133E6
+:10A050007AA906F1CFF757AFDEFB2B6B40FE579482
+:10A06000DCF0B53EDFBA092B6221331FBF6D0C2136
+:10A070000ACD2EDD4AFB6A8F17FFA3A6ECCCE1C305
+:10A08000DA218E8622564277D6A1B4C231F6233425
+:10A090008A38B9AA055C8F4D933EE58D860B878B78
+:10A0A000B6CCECDD399C9B206EBD5EE46B91B33881
+:10A0B00056D4A99C9D9AD7CF8AE05A75DA9C6B6DCD
+:10A0C000ED91B93C68940C3188EAB410959C1D3E22
+:10A0D00073EF9E56484DDE4A88C0BEF745DB886A5E
+:10A0E00050B39D33EB1F38881588B55A489E9C9F06
+:10A0F000BEBF811C27448B0E7BCA018CD964732898
+:10A10000824B83B443EF4E4CA28E9EC3A8AD71AB7D
+:10A1100045704B99176A4169E7A9C0AB846556A39E
+:10A120008C7D77C60D567DE4FEDFEFC5E47FFC191C
+:10A1300074CCA9914A0BD7F550956057B3B3DF7330
+:10A14000CCA71DAAC7AABBD609B3618521380D5873
+:10A150006A93984AF7F82C9099F7CD12559C1AB645
+:10A160001CC87B93FD05745695365938FFF080283E
+:10A17000A24B9B3F560E33B8105A3286593649E9E6
+:10A18000732CF94EEB308DD75098172E6F06974AE7
+:10A190003F2457CF64E4BBEAD15C34CD94BA481A6B
+:10A1A000CC1FEB5ABF66D5168CCD07E039F8874D2A
+:10A1B000AD85831626729C4F4CE75202B40884ABDF
+:10A1C000E56FA90FB530111B27A6696CCBF2CB86C2
+:10A1D0002468DE03DCD506D48ED45C13BC38CB9265
+:10A1E00073123FF4D9F93D28EF4F5187F743602FA1
+:10A1F000529E4E1E14C1D7602CEFF1257C9185B57F
+:10A20000C9051A0A380B044EE73F4700F66A46466E
+:10A21000FC5242D08BD949C288263C206B7CD1A30A
+:10A22000CEF6E84602D2CE1D8408B67AF58E91822B
+:10A23000DCD72D0C153B8D7F6CCEF76A37C3AE0B88
+:10A24000ED10C74A066059B759AF7E80FFB90903C0
+:10A250002141D97E970BBA68C64AD715356A70CDA9
+:10A26000CD626018B6E57E7F72796A0A73C367179C
+:10A27000C67FF26F8A8680A95273B3D5591489D9E3
+:10A28000F582EC5A8495BBCA450E2324E7F0776229
+:10A29000CBB4838A232345917F3D78B7BCEB9514DB
+:10A2A000C8B200676F68017D32C003EE031CFAB4C8
+:10A2B000FD6BB500F4A353324493F9A5AD601007CC
+:10A2C000840F0D1BD87CDF3CF8C35B850E1F2777FE
+:10A2D0000F2655798D744861C1EFF678DD3DBBCD11
+:10A2E0003F7A54C7FF94FD09B6C5B0E84A7A871093
+:10A2F000080ABCC36977686A7BE001D87CE26A69B6
+:10A30000858E83481BEE97E38F8C49A78252DF7BB3
+:10A310008A139D391BE68A11A7A23A30175351546C
+:10A320000BE7764EA29FB8D52CCE4C0C3EE1E6E66C
+:10A33000DDA070990127FA49B81AD59D8FFE5BA060
+:10A34000B9035E5C660F63A158D9408A3DFA02F2F8
+:10A350004355B76DC0BFE584EF70B9B32AA14F6A0A
+:10A36000AF6B50EBE6E3B6F720AD57FD719A1C7466
+:10A37000BF9602E24ED465BC01F8532C634787F7C1
+:10A38000BA6D0DD97B96E3E32C935E65D6979A144C
+:10A39000226545EBAF41946D34622CF237C11F7BCF
+:10A3A000B2BA7C078BDAD3E60D3BC8CD6BF520C083
+:10A3B000AD133CAA2B4771B3E15AB01C3886E6F0C6
+:10A3C00051A336A9D40FE9B857D1A8C9BBB328E324
+:10A3D00056F7240C3D10D6C908A0B1ABA290BCA47E
+:10A3E00050181A9A1E71A962F7E750DA50634FBFEE
+:10A3F0004D198FC13CB100BD7B2734EFA47C822B6B
+:10A40000049B9854C46B1BDDE3D96F9D5C681630C8
+:10A41000FB97BFE5907B300158128E9152E3830386
+:10A420007CB834951F9EC993CFEDA612F7DBB92AED
+:10A43000004F05EB6B38555B52F6773CCD8FE0262D
+:10A440001EE5EED5C92B3CEA742E18E97736D5F90E
+:10A450002E61CE264F8E5BCEFACE4EB9867BBC8463
+:10A46000AD1ED59FE16E82D676B733E0A41A237471
+:10A470006B4B527144933E3C5964BFB8E373A19453
+:10A480007BA39A722FE8BFAD2D88130084439228D6
+:10A49000B590EE3B9F68FD54C2D9993892DC85A0F7
+:10A4A000B078A20904EB0D10CF795FF668A0F5A291
+:10A4B00057650C67A15295271795AE6D5B0AF29010
+:10A4C000C5E79168915033323AE19E6408377BD1F9
+:10A4D000014609C4A941D36624DB1E713C19C8A9F1
+:10A4E0002E6722C519CAB6919129232FEDF1930E3B
+:10A4F00088BB54F8C982855CA858FA77791037D799
+:10A5000049B5289A063BD23D37591C42EB9D03952D
+:10A51000EEB4DDD7930F0A10A728DDE77CB1F8AFC2
+:10A52000A0D6BAEEFA0BF7F09A501E7132BC26860E
+:10A530009FAAE6CF6257432616360105E2749E8035
+:10A540006506E1BB9BC7B7A596D25CD5B42EF7755F
+:10A55000F69D84E0E1CA378EFA3675245F44CE7AE0
+:10A560008E0FE8318163F08B483CF1F2FB305D17D0
+:10A5700062A50C768A3CB300A8126A62D0656F7639
+:10A580007357EB436A0CBF77977D1ED2DE3CCF3CFE
+:10A590004FC2F7287B1F20E4A73700BDA2A1E5C367
+:10A5A0008EF883E2822739E2CC72CCB8239F089DD3
+:10A5B0003317869DB595EA9F0037DFA7BE28A7AC65
+:10A5C0001E535AF162A5B444DDB41258065E7D698B
+:10A5D0004D327E2BF70647F1C78363469404284A21
+:10A5E000C93C4DD1C91578B0F293328236647ACE27
+:10A5F000DCE4C90AE2297BBAD49EFE2DA3B8EBF4B1
+:10A600004140BA3A836F411269244DE81108D2B231
+:10A610005EB30A1FD5F85D41AD0B3A300B185823D5
+:10A62000699E162BB7F42EBFD3F695C50A67331172
+:10A63000914EEFE2FFBB06AEBD4F5201746137266B
+:10A64000DDED568CC9756C7A02CF7289FD846C99E8
+:10A65000500E6DD332A4634CD67E2C599B5A07AC56
+:10A660006B27533796F32B5291448858E04676F483
+:10A670008F7D2FF81E733BE1FC400350E626707F70
+:10A68000FB71C1B1F820E1F876AE8C49CA300F20D9
+:10A690002CCCE0330EBDCF4FBC34BD7A6AD3EB7304
+:10A6A000FC0B84E86E504DF8A71595E375DD582630
+:10A6B00037BCBED2D7FF04ED891CC548BE793944EA
+:10A6C000507B5414F12BE3DEFD6A752D1965000AE9
+:10A6D0002405F4579E6E33462A2E33821AE38A26C7
+:10A6E000003B5F66E6D5D22F851F9A2E1261D628D1
+:10A6F000AB636FB44022E6C69BF8534F0D435A51EB
+:10A7000024E9772FD1333FEAA063941332B4D912EE
+:10A71000B8BDBEC8878A70E13A2B553ECAB2C7257C
+:10A7200092AFEB20BB8D75A16DF5A56137FABE1810
+:10A7300029BE2510EBE2428704175111EBF0AB550F
+:10A74000410FA244A3BA6068995BE5D8D7649F071C
+:10A750000EE77EB3E47F1ABBA3855904F1FBA50F76
+:10A76000226A785C74F38428C45BD37064C0ADF350
+:10A77000193E7A4087530ED5A2FBA3BF96FF4B220A
+:10A7800012A87706224AA7A09B3145F4444B925267
+:10A79000C911CC56115C0DA00098F8A81E8F762B1D
+:10A7A000B9A265D2B416499D207FE4D03C3481C85B
+:10A7B000A9DB86EDDEC702E95E02CFF080B1CEE60E
+:10A7C000CC76166F249E2E0A369F28D59156B6EA6F
+:10A7D000E8EF2CFAD6A779AD817D00A0D5BD54074E
+:10A7E000D15F24A566E661DD835F8E4CE0E4A0C303
+:10A7F000310A2D74EB145A3D24AFC4A360BB39A1B8
+:10A80000D2EC1894C9B0738BF5FADFF976AE2883D1
+:10A810009AFD66B19A4D47FF3B44B8BD8215CA798F
+:10A8200042ACF4CBDF18254CD5A333132425ABC29F
+:10A83000FF2385A258CA19FE29B8435E1EB80E4CE4
+:10A840002B2D5ED66443D3681A4D02022985BD8E36
+:10A850005146AACAF1AAD56D1D779442DBE4920550
+:10A860000B1AB439C69258D9DDEEFC0A7F0044E8D1
+:10A87000D9ABB6FBAA1F49E3A1A9245708033DD8C9
+:10A88000792A239F01ABBDE30C73DCBCCD0632A556
+:10A89000E44E2C2735345EAA6ADAF3AAA9EAFADF75
+:10A8A0000EEC9E0C94EF3D6EA979CC6A91667055C2
+:10A8B000E35D78B5D883B0741F0A14B46B1AB41270
+:10A8C000204649627FD157EBC7CB2C6D663C04EC28
+:10A8D0001AB66586EE863D4583013D457F4DAAA5A6
+:10A8E000E3BAC87C3A592D965CDF8BAB10B686ACC8
+:10A8F00096BE6AB09D4764F0A70749A35442851AE3
+:10A900007A42CF3F3955608A89245CCD1B838647C4
+:10A91000ACA3E2F32B618907BBB7A4B2EEB98FEB0E
+:10A9200099CE062C8B9748DA1BE76F4E2FF6638380
+:10A9300051774003575A761923EE6CC91D6E1EA33A
+:10A94000688699457090323DA8763D1342BBC77D1D
+:10A9500020FAF618D5FFB548ACC4A4A1AC158BF607
+:10A96000ACDC4509DA934D13255643EF83E403032A
+:10A970004AC17AE98B8594779067F8C034A9B42FDF
+:10A98000B201D1664F32779F874EAE251C92E749C0
+:10A990009D8A33B024151DFB262AEA4D2B1E4094B8
+:10A9A0002F55845BBEA7B0BFAA77BF05F42F6C48B4
+:10A9B0005416B554A6B068943DD6414B704D611104
+:10A9C00082F84B934C1AE1726530491ED69ACDE459
+:10A9D00080FB4049CA64B82D023B9063521E657EDD
+:10A9E000BB7455F703FBDD6C58606D74AE3FB4511A
+:10A9F0009BE640AA293843AA8BF6EBA3C46C9E229F
+:10AA0000B278C085FA37161DFF78E72DAD99EF8033
+:10AA100039D0EFCFEBC05D04C05A91413722EA3400
+:10AA2000B0DA8E353D4FE5AF4C8614EAFD34DAFCE2
+:10AA30001A688B235D96743955426F8C4F50ECD455
+:10AA40004064FC1DC05C81B5E6584352153F787CDC
+:10AA5000F6E9AA71BA6807042137D1C134DBFE04D4
+:10AA6000B6F2971FFC1681531AFE1CCDB8C70ACA4E
+:10AA70002AD13DCCE16F897EDD210B96F9257AAA9A
+:10AA8000875FF47A5D45C0A9D9FC2CF48A25061BA2
+:10AA90000341BA7D6496185A11566A5CEC1B99857D
+:10AAA00058209DA0A7DB908E36F49A6E463DB79F46
+:10AAB000558FEE9C6CE9821D87C2143E48EEF04B28
+:10AAC0004118EF0A0C0533148EFB3A31A919594E7F
+:10AAD000213EDE8C4A839DEF89832B4D138DCD5112
+:10AAE0002E365D5637FBFF739D9EFDD9BD9FBD077A
+:10AAF000297D9493657DCD5EE82660A7AF01FB3A82
+:10AB000087C57BFCD105DA76E9ACF4C35AE2961F1F
+:10AB1000329A73EFA19CA7C305839DF048C1D33C33
+:10AB2000DB51BD4819C445E2EDC25DEBEEAC5724E4
+:10AB3000C4479D9773DCE520645B66CE21B9EEBE09
+:10AB40009CA532765702BC732ADA8A37D09D636699
+:10AB5000F055CEF7B111DAB58799D8F85BE2B56D4B
+:10AB6000A1A0B642468BCC79BEB3CB0D982FFE9AEE
+:10AB7000764C94CBBC0BA5CEBF08EC3E1097C040E2
+:10AB8000F963497B96B93587D45077D4B898106665
+:10AB900020CBFCCB2C4BD945E3B33CFFCC445CB77A
+:10ABA00086A783C48E184B0BD8BDE6EDA419A86BFD
+:10ABB000DEAAF330B04272F62342C8C20D453F31DF
+:10ABC00048D3BDB09F61BF28A1977D8B1A38CEF0C6
+:10ABD0006A443701CB4CA33460BB44A02DEAC51DA9
+:10ABE00001BD5D2418668F13AE25D2A508F9E43D9A
+:10ABF000033180E8F744E56D890F5136B86BE6DD27
+:10AC000099CC9B249CEA3031266037F78008F9A361
+:10AC1000D558D4269D2CE2AF5BA9D7E0FBD215B165
+:10AC20002F6389400919B8249B2400778D740D5037
+:10AC3000B83167C5639ECBFE1211D2C1730C06CC2E
+:10AC4000FDCE637EEAA7F3462839036CFED51D329C
+:10AC50000BBAF9DF8C391D128CA9969A96CC17473E
+:10AC6000F966BB9603CFA56C23499FF802FF20939A
+:10AC70005678EB3205C7ADACC4121ED107E8A992D5
+:10AC80007709EAEFDA0910AD0743B4FC43FE0AE3A3
+:10AC9000907FCBF33C81704F854B10BF99872995EE
+:10ACA0000C189FE0CFC4C904DC082C4A0E1C7FD8C6
+:10ACB000D6F08BAE8BEF5D9438151BA18CB3D5E429
+:10ACC00009C95F0BB2C80086D8697CDDFD61FFC38E
+:10ACD000CF3F7490EE2A8C201C855DCA9937A568F9
+:10ACE000BF5F8ACE62155E9B27367EF7C4CAF09E90
+:10ACF000EC1A5C3246524ACD365F33E207173869A8
+:10AD0000AA54F87231719ED9C8C1F7EF9B228414FE
+:10AD1000C5411E8D08C8BC40409240EF7F1C812475
+:10AD2000670D737B9872552DB20A64D9904E4CAF63
+:10AD30006AFA53753305D9EFF3370738C9AE4EF4C5
+:10AD40000DA2F51F2DAA58D4326E17F1BF34EED9DB
+:10AD5000CEA7FF6C557929830E758CA45A15BDB802
+:10AD6000F1DFFDFD4D7EEFAD56210794AE063EA20C
+:10AD7000071F7CC2573395BC7D40D46C1507E897FC
+:10AD8000F1006E070A6B8419DC13585E2E0C2F3508
+:10AD9000F4E29CE3C5A70432BC514D99EC58E4069B
+:10ADA00021C7C0015654799F359B630897F8FB4330
+:10ADB00072AEEDB41094F3A207FA1326F7BC237811
+:10ADC0004A5937CC8C3D6C6651082F722AE71E3CDD
+:10ADD000781A66931EE289891D758CACE0314C248B
+:10ADE000C8368DA48667C9B64A5C4BEB4D5A0F2B0B
+:10ADF000E37FDAEC85B5694C6C80D02354A975E00B
+:10AE0000A3E368825FCF99C80F404131B087BE5B32
+:10AE10000A464D3F88281D9B0921DE3165C5FC850A
+:10AE2000F30A8C09EED94C4B03CFC622EC0CFDD7AC
+:10AE3000CF3355A37EB8335E4745BC7ED42F4A1E20
+:10AE40009E1AF2B0822EE95E65F81E4CD5B5EC0E66
+:10AE500000DBA4C1DD355BFA8F5549184D91851291
+:10AE600037464CBC04BB156596C5869A3A03E05A32
+:10AE7000A5F8FBCF00A2EF19FF35F1B4F0C4C2B1C1
+:10AE8000A80082877E0AB4B08426FEF3D760AEFEA7
+:10AE900035F77960525CFA5DF988664E98D09A9DD4
+:10AEA000537CD4ED5C8963B23B0A0C0741EA9B35C5
+:10AEB0000CCA4960C567699F9E65024884EF43E6F6
+:10AEC0005608EB93805BF47549B4BB93F35C6786DB
+:10AED000EB136BCFF4EE5BDBCA8EB228AC39E52402
+:10AEE0004EBA0FD78B18486C6586790FE4DD9B321C
+:10AEF000DEC713DBAF9AC9C61838599808DAE14C97
+:10AF0000B1D657B67CE0E7E88E6BE4F25C714AB9E3
+:10AF10008E7B28270807F705353AF4939320536B67
+:10AF20004B8999320CE93E7551012304A40A45125C
+:10AF30009975050D1304228D8183B0EE0C3798D6D8
+:10AF4000828C06D5E398756E2DB49220C2DF7B5CAF
+:10AF50002C37B6161E34050EC25BAF872A933040DD
+:10AF6000C60A0D2C37BE424FAA3CDB45BEB020249A
+:10AF70002CAB2E01F6FB7919502C876FDBC5F5360B
+:10AF800075292C5387AC3698DF557315C2DE575E92
+:10AF9000B7B1D8498334DEF4A88E8ACCB4EFFF432E
+:10AFA000A7AB85F02EB7D658172CD0A203AF2B7EB7
+:10AFB0007461C07B7C73FB3D8A29EE342F0EA9831C
+:10AFC000892789AD0A94FFCBDE01E11C092CC20B55
+:10AFD000EABB11C2AD0880EFCBEF51E1999222326A
+:10AFE0002E53AEEB71AC518822AF4A7B321BE62068
+:10AFF000CDE67249DD6D625B70106D5A94996547BC
+:10B000001CDCBA5762D63AECEF4B62F97AEA823A24
+:10B01000A4212EFC43119CF6FC62D75F52D467C872
+:10B020006DB15022A36E6CDF9C15528ECAFCFB6F73
+:10B03000CB3152B2D77081F3038D790EE2BAB5DF0E
+:10B04000B51259E53281C126F2BF0DCFFE32F2A909
+:10B050006D86A4BFE48750DFDF96D2B60099571003
+:10B06000F94115434043DA9EEAE711F98590D5E2AC
+:10B07000F2BAE24728A89726C1F482AE61913CCB90
+:10B08000E9D401ECF97CE5C395518F1925208FBFD8
+:10B0900019E69B3A98867C94F36E2418C8B489C04C
+:10B0A000B127328882AB8C85BCA1439DD6DB6C2056
+:10B0B0008FE412E7F46FB5750BF33D52E6AD2EC386
+:10B0C0007C332FC0BA7A1FB9C46C2D00A029544418
+:10B0D00073E02EC488A676D0D8032081B317426EC1
+:10B0E0009A364B65100339BDA2885675E750992EE4
+:10B0F000FF4240FD50A0365CA58E9882EEA06969A3
+:10B1000053862A2E50186F5138A688A4AC14FD001F
+:10B110006E6C5093A7860EBCBD1373995A5F330DA6
+:10B12000CEC6C9D139993FF1FF817BBB47BAD56003
+:10B130003C899231C86C8F82D66AEA164AD650CFC3
+:10B14000E0C748F908F5BEB195EC9BA9D4E9A9FA86
+:10B1500063F7C4F6A3E9CD11FBB3BB0CC7A537FA5F
+:10B16000DA093E9281B9218EEFD069AF2EC246CB6B
+:10B17000660AF8F61B68FAF26C807FAF2686C693E3
+:10B18000B220ED5D0242A11E8C57AF2346BC80CA9F
+:10B19000FCE91019BF5B34439649820CF5463E41E9
+:10B1A00040FD40BCA3341C358C9656A197FDDD773D
+:10B1B000545042C673FD5CF5E3D95F0172214588A6
+:10B1C000325E137317D9B8696891060407C3B8AC27
+:10B1D0001DAC8383F6482C4785C5BC525801379374
+:10B1E0004788FD3BFCF718E1053842C3AFC12AA8E8
+:10B1F00003088FBDED7B3365F793F06819FD4E743E
+:10B200007B92505023A0C533D918F589946C958949
+:10B21000F5CDE242486FB347BFD9021929FB43ADD0
+:10B2200015334638C5932E0E50D48EEF9CEEC6D8FB
+:10B23000D8AA49CD628D775C43C523FE3616916F3F
+:10B240009FBBF5EFE1B2B61896765FC81DC2C4C8C1
+:10B25000FDC18EBF5B168EE1DA9DEDECA0C1022828
+:10B26000B10EBA235AE217A95137B19DA5C228C918
+:10B27000015CBF2F932D4C6C5211FB81298EB86657
+:10B280002FA782D23736346BBF4DAF6CD207AD4E8D
+:10B2900018D96AAB14BE3800C58D985C7E277966D4
+:10B2A000795D272637E277D4F742AF62CB1F2D6D49
+:10B2B0002CA21F4578C8AB93E6A87676DBB810FAC7
+:10B2C0008055946832347376CAF76EFF487825F15A
+:10B2D0009BF9CFF3324654A83F3EB8ACCA185FBCC6
+:10B2E0005F6F0ADD7384015D2497965208CCB647E0
+:10B2F0003426C9A88A7055AC7F407C700F8F73AE1E
+:10B30000B2A6089DAA62609D22CE3EF41BC948D910
+:10B31000ED9A6EB0D406F57C9B4EE0093EA7FE3E4A
+:10B32000435293226618D2C1A9A79C2CE99CB6C6A9
+:10B330003D700A791732E716814A33E40A3D857574
+:10B340006E06E80838710789145785F64D81B0E418
+:10B350002FEF3A25E234CF2C68A71C2ACA74005973
+:10B36000DD4FF713801DC8A0F08B266CC6A0219579
+:10B370005E66A2042742B235FF75AEB379983F2CC2
+:10B38000AAFFA70E789C6501BD583B030D4764F1E9
+:10B39000B46BE4A0378F301C0FD7CFA9FD308F02DC
+:10B3A0009F4533C567E30143A8608BC8C03ADA11F3
+:10B3B0001217C898A2B6EF3398F943E74FCF2492FB
+:10B3C00061623D9B9433176F21244BBF31886D0818
+:10B3D00096A0D9309C56141BC148EA9CBCAFBF4E06
+:10B3E0003A5798A97369A3C663BE3F36BD1C94EC57
+:10B3F000EC0C9A3022283B2F5A048C06688E45E8C4
+:10B40000169088E089617535B11078936717482EDA
+:10B41000236E3204EFA4F4438EAEEFAC7B9F8332F5
+:10B42000E343C6D2A061A6363A04AF27DFA90FF3E3
+:10B4300037D863B13C1159CCBB7239FE21E3BCB89B
+:10B44000DE3E02B63F0FDA62DE6BDEFD2F32A279FE
+:10B45000A837BDC2F57DABE118B3FACA9C94E7E703
+:10B460000251AA9AFA96AD34D54811A34235F8BDD7
+:10B47000637DC6ADBC62F458D7E139CD6EF0F47D82
+:10B48000D8C59EDEE8DDD39DABD16054CF507AF2B3
+:10B49000968665D9DBB91A06F9248DC2DA59B9F551
+:10B4A000CF819244E5309EFD12C4407D53343F85E8
+:10B4B000A8BC41CBF641A4CA226033AE320CB5FC25
+:10B4C0006800645531F5154D7751122C705FC883B3
+:10B4D0008F440518E0627E757EEEB8191A9B2BE149
+:10B4E000AA6AD29F86082D25B21CD0971949FE6101
+:10B4F000A0536ECC623C58DF69EA214C3FD6659878
+:10B50000954C66999078F6FB4512FD8D1EAD3F2156
+:10B510000D0E30A2FF9B5F715B4D864C5E12D09486
+:10B52000959A6B9FACA99482AEFC8B60A467489FF0
+:10B5300027D0F0DB21B9E0DB403F0332720E58E048
+:10B540001B811DE0BC6314E99A7434808CEFF10C0C
+:10B55000C083275ED4EF094EE6C052B544D99F5B45
+:10B5600002B4A1B10C1C93CB966F71DB214DA1717C
+:10B57000CB554CA4C490463DADF0CFECB70B9C35F9
+:10B580007F4D726A123FA86E1755A491D89B5966D9
+:10B5900033843B9EC00CED71CEF387A8D1C8038CD9
+:10B5A000A0591BA9CDA727F31666BF57AA724081E1
+:10B5B000110501D7040F1B579297FA32C1DC186CA2
+:10B5C000955E01F99795CF28E56A57883E247781E3
+:10B5D000134AD05B5FCF56E8AC28DB0BB7D88AD4D0
+:10B5E0005648C81FD8CD8515EBC2A3574A4F18D768
+:10B5F000E8B3297571BAA341884FEEE150B0144900
+:10B6000095B8C7D263533765AEA232BE895577FC71
+:10B610002204357DB2CEE90CBEF562537394910DD0
+:10B6200046C80A07133F6BB674AE17D262FD1C0101
+:10B63000F76B03DD2DCCE2207D3FD080168DACBCB6
+:10B64000E2695F74AA5C9BE86F75029D99DE06064D
+:10B65000162CF01B44E27447439F687AE49F559F81
+:10B660002496A3AE302489DC903FAE92EB191A49A0
+:10B67000D8F7CE7DA368F212B774805B5A9610C9D2
+:10B6800075FCB16A7A517A24746BF2E03E54E2E0C0
+:10B69000CA572032B921ED74387AA4761FA37547B2
+:10B6A000F6BDAACA36E7B2D65C66D95BF74FF2148C
+:10B6B000ACC21C340B62E154E6BB7315EF52F3D1FC
+:10B6C000CECAE242DBA2403DD4CF25FA0E43C440AD
+:10B6D000135C68565CBD94D1DC352022A17E0E2B14
+:10B6E000CF32AA5FFCBBFF825B2D2C2F3F1B58E2A1
+:10B6F00063CED8055D0345ECB05424C24275B7A5AE
+:10B700006EECFE63863C7B571DE7F56F343AF2C85A
+:10B710009AE4AC50534E567FF8C741668DB5CF5171
+:10B7200036D5F9F96BC4FE9FD3DD6C6CAE492BD6D0
+:10B73000181F4085C1814E4AE7679BD957E05AB729
+:10B74000813BD3B7A047CA6B62D52EBE55E5EDE16C
+:10B7500011D8FE49F5CD1F01C41CFA61B2138176E0
+:10B76000F66A838C99E0DE7ED19A3AF252E426ADF5
+:10B77000F3927BCB3C51F5E3437261F602BDA49199
+:10B780009D2DE4EAC88B959145D22AFE5394F51A73
+:10B79000FD29B4787878DC72A5AFBA947A6EEF118F
+:10B7A000CC3832E1ABFF98E03352DD526485144C63
+:10B7B000F05999657FEBBBE8A83A1933632A28AFA3
+:10B7C00024A60A4861F672E8033D5C613F694404BF
+:10B7D0000795485400C1A401B8078F95C6A890D317
+:10B7E0000A1B08A6D063FE47409347E6E51A2906E0
+:10B7F000735669613B5AAC81647F6D2AECAB41A4FE
+:10B80000C16C6AF82B2BF7A9D7EADBE5BBC5FB2790
+:10B8100065FB10B82EC383C7AE9B581F3021F3AE13
+:10B82000CEA1830879ABB5E16D38B5FA8FFA9DB535
+:10B8300019EB1344806D97637DC38008169E2AA977
+:10B84000EBDD7C8C85FD3A28AA7FAC27079B113F56
+:10B8500041FC5E37350BDF3F7DB1EEBCAB60E48E63
+:10B86000323ED94BD7FDF327A445B8F9E547B62AB0
+:10B8700022B8CF366296F136CF85DDD3C2F3E90028
+:10B88000D4D0DD3B8BC9F43D1583DE430D7E331EE2
+:10B890007E2C2FBCCD3541758CDEE0EF4EB506BD5C
+:10B8A000DE50C14FDA6B3C6CC5D9E43524671152C8
+:10B8B000A9F76CEBE516BD4007C9602D2A28CB1807
+:10B8C00019F94B4D8CAD4C4522ACFEB9D344F99AD5
+:10B8D0001A157D76EAA604ECC2D5D8D1B1B180C1E3
+:10B8E00074DC7EEBE5295BC7C87841EFF401BC0F3F
+:10B8F0009FCDC1BDC368B8C80665D25BD5E39D8442
+:10B90000A85D6D030A30194D2A42D0C93BA179CEFA
+:10B91000FD14132A24C19A78CC2AF4739827495528
+:10B92000AE223C3FEB5CB7B9116777451F93AFBEC2
+:10B93000B81E84C628482CD31042D5726160648337
+:10B94000D730CA95AA9F40C9994B320F9F20D2F495
+:10B95000CC2F09E7E76D15ECEB115C4B8871255393
+:10B9600045FA15DCEAC8E719E79C458AC2DF90DB97
+:10B970001042566CA48C302E2B05FC3A398F8DA9C1
+:10B98000DB548DA3509274326F2535CC333D723227
+:10B990005D0E827DCE4400A81F51ECE7849A7D9F06
+:10B9A0009204E4821F8491B4A1D24E66451D594988
+:10B9B0007FB88049A076A8A6C3FBA4ACD33FE9D149
+:10B9C000CE5D3C5B473D0DC580A22E009B61857618
+:10B9D000EEC1573C2E6D881223CDC142D470AD57B5
+:10B9E0002528BE006803E109C07DCEAE27484B2163
+:10B9F000BD6B23BD0C7AD39D9C609396835BEE2731
+:10BA0000237DC3D40CCE83FDFA237C6CF6ED1D9D03
+:10BA10002E6FF56A4B07803C054AC933B7B7F71D4F
+:10BA20007A095FB5A6DF827436E1DAF192DB6FF353
+:10BA30000E780336AE8AF4B2CFF545625535DD6C2B
+:10BA4000D10C86918D0A7BE84DED65ECBC4EAB8840
+:10BA500064E69947E6C6F85E7B03C74214E1BD87FA
+:10BA6000062FE305387A6C381437CA933000AA6D74
+:10BA7000C7FF5E0F6A8D754BFCA270988D3AF65227
+:10BA8000D1D3E2ECED2893C250098FF7F60EB1DC6A
+:10BA900080E90F22798451119D7A93EEAABA9D49CB
+:10BAA0007B26879F5F22BB5C18378D71E86DA2757E
+:10BAB00081574857D8419C0C20D58DAAFBF25BDBFF
+:10BAC00081E8FC6056E7EBFCFD742313346BF8D778
+:10BAD000BA0D2B77D6BDFC5C3F6DB58E9BB08DC982
+:10BAE0001218EADE0BE9D8E32AC73D482C1F957BE4
+:10BAF00012B5889187D839C5D626DDDB64AC90B302
+:10BB0000BBB6FB87ADF3928D971B8F546ADDD55181
+:10BB10009FB8BE3050772251EF1C1852888778604A
+:10BB2000F426799626B705C643EF4D362F31D83027
+:10BB300071BECD607F4A7B82D228E888E1CC1DDCD3
+:10BB4000648086CD7FD4B8EF0BB6FBB2C2A0A2B89A
+:10BB50008427E4BB4DCA4B234050AED7918565E0A6
+:10BB60000B52F5371D8909942DB5C18640D2DD955C
+:10BB70003F02B83487CCC0A6191D64B521C9A609F7
+:10BB8000E046D896995F27EB0D8BA6BD1461730034
+:10BB90002D9CFB93F35F4EC4FB69232DACAB0EBE13
+:10BBA00061984A541C6A40529696463781463270D4
+:10BBB000FF56A8D2EE830CFA00320869ED1A20CEA7
+:10BBC0001AB8F0511110585F373BA3C9F030820802
+:10BBD000B1A1FAA06F7D8EE2413F7A5078F3B5B201
+:10BBE0006E3941E2F40832D349307F9C78F7262E33
+:10BBF000B2A605FE77FA2FFE3E055D67AF326F6194
+:10BC0000E28A13BBB24F2D312DF5A4F74A41A49E11
+:10BC1000A8A685D1A15D9632DDBC2A8DC3712833DB
+:10BC200004CC333C46B13401DDDC6BAC2447E43E4C
+:10BC30006CCF6808A13F6474E3325A236B8951A525
+:10BC40004494A3244D834D78CBDF05BAEF9B0E5B64
+:10BC50004E6B8C4A3348D3578DB596CC7C1AFE2E4A
+:10BC60000695AA7303EFFB0DB98B3F2344078F1F83
+:10BC700008B9BF857E00013696F6A0CD59EADE866A
+:10BC800050C0D62C6C3A9D35D40000D2E035E9C7BF
+:10BC90001808C1A526ECD41492766461A19E0EEE1C
+:10BCA0003074682985CCF6AFD07CD6FEC3B1E99953
+:10BCB000B6567A79D40C60ED6654FC4A0DFDAEAAF6
+:10BCC000BC646A871806344E8317A14EB21CEC3848
+:10BCD00043306D62B0E2EF161276D1123B2E0B06A6
+:10BCE000F7EB9C7FD03D6766214B7D1424275132B2
+:10BCF00002A1EE0AE7D537EC83EC22B36066599ACD
+:10BD0000E646D7A28B43B3BEFA64D77C4383896BE4
+:10BD1000D2ACA00B08BEB3A944BAEC2EAF37FB4D92
+:10BD20004FA50DD1C11279BF2483991653E06CEF52
+:10BD3000CFADADEEC2886DC170294EFEB0E8EAEE1F
+:10BD4000C9C045C876FA6FCB13BD71F4F33FF94013
+:10BD5000409FC02F9B36AF9296E5C05964DCC591D9
+:10BD6000E2618A05FFB1C4FCE2BE910646FB73A204
+:10BD700016CE2CE56FAB82281E81A04161E07E7F4C
+:10BD80009D031597AEC2A50C95564BB85FAA96E4D5
+:10BD9000CB05E352CA6676AC0067A331DE961CFB86
+:10BDA00092CD52159A8A20EC02293559AF716681DD
+:10BDB000A683C78D45CDD70D1025B43526C966F6A7
+:10BDC000734E36C92B8181F9F1627A3DBB43F4DFB2
+:10BDD000E6FE147D7B8FEBFED5A315C333E489E427
+:10BDE0005B86EC3B0119FB1FBACADBC542AB7DE7A2
+:10BDF000A6C44CD291393B9394253E4A7AE15D31F9
+:10BE00007A7FC6E48D6B320E4AD07F5D5C7EB233A2
+:10BE10005DFF0303B279BD4150692B75B7E60B5640
+:10BE200049127BD6C7EB3F4DBDE98022F4581CDB9D
+:10BE30003F20DB424054A2968969B729DFFEEF26F6
+:10BE40005C86ED84921314F26B03133A009A7E859C
+:10BE5000BCB89B45D8A8B9C7C6C63FDFA7F6A4DFC4
+:10BE6000D99B20093A256E63549E3E84994FA4EED7
+:10BE70007FAF7662339EAE1437BA8FDDA3BFD52570
+:10BE80000C47DBDE5C10BCFB875AE679E68444A2F3
+:10BE9000C537FC408B08F908D260244AB3B92F8615
+:10BEA0000241B8EF2F3D5AC84476146E79DF333C17
+:10BEB000B3BE6FDC08631F3954DD6D1A9804933CE0
+:10BEC000CE6831A7AD50F9217368BB81D261FE7590
+:10BED0005360878F406BB22ECD058DE76ADF15FC6E
+:10BEE0007B86C8F5444EE6C4838CBD84B45A6C5D31
+:10BEF0002F5372798DF563A571F65392B855911D44
+:10BF000003B7316C787FAD7B6618F9D66000237E6D
+:10BF10002F68DBBBECFE23C013373EC58834099283
+:10BF200013C983C972964C21F08FDB4F4D3E7A883E
+:10BF30008497115224E3A330880029867A224397FC
+:10BF40001C707996CEE19D0C25F5040B6717DBBAC2
+:10BF5000CFC548A67317EAEE3E1C010F69B247B081
+:10BF600044C465FAAF618447A3E3A443986FAF6A02
+:10BF700036BE76183B9CD57141F704EE0DD152D2F6
+:10BF8000F00198FB65150DC62433A6323763524F76
+:10BF9000FA27A70600BE4DD5F611BF40DD33D60601
+:10BFA0000C92C4AAD49F8927528364011F28CE21F2
+:10BFB0005CEB99EA84AEA093722B590F15C994617A
+:10BFC000649D7785F157F2800797B40D0A8BCE57A1
+:10BFD000ACAE0D6DF0471932F169962B1A3D3A9EC1
+:10BFE000CAA4F88777BF411F298E6F7DEC0F0C9B89
+:10BFF00057B1052C3A1E73E200C6DED20208B883A0
+:10C00000F4E98A454C1E291205B684255A72AB23E1
+:10C01000D4679904D97D96714BC6D166B4ABC8F785
+:10C020002182967F596DD13E277EE39C73076F690D
+:10C0300093A5EB25846341DB189146DBC1FD2CD928
+:10C040006CDBC79C6202C30BD951219D579A3F4FAD
+:10C0500082FC10BB52C6C647A59EC33E818589712E
+:10C0600025DFBF25B6A6F70676688943B8DE42709D
+:10C070006FD290C6E8E4F61267769F75895E4171CB
+:10C08000FACA7F5581D2A3EDC728B4D24F7B489717
+:10C09000206B0D37AA5820B4CEFBB68129A4EA96AE
+:10C0A000C2C2BB79796B5A9124A5A9E9829B3B93C3
+:10C0B0000AD26D7ACD8D0509FF4A3767478558F852
+:10C0C0004E079A4707D2263ACD485E738DF4B2FDEB
+:10C0D000BCC0A7D1A76F4EAFBF9F331B5270E1E228
+:10C0E0005C5C260600433EB5BDF960946DDC35DF2F
+:10C0F000677348FDD74ED6958B03C647E17C043F56
+:10C1000029F60543697B4E7D979B8C45E91E059476
+:10C110000AFB0EAAD6BD96566019CDEA7AA238E679
+:10C120003FD4643C7C1745021F751DF6F8406B1820
+:10C130001AADE36FE9B99518169C65931CF4C463B6
+:10C14000D0DB3C9DFC4EF2420A5564C4B12A6053D8
+:10C1500098B9E74B37D5491227B693CF81DE5AD825
+:10C16000E6E48681390BC2BDA9021E8FE1BCDCD09A
+:10C170003B4BEDCA4F35817F8A3542DBA1635302C9
+:10C180004F1F6724022E356908B5575C767CD3CCE7
+:10C19000030E3D883C7D4F23ECC391E503485E6769
+:10C1A0000B9CFE361E0A54B07A66B8944A06EE77A7
+:10C1B00070BF5A08B7573DCFBF20C04E716C928CEC
+:10C1C0003D8AD64E7B669016C81A688DBBEECD5E52
+:10C1D000F399C52835ED2D0CA98E08A2F6BB1DF9E3
+:10C1E000114645EB894D7DD1CE13348B56EA30F79D
+:10C1F000B0549FCA7C64B2ECE32C63B8D1D0D2783F
+:10C20000DDCDD5820881E6169B1B37F45E6B58E3C3
+:10C21000F33EBC403E3F6ED454D8CC6B09810E3403
+:10C22000C1B4AE9F990F3B4343E6339BDA26018EA0
+:10C23000A25F5E9722430E21E27DA8BB44DCF6F0AC
+:10C2400010AC94D8408F7D1CFA5ADC278AB681370F
+:10C25000E42ECD2745D2ABC5948F2485CDA4EB9B8E
+:10C260001DDDDB49DDD643B9FE4DA919E35385A495
+:10C2700021349ABED48A8144F386C91A2CDB05681E
+:10C280007500770C347A22C5E6477E93785B2606E4
+:10C2900045F7FF31A4A911EECB9B350FEF38AFBDA9
+:10C2A00056AD0875A1F712490720527E270D95D685
+:10C2B0002AC423118ADB59C04CF3B9E944B449CEEE
+:10C2C000F84A662E8C4F42BBE00F73550A1B64E0A0
+:10C2D000CC60490EF75F2DF80E3981D09FC1D3BFD6
+:10C2E0009D4FBB104F032D60D5222D05891A91D18A
+:10C2F000A6E6F737F7170ABEC5790CAC7749F88A76
+:10C30000F7A5A49C6A54D431B8A1DD2BE1608CF66A
+:10C3100016092FFE967C644CE51BC73DAD6AEA3AD0
+:10C3200010C7197272AE8813A1B30D21976CE38CFC
+:10C330009515515E309CCB1D8EA2FAF3E91CE9DE07
+:10C3400023E3DAF213A1E0AC891DABA9AC1AA1D7A3
+:10C35000629DC29BFD296615D664F4FCD6E42C21AF
+:10C3600096472EB20944A6CACF8AE45CD12B8D0C25
+:10C370003C145AE1D5BB1E4F71389E5C3B6C077272
+:10C380008EFC64DC471462E2AB01B8FB1F36D7F0C9
+:10C3900099C3D56A8014419211B8C8B1B8A69BB8A8
+:10C3A000B2F533DFF1066FE823DC045258F3BA8AA2
+:10C3B0005379FD8224C26FCADCEC55722CFC966F57
+:10C3C000107F53D20CA555E6A37FA53E1827E7DCC6
+:10C3D00012AC6D039266655D58D2C2A675384726C9
+:10C3E0000117CDC8CB68F6B66D483EE9A31EB69ED0
+:10C3F00040CC11E57A0489F1C3E6D5E51878F2AFAF
+:10C40000BDB977A17E58E39F27153318D59C756277
+:10C410005511E3F96AE76FFFA379A05F639AFA0BFE
+:10C42000E0C0AB37205467B2FF27C80D386BE24736
+:10C430008EEC462383A4AF149E1D3D04CE3DAD3546
+:10C44000AC3CF7F18089FBA425603E3684D47B1E8A
+:10C4500072C5FCAA1EFA3F29A83FF075F8A6CE8C3B
+:10C460002B8757EA1ACDA7346AE9630AED6E7DD0AF
+:10C4700043CA8A774972902B6AF71483FAD4FCB2C4
+:10C48000C546FBE0366324E6CE54DC4019399B0FE9
+:10C4900088DEF91A78DD8631EB36EB09A05A24DA0A
+:10C4A00030BDE9ED15BD1614980582E46F1F248E8A
+:10C4B00079E80B8CE90DC04478A8D7AB52009C37C3
+:10C4C000E52E3FA4BE00405723E92E1FE3BCAB3E40
+:10C4D000CCB58668ED0B3B77034DFDE69314511EFA
+:10C4E000E792A71B51BC0E53478202781233A0A5D6
+:10C4F000DBFBE67F7E6E53E2D0CA5DE179B5D6A95B
+:10C50000F18E122CE7B66A681CEDE688F03D330028
+:10C510009AB31051607BFD615B7B48B8CB7851F9D1
+:10C52000D28FD7A09E6EBFD515587DD25F77B40F3E
+:10C53000816F33F20B2E1D1C46EFC64ACA98580C69
+:10C54000FA4782485F2578D71881B703064B69BE42
+:10C55000AAB6CBBE6EC2B50394FB8760A7645495A0
+:10C560004915E6B98B1F90C2F0B47483003AE8898C
+:10C5700034F9A1D3EE63D915A2EB2E0E21447F62CC
+:10C58000502AE4DEF146AA64A09E5522AA8B486D8B
+:10C5900030A6F19992A44211E7F79BE75D37C5EC0D
+:10C5A0006B9F4DC1991240167E2050E7EE1BADB532
+:10C5B0006511DBF33055469A648F98B78234A273C5
+:10C5C000147EEB6128099C62B89A68C3E212AF1E20
+:10C5D000D51091AB0C8550ED61F0139F37FB7F7B3D
+:10C5E00007B8E7D5509D37DD669E1CE392592009B8
+:10C5F0006925E1B5321FF632A8BDDE8EA632C8FA33
+:10C6000096F7C20945E5091ADF93F53B000200B32E
+:10C61000AE2E2364652A6A679FB6861AB7764A27C4
+:10C62000FDEE1A8ADFCF9A8F946CA52EF21F5C99CB
+:10C630006F693BE47769289C195C41BCFA787EB04D
+:10C6400002DFE1DD650CB16B7D380C58E9722CDA44
+:10C65000E46CBCE249787AC0A0E2704F7E382415C1
+:10C660001EFE51BD7B14FD370650BC9E15B72EDF54
+:10C6700054129DC9B19CB80DFC61DBB8B8DC22ED49
+:10C68000B12E4EA7D7A21B8D3374061840C3DE4AC5
+:10C69000CCF51515AC361BCBBF1E1DB77C23182F50
+:10C6A000D3A2BFFD8C083C447E01E3DECF4D513F59
+:10C6B0004E68B4F6F1414865E16298CBDD41DBC4D8
+:10C6C00072489E8C2D1825D851805011844EABD5C0
+:10C6D0003938850EA897C739D112B4BC990EF8091C
+:10C6E00003AC7C3AE096A282AD1484E58B399D6060
+:10C6F0007EFF766485296A189F8D21885F12906F6E
+:10C700005D52D270C52A576DC2278306B6047D9F3D
+:10C7100072987C1E4533E2233A7BF5E00CC3BC8063
+:10C72000D22062B582E0DD842CD7A977CC69FEA443
+:10C730004187950326423B47E6CCCACFB23D358CB4
+:10C740009C77395FBD652CE248152D94A971572B54
+:10C75000723255BA70EC62BB9DE0FCB4773C722A31
+:10C760002EBBAF56888E295620EC0B7C39006D40CD
+:10C77000EEFC2D676D9B3BBD43E3E4105DEA1C8836
+:10C7800063B8EEECC289B8502368EF6F24F4EF9ED3
+:10C790004472C3F2EE64C9B63A5140EF6C389BF66E
+:10C7A0008CF0BA79E6E34169419B8589FDAC2F9B0A
+:10C7B0005C17C4C9CE677542E11EE125CD115C1935
+:10C7C000131356880914FD4C72C9B70CE2CD81B31E
+:10C7D00033825DF6910BC7CA41C9B4D5FCFBBA855B
+:10C7E00044322EC2B82B3FB0FE572E815532D6149C
+:10C7F000FDF96007E33A4C44413F6D5195F7CFDBBB
+:10C8000036872ABDFFC90D7B131AEA956F7F86B460
+:10C810003B4523DBB1E3B1341E4BBBD199E8AA33CE
+:10C82000251F180CD2E29CE8672E71EB4B27622F74
+:10C83000D8709C27879DAD0104B179066840DE530E
+:10C840008CD83D245019FB4AECDED3485FBB2BF358
+:10C8500089462D7C5171204452DE1A08E8FC6C8810
+:10C86000EAA45E2E14A925829F5FBB0B7D4D256433
+:10C8700015586EF3BAC48D4B041A9BDEEB52F705C4
+:10C88000D4768D6DA247D1795DFA1C5FF7489F354C
+:10C89000DF7F82994C77CB4AEDE9DBCE085833C66F
+:10C8A000A71682C761B4940A9C9DD0731392B96A8B
+:10C8B0008F38CD54E0D52DF811E13FCBE477E0532C
+:10C8C000F486B04289CAF66371F45D5F8C668B862C
+:10C8D00024F190F4E46897E034A7275EAEE577484A
+:10C8E000FC73C72017C1E30B163DBDEFC90B2DF339
+:10C8F0007B38E65095521AC2F523214A29A4AE8707
+:10C900002A9A21CC3D331F8233E083FDFE52AD9B3A
+:10C91000B11C28C348EB5D1C2A944C63A2D3FB8551
+:10C9200096C0151094230268BC43F4FE5CA1EB2C66
+:10C9300063F8D8112B7651C59F29502931FC033259
+:10C94000C6C69CF3A716C90D8D187ED70282C3AE4A
+:10C95000956FDE165839563CE50DDB84FAC3D40ECC
+:10C96000FC5E1A2B577CA12529CABCCEB06D4B7436
+:10C97000F2A922561F05ED2283271A7E9F2C4E49CD
+:10C980006B0D7AADA9A3873035B3966D6D9181405B
+:10C9900077C80F40B4F0583714DF0D49ED5A6FC80F
+:10C9A00024820FD0765929301CBA851BF3D2CF7B55
+:10C9B000A7A04C0BAC35DD47AB677C9F5801275ACD
+:10C9C000F2C74BD6AEABA9F62092674B0ECF9D1C9B
+:10C9D0006C30D703CB2CB43D92194EF746D83EE6C7
+:10C9E000D20D8AEB890639D0ED395C3EAC0C94D679
+:10C9F000230941F9A6767C6688FC1580CB07D9C946
+:10CA0000C480B3440E8A457A8ECF1614352807F2B7
+:10CA1000F8CD6DA1ED57A71E93816413A382F896FC
+:10CA20008B4532AA757A3173D627A50ABA6C99B8A4
+:10CA30001EBD9C6CECEA00C56C0A07291321C02BB3
+:10CA40001269D8C42ECEBD9548D756CDC1503D7C75
+:10CA5000B82E416EB1162A25C500F462C68110D9E0
+:10CA6000484782B4BE35A25539BB8AD2CA70362334
+:10CA7000EED6856D6F628AEEF18940E3DFE4A6377A
+:10CA80000748BBF7FBAEDA407857CF60601CBB901D
+:10CA90006FEE5AB0228E3DC0F1546FA941200A2E8C
+:10CAA0000F1D22F1438772CFBD7731AD69E96988E7
+:10CAB000C1F6F1D48B0EFF307201C551129634E4E9
+:10CAC0002A4A31D1393C3F8B05A57F2BA9DD9561E1
+:10CAD00078B35002377CD909A1C62B371AF86D3FBD
+:10CAE0003AB7B9DCEA89D3E8203CBF52B4A517169F
+:10CAF000D515340DB4121B5ED476155299B034A4FA
+:10CB000078FB2DDE4B264798E3E081EB5F88D60D5E
+:10CB100045D23E001E612F61BC44ABC5A0E9779DA4
+:10CB20001AD366E0C5F6C19F741627147AE7392533
+:10CB300056F5C5EA43C882C9BF91CC9A9D017B36A0
+:10CB4000EC06E4D90107E855823DF115F82266317B
+:10CB5000EA42D1AE51388A5EE0C2544B8770B617B4
+:10CB6000D18223E831F78D257DD35AB35EB3166F9A
+:10CB7000663891B59AAC2B7846F86F720B5BC1F2B0
+:10CB80004CDD1AAB08FC305D50C2A6BFC2B7C35F14
+:10CB900085B79F89E7FD7C8FB684BFFCE7AD4FBDAD
+:10CBA0002CC53456E72C8DF84FAF85818E9B575599
+:10CBB000DC84CE894D1FDFE7562249773AB91E5CE7
+:10CBC00093CD1E7FC2F9D106920BEA029BB91714CE
+:10CBD0006E5FEEC50B62D1115D2EB9CE941252502C
+:10CBE0004D970CC3A72EAE738B238891C934A3F73E
+:10CBF0004B377396307A59ABF72D80560231FAD302
+:10CC0000A3690214658BD12FF12D4482010E823568
+:10CC1000175663C4F5A0CCEE03826679F37DD5CBBD
+:10CC200024FFE53AA279047D016C915C5A3012032D
+:10CC30001F2D553F8E5B201A02D7B2BD30B606DAE3
+:10CC4000EB242980EAEFBEC7D696973812D0E95573
+:10CC5000DBDC08AFA7707A17105DB930DCFF3E034C
+:10CC6000AF618DDEB7E2E7B444EED4E168CAF468A0
+:10CC7000F551F79192D33F821785475ED884ABAFC9
+:10CC8000B4F80B126A063F68D2124ED2F425CC6873
+:10CC90004672917BB407253103E3D68F859ACB4545
+:10CCA0005C3938D1D768DA9CEAA8E146903920EFA0
+:10CCB0008280E7E5F966B239B78A43FA798B86F361
+:10CCC000319697E7EC1803E6B9E84B11EA444D1F9B
+:10CCD00017F30506AED9AE2E6151E3009792179077
+:10CCE000B03A0441D9A3F9D4CE262209CE028FCD81
+:10CCF000537E6A1AC51591F3583DE592225590541A
+:10CD00002472F9DA01AEBF77D820E9DBDADE13D975
+:10CD1000CE7DBBFB0346AE6BF10BD2568CA25A46BE
+:10CD2000AE269B163EDE8379EDA215C831C3122EC6
+:10CD30003D34E7F5A5AACBCFDE31B788212EA792E7
+:10CD400072D082720D8055E5F2D8A3C6F617ABEA11
+:10CD5000F0730DFAE2CBEA97E080FD27D29493912D
+:10CD60001294354705A2A7A1F11A248CBFAB4EB58A
+:10CD7000D0ECA534925882B0BD2D008E98FAF4C83C
+:10CD800065699664DB570FB22037D582502E560561
+:10CD90006F0659611AA2577EE5E39FC702FB9F5BAE
+:10CDA000DB02541259E3A61B8A4D69A83A62A2E439
+:10CDB00039C321293488112FC7A6D1C05FA09F7421
+:10CDC000828D930EB49A3288C415375B3481ADE3FB
+:10CDD000502EE8E032A1D1D06411888508504A3243
+:10CDE000145449B7314AD377D4B7351D2C51460274
+:10CDF0000C46554B2045D8298A7F03029BA8D4595D
+:10CE000067A08F97B3F68B7502A4B7538A2F11547E
+:10CE10007DA90D1F2EFBE8B6E3ADEED7E0C17B2860
+:10CE2000D2AAAE9B6F3BF93BA1530908E7886D5925
+:10CE30000B0339A8887FAAD9B105FF194C7A43C1E1
+:10CE4000F001ED00433A675BB2641721DCCEE89D48
+:10CE50002C0FDA2FC345BAA70D0F6D189098811DBE
+:10CE600069FD5300D51E1D3669DFB28B9196F7140C
+:10CE70006C2ABD2CC41EED6935A43A5E50BA71818E
+:10CE8000A0F412CEE895DC2E29C25C9E8346ECA36A
+:10CE90001900D263B7DD3D00161E205FD1BDB1EA97
+:10CEA00058F43102358ADD90AC69962918BDF26CD0
+:10CEB0000624C355E52639B41C23E299148F7E4716
+:10CEC000526132C8DE302EB14F34492065C675A795
+:10CED000D53FE7A03ED3C2A2AE1D1DA4377494A2D5
+:10CEE000CA1C2916BD926E8548673A7E1069516347
+:10CEF000EA724AE00BBFBF146767E5E6E2E9E03794
+:10CF0000B859451DAB244D9039F8CEB12F34FA37BE
+:10CF1000E75EAD92915466DCBF84E56178BFC717C8
+:10CF2000A0DC994633E9DA85837C944AD58F5DE3AA
+:10CF30005C91D832DA96ECE8FE720E1310BC127BCC
+:10CF4000EEA1FE54587178D6BB63C9383D74754C58
+:10CF5000C73D29962C5971D0E2D620ABFCFB26A800
+:10CF6000550DDA30FBA82CD6314EFC9AF0B2DAA17E
+:10CF70001140C7B886B5D7A1EC10088455F547DD38
+:10CF80005D4BFA9DC0D7B79FE8E454848C353F1BB6
+:10CF9000FA34CAF30BAFCD2E53661FED3B79F62062
+:10CFA0000CC14C79A8AE1B7B61CFC85B67CE66E92C
+:10CFB0003B29ADECA99D40030A3FF8AEBDCFF2A5D9
+:10CFC000168602CC46644DA8FF691D44F1434348D0
+:10CFD0001F8103237315B16E3C57EA486D19EFDDCD
+:10CFE000CEB58999CDD61EA6965699C4D7CE6C02D9
+:10CFF000597F514EC9FF543B6D4A6F854FF85A73A4
+:10D00000CDE73873C38B5600EDF24A2F12964621B6
+:10D0100036A05569BEDAA540AF5F7D1CCCF5ED02A8
+:10D02000430E0322B7A07076E83995F48A3511874C
+:10D030003398A64F73126E2F79429650ACC025BE1E
+:10D04000A1F9F3B99318E3AC10AD26C2A7E3377D7D
+:10D05000EE00BB8BBD306950F9FD7CD42212141355
+:10D060000506EBE250A3AC0ED4477417FB1ABC5D67
+:10D07000125E52B754E4D74E32D345E12EDC1D8800
+:10D080001FC5599E1C1CF62A0F68A4656903F4C6C7
+:10D09000F232E10B89E8A9007ECF37ADA57B0FE91D
+:10D0A000BAD4426E6F1E76137FF600C9724BA27D12
+:10D0B0005DAEF83482B75EDD2D1DB30DBD54F55164
+:10D0C00075DB28B80ED89C5699E9BDF6B1CA48510F
+:10D0D0009724816E07B41139FCA80973736D780821
+:10D0E0000F4FD0DC0AB0F4F4D70D2D2D7CAD8C3A67
+:10D0F00097590063C398E278767E035269BF071F91
+:10D100009344D4639669911ACF2EB31944FB03D884
+:10D1100099982EB23F1A5FD933809C57CE1FCD8F7E
+:10D120003FF407A8CE06E2BEAFBBB9708E20BD4764
+:10D13000844947CFEDB6ACED57BEAABD8B1634BDC2
+:10D140000BCF7CC9F38D75421F79B06BECDE1230CA
+:10D1500050A9DC7614AF5685988837AC665D49F6E1
+:10D16000278F5745EEA5C301A7172607497BCE8B0E
+:10D170003760C89A6ABA1FF8530FA803E8FE01C7C0
+:10D1800011601165F43B0BA2D8D9600B808C4AC5A5
+:10D1900014A6BE9CA42174D8DB218C27012E309AC2
+:10D1A000A619BFF823D651C2327F2911CB426B9208
+:10D1B000D18E3C8D6835EAE7F35F99F7809E3C6D30
+:10D1C000DBBE4D343CE65B1F8B6D639FBA54A57587
+:10D1D000C2642E45119AC157839DD0E723AD5445B3
+:10D1E0000144E1C904A28546B4D07A1D3A399A2592
+:10D1F000C0DC6975139999E1BC160853C546A2763F
+:10D20000601A0B46995675FDA88CE34218216DD81B
+:10D210009B0D68F22D968402EBE88746B7CF74BA6F
+:10D22000321178193D7A9A0073A9B40668816E8F1D
+:10D230002A48E53F7D5F011622210C6CCE80D8097B
+:10D24000EF91209475FF825D9F26F72F129CDA2EB6
+:10D25000FE8E880B87049BEF535511C5EAC434A397
+:10D2600078E38122647C1DDB25FB802A813B714EA3
+:10D2700044EFC4B8AE82EF717C72006119BE99EBC5
+:10D280000BDB78C23C319A5CC62421CD2E0C961261
+:10D29000E29A353F0E996B2EB33B09E0F45D913C69
+:10D2A000173CB1F8438BB0F7F8CB5505542B4734F6
+:10D2B0008FC518395E2E8A500C9802041812AE9D44
+:10D2C00018BD6CE9DFF57B11B7C8089E85A7EB6A2E
+:10D2D000CDE91226985648FCDD727C2BE5A169D772
+:10D2E000046778A9E9FA3EF4E6001DF0F688A2BFCB
+:10D2F00081E7128E95248837112F90FAA8ACBC666E
+:10D300000BA6E26C31A13774BED16E067B0738EEF6
+:10D31000C4836C146328BA1076AA7AE1E018176304
+:10D320002D095E9A2074103EDEFE6EB13E6A7EA02C
+:10D33000E917939A611E3E8D77CBA3FE109A606227
+:10D34000AB44B2525ECC7671930C9B0ACB848E2C8C
+:10D350009B68433F3E49178320B060C894C0AE41EC
+:10D3600035D8CAB7F3617C64EC4500C58B48B07C06
+:10D370004F0D4E7D9D7D8320D2345DE4E925940ED2
+:10D3800059107EEEC6E3ED2E9665F65FC2521E95ED
+:10D39000976A1664E4E9BFE81D5B37E29F9A7A2E2C
+:10D3A000FCEC2995D4CE6AB2973FFD20A1BA00FCCF
+:10D3B000A7F327C7562624D922C3B01217D7D3C93B
+:10D3C000C25B608D3B9E4594727EC1272295423F91
+:10D3D000770E55BD42BE62C6770FD5D5086B44AFF8
+:10D3E00034CFAF3D54EFD69B17FDED0B45342B9C4E
+:10D3F000D5A189D2D43C3FE28D30828D0794BF2BDA
+:10D40000DB4B1AAAEDA1A22D890C75A477B465880F
+:10D410000473A1A8F30F74F02F0606D8EA3C832A00
+:10D42000D2C957F814433BA4A3CF249DE0DE5AEFA2
+:10D43000F92F109F8F5EE019C46543A6FF324FFDA0
+:10D440004CD6A701495CC232A55F548F732F271AAF
+:10D450002B0F31A122EDBE2823E5DFDAC1BB123B41
+:10D46000E4A53AED9B4E80D8D33C93696FD46D2AE6
+:10D47000992FE0DA07A750C1BC27D1EB339C69B3E1
+:10D480006CE85028E2E82A83EC02A43364C921AF97
+:10D49000B4432A9047922172BCCD7A3D592B13F2A6
+:10D4A0007CB9C53E49FE6708D4EE9F6BB8BF6E25B8
+:10D4B000FEDFA3DACC5586344BE51E2B46553A8564
+:10D4C0002B7BEDCC75FCA98DE365B22088720DB481
+:10D4D0002C35599AE71A1D38A1841762F79C52AF70
+:10D4E0001CC825289B1060B73EE19772F66035791D
+:10D4F00035CF59F138C6A9451C7AD3E781C09A01C6
+:10D50000422F980A982BCC26E17F0018A7FBF094B5
+:10D51000FEDB2851F361E505CB629404D9E2943334
+:10D520008E1190D87FBA2C27DD2B2AA11C0F91DEFB
+:10D53000DD0E8DAADAE7A1A67335EDDA0ECC9F4891
+:10D54000AA7819DAB75814081FDBC9EE430D151C69
+:10D55000AB020B9544763D76F4D094C28D73FA20DD
+:10D560000B4A70223FF1FE2945C7F8CD909A710F02
+:10D5700043688B55EB56199341624064B4045525BA
+:10D58000A67EEA656C40DE7A9AF05BF1E8D6D23985
+:10D59000F1534538E73D93770A2FC0C53DA78B0867
+:10D5A0007E12EA9EA833B0394A65FE3382B6BF3296
+:10D5B0009203BB0D989E33AD64F8EAEE4377111EDB
+:10D5C000AC96012C3AE27D8A1409DE48A46F0089EA
+:10D5D0003267D56DA29F58A2ACD07BFEC88141FEB8
+:10D5E000A0DCCE64CFB117CE39CF7C0349ED7836BD
+:10D5F00035AA1440ACC4AB3E6461657200667EC758
+:10D60000834FB3C6AB6C23A788BFE30FC91023C4F5
+:10D610009953C3F176C81B92982C2193D077F907C0
+:10D620006557DD88BB733FA05260311533B52525A2
+:10D6300061BEFC2C0B7F66F7E666D3375161D505DA
+:10D64000645C6BCBD21A66A5954E345773ACC57625
+:10D6500056BC1096ACA19FCB85B68F309522FC9618
+:10D66000451CC85216E054E3FD9B22B274AD26B3AC
+:10D670008E651D6BC9D92D1E1DF4DCDA179432435B
+:10D680007EC563515BB9D1847DF33FD62C841A09E2
+:10D69000BF7FFB16D3F4D16783347F9950A94275BD
+:10D6A00076C6950C175A4DA8FE44A6A218D7DD0BD6
+:10D6B0004B63ECD80546015E93D1003586665AAEC1
+:10D6C000342883D0BD09B6CA72E430DBFB83C3289B
+:10D6D000B35AE8E242D99AB991978B3AEE7BFF466A
+:10D6E000CDE6B28C934986335C25071FA149B8EA81
+:10D6F000F967BEFF163DFD568960B201BA6649550D
+:10D700004D5DAC51D2686D9591D99071C526268238
+:10D71000284579DD17D66C2984425842739AEFB2B6
+:10D7200018CA005241FE32A962AED517130BB908D0
+:10D73000B00CD32EAF389F1458078BDE55D6E0D7E8
+:10D74000960338A7199229A26EBDEDB05924D2A232
+:10D75000D6E9CB348E3B44E4378937B5510CF70317
+:10D76000A5AF9426D635B3EB579F560204BFC91117
+:10D77000B65DE27A6CCB98E766958DF61B05B1DC59
+:10D78000B1DB38EEE985194D63FADA7CA3A02155A7
+:10D79000D206F4B3B09F7181A48FE12412F377C64F
+:10D7A000A7EBDDDDB9D36A632FFA902959AD62FB8F
+:10D7B000563F09AA5E0808A6BB8241293E52D2798B
+:10D7C000AC4B51B5412AFC06F8327ED7042317CC66
+:10D7D000F2AA2A456248DBD7B7EF34E7372F8360D8
+:10D7E00059251DC7D8C570D81C619CFBEAC627A166
+:10D7F000F3DC3F641A1ACE9B3B5B8377A5148454F9
+:10D800009C1816362F1C246D50EBCCD2115D68A2EB
+:10D8100043FDD4F00A3BB44B8F6D65F4D541AFD9CD
+:10D8200088F12A09F2886EBA6C5D0CB01070340170
+:10D8300015296D655A7B16A1D49644EC431FC92760
+:10D840002A1FD469B2048A3D117192F1A5E19ACFE1
+:10D850000216A788C7E034F5FE479C006528882695
+:10D86000AACEEA754E79E6CF252B4C120B5E4A26DE
+:10D8700021D2D0498CDD444A801D749D12D6A5E288
+:10D88000BFA696431C077AEDA2C833EB7DEC097D59
+:10D8900016CD39A9FDF4F4A913069E8701FB9F213B
+:10D8A000D3E7090F48661509E71732FD2E2C2F9B89
+:10D8B0003B99982E4A95FB2A66920FB0E7789C62B6
+:10D8C0003483D8810C94548C4D780375FD620C130D
+:10D8D000F6BA3DB98FE8DAED40F99C2AC172C92D3C
+:10D8E00028B3BE26E13FE6A8453E5E185F74BD49F9
+:10D8F0001F4B2C06A300DD0F4E0F3848FB2492FD72
+:10D90000D4127A8E6F5E3540A8B3B7163B2C9F2891
+:10D91000C0E11A443927ED2D73979E9A288FA46190
+:10D92000CDA6F3A8CDEB7A699A59BB9CBE97066841
+:10D93000E64E985325B9870A7990B1743605DC69AB
+:10D94000A82FEA2F90624B291DEF3D0137C8111017
+:10D950001643671E4EE1A7B9BEC514B6774B805576
+:10D9600060015F99EEE946A7DBA412A65DCD7A4F70
+:10D97000F38A7BDC3BB44EC92FF2B35064104C2ABF
+:10D980008C10405460A5D2342B02B157F95E596E09
+:10D990001910CC16FA1B0E1ABE88DFD1C6D7FD6C43
+:10D9A000078876533A967B736D146C18B7D32301AE
+:10D9B000F17166051DAC79812AE27F24F7EC78339A
+:10D9C0006D0355DF265C0531C722FC9A0CFEC8E7C3
+:10D9D0004D740E60DE9E6919CED4ACC0012021F1D9
+:10D9E0000382822C7274F1FB8B0C175493C99F85B0
+:10D9F00004917952DA3DCA3C9383DD342079744432
+:10DA00000F7F8C6DDD86349B3015E36F3E8A368A3E
+:10DA1000DF42C8BFA5B845E6858FC1BAE7DE4A44F4
+:10DA2000D1F11D1E4A4A94992E57237A48ED478119
+:10DA30007C4A71E5EC29B49AA13824C89F184B762A
+:10DA400049E97FB629808006F08002B03C8BB3AFF5
+:10DA50003D1D6A17A6538D484E59F542FCA79354B5
+:10DA60002A09B881410F2E137C292EB451F61ED2FB
+:10DA7000E0483974D1A22968C17AFDA54CA58F98D8
+:10DA8000AFE8E26EA289911082D636E25F065B4B68
+:10DA90009E548C63DCDB7F650004A5E8D7779D0B83
+:10DAA00016522FEE27945FA859AE6FB6703557BD4A
+:10DAB0005F0E29790A12FDBC4F85FFCAA7B85F5CCB
+:10DAC0008A5FFEA3FFCAE1ECFC8F5FFC6FFFE254AC
+:10DAD000C45A1267B5F7DE9FB9E14CF51DD3971212
+:10DAE000C8342251F928D477B551E40289D62F2FB2
+:10DAF00012BED68966CB4F81CB5E78BA4C8735088B
+:10DB00003D1335C2078D097A04676C4DBDAB815357
+:10DB1000A19B9D88B10C1BF7BF680845D3E4CC17C7
+:10DB2000A98D8C5626C569CA7DB9E3929598C4948F
+:10DB3000013D0CA683ADC9C37F38F0D3BF16B6BF75
+:10DB4000D44DF6F8A3056F4DC3D0A2A18141CC906E
+:10DB5000ABA4A491BDFEBEC47C80B897C4904A6BB0
+:10DB6000F77ADA11D6EF04D12D706C304A14FF0B1E
+:10DB7000FA908AE7948BECF3CA02B766006104AEB0
+:10DB800035A5225699DB55DAEEBD028A8539301863
+:10DB90006D71CF7E843473FC3DAF8928D7954626BE
+:10DBA00025BFE0DF47C3A551A0F7ADF4BA31EF9C24
+:10DBB000A7166A485AE31B4B4B8ECB22F596E2011F
+:10DBC000C8A6FA0F1C94CB34FD4D59F213671F6A97
+:10DBD000DF918720C9185D368AB5A36B67E2A7F786
+:10DBE000F03B51C156CCAB4E7C8BACADEB7E46B21C
+:10DBF000925F72189055BB542195FE944F4B51BEC5
+:10DC00009D8BA6FBB35DBC0C587EF50F07943C19A9
+:10DC1000FF5F26F2D5B2915EA43BC8916B027A23D6
+:10DC20001C8CC79AAE621378656763F90DD5752DA4
+:10DC30003BDE610B368D2F1FC70A219993A7C03B8E
+:10DC40002D3ADD441E59BBF93EB0780BE6C7AA2A2F
+:10DC500076ED42CB6289E580220973AFFA9B5321AE
+:10DC6000E51446CAF682963C3ED9530678E516D7A7
+:10DC700062DE0DC76E6BFA88D52199AA3BCC6A3C4F
+:10DC8000DC7094CD7DC43CF793B05C4C0DF81A3732
+:10DC9000B2A410BFF89D2BCD9B56F04C1B31158CB8
+:10DCA000141568D2680150FFE2230FE8380593FA93
+:10DCB0004E8F7257377599AD3C3926820BB434EAD2
+:10DCC0004CB68D7B26449A1C8E3E942B8F6A2C94E6
+:10DCD000686681A901B6ED389F6D1CE1B3A08A3B4F
+:10DCE00039E0613FFEC28C2165256D1F41C9BFD35C
+:10DCF0007B75F80F7C6EFD8D9EFE5D77A87F892D6C
+:10DD00006A6664C3A82DD75D84B70765C70C36AEB5
+:10DD10007BA0BD0B68E0253BA3A223AE356E8B9F95
+:10DD2000B78582FFED242EACFF3F68150406CE9C1C
+:10DD30000913007FEA5E09F3EECDCB1A9D8509D564
+:10DD40005C136BF30CFDEBD1C495A7F2EA5088CCC1
+:10DD50001EF164BC2E40F4EB777FFE2B263255B5C6
+:10DD6000097CFDADC77BA1F11E7214ADAE0595BC5B
+:10DD7000B179AB28445530C5CC8DA00A85AA9B2922
+:10DD8000609449FBDD63AD386E862C22182368D879
+:10DD9000A22D049D43972F70C96EED2B83061BCADD
+:10DDA0008661D599A4A30953EFAA6E5AAF7870AED5
+:10DDB0008DC01B27BD4601174E6080F9D4D3B2A693
+:10DDC000D60C0C3F201A20326864B02987552812DF
+:10DDD00061D4EDD8DBFCAC2E99EE8835625EC2DBF7
+:10DDE0003EF0899AAE02D5FC64E34E252DDE65ED4A
+:10DDF00030BE1B8A2B621F3D830C00DA1225DBE646
+:10DE0000F970FB85DADE44AF799B1DE45D6281F732
+:10DE10007A48E9B2041F8BE45EFA4E6C8178E5EA39
+:10DE200007B97988A1FA513DF13628316D55259011
+:10DE300099D28D1CD3D12236DC4360089BC0DCB85C
+:10DE4000FC1FDFCE0713EBC6373974D6F177D857EE
+:10DE50001DE50265C3135138018AC8CED5DF75F8B8
+:10DE6000D837A543BAD7739215F4267FEAFE749685
+:10DE7000D137C9C32D210411FFD858CCA0F0C06AF6
+:10DE800058F0BDF345FC7D482C7395DC043656D71D
+:10DE90001C6FB46B900AA08773A2B0185E97958B25
+:10DEA000715B8593816F3AB9F208274E5BEE9DB3A3
+:10DEB000102585462D1EEB52D50E86F5BFA63DB525
+:10DEC000927DFC07BDAE5EAE73F7E5C749313365A1
+:10DED0000FF9B92D00FE2C4FD550ECF18FA6174D40
+:10DEE000576EB40B56487728C09626F8DE30FFD31D
+:10DEF0008C53D79A819FD89B48642BDD69918A5CAB
+:10DF0000320A76D3D9E92F97C3FA251EFF2F230DA6
+:10DF100017A0A16211A3F9685014B3B495360ECAC4
+:10DF2000B87FD2370C90F30B2A365AA1A4FEA091E9
+:10DF30006D863A512A65B2B77E2E072EA5AD04BF75
+:10DF4000DDF5317F305848296D9FB407A21FBFE629
+:10DF5000885F3DEE16848393EB514594F12870045D
+:10DF60005417EC2A5996D569EF82BF23EE220A8412
+:10DF70006CBACBE203E7C5B36D6C14EA4C49F29678
+:10DF8000F08C11913F138F94B076D6F7012D5C7E03
+:10DF90001B618FE53ADAC414C4BF1FFDBBD8E5D0BE
+:10DFA000FD0B558CB72808650F67B83E01463DFB51
+:10DFB0001BD51BED5353DAFFFB71FF675911E3D5F6
+:10DFC0004268BFF856B29281879D7580FD16AB6C92
+:10DFD000C8C0DC2665CB6E1B9E951D6816A73D69E3
+:10DFE0003FDF9AFAA357BBA5FCF3FF059EF2E35B64
+:10DFF000D8575AC0E751CF0D44453671277598243C
+:10E000005FFE9BC362011447966EE6AADC267D1074
+:10E01000ADF6ED58FC5A0EA64F0DD60AD357C3DB0A
+:10E020008BE5606539C6AB3E629BB1491BC4AC2F22
+:10E0300018BEB621982179FA85AE554E4EF71A10C2
+:10E04000E3D317BAD8CA4E1D08A6F13BC47936737C
+:10E05000CCE7662C313BFC9A10EC524D77C8CE08C9
+:10E06000868F772265618E989C46E9B130FEED9CE3
+:10E070002397875FA1B195FB7FB846372756B298A3
+:10E0800066AA090572CCF556109E3C3D87F50897A7
+:10E090008D0EB2F23432D107FE5D707CE270C5D4D1
+:10E0A000807E695554774104AE677B28C71E90C6B1
+:10E0B000ECDB1DA33C43A05107983A7609A9793FB0
+:10E0C000E8CCE5FBFCECAACAE1F6DB25C04DC31A9F
+:10E0D000EE5252F6BA1A422F3B9361A1AD58794ED7
+:10E0E0003494DF5EABB272189FA35FAB0B57AA816B
+:10E0F0009A08F9603F7D92D962030F37742871F056
+:10E10000904BB9E718E9F8373B72DE340FF1D3F9D9
+:10E1100033ECC95394AFB28E132DE71591996FBFAD
+:10E12000956E439C6F87A9D25BA4491D8A21D3FFBA
+:10E1300012312AD215BFA65B6E2DC2E2FE81FD719F
+:10E14000F67EF21BDEABB03AA81BE4E3AD3998F3E0
+:10E15000887B64A01CE7E1DBAE349291A7102035E8
+:10E1600073031F617098C2257FAAE98DF68A292C56
+:10E170003DEE00462F5C04D83211A8A65C0CFBAB28
+:10E1800042C97DC48FE79BBA6602A49C369F1CBD22
+:10E1900082A97F0D27A835BE3D5108E6951D3F2475
+:10E1A0009A37BDD05928586A83D6C5E4F678A8E5D1
+:10E1B00072B0A98DAEBF174D3059C0E867D1CE5DA2
+:10E1C000F9F487D9F717B093CDCD9C329FDB5F9CD4
+:10E1D000274ECC3B81CD0C5E2DFAABAEDF03D6577C
+:10E1E00069D8C3D080EA0258B30DFF51E9B50042A7
+:10E1F0007BBF80BFC2D88A3E2712479B2DACC3632A
+:10E200006F695ECB578E1BFF58CBB72A232350264E
+:10E21000E1860EB927550B19AEDF91436FC49056B6
+:10E22000A4CAAAA514319B70FA3C1E0353E803AE9E
+:10E2300046955BEE1EBE05F0FCF7326FCDCC89FB38
+:10E24000A0B428CC41F60AC12F59D9483F28FDD1A6
+:10E250005A2804288A501E0EA00027924A70F5FF03
+:10E260004700C0FFB39061F6B1E234CD895315F594
+:10E2700085C56BE61EA2984FE9832454F2D4B758A3
+:10E28000FC9BCF9365A9491EC0864B883335664DEC
+:10E29000829ECD0A0E6C99F1895F09C1F2FF11636C
+:10E2A000FD54F6CA96DFA4115295A4FDF970988624
+:10E2B0007761F18A71C0C1229CDA40C1F8CC573C29
+:10E2C000B278F925E42ED251E89EB6B4860206A4AF
+:10E2D000A3E56DB1D9EEF3075D796D794D2A3C1355
+:10E2E00082DA8F6D4ECBE418A010D19C16F5223245
+:10E2F00065E5AEB77E4BC2259FE5A7C7038C4AF9FB
+:10E3000020C722C8EF045D402600D1123748713B78
+:10E310002D6BA7AAB013EB1077EB01FF47B9ABC782
+:10E320003506145F7BACC7A505C79EBB562CA771ED
+:10E33000A3219A0BC605F7EE6834A4F0F9245D9684
+:10E34000E028E41643A25A78AF501C2FAAB824BD87
+:10E3500033A6E60FB6719D8404ACE11EE6F5F78B9B
+:10E36000490234D2D884653F094BAC0D8B19C333B5
+:10E37000DD8575248605228D4B8CF8C7CCC158C528
+:10E380007A726E9FAACF3FE087D5E6B0E19C8616F1
+:10E39000ED82AD8A638E5551147BE801DC201E1A94
+:10E3A000551610F3BB71E54D5E7024E6E368917677
+:10E3B000E8B4F2C34F398E49C59FB22F0675DFBE50
+:10E3C000AE877A5D21969AABE35802BD6AAFA96425
+:10E3D0001BC3563162096036C0D7D2BD0BD55B5D19
+:10E3E000836255FDCB8E07180423D6D91DA51FF6D1
+:10E3F000AFA556A926E37B63F14099C1CA5F2614F5
+:10E4000099302FAF9E9963000E0B6767D7461F9018
+:10E41000A6219AC9A0D7454B86D27EA0280CF533F9
+:10E420009C56A50D171C875598FC31B23C06618A95
+:10E43000850CD8FD43D568964E7CA52D99B9B65666
+:10E4400031C1DFA7CB09DC0B4684CB74BDFDEA727A
+:10E450000FAF0074B9D8C3AF4142AC19CC44F2F449
+:10E46000666FF3E5D2902ED0C66BD86CB9EA60A285
+:10E47000A2E455C27C10A505BDBD6430EF81A32583
+:10E480000602442D6EC84086CD8AEE78848ABCE0B0
+:10E4900083413A2D490B19CEACB923CB85FB6C26B1
+:10E4A00081CD3CCB93477CF9E389914758D9A90D9D
+:10E4B00026A125C9A78C9F635802D5D3624ED8D90F
+:10E4C0004F9D46CE467B723705FBDAC1AF50E46004
+:10E4D000CF8A2E6BE1E1BF064F8007A933784FE565
+:10E4E000CA89F089BEF5DE9FE7D8547991B480D50A
+:10E4F0006663435CE93AEEC1D2DEE6DD2E060E1716
+:10E50000892F2E59FE2B2203913A02D7D615397C3A
+:10E5100043C9DCEEF0138B4C4E71477675F12054F5
+:10E520004D7E8069FE890BB9BBB24A68F2E63C1E9B
+:10E53000CC1C0EDCC0410181799ED5D6E7493A7EDC
+:10E5400095564AD7F5DE02573F671CB8CDF137859F
+:10E5500027278E4100B48FF9FD34D6ADE511902800
+:10E5600066B8E9D755585B33B153F842DE05A2745B
+:10E57000C83B60494E61CC9060F8F76578B8AFCB86
+:10E5800036E0F7241D991AAED695472F1C07E1AE49
+:10E5900072E405CF3E5F89A1732ECBFD917AD543FE
+:10E5A000A42DD0101E64E990B78B044E0FD38026A3
+:10E5B000716AEB40C2517F3ED9B09DCFDE3E512003
+:10E5C000A8B0D4F52809692BEB1C0DCD561B2BD612
+:10E5D000E7C8D2C5D77C56E835B3D8A40E051011CC
+:10E5E00020CCF532A5E64D48F66DDD59B6FD9B6CA5
+:10E5F00028586BC6F4DB934CADE805D847017F98EB
+:10E600001F813FDBF3B34BDD82DA7B767C6007460C
+:10E61000123F48FFAD052138775BE09914F5249F40
+:10E62000D5B84D8E1960EB4AAE6F4C76FB3CE47268
+:10E630001F04D505E7E1E1AE3287EC95F2AE6F68D5
+:10E64000A7ED6B34D35F7FEEDF9782E47D257ABE42
+:10E65000A75C3CDB2CBEA82A203BF8697D5D1D0F22
+:10E66000034299D6A2DAC54364018DBF1D7FE88DB0
+:10E6700089D1B99ECC024D82F5DE0EC97BEB5302E7
+:10E68000EB9426C34E2799D288D9FE54655791063C
+:10E69000EB16D521F6999B3D2CC15367B326A1FCFF
+:10E6A00067465C582AC1A4B18FB33CC607D1347306
+:10E6B000F129F3727217AB680FF6D0EA87D7A4A0DE
+:10E6C0007A1E1BCAE8BCF95A5AC9FA18B29A05044C
+:10E6D000F5A82E05A90E6564CDDC30A0E6F359B18E
+:10E6E000893993E200F94A0DAAD244CDA8087E02E6
+:10E6F0005D4BCD1E3465C57CC54385BD109A31E5A3
+:10E700000E8E2D1A531B82090A055E47386869F779
+:10E71000D96D8DA43AB416FFB957FEB8027C2B4CC4
+:10E720000297819744A88ABB2C6DCF97F143B1061D
+:10E730000F95AE10FEDD0048CF71AB929223428B55
+:10E740002CBBCD3239CFCB249195E2C316CB33F01D
+:10E750004A32F586D94FACF5014583B805478F4D50
+:10E7600005AB5D563F6BF591DA49265086A7FA4511
+:10E77000868265E91F68B2060F324865EB3E84D693
+:10E780003F58BD8A575931F6A01238E91559FA1287
+:10E790002B9751436E8B9CC77CB81441884D6AAE51
+:10E7A000B34142298B517AD03E2E05818A9AF9AB2A
+:10E7B000F0F6FC3E335262FAFCE752C093654668BD
+:10E7C00019C8A41AAB0549941274779A1C007B29C6
+:10E7D0006422F0FE2DD13EA2634714FCD75572F09F
+:10E7E00059864F1E1CF163D2E9D27F384E10BA4FC2
+:10E7F000FCA718E17E44D22E6B4467343C0D7B7D30
+:10E800007B862390B038A3DC3E12FD40658577E916
+:10E810009CE7CD4F7CACDF1EB13DAC47EB12ACC0EA
+:10E820006A9469E2C97D9B0D7408D4FE3874EC2F9C
+:10E830001EC3A096D06E745C2C18644C3EFE866697
+:10E84000258D08E340411EB33072E2B25F4792A9C2
+:10E85000B486C1583DAB18665032E082457C38A082
+:10E86000765678A2412A4736319515C03528F2B937
+:10E870004B0479CF8E408B06A8352B037A6DA563A8
+:10E88000B91B2867EF07BF246A109DE3DC198729AD
+:10E890003F0CF7F9B50FCBF1725ED38F9CFDA281CF
+:10E8A00020721F453929EDC8D6839AF39BDDD81D08
+:10E8B0007E5BD643255180D5D34AF60BD19079BBE8
+:10E8C00047498FA6B8CCE9F3A0ECFAE8F9819E504D
+:10E8D000759A56F0B8A4E185D1B2829179B4481501
+:10E8E000F8A81594EFF5DFF1CD8089E926EB8ADAF7
+:10E8F000542E04FED0520394D4C7C8519C0F5E32EC
+:10E9000032BE2262EFD390ACA8F41ECF68329D09CC
+:10E91000DDB6FE331840ADE35634FD61D141E1F17F
+:10E92000D78D9E59E352F322245000D6C14EC33EE8
+:10E93000DD8FACB50B4B327F220BB042AE9E8066B2
+:10E9400088B92CDBE8108DB5D77B81E0E080BD6A0B
+:10E950000986DD1DF41A622AA2A9812066E62F62CB
+:10E96000F1A75721FC26431280632554C5CAA09FF6
+:10E970003BD036E070B12F0512ADE89D98EB616C8D
+:10E980001FD575EBA12470D65424CC78A0656CB348
+:10E9900087CAB2A6AE0D82FF7DF61B2814FD23D5D3
+:10E9A0002BE1A7246A06DA89A484B02816F4DF9D37
+:10E9B0007CEC57E6672751760BB50ED58A3D7A9BDE
+:10E9C00098CEE598ACCB9E89BF5504E9236708EE45
+:10E9D000D5188F069EFC527A02D258FA30544099CC
+:10E9E000159BC1DBCF235107C5AFA1A24C2DF6DD8E
+:10E9F00026718C2CF29F8328E3E47CB465600E358D
+:10EA0000B5376FCD07021CFB9859A023E8379FE468
+:10EA1000A7DC18E23565570AFD9FD36095389C7CCA
+:10EA200021FED170ACE48E1693E5CB6B7412FA0123
+:10EA300017C9F64DC5C0979E43A05EA9DA83F810AA
+:10EA400007E048E12E731FDDE37342EE2208907B5E
+:10EA5000C46E1DF260FAB6E360D62340DF27C0E83B
+:10EA60008EDDE678F3FC08EFD48F98D23BE67B4C42
+:10EA70008B52ECDF8DA72C06B1E97BE3A922C5728E
+:10EA80003A9145D06AE45242FF1E3C4E3E06BEDB40
+:10EA9000CB51807D59E95294202026C532BE5A1AA6
+:10EAA000E6BD7DFDDA92EC168165D212D925A5DA94
+:10EAB000A34BE08A42ED6F08328BD3A2BC29D44429
+:10EAC00097C7D3263CCCF9FFCD1A5421DD9068AA14
+:10EAD000A27F1B0DE60C3BA0130C22A0B385C22B1A
+:10EAE0005979A7D90B9D9BD0A29A25D9DCD2EEA04B
+:10EAF000F2D164BC5B0A50A4048EBA46DB0845E43C
+:10EB000037E6A8DBFFE276CCE305BB7D02C321A597
+:10EB100024F8BBB3ED5C1B15B5F806D71BBEC1D3FB
+:10EB2000BCABEF9728077A82637BFC0A64BFCD9465
+:10EB30002A81A8F4DB5AB2634CBAB7CCCA409A8493
+:10EB4000F01A8F55ACE70BC7A2D6BD2CD8ECC57D0B
+:10EB50007E51C55E431DE5670C0E5C48ECDBC80AC0
+:10EB60000F465B927164E3B601D6E41A60D15E167B
+:10EB700075E06DE835172B854EE08DEFB10B79DF31
+:10EB80000EB6519FDC0CF8A77FA7DF59AEBF60948B
+:10EB90000D45A201C3AF2FBBDA509B59156061032D
+:10EBA0003F248455A5C8CEC486E1A0AF60D27F467D
+:10EBB000F5005A74AAE8C15D51CE2E1E434271B7CA
+:10EBC00022D9BE8930FAF69EA3DBB5BEAF308C7871
+:10EBD000E89C915D19C96A308F1FD5DF47B3FFCF1D
+:10EBE000CF48A76FB475338FD221AEDF83A2531401
+:10EBF000CFCE6D09EC02DE50BC18351AAD5E6D4DFE
+:10EC00005CFD6A2371A31F78AEDF35902AE21AD625
+:10EC10004EC6A4B589290E0F97D8BB5066AA61E8E5
+:10EC20002CA7FB54D63646E764798AE23650C828CA
+:10EC3000669E2D323D9BCD31DA9C645D68AAADEBBA
+:10EC4000C56CEB8179CE45138240EDFC2B87FD2509
+:10EC50003317CA18D0D8BE6C3276141EFFF716A32D
+:10EC600067BDE5A4B0E4F7A091A49300953E10E140
+:10EC70004C35FAA479A4C7D55F2927C0F13F48AF26
+:10EC80002841E3936949BD4DBFA16F87BCF22CE8D1
+:10EC900063C7164662DE59CE27BE3F6F2D51EAB4D8
+:10ECA00075D41D16FCDB8D4DF8C5ED11330D6EE1ED
+:10ECB000F7459C509E936C915809C2682712259F76
+:10ECC000D9176B2AFDB8AFC13685469BBD5715CE07
+:10ECD00029992F535579CA6E1047B5AA792BFB98FD
+:10ECE000A2B7EAAB186515D3C4054985A417F3EE9E
+:10ECF000C2B1A8377FB7268114C9A911237F2B90F1
+:10ED00009B041838E3E3858048130F9AA53C28E359
+:10ED1000E553F44CD2022ADEAEC640604ADD4B1702
+:10ED20008F38A55D0BF1B7E1F9DE526C5B296766A0
+:10ED30001D86345A609FDBB1243E0E3003031ED87B
+:10ED40003F1375956688C70826D669F1A4E66ADE82
+:10ED5000AE9DD9813435711A83A6AABDD8431A64F1
+:10ED600076120A79C2221C8F6DF36810B139C97A04
+:10ED7000DFE64E3ACFB82D9F1696EF2468F4E06593
+:10ED800036CC85E691AD4F0BF84CE5ED4F53EC1CBE
+:10ED90007027596529B82AAE64EDB1F385697AC444
+:10EDA000BE34BE58BBF3139BF647D04AA36C0B3955
+:10EDB00044F2399022ADCD67455ED6CAF673A46C95
+:10EDC000ED96D24C0FB8D31E20DD18E453DD5BED79
+:10EDD00017AD9527F2CBDFAFD9411F8881F0E1F065
+:10EDE000BB3BBB9515D5578AFAD82FCDCB9556543A
+:10EDF00079C8E53A38892F08A7FA4588F8FA44A473
+:10EE00006A601C29BCED805860756C9BE65A70D214
+:10EE1000BDECB8DA784D49E9042C9E11B6F077AA1A
+:10EE20001B8EF09906C7A8767F7AD0E83D4BAF9647
+:10EE30006057140234AA2F36FD24C4407EC0EFBFB1
+:10EE400069F9E259CF9031E03DA1C328D33284540F
+:10EE500090D9F2C7F22B4FED98EBBFC6D50E6EFFDF
+:10EE600047836934EC5FC18933EA46D6B158C29E04
+:10EE7000C411A161A516EC358B6EC1781C681465B0
+:10EE8000746637042D0B07A54038F5E1FF78B923E8
+:10EE90005C98A7BBCF3A9C960E4507E587827D8B91
+:10EEA000640D2F17F5CA1451723A56042820BEF883
+:10EEB000845E5E0733634A3FB867FC54EAEB73F93C
+:10EEC000A72EF3DC8C9667F782C260DC3C1B0F47F1
+:10EED000A3F7D70FEB94A1C9D8EB5210B664E7E4BF
+:10EEE000777232DCAF26B6BDCB1B43BE4D257B31DE
+:10EEF000D6F69AB2B30371D09E8094EB94F85A255B
+:10EF0000846E201474CE3F77AC18A37F2C06304C4F
+:10EF1000F78240C8113FAC64CA2C7A597CBD578730
+:10EF200063FD36B89B638A7C35A84E2BEB40C997AE
+:10EF3000E20CFDC0FE1A7BC5A094E49631A38F605D
+:10EF400072ABD14413A9E9025656BA89614B28A382
+:10EF500025225BD144C9495B2EC8ECA92287D3CFB7
+:10EF600076F2866AFE0D8FD3630811330A7C3B0A62
+:10EF7000C6EC9707010E65DF788E7E58EDBB0F6FEC
+:10EF80006631C3D4505CDE2F5F71C522AEE4D6AAD1
+:10EF90002305A8EBF048019C550BE0B969B5139126
+:10EFA000089C4DA96476F4129971BDF261B549BF10
+:10EFB000F15D78B2EC5BC21654835135988392713F
+:10EFC00089D16C82886CA6892897031B48DB41771E
+:10EFD0001C6BE9B106C716693ACE741131174FD3CD
+:10EFE000CFE796ACD8C18EFED60F78D07004AD2591
+:10EFF000D8F11AA69B97D115AD96766D291B5E4E5A
+:10F00000986018C5652EB51726CF4D919FC47C7B9F
+:10F01000D67631F5E4D0D04E40669CE9DEACCA1D10
+:10F020008C4ADBA5C4954C20395E950197B8B1C0D8
+:10F0300068E460C802759BE5EEF2F6A9987C1BA90E
+:10F04000C69BBFF3256813824C1D3E7AB2F43B0C7D
+:10F05000874E07E56D2704EB7B91E150E66D4D741B
+:10F06000549947A4C3A13DB259EF1A2E90C88C9D64
+:10F0700052AE9B240199DE37380E9684FD7B4BD42B
+:10F08000D8BCC19D61661ABF5BD7BB24F290563BCA
+:10F090007FAEE3029611BF1C97E035D753006E6830
+:10F0A00003C685EC9B3280057865DF0451BDCD8BAE
+:10F0B000A27E9D910C76B2799A683F47A570C316DF
+:10F0C000B7280682A93CF73D4B216DF561E723FA8D
+:10F0D000A327364E9794C6DA35768F3CB7A708E952
+:10F0E0004D212CE39C7576719060F0D014DFCEC773
+:10F0F0005DC697332DAFE87F31772FCE977E9D8009
+:10F100007EDF73A28861CB0EAEB9E21419C007EDA1
+:10F1100000A82AAB0341BCC408D3E6F049AFA7E27C
+:10F12000DC7EA118BE537D447DFAEE53A3C3D79471
+:10F1300074A4D45CCC417A985272B924294AEFC4A1
+:10F1400075D51EDF4BA2F4DD55219E119E9F946064
+:10F15000D165F58D7F35AC3574EA56C48A3ECAC98F
+:10F16000A59FA07277AB5A9C1F95978FB9727BC3EE
+:10F1700090BE2F43CF6D56170F93075F928B3518B4
+:10F180007AEB57144197FF8FCAA66D4E1C0CF39073
+:10F1900058925730BA7DF91F6B11F31F63EA14D5EB
+:10F1A000BA6F97F1B4F49D7C8C1395AC3FA4039394
+:10F1B000E5D3CB740C5A8126D4AF8C3A0BEB70F6A6
+:10F1C0005D6C907FB2471DFF2DFDEA00ABE9D234A4
+:10F1D00048AE7F2B048C841AC8A6EF237F0C45D73A
+:10F1E000B88082015DEE28F7E508D13CF55A60F859
+:10F1F0000C1E83C4169D5FDA22DC1A8835B2A00A81
+:10F20000324C9BEAFECA949B39A23C75C848255DE6
+:10F210007732B500CE0AD13C8EE061E71F0E5A2C42
+:10F22000E748B5306F9CB65F8807766ED36E435B58
+:10F23000D8FF719E905FFD35668983ECFA17CD1B70
+:10F24000EA723854E297D7E5C80CE2D76E0324611E
+:10F2500081FC174872F2F46F610084C74BE7A28B00
+:10F260009D13ACE422E00085C9D3923BC910AB8367
+:10F27000D24D448CED70EE14AB13D410F3304C9E91
+:10F28000CCA29ADA1109A0A0C12A30D5106E2EEABC
+:10F2900051939AB8FD4D08B33DC78AE49F9EC4D5EB
+:10F2A0007640ADB4BD162B0A42FA531F5C2058B10C
+:10F2B000E5CC2F39CCAD9FAFC4893D2CC39039E04C
+:10F2C000D3FEAEBD91803E813FB9C89B6CD7CBFDCC
+:10F2D0005DA1E60766D8091F3D08B547DC48DD2D6E
+:10F2E00067A65C3054A032A9CBD733D63356C1655C
+:10F2F000DDC31DF47439B55C94BEEFF6AD806D9F2F
+:10F30000FD2FC06D0B3BB35A8EA07A2A988481F4EE
+:10F3100016D5688CDDBB4B595384B59B2D84AD3F0E
+:10F32000706D536F06585EE312ACCAF814A104F76F
+:10F330003025807616BAF0057DB260E5067F21B1F2
+:10F34000FD87E41AE03DB8B8F8C992A2398ABAE656
+:10F35000D00DC5B4AB87C5735E14D7E418423ABC70
+:10F36000EADED7DAAAA280016B6437B8B74EC3DFF2
+:10F370008634CCF92D9938E822F321EBA49B32C0D6
+:10F380000C3F4662A3819235BB90019704426050C6
+:10F390001BD8DA5191010FE0435B5B8A3B81DAC6EF
+:10F3A000EB8D2C23064AE0A870A2AB35D40F42ABFC
+:10F3B0000CB2B3377AB56EB1BD9E315DE392B21136
+:10F3C000967F4B704179FA4AEC592C068ABCC0559D
+:10F3D0002132FC589C6852B52DA30C0060F56B8758
+:10F3E000547A42779F2F04C3CC3F57BD63B78C7AC2
+:10F3F0001D417B56FF9B9369AE4D195A30BB636824
+:10F400002EB9C551A50719D36ED99B66CB42A23C34
+:10F410005D60DF911FA6F44ED0D056DCCE1D07995B
+:10F420009E75D44578DE2FB629B8AEFB1CA8979BF5
+:10F430007F09961DCF5E4BA7F025E91FA8ED077247
+:10F4400083EAB0FE04F431E251470EBEF19904653F
+:10F45000778A204F509DE21FBA71BBF7DA730AF525
+:10F4600061E1FF524D0540ADD43323B158AE328A2D
+:10F4700085F8A97CBE5DFF01CCC3F79E7644BA7DBA
+:10F48000261590EF7F5FB180DF185A467E07F6455C
+:10F490006B8195A690BE794405B34D80BD63FF474F
+:10F4A000BF912661D16367C0E70FF115C8D45B9B9C
+:10F4B000F92D8205D3B84A50C3E0C28C97301F3E65
+:10F4C0008CFA0AEDF5359BF9F144A7896BCE2AA693
+:10F4D000965DF081D0503B26B05041786501FECA60
+:10F4E00024F9E33FFB91F13325967C701DAB8DCB66
+:10F4F000926A12916E99A61E5EC7770236D3A8B1A2
+:10F5000047E0BC48B77D078EE18881774C7EF97370
+:10F510005ECA89E25508050DE71899CF152D2B4CC9
+:10F52000400A8B63873E3C333A6812FEAACB8E9F1B
+:10F53000EEEA34ADDFBFD3DAF1727BEF3CAEF1120D
+:10F54000D250C7F9B05EF066A78150825D928EA35B
+:10F55000765873DCA819B8B6E955250A2F7598D0E6
+:10F560002DFB562D8E8D1552B44409BE46F11ED684
+:10F57000871740F724DF4A69FCB2DD8F9067682265
+:10F58000AB6AA27CAB2079BC5D6FA743BE80B89309
+:10F590007EC8C12C7D4EEADD45B09F10F34C055569
+:10F5A000AEC8F2AC945192E8C36CEA409D56029208
+:10F5B00034B6BCFDC1DF6AC058226DD9E71531ED04
+:10F5C000706AD656F9F1C7DC9F3FD43236C98265DE
+:10F5D00062842CB19BE37ECFB63E09E8DC88E274FE
+:10F5E000A838FA92892EEFD1EF9E3A603C0E950230
+:10F5F000CF38CE5C952165DD2275359C1298A753D6
+:10F600003F7DEAC2D6223F882DCBC0DCC2F748DB63
+:10F6100004F32C2AD66C568A7D0C981A1CC4CE6A28
+:10F62000A5CA8AC461F81B5276BAAD6318C604DC59
+:10F6300060645F33C646BEF9F5F026E779A2F405AB
+:10F6400083F2A7AB1C6F2335FE8FB596507602DD93
+:10F6500018CF8CDCE44A0D7A36CC68F35B7729F45A
+:10F6600035E654CFDB820B21DD2A3B768148E55E0F
+:10F670007D6F6FC480207D6E96434B72B0120FDC9D
+:10F680005FA8B10DA5BC1F777D344D89BC759B2348
+:10F690004274616580EC0D9C6595D3B4B739A3E7DE
+:10F6A000158860C50BA4C326C2AA3A0B2D7B041E85
+:10F6B000BDABBF2B3EE68A54C82CBC56D108D5182A
+:10F6C00046BE3C7991F7B78793B78E23EC28B14CAF
+:10F6D00022345377840E57FEC136D71A25A59C3C99
+:10F6E000A166955BD1C1AD6352865D4F231966ACAF
+:10F6F0002D9FD1E71AA68DEB80D2C68828324D56B1
+:10F700002EF65106AF4C1DE5C202D528B822ED6693
+:10F7100021E473FF3781BBDE92C3E2AA6A0BAC5AC5
+:10F72000D70786A4D5679F4286F81EF759A6DD47FE
+:10F7300011584585020DE62E116AA1FFF04C78F6AE
+:10F74000C1B8D824A2A2ED02CB2A31CA8108DAE1DD
+:10F750007673CE2A98B95ECFEB1C8296CC5635EBE9
+:10F76000127AEF2AD8A995DD9DFF688B99D3211ACB
+:10F77000D89B8A5A5280CB80F46CC86B2054E31318
+:10F7800008D0F2A6654FA777011BC18313675D9C64
+:10F7900030D488F20270525C6C697FB7927AC9CF1C
+:10F7A0000C79D04F67E06E64D9759ACDBCA4A7A33D
+:10F7B0003B18EA7D97B8F0302374711081FB1878FC
+:10F7C0002BB111E25467FAF00E55168B949BA48E60
+:10F7D0004CAD9D7E635B55713CCE9ACEE30AA6DAB2
+:10F7E000AB1D36E464569ECB0740A4D3013E2DD713
+:10F7F000999501269601C083EDAAB3997B302AB46E
+:10F800001A0C1C663FC29F157B2C10F47859AA5C19
+:10F810007DA14E56DB878EA10E616033213C0A9399
+:10F82000C9DE2E597F37B0670931DEB959C5BCDD55
+:10F8300001C583579B1CEC30DAEA50E15C1413815C
+:10F84000DFF253DD20D0BBF50D40BF48D22BC29D67
+:10F85000AF2224A13EBCDB195AD759B328C3DB2BF6
+:10F86000EE2BC20D46C3D2D0D93FA410DA0E2879B0
+:10F870001F89792FD0B2922B6A195F2628553851EB
+:10F88000D7036F341CBDDBF511FD89F0260B8BDA35
+:10F89000B76CFDBA59DCAC1995CDCC87349BC4BE8E
+:10F8A000B74893C30AB7B2D6A421D2518093A447D4
+:10F8B000214830BA474B0CA03CF8B9C7AEDB3CAB93
+:10F8C000C92A90A675EFF3D140CF938103EC6B600A
+:10F8D000DD72A11DAC65D255CC5433AC31FBC61ED4
+:10F8E0008E20A7D46F6E7FF4C85647B2A97A8CEDEC
+:10F8F00046D3D4D4231CF66EBC5A5AE9234273CDA6
+:10F90000C311A3C9AB1B51D5693E3B4C98619D5DAA
+:10F910001081CC7C050D779FB5A679CED0A6DB6390
+:10F9200014315E3126136213DBE050C11C13673DB6
+:10F93000CC0816D5CC4B83145FEA36BD0F781FACCC
+:10F94000588B679C11BC0683175E3A3378B1A53398
+:10F95000EDFC78BA56D4F695B711EA51821B4D09E1
+:10F96000ACB07EA299823B6EE0D4859DD4D8CCC049
+:10F970008CE9EE7DAD72CF24897AB320B2495B2346
+:10F98000E81E2302970FA0890F382BD3A978DFE355
+:10F99000336A2084F53625FB2F0FCFADDDA0AB2DCC
+:10F9A000B4E7C5719F6176C639A0EC7BFC2370C9B2
+:10F9B00042CCB858BB228577B58C3F5D1B034D8E7A
+:10F9C00050C04ECFD2ACA38644BFD4BAE5BF5CFED4
+:10F9D00072FBE9E08E81D1E00A3D8C0CF9F60E91C4
+:10F9E000FA0BD8AA42D02CA3585695AEA303DD0D2E
+:10F9F0003E70F7D53CD2B996F52ACFCBB6AEC65EEF
+:10FA000031863E433ED14652AAE93D4448F0D12DCD
+:10FA1000889415E3ACBDBF54236B70EEECEF0C067D
+:10FA20002CE3DAD7181EC05C0866082C701F7EE530
+:10FA30008504510D0A91DCE7DE32FACD206454587A
+:10FA4000B0603DF7136A682FEEE67208FEFB454B87
+:10FA5000200AD1D564B97F929BBF8719C9F9E3D336
+:10FA6000C7524AA970C20F34D695D2A81499939060
+:10FA700006078E5FDD01E6095F041C00A49E19B72E
+:10FA80008E96790C69CF3021F5EED65301C472FC05
+:10FA9000D2B45CA5761E1795C8B7B103EBC29AA67F
+:10FAA00085D61F3C89EE251FEEDFFA9A5498B9C718
+:10FAB0007BE03985F43AD200A9E0FDE233B6DD2ED1
+:10FAC000041044EE89F07D8304995C4EB50297BB27
+:10FAD0003551AA6BBAD99EFB20852E5D71F22DE5BA
+:10FAE0004B913D5FFB9EA835D3F1B976B088D4EE3B
+:10FAF000AB1F8B318168A3CB39DA98C3BCBAB7D0BE
+:10FB000074731934C6BE716E8C97C71BB2A40607F6
+:10FB10000957AE8BB2F6031186349CCFA212F81CA3
+:10FB20004FD72BA7AF4FB39F5D6BD14DC4B7CCF56B
+:10FB3000CEF6FA0CDB7576D5284170F55314D22C2D
+:10FB4000124605B105B725392B7D7A751EC1DFAB8D
+:10FB5000C674896DFCB218FD8755DCE59533BE7817
+:10FB6000B684331334B3AFBD745494AF83EF363CD3
+:10FB7000AA35670B301756E3EB047D2DCA5E2C7C4B
+:10FB8000190F9F6FFBBE6FA9F20C97F8FF318CF332
+:10FB9000FE83E1B02462792CF8B3F76BCCCE164625
+:10FBA00024E7DF8C9D307D1A9294A58781EA830635
+:10FBB0004DDCB4373D6A79F95DACE2312CB182A7F6
+:10FBC000EA9FFE869BE40B746806E47829350FF8FB
+:10FBD000D8054F2E6937F51338F0D2B8D3CC99BF7A
+:10FBE0006DD6D7B9B63D7B6380348B20350E56E396
+:10FBF0009221ADFF1F6CDCFB4E0856EDC177BBE3D5
+:10FC00008C55C5E4415ABE2131A6F0EB9CBE609DE7
+:10FC1000C734B3F7A2E166552523CEB9A79E0C30B1
+:10FC20004238B033468C7CEC6FF7F8A24E34D78460
+:10FC30008E06B32230A29EEFB1CAD899B3302AF211
+:10FC4000824F0A01C62D76384AA223C52FED15E84A
+:10FC5000DA7D3ACF67E1B4E2CE1987EB511A82D947
+:10FC6000247DFBFCD4FD5D7AA5C3DB607E67E4499F
+:10FC7000D9C84603549F20F54ACB5C619C85F68227
+:10FC800032956B861197A0085A9AE5DFD48AFABE9E
+:10FC900014E7282A3E47CD8DA3F388F24F9703251A
+:10FCA00047F2A74F66FED919014E7A5A168B1C628D
+:10FCB000C7FCFF4552D5ED2C4293423E088B4FBF07
+:10FCC00012D5BFC277314231C9092A02C6653E3317
+:10FCD0002D3DAE523FDEA43F5D047D159B3602CD27
+:10FCE000E98536C9147B2C9B0CFFF08FB6B0075208
+:10FCF0009F0FCAC8D9E98732764D57273601E94D9B
+:10FD000022B37698C804BA52B4EA5E059B9764AFF2
+:10FD1000C4B434E8F02B9D4290915E77B641E24046
+:10FD2000DD1E857DD17941CC6B2FBB907F6915E9B4
+:10FD3000E9AAA4B775D3BB8E5EE1923BEE561D587F
+:10FD40008A6F46D1A8BA315BD3692F81288B74663C
+:10FD50003CB406519B9B14255C4FA82196863549DF
+:10FD6000C74EA9D6D966562A235BA79AE8E93A0175
+:10FD7000CC871ABAE9ABC433147DD775774673655F
+:10FD80005A7222AC76DDDD9D80D5C7CCB5AB9C53D5
+:10FD9000E0D06EE377D8032D9A15BE64A2ABB367AB
+:10FDA000693E12D17160C98C52C5CABDA0BFE13A8B
+:10FDB000A33829F61775AC144B73267272A73D1C35
+:10FDC00097467C2D1866C91AE7202F19CE9A62E74C
+:10FDD000D7C2D9E660FB178715B83DB52544470B58
+:10FDE000F816AEB2EB982877A069D8AF6C33CDCBBC
+:10FDF00051CFC739BE5A78ADEE9507015C6D887456
+:10FE0000BB5E4987904CD0E7B52E9D76D15C6D28BE
+:10FE10005ECB37201445ADAF0321FA4689C1671385
+:10FE2000A26FBB8E5E14811B6417E9E31968B0BB37
+:10FE30003C6BB0615F4CC4411F3065B9C91CC09BAD
+:10FE40007BC0B484EB543F678B8A0403C3798ED1A3
+:10FE5000CFD974ED9F623BBB423056590862127F86
+:10FE60005C341832C2A2DFDCA76F7B411D873AE702
+:10FE7000F972944B0ED1DB7A927E8C7A7B660823E2
+:10FE8000F717D043D7C104DD9546A837338ED2CFBC
+:10FE900093D0C501B2447582951C9CDDD5CC5BE93D
+:10FEA0005CDD9E9F0C1581DE6505519E9344316794
+:10FEB000709979B33A447D2A2715D31AA789D0E3DC
+:10FEC00085A5C574CF74420B729556D2BACD688B96
+:10FED000718C49B890FADDC70F7F042A75466CA66D
+:10FEE00077B4DFD0A7B80D886AAD957A06A1B3D3F1
+:10FEF000F03DFCC696C0516932A84D4A3284C8B361
+:10FF0000F926E8B9C301729973993391EFC0709CD7
+:10FF10006C3EACD3A36E0587D5BFDBCD68473034CC
+:10FF2000ADDC794C715D2DB74BEC281F6123AC0E15
+:10FF3000AB1FF6E5B7EF07C719B247145832FB23DA
+:10FF4000BEA243B3CA1F87339FEEEF3B8114F5195E
+:10FF500009E9132BD03E07F298912C6C78875796BD
+:10FF600000D09BD4892F33A74A17AD225E01090C1C
+:10FF700089B78E2AD658A41EB334B1F11A6C28EA78
+:10FF800027F4AFF457B816BDE497DE0B713844037D
+:10FF90001914D9813CB1BBA4D24E5281C748F38E0B
+:10FFA0003DF03334F267A6F98F9B8515A7DEE05448
+:10FFB000D067C119AAC55E65D695160A06759B6BF2
+:10FFC000E31EAA9E502EDF8C8646973A7D43049707
+:10FFD000069E7C6DF8DC8120335DBAE5FF35058136
+:10FFE000974F90EB5CCAA27B7483BBAF8A002980D9
+:10FFF00016F5582739AD4D3BB602D746229D97C11D
+:020000021000EC
+:100000007ABA326087423C733E6C95DEEE79791D98
+:10001000354718D5AB7CCC151BB4F396E656A28AAF
+:10002000C4172DB1666A7555B507959B5A1FD7DD64
+:100030007136057D025C884DFBFE8D5BF7A1C231F8
+:10004000A904E8A5EDC78E1FB569C6C291A3944D5A
+:1000500090CDED2C5CC5BB68B51B8C13265A517432
+:10006000B847851A0EF15EE81FA72DE5897E945BDF
+:10007000BF7E7F942392ECE762600F5101DB81A881
+:100080002CBC5DBC21B7B13CF58514D96F7D539371
+:1000900041BA12FEEEEA23D5B06BDD909CEAD30D97
+:1000A00005AE360CEA7026C0B34D818EB6644D782D
+:1000B00031F420560C55EBB73D7D1887A8D5973CF9
+:1000C0006417503247C756B41C7FAC45267F681D65
+:1000D000C751B9D069BA791A072C4EFB67836EF302
+:1000E0008B6E47E6B9480BAB2542022710644F6E72
+:1000F000B72DD3720CC4B276FF5CE36393E5E109DC
+:10010000D8254084265BCF4D474E4B963256430848
+:10011000CCDB34D319CDC1469568C8FD0EFC096A05
+:10012000661F8F004FD864BBCA23A40BAE61D43DB9
+:100130005DEE15D79C019BE92512354FA175982DD1
+:10014000A630C9A7CF4DEE45FAA9B7989B7D7F1C75
+:1001500099283C09EEF1938A53EBC105DDEC3F672A
+:10016000E26DDA5BAA8CF04227EBF28ED314E462E4
+:10017000E75B223CA4334972BEDADEAA455E93B641
+:1001800048C53025FD11B5CFBFDF681EFB4A1A8A6E
+:10019000F7CBAD440A3F27FF3736D7F9CD7CC527CB
+:1001A00097CDFDB3659887D38CC2C2AF4FF0F5E908
+:1001B000E7FA039371D3835DD88D3BEB9FD6AE886E
+:1001C000447424FB802264E197076B8C87C78DAC55
+:1001D000FD6F01F0DD1C9A0C4B8DA9CD8E122E1FE8
+:1001E00063A1241F1EBF12D10B1A2BAE1CEB7E562F
+:1001F00078A9B7EA1F7A388C1DC18A1328B4303920
+:100200006949ABB67234BF1733FF34845CC65B9365
+:1002100015FB375E3BB1C3DA5273EC3E2A461F92A0
+:100220006CE3C058E90B1C061E4AB6C54F9FF20E80
+:100230009B3E44438B0C92CBF832E6709631A32759
+:10024000FFF873E9CE5B3DFE10BCA14EAF31135DEC
+:100250007934DE2F4D046C2C6C81FBFC81F185F12F
+:1002600010997DE438FA0E71A4E8D955ABDE5B84B1
+:100270005DCD2F387F06CBA416A6F3604BD35D1659
+:10028000EDF8004C82B5638F65D49BBBCCBFBA88B8
+:10029000DA1D7FAB31CDDD3D9C82710A31413AB22E
+:1002A00030EBA0227786E07B34C0E53E69A731962B
+:1002B0009E4C863EB640789A23F4D77398583D27D3
+:1002C000ECBE9240E7599640796C62B52555C8CD91
+:1002D000CF7F22C6312379DB862D6E8FFC7C35B033
+:1002E000F0A1459891B5909BAE94FE45E88EADB5D2
+:1002F000C07741479E33A44E93B2FC3A4B309A0FDD
+:10030000652A4F0A39EFC453CC850166BFBCE3535D
+:10031000A6CD0F35CE9ED6A78E17EF3810BFDD0CB9
+:100320003B336D87BA9F9E007DD486D6878C44DD93
+:10033000B45EE1711E737C705173F9EC2A54B5F60A
+:10034000C33EBE492A66D5536AEFED5EB0F327DDA2
+:1003500089D63ADD20180808B1B39B0BE5B409ED46
+:10036000CA7D9D5683FBA20354C6169DB13BFEEA8F
+:100370009AEB7E0247973686E6CBBA30AA5A6EF6DB
+:100380009801CDE72E2E8F177EFAF2B585115D7399
+:10039000E43A433E8440BC7AC6E592994215D26164
+:1003A0003EC81B09C822A41BF9731A9BC797859ED8
+:1003B00044F3928E36BEB926F8FFA8629873DE2BFE
+:1003C00076B6EF8DAA0A2F759AAEA92FD35BC58397
+:1003D0001BE7BFBC683B3F82A6CA5E5ADCE9ACFFA4
+:1003E0003EBDFE2DAC890E6E8540965DAC7C6820CE
+:1003F0004B8BAB3C4D943F468C01D69618182F8200
+:10040000761677990868729DAE074CAA028712A4E7
+:100410007B2082B811A6DD27DEE29D39F0ECF03BAF
+:1004200066DBFC0835548AF4924B844E7649260AE2
+:10043000AECCAD89C2029A551853F64581A63E55F9
+:10044000357DF9625D76107CBEDD45994C4B6B17AE
+:1004500044F107DFF2A78E8FDAAE3A633DBADB16BE
+:1004600011E97E540D4C6D5C60E71BEE39E2769A23
+:10047000933B8448884E145B66320F5E4415666178
+:10048000A9DCFA522FB59C04C6079451888FA55C4D
+:10049000DF734B5B6DF64563D41B133D84CB2EAEEF
+:1004A00011A4B960332A1DC5022BE7B12AB2F55356
+:1004B000785A13D07BEECFE48F9FEBD17F8E2ECB7B
+:1004C000D7405761B6680B0B4F3F2B0EFEE301C6BA
+:1004D000A631E02071E15F905962ABF2B3F858F1B8
+:1004E000F7E2C7ABDB85BE503E5C31616055B4D3EB
+:1004F00085B1999820A81431219811EEC4B712E95A
+:1005000007DC904493CD28C454FC305D3E97DF85D2
+:10051000651DEC459608B0D3AD3FA5DA539A296B1B
+:10052000AEECD4458A47A58EF87C222667C218B562
+:10053000C759202F2C31AF962DBF881D9148903779
+:10054000D1D2D4A96FACAEAF5D87C76A31792C79AF
+:100550002C402D4D07120F5775BD1A348604E27AD0
+:100560008C6E8DC2633A2155D5A0250611DDADB73D
+:100570006368B01A7BBA7570CFAE85BF669BAE322A
+:10058000A55AAFC9AC54A70D442982D3A08CEA7AEE
+:100590009AA9D62F79A753C961F81462C1A370F53F
+:1005A000CCEC5AC4E3459F1C931B5A880919D40606
+:1005B0005AC1FD977BF3D56A7914CAA9CC3F22A70B
+:1005C0000E90FD45D6BF929D0B8F0828AFDB041E11
+:1005D000F00133339BC40D6B873A830081C4DD4245
+:1005E000F1B069E5405EECBD8CFB9FF771133B7881
+:1005F000E96A08EF40DE41051E72E5F5D57DC1D8F8
+:10060000B9F1863C9C4A28DD43F123A9AD1324D1DE
+:100610009F370B332948E68D1058F4B7FF65C66E37
+:10062000219B532B39B0CEDBDBBCA8CB7CEB511329
+:10063000D266E4AC4750DFAAFD28D344F9E2F43097
+:100640005208CDE3B32DA63C031A03CFFF67558AAA
+:100650007AE9AB1AE8692EFF9AE2DC9839F7835EF3
+:100660003C5902065CA15BCBEB50B6F5B6B46BBC53
+:10067000AF05C5824E77968E38FF01FFA4B6D28BA8
+:10068000CA086775CE4951E7C573DCE32AFEB95A3B
+:100690006B3D4716A34A312FBACAAC4F1DFA151845
+:1006A0007ECC33A79B7265594C5CF76DF10D222609
+:1006B00001DEA023A82BE048E69E5409C1F5FDCF3A
+:1006C0000FB4DC34003BC2D5BC947554C3207D2BE1
+:1006D000D5BE5D6323C88BAB67BD5352D5E4A51F60
+:1006E000C6A34CFE5BDE946CB6F33119ADD07542F7
+:1006F0009F4C6A0608C8203790BCC84C96F35751E7
+:100700009BA31DF779F957F8910F78AEB63509EF2D
+:1007100055636491337293620408BA0684AF712CF6
+:100720005403BECDAB1AB9D414B3159448AD9A375F
+:1007300095E686746EE51B8D7CC08EA72C591AA198
+:100740002895F548A5B82F7C531DF1FBA396E283AD
+:1007500013DD20566DC349D9900B2D04880E1CBFA4
+:100760009CDB2BC8ABA75B5FA266C8E9E73DDBD586
+:10077000A7EDC5FFD98F4C66095D9C92ED51C67EF1
+:1007800050565854C1DA02B4BA02F8E3B61D5828DC
+:1007900060187E6946F70813F4A46E25E6580D7AB2
+:1007A0003A3321B73BAFE2319FBD8D089061E21033
+:1007B000B2141799BFF03DA31EE4728B8DB8E864A4
+:1007C000B63EF2D17C1F616BDC07B9BF8B9AECB3EC
+:1007D00074E020802EB404BCCB1477BDE4B32AC5EA
+:1007E000290A5CE48BA2A317A2A7E1DC0FC9874406
+:1007F000AE445C2F72C7F22242C6EA0199FB7838F8
+:10080000F1616FA2DAC5007CE7B1D7D37384B2BAC5
+:100810005380534FB7EEE8B778B1DBE94473688192
+:100820000239D3CE869DAE6D17A120680CB35392CA
+:10083000E916F74F643DA634DCD5F471839EC153AD
+:100840001ED8AAABA1744A0FE6937BF99EB5C5A743
+:100850003254170CC3B879390761A33938FBDD422C
+:10086000E18431352C0ED2471230415398FB00936E
+:10087000F48C8F9C6B0A76273309CF18ECC7D74BC3
+:10088000994D8879E1EB836D81D62388154BE54A34
+:10089000C0FB0C3B2BF7CA2755032FBB456F913A82
+:1008A000540008A482772C9224BD8056EECA3F8B58
+:1008B000F0082C1BC03F9A371BF969D3FEBA83019D
+:1008C00071B2FA9E5C5430013428C629D6FB9B5481
+:1008D000B1407FB41B1C99D2B831B1ADF5984874C2
+:1008E000998FF9B216040BF00063D9043380C55E0A
+:1008F000E0BA31866D57BF50B8E8122FCEE2D8F675
+:1009000023FEA2E5916C4AB27262372AF486E5842E
+:1009100074EBEF26A95D4E71C29C38BDBCA1F7AB4C
+:1009200028D39695948655AB4304E142D8700B19B1
+:10093000F9A19DB8A964C178FFE2F32169ED40A750
+:1009400041B4043C6694F547E76648729C15FFE4A1
+:100950004F60719205A0F08D74798B58F2E36FAA05
+:100960007AD5D7EDFE86082731FD841FC408F836F6
+:100970007DC21FFE6E0BDE09CC400497DF1DCF1732
+:1009800057DF8EAD80D59A03748689A3521F38F342
+:10099000CE1403B8342A75B70D060907CDC6B222A6
+:1009A000B0E5F5BDDF7261BB42DE127CD0E37C4D69
+:1009B00069CD15011EEC4CB74C6BD0E6C08E55B717
+:1009C000EDAF5B9A0507AE3CC68211A1308F06CB16
+:1009D000D8F84F44A71DCCEA9B6DA90D48712C4552
+:1009E000DBAF234FF9EE351534D859F61298EBB03A
+:1009F0008CBC710C8CDDD97937B98C1138F6A2B06A
+:100A00005619F6BCC00F8E07460130C9E09768DB67
+:100A10009C606EFC8FD582954671566EF368A1F48A
+:100A200009B69B74086A33E9DFF9BBD899AB465520
+:100A30001C9EEEA56DD976689ED7684293E6C344A6
+:100A4000AC0D987C57E5664A52F1FE3E04EBE67524
+:100A50003323E185A32986BBF1AD0C44561C371422
+:100A6000B9F967716450CDA364E4619295C98C5E55
+:100A7000B1566A542F36044DB0DCF062B5F68332BD
+:100A8000247A78C548BBD0FDCFA11F813C3AE5F15F
+:100A9000CB3151AB76CE359EF386069C55B9563692
+:100AA0001E005ADB9F48B944BE139D6E0125480DB8
+:100AB000455A3DD0767E65E88C11509E4FEB86F905
+:100AC000B58758DAA6C91E8DDB313733977FD80634
+:100AD000C1BE7C3667E90EAD91AEABC9EC1DE66CCC
+:100AE000033B733561998101C3E4B7931334BACBE7
+:100AF000CA76011E9A19239F497770F27701266BF7
+:100B0000B3149F0D0EDE85723407BE88785DC14D2B
+:100B100062DDF0FC642CED6737AF6DB0AD8E8B7885
+:100B20008B55EE5CDFFA721D0BA95A2513415165F6
+:100B30004CBC41CD6DED59D109A9BACF0A363B69FC
+:100B40001A0FCA93DB4804D2B5A917EC18684EA255
+:100B5000382FD4C855F722A52324A3ED652195E2AB
+:100B6000D078EB85C3767A8601BF11CCD467DA8F53
+:100B70002FC06B8D3A2D22601FCE12253C934B0C5B
+:100B80007FCCD8EC85C43B1429BC504630DB409662
+:100B9000FE02E508A7D7F5959F46003170FB00449B
+:100BA00014CE1C562C52E6B118FF8BFAE62609F833
+:100BB0001AA95DF1F7183CBC82BBB4BBBB824153A0
+:100BC000270500141B87D6FC4F3D2AAE13F73C2D9A
+:100BD00039D69F630CF84BD1FC2ECEC1241A9A9FB4
+:100BE000C8C09047B51023982BD23B53A09DF76EF9
+:100BF000F09CB11DFFD54A2F45482B2282E8F44CCA
+:100C00000BDCA9446C750B166E49D2B05BF4623CE8
+:100C100020A85EC5807ACB5401DE60C2C7AE6FD912
+:100C2000DE260B73BA43FBA37E0D88F28729E1C24F
+:100C30006633853EA72641D4DF29D782EF16886622
+:100C400041279E3E4AB0C6683854DD1222F5213F46
+:100C50006DC3232103D8D69F0B73D7B209406750C9
+:100C6000114AF7ACC0C5619777D51959241FD149EE
+:100C70006C5D52A145279876AAF8E648D9203351F1
+:100C8000B4F99BE94EFBD669F729C433662907A25C
+:100C9000A6C4E927B39DEA9B63940E00BF6AD0F215
+:100CA00012B96F3A2FBC0E46AFD03A1F1201E2FEC6
+:100CB000898DF592C3271DD0CD43C9DB7CE1426A03
+:100CC000CA95A35E62368C1FB0AD07496E85D5CD3F
+:100CD0001DBCBA59F4684F82C98171C7EBE25786CF
+:100CE00006D6155A44A06AAF937996B06F1006489D
+:100CF000A23F903D8B46FE96FC2B85703BC943CEB0
+:100D0000381A9F3E050175A1AE30BC1C1FA7861C7A
+:100D1000A7D53294D60C618240EC4CD7291A2828EA
+:100D2000709454A9DBF641EF02B0E7FD16D07C4089
+:100D3000C0D21306628ABFCC20779571AA5273E69F
+:100D4000111B507637B7E7CE73B6D82D60BCD4AC44
+:100D50002E20CEB1363842B3FF6DD25D3C615FECE0
+:100D60004400A35F32A37C42616AD528601BDD5733
+:100D7000B17DD82BB0A8276B86BDA53CA4FFB62DAE
+:100D8000E248F142A78905BA1E0FE399CE04A9688B
+:100D900007568C2360FC2B5C899301D6709791A336
+:100DA0002F524B91E19B1F012BFDA40FDBDC94C262
+:100DB0006802B848B5BA6EC702BC60FE9CF08152AA
+:100DC000EA0F02497B054C57CC1454B91E0D984EBE
+:100DD00052F4FF05FB8E73FE00C1FBCB86CAD01513
+:100DE000057192CD771F2BD6738FE2570C5EA4034B
+:100DF000F0CFB7263ABBD87D45CEE65767051395A9
+:100E000025777E29B2890DA1493F051531A85D18C6
+:100E10005468BDFEB8DD668B1AD60C8BA7C4221AA7
+:100E200004E8854D16F969AF723A8A7F4AF21A8151
+:100E3000281B7FF14834624DB4EACE7E8220AD2378
+:100E40004DABD0BB0E1524E32CEC92EF85F4A396AA
+:100E50008DF1F31122149CF077E9B40F1583A734B8
+:100E600014FE6424D373CE9F8033E95BDE817F73ED
+:100E700085F2315BB2A34BE718C9F5F1F2BCF30878
+:100E80000011B67BFAE498DE0FECAF174FD73F7F27
+:100E900039FB4810D4BC838F557727391785AD6946
+:100EA000E2CEA4BDCF2ED97072F918653B1E930413
+:100EB000F2BED94502071D35A6B1394D026DE25D7E
+:100EC000A0F813F0E3D95EADB1A284C9CC85A8D84F
+:100ED0008CB9CD19B6FCF0E0FC5B2FF073C410C1E7
+:100EE0005399FFE2F377065858F520257CEB7F5E97
+:100EF000A39585D41C39AC1F3388811978041086DA
+:100F00002704BB921C29C8414DFFEB569273A5C123
+:100F1000A6B216679414A2A8E87266FA6A550C572E
+:100F2000BFDCD65474E8BE1259EFFDE471EF1EA980
+:100F30005749741F56A528BF13BFE2B8D94E40D8F1
+:100F40000E05690AA82B0762C441751C37D0D93F2A
+:100F5000BD65590612C4B8193317C01A2DAB0DDA86
+:100F600058226E42090FD51F2449A1D02C2E3C6D6A
+:100F70005B670E4E68E9848C77B575E001DC6C1315
+:100F8000DCB8E3031F0891B2531F67499595616967
+:100F9000E52CA9AC2CC4E12A9571F5BE0DB0D22880
+:100FA000A757F1718658D14AB399ECA27AB55E85FC
+:100FB0001A85375937B745833D9A5EA1A334C35488
+:100FC0001E70B6577927F5687C81C05974D94EBC1C
+:100FD000E9FE36BBA387FB53EA8A033A09B7F0F26E
+:100FE000B8E7782EC56755F69B1454632ED4CE36D9
+:100FF0004D557600430073AE700404B07851E32879
+:101000007520BFBBBE1A35FC9CD6104B3018E2BF12
+:10101000933CA79A3D435893866FB33DDB090BF58C
+:10102000ADC462B73905E536311E4E8BF1753B8292
+:1010300036DBB59698CF16C3DBDAC210EB7742A841
+:10104000BE4E658D1FD88EC919E8D823572EE712DA
+:101050009FC41038035009E093A931EBD13BED5404
+:10106000FE89973A53E487FB72E7712B4AD398EED7
+:101070009A351EBC680CD391454B80716917BCB77B
+:10108000E31CBF36CB81FA417025BEDEEAB049963B
+:1010900029B69ED6F7F96E03A4EBCFD95E00DD5FCB
+:1010A0000423EFBA8D3DC0107393FBBE321024B100
+:1010B000C77B2B8041B83EFD08DA9BB1FF766A33CF
+:1010C000D46CF97057E1530BA9432DA156B045B626
+:1010D000D2FF0B831ABFBFF5249A0979F2D081E2BF
+:1010E000F038918536DCB3AABD814F2E8D1388B9B7
+:1010F00091CC0C9A8EA1857CBB03B8F273A53C22DF
+:10110000DB4E87AD7D339A243306F8BD619C19AD63
+:101110007E07EBB0633264641DCEEA8DB01C898D0E
+:101120005BDCC866128407E98E8828DC8C2B34AF20
+:1011300013D524381AB19AA246080D120CDD11A25B
+:10114000F925560B7A2ECE2F6C82478AF409834EEE
+:101150009031F6E139C767465C63C1B19D82AADA76
+:101160001E5FC1FCBD60E365779AC7F01F80E33E58
+:10117000986B1D953E1A9B52E64B904086648FC932
+:1011800082E4B3B72D2E143450F912DEADE6A9ADCA
+:101190004E4E2D865659B164767A7F98B071CF2421
+:1011A0006AF401DB08ED15482536D7776E42FEBCA0
+:1011B0001C2156EBADFEB64184878B866412E9A9EB
+:1011C000808F180B1262FE1366A54BCB3BD47A2995
+:1011D0007CDC1CD16DF9FE9311F1B0FF6D610E57EF
+:1011E00057651FE351D0EE8FC9B7FBFE58234C4C17
+:1011F00049234CE46C1DA0D7F39BA7CE72C0A34F2C
+:1012000072607209411968B56A8260E44F92747C19
+:1012100083362F275D96A7DF8DDC056DCA13E8B2F4
+:1012200033166A14733D15B0DE5C5592DC83EDD441
+:1012300087F80C55ED0383E9E6B55F54BF414CF6E2
+:10124000332981E0283A7AC9D6DF94F32241FFFDA1
+:101250005DAEA57C4B3FDB5B42112F7FEA7AA4B8E1
+:1012600026237BB6226D48BA31446B29547B5A57EA
+:101270009EE3AF31F703944F52542729570919348D
+:101280008DBA973477465061685000F1DFF37ED70E
+:10129000D89AF868DD577F39B02F498DA7869F2EE1
+:1012A00062F9AE69E55311D488CD682AB1CD07172C
+:1012B0005514DCBF8FC9067A54045421B700F5F5E4
+:1012C0005D1256E047E2C2F00B3721D1C82C49B27B
+:1012D000F77641C5795B7E3FABC25648D5CFF82B38
+:1012E000925935116CCA50263EEE40A1990CE1ADE1
+:1012F000477DA787440BED4CC254AD003E1A41898F
+:10130000A94B7C5B12C3B5B4C66592DF278BC0398D
+:101310009E99772CA4CC08ABA46517FB9BB1DC315C
+:10132000C4F200016C890AEFF9A3CD48D5862328C1
+:101330000C06FAC7C3368B692AC0822193B230CC1F
+:101340002FBD1A8174D0EC91CCABB07B8FBA7E3DAF
+:10135000893A6D0FD73D55B2BEAB2578DF787E0157
+:1013600093E915A876FD756C45B81D1BEF367C64B6
+:101370009FE4088A519DF1E8908F6B6D2F1AA002AF
+:10138000626BF78F8B61D20DE095A92C90408FE3B3
+:10139000245F4166D82A88397DD568DA82738A93BA
+:1013A0008C7B7ECB4A525BCED61C3C19764FAD036C
+:1013B000480F6ED1F64C503DE1228FAC20EA95CD1E
+:1013C000CFCC6ECFCEF93B30580066D33249D1AD89
+:1013D000A98D5E2EA76414C8D834E88C7A8BD856B1
+:1013E0000562F6003F9001558581069F506B19619B
+:1013F00093A788BCF6E0FD41516B4D721BAB49B41D
+:10140000EC5B121F6226E4E6909B077F8CBFA8EC82
+:10141000B240BD3E2E38C05E042B9876503A9BFFFA
+:101420000F1DE41BC2CEE4DFE96A51B6A83EED30E1
+:101430001DE6A315E3DC71A0229D6D280A68395FC3
+:1014400058DBA79BA5613FDD346F369A98E0ECE24C
+:10145000D0C48CCB8B485B164A128F7FE0D7C91063
+:101460008A16DB8942CA3B85E13347576B1F5C868E
+:10147000A8600532B0C0078A9EE4BA6ACA150E3168
+:101480008C9FB5228767A2C81B276AAAC32859B1B7
+:1014900009F2E8ECC585450FFED0A9424A55199CD2
+:1014A0007FAA0854A3249048E03902146136107BC7
+:1014B0000D0B6B6E33C0CBB4608FB946F948003268
+:1014C000100147C83B0F0BC3DC3E17DEF175F799DF
+:1014D00034600E8AF111A8F09B8855BC4439A00DE8
+:1014E000559AC65EB36DC893BD4C1AC1608374181B
+:1014F0006DA9DA4F034359BF61DC0B4BB28E12A4C6
+:101500009CF2B02B6E1760D5A46B101179513C8200
+:101510001130105ED450945375736E5F2B12576068
+:101520009AB333DB9952F4C9035976725AE024A96D
+:101530005E37888596215A6F0211F2739282AD1937
+:101540003B89BB57C1BFE8C4AB93062E8AE580CA6E
+:10155000946EA5C4CED70F8083D9DC84ED559F0D42
+:10156000E0AB8457C0EAAD228ACF202F2CFD37C1D3
+:10157000D40B7F8DFCC82DA9F01ECCDB15E4CCD09C
+:101580006CA94040C784E1B3C884F9D64B019940A7
+:10159000E3DA7009F0C67EBE8DCEDC5B900B350FB2
+:1015A0003E2439A35F45DC51ACAA45071AEE462814
+:1015B0001BBA3AD7F63423D3EC3249F4BF2EC539DF
+:1015C000D9111247CB78B81EE8A4DC337EE26768F5
+:1015D000828A5E93F6488FBB8EF5B5B249B6FA2A79
+:1015E00074B4FF5DC5488F1B0A6DBBC535F650FE50
+:1015F0007D5811ABC33396DE46960B686F0835CD28
+:10160000D0F4E649B986E74D8337279ABA5534B8FE
+:101610001F2A738745DC7A07D6F2BA81605C1B9378
+:101620008147A0F73CB4A4634099F23F2CC70EC990
+:101630006494824E0A0D0520D992847C378764D643
+:10164000835A92540D94F920C510E5B92A51D03D22
+:101650006ED7CB499786792DE57BEEB9E87B3F22A3
+:10166000204F57409E16FB7B3FD6A88167F36B94B3
+:101670001E072FDCC5FC459B966B917B1EEB9D687E
+:10168000E2C4F31426FF20302707FE4407CE8B3731
+:10169000582FD6CECDD6DB987CF5ACDF1A2F7783CA
+:1016A000C73B6AB119E3BDB16181EAC34641226417
+:1016B0009B8CA8C5C9DE65B21E68F9AA593EE0A98F
+:1016C000BF894A8DE33FD74374AB8266E66F9B5A6E
+:1016D000F478FE36EB65B8BA2C5059665516626A36
+:1016E000678EC5A50AF84A4ADF29E8BD17CD8F5095
+:1016F0004C2FB5CF7780377BFF4816065CC9C6E410
+:1017000093F41850A862814FE8446C04694EB6CD3A
+:10171000E6A3BEC8EE772735AD0E24D20DBBA8CE0A
+:101720001ECC4F034B442F48897344EB4D8920FA5C
+:1017300031BC8C210860D0890ADDCEBE4A6DD466EA
+:101740002A820D9198DC2761CE465BFEDEE363D6EC
+:1017500043ED9A0B43DE7E4948E867345AAAE4F524
+:10176000619373165ED1FCE5305443E48EED73C093
+:1017700087ACF8D11611521AAE58A669B79817AFB0
+:10178000E818736CF92115F49A4D323D7543029CAB
+:101790002C45358F3F568F3392E05748D93404910A
+:1017A00024339080CFF88C2F9B2A7CF4CB0E1864C6
+:1017B0000D26D5C2A30542CA55B9F29F11CA0DD84C
+:1017C000950CDC1CE9FA27D49A00FD0869C9178337
+:1017D000FDF34DB9BA933F8E88D9CEF93D8CCEBF7B
+:1017E00016E03793E27B5EEBD426378D7316AE1F7F
+:1017F00079566C422ACC7942AF7D3701C90288A064
+:101800005B19454CFBA0664EADA773AB6F6F6D388F
+:10181000AC9A553553BBA47CF17D6D213CE5664EF9
+:10182000FF02E57DB8247FB7DAE582EEFEFCFE1903
+:101830008BEC95B864388D4C2932A1FB092D1DC75E
+:10184000F7E0572AD23ED82503D7739733A9803DB6
+:10185000D9A66AE7D62069A6AD85A4F487A6AA5DB5
+:1018600044BB3D73DB5244EA29FA29514C0A4DB678
+:1018700057DAAF59C6902D6A8BBC9805E4A0628DEB
+:1018800012202FF4E0F9CBBA1E594952E9101BD6A9
+:1018900003A57EAFC947376D91F462ACBBA6C1B357
+:1018A0007727850151C88C616BB162AD4777BD2048
+:1018B000363EE3DE3C96F78215BEFD527BEAE7C179
+:1018C0006EB0D2A05F9C6868C7C6A6960106F809EC
+:1018D00023E1BD4BFB7F7CBDDEE6072C0462BBE948
+:1018E0002DB5ACBE53F6497E68B9D90E12C0B4BB53
+:1018F000F7F1D1DE1F810B7CB229A4B69218173DF7
+:1019000081FF9F122B62381C23CB37BF685D617348
+:101910004B2C08BB48C05B4E1D850D5FAE352D9B23
+:10192000A3743F74318266045A8635DF9059F2F40D
+:1019300023DF3C45406E7D0E3C9A8C31E2C500951C
+:1019400052FB2B7BE0C7CDA8B6307B90385E34F1DC
+:1019500075A8112BE882288C194E7E57CEB9F9FF55
+:1019600021923529316BFDA68DF25E677AD59A9367
+:101970004730FFD1226A249D6E45D5EDBFFB741818
+:10198000BC8BF5F47576E1228FCA588C21CD3FEBE4
+:10199000723185BF22E4CF232487D63BB1904676AF
+:1019A000A2B0E3ED072125128599780336E3B99EAD
+:1019B000EDB44483CB965F1C294E43D6F748CBEC5D
+:1019C000345B1E007A2EEB5F758AA75B04C03E6F06
+:1019D00033CD11462B1DA3904D3013F7532EE3DE6C
+:1019E000CB7882D7BF3C8406992E1024F29C18A491
+:1019F000D87D6D9C1B9AE80873DB144A625E771EE3
+:101A00002903FE644990FB69A14D4DE5FB61F7C1D7
+:101A1000CC7A7F17AAFA8BA6935A606EB4A27B3950
+:101A2000C9167BA68DA5195AC0E5EE8688FDD11989
+:101A3000CCAB814A0EB939E5EF8735598CBA2E33D4
+:101A400019481A1A47F97E89AB64BDC572704F5F99
+:101A5000129B67066361C743E52A5C85018ED658F1
+:101A6000886AD9D07B4B223BD0FA4FFE9E6DDCF8C2
+:101A70001331C6F734D46D68F2EE65545118C0F8CE
+:101A80007C1D20F7E56A0CBC3DB55F1A155A5B5901
+:101A9000E2BF4630C77368D7F27BBDEC608A22C6CE
+:101AA000E82F34802F0FA6B9A7C393755729D9AF54
+:101AB00044305A88DD7D3AB9C214BD79B1A8C496C4
+:101AC000AFF970A09C7D0C4FC9999A00325C817F60
+:101AD0007BD9BD363C44866198CD28004C398E8F29
+:101AE00022A925C08191497982486D7806BE2336A6
+:101AF0006C277E2ACB3909CD831868CD9932F20E36
+:101B00004CE435FBFD5BEC4EAFCF2FF09A997EE5B0
+:101B10001D9153933FBB5CED3A5E81371C429CD2D2
+:101B2000A6743BD5720E0C3CD16E6F99E6F34BE375
+:101B3000D6093FA1A5CD323D4D13A0126F9895183F
+:101B40004404EA9DB5FF8CF18FE3AB20C304243C31
+:101B5000A7CFA290E8C26A9833138B314C8F825280
+:101B6000275C6AA8D53E9CFCCD86A4EB93A7E9C967
+:101B70002E4A04978DF5857CA3513A2F828179D224
+:101B8000954D54C0083AD2AE77ECB53B90556EA94E
+:101B9000D115078D88F55C1CDA59E9341097782047
+:101BA0000DF6A01BA10F129D9851795B26F27D12B4
+:101BB000FB044B2EB4D1EC2FBFC879C4B10EC22D9B
+:101BC0002134C691522EEF8B13AC3E163FE272AF1A
+:101BD000F9D6EA90F7372028E7825CED54A8F98E11
+:101BE000F74344D05B8D7386325F27A57F64E07135
+:101BF000399BF07F172123B47C6C17EF1946B51978
+:101C0000BADB788B75B2D88CF810B3EFC13F56C2EF
+:101C1000C65AD2BCA6F8EA853B08BB2B44D2C734CF
+:101C20001E4A741A8CB41FDBE728C1F1AAE2DCCA91
+:101C30006CFE3006C9AC2E4E182EB2B36159E14C81
+:101C400079FBE243DE9376E401528C99A05EF3FEC9
+:101C50001D6948FADA3617A8A52422516ADBFB125F
+:101C6000FB194F4E11CE584C13F5E9B404C21E6B4C
+:101C70003BB060D8C5D8B07AB98B1729409E8C6D1F
+:101C800009D8EC1A5A335C17AE2B0E867C16FD8AE7
+:101C900070DAE99216E763464980A9587F9A64147E
+:101CA000C3739D14AF119D30F8DF789F4740EB8BD5
+:101CB000137A46FE67781FCFFF603A82E6D8D4F2E7
+:101CC000E99C12AC5A9298E6C6E0FB7C463CF502D1
+:101CD0003A150FDD98D35D78AC470798FB3E9DC061
+:101CE0004CD9027F7566308352C45CFEA1A68397EF
+:101CF0009B206BF7E70D8F91DE2CB658244AA55137
+:101D0000D47015C4B9A2D5B23D4077D2946761D5DD
+:101D1000CF8B04A4444E63E1B0FB67A492AC43753F
+:101D2000EB2CA74373386E79CAAA479680F666945F
+:101D3000F43635D0CA0DBF6A898FC211668C0A1677
+:101D400069C4FF5AA6B30E372E74DD2858A5B7D242
+:101D50002D453C251B901CCE0B0912FA783640D538
+:101D6000F1C3CCB4A5AC603E5AB090A375F928FA83
+:101D7000D485C7176BC2B8473FE8BAB8455AA4A282
+:101D80003D44D319DD24FE8D48871DDE7A554B5422
+:101D9000BFD76ADB3072B4D96302AAE817FC80D2DD
+:101DA000DA23032CCA73FEE551B7657ADD74252A60
+:101DB00042ED544D42304D7A3F31C7748EBF484991
+:101DC000436FD66BF056ED072836EC03BB79E3B4CE
+:101DD0006D0C47EA3DC0C5118A957B120B6EA78F2B
+:101DE0006839B9F22602AEDC684E463215C91812BF
+:101DF000EFCC0892BBEBF747B2590040D1337F607C
+:101E0000368A8B245945E4141950D1090E0848C567
+:101E100009FF09E334DF6162BEFB954761805646E6
+:101E20000455EA5FADD833409AAAD111EBEFBA4618
+:101E3000534560DB2D0C367D3E3973529C14A099BE
+:101E400022318C5ECBDE92EF3BB6D8916918E63634
+:101E500026093AF53F857CCAD56735EAA3F9245CA3
+:101E6000FC87896D28B00836853C98EE8C9E86A24A
+:101E7000231B4EDF772FFFDF2D9FEF16C7A7AF6322
+:101E8000F0A756B7F24CE5175693C35300280AF350
+:101E9000375C8546086203CC532B37AAB164657260
+:101EA000750D71AEEA00188A8831E2EADCB602519B
+:101EB000C60AB6F884B977E186CE754914421A3558
+:101EC000C78F618A2DBE1478D08BB2AE23629A443C
+:101ED00020E2A44B44E6C48687410F72539C5036DF
+:101EE000BDDD31EDF7D54A44C993359BA1A4442DFE
+:101EF000D83A7EEB102B5280365BCD2077C5382840
+:101F00009065597E56504C6A58F700EB0D0D40D83D
+:101F100020221F515BC6027C331475F1595823DB14
+:101F20004423D76730DC93E0BFA1FBFF76426B4BC5
+:101F30004A3E7A326E6162A2332E4DF4B784814FED
+:101F400031C8EF28DD9A2E7B3B8C509EB033D439BC
+:101F5000A0DA8D425D4BBECF60099E42F1B36F1790
+:101F60009B0F5783D677DEA8BD9BED46FB64DCD084
+:101F7000226734B9E44DC6599303086E1B1B805A7F
+:101F8000EFDF876F2540749160096D8CB23EAF2FF3
+:101F9000AD3B924E1F8E2B725FDE859E8F98FC3577
+:101FA00060455272AB05E1D0C590AC00AF0D97EA29
+:101FB000E4D9B8DC7C733854658A9DEBD299CA3574
+:101FC00090354CB13B1C9409035FB5941CD69774B3
+:101FD000DBA5218777CF8F4D3968A80A31A45EA38E
+:101FE000EDB1EEC783639269B1AA9E98264BFF9F1D
+:101FF000C005C648E855B7B81D201C6EB17658E13B
+:10200000BB2C997DCF43E7A4564F4C5F92C93AA9A8
+:1020100090F74DF2736161C66A3A578CF6A31E0DB4
+:10202000B6F696EC4B1C003A5ECC6FB33BC5FF9CFA
+:1020300017BAAAF831C550544D0562DED276009D1C
+:10204000AF55A350D3D7373C703D3D1585FE9095D5
+:1020500038EF101F606F108E56486B1386835FDB5E
+:10206000C5E8DAEC4536BC146DBBDD91C978DECD30
+:1020700076C02639A614BD38E632798928836B618B
+:10208000BD5DDA4BE7CA65995D8BD87280AE4819A1
+:10209000E89354C04721C91961CBAF23D2DE78AB96
+:1020A000CB91BF4F54F36960B1E70B36F105A67EC3
+:1020B00081E320E2E6C85828BD569E60319FB132C8
+:1020C00041E59F37CD3E41F01DF2882976606DC510
+:1020D00059269FB36FEEDF41866ADB38651F17EA2A
+:1020E0007191B203B596D278FE5B229244B6D4EEDB
+:1020F000AE8E5CBB1CCD201D1802F5C2E09647F0E9
+:10210000C070BB66E59B1696648824A976ED5BF7E4
+:10211000F5B2EDC89006D9F5808FA53E930DBBC4EE
+:10212000F24ACA87E9EAA54117BB9AE1A0FBBB5571
+:10213000670F5CA371AFADD2F39BC1DB1B97EE6E53
+:10214000F2CC65BABD1A9AD67727C92C6550FCAA7D
+:1021500000C677B4DE1B2E62746AB8FEA582047BCB
+:102160009EAFC0BA5D0FEF5027546C672D15343306
+:1021700051336140455581841836EB71672D3031FC
+:1021800063AD91805DA516655E1CD4DE4B7869B9A0
+:10219000FF6A581AA5AEBA5C0ABD57A5A9DEDE577C
+:1021A000A7E669FAB76FD059E03EBE4F35836A0A99
+:1021B00071034F75D313FCA54F2AAF06FE18CFF657
+:1021C0001174E7A7B6ADA7B4095227D55ADE38E196
+:1021D000CD0C8D54183F6848C357D9DCB04D11FF62
+:1021E0008CCB477462A3A9D92E680EEE06F00BFAC9
+:1021F0007A100C17E37660012A5080426FA39E4C40
+:102200009303792FA3530657D3A7F51F6F8DC06B88
+:1022100085D79F8EF7FCA9CC43AB265D61797DF60F
+:10222000C8F6458422598789D77C670F22F8B063A6
+:102230006FCE6EB7FAACB17F7484992CE319506BF2
+:10224000B06BE59E05DC9E8A0A0F388D2BB9815F45
+:10225000BBBED5A9C18A24D9609B60044FCDC95C9F
+:10226000DAA51507A826DF7A653533F2C97BBD9359
+:102270000B0465EEA850A5D3BE6ED52E3530B04800
+:1022800027A5916943C83AB59765B1CE9BB8907CB4
+:10229000A0147DAB42B4D8BE011EBB9A59E261F7CF
+:1022A0004D5C1B202D9539CAED6A12D67679179CA4
+:1022B000358C98172F388F6E3E6C28FA3CD986C81B
+:1022C00004B467A3CA37255DF732FF1D90B15B10D8
+:1022D0000E0DEA7996E959E42C4A5FBE65716D836B
+:1022E000871AB95CC696361C914411543D63148418
+:1022F0004C78AF8EF2FC906614182921FD125B9683
+:1023000098E122F37426FCADBB2F574E738DADF5CB
+:102310000C2D5247A5A7E893F172223EA93CFAC7BB
+:1023200060A9A378327F8676B145DC1E8843052DEF
+:102330007A2243F54510DCD306BDEC7712EAE93981
+:1023400064953B1EB9F68684CDD2940A61185C7BF5
+:102350005EFED68186706483BF3C973EE3D72A85B4
+:10236000E7D5AAEFF129192D81C217757DF7AF8C3A
+:102370001326E57460B61CF051689469C854F6C120
+:10238000205EF77212C9B394FC65B04F5684CBE05F
+:102390004D2A9D023322CBF2263C6821FC66DA26C8
+:1023A000C4E82DAD587CE381D110165183ADF9629C
+:1023B000BBE430CDA382428A584A289981B75CA6F3
+:1023C0001599FF9A0EE1ABBAD6D601AB946C608931
+:1023D0000C6D14839E6142E91D00FEB5D178C71BC8
+:1023E000EB0DBAB11FA6BF60AEF12D5D0245BB2A51
+:1023F00067437892699841BEB7171050C433C945F6
+:10240000B2BDE2AD4C6A90760058F7CC18B43C46A9
+:10241000C7413922B4869CC0F49FCE958A29149C6A
+:102420003A9B77811B1A95ACF8C5E05F5DE31320FA
+:10243000FFAAD24014C5511E37030EAC55BAB137AE
+:10244000884E27EA38F9D865B922BC61262197352C
+:10245000F77FEE57B8CE7C59403AAFAA1313C54E5A
+:1024600043A4C683083A31DD5D1A41D3064398EA96
+:102470008D5E8FE139E50FCDF879F34571F4D12DFB
+:102480005BD2A1690D7F45BCDB9ACC64EE38169F08
+:102490001D3306F42F92B128FA5B3592556D620612
+:1024A00068B6A4FB3709016226F5CD630BBF826DC8
+:1024B000128F15FD45BD7B7B322BB969818629655D
+:1024C0004CED54C010F4EE70B552C617DEA95EBFD5
+:1024D0000E5CE827A99AEBB193A8D1A952A471C6C2
+:1024E00050A4C1AA4B97D429E3D191B99F497A430B
+:1024F0002CF8DD88DF8B5E8F36CC186A54FB17F41E
+:10250000EC43E289A61D8C4E4887923D3600C22BD3
+:102510002F9B435A72FE4BD9493C755D1E9255075D
+:10252000AD9ADD7AEC3E2B89DF7477BEB6DE94453A
+:10253000CC4BFF3D05C214D5D929B9E44D235184B4
+:10254000847ED797602B57953C1B63820D409A621F
+:10255000818004D2F07A36BAA560B67E7BAE970C45
+:10256000743F38401C442E256DCCEBA1A847ADE943
+:10257000E820EB59BBDC5F6D165989ACBF9F5D78D5
+:10258000253CBCB304A172E04890E5505177144655
+:102590006C78E675515393124F458D9C20EBBED35A
+:1025A000D956B2E09A2866D770EB0FE04CF3A9F940
+:1025B000E55778F45EBC4E112DFA2A056256080FD5
+:1025C000E2524A5FA3F7B873A84ADE923442121A65
+:1025D000DC58FC0203139976DB387386A56660AC81
+:1025E0001AA9CCD0F7792641D47EA5D611FF731352
+:1025F0000F9EABA7653266C11727B2DBA6A8C63D02
+:1026000045FF3EF14FDFC6575673C15C92CB8CC677
+:10261000C456DFDB1781C1E6566712237BDA74F5F7
+:10262000D0F023AD5EB7EC08180FD88E4D159A91F7
+:10263000D7616AD7CE9CDA76E9D6910195C3146446
+:102640006E657531D1041E85A6727B08DCB84660C4
+:102650004D11C1C91F691344D83D222A0746126B88
+:10266000E8408A76EC2E73A96CAA04374DE0232C3F
+:10267000D10E497DE52F196EC59E5760116486AF56
+:10268000D323CF70E566D48F08C3282EA616DA07A9
+:10269000E8752C6248CA7A5ED51946DA40B57FDA09
+:1026A000F819B0CF04698F89DCA413470F0ECC9DB5
+:1026B0001E3B8E237BAA0BAE9F5B080ADFB0C5963C
+:1026C000BE14CBF66ADD395A4C0401D8E9E7D715B8
+:1026D000AA846A0CADBECFA341E9E64384BCD27B99
+:1026E000C30F57B55F08716E2A63876F6DB47DEBBA
+:1026F0007C5FA43403B622A36B75AF773BE4DD9116
+:10270000BF3D1D8B1CC9C13B28633EE455AE7A42D8
+:102710000F068262A35AA1C8230AE0AD7862018342
+:10272000E3FA3F490191A760CE067ED26F378EE96A
+:10273000D1B56FDE9F52200ADDC6BDD31C9DDD3FA3
+:102740004935AF7380547AFDA8E17C222045FA3DDB
+:10275000064DB1A2071BF791ED0C579446D2167A9D
+:102760001CB81232977C842D69DAF3E043D1376EBE
+:10277000B1F80640835D610543340DF85C6675A7CA
+:10278000C8B00C6F1E1D9F8472DD96D8F445A4C19D
+:102790008762608759D90DD706FC44CC22A553ED3A
+:1027A0007A651A2B448518B4EAAE1D01F40886B781
+:1027B0004681AC22E21197F2CB272660DAA242FED4
+:1027C000940ED9AD599AE0A7AFFC2B4D84AE1CB442
+:1027D000092046C9DB01AC0E1376626AE3CB23EE17
+:1027E00049640F662293CFA468ADCF38973B9AE730
+:1027F00039B5B0D053F7D21FDF7C07291CD419E2BA
+:1028000071486EB66E76F9FC140D26F8215F8C784F
+:1028100082DE31C05B97C57401B1E05294C523A438
+:10282000091B372B70EF788C2CBA556030CFEA3407
+:10283000FA6FE2491A1C81DC883119A6E5E215E13C
+:1028400090F6214F79C5564511DE699A9E5901AE21
+:10285000C26F582B5670BE8E21AF3567361B737F03
+:10286000784944A23B57FAEFFFE8BC9BEDA7B98635
+:10287000CF98CF36B5373C22611E3F4F510A3A15EB
+:102880005D9D408910FB5F83DF18A28921E361DF32
+:10289000862081F9BD8A3F0D3EAA01B40DA625C44C
+:1028A00086D4E84B0C5E35C087A398B099641FE3CB
+:1028B00032C1281D705DFC9DAE2CBA09E397816D75
+:1028C0008DC33E8D44B6D1726630F2F8CE4730D417
+:1028D0000E29897791D29280ED01C0261C01DD1D61
+:1028E000DA64D7DB76062F81E994FDB1A6967F974F
+:1028F0006546146BC8FA9350772C938284315E8DB1
+:102900006F91998A70769A6F62B2A6EC3378A77548
+:102910009E2EA33134BB0553B7D00BA04A1CD3570E
+:1029200097235FCBD72155CA615122FBFF753D1C10
+:102930000615954995975E0D01FA3F70083710F01E
+:10294000BC9042117359E6249597E901D633E0BD56
+:10295000339E3DA0F6A3CC010D640F938849C5BDFD
+:10296000A06C870064A8C7CBC5B5CC985BAA76D607
+:10297000FB05164B715A9BCAC931F7FFD3D1BD3144
+:10298000320B891FBF9930BCB3147E6AFD45D85302
+:10299000F5A27D4EC095107E3813F9878CAED731E5
+:1029A000854F2156D9FF1E0C3EAFBBCCE9B228A201
+:1029B000D0DE070A34ADE987EAD3D59F0EB533F4EC
+:1029C00042E11750C1D46F897F248BFE118D05F62B
+:1029D000ADDFE4AB27DDFFFD4C7671627889E5431E
+:1029E000D8022BF51DAC0013257FC1BF0EFF204D73
+:1029F0008D5BDE7CD8B92C3E7740FC3EE4F73B3F54
+:102A0000BEE17AA1DBFB58D6C6EF389D897001F490
+:102A10005559C32F267338CD1352B92CE5EDB28129
+:102A20004492A80A2126E5064C43DEEDC85F4CF12E
+:102A300042EDA12A7D3DE5095AC0DCC14785A87257
+:102A40009DC5EB1933F2918F8513B5EA3753CD420B
+:102A5000889D4FE23BE8047BF834CE42100853E8EF
+:102A6000315F3B3122913B3921E9D5AB572FFD5ED8
+:102A7000503121F9B650DE90814B3681653B76931B
+:102A8000E4B5620A899221024D5D66F6D612311BC9
+:102A9000A632EBAD8ED29732E4EE62603FDE56CACC
+:102AA0001E4350F533055DE774C49D9E6331986104
+:102AB0004D65967504CAD32A2C0EAFDF6C7D7E90CF
+:102AC000672D163F64906544DE9A4DDE6858618636
+:102AD00090B6C88CD1BCEA3B49A9A1D4C5D9792FFD
+:102AE000424AA4629F40825B4548B883D73035BADA
+:102AF0004673088EEAD65A3825E68664629F4B01F3
+:102B0000825635E9AB25467F9F41EC8C27BDD06BC3
+:102B1000AE959484C9B4DDCDBB036B7F0DAFB70711
+:102B200040CD340FF62F7E8B701F21100FB14AB0AD
+:102B30007FC6A2D5C1710979DD9F80B8AEC98F511A
+:102B4000040A0AAF2DC772F9DAC8D28887567BBE4D
+:102B500007F0523D1D78606FC61AD8CB8DDA3B9ACC
+:102B6000EA92A9CA63EA84B369FE33BE4755EB15FE
+:102B7000584F3E8F44F35B686C3EC78F9019398085
+:102B8000AD213A6109FB0FCCD40BA52273A926C154
+:102B9000DAC6ED3602F4D4F8A36EFBD2157D856A51
+:102BA000A9AECF61E0312AA07818FB21502B548DBB
+:102BB0004E0CF7E9DEA2ACA7BFC983DC5CC3DEED37
+:102BC000FC2F203F0A8F1223892E86DD7BE6E56DE0
+:102BD000D365CDFD2230CB7385200089B7BC1A7D2B
+:102BE00018E49C2D6BD4832314E61ECC8F4669B861
+:102BF0009FAB60AF8EB1B67EB8C3FC7963BCB41234
+:102C0000C919146701D301D020171C4D01289384E2
+:102C1000100391B79B7588DB12AB136AE5B220688D
+:102C200067A3A022F91EE504321C6A3A6538A3A501
+:102C3000C7E235CE5ED6E9659BC89A60FDBF4533D5
+:102C40008317C6862B9DA6AF6A65DF7E82BBADD497
+:102C5000CE6244C56CCD2D34684AC81ED524663278
+:102C600017403E495A2482A2014BEAF5A81770008A
+:102C7000DD1D0339DBC068E3D8FAB88C1BBD55D421
+:102C800022FAFDC531F1C511FCC94118BFE8C9D30D
+:102C9000DFDBC535EB2534715A54B06CEA0D2BDA05
+:102CA0004540B2154557B84959D4D0866645CB4DF5
+:102CB0000693F33FF26355856D584B97E10ABD1CAF
+:102CC0007F1CE683558379C2739F9B2E74815CAC15
+:102CD0007D96BE07DC93506A3EB335DCCE09B498CE
+:102CE0006A12EC8A7AA78232FC383981922EBCF1C2
+:102CF000042823DFC621B8E42947DE5592277AD27B
+:102D0000B8038BF4AE6F224384555D8D3B8836B794
+:102D100005C3A474670C2CB2F679F78F02C7978CA1
+:102D20008264528ADDAB97127421497723DCBD8619
+:102D3000D80C06A268A219EF4927F9BBF2ED09F8F1
+:102D4000A85E65BD1C01AFF93CFA4ACC73AC9E2C61
+:102D50003466AD234FCD4C4B96ADAD1A4F9B033F20
+:102D6000113FC4C78E50EA62DD548E04FD0ED8A612
+:102D70002E3D0BED2AB2D6A6C0F16D4D8FB878145A
+:102D800076044E142DD87912A61F984E2007714D47
+:102D9000185D449034674CC9B5F47811511A9CFF02
+:102DA0003E9FFEBDEBBBCD3F45EC60081D6F46FA74
+:102DB0001A7CB7DBCED807F46808716C51ECEF1EB3
+:102DC0008BB6DCB692E3C91D3CE9A2718D9CCF772E
+:102DD00002FF82E2121D00C6957CC795C421BA4B42
+:102DE000098E08265A4D47E8881442696177DCE667
+:102DF0002F8B9905A2E437ACFF59C130663730B24A
+:102E0000CBB6A2EE4AF586EF3780935391799109BC
+:102E10000DE37F4DC0BD0F11BA8CF8ECD5E35B8894
+:102E2000912B9F9D04A4D05C3BB979D0BFA6DEB3A3
+:102E30005D0771DD844902A0398C2C58457228FC4D
+:102E40006A6A484456E1C6D1D96330568B2DB059D1
+:102E50004279FEDDA9939AF14522C3D07AB054108D
+:102E6000D453E2195042E469207AD8B87AA2F765BF
+:102E70002CA28F0A1ADE400136CEA51122CF5C9E0D
+:102E800066029C53C06F8D7B72B0EE729B96C899A0
+:102E9000ABDD8BD26D6E0EDB1D8FE8ADB6BDFF9442
+:102EA000C907CC80FB99088EE2A44532ED8B62EC19
+:102EB000392BB338C4154F41FF7C1252C88834F502
+:102EC0004D9364DD9C57C74957FC5A059B8F3B3D8A
+:102ED0001F120A0C08B0E45B479A9F63A620BEF657
+:102EE0006C3063669B2A236685B7EAA5AE1DEC2C81
+:102EF0000FDA412C85CDBE62D06D257DC1FF797280
+:102F000073D32B4419F27F3049922EF2A10DFAE8C7
+:102F1000ECFCE0A14100E76C99BFCFCC077FAA652C
+:102F200099126A6AE186585543C89104326F8677D0
+:102F3000EE5FC37B15024482C34F57A63655E3307C
+:102F4000B1A986490DB58902829FEB9369C8990D95
+:102F500059415B2F6B101CC834C03A54B64DDD2666
+:102F600030372E24DE4C4CE880AC87D0CE5F6D65C8
+:102F70005D3E92CACF2EAA9554DE89F84E332A942C
+:102F80000262FFB1D91669846DBD428CA968F679D9
+:102F9000D75DC221A04503C14321BFE9470C698D1C
+:102FA00048B7F865F7620097D6ACBD13367C43048A
+:102FB000979F6165370C24F48E1D9360D264C554CD
+:102FC000883C8206305881BFB606C0B62C52FCBB86
+:102FD0003A6E23B6C76CD0DC5FFCDFF7E5E1C8775B
+:102FE0006A8B8DC6EA63350AEE8E1E9ED2DD8A3864
+:102FF000FEA80F1600A11B4859B7A1EFC704DA7F3E
+:10300000430D6F6A80AE540171CEDC30396A0735EA
+:103010001859355F2E0CB5405140E18296C3216EA0
+:103020007061D24639C31953939CE2048A9AFD42D7
+:103030002773D7B5AD09EFA1DCB07FC4B04B6632C2
+:10304000AC415F1EADB9564E8588905C059E9D9043
+:10305000B63F0D9BE99D2B18D3405742A618867E9C
+:10306000119316B6670A2B2DD721143FF3AB357D8C
+:1030700065FC54F98BC83A192770C59EC227AB006E
+:103080003EDD1542DD1E58B7B5E404D6F320A3E2B9
+:1030900055EA4EEE6EBB02D916297CBB09EB6B29B3
+:1030A00044299CBCC864EDC72130685A525DE136A2
+:1030B000A8D3414896433BAEBE297E4C55332815D4
+:1030C0009C48EBC28A064B450E551C7CFD03C0ECA8
+:1030D0002F2D2B5B7580303D6CB26A6ECC2B4A9CD9
+:1030E000A248DFEE971F283655A7FD445D614A7F51
+:1030F000DD58F8234C9685CCF1B649C21B303A8C8A
+:103100007929B5C501F4B2F8EDC2AF02C3B9B75819
+:103110002BC76E755F707525143B225323792DA044
+:103120000DEFF22E782858140ADF87AF735585FA11
+:103130002E1803E4CBF6E0F339E4CE60772C3F2C75
+:10314000B3919011F6F0FB8017899ED462ABFD0716
+:10315000111E30F8F4C007BDAD6988B00EFED1F77E
+:10316000634CAF8E7A97331076AE2AB913D8081015
+:10317000699DCBD29B82943E53B5844FDE3712DFDC
+:103180003785B7C662213883439E99F3F810E587E7
+:1031900013198A76406749522FF23E9E696381CBAC
+:1031A0005C593F640ADC35F6BFB44BD7962473B242
+:1031B0003B2DC97A97233E1E2BAAD04F738F460A08
+:1031C000E3795ED5BC45CA76306CB8C6818D70593E
+:1031D000BD5C0116C953E198FD34D32B0B278648FB
+:1031E00025F3DF3F0B4A25ADF939F481B73EB59D94
+:1031F000ACA82F81036C0B66D7AB7EF946E259BBB6
+:10320000AF16FF1EC18E8291B01B3A3A9CBF5F661B
+:10321000ED999BED3F47783F8B517D9522FB98833D
+:10322000C5535D81A86C39586C3EFFF63BDBCAFC88
+:10323000F836FD495CFC8456A8BB6A0D087B11BCBE
+:103240006BDE56FA94C3F9E80B742D05EF23D09387
+:103250005F34B659EB5316B85D29AACB26849CEF90
+:103260007AB4DD0BADEA5529F6982A460EF5367D7F
+:10327000A6A9E0614DE90FAD4E19D95DE08A05219F
+:103280001F9576CC2293F9A8D24B092FA257D66D61
+:1032900042CB6C2040A577DD692E856AC04C1B228D
+:1032A000CEAB4C5B526944B2C2D68513F73C67D3B0
+:1032B0002F5BA203D26C51635CAB00EFA5769EEC52
+:1032C000EE1C25B2E917504C60980E359A4A69BE3B
+:1032D000732285B6D29031B8F6D3F854438895C39B
+:1032E000B0FFACFACC6DE2AFE995C2ED6F5CD9C42A
+:1032F000BA588DFFE2A621125DE1319DA6F9045274
+:10330000AA16B0CB61A1C08CA5810447D6E21504F2
+:1033100078AD9F4F05127EDD6FD32F2871D689F6C9
+:10332000E1879516990F8FBCAC1E9A367FDD648EAF
+:10333000613F15F98D0219A21CA0E45556B9B1F5EB
+:103340006ABC08BA5218B336103F31C63882C26719
+:103350006EA9D32D86264128E3011290DD0ADF7283
+:1033600036B1B1AACBFBAE243C4AE181D4629B7555
+:10337000DD33295F5C6279B7234DC1AAAB54C547E1
+:103380005B866B16F7891E896C8D22FD26C374A996
+:10339000B3863FB35E9285A4DBF62D0141FC2EBAC5
+:1033A000EB71CDEC6813B2A82AC66D8EEE55707E17
+:1033B000102FF018DA751B9FBA423C8CDFF289A4FB
+:1033C0000390943D18A05D249EC2A1C1AF97D885FB
+:1033D000DBF178B3EBCAA63E319FEB7CD46CBDA584
+:1033E000D403C18BE5865A859C850F445D2D56E933
+:1033F000CFE9598A4719F4EA1186F322A4AE81591C
+:1034000051A2B9CACDFF7929947DA4F9EDA862AD86
+:10341000221592118E9CDF77C6E83FD23CDF1D3C1F
+:10342000003DF7694F23C955C2FF01EBB46B29BFBB
+:103430001D1D8CE45DBAF9FF1066634877FE6E8F40
+:10344000436EEBA81DEF51D78868D604782F632B05
+:103450006BE37A25F23288458D534DC279DC22CC5C
+:10346000EDA686BF781667E92C48E3BE45ABFFBCE6
+:103470006CD78DB618706EABB940C86AFFD8AF165E
+:10348000272EEFB694086EEADFF31C2752D2E33200
+:10349000A616491B14FEDABDAC522AFE22676D75D2
+:1034A000635210C49CC8F3EAFC288E22502DB0EF62
+:1034B000EEC7E4008AA036255A2EE898C8726AEB57
+:1034C00090D8696B3DAEA7044E3F54E9DDD56C60E2
+:1034D000A20EB60E2DFCB943B28E200CCD58E74794
+:1034E000D502ACBE59E80753FD51DD1B20598BCDE9
+:1034F0001DD9BF49AA1493C376B630E2BE724A7191
+:1035000060FB78D0E2E7A6CACDCEF819199C73AC5F
+:10351000E05B2077B516AB2E95FCBC988446D5CEE3
+:10352000BC4321D4BD6A139437E52AEF0BF12A4E30
+:1035300053E98785B925151FA5473942391A87D719
+:1035400078F6A7A34815ED7FA17B60EA77A4173E24
+:10355000E68A973315DAD56A8CBFB2957F2B7E7ECB
+:1035600018B1F3ED146E9567257220DFA98230A49F
+:10357000C21784B4E73F36B69917DFA98C9CD28C6A
+:10358000C79CC7543099360D3DBE428AE286A5E1FC
+:10359000D70E97F7E0FAA57210E87369CA6707209B
+:1035A00018F7EEBED372C574D5CDA872877EC574E8
+:1035B000C57CDE25AAD1690C19F6CDEF9FA8E82CB1
+:1035C000B763B392B31B7B125FBB90201BCC5DB47F
+:1035D0005BA08028B94B4364550807703FAB80B8A7
+:1035E0003C8DE74C8F2ADA40A2BC0C89ACE6334B09
+:1035F00022326FDE061D0257E71EFE2EAD0682D375
+:10360000FD35214BAFAD8EC2914E1FFE09E241C583
+:1036100051BD31B676B8AC4579BFE5411E1B2C478C
+:103620005D3B2BDDCB0F9EFC254E1F80C9E70EDED8
+:1036300071142774832AE340CDEE31074B5E9088E6
+:103640002FDB666286A8D15F30EAD969F2DB980782
+:10365000F8D2D50EB5505CB894DAFDD8551C9AE571
+:103660007171C9D44EEACA9AC03576ECEFB9B2ACE2
+:1036700079AF411A6400DA29D31DE5E43FAC4AFB77
+:103680002A4219363BEFBF82E30E4ED8A8646CDEA7
+:10369000EFF28676E585F95D4DD052368D95CF4BAC
+:1036A0002E7099607CDB6D95AAE8D3C442DC8489D6
+:1036B000B4D9CCC0C4AD673BA1F0594E6B0458C817
+:1036C0006359CE212C63C81DBD135BE66A9C20FEA6
+:1036D000758B39A9E44A75F2966C4E797BF7068DA5
+:1036E000115037EAA8097B2E5CDE9E6B6F6C5AA4E2
+:1036F000E0A12ABC5E90E82947C5347FCFC251447F
+:10370000B2E1C8F315D87EE979035D34F7BE9F991D
+:10371000B165D8F129AE6A8002EA6BBF2A426CCD4E
+:103720005AB4F3C55E7894C91750DD1A2E6A61E564
+:103730008E597E2D90B87D7FF58E977BEB965782C4
+:103740006285CA290567F563014EEF79E37BD55D94
+:10375000F99DA43647DA3726E2C1461DBF8F161100
+:10376000C1CCC5FAEBA72C9640C498AA409E4A52F9
+:10377000113A9125AEC724C66AAFF3E1E5CF1D9497
+:103780002D9E83C5888B99104CAEEBC2B4B0079BBD
+:10379000D0F1BF921607C9FF212AB9EB233BAAE655
+:1037A000AACF1305138AE744B7E6DC42D2F5A63C5C
+:1037B0000E46A4EE2127B3A63168627E8E7D9D7DE4
+:1037C000C2B24B091678279DD082EFC4AA72280D89
+:1037D00095628E1D554B37CE00D16465850872C346
+:1037E000E997497CDB6340CE08902CE250D0BC06C0
+:1037F000B691CF0205CC9270294F1A718A8BC5926F
+:10380000EDBBE432D3A6A153AD72BAE43438DE2561
+:10381000DC9C71E9FA7C9E1B9BE561CA15782CE162
+:10382000231508DADED96D56CC1F227DB0F17C4716
+:103830006A81EBC37BB31F28112823DD3E08B492B5
+:1038400033F7FE2B6BE711330ECBAB708D774EE960
+:103850004FD66625C8ADCD9D3F7F7B2BD92FBD3E72
+:10386000FCB7E40FEF951846F3A0BB83BF03A14F4D
+:10387000059779A35FC235A048779F8DB4747C6BA0
+:1038800065539AD6CD8E0BF53DE512DC777363E078
+:10389000AE1E995C78C1608D2B0CF804AAAC03BAFB
+:1038A000BC13639C8890DD49162EB8B3D606D74763
+:1038B00012BA91BF27904C35376ABBB83607F277FA
+:1038C0001A49C83EA7B7AFEA90081371F65EFB66C7
+:1038D000FD1F302674D06A4935E946F991FBEABDEF
+:1038E0008AF8E400A8E79813E69DD3BFE49EDE1AA9
+:1038F00010EE352FFDAD7794A06062B3E07A06FD3F
+:1039000090520BCA89ED1FBF4EFCD791B6CE61E332
+:10391000794CAE93503F90AE55705D820CFB24CB3A
+:10392000337F87154533D69FD774277CBFFA184954
+:10393000FDA723E3B16C42488930A666357D17A9FF
+:103940005EE99026F6D772B9B1829212BD10FA14D0
+:10395000415EE93E98CEB00811019DE429E1283C82
+:103960007C68F0FE74CC6565998153584BD1B2D513
+:10397000824E94F7C9E4A4FDDBC218C3152C551F71
+:10398000749D72874B94A6E5B1E5D48947AB06D701
+:103990000C1557E13FBFAF9C2B879E72C8A82179B9
+:1039A00041FA1C7A8D51814764BF279A694C168E63
+:1039B00054E9E5AC6FB74BA2BCB66ECFE6ADDA3BCF
+:1039C0005C1B2334B5D169CFE504CF43EF9011D60A
+:1039D0006188BE2820DB25E4318C09C577379B48F8
+:1039E0009F0BCBF775B5B77790E45310113C045695
+:1039F00066C9E2AD36DEC33F26287E4835ACDF1B04
+:103A00002212C67B3C38211C932C60016D4BDB9E3F
+:103A1000245D72E86F335750DBA2643E4119444580
+:103A2000D0934ED8A0668DF85D55DDBD26DCA35938
+:103A3000084E89CEA09D9610054C3C8BF1D29E9DE0
+:103A400012DC40AF3F05881399405871E9D410CF7C
+:103A5000D5C25943EC15E4CCC19A38BF6769A78732
+:103A6000BE58971D447CC59CC87D9E73AB0C003925
+:103A7000128992998E2B95164AEB72204D12A298BC
+:103A800096CE23813C82C5C7195D141E87611B93A6
+:103A9000C15AB3A58BE92E3481DF9D183ADF374137
+:103AA0001F6DDF99ECEEF4D3D3D0AD35EDF9656140
+:103AB0000E100560784DE871436751481603FF5EAC
+:103AC000B9BF31BB94B5646BAB67953C16719989EE
+:103AD00069C586C854F95CC6DC1B143962CE14BBB8
+:103AE0005E5012C57A419F6A695186F64B1299E77A
+:103AF000384304C4D0026B7006D8D22158484DB068
+:103B00002440221CAB042986AE52F5C22AD21C8A5C
+:103B10008320A40E35C3ADC55404BD63D64950BF40
+:103B2000D5A2161E276D1F5D8516AB1842C64082B2
+:103B300029E45022D2D6E47CF03940D67F9C75B57A
+:103B4000800156836B14283143618E39FA716C8978
+:103B50004EB30F207F05869B99E5035C1AD8953DEF
+:103B600032D88289ED54B9E4F2E8C53AE591BB85D3
+:103B700094ECC47287DACB93350B060E7CDF990484
+:103B80000AD745F2AB01A28D31B9FEE2DFF5B88C60
+:103B9000FE19E78512EE814C0D5ADC1F766D704CD4
+:103BA000CB0AB01D303401126BB313F6BA5D2CC4CE
+:103BB0001F07721CE330DF98B70774A955E9CF30AF
+:103BC0004A4AB640C615BB248925DDF7999173345E
+:103BD000B89C46870A44A9BF7C7691EA437D3CD1D4
+:103BE000DD3723116EE97AB93CB0BCE4E8E899907E
+:103BF000455D95E2A39A1D6B3763BC9D8139E6F163
+:103C0000E1CBBF42E1A4EEFA9D2A5DABD6F5924E20
+:103C100087A66EB195EA7C53599BF990C34337D37D
+:103C2000AE5C58DF29AD3F52CA010811CDD219E56B
+:103C300089A9B0BB19283036280C1CCDD2DA3187BF
+:103C400098FD3D1D0DA54B7B10BB5AC99C91B4AE90
+:103C50005D399FACCDE3DD8C668F8CA7B4BC8C4204
+:103C6000B50078FB2FD931D1A7A153CEA5D4AC7A1A
+:103C70008DE6486F609FEB4DABF5A8A2CBCCA19928
+:103C800015B00C37AC647A039AB6EA48E90C4633AF
+:103C90006A3B0F044B0592E42EC893DB8707C921CA
+:103CA000504E5DB778A4A27365BF8691C028973D3A
+:103CB000C146CE1656AD4F8944366CC00C1647B679
+:103CC00036327771C93A4450728AE7F88A312D65E5
+:103CD0007AF73291840AC1B2E4339D77DE9EE8BC64
+:103CE00004251F3AD949B3E966AE2BDE0512238CB1
+:103CF000A03A10F159742B19DCB9573E543C6E08A8
+:103D000079C2238FD0B3731FB5708ECD5093748753
+:103D1000782A417A06EBE4DC7F022BB0E1DA8CFEF4
+:103D2000EAA9C8725874390E5F4942EA25A37A6538
+:103D30004A2B88CF62B8182BDD9D42DAEE6513E37B
+:103D4000D03827393258692C5F672D55F1A1620BA5
+:103D500063375FD1FD4C1C757F011540FAD208AE68
+:103D6000B0DF85CEA87EE8E668BA4AA9B020638BAA
+:103D700085BE187CB8A1AFCC2A6D5F895998FE0E1C
+:103D8000DDD1D626471F22445366310870ECAD12B0
+:103D90008AC399649414A6E466E8168FBB0A65C7C3
+:103DA000D80606CDF8091E4C157890FBF7BA9C3C56
+:103DB000FC48E57B06459FE897A60E7609639A9F27
+:103DC000C1D5BC578C3171E305C41B526E3268C833
+:103DD000C4EB98CF5EB8DB3DCF0E9B13AAB02DE0AD
+:103DE00056B0DBDA6EAB95B2C1C0283FF70C6AACB7
+:103DF0005CD63668E0500264B7B56E289F33C15F69
+:103E00003199A140B76F993EA68B7E6094EAE34654
+:103E100085F685E2F6DC4DCBD04B3DE9EA605154A6
+:103E2000AD4C51B28D9084EF1E6FB1064008B1A524
+:103E3000B7CFB4B5D426E559230C4D8F992B7A9C76
+:103E4000280EAF828186BA012EF8049517AD0FFFB8
+:103E5000BC32FCF834039A1E0FF375D9B3AAF91AD1
+:103E6000A209DD93EB74FD1B9F14D8B9CD85E7BD86
+:103E70004799FA6B88682380A512256AA274EA68BC
+:103E8000AA1A9478FE2DFE55488AD526CF3806CA40
+:103E9000D155C64C91474E5BBADAB82C3348F95D20
+:103EA000EB48A3AC38ECBB8754EDF408CF6906159A
+:103EB00082CDE5137214747E1DAFDA323F6F6E5EF1
+:103EC0009EF789E7AB5007D8A81FF66CFB6F49DD5A
+:103ED000CF01C700439B9E0BBF2D2F31C2043AC3B5
+:103EE0002BFB9F253089D4CCB9BDF0EB2D4A8E3CFD
+:103EF000D4041A65DCF32E434797506A94B596961E
+:103F00002E3B9EE598B1586055C6C36DDB412281BA
+:103F1000A5B1316F20848FB53B33EB377559F74529
+:103F2000978B6637023C3B9BCB51ACCA10CD10132C
+:103F30002637C1C56D998F238510683C25C52B1187
+:103F40009C11567BB2F494CB49AD0FCB3C005A3E4A
+:103F5000CD028E02A7EB1E65DCB12DEC83B43936A1
+:103F60006C475F9336766032D9B65143353C547511
+:103F700063EE41A7F2DF87F65FE45DEEBB268A8839
+:103F8000E23496908D22F0E21DB1160D379FFE5857
+:103F900035539C856E6772F525A81CF9F82E2EE422
+:103FA000BC84B8AEE31CB55FAA46DB794FA5327876
+:103FB0000D5A66D48F00C750D58C65806839E5BB33
+:103FC0009635AB2C509F4E08CD68883CAEF3FFF67B
+:103FD000824B940FE0912F5A8018145B14DD41FA44
+:103FE00018389BDFDA4366B49005A5B23EA495FF6E
+:103FF00072244BD5C3001E4278FC13B50D3C95B519
+:104000004355B8AB6601D9EC622FE3BFC3F90A6030
+:1040100085438E6DBEC13D24636396E85D17D871FC
+:10402000E637FD9B78B2CAA83E6BFA65C983914218
+:10403000397A0BAB722A9E105FD5B368B883CA6217
+:10404000638A104CFDED84B279BF72C571AC730206
+:1040500082B515CC232077BE5A7F2C1BE76A8B983C
+:10406000D0EC56183D9D3F8D710BF1335F40CE7201
+:104070005DA4076B6686DA080B92E9CF983D1CC1F8
+:10408000CF425BC92E7D9132E28D1E2F3D5B9F9BFF
+:10409000BECCC20E999533D827FD2807F278B420FC
+:1040A000FDFB8256DAE37205DFEAA2CC1C68795D7B
+:1040B000C230A4DF0003BD4375E1915D12A372E934
+:1040C000817953C604621EA2FA5FD060230AAEBF94
+:1040D0001E0DA976EFF20E24AF9BEC4850D45EB9CA
+:1040E000004DA43110105901C53D91D12D32449A93
+:1040F0001DFA983AEC61A1606CF85586C7ECD75B65
+:10410000B4BC9371FD665A5D4312B43C2049F97406
+:10411000A90E80D87DB9D8016939CA3DC6F59ECFB0
+:10412000C8636CF17D2ACC4BFE9EBD82C2BB37BCFE
+:10413000758FA43C7E474E0F6F1BFC224D2ABBB3EC
+:10414000CD465C290BAB67D9D07B689DA85C262443
+:1041500012F3AD6C5CD215CD0DCBB31F5C2DABCF84
+:1041600033ED35F59B26DD19E7CC8EEED604929F14
+:104170009CF5B1E490FAFA7BDE1FCF291DA707D585
+:1041800012C017C78539115D9A133BCFBCE2D338F3
+:104190004DB08A09FC752407811BEEA87F64C325F6
+:1041A0007289882A370D9158AECAF638097EBBABA2
+:1041B000FB743B357296A0D6605F120E7C3403E030
+:1041C00005B6B65A75D26637FA236A91E1DB6D916E
+:1041D0001DAB5704DAC2C5AF6A0F9470488EDD83F9
+:1041E00090390875B0FB5AFFC19A2E63C4BE09947A
+:1041F000B191DFFC14E2745579619BEF12C3EFBFFC
+:10420000F5B7622EE344EEFAAB5C664E4E8D00E5E8
+:10421000BAA652E7F3B52AEA297A30F135701E932F
+:104220002172A4DADCE21EA334D6EC4299A1FBCBC6
+:10423000B17FF93845B9208C10D2A5ACDD047BF1F3
+:104240006ACEADE805A80032CFDB603376405DD69C
+:104250005E424461C9C03E2DB005F9FED0C3DA3ECE
+:1042600002536AEDD5796B809053FB6BCA11B1AEE6
+:10427000BB8A13E4D44ABCC650AB7F20BB02951066
+:10428000443D724270CBB172B46B7CED88C98092B0
+:10429000353B3B7637AD10F47E2F9A4BBE62C9CCCE
+:1042A000557811B08EA9A1FC71BFE30AB84176D749
+:1042B0004EFB801C898F6312C1F407A38BA9720384
+:1042C0005B77316DEDA944D464B41265F83B673B6C
+:1042D000B3A7EE1FF5C2AC78F6246E36D59581AD46
+:1042E0008733F7582C088106E88A2EA2D5E7F04ECE
+:1042F000502131ED20DB96FA7635E1DB79D10A26C3
+:104300002F8465FBED44D8252A0D419ED0BE23D8CD
+:10431000F8DFC0FD85432F7F60C91C9C14D38E8AB3
+:104320003C14439874DA5506898875D0CE230E4024
+:1043300034D5AD790CE9D22C4CD7F882663434836D
+:104340005EA0BC92887CC3B348EB17FF93E399EB64
+:104350006AEB9B7D964912D3148DBB18F8317AB75E
+:10436000C919B120ED23D3A339CAE6ACD83B03EF7A
+:104370006E5E2AE6D0258858D80D154609A7E88430
+:10438000AC15144C02DC98206E7ABA26FE73DAA9BA
+:10439000CFECF8C0F9879D03577C0416E0CFBE54DC
+:1043A0009D8676DD5792658AFBD777FBCA25417BD0
+:1043B000F7B9A02D0D37FF766C38C8011406A83068
+:1043C0001F4CAEEDB43B80D83795B775862BE339DB
+:1043D000EF19779BD8BECAC540235AEC5FA1B6DF60
+:1043E0003654CDEFCC74C3B9E853B692E16C633662
+:1043F000C62A3D393235FD4249C5452FA278556957
+:1044000087DED05F1A8CA37FA1A8BE32EAEC3423EA
+:1044100084DE047356864A10FCCBB05557DDA7B135
+:10442000C19846C5F5C7BC7A76C9D4FCDBB05FCE6F
+:104430003BBB60F6BFEDC768DCD255050C36AC73EC
+:1044400077882BA000A32A0B3578DAC05BAA921AD2
+:104450001C31B69E10C88EB51034C3DA7BE4BDDFC4
+:104460000B85A8AAE1C788232E8EAB3B2DBED5CFE6
+:10447000C8B15C746EF311CEECC790679B67901F58
+:104480007029374025F17790FF8BB77AC7DD2CCBA9
+:10449000248ABF827B137E5CB6271C18EB9BF2D963
+:1044A0000619FE534EFE2171F4A0B07AB37D6B0560
+:1044B000B5A4AC4C3127A01E9A7EEC1B0888C7A778
+:1044C000D1C495C247CC10C1C872BF35F4786E26EE
+:1044D000640196E1FC262351EE14C4E89E78F3CFE4
+:1044E0005DD77F94A4A8A7CB4B1105E4264723A74B
+:1044F00043BF58559100030AD1ED9ADB3F3116DED8
+:104500007E7DA9B619D7AFC031FA2EBD2DEA38D6B7
+:1045100007F8C3FC1DDEAFF1356A0D9BD7670D2888
+:10452000081421B76648058D147C71682A15A70800
+:10453000F7432782F714B46B15392953AF38520665
+:104540004F6C3951D494A5D1278175DFFFEFDFD6A9
+:1045500096EA5C24848F8F6FD2A8023989C29E8E1E
+:1045600011E640430896609A78DA7E473C31679FAF
+:10457000414BEBFDC4B2707D0C02CA498E562AD75E
+:1045800082BBA20209D1481AF9A4605E0C58CDA8DA
+:10459000A4DE25174412D94BB880E6F30B59669177
+:1045A00021E0C21BD9E18266E128CB8A4802E10EF4
+:1045B0005AE0D4A0C1DA4E959C97C2B1875B106FC8
+:1045C000D229B388569CB7F5770CDC9D6C152589EC
+:1045D00024A30E1DA278928F4CC93AC825D8CFD7F4
+:1045E000C9FACF53F1780A555EF634F074D70ADC75
+:1045F0003AA5D85A5353930F74D52B013E00798BAB
+:104600001A251DC0C0C76F5B1D515AD6797E797EB1
+:104610002648FACDF11014B3656A7DA6F897B4D494
+:10462000494673E64063489FB7AFF49E2D6CF40093
+:1046300092EDB1B9887BAE68FCF2BAFDE206C01D0E
+:10464000206646E51FE6E7051C1151247937EC4149
+:10465000A20AB2FA77B1FCD01F38A5BB3773CC05DC
+:10466000E5C2D6120C1D9FA17CBAD6381930BF6D99
+:1046700034397E84C109EC5F0FCCF91E5A529F1E5B
+:10468000FAD1DA6813EECEBAD7639212FBB2E640E3
+:10469000651ADEB9537C5138F62E04548B0182180A
+:1046A000C1115B7F231C4115A44F843CEB19B99DBC
+:1046B0001E67B441323CA5ED833CECC8C7297007A6
+:1046C000661298EC34D9C55AA53000899BAC5B7250
+:1046D000AE7FDEAEDB0B2AF57FE977DA03A1B90501
+:1046E000FFF094F694D5DCF761957B45968BF056F8
+:1046F00070FB17CB800DB08D27CDD9CEE164785BF0
+:104700000C11F7819B4B3D922E15BFE530123218EC
+:10471000642D3144422D14754E5A705BDDFBBE573B
+:10472000CC21EBC13063DBE6966A59031E7D5FE85E
+:104730009D5C68301BB869EF18CE34879D301DF63C
+:104740003C2C771BB501BFFEF42DB0D86265517BC0
+:104750008F39853BCC3A85591451F2DF6C6693450D
+:104760007A4D9133483C62E7291C8A1EE7C00959FB
+:10477000BF26968D76A66C9051122549698DD05929
+:10478000E22BA54DBFF5547AC4BD2FD3B74DE9F048
+:104790009BEA2569635892F68C61DD93FE02658B76
+:1047A0009252B1819305B99D8DE3DE7422E6BFFD7F
+:1047B0002494C591BED782A089C010959BC85C6F18
+:1047C000491FD12D0A96B995038D63B3ED7BA5AC36
+:1047D000789BC76D6D99E512725D767AC01F138064
+:1047E0005581097E9AB2AFBB23C77D084B596450EF
+:1047F00005231386D4640007431269C22DD0BF2954
+:1048000066CCB0A1EFFACBBD00AA8E860661BB9A3A
+:104810009511172612BA8E3D474B6178F7688B1DAC
+:10482000283E597A461A5E457F53AA3B8ADBE7B297
+:104830002306B6B0E57106F3305A93AA64889B3913
+:1048400020ED95F15743B7D8CB6B8616ACF6C0E098
+:104850008499397A720C1EDE4A15193AD16DEFBE71
+:1048600005C6287D9C2391F8C89C35273D271DD679
+:104870008D93132A80462390DC6F2613BCEA78447C
+:1048800026676C39644697A3D1D3460DCDCD181455
+:104890006B5331A8DD9FDA08DE0181FC71073872A5
+:1048A000BE8159939312C09DB4D5A7E703515129F6
+:1048B0009A549B070BCC363C9DD3D1E44C2A339AB7
+:1048C000B202376D068BC6619E5A54723467C5605A
+:1048D0004CB26952B69B20A4795B8F42B289C5E382
+:1048E00036E4143792A2F367685634DC45125586D5
+:1048F0005E3491AFCBED0115F7D5346CB8D704DD3C
+:10490000992DBF33F6B97FE26E2844690BE1245636
+:104910006AE521EB3CE86CE53730F0ABD677C4FFB5
+:10492000FF0C46E5FC3DE337327009958D118B5342
+:104930003E293B50237FCCEC67E866442A5336413E
+:10494000F115F4168277DD263600FEF0BDB2B7E22F
+:104950004A0648C88430B48EE610A595BC059AD99D
+:10496000D14534CF0E4BFB0DCD64760995EA3182EB
+:10497000888BA0150993794CD0B0B25659FA6921A9
+:10498000A452EFA05F3453D91970B7C7AB75958A9D
+:1049900046F585A724388000AD19A6D318E4CAC609
+:1049A0007C4E742D0EDE428F9A2F29758CF4AAC08E
+:1049B000CFA39349F3B4D0BD62D2D0C211A979CAB2
+:1049C0004739C01E9E1365698D968F4955D2826600
+:1049D0002AAFFC148DFBABF0163DF2300935203DBB
+:1049E00080CE0F3ED4B488367B662E066CFD0565FE
+:1049F000E90818A782EBDB1C2DBC16E64BC098C655
+:104A0000F99017E3A31A4B38E087B05645A5C3B118
+:104A10002DB570D9A7DCF8B9A9B34BA37893CC1DF9
+:104A200094C520237CC12E8B6C7358F7DD615DD358
+:104A300046CF53795334DFEFE8A6DCCF05D640C428
+:104A40001351EBB10039403BD501329EA37BE5A762
+:104A50000DD25C5E71103C7134BB5C4010416FA69E
+:104A6000D9CDD05A207FFE677682D79BDB17A71F50
+:104A70008B410EBBAEC2DDCA5AF7A604313B4AD603
+:104A8000D409D48ECA76563B24CBF54B9F4334B21F
+:104A90004910011C036FC851C23D7095EC4055F69A
+:104AA00042E82EB758B3F686A603CAC157DD414087
+:104AB0001BB1A74853DF02C75195B3DD42C59080B3
+:104AC000DD6B7C5A7FCC526DC7DF1082D6E259F283
+:104AD000C43A955466C17AAC9C37C5FD0657743507
+:104AE0002DDC1170D0F1FDFD696F13B32FD07773FA
+:104AF00039EA6BA36BA7C293A2460B5814D3337445
+:104B0000C96CAF32C283109D6C36B6E09D8593D6DA
+:104B100071EAAC90F5B655365A093EFF0534E5F317
+:104B2000333CDDF6D4B909870FE1B988501FE4069C
+:104B3000779A470840EF9E9DEA029C6F10A7F1AB61
+:104B4000FC5D29D23040BC256DF16EBEFFCA4275B6
+:104B5000DB0C75ECA8178D46DF7E2AF94DC20817CD
+:104B60003882AC32123B664D92EA0D4A65F393BF30
+:104B7000FF1FF83592BF88D02558006C7DE0D90D15
+:104B80001A5FA254779817A391C22D5097AD69FB75
+:104B9000BBD34C787B545F54B6C5BA125377A70386
+:104BA00065A65CA537C5C1D6D281AA9F741FF5D072
+:104BB0007CFDC19623C4B6F8DE26CFA86A90F648DD
+:104BC0002F369EF319E806209DCEF86EBD54811055
+:104BD0007975266826F7726A76FC87FFBF53180836
+:104BE0005BF48C2C534EC3682F81A6850CA75B5BAE
+:104BF0001B9016A87676C3B0444914E209227706C2
+:104C000006A003166EBFA8BBF7C2CA41E82144E262
+:104C10003D01F1553DEB38CFC28586BE31478797C0
+:104C2000BD5D8AE1F7160FBCC9AF39A30FC6BEBB85
+:104C3000018D03E59498B16EC2CD0BA9D99E62A3F4
+:104C400034728BB1A253305C42FBB4084D5CEBD99B
+:104C5000D01B2300DC1051AB5B865C734997528EEE
+:104C6000FBC7BEC0A62301C90114C7451CA4F35B42
+:104C7000BFAFCF1EC296129A8E7DC9246D8D734A26
+:104C8000BC8D4D924F3C9EFE0105A33AE48F82A855
+:104C90003DDA600E5DDDD6BC2647651ACF727BEC2F
+:104CA0004A54D375E8B750F50A7636419753D7FF83
+:104CB000FCF91F0831DA22073C85AAB34399CEE1FB
+:104CC0003E718552B47CE0B0CDFDE6CCF4E0C46B1F
+:104CD000BFC54A2E65A03A303192E2A7BF99826BD8
+:104CE000D83015D81DF947D14100C228B4EA6F1554
+:104CF000888706095F9C33C2BEA03BEBD56AFD6185
+:104D00008057D99BBBFB0F8532F5E436CF59A530D0
+:104D10009B5B67742A62E38CD5B0F27420FDF0A22D
+:104D2000068BF71781FA580CEF28F753ED38B25C71
+:104D3000E1552DC2E5DD374F4C389933B9DE0B9F75
+:104D4000B48C848C5C276C1EDF35259E1A2EEFB741
+:104D500035D2345E1BAB7DC03410F2440DE0A7D5D4
+:104D600047811AF5A5FC90713191C34B96FD139CB8
+:104D70005D0FD731A75F512AD8B27DCB58DF885B52
+:104D80002133E8B65B3A9FF42046AFEB0978B4B024
+:104D9000B77A823F46E868AF90C6613BC1072B7186
+:104DA00051F8DDAA936B33AF0C3F17BF726A3D0A0F
+:104DB000FDB87AF1F5D2607FD48963B346C96A91B0
+:104DC0008AE397C0F0085AA59D91973D86534A0BF8
+:104DD00026038A27E0241C0F3C185BDC939D0E1DE4
+:104DE0009B42C628D99B28C597CA740DBF6321581A
+:104DF000CA22C238CF141D73386043046C3FAA1F07
+:104E0000DE24804A0728DD624C1DC34A5864C6C7A9
+:104E100014CC1CE165C830CD58796CAB70423A9126
+:104E2000AFC91A8000E83C57C8347BDCC6E248A40E
+:104E3000771B2ED8292719CE170FF844820EE46B62
+:104E4000D890ACC788BB5B1A2D243368CD12568C22
+:104E5000D90CB47B69C1F7670CB80B17B6B4A6368A
+:104E6000AB2B41E99CF48734BC9F351925F7A73358
+:104E7000257D110AFAE11B01D6C0E18F1D5F915B10
+:104E80002E3D10C7C268C23693D958E59943F578CC
+:104E900023359FE11C47F60C8E53CBDF00D017A7BC
+:104EA000E8AA37EE1AF8F1349CA5B5A66E56B9F605
+:104EB0000BC4F53308E363BAC1125AD26CDBC17577
+:104EC00017F3FA06CE57805C025089654170617510
+:104ED000C57BDBFEE09880868129B373665E3B412B
+:104EE0008C06CD5E9102B24B5D1BB573F8BF62E4D8
+:104EF000AB4EEB1716E8ED7E8549DD4A0857CC3BF3
+:104F0000EFC55B481AF8E3473E175FAA9190818688
+:104F1000FCF40F6C34FE036CD0495377A00EFDE017
+:104F20009A9E8C8F12A198DB5104DC7CC60FBF4780
+:104F3000950213052EA0DB0C05341F0351E357889F
+:104F400075E90A46352AB45703A83B7177A44E6920
+:104F50007C124152CBC88FCD1EB86485EF224B0224
+:104F60004ED5E5AF6244E38A490B131DA2CD794EBD
+:104F7000EDC05A8BCF10907AFF97A42F193CE9818E
+:104F8000B2710D687F29BF946166A8368C256431A3
+:104F900036B211D314E600B66646D411D2269F0D60
+:104FA00052B67E0624DBB3E05C4C1ABE795EF3D0C9
+:104FB0000B2F7170B7C58C04C7F1ECEF667DECC3A5
+:104FC0005E726C3F09B92618974CCBE76A15F72536
+:104FD000341B906626A01DA56C5A9A389EF1BB58CA
+:104FE0006CC7C183B31758CC16F0D7EE34E3C4981E
+:104FF000495A4A5283AF4A3DBF2E2ECFEBFD135D77
+:10500000669ECEB55D75BC24E0F418A01BFDE1ECF6
+:105010000B4C182FFC4519AB94BE608057DDBA0DC0
+:105020002162C54E90AB3A690A9066B97578480519
+:105030006FF51D49BB7319D817ED7C28FEA894E9BC
+:105040006546FE2112DC634453A29C4239679DCB26
+:10505000C9936C510CB051D1883C91CF0C1C41626A
+:1050600022C042B44EBA8935C2A34ECAA90A5A997F
+:10507000ABA2DA76154FF2619E9757B046D02C302E
+:10508000B5EF37F4F6BEBD1DDF15E4C9157D71938C
+:105090003A03EB20E67B6E010E13792E27F2E68FA2
+:1050A0001FB8BD6D23DEDAC9758A430F6887071202
+:1050B000254F37467846B1B26C49D426AF6E853558
+:1050C000A3F4EDA03E432E504FF28270CB885E5F7A
+:1050D0005763214FE2D64361FCF387571DB2A8689E
+:1050E000AA5DDA9E67192425DAEDFCCA769104815F
+:1050F0003981E67DF54269928E55B2002E465D12E9
+:10510000AF9F412757D41789CE4135CBAF901AF3C3
+:10511000A5152B106C9A898A110A1FB19B02B2AA9D
+:10512000A8EDE2D641EE017A8312AC3121910C3028
+:1051300047B0A005FC6607A728D9C57491EB688D18
+:105140008A600BB0C206FDA34F572E81CA3F59D4C7
+:105150000D7896E130400D78EB90F191ADD3619BE5
+:10516000AB034819EB6EF0935AAB067A82B26BB37D
+:10517000502E770293B3D9C1E307D56C229D802EC0
+:105180006B40B161EB7843AB5FBCC764C41D197B56
+:105190007E238DFD81E731A0DC8235E1F80017B870
+:1051A0002B20E74AF3AACD613CD80E01A320FCF8DE
+:1051B000BE3080118B9BA789DB41DB4C11E83F316E
+:1051C0006522FA1AE2AAE5DC0B94CEB406D5D59D89
+:1051D000F55067C7BC8B9209C386D4E3C5175A48FC
+:1051E000BE1B57A7B749482751EEF1B9BDD4D4F239
+:1051F000B85B764A8DB862A3779BBE8F4591D6ED9A
+:10520000614CCF85496A420913A7E137940D52C01A
+:10521000F0EA5C17CE842F36978A665B8FB9B5E3C8
+:105220007B99124CA22E062690461CAD48F29FE0B8
+:105230008E820A430E3609DA9E90E79A03CB02E18A
+:10524000A9C4A5392C70DAE514F2BDAD29B49DFED0
+:1052500055C679BDC014129028261D388C885B8DE8
+:1052600017E626639FF02D1F6457FD259D7B089749
+:10527000380DBFFEFC0106579F704031C2BD14FFC0
+:105280000DE91A3605CC13BCB623AC5FCEA1712153
+:10529000AA0CA7DA52D42BD17DBAFC6B8417AFB815
+:1052A00092CBA1027B4B81A19C593F0146CC81CB83
+:1052B00079FAEF26F289F661A53B1F9FAB519FA0BB
+:1052C000BF54A786E133BEF8D0A34890967D2968E5
+:1052D0003CF6B2635287361DAF461667F477A6C612
+:1052E000CDD42D0E0B109CEDA6B8E2F14677569169
+:1052F0008F9726A8FF326044B030ADA0133A8A9150
+:1053000005FA60DE74B7E45ABB2BBC2BED9F1E2C54
+:10531000700705BB91032E372836B51D6ACAE1CE4A
+:10532000019CAD50EC3BED4A9C73DBF69CD042F007
+:10533000EBE9013BA3D83CD03E63096D945B7E4C06
+:10534000BF98A9960803E61FC0D6D7B34B3E686145
+:1053500008F5E0AF4E0A23973CBF648F55CD1A5530
+:1053600058C3B946C5C7D37A4A23DF7DAF57142B3C
+:10537000D48A76D3F67F3B3FB53311395EA87E37AA
+:105380004756AD0A5C2D3A3613A55797D42D267F84
+:105390007B7DD593FBEF44FD0B09FCB052C0A665A5
+:1053A000D984C203968B8E7F0459AC56EC015351BD
+:1053B000FE988827361AE9530EB95984518C35B5B1
+:1053C000F796CB2834F6091CED9751047681DFF56A
+:1053D00060E0277F98DD843780187A6F9E8F69752B
+:1053E0000F64124CD8CAAD706645F81B4C4A8EEC5F
+:1053F00074BBA61ED8DFB2AEF51049269A1F4DCA5F
+:10540000EBA742C9B0818EB32012E4C234FBA71FC0
+:10541000B9C4421E878DF82F3EB1EEA8A5A5A624DB
+:10542000A27509D3997367644F40B33D6F45142942
+:1054300066A2D1DAD59E6AD38C40DB992E63F3F352
+:105440007568BDE8D5C93F0A15F7E87707DEA88972
+:10545000503B8C7CD29C8F861B99BEB8806A876D2E
+:10546000F08E1772332CAE27D43EE5142A4FB1DBF1
+:105470008D95ED953BA1379097378F8FCE1FBFA3AA
+:10548000412E3DED230C5B1AFA4FED18C566F43A38
+:105490001A9FF9059C53DECF49833459F0DAD5576A
+:1054A00046758DFE97F7B8C2DFE5B1CCE39197B4AE
+:1054B0006073C012993C25A04FB0630C1BFFE0F94C
+:1054C00097475F40377A763C329CBF4ED7EFB001AA
+:1054D000E9DB93761E18A5E14A9604A2248ADDF33F
+:1054E000E9F3252E4A5C91E868D12EA4AEFCE30CCA
+:1054F000BF37B9F9990C145765902B6DA539863EC5
+:1055000053F75FB47AFB0D8EDF9531C3169BBC4F0A
+:10551000C83C30A130F2DA24C1CD35830D6BB10D1A
+:1055200071E52CAB569450750453B54E158F186425
+:10553000532C9F789C0B835362AFD370F8AA00F56D
+:105540008C5EC5A2DD13D11029A800AF3D14D1DCBB
+:10555000C3A5FCFFAA0E0DBAF6231BA49AA5FC3F17
+:105560008BFE2ECAE6303411145729B171A73CF1D5
+:10557000E1579DEB28A32FF57DF610D86A96673E7C
+:10558000BFBD6048B81AC3D021AAF066088E80C695
+:10559000C724823D57719CD7A891B450C500A5CEB1
+:1055A0008124DD953F03710DFDA5AE9C5E0FF2BB1E
+:1055B000D75392946CF8767B966B7ECA677560556C
+:1055C000A76C50720C73494848FD7BA6B7AAF02619
+:1055D0008998FE39A2C6662A6B3F8AF4A1E49D40F1
+:1055E000DB159D6B3A09AC18FFCF7B68E511090903
+:1055F0008BFFD4530D603F87A5CA7F744C141D5197
+:10560000472DCDA345FB91AB19FCE2EE1486D40BDC
+:105610008A0A71F85F247CE890E616800CDAFB8633
+:10562000684B2DAE63C6BB4883E929738097B9CA1E
+:105630008D553930A9F4FC545822A673021995E50A
+:1056400024CACFF8FA4BFA338C1F1F5CA0EC1199D7
+:1056500001BC57D74076AB56BF4EE4DA0769640108
+:1056600092FB7D429FE91077362F42A669775E4113
+:105670000880B6E778FBA8FBEA0CDBDDBDBC91B483
+:1056800070B192920B5232BEBB125B85D3EA79A7FE
+:105690004746D704E882AD1DC0419CF2E45C8CD241
+:1056A0000247FBB5E7CFAE1F048948FA296B7C851A
+:1056B000A716638890DE239A4BACD43B2FF40C449E
+:1056C00031938C3446A29661E480A6BD97BD51C04B
+:1056D000DAE6850A20F4ECF7AE4DD331B20CEBD705
+:1056E000A92774574D1903469D9C28902977CAE530
+:1056F000157E8D788DEB98A9D07B2AFB14A66ABE07
+:105700009F5552F51663536952006870C5B5B05C79
+:105710009AD5177A8BB3E981BA21376B26DA8E0BCB
+:105720001370D6E0B748ABE1B3033E0B120C511136
+:10573000716A36D57E64D68E900DADEB9EB4DBF3E8
+:10574000E865B6F2B373E14EE8F3C442F51B437B60
+:105750000D1BA50501F3E25F689CD59E86C545DF5C
+:10576000F63EDEEE3D6F4B71E98C58274BB7BA5EC3
+:10577000559C51857DD1B3D6D55192FD4A4B59697F
+:10578000411F4CD461B7973D59804DF37742FEBB22
+:10579000D0E83814A66226E4B360271EEE457EBC2E
+:1057A00075C9533B6EE0FF771705D644FAB3DE01A7
+:1057B00069B7D07ADE142F038B8F0A9ADCB6841B6C
+:1057C0000F9CD4AAE052BACFEC7A5EFCEFE5447F9E
+:1057D0006CFE64D74925FECCF9D9E98EFBE77B4BFB
+:1057E000BE014E865E35BFF4EE6E8B2887DC9DA72A
+:1057F00030DD7CA746209220D20908FC95EF1747A0
+:105800004F3D6F2F945B0D5B58A2964603630905CD
+:10581000BCB4F3C0D3B483B1F51AFECBE2B6E58ACB
+:105820008931615B018FDDDFF350E6393489597FBF
+:105830009D10580EC30AB0802126427D0F9F19D7B4
+:10584000453ED2C98A140BB7C660FF663211D76EC7
+:105850004779E76FE98704F14777299E6232B97B80
+:10586000264B945D23FB64B3C581D896E4972EED57
+:10587000B19E8E6E7C99FFEF805CEFF0FDC8A46C4A
+:1058800093FA4874FB6ABFB36476D1FBA7BA417838
+:10589000ECC65CD517E82CEF174B80F51F0FDE6CBC
+:1058A000B23FFFFFA51B8AB35B7FFBC7D10D1D92E3
+:1058B00019281A41B13F0853B50791FD94F6F9AF85
+:1058C00082DF73CDFCC2E5E804868770720B9A45CF
+:1058D0009A04F700D2933172B4943D61611D248A19
+:1058E000BD4FE27FB5FB6B82BCEADD96E7D3D360A8
+:1058F0006C1C91C25F493BCA92FAE3FBFB08F8318A
+:105900003E66238FF08C99B032AC85594F60558B31
+:105910005B91413E4BCA12C76A9547663C4D726C1B
+:10592000E8A4711265ACBB68E0A47C36FC8A14E183
+:105930006A1DC41796B36C776EE13A29F37161F072
+:10594000A3F0B0ABF9C335E3E28D325A8CBCC893F7
+:10595000C28FA14BA4AF223C43963814F2DD4C0D0C
+:105960008F4D555CDB220141EE4D936F4EEBFFEF07
+:10597000FA8E614AC79A3F8F37FEC9A901B3730CEB
+:10598000DC29E56DBED8035F42AB51CA12342F113A
+:1059900067F0508F7364D81F9E46AFD569EBF24411
+:1059A0008DABE0C4626854D887C4BDCC56CE2737CF
+:1059B00078CA09E589FB18CF3F12D94F6913736183
+:1059C00054C1F98A854570C8C3C1443DA297001FE0
+:1059D00098F61EA530B770C93B63ABC6AFBAD7FB0C
+:1059E00059330FE0680732C43FE61ED52F316E777A
+:1059F000721B890717F65C3716679E4F64BC983296
+:105A0000F9AA5A8D920E14FD8A9EAB1F8889E03B3D
+:105A100053DC324189D059A394473143374F43CEA9
+:105A2000A06046BD8ABFFC88B4E6F5EA2A3EE4D60B
+:105A30007EAD6904E1B05CD9973770E8C637C531EF
+:105A40008625ABEEEF41D4E0303C3DCC0A4A34161B
+:105A50003925B151BC6B89752E84E5C68607959BA7
+:105A60002C20043629D988238DE44FF150813EA89B
+:105A7000EC75B4042878F22B45F82A3F001D7237E4
+:105A80006DE3CDABA39E4BA24E6566C0B33B163211
+:105A900032C8F6AE1AA19E7F947D260CE36BDB958F
+:105AA0005988C3F15F273C04AD42ED56165F7D185F
+:105AB00066252104F24FFAD57B861F76636177ED68
+:105AC000065B3E3128F260DDE459FA892C32A2EC03
+:105AD0008A31D52DFB331DE5C702B4AEA64CA3DB3E
+:105AE00096CF4D43BDFDDC6E88BB7ADC4046329DCF
+:105AF000174F67574A283B689FF0BF2D71450EEF3F
+:105B0000010B768D6A3E408899DFB984C875B43A36
+:105B1000E0015CDC4EEB29A6A6A067F1336834A453
+:105B20007C00BC3C769C593028DB12073BDD3234CC
+:105B300078519DEC8906B61804C610340CEBEFB60C
+:105B4000071987A76B6D5EA8291A3F27BE9064517D
+:105B500047A1935FF8FEC4499972E9FB760158D1D9
+:105B6000FA7B03567FE23D50622AE37E4FA4E6EDC6
+:105B7000295B7BCE8DC6B66C521D5B3890308AFF98
+:105B800006143E70F758E22E8E65AF79B99DF9CABA
+:105B90007D77FC325650D087574EE6FFAC0F731915
+:105BA0007014CBF3FDE893FCC9DBD520015C953F75
+:105BB000602DB51712FD50BEB636E2B7B0AEE2BEEC
+:105BC0000C148A03EB4A770DD857E33C4F86C5E2A5
+:105BD000DB924A96304D2ACC3AC8F6862E2D70B00C
+:105BE0000E3976DC198C42DD61CDC2DB7F4E7C063E
+:105BF0006CA0F925F4860BA7124CEB1854C56DED7B
+:105C000099F15E55660140280CE72FB3395B59E6E0
+:105C10006DA0760403B61D8F04930C3A8B4D15903E
+:105C2000DE380E1AB4C96EBE4BD1E907B78E11AF7C
+:105C30005962246170F7ED1DE57A0E93743A7C6227
+:105C400001210F8EBBC1448F5D577801AA10098CCA
+:105C500093CCA74BE2440E7797CFD3D66AC3F756BF
+:105C6000E33913CFAB220BD7519A201D43AFA1E7E5
+:105C7000F4EB717EC5BB4BBDABD38BE93251E1C7B1
+:105C80005F93F590D1B9E8D51F53312F8E3970DD70
+:105C9000C1B2D3617C0AF10CB4A9503CF0F0725847
+:105CA00012B94B7E138739D5BC8C32B0A95864ED3C
+:105CB0009EE366251CE127ECC97EF4690AFA289F59
+:105CC0001F9462B2BE790E1258E21927C15F0FEF1E
+:105CD0008E2B70B728CAD12A54FB89F436A3191920
+:105CE000DC24A4E26AD856B212D49333B65E2EC432
+:105CF0003D8C840D218890F35F7A1B7A11CFDFAE43
+:105D0000090FBEE2A48875A48FADEE5B6023CFC8F7
+:105D1000C4564CB9D8FA666C684C987091903BD7D1
+:105D20006D07956FA573E036386F22530A1A5EEF40
+:105D3000B321F3EC7DBD52352CD23D4B0C3F56BF09
+:105D4000DD3C66DEF62518840D37E7F0A60B801FD4
+:105D5000CF6C97260DB9449A34EB6BD32CF35DA529
+:105D60003490240238DFB2EDDBD6B52DC20EFFE948
+:105D70004371ABA18757D682F70FF91FD97BBA239E
+:105D8000B1173FD29BAD5F02A284518B177B03D02A
+:105D90003AA081E5AFA22446C5F7BEAB865FF2F21A
+:105DA0005D4054D2BABB58AD1ACF4D72C9AD005840
+:105DB0009259D9BF3F307D75BC93461EC03E2F6AB5
+:105DC0002525DB6B64DAD411B8682A0EC502DB3FE7
+:105DD000A381617D2A85C3027C00453240DB5D7072
+:105DE000C9A6D9DB0462DD29BEDFE57B286833283C
+:105DF000D28CB5B8170CF5525BA7652F41047758C4
+:105E0000A7CC4C96050EB06A1955F5B2C0571CDFE9
+:105E1000EC3F3ADA2C110E12F071FBCCC6FA006995
+:105E200034DD052C258B677EA8994D5E2E82BBFB49
+:105E3000C265C67631586EB00E683C7EFEAF8ACE23
+:105E4000D2977B58373E64BB08D0560079F41332A2
+:105E5000E3F9A7B4C1D48C038A0075B25F69BE624E
+:105E60006B287341F2432AF58A7BE87424478E91AC
+:105E70000DC7DB24818C15C27277C9B2C2A85253F8
+:105E80009A3A6AE6ACC276011E00ED0BD5E63E2FCB
+:105E9000A437DDF2793836BDFBCF17D3D7E8A2AAF5
+:105EA0008D92333FAD6DF6FFA99F5A84AF1CA64E6D
+:105EB000E4DB2C028E019C67273A2BE95955D6A4C6
+:105EC0009E98381DA3CBDFD418FBBF27C9EAF0A6E4
+:105ED000F96B1F3630DB9A1D3C4C59B34C43D1BC97
+:105EE000FD7C81A5C69423AE81ED33C50D7ED250D5
+:105EF0008654E5A9563F4BCFFC75BC38CE25FBAD8B
+:105F00006DAC8C0DCD0BF91F07142A2ACBD578F177
+:105F1000423733004AD82323D8E4BAAC2C53013398
+:105F20002FF0112857F292562637B1168EF5C11967
+:105F30008C4DBF5F16A6EBC7C8150161E1193E0580
+:105F40000D980447E211E1BB2ADEDD975B8A23F45A
+:105F5000382DEE6B4CAC9F92D921CF10118F277842
+:105F6000CA28CFCBDB00BBB40B37679AB64D26CE21
+:105F7000E2649297B64F22379C336814244DE18235
+:105F8000C72FDD42269272C3CCD92E56DECC0FA687
+:105F90008C8B7C1C346D6E6979B19FACB3E0A964C5
+:105FA0004733560DF246A42731F4D69B23BBBC855C
+:105FB0001A7461C1E5ADC13A7254D62715304C60F0
+:105FC0007A7640985CEEFA17D541B33E0C63EE87C3
+:105FD000D74A0A33CCDD2CEE37512E860A2A0D180B
+:105FE000EF0616A4F901EE7BC48BC8FCE594A8B4B7
+:105FF0001037D5C5E899CC01C3A4D06C2425DE3E6A
+:106000008DA4263E679530D3E96C069344A9E281BE
+:106010005617EC7A02FFF323DBB4F3F715A0B0EFC9
+:10602000A726B507FFE891FD04D25AEF9B86ED6ED7
+:10603000C69AA2C5027A301EF681C5BCB8540E0AB3
+:10604000EC5EEF606E949DC186D4907A610666E73F
+:106050005C0A0B3D4CC5073800DBFD2C0CAD64FC25
+:10606000AD9FC0B531C98A69E96CC7271866FBCDF9
+:10607000DFE05915C07ACAF90580532AD846973F00
+:1060800029512ABA715D2A0A848C4C9DCB666938E5
+:106090001A2BA326A5632F7CDDD36B16A0ED6BE432
+:1060A000014096FBB637DD011F361F15DEF519D707
+:1060B000BBFC341F14FFE2D03A5DC4E53B489CE7CB
+:1060C00026E577DF27C6B69E73330CE80D1E3278BF
+:1060D0001E451AF9640D7475DA887447F930F0FDBD
+:1060E0002D947AFB6919E52F576ED73EB42E18C54B
+:1060F0001DF160AEA13F0C9497286A91ACAA7E5323
+:1061000090FCD0DF25FF57324E729572554663875B
+:106110001544E490B829A240C793AD13BBAFABFAC6
+:10612000B76B49CF8A36C383A15D4705714D4A0AD3
+:10613000109AED46B96DF9528505B35061C8BC6837
+:1061400047232712CEE6307BC9956C01E421244217
+:10615000EFAF7D02A11955F93A8A1D68BB71D1597B
+:106160007B920F0108E71BE3B7211D7129614608E7
+:10617000F1B9232FC5B679F8D5225EC8E4A4450B42
+:1061800096577B6071D1C65C68FF7FFB04AF3A9283
+:10619000056185FFE67EDA26EB2064EBC299A81242
+:1061A000AA83615F1B6FD4AD1204C7E3B2591823F1
+:1061B0007857417DA812F6B8DEDA8C88D9B9D82C88
+:1061C000C1C7A51621AA80AA2B3AD09C30BAC7EB2A
+:1061D0008B24BD0A69E6B7D5668BAB9E70E60C32A0
+:1061E000D5E4B0241631914407B399B92E2874CC64
+:1061F000F0715B656B4DB1951E89B6E0B1684BD906
+:106200002E63382770895A6DE51035FA04BAB42028
+:1062100049C65CBFDAB3A6E661757CCDCD7D9BD265
+:106220003F2BC7AAF16D2C0105283AA285CC7E6EC2
+:106230002E8E17543C21C8EB53490B6753F0B7FA25
+:10624000D7AA9FB18CC63B4E2575F93E06F343B6DF
+:106250008A13013FCB7047C930CDE48F031C69021C
+:10626000F2789734E68268FC495501C63251997D2F
+:10627000EB472BD56C69136C4CDF869FF8597FC3B5
+:106280009A51549C7C051C73CF1B20F164B8B469EF
+:106290000EA56719416D08F750B58C735D1F519AB3
+:1062A0002ED5E4DFB4DE0FCA84EA9FD8A1EC0657EE
+:1062B000ECFCDD0CD06202A63FE3B743FDCD5C08E9
+:1062C000B6525E172FA7C1954D243F851DC65D228E
+:1062D000E4DC8824ACEA0F4A6997A9F2DB9DCC364E
+:1062E00052AB1CAAF8FF8968ED340060752ABD1B0B
+:1062F000A33AF6654C8CC4DAFDFBB99C50B0909281
+:106300001ECF203C7F59DA75CA3A02B44276F9753D
+:1063100050CB27294E0EA498A41420D83EDA6F2B18
+:106320005BD2015C4757B1844452FB9C50F1235926
+:106330003A7FBED61D38CEFB98826D9A29A9926805
+:10634000CF77862A3031C60E499E56F90255F4EDB4
+:1063500023C87A403D916F5D134A1F7478DB4F4923
+:106360005756FC0925E00CA2AA57332DA61B35066B
+:10637000FA453031CF8FDD75E782E2A78502C07A1A
+:10638000C89808EC9045D2755BBC8C9178CD0AC852
+:10639000AF7FD9B94E29F311BF4CA056425ED4ADA0
+:1063A000DCE929B104F83CA30B8A3AF1459B96C974
+:1063B000C438D8203F7616389C157A762639A357EC
+:1063C00002AE07880667E24CD1B9B4C53FE3345C3E
+:1063D0005B5B901632C56CBA75BBB3E128A398F02D
+:1063E00072D0B1CBD5B012A7435BF37AB9C375EEC7
+:1063F000C36B92DAEAC972CFDEF3F57C80B3EA7A36
+:10640000F3DDE78A35C5F9D9F9009763D655441607
+:10641000248594FAFFE2FCAF48D226E666F313B770
+:10642000E6874DFB8F948A738CAAF10EF115133A0F
+:10643000C05AB831ABFE971CE1E4FA488038178F98
+:10644000238037C8911CA4501D9FD377CB81E9D0FE
+:106450007CB2AB1AEC3BF73F05EF219902DD065702
+:10646000C0099CBF8B0C1FAF6F852738A88929B442
+:106470008234E7C0F1A049A9987CE921E54E2E7746
+:106480004DDE7F0B381CA79AA42EBBB1B3DD56336B
+:106490001E9395430C82E38BCF4B266D52A6FCD303
+:1064A0005066627DBD43674AD93461F778A8FB54D2
+:1064B000EE773EC3E735A784562BFF3261C11B3C04
+:1064C00060592DA35E2AFE66A1FC4101F5CB290788
+:1064D000F8DEE684E7E9B6C60F0D5095C9E4C0A81A
+:1064E000D163CB6EBA93F3F9D5AB9E9222F237010A
+:1064F000B64B5EF2458C14B4A36C3329D47DE4CD45
+:10650000903404F34CE36352DD6E2DF4C881B2B5D0
+:1065100017951C12FFBF14C3F41D6696CF7B16AFF0
+:106520004A52377FC683E396772F4085FD3279B58F
+:10653000A82C4D3ED74E4555E911375DD7E1CEDF4A
+:10654000BC8F2D11EAB3EF29716ABF40C6FC4478B5
+:1065500050155828E6EB6399ECB147A7DCB99BEAE4
+:10656000B40944A3A2C05239C52970CD3AC4188ACF
+:10657000A5187D11EE25EDDEE2D3E1667652AE136D
+:10658000DBC7178CD7AB437034C9F0349B51011172
+:106590006DB4D3B4451A0D18F13ADA6F4A9133212C
+:1065A0005B5EA4920566C8DE19C54A98790720D0BB
+:1065B00088A322D84551CABA957FBB4E9ED3A95F06
+:1065C00020739E6C2062BDC73DEE8F91FE4529EC85
+:1065D0001F47B0EF1A980E75E983E05E0475C4C1D9
+:1065E0007453319B265E258178C97390C93773B87F
+:1065F000638BA5866CD5631A1A8F2E0BC5E407052D
+:10660000950E943BC32A37FF0ED1D473ECC36BE5D0
+:10661000D5D664309E99033E0170B1456378C34B73
+:1066200011EB9C4965DA7688575CDC8C4DDE70B7DF
+:10663000AEFB638CEF1C4F51B6AD8996CDC8359437
+:1066400023971647B927E04CBC77E99D58982189D4
+:1066500022C78BCC6D8C6B98AFD5D8D5D010DE13FC
+:10666000CC3DF980B145CCAC96AB75E8515145F6BF
+:106670002EC9D59E373144B9AC68BF0B56E93409F1
+:106680008DCC8BE985915FDF04EE6BBAC46959E26A
+:10669000694E5CE8050B6FFB2E53698769A161F4B5
+:1066A0001FC93042FA4A01E367F4FD0471CE6B97CB
+:1066B000F74CB4296BCA29CC06A953D6E7B93E2BAF
+:1066C000524509E2D18EBD123573B44CF461A5E494
+:1066D000942F8619F4964540C54BF4EC492BFC5495
+:1066E0009C61A1261F19B99EABC5B5939C971BAEA3
+:1066F000E7D2AEF210D70A179D9FFD7F2CF2302A09
+:10670000521616139180F29017DEE96B15E15A0EBE
+:10671000572E32E2B0B0058E887E91D3EB12E8B1ED
+:1067200000839D0DE7BD404BCB1AA2D9A1B8DA6317
+:10673000A3F67737BB708503140476DE8096953513
+:10674000FEEFB69BDCE19364CC9C3E610E9417EDAA
+:10675000CCA437F8D5B8C3E1177231A1F9A0B917A5
+:106760009E9536C71BCCB74B006801FFCAFB1C5E69
+:10677000C242F88BDDFC81191A213A53B1C04EFC9C
+:10678000C761B14B443B7511EC11614D4E57989C5C
+:106790000E0B5E7D06FB5F73D7013E8D1C294DBD40
+:1067A000C3F81FEAEB27EDFE6833B236C76881589D
+:1067B00083ACAC13829A71EB4AB709B3914480CA97
+:1067C000203BFA84A0204C22F34760CB9BC96E1D6E
+:1067D000D0FE6964E296B9B73C82D6FB4CF193AB2C
+:1067E000CC34E2443C60D5B523109BDDE7A5572AA5
+:1067F000CB06FD96DE382D027AC2936443162BB386
+:106800006C3328E992AD0AE54585BBCA3E2869F19B
+:10681000C939AEA52251387C1A5BEC4CEA741805D4
+:10682000A9C09ED732CE110A806D74142C2A4B2039
+:10683000F78BDED34715F2B08C010A7C094039C4CE
+:10684000F6ABD6BEE9F7D99054381DF22BA54AD63F
+:10685000080FC799E99332F4704C5CFC786E15858B
+:106860006262BC69B8F6AD63E5F47D17B52F339B62
+:10687000AE1A31F7F66646E5C43E519BC753A725CD
+:10688000C9DC61FE085FB5853CDDAE3363C89E7A26
+:106890005A42795E6F614511D4365FAB784049F753
+:1068A000274B31550457F948BDC07212FA14343FD2
+:1068B000343604228CBC050D0129694224EDC4B98B
+:1068C0000C5922E3FEB3C86DB561CDAC142C5385D1
+:1068D000875DB946EF6429607D608045137FB72FDF
+:1068E0003FB05AACE9D041F04149C070011B699DED
+:1068F000A67D688BFDA5FC99AB580489CAA3FA272D
+:106900003BA84CD4C0134C59154C6F76AEF589B9E1
+:10691000F0633C44C767EB4B7C1D0913B745A145A9
+:1069200004DC1A783FF9AE50BCD2A791C3C35D50C6
+:10693000180D807D862AD0A9BD7C0D5079963458DB
+:10694000709A3773195F478774E3268B0F92A1AF54
+:106950002270FBC0831773382ECC92D28C41A3D205
+:106960001AA4B624812BC7561A54E7833AC08C0761
+:10697000C230974AF93596AD37B96976D91C2D6D75
+:106980005D7162E2C4EE795887F265B7B34BA6AB8E
+:106990002DD43819BC7DE23320C813DB6AF35205CD
+:1069A00026C70C4FE07DD79EBF8FEA8682EB24C6B8
+:1069B0000C2F39865F488E2A92A2C727577777B85F
+:1069C000699F849B3026DF44BB93578A37BAEA60BD
+:1069D000436BF3216A86721CE87A32E2EEB5D7DDAA
+:1069E0006CAF44611D27290A92AC7DA84E4CC55955
+:1069F000CC7BC9999E37B08974EBDE92C35E820C62
+:106A00003290261461F4A24EFD7037BCF842C400E7
+:106A10005C70F4EB04143BC4382BEF8C7BACE59931
+:106A2000C2E57EFCB4F7EC153093145EDFD380032F
+:106A3000EB72F0AFED2A0839C6D8B992FFC840AF63
+:106A4000E12F0BA74CEA716D0F2C9C8B72F53C105B
+:106A5000EA136437368C26C536AA629D109465E029
+:106A600018BA0FAB55EE780D076F4DEF249629320B
+:106A70005699E81C3C25203AD3254A3062CAF7D4FF
+:106A800098192907B8804E2E0C63FF541DEDF10EA6
+:106A9000209EB8D1F118AF411042A86488277145F3
+:106AA0007C1586DA6723B74D30C1D0A965FA01633A
+:106AB000CAC1DD3961B681E887D1376F2D96D16DB6
+:106AC00068C2CFA231ADBB01B55FFB1038F12CDD40
+:106AD000276AC4EB3EDBD8C48EEC5CB61E503B6923
+:106AE00002D2D22F9A2F81BA97FD79F640479D386E
+:106AF00059DC581EB8D1D7CDB15193F4D4226F25AB
+:106B00005720AAA3CEBD4880A4062C82D3EA65E014
+:106B1000110282EB237DF42AAD51EFA32B55899B03
+:106B200009C91DAE54641CCB9E5C7AA401DFE5D379
+:106B3000F63EF8FC2D83FD115E611E2C997266AC49
+:106B4000D0E9E10B023210C55BD4BB3069E2348678
+:106B50007F46D72640614B9F62F0C367BC9915C240
+:106B6000E8FC2DB4D22BFE915329A92FAA81ADA602
+:106B7000973E2D45F03FC4FAB2B72560C3198E8CFD
+:106B8000A92B7BB05BC5315B474FC91BFB182900A4
+:106B9000D831E87AF42B3D4C34F238EA08DA6FB495
+:106BA000801BE241C76247DC35B5F6E30DA86542BC
+:106BB000CCEAD3AC365939D7813D141BB977E63EC0
+:106BC0008A2FBA1A54BAF8B55911CE3D6746DA84FD
+:106BD00014F7D5B16B24B7B365A78D282BAA4B2129
+:106BE0004714F87639E428F16B3D889084C084908E
+:106BF000193E28CA93F018BEFB126C32DCC02E6618
+:106C000021A4DF32566C14E559C3A91A50A44E8250
+:106C1000E4C0FFAB3422EBC29334EA36F0BFA0CA23
+:106C2000396CCECA1107D5E6CAB50D26EF51698574
+:106C300028B2C4101C019AD28D6998DC4CA2022E95
+:106C4000C648754CC4170F8AAF9AD1D7FAED505485
+:106C50009871ADF81432F4526F2C87F51629B4D917
+:106C60001616493977E9C917F3B22A1FBA01ECCBD6
+:106C70008C78054161A7CDB3EC1234B696469D439E
+:106C8000E4B9C9E225ACDD7C98D1EEB68B0CC9C560
+:106C9000FDCD2EFEC1C2B588603FF4E2FE5943250A
+:106CA000258C4E37622F813905F9CE57206C1B2D6C
+:106CB00088105FBAE2868CF7DA2601A8DA8952FEDC
+:106CC000B1DBDC69E82BFA0C4095B6CDA97C9115B7
+:106CD0006CDDEE40AFAE8C9BA66B0BB3B34F946AEA
+:106CE000D32A91AC957B5CCD05F3592FC1BD6317B9
+:106CF000F075EEE3AF40DE6AA1FA88AA96F89C131D
+:106D0000E20A50E94E27E4BD913011178F84701EBE
+:106D10005558C684919043AA601820EEE592D74654
+:106D200093FAC4A5783837B1BF95CFC0526EA5A2EB
+:106D30006A49CC1071568B85C74ECDEC51F1AE72BD
+:106D4000BC983631E6B42F45E11A460C30B76015D1
+:106D5000B805F4D9A24DBD42FF03AC622BA0172E9B
+:106D6000022FE956D5F631870DB68B88E8E6058FF8
+:106D70003403DF327E68359A36F4F71E02898FEECF
+:106D80006EB3135DFB1A2865D1244DBD437E41B619
+:106D900066A0B01961CEF681AF72CA349AC3DC50D6
+:106DA0001EE186FD9B27D37CF70EFD90CDD36AD9DB
+:106DB00089CDB71E999A26133370DD76A4C315AC1E
+:106DC000B6D967457E866BCD31C285C01E3D93E046
+:106DD000B55DF034AAC480D9E020CC8A9345AA4A94
+:106DE000A616949F0C3B85B8449FB9EBF7572340F8
+:106DF000EC0BB8D92C85CE40186A11AFA424A6BEDE
+:106E00006C7F11382658B2535E4E64599431849782
+:106E100036C72160A45560E6F91FF744E79CED846E
+:106E2000C20AA3DF7D34018EC4E2F00D69EBECCD24
+:106E30001B0E010B5F696B2376F9817871303694F4
+:106E4000062B778420D5BB4CEE98D91C3728281602
+:106E5000A4FF42CFC164D6DDC765488C0AD195F343
+:106E60003E55419020346489B77E044A17755031ED
+:106E700064A8D72B0C688FAE0A25387B0C694A1B97
+:106E8000538AD8DB4B316462B4A14064E6F0E1BBC5
+:106E9000DCC8E0B2E1ADF794E719245F54B1F4BA6D
+:106EA0005F0C62E977470B9339F625FB7E18A081CA
+:106EB00007BBA6519679523705105F33566978B8EB
+:106EC00051C4A2657D18B57DFBDF75DCA04BEF6872
+:106ED0005F4C0B5D60C84CD670388618B17B9F75CF
+:106EE000A1802F88C7CD469EA7E93D2BA2BC0A985A
+:106EF000275125CB86A0722E7C12C8F0C3FE9528A0
+:106F000037C968A3D899406F39A3C79F00ECB90966
+:106F1000F40A70E06CF17BD9799AC4E9FA3F87BF33
+:106F200028523345119FC1C27DC759879BDA5CB493
+:106F300055ACB0EF66FEA392157DCD732BB39A13BB
+:106F400040FC80330605314AF226885E418761B8ED
+:106F5000515D291959B0688D514449718A3C5E6E62
+:106F60007497B22A42DB2EE5FC8C470105EF04AC96
+:106F700055E433851519A9DE8C821717DE8623C3E5
+:106F8000A86395AF0E21526D0E612E6F717118D8E6
+:106F9000A4E658DF706F64D5913F80025A8D240BB0
+:106FA000990D9E7AFB6A03060E1ED70D6EE2C5BCD4
+:106FB000789A9EB31EAD5B4D0F15042AC6383B0D63
+:106FC000E4A71FBA9B85954BAEB759163418AE6B24
+:106FD000E29794F28414335ED0133D7C05BB67487E
+:106FE000CE9FEF02DD1873397A1B6C2442A1C56075
+:106FF0008EA1273C43459FA3D6EC552C2E05847EBD
+:10700000364F7B8A057773187AE82E046666573AFE
+:107010007EA05A34F9FD8FBC666D806581F0EDBBB2
+:107020008BC9A0AC835A49BFDB2693638C2694732B
+:10703000213E427382361E22863132CD75705B92BC
+:10704000F38DEA0D3B93745967668CC24CF985A1A8
+:10705000B58D4FE30C2AD0C00FB430A8C964BD0071
+:10706000F99EBA9E2C6C9FF174C50EFF98EE9B386A
+:107070009DA210987EB8B58E1FF3B5D97E155163C9
+:1070800072C74CE464A57F61D5FB29771814338956
+:107090005BF0724D29215B083434388CC1C89AD515
+:1070A000B4D29E1D499BC29E2F0662B739E057F7A6
+:1070B0004E97C585629C4617FA1405CD426527A3F5
+:1070C0008E0A66C13C0EC6CD08D5ACAB25822F5BBF
+:1070D0002D790AF4FB136375F556195FBD9C839DEA
+:1070E000E27FD9102403E513543F34644D4D651FEE
+:1070F000480E88F6F986393156EB27DE421D7DC7EA
+:10710000126396DFAAA598D5D3D5C4E6669F6150D1
+:10711000E732FB69E7591F2594FF90F8062029FA0A
+:10712000E04A224300D559BEA270A543B22C440FB9
+:1071300077FB97729F7314922C36631CE25745B904
+:10714000A783C8F3C7B9245B4495F0FAC95702581E
+:10715000E7D136A5DCD7C7E26FF6F1EB6F236E41BE
+:107160004CE6309AEB3E1A813A8639636E228834B7
+:107170000BD166AA3EE148248746A043A3929FC054
+:10718000B08A0FBD113C91CEE42FACC2665FDF4CDC
+:107190007CA339172CAF31E48E51D32525ABD6EA29
+:1071A000946829FCF92E6B06F2DB21F1E4A070450E
+:1071B000429CC40BE3C9D9570004CE11A77A4918E1
+:1071C0006283B6E5FA4012A41CDD96CF48C3E8FE00
+:1071D00090A85A26FCF94208B3B32090D0D28BB9BC
+:1071E000EB8AE3FD802A8584CA035F37AF7DEBD647
+:1071F000C2CF5C05075E0DC9C269BF563ACEA1D1A8
+:107200007FB3D27C887C548BAF8E8E5370A50A944A
+:107210006330FADE86AC930A6DACA22970B4531DBC
+:10722000562D5F7DC9D13D6CC2F5B5B7048C2F6971
+:10723000844246F54A3D036CE6A1F5BAABC8614FFE
+:1072400067DB51F01C87F1580CE418E1FADEDF6AC5
+:10725000EDA0F9918A0324043855EDA0A47C7E1B8F
+:10726000A68AA0F4D6E6A7E760CF77D4558E517CE6
+:10727000FCF050F4240256BA882B0BFE0EA2635F7A
+:10728000F9492BC3A457D6109C2D870CA618A10032
+:10729000A9DAE9623D3756FC97F2BEFC7789097F8F
+:1072A000EA22862ADB71CD48F11C86939417EDC340
+:1072B000C3ECD1D6305B7411F4E67D1470108DB838
+:1072C00096763D8811999AAA7CC4EDBD8E1D16A3B1
+:1072D000D049D194CE2B4E179AEA2108DBC74E86AF
+:1072E000EA1E09381163AAD1C9ED2A07880CFF8666
+:1072F000BC7F9BB3FB89D12FB01E6E0C99D547E59F
+:10730000E7FE6EDA4C6EF6C3511437109AA57F541F
+:10731000B3E641517C297C9A4A1DE019C607183B07
+:10732000F54182C06B704922A1CD69B927BBAD97E9
+:10733000EF825D363101ED2C625086D7647AD01F22
+:10734000C9051A056CFEE9D8D1B72A11194E4CCCE3
+:1073500015FBCC547B5A196FDB56F9984219C0F1D2
+:107360002FCB4267ADD2FC60FBA2DBFCB3024675BB
+:10737000121413D7FB4BCB7974F20492EAFA0D95F1
+:10738000319569EE9D9040F91148BE232FCA0D0733
+:10739000428BBB8633DAA721A72FA9D0235ADBE182
+:1073A000795926C907FDCD4C6F99193B8ED6CD92E0
+:1073B0005D364A5CA24B4A806487AE6B3B011A453E
+:1073C0008CFCBDD139D9B117466EAC8B0AE977A6D2
+:1073D000B59E57DA9F1532F570E4B4BE564C66C8B8
+:1073E00075F1D6216BBF40DF60EF08CC282B1A1D4A
+:1073F0005CB99AE57C0F1D203513260F7D44E45CB3
+:10740000C1C1ED11AB30934D4406C96BB834D810EF
+:10741000DE95B099F06D9C46D059B7256D0849BBF3
+:1074200060613B6C9ECF4196D5CED7BE62D9625883
+:10743000FA8F3AA7D1DA12C1F8BA845759B25FC5A8
+:10744000B759EBDD61BD02765A4B9670FDACBD16A7
+:107450001905510B6F8236B7E07CF67DBAC29205F2
+:10746000399961F4E27511C36EAD399BF48C01DA80
+:10747000260C47ACB8C6DD37D062B5F202252DB870
+:107480008484BA6DF994E2C6931110D40103BDE46B
+:10749000321377EB12670B29710C047A7712B13231
+:1074A000CFB49275C0E721C5603053190DB76D7028
+:1074B00017167CB79512EC83342B8CB1F29458A834
+:1074C0000037E85829B1AA7995F4AA90DA286966B4
+:1074D00016153055B4F280618E815EEFD36AEB4FA2
+:1074E000D91D91D0F5A4A27528AD39D5C5CD399354
+:1074F0000B9C903D820D2D723B07A24F13A8871560
+:10750000C89AD5114C9ECB0C8F12A78058AE31D69D
+:10751000320697DAF5E2E31EEB99B0D96997A9A292
+:10752000C08A8A13FA479AE75AD7EAE9FE367252B6
+:10753000AADF04453C0198390122CC1B0FEAC3990C
+:10754000DD1D55F09B60B32BA3BD40114E8FCCEFDA
+:10755000D211CE8CB2B70E4A24A079E3508D1B61B4
+:1075600068247E71CADDA3F01754E6DF3A1E911B32
+:107570000355BDEF942234552725A47C033CEC84AD
+:107580002FC7AC4907E74068AFBA1EA4856E2F5ECF
+:107590005713FC506DCC9ADB8A418A5866242A180E
+:1075A0009CBABCE9EB13C84A8EE4A4EA6F9E6CD285
+:1075B0009AD94030E90F901E60401FA7BE1B20E8FB
+:1075C0001FDA55588B0E1CD62B9D9B4BFA67B610B5
+:1075D0005800883A156D1754163FA6F9CF896714DD
+:1075E0000BFC6DAA42273BF0B131BA11852699FCFC
+:1075F00086006E7A3791DAE2FD914B732759F1E6F6
+:10760000C33946BB3B84CFFD193A2F05A0705B0CF4
+:107610009C648C94E330C1F0C79E6A3F15406D2393
+:107620000BAB0FC6A7ED60ECD4CA4D7D41C2AE6076
+:10763000D8C751C3CC684A6E944A948EDAB49ED7A8
+:1076400010CE98E65D0809755DB4758AE63BE743A0
+:10765000573A69C3EB72DF7E40E0EDA143A6FEB26C
+:10766000EA5477BF38F2753BC7751EEB0E31F971DE
+:1076700058736F4FD85D491D1FD3AC378B8ECD0E1D
+:107680006B1A582943EFABCE046B85F594F0044296
+:1076900080ADBFDDDE52D4C1D23CD126F8DB5850DC
+:1076A000D0D9DD8DD51D3D3226E0F52F47CC757D37
+:1076B0007D03ABB5E130CE5EA9A32F72D813968DB2
+:1076C0002127764D9AFCEFF38558B8CD62820ECA19
+:1076D00031069D1EBECFE6BFB43D6816BEEA42CB62
+:1076E000EDF6050B3719A0E8CB563F6D3307245D47
+:1076F000D380AD0A7A53B335F4C5EE92866C6686B4
+:107700006FFD6FF17EBC6D35D15398D657671E5013
+:10771000C520DD73FDC6FEE1AB62657D140DEE9004
+:10772000AE202290A1954A8584E83A84F7D63D00A0
+:1077300054A9739D02A360E8B3E23F4788EC68ACAC
+:1077400061BBC4C7E394579D6CD5D6E105F94A1EC9
+:1077500099F70F015EA3D632A3C613B92D3CBC879F
+:107760008CEC4E3AEC041574018DC6E9C5FF3E1150
+:10777000F53838F0DCEC572BC93C874C33C22B1B57
+:107780003AD1F77EE166D5C32647058C6E90B3FDEE
+:10779000969B284919EC7C769C8CAC438392D20D45
+:1077A0000F99A0E685EB6F605A759DBED61B925B64
+:1077B00049636F8218AF8E081DE06B7E0222699DBF
+:1077C0007152DF868C81C9E4BBFBE5FB70871FDC4F
+:1077D000B2C882EF7B1814DFFE4BBC976FA6E9415D
+:1077E0004EDF721A4A479A3D6FAE13B290342B8225
+:1077F000396B389C755024DFC240BB2DB551E7D59D
+:107800008B761BDFE074E4296298E3A5BF7716A1AD
+:1078100087C323AE345932BB4C5372FCD6C5150A0C
+:10782000DFEB943A74326D2E0941D58D71C344ADAE
+:10783000A70A28C35F207E41A144B87A9270782BB2
+:10784000985710B798ACF804EFD10E4E33B25F6F73
+:107850009CA55B39BF01900C697A6E2AE0B4EF1EDB
+:10786000732811D2C8F58AD7356FE53CC251CB8851
+:10787000387DB404C110956F9CC2E08B0175BAE3EA
+:1078800028648438E7D7AAD072A966C2FBA0390C55
+:10789000B2CECFBC736A6818C616327F82A44D0977
+:1078A0003A2490C2EBEDD6687C569E17C1835CE209
+:1078B00091F55A024542379B6406ADA96AB8BAA44D
+:1078C000113A3CAC4912D23FDBFFC12759A89B7843
+:1078D000AD5402E6DEBC9C7C68CCF4E179B47A213C
+:1078E00063764D16FBF1D7558263B53956B3830DD8
+:1078F000C2E06F491E4F228E9CDBD59B607B5618E1
+:10790000938E78CAED0A125ECEDADBBA05BE30DBA2
+:107910001E487A2EFAA56A6587FA4CB5F9EE2B3324
+:10792000669A356178BDC8E07FA8740065BD3F9B4D
+:10793000938B0DC342C10AA80090D30F65097FF154
+:107940003DC4A4A8DD75C431E918A6C901A6547BBD
+:107950006A0E02B3877F5D2CE5D89ACD7A7F903E80
+:10796000D7AD232C18D773B16C98D203548EF4B0D2
+:10797000E117658CC4DF2FB70D7FF24B7D7CB4819E
+:1079800022CBEFBA96C27184B36A36276E724F0D5E
+:107990006039CE205295CFBECFE9D77E9E3D62851D
+:1079A000F28AB97330371CCFC7D46FA36F58E6B8CB
+:1079B000E446157045FA51A2BC13ECF2F71D9A1378
+:1079C000BED8C0E9B59C6F5B906ECEFD65B9E4B7DB
+:1079D000FEB8A80BB835A96A863B61D994ED80E959
+:1079E000084F9540D9DBFD6402D3C206ECE03B08AA
+:1079F000022C4437E1E2A32AEB18251F3BEA32FEB2
+:107A00006628B913D526E9D3D6CBC81BA462564F36
+:107A1000BDD96A90F8DEF12E67028C8A2E1C9ABEC0
+:107A2000EB09B5509478E8E5BF283F07FA2BB9E099
+:107A30001691190E87E934101AA69D6DE017F5AF5F
+:107A4000C16F591920C5CCB273150DFB839CBAE4E4
+:107A50004B0D9AFC4176A0FF732D6F81168800F0C4
+:107A60009FAC17185C9F3538AF96FC0A3F66E394CD
+:107A7000F2C8BCD67CAEECF3549CF18EEEDBE08118
+:107A8000861D5EDE18EE6CDD4A721BD325D0AE92E9
+:107A9000695664313AFD5A60376D4CCFC50C085AAF
+:107AA000EB38FA9BE7EB82743DF1723E6EF72E677E
+:107AB000C5FA39C1F44F3F2B6811C3056A19A0C834
+:107AC00016C9ED4815C3A4D82A0F6F2252A73163F7
+:107AD000E609B02275410E8F33849448C6693C8E06
+:107AE0002365E850104285D6C76338447209ABD28B
+:107AF000B35B10FC89D969CCE02689EFE9148D418C
+:107B00005D002626E20FC857BC94D5850D75692FF8
+:107B1000BE3834CD3A5575379F8C48C90F33D79A44
+:107B20004BB5E4F72EAF881CDCDEFFBB487905B50A
+:107B300008BF97F6AA72EB55B779F212FCCCC4EEE7
+:107B4000DB790359BB3A21E03C6B83DA5CA2BC0BC6
+:107B5000C86BB7B6C015FD0D8985944E30A8C85CBA
+:107B6000CCB9735DCA5D454DEC5F0FD832F5963FD9
+:107B70001767B4C64E76919E3A695DA4DD3D3DAB74
+:107B8000E3538136192412FECAEBA2EE753DF0E8EC
+:107B9000822B5BEF906DFF762D19822DD9F2A78491
+:107BA0008DBCC85EAD6C63496393327C65D2BD9E6B
+:107BB00029B5475DD707AD8580DAFFD39DA6AA6EAC
+:107BC00088346914EFBCC4B4AB1857CEB1B648348E
+:107BD000D405D1AE20466CD18229AE219937885682
+:107BE0000B08F83923AA070995393AC4FDCB11349B
+:107BF0002D3FADD66480E6ABCC1802CB6CFDB373E1
+:107C0000F25537B920AA49A9B163E082445BD6880E
+:107C10001555A5C1F149D05635F4E9280E6150C477
+:107C2000015B7F86E40CF191781B032468E597E4FF
+:107C3000A1F1B3B582B60710B6C14019169762A676
+:107C400030EB8AB529776B40385018655C889D8782
+:107C50009839FFE2264A9CF557B7AFC1750BD5029C
+:107C6000A214AE906630BD82A2630B4BDCF73E449B
+:107C700063FA3456DB31F95BEB0F3652DA4B1D8871
+:107C80001318E2E89D840835FAF44855B13728D036
+:107C9000AD055FBACCE06769D3E0A5CE21CEE8D3CD
+:107CA000CC395D96F46E8C5B63A6D9F3BF56C85889
+:107CB0001827CD22134D640EED39FF4E2D4AEB04EB
+:107CC000FFD57263EF71AA381BF3EED50C0C5F0879
+:107CD000B57DA9D48EC7D1FE912DD7A4A3F107F409
+:107CE000F03B5AD57FEEBBA053B757CA08C4F9DEA4
+:107CF000046651621EDBA20EA98BDDB5ABCDBD7E45
+:107D00005B1AB4B4041F38DB87448B63ED32F11087
+:107D10006A3D6C20D3D61795FB275453EBB82E9DA4
+:107D200044F2E94639D52FE20730125C6787A49BFD
+:107D300011592A4F99B51A49BF092A10CB35D6F9DE
+:107D40006BA3F996FD8EA1AF68387E70E9348F542D
+:107D50006AA3AA2D958EEB42E0068550E30BD24232
+:107D60005A7F86198A0C876717DD2F9A2BD04AF421
+:107D70001E3070FAD896001F76DD58BCB539902BAE
+:107D80006B9C58B5375B9F94306BE7198BF166AAF3
+:107D9000AA91D8B20C9527321C2A84C150077F4B78
+:107DA000036BB3E87E4FD42E4711C6BF0D216D5132
+:107DB00044C32FEF9B97F940D5DD4225769A5D04A9
+:107DC000C5BEF18C6A42975B696E8392EA5E3ABBEC
+:107DD0002965BD24CCD49DEAFA4F05FD61C14898C0
+:107DE00039E8B9488B7302A15B95F7AD7CFFACFC19
+:107DF0009901472B799274E5F2B72FCE52446588EA
+:107E00008B01142380C4F7D2F45A3BDEF4EBBA158D
+:107E100066950CD704E24FAC1C33A231800C61068E
+:107E2000CBC197572BAF6804485424118412BDE38B
+:107E30002DF8544B417D77A7AB5F02A9438097D4BF
+:107E4000DDA87DF99F536A803D56A0C416654B019D
+:107E500094745A50B5D39DAAB9ECC3E57D1F5399CC
+:107E60008B9B946210F5E00F62E178D89FBA60991D
+:107E700043E46DAF40D4793055BB46828855BC0E83
+:107E8000D1968D9C05A7C167C907F179EBD0EC535A
+:107E90000F22CF1E685AA8D0E7D6841272AEAAB7B6
+:107EA00080D21B4FA55208458B62BD9AB07AAE01B5
+:107EB000985A1753E8D9E02C4FC6BDB0630497CC4D
+:107EC000B490391C8C886E6BE4E7510FE5177DC9BF
+:107ED0006E3C2FF3FB384406CEBEDBAC8B18471547
+:107EE00036E335D31AF6C6D4B9ABFD157ABB93C5C4
+:107EF000BFA8EFAF0937FDF21955DF0D8808D8E1AB
+:107F000066F210E476149D5A0A61AC4FB6A138D5DA
+:107F1000908C30E047606DD8E3FF77C8A453AA4542
+:107F2000C5F35EF355CCF5BDAC61BEA51E1CD513E3
+:107F3000AE28262969F5292399D30E868DE1B4C48C
+:107F400027A075DE3B64E61A3DF764E8A07FEE8A61
+:107F5000BF70C909A6C534C7B7FABB986051EDD048
+:107F6000F7DE74A4E95AE4AF984B91DE44037870CD
+:107F70004B9CF4CA7366650C0033FD97E2F36E8C7C
+:107F800000D70CB8F907D6CCDA5E2210E8A0FCDFE7
+:107F90001A8C7C7471C98783DD0598D4B43D9F1F0A
+:107FA00058148C7B1726CE60A28DE5AFAE65AA284B
+:107FB0007EF033EDD6E9BB1D63E62E0236632CFC62
+:107FC00049EAAC29A98DE408FDB4EE4ED3F7283573
+:107FD000DEC3E456837F300D8B761C13F21FB8513D
+:107FE000AC742B3E3E7003F37F8B4D0BC9C63A74C5
+:107FF000F21B102E8A40A98B4BF1123A0AF5A223EC
+:108000002F4F8E0742040E9601C38B95F3D34E9CDF
+:10801000262823318A7B4187FE705111626DBC177F
+:10802000FD41C6A5F5B21A1B2F889961BD2A3248B9
+:108030001B04781C9F9D66BC24DEAF65A91ABEEBAD
+:108040003498FC177EAB8F6521486DA8529C8761E0
+:10805000B73489076403C0DEF17C2A165AFAF3D3D9
+:108060004432AB3B09D899B32890B4A39D8906AF9D
+:10807000892E8A3BB303A3DD3B6FF69F31B7B3A2D2
+:10808000B296F7B20D0C131F992FECDA1D16D5C559
+:1080900009004CDE5218AEA3530CCF8A0F2585FB86
+:1080A000B788316EFB782339FA5608168B5F560C69
+:1080B000ABEB686149981DB4381B698E8F059A3502
+:1080C00073AD763B8961A15FC83E1834BD4274062A
+:1080D0009412E161F9BF1CE285851FA1A2A28F77EE
+:1080E000C75401D90F866A02D5356AC4ADAD091FE0
+:1080F0008ED0645EE46B30B4D70BF145E9B07BFD04
+:1081000069E18095F4CC9885BACB7811F8BB94E6F8
+:10811000F47B8C92391B000FA825CF73E07E46AC10
+:10812000C89FBE05B9C90497080E97A7BB18408F12
+:108130009AF6D70CE925557E766C71C6D57050122B
+:1081400091E9162A02C27A546956ABF723A269FD57
+:10815000D933127CBEDCDA502DD78F63716DD132EA
+:10816000C8A5EAEA4BD9620CDEE6AED31E5AEEA0F1
+:1081700080F58C5438C441A728F5E4D866FBBCB41C
+:108180001117CCA9B7D2271B66C66375187FF249B1
+:1081900010890932AEF81BB9300E3D2B394C41FF26
+:1081A0001C01AF3A0E4FC7891232FB63ADA9A87C00
+:1081B000130FF898A162CE3486D28D394CC0AB969D
+:1081C000D1DBDC57ED2DE80276CAFDC8F8EFBEA37F
+:1081D00010D1FBE2981E1C59071A9C9D898EC6057A
+:1081E0008148DE8FF67B2A9FD260B13275C9170EA7
+:1081F00007D79ABF0A14B29FC4D5F09A10A8F56C9D
+:108200007CD82CD520053F9913F34B32B1E755CDDF
+:1082100064B925363B6874D80ADCE9874791463E45
+:10822000709CCB23E4DEFC27A26BA0A1CCFB70A04A
+:108230000057873A1BE2274D183EECA10177DADDA3
+:108240002DC9553B144FB237AE1D557E99F179F4C7
+:1082500084C844733CBF17EA5E574699A3016D5B1F
+:108260003237BB8B664913316F80AF90798B9C128C
+:108270000E0D224AD15EDF3FBC21CCDA7947BEAA7F
+:10828000C824AE644744DF1891D4EC2FD579130E7F
+:10829000254E48BD950BDED88696EF0AF1BACF9EE3
+:1082A0007A21610F4B1E7E1659A9F932E99379BBE9
+:1082B000E68B690B55832CAB6E1D3AE01F8716C207
+:1082C000DF8D4BEAA1B35E5DC8C1FD858B40B89ED2
+:1082D000FD80DEE8EFE41705801EDC0D6188B398B1
+:1082E00071F39F31DF6E0054928222E693DA6AC303
+:1082F000A5F7DC7C7171A57A70DCBAB984F87BA92A
+:108300005536A0FBEFF0AD7A065861EB478E74DB73
+:1083100029FA76AFC5B1A9D049E0A7381EBF933F6F
+:1083200044139A07AA4533A36A6F283755B14129E8
+:1083300034D6390E04F07963DB71CA0B85AF920035
+:1083400070B96067B8088EF300033B42B27867608B
+:108350006D748F640E82B9CA1CA58D2E13DC4F5C20
+:108360008F2406001140429F3822EF426A35649BF9
+:10837000B630EB18AEE9B0F6AC64158ACD8F144F69
+:1083800086693BAFA10D1B0DAE1AF16DDA9C2DFF76
+:1083900062854ED3B64F4B5A3EE0DC5210557A4DB3
+:1083A000BB4A7B3906ED77000904BD675BBEAAE3D3
+:1083B000C0684C8449D170EEADDF530127739DA98D
+:1083C0003066AFEA1F9B88311659113FD9F9708189
+:1083D000186C8FECCDA69B2071FF0AA6F1DEACEDE8
+:1083E0001DCB2B2246285F093452945149E5091BC5
+:1083F0009EF6F2AF2390F46AAA6E17C5A92420AAAC
+:1084000029F03209B11DEDD5DB1D12DB7F52ED0CD9
+:108410005C8CCE4ECD65BAA54D8C6B517F32B6F6D5
+:108420008F29118D9679EDC2975D48048794D0B954
+:10843000746D693748262AA1B89E664B9CF99AC983
+:10844000D8B49295F67D3EABC1EB3F3B46E74F7605
+:108450006019367181E5B5CA08CDB699A7A8818A99
+:10846000D50B73E9E63B4959D82DBD625516E0B0EE
+:10847000F1F1810C7E6762991D51795AC269FF92B0
+:10848000BA8947BD5F1B71EF7AC87F30AFDE8ADEE5
+:10849000145471AA8C9A19A322BB593ACB08A2F59D
+:1084A0005D050107EB57DEFD0909ABB2F40022AB15
+:1084B0002520EA67F3EF98CF63C7F049926551A38F
+:1084C00015E6E23B0A3B1AF6CA2DE9EA013EA21183
+:1084D000EB97FD1835F2EC19529400D9A8815EAEE5
+:1084E0003502BA6909910878956ED267F7E686BABF
+:1084F000AC84AE5880F10269EC7152BA8522B57F26
+:1085000034D5C1702E820AD444464F9988A6EF25EF
+:10851000EA795449A0CF3E4E9FE55E4DEEB4D6C2F7
+:10852000D5652AFBB19E6BC028E109AC0F107B8793
+:108530002D6F2F29D127E64593E41EB18CB7534800
+:10854000B557AB7C797AF43155431ABFE3436838A9
+:1085500017218B1BEA1B98E618BF9EDF35E3F13825
+:108560001029495AC3EFDE37FBA8F848DF8B57378D
+:10857000142FAE5186880728884D23C1A1F93EB239
+:10858000899D379A0E9A3EE7D964FFBC98468216B9
+:108590003878457A607FD5407EAEAC2CED2A37A086
+:1085A00010C4C21E1360EBA6A928C6B0A71A638E1A
+:1085B000BEBD0972530BA771178DD5041AFADFC817
+:1085C0004EA7BB1F3E74C1B09C70C299878D19DD48
+:1085D000F88778EB0908FEC0320726C0FAB23F21BF
+:1085E0004B299CA38A0E607C6103B570BDE11D9090
+:1085F0005098320CC42A0FD264E87EE8A7691D287F
+:1086000012C3EC567302A2854BDDC2C382F8D32F8E
+:108610009B71E71188BFC889C08C5B2128F38C54FB
+:10862000E5DA31589387A527B939DBBB2558270AE6
+:10863000C7A1A1C9D5CCA6141EFFA8D994FF3E019D
+:10864000E7576AF5F30FF44880ACE37B309B97441F
+:1086500045F66CEAC4D9E17729C1660DDABD4AA4B2
+:108660002DC55D7DED6AD06AD790930956CA77AA69
+:10867000B831470F9668C4779995C2BAC9A70C93C9
+:108680001D78131C9C811064C474E32C585B1DF18D
+:10869000CF6B047DC0FB001A0850A40A11E351CB34
+:1086A00044D6A60E0711AB21FB2C1690FCDD05A3CA
+:1086B0000207F020D0971131BB9F546756E5048222
+:1086C00080E694008DB9A4CA1B1F6E332C396D1639
+:1086D0003BAACCCE8DECE38FC215502908717901ED
+:1086E000F64F35756C6364BAAF1B0AC77A0E824ABF
+:1086F000DBD8C9D23D7815180FCFE256E54F562A80
+:1087000000761B9A8822ECBDAB16407DFECB89908B
+:10871000DCFB0F8D9B45BEA759D68D5C23FACC069A
+:1087200016A784C25DC48471B6DFB37E14253B8F67
+:10873000B3100B5AE2E6E7DE3D49B7FF4421476438
+:1087400078A9E71796B1A9ACE09A1F0FC47F1FE57F
+:1087500077F62938FE67665D35B69E95FFA064D72B
+:10876000C50D2AF4C21296DFD4B1DCC0A7335595EB
+:10877000AD8818DD55BE48073D6B1B07AAB302172D
+:1087800084A86949E611C09FEBA1F4CC040FF03333
+:108790009DC6671E9B17CD43414128DAEDCB50683B
+:1087A0005C32F381B32C2D4F893F8187A1DBC69EBC
+:1087B000B2895540AE58D07180FA420C78D91F0565
+:1087C000F0270A9265F9F558F99A2D2AF696CC0801
+:1087D000BE15621F6A0BBBA26AA98D9307D2F9E688
+:1087E0006E149E1E44BEBFB9915AB0A534EABC7D3A
+:1087F000B62A613E6E6E1F8074D6972A7E02D0F52F
+:108800004A0CAED712D1BBBDE7950FD5F1EBDEED2B
+:10881000BFF4609D44921325F3A0E1A9CC6A400205
+:10882000B6395B35DCB74A7377610703818C78848E
+:10883000F6B06D6A07416E90042B91EEC99D2E77BC
+:10884000BC2F5B1D9DBC1773DFEA1AD879240C225C
+:10885000B0C9FC86F6DD2565D74C1F2792AF46CB05
+:10886000EECEDA0150ABCB93E7A69EF08F67F1C551
+:108870003636BD0CD0F7E75309B7895F5BED35732A
+:10888000DCF518D9BA144B5528C4A9AE4F414E6037
+:10889000CD0E8505F13A38A898F6FDABDD6EE503FF
+:1088A000F59B2541615D1B06FA0418B8BF87E638C1
+:1088B000C38C4591FB42CD0931760D746FBD51B328
+:1088C0000FEAD226845F705B8F88DE267CE17420FD
+:1088D000288E36CC30C3AEA07CE8EEE9E838E43927
+:1088E00001E1A77DB683934B3179760174CA538336
+:1088F0009C74A8BCEEFA892F3DCE6106C8A36F8C8C
+:10890000B2F667AE5C134F0759F174DF120EF18FA8
+:10891000732183393DBC29266FC1B864FD0A290043
+:108920005308B13E56B2D537E6A1099A67E5676F9D
+:1089300097D79D0DB3AEF5BCA3071EB7A1472B5427
+:10894000277E8B3C2C9DB972493153DC9E215726E2
+:108950000153D2234D9D56F5BB155869B572EB34C2
+:10896000CB265CA09BC891C114FF00A372D37DAE3F
+:10897000EE1A26C3303C4DC843E98BE78737E5A0A4
+:1089800046C533BF3385DE568B94CC8429BD057232
+:1089900035C0DB734F016323B92F5465E10F7A6152
+:1089A0000AB0C5F03E9DFAF6EA02D9000F679ACDEB
+:1089B000BF1D2ED81BD82282F2977E2CEDD20E3C02
+:1089C000DE06525A4714478B04982150AB5BD94EB0
+:1089D0006955BB420E76E604D20E66E02B605B8DD5
+:1089E000ACCDD07B9DE926F5FE45B96961FD080255
+:1089F000BE67CB59A3A4A4B9F59E5E83B40B722FB6
+:108A00008B0865677C0CBE8672159B0FF7ED1E23E5
+:108A10002A2C5336A300A078881901681C6355647A
+:108A2000112AF1085EFA24EC81676EA59E5407A80E
+:108A30008386059F2ACE6836868A8488DAE78C4149
+:108A4000FAE9122E8B9E56B14DA876C68084321458
+:108A5000AD70BAEFB543D6588E88C8021E2763732F
+:108A6000295464C2DC13587FF8B87D8B335A78A33D
+:108A70002A1268CD9435A6775F09B52789C694DA9E
+:108A80000E52371DB6431F930BF9D520749DC92C88
+:108A9000E009369462786E49C54F6590F145826071
+:108AA000273EF92BC93F84749229A2AF2A1A676323
+:108AB0008E7E577FEE8F8545068B37958288D88DC1
+:108AC000E70247ADC8ADDF93C9CCDF858A511C9C56
+:108AD00038382E029C5B805BB9336BA07F34EF513A
+:108AE000F7797EF9B4C2B0BBD897AEC63BC3BF57C7
+:108AF00003C9EA50F3BA968A4CFDF91A2DA1C97F31
+:108B0000B24A183D9C1259AA6E5082FF4B22E6854C
+:108B1000A3C6A83D70B6E10EAFC6B3A31CB1C04D4D
+:108B2000BA195475B311EAC4721494ECFA5FC74FC2
+:108B3000085DAB479E5CD83CF8CEA900ACE8117943
+:108B40007C80E20956A615CB2211CBC0083A5A7296
+:108B5000E146C9C379F17CE0486C80C253B7A6F006
+:108B60005AC74594A15BB89A7D2877A46A6717E332
+:108B70000F5BB82602D73D5B7012E6F09B147C9128
+:108B80003A6BBBEDF67AC3DE467F0CF7A952F53996
+:108B9000D01A363AAB47CE212BEB6504FB269A4818
+:108BA0002855AB20C3B3A8EF8DC1220A4B03F04771
+:108BB0005E3960520C4A4A7A0468BF43BAB1CE3378
+:108BC00069D04695595722E8544233187677594868
+:108BD0006E104A038FF6AB8B17C20DFD6847C18339
+:108BE000BEB200D506A3E960C6383DB459928145AE
+:108BF000F96A15CAC4EAEFD6D2608D7A77E18BF5AF
+:108C0000486B77D62B51961B1DAFCBF2632D1E0BF5
+:108C1000597CF1DB0DE65E67CB303BDF8E01C92866
+:108C2000DEB97476884F52849478C0005A177D6BF1
+:108C3000220E2058B6FAAEDEE6BCA5E7EB322DB226
+:108C4000A637ABF246553500D0CA41C6C8721348A4
+:108C5000B0BA31CE3190765E0A0BEC1F98F78C3D9E
+:108C6000241B3B25D4A95345DC1C389582348C81C8
+:108C700069798454D1D6C94B27EA02C79332F3CF1E
+:108C8000D54A2E0EC18D5F6803912EFEAFB1BABCDE
+:108C90004C10DA4F35A8B713D938DC02F15A280244
+:108CA0007A2030705AE90D7BB87CC93D6D16219D44
+:108CB000574B7DCAC6E5E6DD44C7C326BA5F29190E
+:108CC0001CFD500C25F780683CDEF4BE9D684B68A7
+:108CD0006FC167E7C62F31532D32707207514D5B5C
+:108CE000DA22A1A9FE0E368BD98EA2245BE52C8D4B
+:108CF00003F791F36907122D36B381CD1093988A4B
+:108D0000E17C177D56BA1DA82B91560D547E8C150B
+:108D10006D7094F97325E035FCA29768B5808F508B
+:108D20003B8FA578BCCDD491DA1469552028600515
+:108D3000F581EFBC793F514A9CE17DB36BCFCECD3D
+:108D40006B7017FC9A28195582FE0F859E773A762C
+:108D50000916E17D627A531212D78B6856E8D33632
+:108D6000A31EF90794CC06A5007001042CE482949C
+:108D7000ABAB65519AA8F96E22EBBF6E143547294B
+:108D8000CE3B5BD7239A06281A769F3B74DAE21F04
+:108D900051F8361768DF383885E589E4A5253B7634
+:108DA00000C5B90341F80499125EA29F4AE8DEF2B9
+:108DB0003536A51EDB3FD18B5BAF7F0A8B30385336
+:108DC0006EBF560EB8A5ADCB3CD318221B82F6CF92
+:108DD0000F8741F09640C06863860F3891E90857C5
+:108DE000DD27810B9C7DB04DD618AF8FD4B114D741
+:108DF000B86A6FDC5410EFA24A07D9BC7E593349D8
+:108E0000DF859148B15B24242E0AE0BBBF81E8CA0C
+:108E10007F96C07D737322DC01B66145BC62791315
+:108E2000EDBFB9F2B4446E6A9459AC35231D14AB4E
+:108E3000EE36E28E2BF22B836B8D1E71E446E8CE6C
+:108E400039D406464DE77DF9410FF4603B2716B94A
+:108E500056DA109DA7F3A28440E7FD59144D035242
+:108E6000D3B913416F6BA9C82A01BB7A480E6B11A5
+:108E70005D8DF44FF56010DA823BC021EC994C59BE
+:108E8000D6B04DA7D0C445A87567E0254B508E30AD
+:108E90003058B9A22948BE0DA2A51D96146DE871DF
+:108EA000DE3BF4B7FFDE8260B8CCB613C99BB61ABE
+:108EB00042A83D5613BB888A9EB5EB37257CBC8EF5
+:108EC00016AF282E79B38CF7FE8FF1ACFAA1F420FF
+:108ED000B68D9F48AA476978E9A7AE2F2D08342B95
+:108EE000B0C23377F3CB025CBF8AFCCA5D0AA3260B
+:108EF000FBD284D4F58832823566BB13B3469D37E6
+:108F0000AB86A1419B53C5794EB3B6D67AA3E76928
+:108F1000F9B220DFFB4A0787DB3A5FF825DDA2F1D3
+:108F20008C63EF2E669F02808DBA0950E1E4FAAFA0
+:108F30005861EAC9660DD09158C9738BEB5D98F8FA
+:108F40002535E3D99DA15798863F82B725469ADDFE
+:108F5000001F2B52AD9BDD9337247936ABF6B41549
+:108F6000253AE48EAD3F78E043DCFD0C6622291AF9
+:108F7000796B8E1906B321C06C806FA3620EA5BBFE
+:108F8000B84D19F7AF7532B237769C38C67ED3FE2E
+:108F900028E35667631C711CC5FF1A86628629E99F
+:108FA00059BBA99E59DBF224D13EA9B111CE68F379
+:108FB00037F7D446DB2FABB6B4E71B2C24D6BCA0C6
+:108FC000037F96978D5E027055D168A7F7104F54B6
+:108FD0009C73E3E7ABB975719D11F579ECAF6F390F
+:108FE00031300966C6B7138CB2E663F78358D3BA3B
+:108FF000402FC9273D53176C5906DDBEC35E184686
+:10900000EE0C271F29A524028BBED6F295D41F2C67
+:10901000AE952A173134016C7E468A790B291C6B78
+:109020003B6857063D0011545C72C06FDD65B3D3D9
+:1090300092A11E6F36E99C86F33B9A6F58DAAE65B3
+:10904000E72359B43D6BBCBAAD4EBA56B38DA658A2
+:10905000A634AA5EFA92CBDDFF873F8ACAB2CC6DF6
+:109060006441CDA84FC82160387C45F241F4C1CF9E
+:10907000EF5EDE2E209971E544BC941777F3449699
+:109080008E7BAD98C9E4205D5A3AE02FCB61B4DC09
+:10909000DD20728DA521B871867CDC4BADF5AD83EA
+:1090A00016FE9D05114A29AFFF84CB1F2B9C6F290B
+:1090B0002515D12DCED4C717A06179CA961D2D5F75
+:1090C000CF5286BA460C26EAE385297BB8507D4FFD
+:1090D0005987F88212D9369D8F04B436906A8E5320
+:1090E0008835919F4AC42FBEC1494FFD9F7731916A
+:1090F000FACEC2F316A06CD6467879D4FC8935F541
+:10910000D4083CDA6879A0F982AA6E450BEA249E5D
+:10911000A0875D828E7EB21201181D66335E2073B9
+:10912000DF466EEB3CCF52A00EB923B196EB363C36
+:109130000C39412B1EFCCB49C9ECE52C1AC5C2C722
+:1091400098116FFA95E8744B4C17ECB860E70FC2B2
+:109150007D9205A78DEC2E136A93AFF7DBE8E6113D
+:1091600009F5B53FD563B74092E1748D00DA44A8A4
+:10917000D53ADB915045A4BE13D265B4AC47BEE6E8
+:10918000B73EA0E10849B13D414A52C7211611340A
+:10919000DA1957B1BF4CE161FAC73F55C1D91F2851
+:1091A00073A34D38A67659BBF999D3C8515146F6E9
+:1091B00071D3DBCEE770503393E8279AF235F18E06
+:1091C0000005E46E368F2627B34EF7A8E3C7CEA17D
+:1091D000937AE5A82FEFA51063F0D1428985217716
+:1091E0002F64D0B02D06FF0F6DD614CB47C7C02912
+:1091F0007FF21897116BC64E9AF824F0BE81C28494
+:10920000F185B9074CB42767ADFD223AE06B677072
+:10921000ED851C642D823F56C5B70F07454CCF53D3
+:10922000E44CEBF622E1291747B60F054BF062C577
+:10923000884F008BB879C28C1EFE304B43ADF25E76
+:1092400005995E5B89DC150202989AD13317F06CA0
+:1092500099623CDD06A124437FD68B5406EA605D0B
+:109260007E41D7EC2BCBB060BD3D4E2F68AB0B30B1
+:109270009008C6D725DEB2E47B6244C09D5E8E298D
+:10928000C9E04300A0C6F63E47F3DBED80FC624335
+:109290006CECA41A46DE710CDB058ED4CEB467717B
+:1092A000895AD1F12DBB7AC345B3976C464820D07B
+:1092B000A55DE08A5BE48E4739745D9A08C2F76E5B
+:1092C000EC5059E64B2B7A7D4614193B42989DFD94
+:1092D0003607AD0D7744130B22A525E9E45A642423
+:1092E000604864BFB8265E3A9E0A22A19D566A82F3
+:1092F00086AA2930CBC0979907457B22EC09AB722F
+:10930000A5396616E8B19B3F42DE6A129D859D5ED7
+:109310007915D05AF8C8C276EEFA4AFED2B03CAD02
+:10932000BD4474EA42F9A75EB0B5011525A9D2047F
+:109330008DE9EF9F88279FF151874BFAF0376654EC
+:10934000407351C58C6CE96D65C3C3701B26A08743
+:109350005E4E027F5213E36DA98FC9D718A23C97C6
+:1093600055298138FC25C20824F5940CC09BB2799C
+:1093700047EE74A1B5AC5003B38F748E784CB8F33C
+:109380006557D8CC395BFB5803BF80E3295BA76FD7
+:10939000641ED6CA241DCFFD9ADA0B30489484345B
+:1093A000264C8D505CDBA0C879B922F675C4AE623C
+:1093B000BE669FAE73FF278D5F79E7D5CD895537A0
+:1093C000282C505D0385707007718DC01F356B842C
+:1093D0000DA096493D66844EDDA2390A4739F7C192
+:1093E00016E4E94D6294E8A4B1306301A013BE44D1
+:1093F0000FA20234CB4AEB20B01C0946D247C82446
+:10940000E6374FB44804E909BFD1FA6ED9E926AE70
+:1094100078DCC972B413D6261C715D122A46C28448
+:10942000FDB40009683F842997D953781877356DC2
+:109430002FE235D528A096A61E1FBF712914124110
+:10944000852D9C3960B49A7A4B7D9E9DEE476DE5E3
+:10945000B1FDCFD3E011A13BC6A268723A0319C790
+:109460009F2F87C4C5C4C1FF91F3EBE79F4583528B
+:109470008CC4F4FA3C23EB305F3CF93213A06263F6
+:10948000D127DBCE0C82C3908BE082CC50FCCAEAA1
+:10949000F318BEC0BADA39EF8870836307EA5B1647
+:1094A000E486AB86249FB17C340EC81BA13CF1FE40
+:1094B000FB4B7C2A2F3E87523153EEB50623B2E197
+:1094C0003C4BB26E6E505A3865C83376DFE2C6BB8D
+:1094D000D598BA823DB264F970C5C05F9975CD6206
+:1094E0009A745BE1A4B4BBE180FD583E59A188F9B0
+:1094F000040A3F9F6DD81CBA1C3A952718F3AB316C
+:10950000285F4604511DFE23BAB635CC305B10E40B
+:1095100009019CB2368891CAA6F99A04078DB8F55C
+:1095200067E93B6C2934E46599E9ADB88FEE7403C3
+:109530000366DEFB85379850D0D7865E022EA6CE16
+:1095400073DA01A4A2E1EEC5D2938CA5031C987D29
+:109550006D3DB8345BEC486BF6624B44320D67A44A
+:10956000E9D4CABBFC973C969F2412A71823E8B9FC
+:109570008934942DCA17D1D3E4B1897B601ABF4BCB
+:10958000457CE89FD736765037886FF3A3E6E37EB5
+:10959000823F84F539AFD98F86931AFDC07818BE03
+:1095A0007AE8AD66109478CD202840E230894D2EBF
+:1095B00032436A6F4BAF9A460E159E28C532420B56
+:1095C0008A3C2B6B84BE971CF4732DA731E73A714C
+:1095D000AF0EC7D085F3E0290C93CB0DF80C9EBFDE
+:1095E000BD12CCCDDC9910A8960D027FC41CE7C734
+:1095F0000D843DAFEC4A7EDE012A7B6ED6E28E24DE
+:1096000086979E695AED53000E6FAF3958E6F48085
+:10961000B715268DD10F03F83F2BD1F391CDE38FF2
+:10962000CD4DAAF339FF10D0B232A6A5304E9C6AB8
+:109630009F14B1E081240CED33DBFF225401762727
+:109640008688229FC88E1B3DE4976CE51F193AC699
+:10965000AC03826B7EA85D8933415F3B7D22433F33
+:10966000CA2A0AA1EA974751826BD32E8B7F70E4F6
+:10967000D1E11C3EEF16F1289FC3D2C6BF8550C66C
+:109680001B5787BE3A627E169890D3A00F77867BD1
+:10969000EC67A88F10040012DCAC3744433B8BD638
+:1096A000E7C6846F428A7FFCD3795419FAF0929905
+:1096B00018940452F8167525E0384CC4FCCAA41658
+:1096C0002BADE94412F7762BDB45BD295505FDF896
+:1096D000A88BDD21A5B534B8B6463BB083473DFD28
+:1096E0006D83383C5F3765253E2738236E6755EC20
+:1096F000E42004AE5FADB030027C8EA1E19C5A0242
+:109700006394A63605166A780177239AE9E1C40ABC
+:109710000B6A0A66EFA57D1D9AA7A5971EA1014AAF
+:10972000C368F9505E2382ACD5502CDEA5DB93AC28
+:10973000DF9E5F289DCA2FFD0AA314D132E228EBD9
+:109740008911117A9FED39A29B8D0059E91111DF22
+:109750007B8CFB24FB5439B2CCF7AD811982B40465
+:109760000F0C38CFEDBEAF6F9C703BA19EF9BCF1E2
+:10977000D42CD288CFEA16950993F19F2BDCB463E1
+:109780002C4E737C4D768D9FFAEAC3BF4BFE2CB6F0
+:10979000617A114B202442CDE268A4D20C9A2E2C7F
+:1097A0001D55C6543B16EAE22C54FCB0388E7B4261
+:1097B000D5450AFA36B03CFC9BDFEC91DCE3AE13F6
+:1097C00001CDEA36223597511A94423A73FAE27083
+:1097D000995C6531E63CAADA4240A583A05D2DB0D4
+:1097E000B86E1E8F49CC7F81D2DC768ACF2D0C31AA
+:1097F00008A9678977D67C8C72FA7A79CC56A1F958
+:109800002C2AE9D25BAA6A97FB82D212FC4D8813FC
+:10981000EBA2912D4BB61FE80C0E7F56A754527643
+:10982000C167D1A4845098DE1FE36D5F224BFB0E0D
+:10983000232346768A8FB908FAE5BDD93D59ACB1E4
+:10984000F621BE2DD3FFFE1463E9F7802D923DA3D0
+:10985000AC3D609DFB3EEAD862DBF608727416FCF4
+:109860001EAB1E13BA3A1335311FADFC065D50C155
+:10987000A95B6B27775648A9AED036EEC543625632
+:1098800051047ADC98F637CA3E5AF2E9CF96DBA942
+:10989000BB97A028ACF99D5B8038C63AAC56DFB1C7
+:1098A0009598782C4B9D220209BF02EED5349CB7C7
+:1098B0004CB17852F3D03A94733804485A16C50E16
+:1098C0001203BEECA9D5145D84E3038392C293987E
+:1098D000E3B72BEA0F94BE925E8FBB9F77A4A9C714
+:1098E0004CC130CBB86D3B69935CB9B053238F52F8
+:1098F000D6283BE7728D9E5A5974FD68C17A3A6248
+:109900006DB1552D0D4771BDF7AFDFA4E7B174BB45
+:109910001F291FF73F70A3665741BB7F6C3BA527EC
+:109920007BF01AA3CE76259635B60EDDCC70E68296
+:109930006AAE619559D75A607837F90AEA6F678835
+:10994000A5850E268D83C0F3DAB98868F2FC4D4BED
+:10995000CE9B7C92E53D4A2CD19961CC64B72FB067
+:10996000D07020DC0148453FFBB5C76C9F5AD6A399
+:10997000EF315E4211301EE10D58E394890FDC3463
+:1099800041B3B57017249438DCEB67242767982D12
+:1099900008DDEDFC74796C56C30B536807707BF9D6
+:1099A0000C9941C8788BC0F1A4F468F07A007B333D
+:1099B00080D2B654D2CDB5A1AA79BE2F841FDE13B2
+:1099C000F1AB792E82799F7C4F11FD949208C9EFFB
+:1099D00066F0A8F8F41A4707D57DE9D216DCDDDF7A
+:1099E00052B88C18C7A45131C807E45BCD45132485
+:1099F000E128BE4470618BE99C787F04AD4AB06E6B
+:109A0000C0D44C39B81F8D3F7C15C1E5CB75B4155A
+:109A1000A5867D6733B92F49E4ACCDCE362400A1AD
+:109A200044964ABB0666F35270BCB57728EE10C860
+:109A300074D01787221E969578A1E4BE3051D116B6
+:109A4000EB3A4355DA39989A69BBAEA3BF74123F1B
+:109A5000B468A71BB996313FB82D61B57338D49857
+:109A6000E6332BCEAB1EECC3EF40C8688B7168A108
+:109A7000475317A3F0F8BCA137A22DA218F09FB846
+:109A8000BCD9C36476AB8313567CA8DA8EEA9FDD1B
+:109A9000C2DC8C87E79551FB63EB84A3A4EA9203B5
+:109AA000423AF8E29EFA409E02A58970AF8E70A5F8
+:109AB000B734CC2BEA8D36BC6609639750701432EC
+:109AC0008144AA38B8BEC809AE3E7D9DAF53A034CC
+:109AD000861C9E2225E9B6C22CA02FDEE428BBA15D
+:109AE000613B13E568B5B4ADAE96CF5160B55E0687
+:109AF000350A73F67A1B711996608A2F4F318C6A7A
+:109B0000A611095CA1B6350BE84392B2C9956E0463
+:109B1000AC025F544FF387E168F8FEEFA20B189098
+:109B2000DA5CF792C3A8B5CB2732ED370D73167FF9
+:109B30009ABD03EF76D2B16C90F86DB837D73CC2BE
+:109B4000D61D33E9583C678C936FC1DFFC1DF86864
+:109B50009CF2908CC70BFC75D0A1EB25C5F6C445D3
+:109B60006568C737772F2700C7B9D6A0218B678FC5
+:109B7000C6B01BAC623C5F80BFA163089C753AAB6A
+:109B80008A54836CF8C6C0D06DC3231BEF8C7FD57D
+:109B9000A14C1BBEAB7374048907B8C5E0D36DA795
+:109BA000C294E6CE9907DCF7F4DBC1E380740221AE
+:109BB00039B9F923AC19DE3F41BE5C715FD381290D
+:109BC000CB97BED44E09DE4772DC12EBAA99130A7A
+:109BD0004DD043E242818C3EB9946EF2BF2122BB4C
+:109BE000A7613DEF5EAC4BA0B53B902A4840717039
+:109BF000559B98213521F1F93D0EF9CF344E71ABCB
+:109C000037BB13681418267872785B26513F74327C
+:109C1000A1155762683F2231434228C6D3A9D70411
+:109C200023F202F05348E98BF43C472E2851ABB5A0
+:109C300031B9B4CB514726F7C2991F5BDFBB2E74F5
+:109C400088FCF18E24F95396324F6A88184B52954E
+:109C50001E7DDDC359565E5BB996E73A316DB6019C
+:109C60005A804AEA443549E2B16C99A6C2469AB490
+:109C700096AB71BDD7BF3DF8BF16065B21E3B3219C
+:109C8000D4A4D74E2712B06E8D361737961B4AB123
+:109C9000E5DE9BCD98A66E3949DE670C4758718684
+:109CA000206252F98E1240617791883859377AFCD8
+:109CB000D6A6F9C027B162A58B7EC147C373B9117F
+:109CC0006C9100C304ED7BEB3772E70AE8A59614AC
+:109CD000BB79AAF0100A058DA5A09CED2DE19F305F
+:109CE000D71CFAFFDD20D11A23E28DCBB1E5928992
+:109CF0005829EA96C5BBF4C05527662F3B8C760DD4
+:109D0000753B756E0961A4300E8EED203975FAA091
+:109D1000F3704FD988C86D9BE38C3BB020917B09D1
+:109D200050F3EA5A86AECDA4957F5BE16E6D3A7B27
+:109D3000F9E1FEA1AEC8744F1EC94FAAF1A07DC4BF
+:109D40009A56500DABB81A1B809AA15CB03260DBFA
+:109D50005618D79EA82492025855BAC22C6444CEF5
+:109D60000BA42258A5F8F76921E121A757BF650088
+:109D700041D360D777BBB63ECBD7F7CB46F11D7149
+:109D8000704A2DDF1260B15E00CF1539EB2F952D93
+:109D900030FA71BD295594EDDBB680A149DD8429E7
+:109DA000AD030C06CE4E2DF9F9EE3E99A305621FC8
+:109DB000225C2A9138EB988E6275F6D20B7040B90E
+:109DC0003CAA1335DA4BF9DC8D30E04AEF0524A8C4
+:109DD0003BA52F645D3A72854A6D215A9B9D0A7A94
+:109DE000DC876AE17A685BBBE7B45975925F02FB76
+:109DF000EB14212F532CA497516A7A2F12BF2933C9
+:109E0000842F640CA5895D9E89D933C691F26412B2
+:109E1000C10FC408CBA2C79F92ED4B3AAAA8E08419
+:109E20002A27EBA14966CFDF63A4EE83FDA15D1372
+:109E3000D56208BCA431A762142465C498D3776D99
+:109E4000A6B155312AD23A073ACB1BA3BDC6B85D9D
+:109E5000B11A23FAA0BA540A2BFDFFFF23C5B3EEB3
+:109E6000040EBFE8DCCC66E893A984B9B415195C8C
+:109E700019FC4184F8FC0F80C48800D16F0CDE937C
+:109E8000E26C8951358AF8306E3132F356213B5CF1
+:109E9000B7AF30D2E5343D81C4DD6E17F22C52D419
+:109EA000AFFBB3A1C1486D1184965AC0BEC4F697EA
+:109EB000E1B858B1B659E6B384F27E7FCACC655199
+:109EC000B258CE2846BAD35D21AEF10EF929AA7058
+:109ED00086520D7B285E274ED2E16D58DD3A103355
+:109EE0000323F64881E4C147B9470AEC119A9E550D
+:109EF000AD41E3AE9FF65FE0B5253B4EF83E854DA4
+:109F0000E0749AA0B65D46DBB433A287BECB03D023
+:109F1000B13859D71DCF2FEFDC163BE54F93C3C2A5
+:109F2000B95D79458210696324D53B11D37CE08605
+:109F30005F3F702543F2CC4194FCA58B6EED959E5E
+:109F40006798548F9A5748C7A2CEA3329608D6284E
+:109F5000739C1B2F798B6997D556ADEA6B7F48DED2
+:109F60004B11C1290B11AD7F7EA76EA59EBD7D3D16
+:109F7000694FE74DE905CA02B9F689C92C66B8AF41
+:109F800076DF9DD66F8B3D53A0E7AD44A4A462EB72
+:109F9000898E3AA68CA82E7D127A401954A003BF50
+:109FA000D109359487E558A98F3418637BF5ADD96D
+:109FB000D44CB4A4AC2E6F05B153317995228134C1
+:109FC000027B076F8E355A7EE1DFA79A4134A9DA0A
+:109FD0003D9C120B448841B23520482A57B6E89F71
+:109FE000A92A0BC4043368F0A2C3457E094E7098B9
+:109FF0005ABB29529FBF76ABA2DC452D560B687128
+:10A00000561C2FAA016FA4BD4CFFB44500C60246E2
+:10A010006ABC271CD9B710D59D6B09227292270BF9
+:10A02000C25560765D9A87A52F6FB44F8BE182078A
+:10A030004AC18FFE47A560AFF84352581872767533
+:10A0400025D341B62231CBB12CE249CFF495791911
+:10A050005C5770A438CE14219E534143421BB72154
+:10A0600065F834FED2508768FAA39C598E8ABF45A2
+:10A070009947D8ED8CDD700CFBC78BF849A7D34A04
+:10A080005C66DB46FE82894D78DD4D29F825BD935F
+:10A090004E84FB1C875416CE0D3468C68A2411E604
+:10A0A000EB6E9657C8584B696C83DB9C376786E626
+:10A0B000A66E5939EEC236F13C45B16EC7C8EB0CFD
+:10A0C00088C4F4E699C141776818C85FBC55D0D8F8
+:10A0D000131A49567EF8B40E4DDAE99665E407B4D2
+:10A0E0002BD94D765D5529C5C8F0FD13E3C46EBB71
+:10A0F000A349107809EF5D4EDB9330D12B981AA35A
+:10A10000813B22A9A3DE214851FA6162AD1AE1E246
+:10A11000B3C79AB5310BE32F3D243967A5A3471187
+:10A12000FAF2CA7C3A9A7DBE6612D2B36CFF0D1663
+:10A13000DA5E856E4CDDAF787BED82D26E24A56849
+:10A14000ED792400D40B8ECDFE9B9B8BED9F47BFFA
+:10A150003B794FD759D8F1AF1B502A03917D797ABB
+:10A160002F260E764A4F2D6913D05D31E8E85768E7
+:10A17000352F6DB22368E831CF5D3CD22AB87336F3
+:10A18000FC98A0ECD959247DFF2EB0271D3E78768F
+:10A1900001D3E103D21A6B8D4C990564E8A3F7470C
+:10A1A00043DD3D7DD6C5C4B95A8EE93B99D19BAB01
+:10A1B000EF827315B2BE516FD20522FB7DE572743A
+:10A1C000AB6F4261665CAF925C040FBE9B0D96ABB9
+:10A1D0000C03C3006EA4BBB3AC65F7F0B9BAB65FAD
+:10A1E0009A503B7537F86BEBD656F7D7B1DF6381E2
+:10A1F000D656545D8FD25714D243C7A3ABA45C5735
+:10A200005562EFBD6461F5A3A806D8D03E34290F8E
+:10A2100077FA646DA4A391F3716C469AEA7A020806
+:10A22000A0A38078D28A63A0AED476AACA9DF60590
+:10A23000BAA958D77C0650E8B0CD6FD4C6ACC47B61
+:10A240001C0DDB7662BCE501D169E0A67EA202931B
+:10A2500041F064717D1771742F6185CA92CF8BEACA
+:10A2600023341B0EA939DDB60952EE5108B6673901
+:10A27000863DEDE275E22C3035CBF6F65BDBC8EFC0
+:10A28000E091AF6B4C6DA56600C2269C58BD3D4168
+:10A2900036C0D1EE4209C5A4445036DC1F074864DD
+:10A2A0006185E1DE8B3BA3673E7C06F0F0B433E2D0
+:10A2B0003A227D9B6254A848761DCD54D95A80130A
+:10A2C000BE2CB9FBCECF6BBFD6B45B089ACD0721AD
+:10A2D00095AD782EAE8398149324D548A52E359C41
+:10A2E0005217D343715D052F47ED23B2CF4BF033A7
+:10A2F0009FC3BCAF93C6DBA5209E3A62DFDED0EFE2
+:10A300009E693F2ADE0D1940AF5C9C7470DABA9FDB
+:10A31000C2587759B9B11FCA9FCF0D9784E49F5B8C
+:10A32000E03238E54894A17FD60227A88209093790
+:10A33000F63BBFB47D365F53A5620F53B776143931
+:10A34000F1D7EBD195A3593BBCACCF8D40EDC2BA50
+:10A350009266C432962FEED80154C4E2A5D3FA24F3
+:10A36000FEB5317000BEEBC7521F6B1446128A72E5
+:10A370005F8F6AAFFC725602EFAEC5F6F806AE6CA0
+:10A38000BEF3DBB1E007A41A72ACBAB2817278ED09
+:10A39000D7CB5194E8B4307F16EA66AB6B14498C86
+:10A3A00033C4E2A020389F752234901A121FBB409C
+:10A3B000C997DB31EB2341762154F2DD4B8D796F68
+:10A3C00001C8E4260C523D59B0BAC2C8057DCD2162
+:10A3D000C268A23E498DE0528CD4CE838B39B6D070
+:10A3E0007A2E5FC6ABEDD3A5F8300B53DD9F09A3E2
+:10A3F000BFB1399D8B8B98E90563AF2A10A1A79156
+:10A40000524F32D0074FA30062FAFE23B7606A0EA4
+:10A4100030CBD976F6395C2AEA89A261CE2170BBAD
+:10A4200065B1950E391EDDD1DADA98F8577B7C0CD0
+:10A43000BA069D9DF4BF376CB2A157A2824BF4833C
+:10A44000EDDFEA9566EE200E17B70E35479390E8DC
+:10A450000F06E02A26BC13B208D836AAAE1CD7F7DE
+:10A4600068BCE772D2CE24020F4230347ED74F163A
+:10A47000326DF94A6BA365F7B44DA909487EDBAE8E
+:10A4800048E94FEBDDE0E0B6367E803BCCB5D7BD8A
+:10A490005392A65DC744AA2B3C775B6B089DEE7D6B
+:10A4A000EB0CBA52B6C0613126114D3CC5DC749E2E
+:10A4B00054BB30400F357AF41C7A0BBFADC98469A8
+:10A4C000C0181A059CF0CA49B5A085FE26DC813368
+:10A4D000F194D378B79CBABA4FD807E93EE1942DEE
+:10A4E000D53DA365A9F92F3AAB2DA055086E07817C
+:10A4F000D486C3CDCA62E8FEAEB0216999B5AAF789
+:10A50000A2FE0F5127AAD3011956F82C241ED7AA50
+:10A510005F484C7706B3A2B41B53C4F16C513EEDB7
+:10A52000A098F8B7ACE81B00C6B42A30816DDF5E96
+:10A53000D0442340FC59BBD06B7C3CF9E3A95D13AC
+:10A540002F3CE114088D128BCF434A037C5C5CD511
+:10A55000600B4B6D79F3E3D9564D9B60DAEF68AD34
+:10A560008167D8B13D5CC906893705410C6FF69209
+:10A570002C7441470301F5AFB306BBA1BDD013CC8A
+:10A58000D093D9AE3BA442F54D119CF81A6BFFA6AF
+:10A59000CB34125C1E7E9E48A2026DE34A28AF2493
+:10A5A0001360478E4D5A503EBA6FB6FF9F30AE8A49
+:10A5B0009164FEAD193CCB389C8B00C7C1FBE724EE
+:10A5C000D5241F8A0FF93E98F6B543D08AA45DBD05
+:10A5D00018B89E39F09753E1B6FC59B626214F16AC
+:10A5E0004D147ADAE21732D00628E61BE8CCD535CE
+:10A5F0005DC53D8D8020D84B4FAB5A635037B9199C
+:10A600006B2F983F0B60E8B3874A14325E4A0523EC
+:10A6100006DA30827170799635D45B55379379D3E9
+:10A62000006BEAFF5E9320F9E3A057B513AA4F7CB5
+:10A63000CEBB98E02673AE0D44BC73C8A07C1B56FD
+:10A64000F57EEF7A8D41EC3C82ACF677D796AFE1A0
+:10A65000AF74A5598F8D9EEF5215CB9C9941121F57
+:10A6600030A4F75E42B98B32532CBEF7348C4B8F3B
+:10A67000FED63E62FBF09C2A80C9A16D82836BB836
+:10A6800052A2DFC912635CD05C2EDD222FBB51C504
+:10A69000487D9A4D4726B4FAE967F895587FF0A3AC
+:10A6A000E004CF6BA87E9171B54C20FC375745C1B3
+:10A6B000B0BC0494BBC388140BECCF99BBD1010F81
+:10A6C000261284A8A5FB39D7205DFCC700F66914C3
+:10A6D00025C09DC7B50E57195C3D165C4C99876C1B
+:10A6E0008BAAF3A8BBE0B785E223D5C84CC81E6F80
+:10A6F0009143030DCEBA983E38955F35ADE47F7136
+:10A700004CC93E2C6AC57D45B6473A5CF37115E2EB
+:10A710000542C4954E28215AD625B013C4A1582EFF
+:10A720007F03730C6D462F2955E0C734F8D95FC6F7
+:10A73000BB124344EDB62D430A41D91185CB3B3EB4
+:10A7400062C57957C100B35DCE869333D03476F6B7
+:10A75000B182114C65670AAB80E7F16261B117E322
+:10A76000E8F7CAAE5AA041EF106E857E2913B229D0
+:10A770008A843A6CCBC02A13959853149AC991E5F0
+:10A78000183B66B2F1241BA9A2B9B417122AEC5ADD
+:10A79000FDD007F5AA091F467851D6AAFB44C6EAA0
+:10A7A0000A3F640EC63715400E112D93C41F04B224
+:10A7B00091153083FBF45B51D766E4F55C2A3E06C5
+:10A7C000E5B9F63479E554454118E751A435D4C2CA
+:10A7D00087D9A44F7F6D95E9DFEB21B7857983A7F2
+:10A7E000D4CC30ABEF57013E33004C1D419BD4B36A
+:10A7F000251487B54193C19053EB5C1BE0C4AB6B50
+:10A8000096A22ADBD236E3835E6DB2E2D79B357324
+:10A810001400B2F05B69C82580121820899911656F
+:10A82000BB5B7E0D5FE6C5F4495DCB14F981CB635C
+:10A830004CD5D5FB2443D7920D114CB85A0F77BB9A
+:10A84000D577F60B3A7B2C42045AA4AE9E384F3093
+:10A85000937E4E331DF4C9C48CAA5E3055DB1F4B6A
+:10A860000469F6CD11FB62B3EFCFCCBB0782340D88
+:10A87000B8BD9BF7307E3D0B5945712A7553313277
+:10A88000A0E6D097DE9C911F077D2915CE4124912B
+:10A89000BC5D04640A2AC586FDE3CDD6FBD18BBB23
+:10A8A0006CD1EE09BE7FA44D448E29493048969262
+:10A8B00092D9D3499626A6FAFBF7C1F28FAFA6F13B
+:10A8C0003624F798EEF6304DA84D894D9C07A560CB
+:10A8D0006F410F38DDF7DBC6CB1D40CF48513069E3
+:10A8E00095DB1B6A58E8BA9BA993EED17AC46F171F
+:10A8F000D70ABFF414DC178C7886D916BABF0C4B74
+:10A900002F90F2BFA5B2D825060CB99079873EF2F8
+:10A910001D1D11D7A936C197ED750796A2361740B0
+:10A92000D737369D98B7284E5A64F5F0D4BEF80F45
+:10A930005F8034B5C1B2ECAEBBA997827488C838C9
+:10A940005514B30B10FB573ADEF42F80E3E52A0AC7
+:10A9500030435053BD497DB07075F9B2BDBF8337E8
+:10A9600051AE82D83F0EF58A7F6987DA10E8F6DDAE
+:10A97000749399F6F20D549BD9C0291493FBB21B22
+:10A98000FE67D9DD2C882F746B99F803EA8F8E054A
+:10A990004BF8B2689481946CE1E27FCF071471A800
+:10A9A0001E2A520A9147A567F01ED7B0088B8A313C
+:10A9B000EC768E74A28DB249389137641FF36633FA
+:10A9C0004040DB4DB3CE0E1473477A7878951FC99B
+:10A9D000B83E85D39D890CF66560FD303408F716C6
+:10A9E0009AD8D98D4FAE303DD323414404C6A2AE90
+:10A9F00037E7057FC947D757030A7E985CDF9EBFBC
+:10AA0000CEF3E639E0605DE0A890A78CE70121581D
+:10AA100087B86685FA62DEC74FEA539F57ABBFE53A
+:10AA20002FF350BFA28541D8EEFFC9827EA446DE37
+:10AA300046572A5A10485200A3F64D53CA5408C329
+:10AA4000F1C51DA9CE225BA1E812DFEA394E30E73D
+:10AA50003F4A1577D2D6BFE25B276C81CDA15BB4AC
+:10AA60003DA45CA70F7BFE4AE7B701D9FF45EFA2E3
+:10AA7000F8FD947BF86761BDDD57A26625D8D4FE4A
+:10AA80004DCA235023563E39E6A54321D90BF61B68
+:10AA9000E2A55D23162920E5955A68BBD6B5FB7F54
+:10AAA000F70F162982BBEF33DCB6CC7D813D40D059
+:10AAB000B1CBF39F8512A7E9338768F06BE32F10C2
+:10AAC000D82CEEDBB82C3F9C9D9C077ADE89AD9795
+:10AAD000B48CB868F019E17BEF3CAA488F88E5E8B0
+:10AAE000814ED02B5ECA5BA015257B77B71603720B
+:10AAF000192BB8CB10B87C758AF97A4129C70BEDB0
+:10AB00005B0E95192529F1978DD9484AAB448E7271
+:10AB10001AD7AB73C988965D7E4F77230BACAAB268
+:10AB200091587157D5538B05AF569C3851793F7862
+:10AB30004B172BBDF6787049AE73EE7048F8C50D13
+:10AB4000395CCC5B537D7E3CC9C9742C6803B3343B
+:10AB50006810F76219759DF7A0C6B6872CD621C676
+:10AB6000FB4E51F9A6A50A4F0E144E227CE75E2B30
+:10AB7000B366DB576262D6619354DC97D80862E70C
+:10AB80004C38C6B74A965455439003A14F76F624E5
+:10AB900097FD89EF7EF163277254A7A44D96E4EFE9
+:10ABA000C749246A5578862C24A4016CFEEB99D6FB
+:10ABB000F775B6093BF997429B174E3464A5CDB2A1
+:10ABC0001293C5487C44E616710A0946CD062D222B
+:10ABD00037A8419612F549A71718671C64DD8C3316
+:10ABE000B44C11DB6171D66683C280779C7D1E09EF
+:10ABF0007C7C7D58C07582EF2266B9D946B8B20B0D
+:10AC00002B51CC0D63C3050900AF97480C1B4CC2F8
+:10AC100027F34EC2B7C9FB126D0B3FBC7D9C6A3057
+:10AC20007E171C355670CA3F5C66A576453D9CDA9A
+:10AC3000C88C66BC0F34FD18B68AC6F5765FD9A2FB
+:10AC400037FA61476C6D5CE9310E28E40C655631CA
+:10AC5000685D07A35A67E7C9EB123F4A058D0609ED
+:10AC6000F219D6E4E609210805ED5C3E91F5AE99AE
+:10AC7000745049F2CC94D8E465C41A800215278434
+:10AC80001C6BABDA01CAAE83576A078D7326C2C14B
+:10AC9000B54805CA69634ACFC41C096BB6C2FC64D7
+:10ACA0008D2789DDA5BF36DE4E82EE33D75383294B
+:10ACB0009E585DFD33BA15399D14AAA4300E28683C
+:10ACC0000E0E6396A3E4EA38D77E89003B3FF8AACC
+:10ACD000429080F22683DE6DB919B2435E68231C70
+:10ACE000965884E72FA001D0A8039DAF6964EA4E6F
+:10ACF00031F01BF17FA8E97B1258E4F9FBDA939558
+:10AD0000B986A7FB3AA04A29EF06C059AB0AC3F897
+:10AD10005F7ECB34F84CD87D63D32FDF7BF08C196A
+:10AD200050BE1363F20E9338107F3DC8838054F5F4
+:10AD300059DB56C81F02B8BF7804617C0AB99E155A
+:10AD40009B17FC3F40F85D542389252AB691FEA24B
+:10AD500042F6E66A98E985A69BC4364DD32BDEF70A
+:10AD6000DA4CDEF8CAA95E371B3158518E6EFC31C1
+:10AD7000878AF2264A6494E4EFC04D9867C9035964
+:10AD8000AB5128C1CF6C8AD2413D74CD4964E59B5B
+:10AD9000F572F5CF483D260CA7DFE793B92C43B5F4
+:10ADA000BF3700A1A8D3600DB5424411CC5C64A6A6
+:10ADB0001A4D871345C483734CAC5144C45796183D
+:10ADC00032A7E9C0F69E0E71888951AFB5E8E01B45
+:10ADD0001F857B622BF7A14A19246A2B9A5FA9BCB5
+:10ADE000F05D00BDADD7AE10ADBFAA49F75756B064
+:10ADF0007CC8E362E56F93773D409361AC0B5BC524
+:10AE00008EE9BE7D49CEEAD116F4D9A7DE0DB2B8DF
+:10AE10008164C615D3170ACDD5214A895535965F69
+:10AE2000B01FF334A90F7FDECF7401904610E7C046
+:10AE300052BBE108C763992A18E13AAD87C772A1EE
+:10AE4000713E0015A43E5A4AB70088549E945F7024
+:10AE50003A97CB9E9675DC8D7AD0503C1509A3802D
+:10AE6000DFD6E3D351597492032AE3D3F8BE8E1B85
+:10AE70008778EF69DD9D0C16710AD753203B803827
+:10AE8000872B56AF67C76F9F6B4DF22FFC630F0583
+:10AE9000DE26CC9CA063C8D20D32811A4B4C191609
+:10AEA000A1D0727C99AB651D5B659DF7E458A71A2C
+:10AEB000D3C205806D54081F1E2096E2E5BC3D7A82
+:10AEC000DCA4370499FC096DFC507D83DC4B1D8BA1
+:10AED00064B2A9178DD2064262BA24883187078CE2
+:10AEE00047E620DC012311A4E0DEAF3EAD49C16F8F
+:10AEF0006FC2AC4E668E3BFE851BFF55E968BFF204
+:10AF0000999091CC620549FD5DE425680228BCAEAC
+:10AF1000A7DD39505EBF5EC408F34309B8D6EB1E07
+:10AF2000E94978904FDD090AFDEF0BA067276461BE
+:10AF30007572DEDAB747D4720D2EA11398358DB134
+:10AF4000231F82C09F7D466F672CF565F22ED201CC
+:10AF50009F7CCA4701DE7A35695180FFECE3F02817
+:10AF60006E8F769BA1130A42B2CCA530B876ECC89E
+:10AF70003FDC1DD17DDA1F2BB6CAA6F72DA597C6DB
+:10AF8000ED586E33EEA606E95F7B39BFB259991FC3
+:10AF90003E902480B39190AE61D0D9597C59FBAFDB
+:10AFA000A870DFF3311479581A9DF2CBBD0BB3238F
+:10AFB0005FB5715F3A994733BEFE3FF245E7E15F07
+:10AFC000E7C6CF25C35EC75071E4DC849749D8C873
+:10AFD00033A0A46430DA477F45C038F8EA0DF7BDE6
+:10AFE0007FBF255E6B2D9C0BB742C2DA2888098B88
+:10AFF000660F0E1E021C36BFA9418AD812B09DAF43
+:10B0000091C4D850670898AC1CA23DF2288D000A64
+:10B01000EAC0E06A2E016C990C163F0113D0FD6B5B
+:10B0200034748415A462FF25C77455B57B04F88574
+:10B0300089BBBBDF52413BCC8EBF5582911212219E
+:10B0400016AB039FCDEE10B5C60ADC2D434D11F0B3
+:10B05000016147F2756F90BD050A28DFF393FB414C
+:10B06000CE94F98BB1BA2D223A5BA0F9CE06779334
+:10B0700050AECC19056CAAB926B0785CDC713910D9
+:10B08000300B5D14B2AB4531FDEA1E283E9C3763A0
+:10B090006D3E874153996330D3E2E7B08665A9805E
+:10B0A00009D793BBD8B9718BFF7FBF9C03076D0B8A
+:10B0B000A41713BF54E004AD3D10A6E6FED580985A
+:10B0C0000059014FF4AD066DFBBE4E8F5DD9AC57F4
+:10B0D000046967B64D542C4B05F9CC02E1252C5D73
+:10B0E000D3CEA7F09C77BA40CA6A1AF9CAD3E7F957
+:10B0F0002339FDCB78571A73AFE20D2F2F8A206DBD
+:10B10000654EBB2ED76D6806A126935E863B81688F
+:10B1100088EB0790A23799A22D630D883C8B136CA6
+:10B120000D1A577747E91D4E876C1E568E2C17CD8A
+:10B13000C42EE87D49CCA886A21C368E9AC50F0A7B
+:10B14000D0A011A67B2C6562AF9B27BF7970F1DA86
+:10B150000684B9D899030DA88F85A10EDC95E9D096
+:10B160001034D0CB6C237854D1796708F3B84A3BBC
+:10B17000FFC0F9844C3906A830BD4F7FDF3D6CFB22
+:10B1800082A8C3857C78F6545E4EDCE5C973EAF686
+:10B19000DEBE295B1C809B75ABD13A6077514A8D2E
+:10B1A0006C685ACCC8E8676545ED0E604E3DDBDB48
+:10B1B000947F1531FE4CB28849370247F12BF93F95
+:10B1C0008CAB1CE410EF5352125F667C2A079F2D54
+:10B1D000FA7D9F14B7185B129230309AEE0116DB9D
+:10B1E000AD11D8318B155E5AB341285BC9082DFCCF
+:10B1F00004FC464556C151D848F78B9BB0BE63E26C
+:10B20000428CE6F506D419E5F6C44AF99A9C612BFE
+:10B21000B30C17A9A89DE496E9424A062E5F56276B
+:10B22000F470F5F735DC160DBDF22507DE34BE22CD
+:10B23000CFB4C8A73AA868423B0B6A9A657C942CA5
+:10B24000782C165AA3C1BC1D00F955A15729476691
+:10B2500072E09B64D5ECB28931955235BEA75BCACA
+:10B26000AAE26978180850874124B986157FC60D6F
+:10B270006C211C0EC9A2AD29304A70EC98D21CFE7C
+:10B28000CE3CF85FD4C31248D8FF3D0B843C5EBA75
+:10B2900086B5A8A34E7EF773E1E9F0AA5DAACF9721
+:10B2A00089F69A52467DAB852AE2C398DA7BC6A11D
+:10B2B00069C139A65CE656C41D58CB448F2EDB9C71
+:10B2C000939801E274090761BBDD9E0C7A0418AF04
+:10B2D000685AD4FC6D18AC5CF18F7ECF7C69DCFCC5
+:10B2E000DED74DB467A69271507D1FC505AAC1F780
+:10B2F0007F7760410A8BF64CC85FBB189AF6A3971C
+:10B3000049360076103F49E95B20CC9FD7D0A45046
+:10B31000FD6C31E11A21224944585419BCFE2ED249
+:10B32000A91B4962E766AA96FB09CABEC5D757683A
+:10B33000ADCBC7FEC561127A5A90ECF3009D47A2CF
+:10B34000DEF8CB2862B52A80B09EAB841136AC6D96
+:10B350003DB0074A3D5F039489410E7FD793E46671
+:10B36000F608B1AE8B48947C7F40D94E42566D555D
+:10B37000F6A27653B6BFB934E47C0F0416D0C09859
+:10B38000BDF89BB23BE361AB31CD72FE6C3930C38B
+:10B390001BAB943179EC097AF609E1129F074CFB5B
+:10B3A00085FBB0758A1A3CC001576BAD568006B05C
+:10B3B000ADBF585C306B25891EC8933084C28DBEEA
+:10B3C00038CDD4AA9CA38ED1EB39639076D9A8CE80
+:10B3D000C99CBF850C521B6442B795143E05B3E06F
+:10B3E000C0882B37C0BE3B0DA399E9BE5FF2FB2E90
+:10B3F000B73009A53AC9C1CAC24AA071CA1ABF75F5
+:10B400000784CB715F520C0934EDD4E180DB76EB1D
+:10B410006B1EE98384F1CC53D1194584EFCE02072A
+:10B4200041E4FDC63692B511089D51A85C8C76604A
+:10B4300001A68C37D27DBAD4718D55152BDDEDF672
+:10B44000D01B909D96936BC12944CDBC7D2E3E149C
+:10B45000B52603DD834E6F06FF8D82490AAF0A527F
+:10B46000A7B9E5D4FBDC73EC56F16D121E076B2710
+:10B470008AFDCC5E0DCB387453FEC746BD0B2D6ED6
+:10B48000BC50CC029BC4CC042F4984C778A0E46193
+:10B4900097161A2DF6D8070AB207873F949B1E8C81
+:10B4A000B86F31B617CB267D22AB94349BE3A2C58F
+:10B4B0000F836BB818A9EF6A29AE707AE2DDD2BBB0
+:10B4C000DD9C9870157CA50BA147E4B94146762D0B
+:10B4D0005628AAE189A150944DE40DB7656636DC83
+:10B4E0005A890E3E73FBEDF66612A65ABD870640DA
+:10B4F00095AE07092756B8BD2E5DFA5E341FFF973B
+:10B500007F32D96F7CE0F9C181DCC93F6EC2188DF2
+:10B510005E70A6137DBFBDB6A9AA76DEC6EAE5C2F7
+:10B5200021F181555A62DBD7113172FD43552786CF
+:10B530005F52FF3A96B14E22B850428E44E45DBA53
+:10B54000C044D8A02AC93331CE5489050C67A51749
+:10B550004A3591E0022AC9C0BE302614A030D73047
+:10B56000BABD5B3D2C2CBB910D48075E6269F3F0C0
+:10B57000C352B18C8403D7D2FFE154422EC20D9A3C
+:10B580003CAF1C5C8CC81BBC0925F8B874D384483C
+:10B59000F960FDB16BFE98840643C9B9568DB67744
+:10B5A0007F239B7C25D8BD62DF19AE52AF644C7BF4
+:10B5B000C7F9D8380F8CBAF4875FEFE34FCACFBB17
+:10B5C000F6B26D178F9DCDD48A43BFF38F340289B5
+:10B5D0005BF04610C1D50164AE7BD3AB85136E6DB5
+:10B5E000186FF83BD044C4FBE060EF53886436A486
+:10B5F000FE2A14B5EBAAB3B9437EAE940CCCD8C2E4
+:10B60000A17E841E689074133BC0B01665BE21569F
+:10B6100047C9D60E25D870EC30702E03A02EC30774
+:10B6200049E3B488D1008171D99116C948C9A542AE
+:10B6300032DD06B33A5EF871034E589143552B4EF6
+:10B6400043599BEFFC4A398089084D6AE12AA26C74
+:10B650001553880E3265390F81FD993D70CFFDDE9F
+:10B660003C82D2559E1832C50C63053EF2599EDBD2
+:10B6700005CFF00B131E33C667BDE692522D7A67D5
+:10B68000FCD9AA42E610BD9E1C572199CF440964FB
+:10B69000043B8F16DE3D6DD8A0FF4E77957B0E9D47
+:10B6A000341D3139FE73D68D5159E5C4B396A72F99
+:10B6B00089EEEE26F7784B9831FB078EB2CB2981C5
+:10B6C000841AE20C3F36DC1E408BCEB551EA47CDE2
+:10B6D000A6D7364D479B0B514E8A445BBE09B3AC8F
+:10B6E0004D0A08A3AC9D7ED732F1F6A1373731A9B8
+:10B6F00009F8AC02AC950E3483DC176DDEEA66699E
+:10B700009EA8F461A56A5E3E09C21092150E2AE851
+:10B710002C3682911850A017A40AC854AB8B4476DB
+:10B72000D5CEE95F2953FFF288CAD58ED07D139F0D
+:10B73000E7B3ACD0C2C6E3464786E012542547A320
+:10B740009FC60EF4600306E84EBA2113DBCE63EA0F
+:10B75000EC161CD1D96BAE1DC9CF8E342FB72D0B73
+:10B7600076B63930D43486F6490ABBDA68487F3C6D
+:10B770009E8CFA8B6175D18CEBDFAFE71C47465D81
+:10B780001E44DEDADD0F5BD8EA82F7ED4DB1AE354F
+:10B7900037FF0CE24917C846EE86B3276A0C568A73
+:10B7A000ABD2AF3B48D4A0664356E9ED52F98B16B5
+:10B7B0002454B5BF64A576D7EC0959488413B54124
+:10B7C00028C556DD06C705E47684DFD6C6D7855B77
+:10B7D000C64735313837B85B5BDCE7A9DC6D3D4FD8
+:10B7E000D1A874FC89E19C44CC26401DD339F75D77
+:10B7F0007C2AC8A9CB84E3BC7C228536BC9CFF0E86
+:10B80000F84740478CE7A9822DACED27E9F2FCE12F
+:10B81000ACC3E259A2F167DAC27DF9D4E3427B9E60
+:10B82000123DF7D4455E8C49F701FF98C3EBDE2843
+:10B83000D5CD6F12259268BC357238A62AD4067D04
+:10B840007F189C672959448A1585E9B0964054A908
+:10B8500070B450F8E261122D331D29004ADFED98D3
+:10B860003F308B241EDCDFCF91E80478C9ECDE2961
+:10B87000DCD41E6990E759987D5864F3B408E13030
+:10B8800064F132AFFF9E74A2425BF315F291851F03
+:10B89000F319726AAA4BBF0749B7F0A1B3C23C853E
+:10B8A0003E00899FC9E7C61D44DEB59F1BECF39F90
+:10B8B00020DD2E10DD0980D652B426E6976F96D192
+:10B8C0005E5AB3EA13FEB69129220ABFC309028267
+:10B8D0004F28A67DCAF607312F9903454FC9A733D4
+:10B8E0007CA99394A35422A88A635E22CC58635EF9
+:10B8F00002052A33DB20CD5DBC70986DA5D4C74E00
+:10B90000E194FDEA183F572311E01345E02AD26A7B
+:10B9100040184567C1208FEA5B3137EC652EEFF2A6
+:10B92000C19F5846AD77B449341904E868F2AEDADD
+:10B93000C23D2928354263AEC626ABD1124A5031EA
+:10B940000F23D846B9B6341F4884FE1A2A2DA726DD
+:10B950009EAFBE8139C2A19F2011C6EF15442D397B
+:10B96000F5F713B64D925184CFB1996251FD92F023
+:10B97000C0B3E6F127D75499C51D760C3E254D2757
+:10B980000977A31AE011970B064E37BFA620A24AEB
+:10B9900060559A10FD79F8A5F58293539CB242CE7A
+:10B9A0004E80A0AF491AFB2BF2B9AF94BFF56920C6
+:10B9B000D5C7F9EC1295373029ED5F78034D55F96D
+:10B9C0004BE9DB45B37EE2377C984BB808A1AEB7B4
+:10B9D0001137756AD130C71A40A176E82F3EDF4390
+:10B9E0007EAB35A3ACCA894D6A283C72B7E7082202
+:10B9F0004F4143819F4FECE9BD7741BA1F3B97D937
+:10BA0000FC262F5B0DA94A358E880679B736C7B458
+:10BA100019A9C61887A17D05E19C77B26F95CB2740
+:10BA200089AE33E5729F1DC7EC008F0A8E804F717F
+:10BA30000B666F16B549E6C8189DBC1B74A8ED4788
+:10BA40009D5678CFBC209179D5726C8F3EA908FFA6
+:10BA50004FCB602E5BDBE70871027E896E1998433D
+:10BA6000017E69E1927E1786216BE45508E7CFBB22
+:10BA7000E3E7AD0910EC0DE99285BC055A31E9C840
+:10BA800050A1CC2B6757C37F5B17A405139C743957
+:10BA9000DCBED7A60F0D72ADD73BA2000AE517A3F7
+:10BAA000B63EFD876CBB53CDF5F0E1B6F16B4911A5
+:10BAB00039618B4C306C0CF3C2D574EFE815064B32
+:10BAC0000081D7E720D4FC03D1ED497B7CB56D2FF5
+:10BAD00070F3D0543B5DF2134E63984975C7FD92E5
+:10BAE0008C2D0E1C30A8555F4AA7FD7A2C420665A6
+:10BAF0002488D481CA7216207DFC22E3877D7F0AC8
+:10BB000041450A83DC5F78097626B7F37D01A4AF4F
+:10BB1000FD714AC44B0181ADE2B556D2E743938231
+:10BB2000D02689DD002A3924F4EB30E5CCFB06F27F
+:10BB3000EB750B78C349323EE77435E3C21AC05641
+:10BB400031A9EF26A84DE04218728B095DF97FB448
+:10BB5000F2BD681F43BD16E7FC5BCB9DB9D00A73ED
+:10BB600068E89CB5D7600B7B32CDA1CC447115EE53
+:10BB7000CB6CDA6DADEA5C5E8E60444C6A35EEAA41
+:10BB800055693898F5E3C7CDA6E6978A76E94BFB69
+:10BB90005CFAEBF2A422837379F8349125F3FB85E8
+:10BBA000EADA3AA06B2E7549969C746B214109061E
+:10BBB000C0374864B6F634B4DA29E9A8C7DA493799
+:10BBC0003F1F1E5B5846470C4172B1E8B8AE039068
+:10BBD00037CBBCD973A5628D3F95AB06EEECEB413C
+:10BBE0004791A49A85BEEAD9F69D358E89F1D25740
+:10BBF000DF5FF750280B7268FA84C5D8D772CEC8B9
+:10BC00009F667E799AECB3E9A24EDEFC4E534775EF
+:10BC10006E2CA10832D175A6B2041FADFAD0EE6524
+:10BC20005886A7990E636DBF0B4FD3EE0A741B04A1
+:10BC30002C239F67A8C669DFE84325BE70B00DA915
+:10BC40001F399EEC962102FED6B086FBB70B9427D7
+:10BC500017FAB7AE2EE8D1E80A1AB754D405DCAD0E
+:10BC60001CF4761636354308C13F13E9447E30DEB6
+:10BC700032B902A5B81656FB5FDBD110FE07253D91
+:10BC8000C92C0462B008FE99856235D3CE5CE5FF0D
+:10BC9000902FEF5E30B9629CC9FA911EB2C4FCF7D6
+:10BCA000ABAA3159C7CBEAD98B8A6CDD03CBBA7BFF
+:10BCB000D7C7BA90353B27E39297FD437B8F351862
+:10BCC00013AA919E45F888774926B317B6AA0FDDC7
+:10BCD000E9431CEA54B5272462796A37B1DC4A4843
+:10BCE00090257E6B10655D43C2823143D943FD2FA1
+:10BCF00078B1A50A2A7823035D4EE9EF29C60340EF
+:10BD0000B970D0EC65FDD2DDB39989DC21D9AF38AB
+:10BD1000439B3123A5808EA1D5D0267DA31A4DD675
+:10BD2000D382560047936BC3AA75D4A9123176C645
+:10BD300044AE2606C8399FDDFEDD662095EE3DC186
+:10BD400040736433CCAF6BF901DBFB9A4CE02165A7
+:10BD5000640D655E84950D6A7B1B31D1A180ED0970
+:10BD60007DD63367B1ED7342E25039A119CD54FB52
+:10BD70007A24A239B31B87292F33D4E0738FFAA614
+:10BD80007B9336D4BFF11FF5E3118B8A6192539BED
+:10BD90004D66FE4CDC14B62782DDB29F0D51FE5677
+:10BDA000968E5CB39D19C03E25BF7274BE637981C7
+:10BDB0007A53B1F6D073E31FA9473431106BF25DAB
+:10BDC0003F36333A65EC9C8F3DD8039661E8F856D0
+:10BDD000A813FE63D2E559E9E8C9F1180184CD96AC
+:10BDE0000F02261A2DF1D26ABF09DFB191D2446643
+:10BDF000E7218573C99399F50BFAFA121A30B36AE1
+:10BE000030CE3F5096E3AEF74197B8DB444C61F338
+:10BE1000CFFE481C63DD3921EA425A5AC8823CEE03
+:10BE2000A6BEC1C6E3508F5E7913C3C2DF7A5F0836
+:10BE300063FD75BA6B9F9C2D209E8597B3B5AB6A49
+:10BE40005D716310499A3A5DF19F0027A49D931993
+:10BE500010054E9DCEA6FCC7E923C5B94146ADC02D
+:10BE600070DB84CD63BC1BB207F3599919DB25AF96
+:10BE7000AF5B0DBF3DA6B1BA2A35D8481DDFDB59EF
+:10BE8000B1CFAE11F52D9EEC9FDAEAF3B53D81CC32
+:10BE9000E38383B1DE84D9DD5978621B69B2A7B828
+:10BEA0009938E4D9F518E53BC478147958BAFE05F9
+:10BEB000BE9034F81292A8B77A0403F4CFAA3434AF
+:10BEC00009AA84E9C84EB74D5D3F8CBCC7918B4E23
+:10BED0006A8FFA4AC7A75D2A7D0E9D88876FB16C6D
+:10BEE000197495D29663F36E435509E446EDBF434A
+:10BEF000D91C645D8C0EB5D1803BC25C5D7F95889A
+:10BF00007E130C4B14BCBEA5155AFF4D4BA09F4091
+:10BF1000D7A8F2B52019172977FD30E83CCCC21913
+:10BF2000338E7A4C34CC859326878EC2D9DE494A2B
+:10BF3000360753DE2501F2070CCCCA938D99819DFB
+:10BF40000A62148D97A2D4AFDA5E0B65EA6FED2A10
+:10BF50001ADE7B1EF0AD23637C73AFDF1EE0A348C7
+:10BF600063674F32B91B9C9FA83B131C039629E0C3
+:10BF7000E3A3B4F5984F1256B33E94CBB99142BFA8
+:10BF8000E7EA8186E934FA5C092C6F61AA1BD6FEC8
+:10BF9000DF824783E773AFA2BDB65DB3F834DE330B
+:10BFA00004B2DCAF58423557DA86F4873D7635CA9D
+:10BFB0005CDB42A643CF1AC210F471903AD109500B
+:10BFC0007A83ABE594AAE6A93A267BC412A06F480F
+:10BFD00047BEA7A3A3B893C4368FD9A590A6CF58C0
+:10BFE000ED24F98D1B21B36CBF1DC7F75BAF8D34FA
+:10BFF000B5E6007AAFE538EC04B20F76CA61AC0260
+:10C0000013C4412B7EBEEC9ADF14D9DA17D4481E34
+:10C01000B49DE4403E657016F3980F2B3481CC2814
+:10C02000FA198CF5A8278CF1723E6792079F2802B7
+:10C030007B1B5A2B378260221E961E02402D575AB8
+:10C04000C09A909A48EB5BC6E8BFC59ED02CFAD444
+:10C0500006E1012115C740C2D1A6E5A616DC360FC0
+:10C06000F0F404D43B3DFFF31734D12366FC0C14E9
+:10C070008FCB0AA2C0CCDEE47EB60073DA40FDE2CC
+:10C08000E6EC0376B61F8468798BB277A73BE1674D
+:10C090002EE05B5AA6D1F342D0F2DD99149AF674E1
+:10C0A00085FD263A103E60F16600FBF8F2FC84162E
+:10C0B0002287923C9CE37212A18988DD62E83A866D
+:10C0C000F5BCEE314EB374B4BEB6108DC8671CB863
+:10C0D000A8BE26A744FB912B48E6F98C0A3A5EA33A
+:10C0E00041D29307127A1434E5B2F63DEAA37ED228
+:10C0F000081630E3C5970C19F518DF12F37F2352A9
+:10C100000353F718CD28BA5943FFF724E370A0046E
+:10C1100077B92512AC940C6D6EA7526BF22DD6AF89
+:10C1200079361281A6BDD8B31A07CEE468713E777E
+:10C13000A19FDDACE1A456CE95C295B185082F0D27
+:10C140005CB9A4687DD5B0E9CAADD987F5E69C96FF
+:10C15000DE426821801722E91D1D6BF0279F1D40DC
+:10C16000A1B9B533C983D1842CE5EFFE66117CE714
+:10C170006449A53B78606D0E0EEEA3514668DA0562
+:10C1800013CF54C9A4E5E25F0EA4F9BFE43B9218B3
+:10C19000FC2131BE7FF72B58244ABAA47000E2225A
+:10C1A000B191BB3ACE36A40F6C5A76C7640ADA8EC8
+:10C1B000A8E090E3F1672D5F0721C9E9D93A8A2801
+:10C1C000C4F47652C7CB2034637049E6731E94EFF3
+:10C1D000EE15CD5F469AE2349EB976AEF24737B699
+:10C1E000A2EAB707FD784567FFF7D8C2D4B3A967BD
+:10C1F0000134FC886238A2784927302198DF501139
+:10C20000F5994D950BAA5DA4A19CF7396609F7BC79
+:10C2100078CB3BF0F312917EDA6DCD700D7230E782
+:10C220000E4511562CAAF8732014268F663A352E27
+:10C23000284B8E9687D7294385EA4A1488F7C69FEC
+:10C240001B3F3D2050EE6CC1AB33BF939CAE065FED
+:10C250006EC569B98530C14A1832D785D7B119285A
+:10C2600006CB4F02135641140937649C828C821806
+:10C270005CA792C852AE6A2F192B32B8E5974FF6D9
+:10C28000D0ADC12509A0E7DF99B80A5102C0B7FFB8
+:10C2900078E844198122B20A593FBED7F15BA40B5A
+:10C2A000EFC1DB1FC6486BE4C374F4A47590ADC442
+:10C2B000B8932010450CCFF3D64334B35930E7E29E
+:10C2C000B0C9F5536E3E34F453F9E5D8C79CD9FF95
+:10C2D000753C02EDB8CD9BF680C824F8FAEE223A00
+:10C2E00067DDDDDC13668F4DF51B616C7728FE047E
+:10C2F000B5E3422D29DAF3FB4AC96F0B530E29D25D
+:10C300004DE9D057A9521B231E28BEFD6081F1952F
+:10C310001CFAE198F261A8812E7F45324AFDE7427E
+:10C32000B09417C86912068FD1AC888F9355CBE8AB
+:10C330005D847B34913E0EF6E7B525F65622FC2946
+:10C34000AA2CB22C7D64F815550BB4C441AD8106FE
+:10C350000C82290FCF6708CFDF9675CC416D8CC159
+:10C36000BC41445D98E04C81306626EE0E9AEDB6F5
+:10C370003334194C152C5DC0D1D601021AC0340ECD
+:10C38000FFD25AF073D03144A517409AB4AE6489F5
+:10C39000EE114CBC30065DD0593813DC9E8C094937
+:10C3A0002B7255DD487B07E245C184223B4B0BA530
+:10C3B000AD60CE146BC1D02F783EF818A01266CEB7
+:10C3C000331DEEDF7B5ABCD219F4DA554C8CD8DB26
+:10C3D000CDE9A3C4B849AE67D17723ED3C0B7850C3
+:10C3E00067AB8FFCEFE91492805F7E177DD8A1F6D2
+:10C3F00012570EEDC5A42C4108F1BE1C97E924D8B4
+:10C40000C7C157912A8D619C9F05996F7C00CD6BA8
+:10C410001B52A41046DA877457AAA39B56C5E7336C
+:10C4200046574858F89B1FDBDF82ECC062A383723B
+:10C43000D1F4488746E5852542A3C9AB35A64DCD45
+:10C440003E99AAB2FCA8D9A4E8FC277AC2578F4823
+:10C45000459E754B42132F024FAFC1394D8D9864E5
+:10C46000CEDA0EFC4ABA2AC886168B78948E53050B
+:10C47000452B97973B29D38126218C95685BC75F15
+:10C480008F193D0824EE61E5CCA2B05D79A020377C
+:10C49000BF36301FC7922B6215026E6934A493CF4A
+:10C4A00000F0EC6ABD45BAB4A02BDC34AECB65BF5E
+:10C4B0009616AD024031E4C9B5C0ACD6EB1AA870EF
+:10C4C0000F6C267B7CC354C6FEE63635F8AB196785
+:10C4D000B031C03B19C2A0C68CE66C0D4F59CDA03F
+:10C4E000E58015720BD646F589FD3CCAC8C18A1E87
+:10C4F000E751733EBAE17DDC1FE98C0D9203F00732
+:10C50000F260E4763CF23203BF22D10FA1F537226C
+:10C5100023F09D402A81C23F74300D10E0DACD44F3
+:10C52000738EFD35D24A0139108BF81F2E7B8F1880
+:10C53000A1579957B01C77F8E528336D644446BD80
+:10C54000E6F1BC2D0A9A77A142764C6F7BE88F39D1
+:10C55000FE5352C0545BF047234FEF81FA2710D1AE
+:10C56000DE36B99A599E70D7F4358D7B3F5E6BD31A
+:10C57000E13F5B24B7284B433F3CED2C40A2DD3329
+:10C580001CF775DA1B95D46410C43EB2FB9BDDD258
+:10C5900081FABF72BE2B15C48605C0B3E42FB1D497
+:10C5A0004F954C8E1DFBAB23C31D1294502BFDBA2F
+:10C5B000B39025FAD5176C2558D383FAB59376DC5A
+:10C5C000D9FF95A83D84E8D4A32543ECDCA0AB3E7D
+:10C5D000B9AAFAD154A80E2E668ED27DCBBAFA949F
+:10C5E000CBC37A675A2149B129391F521C738D9DDB
+:10C5F000F82210C7865D07752A651D1845A6AD6A25
+:10C60000DB6C0BD75705DCDA67E25DEAC8B5FA26C2
+:10C6100008D06E057576718F9901BD9C3FF5434C2E
+:10C620007947F42E6A2B86513FE5CCFA4E67340DDC
+:10C63000A5783B89C9C101A9574BFC1ADBBF9216EB
+:10C64000EFA5941AA9F52F7D421CBAFD1A46CFE436
+:10C65000893D8E1E667B03145010A39957E9D74C71
+:10C66000BD36AD714A14F89775CECABF626CCB2A3D
+:10C67000BDDF002C8BC246CE65542B03215B56F8E0
+:10C680004F75F8B22E4FB3F7CD8A6F4C3351C79C1C
+:10C6900076323E1209205E160E46C297BFBB67C2B5
+:10C6A0004B58ADEBA9FE35672E4DB077F4F2D2C5ED
+:10C6B00057BF14239A966BDBA68F9E61380CC486F5
+:10C6C0007E0EB644F9A10218627FB363444E80180F
+:10C6D0009367C83E4424800509310577E00826B3F6
+:10C6E00044E07BA7CFA79777EE914F5BC05FCDEE7D
+:10C6F00019183BF5D617759BBFCFD07E0A6CEA237D
+:10C70000193F789FECC82AB5511BC5745795524AFA
+:10C71000541A98FE66D8B52D0947AC49BC06BB9F94
+:10C7200083513501951B98FF53A3DBDBCF74CA8F70
+:10C73000B38BF2960DE787CED8511378E4F1A0546D
+:10C740008A1385EB41F39AB7F068352B5FF22DF72A
+:10C7500061D7BBAAABFA9798E839D67627672CF24F
+:10C76000B4F69E77CEE963BA0439C5C54860DEEDFC
+:10C77000E710EA918951FA17FACAE1FE1C0C24C8A5
+:10C78000B32E420F1DEFD87DDC7FB38BD8DD2C6339
+:10C790007D98CCAD95B8B50826894D0D284D41FB47
+:10C7A00061108F8F34BFE2E55AFDDEC4C9205C3AC8
+:10C7B000359440C85BE15875CAF4D79F40BB3D0D26
+:10C7C000EBEFA0ED40BCC8B492630265BFED778C7F
+:10C7D000B70A591927116D88537C047109E2663133
+:10C7E00070618474C375893B8F3A72549AE49EC415
+:10C7F00053735F2049B6E85278E438E41EF469B216
+:10C80000BDF4AF3752789B9620A755CFBFEE29C510
+:10C810003C160EECDDCC527F2CE8E14203459B91A7
+:10C82000FB9CF943683BCF510A928D2EDFAC1AD6A0
+:10C8300059FBA4D79B416240E0CA36B7BC10FFA0A9
+:10C840000BBF3371E91781101B6224836EBF69B57A
+:10C85000B6A39E9D7E0E18A0E60201056813D11FA7
+:10C86000EC911EFE6407A3CC6622B6081D095A8906
+:10C87000D589DF8B7FCCBF0F607D1C8E722730FD8A
+:10C88000689F1488E25493BF8007ADAC5AD5AC5072
+:10C8900040E7ED72B06D7EF22D04385A8F47457C2B
+:10C8A000C7F293543BBE8D7359B8CEFA4C67182A21
+:10C8B0005F5CD99BC7F641B9984BE6A576F5B951AF
+:10C8C0009BC819510C180A7E3F64996811E685C708
+:10C8D00031C4CA49E5976BB9AC85594F8DD4E43260
+:10C8E000FF67E4144FA7FCF39966CC2EAD67A43E16
+:10C8F00055A55360A70E375104B893E75020343044
+:10C90000E31660EA92ABA5E732F0A61B43EF7D2069
+:10C9100050C8731717C1FFDBF8E78C0E43EBCF81CC
+:10C92000C15DB21F54522653D2A75481FCF88BAF7D
+:10C9300012F85B30A1BD43783AC9D68CBE2A98A7BD
+:10C94000736DC56C2A92D2A16AC5E96900519DD167
+:10C9500065E0EDFE6C5907E292012B49FB1AFDFFE1
+:10C96000B793B1D1FEE27D262228C162DC9F6E4AD8
+:10C97000AD5A4A83485D0838429929E056CD41B7FF
+:10C98000E512B37739752FDE0418F2CDA3032779AA
+:10C99000B41C0CE0E06847A1F22423C7407FCBE53C
+:10C9A0007BAB5D0CD5A04F1055A534A73071408DE1
+:10C9B000DB40153E093C1D958E88E6DE5A2597A082
+:10C9C0001FE50E7C7BBEB60F88B41F9B937EDFAE47
+:10C9D00001BE13D2C73B0FAE994B21981B5350D8C1
+:10C9E0001412CE65A09B9A993B7A902C77A29185E0
+:10C9F000C9081948EF4D6C387C0A81A05B6A0EBAF1
+:10CA00007CE496506E0B31495F1D4001FBD75B4DB6
+:10CA100083664E4D89FB5D3A06A27AF30E7184AAB5
+:10CA20004F8B224B1C524D97778135E259643198D8
+:10CA3000ABEEDDCA43389E0053B6F03040924B480F
+:10CA40008FE2675A1B34D73488866876E3AF777FE6
+:10CA5000E29351140B03F73170B01C50AE06044141
+:10CA60009446CE8F31B919D63B368C81BE115430E5
+:10CA70005B6CCAA18E874BCCE677C0D86914D428EA
+:10CA8000C97193AA7B3E44A7079F61DE06C1B63BEE
+:10CA9000D00B7D87164735E338515C323A5358EB5B
+:10CAA0000B049839434A6E9CBDD10634BC5453F5EF
+:10CAB000A48FF9C3513259EA63485D02486487CDB7
+:10CAC00017FF3312A16BB9A3F8927E07BA2EE5D8EF
+:10CAD00080274A984DC0344BB213DEB4B21456DAF4
+:10CAE000EABB19D574A6AA5F0F2A15907A2C2F7469
+:10CAF00081FC884B506A498306587B2B48110407F8
+:10CB000086842B8DAE9471C946883FCF0601B2A4AE
+:10CB1000E6ACF431A2289EF93C670F6C9B27A2710A
+:10CB200029B17AC26AB582684735EF71235002DABB
+:10CB3000A6F4BA63E2D05C5D81A2B97FE88A2A6478
+:10CB4000894C8BD9C13530B2F9025CE50C76E48AA8
+:10CB500084223A80308DD32EA5B179DD0F1B9790BA
+:10CB6000584F11F9A2F621D8F259741A40E1820CFB
+:10CB7000305E4B40991846531AFB9808E50AAED42C
+:10CB8000639CDA26DE4F67DF8B696776DBCFF26660
+:10CB90009C7F321D8CA4C7CE16BCDE84B8E9F79FFB
+:10CBA000935B1731C71CF8D66710D7493017B76B9E
+:10CBB00049124AF4F1EA73BDDC83EE59575B3B87B7
+:10CBC00035197767EA6F3EAAC24FAA0EFE3A5ECBCE
+:10CBD0001F316B7D9277220AC3981197BDD4784498
+:10CBE00026EFD721C4E2F9DF30C1647D7B240476CF
+:10CBF000D832B70252C387E07CDE5D0CE827B093E1
+:10CC00009A3793255518A63740E7BA4DD93DF720F6
+:10CC10001950D3B2365E45A77B6308D1796AA64125
+:10CC2000F6BBDCBB6BA7A1737D5640DED7ACEEC76D
+:10CC300028242A58A5A41BC098302F264FBFFDCA10
+:10CC40009272C0BE5299ECF9A42D8AEAB8E8D923B1
+:10CC50006DD7668714D3E9BCCDD2D80461BFD34B5E
+:10CC6000CB5B984BC5BF750EE101CAA47C5E95AE47
+:10CC70006D1A3E8A851882D202942BAF9CA58CB285
+:10CC8000D09304C6ABD61C17899CF5679D918FE4A1
+:10CC90008EE1CE8AB294C0C3919B8A6385A06BC893
+:10CCA000B9A81102A71804BC9612E55372F59A456B
+:10CCB000DD9FABEDB7746E696E1ED998DEE035C9A5
+:10CCC000A1005C986128D8C292A5D8BE9743A22241
+:10CCD0000226704E81ACF46DC4013B9407B31190F1
+:10CCE00029649175AD62F7640193FAB20D37853C02
+:10CCF000556C9AACE03A56B7C8DA42486F2A1032FF
+:10CD000031AF975B496941665C56640E1FA440EDE4
+:10CD10004617990FAF78BFBDFE71FF42AD9CFE452F
+:10CD2000763DD7DFB440C5478C82E607AC0E9DF850
+:10CD3000CED1E396EC72F4C51BE840F2A01CDC49AE
+:10CD4000178F606FA34FC4CF24F53DA7AF30DB2E04
+:10CD50009C0216D360AAE685EB67824A0905D0914A
+:10CD600054821D3392E9F9B0E58EDD1B660A026834
+:10CD7000E9411D33B1D970E1A54E5F251AAEDF53ED
+:10CD8000A9D5A2E0388A1398BC2220DBFD417D3270
+:10CD9000CDC48604927E0FC19D761ECC52F96510DB
+:10CDA000E20F984C6DA3DF84B24D9FE4634CD20335
+:10CDB00032AEAD1848335B08A7F0D5C12BFA33B1BA
+:10CDC000AD4725B875A7E8D94362AB3B3E736EE922
+:10CDD00070FF8EE02C042FD513C791CB12DD726546
+:10CDE000A59A9FAD43AB6F0E4D759C3ACCA81C1E07
+:10CDF00068805F3A369BA6EFFB0076CEF8AC1AE16E
+:10CE000051C076DB71866C770A636196E9A0211ABE
+:10CE100055A10A630518A879FD81CD6BF9607930B9
+:10CE20000AB99FBFCCFAC18F74133361068B393BAB
+:10CE3000D8E72F38CD2B2205B5B9AA4AC4CB98988C
+:10CE4000E7788EB679EF6EBD1B750786B122116C3F
+:10CE5000EF7783ADC2BE461C2F5819D62A1B9D4FB3
+:10CE6000AA8359EF33DF47E29597B0DC682FB76D9F
+:10CE7000DF9271383DA28E33D54C0FFBAB76ECFEC2
+:10CE8000128517A406396196C42AD52D6697E162EA
+:10CE90001AE434F5AE557C9885A0CBA6D689B58723
+:10CEA0000D5F12FCB5DC2C56E00E0C5319AC78CAA1
+:10CEB0003C87E6D691283325BE149B863A36328BC2
+:10CEC000B19BF48BC939B141C7BBF672943B81F376
+:10CED00053946253CF0A6B5466AD9CD98BE56FB205
+:10CEE0005CF4CFA3068F94B4EAEA3A083BA045E489
+:10CEF000FA8F80C13FE47BC6EA4FE02994484E3761
+:10CF0000DF9200F2E1C11514CBDA8D2376323B6358
+:10CF10008A7C1033A15D70CE65041EDA1CBC7D785E
+:10CF2000C663ED55C005F06B6F6227F7F42DF2BDB7
+:10CF300016DB9B10779204C18DCBE8C1D83C502EF4
+:10CF4000B5AD6C246581BF003EFFC82AD8A9AE17D5
+:10CF50004E0EB5DBC61FD8369C79A7133D273CEF94
+:10CF6000BF884820D00FF2782D93838ADACA36F131
+:10CF7000CF95DC0C1E3E222734B711EC0F19E3B01D
+:10CF800008BC3DF5CE1CFADB0A497B2CEEF8DC919F
+:10CF9000F793F65389C0E1F19296E4D7DAC16C0AAF
+:10CFA000CF7BC13ED421551425A80505F64056AEC9
+:10CFB000BB84D244AF4C3272C0E17BA614AF960260
+:10CFC000B5C7FC17C0B83D0492642F6678EFAAFF7E
+:10CFD0007FF45790BE224AD32DD59ECF5EE11252E8
+:10CFE000E9EE8473DC63F7EF4B923723CD8707B408
+:10CFF00075CA77CCAAEF1A7BE4704038C2402A1376
+:10D00000C9A1E7B411675C5A7789C0C7F114445FBE
+:10D01000DCEBE4D3A12A0B0DFF6F3711007E035C1C
+:10D02000B4BE11C9E0D2F8B72F16EA333BDF22BBFA
+:10D030000F22385131C20D899E9A5744602EB6E1B5
+:10D04000E9B4740C841898242467E8EDBCAD912DE4
+:10D050004574FE982221C1A01F0B932801B6B11E72
+:10D060009028CE92F127E4EB8DF47598BCCEF79220
+:10D070009BCB4BBAB0B1BB1510DF1FA29166462DFA
+:10D08000677B9253789D69FD80AB81FDD62DE3B916
+:10D09000A85BC55AE7635001C21B6A909E5AF317FA
+:10D0A00023919C662F8F5107B6E15B14777D948B9B
+:10D0B0002FA1500FA84585B94513E675A75A3B1C0B
+:10D0C000D3E5B474541DE37AE5F35264325C414510
+:10D0D0000C4C8167B68DB0073DE358F728DBB819D3
+:10D0E0002731530A91FFA08F7DFBA345D10E4E5EE1
+:10D0F000EE125D1B531010715197A62F14D3412FC0
+:10D100001441101000270119320E0A37047F0790CE
+:10D110003A903A000000001E121E05BD0D33032692
+:10D1200032FE2CFFA8DEA8DE4616055A0036121C79
+:10D1300030080A1AAE07CC00CC4C460046000080EE
+:10D1400001012626808000000680060C0F013612A1
+:10D1500001281982644064454500402F2B0064007B
+:10D160006400D30357071E320001010001010A00C9
+:10D1700000006400D30364001B0740000100FF149B
+:10D180000FE60FE6FFE6FFE6FFE6FFE6FFE6FF1429
+:10D190000AF00AF0FFF0FFF0FFF0FFF0FFF0FF00F1
+:10D1A000000000000000000000000000000000007F
+:10D1B00009091414D214D296D296D296D296D29647
+:10D1C000D296140FE60FE696E696E696E696E69673
+:10D1D000E696011C46010A00F401031B0000FF61F2
+:10D1E0000D7A0DBD64D00700100A00000000000099
+:10D1F0000E000000FFFF353500000000000001D0E8
+:10D2000007FFFF06060F0000D0070103000E000E07
+:10D2100000000800000000000E000E0000230000C7
+:10D220000000000E000E0000410000000080000021
+:10D23000000000000000000080000000000000006E
+:10D2400000000080000000000000000000008218C4
+:10D25000001800000F0000000082170017000028CF
+:10D260000000000082180018000028000000008064
+:10D27000000000000000000000008000000000002E
+:10D28000000000000080000000000000000000001E
+:10D29000000000000000000000000000000000008E
+:10D2A000000000000000000000000000000000007E
+:10D2B000000000000000000000000000000000006E
+:10D2C000000000000000000000000000000000005E
+:10D2D000B40018023C001464021B0F00FF0F094B3E
+:10D2E0000010B000B0001C1F4000000D0F0F04081C
+:10D2F0000002030405060708090A0B0C0D0E0F10A7
+:10D300001112131415161718191A1B1C1D1E1FFFB6
+:10D31000FF000102030405060708001000100010BA
+:10D3200000108080808080808080808080808080ED
+:10D3300080808080808080808080808080808080ED
+:10D3400080800010001000100010019900010203FD
+:10D35000040506070882030302200120FFFFFFFFE8
+:10D36000515144449AFF0407050000020200000ADC
+:10D370000A0A1E0801643C6E01CD2313461CC80135
+:10D3800048320000000030300008281E120A640CE9
+:10D390003C3C0050200173808001C800FA00041852
+:10D3A000963C1E000000000000000000000000008D
+:10D3B000000000000000000000000000000000006D
+:10D3C000000000000000000000000000000000005D
+:10D3D000000000000000000000000000000000004D
+:10D3E000000000000000000000000000000000003D
+:10D3F000000000000000000000000000000000002D
+:10D40000000000000000000000000000000000001C
+:10D41000000000000000000000000000000000000C
+:10D4200000000000000000000000000000000000FC
+:10D4300000000000000000000000000000000000EC
+:10D4400000000000000000000000000000000000DC
+:10D4500000000000000000000000000000000000CC
+:10D4600000000000000000000000000000000000BC
+:10D4700000000000000000000000000000000000AC
+:10D48000000000000000000000000000000000009C
+:10D49000000000000000000000000000000000008C
+:10D4A000000000000000000000000000000000007C
+:10D4B000000000000000000000000000000000006C
+:10D4C000000000000000000000000000000000005C
+:10D4D000000000000000000000000000000000004C
+:10D4E000000000000000000000000000000000003C
+:10D4F000000000000000000000000000000000002C
+:10D50000000000000000000000000000000000001B
+:10D51000000000000000000000000000000000000B
+:10D5200000000000000000000000000000000000FB
+:10D5300000000000000000000000000000000000EB
+:10D5400000000000000000000000000000000000DB
+:10D5500000000000000000000000000000000000CB
+:10D5600000000000000000000000000000000000BB
+:10D5700000000000000000000000000000000000AB
+:10D58000000000000000000000000000000000009B
+:10D59000000000000000000000000000000000008B
+:10D5A000000000000000000000000000000000007B
+:10D5B000000000000000000000000000000000006B
+:10D5C000000000000000000000000000000000005B
+:10D5D000000000000000000000000000000000004B
+:10D5E000000000000000000000000000000000003B
+:10D5F000000000000000000000000000000000002B
+:10D60000000000000000000000000000000000001A
+:10D61000000000000000000000000000000000000A
+:10D6200000000000000000000000000000000000FA
+:10D6300000000000000000000000000000000000EA
+:10D6400000000000000000000000000000000000DA
+:10D6500000000000000000000000000000000000CA
+:10D6600000000000000000000000000000000000BA
+:10D6700000000000000000000000000000000000AA
+:10D68000000000000000000000000000000000009A
+:10D69000000000000000000000000000000000008A
+:10D6A000000000000000000000000000000000007A
+:10D6B000000000000000000000000000000000006A
+:10D6C000000000000000000000000000000000005A
+:10D6D000000000000000000000000000000000004A
+:10D6E000000000000000000000000000000000003A
+:10D6F000000000000000000000000000000000002A
+:10D700000000000000000000000000000000000019
+:10D710000000000000000000000000000000000009
+:10D7200000000000000000000000000000000000F9
+:10D7300000000000000000000000000000000000E9
+:10D7400000000000000000000000000000000000D9
+:10D7500000000000000000000000000000000000C9
+:10D7600000000000000000000000000000000000B9
+:10D7700000000000000000000000000000000000A9
+:10D780000000000000000000000000000000000099
+:10D790000000000000000000000000000000000089
+:10D7A0000000000000000000000000000000000079
+:10D7B0000000000000000000000000000000000069
+:10D7C0000000000000000000000000000000000059
+:10D7D0000000000000000000000000000000000049
+:10D7E0000000000000000000000000000000000039
+:10D7F0000000000000000000000000000000000029
+:10D800000000000000000000000000000000000018
+:10D810000000000000000000000000000000000008
+:10D8200000000000000000000000000000000000F8
+:10D8300000000000000000000000000000000000E8
+:10D8400000000000000000000000000000000000D8
+:10D8500000000000000000000000000000000000C8
+:10D8600000000000000000000000000000000000B8
+:10D8700000000000000000000000000000000000A8
+:10D880000000000000000000000000000000000098
+:10D890000000000000000000000000000000000088
+:10D8A0000000000000000000000000000000000078
+:10D8B0000000000000000000000000000000000068
+:10D8C0000000000000000000000000000000000058
+:10D8D0000000000000000000000000000000000048
+:10D8E0000000000000000000000000000000000038
+:10D8F0000000000000000000000000000000000028
+:10D900000000000000000000000000000000000017
+:10D910000000000000000000000000000000000007
+:10D9200000000000000000000000000000000000F7
+:10D9300000000000000000000000000000000000E7
+:10D9400000000000000000000000000000000000D7
+:10D9500000000000000000000000000000000000C7
+:10D9600000000000000000000000000000000000B7
+:10D9700000000000000000000000000000000000A7
+:10D980000000000000000000000000000000000097
+:10D990000000000000000000000000000000000087
+:10D9A0000000000000000000000000000000000077
+:10D9B0000000000000000000000000000000000067
+:10D9C0000000000000000000000000000000000057
+:10D9D0000000000000000000000000000000000047
+:10D9E0000000000000000000000000000000000037
+:10D9F0000000000000000000000000000000000027
+:10DA00000000000000000000000000000000000016
+:10DA10000000000000000000000000000000000006
+:10DA200000000000000000000000000000000000F6
+:10DA300000000000000000000000000000000000E6
+:10DA400000000000000000000000000000000000D6
+:10DA500000000000000000000000000000000000C6
+:10DA600000000000000000000000000000000000B6
+:10DA700000000000000000000000000000000000A6
+:10DA80000000000000000000000000000000000096
+:10DA90000000000000000000000000000000000086
+:10DAA0000000000000000000000000000000000076
+:10DAB0000000000000000000000000000000000066
+:10DAC0000000000000000000000000000000000056
+:10DAD0000000000000000000000000000000000046
+:10DAE0000000000000000000000000000000000036
+:10DAF0000000000000000000000000000000000026
+:10DB00000000000000000000000000000000000015
+:10DB10000000000000000000000000000000000005
+:10DB200000000000000000000000000000000000F5
+:10DB300000000000000000000000000000000000E5
+:10DB400000000000000000000000000000000000D5
+:10DB500000000000000000000000000000000000C5
+:10DB600000000000000000000000000000000000B5
+:10DB700000000000000000000000000000000000A5
+:10DB80000000000000000000000000000000000095
+:10DB90000000000000000000000000000000000085
+:10DBA0000000000000000000000000000000000075
+:10DBB0000000000000000000000000000000000065
+:10DBC0000000000000000000000000000000000055
+:10DBD0000000000000000000000000000000000045
+:10DBE0000000000000000000000000000000000035
+:10DBF0000000000000000000000000000000000025
+:10DC00000000000000000000000000000000000014
+:10DC10000000000000000000000000000000000004
+:10DC200000000000000000000000000000000000F4
+:10DC300000000000000000000000000000000000E4
+:10DC400000000000000000000000000000000000D4
+:10DC500000000000000000000000000000000000C4
+:10DC600000000000000000000000000000000000B4
+:10DC700000000000000000000000000000000000A4
+:10DC80000000000000000000000000000000000094
+:10DC90000000000000000000000000000000000084
+:10DCA0000000000000000000000000000000000074
+:10DCB0000000000000000000000000000000000064
+:10DCC0000000000000000000000000000000000054
+:10DCD0000000000000000000000000000000000044
+:10DCE0000000000000000000000000000000000034
+:10DCF0000000000000000000000000000000000024
+:10DD00000000000000000000000000000000000013
+:10DD10000000000000000000000000000000000003
+:10DD200000000000000000000000000000000000F3
+:10DD300000000000000000000000000000000000E3
+:10DD400000000000000000000000000000000000D3
+:10DD500000000000000000000000000000000000C3
+:10DD600000000000000000000000000000000000B3
+:10DD700000000000000000000000000000000000A3
+:10DD80000000000000000000000000000000000093
+:10DD90000000000000000000000000000000000083
+:10DDA0000000000000000000000000000000000073
+:10DDB0000000000000000000000000000000000063
+:10DDC0000000000000000000000000000000000053
+:10DDD0000000000000000000000000000000000043
+:10DDE0000000000000000000000000000000000033
+:10DDF0000000000000000000000000000000000023
+:10DE00000000000000000000000000000000000012
+:10DE10000000000000000000000000000000000002
+:10DE200000000000000000000000000000000000F2
+:10DE300000000000000000000000000000000000E2
+:10DE400000000000000000000000000000000000D2
+:10DE500000000000000000000000000000000000C2
+:10DE600000000000000000000000000000000000B2
+:10DE700000000000000000000000000000000000A2
+:10DE80000000000000000000000000000000000092
+:10DE90000000000000000000000000000000000082
+:10DEA0000000000000000000000000000000000072
+:10DEB0000000000000000000000000000000000062
+:10DEC0000000000000000000000000000000000052
+:10DED0000000000000000000000000000000000042
+:10DEE0000000000000000000000000000000000032
+:10DEF0000000000000000000000000000000000022
+:10DF00000000000000000000000000000000000011
+:10DF10000000000000000000000000000000000001
+:10DF200000000000000000000000000000000000F1
+:10DF300000000000000000000000000000000000E1
+:10DF400000000000000000000000000000000000D1
+:10DF500000000000000000000000000000000000C1
+:10DF600000000000000000000000000000000000B1
+:10DF700000000000000000000000000000000000A1
+:10DF80000000000000000000000000000000000091
+:10DF90000000000000000000000000000000000081
+:10DFA0000000000000000000000000000000000071
+:10DFB0000000000000000000000000000000000061
+:10DFC0000000000000000000000000000000000051
+:10DFD0000000000000000000000000000000000041
+:10DFE0000000000000000000000000000000000031
+:10DFF0000000000000000000000000000000000021
+:10E000000000000000000000000000000000000010
+:10E010000000000000000000000000000000000000
+:10E0200000000000000000000000000000000000F0
+:10E0300000000000000000000000000000000000E0
+:10E0400000000000000000000000000000000000D0
+:10E0500000000000000000000000000000000000C0
+:10E0600000000000000000000000000000000000B0
+:10E0700000000000000000000000000000000000A0
+:10E080000000000000000000000000000000000090
+:10E090000000000000000000000000000000000080
+:10E0A0000000000000000000000000000000000070
+:10E0B0000000000000000000000000000000000060
+:10E0C0000000000000000000000000000000000050
+:10E0D0000000000000000000000000000000000040
+:10E0E0000000000000000000000000000000000030
+:10E0F000000000000000000000000000FC9922DE8B
+:10E10000010100010100000000000000000000000B
+:10E1100000000000000000000000000000000000FF
+:10E1200000000000000000000000000000000000EF
+:10E1300000000000000000000000000000000000DF
+:10E1400000000000000000000000000000000000CF
+:10E1500000000000000000000000000000000000BF
+:10E1600000000000000000000000000000000000AF
+:10E17000000000000000000000000000000000009F
+:10E18000000000000000000000000000000000008F
+:10E19000000000000000000000000000000000007F
+:10E1A000000000000000000000000000000000006F
+:10E1B000000000000000000000000000000000005F
+:10E1C000000000000000000000000000000000004F
+:10E1D000000000000000000000000000000000003F
+:10E1E000000000000000000000000000000000002F
+:10E1F000000000000000000000000000000000001F
+:10E20000000000000000000000FFFFFFFF003F03D0
+:10E210001E060E1E371E1401824700010105640010
+:10E2200001FF1414001414010056A700B07001017E
+:10E230000101E001000000000000000054443433FC
+:10E2400032325F433800A9030F00030000000203CD
+:10E250000000000000000000002500000000000099
+:10E2600000000000000000000000000000000000AE
+:10E27000000000000000000000000000000000009E
+:10E28000000000000000000000000000000000008E
+:10E29000000000000000000000000000000000007E
+:10E2A000000000000000000000000000000000006E
+:10E2B000000000000000000000000000000000005E
+:10E2C000000000000000000000000000000000004E
+:10E2D000000000000000000000000000004F0014DB
+:10E2E00006011231280D0401012900090021340022
+:10E2F000000000000000000000000000000000001E
+:10E3000000000000000000000000000000000026E7
+:10E3100002031B0000FF9105AA05FFFFD0070010B4
+:10E320000A0000000000000E000000FFFF3535006D
+:10E3300000000000000106D0010000B402A61B4B43
+:10E34000B01C1F000D0F0400201244701702003A89
+:10E3500000047044C841E8FB0C0C844C1680078014
+:10E36000A0881080808080808080868080828080ED
+:10E3700080A0A0802000000000000000000000003D
+:10E38000000000000000000000000000000000008D
+:10E39000000000000000000000000000000000007D
+:10E3A000000000000000000000000000000000006D
+:10E3B000000000000000000000000000000000005D
+:10E3C000000000000000000000000000000000004D
+:10E3D000000000000000000000000000000000003D
+:10E3E00000000000000000000048470E000154003B
+:10E3F000000000000000000000000000000000001D
+:10E4000000000200008000010082030302200120BE
+:10E41000FFFFFFFF515143439AFF04080200200908
+:10E42000878180808080C00393FF00060000000089
+:10E4300000000000000000000000000000000000DC
+:10E4400000000000000000000000000000000000CC
+:10E4500000000000000000000000000000000000BC
+:10E4600000000000000000000000000000000000AC
+:10E47000000000000000000000000000000000009C
+:10E48000000000000000000000000000000000008C
+:10E49000000000000000000000000000000000007C
+:10E4A000000000000000000000000000000000006C
+:10E4B000000000000000000000000000000000005C
+:10E4C000000000000000000000000000000000004C
+:10E4D000000000000000000000000000000000003C
+:10E4E00000000028000900011A1E1D01000155004E
+:10E4F000000000000000000000000000000000001C
+:10E50000000A0A0A1E0801643C6E01CD2313461C52
+:10E51000C80148320000000030300008281E120AEE
+:10E52000640C3C3C0050200173808001C800FA005C
+:10E530000418783C1E0801340000020000000000AE
+:10E5400000000000000000000000000000000000CB
+:10E5500000000000000000000000000000000000BB
+:10E5600000000000000000000000000000000000AB
+:10E57000000000000000000000000000000000009B
+:10E58000000000000000000000000000000000008B
+:10E59000000000000000000000000000000000007B
+:10E5A000000000000000000000000000000000006B
+:10E5B000000000000000000000000000000000005B
+:10E5C000000000000000000000000000000000004B
+:10E5D000000000000000000000000000000000003B
+:10E5E0000000000000000000003500010040510064
+:10E5F000000000000000000000000000000000001B
+:10E60000D76F173E00100000010101100000920DAD
+:10E6100000000000C8040204C80402040000000056
+:10E6200000000000000000000000000000000000EA
+:10E6300000000000000000000000000000000000DA
+:10E6400000000000000000000000000000000000CA
+:10E6500000000000C80402040000000000000000E8
+:10E6600000000000000000000000000000000000AA
+:10E67000000000000000000000000000000000009A
+:10E68000000000000000000000000000000000008A
+:10E69000000000000000000000000000000000007A
+:10E6A000000000000000000000000000000000006A
+:10E6B000000000000000000000000000000000005A
+:10E6C000000000000000000000000000000000004A
+:10E6D000000000000000000000000000000000003A
+:10E6E000000000000000000000000000000000002A
+:10E6F000000000000000000000000000000000001A
+:10E700000000000000000000000000000000000009
+:10E7100000000000000000000000000000000000F9
+:10E7200000000000000000000000000000000000E9
+:10E7300000000000000000000000000000000000D9
+:10E7400000000000000000000000000000000000C9
+:10E7500000000000000000000000000000000000B9
+:10E7600000000000000000000000000000000000A9
+:10E770000000000000000000000000000000000099
+:10E780000000000000000000000000000000000089
+:10E790000000000000000000000000000000000079
+:10E7A0000000000000000000000000000000000069
+:10E7B0000000000000000000000000000000000059
+:10E7C0000000000000000000000000000000000049
+:10E7D0000000000000000000000000000000000039
+:10E7E0000000000000000000000000000000000029
+:10E7F0000000000000000000000000000000000019
+:10E800000000000000000000000000000000000008
+:10E8100000000000000000000000000000000000F8
+:10E8200000000000000000000000000000000000E8
+:10E8300000000000000000000000000000000000D8
+:10E8400000000000000000000000000000000000C8
+:10E8500000000000000000000000000000000000B8
+:10E8600000000000000000000000000000000000A8
+:10E870000000000000000000000000000000000098
+:10E880000000000000000000000000000000000088
+:10E890000000000000000000000000000000000078
+:10E8A0000000000000000000000000000000000068
+:10E8B0000000000000000000000000000000000058
+:10E8C0000000000000000000000000000000000048
+:10E8D0000000000000000000000000000000000038
+:10E8E0000000000000000000000000000000000028
+:10E8F0000000000000000000000000000000000018
+:10E900000000000000000000000000000000000007
+:10E9100000000000000000000000000000000000F7
+:10E9200000000000000000000000000000000000E7
+:10E9300000000000000000000000000000000000D7
+:10E9400000000000000000000000000000000000C7
+:10E9500000000000000000000000000000000000B7
+:10E9600000000000000000000000000000000000A7
+:10E970000000000000000000000000000000000097
+:10E980000000000000000000000000000000000087
+:10E990000000000000000000000000000000000077
+:10E9A0000000000000000000000000000000000067
+:10E9B0000000000000000000000000000000000057
+:10E9C0000000000000000000000000000000000047
+:10E9D0000000000000000000000000000000000037
+:10E9E0000000000000000000000000000000000027
+:10E9F0000000000000000000000000000000000017
+:10EA00000000000000000000000000000000000006
+:10EA10000102EDE00000F7E00000F8E00000F9E09E
+:10EA20000600FFE000000FE1330010E1DB0011E120
+:10EA3000800012E1120013E1000018E1570019E113
+:10EA40003D001AE119001BE11E001CE10A001DE156
+:10EA500050001EE1500038E16F0039E13D003AE11D
+:10EA600028003BE13C003CE114003DE1C8003EE1F0
+:10EA7000C80058E1B50059E133005AE141005BE1BB
+:10EA800064005CE123005DE1A0005EE1A00078E1AC
+:10EA9000140079E1140088E1370089E1320098E13F
+:10EAA000640099E13200A8E10400F0E1000030E2E6
+:10EAB0008C0031E2480032E2000033E2000034E230
+:10EAC000000035E2200036E2080037E2400038E27C
+:10EAD000090039E200003AE2C0003BE29A003CE261
+:10EAE00063003DE2CD003EE2B9003FE2C60040E2F5
+:10EAF0005C0041E2630042E2E00043E2050044E2E0
+:10EB0000050045E2400046E2190047E2000048E205
+:10EB1000000049E200004AE210004BE210004CE223
+:10EB200010004DE210004EE210004FE2100050E2E3
+:10EB3000100051E2100052E2400053E2020054E2A1
+:10EB4000020055E2000056E2060057E2000058E2DB
+:10EB5000000059E203005AE2C5005BE200005CE2FB
+:10EB6000010070E2010071E2F70072E2800073E2DE
+:10EB7000040074E2680075E2080076E2090077E2BA
+:10EB8000100078E2000079E208007AE230007BE2CF
+:10EB900000007CE200007DE200007EE200007FE2F7
+:10EBA000000080E2000081E2200082E2020083E2B5
+:10EBB000260084E2000085E2000086E20000B0E268
+:10EBC0007800B1E25700B2E28500B3E27800B4E227
+:10EBD0005000B5E20000B6E20000B7E20000B8E283
+:10EBE0000000B9E20000BAE20000BBE20300BCE2B0
+:10EBF000B600BDE20000BEE20000BFE20000C0E2DD
+:10EC00000300C1E2FC00C2E20000C3E20000C4E273
+:10EC10000100C5E20100C6E20300C7E22800C8E225
+:10EC20000100C9E20100CAE20100CBE20A00CCE225
+:10EC30001000CDE20000CEE22000CFE20000D0E2E2
+:10EC40002000D1E20000D2E22000D3E20000D4E2B2
+:10EC50000000D5E20000D6E20000D7E20000D8E2D2
+:10EC60000000D9E20000DAE20000DBE20000DCE2B2
+:10EC70000000DDE20000DEE20000DFE20000E0E292
+:10EC80003F00E1E20000E2E23F00E3E20000E4E2F4
+:10EC90003F00E5E20000E6E23F00E7E20000E8E2D4
+:10ECA0003F00E9E20000EAE23F00EBE20000ECE2B4
+:10ECB0000000EDE20000F0E27000F1E20000F2E29C
+:10ECC0000000F3E20000F4E20000F5E20000F6E2EA
+:10ECD0000000F7E20000F8E20000F9E20200FAE2C8
+:10ECE0000800FBE23100FCE20100FDE20000FEE270
+:10ECF0000000FFE2000000E3020001E3010002E384
+:10ED0000010003E3010030E3080031E3000032E3D7
+:10ED1000000033E3000034E3000035E3700036E325
+:10ED2000000070E3650071E3010072E3640073E3C7
+:10ED3000080074E3560075E3010076E30E0077E304
+:10ED4000010078E3020079E301007AE302007BE34B
+:10ED500000007CE300007DE300007EE300007FE331
+:10ED6000000080E3000081E3080082E3150083E3F4
+:10ED7000080084E3650085E3000086E3FF0087E385
+:10ED8000650088E3E70089E3E7008AE300008BE39E
+:10ED900000008CE300008DE300008EE300008FE3B1
+:10EDA000000090E3000091E3000092E3000093E391
+:10EDB000000094E3000095E3000096E3000097E371
+:10EDC000000098E3000099E300009AE300009BE351
+:10EDD00000009CE300009DE300009EE300009FE331
+:10EDE0000000A0E30000A1E30000A2E30000A3E311
+:10EDF0000000A4E30000A5E30000A6E30000A7E3F1
+:10EE00000000A8E30000A9E30000AAE30000ABE3D0
+:10EE10000000ACE30000ADE30000AEE30000B0E3AF
+:10EE20000200B1E32A00B2E33D00B3E35100B4E3D2
+:10EE30006100B5E36D00B6E38500B7E39500B8E384
+:10EE4000A100B9E3AB00BAE35C00BBE36600BCE33E
+:10EE50007100BDE38000BEE38800BFE39200C0E321
+:10EE60009E00C1E3A800C2E3B400C3E31200C4E300
+:10EE70003400C5E34500C6E35600C7E36400C8E3B9
+:10EE80006E00C9E38300CAE39000CBE39C00CCE3AF
+:10EE9000A600CDE35700CEE36200CFE36F00D0E3DE
+:10EEA0008100D1E38900D2E39300D3E39F00D4E350
+:10EEB000A800D5E3B400F0E31100F1E30000F2E3B1
+:10EEC0000100F3E3FD00F4E3FE00F5E3FC00F6E3EC
+:10EED0000000F7E30000F8E30100F9E3FE00FAE3C5
+:10EEE000FE00FBE3FC00FCE30000FDE30000FEE3AA
+:10EEF0000300FFE3FE0000E4FB0001E4D00002E4B5
+:10EF0000000003E4000004E4000005E4000006E45F
+:10EF1000000007E4FC0008E4000009E400000AE443
+:10EF200000000BE400000CE400000DE4FC000EE423
+:10EF300000000FE4000010E4000011E4000012E4FF
+:10EF4000000013E4FC0014E4000015E4000016E4E3
+:10EF5000000017E4000018E4000019E4FC001AE4C3
+:10EF600000001BE400001CE400001DE400001EE49F
+:10EF700000001FE4FC0020E4000021E4000022E483
+:10EF8000000023E4000024E4000025E4FC0026E463
+:10EF9000000030E4000031E4000032E4000033E41B
+:10EFA000000034E4000035E4FC0036E4000037E4FF
+:10EFB000000038E4000039E400003AE400003BE4DB
+:10EFC000FC003CE400003DE400003EE400003FE4BF
+:10EFD000000040E4000041E4FC0042E4000070E472
+:10EFE0001C0071E4FC0072E4FC0073E4FC0074E4B7
+:10EFF000000075E4000076E4000077E4000078E4A7
+:10F00000000079E400007AE400007BE400007CE486
+:10F0100000007DE400007EE400007FE4000080E466
+:10F02000000081E4000082E4000083E4000084E446
+:10F03000000085E4000086E4000087E4000088E426
+:10F04000000089E400008AE400008BE400008CE406
+:10F0500000008DE400008EE400008FE4000090E4E6
+:10F06000000091E4000092E4000093E4000094E4C6
+:10F07000000095E4000096E4000097E4000098E4A6
+:10F08000000099E400009AE40000B0E4B000B1E4AC
+:10F09000F300B2E4FF00B3E4CE00B4E40000B5E452
+:10F0A0000000B6E47000B7E4E000B8E40000B9E4A2
+:10F0B0000000BAE40000BBE40000BCE40000BDE4D2
+:10F0C0000200BEE40000BFE40000C0E44000C1E470
+:10F0D0000000C2E40000C3E40000C4E40000C5E492
+:10F0E0000000C6E40000C7E40000C8E40000C9E472
+:10F0F0000000CAE40000F0E4060030E5000031E55D
+:10F10000000032E53F0033E5C00034E53F0035E55F
+:10F11000C00036E53F0037E5000038E5390039E545
+:10F1200039003AE534003BE534003CE5F0003DE5CC
+:10F13000F0003EE5F0003FE5F00040E5010041E56C
+:10F14000000042E5000043E5000044E5000045E51D
+:10F15000000046E5000047E5000048E5000049E5FD
+:10F1600000004AE500004BE500004CE500004DE5DD
+:10F1700000004EE500004FE5000050E5000051E5BD
+:10F18000000052E5000053E5000054E5000055E59D
+:10F19000AD0070E55D0071E5400072E5490073E582
+:10F1A000530074E5590075E55E0076E5630077E588
+:10F1B000680078E56E0079E574007AE57E007BE50D
+:10F1C0008A007CE598007DE5A8007EE5BB007FE530
+:10F1D000D00080E5FF0081E5040082E5000083E5C2
+:10F1E000040084E5040085E5420086E5000087E52B
+:10F1F000690088E55A00B0E54800B1E51D00F0E57A
+:10F200003300F1E55A00F2E5C900F3E53100F4E519
+:10F210000100F5E51000F6E51000F7E51000F8E54F
+:10F220001900F9E51900FAE50000FBE50000FCE52E
+:10F230000000FDE50000FEE50000FFE5000000E63F
+:10F24000000030E60000B0E61B00B1E63B00B2E68D
+:10F25000BB00B3E67700B4E67700B5E67700B6E624
+:10F26000BB00B7E6B300B8E63300B9E60000BAE683
+:10F270000000BBE66F00BCE66000BDE6E100BEE654
+:10F28000E100BFE63300C0E6BB00C1E6F200C2E623
+:10F29000FD00C3E6C600C4E60B00C5E60700F0E6C5
+:10F2A0000000F1E60000F2E60000F3E60000F4E6FC
+:10F2B0000000F5E60000F6E6000030E7030031E765
+:10F2C000000032E70000B0E7F600B1E7FF00B2E768
+:10F2D0000300B3E70500B4E74100B5E72400B6E753
+:10F2E0008000B7E71F00B8E7C700B9E71F00BAE71B
+:10F2F0001B00BBE70000BCE70C00BDE70700BEE752
+:10F300002000BFE70000C0E70000C1E70000C2E73F
+:10F310000000C3E70000C4E70C00C5E7F000C6E743
+:10F320001F00C7E70000C8E70C00C9E70000CAE7F4
+:10F330000000CBE7AA00CCE76700CDE77E00CEE770
+:10F340005D00CFE70600D0E7000030E8200031E89C
+:10F35000400073E8300074E8060075E8230076E8A2
+:10F36000650093E8000094E83F0095E8FF0096E808
+:10F370005000B3EA0000B4EA0000B5EA0000B6EAC3
+:10F380004600B7EA610073EB0F0073EC410074ECC8
+:10F39000510075EC000033ED000034ED0000EDE0AD
+:10F3A000030000000000000000000000000000005A
+:10F3B000000000000000000000000000000000004D
+:10F3C000000000000000000000000000000000003D
+:10F3D000000000000000000000000000000000002D
+:10F3E000000000000000000000000000000000001D
+:10F3F000000000000000000000000000000000000D
+:10F4000000000000000000000000000000000000FC
+:10F4100000000000000000000000000000000000EC
+:10F4200000000000000000000000000000000000DC
+:10F4300000000000000000000000000000000000CC
+:10F4400000000000000000000000000000000000BC
+:10F4500000000000000000000000000000000000AC
+:10F46000000000000000000000000000000000009C
+:10F47000000000000000000000000000000000008C
+:10F48000000000000000000000000000000000007C
+:10F49000000000000000000000000000000000006C
+:10F4A000000000000000000000000000000000005C
+:10F4B000000000000000000000000000000000004C
+:10F4C000000000000000000000000000000000003C
+:10F4D000000000000000000000000000000000002C
+:10F4E000000000000000000000000000000000001C
+:10F4F000000000000000000000000000000000000C
+:10F5000000000000000000000000000000000000FB
+:10F5100000000000000000000000000000000000EB
+:10F5200000000000000000000000000000000000DB
+:10F5300000000000000000000000000000000000CB
+:10F5400000000000000000000000000000000000BB
+:10F5500000000000000000000000000000000000AB
+:10F56000000000000000000000000000000000009B
+:10F57000000000000000000000000000000000008B
+:10F58000000000000000000000000000000000007B
+:10F59000000000000000000000000000000000006B
+:10F5A000000000000000000000000000000000005B
+:10F5B000000000000000000000000000000000004B
+:10F5C000000000000000000000000000000000003B
+:10F5D000000000000000000000000000000000002B
+:10F5E000000000000000000000000000000000001B
+:10F5F000000000000000000000000000000000000B
+:00000001FF
diff --git a/include/linux/input/synaptics_dsx.h b/include/linux/input/synaptics_dsx.h
index 56fe12edc11b..cb3fe2274674 100644
--- a/include/linux/input/synaptics_dsx.h
+++ b/include/linux/input/synaptics_dsx.h
@@ -42,6 +42,79 @@
#define I2C_DRIVER_NAME "synaptics_dsx_i2c"
#define SPI_DRIVER_NAME "synaptics_dsx_spi"
+#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FORCE
+#define PLATFORM_DRIVER_FORCE "synaptics_force"
+#define I2C_DRIVER_FORCE "synaptics_dsx_force"
+#define CONFIG_SYNAPTICS_TOUCH_COUNT_DUMP
+
+struct synaptics_dsx_panel_power_seq {
+ int disp_pre_on_sleep;
+ int disp_post_on_sleep;
+ int disp_pre_off_sleep;
+ int disp_post_off_sleep;
+ int lab_pre_on_sleep;
+ int lab_post_on_sleep;
+ int lab_pre_off_sleep;
+ int lab_post_off_sleep;
+ int ibb_pre_on_sleep;
+ int ibb_post_on_sleep;
+ int ibb_pre_off_sleep;
+ int ibb_post_off_sleep;
+};
+
+struct synaptics_dsx_factory_param {
+ union {
+ struct {
+ int tddi_short_limit_b;
+ int tddi_noise_limit;
+
+ int tddi_extend_ee_short_reset_dur;
+ int tddi_extend_ee_short_int_dur;
+ int tddi_extend_ee_short_tx_on_count;
+ int tddi_extend_ee_short_rx_on_count;
+ int tddi_extend_ee_short_test_limit_part1;
+ int tddi_extend_ee_short_test_limit_part2;
+
+ int tddi_open_test_int_dur_one;
+ int tddi_open_test_int_dur_two;
+ int tddi_open_test_limit_phase2_lower;
+
+ int tddi_b7_open_test_int_dur_one;
+ int tddi_b7_open_test_int_dur_two;
+ int tddi_b7_open_test_limit_phase2_lower;
+ int tddi_b7_open_test_limit_phase2_upper;
+
+ int button_count;
+ int abs_0d_open_factor;
+ int abs_0d_open_test_limit;
+ } __packed;
+ unsigned int data[18];
+ };
+};
+
+struct synaptics_dsx_config_info {
+ int chip_id;
+ bool chip_is_tddi;
+ bool open_test_b7;
+ bool short_test_extend;
+ bool is_factory_param;
+ const char *chip_id_name;
+ unsigned char *tp_ids;
+ const char *fw_name;
+#ifdef CONFIG_SYNAPTICS_TOUCH_COUNT_DUMP
+ const char *clicknum_file_name;
+#endif
+ struct synaptics_dsx_panel_power_seq panel_power_seq;
+ struct synaptics_dsx_factory_param *factory_param;
+};
+
+enum synaptics_dsx_lockdown_area {
+ LOCKDOWN_AREA_PRODUCT_ID = 0,
+ LOCKDOWN_AREA_GUEST_SERIALIZATION = 1,
+ LOCKDOWN_AREA_UNKNOWN = 0xFF,
+};
+#endif
+
/*
* struct synaptics_dsx_button_map - button map
* @nbuttons: number of buttons
@@ -77,6 +150,9 @@ struct synaptics_dsx_button_map {
* @block_delay_us: delay time between two SPI transfers
* @addr_delay_us: delay time after sending address word
* @pwr_reg_name: pointer to name of regulator for power control
+ * @lab_reg_name: pointer to name of regulator for LCD lab control
+ * @ibb_reg_name: pointer to name of regulator for LCD ibb control
+ * @disp_reg_name: pointer to name of regulator for LCD vddio control
* @bus_reg_name: pointer to name of regulator for bus pullup control
* @cap_button_map: pointer to 0D button map
* @vir_button_map: pointer to virtual button map
@@ -103,11 +179,36 @@ struct synaptics_dsx_board_data {
unsigned int reset_active_ms;
unsigned int byte_delay_us;
unsigned int block_delay_us;
- unsigned int addr_delay_us;
const char *pwr_reg_name;
const char *bus_reg_name;
struct synaptics_dsx_button_map *cap_button_map;
struct synaptics_dsx_button_map *vir_button_map;
+#ifndef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FORCE
+ unsigned int addr_delay_us;
+#else
+ int mdss_reset;
+ int mdss_reset_state;
+ int config_array_size;
+ int tp_id_num;
+ unsigned char *tp_id_bytes;
+ bool cut_off_power;
+ bool power_ctrl;
+ bool panel_is_incell;
+ const char *lab_reg_name;
+ const char *ibb_reg_name;
+ const char *disp_reg_name;
+ const char *power_gpio_name;
+ const char *reset_gpio_name;
+ const char *irq_gpio_name;
+ const char *backup_fw_name;
+ const char *short_test25;
+ const char *short_test26;
+ struct synaptics_dsx_config_info *config_array;
+ enum synaptics_dsx_lockdown_area lockdown_area;
+#ifdef CONFIG_SYNAPTICS_TOUCH_COUNT_DUMP
+ bool dump_click_count;
+#endif
+#endif
};
#endif